buildingproduct-library 0.2.7

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 (293) hide show
  1. package/README.md +24 -0
  2. package/assets/fonts/arial-webfont.woff +0 -0
  3. package/assets/fonts/arial-webfont.woff2 +0 -0
  4. package/assets/fonts/arialblack-webfont.woff +0 -0
  5. package/assets/fonts/arialblack-webfont.woff2 +0 -0
  6. package/assets/fonts/arialbold-webfont.woff +0 -0
  7. package/assets/fonts/arialbold-webfont.woff2 +0 -0
  8. package/assets/fonts/helveticaneue.woff +0 -0
  9. package/assets/fonts/helveticaneue.woff2 +0 -0
  10. package/assets/fonts/helveticaneuemedium-webfont.woff +0 -0
  11. package/assets/fonts/helveticaneuemedium-webfont.woff2 +0 -0
  12. package/assets/fonts/helveticaneuethin-webfont.woff +0 -0
  13. package/assets/fonts/helveticaneuethin-webfont.woff2 +0 -0
  14. package/assets/fonts/icomoon.ttf +0 -0
  15. package/assets/fonts/icomoon.woff +0 -0
  16. package/assets/images/ActivateIcon.svg +14 -0
  17. package/assets/images/AlertIcon.svg +3 -0
  18. package/assets/images/DisableIcon.svg +3 -0
  19. package/assets/images/Divider line.svg +3 -0
  20. package/assets/images/EditIconEnabled.svg +6 -0
  21. package/assets/images/EditIcondisabled.svg +6 -0
  22. package/assets/images/Grid-dark.svg +8 -0
  23. package/assets/images/Grid-light.svg +8 -0
  24. package/assets/images/Hamburger_icon_white.png +0 -0
  25. package/assets/images/Icon-awesome-user-alt-white.svg +13 -0
  26. package/assets/images/Icon-ionic-ios-arrow-down.svg +3 -0
  27. package/assets/images/Icon-ionic-ios-help-circle.svg +6 -0
  28. package/assets/images/Icon-ionic-ios-home.svg +6 -0
  29. package/assets/images/Icon-ionic-ios-settings.svg +6 -0
  30. package/assets/images/Icon-material-shopping-cart.svg +7 -0
  31. package/assets/images/Invited.svg +4 -0
  32. package/assets/images/List-dark.svg +3 -0
  33. package/assets/images/List-light.svg +3 -0
  34. package/assets/images/PDP-add-more.svg +3 -0
  35. package/assets/images/PDP-colour-selected.svg +7 -0
  36. package/assets/images/PDP-quote-exists.svg +12 -0
  37. package/assets/images/PDP-remove-icon.svg +3 -0
  38. package/assets/images/Selected icon.svg +3 -0
  39. package/assets/images/Selected-icon.svg +3 -0
  40. package/assets/images/banner-image.png +0 -0
  41. package/assets/images/br_down.png +0 -0
  42. package/assets/images/cart-shopping-fast.svg +6 -0
  43. package/assets/images/check-square.svg +3 -0
  44. package/assets/images/checkmark-circle-outline.svg +4 -0
  45. package/assets/images/closegrey.svg +71 -0
  46. package/assets/images/dashboard.svg +35 -0
  47. package/assets/images/delivery.svg +11 -0
  48. package/assets/images/download-icon.svg +7 -0
  49. package/assets/images/downloads-dark.svg +6 -0
  50. package/assets/images/downloads-light.svg +6 -0
  51. package/assets/images/erroricon.svg +3 -0
  52. package/assets/images/home-icon.svg +6 -0
  53. package/assets/images/home_banner.png +0 -0
  54. package/assets/images/ic_calender.svg +15 -0
  55. package/assets/images/icon-clock-icon.svg +10 -0
  56. package/assets/images/icon-feather-edit.svg +6 -0
  57. package/assets/images/icon-flashing-black.svg +3 -0
  58. package/assets/images/icon-flashing-white.svg +3 -0
  59. package/assets/images/icon-ionic-ios-search.svg +3 -0
  60. package/assets/images/icon-logout.svg +6 -0
  61. package/assets/images/icon-mail-icon.svg +7 -0
  62. package/assets/images/icon-metro-info.svg +3 -0
  63. package/assets/images/ionic-arrow-back.svg +3 -0
  64. package/assets/images/ionic-ios-feather-phone.svg +3 -0
  65. package/assets/images/ionic-ios-help-circle-outline.svg +6 -0
  66. package/assets/images/ionic-ios-location-outline.svg +3 -0
  67. package/assets/images/ionic-ios-my-location.svg +3 -0
  68. package/assets/images/ionic-ios-users-outline.svg +3 -0
  69. package/assets/images/ionic-trash.svg +3 -0
  70. package/assets/images/logo-black.svg +16 -0
  71. package/assets/images/logo-dark.svg +48 -0
  72. package/assets/images/logo.svg +16 -0
  73. package/assets/images/my-account.svg +21 -0
  74. package/assets/images/my-list.svg +43 -0
  75. package/assets/images/my-team.svg +17 -0
  76. package/assets/images/newsfeed-banner.jpg +0 -0
  77. package/assets/images/newtab.svg +11 -0
  78. package/assets/images/no-saved-cart.svg +3 -0
  79. package/assets/images/open-account-logout.png +0 -0
  80. package/assets/images/orders.svg +23 -0
  81. package/assets/images/pdf-icon.svg +45 -0
  82. package/assets/images/pdp-noimage.svg +21 -0
  83. package/assets/images/pickup.svg +8 -0
  84. package/assets/images/plp-grid-noimage.svg +22 -0
  85. package/assets/images/plp-list-noimage.svg +16 -0
  86. package/assets/images/product-banner.png +0 -0
  87. package/assets/images/product-details-dark.svg +10 -0
  88. package/assets/images/product-details-light.svg +10 -0
  89. package/assets/images/products.svg +34 -0
  90. package/assets/images/quotes.svg +12 -0
  91. package/assets/images/related-products-dark.svg +9 -0
  92. package/assets/images/related-products-light.svg +9 -0
  93. package/assets/images/search-noimage.svg +16 -0
  94. package/assets/images/see-more-bg-hover.svg +1 -0
  95. package/assets/images/see-more-bg.svg +1 -0
  96. package/assets/images/shopping-cart-icon.svg +14 -0
  97. package/assets/images/slash-small-white.svg +3 -0
  98. package/assets/images/warningicon.svg +3 -0
  99. package/assets/images/why-dimond.svg +7 -0
  100. package/buildingproduct-library-0.2.7.tgz +0 -0
  101. package/buildingproduct-library.d.ts +5 -0
  102. package/bundles/buildingproduct-library.umd.js +10979 -0
  103. package/bundles/buildingproduct-library.umd.js.map +1 -0
  104. package/esm2015/buildingproduct-library.js +5 -0
  105. package/esm2015/lib/account-dropdown/account-dropdown.component.js +159 -0
  106. package/esm2015/lib/account-dropdown/account-dropdown.module.js +59 -0
  107. package/esm2015/lib/account-dropdown/account-dropdown.service.js +55 -0
  108. package/esm2015/lib/checkout/add-new-address/add-new-address.component.js +442 -0
  109. package/esm2015/lib/checkout/checkout.module.js +149 -0
  110. package/esm2015/lib/checkout/custom-checkout/custom-checkout.component.js +348 -0
  111. package/esm2015/lib/checkout/order-confirmation/order-confirmation.component.js +37 -0
  112. package/esm2015/lib/checkout/order-review/delivery-information/delivery-information.component.js +32 -0
  113. package/esm2015/lib/checkout/order-review/order-review-grid/order-review-grid.component.js +162 -0
  114. package/esm2015/lib/checkout/order-review/order-review-list/order-review-list.component.js +151 -0
  115. package/esm2015/lib/checkout/order-review/order-review.component.js +123 -0
  116. package/esm2015/lib/constants/general.js +57 -0
  117. package/esm2015/lib/contact-us/contact-us.component.js +38 -0
  118. package/esm2015/lib/contact-us/contact-us.module.js +41 -0
  119. package/esm2015/lib/custom-cart/addto-saved-carts/addto-saved-carts.component.js +48 -0
  120. package/esm2015/lib/custom-cart/custom-cart.component.js +70 -0
  121. package/esm2015/lib/custom-cart/custom-cart.module.js +91 -0
  122. package/esm2015/lib/custom-header-logo/custom-header-logo.component.js +27 -0
  123. package/esm2015/lib/custom-header-logo/custom-header-logo.module.js +54 -0
  124. package/esm2015/lib/custom-header-paragraph/custom-header-paragraph.component.js +24 -0
  125. package/esm2015/lib/custom-header-paragraph/custom-header-paragraph.module.js +48 -0
  126. package/esm2015/lib/custom-mini-cart/custom-mini-cart.component.js +239 -0
  127. package/esm2015/lib/custom-mini-cart/custom-mini-cart.module.js +64 -0
  128. package/esm2015/lib/custom-navigation/custom-navigation.component.js +122 -0
  129. package/esm2015/lib/custom-navigation/custom-navigation.module.js +79 -0
  130. package/esm2015/lib/custom-order-details/custom-order-details.component.js +205 -0
  131. package/esm2015/lib/custom-order-details/custom-order-details.module.js +99 -0
  132. package/esm2015/lib/custom-order-details/download-popup/download-popup.component.js +34 -0
  133. package/esm2015/lib/custom-order-details/order-detail-grid/order-detail-grid.component.js +191 -0
  134. package/esm2015/lib/custom-order-details/order-detail-list/order-detail-list.component.js +169 -0
  135. package/esm2015/lib/custom-order-history/custom-order-history.component.js +680 -0
  136. package/esm2015/lib/custom-order-history/custom-order-history.module.js +105 -0
  137. package/esm2015/lib/custom-order-history/slider-progress/slider-progress.component.js +62 -0
  138. package/esm2015/lib/custom-saved-cart/custom-saved-cart-details/custom-save-cart-dtl/custom-save-cart-dtl.component.js +108 -0
  139. package/esm2015/lib/custom-saved-cart/custom-saved-cart-details/custom-saved-cart-details.module.js +125 -0
  140. package/esm2015/lib/custom-saved-cart/custom-saved-cart-details/saved-cart-details-action/saved-cart-details-action.component.js +91 -0
  141. package/esm2015/lib/custom-saved-cart/custom-saved-cart-details/saved-cart-details-overview/saved-cart-details-overview.component.js +56 -0
  142. package/esm2015/lib/custom-saved-cart/custom-saved-cart-details/saved-cart-details.service.js +51 -0
  143. package/esm2015/lib/custom-saved-cart/custom-saved-cart.component.js +114 -0
  144. package/esm2015/lib/custom-saved-cart/custom-saved-cart.module.js +89 -0
  145. package/esm2015/lib/custom-saved-cart/save-cart.service.js +67 -0
  146. package/esm2015/lib/custom-saved-cart/saved-cart-general.js +49 -0
  147. package/esm2015/lib/custom-saved-cart/saved-cart.service.js +48 -0
  148. package/esm2015/lib/custom-search/custom-search.component.js +132 -0
  149. package/esm2015/lib/custom-search/custom-search.module.js +46 -0
  150. package/esm2015/lib/custom-user-account/custom-user-account.component.js +92 -0
  151. package/esm2015/lib/custom-user-account/custom-user-account.module.js +63 -0
  152. package/esm2015/lib/directives/custom-directives.module.js +22 -0
  153. package/esm2015/lib/directives/custom-paginatior.directive.js +197 -0
  154. package/esm2015/lib/environments/environment.js +24 -0
  155. package/esm2015/lib/find-store/find-store.component.js +94 -0
  156. package/esm2015/lib/find-store/find-store.module.js +66 -0
  157. package/esm2015/lib/help-support/help-support.component.js +24 -0
  158. package/esm2015/lib/help-support/help-support.module.js +38 -0
  159. package/esm2015/lib/my-account/account-dashboard/account-dashboard.component.js +133 -0
  160. package/esm2015/lib/my-account/account-statements/account-statements.component.js +57 -0
  161. package/esm2015/lib/my-account/invoice-credit/invoice-credit.component.js +379 -0
  162. package/esm2015/lib/my-account/my-account.component.js +95 -0
  163. package/esm2015/lib/my-account/my-account.module.js +99 -0
  164. package/esm2015/lib/my-team/my-team.component.js +445 -0
  165. package/esm2015/lib/my-team/my-team.module.js +100 -0
  166. package/esm2015/lib/my-team/team-member.service.js +95 -0
  167. package/esm2015/lib/pipes/custom-date-pipe.pipe.js +26 -0
  168. package/esm2015/lib/services/account-dropdown-state.service.js +21 -0
  169. package/esm2015/lib/services/cart.service.js +70 -0
  170. package/esm2015/lib/services/checkout.service.js +69 -0
  171. package/esm2015/lib/services/endPointURL.js +192 -0
  172. package/esm2015/lib/services/find-store.service.js +50 -0
  173. package/esm2015/lib/services/logout.service.js +50 -0
  174. package/esm2015/lib/services/my-account.service.js +68 -0
  175. package/esm2015/lib/services/order-history.service.js +65 -0
  176. package/esm2015/lib/services/order.review.js +38 -0
  177. package/esm2015/lib/services/search.service.js +42 -0
  178. package/esm2015/lib/services/user-account-detail-service.service.js +207 -0
  179. package/esm2015/lib/shared/CustomProduct.js +48 -0
  180. package/esm2015/lib/shared/active-saved-cart/active-saved-cart.component.js +116 -0
  181. package/esm2015/lib/shared/custom-breadcrum/custom-breadcrum.component.js +102 -0
  182. package/esm2015/lib/shared/custom-cart-detail/custom-cart-detail.component.js +95 -0
  183. package/esm2015/lib/shared/custom-cart-detail/custom-cart-grid/custom-cart-grid.component.js +477 -0
  184. package/esm2015/lib/shared/custom-cart-detail/custom-cart-list/custom-cart-list.component.js +431 -0
  185. package/esm2015/lib/shared/custom-cart-detail/custom-product-quantity-form/custom-product-quantity-form.component.js +622 -0
  186. package/esm2015/lib/shared/custom-cart-detail/split.pipe.js +17 -0
  187. package/esm2015/lib/shared/date-range-picker/date-range-picker.component.js +173 -0
  188. package/esm2015/lib/shared/regEx.validator.js +17 -0
  189. package/esm2015/lib/shared/saved-cart-popup/saved-cart-popup.component.js +83 -0
  190. package/esm2015/lib/shared/shared-components.module.js +119 -0
  191. package/esm2015/lib/shared/shared-download-order/shared-download-order.component.js +220 -0
  192. package/esm2015/lib/spa-custom-header.component.js +26 -0
  193. package/esm2015/lib/spa-custom-header.module.js +145 -0
  194. package/esm2015/lib/spa-custom-header.service.js +14 -0
  195. package/esm2015/lib/utils/utils.js +27 -0
  196. package/esm2015/lib/utils.js +27 -0
  197. package/esm2015/public-api.js +35 -0
  198. package/fesm2015/buildingproduct-library.js +10197 -0
  199. package/fesm2015/buildingproduct-library.js.map +1 -0
  200. package/lib/account-dropdown/account-dropdown.component.d.ts +24 -0
  201. package/lib/account-dropdown/account-dropdown.module.d.ts +11 -0
  202. package/lib/account-dropdown/account-dropdown.service.d.ts +14 -0
  203. package/lib/checkout/add-new-address/add-new-address.component.d.ts +30 -0
  204. package/lib/checkout/checkout.module.d.ts +28 -0
  205. package/lib/checkout/custom-checkout/custom-checkout.component.d.ts +77 -0
  206. package/lib/checkout/order-confirmation/order-confirmation.component.d.ts +23 -0
  207. package/lib/checkout/order-review/delivery-information/delivery-information.component.d.ts +13 -0
  208. package/lib/checkout/order-review/order-review-grid/order-review-grid.component.d.ts +33 -0
  209. package/lib/checkout/order-review/order-review-list/order-review-list.component.d.ts +31 -0
  210. package/lib/checkout/order-review/order-review.component.d.ts +41 -0
  211. package/lib/constants/general.d.ts +50 -0
  212. package/lib/contact-us/contact-us.component.d.ts +13 -0
  213. package/lib/contact-us/contact-us.module.d.ts +9 -0
  214. package/lib/custom-cart/addto-saved-carts/addto-saved-carts.component.d.ts +18 -0
  215. package/lib/custom-cart/custom-cart.component.d.ts +22 -0
  216. package/lib/custom-cart/custom-cart.module.d.ts +15 -0
  217. package/lib/custom-header-logo/custom-header-logo.component.d.ts +11 -0
  218. package/lib/custom-header-logo/custom-header-logo.module.d.ts +11 -0
  219. package/lib/custom-header-paragraph/custom-header-paragraph.component.d.ts +11 -0
  220. package/lib/custom-header-paragraph/custom-header-paragraph.module.d.ts +10 -0
  221. package/lib/custom-mini-cart/custom-mini-cart.component.d.ts +62 -0
  222. package/lib/custom-mini-cart/custom-mini-cart.module.d.ts +13 -0
  223. package/lib/custom-navigation/custom-navigation.component.d.ts +37 -0
  224. package/lib/custom-navigation/custom-navigation.module.d.ts +21 -0
  225. package/lib/custom-order-details/custom-order-details.component.d.ts +63 -0
  226. package/lib/custom-order-details/custom-order-details.module.d.ts +19 -0
  227. package/lib/custom-order-details/download-popup/download-popup.component.d.ts +15 -0
  228. package/lib/custom-order-details/order-detail-grid/order-detail-grid.component.d.ts +40 -0
  229. package/lib/custom-order-details/order-detail-list/order-detail-list.component.d.ts +35 -0
  230. package/lib/custom-order-history/custom-order-history.component.d.ts +99 -0
  231. package/lib/custom-order-history/custom-order-history.module.d.ts +19 -0
  232. package/lib/custom-order-history/slider-progress/slider-progress.component.d.ts +15 -0
  233. package/lib/custom-saved-cart/custom-saved-cart-details/custom-save-cart-dtl/custom-save-cart-dtl.component.d.ts +33 -0
  234. package/lib/custom-saved-cart/custom-saved-cart-details/custom-saved-cart-details.module.d.ts +20 -0
  235. package/lib/custom-saved-cart/custom-saved-cart-details/saved-cart-details-action/saved-cart-details-action.component.d.ts +65 -0
  236. package/lib/custom-saved-cart/custom-saved-cart-details/saved-cart-details-overview/saved-cart-details-overview.component.d.ts +31 -0
  237. package/lib/custom-saved-cart/custom-saved-cart-details/saved-cart-details.service.d.ts +19 -0
  238. package/lib/custom-saved-cart/custom-saved-cart.component.d.ts +59 -0
  239. package/lib/custom-saved-cart/custom-saved-cart.module.d.ts +16 -0
  240. package/lib/custom-saved-cart/save-cart.service.d.ts +17 -0
  241. package/lib/custom-saved-cart/saved-cart-general.d.ts +88 -0
  242. package/lib/custom-saved-cart/saved-cart.service.d.ts +12 -0
  243. package/lib/custom-search/custom-search.component.d.ts +35 -0
  244. package/lib/custom-search/custom-search.module.d.ts +10 -0
  245. package/lib/custom-user-account/custom-user-account.component.d.ts +35 -0
  246. package/lib/custom-user-account/custom-user-account.module.d.ts +12 -0
  247. package/lib/directives/custom-directives.module.d.ts +8 -0
  248. package/lib/directives/custom-paginatior.directive.d.ts +29 -0
  249. package/lib/environments/environment.d.ts +12 -0
  250. package/lib/find-store/find-store.component.d.ts +34 -0
  251. package/lib/find-store/find-store.module.d.ts +12 -0
  252. package/lib/help-support/help-support.component.d.ts +11 -0
  253. package/lib/help-support/help-support.module.d.ts +9 -0
  254. package/lib/my-account/account-dashboard/account-dashboard.component.d.ts +34 -0
  255. package/lib/my-account/account-statements/account-statements.component.d.ts +24 -0
  256. package/lib/my-account/invoice-credit/invoice-credit.component.d.ts +66 -0
  257. package/lib/my-account/my-account.component.d.ts +26 -0
  258. package/lib/my-account/my-account.module.d.ts +20 -0
  259. package/lib/my-team/my-team.component.d.ts +103 -0
  260. package/lib/my-team/my-team.module.d.ts +18 -0
  261. package/lib/my-team/team-member.service.d.ts +17 -0
  262. package/lib/pipes/custom-date-pipe.pipe.d.ts +11 -0
  263. package/lib/services/account-dropdown-state.service.d.ts +10 -0
  264. package/lib/services/cart.service.d.ts +15 -0
  265. package/lib/services/checkout.service.d.ts +17 -0
  266. package/lib/services/endPointURL.d.ts +156 -0
  267. package/lib/services/find-store.service.d.ts +14 -0
  268. package/lib/services/logout.service.d.ts +11 -0
  269. package/lib/services/my-account.service.d.ts +16 -0
  270. package/lib/services/order-history.service.d.ts +14 -0
  271. package/lib/services/order.review.d.ts +11 -0
  272. package/lib/services/search.service.d.ts +11 -0
  273. package/lib/services/user-account-detail-service.service.d.ts +40 -0
  274. package/lib/shared/CustomProduct.d.ts +28 -0
  275. package/lib/shared/active-saved-cart/active-saved-cart.component.d.ts +58 -0
  276. package/lib/shared/custom-breadcrum/custom-breadcrum.component.d.ts +30 -0
  277. package/lib/shared/custom-cart-detail/custom-cart-detail.component.d.ts +32 -0
  278. package/lib/shared/custom-cart-detail/custom-cart-grid/custom-cart-grid.component.d.ts +81 -0
  279. package/lib/shared/custom-cart-detail/custom-cart-list/custom-cart-list.component.d.ts +72 -0
  280. package/lib/shared/custom-cart-detail/custom-product-quantity-form/custom-product-quantity-form.component.d.ts +100 -0
  281. package/lib/shared/custom-cart-detail/split.pipe.d.ts +7 -0
  282. package/lib/shared/date-range-picker/date-range-picker.component.d.ts +39 -0
  283. package/lib/shared/regEx.validator.d.ts +10 -0
  284. package/lib/shared/saved-cart-popup/saved-cart-popup.component.d.ts +37 -0
  285. package/lib/shared/shared-components.module.d.ts +26 -0
  286. package/lib/shared/shared-download-order/shared-download-order.component.d.ts +40 -0
  287. package/lib/spa-custom-header.component.d.ts +11 -0
  288. package/lib/spa-custom-header.module.d.ts +27 -0
  289. package/lib/spa-custom-header.service.d.ts +6 -0
  290. package/lib/utils/utils.d.ts +6 -0
  291. package/lib/utils.d.ts +5 -0
  292. package/package.json +92 -0
  293. package/public-api.d.ts +31 -0
