simpo-component-library 3.6.930 → 3.6.932

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 (267) 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/text-background-directive.directive.mjs +1 -1
  36. package/esm2022/lib/directive/text-size.directive.mjs +1 -1
  37. package/esm2022/lib/directive/translate-onhover.directive.mjs +1 -1
  38. package/esm2022/lib/directive/video-directive.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 +18 -14
  42. package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.component.mjs +22 -14
  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/categories-with-image-background-columns/categories-with-image-background-columns.component.mjs +3 -3
  49. package/esm2022/lib/ecommerce/sections/category-product/category-product.component.mjs +3 -3
  50. package/esm2022/lib/ecommerce/sections/category-product/category-product.model.mjs +1 -1
  51. package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +3 -3
  52. package/esm2022/lib/ecommerce/sections/checkout/checkout.modal.mjs +1 -1
  53. package/esm2022/lib/ecommerce/sections/customer-review/customer-review.component.mjs +3 -3
  54. package/esm2022/lib/ecommerce/sections/customer-review/customer-review.model.mjs +1 -1
  55. package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.component.mjs +3 -3
  56. package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.model.mjs +1 -1
  57. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +3 -3
  58. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.modal.mjs +1 -1
  59. package/esm2022/lib/ecommerce/sections/featured-category/featured-collection.component.mjs +3 -3
  60. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +4 -4
  61. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.modal.mjs +1 -1
  62. package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +3 -3
  63. package/esm2022/lib/ecommerce/sections/new-collection/new-collection.component.mjs +3 -3
  64. package/esm2022/lib/ecommerce/sections/new-collection/new-collection.modal.mjs +1 -1
  65. package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +3 -3
  66. package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +3 -3
  67. package/esm2022/lib/ecommerce/sections/passbook-transactions/passbook-transactions.component.mjs +3 -3
  68. package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.component.mjs +3 -3
  69. package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.model.mjs +1 -1
  70. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +12 -9
  71. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
  72. package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +17 -16
  73. package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
  74. package/esm2022/lib/ecommerce/sections/refer-earn/refer-earn.component.mjs +3 -3
  75. package/esm2022/lib/ecommerce/sections/refer-earn/refer-earn.modal.mjs +1 -1
  76. package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.component.mjs +1 -1
  77. package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.model.mjs +1 -1
  78. package/esm2022/lib/ecommerce/sections/scheme-details/scheme-details.component.mjs +3 -3
  79. package/esm2022/lib/ecommerce/sections/scheme-selection/scheme-selection.component.mjs +3 -3
  80. package/esm2022/lib/ecommerce/sections/schemes/schemes.component.mjs +3 -3
  81. package/esm2022/lib/ecommerce/sections/schemes/schemes.component.model.mjs +1 -1
  82. package/esm2022/lib/ecommerce/sections/small-product-listing/small-product-listing.component.mjs +3 -3
  83. package/esm2022/lib/ecommerce/sections/store-list/store-list.component.mjs +3 -3
  84. package/esm2022/lib/ecommerce/sections/store-list/store-list.modal.mjs +1 -1
  85. package/esm2022/lib/ecommerce/sections/store-page/store-page.component.mjs +3 -3
  86. package/esm2022/lib/ecommerce/sections/store-page/store-page.model.mjs +1 -1
  87. package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +3 -3
  88. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
  89. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +3 -3
  90. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +1 -1
  91. package/esm2022/lib/ecommerce/sections/whislist/whislist.component.mjs +3 -3
  92. package/esm2022/lib/ecommerce/styles/BaseCollection.modal.mjs +1 -1
  93. package/esm2022/lib/ecommerce/styles/Collection.modal.mjs +1 -1
  94. package/esm2022/lib/ecommerce/styles/OrderedItems.modal.mjs +1 -1
  95. package/esm2022/lib/ecommerce/styles/PincodeLocation.model.mjs +1 -1
  96. package/esm2022/lib/ecommerce/styles/PincodeLocationInter.model.mjs +1 -1
  97. package/esm2022/lib/ecommerce/styles/cart.modal.mjs +1 -1
  98. package/esm2022/lib/ecommerce/styles/category.modal.mjs +1 -1
  99. package/esm2022/lib/ecommerce/styles/order.modal.mjs +1 -1
  100. package/esm2022/lib/ecommerce/styles/product.modal.mjs +1 -1
  101. package/esm2022/lib/ecommerce/styles/review.modal.mjs +1 -1
  102. package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
  103. package/esm2022/lib/elements/add-section/add-section.component.mjs +3 -3
  104. package/esm2022/lib/elements/address-list/address-list.component.mjs +3 -3
  105. package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +3 -3
  106. package/esm2022/lib/elements/button/button.component.mjs +3 -3
  107. package/esm2022/lib/elements/button/button.model.mjs +1 -1
  108. package/esm2022/lib/elements/card-skeleton-loader/card-skeleton-loader.component.mjs +3 -3
  109. package/esm2022/lib/elements/covering-image-card/covering-image-card.component.mjs +3 -3
  110. package/esm2022/lib/elements/editor-service.service.mjs +1 -1
  111. package/esm2022/lib/elements/heading-element/heading-element.component.mjs +3 -3
  112. package/esm2022/lib/elements/index.mjs +1 -1
  113. package/esm2022/lib/elements/link-editor/link-editor.component.mjs +3 -3
  114. package/esm2022/lib/elements/list-home-appointment/list-home-appointment.component.mjs +3 -3
  115. package/esm2022/lib/elements/media-selector/media-selector.component.mjs +3 -3
  116. package/esm2022/lib/elements/portfolio/portfolio.component.mjs +3 -3
  117. package/esm2022/lib/elements/pricing-s1/pricing-s1.component.mjs +3 -3
  118. package/esm2022/lib/elements/property/property.component.mjs +3 -3
  119. package/esm2022/lib/elements/schedule-video-call/schedule-video-call.component.mjs +3 -3
  120. package/esm2022/lib/elements/simpo-button/simpo-button.component.mjs +3 -3
  121. package/esm2022/lib/elements/svg-divider/svg-divider.component.mjs +3 -3
  122. package/esm2022/lib/elements/text/text.component.mjs +3 -3
  123. package/esm2022/lib/elements/text-editor/text-editor.component.mjs +7 -7
  124. package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +3 -3
  125. package/esm2022/lib/pipes/amount.pipe.mjs +1 -1
  126. package/esm2022/lib/pipes/gender.pipe.mjs +1 -1
  127. package/esm2022/lib/sections/BaseSection.mjs +1 -1
  128. package/esm2022/lib/sections/add-new-section/add-new-section.component.mjs +3 -3
  129. package/esm2022/lib/sections/appointment-form/appointment-booking/appointment-booking/appointment-booking.component.mjs +3 -3
  130. package/esm2022/lib/sections/appointment-form/appointment-form.component.mjs +3 -3
  131. package/esm2022/lib/sections/appointment-form/appointment-form.model.mjs +1 -1
  132. package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +3 -3
  133. package/esm2022/lib/sections/banner-carousel/banner-carousel.model.mjs +1 -1
  134. package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +3 -3
  135. package/esm2022/lib/sections/blog-list/blog-list.component.mjs +3 -3
  136. package/esm2022/lib/sections/blog-list/blog-list.model.mjs +1 -1
  137. package/esm2022/lib/sections/brand-story-section/brand-story-section.component.mjs +3 -3
  138. package/esm2022/lib/sections/brand-story-section/brand-story-section.modal.mjs +1 -1
  139. package/esm2022/lib/sections/button-grid-section/button-grid-section.component.mjs +3 -3
  140. package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +3 -3
  141. package/esm2022/lib/sections/choose-us-section/choose-us-section.model.mjs +1 -1
  142. package/esm2022/lib/sections/condensed-and-gradient/condensed-and-gradient.component.mjs +3 -3
  143. package/esm2022/lib/sections/countdown-banner/countdown-banner.component.mjs +3 -3
  144. package/esm2022/lib/sections/countdown-banner/countdown-banner.component.model.mjs +1 -1
  145. package/esm2022/lib/sections/faq-columns-cards/faq-columns-cards.component.mjs +3 -3
  146. package/esm2022/lib/sections/faq-columns-cards/faq-columns-cards.modal.mjs +1 -1
  147. package/esm2022/lib/sections/faq-section/faq-section.component.mjs +3 -3
  148. package/esm2022/lib/sections/faq-section/faq-section.modal.mjs +1 -1
  149. package/esm2022/lib/sections/feature-experience-section/feature-experience-section.component.mjs +3 -3
  150. package/esm2022/lib/sections/feature-experience-section/feature-experience-section.modal.mjs +1 -1
  151. package/esm2022/lib/sections/features-section/features-section.component.mjs +3 -3
  152. package/esm2022/lib/sections/features-section/features-section.model.mjs +1 -1
  153. package/esm2022/lib/sections/footer/footer.component.mjs +3 -3
  154. package/esm2022/lib/sections/footer/footer.modal.mjs +1 -1
  155. package/esm2022/lib/sections/four-features-centered-image/four-features-centered-image.component.mjs +3 -3
  156. package/esm2022/lib/sections/four-features-centered-image/four-features-centered-image.modal.mjs +1 -1
  157. package/esm2022/lib/sections/header-section/header-section.component.mjs +3 -3
  158. package/esm2022/lib/sections/header-section/header-section.model.mjs +1 -1
  159. package/esm2022/lib/sections/header-text/header-text.component.mjs +3 -3
  160. package/esm2022/lib/sections/header-text/header-text.model.mjs +1 -1
  161. package/esm2022/lib/sections/image-background/image-background/image-background.component.mjs +3 -3
  162. package/esm2022/lib/sections/image-background/image-background/image-background.component.model.mjs +1 -1
  163. package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +3 -3
  164. package/esm2022/lib/sections/image-carousel-section/image-carousel.model.mjs +1 -1
  165. package/esm2022/lib/sections/image-grid-hotspot/image-grid-hotspot.component.mjs +3 -3
  166. package/esm2022/lib/sections/image-grid-hotspot/image-grid-hotspot.model.mjs +1 -1
  167. package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +3 -3
  168. package/esm2022/lib/sections/image-grid-section/image-grid-section.model.mjs +1 -1
  169. package/esm2022/lib/sections/image-section/image-section.component.mjs +3 -3
  170. package/esm2022/lib/sections/image-section/image-section.model.mjs +1 -1
  171. package/esm2022/lib/sections/location-section/location-section.component.mjs +3 -3
  172. package/esm2022/lib/sections/location-section/location-section.modal.mjs +1 -1
  173. package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +3 -3
  174. package/esm2022/lib/sections/logo-showcase/logo-showcase.modal.mjs +1 -1
  175. package/esm2022/lib/sections/moving-text/moving-text.component.mjs +3 -3
  176. package/esm2022/lib/sections/moving-text/moving-text.modal.mjs +1 -1
  177. package/esm2022/lib/sections/new-services/new-services.component.mjs +3 -3
  178. package/esm2022/lib/sections/new-services/new-services.model.mjs +1 -1
  179. package/esm2022/lib/sections/new-testimonials/new-testimonials.component.mjs +3 -3
  180. package/esm2022/lib/sections/new-testimonials/new-testimonials.model.mjs +1 -1
  181. package/esm2022/lib/sections/news-letter-component/news-letter-component.component.mjs +3 -3
  182. package/esm2022/lib/sections/news-letter-component/news-letter.modal.mjs +1 -1
  183. package/esm2022/lib/sections/overlapping-image/overlapping-image.component.mjs +3 -3
  184. package/esm2022/lib/sections/overlapping-image/overlapping-image.component.modal.mjs +1 -1
  185. package/esm2022/lib/sections/pricing-section/pricing-section.component.mjs +3 -3
  186. package/esm2022/lib/sections/pricing-section/pricing-section.modal.mjs +1 -1
  187. package/esm2022/lib/sections/process-modern/process-modern.component.mjs +3 -3
  188. package/esm2022/lib/sections/process-modern/process-modern.model.mjs +1 -1
  189. package/esm2022/lib/sections/process-section/process-section.component.mjs +3 -3
  190. package/esm2022/lib/sections/process-section/process-section.modal.mjs +1 -1
  191. package/esm2022/lib/sections/product-info-section/product-info-section.component.mjs +3 -3
  192. package/esm2022/lib/sections/product-info-section/product-info-section.component.modal.mjs +1 -1
  193. package/esm2022/lib/sections/property-component/property-component.component.mjs +3 -3
  194. package/esm2022/lib/sections/property-component/property-component.modal.mjs +1 -1
  195. package/esm2022/lib/sections/property-list/property-list.component.mjs +3 -3
  196. package/esm2022/lib/sections/property-list/property-list.modal.mjs +1 -1
  197. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +3 -3
  198. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.model.mjs +1 -1
  199. package/esm2022/lib/sections/registration-form/registration-form.component.mjs +3 -3
  200. package/esm2022/lib/sections/registration-form/registrationForm.model.mjs +1 -1
  201. package/esm2022/lib/sections/scheme-detail/scheme-detail.component.mjs +3 -3
  202. package/esm2022/lib/sections/scheme-detail/scheme-detail.modal.mjs +1 -1
  203. package/esm2022/lib/sections/service-section/service-section.component.mjs +3 -3
  204. package/esm2022/lib/sections/service-section/service-section.model.mjs +1 -1
  205. package/esm2022/lib/sections/skeleton-loader-section/skeleton-loader-section.component.mjs +3 -3
  206. package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +3 -3
  207. package/esm2022/lib/sections/team-member-section/team-member-section.model.mjs +1 -1
  208. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +3 -3
  209. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.model.mjs +1 -1
  210. package/esm2022/lib/sections/testimonial-masonry/testimonial-masonry.component.mjs +3 -3
  211. package/esm2022/lib/sections/testimonial-masonry/testimonial-masonry.model.mjs +1 -1
  212. package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +3 -3
  213. package/esm2022/lib/sections/testimonial-section/testimonial-section.model.mjs +1 -1
  214. package/esm2022/lib/sections/testimonial-slider/testimonial-slider.component.mjs +3 -3
  215. package/esm2022/lib/sections/testimonial-slider/testimonial-slider.model.mjs +1 -1
  216. package/esm2022/lib/sections/testimonial-video/testimonial-video.component.mjs +3 -3
  217. package/esm2022/lib/sections/testimonial-video/testimonial-video.model.mjs +1 -1
  218. package/esm2022/lib/sections/text-section/text-section.model.mjs +1 -1
  219. package/esm2022/lib/sections/usp-video-section/usp-video-section.component.mjs +3 -3
  220. package/esm2022/lib/sections/usp-video-section/usp-video-section.model.mjs +1 -1
  221. package/esm2022/lib/sections/video-carousel-section/video-carousel-section.component.mjs +3 -3
  222. package/esm2022/lib/sections/video-carousel-section/video-carousel.model.mjs +1 -1
  223. package/esm2022/lib/sections/video-grid-section/video-grid-section.component.mjs +4 -4
  224. package/esm2022/lib/sections/video-grid-section/video-grid-section.model.mjs +1 -1
  225. package/esm2022/lib/sections/video-section/video-section.component.mjs +3 -3
  226. package/esm2022/lib/sections/video-section/video-section.model.mjs +1 -1
  227. package/esm2022/lib/sections/video-showcase/video-showcase.component.mjs +4 -4
  228. package/esm2022/lib/sections/view-blog/view-blog.component.mjs +3 -3
  229. package/esm2022/lib/services/analytics.service.mjs +59 -9
  230. package/esm2022/lib/services/cart.service.mjs +28 -35
  231. package/esm2022/lib/services/endUser.service.mjs +1 -1
  232. package/esm2022/lib/services/image-upload-service.service.mjs +1 -1
  233. package/esm2022/lib/services/rest.service.mjs +2 -2
  234. package/esm2022/lib/services/sanitizeHtml.mjs +1 -1
  235. package/esm2022/lib/services/storage.service.mjs +15 -1
  236. package/esm2022/lib/styles/gradient-extension.mjs +1 -1
  237. package/esm2022/lib/styles/index.mjs +1 -1
  238. package/esm2022/lib/styles/style.model.mjs +1 -1
  239. package/esm2022/lib/styles/text-size.extension.mjs +1 -1
  240. package/esm2022/lib/styles/types.mjs +1 -1
  241. package/esm2022/lib/tokens/api-token.mjs +1 -1
  242. package/esm2022/public-api.mjs +1 -1
  243. package/fesm2022/simpo-component-library.mjs +522 -450
  244. package/fesm2022/simpo-component-library.mjs.map +1 -1
  245. package/lib/components/input-fields/input-fields.component.d.ts +1 -1
  246. package/lib/ecommerce/sections/authenticate-user/authenticate-user.component.d.ts +4 -2
  247. package/lib/ecommerce/sections/authentication-required/authentication-required.component.d.ts +5 -3
  248. package/lib/ecommerce/sections/featured-category/featured-category.component.d.ts +1 -1
  249. package/lib/ecommerce/sections/featured-category/featured-collection.component.d.ts +1 -1
  250. package/lib/ecommerce/sections/new-collection/new-collection.component.d.ts +1 -1
  251. package/lib/ecommerce/sections/product-desc/product-desc.component.d.ts +1 -1
  252. package/lib/ecommerce/sections/product-list/product-list.component.d.ts +3 -1
  253. package/lib/ecommerce/sections/schemes/schemes.component.d.ts +1 -1
  254. package/lib/sections/banner-carousel/banner-carousel.component.d.ts +2 -2
  255. package/lib/sections/carousel-banner/carousel-banner.component.d.ts +1 -1
  256. package/lib/sections/image-grid-hotspot/image-grid-hotspot.component.d.ts +1 -1
  257. package/lib/sections/image-grid-section/image-grid-section.component.d.ts +1 -1
  258. package/lib/sections/image-section/image-section.component.d.ts +2 -2
  259. package/lib/sections/logo-showcase/logo-showcase.component.d.ts +2 -2
  260. package/lib/sections/new-testimonials/new-testimonials.component.d.ts +1 -1
  261. package/lib/sections/pricing-section/pricing-section.component.d.ts +1 -1
  262. package/lib/services/analytics.service.d.ts +13 -0
  263. package/lib/services/cart.service.d.ts +5 -7
  264. package/lib/services/storage.service.d.ts +6 -0
  265. package/package.json +1 -1
  266. package/simpo-component-library-3.6.932.tgz +0 -0
  267. package/simpo-component-library-3.6.930.tgz +0 -0
@@ -1084,7 +1084,7 @@ export class CartComponent extends BaseSection {
1084
1084
  });
1085
1085
  }
1086
1086
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CartComponent, deps: [{ token: i1.EventsService }, { token: i2.CartService }, { token: i3.Router }, { token: i4.RestService }, { token: i5.MatDialog }, { token: i6.StorageServiceService }, { token: i7.MessageService }, { token: i8.MatBottomSheet }, { token: i3.ActivatedRoute }, { token: MAT_DIALOG_DATA, optional: true }, { token: i5.MatDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
1087
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CartComponent, isStandalone: true, selector: "simpo-cart", inputs: { data: "data", responseData: "responseData", index: "index", edit: "edit", delete: "delete", customClass: "customClass" }, providers: [MessageService], viewQueries: [{ propertyName: "d2", first: true, predicate: ["d2"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!isLoading\">\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n\r\n <ng-container *ngIf=\"data\">\r\n <section [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" [id]=\"data?.id\"\r\n [attr.class]=\"isMobile ? 'py-5 position-relative' : 'position-relative'\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\"\r\n [ngClass]=\"!responseData?.orderedItems?.length ? 'no-items' : ''\">\r\n <div class=\"d-flex align-items-center justify-content-center m-auto mb-4\"\r\n [style.marginTop.px]=\"isMobile ? '': '50'\" [style.width.%]=\"isMobile ? '90' : ''\"\r\n *ngIf=\"responseData?.orderedItems?.length && currentTab === 'ADDRESS'\">\r\n <span class=\"timeline\" (click)=\"currentTab = 'BAG'\">Bag</span>\r\n <div class=\"bar\"></div>\r\n <span class=\"timeline isActive\">Address</span>\r\n <div class=\"bar\"></div>\r\n <span class=\"timeline\" style=\"cursor: auto;\">Payment</span>\r\n </div>\r\n <div class=\"cart-tab-parent w-100\" *ngIf=\"currentTab == 'BAG' && ecomConfigs?.appointmentBookingEnabled\">\r\n <!-- && ecomConfigs?.appointmentBookingEnabled\" -->\r\n <div class=\"cart-tabs\" [id]=\"data?.id\">\r\n <div class=\"selected-cart-tab\" [ngClass]=\"{'selected-cart-tab': cartType==='SHOPPING'}\"\r\n (click)=\"cartType='SHOPPING'\">Shopping Cart ({{responseData?.orderedItems?.length ?? 0}})</div>\r\n <div [ngClass]=\"{'selected-cart-tab': cartType==='TRIAL'}\" (click)=\"cartType='TRIAL'\">Trial Cart\r\n ({{trialCartItem?.length ?? 0}})</div>\r\n </div>\r\n </div>\r\n <div class=\"cart-parent\" [spacingHorizontal]=\"stylesLayout\" *ngIf=\"currentTab === 'BAG'\" [id]=\"data?.id\"\r\n [simpoAnimation]=\"styles?.animation\">\r\n <ng-container>\r\n <ng-container *ngIf=\"cartType === 'SHOPPING'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"(responseData?.orderedItems?.length || 0) > 0 ? CARTPAGE : EMPTYITEM\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"cartType === 'TRIAL'\">\r\n <ng-container *ngTemplateOutlet=\"(trialCartItem?.length || 0) > 0 ? CARTPAGE : EMPTYITEM\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"d-flex checkoutPage\"\r\n *ngIf=\"(responseData?.orderedItems?.length || 0) > 0 && currentTab === 'ADDRESS'\">\r\n <ng-container *ngTemplateOutlet=\"CHECKOUTPAGE\">\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\r\n [isEcommerce]=\"true\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n\r\n </section>\r\n </ng-container>\r\n <ng-container *ngIf=\"!data\">\r\n <section class=\"cart-window\">\r\n <div class=\"heading-large lh-2 mb-3 header-sec\">\r\n <div class=\"d-flex align-items-center\">\r\n <mat-icon (click)=\"closeWindow()\">keyboard_arrow_left</mat-icon>\r\n <span>Your Cart</span>\r\n </div>\r\n <div class=\"saving\"></div>\r\n </div>\r\n <div class=\"offers\">\r\n <div class=\"d-flex align-items-center\" style=\"gap: 5px;\">\r\n <img src=\"https://i.postimg.cc/htY55sqY/discount.png\" alt=\"\" height=\"20\" width=\"20\">\r\n <span>Avail Offers / Coupons</span>\r\n </div>\r\n <mat-icon>keyboard_arrow_right</mat-icon>\r\n </div>\r\n <div class=\"small-items\">\r\n <ng-container *ngFor=\"let item of responseData?.orderedItems\">\r\n <div class=\"small-item\">\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div class=\"h-100\" style=\"padding: 0px; width: fit-content;\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n class=\"small-product-img\"\r\n [src]=\"item.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" alt=\"\"\r\n (click)=\"goToProductDetails(item)\">\r\n </div>\r\n <div class=\"small-item-name trim-text\">{{ item.itemName | titlecase }}</div>\r\n <div class=\"small-item-quantity\">\r\n <span class=\"cursor\">-</span>\r\n <span>{{item.quantity}}</span>\r\n <span class=\"cursor\">+</span>\r\n </div>\r\n <div class=\"small-item-price\">\r\n <div class=\"price-with-tax\">\r\n <span [innerHTML]='currency'></span> {{(item.sellingPrice) | number: '1.0-2'}}\r\n </div>\r\n <!-- <div class=\"price-with-tax\">\r\n <span [innerHTML]='currency'></span> {{(item.selling) | number: '1.0-2'}}\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"fotter-sec\">\r\n <div class=\"delivery-add d-flex\">\r\n <mat-icon>home</mat-icon>\r\n <div class=\"address\">Tetsting</div>\r\n </div>\r\n <button class=\"payment-btn\" [disabled]=\"cartInfo.addressDetails\" (click)=\"proceedToCheckout()\"> <span\r\n style=\"margin-right: 5px;\">Click to Pay</span> <span [innerHtml]='currency'></span>\r\n {{(responseData?.totalAmount ?? 0) | number: '1.0-2'}}</button>\r\n </div>\r\n </section>\r\n </ng-container>\r\n</ng-container>\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>\r\n\r\n<ng-template #CouponList>\r\n <section class=\"coupons-listing-section\">\r\n <div class=\"coupon-heading\">\r\n <div class=\"back-btn\" (click)=\"closeDialogRef()\">\r\n <mat-icon>keyboard_arrow_left</mat-icon>\r\n </div>\r\n <div class=\"header-text\">Apply Coupon</div>\r\n </div>\r\n <!-- <div class=\"coupon-search-sec\">\r\n <input type=\"text\" placeholder=\"Type Coupon Code\" [(ngModel)]=\"enteredCouponCode\">\r\n <div class=\"apply-btn-search\" (click)=\"searchIfApplicable()\">Apply</div>\r\n </div> -->\r\n <div class=\"coupon-listing\">\r\n <ng-container *ngIf=\"couponList.length > 0; else showEmptyScreen\">\r\n <ng-container *ngFor=\"let couponDetails of couponList; let idx = index\">\r\n <div class=\"coupon-details\"\r\n [ngStyle]=\"{'background-color': !couponDetails.applicable ? '#FFF2F4' : '#EDFFFA'}\"\r\n *ngIf=\"couponDetails?.status\">\r\n <div class=\"details__coupon-heading\">\r\n <div class=\"coupon-brief\">\r\n <div class=\"coupon-brief__left-sec\">\r\n <div class=\"coupon-name\" [ngStyle]=\"{'color': !couponDetails.applicable ? '#DB1A1A' : '#097D5F'}\">\r\n {{ couponDetails.couponCode | uppercase }}</div>\r\n <div class=\"coupon-desc\">{{ couponDetails.discountDescription | titlecase }}</div>\r\n </div>\r\n <div class=\"coupon-brief__right-sec\">\r\n <div class=\"apply-offer-btn\" [style.opacity]=\"couponDetails.applicable ? '1' : '0.3'\"\r\n [ngStyle]=\"{'cursor': couponDetails.applicable ? 'pointer' : ''}\"\r\n (click)=\"applyCoupon(couponDetails)\">Apply</div>\r\n </div>\r\n </div>\r\n <!-- <div class=\"coupon-toggle-details-btn\" (click)=\"couponDetails.status = !couponDetails.status\">\r\n <span class=\"hide-details-btn\" *ngIf=\"couponDetails.status\">Hide details</span>\r\n <div class=\"show-details-btn\" *ngIf=\"!couponDetails.status\">View details</div>\r\n </div> -->\r\n </div>\r\n <ng-container>\r\n <!-- *ngIf=\"couponDetails.status\" -->\r\n <div class=\"details-divider\"></div>\r\n <ul class=\"details__coupon-terms\">\r\n <li>Offer valid from {{ couponDetails.validFrom | date }} - {{ couponDetails.validTo | date }}</li>\r\n </ul>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #showEmptyScreen>\r\n <div class=\"empty-screen-container\">\r\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\r\n <div class=\"empty-screen__primary-text\">No Coupon Available</div>\r\n <div class=\"empty-screen__secondary-text\">\r\n Looks like there are no coupons at the moment\r\n </div>\r\n <!-- <div class=\"empty-screen__button\">Explore</div> -->\r\n </div>\r\n </ng-template>\r\n </div>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #RedemptionVouchers>\r\n <section class=\"vouchers-listing-section d-flex flex-column\">\r\n <div class=\"coupon-heading d-flex align-items-center gap-2 p-3 fs-18 fw-600 border-bottom\">\r\n <div class=\"back-btn cursor-pointer d-flex align-items-center\" (click)=\"closeDialogRef()\">\r\n <mat-icon>keyboard_arrow_left</mat-icon>\r\n </div>\r\n <div class=\"header-text\">Coupons & Vouchers</div>\r\n </div>\r\n\r\n <!-- <div class=\"d-flex align-items-center tab-container justify-content-between gap-2 p-3\">\r\n <div class=\"redemption-type fs-16 fw-500 cursor-pointer\" [ngClass]=\"{'active-type': redemptionType === 'COUPONS'}\"\r\n (click)=\"redemptionType = 'COUPONS'\">\r\n Coupons\r\n </div>\r\n <div class=\"redemption-type fs-16 fw-500 cursor-pointer\" [ngClass]=\"{'active-type': redemptionType === 'VOUCHERS'}\"\r\n (click)=\"redemptionType = 'VOUCHERS'\">\r\n Vouchers\r\n </div>\r\n </div> -->\r\n\r\n <div class=\"coupon-listing d-flex flex-column gap-3 pt-3\" *ngIf=\"redemptionType === 'COUPONS'\">\r\n <div class=\"d-flex align-items-center tab-container gap-3\">\r\n <div class=\"coupon-type fs-16 fw-500 cursor-pointer\"\r\n [ngClass]=\"{'active-coupon': redemptionCouponType === 'REWARDS'}\" (click)=\"redemptionCouponType = 'REWARDS'\">\r\n Rewards\r\n </div>\r\n <div class=\"coupon-type fs-16 fw-500 cursor-pointer\"\r\n [ngClass]=\"{'active-coupon': redemptionCouponType === 'DISCOUNTS'}\"\r\n (click)=\"redemptionCouponType = 'DISCOUNTS'\">\r\n Discounts\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"redemptionCouponType === 'REWARDS'\">\r\n <ng-container *ngIf=\"(listRedemptionCoupons?.vouchers?.length > 0) ; else showEmptyScreen\">\r\n <ng-container *ngFor=\"let voucher of listRedemptionCoupons?.vouchers; let idx = index\">\r\n <div class=\"voucher-details\" *ngIf=\"!voucher.utilised\">\r\n\r\n <div class=\"coupon-brief d-flex justify-content-between align-items-start mb-3\">\r\n <div class=\"coupon-brief__left-sec\">\r\n <div class=\"coupon-name fs-16 fw-600 mb-1\">{{ voucher.voucherName }}</div>\r\n <div class=\"coupon-desc fs-12 text-secondary\">\r\n Get {{ voucher.couponValueType === 'FIXED' ? '\u20B9' + voucher.couponValue : voucher.couponValue + '%'\r\n }}\r\n off on your payment\r\n </div>\r\n </div>\r\n <div class=\"coupon-brief__right-sec\">\r\n <div class=\"apply-offer-btn fs-12 fw-600 cursor-pointer\" (click)=\"applyRedemptionCoupon(voucher)\">\r\n Apply</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"coupon-code-box d-flex align-items-center gap-3\">\r\n <div class=\"code-label\">Code</div>\r\n <div class=\"code-value\">{{ voucher.voucherCode }}</div>\r\n </div>\r\n\r\n <div class=\"coupon-meta d-flex align-items-center gap-2 fs-12 text-secondary mb-2\">\r\n <span class=\"min-order\">Min: \u20B9{{ voucher.minOrderValue | number }}</span>\r\n <span class=\"separator text-secondary\">|</span>\r\n <span class=\"validity\">\r\n <mat-icon class=\"clock-icon\">schedule</mat-icon>\r\n Until {{ voucher.issuedDate | date: 'MMM dd, yyyy' }}\r\n </span>\r\n <span class=\"separator text-secondary\" *ngIf=\"voucher.maxRedeemableAmount\">|</span>\r\n <span class=\"min-order\" *ngIf=\"voucher.maxRedeemableAmount\">Max Redeemable Amount: \u20B9{{\r\n voucher.maxRedeemableAmount | number }}</span>\r\n </div>\r\n\r\n <!-- <div class=\"terms-link\">View terms & conditions</div> -->\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"redemptionCouponType === 'DISCOUNTS'\">\r\n <ng-container *ngIf=\"(couponList.length > 0); else showEmptyDiscounts\">\r\n <ng-container *ngFor=\"let couponDetails of couponList; let idx = index\">\r\n <div class=\"voucher-details\" *ngIf=\"couponDetails?.status\">\r\n\r\n <div class=\"coupon-brief d-flex justify-content-between align-items-start mb-3\">\r\n <div class=\"coupon-brief__left-sec\">\r\n <div class=\"coupon-name fs-16 fw-600 mb-1\"\r\n [ngStyle]=\"{'color': !couponDetails.applicable ? '#DB1A1A' : '#097D5F'}\">\r\n {{ couponDetails.couponCode | uppercase }}\r\n </div>\r\n <div class=\"coupon-desc fs-12 text-secondary\">\r\n {{ couponDetails.discountDescription | titlecase }}\r\n </div>\r\n </div>\r\n <div class=\"coupon-brief__right-sec\">\r\n <div class=\"apply-offer-btn fs-12 fw-600 cursor-pointer\"\r\n [style.opacity]=\"couponDetails.applicable ? '1' : '0.3'\"\r\n [ngStyle]=\"{'cursor': couponDetails.applicable ? 'pointer' : 'not-allowed'}\"\r\n (click)=\"applyCoupon(couponDetails)\">\r\n Apply\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"coupon-code-box d-flex align-items-center gap-3\">\r\n <div class=\"code-label\">Code</div>\r\n <div class=\"code-value\">{{ couponDetails.couponCode | uppercase }}</div>\r\n </div>\r\n\r\n <div class=\"coupon-meta d-flex align-items-center gap-2 fs-12 text-secondary mb-2\">\r\n <span class=\"validity\">\r\n <mat-icon class=\"clock-icon\">schedule</mat-icon>\r\n {{ couponDetails.validFrom | date }} - {{ couponDetails.validTo | date }}\r\n </span>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #showEmptyDiscounts>\r\n <div class=\"empty-screen-container\">\r\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\r\n <div class=\"empty-screen__primary-text\">No Discount Coupons Available</div>\r\n <div class=\"empty-screen__secondary-text\">\r\n Looks like there are no discount coupons at the moment\r\n </div>\r\n <!-- <div class=\"empty-screen__button\">Explore</div> -->\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #showEmptyScreen>\r\n <div class=\"empty-screen-container\">\r\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\r\n <div class=\"empty-screen__primary-text\">No Coupons Available</div>\r\n <div class=\"empty-screen__secondary-text\">Looks like there are no coupons</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <div class=\"coupon-listing d-flex flex-column gap-3\" *ngIf=\"redemptionType === 'VOUCHERS'\">\r\n <ng-container *ngIf=\"listRedemptionVouchers?.vouchers?.length > 0; else showEmptyScreen\">\r\n <ng-container *ngFor=\"let voucher of listRedemptionVouchers?.vouchers; let idx = index\">\r\n <div class=\"voucher-details\" *ngIf=\"!voucher.utilised\">\r\n\r\n <div class=\"coupon-brief d-flex justify-content-between align-items-start mb-3\">\r\n <div class=\"coupon-brief__left-sec\">\r\n <div class=\"coupon-name fs-16 fw-600 mb-1\">{{ voucher.voucherName }}</div>\r\n <div class=\"coupon-desc fs-12 text-secondary\">\r\n Get {{ voucher.couponValueType === 'FIXED' ? '\u20B9' + voucher.couponValue : voucher.couponValue + '%' }}\r\n off on your payment\r\n </div>\r\n </div>\r\n <div class=\"coupon-brief__right-sec\">\r\n <div class=\"apply-offer-btn fs-12 fw-600 cursor-pointer\" (click)=\"applyRedemptionCoupon(voucher)\">Apply\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"coupon-code-box d-flex align-items-center gap-3\">\r\n <div class=\"code-label\">Code</div>\r\n <div class=\"code-value\">{{ voucher.voucherCode }}</div>\r\n </div>\r\n\r\n <div class=\"coupon-meta d-flex align-items-center gap-2 fs-12 text-secondary mb-2\">\r\n <span class=\"min-order\">Min: \u20B9{{ voucher.minOrderValue | number }}</span>\r\n <span class=\"separator text-secondary\">|</span>\r\n <span class=\"validity\">\r\n <mat-icon class=\"clock-icon\">schedule</mat-icon>\r\n Until {{ voucher.issuedDate | date: 'MMM dd, yyyy' }}\r\n </span>\r\n </div>\r\n\r\n <!-- <div class=\"terms-link\">View terms & conditions</div> -->\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #showEmptyScreen>\r\n <div class=\"empty-screen-container\">\r\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\r\n <div class=\"empty-screen__primary-text\">No Vouchers Available</div>\r\n <div class=\"empty-screen__secondary-text\">Looks like there are no vouchers</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #CARTPAGE>\r\n <div class=\"container\">\r\n <div class=\"main-content\">\r\n <div class=\"cart-items\">\r\n <div class=\"cart-header\">\r\n <h2>Your Cart</h2>\r\n </div>\r\n <ng-container\r\n *ngTemplateOutlet=\"CARTITEM;context:{data: cartType === 'SHOPPING' ? responseData?.orderedItems : trialCartItem}\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sidebar\">\r\n <div class=\"reedem-section d-flex flex-column align-items-center\" *ngIf=\"cartType != 'TRIAL' && getUrl()\">\r\n <div class=\"justify-content-between d-flex align-items-center w-100 redeem-section-text\">Redeem Section Amount\r\n <div class=\"toogle-switch\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" role=\"switch\" id=\"flexSwitchCheckChecked\"\r\n [checked]=\"selectMatureScheme\" (change)=\"onToggleChange()\">\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div class=\"select_matured_text w-100 text-start cursor-pointer\"\r\n *ngIf=\"selectMatureScheme && !selectedRedemption\" (click)=\"selectScheme()\">\r\n Select Matured Scheme\r\n </div> -->\r\n <!-- <div class=\"select_matured_text d-flex flex-column gap-2 w-100 text-start cursor-pointer\"\r\n *ngIf=\"selectedRedemption\">\r\n Selected Scheme\r\n <div class=\"d-flex w-100 justify-content-between align-items-center group_invest\">Group Investment\r\n scheme-5000/M <span>Change</span></div>\r\n <div class=\"d-flex justify-content-between align-items-center w-100 redeem_amount\">Redeemable Amount\r\n <span>\u20B9{{selectedRedmpationData.selectedAmount}}</span>\r\n </div>\r\n </div> -->\r\n </div>\r\n <div class=\"scheme-section\" *ngIf=\"selectMatureScheme\">\r\n <ng-container *ngTemplateOutlet=\"SCHEME_REDEMPTION\"></ng-container>\r\n </div>\r\n <div class=\"coupon-section\" [id]=\"data?.id\" *ngIf=\"cartType === 'SHOPPING' && !referEarnExist\">\r\n <div class=\"coupon-left\">\r\n <div class=\"coupon-icon\"><mat-icon>percent</mat-icon></div>\r\n <span class=\"coupon-text\" *ngIf=\"!responseData.billdetails?.couponId\">Apply\r\n Coupon</span>\r\n <span class=\"coupon-text\" *ngIf=\"responseData.billdetails?.couponId\">Coupon\r\n Applied</span>\r\n </div>\r\n <svg *ngIf=\"!responseData.billdetails?.couponId\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"chevron-icon\" (click)=\"openDialog(CouponList)\">\r\n <path d=\"m9 18 6-6-6-6\" />\r\n </svg>\r\n <span *ngIf=\"responseData.billdetails?.couponId\"\r\n (click)=\"removeCoupon($event)\"><mat-icon>close</mat-icon></span>\r\n </div>\r\n\r\n <div class=\"promo-banner mb-3\" [id]=\"data?.id\" *ngIf=\"cartType === 'SHOPPING' && ecomConfigs?.videoCallEnabled\">\r\n <div class=\"promo-text\">\r\n <h3>See It Before You Buy It</h3>\r\n <p>Experience our designs in detail via video call</p>\r\n </div>\r\n <button class=\"see-live-btn\" (click)=\"scheduleVideoCall(responseData?.orderedItems)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-video\">\r\n <path d=\"m22 8-6 4 6 4V8Z\" />\r\n <rect width=\"14\" height=\"12\" x=\"2\" y=\"6\" rx=\"2\" ry=\"2\" />\r\n </svg>\r\n SEE IT LIVE\r\n </button>\r\n </div>\r\n\r\n <div class=\"plan-details-container p-3 rounded-4 bg-white text-dark voucher-details\"\r\n *ngIf=\"referEarnExist && this?.redemptionPoints?.availablePoints > 0\">\r\n <div class=\"fs-14 fw-500\">\r\n Rewards Available\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-start border-bottom pb-2\">\r\n <div class=\"avb_pts mt-2 mb-2\">\r\n <span class=\"fs-16 fw-500 total_points text-secondary\">\r\n <span class=\" fs-18 fw-600 text-dark\">{{(this?.redemptionPoints?.availablePoints || 0).toFixed(2)}}</span>\r\n pts\r\n </span>\r\n <div class=\"total_value fs-12 text-secondary\">\r\n = max \u20B9{{(this?.redemptionPoints?.pointsConvertedRupees || 0).toFixed(2)}} discount\r\n </div>\r\n </div>\r\n <div class=\"wallte_icon\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/777779c1775200561187wallet_(1).png\" alt=\"\">\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <div class=\"redemable_text\">\r\n <div class=\"title_text\">\r\n <div class=\"fs-14 fw-500\">\r\n Redeem Points\r\n </div>\r\n <div class=\"fs-13 fs-400\">\r\n Use your points for discount\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"toggle_btn\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" id=\"toggleSwitch\" [checked]=\"isPointsRedeeming\"\r\n (click)=\"onPointsRedeemingChange($event)\" />\r\n <span class=\"slider\"></span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"mt-3 success_selected w-100 applied-coupon-card\" *ngIf=\"isPointsRedeeming\">\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <div class=\"success_icon\">\r\n <mat-icon class=\"d-flex justify-content-center align-items-center text-success\">check_circle</mat-icon>\r\n </div>\r\n <div class=\"success_text\">\r\n <div class=\"fs-13 fw-500\">\r\n You're saving \u20B9\r\n {{totalSavingAmt || 0}}\r\n </div>\r\n <div class=\"fs-12 fs-400 text-success\">\r\n {{totalSavingPoints}} points remaining after redemption\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Existing coupon row (keep as-is) -->\r\n <div class=\"coupon-section d-flex flex-column voucher-details\" [id]=\"data?.id\"\r\n *ngIf=\"cartType === 'SHOPPING' && referEarnExist\">\r\n <div class=\"d-flex justify-content-between align-items-center w-100\">\r\n <div class=\"coupon-left\">\r\n Apply Coupon\r\n </div>\r\n <div (click)=\"addRedemptionCoupon(RedemptionVouchers)\">View All</div>\r\n </div>\r\n\r\n <!-- Applied Coupon Success Banner -->\r\n <div class=\"applied-coupon-card w-100 mt-3 d-flex align-items-center justify-content-between\"\r\n *ngIf=\"selectedVoucherId\">\r\n <div class=\"applied-coupon-left d-flex align-items-center gap-3\">\r\n <mat-icon class=\"success-check\">check_circle</mat-icon>\r\n <div class=\"applied-coupon-info\">\r\n <div class=\"applied-coupon-code\">Coupon {{ selectedVoucherCode }} applied!</div>\r\n <div class=\"applied-coupon-saving\">You're saving\r\n <span *ngIf=\"this.couponValueType === 'AMOUNT'\">\u20B9 {{selectedVoucherAmount || 0}}</span>\r\n <span *ngIf=\"this.couponValueType === 'PERCENTAGE'\"> {{selectedVoucherPercentage || 0}}%</span>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"remove-coupon-btn fs-14 fw-500 text-secondary cursor-pointer\"\r\n (click)=\"removeRedemptionCoupon($event)\">Remove</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"delivery-section\" *ngIf=\"getUrl()\">\r\n <div class=\"delivery-header\">\r\n <mat-icon>gps_fixed</mat-icon>\r\n <span *ngIf=\"cartType === 'SHOPPING'\">Delivering to</span>\r\n <span *ngIf=\"cartType === 'TRIAL'\">Trial Location at</span>\r\n <span class=\"pincode\">{{pincode}}</span>\r\n <!-- <a class=\"change-link\">Change Pincode</a> -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"summary-section\">\r\n <div class=\"summary-title\">Summary</div>\r\n\r\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING'\">\r\n <span class=\"summary-label\">Subtotal</span>\r\n <span class=\"summary-value\">\u20B9{{(responseData?.billdetails?.totalNetValue ?? 0) | number: '1.0-2'}}</span>\r\n </div>\r\n\r\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING' && referEarnExist && isPointsRedeeming\">\r\n <span class=\"summary-label\">Points Redeemed</span>\r\n <span class=\"summary-value\">- \u20B9{{ totalSavingAmt || 0 }}</span>\r\n </div>\r\n\r\n <div class=\"summary-row\"\r\n *ngIf=\"cartType === 'SHOPPING' && referEarnExist && (this.couponValueType === 'AMOUNT' && appliedVoucher)\">\r\n <span class=\"summary-label\">Voucher Applied</span>\r\n <span class=\"summary-value\">- \u20B9{{ selectedVoucherAmount || 0 }}</span>\r\n </div>\r\n\r\n <div class=\"summary-row\"\r\n *ngIf=\"cartType === 'SHOPPING' && referEarnExist && (this.couponValueType === 'PERCENTAGE' && appliedVoucher)\">\r\n <span class=\"summary-label\">Voucher Applied</span>\r\n <span class=\"summary-value\">- \u20B9{{ percentageReduced || 0 }}</span>\r\n </div>\r\n\r\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING' && responseData?.billdetails?.discountAmount\">\r\n <span class=\"summary-label\">Discount Amount</span>\r\n <span class=\"summary-value\">\r\n {{('\u20B9' + (responseData?.billdetails?.discountAmount | number: '1.0-2')) }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING'\">\r\n <span class=\"summary-label\">Shipping</span>\r\n <span class=\"summary-value\"\r\n [ngClass]=\"{'savings': !responseData?.billdetails?.deliveryCharges || responseData.billdetails.deliveryCharges <= 0}\">\r\n {{ (responseData?.billdetails?.deliveryCharges && responseData.billdetails.deliveryCharges > 0) ? ('\u20B9' +\r\n (responseData.billdetails.deliveryCharges | number: '1.0-2')) : 'Free' }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING'\">\r\n <span class=\"summary-label\">Estimated Tax</span>\r\n <span class=\"summary-value\">\u20B9{{((!responseData.billdetails?.couponId ?\r\n responseData?.billdetails?.totalTax : responseData?.billdetails?.totalTaxAfterDiscount) ?? 0) |\r\n number: '1.0-2'}}</span>\r\n </div>\r\n\r\n <div class=\"summary-row total-row\" *ngIf=\"cartType === 'SHOPPING'\">\r\n <span class=\"summary-label\">Total</span>\r\n <!-- <span class=\"summary-value\">\u20B9{{ responseData?.totalAmount | number: '1.0-2' }}</span> -->\r\n <span class=\"total-value\" *ngIf=\"!isPointsRedeeming && !appliedVoucher\">\u20B9{{ responseData?.totalAmount |\r\n number: '1.0-2' }}</span>\r\n\r\n <span class=\"total-value\" *ngIf=\"isPointsRedeeming\">\u20B9{{ (responseData?.totalAmount - (totalSavingAmt || 0)) |\r\n number: '1.0-2' }}</span>\r\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'AMOUNT'\">\u20B9{{(responseData?.totalAmount -\r\n (selectedVoucherAmount || 0)) | number:\r\n '1.0-2'}}</span>\r\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'PERCENTAGE'\">\u20B9{{(responseData?.totalAmount -\r\n (percentageReduced || 0)) | number:\r\n '1.0-2' }}</span>\r\n </div>\r\n\r\n <!-- Trial Cart Summary -->\r\n <ng-container *ngIf=\"cartType === 'TRIAL'\">\r\n <div class=\"summary-row\">\r\n <span class=\"summary-label\">Free Trial</span>\r\n <span class=\"summary-value\">\u20B90</span>\r\n </div>\r\n <div class=\"summary-row\">\r\n <span class=\"summary-label\">Service Charge</span>\r\n <span class=\"summary-value savings\">Free</span>\r\n </div>\r\n <div class=\"summary-divider\"></div>\r\n <div class=\"summary-row total-row\">\r\n <span class=\"summary-label\">Total</span>\r\n <span class=\"summary-value\">\u20B90</span>\r\n </div>\r\n <!-- <span class=\"total-value\" *ngIf=\"!isPointsRedeeming && !appliedVoucher\">\u20B9{{ responseData?.totalAmount |\r\n number: '1.0-2' }}</span>\r\n\r\n <span class=\"total-value\" *ngIf=\"isPointsRedeeming\">\u20B9{{ (responseData?.totalAmount - (totalSavingAmt || 0)) |\r\n number: '1.0-2' }}</span>\r\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'AMOUNT'\">\u20B9{{(responseData?.totalAmount -\r\n (selectedVoucherAmount || 0)) | number:\r\n '1.0-2'}}</span>\r\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'PERCENTAGE'\">\u20B9{{(responseData?.totalAmount -\r\n (percentageReduced || 0)) | number:\r\n '1.0-2' }}</span> -->\r\n </ng-container>\r\n </div>\r\n <button class=\"place-order-btn\" (click)=\"edit ? '' : proceedToListPage()\" simpoButtonDirective\r\n [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\r\n *ngIf=\"cartType === 'SHOPPING'\" [appButtonEditor]=\"edit ?? false\"\r\n [backgroundInfo]=\"styles?.background\">{{data?.action?.buttons?.[1]?.content?.label ?? 'Continue\r\n Shopping'}}</button>\r\n <button class=\"place-order-btn mt-0\" (click)=\"edit ? '' : proceedToCheckout()\" simpoButtonDirective\r\n *ngIf=\"cartType === 'SHOPPING'\" [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\"\r\n [color]=\"data?.styles?.background?.accentColor\" [appButtonEditor]=\"edit ?? false\"\r\n [backgroundInfo]=\"styles?.background\">{{data?.action?.buttons?.[0]?.content?.label ?? 'Checkout\r\n Cart'}}</button>\r\n <button class=\"place-order-btn mt-0\" simpoButtonDirective *ngIf=\"cartType === 'TRIAL'\"\r\n [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\r\n [appButtonEditor]=\"edit ?? false\" [backgroundInfo]=\"styles?.background\" (click)=\"bookAppointment()\">BOOK\r\n APPOINTMENT</button>\r\n\r\n </div>\r\n </div>\r\n <!-- <ng-container *ngIf=\"recommededData?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\"\r\n [responseData]=\"recommededData\"></simpo-featured-products>\r\n </ng-container> -->\r\n</ng-template>\r\n<ng-template #CHECKOUTPAGE>\r\n <div class=\"checkout-left-panel\">\r\n <div class=\"checkout-main-content\">\r\n <!-- <div class=\"delivery-options\">\r\n <div class=\"delivery-option active\">\r\n <div class=\"delivery-icon\"></div>\r\n HOME DELIVERY\r\n </div>\r\n <div class=\"delivery-option\">\r\n <div class=\"delivery-icon\"></div>\r\n STORE PICK-UP\r\n </div>\r\n </div> -->\r\n\r\n <div class=\"section-title\">Shipping Address</div>\r\n\r\n <div class=\"shipping-info\" *ngIf=\"defaultAddress\">\r\n <div class=\"address-info\">\r\n <div class=\"address-name\">{{defaultAddress?.receiverName}} ({{defaultAddress?.addressType}})</div>\r\n <div class=\"address-details\">{{defaultAddress?.addressLine1}}, {{defaultAddress?.cityName}},\r\n {{defaultAddress?.stateName}}</div>\r\n <div class=\"mobile-number\">Mobile: {{defaultAddress?.receiverPhone}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"addLinks h-100\" *ngIf=\"!defaultAddress\" (click)=\"addAddress()\">\r\n <mat-icon>add</mat-icon>\r\n </div>\r\n\r\n <button class=\"change-address-btn\" (click)=\"changeAddress()\" *ngIf=\"defaultAddress\">CHANGE OR ADD ADDRESS</button>\r\n\r\n <button class=\"btn w-100 mt-1 payment-btn\" (click)=\"proceedToPayment()\" simpoButtonDirective\r\n *ngIf=\"defaultAddress && !placeOrderLoader\" [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\"\r\n [color]=\"data?.styles?.background?.accentColor\" [appButtonEditor]=\"edit ?? false\"\r\n [backgroundInfo]=\"styles?.background\">\r\n Place Order\r\n </button>\r\n <button class=\"btn w-100 mt-1 payment-btn\" simpoButtonDirective *ngIf=\"defaultAddress && placeOrderLoader\"\r\n [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\r\n [appButtonEditor]=\"edit ?? false\" [backgroundInfo]=\"styles?.background\">\r\n Loading...\r\n </button>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"checkout-right-panel\">\r\n <div class=\"order-summary\">\r\n <div class=\"summary-title\">Order Summary</div>\r\n\r\n <div class=\"checkout-product\">\r\n <div class=\"product-item\" *ngFor=\"let item of responseData?.orderedItems; let idx = index\">\r\n <img [src]=\"item.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" class=\"product-image\"\r\n alt=\"\">\r\n <div class=\"product-details\">\r\n <div class=\"product-name\">{{item.itemName}}</div>\r\n <div class=\"product-quantity\">Quantity: {{item.quantity}}</div>\r\n <div class=\"product-price\">\u20B9{{(item.sellingPrice * item.quantity) | number: '1.0-2'}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"price-breakdown\">\r\n <div class=\"price-row\">\r\n <span>Total Price</span>\r\n <span>\u20B9{{(responseData?.billdetails?.totalNetValue\r\n ?? 0) | number: '1.0-2'}}</span>\r\n </div>\r\n <div class=\"price-row\">\r\n <span>Total Tax</span>\r\n <span>\u20B9{{((!responseData.billdetails?.couponId ?\r\n responseData?.billdetails?.totalTax : responseData?.billdetails?.totalTaxAfterDiscount) ?? 0) |\r\n number:\r\n '1.0-2'}}</span>\r\n </div>\r\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING' && cartInfo?.billdetails?.orraSchemeRedeemedAmount\">\r\n <span class=\"summary-label\">Redeem Amount</span>\r\n <span class=\"summary-value\">\u20B9{{(cartInfo?.billdetails?.orraSchemeRedeemedAmount ?? 0) | number:\r\n '1.0-2'}}</span>\r\n </div>\r\n\r\n <div class=\"price-row discount\" *ngIf=\"responseData?.billdetails?.discountAmount && !isJewellery\">\r\n <span>Coupon Discount</span>\r\n <span>- \u20B9{{responseData?.billdetails?.discountAmount\r\n | number: '1.0-2'}}</span>\r\n </div>\r\n <div class=\"price-row\"\r\n *ngIf=\"responseData?.billdetails?.deliveryCharges && responseData.billdetails.deliveryCharges > 0\">\r\n <span>Delivery Charge</span>\r\n <span>{{responseData.billdetails.deliveryCharges\r\n |\r\n number: '1.0-2'}}</span>\r\n </div>\r\n <div class=\"price-row total\" *ngIf=\"cartType === 'SHOPPING'\">\r\n <span>TOTAL AMOUNT</span>\r\n <span *ngIf=\"!isPointsRedeeming && !appliedVoucher\">\u20B9{{(responseData?.totalAmount ?? 0) | number:\r\n '1.0-2'}}</span>\r\n <span *ngIf=\"isPointsRedeeming\">\u20B9{{(responseData?.totalAmount - (totalSavingAmt || 0)) | number:\r\n '1.0-2'}}</span>\r\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'AMOUNT'\">\u20B9{{(responseData?.totalAmount -\r\n (selectedVoucherAmount || 0)) | number:\r\n '1.0-2'}}</span>\r\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'PERCENTAGE'\">\u20B9{{(responseData?.totalAmount -\r\n (responseData?.totalAmount * (selectedVoucherPercentage / 100) || 0)) | number:\r\n '1.0-2' }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #CARTITEM let-products=\"data\">\r\n <div class=\"cart-item\" *ngFor=\"let item of products\" [style.color]=\"fontColor\">\r\n <div class=\"item-left\">\r\n <div class=\"item-image\">\r\n <img class=\"item-img\" [src]=\"item.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" alt=\"\"\r\n (click)=\"goToProductDetails(item)\" style=\"cursor: pointer;\">\r\n </div>\r\n <div class=\"item-details\">\r\n <h3 class=\"item-title\">{{item.itemName}}</h3>\r\n <div class=\"item-subtitle\" *ngIf=\"item.itemVariant\">\r\n <span *ngFor=\"let varient of getKeys(item.itemVariant.properties); let last = last\">\r\n {{ item.itemVariant.properties[varient] | titlecase }}<span *ngIf=\"!last\">, </span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"item-right\">\r\n <div class=\"quantity-control\" *ngIf=\"cartType === 'SHOPPING'\">\r\n <button class=\"qty-btn px-2\" (click)=\"decreaseQty(item)\" [disabled]=\"item.quantity === 1\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n <span class=\"qty-value px-3\">{{item.quantity}}</span>\r\n <button class=\"qty-btn px-2\" (click)=\"increaseQty(item)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"item-price\">\r\n \u20B9{{item.sellingPrice | number: '1.0-2'}}\r\n </div>\r\n\r\n <div class=\"delete-btn-circle\" (click)=\"removeItem(item)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-trash-2\">\r\n <path d=\"M3 6h18\" />\r\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\r\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\r\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\r\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #EMPTYITEM>\r\n <section class=\"empty-cart w-100 d-flex align-items-center justify-content-center\">\r\n <div class=\"empty-cart-container d-flex flex-column\">\r\n <div class=\"cart-image\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"data?.content?.image?.url\" [alt]=\"data?.content?.image?.altText\" [appImageEditor]=\"edit || false\"\r\n [imageData]=\"data?.content?.image\" [sectionId]=\"data?.id\">\r\n </div>\r\n <div class=\"cart-text content-side\">\r\n <ng-container *ngFor=\"let text of data?.content?.inputText\">\r\n <div class=\"d-flex justify-content-center\"\r\n [ngClass]=\"{'heading-medium': text.label == 'Heading', 'description': text.label == 'Text'}\">\r\n <simpo-text-editor [(value)]=\"text.value\" [editable]=\"edit || false\" [isRTE]=\"text.isRTE\"></simpo-text-editor>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <button class=\"place-order-btn mx-auto w-fit\" (click)=\"edit ? '' : proceedToListPage()\" simpoButtonDirective\r\n [buttonStyle]=\"data?.action?.buttons?.[1]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\r\n [appButtonEditor]=\"edit ?? false\"\r\n [backgroundInfo]=\"styles?.background\">{{data?.action?.buttons?.[1]?.content?.label ?? 'Continue\r\n Shopping'}}</button>\r\n </div>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #SCHEME_REDEMPTION>\r\n <div class=\"modal-body\">\r\n <div class=\"scheme-option\" *ngFor=\"let scheme of schemeList\" (click)=\"redeemScheme(scheme, false)\"\r\n [style.borderColor]=\"cartInfo.billdetails.orraSchemeCode ? styles?.background?.color : ''\">\r\n <label for=\"individual\" class=\"scheme-card\">\r\n <div class=\"scheme-info d-flex gap-1\">\r\n <div class=\"form-check-radio\">\r\n <input class=\"form-check-input-radio\" type=\"radio\" name=\"flexRadioDefault\" id=\"flexRadioDefault2\">\r\n </div>\r\n <div class=\"right-side\">\r\n <div class=\"scheme-name\">\r\n <div class=\"scheme-title\">Individual Investment Scheme</div>\r\n <div class=\"scheme-monthly\">\u20B98000/M</div>\r\n </div>\r\n <div class=\"scheme-details\">\r\n <span class=\"scheme-id\">GPP Id: {{scheme.GPPId}}</span>\r\n <!-- <span class=\"scheme-maturity\">Maturity Date: 12 April 2024</span> -->\r\n </div>\r\n <div class=\"scheme-amount\">\u20B9{{scheme.amount}}</div>\r\n </div>\r\n </div>\r\n </label>\r\n </div>\r\n <div class=\"reedem_error d-flex justify-content-center align-items-center\" *ngIf=\"showReedemError\">\r\n Please add more \u20B9{{vaildAmount}} to reedem this scheme\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}.reedem-section{padding:10px 15px;border-radius:15px;background:#f6f3f9;box-shadow:#b2b2ca80 2px 2px 6px;font-weight:700;font-size:13px}.redeem-section-text{font-size:.9rem;font-weight:700}.form-check-input:checked{background-color:#28a745!important;border-color:#28a745!important}.form-check-input:focus{border-color:#28a745!important;outline:0;box-shadow:none!important}.close-btn{background:none;border:none;font-size:24px;color:#6b7280;cursor:pointer;padding:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center}.close-btn:hover{color:#374151}.select_matured_text{font-size:.8rem!important;margin-top:10px;color:#05aacf}.position-relative{position:relative}.cart-parent{display:flex;margin-top:15px}.left-panel{width:65%;padding-right:5rem;border-right:1px solid #E9E9E9}.timeline{cursor:pointer}.cart-items{background:#fff;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.cart-header{padding:16px 24px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.cart-header h2{margin:0;font-size:18px;font-weight:500;color:#0f172a}.cart-item{display:flex!important;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;gap:20px;padding:0 8px;transition:background .2s}.cart-item:hover{background:#fbfcfe}.item-left{display:flex;align-items:center;flex:1}.item-right{display:flex;align-items:center;padding:15px;gap:32px}.item-image img{width:64px;height:64px;border-radius:12px;object-fit:cover;border:1px solid #f1f5f9}.item-details{display:flex;flex-direction:column;gap:4px}.item-title{margin:0;font-size:15px;font-weight:600;color:#0f172a;line-height:1.4}.item-subtitle{font-size:13px;color:#64748b;font-weight:400}.quantity-control{display:flex;align-items:center;border:1.5px solid #e2e8f0;border-radius:7px;overflow:hidden;height:38px;background:#fff;width:fit-content}.qty-btn{width:38px;height:100%;border:none;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#475569;transition:all .2s ease}.qty-btn:hover{background:#f8fafc;color:#0f172a}.qty-btn mat-icon{font-size:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center}.qty-value{width:32px;height:100%;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:500;color:#0f172a;border-left:1.5px solid #e2e8f0;border-right:1.5px solid #e2e8f0}.item-price{font-size:18px;font-weight:700;color:#0f172a;min-width:60px;text-align:right;letter-spacing:-.01em}.delete-btn-circle{width:36px;height:36px;border-radius:50%;border:1px solid #fee2e2;background:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#ef4444;transition:all .2s ease}.delete-btn-circle:hover{background:#fef2f2;border-color:#fecaca;transform:scale(1.05);color:#dc2626}.delete-btn-circle svg{width:18px;height:18px}.isActive{color:#0267c1;font-weight:600}.bar{width:150px;border-top:2px solid lightgray;margin:0 5px}.right-panel{width:35%;padding-left:5rem}.my-bag{font-size:16px;font-weight:600;color:#000;margin-left:8px}.my-bag span{color:#939393}.coupons{display:flex;justify-content:space-between;padding:10px;border-radius:4px;box-shadow:0 0 1px #28293d14,0 0 2px #60617029;margin-bottom:15px;margin-top:10px;cursor:pointer}.coupon-list-section{padding:15px;width:400px;z-index:10000001!important}.coupon-list-section .search{padding:8px;border:1px solid lightgray;border-radius:20px;display:flex;justify-content:space-between}.coupon-list-section input{border:none;outline:none;width:90%}.coupon-list-section .coupon-list{height:60vh;width:100%}.item-parent{margin:10px 0;min-height:120px}.lh-23{line-height:23px;margin-left:10px}.item-name{color:#141514;font-size:16px;line-height:30px;font-weight:600}.price-with-tax{font-weight:400;font-size:16px;color:#626262}.item-sku{font-weight:400;font-size:14px;color:#626262}.item-price{display:flex;font-weight:600;font-size:16px;color:#141514}.product-img{border-radius:5px;height:100%;width:110px;padding:0;cursor:pointer}.quantity-box{display:flex;gap:5px;align-items:center;border:1px solid #E8E8E8;width:45px;height:22px}.quantity-box input{outline:none;text-align:center;border:none;width:30px;height:100%}.quantity-box .plus{font-size:20px;position:relative;top:-3px;font-weight:500}.quantity-box .minus{font-size:30px;position:relative;top:-3px;font-weight:500}.delete-item{color:#df2e2e;cursor:pointer;font-size:18px}.item-quantity{margin-top:5px;display:flex;min-width:90px;max-width:fit-content;border:1px solid lightgray;justify-content:space-between;align-items:center;padding:5px 10px;border-radius:3px}.coupon{display:flex;justify-content:space-between;border:1px solid #E8E8E8;border-radius:5px;padding:10px;margin-top:10px}.apply-coupon{font-weight:500;color:#626262;font-size:15px}.coupon-desc{color:#939393;font-size:12px;font-weight:500}.apply-coupon-btn{color:#0267c1;font-size:16px;font-weight:600}.price-details{padding:10px;margin-top:10px;border-radius:5px;box-shadow:0 0 1px #28293d14,0 0 2px #60617029;margin-bottom:15px}.price-parent-block{display:flex;justify-content:space-between;margin-top:5px}.price-type{font-weight:400;font-size:16px;color:#434443}.price-value{font-weight:500;font-size:18px;color:#141514}.button-parent{margin-top:20px;display:flex;flex-direction:column;gap:10px}hr{border:1px solid #E8E8E8}.btn{height:40px;font-size:16px!important}.delete-item{text-align:right;position:absolute;right:16px;bottom:10px}.quantity{display:flex;border:2px solid #E6E6E6;align-items:center;gap:15px;height:47px;margin-top:1rem;border-radius:5px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.label{color:#000}.total-container{min-height:80vh;position:relative;display:block!important;height:calc(100vh - 170px)}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%}.cart-image{width:13%;display:flex;margin-right:auto;margin-left:auto}.cart-image img{width:100%}.heading-medium{font-weight:600;color:#000}.description{font-size:18px;color:#7f7676;width:100%;text-align:center}.cart-window{padding:10px}.cart-window .small-product-img{width:55px;height:55px;border-radius:5px}.cart-window .small-items{display:flex;flex-direction:column;gap:10px;margin-top:15px;height:calc(100vh - 160px);overflow-y:auto}.cart-window .small-item{width:100%;display:flex;justify-content:space-between}.cart-window .small-item-name{width:200px}.cart-window .small-item-quantity{display:flex;align-items:center;justify-content:space-between;border-radius:5px;width:80px;background-color:#fafad2;padding:3px 8px;height:35px;font-weight:500;margin-right:3px}.cart-window .small-item-price{display:flex;flex-direction:column;gap:5px}.cart-window .small-item-price .price-with-tax{display:flex;font-size:13px!important}.cart-window .fotter-sec{background-color:#fff;position:absolute;bottom:0;left:0;width:100%;padding:10px}.cart-window .fotter-sec .payment-btn{border-radius:5px;border:none;display:flex;align-items:center;justify-content:center;background-color:#f08080;padding:10px 5px;color:#fff;cursor:pointer}.offers{background-color:#fff;display:flex;justify-content:space-between;padding:8px;border-radius:8px;box-shadow:#959da533 0 -1px 6px}.header-sec{font-size:26px}@media screen and (max-width: 475px){.cart-parent{flex-direction:column}.see-live-btn{white-space:nowrap!important}.left-panel{width:100%;padding-right:0rem}.right-panel{width:100%;z-index:1000;padding-left:0rem}.cart-image{width:42%}.description{width:84%}.heading-medium{font-size:28px}.item-price{white-space:nowrap;display:none}.product-img{width:82px}[class*=col-md]{padding-left:5px!important;padding-right:5px!important}.mobile-fixed{height:40px;font-size:16px!important;border:1px solid lightgray;width:100%;position:relative;bottom:10px}.empty-cart-container{height:calc(100vh - 130px)}.coupons-listing-section{width:100vw!important}.checkoutPage{flex-direction:column}.checkout-left-panel,.checkout-right-panel{width:100%!important}}.mobile-fixed{color:#fff}.coupons-listing-section{height:100vh;padding-top:0;position:relative;width:390px;z-index:100;background:#d3d3d354}.coupons-listing-section .coupon-heading{display:flex;align-items:center;background-color:#fff;padding:15px 20px;width:100%;box-sizing:border-box}.coupons-listing-section .coupon-heading img{height:15px;width:15px;position:relative;top:2px;cursor:pointer}.coupons-listing-section .coupon-heading .header-text{font-size:16px;color:#000;font-weight:600;margin-left:15px;position:relative;top:-3px;right:15px;cursor:pointer}.coupons-listing-section .coupon-search-sec{width:90%;box-sizing:border-box;margin:10px auto;border:1px solid lightgray;padding:10px;border-radius:10px;background-color:#fff;display:flex;font-size:16px;color:#000;font-weight:600}.coupons-listing-section .coupon-search-sec input{border:none;outline:none;background-color:transparent;width:95%;font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-search-sec input:focus{font-size:14px;color:#000;font-weight:600}.coupons-listing-section .coupon-search-sec .back-btn{position:relative;top:3px;cursor:pointer}.coupons-listing-section .coupon-search-sec .apply-btn-search{font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing{height:72%;overflow-y:auto;width:90%;margin:20px auto}.coupons-listing-section .coupon-listing .coupon-details{padding:15px;margin-bottom:15px;background-color:#edfffa;border-radius:10px;border:1px solid lightgray}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading{display:flex;flex-direction:column;gap:25px}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief{display:flex;justify-content:space-between;width:100%}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-name{font-size:16px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-desc{padding:5px 0;font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .show-details-btn{cursor:pointer}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-brief__right-sec{display:flex;justify-content:flex-end}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-brief__right-sec .apply-offer-btn{font-size:16px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-toggle-details-btn{text-align:left;text-decoration:underline;width:100%;font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details-divider{border-top:2px solid lightgray;opacity:.3;margin:15px 0}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-terms{font-size:14px;color:#000;font-weight:400}.empty-screen-container{height:100%;width:85%;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-screen-container .empty-screen__primary-text{font-size:22px;color:#000;font-weight:400}.empty-screen-container .empty-screen__secondary-text{text-align:center;padding:10px 0;font-size:16px;color:#000;font-weight:400}.empty-screen-container .empty-screen__button{width:90%;background-color:#fff;border-radius:8px;text-align:center;padding:10px;margin:10px auto 0;cursor:pointer;font-size:18px;color:#000;font-weight:400}.box-shadow{box-shadow:#00000029 0 1px 4px}.main-content{border-radius:12px;padding:0 30px 30px;width:100%;overflow:scroll;height:calc(100vh - 150px)}.delivery-options{display:flex;gap:20px;margin-bottom:30px}.delivery-option{padding:12px 24px;border:2px solid #e0e0e0;border-radius:25px;background:#fff;cursor:pointer;display:flex;align-items:center;gap:8px;font-weight:500;transition:all .2s}.delivery-option.active{background:#f0e6ff;border-color:#8b5cf6;color:#7c3aed}.delivery-option:hover{border-color:silver}.delivery-icon{width:16px;height:16px;background:#8b5cf6;border-radius:3px}.section-title{font-size:16px;font-weight:700;margin-bottom:20px;color:#000}.shipping-info{border-radius:10px;padding:20px;margin-bottom:20px;border:1px solid rgb(238,232,255);box-shadow:#0000000a 0 4px 8px}.delivery-date{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.delivery-date-text{color:#666;font-weight:500}.change-date-btn{color:#e91e63;background:none;border:none;font-weight:600;cursor:pointer;text-transform:uppercase;font-size:12px;letter-spacing:.5px}.address-info{margin-bottom:15px}.address-name{font-weight:700;margin-bottom:8px;color:#000}.address-details{color:#666;margin-bottom:8px}.mobile-number{font-weight:700;color:#000;font-size:15px}.change-address-btn{font-size:1rem!important;font-weight:700!important;padding:6px;background:#fff;border:1px solid rgb(229,221,255);border-radius:8px;color:#000;cursor:pointer;transition:all .2s;box-shadow:#0000000a 0 4px 8px}.change-address-btn:hover{border-color:#8b5cf6;color:#8b5cf6}.billing-section{margin-top:40px}.billing-options{display:flex;flex-direction:column;gap:15px;margin-top:20px}.billing-option{display:flex;align-items:center;gap:12px;padding:15px;border:2px solid #e0e0e0;border-radius:8px;cursor:pointer;transition:all .2s}.billing-option.active{background:#f0e6ff;border-color:#8b5cf6}.radio-btn{width:20px;height:20px;border:2px solid #e0e0e0;border-radius:50%;position:relative}.billing-option.active .radio-btn{border-color:#8b5cf6}.billing-option.active .radio-btn:after{content:\"\";width:10px;height:10px;background:#8b5cf6;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.order-summary{border-radius:12px;padding:25px;width:75%}.summary-title{font-size:16px;font-weight:700;margin-bottom:20px;color:#000}.product-item{display:flex;gap:15px;margin-bottom:20px;border-bottom:1px solid #f0f0f0;border-radius:7px;background:#fff;padding:15px}.product-item:last-of-type{border-bottom:none;margin-bottom:30px;padding-bottom:0}.product-image{max-width:110px;width:100%;height:100%;border-radius:8px}.product-details{flex:1}.product-name{font-weight:500;margin-bottom:4px;color:#2d3748;font-size:14px}.product-quantity{color:#666;font-size:12px;margin-bottom:8px}.product-price{font-weight:600;color:#2d3748}.delivery-info{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:11px;color:#8b5cf6}.delivery-icon-small{width:12px;height:12px;background:#8b5cf6;border-radius:2px}.price-breakdown{border-top:1px solid #f0f0f0;padding-top:20px}.price-row{display:flex;justify-content:space-between;margin-bottom:12px;color:#666}.price-row.total{font-weight:600;color:#2d3748;font-size:16px;margin-top:15px;padding-top:15px;border-top:1px solid #f0f0f0}.discount{color:#22c55e!important}@media (max-width: 768px){.container{grid-template-columns:1fr;padding:15px;gap:20px}.main-content,.order-summary{padding:20px;width:100%}.delivery-options{flex-direction:column;gap:10px}}.checkout-left-panel{width:65%;display:flex;justify-content:center}.checkout-right-panel{width:35%;display:flex;justify-content:center;background-color:#f9f9fa}.checkout-product{max-height:50vh;overflow:scroll}.mt-1{margin-top:1rem!important}.payment-btn{box-shadow:#0000000a 0 4px 8px}.addLinks{padding-bottom:8px;padding-top:9px;border:1px dashed;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:5px;height:25vh!important;margin-bottom:20px}.addLinks mat-icon{border:1px solid rgb(219,223,225);display:flex;border-radius:100%;align-items:center;justify-content:center;font-size:16px;color:#dbdfe1}.change-pincode{display:flex;gap:10px}.change-pincode mat-icon{font-size:18px;align-items:center;justify-content:center;display:flex}.change-pincode span{font-size:14px}.fs-13{font-size:13px}.fs-12{font-size:12px}.fs-18{font-size:18px}.b-1-b{border-width:0px 1px;border-style:solid;border-color:#000}.container{max-width:unset;padding:24px;display:flex;gap:24px;width:100%!important}.main-content{background:#fff;border-radius:12px;width:70%}.promo-banner{padding:16px 20px;display:flex;justify-content:space-between;align-items:center;border-radius:8px;border:1px solid #e2e8f0}.promo-text h3{font-size:16px!important;font-weight:500;margin-bottom:4px}.promo-text p{font-size:.9rem!important;margin-bottom:0!important;color:#64748b}.see-live-btn{background:#fff;border:1px solid #e2e8f0;font-weight:600;color:#000;padding:8px 16px;border-radius:8px;font-size:12px!important;cursor:pointer;display:flex;align-items:center;gap:8px;width:max-content!important;transition:all .2s ease;box-shadow:0 1px 2px #0000000d}.see-live-btn:hover{background:#f8fafc;border-color:#cbd5e1;transform:translateY(-1px)}.see-live-btn svg{color:#6366f1}.cart-item{display:flex;gap:16px;position:relative}.cart-item:last-child{border-bottom:none}.item-image{width:15%;height:100px;border-radius:8px;object-fit:cover;display:flex;align-items:center;justify-content:center}.item-details{flex:1}.item-title{font-weight:500;margin-bottom:8px}.item-price{display:flex;align-items:center;gap:8px}.current-price{font-size:1rem;font-weight:600}.original-price{font-size:1rem;text-decoration:line-through}.discount{background:#fef3c7;padding:2px 6px;border-radius:4px;font-size:12px;font-weight:500}.item-code{font-size:12px;color:#9ca3af;margin-bottom:8px}.item-options{display:flex;gap:16px;font-size:14px;color:#6b7280;margin-bottom:12px}.delivery-info{font-size:12px;color:#8b5cf6}.pickup-info{background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:5px 15px;margin-top:12px;display:flex;align-items:center;cursor:pointer;width:max-content;gap:20px}.pickup-text{font-size:.9rem;color:#374151}.remove-btn{position:absolute;top:16px;right:0;width:20px!important;height:20px;background:#000;color:#fff;border:none;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:10px!important}.sidebar{display:flex;flex-direction:column;gap:16px;width:32%}.coupon-section{border-radius:8px;padding:10px 15px;border:1px solid #e2e8f0;display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:all .2s ease}.coupon-section:hover{border-color:#cbd5e1;background-color:#f8fafc}.chevron-icon{color:#94a3b8;transition:transform .2s ease}.coupon-section:hover .chevron-icon{transform:translate(2px);color:#64748b}.scheme-section{border-radius:12px;padding:10px 15px;cursor:pointer}.coupon-left{display:flex;align-items:center;gap:12px}.coupon-icon{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center}.coupon-icon mat-icon{font-size:17px;width:17px!important;height:19px!important}.coupon-text{font-weight:700;font-size:.9rem}.delivery-section{background:#fff;border-radius:12px;padding:10px 15px;box-shadow:#b2b2ca80 2px 2px 6px;background:#f6f3f9}.delivery-header{display:flex;align-items:center;gap:12px;margin-bottom:4px}.delivery-header span{font-size:.9rem;font-weight:700}.delivery-header mat-icon{width:20px;height:20px;font-size:17px;position:relative;top:2px}.delivery-icon{width:20px;height:20px;background:#8b5cf6;border-radius:50%}.pincode{font-weight:600;color:#111827}.change-link{color:#ec4899;font-size:.9rem;text-decoration:none;margin-left:auto}.summary-section{background:#fff;border-radius:8px;padding:20px;border:1px solid #e2e8f0}.summary-title{font-size:16px;font-weight:700;color:#0f172a;margin-bottom:20px;letter-spacing:-.01em}.summary-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.summary-row:last-child{margin-bottom:0}.summary-label{font-size:14px;font-weight:400;color:#64748b}.summary-value{font-size:14px;font-weight:500;color:#0f172a}.summary-divider{height:1px;background:#f1f5f9;margin:16px 0;width:100%}.total-row .summary-label{font-size:16px;font-weight:600;color:#0f172a}.total-row .summary-value{font-size:16px;font-weight:700;color:#0f172a}.total-row{border-top:1px solid #e2e8f0;padding-top:15px;margin-top:15px}.total-label{font-weight:600;font-size:16px}.total-value{font-weight:700;font-size:18px}.place-order-btn{background:linear-gradient(135deg,#8b5cf6,#ec4899);color:#fff;border:none;border-radius:12px;padding:9px 10px;font-size:.9rem!important;font-weight:600;cursor:pointer;margin-top:10px;text-transform:uppercase}.place-order-btn:hover{opacity:.9}.chain-icon,.earring-icon{width:60px;height:60px;filter:sepia(1) hue-rotate(30deg) saturate(2)}.item-img{width:100%;height:100%;object-fit:cover}.mt-0{margin-top:0!important}select{outline:none;border-radius:5px;padding:2px;width:20%;border:none;box-shadow:#9999994d 2px 2px 6px;cursor:pointer}.cart-tab-parent{display:flex;justify-content:center}.cart-tabs{gap:10px;display:flex;justify-content:center;align-items:center;width:max-content;border-radius:8px;border:1px solid #e2e8f0}.cart-tabs div{padding:7px 10px;cursor:pointer;font-size:14px}.selected-cart-tab{margin:6px;background:#f1f5f9;border-radius:5px;color:#000!important;font-weight:500}.checkout-main-content{width:50%;padding:30px;border-radius:12px}@media screen and (max-width: 475px){.main-content{padding:0;height:auto!important}.cart-item{flex-direction:column!important;align-items:flex-start!important;padding:16px 12px!important;gap:16px!important}.item-left{width:100%!important;gap:16px!important;align-items:flex-start!important}.item-image{width:86px!important;height:86px!important;flex-shrink:0!important}.item-right{width:100%!important;justify-content:space-between!important;padding:0!important;gap:12px!important;margin-top:4px!important}.item-price{flex:1!important;text-align:right!important;margin-right:8px!important;font-size:16px!important}.item-title{font-size:14px!important;-webkit-line-clamp:2!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;overflow:hidden!important}.quantity-control{height:34px!important}.qty-btn{width:34px!important}.qty-value{width:28px!important;font-size:13px!important}.no-items{height:86vh;overflow:hidden;margin:0}.checkout-main-content{width:100%}.container{padding:0!important}.pickup-info{display:none}.container{display:flex;flex-direction:column}.promo-banner{gap:10px}select{width:50%}.main-content,.sidebar{width:100%}.vouchers-listing-section{min-width:unset!important;width:100vw!important}.separator{display:none!important}.coupon-meta{display:grid!important;grid-template-columns:1fr 1fr!important}}.group_invest{color:#000;font-size:.8rem}.reedem_error{color:red}.group_invest span{color:#05aacf}.redeem_amount{padding:2%;border-radius:4px;background:#fff;margin-top:2%;color:#000;font-size:.8rem}.redeem_amount span{color:#0dc577}.w-fit{width:fit-content!important}.modal-body{padding-bottom:0;overflow-y:scroll;max-height:300px;padding:0!important}.scheme-option{margin-bottom:16px}.scheme-option input[type=radio]:checked+.scheme-card{border-color:#06b6d4;background:#f0f9ff;position:relative}.scheme-option input[type=radio]:checked+.scheme-card:before{content:\"\";position:absolute;top:20px;left:20px;width:20px;height:20px;border:2px solid #06b6d4;border-radius:50%;background:#fff}.scheme-option input[type=radio]:checked+.scheme-card:after{content:\"\";position:absolute;top:26px;left:26px;width:8px;height:8px;background:#06b6d4;border-radius:50%}.scheme-card{justify-content:space-between;padding:10px;border:2px solid #e5e7eb;border-radius:8px;cursor:pointer;transition:all .2s ease;background:#fff;width:100%}.scheme-card:hover{border-color:#d1d5db;background:#f9fafb}.form-check-radio{width:10%}.scheme-title{font-size:12px;font-weight:600;color:#111827;margin-bottom:8px}.scheme-details{display:flex;gap:25px;margin-bottom:20px}.scheme-name{display:flex;justify-content:space-between}.scheme-details span{font-size:12px;color:#0000004d}.scheme-monthly{font-size:14px;font-weight:600;color:#111827;min-width:100px;text-align:right}.right-side{width:90%}.scheme-amount{font-weight:700}@media screen and (min-width: 700px){.cart-items{max-height:500px;overflow:scroll}}.add-to-cart-parent{width:max-content;border:1px solid #000000;border-radius:8px}.cursor{cursor:pointer}.cart-text{max-width:600px;margin:0 auto;text-align:center}.cart-text div{word-break:break-word;overflow-wrap:break-word;white-space:normal}.switch{position:relative;display:inline-block;width:45px;height:20px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:34px}.slider:before{position:absolute;content:\"\";height:16px;width:16px;left:3px;bottom:2px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#4caf50}input:checked+.slider:before{transform:translate(24px)}.vouchers-listing-section{position:relative;width:fit-content;min-width:500px;z-index:100;background:#fff;height:100vh}.vouchers-listing-section .coupon-heading{border-bottom:1px solid #eee}.vouchers-listing-section .coupon-listing{padding:12px 16px;overflow-y:auto;height:calc(97vh - 100px)}.voucher-details{background:#fff;border-radius:12px;padding:14px;box-shadow:0 1px 4px #00000042}.voucher-details .coupon-brief .apply-offer-btn{background:#111;color:#fff;border-radius:10px;padding:6px 16px}.voucher-details .coupon-code-box{border:1.5px dashed #bbb;border-radius:8px;padding:8px 12px;margin-bottom:10px}.voucher-details .coupon-code-box .code-label{font-size:11px;color:#888;margin-bottom:2px}.voucher-details .coupon-code-box .code-row .code-value{font-weight:700;font-size:15px;letter-spacing:1px}.voucher-details .coupon-meta .clock-icon{font-size:14px;height:14px;width:14px;vertical-align:middle}.applied-coupon-card{background:#f0fff8;border-radius:12px;padding:12px 16px}.applied-coupon-card .applied-coupon-left .success-check{color:#22c55e;font-size:22px}.applied-coupon-card .applied-coupon-left .applied-coupon-code{font-weight:700;font-size:14px}.applied-coupon-card .applied-coupon-left .applied-coupon-saving{font-size:13px;color:#097d5f;margin-top:2px}.active-type{background:#111!important;color:#fff!important}.redemption-type{text-align:center;border-radius:10px;padding:6px 16px;background:#d3d3d36b;width:-webkit-fill-available!important}.wallte_icon{background:#000;border-radius:50px;padding:5px 9px 7px}.wallte_icon img{width:18px;height:18px}.fw-600{font-weight:600}.coupon-type{width:fit-content!important;border-radius:26px!important;background:transparent!important;border:1px solid #afafaf;color:#393838;text-align:center;padding:6px 16px}.active-coupon{background:transparent!important;border:2px solid black!important;color:#000!important}.my-close-btn{position:absolute!important;top:10px!important;right:10px!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i9.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i9.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i9.DecimalPipe, name: "number" }, { kind: "pipe", type: i9.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i9.DatePipe, name: "date" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i10.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i11.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i12.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "directive", type:
1087
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CartComponent, isStandalone: true, selector: "simpo-cart", inputs: { data: "data", responseData: "responseData", index: "index", edit: "edit", delete: "delete", customClass: "customClass" }, providers: [MessageService], viewQueries: [{ propertyName: "d2", first: true, predicate: ["d2"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!isLoading\">\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n\n <ng-container *ngIf=\"data\">\n <section [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" [id]=\"data?.id\"\n [attr.class]=\"isMobile ? 'py-5 position-relative' : 'position-relative'\" simpoHover\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\"\n [ngClass]=\"!responseData?.orderedItems?.length ? 'no-items' : ''\">\n <div class=\"d-flex align-items-center justify-content-center m-auto mb-4\"\n [style.marginTop.px]=\"isMobile ? '': '50'\" [style.width.%]=\"isMobile ? '90' : ''\"\n *ngIf=\"responseData?.orderedItems?.length && currentTab === 'ADDRESS'\">\n <span class=\"timeline\" (click)=\"currentTab = 'BAG'\">Bag</span>\n <div class=\"bar\"></div>\n <span class=\"timeline isActive\">Address</span>\n <div class=\"bar\"></div>\n <span class=\"timeline\" style=\"cursor: auto;\">Payment</span>\n </div>\n <div class=\"cart-tab-parent w-100\" *ngIf=\"currentTab == 'BAG' && ecomConfigs?.appointmentBookingEnabled\">\n <!-- && ecomConfigs?.appointmentBookingEnabled\" -->\n <div class=\"cart-tabs\" [id]=\"data?.id\">\n <div class=\"selected-cart-tab\" [ngClass]=\"{'selected-cart-tab': cartType==='SHOPPING'}\"\n (click)=\"cartType='SHOPPING'\">Shopping Cart ({{responseData?.orderedItems?.length ?? 0}})</div>\n <div [ngClass]=\"{'selected-cart-tab': cartType==='TRIAL'}\" (click)=\"cartType='TRIAL'\">Trial Cart\n ({{trialCartItem?.length ?? 0}})</div>\n </div>\n </div>\n <div class=\"cart-parent\" [spacingHorizontal]=\"stylesLayout\" *ngIf=\"currentTab === 'BAG'\" [id]=\"data?.id\"\n [simpoAnimation]=\"styles?.animation\">\n <ng-container>\n <ng-container *ngIf=\"cartType === 'SHOPPING'\">\n <ng-container\n *ngTemplateOutlet=\"(responseData?.orderedItems?.length || 0) > 0 ? CARTPAGE : EMPTYITEM\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"cartType === 'TRIAL'\">\n <ng-container *ngTemplateOutlet=\"(trialCartItem?.length || 0) > 0 ? CARTPAGE : EMPTYITEM\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n <div class=\"d-flex checkoutPage\"\n *ngIf=\"(responseData?.orderedItems?.length || 0) > 0 && currentTab === 'ADDRESS'\">\n <ng-container *ngTemplateOutlet=\"CHECKOUTPAGE\">\n </ng-container>\n </div>\n\n\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\n [isEcommerce]=\"true\"></simpo-hover-elements>\n </div>\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\n </div>\n\n </section>\n </ng-container>\n <ng-container *ngIf=\"!data\">\n <section class=\"cart-window\">\n <div class=\"heading-large lh-2 mb-3 header-sec\">\n <div class=\"d-flex align-items-center\">\n <mat-icon (click)=\"closeWindow()\">keyboard_arrow_left</mat-icon>\n <span>Your Cart</span>\n </div>\n <div class=\"saving\"></div>\n </div>\n <div class=\"offers\">\n <div class=\"d-flex align-items-center\" style=\"gap: 5px;\">\n <img src=\"https://i.postimg.cc/htY55sqY/discount.png\" alt=\"\" height=\"20\" width=\"20\">\n <span>Avail Offers / Coupons</span>\n </div>\n <mat-icon>keyboard_arrow_right</mat-icon>\n </div>\n <div class=\"small-items\">\n <ng-container *ngFor=\"let item of responseData?.orderedItems\">\n <div class=\"small-item\">\n <div class=\"d-flex\" style=\"gap: 5px;\">\n <div class=\"h-100\" style=\"padding: 0px; width: fit-content;\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n class=\"small-product-img\"\n [src]=\"item.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" alt=\"\"\n (click)=\"goToProductDetails(item)\">\n </div>\n <div class=\"small-item-name trim-text\">{{ item.itemName | titlecase }}</div>\n <div class=\"small-item-quantity\">\n <span class=\"cursor\">-</span>\n <span>{{item.quantity}}</span>\n <span class=\"cursor\">+</span>\n </div>\n <div class=\"small-item-price\">\n <div class=\"price-with-tax\">\n <span [innerHTML]='currency'></span> {{(item.sellingPrice) | number: '1.0-2'}}\n </div>\n <!-- <div class=\"price-with-tax\">\n <span [innerHTML]='currency'></span> {{(item.selling) | number: '1.0-2'}}\n </div> -->\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"fotter-sec\">\n <div class=\"delivery-add d-flex\">\n <mat-icon>home</mat-icon>\n <div class=\"address\">Tetsting</div>\n </div>\n <button class=\"payment-btn\" [disabled]=\"cartInfo.addressDetails\" (click)=\"proceedToCheckout()\"> <span\n style=\"margin-right: 5px;\">Click to Pay</span> <span [innerHtml]='currency'></span>\n {{(responseData?.totalAmount ?? 0) | number: '1.0-2'}}</button>\n </div>\n </section>\n </ng-container>\n</ng-container>\n\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '40vh',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n}\">\n</ngx-skeleton-loader>\n\n<ng-template #CouponList>\n <section class=\"coupons-listing-section\">\n <div class=\"coupon-heading\">\n <div class=\"back-btn\" (click)=\"closeDialogRef()\">\n <mat-icon>keyboard_arrow_left</mat-icon>\n </div>\n <div class=\"header-text\">Apply Coupon</div>\n </div>\n <!-- <div class=\"coupon-search-sec\">\n <input type=\"text\" placeholder=\"Type Coupon Code\" [(ngModel)]=\"enteredCouponCode\">\n <div class=\"apply-btn-search\" (click)=\"searchIfApplicable()\">Apply</div>\n </div> -->\n <div class=\"coupon-listing\">\n <ng-container *ngIf=\"couponList.length > 0; else showEmptyScreen\">\n <ng-container *ngFor=\"let couponDetails of couponList; let idx = index\">\n <div class=\"coupon-details\"\n [ngStyle]=\"{'background-color': !couponDetails.applicable ? '#FFF2F4' : '#EDFFFA'}\"\n *ngIf=\"couponDetails?.status\">\n <div class=\"details__coupon-heading\">\n <div class=\"coupon-brief\">\n <div class=\"coupon-brief__left-sec\">\n <div class=\"coupon-name\" [ngStyle]=\"{'color': !couponDetails.applicable ? '#DB1A1A' : '#097D5F'}\">\n {{ couponDetails.couponCode | uppercase }}</div>\n <div class=\"coupon-desc\">{{ couponDetails.discountDescription | titlecase }}</div>\n </div>\n <div class=\"coupon-brief__right-sec\">\n <div class=\"apply-offer-btn\" [style.opacity]=\"couponDetails.applicable ? '1' : '0.3'\"\n [ngStyle]=\"{'cursor': couponDetails.applicable ? 'pointer' : ''}\"\n (click)=\"applyCoupon(couponDetails)\">Apply</div>\n </div>\n </div>\n <!-- <div class=\"coupon-toggle-details-btn\" (click)=\"couponDetails.status = !couponDetails.status\">\n <span class=\"hide-details-btn\" *ngIf=\"couponDetails.status\">Hide details</span>\n <div class=\"show-details-btn\" *ngIf=\"!couponDetails.status\">View details</div>\n </div> -->\n </div>\n <ng-container>\n <!-- *ngIf=\"couponDetails.status\" -->\n <div class=\"details-divider\"></div>\n <ul class=\"details__coupon-terms\">\n <li>Offer valid from {{ couponDetails.validFrom | date }} - {{ couponDetails.validTo | date }}</li>\n </ul>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #showEmptyScreen>\n <div class=\"empty-screen-container\">\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\n <div class=\"empty-screen__primary-text\">No Coupon Available</div>\n <div class=\"empty-screen__secondary-text\">\n Looks like there are no coupons at the moment\n </div>\n <!-- <div class=\"empty-screen__button\">Explore</div> -->\n </div>\n </ng-template>\n </div>\n </section>\n</ng-template>\n\n<ng-template #RedemptionVouchers>\n <section class=\"vouchers-listing-section d-flex flex-column\">\n <div class=\"coupon-heading d-flex align-items-center gap-2 p-3 fs-18 fw-600 border-bottom\">\n <div class=\"back-btn cursor-pointer d-flex align-items-center\" (click)=\"closeDialogRef()\">\n <mat-icon>keyboard_arrow_left</mat-icon>\n </div>\n <div class=\"header-text\">Coupons & Vouchers</div>\n </div>\n\n <!-- <div class=\"d-flex align-items-center tab-container justify-content-between gap-2 p-3\">\n <div class=\"redemption-type fs-16 fw-500 cursor-pointer\" [ngClass]=\"{'active-type': redemptionType === 'COUPONS'}\"\n (click)=\"redemptionType = 'COUPONS'\">\n Coupons\n </div>\n <div class=\"redemption-type fs-16 fw-500 cursor-pointer\" [ngClass]=\"{'active-type': redemptionType === 'VOUCHERS'}\"\n (click)=\"redemptionType = 'VOUCHERS'\">\n Vouchers\n </div>\n </div> -->\n\n <div class=\"coupon-listing d-flex flex-column gap-3 pt-3\" *ngIf=\"redemptionType === 'COUPONS'\">\n <div class=\"d-flex align-items-center tab-container gap-3\">\n <div class=\"coupon-type fs-16 fw-500 cursor-pointer\"\n [ngClass]=\"{'active-coupon': redemptionCouponType === 'REWARDS'}\" (click)=\"redemptionCouponType = 'REWARDS'\">\n Rewards\n </div>\n <div class=\"coupon-type fs-16 fw-500 cursor-pointer\"\n [ngClass]=\"{'active-coupon': redemptionCouponType === 'DISCOUNTS'}\"\n (click)=\"redemptionCouponType = 'DISCOUNTS'\">\n Discounts\n </div>\n </div>\n <ng-container *ngIf=\"redemptionCouponType === 'REWARDS'\">\n <ng-container *ngIf=\"(listRedemptionCoupons?.vouchers?.length > 0) ; else showEmptyScreen\">\n <ng-container *ngFor=\"let voucher of listRedemptionCoupons?.vouchers; let idx = index\">\n <div class=\"voucher-details\" *ngIf=\"!voucher.utilised\">\n\n <div class=\"coupon-brief d-flex justify-content-between align-items-start mb-3\">\n <div class=\"coupon-brief__left-sec\">\n <div class=\"coupon-name fs-16 fw-600 mb-1\">{{ voucher.voucherName }}</div>\n <div class=\"coupon-desc fs-12 text-secondary\">\n Get {{ voucher.couponValueType === 'FIXED' ? '\u20B9' + voucher.couponValue : voucher.couponValue + '%'\n }}\n off on your payment\n </div>\n </div>\n <div class=\"coupon-brief__right-sec\">\n <div class=\"apply-offer-btn fs-12 fw-600 cursor-pointer\" (click)=\"applyRedemptionCoupon(voucher)\">\n Apply</div>\n </div>\n </div>\n\n <div class=\"coupon-code-box d-flex align-items-center gap-3\">\n <div class=\"code-label\">Code</div>\n <div class=\"code-value\">{{ voucher.voucherCode }}</div>\n </div>\n\n <div class=\"coupon-meta d-flex align-items-center gap-2 fs-12 text-secondary mb-2\">\n <span class=\"min-order\">Min: \u20B9{{ voucher.minOrderValue | number }}</span>\n <span class=\"separator text-secondary\">|</span>\n <span class=\"validity\">\n <mat-icon class=\"clock-icon\">schedule</mat-icon>\n Until {{ voucher.issuedDate | date: 'MMM dd, yyyy' }}\n </span>\n <span class=\"separator text-secondary\" *ngIf=\"voucher.maxRedeemableAmount\">|</span>\n <span class=\"min-order\" *ngIf=\"voucher.maxRedeemableAmount\">Max Redeemable Amount: \u20B9{{\n voucher.maxRedeemableAmount | number }}</span>\n </div>\n\n <!-- <div class=\"terms-link\">View terms & conditions</div> -->\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"redemptionCouponType === 'DISCOUNTS'\">\n <ng-container *ngIf=\"(couponList.length > 0); else showEmptyDiscounts\">\n <ng-container *ngFor=\"let couponDetails of couponList; let idx = index\">\n <div class=\"voucher-details\" *ngIf=\"couponDetails?.status\">\n\n <div class=\"coupon-brief d-flex justify-content-between align-items-start mb-3\">\n <div class=\"coupon-brief__left-sec\">\n <div class=\"coupon-name fs-16 fw-600 mb-1\"\n [ngStyle]=\"{'color': !couponDetails.applicable ? '#DB1A1A' : '#097D5F'}\">\n {{ couponDetails.couponCode | uppercase }}\n </div>\n <div class=\"coupon-desc fs-12 text-secondary\">\n {{ couponDetails.discountDescription | titlecase }}\n </div>\n </div>\n <div class=\"coupon-brief__right-sec\">\n <div class=\"apply-offer-btn fs-12 fw-600 cursor-pointer\"\n [style.opacity]=\"couponDetails.applicable ? '1' : '0.3'\"\n [ngStyle]=\"{'cursor': couponDetails.applicable ? 'pointer' : 'not-allowed'}\"\n (click)=\"applyCoupon(couponDetails)\">\n Apply\n </div>\n </div>\n </div>\n\n <div class=\"coupon-code-box d-flex align-items-center gap-3\">\n <div class=\"code-label\">Code</div>\n <div class=\"code-value\">{{ couponDetails.couponCode | uppercase }}</div>\n </div>\n\n <div class=\"coupon-meta d-flex align-items-center gap-2 fs-12 text-secondary mb-2\">\n <span class=\"validity\">\n <mat-icon class=\"clock-icon\">schedule</mat-icon>\n {{ couponDetails.validFrom | date }} - {{ couponDetails.validTo | date }}\n </span>\n </div>\n\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template #showEmptyDiscounts>\n <div class=\"empty-screen-container\">\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\n <div class=\"empty-screen__primary-text\">No Discount Coupons Available</div>\n <div class=\"empty-screen__secondary-text\">\n Looks like there are no discount coupons at the moment\n </div>\n <!-- <div class=\"empty-screen__button\">Explore</div> -->\n </div>\n </ng-template>\n\n <ng-template #showEmptyScreen>\n <div class=\"empty-screen-container\">\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\n <div class=\"empty-screen__primary-text\">No Coupons Available</div>\n <div class=\"empty-screen__secondary-text\">Looks like there are no coupons</div>\n </div>\n </ng-template>\n </div>\n\n <div class=\"coupon-listing d-flex flex-column gap-3\" *ngIf=\"redemptionType === 'VOUCHERS'\">\n <ng-container *ngIf=\"listRedemptionVouchers?.vouchers?.length > 0; else showEmptyScreen\">\n <ng-container *ngFor=\"let voucher of listRedemptionVouchers?.vouchers; let idx = index\">\n <div class=\"voucher-details\" *ngIf=\"!voucher.utilised\">\n\n <div class=\"coupon-brief d-flex justify-content-between align-items-start mb-3\">\n <div class=\"coupon-brief__left-sec\">\n <div class=\"coupon-name fs-16 fw-600 mb-1\">{{ voucher.voucherName }}</div>\n <div class=\"coupon-desc fs-12 text-secondary\">\n Get {{ voucher.couponValueType === 'FIXED' ? '\u20B9' + voucher.couponValue : voucher.couponValue + '%' }}\n off on your payment\n </div>\n </div>\n <div class=\"coupon-brief__right-sec\">\n <div class=\"apply-offer-btn fs-12 fw-600 cursor-pointer\" (click)=\"applyRedemptionCoupon(voucher)\">Apply\n </div>\n </div>\n </div>\n\n <div class=\"coupon-code-box d-flex align-items-center gap-3\">\n <div class=\"code-label\">Code</div>\n <div class=\"code-value\">{{ voucher.voucherCode }}</div>\n </div>\n\n <div class=\"coupon-meta d-flex align-items-center gap-2 fs-12 text-secondary mb-2\">\n <span class=\"min-order\">Min: \u20B9{{ voucher.minOrderValue | number }}</span>\n <span class=\"separator text-secondary\">|</span>\n <span class=\"validity\">\n <mat-icon class=\"clock-icon\">schedule</mat-icon>\n Until {{ voucher.issuedDate | date: 'MMM dd, yyyy' }}\n </span>\n </div>\n\n <!-- <div class=\"terms-link\">View terms & conditions</div> -->\n </div>\n </ng-container>\n </ng-container>\n\n <ng-template #showEmptyScreen>\n <div class=\"empty-screen-container\">\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\n <div class=\"empty-screen__primary-text\">No Vouchers Available</div>\n <div class=\"empty-screen__secondary-text\">Looks like there are no vouchers</div>\n </div>\n </ng-template>\n </div>\n </section>\n</ng-template>\n\n<ng-template #CARTPAGE>\n <div class=\"container\">\n <div class=\"main-content\">\n <div class=\"cart-items\">\n <div class=\"cart-header\">\n <h2>Your Cart</h2>\n </div>\n <ng-container\n *ngTemplateOutlet=\"CARTITEM;context:{data: cartType === 'SHOPPING' ? responseData?.orderedItems : trialCartItem}\"></ng-container>\n </div>\n </div>\n\n <div class=\"sidebar\">\n <div class=\"reedem-section d-flex flex-column align-items-center\" *ngIf=\"cartType != 'TRIAL' && getUrl()\">\n <div class=\"justify-content-between d-flex align-items-center w-100 redeem-section-text\">Redeem Section Amount\n <div class=\"toogle-switch\">\n <div class=\"form-check form-switch\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" role=\"switch\" id=\"flexSwitchCheckChecked\"\n [checked]=\"selectMatureScheme\" (change)=\"onToggleChange()\">\n </div>\n </div>\n </div>\n <!-- <div class=\"select_matured_text w-100 text-start cursor-pointer\"\n *ngIf=\"selectMatureScheme && !selectedRedemption\" (click)=\"selectScheme()\">\n Select Matured Scheme\n </div> -->\n <!-- <div class=\"select_matured_text d-flex flex-column gap-2 w-100 text-start cursor-pointer\"\n *ngIf=\"selectedRedemption\">\n Selected Scheme\n <div class=\"d-flex w-100 justify-content-between align-items-center group_invest\">Group Investment\n scheme-5000/M <span>Change</span></div>\n <div class=\"d-flex justify-content-between align-items-center w-100 redeem_amount\">Redeemable Amount\n <span>\u20B9{{selectedRedmpationData.selectedAmount}}</span>\n </div>\n </div> -->\n </div>\n <div class=\"scheme-section\" *ngIf=\"selectMatureScheme\">\n <ng-container *ngTemplateOutlet=\"SCHEME_REDEMPTION\"></ng-container>\n </div>\n <div class=\"coupon-section\" [id]=\"data?.id\" *ngIf=\"cartType === 'SHOPPING' && !referEarnExist\">\n <div class=\"coupon-left\">\n <div class=\"coupon-icon\"><mat-icon>percent</mat-icon></div>\n <span class=\"coupon-text\" *ngIf=\"!responseData.billdetails?.couponId\">Apply\n Coupon</span>\n <span class=\"coupon-text\" *ngIf=\"responseData.billdetails?.couponId\">Coupon\n Applied</span>\n </div>\n <svg *ngIf=\"!responseData.billdetails?.couponId\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" class=\"chevron-icon\" (click)=\"openDialog(CouponList)\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n <span *ngIf=\"responseData.billdetails?.couponId\"\n (click)=\"removeCoupon($event)\"><mat-icon>close</mat-icon></span>\n </div>\n\n <div class=\"promo-banner mb-3\" [id]=\"data?.id\" *ngIf=\"cartType === 'SHOPPING' && ecomConfigs?.videoCallEnabled\">\n <div class=\"promo-text\">\n <h3>See It Before You Buy It</h3>\n <p>Experience our designs in detail via video call</p>\n </div>\n <button class=\"see-live-btn\" (click)=\"scheduleVideoCall(responseData?.orderedItems)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"lucide lucide-video\">\n <path d=\"m22 8-6 4 6 4V8Z\" />\n <rect width=\"14\" height=\"12\" x=\"2\" y=\"6\" rx=\"2\" ry=\"2\" />\n </svg>\n SEE IT LIVE\n </button>\n </div>\n\n <div class=\"plan-details-container p-3 rounded-4 bg-white text-dark voucher-details\"\n *ngIf=\"referEarnExist && this?.redemptionPoints?.availablePoints > 0\">\n <div class=\"fs-14 fw-500\">\n Rewards Available\n </div>\n <div class=\"d-flex justify-content-between align-items-start border-bottom pb-2\">\n <div class=\"avb_pts mt-2 mb-2\">\n <span class=\"fs-16 fw-500 total_points text-secondary\">\n <span class=\" fs-18 fw-600 text-dark\">{{(this?.redemptionPoints?.availablePoints || 0).toFixed(2)}}</span>\n pts\n </span>\n <div class=\"total_value fs-12 text-secondary\">\n = max \u20B9{{(this?.redemptionPoints?.pointsConvertedRupees || 0).toFixed(2)}} discount\n </div>\n </div>\n <div class=\"wallte_icon\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/777779c1775200561187wallet_(1).png\" alt=\"\">\n </div>\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\n <div class=\"redemable_text\">\n <div class=\"title_text\">\n <div class=\"fs-14 fw-500\">\n Redeem Points\n </div>\n <div class=\"fs-13 fs-400\">\n Use your points for discount\n </div>\n </div>\n </div>\n <div class=\"toggle_btn\">\n <label class=\"switch\">\n <input type=\"checkbox\" id=\"toggleSwitch\" [checked]=\"isPointsRedeeming\"\n (click)=\"onPointsRedeemingChange($event)\" />\n <span class=\"slider\"></span>\n </label>\n </div>\n </div>\n <div class=\"mt-3 success_selected w-100 applied-coupon-card\" *ngIf=\"isPointsRedeeming\">\n <div class=\"d-flex align-items-start gap-2\">\n <div class=\"success_icon\">\n <mat-icon class=\"d-flex justify-content-center align-items-center text-success\">check_circle</mat-icon>\n </div>\n <div class=\"success_text\">\n <div class=\"fs-13 fw-500\">\n You're saving \u20B9\n {{totalSavingAmt || 0}}\n </div>\n <div class=\"fs-12 fs-400 text-success\">\n {{totalSavingPoints}} points remaining after redemption\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Existing coupon row (keep as-is) -->\n <div class=\"coupon-section d-flex flex-column voucher-details\" [id]=\"data?.id\"\n *ngIf=\"cartType === 'SHOPPING' && referEarnExist\">\n <div class=\"d-flex justify-content-between align-items-center w-100\">\n <div class=\"coupon-left\">\n Apply Coupon\n </div>\n <div (click)=\"addRedemptionCoupon(RedemptionVouchers)\">View All</div>\n </div>\n\n <!-- Applied Coupon Success Banner -->\n <div class=\"applied-coupon-card w-100 mt-3 d-flex align-items-center justify-content-between\"\n *ngIf=\"selectedVoucherId\">\n <div class=\"applied-coupon-left d-flex align-items-center gap-3\">\n <mat-icon class=\"success-check\">check_circle</mat-icon>\n <div class=\"applied-coupon-info\">\n <div class=\"applied-coupon-code\">Coupon {{ selectedVoucherCode }} applied!</div>\n <div class=\"applied-coupon-saving\">You're saving\n <span *ngIf=\"this.couponValueType === 'AMOUNT'\">\u20B9 {{selectedVoucherAmount || 0}}</span>\n <span *ngIf=\"this.couponValueType === 'PERCENTAGE'\"> {{selectedVoucherPercentage || 0}}%</span>\n </div>\n\n </div>\n </div>\n <div class=\"remove-coupon-btn fs-14 fw-500 text-secondary cursor-pointer\"\n (click)=\"removeRedemptionCoupon($event)\">Remove</div>\n </div>\n </div>\n\n <div class=\"delivery-section\" *ngIf=\"getUrl()\">\n <div class=\"delivery-header\">\n <mat-icon>gps_fixed</mat-icon>\n <span *ngIf=\"cartType === 'SHOPPING'\">Delivering to</span>\n <span *ngIf=\"cartType === 'TRIAL'\">Trial Location at</span>\n <span class=\"pincode\">{{pincode}}</span>\n <!-- <a class=\"change-link\">Change Pincode</a> -->\n </div>\n </div>\n\n <div class=\"summary-section\">\n <div class=\"summary-title\">Summary</div>\n\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING'\">\n <span class=\"summary-label\">Subtotal</span>\n <span class=\"summary-value\">\u20B9{{(responseData?.billdetails?.totalNetValue ?? 0) | number: '1.0-2'}}</span>\n </div>\n\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING' && referEarnExist && isPointsRedeeming\">\n <span class=\"summary-label\">Points Redeemed</span>\n <span class=\"summary-value\">- \u20B9{{ totalSavingAmt || 0 }}</span>\n </div>\n\n <div class=\"summary-row\"\n *ngIf=\"cartType === 'SHOPPING' && referEarnExist && (this.couponValueType === 'AMOUNT' && appliedVoucher)\">\n <span class=\"summary-label\">Voucher Applied</span>\n <span class=\"summary-value\">- \u20B9{{ selectedVoucherAmount || 0 }}</span>\n </div>\n\n <div class=\"summary-row\"\n *ngIf=\"cartType === 'SHOPPING' && referEarnExist && (this.couponValueType === 'PERCENTAGE' && appliedVoucher)\">\n <span class=\"summary-label\">Voucher Applied</span>\n <span class=\"summary-value\">- \u20B9{{ percentageReduced || 0 }}</span>\n </div>\n\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING' && responseData?.billdetails?.discountAmount\">\n <span class=\"summary-label\">Discount Amount</span>\n <span class=\"summary-value\">\n {{('\u20B9' + (responseData?.billdetails?.discountAmount | number: '1.0-2')) }}\n </span>\n </div>\n\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING'\">\n <span class=\"summary-label\">Shipping</span>\n <span class=\"summary-value\"\n [ngClass]=\"{'savings': !responseData?.billdetails?.deliveryCharges || responseData.billdetails.deliveryCharges <= 0}\">\n {{ (responseData?.billdetails?.deliveryCharges && responseData.billdetails.deliveryCharges > 0) ? ('\u20B9' +\n (responseData.billdetails.deliveryCharges | number: '1.0-2')) : 'Free' }}\n </span>\n </div>\n\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING'\">\n <span class=\"summary-label\">Estimated Tax</span>\n <span class=\"summary-value\">\u20B9{{((!responseData.billdetails?.couponId ?\n responseData?.billdetails?.totalTax : responseData?.billdetails?.totalTaxAfterDiscount) ?? 0) |\n number: '1.0-2'}}</span>\n </div>\n\n <div class=\"summary-row total-row\" *ngIf=\"cartType === 'SHOPPING'\">\n <span class=\"summary-label\">Total</span>\n <!-- <span class=\"summary-value\">\u20B9{{ responseData?.totalAmount | number: '1.0-2' }}</span> -->\n <span class=\"total-value\" *ngIf=\"!isPointsRedeeming && !appliedVoucher\">\u20B9{{ responseData?.totalAmount |\n number: '1.0-2' }}</span>\n\n <span class=\"total-value\" *ngIf=\"isPointsRedeeming\">\u20B9{{ (responseData?.totalAmount - (totalSavingAmt || 0)) |\n number: '1.0-2' }}</span>\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'AMOUNT'\">\u20B9{{(responseData?.totalAmount -\n (selectedVoucherAmount || 0)) | number:\n '1.0-2'}}</span>\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'PERCENTAGE'\">\u20B9{{(responseData?.totalAmount -\n (percentageReduced || 0)) | number:\n '1.0-2' }}</span>\n </div>\n\n <!-- Trial Cart Summary -->\n <ng-container *ngIf=\"cartType === 'TRIAL'\">\n <div class=\"summary-row\">\n <span class=\"summary-label\">Free Trial</span>\n <span class=\"summary-value\">\u20B90</span>\n </div>\n <div class=\"summary-row\">\n <span class=\"summary-label\">Service Charge</span>\n <span class=\"summary-value savings\">Free</span>\n </div>\n <div class=\"summary-divider\"></div>\n <div class=\"summary-row total-row\">\n <span class=\"summary-label\">Total</span>\n <span class=\"summary-value\">\u20B90</span>\n </div>\n <!-- <span class=\"total-value\" *ngIf=\"!isPointsRedeeming && !appliedVoucher\">\u20B9{{ responseData?.totalAmount |\n number: '1.0-2' }}</span>\n\n <span class=\"total-value\" *ngIf=\"isPointsRedeeming\">\u20B9{{ (responseData?.totalAmount - (totalSavingAmt || 0)) |\n number: '1.0-2' }}</span>\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'AMOUNT'\">\u20B9{{(responseData?.totalAmount -\n (selectedVoucherAmount || 0)) | number:\n '1.0-2'}}</span>\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'PERCENTAGE'\">\u20B9{{(responseData?.totalAmount -\n (percentageReduced || 0)) | number:\n '1.0-2' }}</span> -->\n </ng-container>\n </div>\n <button class=\"place-order-btn\" (click)=\"edit ? '' : proceedToListPage()\" simpoButtonDirective\n [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\n *ngIf=\"cartType === 'SHOPPING'\" [appButtonEditor]=\"edit ?? false\"\n [backgroundInfo]=\"styles?.background\">{{data?.action?.buttons?.[1]?.content?.label ?? 'Continue\n Shopping'}}</button>\n <button class=\"place-order-btn mt-0\" (click)=\"edit ? '' : proceedToCheckout()\" simpoButtonDirective\n *ngIf=\"cartType === 'SHOPPING'\" [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\"\n [color]=\"data?.styles?.background?.accentColor\" [appButtonEditor]=\"edit ?? false\"\n [backgroundInfo]=\"styles?.background\">{{data?.action?.buttons?.[0]?.content?.label ?? 'Checkout\n Cart'}}</button>\n <button class=\"place-order-btn mt-0\" simpoButtonDirective *ngIf=\"cartType === 'TRIAL'\"\n [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\n [appButtonEditor]=\"edit ?? false\" [backgroundInfo]=\"styles?.background\" (click)=\"bookAppointment()\">BOOK\n APPOINTMENT</button>\n\n </div>\n </div>\n <!-- <ng-container *ngIf=\"recommededData?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\"\n [responseData]=\"recommededData\"></simpo-featured-products>\n </ng-container> -->\n</ng-template>\n<ng-template #CHECKOUTPAGE>\n <div class=\"checkout-left-panel\">\n <div class=\"checkout-main-content\">\n <!-- <div class=\"delivery-options\">\n <div class=\"delivery-option active\">\n <div class=\"delivery-icon\"></div>\n HOME DELIVERY\n </div>\n <div class=\"delivery-option\">\n <div class=\"delivery-icon\"></div>\n STORE PICK-UP\n </div>\n </div> -->\n\n <div class=\"section-title\">Shipping Address</div>\n\n <div class=\"shipping-info\" *ngIf=\"defaultAddress\">\n <div class=\"address-info\">\n <div class=\"address-name\">{{defaultAddress?.receiverName}} ({{defaultAddress?.addressType}})</div>\n <div class=\"address-details\">{{defaultAddress?.addressLine1}}, {{defaultAddress?.cityName}},\n {{defaultAddress?.stateName}}</div>\n <div class=\"mobile-number\">Mobile: {{defaultAddress?.receiverPhone}}</div>\n </div>\n </div>\n\n <div class=\"addLinks h-100\" *ngIf=\"!defaultAddress\" (click)=\"addAddress()\">\n <mat-icon>add</mat-icon>\n </div>\n\n <button class=\"change-address-btn\" (click)=\"changeAddress()\" *ngIf=\"defaultAddress\">CHANGE OR ADD ADDRESS</button>\n\n <button class=\"btn w-100 mt-1 payment-btn\" (click)=\"proceedToPayment()\" simpoButtonDirective\n *ngIf=\"defaultAddress && !placeOrderLoader\" [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\"\n [color]=\"data?.styles?.background?.accentColor\" [appButtonEditor]=\"edit ?? false\"\n [backgroundInfo]=\"styles?.background\">\n Place Order\n </button>\n <button class=\"btn w-100 mt-1 payment-btn\" simpoButtonDirective *ngIf=\"defaultAddress && placeOrderLoader\"\n [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\n [appButtonEditor]=\"edit ?? false\" [backgroundInfo]=\"styles?.background\">\n Loading...\n </button>\n\n </div>\n </div>\n\n <div class=\"checkout-right-panel\">\n <div class=\"order-summary\">\n <div class=\"summary-title\">Order Summary</div>\n\n <div class=\"checkout-product\">\n <div class=\"product-item\" *ngFor=\"let item of responseData?.orderedItems; let idx = index\">\n <img [src]=\"item.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" class=\"product-image\"\n alt=\"\">\n <div class=\"product-details\">\n <div class=\"product-name\">{{item.itemName}}</div>\n <div class=\"product-quantity\">Quantity: {{item.quantity}}</div>\n <div class=\"product-price\">\u20B9{{(item.sellingPrice * item.quantity) | number: '1.0-2'}}</div>\n </div>\n </div>\n\n </div>\n\n <div class=\"price-breakdown\">\n <div class=\"price-row\">\n <span>Total Price</span>\n <span>\u20B9{{(responseData?.billdetails?.totalNetValue\n ?? 0) | number: '1.0-2'}}</span>\n </div>\n <div class=\"price-row\">\n <span>Total Tax</span>\n <span>\u20B9{{((!responseData.billdetails?.couponId ?\n responseData?.billdetails?.totalTax : responseData?.billdetails?.totalTaxAfterDiscount) ?? 0) |\n number:\n '1.0-2'}}</span>\n </div>\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING' && cartInfo?.billdetails?.orraSchemeRedeemedAmount\">\n <span class=\"summary-label\">Redeem Amount</span>\n <span class=\"summary-value\">\u20B9{{(cartInfo?.billdetails?.orraSchemeRedeemedAmount ?? 0) | number:\n '1.0-2'}}</span>\n </div>\n\n <div class=\"price-row discount\" *ngIf=\"responseData?.billdetails?.discountAmount && !isJewellery\">\n <span>Coupon Discount</span>\n <span>- \u20B9{{responseData?.billdetails?.discountAmount\n | number: '1.0-2'}}</span>\n </div>\n <div class=\"price-row\"\n *ngIf=\"responseData?.billdetails?.deliveryCharges && responseData.billdetails.deliveryCharges > 0\">\n <span>Delivery Charge</span>\n <span>{{responseData.billdetails.deliveryCharges\n |\n number: '1.0-2'}}</span>\n </div>\n <div class=\"price-row total\" *ngIf=\"cartType === 'SHOPPING'\">\n <span>TOTAL AMOUNT</span>\n <span *ngIf=\"!isPointsRedeeming && !appliedVoucher\">\u20B9{{(responseData?.totalAmount ?? 0) | number:\n '1.0-2'}}</span>\n <span *ngIf=\"isPointsRedeeming\">\u20B9{{(responseData?.totalAmount - (totalSavingAmt || 0)) | number:\n '1.0-2'}}</span>\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'AMOUNT'\">\u20B9{{(responseData?.totalAmount -\n (selectedVoucherAmount || 0)) | number:\n '1.0-2'}}</span>\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'PERCENTAGE'\">\u20B9{{(responseData?.totalAmount -\n (responseData?.totalAmount * (selectedVoucherPercentage / 100) || 0)) | number:\n '1.0-2' }}</span>\n </div>\n </div>\n </div>\n\n </div>\n</ng-template>\n\n<ng-template #CARTITEM let-products=\"data\">\n <div class=\"cart-item\" *ngFor=\"let item of products\" [style.color]=\"fontColor\">\n <div class=\"item-left\">\n <div class=\"item-image\">\n <img class=\"item-img\" [src]=\"item.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" alt=\"\"\n (click)=\"goToProductDetails(item)\" style=\"cursor: pointer;\">\n </div>\n <div class=\"item-details\">\n <h3 class=\"item-title\">{{item.itemName}}</h3>\n <div class=\"item-subtitle\" *ngIf=\"item.itemVariant\">\n <span *ngFor=\"let varient of getKeys(item.itemVariant.properties); let last = last\">\n {{ item.itemVariant.properties[varient] | titlecase }}<span *ngIf=\"!last\">, </span>\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"item-right\">\n <div class=\"quantity-control\" *ngIf=\"cartType === 'SHOPPING'\">\n <button class=\"qty-btn px-2\" (click)=\"decreaseQty(item)\" [disabled]=\"item.quantity === 1\">\n <mat-icon>remove</mat-icon>\n </button>\n <span class=\"qty-value px-3\">{{item.quantity}}</span>\n <button class=\"qty-btn px-2\" (click)=\"increaseQty(item)\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n\n <div class=\"item-price\">\n \u20B9{{item.sellingPrice | number: '1.0-2'}}\n </div>\n\n <div class=\"delete-btn-circle\" (click)=\"removeItem(item)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-trash-2\">\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </svg>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #EMPTYITEM>\n <section class=\"empty-cart w-100 d-flex align-items-center justify-content-center\">\n <div class=\"empty-cart-container d-flex flex-column\">\n <div class=\"cart-image\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n [src]=\"data?.content?.image?.url\" [alt]=\"data?.content?.image?.altText\" [appImageEditor]=\"edit || false\"\n [imageData]=\"data?.content?.image\" [sectionId]=\"data?.id\">\n </div>\n <div class=\"cart-text content-side\">\n <ng-container *ngFor=\"let text of data?.content?.inputText\">\n <div class=\"d-flex justify-content-center\"\n [ngClass]=\"{'heading-medium': text.label == 'Heading', 'description': text.label == 'Text'}\">\n <simpo-text-editor [(value)]=\"text.value\" [editable]=\"edit || false\" [isRTE]=\"text.isRTE\"></simpo-text-editor>\n </div>\n </ng-container>\n </div>\n <button class=\"place-order-btn mx-auto w-fit\" (click)=\"edit ? '' : proceedToListPage()\" simpoButtonDirective\n [buttonStyle]=\"data?.action?.buttons?.[1]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\n [appButtonEditor]=\"edit ?? false\"\n [backgroundInfo]=\"styles?.background\">{{data?.action?.buttons?.[1]?.content?.label ?? 'Continue\n Shopping'}}</button>\n </div>\n </section>\n</ng-template>\n\n<ng-template #SCHEME_REDEMPTION>\n <div class=\"modal-body\">\n <div class=\"scheme-option\" *ngFor=\"let scheme of schemeList\" (click)=\"redeemScheme(scheme, false)\"\n [style.borderColor]=\"cartInfo.billdetails.orraSchemeCode ? styles?.background?.color : ''\">\n <label for=\"individual\" class=\"scheme-card\">\n <div class=\"scheme-info d-flex gap-1\">\n <div class=\"form-check-radio\">\n <input class=\"form-check-input-radio\" type=\"radio\" name=\"flexRadioDefault\" id=\"flexRadioDefault2\">\n </div>\n <div class=\"right-side\">\n <div class=\"scheme-name\">\n <div class=\"scheme-title\">Individual Investment Scheme</div>\n <div class=\"scheme-monthly\">\u20B98000/M</div>\n </div>\n <div class=\"scheme-details\">\n <span class=\"scheme-id\">GPP Id: {{scheme.GPPId}}</span>\n <!-- <span class=\"scheme-maturity\">Maturity Date: 12 April 2024</span> -->\n </div>\n <div class=\"scheme-amount\">\u20B9{{scheme.amount}}</div>\n </div>\n </div>\n </label>\n </div>\n <div class=\"reedem_error d-flex justify-content-center align-items-center\" *ngIf=\"showReedemError\">\n Please add more \u20B9{{vaildAmount}} to reedem this scheme\n </div>\n </div>\n</ng-template>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}.reedem-section{padding:10px 15px;border-radius:15px;background:#f6f3f9;box-shadow:#b2b2ca80 2px 2px 6px;font-weight:700;font-size:13px}.redeem-section-text{font-size:.9rem;font-weight:700}.form-check-input:checked{background-color:#28a745!important;border-color:#28a745!important}.form-check-input:focus{border-color:#28a745!important;outline:0;box-shadow:none!important}.close-btn{background:none;border:none;font-size:24px;color:#6b7280;cursor:pointer;padding:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center}.close-btn:hover{color:#374151}.select_matured_text{font-size:.8rem!important;margin-top:10px;color:#05aacf}.position-relative{position:relative}.cart-parent{display:flex;margin-top:15px}.left-panel{width:65%;padding-right:5rem;border-right:1px solid #E9E9E9}.timeline{cursor:pointer}.cart-items{background:#fff;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.cart-header{padding:16px 24px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.cart-header h2{margin:0;font-size:18px;font-weight:500;color:#0f172a}.cart-item{display:flex!important;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;gap:20px;padding:0 8px;transition:background .2s}.cart-item:hover{background:#fbfcfe}.item-left{display:flex;align-items:center;flex:1}.item-right{display:flex;align-items:center;padding:15px;gap:32px}.item-image img{width:64px;height:64px;border-radius:12px;object-fit:cover;border:1px solid #f1f5f9}.item-details{display:flex;flex-direction:column;gap:4px}.item-title{margin:0;font-size:15px;font-weight:600;color:#0f172a;line-height:1.4}.item-subtitle{font-size:13px;color:#64748b;font-weight:400}.quantity-control{display:flex;align-items:center;border:1.5px solid #e2e8f0;border-radius:7px;overflow:hidden;height:38px;background:#fff;width:fit-content}.qty-btn{width:38px;height:100%;border:none;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#475569;transition:all .2s ease}.qty-btn:hover{background:#f8fafc;color:#0f172a}.qty-btn mat-icon{font-size:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center}.qty-value{width:32px;height:100%;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:500;color:#0f172a;border-left:1.5px solid #e2e8f0;border-right:1.5px solid #e2e8f0}.item-price{font-size:18px;font-weight:700;color:#0f172a;min-width:60px;text-align:right;letter-spacing:-.01em}.delete-btn-circle{width:36px;height:36px;border-radius:50%;border:1px solid #fee2e2;background:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#ef4444;transition:all .2s ease}.delete-btn-circle:hover{background:#fef2f2;border-color:#fecaca;transform:scale(1.05);color:#dc2626}.delete-btn-circle svg{width:18px;height:18px}.isActive{color:#0267c1;font-weight:600}.bar{width:150px;border-top:2px solid lightgray;margin:0 5px}.right-panel{width:35%;padding-left:5rem}.my-bag{font-size:16px;font-weight:600;color:#000;margin-left:8px}.my-bag span{color:#939393}.coupons{display:flex;justify-content:space-between;padding:10px;border-radius:4px;box-shadow:0 0 1px #28293d14,0 0 2px #60617029;margin-bottom:15px;margin-top:10px;cursor:pointer}.coupon-list-section{padding:15px;width:400px;z-index:10000001!important}.coupon-list-section .search{padding:8px;border:1px solid lightgray;border-radius:20px;display:flex;justify-content:space-between}.coupon-list-section input{border:none;outline:none;width:90%}.coupon-list-section .coupon-list{height:60vh;width:100%}.item-parent{margin:10px 0;min-height:120px}.lh-23{line-height:23px;margin-left:10px}.item-name{color:#141514;font-size:16px;line-height:30px;font-weight:600}.price-with-tax{font-weight:400;font-size:16px;color:#626262}.item-sku{font-weight:400;font-size:14px;color:#626262}.item-price{display:flex;font-weight:600;font-size:16px;color:#141514}.product-img{border-radius:5px;height:100%;width:110px;padding:0;cursor:pointer}.quantity-box{display:flex;gap:5px;align-items:center;border:1px solid #E8E8E8;width:45px;height:22px}.quantity-box input{outline:none;text-align:center;border:none;width:30px;height:100%}.quantity-box .plus{font-size:20px;position:relative;top:-3px;font-weight:500}.quantity-box .minus{font-size:30px;position:relative;top:-3px;font-weight:500}.delete-item{color:#df2e2e;cursor:pointer;font-size:18px}.item-quantity{margin-top:5px;display:flex;min-width:90px;max-width:fit-content;border:1px solid lightgray;justify-content:space-between;align-items:center;padding:5px 10px;border-radius:3px}.coupon{display:flex;justify-content:space-between;border:1px solid #E8E8E8;border-radius:5px;padding:10px;margin-top:10px}.apply-coupon{font-weight:500;color:#626262;font-size:15px}.coupon-desc{color:#939393;font-size:12px;font-weight:500}.apply-coupon-btn{color:#0267c1;font-size:16px;font-weight:600}.price-details{padding:10px;margin-top:10px;border-radius:5px;box-shadow:0 0 1px #28293d14,0 0 2px #60617029;margin-bottom:15px}.price-parent-block{display:flex;justify-content:space-between;margin-top:5px}.price-type{font-weight:400;font-size:16px;color:#434443}.price-value{font-weight:500;font-size:18px;color:#141514}.button-parent{margin-top:20px;display:flex;flex-direction:column;gap:10px}hr{border:1px solid #E8E8E8}.btn{height:40px;font-size:16px!important}.delete-item{text-align:right;position:absolute;right:16px;bottom:10px}.quantity{display:flex;border:2px solid #E6E6E6;align-items:center;gap:15px;height:47px;margin-top:1rem;border-radius:5px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.label{color:#000}.total-container{min-height:80vh;position:relative;display:block!important;height:calc(100vh - 170px)}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%}.cart-image{width:13%;display:flex;margin-right:auto;margin-left:auto}.cart-image img{width:100%}.heading-medium{font-weight:600;color:#000}.description{font-size:18px;color:#7f7676;width:100%;text-align:center}.cart-window{padding:10px}.cart-window .small-product-img{width:55px;height:55px;border-radius:5px}.cart-window .small-items{display:flex;flex-direction:column;gap:10px;margin-top:15px;height:calc(100vh - 160px);overflow-y:auto}.cart-window .small-item{width:100%;display:flex;justify-content:space-between}.cart-window .small-item-name{width:200px}.cart-window .small-item-quantity{display:flex;align-items:center;justify-content:space-between;border-radius:5px;width:80px;background-color:#fafad2;padding:3px 8px;height:35px;font-weight:500;margin-right:3px}.cart-window .small-item-price{display:flex;flex-direction:column;gap:5px}.cart-window .small-item-price .price-with-tax{display:flex;font-size:13px!important}.cart-window .fotter-sec{background-color:#fff;position:absolute;bottom:0;left:0;width:100%;padding:10px}.cart-window .fotter-sec .payment-btn{border-radius:5px;border:none;display:flex;align-items:center;justify-content:center;background-color:#f08080;padding:10px 5px;color:#fff;cursor:pointer}.offers{background-color:#fff;display:flex;justify-content:space-between;padding:8px;border-radius:8px;box-shadow:#959da533 0 -1px 6px}.header-sec{font-size:26px}@media screen and (max-width: 475px){.cart-parent{flex-direction:column}.see-live-btn{white-space:nowrap!important}.left-panel{width:100%;padding-right:0rem}.right-panel{width:100%;z-index:1000;padding-left:0rem}.cart-image{width:42%}.description{width:84%}.heading-medium{font-size:28px}.item-price{white-space:nowrap;display:none}.product-img{width:82px}[class*=col-md]{padding-left:5px!important;padding-right:5px!important}.mobile-fixed{height:40px;font-size:16px!important;border:1px solid lightgray;width:100%;position:relative;bottom:10px}.empty-cart-container{height:calc(100vh - 130px)}.coupons-listing-section{width:100vw!important}.checkoutPage{flex-direction:column}.checkout-left-panel,.checkout-right-panel{width:100%!important}}.mobile-fixed{color:#fff}.coupons-listing-section{height:100vh;padding-top:0;position:relative;width:390px;z-index:100;background:#d3d3d354}.coupons-listing-section .coupon-heading{display:flex;align-items:center;background-color:#fff;padding:15px 20px;width:100%;box-sizing:border-box}.coupons-listing-section .coupon-heading img{height:15px;width:15px;position:relative;top:2px;cursor:pointer}.coupons-listing-section .coupon-heading .header-text{font-size:16px;color:#000;font-weight:600;margin-left:15px;position:relative;top:-3px;right:15px;cursor:pointer}.coupons-listing-section .coupon-search-sec{width:90%;box-sizing:border-box;margin:10px auto;border:1px solid lightgray;padding:10px;border-radius:10px;background-color:#fff;display:flex;font-size:16px;color:#000;font-weight:600}.coupons-listing-section .coupon-search-sec input{border:none;outline:none;background-color:transparent;width:95%;font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-search-sec input:focus{font-size:14px;color:#000;font-weight:600}.coupons-listing-section .coupon-search-sec .back-btn{position:relative;top:3px;cursor:pointer}.coupons-listing-section .coupon-search-sec .apply-btn-search{font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing{height:72%;overflow-y:auto;width:90%;margin:20px auto}.coupons-listing-section .coupon-listing .coupon-details{padding:15px;margin-bottom:15px;background-color:#edfffa;border-radius:10px;border:1px solid lightgray}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading{display:flex;flex-direction:column;gap:25px}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief{display:flex;justify-content:space-between;width:100%}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-name{font-size:16px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-desc{padding:5px 0;font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .show-details-btn{cursor:pointer}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-brief__right-sec{display:flex;justify-content:flex-end}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-brief__right-sec .apply-offer-btn{font-size:16px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-toggle-details-btn{text-align:left;text-decoration:underline;width:100%;font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details-divider{border-top:2px solid lightgray;opacity:.3;margin:15px 0}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-terms{font-size:14px;color:#000;font-weight:400}.empty-screen-container{height:100%;width:85%;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-screen-container .empty-screen__primary-text{font-size:22px;color:#000;font-weight:400}.empty-screen-container .empty-screen__secondary-text{text-align:center;padding:10px 0;font-size:16px;color:#000;font-weight:400}.empty-screen-container .empty-screen__button{width:90%;background-color:#fff;border-radius:8px;text-align:center;padding:10px;margin:10px auto 0;cursor:pointer;font-size:18px;color:#000;font-weight:400}.box-shadow{box-shadow:#00000029 0 1px 4px}.main-content{border-radius:12px;padding:0 30px 30px;width:100%;overflow:scroll;height:calc(100vh - 150px)}.delivery-options{display:flex;gap:20px;margin-bottom:30px}.delivery-option{padding:12px 24px;border:2px solid #e0e0e0;border-radius:25px;background:#fff;cursor:pointer;display:flex;align-items:center;gap:8px;font-weight:500;transition:all .2s}.delivery-option.active{background:#f0e6ff;border-color:#8b5cf6;color:#7c3aed}.delivery-option:hover{border-color:silver}.delivery-icon{width:16px;height:16px;background:#8b5cf6;border-radius:3px}.section-title{font-size:16px;font-weight:700;margin-bottom:20px;color:#000}.shipping-info{border-radius:10px;padding:20px;margin-bottom:20px;border:1px solid rgb(238,232,255);box-shadow:#0000000a 0 4px 8px}.delivery-date{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.delivery-date-text{color:#666;font-weight:500}.change-date-btn{color:#e91e63;background:none;border:none;font-weight:600;cursor:pointer;text-transform:uppercase;font-size:12px;letter-spacing:.5px}.address-info{margin-bottom:15px}.address-name{font-weight:700;margin-bottom:8px;color:#000}.address-details{color:#666;margin-bottom:8px}.mobile-number{font-weight:700;color:#000;font-size:15px}.change-address-btn{font-size:1rem!important;font-weight:700!important;padding:6px;background:#fff;border:1px solid rgb(229,221,255);border-radius:8px;color:#000;cursor:pointer;transition:all .2s;box-shadow:#0000000a 0 4px 8px}.change-address-btn:hover{border-color:#8b5cf6;color:#8b5cf6}.billing-section{margin-top:40px}.billing-options{display:flex;flex-direction:column;gap:15px;margin-top:20px}.billing-option{display:flex;align-items:center;gap:12px;padding:15px;border:2px solid #e0e0e0;border-radius:8px;cursor:pointer;transition:all .2s}.billing-option.active{background:#f0e6ff;border-color:#8b5cf6}.radio-btn{width:20px;height:20px;border:2px solid #e0e0e0;border-radius:50%;position:relative}.billing-option.active .radio-btn{border-color:#8b5cf6}.billing-option.active .radio-btn:after{content:\"\";width:10px;height:10px;background:#8b5cf6;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.order-summary{border-radius:12px;padding:25px;width:75%}.summary-title{font-size:16px;font-weight:700;margin-bottom:20px;color:#000}.product-item{display:flex;gap:15px;margin-bottom:20px;border-bottom:1px solid #f0f0f0;border-radius:7px;background:#fff;padding:15px}.product-item:last-of-type{border-bottom:none;margin-bottom:30px;padding-bottom:0}.product-image{max-width:110px;width:100%;height:100%;border-radius:8px}.product-details{flex:1}.product-name{font-weight:500;margin-bottom:4px;color:#2d3748;font-size:14px}.product-quantity{color:#666;font-size:12px;margin-bottom:8px}.product-price{font-weight:600;color:#2d3748}.delivery-info{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:11px;color:#8b5cf6}.delivery-icon-small{width:12px;height:12px;background:#8b5cf6;border-radius:2px}.price-breakdown{border-top:1px solid #f0f0f0;padding-top:20px}.price-row{display:flex;justify-content:space-between;margin-bottom:12px;color:#666}.price-row.total{font-weight:600;color:#2d3748;font-size:16px;margin-top:15px;padding-top:15px;border-top:1px solid #f0f0f0}.discount{color:#22c55e!important}@media (max-width: 768px){.container{grid-template-columns:1fr;padding:15px;gap:20px}.main-content,.order-summary{padding:20px;width:100%}.delivery-options{flex-direction:column;gap:10px}}.checkout-left-panel{width:65%;display:flex;justify-content:center}.checkout-right-panel{width:35%;display:flex;justify-content:center;background-color:#f9f9fa}.checkout-product{max-height:50vh;overflow:scroll}.mt-1{margin-top:1rem!important}.payment-btn{box-shadow:#0000000a 0 4px 8px}.addLinks{padding-bottom:8px;padding-top:9px;border:1px dashed;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:5px;height:25vh!important;margin-bottom:20px}.addLinks mat-icon{border:1px solid rgb(219,223,225);display:flex;border-radius:100%;align-items:center;justify-content:center;font-size:16px;color:#dbdfe1}.change-pincode{display:flex;gap:10px}.change-pincode mat-icon{font-size:18px;align-items:center;justify-content:center;display:flex}.change-pincode span{font-size:14px}.fs-13{font-size:13px}.fs-12{font-size:12px}.fs-18{font-size:18px}.b-1-b{border-width:0px 1px;border-style:solid;border-color:#000}.container{max-width:unset;padding:24px;display:flex;gap:24px;width:100%!important}.main-content{background:#fff;border-radius:12px;width:70%}.promo-banner{padding:16px 20px;display:flex;justify-content:space-between;align-items:center;border-radius:8px;border:1px solid #e2e8f0}.promo-text h3{font-size:16px!important;font-weight:500;margin-bottom:4px}.promo-text p{font-size:.9rem!important;margin-bottom:0!important;color:#64748b}.see-live-btn{background:#fff;border:1px solid #e2e8f0;font-weight:600;color:#000;padding:8px 16px;border-radius:8px;font-size:12px!important;cursor:pointer;display:flex;align-items:center;gap:8px;width:max-content!important;transition:all .2s ease;box-shadow:0 1px 2px #0000000d}.see-live-btn:hover{background:#f8fafc;border-color:#cbd5e1;transform:translateY(-1px)}.see-live-btn svg{color:#6366f1}.cart-item{display:flex;gap:16px;position:relative}.cart-item:last-child{border-bottom:none}.item-image{width:15%;height:100px;border-radius:8px;object-fit:cover;display:flex;align-items:center;justify-content:center}.item-details{flex:1}.item-title{font-weight:500;margin-bottom:8px}.item-price{display:flex;align-items:center;gap:8px}.current-price{font-size:1rem;font-weight:600}.original-price{font-size:1rem;text-decoration:line-through}.discount{background:#fef3c7;padding:2px 6px;border-radius:4px;font-size:12px;font-weight:500}.item-code{font-size:12px;color:#9ca3af;margin-bottom:8px}.item-options{display:flex;gap:16px;font-size:14px;color:#6b7280;margin-bottom:12px}.delivery-info{font-size:12px;color:#8b5cf6}.pickup-info{background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:5px 15px;margin-top:12px;display:flex;align-items:center;cursor:pointer;width:max-content;gap:20px}.pickup-text{font-size:.9rem;color:#374151}.remove-btn{position:absolute;top:16px;right:0;width:20px!important;height:20px;background:#000;color:#fff;border:none;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:10px!important}.sidebar{display:flex;flex-direction:column;gap:16px;width:32%}.coupon-section{border-radius:8px;padding:10px 15px;border:1px solid #e2e8f0;display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:all .2s ease}.coupon-section:hover{border-color:#cbd5e1;background-color:#f8fafc}.chevron-icon{color:#94a3b8;transition:transform .2s ease}.coupon-section:hover .chevron-icon{transform:translate(2px);color:#64748b}.scheme-section{border-radius:12px;padding:10px 15px;cursor:pointer}.coupon-left{display:flex;align-items:center;gap:12px}.coupon-icon{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center}.coupon-icon mat-icon{font-size:17px;width:17px!important;height:19px!important}.coupon-text{font-weight:700;font-size:.9rem}.delivery-section{background:#fff;border-radius:12px;padding:10px 15px;box-shadow:#b2b2ca80 2px 2px 6px;background:#f6f3f9}.delivery-header{display:flex;align-items:center;gap:12px;margin-bottom:4px}.delivery-header span{font-size:.9rem;font-weight:700}.delivery-header mat-icon{width:20px;height:20px;font-size:17px;position:relative;top:2px}.delivery-icon{width:20px;height:20px;background:#8b5cf6;border-radius:50%}.pincode{font-weight:600;color:#111827}.change-link{color:#ec4899;font-size:.9rem;text-decoration:none;margin-left:auto}.summary-section{background:#fff;border-radius:8px;padding:20px;border:1px solid #e2e8f0}.summary-title{font-size:16px;font-weight:700;color:#0f172a;margin-bottom:20px;letter-spacing:-.01em}.summary-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.summary-row:last-child{margin-bottom:0}.summary-label{font-size:14px;font-weight:400;color:#64748b}.summary-value{font-size:14px;font-weight:500;color:#0f172a}.summary-divider{height:1px;background:#f1f5f9;margin:16px 0;width:100%}.total-row .summary-label{font-size:16px;font-weight:600;color:#0f172a}.total-row .summary-value{font-size:16px;font-weight:700;color:#0f172a}.total-row{border-top:1px solid #e2e8f0;padding-top:15px;margin-top:15px}.total-label{font-weight:600;font-size:16px}.total-value{font-weight:700;font-size:18px}.place-order-btn{background:linear-gradient(135deg,#8b5cf6,#ec4899);color:#fff;border:none;border-radius:12px;padding:9px 10px;font-size:.9rem!important;font-weight:600;cursor:pointer;margin-top:10px;text-transform:uppercase}.place-order-btn:hover{opacity:.9}.chain-icon,.earring-icon{width:60px;height:60px;filter:sepia(1) hue-rotate(30deg) saturate(2)}.item-img{width:100%;height:100%;object-fit:cover}.mt-0{margin-top:0!important}select{outline:none;border-radius:5px;padding:2px;width:20%;border:none;box-shadow:#9999994d 2px 2px 6px;cursor:pointer}.cart-tab-parent{display:flex;justify-content:center}.cart-tabs{gap:10px;display:flex;justify-content:center;align-items:center;width:max-content;border-radius:8px;border:1px solid #e2e8f0}.cart-tabs div{padding:7px 10px;cursor:pointer;font-size:14px}.selected-cart-tab{margin:6px;background:#f1f5f9;border-radius:5px;color:#000!important;font-weight:500}.checkout-main-content{width:50%;padding:30px;border-radius:12px}@media screen and (max-width: 475px){.main-content{padding:0;height:auto!important}.cart-item{flex-direction:column!important;align-items:flex-start!important;padding:16px 12px!important;gap:16px!important}.item-left{width:100%!important;gap:16px!important;align-items:flex-start!important}.item-image{width:86px!important;height:86px!important;flex-shrink:0!important}.item-right{width:100%!important;justify-content:space-between!important;padding:0!important;gap:12px!important;margin-top:4px!important}.item-price{flex:1!important;text-align:right!important;margin-right:8px!important;font-size:16px!important}.item-title{font-size:14px!important;-webkit-line-clamp:2!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;overflow:hidden!important}.quantity-control{height:34px!important}.qty-btn{width:34px!important}.qty-value{width:28px!important;font-size:13px!important}.no-items{height:86vh;overflow:hidden;margin:0}.checkout-main-content{width:100%}.container{padding:0!important}.pickup-info{display:none}.container{display:flex;flex-direction:column}.promo-banner{gap:10px}select{width:50%}.main-content,.sidebar{width:100%}.vouchers-listing-section{min-width:unset!important;width:100vw!important}.separator{display:none!important}.coupon-meta{display:grid!important;grid-template-columns:1fr 1fr!important}}.group_invest{color:#000;font-size:.8rem}.reedem_error{color:red}.group_invest span{color:#05aacf}.redeem_amount{padding:2%;border-radius:4px;background:#fff;margin-top:2%;color:#000;font-size:.8rem}.redeem_amount span{color:#0dc577}.w-fit{width:fit-content!important}.modal-body{padding-bottom:0;overflow-y:scroll;max-height:300px;padding:0!important}.scheme-option{margin-bottom:16px}.scheme-option input[type=radio]:checked+.scheme-card{border-color:#06b6d4;background:#f0f9ff;position:relative}.scheme-option input[type=radio]:checked+.scheme-card:before{content:\"\";position:absolute;top:20px;left:20px;width:20px;height:20px;border:2px solid #06b6d4;border-radius:50%;background:#fff}.scheme-option input[type=radio]:checked+.scheme-card:after{content:\"\";position:absolute;top:26px;left:26px;width:8px;height:8px;background:#06b6d4;border-radius:50%}.scheme-card{justify-content:space-between;padding:10px;border:2px solid #e5e7eb;border-radius:8px;cursor:pointer;transition:all .2s ease;background:#fff;width:100%}.scheme-card:hover{border-color:#d1d5db;background:#f9fafb}.form-check-radio{width:10%}.scheme-title{font-size:12px;font-weight:600;color:#111827;margin-bottom:8px}.scheme-details{display:flex;gap:25px;margin-bottom:20px}.scheme-name{display:flex;justify-content:space-between}.scheme-details span{font-size:12px;color:#0000004d}.scheme-monthly{font-size:14px;font-weight:600;color:#111827;min-width:100px;text-align:right}.right-side{width:90%}.scheme-amount{font-weight:700}@media screen and (min-width: 700px){.cart-items{max-height:500px;overflow:scroll}}.add-to-cart-parent{width:max-content;border:1px solid #000000;border-radius:8px}.cursor{cursor:pointer}.cart-text{max-width:600px;margin:0 auto;text-align:center}.cart-text div{word-break:break-word;overflow-wrap:break-word;white-space:normal}.switch{position:relative;display:inline-block;width:45px;height:20px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:34px}.slider:before{position:absolute;content:\"\";height:16px;width:16px;left:3px;bottom:2px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#4caf50}input:checked+.slider:before{transform:translate(24px)}.vouchers-listing-section{position:relative;width:fit-content;min-width:500px;z-index:100;background:#fff;height:100vh}.vouchers-listing-section .coupon-heading{border-bottom:1px solid #eee}.vouchers-listing-section .coupon-listing{padding:12px 16px;overflow-y:auto;height:calc(97vh - 100px)}.voucher-details{background:#fff;border-radius:12px;padding:14px;box-shadow:0 1px 4px #00000042}.voucher-details .coupon-brief .apply-offer-btn{background:#111;color:#fff;border-radius:10px;padding:6px 16px}.voucher-details .coupon-code-box{border:1.5px dashed #bbb;border-radius:8px;padding:8px 12px;margin-bottom:10px}.voucher-details .coupon-code-box .code-label{font-size:11px;color:#888;margin-bottom:2px}.voucher-details .coupon-code-box .code-row .code-value{font-weight:700;font-size:15px;letter-spacing:1px}.voucher-details .coupon-meta .clock-icon{font-size:14px;height:14px;width:14px;vertical-align:middle}.applied-coupon-card{background:#f0fff8;border-radius:12px;padding:12px 16px}.applied-coupon-card .applied-coupon-left .success-check{color:#22c55e;font-size:22px}.applied-coupon-card .applied-coupon-left .applied-coupon-code{font-weight:700;font-size:14px}.applied-coupon-card .applied-coupon-left .applied-coupon-saving{font-size:13px;color:#097d5f;margin-top:2px}.active-type{background:#111!important;color:#fff!important}.redemption-type{text-align:center;border-radius:10px;padding:6px 16px;background:#d3d3d36b;width:-webkit-fill-available!important}.wallte_icon{background:#000;border-radius:50px;padding:5px 9px 7px}.wallte_icon img{width:18px;height:18px}.fw-600{font-weight:600}.coupon-type{width:fit-content!important;border-radius:26px!important;background:transparent!important;border:1px solid #afafaf;color:#393838;text-align:center;padding:6px 16px}.active-coupon{background:transparent!important;border:2px solid black!important;color:#000!important}.my-close-btn{position:absolute!important;top:10px!important;right:10px!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i9.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i9.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i9.DecimalPipe, name: "number" }, { kind: "pipe", type: i9.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i9.DatePipe, name: "date" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i10.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i11.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i12.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "directive", type:
1088
1088
  //DIRECTIVE
1089
1089
  ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue", "backgroundInfo"] }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i13.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "component", type: TextEditorComponent, selector: "simpo-text-editor", inputs: ["value", "editable", "isRTE", "sectionId", "label", "type", "inputTextIndex", "itemIndex"], outputs: ["valueChange"] }, { kind: "directive", type: ImageEditorDirective, selector: "[appImageEditor]", inputs: ["appImageEditor", "imageData", "sectionId", "showIcon", "iconData", "itemIndex"] }, { kind: "directive", type: SpacingHorizontalDirective, selector: "[spacingHorizontal]", inputs: ["spacingHorizontal", "isHeader"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "directive", type: ButtonEditorDirective, selector: "button[appButtonEditor]", inputs: ["appButtonEditor", "buttonData", "buttonStyle", "backgroundInfo", "sectionId", "buttonId", "itemIndex"] }] }); }
1090
1090
  }
@@ -1114,7 +1114,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1114
1114
  ColorDirective,
1115
1115
  FeaturedProductsComponent,
1116
1116
  MatSpinner
1117
- ], providers: [MessageService], template: "<ng-container *ngIf=\"!isLoading\">\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n\r\n <ng-container *ngIf=\"data\">\r\n <section [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" [id]=\"data?.id\"\r\n [attr.class]=\"isMobile ? 'py-5 position-relative' : 'position-relative'\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\"\r\n [ngClass]=\"!responseData?.orderedItems?.length ? 'no-items' : ''\">\r\n <div class=\"d-flex align-items-center justify-content-center m-auto mb-4\"\r\n [style.marginTop.px]=\"isMobile ? '': '50'\" [style.width.%]=\"isMobile ? '90' : ''\"\r\n *ngIf=\"responseData?.orderedItems?.length && currentTab === 'ADDRESS'\">\r\n <span class=\"timeline\" (click)=\"currentTab = 'BAG'\">Bag</span>\r\n <div class=\"bar\"></div>\r\n <span class=\"timeline isActive\">Address</span>\r\n <div class=\"bar\"></div>\r\n <span class=\"timeline\" style=\"cursor: auto;\">Payment</span>\r\n </div>\r\n <div class=\"cart-tab-parent w-100\" *ngIf=\"currentTab == 'BAG' && ecomConfigs?.appointmentBookingEnabled\">\r\n <!-- && ecomConfigs?.appointmentBookingEnabled\" -->\r\n <div class=\"cart-tabs\" [id]=\"data?.id\">\r\n <div class=\"selected-cart-tab\" [ngClass]=\"{'selected-cart-tab': cartType==='SHOPPING'}\"\r\n (click)=\"cartType='SHOPPING'\">Shopping Cart ({{responseData?.orderedItems?.length ?? 0}})</div>\r\n <div [ngClass]=\"{'selected-cart-tab': cartType==='TRIAL'}\" (click)=\"cartType='TRIAL'\">Trial Cart\r\n ({{trialCartItem?.length ?? 0}})</div>\r\n </div>\r\n </div>\r\n <div class=\"cart-parent\" [spacingHorizontal]=\"stylesLayout\" *ngIf=\"currentTab === 'BAG'\" [id]=\"data?.id\"\r\n [simpoAnimation]=\"styles?.animation\">\r\n <ng-container>\r\n <ng-container *ngIf=\"cartType === 'SHOPPING'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"(responseData?.orderedItems?.length || 0) > 0 ? CARTPAGE : EMPTYITEM\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"cartType === 'TRIAL'\">\r\n <ng-container *ngTemplateOutlet=\"(trialCartItem?.length || 0) > 0 ? CARTPAGE : EMPTYITEM\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"d-flex checkoutPage\"\r\n *ngIf=\"(responseData?.orderedItems?.length || 0) > 0 && currentTab === 'ADDRESS'\">\r\n <ng-container *ngTemplateOutlet=\"CHECKOUTPAGE\">\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\r\n [isEcommerce]=\"true\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n\r\n </section>\r\n </ng-container>\r\n <ng-container *ngIf=\"!data\">\r\n <section class=\"cart-window\">\r\n <div class=\"heading-large lh-2 mb-3 header-sec\">\r\n <div class=\"d-flex align-items-center\">\r\n <mat-icon (click)=\"closeWindow()\">keyboard_arrow_left</mat-icon>\r\n <span>Your Cart</span>\r\n </div>\r\n <div class=\"saving\"></div>\r\n </div>\r\n <div class=\"offers\">\r\n <div class=\"d-flex align-items-center\" style=\"gap: 5px;\">\r\n <img src=\"https://i.postimg.cc/htY55sqY/discount.png\" alt=\"\" height=\"20\" width=\"20\">\r\n <span>Avail Offers / Coupons</span>\r\n </div>\r\n <mat-icon>keyboard_arrow_right</mat-icon>\r\n </div>\r\n <div class=\"small-items\">\r\n <ng-container *ngFor=\"let item of responseData?.orderedItems\">\r\n <div class=\"small-item\">\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div class=\"h-100\" style=\"padding: 0px; width: fit-content;\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n class=\"small-product-img\"\r\n [src]=\"item.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" alt=\"\"\r\n (click)=\"goToProductDetails(item)\">\r\n </div>\r\n <div class=\"small-item-name trim-text\">{{ item.itemName | titlecase }}</div>\r\n <div class=\"small-item-quantity\">\r\n <span class=\"cursor\">-</span>\r\n <span>{{item.quantity}}</span>\r\n <span class=\"cursor\">+</span>\r\n </div>\r\n <div class=\"small-item-price\">\r\n <div class=\"price-with-tax\">\r\n <span [innerHTML]='currency'></span> {{(item.sellingPrice) | number: '1.0-2'}}\r\n </div>\r\n <!-- <div class=\"price-with-tax\">\r\n <span [innerHTML]='currency'></span> {{(item.selling) | number: '1.0-2'}}\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"fotter-sec\">\r\n <div class=\"delivery-add d-flex\">\r\n <mat-icon>home</mat-icon>\r\n <div class=\"address\">Tetsting</div>\r\n </div>\r\n <button class=\"payment-btn\" [disabled]=\"cartInfo.addressDetails\" (click)=\"proceedToCheckout()\"> <span\r\n style=\"margin-right: 5px;\">Click to Pay</span> <span [innerHtml]='currency'></span>\r\n {{(responseData?.totalAmount ?? 0) | number: '1.0-2'}}</button>\r\n </div>\r\n </section>\r\n </ng-container>\r\n</ng-container>\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>\r\n\r\n<ng-template #CouponList>\r\n <section class=\"coupons-listing-section\">\r\n <div class=\"coupon-heading\">\r\n <div class=\"back-btn\" (click)=\"closeDialogRef()\">\r\n <mat-icon>keyboard_arrow_left</mat-icon>\r\n </div>\r\n <div class=\"header-text\">Apply Coupon</div>\r\n </div>\r\n <!-- <div class=\"coupon-search-sec\">\r\n <input type=\"text\" placeholder=\"Type Coupon Code\" [(ngModel)]=\"enteredCouponCode\">\r\n <div class=\"apply-btn-search\" (click)=\"searchIfApplicable()\">Apply</div>\r\n </div> -->\r\n <div class=\"coupon-listing\">\r\n <ng-container *ngIf=\"couponList.length > 0; else showEmptyScreen\">\r\n <ng-container *ngFor=\"let couponDetails of couponList; let idx = index\">\r\n <div class=\"coupon-details\"\r\n [ngStyle]=\"{'background-color': !couponDetails.applicable ? '#FFF2F4' : '#EDFFFA'}\"\r\n *ngIf=\"couponDetails?.status\">\r\n <div class=\"details__coupon-heading\">\r\n <div class=\"coupon-brief\">\r\n <div class=\"coupon-brief__left-sec\">\r\n <div class=\"coupon-name\" [ngStyle]=\"{'color': !couponDetails.applicable ? '#DB1A1A' : '#097D5F'}\">\r\n {{ couponDetails.couponCode | uppercase }}</div>\r\n <div class=\"coupon-desc\">{{ couponDetails.discountDescription | titlecase }}</div>\r\n </div>\r\n <div class=\"coupon-brief__right-sec\">\r\n <div class=\"apply-offer-btn\" [style.opacity]=\"couponDetails.applicable ? '1' : '0.3'\"\r\n [ngStyle]=\"{'cursor': couponDetails.applicable ? 'pointer' : ''}\"\r\n (click)=\"applyCoupon(couponDetails)\">Apply</div>\r\n </div>\r\n </div>\r\n <!-- <div class=\"coupon-toggle-details-btn\" (click)=\"couponDetails.status = !couponDetails.status\">\r\n <span class=\"hide-details-btn\" *ngIf=\"couponDetails.status\">Hide details</span>\r\n <div class=\"show-details-btn\" *ngIf=\"!couponDetails.status\">View details</div>\r\n </div> -->\r\n </div>\r\n <ng-container>\r\n <!-- *ngIf=\"couponDetails.status\" -->\r\n <div class=\"details-divider\"></div>\r\n <ul class=\"details__coupon-terms\">\r\n <li>Offer valid from {{ couponDetails.validFrom | date }} - {{ couponDetails.validTo | date }}</li>\r\n </ul>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #showEmptyScreen>\r\n <div class=\"empty-screen-container\">\r\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\r\n <div class=\"empty-screen__primary-text\">No Coupon Available</div>\r\n <div class=\"empty-screen__secondary-text\">\r\n Looks like there are no coupons at the moment\r\n </div>\r\n <!-- <div class=\"empty-screen__button\">Explore</div> -->\r\n </div>\r\n </ng-template>\r\n </div>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #RedemptionVouchers>\r\n <section class=\"vouchers-listing-section d-flex flex-column\">\r\n <div class=\"coupon-heading d-flex align-items-center gap-2 p-3 fs-18 fw-600 border-bottom\">\r\n <div class=\"back-btn cursor-pointer d-flex align-items-center\" (click)=\"closeDialogRef()\">\r\n <mat-icon>keyboard_arrow_left</mat-icon>\r\n </div>\r\n <div class=\"header-text\">Coupons & Vouchers</div>\r\n </div>\r\n\r\n <!-- <div class=\"d-flex align-items-center tab-container justify-content-between gap-2 p-3\">\r\n <div class=\"redemption-type fs-16 fw-500 cursor-pointer\" [ngClass]=\"{'active-type': redemptionType === 'COUPONS'}\"\r\n (click)=\"redemptionType = 'COUPONS'\">\r\n Coupons\r\n </div>\r\n <div class=\"redemption-type fs-16 fw-500 cursor-pointer\" [ngClass]=\"{'active-type': redemptionType === 'VOUCHERS'}\"\r\n (click)=\"redemptionType = 'VOUCHERS'\">\r\n Vouchers\r\n </div>\r\n </div> -->\r\n\r\n <div class=\"coupon-listing d-flex flex-column gap-3 pt-3\" *ngIf=\"redemptionType === 'COUPONS'\">\r\n <div class=\"d-flex align-items-center tab-container gap-3\">\r\n <div class=\"coupon-type fs-16 fw-500 cursor-pointer\"\r\n [ngClass]=\"{'active-coupon': redemptionCouponType === 'REWARDS'}\" (click)=\"redemptionCouponType = 'REWARDS'\">\r\n Rewards\r\n </div>\r\n <div class=\"coupon-type fs-16 fw-500 cursor-pointer\"\r\n [ngClass]=\"{'active-coupon': redemptionCouponType === 'DISCOUNTS'}\"\r\n (click)=\"redemptionCouponType = 'DISCOUNTS'\">\r\n Discounts\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"redemptionCouponType === 'REWARDS'\">\r\n <ng-container *ngIf=\"(listRedemptionCoupons?.vouchers?.length > 0) ; else showEmptyScreen\">\r\n <ng-container *ngFor=\"let voucher of listRedemptionCoupons?.vouchers; let idx = index\">\r\n <div class=\"voucher-details\" *ngIf=\"!voucher.utilised\">\r\n\r\n <div class=\"coupon-brief d-flex justify-content-between align-items-start mb-3\">\r\n <div class=\"coupon-brief__left-sec\">\r\n <div class=\"coupon-name fs-16 fw-600 mb-1\">{{ voucher.voucherName }}</div>\r\n <div class=\"coupon-desc fs-12 text-secondary\">\r\n Get {{ voucher.couponValueType === 'FIXED' ? '\u20B9' + voucher.couponValue : voucher.couponValue + '%'\r\n }}\r\n off on your payment\r\n </div>\r\n </div>\r\n <div class=\"coupon-brief__right-sec\">\r\n <div class=\"apply-offer-btn fs-12 fw-600 cursor-pointer\" (click)=\"applyRedemptionCoupon(voucher)\">\r\n Apply</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"coupon-code-box d-flex align-items-center gap-3\">\r\n <div class=\"code-label\">Code</div>\r\n <div class=\"code-value\">{{ voucher.voucherCode }}</div>\r\n </div>\r\n\r\n <div class=\"coupon-meta d-flex align-items-center gap-2 fs-12 text-secondary mb-2\">\r\n <span class=\"min-order\">Min: \u20B9{{ voucher.minOrderValue | number }}</span>\r\n <span class=\"separator text-secondary\">|</span>\r\n <span class=\"validity\">\r\n <mat-icon class=\"clock-icon\">schedule</mat-icon>\r\n Until {{ voucher.issuedDate | date: 'MMM dd, yyyy' }}\r\n </span>\r\n <span class=\"separator text-secondary\" *ngIf=\"voucher.maxRedeemableAmount\">|</span>\r\n <span class=\"min-order\" *ngIf=\"voucher.maxRedeemableAmount\">Max Redeemable Amount: \u20B9{{\r\n voucher.maxRedeemableAmount | number }}</span>\r\n </div>\r\n\r\n <!-- <div class=\"terms-link\">View terms & conditions</div> -->\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"redemptionCouponType === 'DISCOUNTS'\">\r\n <ng-container *ngIf=\"(couponList.length > 0); else showEmptyDiscounts\">\r\n <ng-container *ngFor=\"let couponDetails of couponList; let idx = index\">\r\n <div class=\"voucher-details\" *ngIf=\"couponDetails?.status\">\r\n\r\n <div class=\"coupon-brief d-flex justify-content-between align-items-start mb-3\">\r\n <div class=\"coupon-brief__left-sec\">\r\n <div class=\"coupon-name fs-16 fw-600 mb-1\"\r\n [ngStyle]=\"{'color': !couponDetails.applicable ? '#DB1A1A' : '#097D5F'}\">\r\n {{ couponDetails.couponCode | uppercase }}\r\n </div>\r\n <div class=\"coupon-desc fs-12 text-secondary\">\r\n {{ couponDetails.discountDescription | titlecase }}\r\n </div>\r\n </div>\r\n <div class=\"coupon-brief__right-sec\">\r\n <div class=\"apply-offer-btn fs-12 fw-600 cursor-pointer\"\r\n [style.opacity]=\"couponDetails.applicable ? '1' : '0.3'\"\r\n [ngStyle]=\"{'cursor': couponDetails.applicable ? 'pointer' : 'not-allowed'}\"\r\n (click)=\"applyCoupon(couponDetails)\">\r\n Apply\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"coupon-code-box d-flex align-items-center gap-3\">\r\n <div class=\"code-label\">Code</div>\r\n <div class=\"code-value\">{{ couponDetails.couponCode | uppercase }}</div>\r\n </div>\r\n\r\n <div class=\"coupon-meta d-flex align-items-center gap-2 fs-12 text-secondary mb-2\">\r\n <span class=\"validity\">\r\n <mat-icon class=\"clock-icon\">schedule</mat-icon>\r\n {{ couponDetails.validFrom | date }} - {{ couponDetails.validTo | date }}\r\n </span>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #showEmptyDiscounts>\r\n <div class=\"empty-screen-container\">\r\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\r\n <div class=\"empty-screen__primary-text\">No Discount Coupons Available</div>\r\n <div class=\"empty-screen__secondary-text\">\r\n Looks like there are no discount coupons at the moment\r\n </div>\r\n <!-- <div class=\"empty-screen__button\">Explore</div> -->\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #showEmptyScreen>\r\n <div class=\"empty-screen-container\">\r\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\r\n <div class=\"empty-screen__primary-text\">No Coupons Available</div>\r\n <div class=\"empty-screen__secondary-text\">Looks like there are no coupons</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <div class=\"coupon-listing d-flex flex-column gap-3\" *ngIf=\"redemptionType === 'VOUCHERS'\">\r\n <ng-container *ngIf=\"listRedemptionVouchers?.vouchers?.length > 0; else showEmptyScreen\">\r\n <ng-container *ngFor=\"let voucher of listRedemptionVouchers?.vouchers; let idx = index\">\r\n <div class=\"voucher-details\" *ngIf=\"!voucher.utilised\">\r\n\r\n <div class=\"coupon-brief d-flex justify-content-between align-items-start mb-3\">\r\n <div class=\"coupon-brief__left-sec\">\r\n <div class=\"coupon-name fs-16 fw-600 mb-1\">{{ voucher.voucherName }}</div>\r\n <div class=\"coupon-desc fs-12 text-secondary\">\r\n Get {{ voucher.couponValueType === 'FIXED' ? '\u20B9' + voucher.couponValue : voucher.couponValue + '%' }}\r\n off on your payment\r\n </div>\r\n </div>\r\n <div class=\"coupon-brief__right-sec\">\r\n <div class=\"apply-offer-btn fs-12 fw-600 cursor-pointer\" (click)=\"applyRedemptionCoupon(voucher)\">Apply\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"coupon-code-box d-flex align-items-center gap-3\">\r\n <div class=\"code-label\">Code</div>\r\n <div class=\"code-value\">{{ voucher.voucherCode }}</div>\r\n </div>\r\n\r\n <div class=\"coupon-meta d-flex align-items-center gap-2 fs-12 text-secondary mb-2\">\r\n <span class=\"min-order\">Min: \u20B9{{ voucher.minOrderValue | number }}</span>\r\n <span class=\"separator text-secondary\">|</span>\r\n <span class=\"validity\">\r\n <mat-icon class=\"clock-icon\">schedule</mat-icon>\r\n Until {{ voucher.issuedDate | date: 'MMM dd, yyyy' }}\r\n </span>\r\n </div>\r\n\r\n <!-- <div class=\"terms-link\">View terms & conditions</div> -->\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #showEmptyScreen>\r\n <div class=\"empty-screen-container\">\r\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\r\n <div class=\"empty-screen__primary-text\">No Vouchers Available</div>\r\n <div class=\"empty-screen__secondary-text\">Looks like there are no vouchers</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #CARTPAGE>\r\n <div class=\"container\">\r\n <div class=\"main-content\">\r\n <div class=\"cart-items\">\r\n <div class=\"cart-header\">\r\n <h2>Your Cart</h2>\r\n </div>\r\n <ng-container\r\n *ngTemplateOutlet=\"CARTITEM;context:{data: cartType === 'SHOPPING' ? responseData?.orderedItems : trialCartItem}\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sidebar\">\r\n <div class=\"reedem-section d-flex flex-column align-items-center\" *ngIf=\"cartType != 'TRIAL' && getUrl()\">\r\n <div class=\"justify-content-between d-flex align-items-center w-100 redeem-section-text\">Redeem Section Amount\r\n <div class=\"toogle-switch\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" role=\"switch\" id=\"flexSwitchCheckChecked\"\r\n [checked]=\"selectMatureScheme\" (change)=\"onToggleChange()\">\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div class=\"select_matured_text w-100 text-start cursor-pointer\"\r\n *ngIf=\"selectMatureScheme && !selectedRedemption\" (click)=\"selectScheme()\">\r\n Select Matured Scheme\r\n </div> -->\r\n <!-- <div class=\"select_matured_text d-flex flex-column gap-2 w-100 text-start cursor-pointer\"\r\n *ngIf=\"selectedRedemption\">\r\n Selected Scheme\r\n <div class=\"d-flex w-100 justify-content-between align-items-center group_invest\">Group Investment\r\n scheme-5000/M <span>Change</span></div>\r\n <div class=\"d-flex justify-content-between align-items-center w-100 redeem_amount\">Redeemable Amount\r\n <span>\u20B9{{selectedRedmpationData.selectedAmount}}</span>\r\n </div>\r\n </div> -->\r\n </div>\r\n <div class=\"scheme-section\" *ngIf=\"selectMatureScheme\">\r\n <ng-container *ngTemplateOutlet=\"SCHEME_REDEMPTION\"></ng-container>\r\n </div>\r\n <div class=\"coupon-section\" [id]=\"data?.id\" *ngIf=\"cartType === 'SHOPPING' && !referEarnExist\">\r\n <div class=\"coupon-left\">\r\n <div class=\"coupon-icon\"><mat-icon>percent</mat-icon></div>\r\n <span class=\"coupon-text\" *ngIf=\"!responseData.billdetails?.couponId\">Apply\r\n Coupon</span>\r\n <span class=\"coupon-text\" *ngIf=\"responseData.billdetails?.couponId\">Coupon\r\n Applied</span>\r\n </div>\r\n <svg *ngIf=\"!responseData.billdetails?.couponId\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"chevron-icon\" (click)=\"openDialog(CouponList)\">\r\n <path d=\"m9 18 6-6-6-6\" />\r\n </svg>\r\n <span *ngIf=\"responseData.billdetails?.couponId\"\r\n (click)=\"removeCoupon($event)\"><mat-icon>close</mat-icon></span>\r\n </div>\r\n\r\n <div class=\"promo-banner mb-3\" [id]=\"data?.id\" *ngIf=\"cartType === 'SHOPPING' && ecomConfigs?.videoCallEnabled\">\r\n <div class=\"promo-text\">\r\n <h3>See It Before You Buy It</h3>\r\n <p>Experience our designs in detail via video call</p>\r\n </div>\r\n <button class=\"see-live-btn\" (click)=\"scheduleVideoCall(responseData?.orderedItems)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"lucide lucide-video\">\r\n <path d=\"m22 8-6 4 6 4V8Z\" />\r\n <rect width=\"14\" height=\"12\" x=\"2\" y=\"6\" rx=\"2\" ry=\"2\" />\r\n </svg>\r\n SEE IT LIVE\r\n </button>\r\n </div>\r\n\r\n <div class=\"plan-details-container p-3 rounded-4 bg-white text-dark voucher-details\"\r\n *ngIf=\"referEarnExist && this?.redemptionPoints?.availablePoints > 0\">\r\n <div class=\"fs-14 fw-500\">\r\n Rewards Available\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-start border-bottom pb-2\">\r\n <div class=\"avb_pts mt-2 mb-2\">\r\n <span class=\"fs-16 fw-500 total_points text-secondary\">\r\n <span class=\" fs-18 fw-600 text-dark\">{{(this?.redemptionPoints?.availablePoints || 0).toFixed(2)}}</span>\r\n pts\r\n </span>\r\n <div class=\"total_value fs-12 text-secondary\">\r\n = max \u20B9{{(this?.redemptionPoints?.pointsConvertedRupees || 0).toFixed(2)}} discount\r\n </div>\r\n </div>\r\n <div class=\"wallte_icon\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/777779c1775200561187wallet_(1).png\" alt=\"\">\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <div class=\"redemable_text\">\r\n <div class=\"title_text\">\r\n <div class=\"fs-14 fw-500\">\r\n Redeem Points\r\n </div>\r\n <div class=\"fs-13 fs-400\">\r\n Use your points for discount\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"toggle_btn\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" id=\"toggleSwitch\" [checked]=\"isPointsRedeeming\"\r\n (click)=\"onPointsRedeemingChange($event)\" />\r\n <span class=\"slider\"></span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"mt-3 success_selected w-100 applied-coupon-card\" *ngIf=\"isPointsRedeeming\">\r\n <div class=\"d-flex align-items-start gap-2\">\r\n <div class=\"success_icon\">\r\n <mat-icon class=\"d-flex justify-content-center align-items-center text-success\">check_circle</mat-icon>\r\n </div>\r\n <div class=\"success_text\">\r\n <div class=\"fs-13 fw-500\">\r\n You're saving \u20B9\r\n {{totalSavingAmt || 0}}\r\n </div>\r\n <div class=\"fs-12 fs-400 text-success\">\r\n {{totalSavingPoints}} points remaining after redemption\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Existing coupon row (keep as-is) -->\r\n <div class=\"coupon-section d-flex flex-column voucher-details\" [id]=\"data?.id\"\r\n *ngIf=\"cartType === 'SHOPPING' && referEarnExist\">\r\n <div class=\"d-flex justify-content-between align-items-center w-100\">\r\n <div class=\"coupon-left\">\r\n Apply Coupon\r\n </div>\r\n <div (click)=\"addRedemptionCoupon(RedemptionVouchers)\">View All</div>\r\n </div>\r\n\r\n <!-- Applied Coupon Success Banner -->\r\n <div class=\"applied-coupon-card w-100 mt-3 d-flex align-items-center justify-content-between\"\r\n *ngIf=\"selectedVoucherId\">\r\n <div class=\"applied-coupon-left d-flex align-items-center gap-3\">\r\n <mat-icon class=\"success-check\">check_circle</mat-icon>\r\n <div class=\"applied-coupon-info\">\r\n <div class=\"applied-coupon-code\">Coupon {{ selectedVoucherCode }} applied!</div>\r\n <div class=\"applied-coupon-saving\">You're saving\r\n <span *ngIf=\"this.couponValueType === 'AMOUNT'\">\u20B9 {{selectedVoucherAmount || 0}}</span>\r\n <span *ngIf=\"this.couponValueType === 'PERCENTAGE'\"> {{selectedVoucherPercentage || 0}}%</span>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"remove-coupon-btn fs-14 fw-500 text-secondary cursor-pointer\"\r\n (click)=\"removeRedemptionCoupon($event)\">Remove</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"delivery-section\" *ngIf=\"getUrl()\">\r\n <div class=\"delivery-header\">\r\n <mat-icon>gps_fixed</mat-icon>\r\n <span *ngIf=\"cartType === 'SHOPPING'\">Delivering to</span>\r\n <span *ngIf=\"cartType === 'TRIAL'\">Trial Location at</span>\r\n <span class=\"pincode\">{{pincode}}</span>\r\n <!-- <a class=\"change-link\">Change Pincode</a> -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"summary-section\">\r\n <div class=\"summary-title\">Summary</div>\r\n\r\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING'\">\r\n <span class=\"summary-label\">Subtotal</span>\r\n <span class=\"summary-value\">\u20B9{{(responseData?.billdetails?.totalNetValue ?? 0) | number: '1.0-2'}}</span>\r\n </div>\r\n\r\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING' && referEarnExist && isPointsRedeeming\">\r\n <span class=\"summary-label\">Points Redeemed</span>\r\n <span class=\"summary-value\">- \u20B9{{ totalSavingAmt || 0 }}</span>\r\n </div>\r\n\r\n <div class=\"summary-row\"\r\n *ngIf=\"cartType === 'SHOPPING' && referEarnExist && (this.couponValueType === 'AMOUNT' && appliedVoucher)\">\r\n <span class=\"summary-label\">Voucher Applied</span>\r\n <span class=\"summary-value\">- \u20B9{{ selectedVoucherAmount || 0 }}</span>\r\n </div>\r\n\r\n <div class=\"summary-row\"\r\n *ngIf=\"cartType === 'SHOPPING' && referEarnExist && (this.couponValueType === 'PERCENTAGE' && appliedVoucher)\">\r\n <span class=\"summary-label\">Voucher Applied</span>\r\n <span class=\"summary-value\">- \u20B9{{ percentageReduced || 0 }}</span>\r\n </div>\r\n\r\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING' && responseData?.billdetails?.discountAmount\">\r\n <span class=\"summary-label\">Discount Amount</span>\r\n <span class=\"summary-value\">\r\n {{('\u20B9' + (responseData?.billdetails?.discountAmount | number: '1.0-2')) }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING'\">\r\n <span class=\"summary-label\">Shipping</span>\r\n <span class=\"summary-value\"\r\n [ngClass]=\"{'savings': !responseData?.billdetails?.deliveryCharges || responseData.billdetails.deliveryCharges <= 0}\">\r\n {{ (responseData?.billdetails?.deliveryCharges && responseData.billdetails.deliveryCharges > 0) ? ('\u20B9' +\r\n (responseData.billdetails.deliveryCharges | number: '1.0-2')) : 'Free' }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING'\">\r\n <span class=\"summary-label\">Estimated Tax</span>\r\n <span class=\"summary-value\">\u20B9{{((!responseData.billdetails?.couponId ?\r\n responseData?.billdetails?.totalTax : responseData?.billdetails?.totalTaxAfterDiscount) ?? 0) |\r\n number: '1.0-2'}}</span>\r\n </div>\r\n\r\n <div class=\"summary-row total-row\" *ngIf=\"cartType === 'SHOPPING'\">\r\n <span class=\"summary-label\">Total</span>\r\n <!-- <span class=\"summary-value\">\u20B9{{ responseData?.totalAmount | number: '1.0-2' }}</span> -->\r\n <span class=\"total-value\" *ngIf=\"!isPointsRedeeming && !appliedVoucher\">\u20B9{{ responseData?.totalAmount |\r\n number: '1.0-2' }}</span>\r\n\r\n <span class=\"total-value\" *ngIf=\"isPointsRedeeming\">\u20B9{{ (responseData?.totalAmount - (totalSavingAmt || 0)) |\r\n number: '1.0-2' }}</span>\r\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'AMOUNT'\">\u20B9{{(responseData?.totalAmount -\r\n (selectedVoucherAmount || 0)) | number:\r\n '1.0-2'}}</span>\r\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'PERCENTAGE'\">\u20B9{{(responseData?.totalAmount -\r\n (percentageReduced || 0)) | number:\r\n '1.0-2' }}</span>\r\n </div>\r\n\r\n <!-- Trial Cart Summary -->\r\n <ng-container *ngIf=\"cartType === 'TRIAL'\">\r\n <div class=\"summary-row\">\r\n <span class=\"summary-label\">Free Trial</span>\r\n <span class=\"summary-value\">\u20B90</span>\r\n </div>\r\n <div class=\"summary-row\">\r\n <span class=\"summary-label\">Service Charge</span>\r\n <span class=\"summary-value savings\">Free</span>\r\n </div>\r\n <div class=\"summary-divider\"></div>\r\n <div class=\"summary-row total-row\">\r\n <span class=\"summary-label\">Total</span>\r\n <span class=\"summary-value\">\u20B90</span>\r\n </div>\r\n <!-- <span class=\"total-value\" *ngIf=\"!isPointsRedeeming && !appliedVoucher\">\u20B9{{ responseData?.totalAmount |\r\n number: '1.0-2' }}</span>\r\n\r\n <span class=\"total-value\" *ngIf=\"isPointsRedeeming\">\u20B9{{ (responseData?.totalAmount - (totalSavingAmt || 0)) |\r\n number: '1.0-2' }}</span>\r\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'AMOUNT'\">\u20B9{{(responseData?.totalAmount -\r\n (selectedVoucherAmount || 0)) | number:\r\n '1.0-2'}}</span>\r\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'PERCENTAGE'\">\u20B9{{(responseData?.totalAmount -\r\n (percentageReduced || 0)) | number:\r\n '1.0-2' }}</span> -->\r\n </ng-container>\r\n </div>\r\n <button class=\"place-order-btn\" (click)=\"edit ? '' : proceedToListPage()\" simpoButtonDirective\r\n [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\r\n *ngIf=\"cartType === 'SHOPPING'\" [appButtonEditor]=\"edit ?? false\"\r\n [backgroundInfo]=\"styles?.background\">{{data?.action?.buttons?.[1]?.content?.label ?? 'Continue\r\n Shopping'}}</button>\r\n <button class=\"place-order-btn mt-0\" (click)=\"edit ? '' : proceedToCheckout()\" simpoButtonDirective\r\n *ngIf=\"cartType === 'SHOPPING'\" [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\"\r\n [color]=\"data?.styles?.background?.accentColor\" [appButtonEditor]=\"edit ?? false\"\r\n [backgroundInfo]=\"styles?.background\">{{data?.action?.buttons?.[0]?.content?.label ?? 'Checkout\r\n Cart'}}</button>\r\n <button class=\"place-order-btn mt-0\" simpoButtonDirective *ngIf=\"cartType === 'TRIAL'\"\r\n [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\r\n [appButtonEditor]=\"edit ?? false\" [backgroundInfo]=\"styles?.background\" (click)=\"bookAppointment()\">BOOK\r\n APPOINTMENT</button>\r\n\r\n </div>\r\n </div>\r\n <!-- <ng-container *ngIf=\"recommededData?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\"\r\n [responseData]=\"recommededData\"></simpo-featured-products>\r\n </ng-container> -->\r\n</ng-template>\r\n<ng-template #CHECKOUTPAGE>\r\n <div class=\"checkout-left-panel\">\r\n <div class=\"checkout-main-content\">\r\n <!-- <div class=\"delivery-options\">\r\n <div class=\"delivery-option active\">\r\n <div class=\"delivery-icon\"></div>\r\n HOME DELIVERY\r\n </div>\r\n <div class=\"delivery-option\">\r\n <div class=\"delivery-icon\"></div>\r\n STORE PICK-UP\r\n </div>\r\n </div> -->\r\n\r\n <div class=\"section-title\">Shipping Address</div>\r\n\r\n <div class=\"shipping-info\" *ngIf=\"defaultAddress\">\r\n <div class=\"address-info\">\r\n <div class=\"address-name\">{{defaultAddress?.receiverName}} ({{defaultAddress?.addressType}})</div>\r\n <div class=\"address-details\">{{defaultAddress?.addressLine1}}, {{defaultAddress?.cityName}},\r\n {{defaultAddress?.stateName}}</div>\r\n <div class=\"mobile-number\">Mobile: {{defaultAddress?.receiverPhone}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"addLinks h-100\" *ngIf=\"!defaultAddress\" (click)=\"addAddress()\">\r\n <mat-icon>add</mat-icon>\r\n </div>\r\n\r\n <button class=\"change-address-btn\" (click)=\"changeAddress()\" *ngIf=\"defaultAddress\">CHANGE OR ADD ADDRESS</button>\r\n\r\n <button class=\"btn w-100 mt-1 payment-btn\" (click)=\"proceedToPayment()\" simpoButtonDirective\r\n *ngIf=\"defaultAddress && !placeOrderLoader\" [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\"\r\n [color]=\"data?.styles?.background?.accentColor\" [appButtonEditor]=\"edit ?? false\"\r\n [backgroundInfo]=\"styles?.background\">\r\n Place Order\r\n </button>\r\n <button class=\"btn w-100 mt-1 payment-btn\" simpoButtonDirective *ngIf=\"defaultAddress && placeOrderLoader\"\r\n [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\r\n [appButtonEditor]=\"edit ?? false\" [backgroundInfo]=\"styles?.background\">\r\n Loading...\r\n </button>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"checkout-right-panel\">\r\n <div class=\"order-summary\">\r\n <div class=\"summary-title\">Order Summary</div>\r\n\r\n <div class=\"checkout-product\">\r\n <div class=\"product-item\" *ngFor=\"let item of responseData?.orderedItems; let idx = index\">\r\n <img [src]=\"item.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" class=\"product-image\"\r\n alt=\"\">\r\n <div class=\"product-details\">\r\n <div class=\"product-name\">{{item.itemName}}</div>\r\n <div class=\"product-quantity\">Quantity: {{item.quantity}}</div>\r\n <div class=\"product-price\">\u20B9{{(item.sellingPrice * item.quantity) | number: '1.0-2'}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"price-breakdown\">\r\n <div class=\"price-row\">\r\n <span>Total Price</span>\r\n <span>\u20B9{{(responseData?.billdetails?.totalNetValue\r\n ?? 0) | number: '1.0-2'}}</span>\r\n </div>\r\n <div class=\"price-row\">\r\n <span>Total Tax</span>\r\n <span>\u20B9{{((!responseData.billdetails?.couponId ?\r\n responseData?.billdetails?.totalTax : responseData?.billdetails?.totalTaxAfterDiscount) ?? 0) |\r\n number:\r\n '1.0-2'}}</span>\r\n </div>\r\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING' && cartInfo?.billdetails?.orraSchemeRedeemedAmount\">\r\n <span class=\"summary-label\">Redeem Amount</span>\r\n <span class=\"summary-value\">\u20B9{{(cartInfo?.billdetails?.orraSchemeRedeemedAmount ?? 0) | number:\r\n '1.0-2'}}</span>\r\n </div>\r\n\r\n <div class=\"price-row discount\" *ngIf=\"responseData?.billdetails?.discountAmount && !isJewellery\">\r\n <span>Coupon Discount</span>\r\n <span>- \u20B9{{responseData?.billdetails?.discountAmount\r\n | number: '1.0-2'}}</span>\r\n </div>\r\n <div class=\"price-row\"\r\n *ngIf=\"responseData?.billdetails?.deliveryCharges && responseData.billdetails.deliveryCharges > 0\">\r\n <span>Delivery Charge</span>\r\n <span>{{responseData.billdetails.deliveryCharges\r\n |\r\n number: '1.0-2'}}</span>\r\n </div>\r\n <div class=\"price-row total\" *ngIf=\"cartType === 'SHOPPING'\">\r\n <span>TOTAL AMOUNT</span>\r\n <span *ngIf=\"!isPointsRedeeming && !appliedVoucher\">\u20B9{{(responseData?.totalAmount ?? 0) | number:\r\n '1.0-2'}}</span>\r\n <span *ngIf=\"isPointsRedeeming\">\u20B9{{(responseData?.totalAmount - (totalSavingAmt || 0)) | number:\r\n '1.0-2'}}</span>\r\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'AMOUNT'\">\u20B9{{(responseData?.totalAmount -\r\n (selectedVoucherAmount || 0)) | number:\r\n '1.0-2'}}</span>\r\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'PERCENTAGE'\">\u20B9{{(responseData?.totalAmount -\r\n (responseData?.totalAmount * (selectedVoucherPercentage / 100) || 0)) | number:\r\n '1.0-2' }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #CARTITEM let-products=\"data\">\r\n <div class=\"cart-item\" *ngFor=\"let item of products\" [style.color]=\"fontColor\">\r\n <div class=\"item-left\">\r\n <div class=\"item-image\">\r\n <img class=\"item-img\" [src]=\"item.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" alt=\"\"\r\n (click)=\"goToProductDetails(item)\" style=\"cursor: pointer;\">\r\n </div>\r\n <div class=\"item-details\">\r\n <h3 class=\"item-title\">{{item.itemName}}</h3>\r\n <div class=\"item-subtitle\" *ngIf=\"item.itemVariant\">\r\n <span *ngFor=\"let varient of getKeys(item.itemVariant.properties); let last = last\">\r\n {{ item.itemVariant.properties[varient] | titlecase }}<span *ngIf=\"!last\">, </span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"item-right\">\r\n <div class=\"quantity-control\" *ngIf=\"cartType === 'SHOPPING'\">\r\n <button class=\"qty-btn px-2\" (click)=\"decreaseQty(item)\" [disabled]=\"item.quantity === 1\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n <span class=\"qty-value px-3\">{{item.quantity}}</span>\r\n <button class=\"qty-btn px-2\" (click)=\"increaseQty(item)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"item-price\">\r\n \u20B9{{item.sellingPrice | number: '1.0-2'}}\r\n </div>\r\n\r\n <div class=\"delete-btn-circle\" (click)=\"removeItem(item)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-trash-2\">\r\n <path d=\"M3 6h18\" />\r\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\r\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\r\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\r\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #EMPTYITEM>\r\n <section class=\"empty-cart w-100 d-flex align-items-center justify-content-center\">\r\n <div class=\"empty-cart-container d-flex flex-column\">\r\n <div class=\"cart-image\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"data?.content?.image?.url\" [alt]=\"data?.content?.image?.altText\" [appImageEditor]=\"edit || false\"\r\n [imageData]=\"data?.content?.image\" [sectionId]=\"data?.id\">\r\n </div>\r\n <div class=\"cart-text content-side\">\r\n <ng-container *ngFor=\"let text of data?.content?.inputText\">\r\n <div class=\"d-flex justify-content-center\"\r\n [ngClass]=\"{'heading-medium': text.label == 'Heading', 'description': text.label == 'Text'}\">\r\n <simpo-text-editor [(value)]=\"text.value\" [editable]=\"edit || false\" [isRTE]=\"text.isRTE\"></simpo-text-editor>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <button class=\"place-order-btn mx-auto w-fit\" (click)=\"edit ? '' : proceedToListPage()\" simpoButtonDirective\r\n [buttonStyle]=\"data?.action?.buttons?.[1]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\r\n [appButtonEditor]=\"edit ?? false\"\r\n [backgroundInfo]=\"styles?.background\">{{data?.action?.buttons?.[1]?.content?.label ?? 'Continue\r\n Shopping'}}</button>\r\n </div>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #SCHEME_REDEMPTION>\r\n <div class=\"modal-body\">\r\n <div class=\"scheme-option\" *ngFor=\"let scheme of schemeList\" (click)=\"redeemScheme(scheme, false)\"\r\n [style.borderColor]=\"cartInfo.billdetails.orraSchemeCode ? styles?.background?.color : ''\">\r\n <label for=\"individual\" class=\"scheme-card\">\r\n <div class=\"scheme-info d-flex gap-1\">\r\n <div class=\"form-check-radio\">\r\n <input class=\"form-check-input-radio\" type=\"radio\" name=\"flexRadioDefault\" id=\"flexRadioDefault2\">\r\n </div>\r\n <div class=\"right-side\">\r\n <div class=\"scheme-name\">\r\n <div class=\"scheme-title\">Individual Investment Scheme</div>\r\n <div class=\"scheme-monthly\">\u20B98000/M</div>\r\n </div>\r\n <div class=\"scheme-details\">\r\n <span class=\"scheme-id\">GPP Id: {{scheme.GPPId}}</span>\r\n <!-- <span class=\"scheme-maturity\">Maturity Date: 12 April 2024</span> -->\r\n </div>\r\n <div class=\"scheme-amount\">\u20B9{{scheme.amount}}</div>\r\n </div>\r\n </div>\r\n </label>\r\n </div>\r\n <div class=\"reedem_error d-flex justify-content-center align-items-center\" *ngIf=\"showReedemError\">\r\n Please add more \u20B9{{vaildAmount}} to reedem this scheme\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}.reedem-section{padding:10px 15px;border-radius:15px;background:#f6f3f9;box-shadow:#b2b2ca80 2px 2px 6px;font-weight:700;font-size:13px}.redeem-section-text{font-size:.9rem;font-weight:700}.form-check-input:checked{background-color:#28a745!important;border-color:#28a745!important}.form-check-input:focus{border-color:#28a745!important;outline:0;box-shadow:none!important}.close-btn{background:none;border:none;font-size:24px;color:#6b7280;cursor:pointer;padding:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center}.close-btn:hover{color:#374151}.select_matured_text{font-size:.8rem!important;margin-top:10px;color:#05aacf}.position-relative{position:relative}.cart-parent{display:flex;margin-top:15px}.left-panel{width:65%;padding-right:5rem;border-right:1px solid #E9E9E9}.timeline{cursor:pointer}.cart-items{background:#fff;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.cart-header{padding:16px 24px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.cart-header h2{margin:0;font-size:18px;font-weight:500;color:#0f172a}.cart-item{display:flex!important;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;gap:20px;padding:0 8px;transition:background .2s}.cart-item:hover{background:#fbfcfe}.item-left{display:flex;align-items:center;flex:1}.item-right{display:flex;align-items:center;padding:15px;gap:32px}.item-image img{width:64px;height:64px;border-radius:12px;object-fit:cover;border:1px solid #f1f5f9}.item-details{display:flex;flex-direction:column;gap:4px}.item-title{margin:0;font-size:15px;font-weight:600;color:#0f172a;line-height:1.4}.item-subtitle{font-size:13px;color:#64748b;font-weight:400}.quantity-control{display:flex;align-items:center;border:1.5px solid #e2e8f0;border-radius:7px;overflow:hidden;height:38px;background:#fff;width:fit-content}.qty-btn{width:38px;height:100%;border:none;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#475569;transition:all .2s ease}.qty-btn:hover{background:#f8fafc;color:#0f172a}.qty-btn mat-icon{font-size:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center}.qty-value{width:32px;height:100%;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:500;color:#0f172a;border-left:1.5px solid #e2e8f0;border-right:1.5px solid #e2e8f0}.item-price{font-size:18px;font-weight:700;color:#0f172a;min-width:60px;text-align:right;letter-spacing:-.01em}.delete-btn-circle{width:36px;height:36px;border-radius:50%;border:1px solid #fee2e2;background:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#ef4444;transition:all .2s ease}.delete-btn-circle:hover{background:#fef2f2;border-color:#fecaca;transform:scale(1.05);color:#dc2626}.delete-btn-circle svg{width:18px;height:18px}.isActive{color:#0267c1;font-weight:600}.bar{width:150px;border-top:2px solid lightgray;margin:0 5px}.right-panel{width:35%;padding-left:5rem}.my-bag{font-size:16px;font-weight:600;color:#000;margin-left:8px}.my-bag span{color:#939393}.coupons{display:flex;justify-content:space-between;padding:10px;border-radius:4px;box-shadow:0 0 1px #28293d14,0 0 2px #60617029;margin-bottom:15px;margin-top:10px;cursor:pointer}.coupon-list-section{padding:15px;width:400px;z-index:10000001!important}.coupon-list-section .search{padding:8px;border:1px solid lightgray;border-radius:20px;display:flex;justify-content:space-between}.coupon-list-section input{border:none;outline:none;width:90%}.coupon-list-section .coupon-list{height:60vh;width:100%}.item-parent{margin:10px 0;min-height:120px}.lh-23{line-height:23px;margin-left:10px}.item-name{color:#141514;font-size:16px;line-height:30px;font-weight:600}.price-with-tax{font-weight:400;font-size:16px;color:#626262}.item-sku{font-weight:400;font-size:14px;color:#626262}.item-price{display:flex;font-weight:600;font-size:16px;color:#141514}.product-img{border-radius:5px;height:100%;width:110px;padding:0;cursor:pointer}.quantity-box{display:flex;gap:5px;align-items:center;border:1px solid #E8E8E8;width:45px;height:22px}.quantity-box input{outline:none;text-align:center;border:none;width:30px;height:100%}.quantity-box .plus{font-size:20px;position:relative;top:-3px;font-weight:500}.quantity-box .minus{font-size:30px;position:relative;top:-3px;font-weight:500}.delete-item{color:#df2e2e;cursor:pointer;font-size:18px}.item-quantity{margin-top:5px;display:flex;min-width:90px;max-width:fit-content;border:1px solid lightgray;justify-content:space-between;align-items:center;padding:5px 10px;border-radius:3px}.coupon{display:flex;justify-content:space-between;border:1px solid #E8E8E8;border-radius:5px;padding:10px;margin-top:10px}.apply-coupon{font-weight:500;color:#626262;font-size:15px}.coupon-desc{color:#939393;font-size:12px;font-weight:500}.apply-coupon-btn{color:#0267c1;font-size:16px;font-weight:600}.price-details{padding:10px;margin-top:10px;border-radius:5px;box-shadow:0 0 1px #28293d14,0 0 2px #60617029;margin-bottom:15px}.price-parent-block{display:flex;justify-content:space-between;margin-top:5px}.price-type{font-weight:400;font-size:16px;color:#434443}.price-value{font-weight:500;font-size:18px;color:#141514}.button-parent{margin-top:20px;display:flex;flex-direction:column;gap:10px}hr{border:1px solid #E8E8E8}.btn{height:40px;font-size:16px!important}.delete-item{text-align:right;position:absolute;right:16px;bottom:10px}.quantity{display:flex;border:2px solid #E6E6E6;align-items:center;gap:15px;height:47px;margin-top:1rem;border-radius:5px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.label{color:#000}.total-container{min-height:80vh;position:relative;display:block!important;height:calc(100vh - 170px)}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%}.cart-image{width:13%;display:flex;margin-right:auto;margin-left:auto}.cart-image img{width:100%}.heading-medium{font-weight:600;color:#000}.description{font-size:18px;color:#7f7676;width:100%;text-align:center}.cart-window{padding:10px}.cart-window .small-product-img{width:55px;height:55px;border-radius:5px}.cart-window .small-items{display:flex;flex-direction:column;gap:10px;margin-top:15px;height:calc(100vh - 160px);overflow-y:auto}.cart-window .small-item{width:100%;display:flex;justify-content:space-between}.cart-window .small-item-name{width:200px}.cart-window .small-item-quantity{display:flex;align-items:center;justify-content:space-between;border-radius:5px;width:80px;background-color:#fafad2;padding:3px 8px;height:35px;font-weight:500;margin-right:3px}.cart-window .small-item-price{display:flex;flex-direction:column;gap:5px}.cart-window .small-item-price .price-with-tax{display:flex;font-size:13px!important}.cart-window .fotter-sec{background-color:#fff;position:absolute;bottom:0;left:0;width:100%;padding:10px}.cart-window .fotter-sec .payment-btn{border-radius:5px;border:none;display:flex;align-items:center;justify-content:center;background-color:#f08080;padding:10px 5px;color:#fff;cursor:pointer}.offers{background-color:#fff;display:flex;justify-content:space-between;padding:8px;border-radius:8px;box-shadow:#959da533 0 -1px 6px}.header-sec{font-size:26px}@media screen and (max-width: 475px){.cart-parent{flex-direction:column}.see-live-btn{white-space:nowrap!important}.left-panel{width:100%;padding-right:0rem}.right-panel{width:100%;z-index:1000;padding-left:0rem}.cart-image{width:42%}.description{width:84%}.heading-medium{font-size:28px}.item-price{white-space:nowrap;display:none}.product-img{width:82px}[class*=col-md]{padding-left:5px!important;padding-right:5px!important}.mobile-fixed{height:40px;font-size:16px!important;border:1px solid lightgray;width:100%;position:relative;bottom:10px}.empty-cart-container{height:calc(100vh - 130px)}.coupons-listing-section{width:100vw!important}.checkoutPage{flex-direction:column}.checkout-left-panel,.checkout-right-panel{width:100%!important}}.mobile-fixed{color:#fff}.coupons-listing-section{height:100vh;padding-top:0;position:relative;width:390px;z-index:100;background:#d3d3d354}.coupons-listing-section .coupon-heading{display:flex;align-items:center;background-color:#fff;padding:15px 20px;width:100%;box-sizing:border-box}.coupons-listing-section .coupon-heading img{height:15px;width:15px;position:relative;top:2px;cursor:pointer}.coupons-listing-section .coupon-heading .header-text{font-size:16px;color:#000;font-weight:600;margin-left:15px;position:relative;top:-3px;right:15px;cursor:pointer}.coupons-listing-section .coupon-search-sec{width:90%;box-sizing:border-box;margin:10px auto;border:1px solid lightgray;padding:10px;border-radius:10px;background-color:#fff;display:flex;font-size:16px;color:#000;font-weight:600}.coupons-listing-section .coupon-search-sec input{border:none;outline:none;background-color:transparent;width:95%;font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-search-sec input:focus{font-size:14px;color:#000;font-weight:600}.coupons-listing-section .coupon-search-sec .back-btn{position:relative;top:3px;cursor:pointer}.coupons-listing-section .coupon-search-sec .apply-btn-search{font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing{height:72%;overflow-y:auto;width:90%;margin:20px auto}.coupons-listing-section .coupon-listing .coupon-details{padding:15px;margin-bottom:15px;background-color:#edfffa;border-radius:10px;border:1px solid lightgray}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading{display:flex;flex-direction:column;gap:25px}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief{display:flex;justify-content:space-between;width:100%}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-name{font-size:16px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-desc{padding:5px 0;font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .show-details-btn{cursor:pointer}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-brief__right-sec{display:flex;justify-content:flex-end}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-brief__right-sec .apply-offer-btn{font-size:16px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-toggle-details-btn{text-align:left;text-decoration:underline;width:100%;font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details-divider{border-top:2px solid lightgray;opacity:.3;margin:15px 0}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-terms{font-size:14px;color:#000;font-weight:400}.empty-screen-container{height:100%;width:85%;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-screen-container .empty-screen__primary-text{font-size:22px;color:#000;font-weight:400}.empty-screen-container .empty-screen__secondary-text{text-align:center;padding:10px 0;font-size:16px;color:#000;font-weight:400}.empty-screen-container .empty-screen__button{width:90%;background-color:#fff;border-radius:8px;text-align:center;padding:10px;margin:10px auto 0;cursor:pointer;font-size:18px;color:#000;font-weight:400}.box-shadow{box-shadow:#00000029 0 1px 4px}.main-content{border-radius:12px;padding:0 30px 30px;width:100%;overflow:scroll;height:calc(100vh - 150px)}.delivery-options{display:flex;gap:20px;margin-bottom:30px}.delivery-option{padding:12px 24px;border:2px solid #e0e0e0;border-radius:25px;background:#fff;cursor:pointer;display:flex;align-items:center;gap:8px;font-weight:500;transition:all .2s}.delivery-option.active{background:#f0e6ff;border-color:#8b5cf6;color:#7c3aed}.delivery-option:hover{border-color:silver}.delivery-icon{width:16px;height:16px;background:#8b5cf6;border-radius:3px}.section-title{font-size:16px;font-weight:700;margin-bottom:20px;color:#000}.shipping-info{border-radius:10px;padding:20px;margin-bottom:20px;border:1px solid rgb(238,232,255);box-shadow:#0000000a 0 4px 8px}.delivery-date{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.delivery-date-text{color:#666;font-weight:500}.change-date-btn{color:#e91e63;background:none;border:none;font-weight:600;cursor:pointer;text-transform:uppercase;font-size:12px;letter-spacing:.5px}.address-info{margin-bottom:15px}.address-name{font-weight:700;margin-bottom:8px;color:#000}.address-details{color:#666;margin-bottom:8px}.mobile-number{font-weight:700;color:#000;font-size:15px}.change-address-btn{font-size:1rem!important;font-weight:700!important;padding:6px;background:#fff;border:1px solid rgb(229,221,255);border-radius:8px;color:#000;cursor:pointer;transition:all .2s;box-shadow:#0000000a 0 4px 8px}.change-address-btn:hover{border-color:#8b5cf6;color:#8b5cf6}.billing-section{margin-top:40px}.billing-options{display:flex;flex-direction:column;gap:15px;margin-top:20px}.billing-option{display:flex;align-items:center;gap:12px;padding:15px;border:2px solid #e0e0e0;border-radius:8px;cursor:pointer;transition:all .2s}.billing-option.active{background:#f0e6ff;border-color:#8b5cf6}.radio-btn{width:20px;height:20px;border:2px solid #e0e0e0;border-radius:50%;position:relative}.billing-option.active .radio-btn{border-color:#8b5cf6}.billing-option.active .radio-btn:after{content:\"\";width:10px;height:10px;background:#8b5cf6;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.order-summary{border-radius:12px;padding:25px;width:75%}.summary-title{font-size:16px;font-weight:700;margin-bottom:20px;color:#000}.product-item{display:flex;gap:15px;margin-bottom:20px;border-bottom:1px solid #f0f0f0;border-radius:7px;background:#fff;padding:15px}.product-item:last-of-type{border-bottom:none;margin-bottom:30px;padding-bottom:0}.product-image{max-width:110px;width:100%;height:100%;border-radius:8px}.product-details{flex:1}.product-name{font-weight:500;margin-bottom:4px;color:#2d3748;font-size:14px}.product-quantity{color:#666;font-size:12px;margin-bottom:8px}.product-price{font-weight:600;color:#2d3748}.delivery-info{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:11px;color:#8b5cf6}.delivery-icon-small{width:12px;height:12px;background:#8b5cf6;border-radius:2px}.price-breakdown{border-top:1px solid #f0f0f0;padding-top:20px}.price-row{display:flex;justify-content:space-between;margin-bottom:12px;color:#666}.price-row.total{font-weight:600;color:#2d3748;font-size:16px;margin-top:15px;padding-top:15px;border-top:1px solid #f0f0f0}.discount{color:#22c55e!important}@media (max-width: 768px){.container{grid-template-columns:1fr;padding:15px;gap:20px}.main-content,.order-summary{padding:20px;width:100%}.delivery-options{flex-direction:column;gap:10px}}.checkout-left-panel{width:65%;display:flex;justify-content:center}.checkout-right-panel{width:35%;display:flex;justify-content:center;background-color:#f9f9fa}.checkout-product{max-height:50vh;overflow:scroll}.mt-1{margin-top:1rem!important}.payment-btn{box-shadow:#0000000a 0 4px 8px}.addLinks{padding-bottom:8px;padding-top:9px;border:1px dashed;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:5px;height:25vh!important;margin-bottom:20px}.addLinks mat-icon{border:1px solid rgb(219,223,225);display:flex;border-radius:100%;align-items:center;justify-content:center;font-size:16px;color:#dbdfe1}.change-pincode{display:flex;gap:10px}.change-pincode mat-icon{font-size:18px;align-items:center;justify-content:center;display:flex}.change-pincode span{font-size:14px}.fs-13{font-size:13px}.fs-12{font-size:12px}.fs-18{font-size:18px}.b-1-b{border-width:0px 1px;border-style:solid;border-color:#000}.container{max-width:unset;padding:24px;display:flex;gap:24px;width:100%!important}.main-content{background:#fff;border-radius:12px;width:70%}.promo-banner{padding:16px 20px;display:flex;justify-content:space-between;align-items:center;border-radius:8px;border:1px solid #e2e8f0}.promo-text h3{font-size:16px!important;font-weight:500;margin-bottom:4px}.promo-text p{font-size:.9rem!important;margin-bottom:0!important;color:#64748b}.see-live-btn{background:#fff;border:1px solid #e2e8f0;font-weight:600;color:#000;padding:8px 16px;border-radius:8px;font-size:12px!important;cursor:pointer;display:flex;align-items:center;gap:8px;width:max-content!important;transition:all .2s ease;box-shadow:0 1px 2px #0000000d}.see-live-btn:hover{background:#f8fafc;border-color:#cbd5e1;transform:translateY(-1px)}.see-live-btn svg{color:#6366f1}.cart-item{display:flex;gap:16px;position:relative}.cart-item:last-child{border-bottom:none}.item-image{width:15%;height:100px;border-radius:8px;object-fit:cover;display:flex;align-items:center;justify-content:center}.item-details{flex:1}.item-title{font-weight:500;margin-bottom:8px}.item-price{display:flex;align-items:center;gap:8px}.current-price{font-size:1rem;font-weight:600}.original-price{font-size:1rem;text-decoration:line-through}.discount{background:#fef3c7;padding:2px 6px;border-radius:4px;font-size:12px;font-weight:500}.item-code{font-size:12px;color:#9ca3af;margin-bottom:8px}.item-options{display:flex;gap:16px;font-size:14px;color:#6b7280;margin-bottom:12px}.delivery-info{font-size:12px;color:#8b5cf6}.pickup-info{background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:5px 15px;margin-top:12px;display:flex;align-items:center;cursor:pointer;width:max-content;gap:20px}.pickup-text{font-size:.9rem;color:#374151}.remove-btn{position:absolute;top:16px;right:0;width:20px!important;height:20px;background:#000;color:#fff;border:none;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:10px!important}.sidebar{display:flex;flex-direction:column;gap:16px;width:32%}.coupon-section{border-radius:8px;padding:10px 15px;border:1px solid #e2e8f0;display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:all .2s ease}.coupon-section:hover{border-color:#cbd5e1;background-color:#f8fafc}.chevron-icon{color:#94a3b8;transition:transform .2s ease}.coupon-section:hover .chevron-icon{transform:translate(2px);color:#64748b}.scheme-section{border-radius:12px;padding:10px 15px;cursor:pointer}.coupon-left{display:flex;align-items:center;gap:12px}.coupon-icon{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center}.coupon-icon mat-icon{font-size:17px;width:17px!important;height:19px!important}.coupon-text{font-weight:700;font-size:.9rem}.delivery-section{background:#fff;border-radius:12px;padding:10px 15px;box-shadow:#b2b2ca80 2px 2px 6px;background:#f6f3f9}.delivery-header{display:flex;align-items:center;gap:12px;margin-bottom:4px}.delivery-header span{font-size:.9rem;font-weight:700}.delivery-header mat-icon{width:20px;height:20px;font-size:17px;position:relative;top:2px}.delivery-icon{width:20px;height:20px;background:#8b5cf6;border-radius:50%}.pincode{font-weight:600;color:#111827}.change-link{color:#ec4899;font-size:.9rem;text-decoration:none;margin-left:auto}.summary-section{background:#fff;border-radius:8px;padding:20px;border:1px solid #e2e8f0}.summary-title{font-size:16px;font-weight:700;color:#0f172a;margin-bottom:20px;letter-spacing:-.01em}.summary-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.summary-row:last-child{margin-bottom:0}.summary-label{font-size:14px;font-weight:400;color:#64748b}.summary-value{font-size:14px;font-weight:500;color:#0f172a}.summary-divider{height:1px;background:#f1f5f9;margin:16px 0;width:100%}.total-row .summary-label{font-size:16px;font-weight:600;color:#0f172a}.total-row .summary-value{font-size:16px;font-weight:700;color:#0f172a}.total-row{border-top:1px solid #e2e8f0;padding-top:15px;margin-top:15px}.total-label{font-weight:600;font-size:16px}.total-value{font-weight:700;font-size:18px}.place-order-btn{background:linear-gradient(135deg,#8b5cf6,#ec4899);color:#fff;border:none;border-radius:12px;padding:9px 10px;font-size:.9rem!important;font-weight:600;cursor:pointer;margin-top:10px;text-transform:uppercase}.place-order-btn:hover{opacity:.9}.chain-icon,.earring-icon{width:60px;height:60px;filter:sepia(1) hue-rotate(30deg) saturate(2)}.item-img{width:100%;height:100%;object-fit:cover}.mt-0{margin-top:0!important}select{outline:none;border-radius:5px;padding:2px;width:20%;border:none;box-shadow:#9999994d 2px 2px 6px;cursor:pointer}.cart-tab-parent{display:flex;justify-content:center}.cart-tabs{gap:10px;display:flex;justify-content:center;align-items:center;width:max-content;border-radius:8px;border:1px solid #e2e8f0}.cart-tabs div{padding:7px 10px;cursor:pointer;font-size:14px}.selected-cart-tab{margin:6px;background:#f1f5f9;border-radius:5px;color:#000!important;font-weight:500}.checkout-main-content{width:50%;padding:30px;border-radius:12px}@media screen and (max-width: 475px){.main-content{padding:0;height:auto!important}.cart-item{flex-direction:column!important;align-items:flex-start!important;padding:16px 12px!important;gap:16px!important}.item-left{width:100%!important;gap:16px!important;align-items:flex-start!important}.item-image{width:86px!important;height:86px!important;flex-shrink:0!important}.item-right{width:100%!important;justify-content:space-between!important;padding:0!important;gap:12px!important;margin-top:4px!important}.item-price{flex:1!important;text-align:right!important;margin-right:8px!important;font-size:16px!important}.item-title{font-size:14px!important;-webkit-line-clamp:2!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;overflow:hidden!important}.quantity-control{height:34px!important}.qty-btn{width:34px!important}.qty-value{width:28px!important;font-size:13px!important}.no-items{height:86vh;overflow:hidden;margin:0}.checkout-main-content{width:100%}.container{padding:0!important}.pickup-info{display:none}.container{display:flex;flex-direction:column}.promo-banner{gap:10px}select{width:50%}.main-content,.sidebar{width:100%}.vouchers-listing-section{min-width:unset!important;width:100vw!important}.separator{display:none!important}.coupon-meta{display:grid!important;grid-template-columns:1fr 1fr!important}}.group_invest{color:#000;font-size:.8rem}.reedem_error{color:red}.group_invest span{color:#05aacf}.redeem_amount{padding:2%;border-radius:4px;background:#fff;margin-top:2%;color:#000;font-size:.8rem}.redeem_amount span{color:#0dc577}.w-fit{width:fit-content!important}.modal-body{padding-bottom:0;overflow-y:scroll;max-height:300px;padding:0!important}.scheme-option{margin-bottom:16px}.scheme-option input[type=radio]:checked+.scheme-card{border-color:#06b6d4;background:#f0f9ff;position:relative}.scheme-option input[type=radio]:checked+.scheme-card:before{content:\"\";position:absolute;top:20px;left:20px;width:20px;height:20px;border:2px solid #06b6d4;border-radius:50%;background:#fff}.scheme-option input[type=radio]:checked+.scheme-card:after{content:\"\";position:absolute;top:26px;left:26px;width:8px;height:8px;background:#06b6d4;border-radius:50%}.scheme-card{justify-content:space-between;padding:10px;border:2px solid #e5e7eb;border-radius:8px;cursor:pointer;transition:all .2s ease;background:#fff;width:100%}.scheme-card:hover{border-color:#d1d5db;background:#f9fafb}.form-check-radio{width:10%}.scheme-title{font-size:12px;font-weight:600;color:#111827;margin-bottom:8px}.scheme-details{display:flex;gap:25px;margin-bottom:20px}.scheme-name{display:flex;justify-content:space-between}.scheme-details span{font-size:12px;color:#0000004d}.scheme-monthly{font-size:14px;font-weight:600;color:#111827;min-width:100px;text-align:right}.right-side{width:90%}.scheme-amount{font-weight:700}@media screen and (min-width: 700px){.cart-items{max-height:500px;overflow:scroll}}.add-to-cart-parent{width:max-content;border:1px solid #000000;border-radius:8px}.cursor{cursor:pointer}.cart-text{max-width:600px;margin:0 auto;text-align:center}.cart-text div{word-break:break-word;overflow-wrap:break-word;white-space:normal}.switch{position:relative;display:inline-block;width:45px;height:20px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:34px}.slider:before{position:absolute;content:\"\";height:16px;width:16px;left:3px;bottom:2px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#4caf50}input:checked+.slider:before{transform:translate(24px)}.vouchers-listing-section{position:relative;width:fit-content;min-width:500px;z-index:100;background:#fff;height:100vh}.vouchers-listing-section .coupon-heading{border-bottom:1px solid #eee}.vouchers-listing-section .coupon-listing{padding:12px 16px;overflow-y:auto;height:calc(97vh - 100px)}.voucher-details{background:#fff;border-radius:12px;padding:14px;box-shadow:0 1px 4px #00000042}.voucher-details .coupon-brief .apply-offer-btn{background:#111;color:#fff;border-radius:10px;padding:6px 16px}.voucher-details .coupon-code-box{border:1.5px dashed #bbb;border-radius:8px;padding:8px 12px;margin-bottom:10px}.voucher-details .coupon-code-box .code-label{font-size:11px;color:#888;margin-bottom:2px}.voucher-details .coupon-code-box .code-row .code-value{font-weight:700;font-size:15px;letter-spacing:1px}.voucher-details .coupon-meta .clock-icon{font-size:14px;height:14px;width:14px;vertical-align:middle}.applied-coupon-card{background:#f0fff8;border-radius:12px;padding:12px 16px}.applied-coupon-card .applied-coupon-left .success-check{color:#22c55e;font-size:22px}.applied-coupon-card .applied-coupon-left .applied-coupon-code{font-weight:700;font-size:14px}.applied-coupon-card .applied-coupon-left .applied-coupon-saving{font-size:13px;color:#097d5f;margin-top:2px}.active-type{background:#111!important;color:#fff!important}.redemption-type{text-align:center;border-radius:10px;padding:6px 16px;background:#d3d3d36b;width:-webkit-fill-available!important}.wallte_icon{background:#000;border-radius:50px;padding:5px 9px 7px}.wallte_icon img{width:18px;height:18px}.fw-600{font-weight:600}.coupon-type{width:fit-content!important;border-radius:26px!important;background:transparent!important;border:1px solid #afafaf;color:#393838;text-align:center;padding:6px 16px}.active-coupon{background:transparent!important;border:2px solid black!important;color:#000!important}.my-close-btn{position:absolute!important;top:10px!important;right:10px!important}\n"] }]
1117
+ ], providers: [MessageService], template: "<ng-container *ngIf=\"!isLoading\">\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n\n <ng-container *ngIf=\"data\">\n <section [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" [id]=\"data?.id\"\n [attr.class]=\"isMobile ? 'py-5 position-relative' : 'position-relative'\" simpoHover\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\"\n [ngClass]=\"!responseData?.orderedItems?.length ? 'no-items' : ''\">\n <div class=\"d-flex align-items-center justify-content-center m-auto mb-4\"\n [style.marginTop.px]=\"isMobile ? '': '50'\" [style.width.%]=\"isMobile ? '90' : ''\"\n *ngIf=\"responseData?.orderedItems?.length && currentTab === 'ADDRESS'\">\n <span class=\"timeline\" (click)=\"currentTab = 'BAG'\">Bag</span>\n <div class=\"bar\"></div>\n <span class=\"timeline isActive\">Address</span>\n <div class=\"bar\"></div>\n <span class=\"timeline\" style=\"cursor: auto;\">Payment</span>\n </div>\n <div class=\"cart-tab-parent w-100\" *ngIf=\"currentTab == 'BAG' && ecomConfigs?.appointmentBookingEnabled\">\n <!-- && ecomConfigs?.appointmentBookingEnabled\" -->\n <div class=\"cart-tabs\" [id]=\"data?.id\">\n <div class=\"selected-cart-tab\" [ngClass]=\"{'selected-cart-tab': cartType==='SHOPPING'}\"\n (click)=\"cartType='SHOPPING'\">Shopping Cart ({{responseData?.orderedItems?.length ?? 0}})</div>\n <div [ngClass]=\"{'selected-cart-tab': cartType==='TRIAL'}\" (click)=\"cartType='TRIAL'\">Trial Cart\n ({{trialCartItem?.length ?? 0}})</div>\n </div>\n </div>\n <div class=\"cart-parent\" [spacingHorizontal]=\"stylesLayout\" *ngIf=\"currentTab === 'BAG'\" [id]=\"data?.id\"\n [simpoAnimation]=\"styles?.animation\">\n <ng-container>\n <ng-container *ngIf=\"cartType === 'SHOPPING'\">\n <ng-container\n *ngTemplateOutlet=\"(responseData?.orderedItems?.length || 0) > 0 ? CARTPAGE : EMPTYITEM\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"cartType === 'TRIAL'\">\n <ng-container *ngTemplateOutlet=\"(trialCartItem?.length || 0) > 0 ? CARTPAGE : EMPTYITEM\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n <div class=\"d-flex checkoutPage\"\n *ngIf=\"(responseData?.orderedItems?.length || 0) > 0 && currentTab === 'ADDRESS'\">\n <ng-container *ngTemplateOutlet=\"CHECKOUTPAGE\">\n </ng-container>\n </div>\n\n\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\n [isEcommerce]=\"true\"></simpo-hover-elements>\n </div>\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\n </div>\n\n </section>\n </ng-container>\n <ng-container *ngIf=\"!data\">\n <section class=\"cart-window\">\n <div class=\"heading-large lh-2 mb-3 header-sec\">\n <div class=\"d-flex align-items-center\">\n <mat-icon (click)=\"closeWindow()\">keyboard_arrow_left</mat-icon>\n <span>Your Cart</span>\n </div>\n <div class=\"saving\"></div>\n </div>\n <div class=\"offers\">\n <div class=\"d-flex align-items-center\" style=\"gap: 5px;\">\n <img src=\"https://i.postimg.cc/htY55sqY/discount.png\" alt=\"\" height=\"20\" width=\"20\">\n <span>Avail Offers / Coupons</span>\n </div>\n <mat-icon>keyboard_arrow_right</mat-icon>\n </div>\n <div class=\"small-items\">\n <ng-container *ngFor=\"let item of responseData?.orderedItems\">\n <div class=\"small-item\">\n <div class=\"d-flex\" style=\"gap: 5px;\">\n <div class=\"h-100\" style=\"padding: 0px; width: fit-content;\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n class=\"small-product-img\"\n [src]=\"item.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" alt=\"\"\n (click)=\"goToProductDetails(item)\">\n </div>\n <div class=\"small-item-name trim-text\">{{ item.itemName | titlecase }}</div>\n <div class=\"small-item-quantity\">\n <span class=\"cursor\">-</span>\n <span>{{item.quantity}}</span>\n <span class=\"cursor\">+</span>\n </div>\n <div class=\"small-item-price\">\n <div class=\"price-with-tax\">\n <span [innerHTML]='currency'></span> {{(item.sellingPrice) | number: '1.0-2'}}\n </div>\n <!-- <div class=\"price-with-tax\">\n <span [innerHTML]='currency'></span> {{(item.selling) | number: '1.0-2'}}\n </div> -->\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"fotter-sec\">\n <div class=\"delivery-add d-flex\">\n <mat-icon>home</mat-icon>\n <div class=\"address\">Tetsting</div>\n </div>\n <button class=\"payment-btn\" [disabled]=\"cartInfo.addressDetails\" (click)=\"proceedToCheckout()\"> <span\n style=\"margin-right: 5px;\">Click to Pay</span> <span [innerHtml]='currency'></span>\n {{(responseData?.totalAmount ?? 0) | number: '1.0-2'}}</button>\n </div>\n </section>\n </ng-container>\n</ng-container>\n\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '40vh',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n}\">\n</ngx-skeleton-loader>\n\n<ng-template #CouponList>\n <section class=\"coupons-listing-section\">\n <div class=\"coupon-heading\">\n <div class=\"back-btn\" (click)=\"closeDialogRef()\">\n <mat-icon>keyboard_arrow_left</mat-icon>\n </div>\n <div class=\"header-text\">Apply Coupon</div>\n </div>\n <!-- <div class=\"coupon-search-sec\">\n <input type=\"text\" placeholder=\"Type Coupon Code\" [(ngModel)]=\"enteredCouponCode\">\n <div class=\"apply-btn-search\" (click)=\"searchIfApplicable()\">Apply</div>\n </div> -->\n <div class=\"coupon-listing\">\n <ng-container *ngIf=\"couponList.length > 0; else showEmptyScreen\">\n <ng-container *ngFor=\"let couponDetails of couponList; let idx = index\">\n <div class=\"coupon-details\"\n [ngStyle]=\"{'background-color': !couponDetails.applicable ? '#FFF2F4' : '#EDFFFA'}\"\n *ngIf=\"couponDetails?.status\">\n <div class=\"details__coupon-heading\">\n <div class=\"coupon-brief\">\n <div class=\"coupon-brief__left-sec\">\n <div class=\"coupon-name\" [ngStyle]=\"{'color': !couponDetails.applicable ? '#DB1A1A' : '#097D5F'}\">\n {{ couponDetails.couponCode | uppercase }}</div>\n <div class=\"coupon-desc\">{{ couponDetails.discountDescription | titlecase }}</div>\n </div>\n <div class=\"coupon-brief__right-sec\">\n <div class=\"apply-offer-btn\" [style.opacity]=\"couponDetails.applicable ? '1' : '0.3'\"\n [ngStyle]=\"{'cursor': couponDetails.applicable ? 'pointer' : ''}\"\n (click)=\"applyCoupon(couponDetails)\">Apply</div>\n </div>\n </div>\n <!-- <div class=\"coupon-toggle-details-btn\" (click)=\"couponDetails.status = !couponDetails.status\">\n <span class=\"hide-details-btn\" *ngIf=\"couponDetails.status\">Hide details</span>\n <div class=\"show-details-btn\" *ngIf=\"!couponDetails.status\">View details</div>\n </div> -->\n </div>\n <ng-container>\n <!-- *ngIf=\"couponDetails.status\" -->\n <div class=\"details-divider\"></div>\n <ul class=\"details__coupon-terms\">\n <li>Offer valid from {{ couponDetails.validFrom | date }} - {{ couponDetails.validTo | date }}</li>\n </ul>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #showEmptyScreen>\n <div class=\"empty-screen-container\">\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\n <div class=\"empty-screen__primary-text\">No Coupon Available</div>\n <div class=\"empty-screen__secondary-text\">\n Looks like there are no coupons at the moment\n </div>\n <!-- <div class=\"empty-screen__button\">Explore</div> -->\n </div>\n </ng-template>\n </div>\n </section>\n</ng-template>\n\n<ng-template #RedemptionVouchers>\n <section class=\"vouchers-listing-section d-flex flex-column\">\n <div class=\"coupon-heading d-flex align-items-center gap-2 p-3 fs-18 fw-600 border-bottom\">\n <div class=\"back-btn cursor-pointer d-flex align-items-center\" (click)=\"closeDialogRef()\">\n <mat-icon>keyboard_arrow_left</mat-icon>\n </div>\n <div class=\"header-text\">Coupons & Vouchers</div>\n </div>\n\n <!-- <div class=\"d-flex align-items-center tab-container justify-content-between gap-2 p-3\">\n <div class=\"redemption-type fs-16 fw-500 cursor-pointer\" [ngClass]=\"{'active-type': redemptionType === 'COUPONS'}\"\n (click)=\"redemptionType = 'COUPONS'\">\n Coupons\n </div>\n <div class=\"redemption-type fs-16 fw-500 cursor-pointer\" [ngClass]=\"{'active-type': redemptionType === 'VOUCHERS'}\"\n (click)=\"redemptionType = 'VOUCHERS'\">\n Vouchers\n </div>\n </div> -->\n\n <div class=\"coupon-listing d-flex flex-column gap-3 pt-3\" *ngIf=\"redemptionType === 'COUPONS'\">\n <div class=\"d-flex align-items-center tab-container gap-3\">\n <div class=\"coupon-type fs-16 fw-500 cursor-pointer\"\n [ngClass]=\"{'active-coupon': redemptionCouponType === 'REWARDS'}\" (click)=\"redemptionCouponType = 'REWARDS'\">\n Rewards\n </div>\n <div class=\"coupon-type fs-16 fw-500 cursor-pointer\"\n [ngClass]=\"{'active-coupon': redemptionCouponType === 'DISCOUNTS'}\"\n (click)=\"redemptionCouponType = 'DISCOUNTS'\">\n Discounts\n </div>\n </div>\n <ng-container *ngIf=\"redemptionCouponType === 'REWARDS'\">\n <ng-container *ngIf=\"(listRedemptionCoupons?.vouchers?.length > 0) ; else showEmptyScreen\">\n <ng-container *ngFor=\"let voucher of listRedemptionCoupons?.vouchers; let idx = index\">\n <div class=\"voucher-details\" *ngIf=\"!voucher.utilised\">\n\n <div class=\"coupon-brief d-flex justify-content-between align-items-start mb-3\">\n <div class=\"coupon-brief__left-sec\">\n <div class=\"coupon-name fs-16 fw-600 mb-1\">{{ voucher.voucherName }}</div>\n <div class=\"coupon-desc fs-12 text-secondary\">\n Get {{ voucher.couponValueType === 'FIXED' ? '\u20B9' + voucher.couponValue : voucher.couponValue + '%'\n }}\n off on your payment\n </div>\n </div>\n <div class=\"coupon-brief__right-sec\">\n <div class=\"apply-offer-btn fs-12 fw-600 cursor-pointer\" (click)=\"applyRedemptionCoupon(voucher)\">\n Apply</div>\n </div>\n </div>\n\n <div class=\"coupon-code-box d-flex align-items-center gap-3\">\n <div class=\"code-label\">Code</div>\n <div class=\"code-value\">{{ voucher.voucherCode }}</div>\n </div>\n\n <div class=\"coupon-meta d-flex align-items-center gap-2 fs-12 text-secondary mb-2\">\n <span class=\"min-order\">Min: \u20B9{{ voucher.minOrderValue | number }}</span>\n <span class=\"separator text-secondary\">|</span>\n <span class=\"validity\">\n <mat-icon class=\"clock-icon\">schedule</mat-icon>\n Until {{ voucher.issuedDate | date: 'MMM dd, yyyy' }}\n </span>\n <span class=\"separator text-secondary\" *ngIf=\"voucher.maxRedeemableAmount\">|</span>\n <span class=\"min-order\" *ngIf=\"voucher.maxRedeemableAmount\">Max Redeemable Amount: \u20B9{{\n voucher.maxRedeemableAmount | number }}</span>\n </div>\n\n <!-- <div class=\"terms-link\">View terms & conditions</div> -->\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"redemptionCouponType === 'DISCOUNTS'\">\n <ng-container *ngIf=\"(couponList.length > 0); else showEmptyDiscounts\">\n <ng-container *ngFor=\"let couponDetails of couponList; let idx = index\">\n <div class=\"voucher-details\" *ngIf=\"couponDetails?.status\">\n\n <div class=\"coupon-brief d-flex justify-content-between align-items-start mb-3\">\n <div class=\"coupon-brief__left-sec\">\n <div class=\"coupon-name fs-16 fw-600 mb-1\"\n [ngStyle]=\"{'color': !couponDetails.applicable ? '#DB1A1A' : '#097D5F'}\">\n {{ couponDetails.couponCode | uppercase }}\n </div>\n <div class=\"coupon-desc fs-12 text-secondary\">\n {{ couponDetails.discountDescription | titlecase }}\n </div>\n </div>\n <div class=\"coupon-brief__right-sec\">\n <div class=\"apply-offer-btn fs-12 fw-600 cursor-pointer\"\n [style.opacity]=\"couponDetails.applicable ? '1' : '0.3'\"\n [ngStyle]=\"{'cursor': couponDetails.applicable ? 'pointer' : 'not-allowed'}\"\n (click)=\"applyCoupon(couponDetails)\">\n Apply\n </div>\n </div>\n </div>\n\n <div class=\"coupon-code-box d-flex align-items-center gap-3\">\n <div class=\"code-label\">Code</div>\n <div class=\"code-value\">{{ couponDetails.couponCode | uppercase }}</div>\n </div>\n\n <div class=\"coupon-meta d-flex align-items-center gap-2 fs-12 text-secondary mb-2\">\n <span class=\"validity\">\n <mat-icon class=\"clock-icon\">schedule</mat-icon>\n {{ couponDetails.validFrom | date }} - {{ couponDetails.validTo | date }}\n </span>\n </div>\n\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template #showEmptyDiscounts>\n <div class=\"empty-screen-container\">\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\n <div class=\"empty-screen__primary-text\">No Discount Coupons Available</div>\n <div class=\"empty-screen__secondary-text\">\n Looks like there are no discount coupons at the moment\n </div>\n <!-- <div class=\"empty-screen__button\">Explore</div> -->\n </div>\n </ng-template>\n\n <ng-template #showEmptyScreen>\n <div class=\"empty-screen-container\">\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\n <div class=\"empty-screen__primary-text\">No Coupons Available</div>\n <div class=\"empty-screen__secondary-text\">Looks like there are no coupons</div>\n </div>\n </ng-template>\n </div>\n\n <div class=\"coupon-listing d-flex flex-column gap-3\" *ngIf=\"redemptionType === 'VOUCHERS'\">\n <ng-container *ngIf=\"listRedemptionVouchers?.vouchers?.length > 0; else showEmptyScreen\">\n <ng-container *ngFor=\"let voucher of listRedemptionVouchers?.vouchers; let idx = index\">\n <div class=\"voucher-details\" *ngIf=\"!voucher.utilised\">\n\n <div class=\"coupon-brief d-flex justify-content-between align-items-start mb-3\">\n <div class=\"coupon-brief__left-sec\">\n <div class=\"coupon-name fs-16 fw-600 mb-1\">{{ voucher.voucherName }}</div>\n <div class=\"coupon-desc fs-12 text-secondary\">\n Get {{ voucher.couponValueType === 'FIXED' ? '\u20B9' + voucher.couponValue : voucher.couponValue + '%' }}\n off on your payment\n </div>\n </div>\n <div class=\"coupon-brief__right-sec\">\n <div class=\"apply-offer-btn fs-12 fw-600 cursor-pointer\" (click)=\"applyRedemptionCoupon(voucher)\">Apply\n </div>\n </div>\n </div>\n\n <div class=\"coupon-code-box d-flex align-items-center gap-3\">\n <div class=\"code-label\">Code</div>\n <div class=\"code-value\">{{ voucher.voucherCode }}</div>\n </div>\n\n <div class=\"coupon-meta d-flex align-items-center gap-2 fs-12 text-secondary mb-2\">\n <span class=\"min-order\">Min: \u20B9{{ voucher.minOrderValue | number }}</span>\n <span class=\"separator text-secondary\">|</span>\n <span class=\"validity\">\n <mat-icon class=\"clock-icon\">schedule</mat-icon>\n Until {{ voucher.issuedDate | date: 'MMM dd, yyyy' }}\n </span>\n </div>\n\n <!-- <div class=\"terms-link\">View terms & conditions</div> -->\n </div>\n </ng-container>\n </ng-container>\n\n <ng-template #showEmptyScreen>\n <div class=\"empty-screen-container\">\n <img loading=\"lazy\" src=\"../../../../../assets/common/coupon-empty-img.svg\" alt=\"\">\n <div class=\"empty-screen__primary-text\">No Vouchers Available</div>\n <div class=\"empty-screen__secondary-text\">Looks like there are no vouchers</div>\n </div>\n </ng-template>\n </div>\n </section>\n</ng-template>\n\n<ng-template #CARTPAGE>\n <div class=\"container\">\n <div class=\"main-content\">\n <div class=\"cart-items\">\n <div class=\"cart-header\">\n <h2>Your Cart</h2>\n </div>\n <ng-container\n *ngTemplateOutlet=\"CARTITEM;context:{data: cartType === 'SHOPPING' ? responseData?.orderedItems : trialCartItem}\"></ng-container>\n </div>\n </div>\n\n <div class=\"sidebar\">\n <div class=\"reedem-section d-flex flex-column align-items-center\" *ngIf=\"cartType != 'TRIAL' && getUrl()\">\n <div class=\"justify-content-between d-flex align-items-center w-100 redeem-section-text\">Redeem Section Amount\n <div class=\"toogle-switch\">\n <div class=\"form-check form-switch\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" role=\"switch\" id=\"flexSwitchCheckChecked\"\n [checked]=\"selectMatureScheme\" (change)=\"onToggleChange()\">\n </div>\n </div>\n </div>\n <!-- <div class=\"select_matured_text w-100 text-start cursor-pointer\"\n *ngIf=\"selectMatureScheme && !selectedRedemption\" (click)=\"selectScheme()\">\n Select Matured Scheme\n </div> -->\n <!-- <div class=\"select_matured_text d-flex flex-column gap-2 w-100 text-start cursor-pointer\"\n *ngIf=\"selectedRedemption\">\n Selected Scheme\n <div class=\"d-flex w-100 justify-content-between align-items-center group_invest\">Group Investment\n scheme-5000/M <span>Change</span></div>\n <div class=\"d-flex justify-content-between align-items-center w-100 redeem_amount\">Redeemable Amount\n <span>\u20B9{{selectedRedmpationData.selectedAmount}}</span>\n </div>\n </div> -->\n </div>\n <div class=\"scheme-section\" *ngIf=\"selectMatureScheme\">\n <ng-container *ngTemplateOutlet=\"SCHEME_REDEMPTION\"></ng-container>\n </div>\n <div class=\"coupon-section\" [id]=\"data?.id\" *ngIf=\"cartType === 'SHOPPING' && !referEarnExist\">\n <div class=\"coupon-left\">\n <div class=\"coupon-icon\"><mat-icon>percent</mat-icon></div>\n <span class=\"coupon-text\" *ngIf=\"!responseData.billdetails?.couponId\">Apply\n Coupon</span>\n <span class=\"coupon-text\" *ngIf=\"responseData.billdetails?.couponId\">Coupon\n Applied</span>\n </div>\n <svg *ngIf=\"!responseData.billdetails?.couponId\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" class=\"chevron-icon\" (click)=\"openDialog(CouponList)\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n <span *ngIf=\"responseData.billdetails?.couponId\"\n (click)=\"removeCoupon($event)\"><mat-icon>close</mat-icon></span>\n </div>\n\n <div class=\"promo-banner mb-3\" [id]=\"data?.id\" *ngIf=\"cartType === 'SHOPPING' && ecomConfigs?.videoCallEnabled\">\n <div class=\"promo-text\">\n <h3>See It Before You Buy It</h3>\n <p>Experience our designs in detail via video call</p>\n </div>\n <button class=\"see-live-btn\" (click)=\"scheduleVideoCall(responseData?.orderedItems)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"lucide lucide-video\">\n <path d=\"m22 8-6 4 6 4V8Z\" />\n <rect width=\"14\" height=\"12\" x=\"2\" y=\"6\" rx=\"2\" ry=\"2\" />\n </svg>\n SEE IT LIVE\n </button>\n </div>\n\n <div class=\"plan-details-container p-3 rounded-4 bg-white text-dark voucher-details\"\n *ngIf=\"referEarnExist && this?.redemptionPoints?.availablePoints > 0\">\n <div class=\"fs-14 fw-500\">\n Rewards Available\n </div>\n <div class=\"d-flex justify-content-between align-items-start border-bottom pb-2\">\n <div class=\"avb_pts mt-2 mb-2\">\n <span class=\"fs-16 fw-500 total_points text-secondary\">\n <span class=\" fs-18 fw-600 text-dark\">{{(this?.redemptionPoints?.availablePoints || 0).toFixed(2)}}</span>\n pts\n </span>\n <div class=\"total_value fs-12 text-secondary\">\n = max \u20B9{{(this?.redemptionPoints?.pointsConvertedRupees || 0).toFixed(2)}} discount\n </div>\n </div>\n <div class=\"wallte_icon\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/777779c1775200561187wallet_(1).png\" alt=\"\">\n </div>\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\n <div class=\"redemable_text\">\n <div class=\"title_text\">\n <div class=\"fs-14 fw-500\">\n Redeem Points\n </div>\n <div class=\"fs-13 fs-400\">\n Use your points for discount\n </div>\n </div>\n </div>\n <div class=\"toggle_btn\">\n <label class=\"switch\">\n <input type=\"checkbox\" id=\"toggleSwitch\" [checked]=\"isPointsRedeeming\"\n (click)=\"onPointsRedeemingChange($event)\" />\n <span class=\"slider\"></span>\n </label>\n </div>\n </div>\n <div class=\"mt-3 success_selected w-100 applied-coupon-card\" *ngIf=\"isPointsRedeeming\">\n <div class=\"d-flex align-items-start gap-2\">\n <div class=\"success_icon\">\n <mat-icon class=\"d-flex justify-content-center align-items-center text-success\">check_circle</mat-icon>\n </div>\n <div class=\"success_text\">\n <div class=\"fs-13 fw-500\">\n You're saving \u20B9\n {{totalSavingAmt || 0}}\n </div>\n <div class=\"fs-12 fs-400 text-success\">\n {{totalSavingPoints}} points remaining after redemption\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Existing coupon row (keep as-is) -->\n <div class=\"coupon-section d-flex flex-column voucher-details\" [id]=\"data?.id\"\n *ngIf=\"cartType === 'SHOPPING' && referEarnExist\">\n <div class=\"d-flex justify-content-between align-items-center w-100\">\n <div class=\"coupon-left\">\n Apply Coupon\n </div>\n <div (click)=\"addRedemptionCoupon(RedemptionVouchers)\">View All</div>\n </div>\n\n <!-- Applied Coupon Success Banner -->\n <div class=\"applied-coupon-card w-100 mt-3 d-flex align-items-center justify-content-between\"\n *ngIf=\"selectedVoucherId\">\n <div class=\"applied-coupon-left d-flex align-items-center gap-3\">\n <mat-icon class=\"success-check\">check_circle</mat-icon>\n <div class=\"applied-coupon-info\">\n <div class=\"applied-coupon-code\">Coupon {{ selectedVoucherCode }} applied!</div>\n <div class=\"applied-coupon-saving\">You're saving\n <span *ngIf=\"this.couponValueType === 'AMOUNT'\">\u20B9 {{selectedVoucherAmount || 0}}</span>\n <span *ngIf=\"this.couponValueType === 'PERCENTAGE'\"> {{selectedVoucherPercentage || 0}}%</span>\n </div>\n\n </div>\n </div>\n <div class=\"remove-coupon-btn fs-14 fw-500 text-secondary cursor-pointer\"\n (click)=\"removeRedemptionCoupon($event)\">Remove</div>\n </div>\n </div>\n\n <div class=\"delivery-section\" *ngIf=\"getUrl()\">\n <div class=\"delivery-header\">\n <mat-icon>gps_fixed</mat-icon>\n <span *ngIf=\"cartType === 'SHOPPING'\">Delivering to</span>\n <span *ngIf=\"cartType === 'TRIAL'\">Trial Location at</span>\n <span class=\"pincode\">{{pincode}}</span>\n <!-- <a class=\"change-link\">Change Pincode</a> -->\n </div>\n </div>\n\n <div class=\"summary-section\">\n <div class=\"summary-title\">Summary</div>\n\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING'\">\n <span class=\"summary-label\">Subtotal</span>\n <span class=\"summary-value\">\u20B9{{(responseData?.billdetails?.totalNetValue ?? 0) | number: '1.0-2'}}</span>\n </div>\n\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING' && referEarnExist && isPointsRedeeming\">\n <span class=\"summary-label\">Points Redeemed</span>\n <span class=\"summary-value\">- \u20B9{{ totalSavingAmt || 0 }}</span>\n </div>\n\n <div class=\"summary-row\"\n *ngIf=\"cartType === 'SHOPPING' && referEarnExist && (this.couponValueType === 'AMOUNT' && appliedVoucher)\">\n <span class=\"summary-label\">Voucher Applied</span>\n <span class=\"summary-value\">- \u20B9{{ selectedVoucherAmount || 0 }}</span>\n </div>\n\n <div class=\"summary-row\"\n *ngIf=\"cartType === 'SHOPPING' && referEarnExist && (this.couponValueType === 'PERCENTAGE' && appliedVoucher)\">\n <span class=\"summary-label\">Voucher Applied</span>\n <span class=\"summary-value\">- \u20B9{{ percentageReduced || 0 }}</span>\n </div>\n\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING' && responseData?.billdetails?.discountAmount\">\n <span class=\"summary-label\">Discount Amount</span>\n <span class=\"summary-value\">\n {{('\u20B9' + (responseData?.billdetails?.discountAmount | number: '1.0-2')) }}\n </span>\n </div>\n\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING'\">\n <span class=\"summary-label\">Shipping</span>\n <span class=\"summary-value\"\n [ngClass]=\"{'savings': !responseData?.billdetails?.deliveryCharges || responseData.billdetails.deliveryCharges <= 0}\">\n {{ (responseData?.billdetails?.deliveryCharges && responseData.billdetails.deliveryCharges > 0) ? ('\u20B9' +\n (responseData.billdetails.deliveryCharges | number: '1.0-2')) : 'Free' }}\n </span>\n </div>\n\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING'\">\n <span class=\"summary-label\">Estimated Tax</span>\n <span class=\"summary-value\">\u20B9{{((!responseData.billdetails?.couponId ?\n responseData?.billdetails?.totalTax : responseData?.billdetails?.totalTaxAfterDiscount) ?? 0) |\n number: '1.0-2'}}</span>\n </div>\n\n <div class=\"summary-row total-row\" *ngIf=\"cartType === 'SHOPPING'\">\n <span class=\"summary-label\">Total</span>\n <!-- <span class=\"summary-value\">\u20B9{{ responseData?.totalAmount | number: '1.0-2' }}</span> -->\n <span class=\"total-value\" *ngIf=\"!isPointsRedeeming && !appliedVoucher\">\u20B9{{ responseData?.totalAmount |\n number: '1.0-2' }}</span>\n\n <span class=\"total-value\" *ngIf=\"isPointsRedeeming\">\u20B9{{ (responseData?.totalAmount - (totalSavingAmt || 0)) |\n number: '1.0-2' }}</span>\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'AMOUNT'\">\u20B9{{(responseData?.totalAmount -\n (selectedVoucherAmount || 0)) | number:\n '1.0-2'}}</span>\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'PERCENTAGE'\">\u20B9{{(responseData?.totalAmount -\n (percentageReduced || 0)) | number:\n '1.0-2' }}</span>\n </div>\n\n <!-- Trial Cart Summary -->\n <ng-container *ngIf=\"cartType === 'TRIAL'\">\n <div class=\"summary-row\">\n <span class=\"summary-label\">Free Trial</span>\n <span class=\"summary-value\">\u20B90</span>\n </div>\n <div class=\"summary-row\">\n <span class=\"summary-label\">Service Charge</span>\n <span class=\"summary-value savings\">Free</span>\n </div>\n <div class=\"summary-divider\"></div>\n <div class=\"summary-row total-row\">\n <span class=\"summary-label\">Total</span>\n <span class=\"summary-value\">\u20B90</span>\n </div>\n <!-- <span class=\"total-value\" *ngIf=\"!isPointsRedeeming && !appliedVoucher\">\u20B9{{ responseData?.totalAmount |\n number: '1.0-2' }}</span>\n\n <span class=\"total-value\" *ngIf=\"isPointsRedeeming\">\u20B9{{ (responseData?.totalAmount - (totalSavingAmt || 0)) |\n number: '1.0-2' }}</span>\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'AMOUNT'\">\u20B9{{(responseData?.totalAmount -\n (selectedVoucherAmount || 0)) | number:\n '1.0-2'}}</span>\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'PERCENTAGE'\">\u20B9{{(responseData?.totalAmount -\n (percentageReduced || 0)) | number:\n '1.0-2' }}</span> -->\n </ng-container>\n </div>\n <button class=\"place-order-btn\" (click)=\"edit ? '' : proceedToListPage()\" simpoButtonDirective\n [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\n *ngIf=\"cartType === 'SHOPPING'\" [appButtonEditor]=\"edit ?? false\"\n [backgroundInfo]=\"styles?.background\">{{data?.action?.buttons?.[1]?.content?.label ?? 'Continue\n Shopping'}}</button>\n <button class=\"place-order-btn mt-0\" (click)=\"edit ? '' : proceedToCheckout()\" simpoButtonDirective\n *ngIf=\"cartType === 'SHOPPING'\" [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\"\n [color]=\"data?.styles?.background?.accentColor\" [appButtonEditor]=\"edit ?? false\"\n [backgroundInfo]=\"styles?.background\">{{data?.action?.buttons?.[0]?.content?.label ?? 'Checkout\n Cart'}}</button>\n <button class=\"place-order-btn mt-0\" simpoButtonDirective *ngIf=\"cartType === 'TRIAL'\"\n [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\n [appButtonEditor]=\"edit ?? false\" [backgroundInfo]=\"styles?.background\" (click)=\"bookAppointment()\">BOOK\n APPOINTMENT</button>\n\n </div>\n </div>\n <!-- <ng-container *ngIf=\"recommededData?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\"\n [responseData]=\"recommededData\"></simpo-featured-products>\n </ng-container> -->\n</ng-template>\n<ng-template #CHECKOUTPAGE>\n <div class=\"checkout-left-panel\">\n <div class=\"checkout-main-content\">\n <!-- <div class=\"delivery-options\">\n <div class=\"delivery-option active\">\n <div class=\"delivery-icon\"></div>\n HOME DELIVERY\n </div>\n <div class=\"delivery-option\">\n <div class=\"delivery-icon\"></div>\n STORE PICK-UP\n </div>\n </div> -->\n\n <div class=\"section-title\">Shipping Address</div>\n\n <div class=\"shipping-info\" *ngIf=\"defaultAddress\">\n <div class=\"address-info\">\n <div class=\"address-name\">{{defaultAddress?.receiverName}} ({{defaultAddress?.addressType}})</div>\n <div class=\"address-details\">{{defaultAddress?.addressLine1}}, {{defaultAddress?.cityName}},\n {{defaultAddress?.stateName}}</div>\n <div class=\"mobile-number\">Mobile: {{defaultAddress?.receiverPhone}}</div>\n </div>\n </div>\n\n <div class=\"addLinks h-100\" *ngIf=\"!defaultAddress\" (click)=\"addAddress()\">\n <mat-icon>add</mat-icon>\n </div>\n\n <button class=\"change-address-btn\" (click)=\"changeAddress()\" *ngIf=\"defaultAddress\">CHANGE OR ADD ADDRESS</button>\n\n <button class=\"btn w-100 mt-1 payment-btn\" (click)=\"proceedToPayment()\" simpoButtonDirective\n *ngIf=\"defaultAddress && !placeOrderLoader\" [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\"\n [color]=\"data?.styles?.background?.accentColor\" [appButtonEditor]=\"edit ?? false\"\n [backgroundInfo]=\"styles?.background\">\n Place Order\n </button>\n <button class=\"btn w-100 mt-1 payment-btn\" simpoButtonDirective *ngIf=\"defaultAddress && placeOrderLoader\"\n [buttonStyle]=\"data?.action?.buttons?.[0]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\n [appButtonEditor]=\"edit ?? false\" [backgroundInfo]=\"styles?.background\">\n Loading...\n </button>\n\n </div>\n </div>\n\n <div class=\"checkout-right-panel\">\n <div class=\"order-summary\">\n <div class=\"summary-title\">Order Summary</div>\n\n <div class=\"checkout-product\">\n <div class=\"product-item\" *ngFor=\"let item of responseData?.orderedItems; let idx = index\">\n <img [src]=\"item.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" class=\"product-image\"\n alt=\"\">\n <div class=\"product-details\">\n <div class=\"product-name\">{{item.itemName}}</div>\n <div class=\"product-quantity\">Quantity: {{item.quantity}}</div>\n <div class=\"product-price\">\u20B9{{(item.sellingPrice * item.quantity) | number: '1.0-2'}}</div>\n </div>\n </div>\n\n </div>\n\n <div class=\"price-breakdown\">\n <div class=\"price-row\">\n <span>Total Price</span>\n <span>\u20B9{{(responseData?.billdetails?.totalNetValue\n ?? 0) | number: '1.0-2'}}</span>\n </div>\n <div class=\"price-row\">\n <span>Total Tax</span>\n <span>\u20B9{{((!responseData.billdetails?.couponId ?\n responseData?.billdetails?.totalTax : responseData?.billdetails?.totalTaxAfterDiscount) ?? 0) |\n number:\n '1.0-2'}}</span>\n </div>\n <div class=\"summary-row\" *ngIf=\"cartType === 'SHOPPING' && cartInfo?.billdetails?.orraSchemeRedeemedAmount\">\n <span class=\"summary-label\">Redeem Amount</span>\n <span class=\"summary-value\">\u20B9{{(cartInfo?.billdetails?.orraSchemeRedeemedAmount ?? 0) | number:\n '1.0-2'}}</span>\n </div>\n\n <div class=\"price-row discount\" *ngIf=\"responseData?.billdetails?.discountAmount && !isJewellery\">\n <span>Coupon Discount</span>\n <span>- \u20B9{{responseData?.billdetails?.discountAmount\n | number: '1.0-2'}}</span>\n </div>\n <div class=\"price-row\"\n *ngIf=\"responseData?.billdetails?.deliveryCharges && responseData.billdetails.deliveryCharges > 0\">\n <span>Delivery Charge</span>\n <span>{{responseData.billdetails.deliveryCharges\n |\n number: '1.0-2'}}</span>\n </div>\n <div class=\"price-row total\" *ngIf=\"cartType === 'SHOPPING'\">\n <span>TOTAL AMOUNT</span>\n <span *ngIf=\"!isPointsRedeeming && !appliedVoucher\">\u20B9{{(responseData?.totalAmount ?? 0) | number:\n '1.0-2'}}</span>\n <span *ngIf=\"isPointsRedeeming\">\u20B9{{(responseData?.totalAmount - (totalSavingAmt || 0)) | number:\n '1.0-2'}}</span>\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'AMOUNT'\">\u20B9{{(responseData?.totalAmount -\n (selectedVoucherAmount || 0)) | number:\n '1.0-2'}}</span>\n <span *ngIf=\"appliedVoucher && this.couponValueType === 'PERCENTAGE'\">\u20B9{{(responseData?.totalAmount -\n (responseData?.totalAmount * (selectedVoucherPercentage / 100) || 0)) | number:\n '1.0-2' }}</span>\n </div>\n </div>\n </div>\n\n </div>\n</ng-template>\n\n<ng-template #CARTITEM let-products=\"data\">\n <div class=\"cart-item\" *ngFor=\"let item of products\" [style.color]=\"fontColor\">\n <div class=\"item-left\">\n <div class=\"item-image\">\n <img class=\"item-img\" [src]=\"item.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" alt=\"\"\n (click)=\"goToProductDetails(item)\" style=\"cursor: pointer;\">\n </div>\n <div class=\"item-details\">\n <h3 class=\"item-title\">{{item.itemName}}</h3>\n <div class=\"item-subtitle\" *ngIf=\"item.itemVariant\">\n <span *ngFor=\"let varient of getKeys(item.itemVariant.properties); let last = last\">\n {{ item.itemVariant.properties[varient] | titlecase }}<span *ngIf=\"!last\">, </span>\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"item-right\">\n <div class=\"quantity-control\" *ngIf=\"cartType === 'SHOPPING'\">\n <button class=\"qty-btn px-2\" (click)=\"decreaseQty(item)\" [disabled]=\"item.quantity === 1\">\n <mat-icon>remove</mat-icon>\n </button>\n <span class=\"qty-value px-3\">{{item.quantity}}</span>\n <button class=\"qty-btn px-2\" (click)=\"increaseQty(item)\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n\n <div class=\"item-price\">\n \u20B9{{item.sellingPrice | number: '1.0-2'}}\n </div>\n\n <div class=\"delete-btn-circle\" (click)=\"removeItem(item)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-trash-2\">\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </svg>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #EMPTYITEM>\n <section class=\"empty-cart w-100 d-flex align-items-center justify-content-center\">\n <div class=\"empty-cart-container d-flex flex-column\">\n <div class=\"cart-image\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n [src]=\"data?.content?.image?.url\" [alt]=\"data?.content?.image?.altText\" [appImageEditor]=\"edit || false\"\n [imageData]=\"data?.content?.image\" [sectionId]=\"data?.id\">\n </div>\n <div class=\"cart-text content-side\">\n <ng-container *ngFor=\"let text of data?.content?.inputText\">\n <div class=\"d-flex justify-content-center\"\n [ngClass]=\"{'heading-medium': text.label == 'Heading', 'description': text.label == 'Text'}\">\n <simpo-text-editor [(value)]=\"text.value\" [editable]=\"edit || false\" [isRTE]=\"text.isRTE\"></simpo-text-editor>\n </div>\n </ng-container>\n </div>\n <button class=\"place-order-btn mx-auto w-fit\" (click)=\"edit ? '' : proceedToListPage()\" simpoButtonDirective\n [buttonStyle]=\"data?.action?.buttons?.[1]?.styles\" [color]=\"data?.styles?.background?.accentColor\"\n [appButtonEditor]=\"edit ?? false\"\n [backgroundInfo]=\"styles?.background\">{{data?.action?.buttons?.[1]?.content?.label ?? 'Continue\n Shopping'}}</button>\n </div>\n </section>\n</ng-template>\n\n<ng-template #SCHEME_REDEMPTION>\n <div class=\"modal-body\">\n <div class=\"scheme-option\" *ngFor=\"let scheme of schemeList\" (click)=\"redeemScheme(scheme, false)\"\n [style.borderColor]=\"cartInfo.billdetails.orraSchemeCode ? styles?.background?.color : ''\">\n <label for=\"individual\" class=\"scheme-card\">\n <div class=\"scheme-info d-flex gap-1\">\n <div class=\"form-check-radio\">\n <input class=\"form-check-input-radio\" type=\"radio\" name=\"flexRadioDefault\" id=\"flexRadioDefault2\">\n </div>\n <div class=\"right-side\">\n <div class=\"scheme-name\">\n <div class=\"scheme-title\">Individual Investment Scheme</div>\n <div class=\"scheme-monthly\">\u20B98000/M</div>\n </div>\n <div class=\"scheme-details\">\n <span class=\"scheme-id\">GPP Id: {{scheme.GPPId}}</span>\n <!-- <span class=\"scheme-maturity\">Maturity Date: 12 April 2024</span> -->\n </div>\n <div class=\"scheme-amount\">\u20B9{{scheme.amount}}</div>\n </div>\n </div>\n </label>\n </div>\n <div class=\"reedem_error d-flex justify-content-center align-items-center\" *ngIf=\"showReedemError\">\n Please add more \u20B9{{vaildAmount}} to reedem this scheme\n </div>\n </div>\n</ng-template>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}.reedem-section{padding:10px 15px;border-radius:15px;background:#f6f3f9;box-shadow:#b2b2ca80 2px 2px 6px;font-weight:700;font-size:13px}.redeem-section-text{font-size:.9rem;font-weight:700}.form-check-input:checked{background-color:#28a745!important;border-color:#28a745!important}.form-check-input:focus{border-color:#28a745!important;outline:0;box-shadow:none!important}.close-btn{background:none;border:none;font-size:24px;color:#6b7280;cursor:pointer;padding:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center}.close-btn:hover{color:#374151}.select_matured_text{font-size:.8rem!important;margin-top:10px;color:#05aacf}.position-relative{position:relative}.cart-parent{display:flex;margin-top:15px}.left-panel{width:65%;padding-right:5rem;border-right:1px solid #E9E9E9}.timeline{cursor:pointer}.cart-items{background:#fff;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.cart-header{padding:16px 24px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.cart-header h2{margin:0;font-size:18px;font-weight:500;color:#0f172a}.cart-item{display:flex!important;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;gap:20px;padding:0 8px;transition:background .2s}.cart-item:hover{background:#fbfcfe}.item-left{display:flex;align-items:center;flex:1}.item-right{display:flex;align-items:center;padding:15px;gap:32px}.item-image img{width:64px;height:64px;border-radius:12px;object-fit:cover;border:1px solid #f1f5f9}.item-details{display:flex;flex-direction:column;gap:4px}.item-title{margin:0;font-size:15px;font-weight:600;color:#0f172a;line-height:1.4}.item-subtitle{font-size:13px;color:#64748b;font-weight:400}.quantity-control{display:flex;align-items:center;border:1.5px solid #e2e8f0;border-radius:7px;overflow:hidden;height:38px;background:#fff;width:fit-content}.qty-btn{width:38px;height:100%;border:none;background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#475569;transition:all .2s ease}.qty-btn:hover{background:#f8fafc;color:#0f172a}.qty-btn mat-icon{font-size:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center}.qty-value{width:32px;height:100%;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:500;color:#0f172a;border-left:1.5px solid #e2e8f0;border-right:1.5px solid #e2e8f0}.item-price{font-size:18px;font-weight:700;color:#0f172a;min-width:60px;text-align:right;letter-spacing:-.01em}.delete-btn-circle{width:36px;height:36px;border-radius:50%;border:1px solid #fee2e2;background:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#ef4444;transition:all .2s ease}.delete-btn-circle:hover{background:#fef2f2;border-color:#fecaca;transform:scale(1.05);color:#dc2626}.delete-btn-circle svg{width:18px;height:18px}.isActive{color:#0267c1;font-weight:600}.bar{width:150px;border-top:2px solid lightgray;margin:0 5px}.right-panel{width:35%;padding-left:5rem}.my-bag{font-size:16px;font-weight:600;color:#000;margin-left:8px}.my-bag span{color:#939393}.coupons{display:flex;justify-content:space-between;padding:10px;border-radius:4px;box-shadow:0 0 1px #28293d14,0 0 2px #60617029;margin-bottom:15px;margin-top:10px;cursor:pointer}.coupon-list-section{padding:15px;width:400px;z-index:10000001!important}.coupon-list-section .search{padding:8px;border:1px solid lightgray;border-radius:20px;display:flex;justify-content:space-between}.coupon-list-section input{border:none;outline:none;width:90%}.coupon-list-section .coupon-list{height:60vh;width:100%}.item-parent{margin:10px 0;min-height:120px}.lh-23{line-height:23px;margin-left:10px}.item-name{color:#141514;font-size:16px;line-height:30px;font-weight:600}.price-with-tax{font-weight:400;font-size:16px;color:#626262}.item-sku{font-weight:400;font-size:14px;color:#626262}.item-price{display:flex;font-weight:600;font-size:16px;color:#141514}.product-img{border-radius:5px;height:100%;width:110px;padding:0;cursor:pointer}.quantity-box{display:flex;gap:5px;align-items:center;border:1px solid #E8E8E8;width:45px;height:22px}.quantity-box input{outline:none;text-align:center;border:none;width:30px;height:100%}.quantity-box .plus{font-size:20px;position:relative;top:-3px;font-weight:500}.quantity-box .minus{font-size:30px;position:relative;top:-3px;font-weight:500}.delete-item{color:#df2e2e;cursor:pointer;font-size:18px}.item-quantity{margin-top:5px;display:flex;min-width:90px;max-width:fit-content;border:1px solid lightgray;justify-content:space-between;align-items:center;padding:5px 10px;border-radius:3px}.coupon{display:flex;justify-content:space-between;border:1px solid #E8E8E8;border-radius:5px;padding:10px;margin-top:10px}.apply-coupon{font-weight:500;color:#626262;font-size:15px}.coupon-desc{color:#939393;font-size:12px;font-weight:500}.apply-coupon-btn{color:#0267c1;font-size:16px;font-weight:600}.price-details{padding:10px;margin-top:10px;border-radius:5px;box-shadow:0 0 1px #28293d14,0 0 2px #60617029;margin-bottom:15px}.price-parent-block{display:flex;justify-content:space-between;margin-top:5px}.price-type{font-weight:400;font-size:16px;color:#434443}.price-value{font-weight:500;font-size:18px;color:#141514}.button-parent{margin-top:20px;display:flex;flex-direction:column;gap:10px}hr{border:1px solid #E8E8E8}.btn{height:40px;font-size:16px!important}.delete-item{text-align:right;position:absolute;right:16px;bottom:10px}.quantity{display:flex;border:2px solid #E6E6E6;align-items:center;gap:15px;height:47px;margin-top:1rem;border-radius:5px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.label{color:#000}.total-container{min-height:80vh;position:relative;display:block!important;height:calc(100vh - 170px)}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%}.cart-image{width:13%;display:flex;margin-right:auto;margin-left:auto}.cart-image img{width:100%}.heading-medium{font-weight:600;color:#000}.description{font-size:18px;color:#7f7676;width:100%;text-align:center}.cart-window{padding:10px}.cart-window .small-product-img{width:55px;height:55px;border-radius:5px}.cart-window .small-items{display:flex;flex-direction:column;gap:10px;margin-top:15px;height:calc(100vh - 160px);overflow-y:auto}.cart-window .small-item{width:100%;display:flex;justify-content:space-between}.cart-window .small-item-name{width:200px}.cart-window .small-item-quantity{display:flex;align-items:center;justify-content:space-between;border-radius:5px;width:80px;background-color:#fafad2;padding:3px 8px;height:35px;font-weight:500;margin-right:3px}.cart-window .small-item-price{display:flex;flex-direction:column;gap:5px}.cart-window .small-item-price .price-with-tax{display:flex;font-size:13px!important}.cart-window .fotter-sec{background-color:#fff;position:absolute;bottom:0;left:0;width:100%;padding:10px}.cart-window .fotter-sec .payment-btn{border-radius:5px;border:none;display:flex;align-items:center;justify-content:center;background-color:#f08080;padding:10px 5px;color:#fff;cursor:pointer}.offers{background-color:#fff;display:flex;justify-content:space-between;padding:8px;border-radius:8px;box-shadow:#959da533 0 -1px 6px}.header-sec{font-size:26px}@media screen and (max-width: 475px){.cart-parent{flex-direction:column}.see-live-btn{white-space:nowrap!important}.left-panel{width:100%;padding-right:0rem}.right-panel{width:100%;z-index:1000;padding-left:0rem}.cart-image{width:42%}.description{width:84%}.heading-medium{font-size:28px}.item-price{white-space:nowrap;display:none}.product-img{width:82px}[class*=col-md]{padding-left:5px!important;padding-right:5px!important}.mobile-fixed{height:40px;font-size:16px!important;border:1px solid lightgray;width:100%;position:relative;bottom:10px}.empty-cart-container{height:calc(100vh - 130px)}.coupons-listing-section{width:100vw!important}.checkoutPage{flex-direction:column}.checkout-left-panel,.checkout-right-panel{width:100%!important}}.mobile-fixed{color:#fff}.coupons-listing-section{height:100vh;padding-top:0;position:relative;width:390px;z-index:100;background:#d3d3d354}.coupons-listing-section .coupon-heading{display:flex;align-items:center;background-color:#fff;padding:15px 20px;width:100%;box-sizing:border-box}.coupons-listing-section .coupon-heading img{height:15px;width:15px;position:relative;top:2px;cursor:pointer}.coupons-listing-section .coupon-heading .header-text{font-size:16px;color:#000;font-weight:600;margin-left:15px;position:relative;top:-3px;right:15px;cursor:pointer}.coupons-listing-section .coupon-search-sec{width:90%;box-sizing:border-box;margin:10px auto;border:1px solid lightgray;padding:10px;border-radius:10px;background-color:#fff;display:flex;font-size:16px;color:#000;font-weight:600}.coupons-listing-section .coupon-search-sec input{border:none;outline:none;background-color:transparent;width:95%;font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-search-sec input:focus{font-size:14px;color:#000;font-weight:600}.coupons-listing-section .coupon-search-sec .back-btn{position:relative;top:3px;cursor:pointer}.coupons-listing-section .coupon-search-sec .apply-btn-search{font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing{height:72%;overflow-y:auto;width:90%;margin:20px auto}.coupons-listing-section .coupon-listing .coupon-details{padding:15px;margin-bottom:15px;background-color:#edfffa;border-radius:10px;border:1px solid lightgray}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading{display:flex;flex-direction:column;gap:25px}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief{display:flex;justify-content:space-between;width:100%}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-name{font-size:16px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-desc{padding:5px 0;font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .show-details-btn{cursor:pointer}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-brief__right-sec{display:flex;justify-content:flex-end}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-brief .coupon-brief__right-sec .apply-offer-btn{font-size:16px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-heading .coupon-toggle-details-btn{text-align:left;text-decoration:underline;width:100%;font-size:14px;color:#000;font-weight:400}.coupons-listing-section .coupon-listing .coupon-details .details-divider{border-top:2px solid lightgray;opacity:.3;margin:15px 0}.coupons-listing-section .coupon-listing .coupon-details .details__coupon-terms{font-size:14px;color:#000;font-weight:400}.empty-screen-container{height:100%;width:85%;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-screen-container .empty-screen__primary-text{font-size:22px;color:#000;font-weight:400}.empty-screen-container .empty-screen__secondary-text{text-align:center;padding:10px 0;font-size:16px;color:#000;font-weight:400}.empty-screen-container .empty-screen__button{width:90%;background-color:#fff;border-radius:8px;text-align:center;padding:10px;margin:10px auto 0;cursor:pointer;font-size:18px;color:#000;font-weight:400}.box-shadow{box-shadow:#00000029 0 1px 4px}.main-content{border-radius:12px;padding:0 30px 30px;width:100%;overflow:scroll;height:calc(100vh - 150px)}.delivery-options{display:flex;gap:20px;margin-bottom:30px}.delivery-option{padding:12px 24px;border:2px solid #e0e0e0;border-radius:25px;background:#fff;cursor:pointer;display:flex;align-items:center;gap:8px;font-weight:500;transition:all .2s}.delivery-option.active{background:#f0e6ff;border-color:#8b5cf6;color:#7c3aed}.delivery-option:hover{border-color:silver}.delivery-icon{width:16px;height:16px;background:#8b5cf6;border-radius:3px}.section-title{font-size:16px;font-weight:700;margin-bottom:20px;color:#000}.shipping-info{border-radius:10px;padding:20px;margin-bottom:20px;border:1px solid rgb(238,232,255);box-shadow:#0000000a 0 4px 8px}.delivery-date{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.delivery-date-text{color:#666;font-weight:500}.change-date-btn{color:#e91e63;background:none;border:none;font-weight:600;cursor:pointer;text-transform:uppercase;font-size:12px;letter-spacing:.5px}.address-info{margin-bottom:15px}.address-name{font-weight:700;margin-bottom:8px;color:#000}.address-details{color:#666;margin-bottom:8px}.mobile-number{font-weight:700;color:#000;font-size:15px}.change-address-btn{font-size:1rem!important;font-weight:700!important;padding:6px;background:#fff;border:1px solid rgb(229,221,255);border-radius:8px;color:#000;cursor:pointer;transition:all .2s;box-shadow:#0000000a 0 4px 8px}.change-address-btn:hover{border-color:#8b5cf6;color:#8b5cf6}.billing-section{margin-top:40px}.billing-options{display:flex;flex-direction:column;gap:15px;margin-top:20px}.billing-option{display:flex;align-items:center;gap:12px;padding:15px;border:2px solid #e0e0e0;border-radius:8px;cursor:pointer;transition:all .2s}.billing-option.active{background:#f0e6ff;border-color:#8b5cf6}.radio-btn{width:20px;height:20px;border:2px solid #e0e0e0;border-radius:50%;position:relative}.billing-option.active .radio-btn{border-color:#8b5cf6}.billing-option.active .radio-btn:after{content:\"\";width:10px;height:10px;background:#8b5cf6;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.order-summary{border-radius:12px;padding:25px;width:75%}.summary-title{font-size:16px;font-weight:700;margin-bottom:20px;color:#000}.product-item{display:flex;gap:15px;margin-bottom:20px;border-bottom:1px solid #f0f0f0;border-radius:7px;background:#fff;padding:15px}.product-item:last-of-type{border-bottom:none;margin-bottom:30px;padding-bottom:0}.product-image{max-width:110px;width:100%;height:100%;border-radius:8px}.product-details{flex:1}.product-name{font-weight:500;margin-bottom:4px;color:#2d3748;font-size:14px}.product-quantity{color:#666;font-size:12px;margin-bottom:8px}.product-price{font-weight:600;color:#2d3748}.delivery-info{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:11px;color:#8b5cf6}.delivery-icon-small{width:12px;height:12px;background:#8b5cf6;border-radius:2px}.price-breakdown{border-top:1px solid #f0f0f0;padding-top:20px}.price-row{display:flex;justify-content:space-between;margin-bottom:12px;color:#666}.price-row.total{font-weight:600;color:#2d3748;font-size:16px;margin-top:15px;padding-top:15px;border-top:1px solid #f0f0f0}.discount{color:#22c55e!important}@media (max-width: 768px){.container{grid-template-columns:1fr;padding:15px;gap:20px}.main-content,.order-summary{padding:20px;width:100%}.delivery-options{flex-direction:column;gap:10px}}.checkout-left-panel{width:65%;display:flex;justify-content:center}.checkout-right-panel{width:35%;display:flex;justify-content:center;background-color:#f9f9fa}.checkout-product{max-height:50vh;overflow:scroll}.mt-1{margin-top:1rem!important}.payment-btn{box-shadow:#0000000a 0 4px 8px}.addLinks{padding-bottom:8px;padding-top:9px;border:1px dashed;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:5px;height:25vh!important;margin-bottom:20px}.addLinks mat-icon{border:1px solid rgb(219,223,225);display:flex;border-radius:100%;align-items:center;justify-content:center;font-size:16px;color:#dbdfe1}.change-pincode{display:flex;gap:10px}.change-pincode mat-icon{font-size:18px;align-items:center;justify-content:center;display:flex}.change-pincode span{font-size:14px}.fs-13{font-size:13px}.fs-12{font-size:12px}.fs-18{font-size:18px}.b-1-b{border-width:0px 1px;border-style:solid;border-color:#000}.container{max-width:unset;padding:24px;display:flex;gap:24px;width:100%!important}.main-content{background:#fff;border-radius:12px;width:70%}.promo-banner{padding:16px 20px;display:flex;justify-content:space-between;align-items:center;border-radius:8px;border:1px solid #e2e8f0}.promo-text h3{font-size:16px!important;font-weight:500;margin-bottom:4px}.promo-text p{font-size:.9rem!important;margin-bottom:0!important;color:#64748b}.see-live-btn{background:#fff;border:1px solid #e2e8f0;font-weight:600;color:#000;padding:8px 16px;border-radius:8px;font-size:12px!important;cursor:pointer;display:flex;align-items:center;gap:8px;width:max-content!important;transition:all .2s ease;box-shadow:0 1px 2px #0000000d}.see-live-btn:hover{background:#f8fafc;border-color:#cbd5e1;transform:translateY(-1px)}.see-live-btn svg{color:#6366f1}.cart-item{display:flex;gap:16px;position:relative}.cart-item:last-child{border-bottom:none}.item-image{width:15%;height:100px;border-radius:8px;object-fit:cover;display:flex;align-items:center;justify-content:center}.item-details{flex:1}.item-title{font-weight:500;margin-bottom:8px}.item-price{display:flex;align-items:center;gap:8px}.current-price{font-size:1rem;font-weight:600}.original-price{font-size:1rem;text-decoration:line-through}.discount{background:#fef3c7;padding:2px 6px;border-radius:4px;font-size:12px;font-weight:500}.item-code{font-size:12px;color:#9ca3af;margin-bottom:8px}.item-options{display:flex;gap:16px;font-size:14px;color:#6b7280;margin-bottom:12px}.delivery-info{font-size:12px;color:#8b5cf6}.pickup-info{background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:5px 15px;margin-top:12px;display:flex;align-items:center;cursor:pointer;width:max-content;gap:20px}.pickup-text{font-size:.9rem;color:#374151}.remove-btn{position:absolute;top:16px;right:0;width:20px!important;height:20px;background:#000;color:#fff;border:none;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:10px!important}.sidebar{display:flex;flex-direction:column;gap:16px;width:32%}.coupon-section{border-radius:8px;padding:10px 15px;border:1px solid #e2e8f0;display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:all .2s ease}.coupon-section:hover{border-color:#cbd5e1;background-color:#f8fafc}.chevron-icon{color:#94a3b8;transition:transform .2s ease}.coupon-section:hover .chevron-icon{transform:translate(2px);color:#64748b}.scheme-section{border-radius:12px;padding:10px 15px;cursor:pointer}.coupon-left{display:flex;align-items:center;gap:12px}.coupon-icon{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center}.coupon-icon mat-icon{font-size:17px;width:17px!important;height:19px!important}.coupon-text{font-weight:700;font-size:.9rem}.delivery-section{background:#fff;border-radius:12px;padding:10px 15px;box-shadow:#b2b2ca80 2px 2px 6px;background:#f6f3f9}.delivery-header{display:flex;align-items:center;gap:12px;margin-bottom:4px}.delivery-header span{font-size:.9rem;font-weight:700}.delivery-header mat-icon{width:20px;height:20px;font-size:17px;position:relative;top:2px}.delivery-icon{width:20px;height:20px;background:#8b5cf6;border-radius:50%}.pincode{font-weight:600;color:#111827}.change-link{color:#ec4899;font-size:.9rem;text-decoration:none;margin-left:auto}.summary-section{background:#fff;border-radius:8px;padding:20px;border:1px solid #e2e8f0}.summary-title{font-size:16px;font-weight:700;color:#0f172a;margin-bottom:20px;letter-spacing:-.01em}.summary-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.summary-row:last-child{margin-bottom:0}.summary-label{font-size:14px;font-weight:400;color:#64748b}.summary-value{font-size:14px;font-weight:500;color:#0f172a}.summary-divider{height:1px;background:#f1f5f9;margin:16px 0;width:100%}.total-row .summary-label{font-size:16px;font-weight:600;color:#0f172a}.total-row .summary-value{font-size:16px;font-weight:700;color:#0f172a}.total-row{border-top:1px solid #e2e8f0;padding-top:15px;margin-top:15px}.total-label{font-weight:600;font-size:16px}.total-value{font-weight:700;font-size:18px}.place-order-btn{background:linear-gradient(135deg,#8b5cf6,#ec4899);color:#fff;border:none;border-radius:12px;padding:9px 10px;font-size:.9rem!important;font-weight:600;cursor:pointer;margin-top:10px;text-transform:uppercase}.place-order-btn:hover{opacity:.9}.chain-icon,.earring-icon{width:60px;height:60px;filter:sepia(1) hue-rotate(30deg) saturate(2)}.item-img{width:100%;height:100%;object-fit:cover}.mt-0{margin-top:0!important}select{outline:none;border-radius:5px;padding:2px;width:20%;border:none;box-shadow:#9999994d 2px 2px 6px;cursor:pointer}.cart-tab-parent{display:flex;justify-content:center}.cart-tabs{gap:10px;display:flex;justify-content:center;align-items:center;width:max-content;border-radius:8px;border:1px solid #e2e8f0}.cart-tabs div{padding:7px 10px;cursor:pointer;font-size:14px}.selected-cart-tab{margin:6px;background:#f1f5f9;border-radius:5px;color:#000!important;font-weight:500}.checkout-main-content{width:50%;padding:30px;border-radius:12px}@media screen and (max-width: 475px){.main-content{padding:0;height:auto!important}.cart-item{flex-direction:column!important;align-items:flex-start!important;padding:16px 12px!important;gap:16px!important}.item-left{width:100%!important;gap:16px!important;align-items:flex-start!important}.item-image{width:86px!important;height:86px!important;flex-shrink:0!important}.item-right{width:100%!important;justify-content:space-between!important;padding:0!important;gap:12px!important;margin-top:4px!important}.item-price{flex:1!important;text-align:right!important;margin-right:8px!important;font-size:16px!important}.item-title{font-size:14px!important;-webkit-line-clamp:2!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;overflow:hidden!important}.quantity-control{height:34px!important}.qty-btn{width:34px!important}.qty-value{width:28px!important;font-size:13px!important}.no-items{height:86vh;overflow:hidden;margin:0}.checkout-main-content{width:100%}.container{padding:0!important}.pickup-info{display:none}.container{display:flex;flex-direction:column}.promo-banner{gap:10px}select{width:50%}.main-content,.sidebar{width:100%}.vouchers-listing-section{min-width:unset!important;width:100vw!important}.separator{display:none!important}.coupon-meta{display:grid!important;grid-template-columns:1fr 1fr!important}}.group_invest{color:#000;font-size:.8rem}.reedem_error{color:red}.group_invest span{color:#05aacf}.redeem_amount{padding:2%;border-radius:4px;background:#fff;margin-top:2%;color:#000;font-size:.8rem}.redeem_amount span{color:#0dc577}.w-fit{width:fit-content!important}.modal-body{padding-bottom:0;overflow-y:scroll;max-height:300px;padding:0!important}.scheme-option{margin-bottom:16px}.scheme-option input[type=radio]:checked+.scheme-card{border-color:#06b6d4;background:#f0f9ff;position:relative}.scheme-option input[type=radio]:checked+.scheme-card:before{content:\"\";position:absolute;top:20px;left:20px;width:20px;height:20px;border:2px solid #06b6d4;border-radius:50%;background:#fff}.scheme-option input[type=radio]:checked+.scheme-card:after{content:\"\";position:absolute;top:26px;left:26px;width:8px;height:8px;background:#06b6d4;border-radius:50%}.scheme-card{justify-content:space-between;padding:10px;border:2px solid #e5e7eb;border-radius:8px;cursor:pointer;transition:all .2s ease;background:#fff;width:100%}.scheme-card:hover{border-color:#d1d5db;background:#f9fafb}.form-check-radio{width:10%}.scheme-title{font-size:12px;font-weight:600;color:#111827;margin-bottom:8px}.scheme-details{display:flex;gap:25px;margin-bottom:20px}.scheme-name{display:flex;justify-content:space-between}.scheme-details span{font-size:12px;color:#0000004d}.scheme-monthly{font-size:14px;font-weight:600;color:#111827;min-width:100px;text-align:right}.right-side{width:90%}.scheme-amount{font-weight:700}@media screen and (min-width: 700px){.cart-items{max-height:500px;overflow:scroll}}.add-to-cart-parent{width:max-content;border:1px solid #000000;border-radius:8px}.cursor{cursor:pointer}.cart-text{max-width:600px;margin:0 auto;text-align:center}.cart-text div{word-break:break-word;overflow-wrap:break-word;white-space:normal}.switch{position:relative;display:inline-block;width:45px;height:20px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:34px}.slider:before{position:absolute;content:\"\";height:16px;width:16px;left:3px;bottom:2px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#4caf50}input:checked+.slider:before{transform:translate(24px)}.vouchers-listing-section{position:relative;width:fit-content;min-width:500px;z-index:100;background:#fff;height:100vh}.vouchers-listing-section .coupon-heading{border-bottom:1px solid #eee}.vouchers-listing-section .coupon-listing{padding:12px 16px;overflow-y:auto;height:calc(97vh - 100px)}.voucher-details{background:#fff;border-radius:12px;padding:14px;box-shadow:0 1px 4px #00000042}.voucher-details .coupon-brief .apply-offer-btn{background:#111;color:#fff;border-radius:10px;padding:6px 16px}.voucher-details .coupon-code-box{border:1.5px dashed #bbb;border-radius:8px;padding:8px 12px;margin-bottom:10px}.voucher-details .coupon-code-box .code-label{font-size:11px;color:#888;margin-bottom:2px}.voucher-details .coupon-code-box .code-row .code-value{font-weight:700;font-size:15px;letter-spacing:1px}.voucher-details .coupon-meta .clock-icon{font-size:14px;height:14px;width:14px;vertical-align:middle}.applied-coupon-card{background:#f0fff8;border-radius:12px;padding:12px 16px}.applied-coupon-card .applied-coupon-left .success-check{color:#22c55e;font-size:22px}.applied-coupon-card .applied-coupon-left .applied-coupon-code{font-weight:700;font-size:14px}.applied-coupon-card .applied-coupon-left .applied-coupon-saving{font-size:13px;color:#097d5f;margin-top:2px}.active-type{background:#111!important;color:#fff!important}.redemption-type{text-align:center;border-radius:10px;padding:6px 16px;background:#d3d3d36b;width:-webkit-fill-available!important}.wallte_icon{background:#000;border-radius:50px;padding:5px 9px 7px}.wallte_icon img{width:18px;height:18px}.fw-600{font-weight:600}.coupon-type{width:fit-content!important;border-radius:26px!important;background:transparent!important;border:1px solid #afafaf;color:#393838;text-align:center;padding:6px 16px}.active-coupon{background:transparent!important;border:2px solid black!important;color:#000!important}.my-close-btn{position:absolute!important;top:10px!important;right:10px!important}\n"] }]
1118
1118
  }], ctorParameters: () => [{ type: i1.EventsService }, { type: i2.CartService }, { type: i3.Router }, { type: i4.RestService }, { type: i5.MatDialog }, { type: i6.StorageServiceService }, { type: i7.MessageService }, { type: i8.MatBottomSheet }, { type: i3.ActivatedRoute }, { type: undefined, decorators: [{
1119
1119
  type: Optional
1120
1120
  }, {
@@ -1138,4 +1138,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1138
1138
  type: ViewChild,
1139
1139
  args: ['d2']
1140
1140
  }] } });
1141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2Vjb21tZXJjZS9zZWN0aW9ucy9jYXJ0L2NhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvY2FydC9jYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFlLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDekYsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxXQUFXLE1BQU0sK0JBQStCLENBQUM7QUFHeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHaEUsT0FBTyxFQUFFLGVBQWUsRUFBYSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFLckcsT0FB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QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsY0FBYyxJQUFJLENBQUMsQ0FBQztnQkFFNUYsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxjQUFjLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7b0JBQ2hELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7b0JBQzlDLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3RDLFlBQVksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7Z0JBRUQsUUFBUSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7b0JBQ2pELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlFLENBQUMsQ0FBQyxDQUFBO2dCQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGVBQWUsR0FBRyxDQUFDLGNBQWMsRUFBRSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsZUFBZSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN0SyxJQUFJLENBQUMsUUFBUSxD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LHlCQUF5Qjt3QkFDekIsVUFBVTtxQkFDWCxhQUNVLENBQUMsY0FBYyxDQUFDOzswQkE2QnhCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZUFBZTs7MEJBQ2xDLFFBQVE7eUNBekJGLElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTVcsRUFBRTtzQkFBbEIsU0FBUzt1QkFBQyxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWRkcmVzcywgQ2FydFNlY3Rpb25Nb2RhbCwgQ2FydFNlY3Rpb25TdHlsZXNNb2RlbCB9IGZyb20gJy4vY2FydC5tb2RhbCc7XHJcbmltcG9ydCB7IFRvYXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2FzdCc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBCdXR0b25EaXJlY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYnV0dG9uLWRpcmVjdGl2ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uLCBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IEFuaW1hdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9hbmltYXRpb24tZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgSG92ZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvaG92ZXItZWxlbWVudC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb250ZW50Rml0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbnRlbnQtZml0LWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNpbXBvQ29tcG9uZW50TW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9pbmRleCc7XHJcbmltcG9ydCBCYXNlU2VjdGlvbiBmcm9tICcuLi8uLi8uLi9zZWN0aW9ucy9CYXNlU2VjdGlvbic7XHJcbmltcG9ydCB7IEV2ZW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLy4uLy4uL3NlcnZpY2VzL2V2ZW50cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBZGRyZXNzQ29tcG9uZW50IH0gZnJvbSBcIi4uL2FkZHJlc3MvYWRkcmVzcy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZVVzZXJDb21wb25lbnQgfSBmcm9tICcuLi9hdXRoZW50aWNhdGUtdXNlci9hdXRoZW50aWNhdGUtdXNlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZywgTWF0RGlhbG9nTW9kdWxlLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBSZXN0U2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9yZXN0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWRkcmVzc0RldGFpbHMsIFVzZXIgfSBmcm9tICcuLi8uLi9zdHlsZXMvdXNlci5tb2RhbCc7XHJcbmltcG9ydCB7IE9yZGVyZWRJdGVtcyB9IGZyb20gJy4uLy4uL3N0eWxlcy9PcmRlcmVkSXRlbXMubW9kYWwnO1xyXG5pbXBvcnQgeyBCVVNJTkVTU19DT05TVEFOVFMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvYnVzaW5lc3MuY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IFN3YWwgZnJvbSAnc3dlZXRhbGVydDInO1xyXG5pbXBvcnQgeyBCYWNrZ3JvdW5kRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2JhY2tncm91bmQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgTWF0Qm90dG9tU2hlZXQsIE1hdEJvdHRvbVNoZWV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYm90dG9tLXNoZWV0JztcclxuaW1wb3J0IHsgY2hlY2tJdGVtQWxyZWFkeUFkZGVkLCBJdGVtVmFyaWFudCwgUHJvZHVjdCwgc3luY0l0ZW1Ub1NlcnZlckRCUmVxdWVzdCB9IGZyb20gJy4uLy4uL3N0eWxlcy9wcm9kdWN0Lm1vZGFsJztcclxuaW1wb3J0IHsgQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQgfSBmcm9tICcuLi9jdXN0b21lci1yZXZpZXcvY3VzdG9tZXItcmV2aWV3LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IG1lcmdlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgcmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcclxuaW1wb3J0IHsgVGV4dEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2VsZW1lbnRzL3RleHQtZWRpdG9yL3RleHQtZWRpdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEltYWdlRWRpdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2ltYWdlLWVkaXRvci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBMYXlPdXRNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3N0eWxlcy9zdHlsZS5tb2RlbCc7XHJcbmltcG9ydCB7IFNwYWNpbmdIb3Jpem9udGFsRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL3NwYWNpbmctaG9yaXpvbnRhbC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBBZGRyZXNzTGlzdENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2VsZW1lbnRzL2FkZHJlc3MtbGlzdC9hZGRyZXNzLWxpc3QuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2NoZWR1bGVWaWRlb0NhbGxDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9lbGVtZW50cy9zY2hlZHVsZS12aWRlby1jYWxsL3NjaGVkdWxlLXZpZGVvLWNhbGwuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQnV0dG9uRWRpdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2J1dHRvbi1lZGl0b3IuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2NoZW1lU2VsZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vc2NoZW1lLXNlbGVjdGlvbi9zY2hlbWUtc2VsZWN0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbG9yLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFVuYXJ5IH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xyXG5pbXBvcnQgeyBNYXRTcGlubmVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XHJcbmltcG9ydCB7IEZlYXR1cmVkUHJvZHVjdHNDb21wb25lbnQgfSBmcm9tICcuLi9mZWF0dXJlZC1wcm9kdWN0cy9mZWF0dXJlZC1wcm9kdWN0cy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGZWF0dXJlZFByb2R1Y3RNb2RhbCB9IGZyb20gJy4uL2ZlYXR1cmVkLXByb2R1Y3RzL2ZlYXR1cmVkLXByb2R1Y3RzLm1vZGFsJztcclxuXHJcbmludGVyZmFjZSBDb3Vwb24ge1xyXG4gIGRpc2NvdW50VHlwZTogc3RyaW5nO1xyXG4gIGRpc2NvdW50TmFtZTogc3RyaW5nO1xyXG4gIGRpc2NvdW50RGVzY3JpcHRpb246IHN0cmluZztcclxuICBhcHBsaWNhYmxlOiBib29sZWFuO1xyXG4gIGNvdXBvbkNvZGU6IHN0cmluZztcclxuICBjb3Vwb25JZDogc3RyaW5nO1xyXG4gIHN0YXR1czogYm9vbGVhbjtcclxuICB2YWxpZEZyb206IERhdGU7XHJcbiAgdmFsaWRUbzogRGF0ZTtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzaW1wby1jYXJ0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgTWF0SWNvbixcclxuICAgIE1hdERpYWxvZ01vZHVsZSxcclxuICAgIFNpbXBvQ29tcG9uZW50TW9kdWxlLFxyXG4gICAgQmFja2dyb3VuZERpcmVjdGl2ZSxcclxuICAgIE1hdEJvdHRvbVNoZWV0TW9kdWxlLFxyXG4gICAgLy9ESVJFQ1RJVkVcclxuICAgIEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSxcclxuICAgIEFuaW1hdGlvbkRpcmVjdGl2ZSxcclxuICAgIENvbnRlbnRGaXREaXJlY3RpdmUsXHJcbiAgICBIb3ZlckRpcmVjdGl2ZSxcclxuICAgIEFkZHJlc3NDb21wb25lbnQsXHJcbiAgICBUb2FzdE1vZHVsZSxcclxuICAgIFRleHRFZGl0b3JDb21wb25lbnQsXHJcbiAgICBJbWFnZUVkaXRvckRpcmVjdGl2ZSxcclxuICAgIFNwYWNpbmdIb3Jpem9udGFsRGlyZWN0aXZlLFxyXG4gICAgQWRkcmVzc0xpc3RDb21wb25lbnQsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgQnV0dG9uRWRpdG9yRGlyZWN0aXZlLFxyXG4gICAgQ29sb3JEaXJlY3RpdmUsXHJcbiAgICBGZWF0dXJlZFByb2R1Y3RzQ29tcG9uZW50LFxyXG4gICAgTWF0U3Bpbm5lclxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jYXJ0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vY2FydC5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FydENvbXBvbmVudCBleHRlbmRzIEJhc2VTZWN0aW9uIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGRhdGE/OiBDYXJ0U2VjdGlvbk1vZGFsO1xyXG4gIEBJbnB1dCgpIHJlc3BvbnNlRGF0YT86IGFueTtcclxuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcclxuICBASW5wdXQoKSBlZGl0PzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBkZWxldGU/OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzPzogc3RyaW5nO1xyXG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzdHlsZXM/OiBDYXJ0U2VjdGlvblN0eWxlc01vZGVsO1xyXG4gIHB1YmxpYyBjdXJyZW50VGFiOiAnQkFHJyB8ICdBRERSRVNTJyB8ICdQQVlNRU5UJyA9IFwiQkFHXCI7XHJcbiAgY2FydFR5cGU6ICdTSE9QUElORycgfCAnVFJJQUwnID0gXCJTSE9QUElOR1wiXHJcbiAgQFZpZXdDaGlsZCgnZDInKSBkMiE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHBpbmNvZGU6IGFueTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50U2VydmljZTogRXZlbnRzU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXREaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBib3R0b21TaGVldDogTWF0Qm90dG9tU2hlZXQsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgbWF0RGlhbG9nRGF0YTogYW55LFxyXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENhcnRDb21wb25lbnQ+XHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5waW5jb2RlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BpbmNvZGUnKTtcclxuICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmNhcnRUeXBlID0gcGFyYW1zWydjYXJ0VHlwZSddIHx8IFwiU0hPUFBJTkdcIjtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBxdWFudGl0eSA9IFsxLCAyLCAzLCA0LCA1LCA2XVxyXG4gIHByaXZhdGUgdXNlckRldGFpbHM6IFVzZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIFVTRVJfQ0FSVF9JVEVNUzogT3JkZXJlZEl0ZW1zW10gfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgc2VsZWN0ZWRBZGRyZXNzSWR4OiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBkZWZhdWx0QWRkcmVzcz86IEFkZHJlc3NEZXRhaWxzO1xyXG4gIHB1YmxpYyBlbnRlcmVkQ291cG9uQ29kZTogc3RyaW5nID0gXCJcIjtcclxuICBwdWJsaWMgY291cG9uTGlzdDogQ291cG9uW10gPSBbXTtcclxuICBwdWJsaWMgZmVhdHVyZVByb2R1Y3REYXRhOiBGZWF0dXJlZFByb2R1Y3RNb2RhbCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgVVNFUl9DQVJUOiBPcmRlcmVkSXRlbXNbXSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgVVNFUl9XSVNITElTVDogT3JkZXJlZEl0ZW1zW10gfCBudWxsID0gbnVsbDtcclxuICB0cmlhbENhcnRJdGVtOiBPcmRlcmVkSXRlbXNbXSB8IG51bGwgPSBudWxsXHJcbiAgc2VsZWN0TWF0dXJlU2NoZW1lOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2FydEluZm86IGFueSA9IHtcclxuICAgIG9yZGVyZWRJdGVtczogbnVsbCxcclxuICAgIGJ1c2luZXNzSWQ6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYklkXCIpID8/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYnVzaW5lc3NJZFwiKSxcclxuICAgIGJpbGxkZXRhaWxzOiB7XHJcbiAgICAgIFwidG90YWxOZXRWYWx1ZVwiOiAwLFxyXG4gICAgICBcInRvdGFsVGF4QWZ0ZXJEaXNjb3VudFwiOiAwLFxyXG4gICAgICBcInRvdGFsR3Jvc3NWYWx1ZVwiOiAwLFxyXG4gICAgICBcInRvdGFsVGF4XCI6IDAsXHJcbiAgICAgIFwidG90YWxPZmZlcmVkVmFsdWVcIjogMCxcclxuICAgICAgXCJkaXNjb3VudEFtb3VudFwiOiAwLFxyXG4gICAgICBcImRlbGl2ZXJ5Q2hhcmdlc1wiOiAwLFxyXG4gICAgICBcIm9ycmFTY2hlbWVSZWRlZW1lZEFtb3VudFwiOiAwLFxyXG4gICAgICBcIm9ycmFTY2hlbWVDb2RlXCI6IFwiXCJcclxuICAgIH0sXHJcbiAgICBwbGF0Zm9ybTogXCJXRUJcIixcclxuICAgIGNhcnRUeXBlOiBcIkNBUlRcIixcclxuICAgIGFkZHJlc3NEZXRhaWxzOiBudWxsLFxyXG4gICAgdXNlckRldGFpbHM6IHtcclxuICAgICAgXCJ1c2VySWRcIjogXCJcIixcclxuICAgICAgXCJ1c2VyTmFtZVwiOiBcIlwiLFxyXG4gICAgICBcIm1vYmlsZVwiOiBcIlwiLFxyXG4gICAgICBcImVtYWlsXCI6IFwiXCJcclxuICAgIH0sXHJcbiAgICB0b3RhbEFtb3VudDogMFxyXG4gIH1cclxuXHJcbiAgbG9hZGluZ1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcclxuICBzdWJJbmR1c3RyeU5hbWU6IHN0cmluZyA9ICcnXHJcbiAgaXNKZXdlbGxlcnk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzZWxlY3RlZFJlZGVtcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBlY29tQ29uZmlnczogYW55O1xyXG4gIHVzZXJJZDogYW55O1xyXG4gIHJlY29tbWVkZWREYXRhOiBhbnk7XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIGxldCB1c2VyRGV0YWlscyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcicpIHx8ICcnO1xyXG4gICAgaWYgKHVzZXJEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMudXNlckRldGFpbHMgPSBKU09OLnBhcnNlKHVzZXJEZXRhaWxzKTtcclxuICAgICAgdGhpcy51c2VySWQgPSB0aGlzLnVzZXJEZXRhaWxzPy51c2VySWQ7XHJcblxyXG4gICAgfVxyXG4gICAgdGhpcy5jaGVja0FwcEluc3RhbGxlZCgpXHJcbiAgICB0aGlzLmlzSmV3ZWxsZXJ5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2lzTWF0ZXJpYWxCYXNlZFByaWNpbmcnKSA9PSAndHJ1ZScgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW06IGFueSkgPT4ge1xyXG4gICAgICBpZiAocGFyYW0gJiYgcGFyYW1bJ2NoZWNrb3V0J10pXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VGFiID0gXCJBRERSRVNTXCI7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5fZXZlbnRTZXJ2aWNlLnNob3dEdW1teUNhcnRJdGVtcy5zdWJzY3JpYmUoKHJlc3BvbnNlOiBib29sZWFuKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gdGhpcy5zdHlsZXM/LmNhcnRJdGVtc1N0eWxpbmcgJiYgdGhpcy5lZGl0ID8gdGhpcy5kdW1teUNhcnRJdGVtcyA6IHRoaXMuZWRpdCA/IHVuZGVmaW5lZCA6IHRoaXMucmVzcG9uc2VEYXRhO1xyXG4gICAgfSlcclxuICAgIHRoaXMuZ2V0VHJpYWxDYXJ0KCk7XHJcbiAgICB0aGlzLmdldEluZGV4REJEYXRhKCk7XHJcbiAgICB0aGlzLmdldFNjaGVtZURldGFpbHMoKTtcclxuICAgIHRoaXMuZ2V0RWNvbW1lcmNlQ29uZmlncygpO1xyXG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLmRhdGE/LnN0eWxlcztcclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZGF0YSlcclxuICAgIC8vIHRoaXMuZ2V0Q2FydFJlY29tbWVuZGF0aW9ucygpO1xyXG4gIH1cclxuICBkdW1teUNhcnRJdGVtczogYW55ID0ge1xyXG4gICAgXCJjYXJ0SWRcIjogXCIxZjBkZDc5Ni1iOWQ4LTZjMWYtOGQzYi1kNzMzMGNjMjdhOWZcIixcclxuICAgIFwiYnVzaW5lc3NJZFwiOiBcIjFmMGRjYTQyLWZlNGUtNjA2Yy1hZTNiLWU5NDIzMGJlNWNkMlwiLFxyXG4gICAgXCJwZ09yZGVySWRcIjogbnVsbCxcclxuICAgIFwib3JkZXJlZEl0ZW1zXCI6IFtcclxuICAgICAge1xyXG4gICAgICAgIFwiaXRlbUlkXCI6IFwiMWVmYjVmZjItM2RmMy02ZGNhLWFlMjUtYjkxMGQ5YjIwMDZmXCIsXHJcbiAgICAgICAgXCJ2YXJpZW50SWRcIjogXCIxZWZiNWZmMi0zZGYzLTZkY2EtYWUyNS1iOTEwZDliMjAwNmZcIixcclxuICAgICAgICBcImJ1c2luZXNzSWRcIjogXCIxZWZiM2JkYy1mZDY4LTY1ZDAtOTAzOS02ZGFjMDljNjEzMDNcIixcclxuICAgICAgICBcIml0ZW1OYW1lXCI6IFwiWFhYWFhYWFhYWFhYXCIsXHJcbiAgICAgICAgXCJidXNpbmVzc05hbWVcIjogbnVsbCxcclxuICAgICAgICBcImltZ1VybFwiOiBcImh0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGdcIixcclxuICAgICAgICBcIml0ZW1WYXJpYW50XCI6IG51bGwsXHJcbiAgICAgICAgXCJ0YXhDYXRlZ29yeVwiOiBudWxsLFxyXG4gICAgICAgIFwicXVhbnRpdHlcIjogMSxcclxuICAgICAgICBcInByaWNlXCI6IDIyMDAwLjAsXHJcbiAgICAgICAgXCJpdGVtVGF4XCI6IDAuMCxcclxuICAgICAgICBcImRpc2NvdW50ZWRQcmljZVwiOiAyMjAwMC4wLFxyXG4gICAgICAgIFwiZGlzY291bnRBbW91bnRcIjogMC4wLFxyXG4gICAgICAgIFwidGF4QWZ0ZXJEaXNjb3VudFwiOiAwLjAsXHJcbiAgICAgICAgXCJzZWxsaW5nUHJpY2VcIjogMjIwMDAuMCxcclxuICAgICAgICBcInZhbHVlXCI6IDAuMCxcclxuICAgICAgICBcInJhdGluZ1wiOiAwLFxyXG4gICAgICAgIFwicmV2aWV3XCI6IG51bGwsXHJcbiAgICAgICAgXCJyZXZpZXdJbWFnZXNcIjogbnVsbFxyXG4gICAgICB9LFxyXG4gICAgXSxcclxuICAgIFwiYmlsbGRldGFpbHNcIjoge1xyXG4gICAgICBcInRvdGFsTmV0VmFsdWVcIjogMjcwMDAuMCxcclxuICAgICAgXCJ0b3RhbEdyb3NzVmFsdWVcIjogMjcyNTAuMCxcclxuICAgICAgXCJ0b3RhbFRheFwiOiAyNTAuMCxcclxuICAgICAgXCJmaW5hbFByaWNlXCI6IDI3MjUwLjAsXHJcbiAgICAgIFwidGF4QnJlYWt1cFwiOiB7XHJcbiAgICAgICAgXCJjZ3N0VmFsdWVcIjogMTI1LjAsXHJcbiAgICAgICAgXCJzZ3N0VmFsdWVcIjogMTI1LjAsXHJcbiAgICAgICAgXCJpZ3N0VmFsdWVcIjogMC4wXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiZGVsaXZlcnlDaGFyZ2VzXCI6IDAuMCxcclxuICAgICAgXCJjb3Vwb25JZFwiOiBudWxsLFxyXG4gICAgICBcImNvdXBvbkNvZGVcIjogbnVsbCxcclxuICAgICAgXCJkaXNjb3VudEFtb3VudFwiOiAwLjAsXHJcbiAgICAgIFwidG90YWxUYXhBZnRlckRpc2NvdW50XCI6IDAuMCxcclxuICAgICAgXCJvcnJhU2NoZW1lQ29kZVwiOiBudWxsLFxyXG4gICAgICBcIm9ycmFTY2hlbWVSZWRlZW1lZEFtb3VudFwiOiAwLjBcclxuICAgIH0sXHJcbiAgICBcInBsYXRmb3JtXCI6IFwiV0VCXCIsXHJcbiAgICBcImFkZHJlc3NEZXRhaWxzXCI6IG51bGwsXHJcbiAgICBcInVzZXJEZXRhaWxzXCI6IHtcclxuICAgICAgXCJ1c2VySWRcIjogXCI4Nzg5NmMzMi00MWFmLTQ5N2QtYThkZi0xMzRiMzY4ZWUxYjJcIixcclxuICAgICAgXCJ1c2VyTmFtZVwiOiBcImpvdGhpc2hhXCIsXHJcbiAgICAgIFwibW9iaWxlXCI6IFwiOTM4MTQ3MTUyN1wiLFxyXG4gICAgICBcImVtYWlsXCI6IFwiam90aGlzaGFAdGVqc29mdC5jb21cIlxyXG4gICAgfSxcclxuICAgIFwiY3JlYXRlZFRpbWVTdGFtcFwiOiBcIjIwMjUtMTItMjBUMDc6NTc6NDMuMTgwKzAwOjAwXCIsXHJcbiAgICBcInRvdGFsQW1vdW50XCI6IDI3MjUwLjAsXHJcbiAgICBcImNhcnRUeXBlXCI6IFwiQ0FSVFwiXHJcbiAgfVxyXG4gIGdldEVjb21tZXJjZUNvbmZpZ3MoKSB7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEVjb21tZXJjZUNvbmZpZ3MoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuZWNvbUNvbmZpZ3MgPSByZXM/LmRhdGFcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBzY2hlbWVMaXN0OiBhbnlbXSA9IFtdXHJcbiAgZ2V0U2NoZW1lRGV0YWlscygpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsT3JyYVNjaGVtZSgpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zY2hlbWVMaXN0ID0gW3Jlcy5kYXRhXTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMubG9hZGluZ1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbiAgb25Ub2dnbGVDaGFuZ2UoKSB7XHJcblxyXG4gICAgaWYgKCF0aGlzLnVzZXJEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0TWF0dXJlU2NoZW1lID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdTY2hlbWUnLCBkZXRhaWw6ICdMb2dpbiBGaXJzdCB0byByZWRlZW0nIH0pO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9sb2dpbiddKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdE1hdHVyZVNjaGVtZSA9ICF0aGlzLnNlbGVjdE1hdHVyZVNjaGVtZTtcclxuICAgIGlmICghdGhpcy5zZWxlY3RNYXR1cmVTY2hlbWUpXHJcbiAgICAgIHRoaXMuc2hvd1JlZWRlbUVycm9yID0gZmFsc2VcclxuICAgIGlmICghdGhpcy5zZWxlY3RNYXR1cmVTY2hlbWUgJiYgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5vcnJhU2NoZW1lQ29kZSkge1xyXG4gICAgICBsZXQgcmVxdWVzdDogYW55ID0geyBcImFtb3VudFwiOiB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLm9ycmFTY2hlbWVSZWRlZW1lZEFtb3VudCwgXCJHUFBJZFwiOiB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLm9ycmFTY2hlbWVDb2RlIH1cclxuICAgICAgdGhpcy5yZWRlZW1TY2hlbWUocmVxdWVzdCwgdHJ1ZSlcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0VHJpYWxDYXJ0KCkge1xyXG4gICAgbGV0IHVzZXI6IFVzZXIgfCBudWxsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKClcclxuICAgIGlmICh1c2VyKSB7XHJcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0VXNlckl0ZW1zKHVzZXIudXNlcklkLCAnVFJJQUxfQ0FSVCcpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnRyaWFsQ2FydEl0ZW0gPSByZXM/LmRhdGE/LlswXT8ub3JkZXJlZEl0ZW1zID8/IFtdXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdldFRyaWFsQ2FydEluZGV4REJEYXRhKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRUcmlhbENhcnRJbmRleERCRGF0YSgpIHtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VHJpYWxDYXJ0KCkudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgcmVzcG9uc2Uub25zdWNjZXNzID0gKHVzZXJUcmlhbENhcnRSZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50cmlhbENhcnRJdGVtID0gdXNlclRyaWFsQ2FydFJlc3BvbnNlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB1cGRhdGVVc2VyQ2FydCgpIHtcclxuICAgIGNvbnN0IGRlbGl2ZXJ5T3B0aW9uID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImRlbGl2ZXJ5T3B0aW9uc1wiKSA/PyBcInt9XCIpO1xyXG5cclxuICAgIHRoaXMudXNlckRldGFpbHMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKSBhcyBVc2VyO1xyXG4gICAgdGhpcy5jYXJ0SW5mby51c2VyRGV0YWlscyA9IHtcclxuICAgICAgXCJ1c2VySWRcIjogdGhpcy51c2VyRGV0YWlscz8udXNlcklkLFxyXG4gICAgICBcInVzZXJOYW1lXCI6IHRoaXMudXNlckRldGFpbHM/LmNvbnRhY3QubmFtZSxcclxuICAgICAgXCJtb2JpbGVcIjogdGhpcy51c2VyRGV0YWlscz8uY29udGFjdC5tb2JpbGUsXHJcbiAgICAgIFwiZW1haWxcIjogdGhpcy51c2VyRGV0YWlscz8uY29udGFjdC5lbWFpbCxcclxuICAgIH1cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0VXNlckl0ZW1zKHRoaXMudXNlckRldGFpbHMudXNlcklkLCBcIkNBUlRcIikuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRlbXBVc2VyQ2FydCA9IHJlc3BvbnNlPy5kYXRhPy5bMF0/Lm9yZGVyZWRJdGVtcyA/PyBbXTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnRJZCcsIHJlc3BvbnNlLmRhdGE/LlswXT8uY2FydElkKTtcclxuICAgICAgdGhpcy5jYXJ0SW5mb1tcImNhcnRJZFwiXSA9IHJlc3BvbnNlLmRhdGE/LlswXT8uY2FydElkO1xyXG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzWydvcnJhU2NoZW1lUmVkZWVtZWRBbW91bnQnXSA9IHJlc3BvbnNlPy5kYXRhPy5bMF0/LmJpbGxkZXRhaWxzPy5vcnJhU2NoZW1lUmVkZWVtZWRBbW91bnRcclxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlsc1snb3JyYVNjaGVtZUNvZGUnXSA9IHJlc3BvbnNlPy5kYXRhPy5bMF0/LmJpbGxkZXRhaWxzPy5vcnJhU2NoZW1lQ29kZVxyXG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4QWZ0ZXJEaXNjb3VudCA9IHJlc3BvbnNlPy5kYXRhPy5bMF0/LmJpbGxkZXRhaWxzPy50b3RhbFRheEFmdGVyRGlzY291bnQgPz8gMDtcclxuICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LlswXT8uYmlsbGRldGFpbHM/Lm9ycmFTY2hlbWVDb2RlKVxyXG4gICAgICAgIHRoaXMuc2VsZWN0TWF0dXJlU2NoZW1lID0gdHJ1ZVxyXG4gICAgICB0aGlzLmdldENvdXBvbkxpc3QoKTtcclxuICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LlswXT8ub3JkZXJlZEl0ZW1zPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5tZXJnZU9yZGVySXRlbXModGVtcFVzZXJDYXJ0KTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmFkZEFsbFByb2R1Y3RzVG9DYXJ0KHRoaXMuY2FydEluZm8ub3JkZXJlZEl0ZW1zKS5vbmNvbXBsZXRlID0gKCkgPT4ge1xyXG5cclxuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlckNhcnQoKS50aGVuKChjYXJ0UmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgY2FydFJlc3BvbnNlLm9uc3VjY2VzcyA9IChjYXJ0RGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKCEobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb3Vwb25JZFwiKSA9PSBcInVuZGVmaW5lZFwiIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY291cG9uSWRcIikgPT0gXCJudWxsXCIpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5jb3Vwb25JZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY291cG9uSWRcIik7XHJcbiAgICAgICAgICAgICAgaWYgKCEobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb3Vwb25Db2RlXCIpID09IFwidW5kZWZpbmVkXCIgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb3Vwb25Db2RlXCIpID09IFwibnVsbFwiKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuY291cG9uQ29kZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY291cG9uQ29kZVwiKTtcclxuICAgICAgICAgICAgICBjb25zdCByZXN0UmVzcG9uc2UgPSB0aGlzLnJlc3RTZXJ2aWNlLmFkZEl0ZW1Ub0RCKHRoaXMuY2FydEluZm8pLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICAgIHJlc3RSZXNwb25zZS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsR3Jvc3NWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxOZXRWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRJbmZvLnRvdGFsQW1vdW50ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfQ0FSVF9JVEVNUyA9IGNhcnREYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9DQVJUX0lURU1TLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbE5ldFZhbHVlICs9IChpdGVtLmRpc2NvdW50ZWRQcmljZSAqIChpdGVtLnF1YW50aXR5ID8/IDEpKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheCArPSAoaXRlbS5xdWFudGl0eSAqIChpdGVtLml0ZW1UYXggPz8gMCkpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzID0gKGRlbGl2ZXJ5T3B0aW9uPy5taW5PcmRlckFtb3VudCA+IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlKSA/IDAgOiAoZGVsaXZlcnlPcHRpb24/LmRlbGl2ZXJ5Q2hhcmdlcyA/PyAwKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlID0gdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbE5ldFZhbHVlICsgdGhpcy5nZXRUYXhBbW91bnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FydEluZm8ub3JkZXJlZEl0ZW1zID0gdGhpcy5VU0VSX0NBUlRfSVRFTVM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50ID0gcmVzcG9uc2U/LmRhdGE/LmJpbGxkZXRhaWxzPy5kaXNjb3VudEFtb3VudCA/PyAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheEFmdGVyRGlzY291bnQgPSByZXNwb25zZT8uZGF0YT8uYmlsbGRldGFpbHM/LnRvdGFsVGF4QWZ0ZXJEaXNjb3VudCA/PyAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby50b3RhbEFtb3VudCA9IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlICsgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgLSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50O1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5zdG9yYWdlU2VydmljZS5hZGRBbGxQcm9kdWN0c1RvQ2FydCh0aGlzLmNhcnRJbmZvLm9yZGVyZWRJdGVtcylcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gdGhpcy5jYXJ0SW5mbztcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhcnRSZXNwb25zZS5vbmVycm9yID0gKGNhcnREYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6ICdGYWlsZWQgdG8gdXBkYXRlIGNhcnQgZGV0YWlscycgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlckNhcnQoKS50aGVuKChjYXJ0UmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGNhcnRSZXNwb25zZS5vbnN1Y2Nlc3MgPSAoY2FydERhdGE6IGFueSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5VU0VSX0NBUlRfSVRFTVMgPSBjYXJ0RGF0YS50YXJnZXQucmVzdWx0IGFzIHVua25vd24gYXMgT3JkZXJlZEl0ZW1zW107XHJcbiAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlID0gMDtcclxuICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxUYXhBZnRlckRpc2NvdW50ID0gY2FydERhdGEuYmlsbGRldGFpbHM/LnRvdGFsVGF4QWZ0ZXJEaXNjb3VudCA/PyAwO1xyXG4gICAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxOZXRWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuY2FydEluZm8udG90YWxBbW91bnQgPSAwO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5VU0VSX0NBUlRfSVRFTVMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxOZXRWYWx1ZSArPSAoaXRlbS5kaXNjb3VudGVkUHJpY2UgKiAoaXRlbS5xdWFudGl0eSA/PyAxKSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheCArPSAoaXRlbS5xdWFudGl0eSAqIChpdGVtLml0ZW1UYXggPz8gMCkpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyA9IChkZWxpdmVyeU9wdGlvbj8ubWluT3JkZXJBbW91bnQgPiB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsR3Jvc3NWYWx1ZSkgPyAwIDogKGRlbGl2ZXJ5T3B0aW9uPy5kZWxpdmVyeUNoYXJnZXMgPz8gMCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlID0gdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbE5ldFZhbHVlICsgdGhpcy5nZXRUYXhBbW91bnQoKTtcclxuICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby50b3RhbEFtb3VudCA9IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlICsgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgLSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50O1xyXG4gICAgICAgICAgICB0aGlzLmNhcnRJbmZvLm9yZGVyZWRJdGVtcyA9IHRoaXMuVVNFUl9DQVJUX0lURU1TO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHRoaXMuY2FydEluZm87XHJcbiAgICAgICAgICAgIHRoaXMucmVzdFNlcnZpY2UuYWRkSXRlbVRvREIodGhpcy5yZXNwb25zZURhdGEpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYXJ0SWQnLCByZXNwb25zZS5kYXRhPy5jYXJ0SWQpO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FydEluZm9bXCJjYXJ0SWRcIl0gPSByZXNwb25zZS5kYXRhPy5jYXJ0SWQ7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGFbXCJjYXJ0SWRcIl0gPSB0aGlzLmNhcnRJbmZvW1wiY2FydElkXCJdO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXREZWZhdWx0QWRkcmVzcygpIHtcclxuICAgIGlmICgodGhpcy51c2VyRGV0YWlscz8uYWRkcmVzc0RldGFpbHNMaXN0Py5sZW5ndGggfHwgMCkgPT0gMClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRBZGRyZXNzSWR4ID0gdGhpcy51c2VyRGV0YWlscz8uYWRkcmVzc0RldGFpbHNMaXN0Py5maW5kSW5kZXgoYWRkcmVzcyA9PiBhZGRyZXNzLmRlZmF1bHQgPT09IHRydWUpID8/IC0xO1xyXG4gICAgdGhpcy5kZWZhdWx0QWRkcmVzcyA9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzSWR4ICE9PSAtMVxyXG4gICAgICA/IHRoaXMudXNlckRldGFpbHM/LmFkZHJlc3NEZXRhaWxzTGlzdFt0aGlzLnNlbGVjdGVkQWRkcmVzc0lkeF1cclxuICAgICAgOiB0aGlzLnVzZXJEZXRhaWxzPy5hZGRyZXNzRGV0YWlsc0xpc3Q/LlswXTtcclxuICB9XHJcbiAgZ2V0IHN0eWxlc0xheW91dCgpIHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMuc3R5bGVzPy5sYXlvdXQgfSBhcyBMYXlPdXRNb2RlbDtcclxuICB9XHJcblxyXG4gIG1lcmdlT3JkZXJJdGVtcyhzeW5jZWRJdGVtczogYW55W10pIHtcclxuICAgIGZvciAobGV0IHByb2R1Y3Qgb2Ygc3luY2VkSXRlbXMpIHtcclxuICAgICAgbGV0IGl0ZW1Gb3VuZCA9IGZhbHNlO1xyXG4gICAgICBmb3IgKGxldCBjYXJ0SXRlbSBvZiB0aGlzLmNhcnRJbmZvLm9yZGVyZWRJdGVtcykge1xyXG4gICAgICAgIGlmIChjYXJ0SXRlbS52YXJpZW50SWQgPT09IHByb2R1Y3QudmFyaWVudElkKSB7XHJcbiAgICAgICAgICBpdGVtRm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gY2FydEl0ZW0ucXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIWl0ZW1Gb3VuZCkge1xyXG4gICAgICAgIHRoaXMuY2FydEluZm8ub3JkZXJlZEl0ZW1zLnB1c2gocHJvZHVjdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENvdXBvbkxpc3QoKSB7XHJcbiAgICBpZiAoIXRoaXMuY2FydEluZm8uY2FydElkICYmICEobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjYXJ0SWRcIikgPT0gXCJ1bmRlZmluZWRcIiB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNhcnRJZFwiKSA9PSBcIm51bGxcIikpXHJcbiAgICAgIHRoaXMuY2FydEluZm8uY2FydElkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjYXJ0SWRcIik7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmFwcGxpY2FibGVEaXNjb3VudExpc3QodGhpcy5jYXJ0SW5mby5jYXJ0SWQpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmNvdXBvbkxpc3QgPSByZXNwb25zZS5kYXRhPy5maWx0ZXIoKGNvdXBvbjogYW55KSA9PiBjb3Vwb24uYWN0aXZlKT8ubWFwKChjb3Vwb246IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBkaXNjb3VudFR5cGU6IGNvdXBvbi5kaXNjb3VudCxcclxuICAgICAgICAgIGRpc2NvdW50TmFtZTogY291cG9uLmNvdXBvblRpdGxlLFxyXG4gICAgICAgICAgZGlzY291bnREZXNjcmlwdGlvbjogY291cG9uLmNvdXBvbkRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgY291cG9uQ29kZTogY291cG9uLmNvdXBvbkNvZGUsXHJcbiAgICAgICAgICBjb3Vwb25JZDogY291cG9uLmNvdXBvbklkLFxyXG4gICAgICAgICAgYXBwbGljYWJsZTogY291cG9uLmFwcGxpY2FibGUsXHJcbiAgICAgICAgICBzdGF0dXM6IGNvdXBvbi5hY3RpdmUsXHJcbiAgICAgICAgICB2YWxpZFRvOiBjb3Vwb24uZXhwaXJlcyxcclxuICAgICAgICAgIHZhbGlkRnJvbTogY291cG9uLnZhbGlkRnJvbVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSlcclxuICB9XHJcbiAgcmVtb3ZlQ291cG9uKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmNvdXBvbklkID0gXCJcIjtcclxuICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuY291cG9uQ29kZSA9IFwiXCI7XHJcbiAgICBjb25zdCByZXN0UmVzcG9uc2UgPSB0aGlzLnJlc3RTZXJ2aWNlLmFkZEl0ZW1Ub0RCKHRoaXMuY2FydEluZm8pLnRvUHJvbWlzZSgpO1xyXG4gICAgcmVzdFJlc3BvbnNlLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuXHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlQ2FydChyZXNwb25zZSk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiY291cG9uSWRcIik7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiY291cG9uQ29kZVwiKTtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0NvdXBvbicsIGRldGFpbDogJ0NvdXBvbiBSZW1vdmVkJyB9KTtcclxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kaXNjb3VudEFtb3VudCA9IDA7XHJcbiAgICAgIHRoaXMuY291cG9uRGlhbG9nUmVmPy5jbG9zZSgpO1xyXG4gICAgfSlcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICBnZXRJbmRleERCRGF0YSgpIHtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlckNhcnQoKS50aGVuKChjYXJ0UmVzcG9uc2UpID0+IHtcclxuICAgICAgY29uc3QgZGVsaXZlcnlPcHRpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZGVsaXZlcnlPcHRpb25zXCIpID8/IFwie31cIik7XHJcbiAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlID0gMDtcclxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheCA9IDA7XHJcbiAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxOZXRWYWx1ZSA9IDA7XHJcbiAgICAgIHRoaXMuY2FydEluZm8udG90YWxBbW91bnQgPSAwO1xyXG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyA9IDA7XHJcblxyXG4gICAgICBjYXJ0UmVzcG9uc2Uub25zdWNjZXNzID0gKGNhcnREYXRhOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLlVTRVJfQ0FSVF9JVEVNUyA9IGNhcnREYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcclxuICAgICAgICB0aGlzLlVTRVJfQ0FSVF9JVEVNUy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgKz0gKGl0ZW0uZGlzY291bnRlZFByaWNlICogKGl0ZW0ucXVhbnRpdHkgPz8gMSkpO1xyXG4gICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheCArPSAoaXRlbS5xdWFudGl0eSAqIChpdGVtLml0ZW1UYXggPz8gMCkpO1xyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxUYXhBZnRlckRpc2NvdW50ID0gY2FydERhdGEuYmlsbGRldGFpbHM/LnRvdGFsVGF4QWZ0ZXJEaXNjb3VudCA/PyAwO1xyXG4gICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzID0gKGRlbGl2ZXJ5T3B0aW9uPy5taW5PcmRlckFtb3VudCA+IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlKSA/IDAgOiAoZGVsaXZlcnlPcHRpb24/LmRlbGl2ZXJ5Q2hhcmdlcyA/PyAwKTtcclxuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsR3Jvc3NWYWx1ZSA9IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxOZXRWYWx1ZSArIHRoaXMuZ2V0VGF4QW1vdW50KCk7XHJcbiAgICAgICAgdGhpcy5jYXJ0SW5mby50b3RhbEFtb3VudCA9IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlICsgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgLSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50O1xyXG4gICAgICAgIHRoaXMuY2FydEluZm8ub3JkZXJlZEl0ZW1zID0gdGhpcy5VU0VSX0NBUlRfSVRFTVM7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpKVxyXG4gICAgICAgICAgdGhpcy51cGRhdGVVc2VyQ2FydCgpO1xyXG5cclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHRoaXMuY2FydEluZm87XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIHByb2NlZWRUb0NoZWNrb3V0KCkge1xyXG4gICAgaWYgKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFRhYiA9IFwiQUREUkVTU1wiO1xyXG4gICAgICB0aGlzLmdldERlZmF1bHRBZGRyZXNzKClcclxuICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdMb2dpbicsIGRldGFpbDogJ1BsZWFzZSBsb2dpbiB3aXRoIG1vYmlsZSBudW1iZXIgdG8gb3JkZXInIH0pO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9sb2dpbiddLCB7IHF1ZXJ5UGFyYW1zOiB7IGNhcnQ6IHRydWUgfSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9TbHVnKGlucHV0OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIWlucHV0KVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBub1doaXRlc3BhY2UgPSBpbnB1dC5yZXBsYWNlKC9cXHMrL2csICctJyk7XHJcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9XaGl0ZXNwYWNlLm5vcm1hbGl6ZSgnTkZEJyk7XHJcbiAgICBjb25zdCBzbHVnID0gbm9ybWFsaXplZC5yZXBsYWNlKC9bXlxcdy1dL2csICcnKTtcclxuXHJcbiAgICByZXR1cm4gc2x1Z1xyXG4gICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAucmVwbGFjZSgvLSsvZywgJy0nKVxyXG4gICAgICAucmVwbGFjZSgvXi18LSQvZywgJycpO1xyXG4gIH1cclxuXHJcbiAgZ29Ub1Byb2R1Y3REZXRhaWxzKHByb2R1Y3Q6IE9yZGVyZWRJdGVtcykge1xyXG4gICAgY29uc3Qgc2x1ZyA9IHByb2R1Y3Quc2x1Z2lmaWVkTmFtZSB8fCB0aGlzLnRvU2x1Zyhwcm9kdWN0Lml0ZW1OYW1lKTtcclxuICAgIGlmICghc2x1ZylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2RldGFpbHMnLCBzbHVnXSk7XHJcbiAgfVxyXG4gIHByb2NlZWRUb0xpc3RQYWdlKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xyXG4gIH1cclxuICByZW1vdmVJdGVtKGl0ZW06IE9yZGVyZWRJdGVtcykge1xyXG5cclxuICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgIGljb246IFwid2FybmluZ1wiLFxyXG4gICAgICBodG1sOiBcIjxzcGFuPllvdSBjYW4gbW92ZSA8L3NwYW4+IDxiPlwiICsgaXRlbS5pdGVtTmFtZSArIFwiPC9iPiA8c3Bhbj50byB3aXNobGlzdCBzbyB5b3UgY2FuIGJ1eSBsYXRlci48L3NwYW4+XCIsXHJcbiAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIk1vdmUgdG8gd2lzaGxpc3RcIixcclxuICAgICAgc2hvd0RlbnlCdXR0b246IHRydWUsXHJcbiAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcclxuICAgICAgZGVueUJ1dHRvblRleHQ6IFwiRGVsZXRlIGl0ZW1cIixcclxuICAgICAgZGVueUJ1dHRvbkNvbG9yOiBcIiNkNWQ1ZDVmZlwiLFxyXG4gICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2UuaXNDb25maXJtZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5jYXJ0VHlwZSA9PT0gJ1NIT1BQSU5HJykge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVJdGVtRnJvbUNhcnQoaXRlbSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlVHJpYWxJdGVtKGl0ZW0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubW92ZUl0ZW1Ub1dpc2hsaXN0KGl0ZW0pO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmlzRGVuaWVkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FydFR5cGUgPT09ICdTSE9QUElORycpIHtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbUZyb21DYXJ0KGl0ZW0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVRyaWFsSXRlbShpdGVtKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgcHJpdmF0ZSBtb3ZlSXRlbVRvV2lzaGxpc3QoaXRlbTogT3JkZXJlZEl0ZW1zKSB7XHJcbiAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0ZhdkZyb21DYXJ0KGl0ZW0pO1xyXG4gIH1cclxuICBwcml2YXRlIHJlbW92ZUl0ZW1Gcm9tQ2FydChpdGVtOiBPcmRlcmVkSXRlbXMpIHtcclxuICAgIGl0ZW0ucXVhbnRpdHkgPSAwO1xyXG4gICAgaWYgKHRoaXMuVVNFUl9DQVJUX0lURU1TKVxyXG4gICAgICB0aGlzLlVTRVJfQ0FSVF9JVEVNUyA9IHRoaXMuVVNFUl9DQVJUX0lURU1TLmZpbHRlcigocHJvZHVjdDogYW55KSA9PiBwcm9kdWN0LnZhcmllbnRJZCAhPSBpdGVtLnZhcmllbnRJZCk7XHJcbiAgICB0aGlzLmNhcnRJbmZvLm9yZGVyZWRJdGVtcyA9IHRoaXMuVVNFUl9DQVJUX0lURU1TO1xyXG4gICAgdGhpcy5yZXNwb25zZURhdGEgPSB0aGlzLmNhcnRJbmZvO1xyXG4gICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtRnJvbUNhcnRQYWdlKGl0ZW0sIHRoaXMucmVzcG9uc2VEYXRhKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZGVsaXZlcnlPcHRpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZGVsaXZlcnlPcHRpb25zXCIpID8/IFwie31cIik7XHJcbiAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlID0gMDtcclxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheCA9IDA7XHJcbiAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxUYXhBZnRlckRpc2NvdW50ID0gcmVzcG9uc2U/LmRhdGE/LmJpbGxkZXRhaWxzPy50b3RhbFRheEFmdGVyRGlzY291bnQgPz8gMDtcclxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kaXNjb3VudEFtb3VudCA9IHJlc3BvbnNlPy5kYXRhPy5iaWxsZGV0YWlscz8uZGlzY291bnRBbW91bnQgPz8gMDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50IDw9IDApIHtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5iaWxsZGV0YWlscy5jb3Vwb25Db2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5iaWxsZGV0YWlscy5jb3Vwb25JZCA9IG51bGw7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJjb3Vwb25Db2RlXCIpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiY291cG9uSWRcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxOZXRWYWx1ZSA9IDA7XHJcbiAgICAgIHRoaXMuY2FydEluZm8udG90YWxBbW91bnQgPSAwO1xyXG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyA9IDA7XHJcbiAgICAgIHRoaXMuY2FydEluZm8uY291cG9uQ29kZSA9IHJlc3BvbnNlLmRhdGE/LmJpbGxkZXRhaWxzPy5jb3Vwb25Db2RlO1xyXG4gICAgICB0aGlzLmNhcnRJbmZvLmNvdXBvbklkID0gcmVzcG9uc2UuZGF0YT8uYmlsbGRldGFpbHM/LmNvdXBvbklkO1xyXG5cclxuICAgICAgcmVzcG9uc2U/LmRhdGE/Lm9yZGVyZWRJdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgKz0gKGl0ZW0uZGlzY291bnRlZFByaWNlICogKGl0ZW0ucXVhbnRpdHkgPz8gMSkpO1xyXG4gICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxUYXggKz0gKGl0ZW0ucXVhbnRpdHkgKiAoaXRlbS5pdGVtVGF4ID8/IDApKTtcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgPSAoZGVsaXZlcnlPcHRpb24/Lm1pbk9yZGVyQW1vdW50ID4gdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbEdyb3NzVmFsdWUpID8gMCA6IChkZWxpdmVyeU9wdGlvbj8uZGVsaXZlcnlDaGFyZ2VzID8/IDApO1xyXG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsR3Jvc3NWYWx1ZSA9IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxOZXRWYWx1ZSArIHRoaXMuZ2V0VGF4QW1vdW50KCk7XHJcbiAgICAgIHRoaXMuY2FydEluZm8udG90YWxBbW91bnQgPSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsR3Jvc3NWYWx1ZSArIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzIC0gdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kaXNjb3VudEFtb3VudDtcclxuICAgICAgdGhpcy5jYXJ0SW5mby5vcmRlcmVkSXRlbXMgPSB0aGlzLlVTRVJfQ0FSVF9JVEVNUztcclxuICAgIH0pXHJcbiAgfVxyXG4gIGFkZFRvQ2FydChpdGVtOiBPcmRlcmVkSXRlbXMsIHF1YW50aXR5OiBudW1iZXIpIHtcclxuICAgIC8vIGlmICh0eXBlID09ICdBREQnKSB7XHJcbiAgICAvLyAgIGl0ZW0ucXVhbnRpdHkgKz0gMTtcclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgLy8gICBpdGVtLnF1YW50aXR5IC09IDE7XHJcbiAgICAvLyB9XHJcbiAgICB0aGlzLnNob3dSZWVkZW1FcnJvciA9IGZhbHNlXHJcbiAgICAvLyBpdGVtLnF1YW50aXR5ID0gcXVhbnRpdHlcclxuICAgIGlmIChpdGVtLnF1YW50aXR5ICYmIGl0ZW0ucXVhbnRpdHkgPiAwKSB7XHJcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbUZyb21DYXJ0UGFnZShpdGVtLCB0aGlzLnJlc3BvbnNlRGF0YSkuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGVsaXZlcnlPcHRpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZGVsaXZlcnlPcHRpb25zXCIpID8/IFwie31cIik7XHJcbiAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbEdyb3NzVmFsdWUgPSAwO1xyXG4gICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxUYXggPSAwO1xyXG4gICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxUYXhBZnRlckRpc2NvdW50ID0gcmVzcG9uc2U/LmRhdGE/LmJpbGxkZXRhaWxzPy50b3RhbFRheEFmdGVyRGlzY291bnQgPz8gMDtcclxuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgPSAwO1xyXG4gICAgICAgIHRoaXMuY2FydEluZm8udG90YWxBbW91bnQgPSAwO1xyXG4gICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzID0gMDtcclxuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50ID0gcmVzcG9uc2U/LmRhdGE/LmJpbGxkZXRhaWxzPy5kaXNjb3VudEFtb3VudCA/PyAwO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kaXNjb3VudEFtb3VudCA8PSAwKSB7XHJcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5iaWxsZGV0YWlscy5jb3Vwb25Db2RlID0gbnVsbDtcclxuICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLmJpbGxkZXRhaWxzLmNvdXBvbklkID0gbnVsbDtcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiY291cG9uQ29kZVwiKTtcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiY291cG9uSWRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXNwb25zZT8uZGF0YT8ub3JkZXJlZEl0ZW1zLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbE5ldFZhbHVlICs9IChpdGVtLmRpc2NvdW50ZWRQcmljZSAqIChpdGVtLnF1YW50aXR5ID8/IDEpKTtcclxuICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxUYXggKz0gKGl0ZW0ucXVhbnRpdHkgKiAoaXRlbS5pdGVtVGF4ID8/IDApKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzID0gKGRlbGl2ZXJ5T3B0aW9uPy5taW5PcmRlckFtb3VudCA+IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlKSA/IDAgOiAoZGVsaXZlcnlPcHRpb24/LmRlbGl2ZXJ5Q2hhcmdlcyA/PyAwKTtcclxuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsR3Jvc3NWYWx1ZSA9IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxOZXRWYWx1ZSArIHRoaXMuZ2V0VGF4QW1vdW50KCk7XHJcbiAgICAgICAgdGhpcy5jYXJ0SW5mby50b3RhbEFtb3VudCA9IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlICsgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgLSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50O1xyXG4gICAgICAgIHRoaXMuY2FydEluZm8ub3JkZXJlZEl0ZW1zID0gdGhpcy5VU0VSX0NBUlRfSVRFTVM7XHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNhcnRJZDogYW55XHJcbiAgcGxhY2VPcmRlckxvYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGFzeW5jIHByb2NlZWRUb1BheW1lbnQoKSB7XHJcbiAgICB0aGlzLnBsYWNlT3JkZXJMb2FkZXIgPSB0cnVlO1xyXG4gICAgbGV0IHJlc3VsdDogYW55ID0gXCJcIjtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByYXdEYXRhID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRSZWZlcnJhbERldGFpbHMoKTtcclxuICAgICAgY29uc3QgcmVmZXJyYWxEZXRhaWxzID0gcmF3RGF0YSA/IEpTT04ucGFyc2UocmF3RGF0YSkgOiB7fTtcclxuXHJcbiAgICAgIGlmIChyZWZlcnJhbERldGFpbHMgJiYgT2JqZWN0LmtleXMocmVmZXJyYWxEZXRhaWxzKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmVzdWx0ID1cclxuICAgICAgICAgIE9iamVjdC52YWx1ZXMocmVmZXJyYWxEZXRhaWxzKS5maW5kKChpdGVtOiBhbnkpID0+XHJcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaXRlbT8ucmVmZXJyYWxFdmVudHMpICYmXHJcbiAgICAgICAgICAgIGl0ZW0ucmVmZXJyYWxFdmVudHMuaW5jbHVkZXMoJ1BST0RVQ1RfUFVSQ0hBU0UnKVxyXG4gICAgICAgICAgKSB8fCBcIlwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkludmFsaWQgcmVmZXJyYWxEZXRhaWxzIEpTT05cIiwgZXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCkpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnTG9naW4nLCBkZXRhaWw6ICdQbGVhc2UgbG9naW4gd2l0aCBtb2JpbGUgbnVtYmVyIHRvIG9yZGVyJyB9KTtcclxuICAgICAgdGhpcy5wbGFjZU9yZGVyTG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc1BheW1lbnRHYXRld2F5RW5hYmxlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaXNQYXltZW50R2F0ZXdheUVuYWJsZWRcIikgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImlzUGF5bWVudEdhdGV3YXlFbmFibGVkXCIpID09IFwidHJ1ZVwiIDogdHJ1ZTtcclxuICAgIGNvbnN0IG1lcmNoYW50SWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncE1JZCcpID09IFwibnVsbFwiIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwTUlkJykgPT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncE1JZCcpO1xyXG5cclxuICAgIGlmIChpc1BheW1lbnRHYXRld2F5RW5hYmxlZCAmJiAhbWVyY2hhbnRJZCkge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnTWVyY2hhbnQgb25ib2FyZGVkJywgZGV0YWlsOiAnTWVyY2hhbnQgaXMgbm90IG9uYm9hcmRlZCcgfSk7XHJcbiAgICAgIHRoaXMucGxhY2VPcmRlckxvYWRlciA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXNlckRldGFpbCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXI7XHJcbiAgICBjb25zdCBhZGRyZXNzID0gdXNlckRldGFpbD8uYWRkcmVzc0RldGFpbHNMaXN0W3RoaXMuc2VsZWN0ZWRBZGRyZXNzSWR4XSBhcyBBZGRyZXNzO1xyXG4gICAgaWYgKGFkZHJlc3M/LnJlY2VpdmVyTmFtZT8ubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ1BheW1lbnQgRmFpbHVyZScsIGRldGFpbDogJ1BsZWFzZSBwcm92aWRlIGFkZHJlc3MgZGV0YWlscycgfSk7XHJcbiAgICAgIHRoaXMucGxhY2VPcmRlckxvYWRlciA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNhcnRJZFwiKSA9PSBcInVuZGVmaW5lZFwiIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY2FydElkXCIpID09IFwibnVsbFwiKSlcclxuICAgICAgdGhpcy5jYXJ0SW5mb1tcImNhcnRJZFwiXSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY2FydElkXCIpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ1BsZWFzZSB3YWl0JywgZGV0YWlsOiAnV2UgYXJlIHByb2Nlc3NpbmcgeW91ciBwYXltZW50JywgbGlmZTogMjAwMCB9KTtcclxuICAgICAgYXdhaXQgdGhpcy5yZXN0U2VydmljZS5hZGRJdGVtVG9EQih0aGlzLmNhcnRJbmZvKS50b1Byb21pc2UoKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJjYXJ0SWRcIiwgcmVzcG9uc2UuZGF0YT8uY2FydElkKTtcclxuICAgICAgICB0aGlzLmNhcnRJZCA9IHJlc3BvbnNlLmRhdGE/LmNhcnRJZDtcclxuICAgICAgICB0aGlzLmNhcnRJbmZvW1wiY2FydElkXCJdID0gcmVzcG9uc2UuZGF0YT8uY2FydElkO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXM/LmlzUG9pbnRzUmVkZWVtaW5nID09PSB0cnVlKSB7XHJcbiAgICAgIGlmICgodGhpcz8ucmVkZW1wdGlvblBvaW50cz8ucG9pbnRzQ29udmVydGVkUnVwZWVzID09PSB0aGlzLnJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQpIHx8ICh0aGlzPy5yZWRlbXB0aW9uUG9pbnRzPy5wb2ludHNDb252ZXJ0ZWRSdXBlZXMgPiB0aGlzLnJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQpKSB7XHJcbiAgICAgICAgdGhpcy5wYXltZW50V2l0aENvbXBsZXRlUG9pbnRzKClcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY2FydEluZm9bXCJhZGRyZXNzRGV0YWlsc1wiXSA9IGFkZHJlc3M7XHJcbiAgICBjb25zdCB1cGRhdGVBZGRyZXNzID0gYXdhaXQgdGhpcy5yZXN0U2VydmljZS5hZGRJdGVtVG9EQih0aGlzLmNhcnRJbmZvKS50b1Byb21pc2UoKTtcclxuICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgIFwidXNlcklkXCI6IHVzZXJEZXRhaWw/LnVzZXJJZCxcclxuICAgICAgXCJjYXJ0SWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRJZCcpLFxyXG4gICAgICAvLyBcIm9yZGVyQW1vdW50XCI6IHRoaXMuaXNQb2ludHNSZWRlZW1pbmdcclxuICAgICAgLy8gICA/IE51bWJlcigoKHRoaXMucmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCA/PyAwKSAtICh0aGlzPy50b3RhbFNhdmluZ0FtdCB8fCAwKSkudG9GaXhlZCgyKSlcclxuICAgICAgLy8gICA6IHRoaXMuc2VsZWN0ZWRWb3VjaGVyQW1vdW50ID8gTnVtYmVyKCgodGhpcy5yZXNwb25zZURhdGE/LnRvdGFsQW1vdW50ID8/IDApIC0gKHRoaXM/LnNlbGVjdGVkVm91Y2hlckFtb3VudCB8fCAwKSkudG9GaXhlZCgyKSkgOiBOdW1iZXIoKHRoaXMucmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCA/PyAwKS50b0ZpeGVkKDIpKSxcclxuICAgICAgXCJvcmRlckFtb3VudFwiOiB0aGlzLmlzUG9pbnRzUmVkZWVtaW5nXHJcbiAgICAgICAgPyBOdW1iZXIoKCh0aGlzLnJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgPz8gMCkgLSAodGhpcz8udG90YWxTYXZpbmdBbXQgfHwgMCkpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgOiB0aGlzLmNvdXBvblZhbHVlVHlwZSA9PT0gJ0FNT1VOVCdcclxuICAgICAgICAgID8gTnVtYmVyKCgodGhpcy5yZXNwb25zZURhdGE/LnRvdGFsQW1vdW50ID8/IDApIC0gKHRoaXM/LnNlbGVjdGVkVm91Y2hlckFtb3VudCB8fCAwKSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgIDogdGhpcy5jb3Vwb25WYWx1ZVR5cGUgPT09ICdQRVJDRU5UQUdFJ1xyXG4gICAgICAgICAgICA/IE51bWJlcigoKHRoaXMucmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCA/PyAwKSAtICh0aGlzPy5wZXJjZW50YWdlUmVkdWNlZCB8fCAwKSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgOiBOdW1iZXIoKHRoaXMucmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCA/PyAwKS50b0ZpeGVkKDIpKSxcclxuICAgICAgXCJpc1BheW1lbnRHYXRld2F5RW5hYmxlZFwiOiBpc1BheW1lbnRHYXRld2F5RW5hYmxlZCxcclxuICAgICAgXCJjb250YWN0RGV0YWlsc1wiOiB7XHJcbiAgICAgICAgXCJuYW1lXCI6IGFkZHJlc3M/LnJlY2VpdmVyTmFtZSxcclxuICAgICAgICBcIm1vYmlsZVwiOiBhZGRyZXNzPy5yZWNlaXZlclBob25lLFxyXG4gICAgICAgIFwiY291bnRyeUNvZGVcIjogXCI5MVwiLFxyXG4gICAgICAgIFwiZW1haWxcIjogYWRkcmVzcz8ucmVjZWl2ZXJFbWFpbFxyXG4gICAgICB9LFxyXG4gICAgICBcInBheW1lbnRNZXJjaGFudElkXCI6IG1lcmNoYW50SWQsXHJcbiAgICAgIFwiaXNKZXdlbGxlcnlcIjogdGhpcz8uaXNKZXdlbGxlcnksXHJcbiAgICAgIFwicmVmZXJyYWxJZFwiOiByZXN1bHQ/LnJlZmVycmFsVW5pcXVlSWQsXHJcbiAgICAgIFwicmV3YXJkVXNlZFwiOiB0aGlzPy5pc1BvaW50c1JlZGVlbWluZyA/IFwiUkVXQVJEX1BPSU5UU1wiIDogdGhpcz8uYXBwbGllZFZvdWNoZXIgPyBcIlZPVUNIRVJcIiA6IG51bGwsXHJcbiAgICAgIFwicG9pbnRzVXNlZFwiOiB0aGlzPy5pc1BvaW50c1JlZGVlbWluZyA/IHRoaXMudXNlZFBvaW50cyA6IDAsXHJcbiAgICAgIFwicG9pbnRzQ29udmVydGVkSU5SXCI6IHRoaXM/LmlzUG9pbnRzUmVkZWVtaW5nID8gdGhpcy50b3RhbFNhdmluZ0FtdCA6IDAsXHJcbiAgICAgIFwidm91Y2hlclZhbHVlXCI6IHRoaXMuc2VsZWN0ZWRWb3VjaGVyQW1vdW50ID8gdGhpcy5zZWxlY3RlZFZvdWNoZXJBbW91bnQgOiB0aGlzLnBlcmNlbnRhZ2VSZWR1Y2VkID8gdGhpcy5wZXJjZW50YWdlUmVkdWNlZCA6IDAsXHJcbiAgICAgIFwidm91Y2hlcklkXCI6IHRoaXM/LmFwcGxpZWRWb3VjaGVyID8gdGhpcy5zZWxlY3RlZFZvdWNoZXJJZCA6IG51bGwsXHJcbiAgICAgIFwidm91Y2hlckNvZGVcIjogdGhpcz8uYXBwbGllZFZvdWNoZXIgPyB0aGlzLnNlbGVjdGVkVm91Y2hlckNvZGUgOiAnJ1xyXG4gICAgfVxyXG4gICAgLy8gY29uc29sZS5sb2cocGF5bG9hZClcclxuICAgIC8vIHJldHVyblxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5jcmVhdGVQYXltZW50VG9rZW4ocGF5bG9hZCkuc3Vic2NyaWJlKChwYXltZW50RGV0YWlsczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChpc1BheW1lbnRHYXRld2F5RW5hYmxlZCkge1xyXG4gICAgICAgIHRoaXMuX2V2ZW50U2VydmljZS5jYXNoRnJlZUV2ZW50LmVtaXQocGF5bWVudERldGFpbHMpO1xyXG4gICAgICAgIHRoaXMucGxhY2VPcmRlckxvYWRlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcIm9yZGVySWRcIik7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJjYXJ0SWRcIik7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJwYXltZW50Rm9yXCIpO1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuY2xlYXJVc2VyQ2FydCgpO1xyXG4gICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICBpY29uOiBcInN1Y2Nlc3NcIixcclxuICAgICAgICAgIHRpdGxlOiBcIkh1cnJheVwiLFxyXG4gICAgICAgICAgdGV4dDogXCJPcmRlciBwbGFjZWQgc3VjY2Vzc2Z1bGx5XCIsXHJcbiAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogXCJTZWUgRGV0YWlsc1wiLFxyXG4gICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlXHJcbiAgICAgICAgfSkudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZS5pc0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9wcm9maWxlJ10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5wbGFjZU9yZGVyTG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICBpZiAoZXJyb3I/LmVycm9yPy5jb2RlID09IDQwOSkge1xyXG4gICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICBpY29uOiBcImluZm9cIixcclxuICAgICAgICAgIGh0bWw6IFwiPHA+XCIgKyBlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UucmVwbGFjZSgvICpcXChbXildKlxcKSAqL2csIFwiXCIpICsgXCI8L3A+XCIsXHJcbiAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWVcclxuICAgICAgICB9KS50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50VGFiID0gXCJCQUdcIjtcclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdQYXltZW50IEZhaWx1cmUnLCBkZXRhaWw6ICdQbGVhc2UgdHJ5IGFnYWluJyB9KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBsYWNlT3JkZXJMb2FkZXIgPSBmYWxzZTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgYWRkcmVzc1NlbGVjdGVkKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRBZGRyZXNzSWR4ID0gaW5kZXg7XHJcbiAgfVxyXG5cclxuICBpc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3Q6IE9yZGVyZWRJdGVtcykge1xyXG4gICAgcmV0dXJuIGZhbHNlOyAvLyBuZWVkIGNvbmRpdGlvblxyXG4gIH1cclxuICBnZXRLZXlzKG9iamVjdDogT2JqZWN0KTogc3RyaW5nW10ge1xyXG4gICAgaWYgKG9iamVjdClcclxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCk7XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG5cclxuICBlZGl0U2VjdGlvbigpIHtcclxuXHJcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gNDc1KVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGhpcy5fZXZlbnRTZXJ2aWNlLnRvZ2dsZUVkaXRvckV2ZW50LmVtaXQoZmFsc2UpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2V2ZW50U2VydmljZS5lZGl0U2VjdGlvbi5lbWl0KHsgZGF0YTogdGhpcy5kYXRhIH0pO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcbiAgY2xvc2VXaW5kb3coKSB7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gIH1cclxuICBjb3Vwb25EaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xyXG4gIGlzQ291cG9uRGlhbG9nT3BlbmluZyA9IGZhbHNlO1xyXG5cclxuICBvcGVuRGlhbG9nKGNvbnRhaW5lcjogYW55KSB7XHJcblxyXG4gICAgaWYgKHRoaXMuY291cG9uRGlhbG9nUmVmIHx8IHRoaXMuaXNDb3Vwb25EaWFsb2dPcGVuaW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzQ291cG9uRGlhbG9nT3BlbmluZyA9IHRydWU7XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmNhcnRJbmZvPy5iaWxsZGV0YWlscz8uY291cG9uSWQpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoIXRoaXMuY2FydEluZm8uY2FydElkICYmICEobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjYXJ0SWRcIikgPT0gXCJ1bmRlZmluZWRcIiB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNhcnRJZFwiKSA9PSBcIm51bGxcIikpXHJcbiAgICAgIHRoaXMuY2FydEluZm8uY2FydElkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjYXJ0SWRcIik7XHJcblxyXG4gICAgLy8gaWYgKCF0aGlzLmNhcnRJbmZvPy5jYXJ0SWQpIHtcclxuICAgIC8vICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ1lvdSBhcmUgbm90IGxvZ2dlZCBpbicsIGRldGFpbDogJ1BsZWFzZSBsb2dpbiBmaXJzdCB0byBhcHBseSBjb3Vwb24nIH0pO1xyXG4gICAgLy8gICByZXR1cm47XHJcbiAgICAvLyB9XHJcblxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5hcHBsaWNhYmxlRGlzY291bnRMaXN0KHRoaXMuY2FydEluZm8uY2FydElkKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5jb3Vwb25MaXN0ID0gcmVzcG9uc2UuZGF0YT8uZmlsdGVyKChjb3Vwb246IGFueSkgPT4gY291cG9uLmFjdGl2ZSk/Lm1hcCgoY291cG9uOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgZGlzY291bnRUeXBlOiBjb3Vwb24uZGlzY291bnQsXHJcbiAgICAgICAgICBkaXNjb3VudE5hbWU6IGNvdXBvbi5jb3Vwb25UaXRsZSxcclxuICAgICAgICAgIGRpc2NvdW50RGVzY3JpcHRpb246IGNvdXBvbi5jb3Vwb25EZXNjcmlwdGlvbixcclxuICAgICAgICAgIGNvdXBvbkNvZGU6IGNvdXBvbi5jb3Vwb25Db2RlLFxyXG4gICAgICAgICAgY291cG9uSWQ6IGNvdXBvbi5jb3Vwb25JZCxcclxuICAgICAgICAgIGFwcGxpY2FibGU6IGNvdXBvbi5hcHBsaWNhYmxlLFxyXG4gICAgICAgICAgc3RhdHVzOiBjb3Vwb24uYWN0aXZlLFxyXG4gICAgICAgICAgdmFsaWRUbzogY291cG9uLmV4cGlyZXMsXHJcbiAgICAgICAgICB2YWxpZEZyb206IGNvdXBvbi52YWxpZEZyb21cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCkpIHtcclxuICAgICAgICB0aGlzLmNvdXBvbkRpYWxvZ1JlZiA9IHRoaXMubWF0RGlhbG9nLm9wZW4oY29udGFpbmVyLCB7IHBhbmVsQ2xhc3M6ICdzaWRlcGFuZWwtY2xhc3MnIH0pO1xyXG4gICAgICAgIHRoaXMuY291cG9uRGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY291cG9uRGlhbG9nUmVmID0gbnVsbDtcclxuICAgICAgICAgIHRoaXMuaXNDb3Vwb25EaWFsb2dPcGVuaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdMb2dpbicsIGRldGFpbDogJ1BsZWFzZSBsb2dpbiB3aXRoIG1vYmlsZSBudW1iZXIgdG8gYXBwbHkgY291cG9uJyB9KTtcclxuICAgICAgICB0aGlzLmlzQ291cG9uRGlhbG9nT3BlbmluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbGlzdFJlZGVtcHRpb25Db3Vwb25zOiBhbnk7XHJcbiAgYXBwbGllZFZvdWNoZXI6IGFueTtcclxuICByZWRlbXB0aW9uVHlwZTogXCJDT1VQT05TXCIgfCBcIlZPVUNIRVJTXCIgPSBcIkNPVVBPTlNcIlxyXG4gIHJlZGVtcHRpb25Db3Vwb25UeXBlOiBcIlJFV0FSRFNcIiB8IFwiRElTQ09VTlRTXCIgPSBcIlJFV0FSRFNcIlxyXG4gIHNlbGVjdGVkVm91Y2hlcklkOiBhbnlcclxuICBzZWxlY3RlZFZvdWNoZXJBbW91bnQ6IGFueVxyXG4gIHNlbGVjdGVkVm91Y2hlckNvZGU6IGFueVxyXG4gIGxpc3RSZWRlbXB0aW9uVm91Y2hlcnM6IGFueVxyXG4gIHNlbGVjdGVkVm91Y2hlclBlcmNlbnRhZ2U6IGFueVxyXG4gIHBlcmNlbnRhZ2VSZWR1Y2VkOiBhbnlcclxuICBjb3Vwb25WYWx1ZVR5cGU6IHN0cmluZyA9ICcnXHJcbiAgYWRkUmVkZW1wdGlvbkNvdXBvbihjb250YWluZXI6IGFueSkge1xyXG4gICAgbGV0IGJ1c2luZXNzSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJJZFwiKSA/PyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJ1c2luZXNzSWRcIilcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXIpO1xyXG4gICAgbGV0IHVzZXJJZCA9IHVzZXJEZXRhaWxzPy51c2VySWRcclxuICAgIGxldCBvcmRlclZhbHVlID0gdGhpcy5yZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy50b3RhbE5ldFZhbHVlXHJcbiAgICAvLyBsZXQgYnVzaW5lc3NJZCA9ICcxZjEyZGYxNi04MTU0LTZjZWEtODVjNS1mYjYxNmM0N2FhZjQnO1xyXG4gICAgLy8gbGV0IHVzZXJJZCA9ICcyOWQyYjQyNC02ODBjLTQ2YmQtYjE4Zi1iODZiMzQ2ZWIxY2YnOyBcclxuICAgIC8vIGxldCBvcmRlclZhbHVlID0gdGhpcy5yZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy50b3RhbE5ldFZhbHVlO1xyXG5cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UmVkZWVtUG9pbnRzKGJ1c2luZXNzSWQsIHVzZXJJZCwgJ1BST0RVQ1RfUFVSQ0hBU0UnLCBvcmRlclZhbHVlLCBmYWxzZSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzKVxyXG4gICAgICAgIHRoaXMubGlzdFJlZGVtcHRpb25Db3Vwb25zID0gcmVzO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0NvdXBvbnMgRmFpbGVkJywgZGV0YWlsOiAnRmFpbGVkIHRvIGxvYWQgQ291cG9ucycgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5hcHBsaWNhYmxlRGlzY291bnRMaXN0KHRoaXMuY2FydEluZm8uY2FydElkKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5jb3Vwb25MaXN0ID0gcmVzcG9uc2UuZGF0YT8uZmlsdGVyKChjb3Vwb246IGFueSkgPT4gY291cG9uLmFjdGl2ZSk/Lm1hcCgoY291cG9uOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgZGlzY291bnRUeXBlOiBjb3Vwb24uZGlzY291bnQsXHJcbiAgICAgICAgICBkaXNjb3VudE5hbWU6IGNvdXBvbi5jb3Vwb25UaXRsZSxcclxuICAgICAgICAgIGRpc2NvdW50RGVzY3JpcHRpb246IGNvdXBvbi5jb3Vwb25EZXNjcmlwdGlvbixcclxuICAgICAgICAgIGNvdXBvbkNvZGU6IGNvdXBvbi5jb3Vwb25Db2RlLFxyXG4gICAgICAgICAgY291cG9uSWQ6IGNvdXBvbi5jb3Vwb25JZCxcclxuICAgICAgICAgIGFwcGxpY2FibGU6IGNvdXBvbi5hcHBsaWNhYmxlLFxyXG4gICAgICAgICAgc3RhdHVzOiBjb3Vwb24uYWN0aXZlLFxyXG4gICAgICAgICAgdmFsaWRUbzogY291cG9uLmV4cGlyZXMsXHJcbiAgICAgICAgICB2YWxpZEZyb206IGNvdXBvbi52YWxpZEZyb21cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSlcclxuICAgIHRoaXMuY291cG9uRGlhbG9nUmVmID0gdGhpcy5tYXREaWFsb2cub3Blbihjb250YWluZXIsIHsgcGFuZWxDbGFzczogJ3NpZGVwYW5lbC1jbGFzcycgfSk7XHJcbiAgfVxyXG5cclxuICBhcHBseVJlZGVtcHRpb25Db3Vwb24odm91Y2hlcjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5pc1BvaW50c1JlZGVlbWluZykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdDb3Vwb24gbm90IGFwcGxpY2FibGUnLCBkZXRhaWw6ICdZb3UgY2FuIG5vdCBhZGQgYSBjb3Vwb24gd2hlbiBwb2ludHMgYXJlIGJlaW5nIHJlZGVlbWVkJyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYXBwbGllZFZvdWNoZXIpIHtcclxuICAgICAgdGhpcy5yZW1vdmVSZWRlbXB0aW9uQ291cG9uKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcGxpZWRWb3VjaGVyID0gdm91Y2hlcjtcclxuICAgIHRoaXMuc2VsZWN0ZWRWb3VjaGVySWQgPSB2b3VjaGVyLmNvdXBvbklkO1xyXG4gICAgdGhpcy5zZWxlY3RlZFZvdWNoZXJDb2RlID0gdm91Y2hlci52b3VjaGVyQ29kZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRWb3VjaGVyUGVyY2VudGFnZSA9IHZvdWNoZXIuY291cG9uVmFsdWVcclxuXHJcbiAgICBsZXQgdG90YWwgPSBOdW1iZXIodGhpcy5yZXNwb25zZURhdGE/LnRvdGFsQW1vdW50KSB8fCAwO1xyXG4gICAgbGV0IHBlcmNlbnRhZ2UgPSBOdW1iZXIodGhpcy5zZWxlY3RlZFZvdWNoZXJQZXJjZW50YWdlKSB8fCAwO1xyXG4gICAgbGV0IGFtdCA9IHRvdGFsICogKHBlcmNlbnRhZ2UgLyAxMDApO1xyXG5cclxuICAgIGlmICh2b3VjaGVyLmNvdXBvblZhbHVlVHlwZSA9PT0gJ1BFUkNFTlRBR0UnKSB7XHJcbiAgICAgIHRoaXMuY291cG9uVmFsdWVUeXBlID0gXCJQRVJDRU5UQUdFXCJcclxuICAgICAgaWYgKGFtdCA+IHZvdWNoZXIubWF4UmVkZWVtYWJsZUFtb3VudCkge1xyXG4gICAgICAgIHRoaXMucGVyY2VudGFnZVJlZHVjZWQgPSB2b3VjaGVyLm1heFJlZGVlbWFibGVBbW91bnRcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnBlcmNlbnRhZ2VSZWR1Y2VkID0gYW10XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmNvdXBvblZhbHVlVHlwZSA9IFwiQU1PVU5UXCJcclxuICAgICAgdGhpcy5zZWxlY3RlZFZvdWNoZXJBbW91bnQgPSB2b3VjaGVyLmNvdXBvblZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xvc2VEaWFsb2dSZWYoKTtcclxuICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgIGljb246IFwic3VjY2Vzc1wiLFxyXG4gICAgICB0aXRsZTogYFlvdSBzYXZlZCAke3RoaXMuc2VsZWN0ZWRWb3VjaGVyQW1vdW50ID8gJ+KCuScgOiAnJ30gJHt0aGlzLnNlbGVjdGVkVm91Y2hlckFtb3VudCA/IHRoaXMuc2VsZWN0ZWRWb3VjaGVyQW1vdW50IDogdGhpcy5zZWxlY3RlZFZvdWNoZXJQZXJjZW50YWdlfSAke3RoaXMuc2VsZWN0ZWRWb3VjaGVyQW1vdW50ID8gJycgOiAnJSd9IG9uIHRoaXMgcGF5bWVudGAsXHJcbiAgICAgIHRleHQ6IGBDb3Vwb24gY29kZSAke3RoaXMuc2VsZWN0ZWRWb3VjaGVyQ29kZX0gaGFzIGJlZW4gYXBwbGllZCBzdWNjZXNzZnVsbHlgLFxyXG4gICAgICBjb25maXJtQnV0dG9uVGV4dDogXCJZQVkhXCIsXHJcbiAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCIjMTExXCIsXHJcbiAgICB9KS50aGVuKChyZXMpID0+IHtcclxuICAgICAgaWYgKHJlcy5pc0NvbmZpcm1lZCB8fCByZXMuaXNEaXNtaXNzZWQpIHtcclxuICAgICAgICAvLyBwb3B1cCBjbG9zZWRcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJlbW92ZVJlZGVtcHRpb25Db3Vwb24oZXZlbnQ/OiBFdmVudCkge1xyXG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5hcHBsaWVkVm91Y2hlciA9IG51bGw7XHJcbiAgICB0aGlzLnNlbGVjdGVkVm91Y2hlcklkID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRWb3VjaGVyQ29kZSA9IG51bGw7XHJcbiAgICB0aGlzLnNlbGVjdGVkVm91Y2hlckFtb3VudCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZWFyY2hJZkFwcGxpY2FibGUoKSB7IH1cclxuICBjbG9zZURpYWxvZ1JlZigpIHtcclxuICAgIHRoaXMuY291cG9uRGlhbG9nUmVmPy5jbG9zZSgpO1xyXG4gIH1cclxuICBhcHBseUNvdXBvbihjb3Vwb246IENvdXBvbikge1xyXG5cclxuICAgIGlmICghY291cG9uLmFwcGxpY2FibGUpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmNvdXBvbkNvZGUgPSBjb3Vwb24uY291cG9uQ29kZTtcclxuICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuY291cG9uSWQgPSBjb3Vwb24uY291cG9uSWQ7XHJcbiAgICBjb25zdCByZXN0UmVzcG9uc2UgPSB0aGlzLnJlc3RTZXJ2aWNlLmFkZEl0ZW1Ub0RCKHRoaXMuY2FydEluZm8pLnRvUHJvbWlzZSgpO1xyXG4gICAgcmVzdFJlc3BvbnNlLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuXHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiY291cG9uSWRcIiwgY291cG9uLmNvdXBvbklkKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJjb3Vwb25Db2RlXCIsIGNvdXBvbi5jb3Vwb25Db2RlKTtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVDYXJ0KHJlc3BvbnNlKTtcclxuXHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ0NvdXBvbicsIGRldGFpbDogJ0NvdXBvbiBBcHBsaWVkJyB9KTtcclxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kaXNjb3VudEFtb3VudCA9IHJlc3BvbnNlPy5kYXRhPy5iaWxsZGV0YWlscz8uZGlzY291bnRBbW91bnQgPz8gMDtcclxuICAgICAgdGhpcy5jb3Vwb25EaWFsb2dSZWY/LmNsb3NlKCk7XHJcbiAgICB9KVxyXG4gIH1cclxuICBjYWxjdWxhdGVDYXJ0KHJlc3BvbnNlOiBhbnkpIHtcclxuICAgIGNvbnN0IGRlbGl2ZXJ5T3B0aW9uID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImRlbGl2ZXJ5T3B0aW9uc1wiKSA/PyBcInt9XCIpO1xyXG4gICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbEdyb3NzVmFsdWUgPSAwO1xyXG4gICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheCA9IDA7XHJcbiAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4QWZ0ZXJEaXNjb3VudCA9IHJlc3BvbnNlPy5kYXRhPy5iaWxsZGV0YWlscz8udG90YWxUYXhBZnRlckRpc2NvdW50ID8/IDA7XHJcbiAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyA9IDA7XHJcbiAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgPSAwO1xyXG4gICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kaXNjb3VudEFtb3VudCA9IHJlc3BvbnNlPy5kYXRhPy5iaWxsZGV0YWlscz8uZGlzY291bnRBbW91bnQgPz8gMDtcclxuICAgIHRoaXMuY2FydEluZm8udG90YWxBbW91bnQgPSAwO1xyXG5cclxuICAgIGlmICh0aGlzLlVTRVJfQ0FSVF9JVEVNUykge1xyXG5cclxuICAgICAgdGhpcy5VU0VSX0NBUlRfSVRFTVMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxOZXRWYWx1ZSArPSAoaXRlbS5kaXNjb3VudGVkUHJpY2UgKiAoaXRlbS5xdWFudGl0eSA/PyAxKSk7XHJcbiAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheCArPSAoaXRlbS5xdWFudGl0eSAqIChpdGVtLml0ZW1UYXggPz8gMCkpO1xyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyA9IChkZWxpdmVyeU9wdGlvbj8ubWluT3JkZXJBbW91bnQgPiB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsR3Jvc3NWYWx1ZSkgPyAwIDogKGRlbGl2ZXJ5T3B0aW9uPy5kZWxpdmVyeUNoYXJnZXMgPz8gMCk7XHJcbiAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlID0gdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbE5ldFZhbHVlICsgdGhpcy5nZXRUYXhBbW91bnQoKTtcclxuICAgICAgdGhpcy5jYXJ0SW5mby50b3RhbEFtb3VudCA9IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlICsgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgLSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50O1xyXG4gICAgICB0aGlzLmNhcnRJbmZvLm9yZGVyZWRJdGVtcyA9IHRoaXMuVVNFUl9DQVJUX0lURU1TO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXNwb25zZURhdGEgPSB0aGlzLmNhcnRJbmZvO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGF4QW1vdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gIXRoaXMuY2FydEluZm8uYmlsbGRldGFpbHM/LmNvdXBvbklkID8gKHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxUYXggPz8gMCkgOiAodGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscz8udG90YWxUYXhBZnRlckRpc2NvdW50ID8/IDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldEFkZHJlc3NMaXN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlckRldGFpbHMgPyBbLi4udGhpcy51c2VyRGV0YWlscz8uYWRkcmVzc0RldGFpbHNMaXN0XSA6IFtdO1xyXG4gIH1cclxuICBnZXQgaXNNb2JpbGUoKSB7XHJcbiAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPD0gNDc1O1xyXG4gIH1cclxuICBnZXQgY3VycmVuY3koKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBCVVNJTkVTU19DT05TVEFOVFMuQ1VSUkVOQ1k7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VBZGRyZXNzKCkge1xyXG4gICAgdGhpcy5tYXREaWFsb2cub3BlbihBZGRyZXNzTGlzdENvbXBvbmVudCwgeyBwYW5lbENsYXNzOiAnc2lkZXBhbmVsLWNsYXNzJywgZGF0YTogeyBhZGRyZXNzTGlzdDogdGhpcy5nZXRBZGRyZXNzTGlzdCB9IH0pLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnVzZXJEZXRhaWxzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCkgYXMgVXNlcjtcclxuICAgICAgdGhpcy5nZXREZWZhdWx0QWRkcmVzcygpO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGFkZEFkZHJlc3MoKSB7XHJcbiAgICB0aGlzLm1hdERpYWxvZy5vcGVuKEFkZHJlc3NDb21wb25lbnQsIHsgcGFuZWxDbGFzczogWydzaWRlcGFuZWwtY2xhc3MnLCAnYWRkcmVzcy1jbGFzcyddLCBkYXRhOiB7IGFkZHJlc3NMaXN0OiB0aGlzLmdldEFkZHJlc3NMaXN0LCAnZWRpdEluZGV4JzogLTEgfSB9KS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy51c2VyRGV0YWlscyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXI7XHJcbiAgICAgIHRoaXMuZ2V0RGVmYXVsdEFkZHJlc3MoKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBzY3JvbGwoZTogV2hlZWxFdmVudCkge1xyXG4gICAgY29uc3QgZCA9IHRoaXMuZDIubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGF0VG9wID0gZC5zY3JvbGxUb3AgPT09IDA7XHJcbiAgICBjb25zdCBhdEJvdHRvbSA9IGQuc2Nyb2xsVG9wID49IGQuc2Nyb2xsSGVpZ2h0IC0gZC5jbGllbnRIZWlnaHQ7XHJcbiAgICBpZiAoKGF0VG9wICYmIGUuZGVsdGFZIDwgMCkgfHwgKGF0Qm90dG9tICYmIGUuZGVsdGFZID4gMCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZC5zY3JvbGxUb3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkLnNjcm9sbFRvcCArIGUuZGVsdGFZICogMiwgZC5zY3JvbGxIZWlnaHQgLSBkLmNsaWVudEhlaWdodCkpO1xyXG4gIH1cclxuICBzZWxlY3RlZFJlZG1wYXRpb25EYXRhOiBhbnk7XHJcbiAgc2VsZWN0U2NoZW1lKCkge1xyXG4gICAgbGV0IGRpYWxvZyA9IHRoaXMubWF0RGlhbG9nLm9wZW4oU2NoZW1lU2VsZWN0aW9uQ29tcG9uZW50LCB7fSk7XHJcbiAgICBkaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFJlZGVtcHRpb24gPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUmVkbXBhdGlvbkRhdGEgPSByZXNwb25zZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBzY2hlZHVsZVZpZGVvQ2FsbChpdGVtczogYW55KSB7XHJcbiAgICB0aGlzLm1hdERpYWxvZy5vcGVuKFNjaGVkdWxlVmlkZW9DYWxsQ29tcG9uZW50LCB7IHBhbmVsQ2xhc3M6ICdzaWRlcGFuZWwtY2xhc3MnLCBkYXRhOiB7IGRhdGE6IHRoaXMuZGF0YSwgb3JkZXJJdGVtczogaXRlbXMgfSB9KTtcclxuICB9XHJcbiAgZ2V0QnV0dG9uSWQoaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zW2luZGV4XT8uaWQgPz8gXCJcIjtcclxuICB9XHJcbiAgZ2V0QnV0dG9uU3R5bGUoaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zW2luZGV4XT8uc3R5bGVzO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlUXVhbnRpdHkocXVhbnRpdHk6IGFueSwgaXRlbTogT3JkZXJlZEl0ZW1zKSB7XHJcbiAgICB0aGlzLmFkZFRvQ2FydChpdGVtLCBxdWFudGl0eS50YXJnZXQudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVHJpYWxJdGVtKGl0ZW06IE9yZGVyZWRJdGVtcykge1xyXG4gICAgdGhpcy50cmlhbENhcnRJdGVtID0gdGhpcy50cmlhbENhcnRJdGVtPy5maWx0ZXIoKHByb2R1Y3Q6IE9yZGVyZWRJdGVtcykgPT4gaXRlbS52YXJpZW50SWQgIT0gcHJvZHVjdC52YXJpZW50SWQpID8/IFtdO1xyXG5cclxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKVxyXG4gICAgaWYgKHVzZXIpIHtcclxuICAgICAgbGV0IHJlcXVlc3Q6IHN5bmNJdGVtVG9TZXJ2ZXJEQlJlcXVlc3QgPSBuZXcgc3luY0l0ZW1Ub1NlcnZlckRCUmVxdWVzdCh1c2VyLnVzZXJJZCwgJ1RSSUFMX0NBUlQnLCBbaXRlbV0pXHJcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZGVsZXRlSXRlbUZyb21DYXJ0KHJlcXVlc3QpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdUcmlhbCBQcm9kdWN0JywgZGV0YWlsOiAnRGVsZXRlZCBzdWNjZXNzZnVsbHknIH0pO1xyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmVQcm9kdWN0RnJvbVRyaWFsQ2FydChpdGVtLnZhcmllbnRJZClcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnVHJpYWwgUHJvZHVjdCcsIGRldGFpbDogJ0RlbGV0ZWQgc3VjY2Vzc2Z1bGx5JyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJvb2tBcHBvaW50bWVudCgpIHtcclxuICAgIGNvbnN0IHVzZXI6IFVzZXIgfCBudWxsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCk7XHJcbiAgICBpZiAoIXVzZXIpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnTG9naW4nLCBkZXRhaWw6ICdQbGVhc2UgbG9naW4gd2l0aCBtb2JpbGUgbnVtYmVyIHRvIEJvb2snIH0pO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9sb2dpbiddLCB7IHF1ZXJ5UGFyYW1zOiB7IHRyeUF0SG9tZTogdHJ1ZSB9IH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvaG9tZS1hcHBvaW50bWVudCddKVxyXG4gIH1cclxuICBzaG93UmVlZGVtRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB2YWlsZEFtb3VudDogbnVtYmVyID0gMFxyXG4gIHJlZGVlbVNjaGVtZShzY2hlbWU6IGFueSwgYWN0aW9uOiBib29sZWFuKSB7XHJcbiAgICBpZiAoKCh0aGlzLnJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgPz8gMCkgLSAodGhpcy5yZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy5kaXNjb3VudEFtb3VudCA/PyAwKSkgPCBzY2hlbWUuYW1vdW50KSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdTY2hlbWUgUmVkZWVtJywgZGV0YWlsOiAnQ2FydCBhbW91bnQgc2hvdWxkIGJlIG1vcmUgdGhhdCByZWRlZW0gYW1vdW50JyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzdFNlcnZpY2UucmVkZWVtU2NoZW1lKHNjaGVtZSwgdGhpcy5jYXJ0SW5mby5jYXJ0SWQsIGFjdGlvbikuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLm9ycmFTY2hlbWVSZWRlZW1lZEFtb3VudCA9IHNjaGVtZS5hbW91bnRcclxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5vcnJhU2NoZW1lQ29kZSA9IHNjaGVtZS5HUFBJZFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldFVybCgpIHtcclxuICAgIHJldHVybiB3aW5kb3c/LmxvY2F0aW9uPy5vcmlnaW4/LmluY2x1ZGVzKCdjYXJhdGxhbmUnKSB8fCB3aW5kb3c/LmxvY2F0aW9uPy5vcmlnaW4/LmluY2x1ZGVzKCdvcnJhJylcclxuICB9XHJcbiAgZ2V0IGZvbnRDb2xvcigpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNvbG9yID0gdGhpcy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yO1xyXG4gICAgaWYgKCFjb2xvcikgcmV0dXJuICcjMDAwJztcclxuXHJcbiAgICAvLyBpZiBncmFkaWVudCwgZXh0cmFjdCBmaXJzdCBoZXggY29sb3JcclxuICAgIGNvbnN0IGdyYWRpZW50TWF0Y2ggPSBjb2xvci5tYXRjaCgvIyhbMC05YS1mQS1GXXs2fSkvKTtcclxuICAgIGlmIChncmFkaWVudE1hdGNoKSB7XHJcbiAgICAgIGNvbG9yID0gZ3JhZGllbnRNYXRjaFswXTtcclxuICAgIH1cclxuXHJcbiAgICBjb2xvciA9IGNvbG9yLnJlcGxhY2UoJyMnLCAnJyk7XHJcblxyXG4gICAgY29uc3QgciA9IHBhcnNlSW50KGNvbG9yLnN1YnN0cmluZygwLCAyKSwgMTYpO1xyXG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGNvbG9yLnN1YnN0cmluZygyLCA0KSwgMTYpO1xyXG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGNvbG9yLnN1YnN0cmluZyg0LCA2KSwgMTYpO1xyXG5cclxuICAgIGNvbnN0IGJyaWdodG5lc3MgPSAociAqIDI5OSArIGcgKiA1ODcgKyBiICogMTE0KSAvIDEwMDA7XHJcblxyXG4gICAgcmV0dXJuIGJyaWdodG5lc3MgPiAxMjggPyAnIzAwMCcgOiAnI2ZmZic7XHJcbiAgfVxyXG4gIGdldCBhY2NlbnRCYWNrZ3JvdW5kKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBiZyA9IHRoaXMuc3R5bGVzPy5iYWNrZ3JvdW5kO1xyXG5cclxuICAgIGlmICghYmcpIHJldHVybiAnJztcclxuXHJcbiAgICBpZiAoYmcuYWNjZW50QmFja2dyb3VuZFR5cGUgPT09ICdTb2xpZCcpIHtcclxuICAgICAgcmV0dXJuIGJnLmFjY2VudENvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5nZXRHcmFkaWVudERpcmVjdGlvbihiZy5ncmFkaWVudERpcmVjdGlvbik7XHJcblxyXG4gICAgcmV0dXJuIGFuZ2xlXHJcbiAgICAgID8gYGxpbmVhci1ncmFkaWVudCgke2FuZ2xlfSwgJHtiZy5hY2NlbnRDb2xvcn0sICR7Ymcuc2Vjb25kYXJ5QWNjZW50Q29sb3J9KWBcclxuICAgICAgOiBgbGluZWFyLWdyYWRpZW50KCR7YmcuYWNjZW50Q29sb3J9LCAke2JnLnNlY29uZGFyeUFjY2VudENvbG9yfSlgO1xyXG4gIH1cclxuICBnZXRHcmFkaWVudERpcmVjdGlvbihkaXJlY3Rpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xyXG4gICAgICBjYXNlICdET1dOJzpcclxuICAgICAgICByZXR1cm4gJyc7IC8vIGRlZmF1bHQgdG9wIOKGkiBib3R0b20gKG5vIGFuZ2xlIG5lZWRlZClcclxuXHJcbiAgICAgIGNhc2UgJ1JJR0hUJzpcclxuICAgICAgICByZXR1cm4gJzkwZGVnJztcclxuXHJcbiAgICAgIGNhc2UgJ0RJQUdPTkFMX1JJR0hUJzpcclxuICAgICAgICByZXR1cm4gJzQ1ZGVnJztcclxuXHJcbiAgICAgIGNhc2UgJ0RJQUdPTkFMX0xFRlQnOlxyXG4gICAgICAgIHJldHVybiAnMTM1ZGVnJztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICcnOyAvLyBmYWxsYmFja1xyXG4gICAgfVxyXG4gIH1cclxuICBpbmNyZWFzZVF0eShpdGVtOiBhbnkpIHtcclxuICAgIGlmICghdGhpcy5lZGl0KSB7XHJcbiAgICAgIGl0ZW0ucXVhbnRpdHkrKztcclxuICAgICAgdGhpcy5hZGRUb0NhcnQoaXRlbSwgaXRlbS5xdWFudGl0eSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkZWNyZWFzZVF0eShpdGVtOiBhbnkpIHtcclxuICAgIGlmICghdGhpcy5lZGl0KSB7XHJcbiAgICAgIGl0ZW0ucXVhbnRpdHktLTtcclxuICAgICAgdGhpcy5hZGRUb0NhcnQoaXRlbSwgaXRlbS5xdWFudGl0eSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWZlckVhcm5FeGlzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUG9pbnRzUmVkZWVtaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcmVkZW1wdGlvblBvaW50czogYW55XHJcbiAgY2hlY2tBcHBJbnN0YWxsZWQoKSB7XHJcbiAgICBsZXQgYnVzaW5lc3NJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYklkXCIpID8/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYnVzaW5lc3NJZFwiKVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5jaGVja0FwcEluc3RhbGxlZChidXNpbmVzc0lkLCAnUmVmZXIgYW5kIEVhcm4nKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnJlZmVyRWFybkV4aXN0ID0gcmVzLmRhdGFcclxuICAgICAgICB0aGlzLmdldFJlZGVlbVBvaW50cygpXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB0b3RhbFNhdmluZ0FtdDogbnVtYmVyID0gMFxyXG4gIHRvdGFsU2F2aW5nUG9pbnRzOiBudW1iZXIgPSAwXHJcbiAgcG9pbnRzQ29udmVydGVkOiBudW1iZXIgPSAwXHJcbiAgdXNlZFBvaW50czogYW55XHJcbiAgZ2V0UmVkZWVtUG9pbnRzKCkge1xyXG4gICAgbGV0IGJ1c2luZXNzSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJJZFwiKSA/PyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJ1c2luZXNzSWRcIilcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXIpO1xyXG4gICAgbGV0IHVzZXJJZCA9IHVzZXJEZXRhaWxzPy51c2VySWRcclxuICAgIGxldCBvcmRlclZhbHVlID0gdGhpcy5yZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy50b3RhbE5ldFZhbHVlXHJcbiAgICAvLyBsZXQgYnVzaW5lc3NJZCA9ICcxZjEyZGYxNi04MTU0LTZjZWEtODVjNS1mYjYxNmM0N2FhZjQnXHJcbiAgICAvLyBsZXQgdXNlcklkID0gJzI5ZDJiNDI0LTY4MGMtNDZiZC1iMThmLWI4NmIzNDZlYjFjZidcclxuICAgIC8vIGxldCBvcmRlclZhbHVlID0gdGhpcy5yZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy50b3RhbE5ldFZhbHVlXHJcblxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRSZWRlZW1Qb2ludHMoYnVzaW5lc3NJZCwgdXNlcklkLCAnUFJPRFVDVF9QVVJDSEFTRScsIG9yZGVyVmFsdWUsIHRydWUpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVkZW1wdGlvblBvaW50cyA9IHJlc1xyXG4gICAgICAgIHRoaXMucG9pbnRzQ29udmVydGVkID0gcmVzLmF2YWlsYWJsZVBvaW50cyAvIHJlcy5wb2ludHNDb252ZXJ0ZWRSdXBlZXM7XHJcbiAgICAgICAgdGhpcy50b3RhbFNhdmluZ0FtdCA9IHRoaXMuZ2V0UmVtYWluaW5nUnVwZWVzXHJcbiAgICAgICAgdGhpcy50b3RhbFNhdmluZ1BvaW50cyA9IHRoaXMuZ2V0UmVtYWluaW5nUG9pbnRzXHJcbiAgICAgICAgdGhpcy51c2VkUG9pbnRzID0gdGhpcy5nZXRSZW1haW5pbmdSdXBlZXMgKiB0aGlzLnBvaW50c0NvbnZlcnRlZDtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG5cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG9uUG9pbnRzUmVkZWVtaW5nQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuYXBwbGllZFZvdWNoZXIpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAgIHNldmVyaXR5OiAnaW5mbycsXHJcbiAgICAgICAgc3VtbWFyeTogJ1BvaW50cyBSZWRlZW0nLFxyXG4gICAgICAgIGRldGFpbDogJ1lvdSBjYW4gbm90IHJlZGVlbSBwb2ludHMgd2hlbiBhIGNvdXBvbiBpcyBhcHBsaWVkLiBQbGVhc2UgcmVtb3ZlIHRoZSBjb3Vwb24gdG8gcmVkZWVtIHBvaW50cydcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzUG9pbnRzUmVkZWVtaW5nID0gIXRoaXMuaXNQb2ludHNSZWRlZW1pbmc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBGb3IgcmVwZW1wdGlvblxyXG4gIGdldCBnZXRSZW1haW5pbmdQb2ludHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcz8ucmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCA+IHRoaXM/LnJlZGVtcHRpb25Qb2ludHMucG9pbnRzQ29udmVydGVkUnVwZWVzID8gMCA6ICh0aGlzPy5yZWRlbXB0aW9uUG9pbnRzLmF2YWlsYWJsZVBvaW50cyAtIHRoaXM/LnJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgKiB0aGlzLnBvaW50c0NvbnZlcnRlZClcclxuICB9XHJcblxyXG4gIGdldCBnZXRSZW1haW5pbmdSdXBlZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcz8ucmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCA+IHRoaXM/LnJlZGVtcHRpb25Qb2ludHM/LnBvaW50c0NvbnZlcnRlZFJ1cGVlcyA/IHRoaXM/LnJlZGVtcHRpb25Qb2ludHM/LnBvaW50c0NvbnZlcnRlZFJ1cGVlcyA6IHRoaXM/LnJlc3BvbnNlRGF0YT8udG90YWxBbW91bnRcclxuICB9XHJcblxyXG4gIHBheW1lbnRXaXRoQ29tcGxldGVQb2ludHMoKSB7XHJcbiAgICBsZXQgY2FydElkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRJZCcpXHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgcmV3YXJkVXNlZDogdGhpcz8uaXNQb2ludHNSZWRlZW1pbmcgPyBcIlJFV0FSRF9QT0lOVFNcIiA6IHRoaXM/LmFwcGxpZWRWb3VjaGVyID8gXCJWT1VDSEVSXCIgOiBudWxsLFxyXG4gICAgICBwb2ludHNVc2VkOiB0aGlzPy5pc1BvaW50c1JlZGVlbWluZyA/IHRoaXMudXNlZFBvaW50cyA6IDAsXHJcbiAgICAgIHBvaW50c0NvbnZlcnRlZElOUjogdGhpcz8uaXNQb2ludHNSZWRlZW1pbmcgPyB0aGlzLnRvdGFsU2F2aW5nQW10IDogMCxcclxuICAgICAgdm91Y2hlclZhbHVlOiB0aGlzLnNlbGVjdGVkVm91Y2hlckFtb3VudCA/IHRoaXMuc2VsZWN0ZWRWb3VjaGVyQW1vdW50IDogdGhpcy5wZXJjZW50YWdlUmVkdWNlZCA/IHRoaXMucGVyY2VudGFnZVJlZHVjZWQgOiAwLFxyXG4gICAgICB2b3VjaGVySWQ6IHRoaXM/LmFwcGxpZWRWb3VjaGVyID8gdGhpcy5zZWxlY3RlZFZvdWNoZXJJZCA6IG51bGwsXHJcbiAgICAgIHZvdWNoZXJDb2RlOiB0aGlzPy5hcHBsaWVkVm91Y2hlciA/IHRoaXMuc2VsZWN0ZWRWb3VjaGVyQ29kZSA6ICcnLFxyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5wYXltZW50V2l0aENvbXBsZXRlUG9pbnRzKGNhcnRJZCwgcGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJvcmRlcklkXCIpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiY2FydElkXCIpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwicGF5bWVudEZvclwiKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmNsZWFyVXNlckNhcnQoKTtcclxuICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgaWNvbjogXCJzdWNjZXNzXCIsXHJcbiAgICAgICAgICB0aXRsZTogXCJIdXJyYXlcIixcclxuICAgICAgICAgIHRleHQ6IFwiT3JkZXIgcGxhY2VkIHN1Y2Nlc3NmdWxseVwiLFxyXG4gICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiU2VlIERldGFpbHNcIixcclxuICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZVxyXG4gICAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2UuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvcHJvZmlsZSddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ09yZGVyIEZhaWxlZCcsIGRldGFpbDogJ0ZhaWxlZCB0byBwbGFjZSBvcmRlcicgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gZ2V0Q2FydFJlY29tbWVuZGF0aW9ucygpIHtcclxuICAvLyAgIC8vIHRoaXMuYXBpTG9hZGluZyA9IHRydWU7XHJcbiAgLy8gICBjb25zdCBidXNpbmVzc0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKTtcclxuICAvLyAgIGNvbnN0IHVzZXJJZCA9IHRoaXMudXNlcklkO1xyXG4gIC8vICAgdGhpcy5yZXN0U2VydmljZS5nZXRQcm9kdWN0RGVzY3JpcHRpb25SZWNvbW1lbmRhdGlvbnMoYnVzaW5lc3NJZCwgdXNlcklkKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAvLyAgICAgdGhpcy5yZWNvbW1lZGVkRGF0YSA9IHJlc3BvbnNlPy5kYXRhO1xyXG4gIC8vICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJDYXJ0KCkudGhlbigoY2FydFJlc3BvbnNlKSA9PiB7XHJcbiAgLy8gICAgICAgY2FydFJlc3BvbnNlLm9uc3VjY2VzcyA9IChjYXJ0RGF0YTogYW55KSA9PiB7XHJcblxyXG4gIC8vICAgICAgICAgLy8gdGhpcy5hcGlMb2FkaW5nID0gZmFsc2U7XHJcbiAgLy8gICAgICAgICB0aGlzLlVTRVJfQ0FSVCA9IGNhcnREYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcclxuICAvLyAgICAgICAgIHRoaXMucmVjb21tZWRlZERhdGE/LmZvckVhY2goKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHtcclxuICAvLyAgICAgICAgICAgdGhpcy5VU0VSX0NBUlQ/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gIC8vICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1JZCA9PSBwcm9kdWN0LnByb2R1Y3RJZCkge1xyXG4gIC8vICAgICAgICAgICAgICAgaWYgKHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCA9IHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5bMF07XHJcbiAgLy8gICAgICAgICAgICAgICAgIGlmIChpdGVtVmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICBwcm9kdWN0Lml0ZW1JbWFnZXMgPSBpdGVtVmFyaWVudC52YXJpYW50SW1hZ2VzID8/IFtdO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIHByb2R1Y3QucHJpY2UgPSBpdGVtVmFyaWVudC5pdGVtVmFyaWFudFByaWNlO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIHByb2R1Y3QucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgICAgICBwcm9kdWN0LnF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICB9KVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSwgKGVycikgPT4ge1xyXG4gIC8vICAgICAgIC8vIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlO1xyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJXaGlzaGxpc3QoKS50aGVuKCh3aXNobGlzdFJlc3BvbnNlKSA9PiB7XHJcbiAgLy8gICAgICAgd2lzaGxpc3RSZXNwb25zZS5vbnN1Y2Nlc3MgPSAod2hpc2xpc3REYXRhOiBhbnkpID0+IHtcclxuICAvLyAgICAgICAgIHRoaXMuVVNFUl9XSVNITElTVCA9IHdoaXNsaXN0RGF0YS50YXJnZXQucmVzdWx0IGFzIHVua25vd24gYXMgT3JkZXJlZEl0ZW1zW107XHJcblxyXG4gIC8vICAgICAgICAgdGhpcy5yZWNvbW1lZGVkRGF0YT8uZm9yRWFjaCgocHJvZHVjdDogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuVVNFUl9XSVNITElTVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3QucHJvZHVjdElkKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAvLyAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50ID0gcHJvZHVjdD8uaXRlbVZhcmlhbnQ/LlswXTtcclxuICAvLyAgICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZCkge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIHByb2R1Y3QuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50Py52YXJpYW50SW1hZ2VzID8/IFtdO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIHByb2R1Y3QucHJpY2UgPSBpdGVtVmFyaWVudC5pdGVtVmFyaWFudFByaWNlO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIHByb2R1Y3Qud2hpc2xpc3QgPSB0cnVlO1xyXG4gIC8vICAgICAgICAgICAgICAgICB9XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgICAgICAgICAgcHJvZHVjdC53aGlzbGlzdCA9IHRydWU7XHJcbiAgLy8gICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgfSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICB9KVxyXG4gIC8vIH1cclxufVxyXG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxyXG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCJcclxuICAgIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJpc01vYmlsZSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cclxuXHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFcIj5cclxuICAgIDxzZWN0aW9uIFtpZF09XCJkYXRhPy5pZFwiIFtzaW1wb0xheW91dF09XCJzdHlsZXM/LmxheW91dFwiIFtpZF09XCJkYXRhPy5pZFwiXHJcbiAgICAgIFthdHRyLmNsYXNzXT1cImlzTW9iaWxlID8gJ3B5LTUgcG9zaXRpb24tcmVsYXRpdmUnIDogJ3Bvc2l0aW9uLXJlbGF0aXZlJ1wiIHNpbXBvSG92ZXJcclxuICAgICAgKGhvdmVyaW5nKT1cInNob3dFZGl0VGFicygkZXZlbnQpXCIgW2F0dHIuc3R5bGVdPVwiY3VzdG9tQ2xhc3NcIlxyXG4gICAgICBbbmdDbGFzc109XCIhcmVzcG9uc2VEYXRhPy5vcmRlcmVkSXRlbXM/Lmxlbmd0aCA/ICduby1pdGVtcycgOiAnJ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIG0tYXV0byBtYi00XCJcclxuICAgICAgICBbc3R5bGUubWFyZ2luVG9wLnB4XT1cImlzTW9iaWxlID8gJyc6ICc1MCdcIiBbc3R5bGUud2lkdGguJV09XCJpc01vYmlsZSA/ICc5MCcgOiAnJ1wiXHJcbiAgICAgICAgKm5nSWY9XCJyZXNwb25zZURhdGE/Lm9yZGVyZWRJdGVtcz8ubGVuZ3RoICYmIGN1cnJlbnRUYWIgPT09ICdBRERSRVNTJ1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGltZWxpbmVcIiAoY2xpY2spPVwiY3VycmVudFRhYiA9ICdCQUcnXCI+QmFnPC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYXJcIj48L2Rpdj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWVsaW5lIGlzQWN0aXZlXCI+QWRkcmVzczwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmFyXCI+PC9kaXY+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lbGluZVwiIHN0eWxlPVwiY3Vyc29yOiBhdXRvO1wiPlBheW1lbnQ8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FydC10YWItcGFyZW50IHctMTAwXCIgKm5nSWY9XCJjdXJyZW50VGFiID09ICdCQUcnICYmIGVjb21Db25maWdzPy5hcHBvaW50bWVudEJvb2tpbmdFbmFibGVkXCI+XHJcbiAgICAgICAgPCEtLSAmJiBlY29tQ29uZmlncz8uYXBwb2ludG1lbnRCb29raW5nRW5hYmxlZFwiIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0LXRhYnNcIiBbaWRdPVwiZGF0YT8uaWRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1jYXJ0LXRhYlwiIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQtY2FydC10YWInOiBjYXJ0VHlwZT09PSdTSE9QUElORyd9XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImNhcnRUeXBlPSdTSE9QUElORydcIj5TaG9wcGluZyBDYXJ0ICh7e3Jlc3BvbnNlRGF0YT8ub3JkZXJlZEl0ZW1zPy5sZW5ndGggPz8gMH19KTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J3NlbGVjdGVkLWNhcnQtdGFiJzogY2FydFR5cGU9PT0nVFJJQUwnfVwiIChjbGljayk9XCJjYXJ0VHlwZT0nVFJJQUwnXCI+VHJpYWwgQ2FydFxyXG4gICAgICAgICAgICAoe3t0cmlhbENhcnRJdGVtPy5sZW5ndGggPz8gMH19KTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcnQtcGFyZW50XCIgW3NwYWNpbmdIb3Jpem9udGFsXT1cInN0eWxlc0xheW91dFwiICpuZ0lmPVwiY3VycmVudFRhYiA9PT0gJ0JBRydcIiBbaWRdPVwiZGF0YT8uaWRcIlxyXG4gICAgICAgIFtzaW1wb0FuaW1hdGlvbl09XCJzdHlsZXM/LmFuaW1hdGlvblwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORydcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiKHJlc3BvbnNlRGF0YT8ub3JkZXJlZEl0ZW1zPy5sZW5ndGggfHwgMCkgPiAwID8gQ0FSVFBBR0UgOiBFTVBUWUlURU1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcnRUeXBlID09PSAnVFJJQUwnXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCIodHJpYWxDYXJ0SXRlbT8ubGVuZ3RoIHx8IDApID4gMCA/IENBUlRQQUdFIDogRU1QVFlJVEVNXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY2hlY2tvdXRQYWdlXCJcclxuICAgICAgICAqbmdJZj1cIihyZXNwb25zZURhdGE/Lm9yZGVyZWRJdGVtcz8ubGVuZ3RoIHx8IDApID4gMCAmJiBjdXJyZW50VGFiID09PSAnQUREUkVTUydcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiQ0hFQ0tPVVRQQUdFXCI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBlZGl0fVwiICpuZ0lmPVwic2hvd0VkaXRvcnNcIj5cclxuICAgICAgICA8c2ltcG8taG92ZXItZWxlbWVudHMgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiIFtlZGl0T3B0aW9uc109XCJlZGl0XCJcclxuICAgICAgICAgIFtpc0Vjb21tZXJjZV09XCJ0cnVlXCI+PC9zaW1wby1ob3Zlci1lbGVtZW50cz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93RGVsZXRlXCIgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBkZWxldGV9XCI+XHJcbiAgICAgICAgPHNpbXBvLWRlbGV0ZS1ob3Zlci1lbGVtZW50IFtkYXRhXT1cImRhdGFcIiBbaW5kZXhdPVwiaW5kZXhcIj48L3NpbXBvLWRlbGV0ZS1ob3Zlci1lbGVtZW50PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L3NlY3Rpb24+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkYXRhXCI+XHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImNhcnQtd2luZG93XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nLWxhcmdlIGxoLTIgbWItMyBoZWFkZXItc2VjXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwiY2xvc2VXaW5kb3coKVwiPmtleWJvYXJkX2Fycm93X2xlZnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgPHNwYW4+WW91ciBDYXJ0PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYXZpbmdcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJvZmZlcnNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwiZ2FwOiA1cHg7XCI+XHJcbiAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vaS5wb3N0aW1nLmNjL2h0WTU1c3FZL2Rpc2NvdW50LnBuZ1wiIGFsdD1cIlwiIGhlaWdodD1cIjIwXCIgd2lkdGg9XCIyMFwiPlxyXG4gICAgICAgICAgPHNwYW4+QXZhaWwgT2ZmZXJzIC8gQ291cG9uczwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtYWxsLWl0ZW1zXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiByZXNwb25zZURhdGE/Lm9yZGVyZWRJdGVtc1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsLWl0ZW1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiIHN0eWxlPVwiZ2FwOiA1cHg7XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtMTAwXCIgc3R5bGU9XCJwYWRkaW5nOiAwcHg7IHdpZHRoOiBmaXQtY29udGVudDtcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWFsbC1wcm9kdWN0LWltZ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiaXRlbS5pbWdVcmwgPz8gJ2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCIgYWx0PVwiXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9Qcm9kdWN0RGV0YWlscyhpdGVtKVwiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbC1pdGVtLW5hbWUgdHJpbS10ZXh0XCI+e3sgaXRlbS5pdGVtTmFtZSB8IHRpdGxlY2FzZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbC1pdGVtLXF1YW50aXR5XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvclwiPi08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57e2l0ZW0ucXVhbnRpdHl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yXCI+Kzwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hbGwtaXRlbS1wcmljZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlLXdpdGgtdGF4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPSdjdXJyZW5jeSc+PC9zcGFuPiB7eyhpdGVtLnNlbGxpbmdQcmljZSkgfCBudW1iZXI6ICcxLjAtMid9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJwcmljZS13aXRoLXRheFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj4ge3soaXRlbS5zZWxsaW5nKSB8IG51bWJlcjogJzEuMC0yJ319XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm90dGVyLXNlY1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1hZGQgZC1mbGV4XCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+aG9tZTwvbWF0LWljb24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkcmVzc1wiPlRldHN0aW5nPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBheW1lbnQtYnRuXCIgW2Rpc2FibGVkXT1cImNhcnRJbmZvLmFkZHJlc3NEZXRhaWxzXCIgKGNsaWNrKT1cInByb2NlZWRUb0NoZWNrb3V0KClcIj4gPHNwYW5cclxuICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDVweDtcIj5DbGljayB0byBQYXk8L3NwYW4+IDxzcGFuIFtpbm5lckh0bWxdPSdjdXJyZW5jeSc+PC9zcGFuPlxyXG4gICAgICAgICAge3socmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCA/PyAwKSB8IG51bWJlcjogJzEuMC0yJ319PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9zZWN0aW9uPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjxuZ3gtc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiaXNMb2FkaW5nXCIgY291bnQ9XCIxXCIgYXBwZWFyYW5jZT1cImNpcmNsZVwiIFt0aGVtZV09XCJ7XHJcbiAgd2lkdGg6ICcxMDAlJyxcclxuICBoZWlnaHQ6ICc0MHZoJyxcclxuICAnYm9yZGVyLXJhZGl1cyc6ICcxMHB4JyxcclxuICAncG9zaXRpb24nOiAncmVsYXRpdmUnLFxyXG4gICdyaWdodCc6ICc1cHgnXHJcbn1cIj5cclxuPC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxyXG5cclxuPG5nLXRlbXBsYXRlICNDb3Vwb25MaXN0PlxyXG4gIDxzZWN0aW9uIGNsYXNzPVwiY291cG9ucy1saXN0aW5nLXNlY3Rpb25cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24taGVhZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmFjay1idG5cIiAoY2xpY2spPVwiY2xvc2VEaWFsb2dSZWYoKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9hcnJvd19sZWZ0PC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItdGV4dFwiPkFwcGx5IENvdXBvbjwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJjb3Vwb24tc2VhcmNoLXNlY1wiPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlR5cGUgQ291cG9uIENvZGVcIiBbKG5nTW9kZWwpXT1cImVudGVyZWRDb3Vwb25Db2RlXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhcHBseS1idG4tc2VhcmNoXCIgKGNsaWNrKT1cInNlYXJjaElmQXBwbGljYWJsZSgpXCI+QXBwbHk8L2Rpdj5cclxuICAgIDwvZGl2PiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tbGlzdGluZ1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY291cG9uTGlzdC5sZW5ndGggPiAwOyBlbHNlIHNob3dFbXB0eVNjcmVlblwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvdXBvbkRldGFpbHMgb2YgY291cG9uTGlzdDsgbGV0IGlkeCA9IGluZGV4XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWRldGFpbHNcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOiAhY291cG9uRGV0YWlscy5hcHBsaWNhYmxlID8gJyNGRkYyRjQnIDogJyNFREZGRkEnfVwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiY291cG9uRGV0YWlscz8uc3RhdHVzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzX19jb3Vwb24taGVhZGluZ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tYnJpZWZcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tYnJpZWZfX2xlZnQtc2VjXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tbmFtZVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOiAhY291cG9uRGV0YWlscy5hcHBsaWNhYmxlID8gJyNEQjFBMUEnIDogJyMwOTdENUYnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGNvdXBvbkRldGFpbHMuY291cG9uQ29kZSB8IHVwcGVyY2FzZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWRlc2NcIj57eyBjb3Vwb25EZXRhaWxzLmRpc2NvdW50RGVzY3JpcHRpb24gfCB0aXRsZWNhc2UgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1icmllZl9fcmlnaHQtc2VjXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHBseS1vZmZlci1idG5cIiBbc3R5bGUub3BhY2l0eV09XCJjb3Vwb25EZXRhaWxzLmFwcGxpY2FibGUgPyAnMScgOiAnMC4zJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjdXJzb3InOiBjb3Vwb25EZXRhaWxzLmFwcGxpY2FibGUgPyAncG9pbnRlcicgOiAnJ31cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseUNvdXBvbihjb3Vwb25EZXRhaWxzKVwiPkFwcGx5PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjb3Vwb24tdG9nZ2xlLWRldGFpbHMtYnRuXCIgKGNsaWNrKT1cImNvdXBvbkRldGFpbHMuc3RhdHVzID0gIWNvdXBvbkRldGFpbHMuc3RhdHVzXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtZGV0YWlscy1idG5cIiAqbmdJZj1cImNvdXBvbkRldGFpbHMuc3RhdHVzXCI+SGlkZSBkZXRhaWxzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNob3ctZGV0YWlscy1idG5cIiAqbmdJZj1cIiFjb3Vwb25EZXRhaWxzLnN0YXR1c1wiPlZpZXcgZGV0YWlsczwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAqbmdJZj1cImNvdXBvbkRldGFpbHMuc3RhdHVzXCIgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRldGFpbHNfX2NvdXBvbi10ZXJtc1wiPlxyXG4gICAgICAgICAgICAgICAgPGxpPk9mZmVyIHZhbGlkIGZyb20ge3sgY291cG9uRGV0YWlscy52YWxpZEZyb20gfCBkYXRlIH19IC0ge3sgY291cG9uRGV0YWlscy52YWxpZFRvIHwgZGF0ZSB9fTwvbGk+XHJcbiAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd0VtcHR5U2NyZWVuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zY3JlZW4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgc3JjPVwiLi4vLi4vLi4vLi4vLi4vYXNzZXRzL2NvbW1vbi9jb3Vwb24tZW1wdHktaW1nLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXNjcmVlbl9fcHJpbWFyeS10ZXh0XCI+Tm8gQ291cG9uIEF2YWlsYWJsZTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXNjcmVlbl9fc2Vjb25kYXJ5LXRleHRcIj5cclxuICAgICAgICAgICAgTG9va3MgbGlrZSB0aGVyZSBhcmUgbm8gY291cG9ucyBhdCB0aGUgbW9tZW50XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImVtcHR5LXNjcmVlbl9fYnV0dG9uXCI+RXhwbG9yZTwvZGl2PiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvc2VjdGlvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjUmVkZW1wdGlvblZvdWNoZXJzPlxyXG4gIDxzZWN0aW9uIGNsYXNzPVwidm91Y2hlcnMtbGlzdGluZy1zZWN0aW9uIGQtZmxleCBmbGV4LWNvbHVtblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvdXBvbi1oZWFkaW5nIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgcC0zIGZzLTE4IGZ3LTYwMCBib3JkZXItYm90dG9tXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJiYWNrLWJ0biBjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgKGNsaWNrKT1cImNsb3NlRGlhbG9nUmVmKClcIj5cclxuICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfYXJyb3dfbGVmdDwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXRleHRcIj5Db3Vwb25zICYgVm91Y2hlcnM8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgdGFiLWNvbnRhaW5lciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBnYXAtMiBwLTNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJlZGVtcHRpb24tdHlwZSBmcy0xNiBmdy01MDAgY3Vyc29yLXBvaW50ZXJcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZS10eXBlJzogcmVkZW1wdGlvblR5cGUgPT09ICdDT1VQT05TJ31cIlxyXG4gICAgICAgIChjbGljayk9XCJyZWRlbXB0aW9uVHlwZSA9ICdDT1VQT05TJ1wiPlxyXG4gICAgICAgIENvdXBvbnNcclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyZWRlbXB0aW9uLXR5cGUgZnMtMTYgZnctNTAwIGN1cnNvci1wb2ludGVyXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtdHlwZSc6IHJlZGVtcHRpb25UeXBlID09PSAnVk9VQ0hFUlMnfVwiXHJcbiAgICAgICAgKGNsaWNrKT1cInJlZGVtcHRpb25UeXBlID0gJ1ZPVUNIRVJTJ1wiPlxyXG4gICAgICAgIFZvdWNoZXJzXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+IC0tPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tbGlzdGluZyBkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTMgcHQtM1wiICpuZ0lmPVwicmVkZW1wdGlvblR5cGUgPT09ICdDT1VQT05TJ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciB0YWItY29udGFpbmVyIGdhcC0zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi10eXBlIGZzLTE2IGZ3LTUwMCBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZS1jb3Vwb24nOiByZWRlbXB0aW9uQ291cG9uVHlwZSA9PT0gJ1JFV0FSRFMnfVwiIChjbGljayk9XCJyZWRlbXB0aW9uQ291cG9uVHlwZSA9ICdSRVdBUkRTJ1wiPlxyXG4gICAgICAgICAgUmV3YXJkc1xyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tdHlwZSBmcy0xNiBmdy01MDAgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpdmUtY291cG9uJzogcmVkZW1wdGlvbkNvdXBvblR5cGUgPT09ICdESVNDT1VOVFMnfVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicmVkZW1wdGlvbkNvdXBvblR5cGUgPSAnRElTQ09VTlRTJ1wiPlxyXG4gICAgICAgICAgRGlzY291bnRzXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVkZW1wdGlvbkNvdXBvblR5cGUgPT09ICdSRVdBUkRTJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIobGlzdFJlZGVtcHRpb25Db3Vwb25zPy52b3VjaGVycz8ubGVuZ3RoID4gMCkgOyBlbHNlIHNob3dFbXB0eVNjcmVlblwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdm91Y2hlciBvZiBsaXN0UmVkZW1wdGlvbkNvdXBvbnM/LnZvdWNoZXJzOyBsZXQgaWR4ID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvdWNoZXItZGV0YWlsc1wiICpuZ0lmPVwiIXZvdWNoZXIudXRpbGlzZWRcIj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1icmllZiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtc3RhcnQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1icmllZl9fbGVmdC1zZWNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1uYW1lIGZzLTE2IGZ3LTYwMCBtYi0xXCI+e3sgdm91Y2hlci52b3VjaGVyTmFtZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWRlc2MgZnMtMTIgdGV4dC1zZWNvbmRhcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICBHZXQge3sgdm91Y2hlci5jb3Vwb25WYWx1ZVR5cGUgPT09ICdGSVhFRCcgPyAn4oK5JyArIHZvdWNoZXIuY291cG9uVmFsdWUgOiB2b3VjaGVyLmNvdXBvblZhbHVlICsgJyUnXHJcbiAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICBvZmYgb24geW91ciBwYXltZW50XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWJyaWVmX19yaWdodC1zZWNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcGx5LW9mZmVyLWJ0biBmcy0xMiBmdy02MDAgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYXBwbHlSZWRlbXB0aW9uQ291cG9uKHZvdWNoZXIpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQXBwbHk8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWNvZGUtYm94IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2RlLWxhYmVsXCI+Q29kZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvZGUtdmFsdWVcIj57eyB2b3VjaGVyLnZvdWNoZXJDb2RlIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tbWV0YSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIGZzLTEyIHRleHQtc2Vjb25kYXJ5IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluLW9yZGVyXCI+TWluOiDigrl7eyB2b3VjaGVyLm1pbk9yZGVyVmFsdWUgfCBudW1iZXIgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlcGFyYXRvciB0ZXh0LXNlY29uZGFyeVwiPnw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZhbGlkaXR5XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNsb2NrLWljb25cIj5zY2hlZHVsZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIFVudGlsIHt7IHZvdWNoZXIuaXNzdWVkRGF0ZSB8IGRhdGU6ICdNTU0gZGQsIHl5eXknIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlcGFyYXRvciB0ZXh0LXNlY29uZGFyeVwiICpuZ0lmPVwidm91Y2hlci5tYXhSZWRlZW1hYmxlQW1vdW50XCI+fDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluLW9yZGVyXCIgKm5nSWY9XCJ2b3VjaGVyLm1heFJlZGVlbWFibGVBbW91bnRcIj5NYXggUmVkZWVtYWJsZSBBbW91bnQ6IOKCuXt7XHJcbiAgICAgICAgICAgICAgICAgIHZvdWNoZXIubWF4UmVkZWVtYWJsZUFtb3VudCB8IG51bWJlciB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwidGVybXMtbGlua1wiPlZpZXcgdGVybXMgJiBjb25kaXRpb25zPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWRlbXB0aW9uQ291cG9uVHlwZSA9PT0gJ0RJU0NPVU5UUydcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGNvdXBvbkxpc3QubGVuZ3RoID4gMCk7IGVsc2Ugc2hvd0VtcHR5RGlzY291bnRzXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb3Vwb25EZXRhaWxzIG9mIGNvdXBvbkxpc3Q7IGxldCBpZHggPSBpbmRleFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm91Y2hlci1kZXRhaWxzXCIgKm5nSWY9XCJjb3Vwb25EZXRhaWxzPy5zdGF0dXNcIj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1icmllZiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtc3RhcnQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1icmllZl9fbGVmdC1zZWNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1uYW1lIGZzLTE2IGZ3LTYwMCBtYi0xXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2NvbG9yJzogIWNvdXBvbkRldGFpbHMuYXBwbGljYWJsZSA/ICcjREIxQTFBJyA6ICcjMDk3RDVGJ31cIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBjb3Vwb25EZXRhaWxzLmNvdXBvbkNvZGUgfCB1cHBlcmNhc2UgfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tZGVzYyBmcy0xMiB0ZXh0LXNlY29uZGFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGNvdXBvbkRldGFpbHMuZGlzY291bnREZXNjcmlwdGlvbiB8IHRpdGxlY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1icmllZl9fcmlnaHQtc2VjXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHBseS1vZmZlci1idG4gZnMtMTIgZnctNjAwIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUub3BhY2l0eV09XCJjb3Vwb25EZXRhaWxzLmFwcGxpY2FibGUgPyAnMScgOiAnMC4zJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjdXJzb3InOiBjb3Vwb25EZXRhaWxzLmFwcGxpY2FibGUgPyAncG9pbnRlcicgOiAnbm90LWFsbG93ZWQnfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5Q291cG9uKGNvdXBvbkRldGFpbHMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQXBwbHlcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1jb2RlLWJveCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29kZS1sYWJlbFwiPkNvZGU8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2RlLXZhbHVlXCI+e3sgY291cG9uRGV0YWlscy5jb3Vwb25Db2RlIHwgdXBwZXJjYXNlIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tbWV0YSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIGZzLTEyIHRleHQtc2Vjb25kYXJ5IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmFsaWRpdHlcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY2xvY2staWNvblwiPnNjaGVkdWxlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAge3sgY291cG9uRGV0YWlscy52YWxpZEZyb20gfCBkYXRlIH19IC0ge3sgY291cG9uRGV0YWlscy52YWxpZFRvIHwgZGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Nob3dFbXB0eURpc2NvdW50cz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc2NyZWVuLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIHNyYz1cIi4uLy4uLy4uLy4uLy4uL2Fzc2V0cy9jb21tb24vY291cG9uLWVtcHR5LWltZy5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zY3JlZW5fX3ByaW1hcnktdGV4dFwiPk5vIERpc2NvdW50IENvdXBvbnMgQXZhaWxhYmxlPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc2NyZWVuX19zZWNvbmRhcnktdGV4dFwiPlxyXG4gICAgICAgICAgICBMb29rcyBsaWtlIHRoZXJlIGFyZSBubyBkaXNjb3VudCBjb3Vwb25zIGF0IHRoZSBtb21lbnRcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZW1wdHktc2NyZWVuX19idXR0b25cIj5FeHBsb3JlPC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICNzaG93RW1wdHlTY3JlZW4+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXNjcmVlbi1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBzcmM9XCIuLi8uLi8uLi8uLi8uLi9hc3NldHMvY29tbW9uL2NvdXBvbi1lbXB0eS1pbWcuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc2NyZWVuX19wcmltYXJ5LXRleHRcIj5ObyBDb3Vwb25zIEF2YWlsYWJsZTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXNjcmVlbl9fc2Vjb25kYXJ5LXRleHRcIj5Mb29rcyBsaWtlIHRoZXJlIGFyZSBubyBjb3Vwb25zPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWxpc3RpbmcgZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0zXCIgKm5nSWY9XCJyZWRlbXB0aW9uVHlwZSA9PT0gJ1ZPVUNIRVJTJ1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGlzdFJlZGVtcHRpb25Wb3VjaGVycz8udm91Y2hlcnM/Lmxlbmd0aCA+IDA7IGVsc2Ugc2hvd0VtcHR5U2NyZWVuXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdm91Y2hlciBvZiBsaXN0UmVkZW1wdGlvblZvdWNoZXJzPy52b3VjaGVyczsgbGV0IGlkeCA9IGluZGV4XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm91Y2hlci1kZXRhaWxzXCIgKm5nSWY9XCIhdm91Y2hlci51dGlsaXNlZFwiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1icmllZiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtc3RhcnQgbWItM1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tYnJpZWZfX2xlZnQtc2VjXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLW5hbWUgZnMtMTYgZnctNjAwIG1iLTFcIj57eyB2b3VjaGVyLnZvdWNoZXJOYW1lIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWRlc2MgZnMtMTIgdGV4dC1zZWNvbmRhcnlcIj5cclxuICAgICAgICAgICAgICAgICAgR2V0IHt7IHZvdWNoZXIuY291cG9uVmFsdWVUeXBlID09PSAnRklYRUQnID8gJ+KCuScgKyB2b3VjaGVyLmNvdXBvblZhbHVlIDogdm91Y2hlci5jb3Vwb25WYWx1ZSArICclJyB9fVxyXG4gICAgICAgICAgICAgICAgICBvZmYgb24geW91ciBwYXltZW50XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWJyaWVmX19yaWdodC1zZWNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHBseS1vZmZlci1idG4gZnMtMTIgZnctNjAwIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFwcGx5UmVkZW1wdGlvbkNvdXBvbih2b3VjaGVyKVwiPkFwcGx5XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWNvZGUtYm94IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29kZS1sYWJlbFwiPkNvZGU8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29kZS12YWx1ZVwiPnt7IHZvdWNoZXIudm91Y2hlckNvZGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLW1ldGEgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBmcy0xMiB0ZXh0LXNlY29uZGFyeSBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW4tb3JkZXJcIj5NaW46IOKCuXt7IHZvdWNoZXIubWluT3JkZXJWYWx1ZSB8IG51bWJlciB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlcGFyYXRvciB0ZXh0LXNlY29uZGFyeVwiPnw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWxpZGl0eVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY2xvY2staWNvblwiPnNjaGVkdWxlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIFVudGlsIHt7IHZvdWNoZXIuaXNzdWVkRGF0ZSB8IGRhdGU6ICdNTU0gZGQsIHl5eXknIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInRlcm1zLWxpbmtcIj5WaWV3IHRlcm1zICYgY29uZGl0aW9uczwvZGl2PiAtLT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd0VtcHR5U2NyZWVuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zY3JlZW4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgc3JjPVwiLi4vLi4vLi4vLi4vLi4vYXNzZXRzL2NvbW1vbi9jb3Vwb24tZW1wdHktaW1nLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXNjcmVlbl9fcHJpbWFyeS10ZXh0XCI+Tm8gVm91Y2hlcnMgQXZhaWxhYmxlPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc2NyZWVuX19zZWNvbmRhcnktdGV4dFwiPkxvb2tzIGxpa2UgdGhlcmUgYXJlIG5vIHZvdWNoZXJzPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICA8L3NlY3Rpb24+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI0NBUlRQQUdFPlxyXG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtYWluLWNvbnRlbnRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcnQtaXRlbXNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FydC1oZWFkZXJcIj5cclxuICAgICAgICAgIDxoMj5Zb3VyIENhcnQ8L2gyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiQ0FSVElURU07Y29udGV4dDp7ZGF0YTogY2FydFR5cGUgPT09ICdTSE9QUElORycgPyByZXNwb25zZURhdGE/Lm9yZGVyZWRJdGVtcyA6IHRyaWFsQ2FydEl0ZW19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInNpZGViYXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJlZWRlbS1zZWN0aW9uIGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cImNhcnRUeXBlICE9ICdUUklBTCcgJiYgZ2V0VXJsKClcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwianVzdGlmeS1jb250ZW50LWJldHdlZW4gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMCByZWRlZW0tc2VjdGlvbi10ZXh0XCI+UmVkZWVtIFNlY3Rpb24gQW1vdW50XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vZ2xlLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiB0eXBlPVwiY2hlY2tib3hcIiByb2xlPVwic3dpdGNoXCIgaWQ9XCJmbGV4U3dpdGNoQ2hlY2tDaGVja2VkXCJcclxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdE1hdHVyZVNjaGVtZVwiIChjaGFuZ2UpPVwib25Ub2dnbGVDaGFuZ2UoKVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInNlbGVjdF9tYXR1cmVkX3RleHQgIHctMTAwIHRleHQtc3RhcnQgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3RNYXR1cmVTY2hlbWUgJiYgIXNlbGVjdGVkUmVkZW1wdGlvblwiIChjbGljayk9XCJzZWxlY3RTY2hlbWUoKVwiPlxyXG4gICAgICAgICAgU2VsZWN0IE1hdHVyZWQgU2NoZW1lXHJcbiAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInNlbGVjdF9tYXR1cmVkX3RleHQgZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yIHctMTAwIHRleHQtc3RhcnQgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFJlZGVtcHRpb25cIj5cclxuICAgICAgICAgIFNlbGVjdGVkIFNjaGVtZVxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ3JvdXBfaW52ZXN0XCI+R3JvdXAgSW52ZXN0bWVudFxyXG4gICAgICAgICAgICBzY2hlbWUtNTAwMC9NIDxzcGFuPkNoYW5nZTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIHctMTAwIHJlZGVlbV9hbW91bnRcIj5SZWRlZW1hYmxlIEFtb3VudFxyXG4gICAgICAgICAgICA8c3Bhbj7igrl7e3NlbGVjdGVkUmVkbXBhdGlvbkRhdGEuc2VsZWN0ZWRBbW91bnR9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzY2hlbWUtc2VjdGlvblwiICpuZ0lmPVwic2VsZWN0TWF0dXJlU2NoZW1lXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlNDSEVNRV9SRURFTVBUSU9OXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLXNlY3Rpb25cIiBbaWRdPVwiZGF0YT8uaWRcIiAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnICYmICFyZWZlckVhcm5FeGlzdFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tbGVmdFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1pY29uXCI+PG1hdC1pY29uPnBlcmNlbnQ8L21hdC1pY29uPjwvZGl2PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3Vwb24tdGV4dFwiICpuZ0lmPVwiIXJlc3BvbnNlRGF0YS5iaWxsZGV0YWlscz8uY291cG9uSWRcIj5BcHBseVxyXG4gICAgICAgICAgICBDb3Vwb248L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdXBvbi10ZXh0XCIgKm5nSWY9XCJyZXNwb25zZURhdGEuYmlsbGRldGFpbHM/LmNvdXBvbklkXCI+Q291cG9uXHJcbiAgICAgICAgICAgIEFwcGxpZWQ8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHN2ZyAqbmdJZj1cIiFyZXNwb25zZURhdGEuYmlsbGRldGFpbHM/LmNvdXBvbklkXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiXHJcbiAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgY2xhc3M9XCJjaGV2cm9uLWljb25cIiAoY2xpY2spPVwib3BlbkRpYWxvZyhDb3Vwb25MaXN0KVwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIm05IDE4IDYtNi02LTZcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwicmVzcG9uc2VEYXRhLmJpbGxkZXRhaWxzPy5jb3Vwb25JZFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ291cG9uKCRldmVudClcIj48bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJvbW8tYmFubmVyIG1iLTNcIiBbaWRdPVwiZGF0YT8uaWRcIiAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnICYmIGVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByb21vLXRleHRcIj5cclxuICAgICAgICAgIDxoMz5TZWUgSXQgQmVmb3JlIFlvdSBCdXkgSXQ8L2gzPlxyXG4gICAgICAgICAgPHA+RXhwZXJpZW5jZSBvdXIgZGVzaWducyBpbiBkZXRhaWwgdmlhIHZpZGVvIGNhbGw8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlZS1saXZlLWJ0blwiIChjbGljayk9XCJzY2hlZHVsZVZpZGVvQ2FsbChyZXNwb25zZURhdGE/Lm9yZGVyZWRJdGVtcylcIj5cclxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImx1Y2lkZSBsdWNpZGUtdmlkZW9cIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIm0yMiA4LTYgNCA2IDRWOFpcIiAvPlxyXG4gICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTJcIiB4PVwiMlwiIHk9XCI2XCIgcng9XCIyXCIgcnk9XCIyXCIgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgU0VFIElUIExJVkVcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGxhbi1kZXRhaWxzLWNvbnRhaW5lciBwLTMgcm91bmRlZC00IGJnLXdoaXRlIHRleHQtZGFyayB2b3VjaGVyLWRldGFpbHNcIlxyXG4gICAgICAgICpuZ0lmPVwicmVmZXJFYXJuRXhpc3QgJiYgdGhpcz8ucmVkZW1wdGlvblBvaW50cz8uYXZhaWxhYmxlUG9pbnRzID4gMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy0xNCBmdy01MDBcIj5cclxuICAgICAgICAgIFJld2FyZHMgQXZhaWxhYmxlXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydCBib3JkZXItYm90dG9tIHBiLTJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdmJfcHRzIG10LTIgbWItMlwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLTE2IGZ3LTUwMCB0b3RhbF9wb2ludHMgdGV4dC1zZWNvbmRhcnlcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiBmcy0xOCBmdy02MDAgdGV4dC1kYXJrXCI+e3sodGhpcz8ucmVkZW1wdGlvblBvaW50cz8uYXZhaWxhYmxlUG9pbnRzIHx8IDApLnRvRml4ZWQoMil9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICBwdHNcclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG90YWxfdmFsdWUgZnMtMTIgdGV4dC1zZWNvbmRhcnlcIj5cclxuICAgICAgICAgICAgICA9IG1heCDigrl7eyh0aGlzPy5yZWRlbXB0aW9uUG9pbnRzPy5wb2ludHNDb252ZXJ0ZWRSdXBlZXMgfHwgMCkudG9GaXhlZCgyKX19IGRpc2NvdW50XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FsbHRlX2ljb25cIj5cclxuICAgICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL2Qyejk0OTd4cDh4YjEyLmNsb3VkZnJvbnQubmV0L3Byb2QtaW1hZ2VzLzc3Nzc3OWMxNzc1MjAwNTYxMTg3d2FsbGV0XygxKS5wbmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWRlbWFibGVfdGV4dFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVfdGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy0xNCBmdy01MDBcIj5cclxuICAgICAgICAgICAgICAgIFJlZGVlbSBQb2ludHNcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtMTMgZnMtNDAwXCI+XHJcbiAgICAgICAgICAgICAgICBVc2UgeW91ciBwb2ludHMgZm9yIGRpc2NvdW50XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlX2J0blwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzd2l0Y2hcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ0b2dnbGVTd2l0Y2hcIiBbY2hlY2tlZF09XCJpc1BvaW50c1JlZGVlbWluZ1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Qb2ludHNSZWRlZW1pbmdDaGFuZ2UoJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbGlkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMyBzdWNjZXNzX3NlbGVjdGVkIHctMTAwIGFwcGxpZWQtY291cG9uLWNhcmRcIiAqbmdJZj1cImlzUG9pbnRzUmVkZWVtaW5nXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGdhcC0yXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWNjZXNzX2ljb25cIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1zdWNjZXNzXCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWNjZXNzX3RleHRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtMTMgZnctNTAwXCI+XHJcbiAgICAgICAgICAgICAgICBZb3UncmUgc2F2aW5nIOKCuVxyXG4gICAgICAgICAgICAgICAge3t0b3RhbFNhdmluZ0FtdCB8fCAwfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtMTIgZnMtNDAwIHRleHQtc3VjY2Vzc1wiPlxyXG4gICAgICAgICAgICAgICAge3t0b3RhbFNhdmluZ1BvaW50c319IHBvaW50cyByZW1haW5pbmcgYWZ0ZXIgcmVkZW1wdGlvblxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gRXhpc3RpbmcgY291cG9uIHJvdyAoa2VlcCBhcy1pcykgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tc2VjdGlvbiBkLWZsZXggZmxleC1jb2x1bW4gdm91Y2hlci1kZXRhaWxzXCIgW2lkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnICYmIHJlZmVyRWFybkV4aXN0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tbGVmdFwiPlxyXG4gICAgICAgICAgICBBcHBseSBDb3Vwb25cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAoY2xpY2spPVwiYWRkUmVkZW1wdGlvbkNvdXBvbihSZWRlbXB0aW9uVm91Y2hlcnMpXCI+VmlldyBBbGw8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBBcHBsaWVkIENvdXBvbiBTdWNjZXNzIEJhbm5lciAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwbGllZC1jb3Vwb24tY2FyZCB3LTEwMCBtdC0zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxyXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFZvdWNoZXJJZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcGxpZWQtY291cG9uLWxlZnQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJzdWNjZXNzLWNoZWNrXCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcGxpZWQtY291cG9uLWluZm9cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwbGllZC1jb3Vwb24tY29kZVwiPkNvdXBvbiB7eyBzZWxlY3RlZFZvdWNoZXJDb2RlIH19IGFwcGxpZWQhPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcGxpZWQtY291cG9uLXNhdmluZ1wiPllvdSdyZSBzYXZpbmdcclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGhpcy5jb3Vwb25WYWx1ZVR5cGUgPT09ICdBTU9VTlQnXCI+4oK5IHt7c2VsZWN0ZWRWb3VjaGVyQW1vdW50IHx8IDB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGhpcy5jb3Vwb25WYWx1ZVR5cGUgPT09ICdQRVJDRU5UQUdFJ1wiPiB7e3NlbGVjdGVkVm91Y2hlclBlcmNlbnRhZ2UgfHwgMH19JTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVtb3ZlLWNvdXBvbi1idG4gZnMtMTQgZnctNTAwIHRleHQtc2Vjb25kYXJ5IGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVJlZGVtcHRpb25Db3Vwb24oJGV2ZW50KVwiPlJlbW92ZTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1zZWN0aW9uXCIgKm5nSWY9XCJnZXRVcmwoKVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1oZWFkZXJcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5ncHNfZml4ZWQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJjYXJ0VHlwZSA9PT0gJ1NIT1BQSU5HJ1wiPkRlbGl2ZXJpbmcgdG88L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImNhcnRUeXBlID09PSAnVFJJQUwnXCI+VHJpYWwgTG9jYXRpb24gYXQ8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpbmNvZGVcIj57e3BpbmNvZGV9fTwvc3Bhbj5cclxuICAgICAgICAgIDwhLS0gPGEgY2xhc3M9XCJjaGFuZ2UtbGlua1wiPkNoYW5nZSBQaW5jb2RlPC9hPiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1zZWN0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdGl0bGVcIj5TdW1tYXJ5PC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORydcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlN1YnRvdGFsPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+4oK5e3socmVzcG9uc2VEYXRhPy5iaWxsZGV0YWlscz8udG90YWxOZXRWYWx1ZSA/PyAwKSB8IG51bWJlcjogJzEuMC0yJ319PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIiAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnICYmIHJlZmVyRWFybkV4aXN0ICYmIGlzUG9pbnRzUmVkZWVtaW5nXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5Qb2ludHMgUmVkZWVtZWQ8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj4tIOKCuXt7IHRvdGFsU2F2aW5nQW10IHx8IDAgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiXHJcbiAgICAgICAgICAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnICYmIHJlZmVyRWFybkV4aXN0ICYmICh0aGlzLmNvdXBvblZhbHVlVHlwZSA9PT0gJ0FNT1VOVCcgJiYgYXBwbGllZFZvdWNoZXIpXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5Wb3VjaGVyIEFwcGxpZWQ8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj4tIOKCuXt7IHNlbGVjdGVkVm91Y2hlckFtb3VudCB8fCAwIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIlxyXG4gICAgICAgICAgKm5nSWY9XCJjYXJ0VHlwZSA9PT0gJ1NIT1BQSU5HJyAmJiByZWZlckVhcm5FeGlzdCAmJiAodGhpcy5jb3Vwb25WYWx1ZVR5cGUgPT09ICdQRVJDRU5UQUdFJyAmJiBhcHBsaWVkVm91Y2hlcilcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlZvdWNoZXIgQXBwbGllZDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPi0g4oK5e3sgcGVyY2VudGFnZVJlZHVjZWQgfHwgMCB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCIgKm5nSWY9XCJjYXJ0VHlwZSA9PT0gJ1NIT1BQSU5HJyAmJiByZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy5kaXNjb3VudEFtb3VudFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+RGlzY291bnQgQW1vdW50PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+XHJcbiAgICAgICAgICAgIHt7KCfigrknICsgKHJlc3BvbnNlRGF0YT8uYmlsbGRldGFpbHM/LmRpc2NvdW50QW1vdW50IHwgbnVtYmVyOiAnMS4wLTInKSkgfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCIgKm5nSWY9XCJjYXJ0VHlwZSA9PT0gJ1NIT1BQSU5HJ1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+U2hpcHBpbmc8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NhdmluZ3MnOiAhcmVzcG9uc2VEYXRhPy5iaWxsZGV0YWlscz8uZGVsaXZlcnlDaGFyZ2VzIHx8IHJlc3BvbnNlRGF0YS5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgPD0gMH1cIj5cclxuICAgICAgICAgICAge3sgKHJlc3BvbnNlRGF0YT8uYmlsbGRldGFpbHM/LmRlbGl2ZXJ5Q2hhcmdlcyAmJiByZXNwb25zZURhdGEuYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzID4gMCkgPyAoJ+KCuScgK1xyXG4gICAgICAgICAgICAocmVzcG9uc2VEYXRhLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyB8IG51bWJlcjogJzEuMC0yJykpIDogJ0ZyZWUnIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORydcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPkVzdGltYXRlZCBUYXg8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj7igrl7eygoIXJlc3BvbnNlRGF0YS5iaWxsZGV0YWlscz8uY291cG9uSWQgP1xyXG4gICAgICAgICAgICByZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy50b3RhbFRheCA6IHJlc3BvbnNlRGF0YT8uYmlsbGRldGFpbHM/LnRvdGFsVGF4QWZ0ZXJEaXNjb3VudCkgPz8gMCkgfFxyXG4gICAgICAgICAgICBudW1iZXI6ICcxLjAtMid9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93IHRvdGFsLXJvd1wiICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORydcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlRvdGFsPC9zcGFuPlxyXG4gICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj7igrl7eyByZXNwb25zZURhdGE/LnRvdGFsQW1vdW50IHwgbnVtYmVyOiAnMS4wLTInIH19PC9zcGFuPiAtLT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtdmFsdWVcIiAqbmdJZj1cIiFpc1BvaW50c1JlZGVlbWluZyAmJiAhYXBwbGllZFZvdWNoZXJcIj7igrl7eyByZXNwb25zZURhdGE/LnRvdGFsQW1vdW50IHxcclxuICAgICAgICAgICAgbnVtYmVyOiAnMS4wLTInIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtdmFsdWVcIiAqbmdJZj1cImlzUG9pbnRzUmVkZWVtaW5nXCI+4oK5e3sgKHJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgLSAodG90YWxTYXZpbmdBbXQgfHwgMCkpIHxcclxuICAgICAgICAgICAgbnVtYmVyOiAnMS4wLTInIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJhcHBsaWVkVm91Y2hlciAmJiB0aGlzLmNvdXBvblZhbHVlVHlwZSA9PT0gJ0FNT1VOVCdcIj7igrl7eyhyZXNwb25zZURhdGE/LnRvdGFsQW1vdW50IC1cclxuICAgICAgICAgICAgKHNlbGVjdGVkVm91Y2hlckFtb3VudCB8fCAwKSkgfCBudW1iZXI6XHJcbiAgICAgICAgICAgICcxLjAtMid9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYXBwbGllZFZvdWNoZXIgJiYgdGhpcy5jb3Vwb25WYWx1ZVR5cGUgPT09ICdQRVJDRU5UQUdFJ1wiPuKCuXt7KHJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgLVxyXG4gICAgICAgICAgICAocGVyY2VudGFnZVJlZHVjZWQgfHwgMCkpIHwgbnVtYmVyOlxyXG4gICAgICAgICAgICAnMS4wLTInIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFRyaWFsIENhcnQgU3VtbWFyeSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FydFR5cGUgPT09ICdUUklBTCdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5GcmVlIFRyaWFsPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj7igrkwPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+U2VydmljZSBDaGFyZ2U8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS12YWx1ZSBzYXZpbmdzXCI+RnJlZTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93IHRvdGFsLXJvd1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5Ub3RhbDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+4oK5MDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInRvdGFsLXZhbHVlXCIgKm5nSWY9XCIhaXNQb2ludHNSZWRlZW1pbmcgJiYgIWFwcGxpZWRWb3VjaGVyXCI+4oK5e3sgcmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCB8XHJcbiAgICAgICAgICAgIG51bWJlcjogJzEuMC0yJyB9fTwvc3Bhbj5cclxuXHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXZhbHVlXCIgKm5nSWY9XCJpc1BvaW50c1JlZGVlbWluZ1wiPuKCuXt7IChyZXNwb25zZURhdGE/LnRvdGFsQW1vdW50IC0gKHRvdGFsU2F2aW5nQW10IHx8IDApKSB8XHJcbiAgICAgICAgICAgIG51bWJlcjogJzEuMC0yJyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYXBwbGllZFZvdWNoZXIgJiYgdGhpcy5jb3Vwb25WYWx1ZVR5cGUgPT09ICdBTU9VTlQnXCI+4oK5e3socmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCAtXHJcbiAgICAgICAgICAgIChzZWxlY3RlZFZvdWNoZXJBbW91bnQgfHwgMCkpIHwgbnVtYmVyOlxyXG4gICAgICAgICAgICAnMS4wLTInfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImFwcGxpZWRWb3VjaGVyICYmIHRoaXMuY291cG9uVmFsdWVUeXBlID09PSAnUEVSQ0VOVEFHRSdcIj7igrl7eyhyZXNwb25zZURhdGE/LnRvdGFsQW1vdW50IC1cclxuICAgICAgICAgICAgKHBlcmNlbnRhZ2VSZWR1Y2VkIHx8IDApKSB8IG51bWJlcjpcclxuICAgICAgICAgICAgJzEuMC0yJyB9fTwvc3Bhbj4gLS0+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwicGxhY2Utb3JkZXItYnRuXCIgKGNsaWNrKT1cImVkaXQgPyAnJyA6IHByb2NlZWRUb0xpc3RQYWdlKClcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZVxyXG4gICAgICAgIFtidXR0b25TdHlsZV09XCJkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uc3R5bGVzXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORydcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIlxyXG4gICAgICAgIFtiYWNrZ3JvdW5kSW5mb109XCJzdHlsZXM/LmJhY2tncm91bmRcIj57e2RhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzFdPy5jb250ZW50Py5sYWJlbCA/PyAnQ29udGludWVcclxuICAgICAgICBTaG9wcGluZyd9fTwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwicGxhY2Utb3JkZXItYnRuIG10LTBcIiAoY2xpY2spPVwiZWRpdCA/ICcnIDogcHJvY2VlZFRvQ2hlY2tvdXQoKVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlXHJcbiAgICAgICAgKm5nSWY9XCJjYXJ0VHlwZSA9PT0gJ1NIT1BQSU5HJ1wiIFtidXR0b25TdHlsZV09XCJkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uc3R5bGVzXCJcclxuICAgICAgICBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXHJcbiAgICAgICAgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiPnt7ZGF0YT8uYWN0aW9uPy5idXR0b25zPy5bMF0/LmNvbnRlbnQ/LmxhYmVsID8/ICdDaGVja291dFxyXG4gICAgICAgIENhcnQnfX08L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInBsYWNlLW9yZGVyLWJ0biBtdC0wXCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgKm5nSWY9XCJjYXJ0VHlwZSA9PT0gJ1RSSUFMJ1wiXHJcbiAgICAgICAgW2J1dHRvblN0eWxlXT1cImRhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdPy5zdHlsZXNcIiBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIChjbGljayk9XCJib29rQXBwb2ludG1lbnQoKVwiPkJPT0tcclxuICAgICAgICBBUFBPSU5UTUVOVDwvYnV0dG9uPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY29tbWVkZWREYXRhPy5sZW5ndGhcIj5cclxuICAgIDxzaW1wby1mZWF0dXJlZC1wcm9kdWN0cyBbZWRpdF09XCJmYWxzZVwiIFtkYXRhXT1cImZlYXR1cmVQcm9kdWN0RGF0YVwiXHJcbiAgICAgIFtyZXNwb25zZURhdGFdPVwicmVjb21tZWRlZERhdGFcIj48L3NpbXBvLWZlYXR1cmVkLXByb2R1Y3RzPlxyXG4gIDwvbmctY29udGFpbmVyPiAtLT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNDSEVDS09VVFBBR0U+XHJcbiAgPGRpdiBjbGFzcz1cImNoZWNrb3V0LWxlZnQtcGFuZWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjaGVja291dC1tYWluLWNvbnRlbnRcIj5cclxuICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZGVsaXZlcnktb3B0aW9uc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1vcHRpb24gYWN0aXZlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVsaXZlcnktaWNvblwiPjwvZGl2PlxyXG4gICAgICAgICAgSE9NRSBERUxJVkVSWVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1vcHRpb25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1pY29uXCI+PC9kaXY+XHJcbiAgICAgICAgICBTVE9SRSBQSUNLLVVQXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+U2hpcHBpbmcgQWRkcmVzczwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInNoaXBwaW5nLWluZm9cIiAqbmdJZj1cImRlZmF1bHRBZGRyZXNzXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFkZHJlc3MtaW5mb1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFkZHJlc3MtbmFtZVwiPnt7ZGVmYXVsdEFkZHJlc3M/LnJlY2VpdmVyTmFtZX19ICh7e2RlZmF1bHRBZGRyZXNzPy5hZGRyZXNzVHlwZX19KTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFkZHJlc3MtZGV0YWlsc1wiPnt7ZGVmYXVsdEFkZHJlc3M/LmFkZHJlc3NMaW5lMX19LCB7e2RlZmF1bHRBZGRyZXNzPy5jaXR5TmFtZX19LFxyXG4gICAgICAgICAgICB7e2RlZmF1bHRBZGRyZXNzPy5zdGF0ZU5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1udW1iZXJcIj5Nb2JpbGU6IHt7ZGVmYXVsdEFkZHJlc3M/LnJlY2VpdmVyUGhvbmV9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhZGRMaW5rcyBoLTEwMFwiICpuZ0lmPVwiIWRlZmF1bHRBZGRyZXNzXCIgKGNsaWNrKT1cImFkZEFkZHJlc3MoKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJjaGFuZ2UtYWRkcmVzcy1idG5cIiAoY2xpY2spPVwiY2hhbmdlQWRkcmVzcygpXCIgKm5nSWY9XCJkZWZhdWx0QWRkcmVzc1wiPkNIQU5HRSBPUiBBREQgQUREUkVTUzwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biB3LTEwMCBtdC0xIHBheW1lbnQtYnRuXCIgKGNsaWNrKT1cInByb2NlZWRUb1BheW1lbnQoKVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlXHJcbiAgICAgICAgKm5nSWY9XCJkZWZhdWx0QWRkcmVzcyAmJiAhcGxhY2VPcmRlckxvYWRlclwiIFtidXR0b25TdHlsZV09XCJkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uc3R5bGVzXCJcclxuICAgICAgICBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXHJcbiAgICAgICAgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiPlxyXG4gICAgICAgIFBsYWNlIE9yZGVyXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHctMTAwIG10LTEgcGF5bWVudC1idG5cIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZSAqbmdJZj1cImRlZmF1bHRBZGRyZXNzICYmIHBsYWNlT3JkZXJMb2FkZXJcIlxyXG4gICAgICAgIFtidXR0b25TdHlsZV09XCJkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uc3R5bGVzXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIFtiYWNrZ3JvdW5kSW5mb109XCJzdHlsZXM/LmJhY2tncm91bmRcIj5cclxuICAgICAgICBMb2FkaW5nLi4uXHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiY2hlY2tvdXQtcmlnaHQtcGFuZWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJvcmRlci1zdW1tYXJ5XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXRpdGxlXCI+T3JkZXIgU3VtbWFyeTwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImNoZWNrb3V0LXByb2R1Y3RcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcmVzcG9uc2VEYXRhPy5vcmRlcmVkSXRlbXM7IGxldCBpZHggPSBpbmRleFwiPlxyXG4gICAgICAgICAgPGltZyBbc3JjXT1cIml0ZW0uaW1nVXJsID8/ICdodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnJ1wiIGNsYXNzPVwicHJvZHVjdC1pbWFnZVwiXHJcbiAgICAgICAgICAgIGFsdD1cIlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtZGV0YWlsc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1uYW1lXCI+e3tpdGVtLml0ZW1OYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtcXVhbnRpdHlcIj5RdWFudGl0eToge3tpdGVtLnF1YW50aXR5fX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtcHJpY2VcIj7igrl7eyhpdGVtLnNlbGxpbmdQcmljZSAqIGl0ZW0ucXVhbnRpdHkpIHwgbnVtYmVyOiAnMS4wLTInfX08L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2UtYnJlYWtkb3duXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4+VG90YWwgUHJpY2U8L3NwYW4+XHJcbiAgICAgICAgICA8c3Bhbj7igrl7eyhyZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy50b3RhbE5ldFZhbHVlXHJcbiAgICAgICAgICAgID8/IDApIHwgbnVtYmVyOiAnMS4wLTInfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4+VG90YWwgVGF4PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4+4oK5e3soKCFyZXNwb25zZURhdGEuYmlsbGRldGFpbHM/LmNvdXBvbklkID9cclxuICAgICAgICAgICAgcmVzcG9uc2VEYXRhPy5iaWxsZGV0YWlscz8udG90YWxUYXggOiByZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy50b3RhbFRheEFmdGVyRGlzY291bnQpID8/IDApIHxcclxuICAgICAgICAgICAgbnVtYmVyOlxyXG4gICAgICAgICAgICAnMS4wLTInfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCIgKm5nSWY9XCJjYXJ0VHlwZSA9PT0gJ1NIT1BQSU5HJyAmJiBjYXJ0SW5mbz8uYmlsbGRldGFpbHM/Lm9ycmFTY2hlbWVSZWRlZW1lZEFtb3VudFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+UmVkZWVtIEFtb3VudDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPuKCuXt7KGNhcnRJbmZvPy5iaWxsZGV0YWlscz8ub3JyYVNjaGVtZVJlZGVlbWVkQW1vdW50ID8/IDApIHwgbnVtYmVyOlxyXG4gICAgICAgICAgICAnMS4wLTInfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS1yb3cgZGlzY291bnRcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8uYmlsbGRldGFpbHM/LmRpc2NvdW50QW1vdW50ICYmICFpc0pld2VsbGVyeVwiPlxyXG4gICAgICAgICAgPHNwYW4+Q291cG9uIERpc2NvdW50PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4+LSDigrl7e3Jlc3BvbnNlRGF0YT8uYmlsbGRldGFpbHM/LmRpc2NvdW50QW1vdW50XHJcbiAgICAgICAgICAgIHwgbnVtYmVyOiAnMS4wLTInfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlLXJvd1wiXHJcbiAgICAgICAgICAqbmdJZj1cInJlc3BvbnNlRGF0YT8uYmlsbGRldGFpbHM/LmRlbGl2ZXJ5Q2hhcmdlcyAmJiByZXNwb25zZURhdGEuYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzID4gMFwiPlxyXG4gICAgICAgICAgPHNwYW4+RGVsaXZlcnkgQ2hhcmdlPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4+e3tyZXNwb25zZURhdGEuYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzXHJcbiAgICAgICAgICAgIHxcclxuICAgICAgICAgICAgbnVtYmVyOiAnMS4wLTInfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlLXJvdyB0b3RhbFwiICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORydcIj5cclxuICAgICAgICAgIDxzcGFuPlRPVEFMIEFNT1VOVDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzUG9pbnRzUmVkZWVtaW5nICYmICFhcHBsaWVkVm91Y2hlclwiPuKCuXt7KHJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgPz8gMCkgfCBudW1iZXI6XHJcbiAgICAgICAgICAgICcxLjAtMid9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNQb2ludHNSZWRlZW1pbmdcIj7igrl7eyhyZXNwb25zZURhdGE/LnRvdGFsQW1vdW50IC0gKHRvdGFsU2F2aW5nQW10IHx8IDApKSB8IG51bWJlcjpcclxuICAgICAgICAgICAgJzEuMC0yJ319PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJhcHBsaWVkVm91Y2hlciAmJiB0aGlzLmNvdXBvblZhbHVlVHlwZSA9PT0gJ0FNT1VOVCdcIj7igrl7eyhyZXNwb25zZURhdGE/LnRvdGFsQW1vdW50IC1cclxuICAgICAgICAgICAgKHNlbGVjdGVkVm91Y2hlckFtb3VudCB8fCAwKSkgfCBudW1iZXI6XHJcbiAgICAgICAgICAgICcxLjAtMid9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYXBwbGllZFZvdWNoZXIgJiYgdGhpcy5jb3Vwb25WYWx1ZVR5cGUgPT09ICdQRVJDRU5UQUdFJ1wiPuKCuXt7KHJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgLVxyXG4gICAgICAgICAgICAocmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCAqIChzZWxlY3RlZFZvdWNoZXJQZXJjZW50YWdlIC8gMTAwKSB8fCAwKSkgfCBudW1iZXI6XHJcbiAgICAgICAgICAgICcxLjAtMicgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNDQVJUSVRFTSBsZXQtcHJvZHVjdHM9XCJkYXRhXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNhcnQtaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHByb2R1Y3RzXCIgW3N0eWxlLmNvbG9yXT1cImZvbnRDb2xvclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIml0ZW0tbGVmdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1pbWFnZVwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJpdGVtLWltZ1wiIFtzcmNdPVwiaXRlbS5pbWdVcmwgPz8gJ2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCIgYWx0PVwiXCJcclxuICAgICAgICAgIChjbGljayk9XCJnb1RvUHJvZHVjdERldGFpbHMoaXRlbSlcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWRldGFpbHNcIj5cclxuICAgICAgICA8aDMgY2xhc3M9XCJpdGVtLXRpdGxlXCI+e3tpdGVtLml0ZW1OYW1lfX08L2gzPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLXN1YnRpdGxlXCIgKm5nSWY9XCJpdGVtLml0ZW1WYXJpYW50XCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgdmFyaWVudCBvZiBnZXRLZXlzKGl0ZW0uaXRlbVZhcmlhbnQucHJvcGVydGllcyk7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICB7eyBpdGVtLml0ZW1WYXJpYW50LnByb3BlcnRpZXNbdmFyaWVudF0gfCB0aXRsZWNhc2UgfX08c3BhbiAqbmdJZj1cIiFsYXN0XCI+LCA8L3NwYW4+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIml0ZW0tcmlnaHRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInF1YW50aXR5LWNvbnRyb2xcIiAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInF0eS1idG4gcHgtMlwiIChjbGljayk9XCJkZWNyZWFzZVF0eShpdGVtKVwiIFtkaXNhYmxlZF09XCJpdGVtLnF1YW50aXR5ID09PSAxXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+cmVtb3ZlPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInF0eS12YWx1ZSBweC0zXCI+e3tpdGVtLnF1YW50aXR5fX08L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInF0eS1idG4gcHgtMlwiIChjbGljayk9XCJpbmNyZWFzZVF0eShpdGVtKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tcHJpY2VcIj5cclxuICAgICAgICDigrl7e2l0ZW0uc2VsbGluZ1ByaWNlIHwgbnVtYmVyOiAnMS4wLTInfX1cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGVsZXRlLWJ0bi1jaXJjbGVcIiAoY2xpY2spPVwicmVtb3ZlSXRlbShpdGVtKVwiPlxyXG4gICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgY2xhc3M9XCJsdWNpZGUgbHVjaWRlLXRyYXNoLTJcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMyA2aDE4XCIgLz5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTkgNnYxNGMwIDEtMSAyLTIgMkg3Yy0xIDAtMi0xLTItMlY2XCIgLz5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNOCA2VjRjMC0xIDEtMiAyLTJoNGMxIDAgMiAxIDIgMnYyXCIgLz5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiMTBcIiB4Mj1cIjEwXCIgeTE9XCIxMVwiIHkyPVwiMTdcIiAvPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCIxNFwiIHgyPVwiMTRcIiB5MT1cIjExXCIgeTI9XCIxN1wiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI0VNUFRZSVRFTT5cclxuICA8c2VjdGlvbiBjbGFzcz1cImVtcHR5LWNhcnQgdy0xMDAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZW1wdHktY2FydC1jb250YWluZXIgZC1mbGV4IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0LWltYWdlXCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIG9uZXJyb3I9XCJ0aGlzLnNyYz0naHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIlxyXG4gICAgICAgICAgW3NyY109XCJkYXRhPy5jb250ZW50Py5pbWFnZT8udXJsXCIgW2FsdF09XCJkYXRhPy5jb250ZW50Py5pbWFnZT8uYWx0VGV4dFwiIFthcHBJbWFnZUVkaXRvcl09XCJlZGl0IHx8IGZhbHNlXCJcclxuICAgICAgICAgIFtpbWFnZURhdGFdPVwiZGF0YT8uY29udGVudD8uaW1hZ2VcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FydC10ZXh0IGNvbnRlbnQtc2lkZVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRleHQgb2YgZGF0YT8uY29udGVudD8uaW5wdXRUZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2hlYWRpbmctbWVkaXVtJzogdGV4dC5sYWJlbCA9PSAnSGVhZGluZycsICdkZXNjcmlwdGlvbic6IHRleHQubGFiZWwgPT0gJ1RleHQnfVwiPlxyXG4gICAgICAgICAgICA8c2ltcG8tdGV4dC1lZGl0b3IgWyh2YWx1ZSldPVwidGV4dC52YWx1ZVwiIFtlZGl0YWJsZV09XCJlZGl0IHx8IGZhbHNlXCIgW2lzUlRFXT1cInRleHQuaXNSVEVcIj48L3NpbXBvLXRleHQtZWRpdG9yPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwicGxhY2Utb3JkZXItYnRuIG14LWF1dG8gdy1maXRcIiAoY2xpY2spPVwiZWRpdCA/ICcnIDogcHJvY2VlZFRvTGlzdFBhZ2UoKVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlXHJcbiAgICAgICAgW2J1dHRvblN0eWxlXT1cImRhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzFdPy5zdHlsZXNcIiBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcclxuICAgICAgICBbYmFja2dyb3VuZEluZm9dPVwic3R5bGVzPy5iYWNrZ3JvdW5kXCI+e3tkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlsxXT8uY29udGVudD8ubGFiZWwgPz8gJ0NvbnRpbnVlXHJcbiAgICAgICAgU2hvcHBpbmcnfX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvc2VjdGlvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjU0NIRU1FX1JFREVNUFRJT04+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzY2hlbWUtb3B0aW9uXCIgKm5nRm9yPVwibGV0IHNjaGVtZSBvZiBzY2hlbWVMaXN0XCIgKGNsaWNrKT1cInJlZGVlbVNjaGVtZShzY2hlbWUsIGZhbHNlKVwiXHJcbiAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJjYXJ0SW5mby5iaWxsZGV0YWlscy5vcnJhU2NoZW1lQ29kZSA/IHN0eWxlcz8uYmFja2dyb3VuZD8uY29sb3IgOiAnJ1wiPlxyXG4gICAgICA8bGFiZWwgZm9yPVwiaW5kaXZpZHVhbFwiIGNsYXNzPVwic2NoZW1lLWNhcmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2NoZW1lLWluZm8gZC1mbGV4IGdhcC0xXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjay1yYWRpb1wiPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0LXJhZGlvXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cImZsZXhSYWRpb0RlZmF1bHRcIiBpZD1cImZsZXhSYWRpb0RlZmF1bHQyXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY2hlbWUtbmFtZVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY2hlbWUtdGl0bGVcIj5JbmRpdmlkdWFsIEludmVzdG1lbnQgU2NoZW1lPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjaGVtZS1tb250aGx5XCI+4oK5ODAwMC9NPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2NoZW1lLWRldGFpbHNcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNjaGVtZS1pZFwiPkdQUCBJZDoge3tzY2hlbWUuR1BQSWR9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwic2NoZW1lLW1hdHVyaXR5XCI+TWF0dXJpdHkgRGF0ZTogMTIgQXByaWwgMjAyNDwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2NoZW1lLWFtb3VudFwiPuKCuXt7c2NoZW1lLmFtb3VudH19PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJlZWRlbV9lcnJvciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cInNob3dSZWVkZW1FcnJvclwiPlxyXG4gICAgICBQbGVhc2UgYWRkIG1vcmUg4oK5e3t2YWlsZEFtb3VudH19IHRvIHJlZWRlbSB0aGlzIHNjaGVtZVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
1141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2Vjb21tZXJjZS9zZWN0aW9ucy9jYXJ0L2NhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvY2FydC9jYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFlLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDekYsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxXQUFXLE1BQU0sK0JBQStCLENBQUM7QUFHeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHaEUsT0FBTyxFQUFFLGVBQWUsRUFBYSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFLckcsT0FB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QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsY0FBYyxJQUFJLENBQUMsQ0FBQztnQkFFNUYsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxjQUFjLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7b0JBQ2hELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7b0JBQzlDLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3RDLFlBQVksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7Z0JBRUQsUUFBUSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7b0JBQ2pELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlFLENBQUMsQ0FBQyxDQUFBO2dCQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGVBQWUsR0FBRyxDQUFDLGNBQWMsRUFBRSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsZUFBZSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN0SyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDMUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUM7Z0JBQzdKLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFHRCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxNQUFNLEdBQVEsRUFBRSxDQUFDO1FBRXJCLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN6RCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUUzRCxJQUFJLGVBQWUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDL0QsTUFBTTtvQkFDSixNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQ2hELEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQzt3QkFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FDakQsSUFBSSxFQUFFLENBQUM7WUFDWixDQUFDO1FBRUgsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSwwQ0FBMEMsRUFBRSxDQUFDLENBQUM7WUFDcEgsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUM5QixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sdUJBQXVCLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkosTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvSSxJQUFJLHVCQUF1QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDO1lBQ25ILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDOUIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBVSxDQUFDO1FBQ3pELE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQVksQ0FBQztRQUNuRixJQUFJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLGdDQUFnQyxFQUFFLENBQUMsQ0FBQztZQUNySCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQzlCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxXQUFXLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUM7WUFDOUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3RELENBQUM7WUFDSixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsZ0NBQWdDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDNUgsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7Z0JBQ25GLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7WUFDbEQsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO1FBQ0QsSUFBSSxJQUFJLEVBQUUsaUJBQWlCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDM0ssSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUE7Z0JBQ2hDLE9BQU87WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDMUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEYsTUFBTSxPQUFPLEdBQUc7WUFDZCxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU07WUFDNUIsUUFBUSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ3hDLHdDQUF3QztZQUN4QywrRkFBK0Y7WUFDL0YsK0xBQStMO1lBQy9MLGFBQWEsRUFBRSxJQUFJLENBQUMsaUJBQWlCO2dCQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFGLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxLQUFLLFFBQVE7b0JBQ2pDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLHFCQUFxQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqRyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxZQUFZO3dCQUNyQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxpQkFBaUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDN0YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRSx5QkFBeUIsRUFBRSx1QkFBdUI7WUFDbEQsZ0JBQWdCLEVBQUU7Z0JBQ2hCLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWTtnQkFDN0IsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhO2dCQUNoQyxhQUFhLEVBQUUsSUFBSTtnQkFDbkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhO2FBQ2hDO1lBQ0QsbUJBQW1CLEVBQUUsVUFBVTtZQUMvQixhQUFhLEVBQUUsSUFBSSxFQUFFLFdBQVc7WUFDaEMsWUFBWSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0I7WUFDdEMsWUFBWSxFQUFFLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDakcsWUFBWSxFQUFFLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsY0FBYyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3SCxXQUFXLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ2pFLGFBQWEsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDcEUsQ0FBQTtRQUNELHVCQUF1QjtRQUN2QixTQUFTO1FBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxjQUFtQixFQUFFLEVBQUU7WUFDN0UsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDaEMsQ0FBQztpQkFDSSxDQUFDO2dCQUVKLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ25DLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2xDLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsS0FBSyxFQUFFLFFBQVE7b0JBQ2YsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsaUJBQWlCLEVBQUUsYUFBYTtvQkFDaEMsaUJBQWlCLEVBQUUsS0FBSztpQkFDekIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUNuQixJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUNyQyxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFBO2dCQUNGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDaEMsQ0FBQztRQUNILENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1gsSUFBSSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDUixJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsR0FBRyxNQUFNO29CQUMxRSxlQUFlLEVBQUUsSUFBSTtpQkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7b0JBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDekcsQ0FBQztZQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBR0QsZUFBZSxDQUFDLEtBQWE7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUNsQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBcUI7UUFDcEMsT0FBTyxLQUFLLENBQUMsQ0FBQyxpQkFBaUI7SUFDakMsQ0FBQztJQUNELE9BQU8sQ0FBQyxNQUFjO1FBQ3BCLElBQUksTUFBTTtZQUNSLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxXQUFXO1FBRVQsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLEdBQUc7WUFDMUIsT0FBTztRQUVULElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0QsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFJRCxVQUFVLENBQUMsU0FBYztRQUV2QixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDdkQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBR2xDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUTtZQUN0QyxPQUFPO1FBRVQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFdBQVcsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQztZQUN2SCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXhELGdDQUFnQztRQUNoQyxvSUFBb0k7UUFDcEksWUFBWTtRQUNaLElBQUk7UUFFSixJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7WUFDeEYsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO2dCQUMzRixPQUFPO29CQUNMLFlBQVksRUFBRSxNQUFNLENBQUMsUUFBUTtvQkFDN0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxXQUFXO29CQUNoQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCO29CQUM3QyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7b0JBQzdCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtvQkFDekIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO29CQUM3QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07b0JBQ3JCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztvQkFDdkIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2lCQUM1QixDQUFBO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ2hELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO29CQUM1QixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO2dCQUNyQyxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7aUJBQ0ksQ0FBQztnQkFDSixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsaURBQWlELEVBQUUsQ0FBQyxDQUFDO2dCQUMzSCxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFhRCxtQkFBbUIsQ0FBQyxTQUFjO1FBQ2hDLElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNsRixNQUFNLFdBQVcsR0FBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBVyxDQUFDO1FBQzVELElBQUksTUFBTSxHQUFHLFdBQVcsRUFBRSxNQUFNLENBQUE7UUFDaEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFBO1FBQzlELDJEQUEyRDtRQUMzRCx3REFBd0Q7UUFDeEQsa0VBQWtFO1FBRWxFLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNwRyxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDaEIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztZQUNuQyxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLHdCQUF3QixFQUFFLENBQUMsQ0FBQztZQUM5RyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQ3hGLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtnQkFDM0YsT0FBTztvQkFDTCxZQUFZLEVBQUUsTUFBTSxDQUFDLFFBQVE7b0JBQzdCLFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVztvQkFDaEMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLGlCQUFpQjtvQkFDN0MsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO29CQUM3QixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7b0JBQ3pCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtvQkFDN0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO29CQUNyQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87b0JBQ3ZCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztpQkFDNUIsQ0FBQTtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVELHFCQUFxQixDQUFDLE9BQVk7UUFDaEMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSx5REFBeUQsRUFBRSxDQUFDLENBQUM7WUFDbkosT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDMUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDL0MsSUFBSSxDQUFDLHlCQUF5QixHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUE7UUFFcEQsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0QsSUFBSSxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRXJDLElBQUksT0FBTyxDQUFDLGVBQWUsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQTtZQUNuQyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQTtZQUN0RCxDQUFDO2lCQUNJLENBQUM7Z0JBQ0osSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsQ0FBQTtZQUM5QixDQUFDO1FBQ0gsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQTtZQUMvQixJQUFJLENBQUMscUJBQXFCLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUNuRCxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDUixJQUFJLEVBQUUsU0FBUztZQUNmLEtBQUssRUFBRSxhQUFhLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0I7WUFDaE4sSUFBSSxFQUFFLGVBQWUsSUFBSSxDQUFDLG1CQUFtQixnQ0FBZ0M7WUFDN0UsaUJBQWlCLEVBQUUsTUFBTTtZQUN6QixrQkFBa0IsRUFBRSxNQUFNO1NBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNkLElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZDLGVBQWU7WUFDakIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELHNCQUFzQixDQUFDLEtBQWE7UUFDbEMsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxrQkFBa0IsS0FBSyxDQUFDO0lBQ3hCLGNBQWM7UUFDWixJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFDRCxXQUFXLENBQUMsTUFBYztRQUV4QixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7WUFDcEIsT0FBTztRQUVULElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ3JELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3RSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7WUFFbEMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTdCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDOUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGNBQWMsSUFBSSxDQUFDLENBQUM7WUFDNUYsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFDRCxhQUFhLENBQUMsUUFBYTtRQUN6QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMscUJBQXFCLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUscUJBQXFCLElBQUksQ0FBQyxDQUFDO1FBQzFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsY0FBYyxJQUFJLENBQUMsQ0FBQztRQUM1RixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFFOUIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFFekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RSxDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGVBQWUsR0FBRyxDQUFDLGNBQWMsRUFBRSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsZUFBZSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3RLLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDO1lBQzdKLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLHFCQUFxQixJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BKLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDM0UsQ0FBQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sTUFBTSxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sa0JBQWtCLENBQUMsUUFBUSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDNUosSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBVSxDQUFDO1lBQ3pELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUM1TCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFVLENBQUM7WUFDekQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLENBQWE7UUFDbEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDaEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDaEUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxRCxPQUFPO1FBQ1QsQ0FBQztRQUNELENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNuQixDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ25HLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0QsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQy9DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7WUFDL0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFFBQVEsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxLQUFVO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkksQ0FBQztJQUNELFdBQVcsQ0FBQyxLQUFhO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUNELGNBQWMsQ0FBQyxLQUFhO1FBQzFCLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNuRCxDQUFDO0lBRUQsY0FBYyxDQUFDLFFBQWEsRUFBRSxJQUFrQjtRQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxlQUFlLENBQUMsSUFBa0I7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQXFCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV0SCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQzFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLE9BQU8sR0FBOEIsSUFBSSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7WUFDekcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDbEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQztZQUM3RyxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDOUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQztRQUM3RyxDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLElBQUksR0FBZ0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUseUNBQXlDLEVBQUUsQ0FBQyxDQUFDO1lBQ25ILElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUdELFlBQVksQ0FBQyxNQUFXLEVBQUUsTUFBZTtRQUN2QyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGNBQWMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwSCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsK0NBQStDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xJLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3pGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUE7WUFDbEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUE7UUFDekQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN0RyxDQUFDO0lBQ0QsSUFBSSxTQUFTO1FBQ1gsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDO1FBQ2pELElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFFMUIsdUNBQXVDO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN2RCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLEtBQUssR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUUvQixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU5QyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRXhELE9BQU8sVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQUksZ0JBQWdCO1FBQ2xCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO1FBRW5DLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFbkIsSUFBSSxFQUFFLENBQUMsb0JBQW9CLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDeEMsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFOUQsT0FBTyxLQUFLO1lBQ1YsQ0FBQyxDQUFDLG1CQUFtQixLQUFLLEtBQUssRUFBRSxDQUFDLFdBQVcsS0FBSyxFQUFFLENBQUMsb0JBQW9CLEdBQUc7WUFDNUUsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLENBQUMsV0FBVyxLQUFLLEVBQUUsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxvQkFBb0IsQ0FBQyxTQUE2QjtRQUNoRCxRQUFRLFNBQVMsRUFBRSxDQUFDO1lBQ2xCLEtBQUssTUFBTTtnQkFDVCxPQUFPLEVBQUUsQ0FBQyxDQUFDLHlDQUF5QztZQUV0RCxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxPQUFPLENBQUM7WUFFakIsS0FBSyxnQkFBZ0I7Z0JBQ25CLE9BQU8sT0FBTyxDQUFDO1lBRWpCLEtBQUssZUFBZTtnQkFDbEIsT0FBTyxRQUFRLENBQUM7WUFFbEI7Z0JBQ0UsT0FBTyxFQUFFLENBQUMsQ0FBQyxXQUFXO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBQ0QsV0FBVyxDQUFDLElBQVM7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsSUFBUztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUtELGlCQUFpQjtRQUNmLElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNsRixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN6RSxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFBO2dCQUM5QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7WUFDeEIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBRXBCLENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBTUQsZUFBZTtRQUNiLElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNsRixNQUFNLFdBQVcsR0FBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBVyxDQUFDO1FBQzVELElBQUksTUFBTSxHQUFHLFdBQVcsRUFBRSxNQUFNLENBQUE7UUFDaEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFBO1FBQzlELDBEQUEwRDtRQUMxRCxzREFBc0Q7UUFDdEQsaUVBQWlFO1FBRWpFLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRyxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQTtnQkFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUE7Z0JBQzdDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUE7Z0JBQ2hELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDbkUsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBRXBCLENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsdUJBQXVCLENBQUMsS0FBWTtRQUNsQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3RCLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsTUFBTSxFQUFFLCtGQUErRjthQUN4RyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksRUFBRSxZQUFZLEVBQUUsV0FBVyxHQUFHLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxlQUFlLEdBQUcsSUFBSSxFQUFFLFlBQVksRUFBRSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQy9MLENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksRUFBRSxZQUFZLEVBQUUsV0FBVyxHQUFHLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQTtJQUMxSyxDQUFDO0lBRUQseUJBQXlCO1FBQ3ZCLElBQUksTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDM0MsSUFBSSxPQUFPLEdBQUc7WUFDWixVQUFVLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUMvRixVQUFVLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pELGtCQUFrQixFQUFFLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRSxZQUFZLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNILFNBQVMsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDL0QsV0FBVyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUNsRSxDQUFBO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3BFLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNuQyxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNsQyxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNSLElBQUksRUFBRSxTQUFTO29CQUNmLEtBQUssRUFBRSxRQUFRO29CQUNmLElBQUksRUFBRSwyQkFBMkI7b0JBQ2pDLGlCQUFpQixFQUFFLGFBQWE7b0JBQ2hDLGlCQUFpQixFQUFFLEtBQUs7aUJBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQkFDbkIsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztvQkFDckMsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQztZQUMzRyxDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQzsrR0Evb0NVLGFBQWEsbVJBeUJGLGVBQWU7bUdBekIxQixhQUFhLDZMQUpiLENBQUMsY0FBYyxDQUFDLDJJQ3JGN0IsdWkxQ0E0MUJjLHM3MEJEL3hCVixXQUFXLDhCQUNYLFlBQVksK3pCQUNaLE9BQU8sMElBQ1AsZUFBZSw4QkFDZixvQkFBb0Isc2hCQUVwQixvQkFBb0I7Z0JBQ3BCLFdBQVc7Z0JBQ1gsd0JBQXdCLHNJQUN4QixrQkFBa0IseUZBQ2xCLG1CQUFtQixtRkFDbkIsY0FBYywrRUFFZCxXQUFXLHlXQUNYLG1CQUFtQiw2TEFDbkIsb0JBQW9CLHdKQUNwQiwwQkFBMEIsMEdBRTFCLGFBQWEsK0JBQ2IscUJBQXFCOzs0RkFTWixhQUFhO2tCQWhDekIsU0FBUzsrQkFDRSxZQUFZLGNBQ1YsSUFBSSxXQUNQO3dCQUNQLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixPQUFPO3dCQUNQLGVBQWU7d0JBQ2Ysb0JBQW9CO3dCQUNwQixtQkFBbUI7d0JBQ25CLG9CQUFvQjt3QkFDcEIsV0FBVzt3QkFDWCx3QkFBd0I7d0JBQ3hCLGtCQUFrQjt3QkFDbEIsbUJBQW1CO3dCQUNuQixjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLG9CQUFvQjt3QkFDcEIsMEJBQTBCO3dCQUMxQixvQkFBb0I7d0JBQ3BCLGFBQWE7d0JBQ2IscUJBQXFCO3dCQUNyQixjQUFjO3dCQUNkLHlCQUF5Qjt3QkFDekIsVUFBVTtxQkFDWCxhQUNVLENBQUMsY0FBYyxDQUFDOzswQkE2QnhCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZUFBZTs7MEJBQ2xDLFFBQVE7eUNBekJGLElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTVcsRUFBRTtzQkFBbEIsU0FBUzt1QkFBQyxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFkZHJlc3MsIENhcnRTZWN0aW9uTW9kYWwsIENhcnRTZWN0aW9uU3R5bGVzTW9kZWwgfSBmcm9tICcuL2NhcnQubW9kYWwnO1xuaW1wb3J0IHsgVG9hc3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RvYXN0JztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9idXR0b24tZGlyZWN0aXZlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBNYXRJY29uLCBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBBbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYW5pbWF0aW9uLWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBIb3ZlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9ob3Zlci1lbGVtZW50LWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb250ZW50Rml0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbnRlbnQtZml0LWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTaW1wb0NvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW5kZXgnO1xuaW1wb3J0IEJhc2VTZWN0aW9uIGZyb20gJy4uLy4uLy4uL3NlY3Rpb25zL0Jhc2VTZWN0aW9uJztcbmltcG9ydCB7IEV2ZW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLy4uLy4uL3NlcnZpY2VzL2V2ZW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcbmltcG9ydCB7IEFkZHJlc3NDb21wb25lbnQgfSBmcm9tIFwiLi4vYWRkcmVzcy9hZGRyZXNzLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVVc2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vYXV0aGVudGljYXRlLXVzZXIvYXV0aGVudGljYXRlLXVzZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nLCBNYXREaWFsb2dNb2R1bGUsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBSZXN0U2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9yZXN0LnNlcnZpY2VcIjtcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBBZGRyZXNzRGV0YWlscywgVXNlciB9IGZyb20gJy4uLy4uL3N0eWxlcy91c2VyLm1vZGFsJztcbmltcG9ydCB7IE9yZGVyZWRJdGVtcyB9IGZyb20gJy4uLy4uL3N0eWxlcy9PcmRlcmVkSXRlbXMubW9kYWwnO1xuaW1wb3J0IHsgQlVTSU5FU1NfQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2J1c2luZXNzLmNvbnN0YW50JztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IFN3YWwgZnJvbSAnc3dlZXRhbGVydDInO1xuaW1wb3J0IHsgQmFja2dyb3VuZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9iYWNrZ3JvdW5kLWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBNYXRCb3R0b21TaGVldCwgTWF0Qm90dG9tU2hlZXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9ib3R0b20tc2hlZXQnO1xuaW1wb3J0IHsgY2hlY2tJdGVtQWxyZWFkeUFkZGVkLCBJdGVtVmFyaWFudCwgUHJvZHVjdCwgc3luY0l0ZW1Ub1NlcnZlckRCUmVxdWVzdCB9IGZyb20gJy4uLy4uL3N0eWxlcy9wcm9kdWN0Lm1vZGFsJztcbmltcG9ydCB7IEN1c3RvbWVyUmV2aWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vY3VzdG9tZXItcmV2aWV3L2N1c3RvbWVyLXJldmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgbWVyZ2UsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgcmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IFRleHRFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9lbGVtZW50cy90ZXh0LWVkaXRvci90ZXh0LWVkaXRvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW1hZ2VFZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvaW1hZ2UtZWRpdG9yLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMYXlPdXRNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3N0eWxlcy9zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBTcGFjaW5nSG9yaXpvbnRhbERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9zcGFjaW5nLWhvcml6b250YWwuZGlyZWN0aXZlJztcbmltcG9ydCB7IEFkZHJlc3NMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvYWRkcmVzcy1saXN0L2FkZHJlc3MtbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2NoZWR1bGVWaWRlb0NhbGxDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9lbGVtZW50cy9zY2hlZHVsZS12aWRlby1jYWxsL3NjaGVkdWxlLXZpZGVvLWNhbGwuY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbkVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9idXR0b24tZWRpdG9yLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTY2hlbWVTZWxlY3Rpb25Db21wb25lbnQgfSBmcm9tICcuLi9zY2hlbWUtc2VsZWN0aW9uL3NjaGVtZS1zZWxlY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IENvbG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbG9yLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBVbmFyeSB9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcbmltcG9ydCB7IE1hdFNwaW5uZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IEZlYXR1cmVkUHJvZHVjdHNDb21wb25lbnQgfSBmcm9tICcuLi9mZWF0dXJlZC1wcm9kdWN0cy9mZWF0dXJlZC1wcm9kdWN0cy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmVhdHVyZWRQcm9kdWN0TW9kYWwgfSBmcm9tICcuLi9mZWF0dXJlZC1wcm9kdWN0cy9mZWF0dXJlZC1wcm9kdWN0cy5tb2RhbCc7XG5cbmludGVyZmFjZSBDb3Vwb24ge1xuICBkaXNjb3VudFR5cGU6IHN0cmluZztcbiAgZGlzY291bnROYW1lOiBzdHJpbmc7XG4gIGRpc2NvdW50RGVzY3JpcHRpb246IHN0cmluZztcbiAgYXBwbGljYWJsZTogYm9vbGVhbjtcbiAgY291cG9uQ29kZTogc3RyaW5nO1xuICBjb3Vwb25JZDogc3RyaW5nO1xuICBzdGF0dXM6IGJvb2xlYW47XG4gIHZhbGlkRnJvbTogRGF0ZTtcbiAgdmFsaWRUbzogRGF0ZTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2ltcG8tY2FydCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0SWNvbixcbiAgICBNYXREaWFsb2dNb2R1bGUsXG4gICAgU2ltcG9Db21wb25lbnRNb2R1bGUsXG4gICAgQmFja2dyb3VuZERpcmVjdGl2ZSxcbiAgICBNYXRCb3R0b21TaGVldE1vZHVsZSxcbiAgICAvL0RJUkVDVElWRVxuICAgIEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSxcbiAgICBBbmltYXRpb25EaXJlY3RpdmUsXG4gICAgQ29udGVudEZpdERpcmVjdGl2ZSxcbiAgICBIb3ZlckRpcmVjdGl2ZSxcbiAgICBBZGRyZXNzQ29tcG9uZW50LFxuICAgIFRvYXN0TW9kdWxlLFxuICAgIFRleHRFZGl0b3JDb21wb25lbnQsXG4gICAgSW1hZ2VFZGl0b3JEaXJlY3RpdmUsXG4gICAgU3BhY2luZ0hvcml6b250YWxEaXJlY3RpdmUsXG4gICAgQWRkcmVzc0xpc3RDb21wb25lbnQsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBCdXR0b25FZGl0b3JEaXJlY3RpdmUsXG4gICAgQ29sb3JEaXJlY3RpdmUsXG4gICAgRmVhdHVyZWRQcm9kdWN0c0NvbXBvbmVudCxcbiAgICBNYXRTcGlubmVyXG4gIF0sXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY2FydC5jb21wb25lbnQuY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBDYXJ0Q29tcG9uZW50IGV4dGVuZHMgQmFzZVNlY3Rpb24gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGRhdGE/OiBDYXJ0U2VjdGlvbk1vZGFsO1xuICBASW5wdXQoKSByZXNwb25zZURhdGE/OiBhbnk7XG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xuICBASW5wdXQoKSBlZGl0PzogYm9vbGVhbjtcbiAgQElucHV0KCkgZGVsZXRlPzogYm9vbGVhbjtcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3M/OiBzdHJpbmc7XG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHN0eWxlcz86IENhcnRTZWN0aW9uU3R5bGVzTW9kZWw7XG4gIHB1YmxpYyBjdXJyZW50VGFiOiAnQkFHJyB8ICdBRERSRVNTJyB8ICdQQVlNRU5UJyA9IFwiQkFHXCI7XG4gIGNhcnRUeXBlOiAnU0hPUFBJTkcnIHwgJ1RSSUFMJyA9IFwiU0hPUFBJTkdcIlxuICBAVmlld0NoaWxkKCdkMicpIGQyITogRWxlbWVudFJlZjtcblxuICBwaW5jb2RlOiBhbnk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50U2VydmljZTogRXZlbnRzU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF0RGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYm90dG9tU2hlZXQ6IE1hdEJvdHRvbVNoZWV0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgbWF0RGlhbG9nRGF0YTogYW55LFxuICAgIEBPcHRpb25hbCgpIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxDYXJ0Q29tcG9uZW50PlxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucGluY29kZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwaW5jb2RlJyk7XG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogYW55KSA9PiB7XG4gICAgICB0aGlzLmNhcnRUeXBlID0gcGFyYW1zWydjYXJ0VHlwZSddIHx8IFwiU0hPUFBJTkdcIjtcbiAgICB9KVxuICB9XG5cbiAgcXVhbnRpdHkgPSBbMSwgMiwgMywgNCwgNSwgNl1cbiAgcHJpdmF0ZSB1c2VyRGV0YWlsczogVXNlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIFVTRVJfQ0FSVF9JVEVNUzogT3JkZXJlZEl0ZW1zW10gfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHNlbGVjdGVkQWRkcmVzc0lkeDogbnVtYmVyID0gMDtcbiAgcHVibGljIGRlZmF1bHRBZGRyZXNzPzogQWRkcmVzc0RldGFpbHM7XG4gIHB1YmxpYyBlbnRlcmVkQ291cG9uQ29kZTogc3RyaW5nID0gXCJcIjtcbiAgcHVibGljIGNvdXBvbkxpc3Q6IENvdXBvbltdID0gW107XG4gIHB1YmxpYyBmZWF0dXJlUHJvZHVjdERhdGE6IEZlYXR1cmVkUHJvZHVjdE1vZGFsIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgVVNFUl9DQVJUOiBPcmRlcmVkSXRlbXNbXSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIFVTRVJfV0lTSExJU1Q6IE9yZGVyZWRJdGVtc1tdIHwgbnVsbCA9IG51bGw7XG4gIHRyaWFsQ2FydEl0ZW06IE9yZGVyZWRJdGVtc1tdIHwgbnVsbCA9IG51bGxcbiAgc2VsZWN0TWF0dXJlU2NoZW1lOiBib29sZWFuID0gZmFsc2U7XG4gIGNhcnRJbmZvOiBhbnkgPSB7XG4gICAgb3JkZXJlZEl0ZW1zOiBudWxsLFxuICAgIGJ1c2luZXNzSWQ6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYklkXCIpID8/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYnVzaW5lc3NJZFwiKSxcbiAgICBiaWxsZGV0YWlsczoge1xuICAgICAgXCJ0b3RhbE5ldFZhbHVlXCI6IDAsXG4gICAgICBcInRvdGFsVGF4QWZ0ZXJEaXNjb3VudFwiOiAwLFxuICAgICAgXCJ0b3RhbEdyb3NzVmFsdWVcIjogMCxcbiAgICAgIFwidG90YWxUYXhcIjogMCxcbiAgICAgIFwidG90YWxPZmZlcmVkVmFsdWVcIjogMCxcbiAgICAgIFwiZGlzY291bnRBbW91bnRcIjogMCxcbiAgICAgIFwiZGVsaXZlcnlDaGFyZ2VzXCI6IDAsXG4gICAgICBcIm9ycmFTY2hlbWVSZWRlZW1lZEFtb3VudFwiOiAwLFxuICAgICAgXCJvcnJhU2NoZW1lQ29kZVwiOiBcIlwiXG4gICAgfSxcbiAgICBwbGF0Zm9ybTogXCJXRUJcIixcbiAgICBjYXJ0VHlwZTogXCJDQVJUXCIsXG4gICAgYWRkcmVzc0RldGFpbHM6IG51bGwsXG4gICAgdXNlckRldGFpbHM6IHtcbiAgICAgIFwidXNlcklkXCI6IFwiXCIsXG4gICAgICBcInVzZXJOYW1lXCI6IFwiXCIsXG4gICAgICBcIm1vYmlsZVwiOiBcIlwiLFxuICAgICAgXCJlbWFpbFwiOiBcIlwiXG4gICAgfSxcbiAgICB0b3RhbEFtb3VudDogMFxuICB9XG5cbiAgbG9hZGluZ1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgc3ViSW5kdXN0cnlOYW1lOiBzdHJpbmcgPSAnJ1xuICBpc0pld2VsbGVyeTogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RlZFJlZGVtcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgZWNvbUNvbmZpZ3M6IGFueTtcbiAgdXNlcklkOiBhbnk7XG4gIHJlY29tbWVkZWREYXRhOiBhbnk7XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICBsZXQgdXNlckRldGFpbHMgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXInKSB8fCAnJztcbiAgICBpZiAodXNlckRldGFpbHMpIHtcbiAgICAgIHRoaXMudXNlckRldGFpbHMgPSBKU09OLnBhcnNlKHVzZXJEZXRhaWxzKTtcbiAgICAgIHRoaXMudXNlcklkID0gdGhpcy51c2VyRGV0YWlscz8udXNlcklkO1xuXG4gICAgfVxuICAgIHRoaXMuY2hlY2tBcHBJbnN0YWxsZWQoKVxuICAgIHRoaXMuaXNKZXdlbGxlcnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaXNNYXRlcmlhbEJhc2VkUHJpY2luZycpID09ICd0cnVlJyA/IHRydWUgOiBmYWxzZTtcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW06IGFueSkgPT4ge1xuICAgICAgaWYgKHBhcmFtICYmIHBhcmFtWydjaGVja291dCddKVxuICAgICAgICB0aGlzLmN1cnJlbnRUYWIgPSBcIkFERFJFU1NcIjtcbiAgICB9KVxuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93RHVtbXlDYXJ0SXRlbXMuc3Vic2NyaWJlKChyZXNwb25zZTogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSB0aGlzLnN0eWxlcz8uY2FydEl0ZW1zU3R5bGluZyAmJiB0aGlzLmVkaXQgPyB0aGlzLmR1bW15Q2FydEl0ZW1zIDogdGhpcy5lZGl0ID8gdW5kZWZpbmVkIDogdGhpcy5yZXNwb25zZURhdGE7XG4gICAgfSlcbiAgICB0aGlzLmdldFRyaWFsQ2FydCgpO1xuICAgIHRoaXMuZ2V0SW5kZXhEQkRhdGEoKTtcbiAgICB0aGlzLmdldFNjaGVtZURldGFpbHMoKTtcbiAgICB0aGlzLmdldEVjb21tZXJjZUNvbmZpZ3MoKTtcbiAgICB0aGlzLnN0eWxlcyA9IHRoaXMuZGF0YT8uc3R5bGVzO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZGF0YSlcbiAgICAvLyB0aGlzLmdldENhcnRSZWNvbW1lbmRhdGlvbnMoKTtcbiAgfVxuICBkdW1teUNhcnRJdGVtczogYW55ID0ge1xuICAgIFwiY2FydElkXCI6IFwiMWYwZGQ3OTYtYjlkOC02YzFmLThkM2ItZDczMzBjYzI3YTlmXCIsXG4gICAgXCJidXNpbmVzc0lkXCI6IFwiMWYwZGNhNDItZmU0ZS02MDZjLWFlM2ItZTk0MjMwYmU1Y2QyXCIsXG4gICAgXCJwZ09yZGVySWRcIjogbnVsbCxcbiAgICBcIm9yZGVyZWRJdGVtc1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwiaXRlbUlkXCI6IFwiMWVmYjVmZjItM2RmMy02ZGNhLWFlMjUtYjkxMGQ5YjIwMDZmXCIsXG4gICAgICAgIFwidmFyaWVudElkXCI6IFwiMWVmYjVmZjItM2RmMy02ZGNhLWFlMjUtYjkxMGQ5YjIwMDZmXCIsXG4gICAgICAgIFwiYnVzaW5lc3NJZFwiOiBcIjFlZmIzYmRjLWZkNjgtNjVkMC05MDM5LTZkYWMwOWM2MTMwM1wiLFxuICAgICAgICBcIml0ZW1OYW1lXCI6IFwiWFhYWFhYWFhYWFhYXCIsXG4gICAgICAgIFwiYnVzaW5lc3NOYW1lXCI6IG51bGwsXG4gICAgICAgIFwiaW1nVXJsXCI6IFwiaHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZ1wiLFxuICAgICAgICBcIml0ZW1WYXJpYW50XCI6IG51bGwsXG4gICAgICAgIFwidGF4Q2F0ZWdvcnlcIjogbnVsbCxcbiAgICAgICAgXCJxdWFudGl0eVwiOiAxLFxuICAgICAgICBcInByaWNlXCI6IDIyMDAwLjAsXG4gICAgICAgIFwiaXRlbVRheFwiOiAwLjAsXG4gICAgICAgIFwiZGlzY291bnRlZFByaWNlXCI6IDIyMDAwLjAsXG4gICAgICAgIFwiZGlzY291bnRBbW91bnRcIjogMC4wLFxuICAgICAgICBcInRheEFmdGVyRGlzY291bnRcIjogMC4wLFxuICAgICAgICBcInNlbGxpbmdQcmljZVwiOiAyMjAwMC4wLFxuICAgICAgICBcInZhbHVlXCI6IDAuMCxcbiAgICAgICAgXCJyYXRpbmdcIjogMCxcbiAgICAgICAgXCJyZXZpZXdcIjogbnVsbCxcbiAgICAgICAgXCJyZXZpZXdJbWFnZXNcIjogbnVsbFxuICAgICAgfSxcbiAgICBdLFxuICAgIFwiYmlsbGRldGFpbHNcIjoge1xuICAgICAgXCJ0b3RhbE5ldFZhbHVlXCI6IDI3MDAwLjAsXG4gICAgICBcInRvdGFsR3Jvc3NWYWx1ZVwiOiAyNzI1MC4wLFxuICAgICAgXCJ0b3RhbFRheFwiOiAyNTAuMCxcbiAgICAgIFwiZmluYWxQcmljZVwiOiAyNzI1MC4wLFxuICAgICAgXCJ0YXhCcmVha3VwXCI6IHtcbiAgICAgICAgXCJjZ3N0VmFsdWVcIjogMTI1LjAsXG4gICAgICAgIFwic2dzdFZhbHVlXCI6IDEyNS4wLFxuICAgICAgICBcImlnc3RWYWx1ZVwiOiAwLjBcbiAgICAgIH0sXG4gICAgICBcImRlbGl2ZXJ5Q2hhcmdlc1wiOiAwLjAsXG4gICAgICBcImNvdXBvbklkXCI6IG51bGwsXG4gICAgICBcImNvdXBvbkNvZGVcIjogbnVsbCxcbiAgICAgIFwiZGlzY291bnRBbW91bnRcIjogMC4wLFxuICAgICAgXCJ0b3RhbFRheEFmdGVyRGlzY291bnRcIjogMC4wLFxuICAgICAgXCJvcnJhU2NoZW1lQ29kZVwiOiBudWxsLFxuICAgICAgXCJvcnJhU2NoZW1lUmVkZWVtZWRBbW91bnRcIjogMC4wXG4gICAgfSxcbiAgICBcInBsYXRmb3JtXCI6IFwiV0VCXCIsXG4gICAgXCJhZGRyZXNzRGV0YWlsc1wiOiBudWxsLFxuICAgIFwidXNlckRldGFpbHNcIjoge1xuICAgICAgXCJ1c2VySWRcIjogXCI4Nzg5NmMzMi00MWFmLTQ5N2QtYThkZi0xMzRiMzY4ZWUxYjJcIixcbiAgICAgIFwidXNlck5hbWVcIjogXCJqb3RoaXNoYVwiLFxuICAgICAgXCJtb2JpbGVcIjogXCI5MzgxNDcxNTI3XCIsXG4gICAgICBcImVtYWlsXCI6IFwiam90aGlzaGFAdGVqc29mdC5jb21cIlxuICAgIH0sXG4gICAgXCJjcmVhdGVkVGltZVN0YW1wXCI6IFwiMjAyNS0xMi0yMFQwNzo1Nzo0My4xODArMDA6MDBcIixcbiAgICBcInRvdGFsQW1vdW50XCI6IDI3MjUwLjAsXG4gICAgXCJjYXJ0VHlwZVwiOiBcIkNBUlRcIlxuICB9XG4gIGdldEVjb21tZXJjZUNvbmZpZ3MoKSB7XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRFY29tbWVyY2VDb25maWdzKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5lY29tQ29uZmlncyA9IHJlcz8uZGF0YVxuICAgIH0pXG4gIH1cblxuICBzY2hlbWVMaXN0OiBhbnlbXSA9IFtdXG4gIGdldFNjaGVtZURldGFpbHMoKSB7XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxPcnJhU2NoZW1lKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5zY2hlbWVMaXN0ID0gW3Jlcy5kYXRhXTtcbiAgICB9KVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5sb2FkaW5nU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG4gIG9uVG9nZ2xlQ2hhbmdlKCkge1xuXG4gICAgaWYgKCF0aGlzLnVzZXJEZXRhaWxzKSB7XG4gICAgICB0aGlzLnNlbGVjdE1hdHVyZVNjaGVtZSA9IGZhbHNlO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ1NjaGVtZScsIGRldGFpbDogJ0xvZ2luIEZpcnN0IHRvIHJlZGVlbScgfSk7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9sb2dpbiddKVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdE1hdHVyZVNjaGVtZSA9ICF0aGlzLnNlbGVjdE1hdHVyZVNjaGVtZTtcbiAgICBpZiAoIXRoaXMuc2VsZWN0TWF0dXJlU2NoZW1lKVxuICAgICAgdGhpcy5zaG93UmVlZGVtRXJyb3IgPSBmYWxzZVxuICAgIGlmICghdGhpcy5zZWxlY3RNYXR1cmVTY2hlbWUgJiYgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5vcnJhU2NoZW1lQ29kZSkge1xuICAgICAgbGV0IHJlcXVlc3Q6IGFueSA9IHsgXCJhbW91bnRcIjogdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5vcnJhU2NoZW1lUmVkZWVtZWRBbW91bnQsIFwiR1BQSWRcIjogdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5vcnJhU2NoZW1lQ29kZSB9XG4gICAgICB0aGlzLnJlZGVlbVNjaGVtZShyZXF1ZXN0LCB0cnVlKVxuICAgIH1cbiAgfVxuICBnZXRUcmlhbENhcnQoKSB7XG4gICAgbGV0IHVzZXI6IFVzZXIgfCBudWxsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKClcbiAgICBpZiAodXNlcikge1xuICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRVc2VySXRlbXModXNlci51c2VySWQsICdUUklBTF9DQVJUJykuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRyaWFsQ2FydEl0ZW0gPSByZXM/LmRhdGE/LlswXT8ub3JkZXJlZEl0ZW1zID8/IFtdXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFRyaWFsQ2FydEluZGV4REJEYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VHJpYWxDYXJ0SW5kZXhEQkRhdGEoKSB7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRUcmlhbENhcnQoKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgcmVzcG9uc2Uub25zdWNjZXNzID0gKHVzZXJUcmlhbENhcnRSZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudHJpYWxDYXJ0SXRlbSA9IHVzZXJUcmlhbENhcnRSZXNwb25zZS50YXJnZXQucmVzdWx0O1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICB1cGRhdGVVc2VyQ2FydCgpIHtcbiAgICBjb25zdCBkZWxpdmVyeU9wdGlvbiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJkZWxpdmVyeU9wdGlvbnNcIikgPz8gXCJ7fVwiKTtcblxuICAgIHRoaXMudXNlckRldGFpbHMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKSBhcyBVc2VyO1xuICAgIHRoaXMuY2FydEluZm8udXNlckRldGFpbHMgPSB7XG4gICAgICBcInVzZXJJZFwiOiB0aGlzLnVzZXJEZXRhaWxzPy51c2VySWQsXG4gICAgICBcInVzZXJOYW1lXCI6IHRoaXMudXNlckRldGFpbHM/LmNvbnRhY3QubmFtZSxcbiAgICAgIFwibW9iaWxlXCI6IHRoaXMudXNlckRldGFpbHM/LmNvbnRhY3QubW9iaWxlLFxuICAgICAgXCJlbWFpbFwiOiB0aGlzLnVzZXJEZXRhaWxzPy5jb250YWN0LmVtYWlsLFxuICAgIH1cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFVzZXJJdGVtcyh0aGlzLnVzZXJEZXRhaWxzLnVzZXJJZCwgXCJDQVJUXCIpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgY29uc3QgdGVtcFVzZXJDYXJ0ID0gcmVzcG9uc2U/LmRhdGE/LlswXT8ub3JkZXJlZEl0ZW1zID8/IFtdO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnRJZCcsIHJlc3BvbnNlLmRhdGE/LlswXT8uY2FydElkKTtcbiAgICAgIHRoaXMuY2FydEluZm9bXCJjYXJ0SWRcIl0gPSByZXNwb25zZS5kYXRhPy5bMF0/LmNhcnRJZDtcbiAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHNbJ29ycmFTY2hlbWVSZWRlZW1lZEFtb3VudCddID0gcmVzcG9uc2U/LmRhdGE/LlswXT8uYmlsbGRldGFpbHM/Lm9ycmFTY2hlbWVSZWRlZW1lZEFtb3VudFxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlsc1snb3JyYVNjaGVtZUNvZGUnXSA9IHJlc3BvbnNlPy5kYXRhPy5bMF0/LmJpbGxkZXRhaWxzPy5vcnJhU2NoZW1lQ29kZVxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheEFmdGVyRGlzY291bnQgPSByZXNwb25zZT8uZGF0YT8uWzBdPy5iaWxsZGV0YWlscz8udG90YWxUYXhBZnRlckRpc2NvdW50ID8/IDA7XG4gICAgICBpZiAocmVzcG9uc2UuZGF0YT8uWzBdPy5iaWxsZGV0YWlscz8ub3JyYVNjaGVtZUNvZGUpXG4gICAgICAgIHRoaXMuc2VsZWN0TWF0dXJlU2NoZW1lID0gdHJ1ZVxuICAgICAgdGhpcy5nZXRDb3Vwb25MaXN0KCk7XG4gICAgICBpZiAocmVzcG9uc2UuZGF0YT8uWzBdPy5vcmRlcmVkSXRlbXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5tZXJnZU9yZGVySXRlbXModGVtcFVzZXJDYXJ0KTtcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5hZGRBbGxQcm9kdWN0c1RvQ2FydCh0aGlzLmNhcnRJbmZvLm9yZGVyZWRJdGVtcykub25jb21wbGV0ZSA9ICgpID0+IHtcblxuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlckNhcnQoKS50aGVuKChjYXJ0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGNhcnRSZXNwb25zZS5vbnN1Y2Nlc3MgPSAoY2FydERhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNvdXBvbklkXCIpID09IFwidW5kZWZpbmVkXCIgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb3Vwb25JZFwiKSA9PSBcIm51bGxcIikpXG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5jb3Vwb25JZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY291cG9uSWRcIik7XG4gICAgICAgICAgICAgIGlmICghKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY291cG9uQ29kZVwiKSA9PSBcInVuZGVmaW5lZFwiIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY291cG9uQ29kZVwiKSA9PSBcIm51bGxcIikpXG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5jb3Vwb25Db2RlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb3Vwb25Db2RlXCIpO1xuICAgICAgICAgICAgICBjb25zdCByZXN0UmVzcG9uc2UgPSB0aGlzLnJlc3RTZXJ2aWNlLmFkZEl0ZW1Ub0RCKHRoaXMuY2FydEluZm8pLnRvUHJvbWlzZSgpO1xuICAgICAgICAgICAgICByZXN0UmVzcG9uc2UudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4ID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbE5ldFZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRJbmZvLnRvdGFsQW1vdW50ID0gMDtcblxuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9DQVJUX0lURU1TID0gY2FydERhdGEudGFyZ2V0LnJlc3VsdCBhcyB1bmtub3duIGFzIE9yZGVyZWRJdGVtc1tdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9DQVJUX0lURU1TLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxOZXRWYWx1ZSArPSAoaXRlbS5kaXNjb3VudGVkUHJpY2UgKiAoaXRlbS5xdWFudGl0eSA/PyAxKSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4ICs9IChpdGVtLnF1YW50aXR5ICogKGl0ZW0uaXRlbVRheCA/PyAwKSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyA9IChkZWxpdmVyeU9wdGlvbj8ubWluT3JkZXJBbW91bnQgPiB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsR3Jvc3NWYWx1ZSkgPyAwIDogKGRlbGl2ZXJ5T3B0aW9uPy5kZWxpdmVyeUNoYXJnZXMgPz8gMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbEdyb3NzVmFsdWUgPSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgKyB0aGlzLmdldFRheEFtb3VudCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydEluZm8ub3JkZXJlZEl0ZW1zID0gdGhpcy5VU0VSX0NBUlRfSVRFTVM7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kaXNjb3VudEFtb3VudCA9IHJlc3BvbnNlPy5kYXRhPy5iaWxsZGV0YWlscz8uZGlzY291bnRBbW91bnQgPz8gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4QWZ0ZXJEaXNjb3VudCA9IHJlc3BvbnNlPy5kYXRhPy5iaWxsZGV0YWlscz8udG90YWxUYXhBZnRlckRpc2NvdW50ID8/IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby50b3RhbEFtb3VudCA9IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlICsgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgLSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50O1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuc3RvcmFnZVNlcnZpY2UuYWRkQWxsUHJvZHVjdHNUb0NhcnQodGhpcy5jYXJ0SW5mby5vcmRlcmVkSXRlbXMpXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSB0aGlzLmNhcnRJbmZvO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FydFJlc3BvbnNlLm9uZXJyb3IgPSAoY2FydERhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6ICdGYWlsZWQgdG8gdXBkYXRlIGNhcnQgZGV0YWlscycgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyQ2FydCgpLnRoZW4oKGNhcnRSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNhcnRSZXNwb25zZS5vbnN1Y2Nlc3MgPSAoY2FydERhdGE6IGFueSkgPT4ge1xuXG4gICAgICAgICAgICB0aGlzLlVTRVJfQ0FSVF9JVEVNUyA9IGNhcnREYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcbiAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlID0gMDtcbiAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxUYXggPSAwO1xuICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheEFmdGVyRGlzY291bnQgPSBjYXJ0RGF0YS5iaWxsZGV0YWlscz8udG90YWxUYXhBZnRlckRpc2NvdW50ID8/IDA7XG4gICAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyA9IDA7XG4gICAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgPSAwO1xuICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby50b3RhbEFtb3VudCA9IDA7XG5cbiAgICAgICAgICAgIHRoaXMuVVNFUl9DQVJUX0lURU1TLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbE5ldFZhbHVlICs9IChpdGVtLmRpc2NvdW50ZWRQcmljZSAqIChpdGVtLnF1YW50aXR5ID8/IDEpKTtcbiAgICAgICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheCArPSAoaXRlbS5xdWFudGl0eSAqIChpdGVtLml0ZW1UYXggPz8gMCkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzID0gKGRlbGl2ZXJ5T3B0aW9uPy5taW5PcmRlckFtb3VudCA+IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlKSA/IDAgOiAoZGVsaXZlcnlPcHRpb24/LmRlbGl2ZXJ5Q2hhcmdlcyA/PyAwKTtcbiAgICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlID0gdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbE5ldFZhbHVlICsgdGhpcy5nZXRUYXhBbW91bnQoKTtcbiAgICAgICAgICAgIHRoaXMuY2FydEluZm8udG90YWxBbW91bnQgPSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsR3Jvc3NWYWx1ZSArIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzIC0gdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kaXNjb3VudEFtb3VudDtcbiAgICAgICAgICAgIHRoaXMuY2FydEluZm8ub3JkZXJlZEl0ZW1zID0gdGhpcy5VU0VSX0NBUlRfSVRFTVM7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHRoaXMuY2FydEluZm87XG4gICAgICAgICAgICB0aGlzLnJlc3RTZXJ2aWNlLmFkZEl0ZW1Ub0RCKHRoaXMucmVzcG9uc2VEYXRhKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnRJZCcsIHJlc3BvbnNlLmRhdGE/LmNhcnRJZCk7XG4gICAgICAgICAgICAgIHRoaXMuY2FydEluZm9bXCJjYXJ0SWRcIl0gPSByZXNwb25zZS5kYXRhPy5jYXJ0SWQ7XG4gICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhW1wiY2FydElkXCJdID0gdGhpcy5jYXJ0SW5mb1tcImNhcnRJZFwiXTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBnZXREZWZhdWx0QWRkcmVzcygpIHtcbiAgICBpZiAoKHRoaXMudXNlckRldGFpbHM/LmFkZHJlc3NEZXRhaWxzTGlzdD8ubGVuZ3RoIHx8IDApID09IDApXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLnNlbGVjdGVkQWRkcmVzc0lkeCA9IHRoaXMudXNlckRldGFpbHM/LmFkZHJlc3NEZXRhaWxzTGlzdD8uZmluZEluZGV4KGFkZHJlc3MgPT4gYWRkcmVzcy5kZWZhdWx0ID09PSB0cnVlKSA/PyAtMTtcbiAgICB0aGlzLmRlZmF1bHRBZGRyZXNzID0gdGhpcy5zZWxlY3RlZEFkZHJlc3NJZHggIT09IC0xXG4gICAgICA/IHRoaXMudXNlckRldGFpbHM/LmFkZHJlc3NEZXRhaWxzTGlzdFt0aGlzLnNlbGVjdGVkQWRkcmVzc0lkeF1cbiAgICAgIDogdGhpcy51c2VyRGV0YWlscz8uYWRkcmVzc0RldGFpbHNMaXN0Py5bMF07XG4gIH1cbiAgZ2V0IHN0eWxlc0xheW91dCgpIHtcbiAgICByZXR1cm4geyAuLi50aGlzLnN0eWxlcz8ubGF5b3V0IH0gYXMgTGF5T3V0TW9kZWw7XG4gIH1cblxuICBtZXJnZU9yZGVySXRlbXMoc3luY2VkSXRlbXM6IGFueVtdKSB7XG4gICAgZm9yIChsZXQgcHJvZHVjdCBvZiBzeW5jZWRJdGVtcykge1xuICAgICAgbGV0IGl0ZW1Gb3VuZCA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgY2FydEl0ZW0gb2YgdGhpcy5jYXJ0SW5mby5vcmRlcmVkSXRlbXMpIHtcbiAgICAgICAgaWYgKGNhcnRJdGVtLnZhcmllbnRJZCA9PT0gcHJvZHVjdC52YXJpZW50SWQpIHtcbiAgICAgICAgICBpdGVtRm91bmQgPSB0cnVlO1xuICAgICAgICAgIC8vIGNhcnRJdGVtLnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpdGVtRm91bmQpIHtcbiAgICAgICAgdGhpcy5jYXJ0SW5mby5vcmRlcmVkSXRlbXMucHVzaChwcm9kdWN0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRDb3Vwb25MaXN0KCkge1xuICAgIGlmICghdGhpcy5jYXJ0SW5mby5jYXJ0SWQgJiYgIShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNhcnRJZFwiKSA9PSBcInVuZGVmaW5lZFwiIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY2FydElkXCIpID09IFwibnVsbFwiKSlcbiAgICAgIHRoaXMuY2FydEluZm8uY2FydElkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjYXJ0SWRcIik7XG4gICAgdGhpcy5yZXN0U2VydmljZS5hcHBsaWNhYmxlRGlzY291bnRMaXN0KHRoaXMuY2FydEluZm8uY2FydElkKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuY291cG9uTGlzdCA9IHJlc3BvbnNlLmRhdGE/LmZpbHRlcigoY291cG9uOiBhbnkpID0+IGNvdXBvbi5hY3RpdmUpPy5tYXAoKGNvdXBvbjogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGlzY291bnRUeXBlOiBjb3Vwb24uZGlzY291bnQsXG4gICAgICAgICAgZGlzY291bnROYW1lOiBjb3Vwb24uY291cG9uVGl0bGUsXG4gICAgICAgICAgZGlzY291bnREZXNjcmlwdGlvbjogY291cG9uLmNvdXBvbkRlc2NyaXB0aW9uLFxuICAgICAgICAgIGNvdXBvbkNvZGU6IGNvdXBvbi5jb3Vwb25Db2RlLFxuICAgICAgICAgIGNvdXBvbklkOiBjb3Vwb24uY291cG9uSWQsXG4gICAgICAgICAgYXBwbGljYWJsZTogY291cG9uLmFwcGxpY2FibGUsXG4gICAgICAgICAgc3RhdHVzOiBjb3Vwb24uYWN0aXZlLFxuICAgICAgICAgIHZhbGlkVG86IGNvdXBvbi5leHBpcmVzLFxuICAgICAgICAgIHZhbGlkRnJvbTogY291cG9uLnZhbGlkRnJvbVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIH0pXG4gIH1cbiAgcmVtb3ZlQ291cG9uKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5jb3Vwb25JZCA9IFwiXCI7XG4gICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5jb3Vwb25Db2RlID0gXCJcIjtcbiAgICBjb25zdCByZXN0UmVzcG9uc2UgPSB0aGlzLnJlc3RTZXJ2aWNlLmFkZEl0ZW1Ub0RCKHRoaXMuY2FydEluZm8pLnRvUHJvbWlzZSgpO1xuICAgIHJlc3RSZXNwb25zZS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XG5cbiAgICAgIHRoaXMuY2FsY3VsYXRlQ2FydChyZXNwb25zZSk7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcImNvdXBvbklkXCIpO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJjb3Vwb25Db2RlXCIpO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0NvdXBvbicsIGRldGFpbDogJ0NvdXBvbiBSZW1vdmVkJyB9KTtcbiAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGlzY291bnRBbW91bnQgPSAwO1xuICAgICAgdGhpcy5jb3Vwb25EaWFsb2dSZWY/LmNsb3NlKCk7XG4gICAgfSlcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgZ2V0SW5kZXhEQkRhdGEoKSB7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyQ2FydCgpLnRoZW4oKGNhcnRSZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGVsaXZlcnlPcHRpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZGVsaXZlcnlPcHRpb25zXCIpID8/IFwie31cIik7XG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsR3Jvc3NWYWx1ZSA9IDA7XG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4ID0gMDtcbiAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxOZXRWYWx1ZSA9IDA7XG4gICAgICB0aGlzLmNhcnRJbmZvLnRvdGFsQW1vdW50ID0gMDtcbiAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzID0gMDtcblxuICAgICAgY2FydFJlc3BvbnNlLm9uc3VjY2VzcyA9IChjYXJ0RGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuVVNFUl9DQVJUX0lURU1TID0gY2FydERhdGEudGFyZ2V0LnJlc3VsdCBhcyB1bmtub3duIGFzIE9yZGVyZWRJdGVtc1tdO1xuICAgICAgICB0aGlzLlVTRVJfQ0FSVF9JVEVNUy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbE5ldFZhbHVlICs9IChpdGVtLmRpc2NvdW50ZWRQcmljZSAqIChpdGVtLnF1YW50aXR5ID8/IDEpKTtcbiAgICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4ICs9IChpdGVtLnF1YW50aXR5ICogKGl0ZW0uaXRlbVRheCA/PyAwKSk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheEFmdGVyRGlzY291bnQgPSBjYXJ0RGF0YS5iaWxsZGV0YWlscz8udG90YWxUYXhBZnRlckRpc2NvdW50ID8/IDA7XG4gICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzID0gKGRlbGl2ZXJ5T3B0aW9uPy5taW5PcmRlckFtb3VudCA+IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlKSA/IDAgOiAoZGVsaXZlcnlPcHRpb24/LmRlbGl2ZXJ5Q2hhcmdlcyA/PyAwKTtcbiAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbEdyb3NzVmFsdWUgPSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgKyB0aGlzLmdldFRheEFtb3VudCgpO1xuICAgICAgICB0aGlzLmNhcnRJbmZvLnRvdGFsQW1vdW50ID0gdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbEdyb3NzVmFsdWUgKyB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyAtIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGlzY291bnRBbW91bnQ7XG4gICAgICAgIHRoaXMuY2FydEluZm8ub3JkZXJlZEl0ZW1zID0gdGhpcy5VU0VSX0NBUlRfSVRFTVM7XG4gICAgICAgIGlmICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKSlcbiAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJDYXJ0KCk7XG5cbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSB0aGlzLmNhcnRJbmZvO1xuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgcHJvY2VlZFRvQ2hlY2tvdXQoKSB7XG4gICAgaWYgKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpKSB7XG4gICAgICB0aGlzLmN1cnJlbnRUYWIgPSBcIkFERFJFU1NcIjtcbiAgICAgIHRoaXMuZ2V0RGVmYXVsdEFkZHJlc3MoKVxuICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSAwO1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdMb2dpbicsIGRldGFpbDogJ1BsZWFzZSBsb2dpbiB3aXRoIG1vYmlsZSBudW1iZXIgdG8gb3JkZXInIH0pO1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbG9naW4nXSwgeyBxdWVyeVBhcmFtczogeyBjYXJ0OiB0cnVlIH0gfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b1NsdWcoaW5wdXQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWlucHV0KVxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBub1doaXRlc3BhY2UgPSBpbnB1dC5yZXBsYWNlKC9cXHMrL2csICctJyk7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vV2hpdGVzcGFjZS5ub3JtYWxpemUoJ05GRCcpO1xuICAgIGNvbnN0IHNsdWcgPSBub3JtYWxpemVkLnJlcGxhY2UoL1teXFx3LV0vZywgJycpO1xuXG4gICAgcmV0dXJuIHNsdWdcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvLSsvZywgJy0nKVxuICAgICAgLnJlcGxhY2UoL14tfC0kL2csICcnKTtcbiAgfVxuXG4gIGdvVG9Qcm9kdWN0RGV0YWlscyhwcm9kdWN0OiBPcmRlcmVkSXRlbXMpIHtcbiAgICBjb25zdCBzbHVnID0gcHJvZHVjdC5zbHVnaWZpZWROYW1lIHx8IHRoaXMudG9TbHVnKHByb2R1Y3QuaXRlbU5hbWUpO1xuICAgIGlmICghc2x1ZylcbiAgICAgIHJldHVybjtcblxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2RldGFpbHMnLCBzbHVnXSk7XG4gIH1cbiAgcHJvY2VlZFRvTGlzdFBhZ2UoKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xuICB9XG4gIHJlbW92ZUl0ZW0oaXRlbTogT3JkZXJlZEl0ZW1zKSB7XG5cbiAgICBTd2FsLmZpcmUoe1xuICAgICAgaWNvbjogXCJ3YXJuaW5nXCIsXG4gICAgICBodG1sOiBcIjxzcGFuPllvdSBjYW4gbW92ZSA8L3NwYW4+IDxiPlwiICsgaXRlbS5pdGVtTmFtZSArIFwiPC9iPiA8c3Bhbj50byB3aXNobGlzdCBzbyB5b3UgY2FuIGJ1eSBsYXRlci48L3NwYW4+XCIsXG4gICAgICBjb25maXJtQnV0dG9uVGV4dDogXCJNb3ZlIHRvIHdpc2hsaXN0XCIsXG4gICAgICBzaG93RGVueUJ1dHRvbjogdHJ1ZSxcbiAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgIGRlbnlCdXR0b25UZXh0OiBcIkRlbGV0ZSBpdGVtXCIsXG4gICAgICBkZW55QnV0dG9uQ29sb3I6IFwiI2Q1ZDVkNWZmXCIsXG4gICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsXG4gICAgfSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5pc0NvbmZpcm1lZCkge1xuICAgICAgICBpZiAodGhpcy5jYXJ0VHlwZSA9PT0gJ1NIT1BQSU5HJykge1xuICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbUZyb21DYXJ0KGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVtb3ZlVHJpYWxJdGVtKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb3ZlSXRlbVRvV2lzaGxpc3QoaXRlbSk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmlzRGVuaWVkKSB7XG4gICAgICAgIGlmICh0aGlzLmNhcnRUeXBlID09PSAnU0hPUFBJTkcnKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVJdGVtRnJvbUNhcnQoaXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVUcmlhbEl0ZW0oaXRlbSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgcHJpdmF0ZSBtb3ZlSXRlbVRvV2lzaGxpc3QoaXRlbTogT3JkZXJlZEl0ZW1zKSB7XG4gICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9GYXZGcm9tQ2FydChpdGVtKTtcbiAgfVxuICBwcml2YXRlIHJlbW92ZUl0ZW1Gcm9tQ2FydChpdGVtOiBPcmRlcmVkSXRlbXMpIHtcbiAgICBpdGVtLnF1YW50aXR5ID0gMDtcbiAgICBpZiAodGhpcy5VU0VSX0NBUlRfSVRFTVMpXG4gICAgICB0aGlzLlVTRVJfQ0FSVF9JVEVNUyA9IHRoaXMuVVNFUl9DQVJUX0lURU1TLmZpbHRlcigocHJvZHVjdDogYW55KSA9PiBwcm9kdWN0LnZhcmllbnRJZCAhPSBpdGVtLnZhcmllbnRJZCk7XG4gICAgdGhpcy5jYXJ0SW5mby5vcmRlcmVkSXRlbXMgPSB0aGlzLlVTRVJfQ0FSVF9JVEVNUztcbiAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHRoaXMuY2FydEluZm87XG4gICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtRnJvbUNhcnRQYWdlKGl0ZW0sIHRoaXMucmVzcG9uc2VEYXRhKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGRlbGl2ZXJ5T3B0aW9uID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImRlbGl2ZXJ5T3B0aW9uc1wiKSA/PyBcInt9XCIpO1xuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbEdyb3NzVmFsdWUgPSAwO1xuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheCA9IDA7XG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4QWZ0ZXJEaXNjb3VudCA9IHJlc3BvbnNlPy5kYXRhPy5iaWxsZGV0YWlscz8udG90YWxUYXhBZnRlckRpc2NvdW50ID8/IDA7XG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50ID0gcmVzcG9uc2U/LmRhdGE/LmJpbGxkZXRhaWxzPy5kaXNjb3VudEFtb3VudCA/PyAwO1xuXG4gICAgICBpZiAodGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kaXNjb3VudEFtb3VudCA8PSAwKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLmJpbGxkZXRhaWxzLmNvdXBvbkNvZGUgPSBudWxsO1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5iaWxsZGV0YWlscy5jb3Vwb25JZCA9IG51bGw7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiY291cG9uQ29kZVwiKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJjb3Vwb25JZFwiKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbE5ldFZhbHVlID0gMDtcbiAgICAgIHRoaXMuY2FydEluZm8udG90YWxBbW91bnQgPSAwO1xuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgPSAwO1xuICAgICAgdGhpcy5jYXJ0SW5mby5jb3Vwb25Db2RlID0gcmVzcG9uc2UuZGF0YT8uYmlsbGRldGFpbHM/LmNvdXBvbkNvZGU7XG4gICAgICB0aGlzLmNhcnRJbmZvLmNvdXBvbklkID0gcmVzcG9uc2UuZGF0YT8uYmlsbGRldGFpbHM/LmNvdXBvbklkO1xuXG4gICAgICByZXNwb25zZT8uZGF0YT8ub3JkZXJlZEl0ZW1zLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgKz0gKGl0ZW0uZGlzY291bnRlZFByaWNlICogKGl0ZW0ucXVhbnRpdHkgPz8gMSkpO1xuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4ICs9IChpdGVtLnF1YW50aXR5ICogKGl0ZW0uaXRlbVRheCA/PyAwKSk7XG4gICAgICB9KVxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgPSAoZGVsaXZlcnlPcHRpb24/Lm1pbk9yZGVyQW1vdW50ID4gdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbEdyb3NzVmFsdWUpID8gMCA6IChkZWxpdmVyeU9wdGlvbj8uZGVsaXZlcnlDaGFyZ2VzID8/IDApO1xuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbEdyb3NzVmFsdWUgPSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgKyB0aGlzLmdldFRheEFtb3VudCgpO1xuICAgICAgdGhpcy5jYXJ0SW5mby50b3RhbEFtb3VudCA9IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlICsgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgLSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50O1xuICAgICAgdGhpcy5jYXJ0SW5mby5vcmRlcmVkSXRlbXMgPSB0aGlzLlVTRVJfQ0FSVF9JVEVNUztcbiAgICB9KVxuICB9XG4gIGFkZFRvQ2FydChpdGVtOiBPcmRlcmVkSXRlbXMsIHF1YW50aXR5OiBudW1iZXIpIHtcbiAgICAvLyBpZiAodHlwZSA9PSAnQUREJykge1xuICAgIC8vICAgaXRlbS5xdWFudGl0eSArPSAxO1xuICAgIC8vIH1cbiAgICAvLyBlbHNlIHtcbiAgICAvLyAgIGl0ZW0ucXVhbnRpdHkgLT0gMTtcbiAgICAvLyB9XG4gICAgdGhpcy5zaG93UmVlZGVtRXJyb3IgPSBmYWxzZVxuICAgIC8vIGl0ZW0ucXVhbnRpdHkgPSBxdWFudGl0eVxuICAgIGlmIChpdGVtLnF1YW50aXR5ICYmIGl0ZW0ucXVhbnRpdHkgPiAwKSB7XG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Gcm9tQ2FydFBhZ2UoaXRlbSwgdGhpcy5yZXNwb25zZURhdGEpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBkZWxpdmVyeU9wdGlvbiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJkZWxpdmVyeU9wdGlvbnNcIikgPz8gXCJ7fVwiKTtcbiAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbEdyb3NzVmFsdWUgPSAwO1xuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4ID0gMDtcbiAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheEFmdGVyRGlzY291bnQgPSByZXNwb25zZT8uZGF0YT8uYmlsbGRldGFpbHM/LnRvdGFsVGF4QWZ0ZXJEaXNjb3VudCA/PyAwO1xuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgPSAwO1xuICAgICAgICB0aGlzLmNhcnRJbmZvLnRvdGFsQW1vdW50ID0gMDtcbiAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgPSAwO1xuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50ID0gcmVzcG9uc2U/LmRhdGE/LmJpbGxkZXRhaWxzPy5kaXNjb3VudEFtb3VudCA/PyAwO1xuXG4gICAgICAgIGlmICh0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50IDw9IDApIHtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5iaWxsZGV0YWlscy5jb3Vwb25Db2RlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5iaWxsZGV0YWlscy5jb3Vwb25JZCA9IG51bGw7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJjb3Vwb25Db2RlXCIpO1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiY291cG9uSWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXNwb25zZT8uZGF0YT8ub3JkZXJlZEl0ZW1zLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxOZXRWYWx1ZSArPSAoaXRlbS5kaXNjb3VudGVkUHJpY2UgKiAoaXRlbS5xdWFudGl0eSA/PyAxKSk7XG4gICAgICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheCArPSAoaXRlbS5xdWFudGl0eSAqIChpdGVtLml0ZW1UYXggPz8gMCkpO1xuICAgICAgICB9KVxuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyA9IChkZWxpdmVyeU9wdGlvbj8ubWluT3JkZXJBbW91bnQgPiB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsR3Jvc3NWYWx1ZSkgPyAwIDogKGRlbGl2ZXJ5T3B0aW9uPy5kZWxpdmVyeUNoYXJnZXMgPz8gMCk7XG4gICAgICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlID0gdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbE5ldFZhbHVlICsgdGhpcy5nZXRUYXhBbW91bnQoKTtcbiAgICAgICAgdGhpcy5jYXJ0SW5mby50b3RhbEFtb3VudCA9IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlICsgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgLSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50O1xuICAgICAgICB0aGlzLmNhcnRJbmZvLm9yZGVyZWRJdGVtcyA9IHRoaXMuVVNFUl9DQVJUX0lURU1TO1xuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVJdGVtKGl0ZW0pO1xuICAgIH1cbiAgfVxuICBjYXJ0SWQ6IGFueVxuICBwbGFjZU9yZGVyTG9hZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIGFzeW5jIHByb2NlZWRUb1BheW1lbnQoKSB7XG4gICAgdGhpcy5wbGFjZU9yZGVyTG9hZGVyID0gdHJ1ZTtcbiAgICBsZXQgcmVzdWx0OiBhbnkgPSBcIlwiO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhd0RhdGEgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFJlZmVycmFsRGV0YWlscygpO1xuICAgICAgY29uc3QgcmVmZXJyYWxEZXRhaWxzID0gcmF3RGF0YSA/IEpTT04ucGFyc2UocmF3RGF0YSkgOiB7fTtcblxuICAgICAgaWYgKHJlZmVycmFsRGV0YWlscyAmJiBPYmplY3Qua2V5cyhyZWZlcnJhbERldGFpbHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICBPYmplY3QudmFsdWVzKHJlZmVycmFsRGV0YWlscykuZmluZCgoaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpdGVtPy5yZWZlcnJhbEV2ZW50cykgJiZcbiAgICAgICAgICAgIGl0ZW0ucmVmZXJyYWxFdmVudHMuaW5jbHVkZXMoJ1BST0RVQ1RfUFVSQ0hBU0UnKVxuICAgICAgICAgICkgfHwgXCJcIjtcbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCByZWZlcnJhbERldGFpbHMgSlNPTlwiLCBlcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKSkge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnTG9naW4nLCBkZXRhaWw6ICdQbGVhc2UgbG9naW4gd2l0aCBtb2JpbGUgbnVtYmVyIHRvIG9yZGVyJyB9KTtcbiAgICAgIHRoaXMucGxhY2VPcmRlckxvYWRlciA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzUGF5bWVudEdhdGV3YXlFbmFibGVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJpc1BheW1lbnRHYXRld2F5RW5hYmxlZFwiKSA/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaXNQYXltZW50R2F0ZXdheUVuYWJsZWRcIikgPT0gXCJ0cnVlXCIgOiB0cnVlO1xuICAgIGNvbnN0IG1lcmNoYW50SWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncE1JZCcpID09IFwibnVsbFwiIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwTUlkJykgPT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncE1JZCcpO1xuXG4gICAgaWYgKGlzUGF5bWVudEdhdGV3YXlFbmFibGVkICYmICFtZXJjaGFudElkKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnTWVyY2hhbnQgb25ib2FyZGVkJywgZGV0YWlsOiAnTWVyY2hhbnQgaXMgbm90IG9uYm9hcmRlZCcgfSk7XG4gICAgICB0aGlzLnBsYWNlT3JkZXJMb2FkZXIgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyRGV0YWlsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCkgYXMgVXNlcjtcbiAgICBjb25zdCBhZGRyZXNzID0gdXNlckRldGFpbD8uYWRkcmVzc0RldGFpbHNMaXN0W3RoaXMuc2VsZWN0ZWRBZGRyZXNzSWR4XSBhcyBBZGRyZXNzO1xuICAgIGlmIChhZGRyZXNzPy5yZWNlaXZlck5hbWU/Lmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnUGF5bWVudCBGYWlsdXJlJywgZGV0YWlsOiAnUGxlYXNlIHByb3ZpZGUgYWRkcmVzcyBkZXRhaWxzJyB9KTtcbiAgICAgIHRoaXMucGxhY2VPcmRlckxvYWRlciA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNhcnRJZFwiKSA9PSBcInVuZGVmaW5lZFwiIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY2FydElkXCIpID09IFwibnVsbFwiKSlcbiAgICAgIHRoaXMuY2FydEluZm9bXCJjYXJ0SWRcIl0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNhcnRJZFwiKTtcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ1BsZWFzZSB3YWl0JywgZGV0YWlsOiAnV2UgYXJlIHByb2Nlc3NpbmcgeW91ciBwYXltZW50JywgbGlmZTogMjAwMCB9KTtcbiAgICAgIGF3YWl0IHRoaXMucmVzdFNlcnZpY2UuYWRkSXRlbVRvREIodGhpcy5jYXJ0SW5mbykudG9Qcm9taXNlKCkudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImNhcnRJZFwiLCByZXNwb25zZS5kYXRhPy5jYXJ0SWQpO1xuICAgICAgICB0aGlzLmNhcnRJZCA9IHJlc3BvbnNlLmRhdGE/LmNhcnRJZDtcbiAgICAgICAgdGhpcy5jYXJ0SW5mb1tcImNhcnRJZFwiXSA9IHJlc3BvbnNlLmRhdGE/LmNhcnRJZDtcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmICh0aGlzPy5pc1BvaW50c1JlZGVlbWluZyA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKCh0aGlzPy5yZWRlbXB0aW9uUG9pbnRzPy5wb2ludHNDb252ZXJ0ZWRSdXBlZXMgPT09IHRoaXMucmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCkgfHwgKHRoaXM/LnJlZGVtcHRpb25Qb2ludHM/LnBvaW50c0NvbnZlcnRlZFJ1cGVlcyA+IHRoaXMucmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCkpIHtcbiAgICAgICAgdGhpcy5wYXltZW50V2l0aENvbXBsZXRlUG9pbnRzKClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNhcnRJbmZvW1wiYWRkcmVzc0RldGFpbHNcIl0gPSBhZGRyZXNzO1xuICAgIGNvbnN0IHVwZGF0ZUFkZHJlc3MgPSBhd2FpdCB0aGlzLnJlc3RTZXJ2aWNlLmFkZEl0ZW1Ub0RCKHRoaXMuY2FydEluZm8pLnRvUHJvbWlzZSgpO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBcInVzZXJJZFwiOiB1c2VyRGV0YWlsPy51c2VySWQsXG4gICAgICBcImNhcnRJZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydElkJyksXG4gICAgICAvLyBcIm9yZGVyQW1vdW50XCI6IHRoaXMuaXNQb2ludHNSZWRlZW1pbmdcbiAgICAgIC8vICAgPyBOdW1iZXIoKCh0aGlzLnJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgPz8gMCkgLSAodGhpcz8udG90YWxTYXZpbmdBbXQgfHwgMCkpLnRvRml4ZWQoMikpXG4gICAgICAvLyAgIDogdGhpcy5zZWxlY3RlZFZvdWNoZXJBbW91bnQgPyBOdW1iZXIoKCh0aGlzLnJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgPz8gMCkgLSAodGhpcz8uc2VsZWN0ZWRWb3VjaGVyQW1vdW50IHx8IDApKS50b0ZpeGVkKDIpKSA6IE51bWJlcigodGhpcy5yZXNwb25zZURhdGE/LnRvdGFsQW1vdW50ID8/IDApLnRvRml4ZWQoMikpLFxuICAgICAgXCJvcmRlckFtb3VudFwiOiB0aGlzLmlzUG9pbnRzUmVkZWVtaW5nXG4gICAgICAgID8gTnVtYmVyKCgodGhpcy5yZXNwb25zZURhdGE/LnRvdGFsQW1vdW50ID8/IDApIC0gKHRoaXM/LnRvdGFsU2F2aW5nQW10IHx8IDApKS50b0ZpeGVkKDIpKVxuICAgICAgICA6IHRoaXMuY291cG9uVmFsdWVUeXBlID09PSAnQU1PVU5UJ1xuICAgICAgICAgID8gTnVtYmVyKCgodGhpcy5yZXNwb25zZURhdGE/LnRvdGFsQW1vdW50ID8/IDApIC0gKHRoaXM/LnNlbGVjdGVkVm91Y2hlckFtb3VudCB8fCAwKSkudG9GaXhlZCgyKSlcbiAgICAgICAgICA6IHRoaXMuY291cG9uVmFsdWVUeXBlID09PSAnUEVSQ0VOVEFHRSdcbiAgICAgICAgICAgID8gTnVtYmVyKCgodGhpcy5yZXNwb25zZURhdGE/LnRvdGFsQW1vdW50ID8/IDApIC0gKHRoaXM/LnBlcmNlbnRhZ2VSZWR1Y2VkIHx8IDApKS50b0ZpeGVkKDIpKVxuICAgICAgICAgICAgOiBOdW1iZXIoKHRoaXMucmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCA/PyAwKS50b0ZpeGVkKDIpKSxcbiAgICAgIFwiaXNQYXltZW50R2F0ZXdheUVuYWJsZWRcIjogaXNQYXltZW50R2F0ZXdheUVuYWJsZWQsXG4gICAgICBcImNvbnRhY3REZXRhaWxzXCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IGFkZHJlc3M/LnJlY2VpdmVyTmFtZSxcbiAgICAgICAgXCJtb2JpbGVcIjogYWRkcmVzcz8ucmVjZWl2ZXJQaG9uZSxcbiAgICAgICAgXCJjb3VudHJ5Q29kZVwiOiBcIjkxXCIsXG4gICAgICAgIFwiZW1haWxcIjogYWRkcmVzcz8ucmVjZWl2ZXJFbWFpbFxuICAgICAgfSxcbiAgICAgIFwicGF5bWVudE1lcmNoYW50SWRcIjogbWVyY2hhbnRJZCxcbiAgICAgIFwiaXNKZXdlbGxlcnlcIjogdGhpcz8uaXNKZXdlbGxlcnksXG4gICAgICBcInJlZmVycmFsSWRcIjogcmVzdWx0Py5yZWZlcnJhbFVuaXF1ZUlkLFxuICAgICAgXCJyZXdhcmRVc2VkXCI6IHRoaXM/LmlzUG9pbnRzUmVkZWVtaW5nID8gXCJSRVdBUkRfUE9JTlRTXCIgOiB0aGlzPy5hcHBsaWVkVm91Y2hlciA/IFwiVk9VQ0hFUlwiIDogbnVsbCxcbiAgICAgIFwicG9pbnRzVXNlZFwiOiB0aGlzPy5pc1BvaW50c1JlZGVlbWluZyA/IHRoaXMudXNlZFBvaW50cyA6IDAsXG4gICAgICBcInBvaW50c0NvbnZlcnRlZElOUlwiOiB0aGlzPy5pc1BvaW50c1JlZGVlbWluZyA/IHRoaXMudG90YWxTYXZpbmdBbXQgOiAwLFxuICAgICAgXCJ2b3VjaGVyVmFsdWVcIjogdGhpcy5zZWxlY3RlZFZvdWNoZXJBbW91bnQgPyB0aGlzLnNlbGVjdGVkVm91Y2hlckFtb3VudCA6IHRoaXMucGVyY2VudGFnZVJlZHVjZWQgPyB0aGlzLnBlcmNlbnRhZ2VSZWR1Y2VkIDogMCxcbiAgICAgIFwidm91Y2hlcklkXCI6IHRoaXM/LmFwcGxpZWRWb3VjaGVyID8gdGhpcy5zZWxlY3RlZFZvdWNoZXJJZCA6IG51bGwsXG4gICAgICBcInZvdWNoZXJDb2RlXCI6IHRoaXM/LmFwcGxpZWRWb3VjaGVyID8gdGhpcy5zZWxlY3RlZFZvdWNoZXJDb2RlIDogJydcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2cocGF5bG9hZClcbiAgICAvLyByZXR1cm5cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmNyZWF0ZVBheW1lbnRUb2tlbihwYXlsb2FkKS5zdWJzY3JpYmUoKHBheW1lbnREZXRhaWxzOiBhbnkpID0+IHtcbiAgICAgIGlmIChpc1BheW1lbnRHYXRld2F5RW5hYmxlZCkge1xuICAgICAgICB0aGlzLl9ldmVudFNlcnZpY2UuY2FzaEZyZWVFdmVudC5lbWl0KHBheW1lbnREZXRhaWxzKTtcbiAgICAgICAgdGhpcy5wbGFjZU9yZGVyTG9hZGVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBlbHNlIHtcblxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcIm9yZGVySWRcIik7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiY2FydElkXCIpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcInBheW1lbnRGb3JcIik7XG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuY2xlYXJVc2VyQ2FydCgpO1xuICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgIGljb246IFwic3VjY2Vzc1wiLFxuICAgICAgICAgIHRpdGxlOiBcIkh1cnJheVwiLFxuICAgICAgICAgIHRleHQ6IFwiT3JkZXIgcGxhY2VkIHN1Y2Nlc3NmdWxseVwiLFxuICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIlNlZSBEZXRhaWxzXCIsXG4gICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlXG4gICAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmlzQ29uZmlybWVkKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9wcm9maWxlJ10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5wbGFjZU9yZGVyTG9hZGVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3I/LmVycm9yPy5jb2RlID09IDQwOSkge1xuICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgIGljb246IFwiaW5mb1wiLFxuICAgICAgICAgIGh0bWw6IFwiPHA+XCIgKyBlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UucmVwbGFjZSgvICpcXChbXildKlxcKSAqL2csIFwiXCIpICsgXCI8L3A+XCIsXG4gICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlXG4gICAgICAgIH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VGFiID0gXCJCQUdcIjtcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdQYXltZW50IEZhaWx1cmUnLCBkZXRhaWw6ICdQbGVhc2UgdHJ5IGFnYWluJyB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGxhY2VPcmRlckxvYWRlciA9IGZhbHNlO1xuICAgIH0pXG4gIH1cblxuXG4gIGFkZHJlc3NTZWxlY3RlZChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZWxlY3RlZEFkZHJlc3NJZHggPSBpbmRleDtcbiAgfVxuXG4gIGlzSXRlbU91dE9mU3RvY2socHJvZHVjdDogT3JkZXJlZEl0ZW1zKSB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBuZWVkIGNvbmRpdGlvblxuICB9XG4gIGdldEtleXMob2JqZWN0OiBPYmplY3QpOiBzdHJpbmdbXSB7XG4gICAgaWYgKG9iamVjdClcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGVkaXRTZWN0aW9uKCkge1xuXG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDQ3NSlcbiAgICAgIHJldHVybjtcblxuICAgIHRoaXMuX2V2ZW50U2VydmljZS50b2dnbGVFZGl0b3JFdmVudC5lbWl0KGZhbHNlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2V2ZW50U2VydmljZS5lZGl0U2VjdGlvbi5lbWl0KHsgZGF0YTogdGhpcy5kYXRhIH0pO1xuICAgIH0sIDEwMCk7XG4gIH1cbiAgY2xvc2VXaW5kb3coKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgfVxuICBjb3Vwb25EaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuICBpc0NvdXBvbkRpYWxvZ09wZW5pbmcgPSBmYWxzZTtcblxuICBvcGVuRGlhbG9nKGNvbnRhaW5lcjogYW55KSB7XG5cbiAgICBpZiAodGhpcy5jb3Vwb25EaWFsb2dSZWYgfHwgdGhpcy5pc0NvdXBvbkRpYWxvZ09wZW5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzQ291cG9uRGlhbG9nT3BlbmluZyA9IHRydWU7XG5cblxuICAgIGlmICh0aGlzLmNhcnRJbmZvPy5iaWxsZGV0YWlscz8uY291cG9uSWQpXG4gICAgICByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMuY2FydEluZm8uY2FydElkICYmICEobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjYXJ0SWRcIikgPT0gXCJ1bmRlZmluZWRcIiB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNhcnRJZFwiKSA9PSBcIm51bGxcIikpXG4gICAgICB0aGlzLmNhcnRJbmZvLmNhcnRJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY2FydElkXCIpO1xuXG4gICAgLy8gaWYgKCF0aGlzLmNhcnRJbmZvPy5jYXJ0SWQpIHtcbiAgICAvLyAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdZb3UgYXJlIG5vdCBsb2dnZWQgaW4nLCBkZXRhaWw6ICdQbGVhc2UgbG9naW4gZmlyc3QgdG8gYXBwbHkgY291cG9uJyB9KTtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG5cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmFwcGxpY2FibGVEaXNjb3VudExpc3QodGhpcy5jYXJ0SW5mby5jYXJ0SWQpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jb3Vwb25MaXN0ID0gcmVzcG9uc2UuZGF0YT8uZmlsdGVyKChjb3Vwb246IGFueSkgPT4gY291cG9uLmFjdGl2ZSk/Lm1hcCgoY291cG9uOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXNjb3VudFR5cGU6IGNvdXBvbi5kaXNjb3VudCxcbiAgICAgICAgICBkaXNjb3VudE5hbWU6IGNvdXBvbi5jb3Vwb25UaXRsZSxcbiAgICAgICAgICBkaXNjb3VudERlc2NyaXB0aW9uOiBjb3Vwb24uY291cG9uRGVzY3JpcHRpb24sXG4gICAgICAgICAgY291cG9uQ29kZTogY291cG9uLmNvdXBvbkNvZGUsXG4gICAgICAgICAgY291cG9uSWQ6IGNvdXBvbi5jb3Vwb25JZCxcbiAgICAgICAgICBhcHBsaWNhYmxlOiBjb3Vwb24uYXBwbGljYWJsZSxcbiAgICAgICAgICBzdGF0dXM6IGNvdXBvbi5hY3RpdmUsXG4gICAgICAgICAgdmFsaWRUbzogY291cG9uLmV4cGlyZXMsXG4gICAgICAgICAgdmFsaWRGcm9tOiBjb3Vwb24udmFsaWRGcm9tXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpKSB7XG4gICAgICAgIHRoaXMuY291cG9uRGlhbG9nUmVmID0gdGhpcy5tYXREaWFsb2cub3Blbihjb250YWluZXIsIHsgcGFuZWxDbGFzczogJ3NpZGVwYW5lbC1jbGFzcycgfSk7XG4gICAgICAgIHRoaXMuY291cG9uRGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvdXBvbkRpYWxvZ1JlZiA9IG51bGw7XG4gICAgICAgICAgdGhpcy5pc0NvdXBvbkRpYWxvZ09wZW5pbmcgPSBmYWxzZTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdMb2dpbicsIGRldGFpbDogJ1BsZWFzZSBsb2dpbiB3aXRoIG1vYmlsZSBudW1iZXIgdG8gYXBwbHkgY291cG9uJyB9KTtcbiAgICAgICAgdGhpcy5pc0NvdXBvbkRpYWxvZ09wZW5pbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbGlzdFJlZGVtcHRpb25Db3Vwb25zOiBhbnk7XG4gIGFwcGxpZWRWb3VjaGVyOiBhbnk7XG4gIHJlZGVtcHRpb25UeXBlOiBcIkNPVVBPTlNcIiB8IFwiVk9VQ0hFUlNcIiA9IFwiQ09VUE9OU1wiXG4gIHJlZGVtcHRpb25Db3Vwb25UeXBlOiBcIlJFV0FSRFNcIiB8IFwiRElTQ09VTlRTXCIgPSBcIlJFV0FSRFNcIlxuICBzZWxlY3RlZFZvdWNoZXJJZDogYW55XG4gIHNlbGVjdGVkVm91Y2hlckFtb3VudDogYW55XG4gIHNlbGVjdGVkVm91Y2hlckNvZGU6IGFueVxuICBsaXN0UmVkZW1wdGlvblZvdWNoZXJzOiBhbnlcbiAgc2VsZWN0ZWRWb3VjaGVyUGVyY2VudGFnZTogYW55XG4gIHBlcmNlbnRhZ2VSZWR1Y2VkOiBhbnlcbiAgY291cG9uVmFsdWVUeXBlOiBzdHJpbmcgPSAnJ1xuICBhZGRSZWRlbXB0aW9uQ291cG9uKGNvbnRhaW5lcjogYW55KSB7XG4gICAgbGV0IGJ1c2luZXNzSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJJZFwiKSA/PyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJ1c2luZXNzSWRcIilcbiAgICBjb25zdCB1c2VyRGV0YWlscyA9ICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKSBhcyBVc2VyKTtcbiAgICBsZXQgdXNlcklkID0gdXNlckRldGFpbHM/LnVzZXJJZFxuICAgIGxldCBvcmRlclZhbHVlID0gdGhpcy5yZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy50b3RhbE5ldFZhbHVlXG4gICAgLy8gbGV0IGJ1c2luZXNzSWQgPSAnMWYxMmRmMTYtODE1NC02Y2VhLTg1YzUtZmI2MTZjNDdhYWY0JztcbiAgICAvLyBsZXQgdXNlcklkID0gJzI5ZDJiNDI0LTY4MGMtNDZiZC1iMThmLWI4NmIzNDZlYjFjZic7IFxuICAgIC8vIGxldCBvcmRlclZhbHVlID0gdGhpcy5yZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy50b3RhbE5ldFZhbHVlO1xuXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRSZWRlZW1Qb2ludHMoYnVzaW5lc3NJZCwgdXNlcklkLCAnUFJPRFVDVF9QVVJDSEFTRScsIG9yZGVyVmFsdWUsIGZhbHNlKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlcylcbiAgICAgICAgdGhpcy5saXN0UmVkZW1wdGlvbkNvdXBvbnMgPSByZXM7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnQ291cG9ucyBGYWlsZWQnLCBkZXRhaWw6ICdGYWlsZWQgdG8gbG9hZCBDb3Vwb25zJyB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmFwcGxpY2FibGVEaXNjb3VudExpc3QodGhpcy5jYXJ0SW5mby5jYXJ0SWQpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jb3Vwb25MaXN0ID0gcmVzcG9uc2UuZGF0YT8uZmlsdGVyKChjb3Vwb246IGFueSkgPT4gY291cG9uLmFjdGl2ZSk/Lm1hcCgoY291cG9uOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXNjb3VudFR5cGU6IGNvdXBvbi5kaXNjb3VudCxcbiAgICAgICAgICBkaXNjb3VudE5hbWU6IGNvdXBvbi5jb3Vwb25UaXRsZSxcbiAgICAgICAgICBkaXNjb3VudERlc2NyaXB0aW9uOiBjb3Vwb24uY291cG9uRGVzY3JpcHRpb24sXG4gICAgICAgICAgY291cG9uQ29kZTogY291cG9uLmNvdXBvbkNvZGUsXG4gICAgICAgICAgY291cG9uSWQ6IGNvdXBvbi5jb3Vwb25JZCxcbiAgICAgICAgICBhcHBsaWNhYmxlOiBjb3Vwb24uYXBwbGljYWJsZSxcbiAgICAgICAgICBzdGF0dXM6IGNvdXBvbi5hY3RpdmUsXG4gICAgICAgICAgdmFsaWRUbzogY291cG9uLmV4cGlyZXMsXG4gICAgICAgICAgdmFsaWRGcm9tOiBjb3Vwb24udmFsaWRGcm9tXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pXG4gICAgdGhpcy5jb3Vwb25EaWFsb2dSZWYgPSB0aGlzLm1hdERpYWxvZy5vcGVuKGNvbnRhaW5lciwgeyBwYW5lbENsYXNzOiAnc2lkZXBhbmVsLWNsYXNzJyB9KTtcbiAgfVxuXG4gIGFwcGx5UmVkZW1wdGlvbkNvdXBvbih2b3VjaGVyOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc1BvaW50c1JlZGVlbWluZykge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnQ291cG9uIG5vdCBhcHBsaWNhYmxlJywgZGV0YWlsOiAnWW91IGNhbiBub3QgYWRkIGEgY291cG9uIHdoZW4gcG9pbnRzIGFyZSBiZWluZyByZWRlZW1lZCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmFwcGxpZWRWb3VjaGVyKSB7XG4gICAgICB0aGlzLnJlbW92ZVJlZGVtcHRpb25Db3Vwb24oKTtcbiAgICB9XG4gICAgdGhpcy5hcHBsaWVkVm91Y2hlciA9IHZvdWNoZXI7XG4gICAgdGhpcy5zZWxlY3RlZFZvdWNoZXJJZCA9IHZvdWNoZXIuY291cG9uSWQ7XG4gICAgdGhpcy5zZWxlY3RlZFZvdWNoZXJDb2RlID0gdm91Y2hlci52b3VjaGVyQ29kZTtcbiAgICB0aGlzLnNlbGVjdGVkVm91Y2hlclBlcmNlbnRhZ2UgPSB2b3VjaGVyLmNvdXBvblZhbHVlXG5cbiAgICBsZXQgdG90YWwgPSBOdW1iZXIodGhpcy5yZXNwb25zZURhdGE/LnRvdGFsQW1vdW50KSB8fCAwO1xuICAgIGxldCBwZXJjZW50YWdlID0gTnVtYmVyKHRoaXMuc2VsZWN0ZWRWb3VjaGVyUGVyY2VudGFnZSkgfHwgMDtcbiAgICBsZXQgYW10ID0gdG90YWwgKiAocGVyY2VudGFnZSAvIDEwMCk7XG5cbiAgICBpZiAodm91Y2hlci5jb3Vwb25WYWx1ZVR5cGUgPT09ICdQRVJDRU5UQUdFJykge1xuICAgICAgdGhpcy5jb3Vwb25WYWx1ZVR5cGUgPSBcIlBFUkNFTlRBR0VcIlxuICAgICAgaWYgKGFtdCA+IHZvdWNoZXIubWF4UmVkZWVtYWJsZUFtb3VudCkge1xuICAgICAgICB0aGlzLnBlcmNlbnRhZ2VSZWR1Y2VkID0gdm91Y2hlci5tYXhSZWRlZW1hYmxlQW1vdW50XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5wZXJjZW50YWdlUmVkdWNlZCA9IGFtdFxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuY291cG9uVmFsdWVUeXBlID0gXCJBTU9VTlRcIlxuICAgICAgdGhpcy5zZWxlY3RlZFZvdWNoZXJBbW91bnQgPSB2b3VjaGVyLmNvdXBvblZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VEaWFsb2dSZWYoKTtcbiAgICBTd2FsLmZpcmUoe1xuICAgICAgaWNvbjogXCJzdWNjZXNzXCIsXG4gICAgICB0aXRsZTogYFlvdSBzYXZlZCAke3RoaXMuc2VsZWN0ZWRWb3VjaGVyQW1vdW50ID8gJ+KCuScgOiAnJ30gJHt0aGlzLnNlbGVjdGVkVm91Y2hlckFtb3VudCA/IHRoaXMuc2VsZWN0ZWRWb3VjaGVyQW1vdW50IDogdGhpcy5zZWxlY3RlZFZvdWNoZXJQZXJjZW50YWdlfSAke3RoaXMuc2VsZWN0ZWRWb3VjaGVyQW1vdW50ID8gJycgOiAnJSd9IG9uIHRoaXMgcGF5bWVudGAsXG4gICAgICB0ZXh0OiBgQ291cG9uIGNvZGUgJHt0aGlzLnNlbGVjdGVkVm91Y2hlckNvZGV9IGhhcyBiZWVuIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5YCxcbiAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIllBWSFcIixcbiAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCIjMTExXCIsXG4gICAgfSkudGhlbigocmVzKSA9PiB7XG4gICAgICBpZiAocmVzLmlzQ29uZmlybWVkIHx8IHJlcy5pc0Rpc21pc3NlZCkge1xuICAgICAgICAvLyBwb3B1cCBjbG9zZWRcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmVtb3ZlUmVkZW1wdGlvbkNvdXBvbihldmVudD86IEV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuYXBwbGllZFZvdWNoZXIgPSBudWxsO1xuICAgIHRoaXMuc2VsZWN0ZWRWb3VjaGVySWQgPSBudWxsO1xuICAgIHRoaXMuc2VsZWN0ZWRWb3VjaGVyQ29kZSA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZFZvdWNoZXJBbW91bnQgPSBudWxsO1xuICB9XG5cbiAgc2VhcmNoSWZBcHBsaWNhYmxlKCkgeyB9XG4gIGNsb3NlRGlhbG9nUmVmKCkge1xuICAgIHRoaXMuY291cG9uRGlhbG9nUmVmPy5jbG9zZSgpO1xuICB9XG4gIGFwcGx5Q291cG9uKGNvdXBvbjogQ291cG9uKSB7XG5cbiAgICBpZiAoIWNvdXBvbi5hcHBsaWNhYmxlKVxuICAgICAgcmV0dXJuO1xuXG4gICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5jb3Vwb25Db2RlID0gY291cG9uLmNvdXBvbkNvZGU7XG4gICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5jb3Vwb25JZCA9IGNvdXBvbi5jb3Vwb25JZDtcbiAgICBjb25zdCByZXN0UmVzcG9uc2UgPSB0aGlzLnJlc3RTZXJ2aWNlLmFkZEl0ZW1Ub0RCKHRoaXMuY2FydEluZm8pLnRvUHJvbWlzZSgpO1xuICAgIHJlc3RSZXNwb25zZS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XG5cbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiY291cG9uSWRcIiwgY291cG9uLmNvdXBvbklkKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiY291cG9uQ29kZVwiLCBjb3Vwb24uY291cG9uQ29kZSk7XG4gICAgICB0aGlzLmNhbGN1bGF0ZUNhcnQocmVzcG9uc2UpO1xuXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdDb3Vwb24nLCBkZXRhaWw6ICdDb3Vwb24gQXBwbGllZCcgfSk7XG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50ID0gcmVzcG9uc2U/LmRhdGE/LmJpbGxkZXRhaWxzPy5kaXNjb3VudEFtb3VudCA/PyAwO1xuICAgICAgdGhpcy5jb3Vwb25EaWFsb2dSZWY/LmNsb3NlKCk7XG4gICAgfSlcbiAgfVxuICBjYWxjdWxhdGVDYXJ0KHJlc3BvbnNlOiBhbnkpIHtcbiAgICBjb25zdCBkZWxpdmVyeU9wdGlvbiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJkZWxpdmVyeU9wdGlvbnNcIikgPz8gXCJ7fVwiKTtcbiAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsR3Jvc3NWYWx1ZSA9IDA7XG4gICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheCA9IDA7XG4gICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbFRheEFmdGVyRGlzY291bnQgPSByZXNwb25zZT8uZGF0YT8uYmlsbGRldGFpbHM/LnRvdGFsVGF4QWZ0ZXJEaXNjb3VudCA/PyAwO1xuICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzID0gMDtcbiAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgPSAwO1xuICAgIHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMuZGlzY291bnRBbW91bnQgPSByZXNwb25zZT8uZGF0YT8uYmlsbGRldGFpbHM/LmRpc2NvdW50QW1vdW50ID8/IDA7XG4gICAgdGhpcy5jYXJ0SW5mby50b3RhbEFtb3VudCA9IDA7XG5cbiAgICBpZiAodGhpcy5VU0VSX0NBUlRfSVRFTVMpIHtcblxuICAgICAgdGhpcy5VU0VSX0NBUlRfSVRFTVMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgKz0gKGl0ZW0uZGlzY291bnRlZFByaWNlICogKGl0ZW0ucXVhbnRpdHkgPz8gMSkpO1xuICAgICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4ICs9IChpdGVtLnF1YW50aXR5ICogKGl0ZW0uaXRlbVRheCA/PyAwKSk7XG4gICAgICB9KVxuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgPSAoZGVsaXZlcnlPcHRpb24/Lm1pbk9yZGVyQW1vdW50ID4gdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbEdyb3NzVmFsdWUpID8gMCA6IChkZWxpdmVyeU9wdGlvbj8uZGVsaXZlcnlDaGFyZ2VzID8/IDApO1xuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy50b3RhbEdyb3NzVmFsdWUgPSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsTmV0VmFsdWUgKyB0aGlzLmdldFRheEFtb3VudCgpO1xuICAgICAgdGhpcy5jYXJ0SW5mby50b3RhbEFtb3VudCA9IHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHMudG90YWxHcm9zc1ZhbHVlICsgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgLSB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLmRpc2NvdW50QW1vdW50O1xuICAgICAgdGhpcy5jYXJ0SW5mby5vcmRlcmVkSXRlbXMgPSB0aGlzLlVTRVJfQ0FSVF9JVEVNUztcbiAgICB9XG4gICAgdGhpcy5yZXNwb25zZURhdGEgPSB0aGlzLmNhcnRJbmZvO1xuICB9XG5cbiAgZ2V0VGF4QW1vdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuICF0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzPy5jb3Vwb25JZCA/ICh0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLnRvdGFsVGF4ID8/IDApIDogKHRoaXMuY2FydEluZm8uYmlsbGRldGFpbHM/LnRvdGFsVGF4QWZ0ZXJEaXNjb3VudCA/PyAwKTtcbiAgfVxuXG4gIGdldCBnZXRBZGRyZXNzTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy51c2VyRGV0YWlscyA/IFsuLi50aGlzLnVzZXJEZXRhaWxzPy5hZGRyZXNzRGV0YWlsc0xpc3RdIDogW107XG4gIH1cbiAgZ2V0IGlzTW9iaWxlKCkge1xuICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCA8PSA0NzU7XG4gIH1cbiAgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEJVU0lORVNTX0NPTlNUQU5UUy5DVVJSRU5DWTtcbiAgfVxuXG4gIGNoYW5nZUFkZHJlc3MoKSB7XG4gICAgdGhpcy5tYXREaWFsb2cub3BlbihBZGRyZXNzTGlzdENvbXBvbmVudCwgeyBwYW5lbENsYXNzOiAnc2lkZXBhbmVsLWNsYXNzJywgZGF0YTogeyBhZGRyZXNzTGlzdDogdGhpcy5nZXRBZGRyZXNzTGlzdCB9IH0pLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy51c2VyRGV0YWlscyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXI7XG4gICAgICB0aGlzLmdldERlZmF1bHRBZGRyZXNzKCk7XG4gICAgfSlcbiAgfVxuXG4gIGFkZEFkZHJlc3MoKSB7XG4gICAgdGhpcy5tYXREaWFsb2cub3BlbihBZGRyZXNzQ29tcG9uZW50LCB7IHBhbmVsQ2xhc3M6IFsnc2lkZXBhbmVsLWNsYXNzJywgJ2FkZHJlc3MtY2xhc3MnXSwgZGF0YTogeyBhZGRyZXNzTGlzdDogdGhpcy5nZXRBZGRyZXNzTGlzdCwgJ2VkaXRJbmRleCc6IC0xIH0gfSkuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLnVzZXJEZXRhaWxzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCkgYXMgVXNlcjtcbiAgICAgIHRoaXMuZ2V0RGVmYXVsdEFkZHJlc3MoKTtcbiAgICB9KVxuICB9XG5cbiAgc2Nyb2xsKGU6IFdoZWVsRXZlbnQpIHtcbiAgICBjb25zdCBkID0gdGhpcy5kMi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGF0VG9wID0gZC5zY3JvbGxUb3AgPT09IDA7XG4gICAgY29uc3QgYXRCb3R0b20gPSBkLnNjcm9sbFRvcCA+PSBkLnNjcm9sbEhlaWdodCAtIGQuY2xpZW50SGVpZ2h0O1xuICAgIGlmICgoYXRUb3AgJiYgZS5kZWx0YVkgPCAwKSB8fCAoYXRCb3R0b20gJiYgZS5kZWx0YVkgPiAwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZC5zY3JvbGxUb3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkLnNjcm9sbFRvcCArIGUuZGVsdGFZICogMiwgZC5zY3JvbGxIZWlnaHQgLSBkLmNsaWVudEhlaWdodCkpO1xuICB9XG4gIHNlbGVjdGVkUmVkbXBhdGlvbkRhdGE6IGFueTtcbiAgc2VsZWN0U2NoZW1lKCkge1xuICAgIGxldCBkaWFsb2cgPSB0aGlzLm1hdERpYWxvZy5vcGVuKFNjaGVtZVNlbGVjdGlvbkNvbXBvbmVudCwge30pO1xuICAgIGRpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlZGVtcHRpb24gPSB0cnVlO1xuICAgICAgdGhpcy5zZWxlY3RlZFJlZG1wYXRpb25EYXRhID0gcmVzcG9uc2U7XG4gICAgfSk7XG4gIH1cbiAgc2NoZWR1bGVWaWRlb0NhbGwoaXRlbXM6IGFueSkge1xuICAgIHRoaXMubWF0RGlhbG9nLm9wZW4oU2NoZWR1bGVWaWRlb0NhbGxDb21wb25lbnQsIHsgcGFuZWxDbGFzczogJ3NpZGVwYW5lbC1jbGFzcycsIGRhdGE6IHsgZGF0YTogdGhpcy5kYXRhLCBvcmRlckl0ZW1zOiBpdGVtcyB9IH0pO1xuICB9XG4gIGdldEJ1dHRvbklkKGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhPy5hY3Rpb24/LmJ1dHRvbnNbaW5kZXhdPy5pZCA/PyBcIlwiO1xuICB9XG4gIGdldEJ1dHRvblN0eWxlKGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhPy5hY3Rpb24/LmJ1dHRvbnNbaW5kZXhdPy5zdHlsZXM7XG4gIH1cblxuICBjaGFuZ2VRdWFudGl0eShxdWFudGl0eTogYW55LCBpdGVtOiBPcmRlcmVkSXRlbXMpIHtcbiAgICB0aGlzLmFkZFRvQ2FydChpdGVtLCBxdWFudGl0eS50YXJnZXQudmFsdWUpO1xuICB9XG5cbiAgcmVtb3ZlVHJpYWxJdGVtKGl0ZW06IE9yZGVyZWRJdGVtcykge1xuICAgIHRoaXMudHJpYWxDYXJ0SXRlbSA9IHRoaXMudHJpYWxDYXJ0SXRlbT8uZmlsdGVyKChwcm9kdWN0OiBPcmRlcmVkSXRlbXMpID0+IGl0ZW0udmFyaWVudElkICE9IHByb2R1Y3QudmFyaWVudElkKSA/PyBbXTtcblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKVxuICAgIGlmICh1c2VyKSB7XG4gICAgICBsZXQgcmVxdWVzdDogc3luY0l0ZW1Ub1NlcnZlckRCUmVxdWVzdCA9IG5ldyBzeW5jSXRlbVRvU2VydmVyREJSZXF1ZXN0KHVzZXIudXNlcklkLCAnVFJJQUxfQ0FSVCcsIFtpdGVtXSlcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZGVsZXRlSXRlbUZyb21DYXJ0KHJlcXVlc3QpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnVHJpYWwgUHJvZHVjdCcsIGRldGFpbDogJ0RlbGV0ZWQgc3VjY2Vzc2Z1bGx5JyB9KTtcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlUHJvZHVjdEZyb21UcmlhbENhcnQoaXRlbS52YXJpZW50SWQpXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdUcmlhbCBQcm9kdWN0JywgZGV0YWlsOiAnRGVsZXRlZCBzdWNjZXNzZnVsbHknIH0pO1xuICAgIH1cbiAgfVxuXG4gIGJvb2tBcHBvaW50bWVudCgpIHtcbiAgICBjb25zdCB1c2VyOiBVc2VyIHwgbnVsbCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnTG9naW4nLCBkZXRhaWw6ICdQbGVhc2UgbG9naW4gd2l0aCBtb2JpbGUgbnVtYmVyIHRvIEJvb2snIH0pO1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbG9naW4nXSwgeyBxdWVyeVBhcmFtczogeyB0cnlBdEhvbWU6IHRydWUgfSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9ob21lLWFwcG9pbnRtZW50J10pXG4gIH1cbiAgc2hvd1JlZWRlbUVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIHZhaWxkQW1vdW50OiBudW1iZXIgPSAwXG4gIHJlZGVlbVNjaGVtZShzY2hlbWU6IGFueSwgYWN0aW9uOiBib29sZWFuKSB7XG4gICAgaWYgKCgodGhpcy5yZXNwb25zZURhdGE/LnRvdGFsQW1vdW50ID8/IDApIC0gKHRoaXMucmVzcG9uc2VEYXRhPy5iaWxsZGV0YWlscz8uZGlzY291bnRBbW91bnQgPz8gMCkpIDwgc2NoZW1lLmFtb3VudCkge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ1NjaGVtZSBSZWRlZW0nLCBkZXRhaWw6ICdDYXJ0IGFtb3VudCBzaG91bGQgYmUgbW9yZSB0aGF0IHJlZGVlbSBhbW91bnQnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVzdFNlcnZpY2UucmVkZWVtU2NoZW1lKHNjaGVtZSwgdGhpcy5jYXJ0SW5mby5jYXJ0SWQsIGFjdGlvbikuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jYXJ0SW5mby5iaWxsZGV0YWlscy5vcnJhU2NoZW1lUmVkZWVtZWRBbW91bnQgPSBzY2hlbWUuYW1vdW50XG4gICAgICB0aGlzLmNhcnRJbmZvLmJpbGxkZXRhaWxzLm9ycmFTY2hlbWVDb2RlID0gc2NoZW1lLkdQUElkXG4gICAgfSlcbiAgfVxuXG4gIGdldFVybCgpIHtcbiAgICByZXR1cm4gd2luZG93Py5sb2NhdGlvbj8ub3JpZ2luPy5pbmNsdWRlcygnY2FyYXRsYW5lJykgfHwgd2luZG93Py5sb2NhdGlvbj8ub3JpZ2luPy5pbmNsdWRlcygnb3JyYScpXG4gIH1cbiAgZ2V0IGZvbnRDb2xvcigpOiBzdHJpbmcge1xuICAgIGxldCBjb2xvciA9IHRoaXMuc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvcjtcbiAgICBpZiAoIWNvbG9yKSByZXR1cm4gJyMwMDAnO1xuXG4gICAgLy8gaWYgZ3JhZGllbnQsIGV4dHJhY3QgZmlyc3QgaGV4IGNvbG9yXG4gICAgY29uc3QgZ3JhZGllbnRNYXRjaCA9IGNvbG9yLm1hdGNoKC8jKFswLTlhLWZBLUZdezZ9KS8pO1xuICAgIGlmIChncmFkaWVudE1hdGNoKSB7XG4gICAgICBjb2xvciA9IGdyYWRpZW50TWF0Y2hbMF07XG4gICAgfVxuXG4gICAgY29sb3IgPSBjb2xvci5yZXBsYWNlKCcjJywgJycpO1xuXG4gICAgY29uc3QgciA9IHBhcnNlSW50KGNvbG9yLnN1YnN0cmluZygwLCAyKSwgMTYpO1xuICAgIGNvbnN0IGcgPSBwYXJzZUludChjb2xvci5zdWJzdHJpbmcoMiwgNCksIDE2KTtcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoY29sb3Iuc3Vic3RyaW5nKDQsIDYpLCAxNik7XG5cbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xuXG4gICAgcmV0dXJuIGJyaWdodG5lc3MgPiAxMjggPyAnIzAwMCcgOiAnI2ZmZic7XG4gIH1cbiAgZ2V0IGFjY2VudEJhY2tncm91bmQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiZyA9IHRoaXMuc3R5bGVzPy5iYWNrZ3JvdW5kO1xuXG4gICAgaWYgKCFiZykgcmV0dXJuICcnO1xuXG4gICAgaWYgKGJnLmFjY2VudEJhY2tncm91bmRUeXBlID09PSAnU29saWQnKSB7XG4gICAgICByZXR1cm4gYmcuYWNjZW50Q29sb3I7XG4gICAgfVxuXG4gICAgY29uc3QgYW5nbGUgPSB0aGlzLmdldEdyYWRpZW50RGlyZWN0aW9uKGJnLmdyYWRpZW50RGlyZWN0aW9uKTtcblxuICAgIHJldHVybiBhbmdsZVxuICAgICAgPyBgbGluZWFyLWdyYWRpZW50KCR7YW5nbGV9LCAke2JnLmFjY2VudENvbG9yfSwgJHtiZy5zZWNvbmRhcnlBY2NlbnRDb2xvcn0pYFxuICAgICAgOiBgbGluZWFyLWdyYWRpZW50KCR7YmcuYWNjZW50Q29sb3J9LCAke2JnLnNlY29uZGFyeUFjY2VudENvbG9yfSlgO1xuICB9XG4gIGdldEdyYWRpZW50RGlyZWN0aW9uKGRpcmVjdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSAnRE9XTic6XG4gICAgICAgIHJldHVybiAnJzsgLy8gZGVmYXVsdCB0b3Ag4oaSIGJvdHRvbSAobm8gYW5nbGUgbmVlZGVkKVxuXG4gICAgICBjYXNlICdSSUdIVCc6XG4gICAgICAgIHJldHVybiAnOTBkZWcnO1xuXG4gICAgICBjYXNlICdESUFHT05BTF9SSUdIVCc6XG4gICAgICAgIHJldHVybiAnNDVkZWcnO1xuXG4gICAgICBjYXNlICdESUFHT05BTF9MRUZUJzpcbiAgICAgICAgcmV0dXJuICcxMzVkZWcnO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7IC8vIGZhbGxiYWNrXG4gICAgfVxuICB9XG4gIGluY3JlYXNlUXR5KGl0ZW06IGFueSkge1xuICAgIGlmICghdGhpcy5lZGl0KSB7XG4gICAgICBpdGVtLnF1YW50aXR5Kys7XG4gICAgICB0aGlzLmFkZFRvQ2FydChpdGVtLCBpdGVtLnF1YW50aXR5KTtcbiAgICB9XG4gIH1cblxuICBkZWNyZWFzZVF0eShpdGVtOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuZWRpdCkge1xuICAgICAgaXRlbS5xdWFudGl0eS0tO1xuICAgICAgdGhpcy5hZGRUb0NhcnQoaXRlbSwgaXRlbS5xdWFudGl0eSk7XG4gICAgfVxuICB9XG5cbiAgcmVmZXJFYXJuRXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNQb2ludHNSZWRlZW1pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcmVkZW1wdGlvblBvaW50czogYW55XG4gIGNoZWNrQXBwSW5zdGFsbGVkKCkge1xuICAgIGxldCBidXNpbmVzc0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiSWRcIikgPz8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJidXNpbmVzc0lkXCIpXG4gICAgdGhpcy5yZXN0U2VydmljZS5jaGVja0FwcEluc3RhbGxlZChidXNpbmVzc0lkLCAnUmVmZXIgYW5kIEVhcm4nKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucmVmZXJFYXJuRXhpc3QgPSByZXMuZGF0YVxuICAgICAgICB0aGlzLmdldFJlZGVlbVBvaW50cygpXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHRvdGFsU2F2aW5nQW10OiBudW1iZXIgPSAwXG4gIHRvdGFsU2F2aW5nUG9pbnRzOiBudW1iZXIgPSAwXG4gIHBvaW50c0NvbnZlcnRlZDogbnVtYmVyID0gMFxuICB1c2VkUG9pbnRzOiBhbnlcbiAgZ2V0UmVkZWVtUG9pbnRzKCkge1xuICAgIGxldCBidXNpbmVzc0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiSWRcIikgPz8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJidXNpbmVzc0lkXCIpXG4gICAgY29uc3QgdXNlckRldGFpbHMgPSAodGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCkgYXMgVXNlcik7XG4gICAgbGV0IHVzZXJJZCA9IHVzZXJEZXRhaWxzPy51c2VySWRcbiAgICBsZXQgb3JkZXJWYWx1ZSA9IHRoaXMucmVzcG9uc2VEYXRhPy5iaWxsZGV0YWlscz8udG90YWxOZXRWYWx1ZVxuICAgIC8vIGxldCBidXNpbmVzc0lkID0gJzFmMTJkZjE2LTgxNTQtNmNlYS04NWM1LWZiNjE2YzQ3YWFmNCdcbiAgICAvLyBsZXQgdXNlcklkID0gJzI5ZDJiNDI0LTY4MGMtNDZiZC1iMThmLWI4NmIzNDZlYjFjZidcbiAgICAvLyBsZXQgb3JkZXJWYWx1ZSA9IHRoaXMucmVzcG9uc2VEYXRhPy5iaWxsZGV0YWlscz8udG90YWxOZXRWYWx1ZVxuXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRSZWRlZW1Qb2ludHMoYnVzaW5lc3NJZCwgdXNlcklkLCAnUFJPRFVDVF9QVVJDSEFTRScsIG9yZGVyVmFsdWUsIHRydWUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5yZWRlbXB0aW9uUG9pbnRzID0gcmVzXG4gICAgICAgIHRoaXMucG9pbnRzQ29udmVydGVkID0gcmVzLmF2YWlsYWJsZVBvaW50cyAvIHJlcy5wb2ludHNDb252ZXJ0ZWRSdXBlZXM7XG4gICAgICAgIHRoaXMudG90YWxTYXZpbmdBbXQgPSB0aGlzLmdldFJlbWFpbmluZ1J1cGVlc1xuICAgICAgICB0aGlzLnRvdGFsU2F2aW5nUG9pbnRzID0gdGhpcy5nZXRSZW1haW5pbmdQb2ludHNcbiAgICAgICAgdGhpcy51c2VkUG9pbnRzID0gdGhpcy5nZXRSZW1haW5pbmdSdXBlZXMgKiB0aGlzLnBvaW50c0NvbnZlcnRlZDtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG5cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25Qb2ludHNSZWRlZW1pbmdDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuYXBwbGllZFZvdWNoZXIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgIHN1bW1hcnk6ICdQb2ludHMgUmVkZWVtJyxcbiAgICAgICAgZGV0YWlsOiAnWW91IGNhbiBub3QgcmVkZWVtIHBvaW50cyB3aGVuIGEgY291cG9uIGlzIGFwcGxpZWQuIFBsZWFzZSByZW1vdmUgdGhlIGNvdXBvbiB0byByZWRlZW0gcG9pbnRzJ1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNQb2ludHNSZWRlZW1pbmcgPSAhdGhpcy5pc1BvaW50c1JlZGVlbWluZztcbiAgICB9XG4gIH1cblxuICAvLyBGb3IgcmVwZW1wdGlvblxuICBnZXQgZ2V0UmVtYWluaW5nUG9pbnRzKCkge1xuICAgIHJldHVybiB0aGlzPy5yZXNwb25zZURhdGE/LnRvdGFsQW1vdW50ID4gdGhpcz8ucmVkZW1wdGlvblBvaW50cy5wb2ludHNDb252ZXJ0ZWRSdXBlZXMgPyAwIDogKHRoaXM/LnJlZGVtcHRpb25Qb2ludHMuYXZhaWxhYmxlUG9pbnRzIC0gdGhpcz8ucmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCAqIHRoaXMucG9pbnRzQ29udmVydGVkKVxuICB9XG5cbiAgZ2V0IGdldFJlbWFpbmluZ1J1cGVlcygpIHtcbiAgICByZXR1cm4gdGhpcz8ucmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCA+IHRoaXM/LnJlZGVtcHRpb25Qb2ludHM/LnBvaW50c0NvbnZlcnRlZFJ1cGVlcyA/IHRoaXM/LnJlZGVtcHRpb25Qb2ludHM/LnBvaW50c0NvbnZlcnRlZFJ1cGVlcyA6IHRoaXM/LnJlc3BvbnNlRGF0YT8udG90YWxBbW91bnRcbiAgfVxuXG4gIHBheW1lbnRXaXRoQ29tcGxldGVQb2ludHMoKSB7XG4gICAgbGV0IGNhcnRJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0SWQnKVxuICAgIGxldCBwYXlsb2FkID0ge1xuICAgICAgcmV3YXJkVXNlZDogdGhpcz8uaXNQb2ludHNSZWRlZW1pbmcgPyBcIlJFV0FSRF9QT0lOVFNcIiA6IHRoaXM/LmFwcGxpZWRWb3VjaGVyID8gXCJWT1VDSEVSXCIgOiBudWxsLFxuICAgICAgcG9pbnRzVXNlZDogdGhpcz8uaXNQb2ludHNSZWRlZW1pbmcgPyB0aGlzLnVzZWRQb2ludHMgOiAwLFxuICAgICAgcG9pbnRzQ29udmVydGVkSU5SOiB0aGlzPy5pc1BvaW50c1JlZGVlbWluZyA/IHRoaXMudG90YWxTYXZpbmdBbXQgOiAwLFxuICAgICAgdm91Y2hlclZhbHVlOiB0aGlzLnNlbGVjdGVkVm91Y2hlckFtb3VudCA/IHRoaXMuc2VsZWN0ZWRWb3VjaGVyQW1vdW50IDogdGhpcy5wZXJjZW50YWdlUmVkdWNlZCA/IHRoaXMucGVyY2VudGFnZVJlZHVjZWQgOiAwLFxuICAgICAgdm91Y2hlcklkOiB0aGlzPy5hcHBsaWVkVm91Y2hlciA/IHRoaXMuc2VsZWN0ZWRWb3VjaGVySWQgOiBudWxsLFxuICAgICAgdm91Y2hlckNvZGU6IHRoaXM/LmFwcGxpZWRWb3VjaGVyID8gdGhpcy5zZWxlY3RlZFZvdWNoZXJDb2RlIDogJycsXG4gICAgfVxuICAgIHRoaXMucmVzdFNlcnZpY2UucGF5bWVudFdpdGhDb21wbGV0ZVBvaW50cyhjYXJ0SWQsIHBheWxvYWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJvcmRlcklkXCIpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcImNhcnRJZFwiKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJwYXltZW50Rm9yXCIpO1xuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmNsZWFyVXNlckNhcnQoKTtcbiAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICBpY29uOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICB0aXRsZTogXCJIdXJyYXlcIixcbiAgICAgICAgICB0ZXh0OiBcIk9yZGVyIHBsYWNlZCBzdWNjZXNzZnVsbHlcIixcbiAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogXCJTZWUgRGV0YWlsc1wiLFxuICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZVxuICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5pc0NvbmZpcm1lZCkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvcHJvZmlsZSddKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnT3JkZXIgRmFpbGVkJywgZGV0YWlsOiAnRmFpbGVkIHRvIHBsYWNlIG9yZGVyJyB9KTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICAvLyBnZXRDYXJ0UmVjb21tZW5kYXRpb25zKCkge1xuICAvLyAgIC8vIHRoaXMuYXBpTG9hZGluZyA9IHRydWU7XG4gIC8vICAgY29uc3QgYnVzaW5lc3NJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidXNpbmVzc0lkJyk7XG4gIC8vICAgY29uc3QgdXNlcklkID0gdGhpcy51c2VySWQ7XG4gIC8vICAgdGhpcy5yZXN0U2VydmljZS5nZXRQcm9kdWN0RGVzY3JpcHRpb25SZWNvbW1lbmRhdGlvbnMoYnVzaW5lc3NJZCwgdXNlcklkKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgLy8gICAgIHRoaXMucmVjb21tZWRlZERhdGEgPSByZXNwb25zZT8uZGF0YTtcbiAgLy8gICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlckNhcnQoKS50aGVuKChjYXJ0UmVzcG9uc2UpID0+IHtcbiAgLy8gICAgICAgY2FydFJlc3BvbnNlLm9uc3VjY2VzcyA9IChjYXJ0RGF0YTogYW55KSA9PiB7XG5cbiAgLy8gICAgICAgICAvLyB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZTtcbiAgLy8gICAgICAgICB0aGlzLlVTRVJfQ0FSVCA9IGNhcnREYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcbiAgLy8gICAgICAgICB0aGlzLnJlY29tbWVkZWREYXRhPy5mb3JFYWNoKChwcm9kdWN0OiBQcm9kdWN0KSA9PiB7XG4gIC8vICAgICAgICAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XG4gIC8vICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1JZCA9PSBwcm9kdWN0LnByb2R1Y3RJZCkge1xuICAvLyAgICAgICAgICAgICAgIGlmIChwcm9kdWN0Py5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xuICAvLyAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50ID0gcHJvZHVjdD8uaXRlbVZhcmlhbnQ/LlswXTtcbiAgLy8gICAgICAgICAgICAgICAgIGlmIChpdGVtVmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpIHtcbiAgLy8gICAgICAgICAgICAgICAgICAgcHJvZHVjdC5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQudmFyaWFudEltYWdlcyA/PyBbXTtcbiAgLy8gICAgICAgICAgICAgICAgICAgcHJvZHVjdC5wcmljZSA9IGl0ZW1WYXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XG4gIC8vICAgICAgICAgICAgICAgICAgIHByb2R1Y3QucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xuICAvLyAgICAgICAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgICAgICAgICBwcm9kdWN0LnF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcbiAgLy8gICAgICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgIH0pXG4gIC8vICAgICAgICAgfSlcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSwgKGVycikgPT4ge1xuICAvLyAgICAgICAvLyB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZTtcbiAgLy8gICAgIH0pXG4gIC8vICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJXaGlzaGxpc3QoKS50aGVuKCh3aXNobGlzdFJlc3BvbnNlKSA9PiB7XG4gIC8vICAgICAgIHdpc2hsaXN0UmVzcG9uc2Uub25zdWNjZXNzID0gKHdoaXNsaXN0RGF0YTogYW55KSA9PiB7XG4gIC8vICAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUID0gd2hpc2xpc3REYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcblxuICAvLyAgICAgICAgIHRoaXMucmVjb21tZWRlZERhdGE/LmZvckVhY2goKHByb2R1Y3Q6IGFueSkgPT4ge1xuICAvLyAgICAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcbiAgLy8gICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3QucHJvZHVjdElkKSB7XG4gIC8vICAgICAgICAgICAgICAgaWYgKHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XG4gIC8vICAgICAgICAgICAgICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgPSBwcm9kdWN0Py5pdGVtVmFyaWFudD8uWzBdO1xuICAvLyAgICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZCkge1xuICAvLyAgICAgICAgICAgICAgICAgICBwcm9kdWN0Lml0ZW1JbWFnZXMgPSBpdGVtVmFyaWVudD8udmFyaWFudEltYWdlcyA/PyBbXTtcbiAgLy8gICAgICAgICAgICAgICAgICAgcHJvZHVjdC5wcmljZSA9IGl0ZW1WYXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XG4gIC8vICAgICAgICAgICAgICAgICAgIHByb2R1Y3Qud2hpc2xpc3QgPSB0cnVlO1xuICAvLyAgICAgICAgICAgICAgICAgfVxuXG4gIC8vICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICAgICAgICAgIHByb2R1Y3Qud2hpc2xpc3QgPSB0cnVlO1xuICAvLyAgICAgICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgfSlcbiAgLy8gICAgICAgICB9KVxuICAvLyAgICAgICB9XG4gIC8vICAgICB9KVxuICAvLyAgIH0pXG4gIC8vIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nXCI+XG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCJcbiAgICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwiaXNNb2JpbGUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFcIj5cbiAgICA8c2VjdGlvbiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9MYXlvdXRdPVwic3R5bGVzPy5sYXlvdXRcIiBbaWRdPVwiZGF0YT8uaWRcIlxuICAgICAgW2F0dHIuY2xhc3NdPVwiaXNNb2JpbGUgPyAncHktNSBwb3NpdGlvbi1yZWxhdGl2ZScgOiAncG9zaXRpb24tcmVsYXRpdmUnXCIgc2ltcG9Ib3ZlclxuICAgICAgKGhvdmVyaW5nKT1cInNob3dFZGl0VGFicygkZXZlbnQpXCIgW2F0dHIuc3R5bGVdPVwiY3VzdG9tQ2xhc3NcIlxuICAgICAgW25nQ2xhc3NdPVwiIXJlc3BvbnNlRGF0YT8ub3JkZXJlZEl0ZW1zPy5sZW5ndGggPyAnbm8taXRlbXMnIDogJydcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgbS1hdXRvIG1iLTRcIlxuICAgICAgICBbc3R5bGUubWFyZ2luVG9wLnB4XT1cImlzTW9iaWxlID8gJyc6ICc1MCdcIiBbc3R5bGUud2lkdGguJV09XCJpc01vYmlsZSA/ICc5MCcgOiAnJ1wiXG4gICAgICAgICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5vcmRlcmVkSXRlbXM/Lmxlbmd0aCAmJiBjdXJyZW50VGFiID09PSAnQUREUkVTUydcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lbGluZVwiIChjbGljayk9XCJjdXJyZW50VGFiID0gJ0JBRydcIj5CYWc8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYXJcIj48L2Rpdj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lbGluZSBpc0FjdGl2ZVwiPkFkZHJlc3M8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYXJcIj48L2Rpdj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lbGluZVwiIHN0eWxlPVwiY3Vyc29yOiBhdXRvO1wiPlBheW1lbnQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0LXRhYi1wYXJlbnQgdy0xMDBcIiAqbmdJZj1cImN1cnJlbnRUYWIgPT0gJ0JBRycgJiYgZWNvbUNvbmZpZ3M/LmFwcG9pbnRtZW50Qm9va2luZ0VuYWJsZWRcIj5cbiAgICAgICAgPCEtLSAmJiBlY29tQ29uZmlncz8uYXBwb2ludG1lbnRCb29raW5nRW5hYmxlZFwiIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FydC10YWJzXCIgW2lkXT1cImRhdGE/LmlkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLWNhcnQtdGFiXCIgW25nQ2xhc3NdPVwieydzZWxlY3RlZC1jYXJ0LXRhYic6IGNhcnRUeXBlPT09J1NIT1BQSU5HJ31cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNhcnRUeXBlPSdTSE9QUElORydcIj5TaG9wcGluZyBDYXJ0ICh7e3Jlc3BvbnNlRGF0YT8ub3JkZXJlZEl0ZW1zPy5sZW5ndGggPz8gMH19KTwvZGl2PlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydzZWxlY3RlZC1jYXJ0LXRhYic6IGNhcnRUeXBlPT09J1RSSUFMJ31cIiAoY2xpY2spPVwiY2FydFR5cGU9J1RSSUFMJ1wiPlRyaWFsIENhcnRcbiAgICAgICAgICAgICh7e3RyaWFsQ2FydEl0ZW0/Lmxlbmd0aCA/PyAwfX0pPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FydC1wYXJlbnRcIiBbc3BhY2luZ0hvcml6b250YWxdPVwic3R5bGVzTGF5b3V0XCIgKm5nSWY9XCJjdXJyZW50VGFiID09PSAnQkFHJ1wiIFtpZF09XCJkYXRhPy5pZFwiXG4gICAgICAgIFtzaW1wb0FuaW1hdGlvbl09XCJzdHlsZXM/LmFuaW1hdGlvblwiPlxuICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJ0VHlwZSA9PT0gJ1NIT1BQSU5HJ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIihyZXNwb25zZURhdGE/Lm9yZGVyZWRJdGVtcz8ubGVuZ3RoIHx8IDApID4gMCA/IENBUlRQQUdFIDogRU1QVFlJVEVNXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcnRUeXBlID09PSAnVFJJQUwnXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiKHRyaWFsQ2FydEl0ZW0/Lmxlbmd0aCB8fCAwKSA+IDAgPyBDQVJUUEFHRSA6IEVNUFRZSVRFTVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjaGVja291dFBhZ2VcIlxuICAgICAgICAqbmdJZj1cIihyZXNwb25zZURhdGE/Lm9yZGVyZWRJdGVtcz8ubGVuZ3RoIHx8IDApID4gMCAmJiBjdXJyZW50VGFiID09PSAnQUREUkVTUydcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkNIRUNLT1VUUEFHRVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuXG5cbiAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBlZGl0fVwiICpuZ0lmPVwic2hvd0VkaXRvcnNcIj5cbiAgICAgICAgPHNpbXBvLWhvdmVyLWVsZW1lbnRzIFtkYXRhXT1cImRhdGFcIiBbaW5kZXhdPVwiaW5kZXhcIiBbZWRpdE9wdGlvbnNdPVwiZWRpdFwiXG4gICAgICAgICAgW2lzRWNvbW1lcmNlXT1cInRydWVcIj48L3NpbXBvLWhvdmVyLWVsZW1lbnRzPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd0RlbGV0ZVwiIFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZGVsZXRlfVwiPlxuICAgICAgICA8c2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiPjwvc2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQ+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvc2VjdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZGF0YVwiPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwiY2FydC13aW5kb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nLWxhcmdlIGxoLTIgbWItMyBoZWFkZXItc2VjXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPG1hdC1pY29uIChjbGljayk9XCJjbG9zZVdpbmRvdygpXCI+a2V5Ym9hcmRfYXJyb3dfbGVmdDwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4+WW91ciBDYXJ0PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNhdmluZ1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwib2ZmZXJzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJnYXA6IDVweDtcIj5cbiAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vaS5wb3N0aW1nLmNjL2h0WTU1c3FZL2Rpc2NvdW50LnBuZ1wiIGFsdD1cIlwiIGhlaWdodD1cIjIwXCIgd2lkdGg9XCIyMFwiPlxuICAgICAgICAgIDxzcGFuPkF2YWlsIE9mZmVycyAvIENvdXBvbnM8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic21hbGwtaXRlbXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiByZXNwb25zZURhdGE/Lm9yZGVyZWRJdGVtc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbC1pdGVtXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgc3R5bGU9XCJnYXA6IDVweDtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtMTAwXCIgc3R5bGU9XCJwYWRkaW5nOiAwcHg7IHdpZHRoOiBmaXQtY29udGVudDtcIj5cbiAgICAgICAgICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgb25lcnJvcj1cInRoaXMuc3JjPSdodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnJ1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNtYWxsLXByb2R1Y3QtaW1nXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiaXRlbS5pbWdVcmwgPz8gJ2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCIgYWx0PVwiXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvUHJvZHVjdERldGFpbHMoaXRlbSlcIj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbC1pdGVtLW5hbWUgdHJpbS10ZXh0XCI+e3sgaXRlbS5pdGVtTmFtZSB8IHRpdGxlY2FzZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hbGwtaXRlbS1xdWFudGl0eVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yXCI+LTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57e2l0ZW0ucXVhbnRpdHl9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvclwiPis8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hbGwtaXRlbS1wcmljZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS13aXRoLXRheFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+IHt7KGl0ZW0uc2VsbGluZ1ByaWNlKSB8IG51bWJlcjogJzEuMC0yJ319XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicHJpY2Utd2l0aC10YXhcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPSdjdXJyZW5jeSc+PC9zcGFuPiB7eyhpdGVtLnNlbGxpbmcpIHwgbnVtYmVyOiAnMS4wLTInfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm90dGVyLXNlY1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGVsaXZlcnktYWRkIGQtZmxleFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5ob21lPC9tYXQtaWNvbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkcmVzc1wiPlRldHN0aW5nPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGF5bWVudC1idG5cIiBbZGlzYWJsZWRdPVwiY2FydEluZm8uYWRkcmVzc0RldGFpbHNcIiAoY2xpY2spPVwicHJvY2VlZFRvQ2hlY2tvdXQoKVwiPiA8c3BhblxuICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDVweDtcIj5DbGljayB0byBQYXk8L3NwYW4+IDxzcGFuIFtpbm5lckh0bWxdPSdjdXJyZW5jeSc+PC9zcGFuPlxuICAgICAgICAgIHt7KHJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgPz8gMCkgfCBudW1iZXI6ICcxLjAtMid9fTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9zZWN0aW9uPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmd4LXNrZWxldG9uLWxvYWRlciAqbmdJZj1cImlzTG9hZGluZ1wiIGNvdW50PVwiMVwiIGFwcGVhcmFuY2U9XCJjaXJjbGVcIiBbdGhlbWVdPVwie1xuICB3aWR0aDogJzEwMCUnLFxuICBoZWlnaHQ6ICc0MHZoJyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnMTBweCcsXG4gICdwb3NpdGlvbic6ICdyZWxhdGl2ZScsXG4gICdyaWdodCc6ICc1cHgnXG59XCI+XG48L25neC1za2VsZXRvbi1sb2FkZXI+XG5cbjxuZy10ZW1wbGF0ZSAjQ291cG9uTGlzdD5cbiAgPHNlY3Rpb24gY2xhc3M9XCJjb3Vwb25zLWxpc3Rpbmctc2VjdGlvblwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24taGVhZGluZ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImJhY2stYnRuXCIgKGNsaWNrKT1cImNsb3NlRGlhbG9nUmVmKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2Fycm93X2xlZnQ8L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXRleHRcIj5BcHBseSBDb3Vwb248L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJjb3Vwb24tc2VhcmNoLXNlY1wiPlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJUeXBlIENvdXBvbiBDb2RlXCIgWyhuZ01vZGVsKV09XCJlbnRlcmVkQ291cG9uQ29kZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImFwcGx5LWJ0bi1zZWFyY2hcIiAoY2xpY2spPVwic2VhcmNoSWZBcHBsaWNhYmxlKClcIj5BcHBseTwvZGl2PlxuICAgIDwvZGl2PiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWxpc3RpbmdcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb3Vwb25MaXN0Lmxlbmd0aCA+IDA7IGVsc2Ugc2hvd0VtcHR5U2NyZWVuXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvdXBvbkRldGFpbHMgb2YgY291cG9uTGlzdDsgbGV0IGlkeCA9IGluZGV4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1kZXRhaWxzXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6ICFjb3Vwb25EZXRhaWxzLmFwcGxpY2FibGUgPyAnI0ZGRjJGNCcgOiAnI0VERkZGQSd9XCJcbiAgICAgICAgICAgICpuZ0lmPVwiY291cG9uRGV0YWlscz8uc3RhdHVzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsc19fY291cG9uLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1icmllZlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tYnJpZWZfX2xlZnQtc2VjXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLW5hbWVcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogIWNvdXBvbkRldGFpbHMuYXBwbGljYWJsZSA/ICcjREIxQTFBJyA6ICcjMDk3RDVGJ31cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY291cG9uRGV0YWlscy5jb3Vwb25Db2RlIHwgdXBwZXJjYXNlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWRlc2NcIj57eyBjb3Vwb25EZXRhaWxzLmRpc2NvdW50RGVzY3JpcHRpb24gfCB0aXRsZWNhc2UgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWJyaWVmX19yaWdodC1zZWNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHBseS1vZmZlci1idG5cIiBbc3R5bGUub3BhY2l0eV09XCJjb3Vwb25EZXRhaWxzLmFwcGxpY2FibGUgPyAnMScgOiAnMC4zJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnY3Vyc29yJzogY291cG9uRGV0YWlscy5hcHBsaWNhYmxlID8gJ3BvaW50ZXInIDogJyd9XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5Q291cG9uKGNvdXBvbkRldGFpbHMpXCI+QXBwbHk8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNvdXBvbi10b2dnbGUtZGV0YWlscy1idG5cIiAoY2xpY2spPVwiY291cG9uRGV0YWlscy5zdGF0dXMgPSAhY291cG9uRGV0YWlscy5zdGF0dXNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtZGV0YWlscy1idG5cIiAqbmdJZj1cImNvdXBvbkRldGFpbHMuc3RhdHVzXCI+SGlkZSBkZXRhaWxzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaG93LWRldGFpbHMtYnRuXCIgKm5nSWY9XCIhY291cG9uRGV0YWlscy5zdGF0dXNcIj5WaWV3IGRldGFpbHM8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8IS0tICpuZ0lmPVwiY291cG9uRGV0YWlscy5zdGF0dXNcIiAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkZXRhaWxzX19jb3Vwb24tdGVybXNcIj5cbiAgICAgICAgICAgICAgICA8bGk+T2ZmZXIgdmFsaWQgZnJvbSB7eyBjb3Vwb25EZXRhaWxzLnZhbGlkRnJvbSB8IGRhdGUgfX0gLSB7eyBjb3Vwb25EZXRhaWxzLnZhbGlkVG8gfCBkYXRlIH19PC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNzaG93RW1wdHlTY3JlZW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zY3JlZW4tY29udGFpbmVyXCI+XG4gICAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIHNyYz1cIi4uLy4uLy4uLy4uLy4uL2Fzc2V0cy9jb21tb24vY291cG9uLWVtcHR5LWltZy5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc2NyZWVuX19wcmltYXJ5LXRleHRcIj5ObyBDb3Vwb24gQXZhaWxhYmxlPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXNjcmVlbl9fc2Vjb25kYXJ5LXRleHRcIj5cbiAgICAgICAgICAgIExvb2tzIGxpa2UgdGhlcmUgYXJlIG5vIGNvdXBvbnMgYXQgdGhlIG1vbWVudFxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImVtcHR5LXNjcmVlbl9fYnV0dG9uXCI+RXhwbG9yZTwvZGl2PiAtLT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICA8L3NlY3Rpb24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI1JlZGVtcHRpb25Wb3VjaGVycz5cbiAgPHNlY3Rpb24gY2xhc3M9XCJ2b3VjaGVycy1saXN0aW5nLXNlY3Rpb24gZC1mbGV4IGZsZXgtY29sdW1uXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvdXBvbi1oZWFkaW5nIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgcC0zIGZzLTE4IGZ3LTYwMCBib3JkZXItYm90dG9tXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYmFjay1idG4gY3Vyc29yLXBvaW50ZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIChjbGljayk9XCJjbG9zZURpYWxvZ1JlZigpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9hcnJvd19sZWZ0PC9tYXQtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci10ZXh0XCI+Q291cG9ucyAmIFZvdWNoZXJzPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHRhYi1jb250YWluZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTIgcC0zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicmVkZW1wdGlvbi10eXBlIGZzLTE2IGZ3LTUwMCBjdXJzb3ItcG9pbnRlclwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlLXR5cGUnOiByZWRlbXB0aW9uVHlwZSA9PT0gJ0NPVVBPTlMnfVwiXG4gICAgICAgIChjbGljayk9XCJyZWRlbXB0aW9uVHlwZSA9ICdDT1VQT05TJ1wiPlxuICAgICAgICBDb3Vwb25zXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyZWRlbXB0aW9uLXR5cGUgZnMtMTYgZnctNTAwIGN1cnNvci1wb2ludGVyXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtdHlwZSc6IHJlZGVtcHRpb25UeXBlID09PSAnVk9VQ0hFUlMnfVwiXG4gICAgICAgIChjbGljayk9XCJyZWRlbXB0aW9uVHlwZSA9ICdWT1VDSEVSUydcIj5cbiAgICAgICAgVm91Y2hlcnNcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PiAtLT5cblxuICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tbGlzdGluZyBkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTMgcHQtM1wiICpuZ0lmPVwicmVkZW1wdGlvblR5cGUgPT09ICdDT1VQT05TJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgdGFiLWNvbnRhaW5lciBnYXAtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLXR5cGUgZnMtMTYgZnctNTAwIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZS1jb3Vwb24nOiByZWRlbXB0aW9uQ291cG9uVHlwZSA9PT0gJ1JFV0FSRFMnfVwiIChjbGljayk9XCJyZWRlbXB0aW9uQ291cG9uVHlwZSA9ICdSRVdBUkRTJ1wiPlxuICAgICAgICAgIFJld2FyZHNcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tdHlwZSBmcy0xNiBmdy01MDAgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWNvdXBvbic6IHJlZGVtcHRpb25Db3Vwb25UeXBlID09PSAnRElTQ09VTlRTJ31cIlxuICAgICAgICAgIChjbGljayk9XCJyZWRlbXB0aW9uQ291cG9uVHlwZSA9ICdESVNDT1VOVFMnXCI+XG4gICAgICAgICAgRGlzY291bnRzXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVkZW1wdGlvbkNvdXBvblR5cGUgPT09ICdSRVdBUkRTJ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGxpc3RSZWRlbXB0aW9uQ291cG9ucz8udm91Y2hlcnM/Lmxlbmd0aCA+IDApIDsgZWxzZSBzaG93RW1wdHlTY3JlZW5cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2b3VjaGVyIG9mIGxpc3RSZWRlbXB0aW9uQ291cG9ucz8udm91Y2hlcnM7IGxldCBpZHggPSBpbmRleFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvdWNoZXItZGV0YWlsc1wiICpuZ0lmPVwiIXZvdWNoZXIudXRpbGlzZWRcIj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWJyaWVmIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1icmllZl9fbGVmdC1zZWNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tbmFtZSBmcy0xNiBmdy02MDAgbWItMVwiPnt7IHZvdWNoZXIudm91Y2hlck5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tZGVzYyBmcy0xMiB0ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgICAgICBHZXQge3sgdm91Y2hlci5jb3Vwb25WYWx1ZVR5cGUgPT09ICdGSVhFRCcgPyAn4oK5JyArIHZvdWNoZXIuY291cG9uVmFsdWUgOiB2b3VjaGVyLmNvdXBvblZhbHVlICsgJyUnXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIG9mZiBvbiB5b3VyIHBheW1lbnRcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tYnJpZWZfX3JpZ2h0LXNlY1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcGx5LW9mZmVyLWJ0biBmcy0xMiBmdy02MDAgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYXBwbHlSZWRlbXB0aW9uQ291cG9uKHZvdWNoZXIpXCI+XG4gICAgICAgICAgICAgICAgICAgIEFwcGx5PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tY29kZS1ib3ggZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2RlLWxhYmVsXCI+Q29kZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2RlLXZhbHVlXCI+e3sgdm91Y2hlci52b3VjaGVyQ29kZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLW1ldGEgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBmcy0xMiB0ZXh0LXNlY29uZGFyeSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW4tb3JkZXJcIj5NaW46IOKCuXt7IHZvdWNoZXIubWluT3JkZXJWYWx1ZSB8IG51bWJlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlcGFyYXRvciB0ZXh0LXNlY29uZGFyeVwiPnw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWxpZGl0eVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY2xvY2staWNvblwiPnNjaGVkdWxlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIFVudGlsIHt7IHZvdWNoZXIuaXNzdWVkRGF0ZSB8IGRhdGU6ICdNTU0gZGQsIHl5eXknIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VwYXJhdG9yIHRleHQtc2Vjb25kYXJ5XCIgKm5nSWY9XCJ2b3VjaGVyLm1heFJlZGVlbWFibGVBbW91bnRcIj58PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluLW9yZGVyXCIgKm5nSWY9XCJ2b3VjaGVyLm1heFJlZGVlbWFibGVBbW91bnRcIj5NYXggUmVkZWVtYWJsZSBBbW91bnQ6IOKCuXt7XG4gICAgICAgICAgICAgICAgICB2b3VjaGVyLm1heFJlZGVlbWFibGVBbW91bnQgfCBudW1iZXIgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInRlcm1zLWxpbmtcIj5WaWV3IHRlcm1zICYgY29uZGl0aW9uczwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVkZW1wdGlvbkNvdXBvblR5cGUgPT09ICdESVNDT1VOVFMnXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoY291cG9uTGlzdC5sZW5ndGggPiAwKTsgZWxzZSBzaG93RW1wdHlEaXNjb3VudHNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb3Vwb25EZXRhaWxzIG9mIGNvdXBvbkxpc3Q7IGxldCBpZHggPSBpbmRleFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvdWNoZXItZGV0YWlsc1wiICpuZ0lmPVwiY291cG9uRGV0YWlscz8uc3RhdHVzXCI+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1icmllZiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtc3RhcnQgbWItM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tYnJpZWZfX2xlZnQtc2VjXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLW5hbWUgZnMtMTYgZnctNjAwIG1iLTFcIlxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2NvbG9yJzogIWNvdXBvbkRldGFpbHMuYXBwbGljYWJsZSA/ICcjREIxQTFBJyA6ICcjMDk3RDVGJ31cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY291cG9uRGV0YWlscy5jb3Vwb25Db2RlIHwgdXBwZXJjYXNlIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tZGVzYyBmcy0xMiB0ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjb3Vwb25EZXRhaWxzLmRpc2NvdW50RGVzY3JpcHRpb24gfCB0aXRsZWNhc2UgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tYnJpZWZfX3JpZ2h0LXNlY1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcGx5LW9mZmVyLWJ0biBmcy0xMiBmdy02MDAgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUub3BhY2l0eV09XCJjb3Vwb25EZXRhaWxzLmFwcGxpY2FibGUgPyAnMScgOiAnMC4zJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnY3Vyc29yJzogY291cG9uRGV0YWlscy5hcHBsaWNhYmxlID8gJ3BvaW50ZXInIDogJ25vdC1hbGxvd2VkJ31cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlDb3Vwb24oY291cG9uRGV0YWlscylcIj5cbiAgICAgICAgICAgICAgICAgICAgQXBwbHlcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWNvZGUtYm94IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29kZS1sYWJlbFwiPkNvZGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29kZS12YWx1ZVwiPnt7IGNvdXBvbkRldGFpbHMuY291cG9uQ29kZSB8IHVwcGVyY2FzZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLW1ldGEgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBmcy0xMiB0ZXh0LXNlY29uZGFyeSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWxpZGl0eVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY2xvY2staWNvblwiPnNjaGVkdWxlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIHt7IGNvdXBvbkRldGFpbHMudmFsaWRGcm9tIHwgZGF0ZSB9fSAtIHt7IGNvdXBvbkRldGFpbHMudmFsaWRUbyB8IGRhdGUgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNzaG93RW1wdHlEaXNjb3VudHM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zY3JlZW4tY29udGFpbmVyXCI+XG4gICAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIHNyYz1cIi4uLy4uLy4uLy4uLy4uL2Fzc2V0cy9jb21tb24vY291cG9uLWVtcHR5LWltZy5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc2NyZWVuX19wcmltYXJ5LXRleHRcIj5ObyBEaXNjb3VudCBDb3Vwb25zIEF2YWlsYWJsZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zY3JlZW5fX3NlY29uZGFyeS10ZXh0XCI+XG4gICAgICAgICAgICBMb29rcyBsaWtlIHRoZXJlIGFyZSBubyBkaXNjb3VudCBjb3Vwb25zIGF0IHRoZSBtb21lbnRcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJlbXB0eS1zY3JlZW5fX2J1dHRvblwiPkV4cGxvcmU8L2Rpdj4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlICNzaG93RW1wdHlTY3JlZW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zY3JlZW4tY29udGFpbmVyXCI+XG4gICAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIHNyYz1cIi4uLy4uLy4uLy4uLy4uL2Fzc2V0cy9jb21tb24vY291cG9uLWVtcHR5LWltZy5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc2NyZWVuX19wcmltYXJ5LXRleHRcIj5ObyBDb3Vwb25zIEF2YWlsYWJsZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zY3JlZW5fX3NlY29uZGFyeS10ZXh0XCI+TG9va3MgbGlrZSB0aGVyZSBhcmUgbm8gY291cG9uczwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWxpc3RpbmcgZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0zXCIgKm5nSWY9XCJyZWRlbXB0aW9uVHlwZSA9PT0gJ1ZPVUNIRVJTJ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxpc3RSZWRlbXB0aW9uVm91Y2hlcnM/LnZvdWNoZXJzPy5sZW5ndGggPiAwOyBlbHNlIHNob3dFbXB0eVNjcmVlblwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2b3VjaGVyIG9mIGxpc3RSZWRlbXB0aW9uVm91Y2hlcnM/LnZvdWNoZXJzOyBsZXQgaWR4ID0gaW5kZXhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm91Y2hlci1kZXRhaWxzXCIgKm5nSWY9XCIhdm91Y2hlci51dGlsaXNlZFwiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWJyaWVmIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydCBtYi0zXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tYnJpZWZfX2xlZnQtc2VjXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1uYW1lIGZzLTE2IGZ3LTYwMCBtYi0xXCI+e3sgdm91Y2hlci52b3VjaGVyTmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vwb24tZGVzYyBmcy0xMiB0ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgICAgR2V0IHt7IHZvdWNoZXIuY291cG9uVmFsdWVUeXBlID09PSAnRklYRUQnID8gJ+KCuScgKyB2b3VjaGVyLmNvdXBvblZhbHVlIDogdm91Y2hlci5jb3Vwb25WYWx1ZSArICclJyB9fVxuICAgICAgICAgICAgICAgICAgb2ZmIG9uIHlvdXIgcGF5bWVudFxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1icmllZl9fcmlnaHQtc2VjXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcGx5LW9mZmVyLWJ0biBmcy0xMiBmdy02MDAgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYXBwbHlSZWRlbXB0aW9uQ291cG9uKHZvdWNoZXIpXCI+QXBwbHlcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1jb2RlLWJveCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2RlLWxhYmVsXCI+Q29kZTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29kZS12YWx1ZVwiPnt7IHZvdWNoZXIudm91Y2hlckNvZGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLW1ldGEgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBmcy0xMiB0ZXh0LXNlY29uZGFyeSBtYi0yXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluLW9yZGVyXCI+TWluOiDigrl7eyB2b3VjaGVyLm1pbk9yZGVyVmFsdWUgfCBudW1iZXIgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VwYXJhdG9yIHRleHQtc2Vjb25kYXJ5XCI+fDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWxpZGl0eVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNsb2NrLWljb25cIj5zY2hlZHVsZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgVW50aWwge3sgdm91Y2hlci5pc3N1ZWREYXRlIHwgZGF0ZTogJ01NTSBkZCwgeXl5eScgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInRlcm1zLWxpbmtcIj5WaWV3IHRlcm1zICYgY29uZGl0aW9uczwvZGl2PiAtLT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNzaG93RW1wdHlTY3JlZW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zY3JlZW4tY29udGFpbmVyXCI+XG4gICAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIHNyYz1cIi4uLy4uLy4uLy4uLy4uL2Fzc2V0cy9jb21tb24vY291cG9uLWVtcHR5LWltZy5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc2NyZWVuX19wcmltYXJ5LXRleHRcIj5ObyBWb3VjaGVycyBBdmFpbGFibGU8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc2NyZWVuX19zZWNvbmRhcnktdGV4dFwiPkxvb2tzIGxpa2UgdGhlcmUgYXJlIG5vIHZvdWNoZXJzPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9zZWN0aW9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNDQVJUUEFHRT5cbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJtYWluLWNvbnRlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0LWl0ZW1zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0LWhlYWRlclwiPlxuICAgICAgICAgIDxoMj5Zb3VyIENhcnQ8L2gyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiQ0FSVElURU07Y29udGV4dDp7ZGF0YTogY2FydFR5cGUgPT09ICdTSE9QUElORycgPyByZXNwb25zZURhdGE/Lm9yZGVyZWRJdGVtcyA6IHRyaWFsQ2FydEl0ZW19XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJzaWRlYmFyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicmVlZGVtLXNlY3Rpb24gZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlclwiICpuZ0lmPVwiY2FydFR5cGUgIT0gJ1RSSUFMJyAmJiBnZXRVcmwoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwianVzdGlmeS1jb250ZW50LWJldHdlZW4gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMCByZWRlZW0tc2VjdGlvbi10ZXh0XCI+UmVkZWVtIFNlY3Rpb24gQW1vdW50XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvb2dsZS1zd2l0Y2hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiB0eXBlPVwiY2hlY2tib3hcIiByb2xlPVwic3dpdGNoXCIgaWQ9XCJmbGV4U3dpdGNoQ2hlY2tDaGVja2VkXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RNYXR1cmVTY2hlbWVcIiAoY2hhbmdlKT1cIm9uVG9nZ2xlQ2hhbmdlKClcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwic2VsZWN0X21hdHVyZWRfdGV4dCAgdy0xMDAgdGV4dC1zdGFydCBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3RNYXR1cmVTY2hlbWUgJiYgIXNlbGVjdGVkUmVkZW1wdGlvblwiIChjbGljayk9XCJzZWxlY3RTY2hlbWUoKVwiPlxuICAgICAgICAgIFNlbGVjdCBNYXR1cmVkIFNjaGVtZVxuICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInNlbGVjdF9tYXR1cmVkX3RleHQgZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yIHctMTAwIHRleHQtc3RhcnQgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRSZWRlbXB0aW9uXCI+XG4gICAgICAgICAgU2VsZWN0ZWQgU2NoZW1lXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ3JvdXBfaW52ZXN0XCI+R3JvdXAgSW52ZXN0bWVudFxuICAgICAgICAgICAgc2NoZW1lLTUwMDAvTSA8c3Bhbj5DaGFuZ2U8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDAgcmVkZWVtX2Ftb3VudFwiPlJlZGVlbWFibGUgQW1vdW50XG4gICAgICAgICAgICA8c3Bhbj7igrl7e3NlbGVjdGVkUmVkbXBhdGlvbkRhdGEuc2VsZWN0ZWRBbW91bnR9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2NoZW1lLXNlY3Rpb25cIiAqbmdJZj1cInNlbGVjdE1hdHVyZVNjaGVtZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiU0NIRU1FX1JFREVNUFRJT05cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1zZWN0aW9uXCIgW2lkXT1cImRhdGE/LmlkXCIgKm5nSWY9XCJjYXJ0VHlwZSA9PT0gJ1NIT1BQSU5HJyAmJiAhcmVmZXJFYXJuRXhpc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1sZWZ0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXBvbi1pY29uXCI+PG1hdC1pY29uPnBlcmNlbnQ8L21hdC1pY29uPjwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291cG9uLXRleHRcIiAqbmdJZj1cIiFyZXNwb25zZURhdGEuYmlsbGRldGFpbHM/LmNvdXBvbklkXCI+QXBwbHlcbiAgICAgICAgICAgIENvdXBvbjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdXBvbi10ZXh0XCIgKm5nSWY9XCJyZXNwb25zZURhdGEuYmlsbGRldGFpbHM/LmNvdXBvbklkXCI+Q291cG9uXG4gICAgICAgICAgICBBcHBsaWVkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHN2ZyAqbmdJZj1cIiFyZXNwb25zZURhdGEuYmlsbGRldGFpbHM/LmNvdXBvbklkXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiXG4gICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBjbGFzcz1cImNoZXZyb24taWNvblwiIChjbGljayk9XCJvcGVuRGlhbG9nKENvdXBvbkxpc3QpXCI+XG4gICAgICAgICAgPHBhdGggZD1cIm05IDE4IDYtNi02LTZcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJyZXNwb25zZURhdGEuYmlsbGRldGFpbHM/LmNvdXBvbklkXCJcbiAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ291cG9uKCRldmVudClcIj48bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicHJvbW8tYmFubmVyIG1iLTNcIiBbaWRdPVwiZGF0YT8uaWRcIiAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnICYmIGVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9tby10ZXh0XCI+XG4gICAgICAgICAgPGgzPlNlZSBJdCBCZWZvcmUgWW91IEJ1eSBJdDwvaDM+XG4gICAgICAgICAgPHA+RXhwZXJpZW5jZSBvdXIgZGVzaWducyBpbiBkZXRhaWwgdmlhIHZpZGVvIGNhbGw8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VlLWxpdmUtYnRuXCIgKGNsaWNrKT1cInNjaGVkdWxlVmlkZW9DYWxsKHJlc3BvbnNlRGF0YT8ub3JkZXJlZEl0ZW1zKVwiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgIGNsYXNzPVwibHVjaWRlIGx1Y2lkZS12aWRlb1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIm0yMiA4LTYgNCA2IDRWOFpcIiAvPlxuICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjEyXCIgeD1cIjJcIiB5PVwiNlwiIHJ4PVwiMlwiIHJ5PVwiMlwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgU0VFIElUIExJVkVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInBsYW4tZGV0YWlscy1jb250YWluZXIgcC0zIHJvdW5kZWQtNCBiZy13aGl0ZSB0ZXh0LWRhcmsgdm91Y2hlci1kZXRhaWxzXCJcbiAgICAgICAgKm5nSWY9XCJyZWZlckVhcm5FeGlzdCAmJiB0aGlzPy5yZWRlbXB0aW9uUG9pbnRzPy5hdmFpbGFibGVQb2ludHMgPiAwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy0xNCBmdy01MDBcIj5cbiAgICAgICAgICBSZXdhcmRzIEF2YWlsYWJsZVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydCBib3JkZXItYm90dG9tIHBiLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZiX3B0cyBtdC0yIG1iLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtMTYgZnctNTAwIHRvdGFsX3BvaW50cyB0ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiBmcy0xOCBmdy02MDAgdGV4dC1kYXJrXCI+e3sodGhpcz8ucmVkZW1wdGlvblBvaW50cz8uYXZhaWxhYmxlUG9pbnRzIHx8IDApLnRvRml4ZWQoMil9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgcHRzXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG90YWxfdmFsdWUgZnMtMTIgdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgPSBtYXgg4oK5e3sodGhpcz8ucmVkZW1wdGlvblBvaW50cz8ucG9pbnRzQ29udmVydGVkUnVwZWVzIHx8IDApLnRvRml4ZWQoMil9fSBkaXNjb3VudFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndhbGx0ZV9pY29uXCI+XG4gICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvNzc3Nzc5YzE3NzUyMDA1NjExODd3YWxsZXRfKDEpLnBuZ1wiIGFsdD1cIlwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWRlbWFibGVfdGV4dFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlX3RleHRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTE0IGZ3LTUwMFwiPlxuICAgICAgICAgICAgICAgIFJlZGVlbSBQb2ludHNcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy0xMyBmcy00MDBcIj5cbiAgICAgICAgICAgICAgICBVc2UgeW91ciBwb2ludHMgZm9yIGRpc2NvdW50XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZV9idG5cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN3aXRjaFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ0b2dnbGVTd2l0Y2hcIiBbY2hlY2tlZF09XCJpc1BvaW50c1JlZGVlbWluZ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUG9pbnRzUmVkZWVtaW5nQ2hhbmdlKCRldmVudClcIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNsaWRlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMyBzdWNjZXNzX3NlbGVjdGVkIHctMTAwIGFwcGxpZWQtY291cG9uLWNhcmRcIiAqbmdJZj1cImlzUG9pbnRzUmVkZWVtaW5nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBnYXAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Y2Nlc3NfaWNvblwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1zdWNjZXNzXCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Y2Nlc3NfdGV4dFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtMTMgZnctNTAwXCI+XG4gICAgICAgICAgICAgICAgWW91J3JlIHNhdmluZyDigrlcbiAgICAgICAgICAgICAgICB7e3RvdGFsU2F2aW5nQW10IHx8IDB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTEyIGZzLTQwMCB0ZXh0LXN1Y2Nlc3NcIj5cbiAgICAgICAgICAgICAgICB7e3RvdGFsU2F2aW5nUG9pbnRzfX0gcG9pbnRzIHJlbWFpbmluZyBhZnRlciByZWRlbXB0aW9uXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRXhpc3RpbmcgY291cG9uIHJvdyAoa2VlcCBhcy1pcykgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLXNlY3Rpb24gZC1mbGV4IGZsZXgtY29sdW1uIHZvdWNoZXItZGV0YWlsc1wiIFtpZF09XCJkYXRhPy5pZFwiXG4gICAgICAgICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORycgJiYgcmVmZXJFYXJuRXhpc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cG9uLWxlZnRcIj5cbiAgICAgICAgICAgIEFwcGx5IENvdXBvblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImFkZFJlZGVtcHRpb25Db3Vwb24oUmVkZW1wdGlvblZvdWNoZXJzKVwiPlZpZXcgQWxsPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQXBwbGllZCBDb3Vwb24gU3VjY2VzcyBCYW5uZXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHBsaWVkLWNvdXBvbi1jYXJkIHctMTAwIG10LTMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFZvdWNoZXJJZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHBsaWVkLWNvdXBvbi1sZWZ0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInN1Y2Nlc3MtY2hlY2tcIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcGxpZWQtY291cG9uLWluZm9cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcGxpZWQtY291cG9uLWNvZGVcIj5Db3Vwb24ge3sgc2VsZWN0ZWRWb3VjaGVyQ29kZSB9fSBhcHBsaWVkITwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwbGllZC1jb3Vwb24tc2F2aW5nXCI+WW91J3JlIHNhdmluZ1xuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGhpcy5jb3Vwb25WYWx1ZVR5cGUgPT09ICdBTU9VTlQnXCI+4oK5IHt7c2VsZWN0ZWRWb3VjaGVyQW1vdW50IHx8IDB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRoaXMuY291cG9uVmFsdWVUeXBlID09PSAnUEVSQ0VOVEFHRSdcIj4ge3tzZWxlY3RlZFZvdWNoZXJQZXJjZW50YWdlIHx8IDB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVtb3ZlLWNvdXBvbi1idG4gZnMtMTQgZnctNTAwIHRleHQtc2Vjb25kYXJ5IGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVSZWRlbXB0aW9uQ291cG9uKCRldmVudClcIj5SZW1vdmU8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImRlbGl2ZXJ5LXNlY3Rpb25cIiAqbmdJZj1cImdldFVybCgpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1oZWFkZXJcIj5cbiAgICAgICAgICA8bWF0LWljb24+Z3BzX2ZpeGVkPC9tYXQtaWNvbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnXCI+RGVsaXZlcmluZyB0bzwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImNhcnRUeXBlID09PSAnVFJJQUwnXCI+VHJpYWwgTG9jYXRpb24gYXQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaW5jb2RlXCI+e3twaW5jb2RlfX08L3NwYW4+XG4gICAgICAgICAgPCEtLSA8YSBjbGFzcz1cImNoYW5nZS1saW5rXCI+Q2hhbmdlIFBpbmNvZGU8L2E+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXRpdGxlXCI+U3VtbWFyeTwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORydcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5TdWJ0b3RhbDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj7igrl7eyhyZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy50b3RhbE5ldFZhbHVlID8/IDApIHwgbnVtYmVyOiAnMS4wLTInfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORycgJiYgcmVmZXJFYXJuRXhpc3QgJiYgaXNQb2ludHNSZWRlZW1pbmdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5Qb2ludHMgUmVkZWVtZWQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+LSDigrl7eyB0b3RhbFNhdmluZ0FtdCB8fCAwIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIlxuICAgICAgICAgICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORycgJiYgcmVmZXJFYXJuRXhpc3QgJiYgKHRoaXMuY291cG9uVmFsdWVUeXBlID09PSAnQU1PVU5UJyAmJiBhcHBsaWVkVm91Y2hlcilcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5Wb3VjaGVyIEFwcGxpZWQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+LSDigrl7eyBzZWxlY3RlZFZvdWNoZXJBbW91bnQgfHwgMCB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCJcbiAgICAgICAgICAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnICYmIHJlZmVyRWFybkV4aXN0ICYmICh0aGlzLmNvdXBvblZhbHVlVHlwZSA9PT0gJ1BFUkNFTlRBR0UnICYmIGFwcGxpZWRWb3VjaGVyKVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlZvdWNoZXIgQXBwbGllZDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj4tIOKCuXt7IHBlcmNlbnRhZ2VSZWR1Y2VkIHx8IDAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORycgJiYgcmVzcG9uc2VEYXRhPy5iaWxsZGV0YWlscz8uZGlzY291bnRBbW91bnRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5EaXNjb3VudCBBbW91bnQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+XG4gICAgICAgICAgICB7eygn4oK5JyArIChyZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy5kaXNjb3VudEFtb3VudCB8IG51bWJlcjogJzEuMC0yJykpIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIiAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+U2hpcHBpbmc8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2F2aW5ncyc6ICFyZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy5kZWxpdmVyeUNoYXJnZXMgfHwgcmVzcG9uc2VEYXRhLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyA8PSAwfVwiPlxuICAgICAgICAgICAge3sgKHJlc3BvbnNlRGF0YT8uYmlsbGRldGFpbHM/LmRlbGl2ZXJ5Q2hhcmdlcyAmJiByZXNwb25zZURhdGEuYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzID4gMCkgPyAoJ+KCuScgK1xuICAgICAgICAgICAgKHJlc3BvbnNlRGF0YS5iaWxsZGV0YWlscy5kZWxpdmVyeUNoYXJnZXMgfCBudW1iZXI6ICcxLjAtMicpKSA6ICdGcmVlJyB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCIgKm5nSWY9XCJjYXJ0VHlwZSA9PT0gJ1NIT1BQSU5HJ1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPkVzdGltYXRlZCBUYXg8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+4oK5e3soKCFyZXNwb25zZURhdGEuYmlsbGRldGFpbHM/LmNvdXBvbklkID9cbiAgICAgICAgICAgIHJlc3BvbnNlRGF0YT8uYmlsbGRldGFpbHM/LnRvdGFsVGF4IDogcmVzcG9uc2VEYXRhPy5iaWxsZGV0YWlscz8udG90YWxUYXhBZnRlckRpc2NvdW50KSA/PyAwKSB8XG4gICAgICAgICAgICBudW1iZXI6ICcxLjAtMid9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93IHRvdGFsLXJvd1wiICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORydcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5Ub3RhbDwvc3Bhbj5cbiAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPuKCuXt7IHJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgfCBudW1iZXI6ICcxLjAtMicgfX08L3NwYW4+IC0tPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtdmFsdWVcIiAqbmdJZj1cIiFpc1BvaW50c1JlZGVlbWluZyAmJiAhYXBwbGllZFZvdWNoZXJcIj7igrl7eyByZXNwb25zZURhdGE/LnRvdGFsQW1vdW50IHxcbiAgICAgICAgICAgIG51bWJlcjogJzEuMC0yJyB9fTwvc3Bhbj5cblxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtdmFsdWVcIiAqbmdJZj1cImlzUG9pbnRzUmVkZWVtaW5nXCI+4oK5e3sgKHJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgLSAodG90YWxTYXZpbmdBbXQgfHwgMCkpIHxcbiAgICAgICAgICAgIG51bWJlcjogJzEuMC0yJyB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImFwcGxpZWRWb3VjaGVyICYmIHRoaXMuY291cG9uVmFsdWVUeXBlID09PSAnQU1PVU5UJ1wiPuKCuXt7KHJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgLVxuICAgICAgICAgICAgKHNlbGVjdGVkVm91Y2hlckFtb3VudCB8fCAwKSkgfCBudW1iZXI6XG4gICAgICAgICAgICAnMS4wLTInfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJhcHBsaWVkVm91Y2hlciAmJiB0aGlzLmNvdXBvblZhbHVlVHlwZSA9PT0gJ1BFUkNFTlRBR0UnXCI+4oK5e3socmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCAtXG4gICAgICAgICAgICAocGVyY2VudGFnZVJlZHVjZWQgfHwgMCkpIHwgbnVtYmVyOlxuICAgICAgICAgICAgJzEuMC0yJyB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUcmlhbCBDYXJ0IFN1bW1hcnkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJ0VHlwZSA9PT0gJ1RSSUFMJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+RnJlZSBUcmlhbDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPuKCuTA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5TZXJ2aWNlIENoYXJnZTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS12YWx1ZSBzYXZpbmdzXCI+RnJlZTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1kaXZpZGVyXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93IHRvdGFsLXJvd1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+VG90YWw8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj7igrkwPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJ0b3RhbC12YWx1ZVwiICpuZ0lmPVwiIWlzUG9pbnRzUmVkZWVtaW5nICYmICFhcHBsaWVkVm91Y2hlclwiPuKCuXt7IHJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgfFxuICAgICAgICAgICAgbnVtYmVyOiAnMS4wLTInIH19PC9zcGFuPlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC12YWx1ZVwiICpuZ0lmPVwiaXNQb2ludHNSZWRlZW1pbmdcIj7igrl7eyAocmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCAtICh0b3RhbFNhdmluZ0FtdCB8fCAwKSkgfFxuICAgICAgICAgICAgbnVtYmVyOiAnMS4wLTInIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYXBwbGllZFZvdWNoZXIgJiYgdGhpcy5jb3Vwb25WYWx1ZVR5cGUgPT09ICdBTU9VTlQnXCI+4oK5e3socmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCAtXG4gICAgICAgICAgICAoc2VsZWN0ZWRWb3VjaGVyQW1vdW50IHx8IDApKSB8IG51bWJlcjpcbiAgICAgICAgICAgICcxLjAtMid9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImFwcGxpZWRWb3VjaGVyICYmIHRoaXMuY291cG9uVmFsdWVUeXBlID09PSAnUEVSQ0VOVEFHRSdcIj7igrl7eyhyZXNwb25zZURhdGE/LnRvdGFsQW1vdW50IC1cbiAgICAgICAgICAgIChwZXJjZW50YWdlUmVkdWNlZCB8fCAwKSkgfCBudW1iZXI6XG4gICAgICAgICAgICAnMS4wLTInIH19PC9zcGFuPiAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJwbGFjZS1vcmRlci1idG5cIiAoY2xpY2spPVwiZWRpdCA/ICcnIDogcHJvY2VlZFRvTGlzdFBhZ2UoKVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlXG4gICAgICAgIFtidXR0b25TdHlsZV09XCJkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uc3R5bGVzXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcbiAgICAgICAgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiPnt7ZGF0YT8uYWN0aW9uPy5idXR0b25zPy5bMV0/LmNvbnRlbnQ/LmxhYmVsID8/ICdDb250aW51ZVxuICAgICAgICBTaG9wcGluZyd9fTwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInBsYWNlLW9yZGVyLWJ0biBtdC0wXCIgKGNsaWNrKT1cImVkaXQgPyAnJyA6IHByb2NlZWRUb0NoZWNrb3V0KClcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZVxuICAgICAgICAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnXCIgW2J1dHRvblN0eWxlXT1cImRhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdPy5zdHlsZXNcIlxuICAgICAgICBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXG4gICAgICAgIFtiYWNrZ3JvdW5kSW5mb109XCJzdHlsZXM/LmJhY2tncm91bmRcIj57e2RhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdPy5jb250ZW50Py5sYWJlbCA/PyAnQ2hlY2tvdXRcbiAgICAgICAgQ2FydCd9fTwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInBsYWNlLW9yZGVyLWJ0biBtdC0wXCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgKm5nSWY9XCJjYXJ0VHlwZSA9PT0gJ1RSSUFMJ1wiXG4gICAgICAgIFtidXR0b25TdHlsZV09XCJkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uc3R5bGVzXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBbYmFja2dyb3VuZEluZm9dPVwic3R5bGVzPy5iYWNrZ3JvdW5kXCIgKGNsaWNrKT1cImJvb2tBcHBvaW50bWVudCgpXCI+Qk9PS1xuICAgICAgICBBUFBPSU5UTUVOVDwvYnV0dG9uPlxuXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNvbW1lZGVkRGF0YT8ubGVuZ3RoXCI+XG4gICAgPHNpbXBvLWZlYXR1cmVkLXByb2R1Y3RzIFtlZGl0XT1cImZhbHNlXCIgW2RhdGFdPVwiZmVhdHVyZVByb2R1Y3REYXRhXCJcbiAgICAgIFtyZXNwb25zZURhdGFdPVwicmVjb21tZWRlZERhdGFcIj48L3NpbXBvLWZlYXR1cmVkLXByb2R1Y3RzPlxuICA8L25nLWNvbnRhaW5lcj4gLS0+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNDSEVDS09VVFBBR0U+XG4gIDxkaXYgY2xhc3M9XCJjaGVja291dC1sZWZ0LXBhbmVsXCI+XG4gICAgPGRpdiBjbGFzcz1cImNoZWNrb3V0LW1haW4tY29udGVudFwiPlxuICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZGVsaXZlcnktb3B0aW9uc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGVsaXZlcnktb3B0aW9uIGFjdGl2ZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1pY29uXCI+PC9kaXY+XG4gICAgICAgICAgSE9NRSBERUxJVkVSWVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRlbGl2ZXJ5LW9wdGlvblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1pY29uXCI+PC9kaXY+XG4gICAgICAgICAgU1RPUkUgUElDSy1VUFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5TaGlwcGluZyBBZGRyZXNzPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJzaGlwcGluZy1pbmZvXCIgKm5nSWY9XCJkZWZhdWx0QWRkcmVzc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkcmVzcy1pbmZvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFkZHJlc3MtbmFtZVwiPnt7ZGVmYXVsdEFkZHJlc3M/LnJlY2VpdmVyTmFtZX19ICh7e2RlZmF1bHRBZGRyZXNzPy5hZGRyZXNzVHlwZX19KTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGRyZXNzLWRldGFpbHNcIj57e2RlZmF1bHRBZGRyZXNzPy5hZGRyZXNzTGluZTF9fSwge3tkZWZhdWx0QWRkcmVzcz8uY2l0eU5hbWV9fSxcbiAgICAgICAgICAgIHt7ZGVmYXVsdEFkZHJlc3M/LnN0YXRlTmFtZX19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1udW1iZXJcIj5Nb2JpbGU6IHt7ZGVmYXVsdEFkZHJlc3M/LnJlY2VpdmVyUGhvbmV9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiYWRkTGlua3MgaC0xMDBcIiAqbmdJZj1cIiFkZWZhdWx0QWRkcmVzc1wiIChjbGljayk9XCJhZGRBZGRyZXNzKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNoYW5nZS1hZGRyZXNzLWJ0blwiIChjbGljayk9XCJjaGFuZ2VBZGRyZXNzKClcIiAqbmdJZj1cImRlZmF1bHRBZGRyZXNzXCI+Q0hBTkdFIE9SIEFERCBBRERSRVNTPC9idXR0b24+XG5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gdy0xMDAgbXQtMSBwYXltZW50LWJ0blwiIChjbGljayk9XCJwcm9jZWVkVG9QYXltZW50KClcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZVxuICAgICAgICAqbmdJZj1cImRlZmF1bHRBZGRyZXNzICYmICFwbGFjZU9yZGVyTG9hZGVyXCIgW2J1dHRvblN0eWxlXT1cImRhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdPy5zdHlsZXNcIlxuICAgICAgICBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXG4gICAgICAgIFtiYWNrZ3JvdW5kSW5mb109XCJzdHlsZXM/LmJhY2tncm91bmRcIj5cbiAgICAgICAgUGxhY2UgT3JkZXJcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biB3LTEwMCBtdC0xIHBheW1lbnQtYnRuXCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgKm5nSWY9XCJkZWZhdWx0QWRkcmVzcyAmJiBwbGFjZU9yZGVyTG9hZGVyXCJcbiAgICAgICAgW2J1dHRvblN0eWxlXT1cImRhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdPy5zdHlsZXNcIiBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIFtiYWNrZ3JvdW5kSW5mb109XCJzdHlsZXM/LmJhY2tncm91bmRcIj5cbiAgICAgICAgTG9hZGluZy4uLlxuICAgICAgPC9idXR0b24+XG5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNoZWNrb3V0LXJpZ2h0LXBhbmVsXCI+XG4gICAgPGRpdiBjbGFzcz1cIm9yZGVyLXN1bW1hcnlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXRpdGxlXCI+T3JkZXIgU3VtbWFyeTwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tvdXQtcHJvZHVjdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcmVzcG9uc2VEYXRhPy5vcmRlcmVkSXRlbXM7IGxldCBpZHggPSBpbmRleFwiPlxuICAgICAgICAgIDxpbWcgW3NyY109XCJpdGVtLmltZ1VybCA/PyAnaHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIiBjbGFzcz1cInByb2R1Y3QtaW1hZ2VcIlxuICAgICAgICAgICAgYWx0PVwiXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtZGV0YWlsc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtbmFtZVwiPnt7aXRlbS5pdGVtTmFtZX19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1xdWFudGl0eVwiPlF1YW50aXR5OiB7e2l0ZW0ucXVhbnRpdHl9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtcHJpY2VcIj7igrl7eyhpdGVtLnNlbGxpbmdQcmljZSAqIGl0ZW0ucXVhbnRpdHkpIHwgbnVtYmVyOiAnMS4wLTInfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2UtYnJlYWtkb3duXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS1yb3dcIj5cbiAgICAgICAgICA8c3Bhbj5Ub3RhbCBQcmljZTwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj7igrl7eyhyZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy50b3RhbE5ldFZhbHVlXG4gICAgICAgICAgICA/PyAwKSB8IG51bWJlcjogJzEuMC0yJ319PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlLXJvd1wiPlxuICAgICAgICAgIDxzcGFuPlRvdGFsIFRheDwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj7igrl7eygoIXJlc3BvbnNlRGF0YS5iaWxsZGV0YWlscz8uY291cG9uSWQgP1xuICAgICAgICAgICAgcmVzcG9uc2VEYXRhPy5iaWxsZGV0YWlscz8udG90YWxUYXggOiByZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy50b3RhbFRheEFmdGVyRGlzY291bnQpID8/IDApIHxcbiAgICAgICAgICAgIG51bWJlcjpcbiAgICAgICAgICAgICcxLjAtMid9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORycgJiYgY2FydEluZm8/LmJpbGxkZXRhaWxzPy5vcnJhU2NoZW1lUmVkZWVtZWRBbW91bnRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5SZWRlZW0gQW1vdW50PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPuKCuXt7KGNhcnRJbmZvPy5iaWxsZGV0YWlscz8ub3JyYVNjaGVtZVJlZGVlbWVkQW1vdW50ID8/IDApIHwgbnVtYmVyOlxuICAgICAgICAgICAgJzEuMC0yJ319PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJpY2Utcm93IGRpc2NvdW50XCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy5kaXNjb3VudEFtb3VudCAmJiAhaXNKZXdlbGxlcnlcIj5cbiAgICAgICAgICA8c3Bhbj5Db3Vwb24gRGlzY291bnQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+LSDigrl7e3Jlc3BvbnNlRGF0YT8uYmlsbGRldGFpbHM/LmRpc2NvdW50QW1vdW50XG4gICAgICAgICAgICB8IG51bWJlcjogJzEuMC0yJ319PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlLXJvd1wiXG4gICAgICAgICAgKm5nSWY9XCJyZXNwb25zZURhdGE/LmJpbGxkZXRhaWxzPy5kZWxpdmVyeUNoYXJnZXMgJiYgcmVzcG9uc2VEYXRhLmJpbGxkZXRhaWxzLmRlbGl2ZXJ5Q2hhcmdlcyA+IDBcIj5cbiAgICAgICAgICA8c3Bhbj5EZWxpdmVyeSBDaGFyZ2U8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3tyZXNwb25zZURhdGEuYmlsbGRldGFpbHMuZGVsaXZlcnlDaGFyZ2VzXG4gICAgICAgICAgICB8XG4gICAgICAgICAgICBudW1iZXI6ICcxLjAtMid9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS1yb3cgdG90YWxcIiAqbmdJZj1cImNhcnRUeXBlID09PSAnU0hPUFBJTkcnXCI+XG4gICAgICAgICAgPHNwYW4+VE9UQUwgQU1PVU5UPC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzUG9pbnRzUmVkZWVtaW5nICYmICFhcHBsaWVkVm91Y2hlclwiPuKCuXt7KHJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgPz8gMCkgfCBudW1iZXI6XG4gICAgICAgICAgICAnMS4wLTInfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1BvaW50c1JlZGVlbWluZ1wiPuKCuXt7KHJlc3BvbnNlRGF0YT8udG90YWxBbW91bnQgLSAodG90YWxTYXZpbmdBbXQgfHwgMCkpIHwgbnVtYmVyOlxuICAgICAgICAgICAgJzEuMC0yJ319PC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYXBwbGllZFZvdWNoZXIgJiYgdGhpcy5jb3Vwb25WYWx1ZVR5cGUgPT09ICdBTU9VTlQnXCI+4oK5e3socmVzcG9uc2VEYXRhPy50b3RhbEFtb3VudCAtXG4gICAgICAgICAgICAoc2VsZWN0ZWRWb3VjaGVyQW1vdW50IHx8IDApKSB8IG51bWJlcjpcbiAgICAgICAgICAgICcxLjAtMid9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImFwcGxpZWRWb3VjaGVyICYmIHRoaXMuY291cG9uVmFsdWVUeXBlID09PSAnUEVSQ0VOVEFHRSdcIj7igrl7eyhyZXNwb25zZURhdGE/LnRvdGFsQW1vdW50IC1cbiAgICAgICAgICAgIChyZXNwb25zZURhdGE/LnRvdGFsQW1vdW50ICogKHNlbGVjdGVkVm91Y2hlclBlcmNlbnRhZ2UgLyAxMDApIHx8IDApKSB8IG51bWJlcjpcbiAgICAgICAgICAgICcxLjAtMicgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI0NBUlRJVEVNIGxldC1wcm9kdWN0cz1cImRhdGFcIj5cbiAgPGRpdiBjbGFzcz1cImNhcnQtaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHByb2R1Y3RzXCIgW3N0eWxlLmNvbG9yXT1cImZvbnRDb2xvclwiPlxuICAgIDxkaXYgY2xhc3M9XCJpdGVtLWxlZnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWltYWdlXCI+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJpdGVtLWltZ1wiIFtzcmNdPVwiaXRlbS5pbWdVcmwgPz8gJ2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCIgYWx0PVwiXCJcbiAgICAgICAgICAoY2xpY2spPVwiZ29Ub1Byb2R1Y3REZXRhaWxzKGl0ZW0pXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWRldGFpbHNcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwiaXRlbS10aXRsZVwiPnt7aXRlbS5pdGVtTmFtZX19PC9oMz5cbiAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tc3VidGl0bGVcIiAqbmdJZj1cIml0ZW0uaXRlbVZhcmlhbnRcIj5cbiAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgdmFyaWVudCBvZiBnZXRLZXlzKGl0ZW0uaXRlbVZhcmlhbnQucHJvcGVydGllcyk7IGxldCBsYXN0ID0gbGFzdFwiPlxuICAgICAgICAgICAge3sgaXRlbS5pdGVtVmFyaWFudC5wcm9wZXJ0aWVzW3ZhcmllbnRdIHwgdGl0bGVjYXNlIH19PHNwYW4gKm5nSWY9XCIhbGFzdFwiPiwgPC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJpdGVtLXJpZ2h0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicXVhbnRpdHktY29udHJvbFwiICpuZ0lmPVwiY2FydFR5cGUgPT09ICdTSE9QUElORydcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInF0eS1idG4gcHgtMlwiIChjbGljayk9XCJkZWNyZWFzZVF0eShpdGVtKVwiIFtkaXNhYmxlZF09XCJpdGVtLnF1YW50aXR5ID09PSAxXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnJlbW92ZTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInF0eS12YWx1ZSBweC0zXCI+e3tpdGVtLnF1YW50aXR5fX08L3NwYW4+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJxdHktYnRuIHB4LTJcIiAoY2xpY2spPVwiaW5jcmVhc2VRdHkoaXRlbSlcIj5cbiAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tcHJpY2VcIj5cbiAgICAgICAg4oK5e3tpdGVtLnNlbGxpbmdQcmljZSB8IG51bWJlcjogJzEuMC0yJ319XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZS1idG4tY2lyY2xlXCIgKGNsaWNrKT1cInJlbW92ZUl0ZW0oaXRlbSlcIj5cbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgY2xhc3M9XCJsdWNpZGUgbHVjaWRlLXRyYXNoLTJcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTMgNmgxOFwiIC8+XG4gICAgICAgICAgPHBhdGggZD1cIk0xOSA2djE0YzAgMS0xIDItMiAySDdjLTEgMC0yLTEtMi0yVjZcIiAvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOCA2VjRjMC0xIDEtMiAyLTJoNGMxIDAgMiAxIDIgMnYyXCIgLz5cbiAgICAgICAgICA8bGluZSB4MT1cIjEwXCIgeDI9XCIxMFwiIHkxPVwiMTFcIiB5Mj1cIjE3XCIgLz5cbiAgICAgICAgICA8bGluZSB4MT1cIjE0XCIgeDI9XCIxNFwiIHkxPVwiMTFcIiB5Mj1cIjE3XCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI0VNUFRZSVRFTT5cbiAgPHNlY3Rpb24gY2xhc3M9XCJlbXB0eS1jYXJ0IHctMTAwIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1jYXJ0LWNvbnRhaW5lciBkLWZsZXggZmxleC1jb2x1bW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0LWltYWdlXCI+XG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCJcbiAgICAgICAgICBbc3JjXT1cImRhdGE/LmNvbnRlbnQ/LmltYWdlPy51cmxcIiBbYWx0XT1cImRhdGE/LmNvbnRlbnQ/LmltYWdlPy5hbHRUZXh0XCIgW2FwcEltYWdlRWRpdG9yXT1cImVkaXQgfHwgZmFsc2VcIlxuICAgICAgICAgIFtpbWFnZURhdGFdPVwiZGF0YT8uY29udGVudD8uaW1hZ2VcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0LXRleHQgY29udGVudC1zaWRlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRleHQgb2YgZGF0YT8uY29udGVudD8uaW5wdXRUZXh0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaGVhZGluZy1tZWRpdW0nOiB0ZXh0LmxhYmVsID09ICdIZWFkaW5nJywgJ2Rlc2NyaXB0aW9uJzogdGV4dC5sYWJlbCA9PSAnVGV4dCd9XCI+XG4gICAgICAgICAgICA8c2ltcG8tdGV4dC1lZGl0b3IgWyh2YWx1ZSldPVwidGV4dC52YWx1ZVwiIFtlZGl0YWJsZV09XCJlZGl0IHx8IGZhbHNlXCIgW2lzUlRFXT1cInRleHQuaXNSVEVcIj48L3NpbXBvLXRleHQtZWRpdG9yPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInBsYWNlLW9yZGVyLWJ0biBteC1hdXRvIHctZml0XCIgKGNsaWNrKT1cImVkaXQgPyAnJyA6IHByb2NlZWRUb0xpc3RQYWdlKClcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZVxuICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZGF0YT8uYWN0aW9uPy5idXR0b25zPy5bMV0/LnN0eWxlc1wiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcbiAgICAgICAgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiPnt7ZGF0YT8uYWN0aW9uPy5idXR0b25zPy5bMV0/LmNvbnRlbnQ/LmxhYmVsID8/ICdDb250aW51ZVxuICAgICAgICBTaG9wcGluZyd9fTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L3NlY3Rpb24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI1NDSEVNRV9SRURFTVBUSU9OPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgIDxkaXYgY2xhc3M9XCJzY2hlbWUtb3B0aW9uXCIgKm5nRm9yPVwibGV0IHNjaGVtZSBvZiBzY2hlbWVMaXN0XCIgKGNsaWNrKT1cInJlZGVlbVNjaGVtZShzY2hlbWUsIGZhbHNlKVwiXG4gICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiY2FydEluZm8uYmlsbGRldGFpbHMub3JyYVNjaGVtZUNvZGUgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmNvbG9yIDogJydcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJpbmRpdmlkdWFsXCIgY2xhc3M9XCJzY2hlbWUtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2NoZW1lLWluZm8gZC1mbGV4IGdhcC0xXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2stcmFkaW9cIj5cbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQtcmFkaW9cIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZmxleFJhZGlvRGVmYXVsdFwiIGlkPVwiZmxleFJhZGlvRGVmYXVsdDJcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjaGVtZS1uYW1lXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY2hlbWUtdGl0bGVcIj5JbmRpdmlkdWFsIEludmVzdG1lbnQgU2NoZW1lPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY2hlbWUtbW9udGhseVwiPuKCuTgwMDAvTTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2NoZW1lLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzY2hlbWUtaWRcIj5HUFAgSWQ6IHt7c2NoZW1lLkdQUElkfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJzY2hlbWUtbWF0dXJpdHlcIj5NYXR1cml0eSBEYXRlOiAxMiBBcHJpbCAyMDI0PC9zcGFuPiAtLT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjaGVtZS1hbW91bnRcIj7igrl7e3NjaGVtZS5hbW91bnR9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInJlZWRlbV9lcnJvciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cInNob3dSZWVkZW1FcnJvclwiPlxuICAgICAgUGxlYXNlIGFkZCBtb3JlIOKCuXt7dmFpbGRBbW91bnR9fSB0byByZWVkZW0gdGhpcyBzY2hlbWVcbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==