@@ -0,0 +1,622 @@
1
+ import { __rest } from "tslib";
2
+ import { Component, ViewChild, Input, Output, EventEmitter, } from '@angular/core';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import { FormGroup } from '@angular/forms';
5
+ import { AccessoriesQuantity, ProductQuantity } from '../../CustomProduct';
6
+ import { RegexValidator, RegexConstants } from '../../regEx.validator';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/forms";
9
+ import * as i2 from "../../../services/cart.service";
10
+ import * as i3 from "@angular/router";
11
+ import * as i4 from "@spartacus/core";
12
+ import * as i5 from "@ng-bootstrap/ng-bootstrap";
13
+ import * as i6 from "@spartacus/storefront";
14
+ import * as i7 from "@angular/common";
15
+ export class CustomProductQuantityFormComponent {
16
+ constructor(formBuilder, cdr, cartService, router, productService, cmsService, modalService, activeCartService, currentProductService) {
17
+ this.formBuilder = formBuilder;
18
+ this.cdr = cdr;
19
+ this.cartService = cartService;
20
+ this.router = router;
21
+ this.productService = productService;
22
+ this.cmsService = cmsService;
23
+ this.modalService = modalService;
24
+ this.activeCartService = activeCartService;
25
+ this.currentProductService = currentProductService;
26
+ this.env = sessionStorage.getItem('env');
27
+ this.environment = JSON.parse(this.env);
28
+ this.isDesktop = true;
29
+ this.isMobile = false;
30
+ this.isTablet = false;
31
+ this.totalPrice = "0.0";
32
+ this.hasBundle = false;
33
+ this.unitType = "per LM";
34
+ this.accessoriesPrice = 0;
35
+ this.selectedColour = null;
36
+ this.isFinishedProduct = false;
37
+ this.isFlashingProduct = false;
38
+ this.listView = true;
39
+ this.productForm = new FormGroup({});
40
+ this.disableAddMore = false;
41
+ this.bundleList = [];
42
+ this.errorIndex = [];
43
+ this.hasProdRefIndex = [];
44
+ this.hasProdRef = false;
45
+ this.hasMinlengthError = [];
46
+ this.rowIndex = 0;
47
+ this.showWaitCursor = new BehaviorSubject(true);
48
+ this.addToCartError = null;
49
+ this.modalBundleForm = new FormGroup({});
50
+ this.editProdBundle = "";
51
+ this.editProdRef = "";
52
+ this.selectedIndex = null;
53
+ this.hasData = false;
54
+ this.product$ = this.currentProductService.getProduct();
55
+ this.updateCartEntires = new EventEmitter();
56
+ this.addMoreClicked = new EventEmitter();
57
+ }
58
+ ngOnInit() {
59
+ var _a;
60
+ const cartObj = localStorage.getItem("spartacus⚿dimond-spa⚿cart");
61
+ this.cartId = (_a = JSON.parse(cartObj)) === null || _a === void 0 ? void 0 : _a.active;
62
+ this.screenWidth = window.innerWidth + "px";
63
+ if (this.productDetails) {
64
+ this.createProductForm();
65
+ }
66
+ }
67
+ ngOnChanges(changes) {
68
+ var _a;
69
+ if (!((_a = changes === null || changes === void 0 ? void 0 : changes.productDetails) === null || _a === void 0 ? void 0 : _a.firstChange)) {
70
+ this.updateFormDetails();
71
+ this.cdr.detectChanges();
72
+ }
73
+ }
74
+ updateFormDetails() {
75
+ var _a, _b, _c, _d, _e;
76
+ if (this.isFinishedProduct) {
77
+ (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[0]) === null || _b === void 0 ? void 0 : _b.patchValue({
78
+ prodQty: (_c = this.productDetails) === null || _c === void 0 ? void 0 : _c.quantity,
79
+ });
80
+ }
81
+ else {
82
+ (_e = (_d = this.productDetails) === null || _d === void 0 ? void 0 : _d.subLineConfigInfos) === null || _e === void 0 ? void 0 : _e.forEach((val, index) => {
83
+ var _a, _b;
84
+ if (!this.isNullOrEmpty(val === null || val === void 0 ? void 0 : val.bundleName)) {
85
+ this.hasBundle = true;
86
+ (_b = (_a = this.productForm) === null || _a === void 0 ? void 0 : _a.get("bundling")) === null || _b === void 0 ? void 0 : _b.setValue(true);
87
+ }
88
+ this.productQuantityForm.controls[index].patchValue({
89
+ prodBundle: val === null || val === void 0 ? void 0 : val.bundleName,
90
+ prodLen: this.pad3Digits(val === null || val === void 0 ? void 0 : val.length),
91
+ prodQty: val === null || val === void 0 ? void 0 : val.quantity,
92
+ prodRef: val === null || val === void 0 ? void 0 : val.reference,
93
+ });
94
+ });
95
+ }
96
+ this.cdr.detectChanges();
97
+ }
98
+ // Create a Product Quantity Form
99
+ createProductForm() {
100
+ var _a, _b, _c, _d, _e;
101
+ this.accessoriesPrice = 0;
102
+ this.totalLength = null;
103
+ this.totalPrice = "0.0";
104
+ this.hasBundle = false;
105
+ this.disableAddMore = false;
106
+ this.bundleList = [];
107
+ this.errorIndex = [];
108
+ this.hasProdRefIndex = [];
109
+ this.rowIndex = 0;
110
+ this.productForm = new FormGroup({});
111
+ this.addToCartError = null;
112
+ this.productForm = this.formBuilder.group({
113
+ bundling: [""],
114
+ productQuantity: this.formBuilder.array([]),
115
+ jobReference: ["", [RegexValidator(RegexConstants.JOB_REFERENCE)]],
116
+ });
117
+ this.editProdBundle = "";
118
+ this.editProdRef = "";
119
+ this.selectedIndex = null;
120
+ this.hasProdRef = false;
121
+ this.hasMinlengthError = [];
122
+ if (this.isFinishedProduct) {
123
+ this.addProductQuantityFormGroup();
124
+ (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[0]) === null || _b === void 0 ? void 0 : _b.patchValue({
125
+ prodQty: (_c = this.productDetails) === null || _c === void 0 ? void 0 : _c.quantity,
126
+ });
127
+ }
128
+ else {
129
+ this.modalBundleForm = this.formBuilder.group({
130
+ modBundle: ["", [RegexValidator(RegexConstants.BUNDLE_NAME)]],
131
+ modRef: ["", [RegexValidator(RegexConstants.JOB_REFERENCE)]],
132
+ });
133
+ (_e = (_d = this.productDetails) === null || _d === void 0 ? void 0 : _d.subLineConfigInfos) === null || _e === void 0 ? void 0 : _e.forEach((val, index) => {
134
+ var _a, _b;
135
+ this.addProductQuantityFormGroup();
136
+ if (!this.isNullOrEmpty(val === null || val === void 0 ? void 0 : val.bundleName)) {
137
+ this.hasBundle = true;
138
+ (_b = (_a = this.productForm) === null || _a === void 0 ? void 0 : _a.get("bundling")) === null || _b === void 0 ? void 0 : _b.setValue(true);
139
+ }
140
+ this.productQuantityForm.controls[index].patchValue({
141
+ prodBundle: val === null || val === void 0 ? void 0 : val.bundleName,
142
+ prodLen: this.pad3Digits(val === null || val === void 0 ? void 0 : val.length),
143
+ prodQty: val === null || val === void 0 ? void 0 : val.quantity,
144
+ prodRef: val === null || val === void 0 ? void 0 : val.reference,
145
+ });
146
+ });
147
+ }
148
+ this.cdr.detectChanges();
149
+ }
150
+ // Updating the Bundle
151
+ updateBundling(event) {
152
+ var _a, _b, _c;
153
+ this.hasBundle = ((_a = event.currentTarget) === null || _a === void 0 ? void 0 : _a.checked) === true;
154
+ if (this.hasBundle) {
155
+ (_c = (_b = this.productQuantityForm) === null || _b === void 0 ? void 0 : _b.controls) === null || _c === void 0 ? void 0 : _c.forEach((element, index) => {
156
+ this.updateSameBundleReference(null, index);
157
+ });
158
+ }
159
+ this.updateTotal();
160
+ }
161
+ // Check if any value is empty or undefined
162
+ isNullOrEmpty(value) {
163
+ return value == null || value == undefined || value == "";
164
+ }
165
+ // Check for any errors while updating the quantity
166
+ hasErrorIndex(index) {
167
+ return this.errorIndex[index] == true;
168
+ }
169
+ // Check if any Same Reference Error
170
+ hasProdRefErrorIndex(index) {
171
+ return this.hasProdRefIndex[index] == true;
172
+ }
173
+ // Group the Quantity values based on bundle
174
+ groupByBundle(items, key) {
175
+ return items.reduce((result, item) => (Object.assign(Object.assign({}, result), { [item[key]]: [...(result[item[key]] || []), item] })), {});
176
+ }
177
+ // Check the total bundle weight and update the error if it reaches to maximum bundle size for each bundle
178
+ checkTotalBundleWeight(formValues) {
179
+ var _a, _b;
180
+ let groupTotal = 0;
181
+ formValues === null || formValues === void 0 ? void 0 : formValues.forEach((currentValue) => {
182
+ const qty = parseFloat(currentValue === null || currentValue === void 0 ? void 0 : currentValue.prodQty);
183
+ const len = parseFloat(currentValue === null || currentValue === void 0 ? void 0 : currentValue.prodLen);
184
+ if (!this.isNullOrEmpty(qty) && !this.isNullOrEmpty(len)) {
185
+ groupTotal += qty * len;
186
+ }
187
+ });
188
+ groupTotal = groupTotal * (((_a = this.cuttingValidation) === null || _a === void 0 ? void 0 : _a.weightPerLM) || 1);
189
+ return groupTotal > (((_b = this.cuttingValidation) === null || _b === void 0 ? void 0 : _b.maxBundleLoad) || 1000);
190
+ }
191
+ // Get the last row of a bundle based on bundle name
192
+ getLastBundleIndex(bundleName) {
193
+ var _a, _b;
194
+ let indexValue = null;
195
+ (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.getRawValue()) === null || _b === void 0 ? void 0 : _b.forEach((element, index) => {
196
+ var _a;
197
+ if (((_a = element === null || element === void 0 ? void 0 : element.prodBundle) === null || _a === void 0 ? void 0 : _a.toUpperCase()) == (bundleName === null || bundleName === void 0 ? void 0 : bundleName.toUpperCase())) {
198
+ indexValue = index;
199
+ }
200
+ });
201
+ return indexValue;
202
+ }
203
+ // Get the Reference value of the same bundle and update
204
+ getPrevBundleReferenceValue(index) {
205
+ var _a, _b, _c, _d, _e, _f, _g, _h;
206
+ const bundleName = this.selectedIndex == null
207
+ ? (_d = (_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get("prodBundle")) === null || _c === void 0 ? void 0 : _c.value) === null || _d === void 0 ? void 0 : _d.toUpperCase()
208
+ : (_g = (_f = (_e = this.modalBundleForm) === null || _e === void 0 ? void 0 : _e.get("modBundle")) === null || _f === void 0 ? void 0 : _f.value) === null || _g === void 0 ? void 0 : _g.toUpperCase();
209
+ let refValue = "";
210
+ (_h = this.productQuantityForm) === null || _h === void 0 ? void 0 : _h.controls.forEach((element, ind) => {
211
+ var _a, _b, _c, _d, _e;
212
+ const otherRefValue = (_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[ind]) === null || _b === void 0 ? void 0 : _b.get("prodRef")) === null || _c === void 0 ? void 0 : _c.value;
213
+ if (((_e = (_d = element === null || element === void 0 ? void 0 : element.value) === null || _d === void 0 ? void 0 : _d.prodBundle) === null || _e === void 0 ? void 0 : _e.toUpperCase()) ==
214
+ (bundleName === null || bundleName === void 0 ? void 0 : bundleName.toUpperCase()) &&
215
+ (ind != index || this.selectedIndex != null) &&
216
+ !this.isNullOrEmpty(otherRefValue)) {
217
+ refValue = otherRefValue;
218
+ }
219
+ });
220
+ return refValue || "";
221
+ }
222
+ // Check if Same Refrence is already used
223
+ checkHasSameReference(index, currentReference, bundleName) {
224
+ var _a, _b;
225
+ let hasRef = false;
226
+ const prodRefValues = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls) === null || _b === void 0 ? void 0 : _b.filter((element) => {
227
+ var _a, _b, _c;
228
+ return (((_a = element === null || element === void 0 ? void 0 : element.value) === null || _a === void 0 ? void 0 : _a.prodRef) == currentReference &&
229
+ ((_c = (_b = element === null || element === void 0 ? void 0 : element.value) === null || _b === void 0 ? void 0 : _b.prodBundle) === null || _c === void 0 ? void 0 : _c.toUpperCase()) !=
230
+ (bundleName === null || bundleName === void 0 ? void 0 : bundleName.toUpperCase()) &&
231
+ !this.isNullOrEmpty(currentReference));
232
+ });
233
+ if ((prodRefValues === null || prodRefValues === void 0 ? void 0 : prodRefValues.length) > 0) {
234
+ this.hasProdRefIndex[index] = true;
235
+ hasRef = true;
236
+ }
237
+ else {
238
+ this.hasProdRefIndex[index] = false;
239
+ }
240
+ this.cdr.detectChanges();
241
+ return hasRef;
242
+ }
243
+ // Update the Reference Value if already the same bundle is present
244
+ updateSameBundleReference(event, index, isReference = false) {
245
+ var _a, _b, _c, _d, _e, _f, _g, _h;
246
+ const bundleName = ((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get("prodBundle")) === null || _c === void 0 ? void 0 : _c.value) ||
247
+ ((_d = this.modalBundleForm.get("modBundle")) === null || _d === void 0 ? void 0 : _d.value);
248
+ const newRefValue = event != null
249
+ ? event.currentTarget.value
250
+ : ((_g = (_f = (_e = this.productQuantityForm) === null || _e === void 0 ? void 0 : _e.controls[index]) === null || _f === void 0 ? void 0 : _f.get("prodRef")) === null || _g === void 0 ? void 0 : _g.value) ||
251
+ ((_h = this.modalBundleForm) === null || _h === void 0 ? void 0 : _h.get("modRef").value);
252
+ isReference = isReference
253
+ ? this.checkHasSameReference(index, newRefValue, bundleName)
254
+ : false;
255
+ if (!isReference) {
256
+ this.productQuantityForm.controls.forEach((element, ind) => {
257
+ var _a, _b, _c, _d, _e;
258
+ if (((_b = (_a = element === null || element === void 0 ? void 0 : element.value) === null || _a === void 0 ? void 0 : _a.prodBundle) === null || _b === void 0 ? void 0 : _b.toUpperCase()) ==
259
+ (bundleName === null || bundleName === void 0 ? void 0 : bundleName.toUpperCase()) &&
260
+ ind != index &&
261
+ !this.isNullOrEmpty(newRefValue) &&
262
+ !this.isNullOrEmpty(bundleName)) {
263
+ (_e = (_d = (_c = this.productQuantityForm) === null || _c === void 0 ? void 0 : _c.controls[ind]) === null || _d === void 0 ? void 0 : _d.get("prodRef")) === null || _e === void 0 ? void 0 : _e.setValue(newRefValue);
264
+ }
265
+ });
266
+ }
267
+ this.cdr.detectChanges();
268
+ }
269
+ // Update the same Bundle Refrence Value to all other Bundles if any changes in Reference Value
270
+ populateSameBundleReference(event, index) {
271
+ var _a, _b, _c, _d, _e;
272
+ if (event) {
273
+ const prevRefValue = this.getPrevBundleReferenceValue(index);
274
+ if (!this.isNullOrEmpty(prevRefValue)) {
275
+ (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index].get("prodRef")) === null || _b === void 0 ? void 0 : _b.setValue(prevRefValue);
276
+ this.modalBundleForm.get("modRef").setValue(prevRefValue);
277
+ }
278
+ }
279
+ else {
280
+ if (!this.isNullOrEmpty(this.getPrevBundleReferenceValue(index))) {
281
+ (_e = (_d = (_c = this.productQuantityForm) === null || _c === void 0 ? void 0 : _c.controls[index]) === null || _d === void 0 ? void 0 : _d.get("prodRef")) === null || _e === void 0 ? void 0 : _e.setValue(this.getPrevBundleReferenceValue(index) || "");
282
+ }
283
+ }
284
+ this.cdr.detectChanges();
285
+ }
286
+ // Update the Bundle List if more than one bundle/rows
287
+ updateBundleList() {
288
+ var _a, _b;
289
+ const formValues = this.groupByBundle((_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.getRawValue(), "prodBundle");
290
+ if (((_b = Object.keys(formValues)) === null || _b === void 0 ? void 0 : _b.length) > 1) {
291
+ this.bundleList = Object.keys(formValues);
292
+ }
293
+ this.cdr.detectChanges();
294
+ }
295
+ // Get Bundle values only for mobile view
296
+ getBundleValues(index) {
297
+ var _a, _b, _c, _d, _e, _f;
298
+ const bundleValues = [];
299
+ bundleValues.push((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get("prodBundle")) === null || _c === void 0 ? void 0 : _c.value);
300
+ bundleValues.push((_f = (_e = (_d = this.productQuantityForm) === null || _d === void 0 ? void 0 : _d.controls[index]) === null || _e === void 0 ? void 0 : _e.get("prodRef")) === null || _f === void 0 ? void 0 : _f.value);
301
+ return bundleValues;
302
+ }
303
+ // Edit Bundle Values
304
+ editBundleValue(index) {
305
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
306
+ this.selectedIndex = index;
307
+ (_a = this.modalBundleForm) === null || _a === void 0 ? void 0 : _a.get("modBundle").setValue((_e = (_d = (_c = (_b = this.productQuantityForm) === null || _b === void 0 ? void 0 : _b.controls[index]) === null || _c === void 0 ? void 0 : _c.get("prodBundle")) === null || _d === void 0 ? void 0 : _d.value) === null || _e === void 0 ? void 0 : _e.toUpperCase());
308
+ (_g = (_f = this.modalBundleForm) === null || _f === void 0 ? void 0 : _f.get("modRef")) === null || _g === void 0 ? void 0 : _g.setValue((_k = (_j = (_h = this.productQuantityForm) === null || _h === void 0 ? void 0 : _h.controls[index]) === null || _j === void 0 ? void 0 : _j.get("prodRef")) === null || _k === void 0 ? void 0 : _k.value);
309
+ this.cdr.detectChanges();
310
+ }
311
+ // Update/Save Bundle values
312
+ saveBundleDetails(event) {
313
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
314
+ (_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[this.selectedIndex]) === null || _b === void 0 ? void 0 : _b.get("prodBundle")) === null || _c === void 0 ? void 0 : _c.setValue((_e = (_d = this.modalBundleForm) === null || _d === void 0 ? void 0 : _d.get("modBundle")) === null || _e === void 0 ? void 0 : _e.value.toUpperCase());
315
+ (_h = (_g = (_f = this.productQuantityForm) === null || _f === void 0 ? void 0 : _f.controls[this.selectedIndex]) === null || _g === void 0 ? void 0 : _g.get("prodRef")) === null || _h === void 0 ? void 0 : _h.setValue((_k = (_j = this.modalBundleForm) === null || _j === void 0 ? void 0 : _j.get("modRef")) === null || _k === void 0 ? void 0 : _k.value);
316
+ this.updateSameBundleReference(null, this.selectedIndex, true);
317
+ this.updateTotal();
318
+ this.selectedIndex = null;
319
+ this.closebutton.nativeElement.click();
320
+ }
321
+ // Update Cart Deatils
322
+ updateCartDetails() {
323
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
324
+ if (this.isValidForm()) {
325
+ let payLoad = {};
326
+ if (this.isFinishedProduct) {
327
+ payLoad = {
328
+ quantity: (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[0].get("prodQty")) === null || _b === void 0 ? void 0 : _b.value,
329
+ product: {
330
+ code: (_d = (_c = this.productDetails) === null || _c === void 0 ? void 0 : _c.product) === null || _d === void 0 ? void 0 : _d.code,
331
+ },
332
+ jobReference: (_f = (_e = this.productDetails) === null || _e === void 0 ? void 0 : _e.product) === null || _f === void 0 ? void 0 : _f.jobReference,
333
+ };
334
+ }
335
+ else {
336
+ payLoad = {
337
+ quantity: 1,
338
+ configurationInfos: [(_g = this.productDetails) === null || _g === void 0 ? void 0 : _g.configValues],
339
+ subLineConfigInfos: [],
340
+ jobReference: (_j = (_h = this.productDetails) === null || _h === void 0 ? void 0 : _h.product) === null || _j === void 0 ? void 0 : _j.jobReference,
341
+ };
342
+ (_l = (_k = this.productQuantityForm) === null || _k === void 0 ? void 0 : _k.controls) === null || _l === void 0 ? void 0 : _l.forEach((element, index) => {
343
+ var _a, _b, _c, _d, _e;
344
+ const configInfos = {
345
+ configuratorType: "CUTTING",
346
+ quantity: (_a = element === null || element === void 0 ? void 0 : element.value) === null || _a === void 0 ? void 0 : _a.prodQty,
347
+ length: (_b = element === null || element === void 0 ? void 0 : element.value) === null || _b === void 0 ? void 0 : _b.prodLen,
348
+ };
349
+ if (this.hasBundle && ((_c = element === null || element === void 0 ? void 0 : element.value) === null || _c === void 0 ? void 0 : _c.prodBundle)) {
350
+ configInfos.bundleName = (_d = element === null || element === void 0 ? void 0 : element.value) === null || _d === void 0 ? void 0 : _d.prodBundle;
351
+ configInfos.reference = (_e = element === null || element === void 0 ? void 0 : element.value) === null || _e === void 0 ? void 0 : _e.prodRef;
352
+ }
353
+ payLoad.subLineConfigInfos.push(configInfos);
354
+ });
355
+ if ((payLoad === null || payLoad === void 0 ? void 0 : payLoad.configurationInfos) &&
356
+ ((_m = payLoad === null || payLoad === void 0 ? void 0 : payLoad.configurationInfos) === null || _m === void 0 ? void 0 : _m.length) > 0 &&
357
+ this.isNullOrEmpty(payLoad === null || payLoad === void 0 ? void 0 : payLoad.configurationInfos[0])) {
358
+ payLoad === null || payLoad === void 0 ? true : delete payLoad.configurationInfos;
359
+ }
360
+ }
361
+ this.cartService
362
+ .updateCartEntry(this.cartId, (_o = this.productDetails) === null || _o === void 0 ? void 0 : _o.entryNumber, payLoad)
363
+ .subscribe((response) => {
364
+ var _a;
365
+ if (response) {
366
+ if (((_a = response === null || response === void 0 ? void 0 : response.statusCode) === null || _a === void 0 ? void 0 : _a.toLowerCase()) == "success") {
367
+ this.activeCartService.reloadActiveCart();
368
+ this.updateCartEntires.emit(true);
369
+ }
370
+ else {
371
+ if (response === null || response === void 0 ? void 0 : response.configurationLineNumber) {
372
+ this.errorIndex[(response === null || response === void 0 ? void 0 : response.configurationLineNumber) - 1] = true;
373
+ }
374
+ this.addToCartError =
375
+ (response === null || response === void 0 ? void 0 : response.message) ||
376
+ (response === null || response === void 0 ? void 0 : response.errorMessage) ||
377
+ (response === null || response === void 0 ? void 0 : response.statusMessage);
378
+ this.cdr.detectChanges();
379
+ //this.updateCartEntires.emit(this.addToCartError);
380
+ }
381
+ }
382
+ }, (error) => {
383
+ var _a, _b, _c, _d;
384
+ this.addToCartError =
385
+ ((_b = (_a = error === null || error === void 0 ? void 0 : error.error) === null || _a === void 0 ? void 0 : _a.errors[0]) === null || _b === void 0 ? void 0 : _b.message) ||
386
+ ((_d = (_c = error === null || error === void 0 ? void 0 : error.error) === null || _c === void 0 ? void 0 : _c.errors[0]) === null || _d === void 0 ? void 0 : _d.errorMessage);
387
+ });
388
+ }
389
+ }
390
+ // Update Total Price and Total length based on user inputs on each row
391
+ updateTotal() {
392
+ var _a, _b, _c, _d;
393
+ this.totalLength = 0;
394
+ this.totalPrice = 0;
395
+ if (!this.isFinishedProduct) {
396
+ const formValues = this.groupByBundle((_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.getRawValue(), "prodBundle");
397
+ this.productQuantityForm.controls.forEach((element, index) => {
398
+ var _a, _b, _c, _d, _e, _f, _g, _h;
399
+ const qty = parseFloat((_a = element === null || element === void 0 ? void 0 : element.value) === null || _a === void 0 ? void 0 : _a.prodQty);
400
+ const len = parseFloat((_b = element === null || element === void 0 ? void 0 : element.value) === null || _b === void 0 ? void 0 : _b.prodLen);
401
+ const currentBundleName = (_d = (_c = element === null || element === void 0 ? void 0 : element.value) === null || _c === void 0 ? void 0 : _c.prodBundle) === null || _d === void 0 ? void 0 : _d.toUpperCase();
402
+ let total = 0;
403
+ if (!this.isNullOrEmpty(qty) &&
404
+ !this.isNullOrEmpty(len) &&
405
+ !isNaN(qty) &&
406
+ !isNaN(len)) {
407
+ total = qty * len;
408
+ if (!this.hasBundle) {
409
+ this.errorIndex[index] =
410
+ total * (((_e = this.cuttingValidation) === null || _e === void 0 ? void 0 : _e.weightPerLM) || 1) >
411
+ (((_f = this.cuttingValidation) === null || _f === void 0 ? void 0 : _f.maxBundleLoad) || 1000)
412
+ ? true
413
+ : false;
414
+ }
415
+ else if (this.checkTotalBundleWeight(formValues[currentBundleName])) {
416
+ const errorIndexNo = this.getLastBundleIndex(currentBundleName);
417
+ if (!this.isNullOrEmpty(errorIndexNo)) {
418
+ this.errorIndex[errorIndexNo] = true;
419
+ }
420
+ }
421
+ else {
422
+ this.errorIndex[index] = false;
423
+ }
424
+ }
425
+ if (!isNaN(qty) && !isNaN(len)) {
426
+ this.totalLength = this.totalLength + total;
427
+ this.totalPrice =
428
+ this.totalLength * ((_h = (_g = this.productDetails) === null || _g === void 0 ? void 0 : _g.price) === null || _h === void 0 ? void 0 : _h.value);
429
+ }
430
+ });
431
+ }
432
+ else {
433
+ this.totalLength = null;
434
+ const qty = (_d = (_c = (_b = this.productQuantityForm) === null || _b === void 0 ? void 0 : _b.controls[0]) === null || _c === void 0 ? void 0 : _c.get("prodQty")) === null || _d === void 0 ? void 0 : _d.value;
435
+ if (!isNaN(qty)) {
436
+ this.totalPrice = qty * this.accessoriesPrice;
437
+ }
438
+ }
439
+ this.updateCartDetails();
440
+ }
441
+ // Utility Function to get Key Values
442
+ getKeyValues(source, search) {
443
+ if (typeof source !== "object") {
444
+ return [];
445
+ }
446
+ const [key, next] = Object.keys(source);
447
+ const _a = source, _b = key, value = _a[_b], rest = __rest(_a, [typeof _b === "symbol" ? _b : _b + ""]);
448
+ return [
449
+ ...(key === search ? [value] : this.getKeyValues(value, search)),
450
+ ...(next ? this.getKeyValues(rest, search) : []),
451
+ ];
452
+ }
453
+ // Get the values of Quantity Form
454
+ getProductQuantityFormGroup() {
455
+ return this.formBuilder.group(this.isFinishedProduct ? new AccessoriesQuantity() : new ProductQuantity());
456
+ }
457
+ get productQuantityForm() {
458
+ return this.productForm.get("productQuantity");
459
+ }
460
+ // Add the Quanity Form when user clicks on Add More button
461
+ addProductQuantityFormGroup(event) {
462
+ var _a, _b, _c;
463
+ event === null || event === void 0 ? void 0 : event.preventDefault();
464
+ (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.push(this.getProductQuantityFormGroup());
465
+ const bundles = this.groupByBundle((_b = this.productQuantityForm) === null || _b === void 0 ? void 0 : _b.getRawValue(), "prodBundle");
466
+ this.disableAddMore = ((_c = this.productQuantityForm) === null || _c === void 0 ? void 0 : _c.length) > 99;
467
+ this.errorIndex[this.rowIndex] = false;
468
+ this.hasProdRefIndex[this.rowIndex++] = false;
469
+ this.cdr.detectChanges();
470
+ this.addMoreClicked.emit();
471
+ }
472
+ // Update the Quantity form if user clicks on remove button
473
+ removeProductQuantityForm(index, event) {
474
+ var _a;
475
+ event.preventDefault();
476
+ this.productQuantityForm.removeAt(index);
477
+ this.rowIndex--;
478
+ this.disableAddMore = ((_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.length) > 99;
479
+ this.cdr.detectChanges();
480
+ this.updateTotal();
481
+ this.addMoreClicked.emit();
482
+ }
483
+ // Get Job Reference Errors
484
+ jobReferenceErrors() {
485
+ var _a, _b;
486
+ return (_b = (_a = this.productForm) === null || _a === void 0 ? void 0 : _a.get("jobReference")) === null || _b === void 0 ? void 0 : _b.errors;
487
+ }
488
+ // Get Product Quantity Errors
489
+ prodQtyErrors(index) {
490
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
491
+ return ((((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get("prodQty")) === null || _c === void 0 ? void 0 : _c.errors) ||
492
+ ((_f = (_e = (_d = this.productQuantityForm) === null || _d === void 0 ? void 0 : _d.controls[index]) === null || _e === void 0 ? void 0 : _e.get("prodQty")) === null || _f === void 0 ? void 0 : _f.invalid)) &&
493
+ (((_j = (_h = (_g = this.productQuantityForm) === null || _g === void 0 ? void 0 : _g.controls[index]) === null || _h === void 0 ? void 0 : _h.get("prodQty")) === null || _j === void 0 ? void 0 : _j.dirty) ||
494
+ ((_m = (_l = (_k = this.productQuantityForm) === null || _k === void 0 ? void 0 : _k.controls[index]) === null || _l === void 0 ? void 0 : _l.get("prodQty")) === null || _m === void 0 ? void 0 : _m.touched)));
495
+ }
496
+ // Get Product Length Errors
497
+ prodLenErrors(index) {
498
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
499
+ return ((((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get("prodLen")) === null || _c === void 0 ? void 0 : _c.errors) ||
500
+ ((_f = (_e = (_d = this.productQuantityForm) === null || _d === void 0 ? void 0 : _d.controls[index]) === null || _e === void 0 ? void 0 : _e.get("prodLen")) === null || _f === void 0 ? void 0 : _f.invalid)) &&
501
+ (((_j = (_h = (_g = this.productQuantityForm) === null || _g === void 0 ? void 0 : _g.controls[index]) === null || _h === void 0 ? void 0 : _h.get("prodLen")) === null || _j === void 0 ? void 0 : _j.dirty) ||
502
+ ((_m = (_l = (_k = this.productQuantityForm) === null || _k === void 0 ? void 0 : _k.controls[index]) === null || _l === void 0 ? void 0 : _l.get("prodLen")) === null || _m === void 0 ? void 0 : _m.touched)));
503
+ }
504
+ // Get Product Length Errors
505
+ minLenErrors(index) {
506
+ var _a;
507
+ return ((_a = this.hasMinlengthError) === null || _a === void 0 ? void 0 : _a.indexOf(index)) !== -1;
508
+ }
509
+ // Get Product Bundle Errors
510
+ prodBundleErrors(index) {
511
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
512
+ return ((((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get("prodBundle")) === null || _c === void 0 ? void 0 : _c.errors) ||
513
+ ((_f = (_e = (_d = this.productQuantityForm) === null || _d === void 0 ? void 0 : _d.controls[index]) === null || _e === void 0 ? void 0 : _e.get("prodBundle")) === null || _f === void 0 ? void 0 : _f.invalid)) &&
514
+ (((_j = (_h = (_g = this.productQuantityForm) === null || _g === void 0 ? void 0 : _g.controls[index]) === null || _h === void 0 ? void 0 : _h.get("prodBundle")) === null || _j === void 0 ? void 0 : _j.dirty) ||
515
+ ((_m = (_l = (_k = this.productQuantityForm) === null || _k === void 0 ? void 0 : _k.controls[index]) === null || _l === void 0 ? void 0 : _l.get("prodBundle")) === null || _m === void 0 ? void 0 : _m.touched)));
516
+ }
517
+ // Get Product Bunlde Reference Errors
518
+ prodRefErrors(index) {
519
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
520
+ return ((((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get("prodRef")) === null || _c === void 0 ? void 0 : _c.errors) ||
521
+ ((_f = (_e = (_d = this.productQuantityForm) === null || _d === void 0 ? void 0 : _d.controls[index]) === null || _e === void 0 ? void 0 : _e.get("prodRef")) === null || _f === void 0 ? void 0 : _f.invalid)) &&
522
+ (((_j = (_h = (_g = this.productQuantityForm) === null || _g === void 0 ? void 0 : _g.controls[index]) === null || _h === void 0 ? void 0 : _h.get("prodRef")) === null || _j === void 0 ? void 0 : _j.dirty) ||
523
+ ((_m = (_l = (_k = this.productQuantityForm) === null || _k === void 0 ? void 0 : _k.controls[index]) === null || _l === void 0 ? void 0 : _l.get("prodRef")) === null || _m === void 0 ? void 0 : _m.touched)));
524
+ }
525
+ // Check if form is Valid or not
526
+ isValidForm() {
527
+ var _a, _b, _c;
528
+ let valid = true;
529
+ if (this.hasBundle) {
530
+ return (_a = this.productForm) === null || _a === void 0 ? void 0 : _a.valid;
531
+ }
532
+ else {
533
+ (_c = (_b = this.productQuantityForm) === null || _b === void 0 ? void 0 : _b.controls) === null || _c === void 0 ? void 0 : _c.forEach((element) => {
534
+ var _a, _b, _c;
535
+ valid = this.isFinishedProduct
536
+ ? (_a = element === null || element === void 0 ? void 0 : element.get("prodQty")) === null || _a === void 0 ? void 0 : _a.valid
537
+ : ((_b = element === null || element === void 0 ? void 0 : element.get("prodLen")) === null || _b === void 0 ? void 0 : _b.valid) && ((_c = element === null || element === void 0 ? void 0 : element.get("prodQty")) === null || _c === void 0 ? void 0 : _c.valid);
538
+ });
539
+ }
540
+ return valid;
541
+ }
542
+ // Check if any errors present on any row and diplay it on UI
543
+ hasErrors(index) {
544
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
545
+ return ((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get("prodQty")) === null || _c === void 0 ? void 0 : _c.errors) ||
546
+ ((_f = (_e = (_d = this.productQuantityForm) === null || _d === void 0 ? void 0 : _d.controls[index]) === null || _e === void 0 ? void 0 : _e.get("prodLen")) === null || _f === void 0 ? void 0 : _f.errors) ||
547
+ ((_j = (_h = (_g = this.productQuantityForm) === null || _g === void 0 ? void 0 : _g.controls[index]) === null || _h === void 0 ? void 0 : _h.get("prodBundle")) === null || _j === void 0 ? void 0 : _j.errors) ||
548
+ ((_m = (_l = (_k = this.productQuantityForm) === null || _k === void 0 ? void 0 : _k.controls[index]) === null || _l === void 0 ? void 0 : _l.get("prodRef")) === null || _m === void 0 ? void 0 : _m.errors)
549
+ ? true
550
+ : false;
551
+ }
552
+ // Check if Any Entry has less than Minimum length
553
+ checkHasMinLengthQty() {
554
+ var _a, _b;
555
+ this.hasMinlengthError = [];
556
+ (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls) === null || _b === void 0 ? void 0 : _b.forEach((element, ind) => {
557
+ var _a, _b, _c;
558
+ if (((_a = element === null || element === void 0 ? void 0 : element.value) === null || _a === void 0 ? void 0 : _a.prodLen) < ((_b = this.cuttingValidation) === null || _b === void 0 ? void 0 : _b.minLength) &&
559
+ !this.isNullOrEmpty((_c = element === null || element === void 0 ? void 0 : element.value) === null || _c === void 0 ? void 0 : _c.prodLen)) {
560
+ this.hasMinlengthError.push(ind);
561
+ }
562
+ });
563
+ this.cdr.detectChanges();
564
+ }
565
+ pad3Digits(value) {
566
+ var _a, _b;
567
+ const qty = value;
568
+ if (!this.isNullOrEmpty(qty) && !isNaN(qty)) {
569
+ return (_b = (_a = parseFloat(qty)) === null || _a === void 0 ? void 0 : _a.toFixed(3)) === null || _b === void 0 ? void 0 : _b.replace(/(\d)(?=(\d{3})+\b)/g, "$1,");
570
+ }
571
+ }
572
+ // Convert Length to demial format after blur
573
+ updateLenthValue(element) {
574
+ if (!this.isNullOrEmpty(element === null || element === void 0 ? void 0 : element.value)) {
575
+ element.value = this.pad3Digits(element.value);
576
+ }
577
+ this.checkHasMinLengthQty();
578
+ }
579
+ }
580
+ CustomProductQuantityFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: CustomProductQuantityFormComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: i2.CartService }, { token: i3.Router }, { token: i4.ProductService }, { token: i4.CmsService }, { token: i5.NgbModal }, { token: i4.ActiveCartService }, { token: i6.CurrentProductService }], target: i0.ɵɵFactoryTarget.Component });
581
+ CustomProductQuantityFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: CustomProductQuantityFormComponent, selector: "app-custom-product-quantity-form", inputs: { hasBundle: "hasBundle", productCode: "productCode", productDetails: "productDetails", unitType: "unitType", accessoriesPrice: "accessoriesPrice", selectedColour: "selectedColour", cuttingValidation: "cuttingValidation", finishedAvailableColours: "finishedAvailableColours", isFinishedProduct: "isFinishedProduct", isFlashingProduct: "isFlashingProduct", listView: "listView" }, outputs: { updateCartEntires: "updateCartEntires", addMoreClicked: "addMoreClicked" }, viewQueries: [{ propertyName: "closeInviteModal", first: true, predicate: ["closeInviteModal"], descendants: true }, { propertyName: "closebutton", first: true, predicate: ["closebutton"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"productDetails\" [formGroup]=\"productForm\">\r\n <div class=\"row\">\r\n <ng-container>\r\n <div\r\n class=\"col p-0 bundling pr-2\"\r\n *ngIf=\"!isFinishedProduct && !isFlashingProduct\"\r\n >\r\n <span class=\"pr-2 font-weight-bold text\">Bundling </span>\r\n <span>\r\n <label class=\"switch\">\r\n <input\r\n type=\"checkbox\"\r\n formControlName=\"bundling\"\r\n (change)=\"updateBundling($event)\"\r\n [value]=\"hasBundle\"\r\n [checked]=\"hasBundle\"\r\n />\r\n <span class=\"slider round\"></span>\r\n </label>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <div class=\"quantity border p-2 mt-4\">\r\n <ng-container formArrayName=\"productQuantity\">\r\n <datalist id=\"bundleList\">\r\n <option *ngFor=\"let bundle of bundleList\">\r\n {{ bundle }}\r\n </option>\r\n </datalist>\r\n <table\r\n class=\"no-border\"\r\n [ngClass]=\"{\r\n 'has-bundle': hasBundle,\r\n accessories: isFinishedProduct\r\n }\"\r\n >\r\n <thead>\r\n <th>Quantity</th>\r\n <th *ngIf=\"!isFinishedProduct\">Length (LM)</th>\r\n <th *ngIf=\"hasBundle\">\r\n Bundle\r\n <span\r\n class=\"info-icon\"\r\n ngbTooltip=\"Bundle Information goes here....\"\r\n placement=\"bottom\"\r\n >\r\n </span>\r\n </th>\r\n <th\r\n *ngIf=\"hasBundle\"\r\n class=\"d-none\"\r\n [ngClass]=\"{ 'd-lg-block': listView }\"\r\n >\r\n Reference\r\n <span\r\n class=\"info-icon\"\r\n ngbTooltip=\"Reference Information goes here....\"\r\n placement=\"bottom\"\r\n >\r\n </span>\r\n </th>\r\n <th></th>\r\n </thead>\r\n <tbody>\r\n <ng-container\r\n *ngFor=\"\r\n let val of productForm.get('productQuantity')['controls'];\r\n let i = index\r\n \"\r\n [formGroupName]=\"i\"\r\n >\r\n <tr>\r\n <td>\r\n <input\r\n inputmode=\"numeric\"\r\n class=\"form-control prod-qty\"\r\n formControlName=\"prodQty\"\r\n minlength=\"1\"\r\n maxlength=\"2\"\r\n OnlyNumber=\"true\"\r\n (blur)=\"updateTotal()\"\r\n />\r\n </td>\r\n <td *ngIf=\"!isFinishedProduct\">\r\n <input\r\n inputmode=\"decimal\"\r\n class=\"form-control prod-len\"\r\n formControlName=\"prodLen\"\r\n #prodLen\r\n minlength=\"1\"\r\n maxlength=\"7\"\r\n OnlyNumber=\"true\"\r\n (blur)=\"updateTotal(); updateLenthValue(prodLen)\"\r\n />\r\n </td>\r\n <td *ngIf=\"hasBundle && !isFinishedProduct\">\r\n <div class=\"d-none\" [ngClass]=\"{ 'd-lg-block': listView }\">\r\n <input\r\n class=\"form-control prod-bundle\"\r\n formControlName=\"prodBundle\"\r\n #prodBundle\r\n (input)=\"\r\n prodBundle.value = prodBundle.value.toUpperCase()\r\n \"\r\n minlength=\"1\"\r\n maxlength=\"2\"\r\n (blur)=\"\r\n updateTotal(); populateSameBundleReference(null, i)\r\n \"\r\n (focus)=\"updateBundleList()\"\r\n list=\"bundleList\"\r\n />\r\n </div>\r\n <div [ngClass]=\"{ 'd-lg-none d-xl-none': listView }\">\r\n <p class=\"p-0 m-0\" *ngFor=\"let value of getBundleValues(i)\">\r\n {{ value }}\r\n </p>\r\n </div>\r\n <div class=\"side-menu-button\" *ngIf=\"!listView\">\r\n <div class=\"btn-group dropleft\" *ngIf=\"hasBundle\">\r\n <a\r\n type=\"button\"\r\n class=\"dropdown-toggle\"\r\n href=\"#\"\r\n role=\"button\"\r\n data-toggle=\"dropdown\"\r\n aria-haspopup=\"true\"\r\n aria-expanded=\"false\"\r\n >\r\n <i class=\"fa fa-ellipsis-v\"></i>\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a\r\n class=\"dropdown-item m-0\"\r\n data-toggle=\"modal\"\r\n data-target=\"#bundleModal\"\r\n (click)=\"editBundleValue(i)\"\r\n >\r\n Edit Bundle Value\r\n </a>\r\n <a\r\n class=\"dropdown-item m-0\"\r\n *ngIf=\"i > 0 || productQuantityForm.length > 1\"\r\n (click)=\"removeProductQuantityForm(i, $event)\"\r\n >\r\n Remove\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td *ngIf=\"hasBundle && !isFinishedProduct && listView\">\r\n <div class=\"d-none\" [ngClass]=\"{ 'd-lg-block': listView }\">\r\n <input\r\n class=\"form-control prod-reference\"\r\n minlength=\"1\"\r\n maxlength=\"15\"\r\n (focus)=\"populateSameBundleReference($event, i)\"\r\n formControlName=\"prodRef\"\r\n (blur)=\"\r\n updateTotal();\r\n updateSameBundleReference($event, i, true)\r\n \"\r\n />\r\n </div>\r\n </td>\r\n <td *ngIf=\"listView || !hasBundle\">\r\n <button\r\n *ngIf=\"i > 0 || productQuantityForm.length > 1\"\r\n class=\"simple close d-sm-none d-md-none d-lg-block d-xl-block\"\r\n (click)=\"removeProductQuantityForm(i, $event)\"\r\n >\r\n <i class=\"fas fa-times-circle custom-arrow remove-icon\"></i>\r\n </button>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"hasErrors(i)\">\r\n <td colspan=\"4\" class=\"text-danger\">\r\n <div class=\"mt-0\" *ngIf=\"prodQtyErrors(i)\">\r\n Please enter valid Quantity\r\n </div>\r\n <div class=\"mt-2\" *ngIf=\"prodLenErrors(i)\">\r\n Please enter valid Length\r\n </div>\r\n <div class=\"mt-2\" *ngIf=\"minLenErrors(i)\">\r\n Minimum length should be at least\r\n {{ cuttingValidation?.minLength }}\r\n </div>\r\n <div class=\"mt-2\" *ngIf=\"prodBundleErrors(i)\">\r\n Please enter valid Bundle Name\r\n </div>\r\n <div class=\"mt-2\" *ngIf=\"prodRefErrors(i)\">\r\n Please enter valid Reference\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"hasErrorIndex(i)\">\r\n <td colspan=\"4\" class=\"text-danger\">\r\n {{ this.addToCartError || 'Should not exceed maximum bundle size' }}\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"hasProdRefErrorIndex(i)\">\r\n <td colspan=\"4\" class=\"text-danger\">\r\n This Reference value is already used. Please use other value\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n <button\r\n class=\"simple pl-2\"\r\n *ngIf=\"!isFinishedProduct && !disableAddMore\"\r\n (click)=\"addProductQuantityFormGroup($event)\"\r\n >\r\n <span class=\"mr-1 add-more\"> </span>\r\n Add more\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<!-- <div\r\n class=\"row mt-4 col-sm-12 alert alert-danger justify-content-start\"\r\n role=\"alert\"\r\n *ngIf=\"addToCartError\"\r\n>\r\n <img\r\n class=\"mr-3\"\r\n src=\"../../../../../assets/images/erroricon.svg\"\r\n alt=\"alert\"\r\n />\r\n <span>\r\n {{ addToCartError }}\r\n </span>\r\n</div> -->\r\n\r\n<div\r\n class=\"modal fade edit-bundle-form\"\r\n id=\"bundleModal\"\r\n role=\"dialog\"\r\n aria-hidden=\"true\"\r\n>\r\n <div class=\"modal-dialog modal-lg\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">Bundle Value</h4>\r\n <i\r\n class=\"icon-close invite-pop-close\"\r\n data-dismiss=\"modal\"\r\n aria-label=\"Close\"\r\n ></i>\r\n </div>\r\n <div class=\"modal-body m-0 pl-2 pr-2\">\r\n <table class=\"table no-border\" *ngIf=\"!isFinishedProduct\">\r\n <thead>\r\n <th>\r\n Bundle\r\n <span\r\n class=\"info-icon\"\r\n ngbTooltip=\"Bundle Information goes here....\"\r\n placement=\"bottom\"\r\n >\r\n </span>\r\n </th>\r\n <th>\r\n Reference\r\n <span\r\n class=\"info-icon\"\r\n ngbTooltip=\"Reference Information goes here....\"\r\n placement=\"bottom\"\r\n >\r\n </span>\r\n </th>\r\n </thead>\r\n <tbody [formGroup]=\"modalBundleForm\">\r\n <tr>\r\n <td>\r\n <datalist id=\"modBundleList\">\r\n <option *ngFor=\"let bundle of bundleList\">\r\n {{ bundle }}\r\n </option>\r\n </datalist>\r\n <input\r\n class=\"form-control\"\r\n maxlength=\"2\"\r\n formControlName=\"modBundle\"\r\n #modBundle\r\n (focus)=\"updateBundleList()\"\r\n (input)=\"modBundle.value = modBundle.value.toUpperCase()\"\r\n list=\"modBundleList\"\r\n (blur)=\"populateSameBundleReference(null, selectedIndex)\"\r\n />\r\n </td>\r\n <td>\r\n <input\r\n class=\"form-control\"\r\n maxlength=\"15\"\r\n (focus)=\"populateSameBundleReference($event, selectedIndex)\"\r\n formControlName=\"modRef\"\r\n />\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"modal-footer\">\r\n <button\r\n type=\"submit\"\r\n data-dismiss=\"modal\"\r\n #closebutton\r\n class=\"btn btn-light\"\r\n >\r\n Cancel\r\n </button>\r\n <button type=\"submit\" (click)=\"saveBundleDetails($event)\" class=\"btn\">\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";@media screen and (min-width: 1366px){:root{--fontsize12: .75rem;--fontsize14: .875rem;--fontsize16: 1rem;--fontsize17: 1.063rem;--fontsize17-5: 1.1rem;--fontsize18: 1.125rem;--fontsize18-4: 1.5rem;--fontsize20: 1.25rem;--fontsize21: 1.313rem;--fontsize22: 1.375rem;--fontsize23: 1.438rem;--fontsize24: 1.5rem;--fontsize26: 1.625rem;--fontsize28: 1.75rem;--fontsize30: 1.625rem;--fontsize32: 2rem;--fontsize34: 2.125rem;--fontsize36: 2rem;--fontsize40: 2.25rem;--fontsize46: 2.875rem;--fontsize80: 5rem}}@media screen and (max-width: 1365px) and (min-width: 768px){:root{--fontsize12: .75rem;--fontsize14: .875rem;--fontsize16: 1rem;--fontsize17: .9rem;--fontsize17-5: 1rem;--fontsize18: .875rem;--fontsize20: 1rem;--fontsize21: 1.063rem;--fontsize22: 1.125rem;--fontsize23: 1.188rem;--fontsize24: 1rem;--fontsize28: 1.5rem;--fontsize30: 1.25rem;--fontsize32: 1.75rem;--fontsize34: 1.875rem;--fontsize36: 1.625rem;--fontsize40: 2.5rem;--fontsize46: 2.875rem;--fontsize80: 3.5rem}}@media screen and (max-width: 767px){:root{--fontsize12: .75rem;--fontsize14: .875rem;--fontsize16: 1rem;--fontsize16-5: .77rem;--fontsize17: .9rem;--fontsize17-5: 1rem;--fontsize18: .875rem;--fontsize19: .938rem;--fontsize20: 1rem;--fontsize21: 1.063rem;--fontsize22: 1.125rem;--fontsize23: 1.188rem;--fontsize24: 1rem;--fontsize26: 1.25rem;--fontsize28: 1.5rem;--fontsize30: 1.25rem;--fontsize32: 1.75rem;--fontsize34: 1.875rem;--fontsize36: 1.625rem;--fontsize40: 2.5rem;--fontsize46: 2rem;--fontsize80: 2.5rem}}@font-face{font-family:icomoon;font-weight:400;src:url(../assets/fonts/icomoon.ttf) format(\"ttf\"),url(../assets/fonts/icomoon.woff) format(\"woff\");font-weight:normal;font-style:normal;font-display:swap}@font-face{font-family:\"Arial Regular\";src:url(../assets/fonts/arial-webfont.woff) format(\"woff\"),url(../assets/fonts/arial-webfont.woff2) format(\"woff2\");font-weight:normal;font-style:normal}@font-face{font-family:\"Arial Bold\";src:url(../assets/fonts/arialbold-webfont.woff) format(\"woff\"),url(../assets/fonts/arialbold-webfont.woff2) format(\"woff2\");font-weight:normal;font-style:normal}@font-face{font-family:\"Arial Black\";src:url(../assets/fonts/arialblack-webfont.woff) format(\"woff\"),url(../assets/fonts/arialblack-webfont.woff2) format(\"woff2\");font-weight:normal;font-style:normal}@font-face{font-family:\"Helvetica Neue Reqular\";src:url(../assets/fonts/helveticaneue.woff) format(\"woff\"),url(../assets/fonts/helveticaneue.woff2) format(\"woff2\");font-weight:normal;font-style:normal}@font-face{font-family:\"Helvetica Neue Thin\";src:url(../assets/fonts/helveticaneuethin-webfont.woff) format(\"woff\"),url(../assets/fonts/helveticaneuethin-webfont.woff2) format(\"woff2\");font-weight:normal;font-style:normal}@font-face{font-family:\"Helvetica Neue Medium\";src:url(../assets/fonts/helveticaneuemedium-webfont.woff) format(\"woff\"),url(../assets/fonts/helveticaneuemedium-webfont.woff2) format(\"woff2\");font-weight:normal;font-style:normal}[class*=\" icon-\"],[class^=icon-]{font-family:icomoon!important;font-feature-settings:normal;font-variant:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-style:normal;font-weight:400;line-height:1;text-transform:none;font-display:swap}.icon-right:before{content:\"\\e902\"}.icon-materials:before{content:\"\\e900\"}.icon-natural-lighting:before{content:\"\\e90a\"}.icon-rainwater:before{content:\"\\e901\"}.icon-roofing:before{content:\"\\e90b\"}.icon-flashing{position:relative;display:inline-block;height:32px;text-align:center;width:32px}.icon-flashing:before,.mainnav-link-level-2.show .navTagChild .icon-flashing:before{content:url(../assets/images/icon-flashing-white.svg);height:20px;width:20px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);line-height:15px}li.megamenuSubChild:hover .icon-flashing:before{content:url(../assets/images/icon-flashing-black.svg)}.icon-structural:before{content:\"\\e90c\"}.icon-accessories-old .path1:before{content:\"\\e903\"}.icon-accessories-old .path2:before{margin-left:-1em;content:\"\\e904\"}.icon-accessories-old .path3:before{margin-left:-1em;content:\"\\e905\"}.icon-cladding-old .path1:before{content:\"\\e90d\"}.icon-cladding-old .path2:before{margin-left:-1em;content:\"\\e90e\"}.icon-close:before{content:\"\\e90f\"}.icon-message:before{content:\"\\e910\"}.icon-search .path1:before{content:\"\\e906\"}.icon-search .path2:before{content:\"\\e907\"}.icon-search .path3:before{margin-left:-1.0156em;content:\"\\e908\"}.icon-summary:before{content:\"\\e911\"}.icon-branch:before{content:\"\\e912\"}.icon-delivery:before{content:\"\\e913\"}.icon-downloads:before{content:\"\\e909\"}.icon-drawings:before{content:\"\\e914\"}.icon-full:before{content:\"\\e915\"}.icon-manual:before{content:\"\\e916\"}.icon-payment:before{content:\"\\e917\"}.icon-empty .path1:before{content:\"\\e918\"}.icon-empty .path2:before{margin-left:-1em;content:\"\\e919\"}.icon-empty .path3:before{margin-left:-1em;content:\"\\e91a\"}.icon-product-overview:before{content:\"\\e91b\"}.icon-arrows:before{content:\"\\e91c\"}.icon-selected:before{content:\"\\e91d\"}.icon-accessories:before{content:\"\\e91b\"}.icon-cladding:before{content:\"\\e91e\"}.icon-Triangle:before{content:\"\\e91f\"}.icon-home:before{content:\"\\e920\"}.icon-faq:before{content:\"\\e921\"}.icon-temperature:before{content:\"\\e922\"}body header{font-family:\"Arial Regular\",sans-serif}header{background-color:#1d1d1b;position:sticky;top:0;background-size:100% 25%!important;background-repeat:no-repeat;z-index:10}header .header{max-width:100%;padding:0}header cx-banner cx-media img{margin-top:.7rem;margin-bottom:0}header label{display:inline-flex}header .SiteLinks{height:52px;display:flex;align-items:center;justify-content:space-between;padding-top:5px;padding-bottom:5px}header .SiteLinks cx-paragraph p{color:#fff;font-size:var(--fontsize16);line-height:var(--fontsize16);margin-bottom:0}header .SiteLinks cx-paragraph{font-size:var(--fontsize16)}header .SiteLinks app-account-dropdown,header .SiteLinks app-find-store{width:calc(25% - 25px);max-width:328px;margin-right:25px}header .SiteLinks app-contact-us{width:calc(20% - 25px);max-width:100px;margin-left:auto}header .SiteLinks app-custom-mini-cart{width:10%}header .SiteLinks .preferenceLink{margin-left:auto}header .SiteLinks .preferenceLink cx-generic-link{margin:0}header .SiteLinks .preferenceLink cx-generic-link cx-media img{height:22px;margin:0}header .SiteLogo .storeLogo{position:absolute;z-index:99;left:40px;bottom:10px}header .SiteLogo .homeLogo{max-width:28px;height:28px;position:absolute;z-index:99;bottom:47px}header .NavigationBar{flex:70%;background-color:#b61828;min-height:40px;display:flex;align-items:center;position:relative}header .logoutMenu{margin-top:0!important}header .logoutMenu li{cursor:pointer;background-color:#4c4c4c;color:#fff}header .logoutMenu li:hover{text-decoration:underline;background-color:#4c4c4c}header .MarketingContext{width:100%;margin:auto}.customer-service-icon{cursor:pointer}.helpSupport{width:20rem;border:0;margin-top:.5rem!important;transform:translate(-42%,36px)!important;padding:1rem 1rem 0;background-color:#393939;color:#fff;top:0}.helpSupport .arrow-up{position:absolute;top:-8px;right:44%;width:0;height:0;border-left:15px solid rgba(0,0,0,0);border-right:15px solid rgba(0,0,0,0);border-bottom:15px solid #393939}.helpSupport .contact-us-info .heading{font-family:\"Arial Bold\",sans-serif}.helpSupport .contact-us-info .detail{font-size:var(--fontsize14);line-height:2rem}.helpSupport .contact-us-info .detail .service-icon{height:20px;width:20px;margin-right:10px}.helpSupport .contact-us-info .contactLink a{font-size:var(--fontsize14);text-decoration:underline;text-transform:uppercase}.helpSupport .contact-us-info a{color:#fff;text-decoration:none}.helpSupport .contact-us-info a:hover{text-decoration:underline}.pageTitle{font-family:\"Helvetica Neue Regular\",sans-serif;font-size:var(--fontsize54)}#visualization-container{text-align:center;margin:0 auto}#cds-viewer-container-3d{width:320px;height:200px}#cds-viewer-container-2d{width:320px;height:200px}[aria-label=Close]{cursor:pointer}cx-media.is-missing{background:url(./assets/images/search-noimage.svg);background-size:cover;background-position:center;background-repeat:no-repeat}cx-global-message{position:fixed;top:9rem;width:100%;z-index:13}@media screen and (max-width: 991px){cx-global-message{top:3.75rem}cx-storefront header{background-color:#b61828}cx-storefront header cx-banner cx-media img{margin:auto}cx-storefront header .SiteLogo{width:100%;max-width:211px;margin:auto;padding-left:30px;box-sizing:border-box}cx-storefront header .SiteLogo .storeLogo{position:unset}cx-storefront header .SearchBox{margin:14px 0 10px;width:30px}cx-storefront header .SiteLinks{background-color:transparent;width:110px;margin:auto 25px auto 0}cx-storefront header .SiteLinks app-account-dropdown,cx-storefront header .SiteLinks app-find-store,cx-storefront header .SiteLinks app-contact-us,cx-storefront header .SiteLinks cx-paragraph,cx-storefront header .SiteLinks .preferenceLink{display:none}cx-storefront header .SiteLinks app-custom-mini-cart,cx-storefront header .SiteLinks app-custom-user-account{width:35px}cx-storefront header.is-expanded{overflow-y:auto;position:fixed;bottom:0;top:0;width:calc(100% - 99px)}cx-storefront header.is-expanded .header{background-color:#b61828;margin-left:0}cx-storefront header.is-expanded .PreHeader{position:absolute;right:15px;top:15px}cx-storefront header.is-expanded .SearchBox{display:none}cx-storefront header.is-expanded .SiteLogo{position:absolute;top:25px;z-index:9}cx-storefront header.is-expanded .SiteLinks{background-color:#1d1d1b;width:100%;margin:15px auto 15px 0;height:unset;padding:15px;max-width:100%;position:relative;z-index:9;top:60px}cx-storefront header.is-expanded .SiteLinks app-account-dropdown,cx-storefront header.is-expanded .SiteLinks app-find-store,cx-storefront header.is-expanded .SiteLinks app-contact-us,cx-storefront header.is-expanded .SiteLinks cx-paragraph,cx-storefront header.is-expanded .SiteLinks .preferenceLink{display:block}cx-storefront header.is-expanded .SiteLinks app-custom-mini-cart,cx-storefront header.is-expanded .SiteLinks app-custom-user-account{display:none}cx-storefront header.is-expanded .SiteLinks app-account-dropdown{width:100%;max-width:100%}cx-storefront header.is-expanded .SiteLinks app-find-store{width:50%;max-width:328px;min-width:328px}cx-storefront header.is-expanded .SiteLinks app-contact-us{margin-right:15px;margin-left:auto;width:115px;max-width:unset}cx-storefront header.is-expanded .navigation{position:relative;top:45px}cx-storefront header.is-expanded:before{background-color:#0000004d;right:0;content:\"\";position:fixed;z-index:2;top:0;bottom:0;height:100vh;width:99px}cx-storefront header.is-expanded:after{background-color:transparent}}@media screen and (max-width: 576px){cx-storefront header .SiteLogo{max-width:80px}cx-storefront header .SiteLogo .storeLogo{display:none}cx-storefront header .searchBox{height:45px}cx-storefront header.is-expanded{width:100%}cx-storefront header.is-expanded .header,cx-storefront header.is-expanded .navigation{width:100%}cx-storefront header.is-expanded .SiteLogo{max-width:211px!important}cx-storefront header.is-expanded .SiteLogo .storeLogo{display:block}cx-storefront header.is-expanded .SiteLinks{max-width:100%;width:100%}cx-storefront header.is-expanded .SiteLinks app-account-dropdown,cx-storefront header.is-expanded .SiteLinks app-find-store,cx-storefront header.is-expanded .SiteLinks app-contact-us,cx-storefront header.is-expanded .SiteLinks cx-paragraph,cx-storefront header.is-expanded .SiteLinks .preferenceLink{display:block}cx-storefront header.is-expanded .SiteLinks app-custom-mini-cart,cx-storefront header.is-expanded .SiteLinks app-custom-user-account{display:none}cx-storefront header.is-expanded .SiteLinks app-find-store{width:100%;max-width:100%;margin-bottom:10px}cx-storefront header.is-expanded .SiteLinks app-contact-us{margin-left:0}cx-storefront header.is-expanded .SiteLinks cx-paragraph{margin-left:auto}cx-storefront header.is-expanded:before{display:none}.pageTitle{font-size:28px}}.product-code{color:#6f6f6f}.category-image{width:250px;height:180px}.display_color{text-align:center;position:relative;top:4px;font-family:\"Arial Bold\",sans-serif}.colours .colour{padding:0 15px;position:relative}.colours .colour .checkbox{display:none}.colours .colour .colour-title{position:absolute;bottom:-48px;width:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:var(--fontsize14);text-align:center;cursor:grabbing}.colours .colour.selected{border:1px solid #000000}.colours .colour.selected .checkbox{position:absolute;background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2217.186%22 height%3D%2217.186%22 viewBox%3D%220 0 17.186 17.186%22%3E%0D %3Cg id%3D%22Group_12857%22 data-name%3D%22Group 12857%22 transform%3D%22translate(0.25 0.25)%22%3E%0D %3Ccircle id%3D%22Ellipse_14%22 data-name%3D%22Ellipse 14%22 cx%3D%228.316%22 cy%3D%228.316%22 r%3D%228.316%22 transform%3D%22translate(0 0.039)%22%2F%3E%0D %3Cpath id%3D%22Icon_ionic-md-checkmark-circle%22 data-name%3D%22Icon ionic-md-checkmark-circle%22 d%3D%22M11.718%2C3.375a8.343%2C8.343%2C0%2C1%2C0%2C8.343%2C8.343A8.367%2C8.367%2C0%2C0%2C0%2C11.718%2C3.375ZM10.005%2C16.166%2C5.729%2C11.89l1.2-1.2%2C3.08%2C3.08%2C6.5-6.5%2C1.2%2C1.2Z%22 transform%3D%22translate(-3.375 -3.375)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Icon_ionic-md-checkmark-circle_-_Outline%22 data-name%3D%22Icon ionic-md-checkmark-circle - Outline%22 d%3D%22M11.718%2C3.125a8.583%2C8.583%2C0%2C0%2C1%2C6.069%2C14.662A8.583%2C8.583%2C0%2C1%2C1%2C5.649%2C5.649%2C8.532%2C8.532%2C0%2C0%2C1%2C11.718%2C3.125Zm0%2C16.686A8.117%2C8.117%2C0%2C1%2C0%2C6%2C17.433%2C8.035%2C8.035%2C0%2C0%2C0%2C11.718%2C19.811ZM16.511%2C6.916l1.553%2C1.553-8.059%2C8.05L5.376%2C11.89l1.553-1.553%2C3.08%2C3.08Zm.846%2C1.553-.846-.846-6.5%2C6.5-3.08-3.08-.846.846%2C3.922%2C3.922Z%22 transform%3D%22translate(-3.375 -3.375)%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center;width:20px;height:20px;display:inline-block;top:10px;left:10px}.colours .colour.main{box-sizing:border-box;width:40px;height:40px;display:inline-block;padding:0;border:1px solid #C6C6C6}.bundling{text-align:right;top:30px}.bundling span.text{display:inline-block;position:relative;top:-10px}.switch{position:relative;display:inline-block;width:50px;margin-top:-4px;height:22px}.switch input{opacity:0;width:0;height:0}.switch input:not(:checked)+.slider:after{content:\"NO\";right:6px;position:absolute;color:#fff;top:3px;font-size:var(--fontsize12);font-family:\"Arial Bold\",sans-serif}.switch input:checked+.slider{background-color:#b61828}.switch input:checked+.slider:before{transform:translate(26px);left:5px}.switch input:checked+.slider:after{content:\"YES\";left:5px;position:absolute;color:#fff;top:3px;font-size:var(--fontsize12);font-family:\"Arial Bold\",sans-serif}.switch input:focus+.slider{box-shadow:0 0 1px #2196f3}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#a6a6a5;transition:.4s}.slider:before{position:absolute;content:\"\";height:16px;width:16px;top:3px;left:3px;bottom:3px;background-color:#fff;transition:.4s}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}::ng-deep .info-icon{position:relative;background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2216%22 height%3D%2216%22 viewBox%3D%220 0 16 16%22%3E%0D %3Cpath id%3D%22Icon_metro-info%22 data-name%3D%22Icon metro-info%22 d%3D%22M9.571%2C6.678a.752.752%2C0%2C0%2C1%2C.75-.75h.5a.752.752%2C0%2C0%2C1%2C.75.75v.5a.752.752%2C0%2C0%2C1-.75.75h-.5a.752.752%2C0%2C0%2C1-.75-.75Zm3%2C7.25h-4v-1h1v-3h-1v-1h3v4h1Zm-2-12a8%2C8%2C0%2C1%2C0%2C8%2C8%2C8%2C8%2C0%2C0%2C0-8-8Zm0%2C14.5a6.5%2C6.5%2C0%2C1%2C1%2C6.5-6.5A6.5%2C6.5%2C0%2C0%2C1%2C10.571%2C16.428Z%22 transform%3D%22translate(-2.571 -1.928)%22 fill%3D%22%23c6c6c6%22%2F%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center;width:16px;height:16px;display:inline-block;top:3px}::ng-deep .edit-bundle-form .modal-dialog{padding:10px;transform:translateY(-50%);top:30%;margin:0 auto}::ng-deep .edit-bundle-form .modal-header{border-bottom:0}::ng-deep .edit-bundle-form .modal-body{padding-top:0;padding-bottom:0}::ng-deep .edit-bundle-form .modal-footer{border-top:none}::ng-deep .edit-bundle-form .modal-footer button{background-color:#1d1d1b;text-transform:uppercase;text-decoration:none;height:44px;font-family:\"Arial Bold\",sans-serif;min-width:86px;color:#fff;font-size:var(--fontsize14)}::ng-deep .edit-bundle-form .modal-footer button.btn-light{border:none;background-color:#fff;color:#1d1d1b;text-decoration:underline;text-transform:capitalize;font-size:var(--fontsize16);font-family:\"Arial Regular\",sans-serif}::ng-deep .edit-bundle-form .table th{text-transform:capitalize}::ng-deep .edit-bundle-form .table tr,::ng-deep .edit-bundle-form .table td,::ng-deep .edit-bundle-form .table th{border:none;text-align:left;padding-bottom:0;padding-top:10px}::ng-deep .edit-bundle-form .table td:nth-child(1){width:100px;max-width:100px;min-width:100px;padding-right:15px}::ng-deep .edit-bundle-form .table td:nth-child(2){width:150px}::ng-deep main{overflow-x:hidden}::ng-deep main .no-border{border:none!important}::ng-deep main .full-width{max-width:100%!important}::ng-deep main .add-more{position:relative;background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2219%22 height%3D%2219%22 viewBox%3D%220 0 19 19%22%3E%0D %3Cpath id%3D%22Icon_awesome-plus-circle%22 data-name%3D%22Icon awesome-plus-circle%22 d%3D%22M10.063.563a9.5%2C9.5%2C0%2C1%2C0%2C9.5%2C9.5A9.5%2C9.5%2C0%2C0%2C0%2C10.063.563Zm5.516%2C10.573a.461.461%2C0%2C0%2C1-.46.46H11.595v3.524a.461.461%2C0%2C0%2C1-.46.46H8.99a.461.461%2C0%2C0%2C1-.46-.46V11.595H5.006a.461.461%2C0%2C0%2C1-.46-.46V8.99a.461.461%2C0%2C0%2C1%2C.46-.46H8.53V5.006a.461.461%2C0%2C0%2C1%2C.46-.46h2.145a.461.461%2C0%2C0%2C1%2C.46.46V8.53h3.524a.461.461%2C0%2C0%2C1%2C.46.46Z%22 transform%3D%22translate(-0.563 -0.563)%22%2F%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center;width:20px;height:20px;display:inline-block;top:4px}::ng-deep main .remove-icon{position:relative;top:-4px}::ng-deep main .bg-white{background:#ffffff;border-radius:5px}::ng-deep main sub{bottom:0em;font-size:var(--fontsize12)}::ng-deep main hr{border-top:2px solid #C6C6C6}::ng-deep main .product-name{font-family:\"Helvetica Neue Regular\",sans-serif;font-size:var(--fontsize54)}::ng-deep main .colours-link{color:#000;text-decoration:underline;font-size:var(--fontsize14);cursor:pointer}::ng-deep main .colours-link:hover{color:#fa4d56}::ng-deep main .quantity{width:100%}::ng-deep main .quantity .simple{background:none;border:none}::ng-deep main .quantity table{min-width:80%}::ng-deep main .quantity table th{padding:0 10px}::ng-deep main .quantity table th:nth-child(3){min-width:92px}::ng-deep main .quantity table td{padding:10px;box-sizing:border-box}::ng-deep main .quantity table td:nth-child(1){width:80px;min-width:80px}::ng-deep main .quantity table td:nth-child(2){width:110px;min-width:110px}::ng-deep main .quantity table td:nth-child(3){width:100%;text-align:left;position:relative}::ng-deep main .quantity table td:nth-child(3) button{position:absolute;top:23%}::ng-deep main .quantity table td input{width:100%}::ng-deep main .quantity table td .dropleft .dropdown-menu{top:35px!important}::ng-deep main .quantity table td .dropleft .dropdown-menu .dropdown-item{cursor:pointer}::ng-deep main .quantity table td .dropleft .dropdown-toggle:before{display:none}::ng-deep main .quantity table td .side-menu-button{position:absolute;right:10px;top:16px}::ng-deep main .quantity table.accessories .prod-qty{max-width:65px}::ng-deep main .quantity table.has-bundle td:nth-child(3){width:95px}::ng-deep main .quantity table.has-bundle td:nth-child(4){width:170px}@media screen and (max-width: 767px){::ng-deep main .quantity table.has-bundle td:nth-child(4){display:none}}::ng-deep main .table.attributes-table{border:none}::ng-deep main .table.attributes-table th{background-color:#646363;font-family:\"Arial Bold\",sans-serif;color:#fff;height:35px;vertical-align:middle}::ng-deep main .table.attributes-table td{vertical-align:top}::ng-deep main .add-to-cart{background:#1D1D1B;width:100%;height:44px;font-family:\"Arial Bold\",sans-serif;text-align:center;color:#fff;font-size:var(--fontsize14)}::ng-deep main .add-to-cart:disabled{cursor:not-allowed;border:1px solid #A6A6A5;background:#A6A6A5}::ng-deep main .disable{cursor:not-allowed!important}::ng-deep main .tabs{display:flex;align-items:center;padding:15px;width:100%}::ng-deep main .tabs .tab-link{display:flex;width:31.7%;box-sizing:border-box;margin-right:2%;border:1px solid #1D1D1B;padding:0;background-color:#fff;align-items:center;cursor:pointer}::ng-deep main .tabs .tab-link:last-child{margin-right:0}::ng-deep main .tabs .tab-link .icon{width:44px;min-width:44px;height:44px;border-right:1px solid #1D1D1B}::ng-deep main .tabs .tab-link .icon.product-overiew{background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2226%22 height%3D%2222%22 viewBox%3D%220 0 26 22%22%3E%0D %3Cg id%3D%22Group_14012%22 data-name%3D%22Group 14012%22 transform%3D%22translate(-316 -1291)%22%3E%0D %3Cpath id%3D%22Rectangle_1493%22 data-name%3D%22Rectangle 1493%22 d%3D%22M1%2C1V5H5V1H1M0%2C0H6V6H0Z%22 transform%3D%22translate(316 1291)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1494%22 data-name%3D%22Rectangle 1494%22 d%3D%22M1%2C1V5H5V1H1M0%2C0H6V6H0Z%22 transform%3D%22translate(316 1299)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1495%22 data-name%3D%22Rectangle 1495%22 d%3D%22M1%2C1V5H5V1H1M0%2C0H6V6H0Z%22 transform%3D%22translate(316 1307)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Line_464%22 data-name%3D%22Line 464%22 d%3D%22M18%2C.5H0v-1H18Z%22 transform%3D%22translate(324 1294)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Line_465%22 data-name%3D%22Line 465%22 d%3D%22M18%2C.5H0v-1H18Z%22 transform%3D%22translate(324 1302)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Line_466%22 data-name%3D%22Line 466%22 d%3D%22M18%2C.5H0v-1H18Z%22 transform%3D%22translate(324 1310)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center}::ng-deep main .tabs .tab-link .icon.downloads{background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2221%22 height%3D%2221%22 viewBox%3D%220 0 21 21%22%3E%0D %3Cg id%3D%22Group_14014%22 data-name%3D%22Group 14014%22 transform%3D%22translate(0.5 0.5)%22%3E%0D %3Cpath id%3D%22Path_11231%22 data-name%3D%22Path 11231%22 d%3D%22M23.848%2C18.9%2C15.99%2C11.175h4.558V1.282h6.6v9.893h4.558Zm-5.414-6.724L23.848%2C17.5l5.414-5.322H26.147V2.282h-4.6v9.893Z%22 transform%3D%22translate(-13.85 -1.782)%22%2F%3E%0D %3Cpath id%3D%22Path_11232%22 data-name%3D%22Path 11232%22 d%3D%22M22.282%2C69.593h-21V62.275h1v6.318h19V62.275h1Z%22 transform%3D%22translate(-1.781 -49.093)%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center}::ng-deep main .tabs .tab-link .icon.related-products{position:relative;background:url(\"data:image/svg+xml,%3Csvg id%3D%22Group_14016%22 data-name%3D%22Group 14016%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2220%22 height%3D%2220%22 viewBox%3D%220 0 20 20%22%3E%0D %3Cpath id%3D%22Rectangle_1364%22 data-name%3D%22Rectangle 1364%22 d%3D%22M1%2C1V8H8V1H1M0%2C0H9V9H0Z%22 transform%3D%22translate(0 11)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1366%22 data-name%3D%22Rectangle 1366%22 d%3D%22M1%2C1V8H8V1H1M0%2C0H9V9H0Z%22 transform%3D%22translate(11 11)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1365%22 data-name%3D%22Rectangle 1365%22 d%3D%22M1%2C1V8H8V1H1M0%2C0H9V9H0Z%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cg id%3D%22Group_13038%22 data-name%3D%22Group 13038%22 transform%3D%22translate(11)%22%3E%0D %3Cpath id%3D%22Line_321%22 data-name%3D%22Line 321%22 d%3D%22M.5%2C9h-1V0h1Z%22 transform%3D%22translate(4.5)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Line_322%22 data-name%3D%22Line 322%22 d%3D%22M9%2C.5H0v-1H9Z%22 transform%3D%22translate(0 4.5)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center}::ng-deep main .tabs .tab-link .label{font-size:var(--fontsize14);font-family:\"Arial Bold\",sans-serif;text-transform:uppercase;text-align:center;width:100%;padding:8px}::ng-deep main .tabs .tab-link:hover,::ng-deep main .tabs .tab-link.active{color:#fff;background:#1D1D1B}::ng-deep main .tabs .tab-link:hover .icon,::ng-deep main .tabs .tab-link.active .icon{border-right:1px solid #ffffff}::ng-deep main .tabs .tab-link:hover .icon.product-overiew,::ng-deep main .tabs .tab-link.active .icon.product-overiew{background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2226%22 height%3D%2222%22 viewBox%3D%220 0 26 22%22%3E%0D %3Cg id%3D%22Group_14011%22 data-name%3D%22Group 14011%22 transform%3D%22translate(-316 -1291)%22%3E%0D %3Cpath id%3D%22Rectangle_1493%22 data-name%3D%22Rectangle 1493%22 d%3D%22M1%2C1V5H5V1H1M0%2C0H6V6H0Z%22 transform%3D%22translate(316 1291)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1494%22 data-name%3D%22Rectangle 1494%22 d%3D%22M1%2C1V5H5V1H1M0%2C0H6V6H0Z%22 transform%3D%22translate(316 1299)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1495%22 data-name%3D%22Rectangle 1495%22 d%3D%22M1%2C1V5H5V1H1M0%2C0H6V6H0Z%22 transform%3D%22translate(316 1307)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Line_464%22 data-name%3D%22Line 464%22 d%3D%22M18%2C.5H0v-1H18Z%22 transform%3D%22translate(324 1294)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Line_465%22 data-name%3D%22Line 465%22 d%3D%22M18%2C.5H0v-1H18Z%22 transform%3D%22translate(324 1302)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Line_466%22 data-name%3D%22Line 466%22 d%3D%22M18%2C.5H0v-1H18Z%22 transform%3D%22translate(324 1310)%22 fill%3D%22%23fff%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center}::ng-deep main .tabs .tab-link:hover .icon.downloads,::ng-deep main .tabs .tab-link.active .icon.downloads{background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2221%22 height%3D%2221%22 viewBox%3D%220 0 21 21%22%3E%0D %3Cg id%3D%22Group_14017%22 data-name%3D%22Group 14017%22 transform%3D%22translate(0.5 0.5)%22%3E%0D %3Cpath id%3D%22Path_11231%22 data-name%3D%22Path 11231%22 d%3D%22M23.848%2C18.9%2C15.99%2C11.175h4.558V1.282h6.6v9.893h4.558Zm-5.414-6.724L23.848%2C17.5l5.414-5.322H26.147V2.282h-4.6v9.893Z%22 transform%3D%22translate(-13.85 -1.782)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Path_11232%22 data-name%3D%22Path 11232%22 d%3D%22M22.282%2C69.593h-21V62.275h1v6.318h19V62.275h1Z%22 transform%3D%22translate(-1.781 -49.093)%22 fill%3D%22%23fff%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center}::ng-deep main .tabs .tab-link:hover .icon.related-products,::ng-deep main .tabs .tab-link.active .icon.related-products{background:url(\"data:image/svg+xml,%3Csvg id%3D%22Group_14015%22 data-name%3D%22Group 14015%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2220%22 height%3D%2220%22 viewBox%3D%220 0 20 20%22%3E%0D %3Cpath id%3D%22Rectangle_1364%22 data-name%3D%22Rectangle 1364%22 d%3D%22M1%2C1V8H8V1H1M0%2C0H9V9H0Z%22 transform%3D%22translate(0 11)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1366%22 data-name%3D%22Rectangle 1366%22 d%3D%22M1%2C1V8H8V1H1M0%2C0H9V9H0Z%22 transform%3D%22translate(11 11)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1365%22 data-name%3D%22Rectangle 1365%22 d%3D%22M1%2C1V8H8V1H1M0%2C0H9V9H0Z%22 fill%3D%22%23fff%22%2F%3E%0D %3Cg id%3D%22Group_13038%22 data-name%3D%22Group 13038%22 transform%3D%22translate(11)%22%3E%0D %3Cpath id%3D%22Line_321%22 data-name%3D%22Line 321%22 d%3D%22M.5%2C9h-1V0h1Z%22 transform%3D%22translate(4.5)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Line_322%22 data-name%3D%22Line 322%22 d%3D%22M9%2C.5H0v-1H9Z%22 transform%3D%22translate(0 4.5)%22 fill%3D%22%23fff%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center}.modal-title{font-family:\"Arial Bold\",sans-serif}.invite-pop-close{cursor:pointer}.more-content{display:flex;border:1px solid #548AF7;padding:8px;background-color:#edf5ff}.more-content img{position:relative;top:-12px}@media screen and (max-width: 767px){::ng-deep main .category-image{max-width:320px;width:100%!important}::ng-deep main .tabs{flex-direction:row;align-items:stretch}::ng-deep main .tabs .tab-link{align-items:center;flex-direction:column}::ng-deep main .tabs .tab-link .icon{border-right:none}}.alert-danger{margin:0 auto}\n"], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }] });
582
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: CustomProductQuantityFormComponent, decorators: [{
583
+ type: Component,
584
+ args: [{
585
+ selector: 'app-custom-product-quantity-form',
586
+ templateUrl: './custom-product-quantity-form.component.html',
587
+ styleUrls: ['./custom-product-quantity-form.component.scss'],
588
+ }]
589
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i2.CartService }, { type: i3.Router }, { type: i4.ProductService }, { type: i4.CmsService }, { type: i5.NgbModal }, { type: i4.ActiveCartService }, { type: i6.CurrentProductService }]; }, propDecorators: { hasBundle: [{
590
+ type: Input
591
+ }], productCode: [{
592
+ type: Input
593
+ }], productDetails: [{
594
+ type: Input
595
+ }], unitType: [{
596
+ type: Input
597
+ }], accessoriesPrice: [{
598
+ type: Input
599
+ }], selectedColour: [{
600
+ type: Input
601
+ }], cuttingValidation: [{
602
+ type: Input
603
+ }], finishedAvailableColours: [{
604
+ type: Input
605
+ }], isFinishedProduct: [{
606
+ type: Input
607
+ }], isFlashingProduct: [{
608
+ type: Input
609
+ }], listView: [{
610
+ type: Input
611
+ }], closeInviteModal: [{
612
+ type: ViewChild,
613
+ args: ["closeInviteModal"]
614
+ }], closebutton: [{
615
+ type: ViewChild,
616
+ args: ["closebutton"]
617
+ }], updateCartEntires: [{
618
+ type: Output
619
+ }], addMoreClicked: [{
620
+ type: Output
621
+ }] } });
622
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXByb2R1Y3QtcXVhbnRpdHktZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9idWlsZGluZ3Byb2R1Y3RfbGlicmFyeS9zcmMvbGliL3NoYXJlZC9jdXN0b20tY2FydC1kZXRhaWwvY3VzdG9tLXByb2R1Y3QtcXVhbnRpdHktZm9ybS9jdXN0b20tcHJvZHVjdC1xdWFudGl0eS1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J1aWxkaW5ncHJvZHVjdF9saWJyYXJ5L3NyYy9saWIvc2hhcmVkL2N1c3RvbS1jYXJ0LWRldGFpbC9jdXN0b20tcHJvZHVjdC1xdWFudGl0eS1mb3JtL2N1c3RvbS1wcm9kdWN0LXF1YW50aXR5LWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxTQUFTLEVBSVQsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUEwQixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7O0FBU3ZFLE1BQU0sT0FBTyxrQ0FBa0M7SUF3RDdDLFlBQ1UsV0FBd0IsRUFDeEIsR0FBc0IsRUFDdEIsV0FBd0IsRUFDeEIsTUFBYyxFQUNkLGNBQThCLEVBQzlCLFVBQXNCLEVBQ3RCLFlBQXNCLEVBQ3RCLGlCQUFvQyxFQUNwQyxxQkFBNEM7UUFSNUMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsUUFBRyxHQUFI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QUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7O2dJQXJxQlUsa0NBQWtDO29IQUFsQyxrQ0FBa0MsMndCQzFCL0MseThYQW1VQTs0RkR6U2Esa0NBQWtDO2tCQUw5QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQ0FBa0M7b0JBQzVDLFdBQVcsRUFBRSwrQ0FBK0M7b0JBQzVELFNBQVMsRUFBRSxDQUFDLCtDQUErQyxDQUFDO2lCQUM3RDtrVUFXVSxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQTRCeUIsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFDSCxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBRWQsaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEN1cnJlbnRQcm9kdWN0U2VydmljZSB9IGZyb20gJ0BzcGFydGFjdXMvc3RvcmVmcm9udCc7XHJcbmltcG9ydCB7IEFjdGl2ZUNhcnRTZXJ2aWNlLCBDbXNTZXJ2aWNlLCBQcm9kdWN0LCBQcm9kdWN0U2VydmljZSB9IGZyb20gJ0BzcGFydGFjdXMvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWNjZXNzb3JpZXNRdWFudGl0eSwgUHJvZHVjdFF1YW50aXR5IH0gZnJvbSAnLi4vLi4vQ3VzdG9tUHJvZHVjdCc7XHJcbmltcG9ydCB7IFJlZ2V4VmFsaWRhdG9yLCBSZWdleENvbnN0YW50cyB9IGZyb20gJy4uLy4uL3JlZ0V4LnZhbGlkYXRvcic7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtY3VzdG9tLXByb2R1Y3QtcXVhbnRpdHktZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1wcm9kdWN0LXF1YW50aXR5LWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2N1c3RvbS1wcm9kdWN0LXF1YW50aXR5LWZvcm0uY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEN1c3RvbVByb2R1Y3RRdWFudGl0eUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgZW52OiBhbnkgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdlbnYnKTtcclxuICBlbnZpcm9ubWVudCA6IGFueSA9IEpTT04ucGFyc2UodGhpcy5lbnYpO1xyXG4gIGlzRGVza3RvcDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNNb2JpbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1RhYmxldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICB0b3RhbExlbmd0aDogYW55O1xyXG4gIHRvdGFsUHJpY2U6IGFueSA9IFwiMC4wXCI7XHJcblxyXG4gIEBJbnB1dCgpIGhhc0J1bmRsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHByb2R1Y3RDb2RlOiBhbnk7XHJcbiAgQElucHV0KCkgcHJvZHVjdERldGFpbHM6IGFueTtcclxuICBASW5wdXQoKSB1bml0VHlwZTogYW55ID0gXCJwZXIgTE1cIjtcclxuICBASW5wdXQoKSBhY2Nlc3Nvcmllc1ByaWNlID0gMDtcclxuICBASW5wdXQoKSBzZWxlY3RlZENvbG91cjogYW55ID0gbnVsbDtcclxuICBASW5wdXQoKSBjdXR0aW5nVmFsaWRhdGlvbjogYW55O1xyXG4gIEBJbnB1dCgpIGZpbmlzaGVkQXZhaWxhYmxlQ29sb3VyczogYW55O1xyXG4gIEBJbnB1dCgpIGlzRmluaXNoZWRQcm9kdWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgaXNGbGFzaGluZ1Byb2R1Y3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBsaXN0VmlldzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByb2R1Y3RGb3JtOiBhbnkgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHJcbiAgZGlzYWJsZUFkZE1vcmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgYnVuZGxlTGlzdDogYW55ID0gW107XHJcblxyXG4gIGVycm9ySW5kZXg6IGFueSA9IFtdO1xyXG4gIGhhc1Byb2RSZWZJbmRleDogYW55ID0gW107XHJcbiAgaGFzUHJvZFJlZjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGhhc01pbmxlbmd0aEVycm9yOiBhbnkgPSBbXTtcclxuICByb3dJbmRleCA9IDA7XHJcbiAgY2FydElkOiBhbnk7XHJcblxyXG4gIHNob3dXYWl0Q3Vyc29yID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcclxuXHJcbiAgYWRkVG9DYXJ0RXJyb3I6IGFueSA9IG51bGw7XHJcbiAgbW9kYWxCdW5kbGVGb3JtOiBhbnkgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBlZGl0UHJvZEJ1bmRsZTogYW55ID0gXCJcIjtcclxuICBlZGl0UHJvZFJlZjogYW55ID0gXCJcIjtcclxuICBzZWxlY3RlZEluZGV4OiBhbnkgPSBudWxsO1xyXG5cclxuICBoYXNEYXRhOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByb2R1Y3QkOiBPYnNlcnZhYmxlPFByb2R1Y3QgfCBudWxsPiA9XHJcbiAgICB0aGlzLmN1cnJlbnRQcm9kdWN0U2VydmljZS5nZXRQcm9kdWN0KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJjbG9zZUludml0ZU1vZGFsXCIpIGNsb3NlSW52aXRlTW9kYWw6IGFueTtcclxuICBAVmlld0NoaWxkKFwiY2xvc2VidXR0b25cIikgY2xvc2VidXR0b246IGFueTtcclxuXHJcbiAgQE91dHB1dCgpIHVwZGF0ZUNhcnRFbnRpcmVzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgYWRkTW9yZUNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBzY3JlZW5XaWR0aDogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBwcm9kdWN0U2VydmljZTogUHJvZHVjdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNtc1NlcnZpY2U6IENtc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICBwcml2YXRlIGFjdGl2ZUNhcnRTZXJ2aWNlOiBBY3RpdmVDYXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgY3VycmVudFByb2R1Y3RTZXJ2aWNlOiBDdXJyZW50UHJvZHVjdFNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2FydE9iajogYW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzcGFydGFjdXPimr9kaW1vbmQtc3Bh4pq/Y2FydFwiKTtcclxuICAgIHRoaXMuY2FydElkID0gSlNPTi5wYXJzZShjYXJ0T2JqKT8uYWN0aXZlO1xyXG4gICAgdGhpcy5zY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoICsgXCJweFwiO1xyXG4gICAgaWYgKHRoaXMucHJvZHVjdERldGFpbHMpIHtcclxuICAgICAgdGhpcy5jcmVhdGVQcm9kdWN0Rm9ybSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKCFjaGFuZ2VzPy5wcm9kdWN0RGV0YWlscz8uZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgdGhpcy51cGRhdGVGb3JtRGV0YWlscygpO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGb3JtRGV0YWlscygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRmluaXNoZWRQcm9kdWN0KSB7XHJcbiAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbMF0/LnBhdGNoVmFsdWUoe1xyXG4gICAgICAgIHByb2RRdHk6IHRoaXMucHJvZHVjdERldGFpbHM/LnF1YW50aXR5LFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucHJvZHVjdERldGFpbHM/LnN1YkxpbmVDb25maWdJbmZvcz8uZm9yRWFjaChcclxuICAgICAgICAodmFsOiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5pc051bGxPckVtcHR5KHZhbD8uYnVuZGxlTmFtZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5oYXNCdW5kbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RGb3JtPy5nZXQoXCJidW5kbGluZ1wiKT8uc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0uY29udHJvbHNbaW5kZXhdLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgICBwcm9kQnVuZGxlOiB2YWw/LmJ1bmRsZU5hbWUsXHJcbiAgICAgICAgICAgIHByb2RMZW46IHRoaXMucGFkM0RpZ2l0cyh2YWw/Lmxlbmd0aCksXHJcbiAgICAgICAgICAgIHByb2RRdHk6IHZhbD8ucXVhbnRpdHksXHJcbiAgICAgICAgICAgIHByb2RSZWY6IHZhbD8ucmVmZXJlbmNlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ3JlYXRlIGEgUHJvZHVjdCBRdWFudGl0eSBGb3JtXHJcbiAgY3JlYXRlUHJvZHVjdEZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjY2Vzc29yaWVzUHJpY2UgPSAwO1xyXG4gICAgdGhpcy50b3RhbExlbmd0aCA9IG51bGw7XHJcbiAgICB0aGlzLnRvdGFsUHJpY2UgPSBcIjAuMFwiO1xyXG4gICAgdGhpcy5oYXNCdW5kbGUgPSBmYWxzZTtcclxuICAgIHRoaXMuZGlzYWJsZUFkZE1vcmUgPSBmYWxzZTtcclxuICAgIHRoaXMuYnVuZGxlTGlzdCA9IFtdO1xyXG4gICAgdGhpcy5lcnJvckluZGV4ID0gW107XHJcbiAgICB0aGlzLmhhc1Byb2RSZWZJbmRleCA9IFtdO1xyXG4gICAgdGhpcy5yb3dJbmRleCA9IDA7XHJcbiAgICB0aGlzLnByb2R1Y3RGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgICB0aGlzLmFkZFRvQ2FydEVycm9yID0gbnVsbDtcclxuICAgIHRoaXMucHJvZHVjdEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgYnVuZGxpbmc6IFtcIlwiXSxcclxuICAgICAgcHJvZHVjdFF1YW50aXR5OiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtdKSxcclxuICAgICAgam9iUmVmZXJlbmNlOiBbXCJcIiwgW1JlZ2V4VmFsaWRhdG9yKFJlZ2V4Q29uc3RhbnRzLkpPQl9SRUZFUkVOQ0UpXV0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmVkaXRQcm9kQnVuZGxlID0gXCJcIjtcclxuICAgIHRoaXMuZWRpdFByb2RSZWYgPSBcIlwiO1xyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gbnVsbDtcclxuICAgIHRoaXMuaGFzUHJvZFJlZiA9IGZhbHNlO1xyXG4gICAgdGhpcy5oYXNNaW5sZW5ndGhFcnJvciA9IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLmlzRmluaXNoZWRQcm9kdWN0KSB7XHJcbiAgICAgIHRoaXMuYWRkUHJvZHVjdFF1YW50aXR5Rm9ybUdyb3VwKCk7XHJcbiAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbMF0/LnBhdGNoVmFsdWUoe1xyXG4gICAgICAgIHByb2RRdHk6IHRoaXMucHJvZHVjdERldGFpbHM/LnF1YW50aXR5LFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubW9kYWxCdW5kbGVGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgICAgbW9kQnVuZGxlOiBbXCJcIiwgW1JlZ2V4VmFsaWRhdG9yKFJlZ2V4Q29uc3RhbnRzLkJVTkRMRV9OQU1FKV1dLFxyXG4gICAgICAgIG1vZFJlZjogW1wiXCIsIFtSZWdleFZhbGlkYXRvcihSZWdleENvbnN0YW50cy5KT0JfUkVGRVJFTkNFKV1dLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5wcm9kdWN0RGV0YWlscz8uc3ViTGluZUNvbmZpZ0luZm9zPy5mb3JFYWNoKFxyXG4gICAgICAgICh2YWw6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hZGRQcm9kdWN0UXVhbnRpdHlGb3JtR3JvdXAoKTtcclxuICAgICAgICAgIGlmICghdGhpcy5pc051bGxPckVtcHR5KHZhbD8uYnVuZGxlTmFtZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5oYXNCdW5kbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RGb3JtPy5nZXQoXCJidW5kbGluZ1wiKT8uc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0uY29udHJvbHNbaW5kZXhdLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgICBwcm9kQnVuZGxlOiB2YWw/LmJ1bmRsZU5hbWUsXHJcbiAgICAgICAgICAgIHByb2RMZW46IHRoaXMucGFkM0RpZ2l0cyh2YWw/Lmxlbmd0aCksXHJcbiAgICAgICAgICAgIHByb2RRdHk6IHZhbD8ucXVhbnRpdHksXHJcbiAgICAgICAgICAgIHByb2RSZWY6IHZhbD8ucmVmZXJlbmNlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLy8gVXBkYXRpbmcgdGhlIEJ1bmRsZVxyXG4gIHVwZGF0ZUJ1bmRsaW5nKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFzQnVuZGxlID0gZXZlbnQuY3VycmVudFRhcmdldD8uY2hlY2tlZCA9PT0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmhhc0J1bmRsZSkge1xyXG4gICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzPy5mb3JFYWNoKFxyXG4gICAgICAgIChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlU2FtZUJ1bmRsZVJlZmVyZW5jZShudWxsLCBpbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVUb3RhbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgaWYgYW55IHZhbHVlIGlzIGVtcHR5IG9yIHVuZGVmaW5lZFxyXG4gIGlzTnVsbE9yRW1wdHkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gdW5kZWZpbmVkIHx8IHZhbHVlID09IFwiXCI7XHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBmb3IgYW55IGVycm9ycyB3aGlsZSB1cGRhdGluZyB0aGUgcXVhbnRpdHlcclxuICBoYXNFcnJvckluZGV4KGluZGV4OiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmVycm9ySW5kZXhbaW5kZXhdID09IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBpZiBhbnkgU2FtZSBSZWZlcmVuY2UgRXJyb3JcclxuICBoYXNQcm9kUmVmRXJyb3JJbmRleChpbmRleDogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNQcm9kUmVmSW5kZXhbaW5kZXhdID09IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyBHcm91cCB0aGUgUXVhbnRpdHkgdmFsdWVzIGJhc2VkIG9uIGJ1bmRsZVxyXG4gIGdyb3VwQnlCdW5kbGUoaXRlbXM6IGFueSwga2V5OiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZShcclxuICAgICAgKHJlc3VsdDogYW55LCBpdGVtOiBhbnkpID0+ICh7XHJcbiAgICAgICAgLi4ucmVzdWx0LFxyXG4gICAgICAgIFtpdGVtW2tleV1dOiBbLi4uKHJlc3VsdFtpdGVtW2tleV1dIHx8IFtdKSwgaXRlbV0sXHJcbiAgICAgIH0pLFxyXG4gICAgICB7fVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIENoZWNrIHRoZSB0b3RhbCBidW5kbGUgd2VpZ2h0IGFuZCB1cGRhdGUgdGhlIGVycm9yIGlmIGl0IHJlYWNoZXMgdG8gbWF4aW11bSBidW5kbGUgc2l6ZSBmb3IgZWFjaCBidW5kbGVcclxuICBjaGVja1RvdGFsQnVuZGxlV2VpZ2h0KGZvcm1WYWx1ZXM6IGFueSk6IGFueSB7XHJcbiAgICBsZXQgZ3JvdXBUb3RhbCA9IDA7XHJcbiAgICBmb3JtVmFsdWVzPy5mb3JFYWNoKChjdXJyZW50VmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBxdHkgPSBwYXJzZUZsb2F0KGN1cnJlbnRWYWx1ZT8ucHJvZFF0eSk7XHJcbiAgICAgIGNvbnN0IGxlbiA9IHBhcnNlRmxvYXQoY3VycmVudFZhbHVlPy5wcm9kTGVuKTtcclxuICAgICAgaWYgKCF0aGlzLmlzTnVsbE9yRW1wdHkocXR5KSAmJiAhdGhpcy5pc051bGxPckVtcHR5KGxlbikpIHtcclxuICAgICAgICBncm91cFRvdGFsICs9IHF0eSAqIGxlbjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBncm91cFRvdGFsID0gZ3JvdXBUb3RhbCAqICh0aGlzLmN1dHRpbmdWYWxpZGF0aW9uPy53ZWlnaHRQZXJMTSB8fCAxKTtcclxuICAgIHJldHVybiBncm91cFRvdGFsID4gKHRoaXMuY3V0dGluZ1ZhbGlkYXRpb24/Lm1heEJ1bmRsZUxvYWQgfHwgMTAwMCk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgdGhlIGxhc3Qgcm93IG9mIGEgYnVuZGxlIGJhc2VkIG9uIGJ1bmRsZSBuYW1lXHJcbiAgZ2V0TGFzdEJ1bmRsZUluZGV4KGJ1bmRsZU5hbWU6IGFueSk6IGFueSB7XHJcbiAgICBsZXQgaW5kZXhWYWx1ZTogYW55ID0gbnVsbDtcclxuICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybVxyXG4gICAgICA/LmdldFJhd1ZhbHVlKClcclxuICAgICAgPy5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZWxlbWVudD8ucHJvZEJ1bmRsZT8udG9VcHBlckNhc2UoKSA9PSBidW5kbGVOYW1lPy50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICBpbmRleFZhbHVlID0gaW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIHJldHVybiBpbmRleFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0IHRoZSBSZWZlcmVuY2UgdmFsdWUgb2YgdGhlIHNhbWUgYnVuZGxlIGFuZCB1cGRhdGVcclxuICBnZXRQcmV2QnVuZGxlUmVmZXJlbmNlVmFsdWUoaW5kZXg6IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBidW5kbGVOYW1lID1cclxuICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID09IG51bGxcclxuICAgICAgICA/IHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdXHJcbiAgICAgICAgICAgID8uZ2V0KFwicHJvZEJ1bmRsZVwiKVxyXG4gICAgICAgICAgICA/LnZhbHVlPy50b1VwcGVyQ2FzZSgpXHJcbiAgICAgICAgOiB0aGlzLm1vZGFsQnVuZGxlRm9ybT8uZ2V0KFwibW9kQnVuZGxlXCIpPy52YWx1ZT8udG9VcHBlckNhc2UoKTtcclxuICAgIGxldCByZWZWYWx1ZSA9IFwiXCI7XHJcbiAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzLmZvckVhY2goKGVsZW1lbnQ6IGFueSwgaW5kOiBhbnkpID0+IHtcclxuICAgICAgY29uc3Qgb3RoZXJSZWZWYWx1ZSA9XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRdPy5nZXQoXCJwcm9kUmVmXCIpPy52YWx1ZTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGVsZW1lbnQ/LnZhbHVlPy5wcm9kQnVuZGxlPy50b1VwcGVyQ2FzZSgpID09XHJcbiAgICAgICAgICBidW5kbGVOYW1lPy50b1VwcGVyQ2FzZSgpICYmXHJcbiAgICAgICAgKGluZCAhPSBpbmRleCB8fCB0aGlzLnNlbGVjdGVkSW5kZXggIT0gbnVsbCkgJiZcclxuICAgICAgICAhdGhpcy5pc051bGxPckVtcHR5KG90aGVyUmVmVmFsdWUpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJlZlZhbHVlID0gb3RoZXJSZWZWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVmVmFsdWUgfHwgXCJcIjtcclxuICB9XHJcblxyXG4gIC8vIENoZWNrIGlmIFNhbWUgUmVmcmVuY2UgaXMgYWxyZWFkeSB1c2VkXHJcbiAgY2hlY2tIYXNTYW1lUmVmZXJlbmNlKFxyXG4gICAgaW5kZXg6IGFueSxcclxuICAgIGN1cnJlbnRSZWZlcmVuY2U6IGFueSxcclxuICAgIGJ1bmRsZU5hbWU6IGFueVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGhhc1JlZiA9IGZhbHNlO1xyXG4gICAgY29uc3QgcHJvZFJlZlZhbHVlcyA9IHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHM/LmZpbHRlcihcclxuICAgICAgKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICBlbGVtZW50Py52YWx1ZT8ucHJvZFJlZiA9PSBjdXJyZW50UmVmZXJlbmNlICYmXHJcbiAgICAgICAgICBlbGVtZW50Py52YWx1ZT8ucHJvZEJ1bmRsZT8udG9VcHBlckNhc2UoKSAhPVxyXG4gICAgICAgICAgICBidW5kbGVOYW1lPy50b1VwcGVyQ2FzZSgpICYmXHJcbiAgICAgICAgICAhdGhpcy5pc051bGxPckVtcHR5KGN1cnJlbnRSZWZlcmVuY2UpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIGlmIChwcm9kUmVmVmFsdWVzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuaGFzUHJvZFJlZkluZGV4W2luZGV4XSA9IHRydWU7XHJcbiAgICAgIGhhc1JlZiA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmhhc1Byb2RSZWZJbmRleFtpbmRleF0gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHJldHVybiBoYXNSZWY7XHJcbiAgfVxyXG5cclxuICAvLyBVcGRhdGUgdGhlIFJlZmVyZW5jZSBWYWx1ZSBpZiBhbHJlYWR5IHRoZSBzYW1lIGJ1bmRsZSBpcyBwcmVzZW50XHJcbiAgdXBkYXRlU2FtZUJ1bmRsZVJlZmVyZW5jZShcclxuICAgIGV2ZW50OiBhbnksXHJcbiAgICBpbmRleDogYW55LFxyXG4gICAgaXNSZWZlcmVuY2U6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgYnVuZGxlTmFtZSA9XHJcbiAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoXCJwcm9kQnVuZGxlXCIpPy52YWx1ZSB8fFxyXG4gICAgICB0aGlzLm1vZGFsQnVuZGxlRm9ybS5nZXQoXCJtb2RCdW5kbGVcIik/LnZhbHVlO1xyXG4gICAgY29uc3QgbmV3UmVmVmFsdWUgPVxyXG4gICAgICBldmVudCAhPSBudWxsXHJcbiAgICAgICAgPyBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgOiB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KFwicHJvZFJlZlwiKT8udmFsdWUgfHxcclxuICAgICAgICAgIHRoaXMubW9kYWxCdW5kbGVGb3JtPy5nZXQoXCJtb2RSZWZcIikudmFsdWU7XHJcbiAgICBpc1JlZmVyZW5jZSA9IGlzUmVmZXJlbmNlXHJcbiAgICAgID8gdGhpcy5jaGVja0hhc1NhbWVSZWZlcmVuY2UoaW5kZXgsIG5ld1JlZlZhbHVlLCBidW5kbGVOYW1lKVxyXG4gICAgICA6IGZhbHNlO1xyXG4gICAgaWYgKCFpc1JlZmVyZW5jZSkge1xyXG4gICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0uY29udHJvbHMuZm9yRWFjaCgoZWxlbWVudDogYW55LCBpbmQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGVsZW1lbnQ/LnZhbHVlPy5wcm9kQnVuZGxlPy50b1VwcGVyQ2FzZSgpID09XHJcbiAgICAgICAgICAgIGJ1bmRsZU5hbWU/LnRvVXBwZXJDYXNlKCkgJiZcclxuICAgICAgICAgIGluZCAhPSBpbmRleCAmJlxyXG4gICAgICAgICAgIXRoaXMuaXNOdWxsT3JFbXB0eShuZXdSZWZWYWx1ZSkgJiZcclxuICAgICAgICAgICF0aGlzLmlzTnVsbE9yRW1wdHkoYnVuZGxlTmFtZSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kXVxyXG4gICAgICAgICAgICA/LmdldChcInByb2RSZWZcIilcclxuICAgICAgICAgICAgPy5zZXRWYWx1ZShuZXdSZWZWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8vIFVwZGF0ZSB0aGUgc2FtZSBCdW5kbGUgUmVmcmVuY2UgVmFsdWUgdG8gYWxsIG90aGVyIEJ1bmRsZXMgaWYgYW55IGNoYW5nZXMgaW4gUmVmZXJlbmNlIFZhbHVlXHJcbiAgcG9wdWxhdGVTYW1lQnVuZGxlUmVmZXJlbmNlKGV2ZW50OiBhbnksIGluZGV4OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBjb25zdCBwcmV2UmVmVmFsdWUgPSB0aGlzLmdldFByZXZCdW5kbGVSZWZlcmVuY2VWYWx1ZShpbmRleCk7XHJcbiAgICAgIGlmICghdGhpcy5pc051bGxPckVtcHR5KHByZXZSZWZWYWx1ZSkpIHtcclxuICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XVxyXG4gICAgICAgICAgLmdldChcInByb2RSZWZcIilcclxuICAgICAgICAgID8uc2V0VmFsdWUocHJldlJlZlZhbHVlKTtcclxuICAgICAgICB0aGlzLm1vZGFsQnVuZGxlRm9ybS5nZXQoXCJtb2RSZWZcIikuc2V0VmFsdWUocHJldlJlZlZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLmlzTnVsbE9yRW1wdHkodGhpcy5nZXRQcmV2QnVuZGxlUmVmZXJlbmNlVmFsdWUoaW5kZXgpKSkge1xyXG4gICAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdXHJcbiAgICAgICAgICA/LmdldChcInByb2RSZWZcIilcclxuICAgICAgICAgID8uc2V0VmFsdWUodGhpcy5nZXRQcmV2QnVuZGxlUmVmZXJlbmNlVmFsdWUoaW5kZXgpIHx8IFwiXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBVcGRhdGUgdGhlIEJ1bmRsZSBMaXN0IGlmIG1vcmUgdGhhbiBvbmUgYnVuZGxlL3Jvd3NcclxuICB1cGRhdGVCdW5kbGVMaXN0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybVZhbHVlcyA9IHRoaXMuZ3JvdXBCeUJ1bmRsZShcclxuICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5nZXRSYXdWYWx1ZSgpLFxyXG4gICAgICBcInByb2RCdW5kbGVcIlxyXG4gICAgKTtcclxuICAgIGlmIChPYmplY3Qua2V5cyhmb3JtVmFsdWVzKT8ubGVuZ3RoID4gMSkge1xyXG4gICAgICB0aGlzLmJ1bmRsZUxpc3QgPSBPYmplY3Qua2V5cyhmb3JtVmFsdWVzKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8vIEdldCBCdW5kbGUgdmFsdWVzIG9ubHkgZm9yIG1vYmlsZSB2aWV3XHJcbiAgZ2V0QnVuZGxlVmFsdWVzKGluZGV4OiBhbnkpOiBhbnkge1xyXG4gICAgY29uc3QgYnVuZGxlVmFsdWVzID0gW107XHJcbiAgICBidW5kbGVWYWx1ZXMucHVzaChcclxuICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF0/LmdldChcInByb2RCdW5kbGVcIik/LnZhbHVlXHJcbiAgICApO1xyXG4gICAgYnVuZGxlVmFsdWVzLnB1c2goXHJcbiAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoXCJwcm9kUmVmXCIpPy52YWx1ZVxyXG4gICAgKTtcclxuICAgIHJldHVybiBidW5kbGVWYWx1ZXM7XHJcbiAgfVxyXG5cclxuICAvLyBFZGl0IEJ1bmRsZSBWYWx1ZXNcclxuICBlZGl0QnVuZGxlVmFsdWUoaW5kZXg6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaW5kZXg7XHJcbiAgICB0aGlzLm1vZGFsQnVuZGxlRm9ybVxyXG4gICAgICA/LmdldChcIm1vZEJ1bmRsZVwiKVxyXG4gICAgICAuc2V0VmFsdWUoXHJcbiAgICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF1cclxuICAgICAgICAgID8uZ2V0KFwicHJvZEJ1bmRsZVwiKVxyXG4gICAgICAgICAgPy52YWx1ZT8udG9VcHBlckNhc2UoKVxyXG4gICAgICApO1xyXG4gICAgdGhpcy5tb2RhbEJ1bmRsZUZvcm1cclxuICAgICAgPy5nZXQoXCJtb2RSZWZcIilcclxuICAgICAgPy5zZXRWYWx1ZShcclxuICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KFwicHJvZFJlZlwiKT8udmFsdWVcclxuICAgICAgKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8vIFVwZGF0ZS9TYXZlIEJ1bmRsZSB2YWx1ZXNcclxuICBzYXZlQnVuZGxlRGV0YWlscyhldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW3RoaXMuc2VsZWN0ZWRJbmRleF1cclxuICAgICAgPy5nZXQoXCJwcm9kQnVuZGxlXCIpXHJcbiAgICAgID8uc2V0VmFsdWUodGhpcy5tb2RhbEJ1bmRsZUZvcm0/LmdldChcIm1vZEJ1bmRsZVwiKT8udmFsdWUudG9VcHBlckNhc2UoKSk7XHJcbiAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW3RoaXMuc2VsZWN0ZWRJbmRleF1cclxuICAgICAgPy5nZXQoXCJwcm9kUmVmXCIpXHJcbiAgICAgID8uc2V0VmFsdWUodGhpcy5tb2RhbEJ1bmRsZUZvcm0/LmdldChcIm1vZFJlZlwiKT8udmFsdWUpO1xyXG5cclxuICAgIHRoaXMudXBkYXRlU2FtZUJ1bmRsZVJlZmVyZW5jZShudWxsLCB0aGlzLnNlbGVjdGVkSW5kZXgsIHRydWUpO1xyXG4gICAgdGhpcy51cGRhdGVUb3RhbCgpO1xyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLmNsb3NlYnV0dG9uLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIC8vIFVwZGF0ZSBDYXJ0IERlYXRpbHNcclxuICB1cGRhdGVDYXJ0RGV0YWlscygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzVmFsaWRGb3JtKCkpIHtcclxuICAgICAgbGV0IHBheUxvYWQ6IGFueSA9IHt9O1xyXG5cclxuICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZFByb2R1Y3QpIHtcclxuICAgICAgICBwYXlMb2FkID0ge1xyXG4gICAgICAgICAgcXVhbnRpdHk6IHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbMF0uZ2V0KFwicHJvZFF0eVwiKT8udmFsdWUsXHJcbiAgICAgICAgICBwcm9kdWN0OiB7XHJcbiAgICAgICAgICAgIGNvZGU6IHRoaXMucHJvZHVjdERldGFpbHM/LnByb2R1Y3Q/LmNvZGUsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgam9iUmVmZXJlbmNlOiB0aGlzLnByb2R1Y3REZXRhaWxzPy5wcm9kdWN0Py5qb2JSZWZlcmVuY2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXlMb2FkID0ge1xyXG4gICAgICAgICAgcXVhbnRpdHk6IDEsXHJcbiAgICAgICAgICBjb25maWd1cmF0aW9uSW5mb3M6IFt0aGlzLnByb2R1Y3REZXRhaWxzPy5jb25maWdWYWx1ZXNdLFxyXG4gICAgICAgICAgc3ViTGluZUNvbmZpZ0luZm9zOiBbXSxcclxuICAgICAgICAgIGpvYlJlZmVyZW5jZTogdGhpcy5wcm9kdWN0RGV0YWlscz8ucHJvZHVjdD8uam9iUmVmZXJlbmNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9scz8uZm9yRWFjaChcclxuICAgICAgICAgIChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29uZmlnSW5mb3M6IGFueSA9IHtcclxuICAgICAgICAgICAgICBjb25maWd1cmF0b3JUeXBlOiBcIkNVVFRJTkdcIixcclxuICAgICAgICAgICAgICBxdWFudGl0eTogZWxlbWVudD8udmFsdWU/LnByb2RRdHksXHJcbiAgICAgICAgICAgICAgbGVuZ3RoOiBlbGVtZW50Py52YWx1ZT8ucHJvZExlbixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzQnVuZGxlICYmIGVsZW1lbnQ/LnZhbHVlPy5wcm9kQnVuZGxlKSB7XHJcbiAgICAgICAgICAgICAgY29uZmlnSW5mb3MuYnVuZGxlTmFtZSA9IGVsZW1lbnQ/LnZhbHVlPy5wcm9kQnVuZGxlO1xyXG4gICAgICAgICAgICAgIGNvbmZpZ0luZm9zLnJlZmVyZW5jZSA9IGVsZW1lbnQ/LnZhbHVlPy5wcm9kUmVmO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBheUxvYWQuc3ViTGluZUNvbmZpZ0luZm9zLnB1c2goY29uZmlnSW5mb3MpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgcGF5TG9hZD8uY29uZmlndXJhdGlvbkluZm9zICYmXHJcbiAgICAgICAgICBwYXlMb2FkPy5jb25maWd1cmF0aW9uSW5mb3M/Lmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgIHRoaXMuaXNOdWxsT3JFbXB0eShwYXlMb2FkPy5jb25maWd1cmF0aW9uSW5mb3NbMF0pXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBkZWxldGUgcGF5TG9hZD8uY29uZmlndXJhdGlvbkluZm9zO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYXJ0U2VydmljZVxyXG4gICAgICAgIC51cGRhdGVDYXJ0RW50cnkodGhpcy5jYXJ0SWQsIHRoaXMucHJvZHVjdERldGFpbHM/LmVudHJ5TnVtYmVyLCBwYXlMb2FkKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICBpZiAocmVzcG9uc2U/LnN0YXR1c0NvZGU/LnRvTG93ZXJDYXNlKCkgPT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2FydFNlcnZpY2UucmVsb2FkQWN0aXZlQ2FydCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0RW50aXJlcy5lbWl0KHRydWUpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2U/LmNvbmZpZ3VyYXRpb25MaW5lTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JJbmRleFtyZXNwb25zZT8uY29uZmlndXJhdGlvbkxpbmVOdW1iZXIgLSAxXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRvQ2FydEVycm9yID1cclxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/Lm1lc3NhZ2UgfHxcclxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/LmVycm9yTWVzc2FnZSB8fFxyXG4gICAgICAgICAgICAgICAgICByZXNwb25zZT8uc3RhdHVzTWVzc2FnZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL3RoaXMudXBkYXRlQ2FydEVudGlyZXMuZW1pdCh0aGlzLmFkZFRvQ2FydEVycm9yKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFRvQ2FydEVycm9yID1cclxuICAgICAgICAgICAgICBlcnJvcj8uZXJyb3I/LmVycm9yc1swXT8ubWVzc2FnZSB8fFxyXG4gICAgICAgICAgICAgIGVycm9yPy5lcnJvcj8uZXJyb3JzWzBdPy5lcnJvck1lc3NhZ2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFVwZGF0ZSBUb3RhbCBQcmljZSBhbmQgVG90YWwgbGVuZ3RoIGJhc2VkIG9uIHVzZXIgaW5wdXRzIG9uIGVhY2ggcm93XHJcbiAgdXBkYXRlVG90YWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRvdGFsTGVuZ3RoID0gMDtcclxuICAgIHRoaXMudG90YWxQcmljZSA9IDA7XHJcbiAgICBpZiAoIXRoaXMuaXNGaW5pc2hlZFByb2R1Y3QpIHtcclxuICAgICAgY29uc3QgZm9ybVZhbHVlcyA9IHRoaXMuZ3JvdXBCeUJ1bmRsZShcclxuICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmdldFJhd1ZhbHVlKCksXHJcbiAgICAgICAgXCJwcm9kQnVuZGxlXCJcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtLmNvbnRyb2xzLmZvckVhY2goKGVsZW1lbnQ6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF0eSA9IHBhcnNlRmxvYXQoZWxlbWVudD8udmFsdWU/LnByb2RRdHkpO1xyXG4gICAgICAgIGNvbnN0IGxlbiA9IHBhcnNlRmxvYXQoZWxlbWVudD8udmFsdWU/LnByb2RMZW4pO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRCdW5kbGVOYW1lID0gZWxlbWVudD8udmFsdWU/LnByb2RCdW5kbGU/LnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAhdGhpcy5pc051bGxPckVtcHR5KHF0eSkgJiZcclxuICAgICAgICAgICF0aGlzLmlzTnVsbE9yRW1wdHkobGVuKSAmJlxyXG4gICAgICAgICAgIWlzTmFOKHF0eSkgJiZcclxuICAgICAgICAgICFpc05hTihsZW4pXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0b3RhbCA9IHF0eSAqIGxlbjtcclxuICAgICAgICAgIGlmICghdGhpcy5oYXNCdW5kbGUpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvckluZGV4W2luZGV4XSA9XHJcbiAgICAgICAgICAgICAgdG90YWwgKiAodGhpcy5jdXR0aW5nVmFsaWRhdGlvbj8ud2VpZ2h0UGVyTE0gfHwgMSkgPlxyXG4gICAgICAgICAgICAgICh0aGlzLmN1dHRpbmdWYWxpZGF0aW9uPy5tYXhCdW5kbGVMb2FkIHx8IDEwMDApXHJcbiAgICAgICAgICAgICAgICA/IHRydWVcclxuICAgICAgICAgICAgICAgIDogZmFsc2U7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrVG90YWxCdW5kbGVXZWlnaHQoZm9ybVZhbHVlc1tjdXJyZW50QnVuZGxlTmFtZV0pXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3JJbmRleE5vID0gdGhpcy5nZXRMYXN0QnVuZGxlSW5kZXgoY3VycmVudEJ1bmRsZU5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNOdWxsT3JFbXB0eShlcnJvckluZGV4Tm8pKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5lcnJvckluZGV4W2Vycm9ySW5kZXhOb10gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9ySW5kZXhbaW5kZXhdID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaXNOYU4ocXR5KSAmJiAhaXNOYU4obGVuKSkge1xyXG4gICAgICAgICAgdGhpcy50b3RhbExlbmd0aCA9IHRoaXMudG90YWxMZW5ndGggKyB0b3RhbDtcclxuICAgICAgICAgIHRoaXMudG90YWxQcmljZSA9XHJcbiAgICAgICAgICAgIHRoaXMudG90YWxMZW5ndGggKiB0aGlzLnByb2R1Y3REZXRhaWxzPy5wcmljZT8udmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudG90YWxMZW5ndGggPSBudWxsO1xyXG4gICAgICBjb25zdCBxdHkgPSB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzWzBdPy5nZXQoXCJwcm9kUXR5XCIpPy52YWx1ZTtcclxuICAgICAgaWYgKCFpc05hTihxdHkpKSB7XHJcbiAgICAgICAgdGhpcy50b3RhbFByaWNlID0gcXR5ICogdGhpcy5hY2Nlc3Nvcmllc1ByaWNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUNhcnREZXRhaWxzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBVdGlsaXR5IEZ1bmN0aW9uIHRvIGdldCBLZXkgVmFsdWVzXHJcbiAgZ2V0S2V5VmFsdWVzKHNvdXJjZTogYW55LCBzZWFyY2g6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gXCJvYmplY3RcIikge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgW2tleSwgbmV4dF0gPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xyXG4gICAgY29uc3QgeyBba2V5XTogdmFsdWUsIC4uLnJlc3QgfSA9IHNvdXJjZTtcclxuXHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAuLi4oa2V5ID09PSBzZWFyY2ggPyBbdmFsdWVdIDogdGhpcy5nZXRLZXlWYWx1ZXModmFsdWUsIHNlYXJjaCkpLFxyXG4gICAgICAuLi4obmV4dCA/IHRoaXMuZ2V0S2V5VmFsdWVzKHJlc3QsIHNlYXJjaCkgOiBbXSksXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0IHRoZSB2YWx1ZXMgb2YgUXVhbnRpdHkgRm9ybVxyXG4gIGdldFByb2R1Y3RRdWFudGl0eUZvcm1Hcm91cCgpOiBGb3JtR3JvdXAge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoXHJcbiAgICAgIHRoaXMuaXNGaW5pc2hlZFByb2R1Y3QgPyBuZXcgQWNjZXNzb3JpZXNRdWFudGl0eSgpIDogbmV3IFByb2R1Y3RRdWFudGl0eSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByb2R1Y3RRdWFudGl0eUZvcm0oKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLnByb2R1Y3RGb3JtLmdldChcInByb2R1Y3RRdWFudGl0eVwiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICAvLyBBZGQgdGhlIFF1YW5pdHkgRm9ybSB3aGVuIHVzZXIgY2xpY2tzIG9uIEFkZCBNb3JlIGJ1dHRvblxyXG4gIGFkZFByb2R1Y3RRdWFudGl0eUZvcm1Hcm91cChldmVudD86IGFueSk6IHZvaWQge1xyXG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LnB1c2godGhpcy5nZXRQcm9kdWN0UXVhbnRpdHlGb3JtR3JvdXAoKSk7XHJcbiAgICBjb25zdCBidW5kbGVzID0gdGhpcy5ncm91cEJ5QnVuZGxlKFxyXG4gICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmdldFJhd1ZhbHVlKCksXHJcbiAgICAgIFwicHJvZEJ1bmRsZVwiXHJcbiAgICApO1xyXG4gICAgdGhpcy5kaXNhYmxlQWRkTW9yZSA9IHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8ubGVuZ3RoID4gOTk7XHJcbiAgICB0aGlzLmVycm9ySW5kZXhbdGhpcy5yb3dJbmRleF0gPSBmYWxzZTtcclxuICAgIHRoaXMuaGFzUHJvZFJlZkluZGV4W3RoaXMucm93SW5kZXgrK10gPSBmYWxzZTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuYWRkTW9yZUNsaWNrZWQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gVXBkYXRlIHRoZSBRdWFudGl0eSBmb3JtIGlmIHVzZXIgY2xpY2tzIG9uIHJlbW92ZSBidXR0b25cclxuICByZW1vdmVQcm9kdWN0UXVhbnRpdHlGb3JtKGluZGV4OiBhbnksIGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0ucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgdGhpcy5yb3dJbmRleC0tO1xyXG4gICAgdGhpcy5kaXNhYmxlQWRkTW9yZSA9IHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8ubGVuZ3RoID4gOTk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVRvdGFsKCk7XHJcbiAgICB0aGlzLmFkZE1vcmVDbGlja2VkLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIC8vIEdldCBKb2IgUmVmZXJlbmNlIEVycm9yc1xyXG4gIGpvYlJlZmVyZW5jZUVycm9ycygpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZHVjdEZvcm0/LmdldChcImpvYlJlZmVyZW5jZVwiKT8uZXJyb3JzO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0IFByb2R1Y3QgUXVhbnRpdHkgRXJyb3JzXHJcbiAgcHJvZFF0eUVycm9ycyhpbmRleDogYW55KTogYW55IHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgICh0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KFwicHJvZFF0eVwiKT8uZXJyb3JzIHx8XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF0/LmdldChcInByb2RRdHlcIik/LmludmFsaWQpICYmXHJcbiAgICAgICh0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KFwicHJvZFF0eVwiKT8uZGlydHkgfHxcclxuICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KFwicHJvZFF0eVwiKT8udG91Y2hlZClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgUHJvZHVjdCBMZW5ndGggRXJyb3JzXHJcbiAgcHJvZExlbkVycm9ycyhpbmRleDogYW55KTogYW55IHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgICh0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KFwicHJvZExlblwiKT8uZXJyb3JzIHx8XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF0/LmdldChcInByb2RMZW5cIik/LmludmFsaWQpICYmXHJcbiAgICAgICh0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KFwicHJvZExlblwiKT8uZGlydHkgfHxcclxuICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KFwicHJvZExlblwiKT8udG91Y2hlZClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgUHJvZHVjdCBMZW5ndGggRXJyb3JzXHJcbiAgbWluTGVuRXJyb3JzKGluZGV4OiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFzTWlubGVuZ3RoRXJyb3I/LmluZGV4T2YoaW5kZXgpICE9PSAtMTtcclxuICB9XHJcblxyXG4gIC8vIEdldCBQcm9kdWN0IEJ1bmRsZSBFcnJvcnNcclxuICBwcm9kQnVuZGxlRXJyb3JzKGluZGV4OiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgKHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoXCJwcm9kQnVuZGxlXCIpPy5lcnJvcnMgfHxcclxuICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KFwicHJvZEJ1bmRsZVwiKVxyXG4gICAgICAgICAgPy5pbnZhbGlkKSAmJlxyXG4gICAgICAodGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF0/LmdldChcInByb2RCdW5kbGVcIik/LmRpcnR5IHx8XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF0/LmdldChcInByb2RCdW5kbGVcIik/LnRvdWNoZWQpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0IFByb2R1Y3QgQnVubGRlIFJlZmVyZW5jZSBFcnJvcnNcclxuICBwcm9kUmVmRXJyb3JzKGluZGV4OiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgKHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoXCJwcm9kUmVmXCIpPy5lcnJvcnMgfHxcclxuICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KFwicHJvZFJlZlwiKT8uaW52YWxpZCkgJiZcclxuICAgICAgKHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoXCJwcm9kUmVmXCIpPy5kaXJ0eSB8fFxyXG4gICAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoXCJwcm9kUmVmXCIpPy50b3VjaGVkKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIENoZWNrIGlmIGZvcm0gaXMgVmFsaWQgb3Igbm90XHJcbiAgaXNWYWxpZEZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaGFzQnVuZGxlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnByb2R1Y3RGb3JtPy52YWxpZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHM/LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHZhbGlkID0gdGhpcy5pc0ZpbmlzaGVkUHJvZHVjdFxyXG4gICAgICAgICAgPyBlbGVtZW50Py5nZXQoXCJwcm9kUXR5XCIpPy52YWxpZFxyXG4gICAgICAgICAgOiBlbGVtZW50Py5nZXQoXCJwcm9kTGVuXCIpPy52YWxpZCAmJiBlbGVtZW50Py5nZXQoXCJwcm9kUXR5XCIpPy52YWxpZDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsaWQ7XHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBpZiBhbnkgZXJyb3JzIHByZXNlbnQgb24gYW55IHJvdyBhbmQgZGlwbGF5IGl0IG9uIFVJXHJcbiAgaGFzRXJyb3JzKGluZGV4OiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KFwicHJvZFF0eVwiKT8uZXJyb3JzIHx8XHJcbiAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoXCJwcm9kTGVuXCIpPy5lcnJvcnMgfHxcclxuICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF0/LmdldChcInByb2RCdW5kbGVcIik/LmVycm9ycyB8fFxyXG4gICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KFwicHJvZFJlZlwiKT8uZXJyb3JzXHJcbiAgICAgID8gdHJ1ZVxyXG4gICAgICA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgaWYgQW55IEVudHJ5IGhhcyBsZXNzIHRoYW4gTWluaW11bSBsZW5ndGhcclxuICBjaGVja0hhc01pbkxlbmd0aFF0eSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFzTWlubGVuZ3RoRXJyb3IgPSBbXTtcclxuICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHM/LmZvckVhY2goKGVsZW1lbnQ6IGFueSwgaW5kOiBhbnkpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGVsZW1lbnQ/LnZhbHVlPy5wcm9kTGVuIDwgdGhpcy5jdXR0aW5nVmFsaWRhdGlvbj8ubWluTGVuZ3RoICYmXHJcbiAgICAgICAgIXRoaXMuaXNOdWxsT3JFbXB0eShlbGVtZW50Py52YWx1ZT8ucHJvZExlbilcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5oYXNNaW5sZW5ndGhFcnJvci5wdXNoKGluZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcGFkM0RpZ2l0cyh2YWx1ZTogYW55KTogYW55IHtcclxuICAgIGNvbnN0IHF0eSA9IHZhbHVlO1xyXG4gICAgaWYgKCF0aGlzLmlzTnVsbE9yRW1wdHkocXR5KSAmJiAhaXNOYU4ocXR5KSkge1xyXG4gICAgICByZXR1cm4gcGFyc2VGbG9hdChxdHkpXHJcbiAgICAgICAgPy50b0ZpeGVkKDMpXHJcbiAgICAgICAgPy5yZXBsYWNlKC8oXFxkKSg/PShcXGR7M30pK1xcYikvZywgXCIkMSxcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBDb252ZXJ0IExlbmd0aCB0byBkZW1pYWwgZm9ybWF0IGFmdGVyIGJsdXJcclxuICB1cGRhdGVMZW50aFZhbHVlKGVsZW1lbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzTnVsbE9yRW1wdHkoZWxlbWVudD8udmFsdWUpKSB7XHJcbiAgICAgIGVsZW1lbnQudmFsdWUgPSB0aGlzLnBhZDNEaWdpdHMoZWxlbWVudC52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNoZWNrSGFzTWluTGVuZ3RoUXR5KCk7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9kdWN0RGV0YWlsc1wiIFtmb3JtR3JvdXBdPVwicHJvZHVjdEZvcm1cIj5cclxuICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJjb2wgcC0wIGJ1bmRsaW5nIHByLTJcIlxyXG4gICAgICAgICpuZ0lmPVwiIWlzRmluaXNoZWRQcm9kdWN0ICYmICFpc0ZsYXNoaW5nUHJvZHVjdFwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInByLTIgZm9udC13ZWlnaHQtYm9sZCB0ZXh0XCI+QnVuZGxpbmcgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3dpdGNoXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYnVuZGxpbmdcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlQnVuZGxpbmcoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImhhc0J1bmRsZVwiXHJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaGFzQnVuZGxlXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbGlkZXIgcm91bmRcIj48L3NwYW4+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxkaXYgY2xhc3M9XCJxdWFudGl0eSBib3JkZXIgcC0yIG10LTRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciBmb3JtQXJyYXlOYW1lPVwicHJvZHVjdFF1YW50aXR5XCI+XHJcbiAgICAgICAgPGRhdGFsaXN0IGlkPVwiYnVuZGxlTGlzdFwiPlxyXG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYnVuZGxlIG9mIGJ1bmRsZUxpc3RcIj5cclxuICAgICAgICAgICAge3sgYnVuZGxlIH19XHJcbiAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICA8L2RhdGFsaXN0PlxyXG4gICAgICAgIDx0YWJsZVxyXG4gICAgICAgICAgY2xhc3M9XCJuby1ib3JkZXJcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAnaGFzLWJ1bmRsZSc6IGhhc0J1bmRsZSxcclxuICAgICAgICAgICAgYWNjZXNzb3JpZXM6IGlzRmluaXNoZWRQcm9kdWN0XHJcbiAgICAgICAgICB9XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0aD5RdWFudGl0eTwvdGg+XHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFpc0ZpbmlzaGVkUHJvZHVjdFwiPkxlbmd0aCAoTE0pPC90aD5cclxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiaGFzQnVuZGxlXCI+XHJcbiAgICAgICAgICAgICAgQnVuZGxlXHJcbiAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5mby1pY29uXCJcclxuICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJCdW5kbGUgSW5mb3JtYXRpb24gZ29lcyBoZXJlLi4uLlwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaGFzQnVuZGxlXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImQtbm9uZVwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnZC1sZy1ibG9jayc6IGxpc3RWaWV3IH1cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgUmVmZXJlbmNlXHJcbiAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5mby1pY29uXCJcclxuICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZWZlcmVuY2UgSW5mb3JtYXRpb24gZ29lcyBoZXJlLi4uLlwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cIlxyXG4gICAgICAgICAgICAgICAgbGV0IHZhbCBvZiBwcm9kdWN0Rm9ybS5nZXQoJ3Byb2R1Y3RRdWFudGl0eScpWydjb250cm9scyddO1xyXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleFxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHByb2QtcXR5XCJcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kUXR5XCJcclxuICAgICAgICAgICAgICAgICAgICBtaW5sZW5ndGg9XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICBPbmx5TnVtYmVyPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwidXBkYXRlVG90YWwoKVwiXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWlzRmluaXNoZWRQcm9kdWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cImRlY2ltYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHByb2QtbGVuXCJcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kTGVuXCJcclxuICAgICAgICAgICAgICAgICAgICAjcHJvZExlblxyXG4gICAgICAgICAgICAgICAgICAgIG1pbmxlbmd0aD1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjdcIlxyXG4gICAgICAgICAgICAgICAgICAgIE9ubHlOdW1iZXI9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJ1cGRhdGVUb3RhbCgpOyB1cGRhdGVMZW50aFZhbHVlKHByb2RMZW4pXCJcclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJoYXNCdW5kbGUgJiYgIWlzRmluaXNoZWRQcm9kdWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLW5vbmVcIiBbbmdDbGFzc109XCJ7ICdkLWxnLWJsb2NrJzogbGlzdFZpZXcgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcHJvZC1idW5kbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvZEJ1bmRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAjcHJvZEJ1bmRsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kQnVuZGxlLnZhbHVlID0gcHJvZEJ1bmRsZS52YWx1ZS50b1VwcGVyQ2FzZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbWlubGVuZ3RoPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVUb3RhbCgpOyBwb3B1bGF0ZVNhbWVCdW5kbGVSZWZlcmVuY2UobnVsbCwgaSlcclxuICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwidXBkYXRlQnVuZGxlTGlzdCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGxpc3Q9XCJidW5kbGVMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7ICdkLWxnLW5vbmUgZC14bC1ub25lJzogbGlzdFZpZXcgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicC0wIG0tMFwiICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiBnZXRCdW5kbGVWYWx1ZXMoaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IHZhbHVlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpZGUtbWVudS1idXR0b25cIiAqbmdJZj1cIiFsaXN0Vmlld1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZHJvcGxlZnRcIiAqbmdJZj1cImhhc0J1bmRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tdG9nZ2xlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cIiNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1lbGxpcHNpcy12XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gbS0wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRvZ2dsZT1cIm1vZGFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRhcmdldD1cIiNidW5kbGVNb2RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRCdW5kbGVWYWx1ZShpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0IEJ1bmRsZSBWYWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pdGVtIG0tMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpID4gMCB8fCBwcm9kdWN0UXVhbnRpdHlGb3JtLmxlbmd0aCA+IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVQcm9kdWN0UXVhbnRpdHlGb3JtKGksICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJoYXNCdW5kbGUgJiYgIWlzRmluaXNoZWRQcm9kdWN0ICYmIGxpc3RWaWV3XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLW5vbmVcIiBbbmdDbGFzc109XCJ7ICdkLWxnLWJsb2NrJzogbGlzdFZpZXcgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcHJvZC1yZWZlcmVuY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbWlubGVuZ3RoPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwicG9wdWxhdGVTYW1lQnVuZGxlUmVmZXJlbmNlKCRldmVudCwgaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvZFJlZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVG90YWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2FtZUJ1bmRsZVJlZmVyZW5jZSgkZXZlbnQsIGksIHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImxpc3RWaWV3IHx8ICFoYXNCdW5kbGVcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaSA+IDAgfHwgcHJvZHVjdFF1YW50aXR5Rm9ybS5sZW5ndGggPiAxXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNpbXBsZSBjbG9zZSBkLXNtLW5vbmUgZC1tZC1ub25lIGQtbGctYmxvY2sgZC14bC1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVByb2R1Y3RRdWFudGl0eUZvcm0oaSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lcy1jaXJjbGUgY3VzdG9tLWFycm93IHJlbW92ZS1pY29uXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJoYXNFcnJvcnMoaSlcIj5cclxuICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNFwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTBcIiAqbmdJZj1cInByb2RRdHlFcnJvcnMoaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICBQbGVhc2UgZW50ZXIgdmFsaWQgUXVhbnRpdHlcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJwcm9kTGVuRXJyb3JzKGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUGxlYXNlIGVudGVyIHZhbGlkIExlbmd0aFxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIiAqbmdJZj1cIm1pbkxlbkVycm9ycyhpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIE1pbmltdW0gbGVuZ3RoIHNob3VsZCBiZSBhdCBsZWFzdFxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGN1dHRpbmdWYWxpZGF0aW9uPy5taW5MZW5ndGggfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJwcm9kQnVuZGxlRXJyb3JzKGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUGxlYXNlIGVudGVyIHZhbGlkIEJ1bmRsZSBOYW1lXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwicHJvZFJlZkVycm9ycyhpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFBsZWFzZSBlbnRlciB2YWxpZCBSZWZlcmVuY2VcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiaGFzRXJyb3JJbmRleChpKVwiPlxyXG4gICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI0XCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyB0aGlzLmFkZFRvQ2FydEVycm9yIHx8ICdTaG91bGQgbm90IGV4Y2VlZCBtYXhpbXVtIGJ1bmRsZSBzaXplJyB9fVxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgIDx0ciAqbmdJZj1cImhhc1Byb2RSZWZFcnJvckluZGV4KGkpXCI+XHJcbiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjRcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgIFRoaXMgUmVmZXJlbmNlIHZhbHVlIGlzIGFscmVhZHkgdXNlZC4gUGxlYXNlIHVzZSBvdGhlciB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBjbGFzcz1cInNpbXBsZSBwbC0yXCJcclxuICAgICAgICAgICpuZ0lmPVwiIWlzRmluaXNoZWRQcm9kdWN0ICYmICFkaXNhYmxlQWRkTW9yZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkUHJvZHVjdFF1YW50aXR5Rm9ybUdyb3VwKCRldmVudClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXItMSBhZGQtbW9yZVwiPiA8L3NwYW4+XHJcbiAgICAgICAgICBBZGQgbW9yZVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjwhLS0gPGRpdlxyXG4gIGNsYXNzPVwicm93IG10LTQgY29sLXNtLTEyIGFsZXJ0IGFsZXJ0LWRhbmdlciBqdXN0aWZ5LWNvbnRlbnQtc3RhcnRcIlxyXG4gIHJvbGU9XCJhbGVydFwiXHJcbiAgKm5nSWY9XCJhZGRUb0NhcnRFcnJvclwiXHJcbj5cclxuICA8aW1nXHJcbiAgICBjbGFzcz1cIm1yLTNcIlxyXG4gICAgc3JjPVwiLi4vLi4vLi4vLi4vLi4vYXNzZXRzL2ltYWdlcy9lcnJvcmljb24uc3ZnXCJcclxuICAgIGFsdD1cImFsZXJ0XCJcclxuICAvPlxyXG4gIDxzcGFuPlxyXG4gICAge3sgYWRkVG9DYXJ0RXJyb3IgfX1cclxuICA8L3NwYW4+XHJcbjwvZGl2PiAtLT5cclxuXHJcbjxkaXZcclxuICBjbGFzcz1cIm1vZGFsIGZhZGUgZWRpdC1idW5kbGUtZm9ybVwiXHJcbiAgaWQ9XCJidW5kbGVNb2RhbFwiXHJcbiAgcm9sZT1cImRpYWxvZ1wiXHJcbiAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIiByb2xlPVwiZG9jdW1lbnRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPkJ1bmRsZSBWYWx1ZTwvaDQ+XHJcbiAgICAgICAgPGlcclxuICAgICAgICAgIGNsYXNzPVwiaWNvbi1jbG9zZSBpbnZpdGUtcG9wLWNsb3NlXCJcclxuICAgICAgICAgIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCJcclxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZVwiXHJcbiAgICAgICAgPjwvaT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IG0tMCBwbC0yIHByLTJcIj5cclxuICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBuby1ib3JkZXJcIiAqbmdJZj1cIiFpc0ZpbmlzaGVkUHJvZHVjdFwiPlxyXG4gICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgQnVuZGxlXHJcbiAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5mby1pY29uXCJcclxuICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJCdW5kbGUgSW5mb3JtYXRpb24gZ29lcyBoZXJlLi4uLlwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICBSZWZlcmVuY2VcclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbmZvLWljb25cIlxyXG4gICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlJlZmVyZW5jZSBJbmZvcm1hdGlvbiBnb2VzIGhlcmUuLi4uXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICA8dGJvZHkgW2Zvcm1Hcm91cF09XCJtb2RhbEJ1bmRsZUZvcm1cIj5cclxuICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxkYXRhbGlzdCBpZD1cIm1vZEJ1bmRsZUxpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYnVuZGxlIG9mIGJ1bmRsZUxpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBidW5kbGUgfX1cclxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L2RhdGFsaXN0PlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1vZEJ1bmRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICNtb2RCdW5kbGVcclxuICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cInVwZGF0ZUJ1bmRsZUxpc3QoKVwiXHJcbiAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJtb2RCdW5kbGUudmFsdWUgPSBtb2RCdW5kbGUudmFsdWUudG9VcHBlckNhc2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgIGxpc3Q9XCJtb2RCdW5kbGVMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgKGJsdXIpPVwicG9wdWxhdGVTYW1lQnVuZGxlUmVmZXJlbmNlKG51bGwsIHNlbGVjdGVkSW5kZXgpXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxNVwiXHJcbiAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJwb3B1bGF0ZVNhbWVCdW5kbGVSZWZlcmVuY2UoJGV2ZW50LCBzZWxlY3RlZEluZGV4KVwiXHJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1vZFJlZlwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICAgICAgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxyXG4gICAgICAgICAgI2Nsb3NlYnV0dG9uXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlnaHRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIENhbmNlbFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJzYXZlQnVuZGxlRGV0YWlscygkZXZlbnQpXCIgY2xhc3M9XCJidG5cIj5cclxuICAgICAgICAgIFNhdmVcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==