@hmcts/ccpay-web-component 5.2.10-beta8 → 6.0.0-beta01

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 (406) hide show
  1. package/esm2022/hmcts-ccpay-web-component.mjs +5 -0
  2. package/esm2022/lib/components/add-remission/add-remission.component.mjs +1189 -0
  3. package/esm2022/lib/components/allocate-payments/allocate-payments.component.mjs +407 -0
  4. package/esm2022/lib/components/card-details/card-details.component.mjs +32 -0
  5. package/esm2022/lib/components/case-transactions/case-transactions.component.mjs +794 -0
  6. package/esm2022/lib/components/contact-details/contact-details.component.mjs +338 -0
  7. package/esm2022/lib/components/error-banner/error-banner.component.mjs +18 -0
  8. package/esm2022/lib/components/fee-summary/fee-summary.component.mjs +247 -0
  9. package/esm2022/lib/components/mark-unidentified-payment/mark-unidentified-payment.component.mjs +195 -0
  10. package/esm2022/lib/components/mark-unsolicited-payment/mark-unsolicited-payment.component.mjs +255 -0
  11. package/esm2022/lib/components/notification-preview/notification-preview.component.mjs +79 -0
  12. package/esm2022/lib/components/page-not-found.component.mjs +17 -0
  13. package/esm2022/lib/components/payment-list/payment-list.component.mjs +36 -0
  14. package/esm2022/lib/components/payment-view/payment-view.component.mjs +416 -0
  15. package/esm2022/lib/components/pba-details/pba-details.component.mjs +18 -0
  16. package/esm2022/lib/components/pba-payment/pba-payment.component.mjs +151 -0
  17. package/esm2022/lib/components/process-refund/process-refund.component.mjs +417 -0
  18. package/esm2022/lib/components/processed-payments/processed-payments.component.mjs +37 -0
  19. package/esm2022/lib/components/refund-list/refund-list.component.mjs +73 -0
  20. package/esm2022/lib/components/refund-status/refund-status.component.mjs +453 -0
  21. package/esm2022/lib/components/reports/reports.component.mjs +291 -0
  22. package/esm2022/lib/components/service-request/service-request.component.mjs +456 -0
  23. package/esm2022/lib/components/status-history/status-history.component.mjs +33 -0
  24. package/esm2022/lib/components/table/table.component.mjs +128 -0
  25. package/esm2022/lib/components/unprocessed-payments/unprocessed-payments.component.mjs +236 -0
  26. package/esm2022/lib/interfaces/AddRemissionRequest.mjs +17 -0
  27. package/esm2022/lib/interfaces/AddRetroRemissionRequest.mjs +9 -0
  28. package/esm2022/lib/interfaces/AllocatePaymentRequest.mjs +41 -0
  29. package/esm2022/lib/interfaces/IAllocationPaymentsRequest.mjs +20 -0
  30. package/esm2022/lib/interfaces/IPaymentStatus.mjs +12 -0
  31. package/esm2022/lib/interfaces/IPutNotificationRequest.mjs +13 -0
  32. package/esm2022/lib/interfaces/IResubmitRefundRequest.mjs +13 -0
  33. package/esm2022/lib/interfaces/IserviceRequestCardPayment.mjs +11 -0
  34. package/esm2022/lib/interfaces/IserviceRequestPbaPayment.mjs +15 -0
  35. package/esm2022/lib/interfaces/IssueRefundRequest.mjs +11 -0
  36. package/esm2022/lib/interfaces/NotificationPreviewRequest.mjs +45 -0
  37. package/esm2022/lib/interfaces/PayhubAntennaRequest.mjs +12 -0
  38. package/esm2022/lib/interfaces/PaymentToPayhubRequest.mjs +15 -0
  39. package/esm2022/lib/interfaces/PostIssueRefundRetroRemission.mjs +9 -0
  40. package/esm2022/lib/interfaces/PostRefundRetroRemission.mjs +18 -0
  41. package/esm2022/lib/interfaces/RefundsRequest.mjs +9 -0
  42. package/esm2022/lib/interfaces/UnidentifiedPaymentsRequest.mjs +16 -0
  43. package/esm2022/lib/interfaces/UnsolicitedPaymentsRequest.mjs +22 -0
  44. package/esm2022/lib/payment-lib.component.mjs +288 -0
  45. package/esm2022/lib/payment-lib.module.mjs +187 -0
  46. package/esm2022/lib/payment-lib.service.mjs +49 -0
  47. package/esm2022/lib/pipes/capitalize.pipe.mjs +18 -0
  48. package/esm2022/lib/pipes/ccd-hyphens.pipe.mjs +22 -0
  49. package/esm2022/lib/pipes/key-value.pipe.mjs +23 -0
  50. package/esm2022/lib/pipes/sanitize-html.pipe.mjs +20 -0
  51. package/esm2022/lib/services/bulk-scaning-payment/bulk-scaning-payment.service.mjs +87 -0
  52. package/esm2022/lib/services/card-details/card-details.service.mjs +39 -0
  53. package/esm2022/lib/services/case-transactions/case-transactions.service.mjs +39 -0
  54. package/esm2022/lib/services/notification/notification.service.mjs +70 -0
  55. package/esm2022/lib/services/orderslist.service.mjs +154 -0
  56. package/esm2022/lib/services/payment-list/payment-list.service.mjs +40 -0
  57. package/esm2022/lib/services/payment-view/payment-view.service.mjs +152 -0
  58. package/esm2022/lib/services/refunds/refunds.service.mjs +117 -0
  59. package/{esm2015/lib/services/shared/error-handler.service.js → esm2022/lib/services/shared/error-handler.service.mjs} +9 -8
  60. package/esm2022/lib/services/shared/httpclient/webcomponent.http.client.mjs +64 -0
  61. package/esm2022/lib/services/shared/logger/console-logger.service.mjs +43 -0
  62. package/esm2022/lib/services/shared/logger/logger.service.mjs +23 -0
  63. package/esm2022/lib/services/status-history/status-history.service.mjs +41 -0
  64. package/esm2022/lib/services/xl-file/xl-file.service.mjs +153 -0
  65. package/fesm2022/hmcts-ccpay-web-component.mjs +7870 -0
  66. package/fesm2022/hmcts-ccpay-web-component.mjs.map +1 -0
  67. package/index.d.ts +5 -0
  68. package/lib/components/add-remission/add-remission.component.d.ts +5 -3
  69. package/lib/components/allocate-payments/allocate-payments.component.d.ts +5 -7
  70. package/lib/components/card-details/card-details.component.d.ts +3 -1
  71. package/lib/components/case-transactions/case-transactions.component.d.ts +5 -3
  72. package/lib/components/contact-details/contact-details.component.d.ts +4 -2
  73. package/lib/components/error-banner/error-banner.component.d.ts +3 -1
  74. package/lib/components/fee-summary/fee-summary.component.d.ts +4 -2
  75. package/lib/components/mark-unidentified-payment/mark-unidentified-payment.component.d.ts +4 -2
  76. package/lib/components/mark-unsolicited-payment/mark-unsolicited-payment.component.d.ts +4 -2
  77. package/lib/components/notification-preview/notification-preview.component.d.ts +4 -6
  78. package/lib/components/page-not-found.component.d.ts +3 -1
  79. package/lib/components/payment-list/payment-list.component.d.ts +4 -2
  80. package/lib/components/payment-view/payment-view.component.d.ts +4 -2
  81. package/lib/components/pba-details/pba-details.component.d.ts +3 -1
  82. package/lib/components/pba-payment/pba-payment.component.d.ts +4 -2
  83. package/lib/components/process-refund/process-refund.component.d.ts +4 -2
  84. package/lib/components/processed-payments/processed-payments.component.d.ts +3 -1
  85. package/lib/components/refund-list/refund-list.component.d.ts +3 -1
  86. package/lib/components/refund-status/refund-status.component.d.ts +4 -2
  87. package/lib/components/reports/reports.component.d.ts +4 -6
  88. package/lib/components/service-request/service-request.component.d.ts +5 -3
  89. package/lib/components/status-history/status-history.component.d.ts +4 -2
  90. package/lib/components/table/table.component.d.ts +4 -2
  91. package/lib/components/unprocessed-payments/unprocessed-payments.component.d.ts +4 -2
  92. package/lib/interfaces/AddRemissionRequest.d.ts +0 -1
  93. package/lib/interfaces/AddRetroRemissionRequest.d.ts +0 -1
  94. package/lib/interfaces/AllocatePaymentRequest.d.ts +0 -1
  95. package/lib/interfaces/IAllocationPaymentsRequest.d.ts +0 -1
  96. package/lib/interfaces/IBSPayments.d.ts +0 -1
  97. package/lib/interfaces/ICardDetails.d.ts +0 -1
  98. package/lib/interfaces/IFee.d.ts +0 -1
  99. package/lib/interfaces/INotificationPreview.d.ts +0 -1
  100. package/lib/interfaces/IOrderReferenceFee.d.ts +0 -1
  101. package/lib/interfaces/IPatchRefundAction.d.ts +0 -1
  102. package/lib/interfaces/IPayment.d.ts +0 -1
  103. package/lib/interfaces/IPaymentFailure.d.ts +0 -1
  104. package/lib/interfaces/IPaymentGroup.d.ts +0 -1
  105. package/lib/interfaces/IPaymentStatus.d.ts +0 -1
  106. package/lib/interfaces/IPaymentView.d.ts +0 -1
  107. package/lib/interfaces/IPayments.d.ts +0 -1
  108. package/lib/interfaces/IPutNotificationRequest.d.ts +0 -1
  109. package/lib/interfaces/IRefundAction.d.ts +0 -1
  110. package/lib/interfaces/IRefundContactDetails.d.ts +0 -1
  111. package/lib/interfaces/IRefundFee.d.ts +0 -1
  112. package/lib/interfaces/IRefundList.d.ts +0 -1
  113. package/lib/interfaces/IRefundReasons.d.ts +0 -1
  114. package/lib/interfaces/IRefundRejectReason.d.ts +0 -1
  115. package/lib/interfaces/IRefundStatus.d.ts +0 -1
  116. package/lib/interfaces/IRefundStatusHistory.d.ts +0 -1
  117. package/lib/interfaces/IRefundsNotifications.d.ts +0 -1
  118. package/lib/interfaces/IRemission.d.ts +0 -1
  119. package/lib/interfaces/IResubmitRefundRequest.d.ts +0 -1
  120. package/lib/interfaces/IStatusHistories.d.ts +0 -1
  121. package/lib/interfaces/IStatusHistory.d.ts +0 -1
  122. package/lib/interfaces/IserviceRequestCardPayment.d.ts +0 -1
  123. package/lib/interfaces/IserviceRequestPbaPayment.d.ts +0 -1
  124. package/lib/interfaces/IssueRefundRequest.d.ts +0 -1
  125. package/lib/interfaces/NotificationPreviewRequest.d.ts +0 -1
  126. package/lib/interfaces/PayhubAntennaRequest.d.ts +0 -1
  127. package/lib/interfaces/PaymentToPayhubRequest.d.ts +0 -1
  128. package/lib/interfaces/PostIssueRefundRetroRemission.d.ts +0 -1
  129. package/lib/interfaces/PostRefundRetroRemission.d.ts +0 -1
  130. package/lib/interfaces/RefundsRequest.d.ts +0 -1
  131. package/lib/interfaces/UnidentifiedPaymentsRequest.d.ts +0 -1
  132. package/lib/interfaces/UnsolicitedPaymentsRequest.d.ts +0 -1
  133. package/lib/payment-lib.component.d.ts +3 -1
  134. package/lib/payment-lib.module.d.ts +40 -1
  135. package/lib/payment-lib.service.d.ts +3 -1
  136. package/lib/pipes/capitalize.pipe.d.ts +3 -1
  137. package/lib/pipes/ccd-hyphens.pipe.d.ts +3 -1
  138. package/lib/pipes/key-value.pipe.d.ts +3 -1
  139. package/lib/pipes/sanitize-html.pipe.d.ts +3 -1
  140. package/lib/services/bulk-scaning-payment/bulk-scaning-payment.service.d.ts +4 -2
  141. package/lib/services/card-details/card-details.service.d.ts +3 -1
  142. package/lib/services/case-transactions/case-transactions.service.d.ts +4 -2
  143. package/lib/services/notification/notification.service.d.ts +4 -2
  144. package/lib/services/orderslist.service.d.ts +3 -1
  145. package/lib/services/payment-list/payment-list.service.d.ts +3 -1
  146. package/lib/services/payment-view/payment-view.service.d.ts +3 -1
  147. package/lib/services/refunds/refunds.service.d.ts +4 -2
  148. package/lib/services/shared/error-handler.service.d.ts +3 -1
  149. package/lib/services/shared/httpclient/webcomponent.http.client.d.ts +3 -1
  150. package/lib/services/shared/logger/console-logger.service.d.ts +3 -1
  151. package/lib/services/shared/logger/logger.service.d.ts +3 -1
  152. package/lib/services/status-history/status-history.service.d.ts +3 -1
  153. package/lib/services/xl-file/xl-file.service.d.ts +3 -1
  154. package/package.json +17 -11
  155. package/public_api.d.ts +0 -1
  156. package/bundles/hmcts-ccpay-web-component.umd.js +0 -7550
  157. package/bundles/hmcts-ccpay-web-component.umd.js.map +0 -1
  158. package/bundles/hmcts-ccpay-web-component.umd.min.js +0 -2
  159. package/bundles/hmcts-ccpay-web-component.umd.min.js.map +0 -1
  160. package/esm2015/hmcts-ccpay-web-component.js +0 -47
  161. package/esm2015/lib/components/add-remission/add-remission.component.js +0 -1045
  162. package/esm2015/lib/components/allocate-payments/allocate-payments.component.js +0 -381
  163. package/esm2015/lib/components/card-details/card-details.component.js +0 -28
  164. package/esm2015/lib/components/case-transactions/case-transactions.component.js +0 -735
  165. package/esm2015/lib/components/contact-details/contact-details.component.js +0 -315
  166. package/esm2015/lib/components/error-banner/error-banner.component.js +0 -18
  167. package/esm2015/lib/components/fee-summary/fee-summary.component.js +0 -223
  168. package/esm2015/lib/components/mark-unidentified-payment/mark-unidentified-payment.component.js +0 -184
  169. package/esm2015/lib/components/mark-unsolicited-payment/mark-unsolicited-payment.component.js +0 -238
  170. package/esm2015/lib/components/notification-preview/notification-preview.component.js +0 -59
  171. package/esm2015/lib/components/page-not-found.component.js +0 -11
  172. package/esm2015/lib/components/payment-list/payment-list.component.js +0 -31
  173. package/esm2015/lib/components/payment-view/payment-view.component.js +0 -335
  174. package/esm2015/lib/components/pba-details/pba-details.component.js +0 -18
  175. package/esm2015/lib/components/pba-payment/pba-payment.component.js +0 -144
  176. package/esm2015/lib/components/process-refund/process-refund.component.js +0 -398
  177. package/esm2015/lib/components/processed-payments/processed-payments.component.js +0 -34
  178. package/esm2015/lib/components/refund-list/refund-list.component.js +0 -59
  179. package/esm2015/lib/components/refund-status/refund-status.component.js +0 -399
  180. package/esm2015/lib/components/reports/reports.component.js +0 -280
  181. package/esm2015/lib/components/service-request/service-request.component.js +0 -345
  182. package/esm2015/lib/components/status-history/status-history.component.js +0 -28
  183. package/esm2015/lib/components/table/table.component.js +0 -99
  184. package/esm2015/lib/components/unprocessed-payments/unprocessed-payments.component.js +0 -199
  185. package/esm2015/lib/interfaces/AddRemissionRequest.js +0 -10
  186. package/esm2015/lib/interfaces/AddRetroRemissionRequest.js +0 -7
  187. package/esm2015/lib/interfaces/AllocatePaymentRequest.js +0 -27
  188. package/esm2015/lib/interfaces/IAllocationPaymentsRequest.js +0 -14
  189. package/esm2015/lib/interfaces/IPaymentStatus.js +0 -3
  190. package/esm2015/lib/interfaces/IPutNotificationRequest.js +0 -11
  191. package/esm2015/lib/interfaces/IResubmitRefundRequest.js +0 -9
  192. package/esm2015/lib/interfaces/IserviceRequestCardPayment.js +0 -8
  193. package/esm2015/lib/interfaces/IserviceRequestPbaPayment.js +0 -10
  194. package/esm2015/lib/interfaces/IssueRefundRequest.js +0 -8
  195. package/esm2015/lib/interfaces/NotificationPreviewRequest.js +0 -37
  196. package/esm2015/lib/interfaces/PayhubAntennaRequest.js +0 -9
  197. package/esm2015/lib/interfaces/PaymentToPayhubRequest.js +0 -12
  198. package/esm2015/lib/interfaces/PostIssueRefundRetroRemission.js +0 -7
  199. package/esm2015/lib/interfaces/PostRefundRetroRemission.js +0 -11
  200. package/esm2015/lib/interfaces/RefundsRequest.js +0 -7
  201. package/esm2015/lib/interfaces/UnidentifiedPaymentsRequest.js +0 -12
  202. package/esm2015/lib/interfaces/UnsolicitedPaymentsRequest.js +0 -15
  203. package/esm2015/lib/payment-lib.component.js +0 -132
  204. package/esm2015/lib/payment-lib.module.js +0 -99
  205. package/esm2015/lib/payment-lib.service.js +0 -43
  206. package/esm2015/lib/pipes/capitalize.pipe.js +0 -14
  207. package/esm2015/lib/pipes/ccd-hyphens.pipe.js +0 -18
  208. package/esm2015/lib/pipes/key-value.pipe.js +0 -20
  209. package/esm2015/lib/pipes/sanitize-html.pipe.js +0 -17
  210. package/esm2015/lib/services/bulk-scaning-payment/bulk-scaning-payment.service.js +0 -87
  211. package/esm2015/lib/services/card-details/card-details.service.js +0 -39
  212. package/esm2015/lib/services/case-transactions/case-transactions.service.js +0 -39
  213. package/esm2015/lib/services/notification/notification.service.js +0 -70
  214. package/esm2015/lib/services/orderslist.service.js +0 -154
  215. package/esm2015/lib/services/payment-list/payment-list.service.js +0 -39
  216. package/esm2015/lib/services/payment-view/payment-view.service.js +0 -150
  217. package/esm2015/lib/services/refunds/refunds.service.js +0 -117
  218. package/esm2015/lib/services/shared/httpclient/webcomponent.http.client.js +0 -61
  219. package/esm2015/lib/services/shared/logger/console-logger.service.js +0 -43
  220. package/esm2015/lib/services/shared/logger/logger.service.js +0 -17
  221. package/esm2015/lib/services/status-history/status-history.service.js +0 -41
  222. package/esm2015/lib/services/xl-file/xl-file.service.js +0 -151
  223. package/fesm2015/hmcts-ccpay-web-component.js +0 -6980
  224. package/fesm2015/hmcts-ccpay-web-component.js.map +0 -1
  225. package/hmcts-ccpay-web-component.d.ts +0 -47
  226. package/hmcts-ccpay-web-component.d.ts.map +0 -1
  227. package/hmcts-ccpay-web-component.metadata.json +0 -1
  228. package/lib/components/add-remission/add-remission.component.d.ts.map +0 -1
  229. package/lib/components/add-remission/add-remission.component.ngfactory.d.ts.map +0 -1
  230. package/lib/components/add-remission/add-remission.component.scss.shim.ngstyle.d.ts.map +0 -1
  231. package/lib/components/allocate-payments/allocate-payments.component.d.ts.map +0 -1
  232. package/lib/components/allocate-payments/allocate-payments.component.ngfactory.d.ts.map +0 -1
  233. package/lib/components/allocate-payments/allocate-payments.component.scss.shim.ngstyle.d.ts.map +0 -1
  234. package/lib/components/card-details/card-details.component.css.shim.ngstyle.d.ts.map +0 -1
  235. package/lib/components/card-details/card-details.component.d.ts.map +0 -1
  236. package/lib/components/card-details/card-details.component.ngfactory.d.ts.map +0 -1
  237. package/lib/components/case-transactions/case-transactions.component.css.shim.ngstyle.d.ts.map +0 -1
  238. package/lib/components/case-transactions/case-transactions.component.d.ts.map +0 -1
  239. package/lib/components/case-transactions/case-transactions.component.ngfactory.d.ts.map +0 -1
  240. package/lib/components/contact-details/contact-details.component.css.shim.ngstyle.d.ts.map +0 -1
  241. package/lib/components/contact-details/contact-details.component.d.ts.map +0 -1
  242. package/lib/components/contact-details/contact-details.component.ngfactory.d.ts.map +0 -1
  243. package/lib/components/error-banner/error-banner.component.d.ts.map +0 -1
  244. package/lib/components/error-banner/error-banner.component.ngfactory.d.ts.map +0 -1
  245. package/lib/components/error-banner/error-banner.component.scss.shim.ngstyle.d.ts.map +0 -1
  246. package/lib/components/fee-summary/fee-summary.component.d.ts.map +0 -1
  247. package/lib/components/fee-summary/fee-summary.component.ngfactory.d.ts.map +0 -1
  248. package/lib/components/fee-summary/fee-summary.component.scss.shim.ngstyle.d.ts.map +0 -1
  249. package/lib/components/mark-unidentified-payment/mark-unidentified-payment.component.d.ts.map +0 -1
  250. package/lib/components/mark-unidentified-payment/mark-unidentified-payment.component.ngfactory.d.ts.map +0 -1
  251. package/lib/components/mark-unidentified-payment/mark-unidentified-payment.component.scss.shim.ngstyle.d.ts.map +0 -1
  252. package/lib/components/mark-unsolicited-payment/mark-unsolicited-payment.component.d.ts.map +0 -1
  253. package/lib/components/mark-unsolicited-payment/mark-unsolicited-payment.component.ngfactory.d.ts.map +0 -1
  254. package/lib/components/mark-unsolicited-payment/mark-unsolicited-payment.component.scss.shim.ngstyle.d.ts.map +0 -1
  255. package/lib/components/notification-preview/notification-preview.component.d.ts.map +0 -1
  256. package/lib/components/notification-preview/notification-preview.component.ngfactory.d.ts.map +0 -1
  257. package/lib/components/notification-preview/notification-preview.component.scss.shim.ngstyle.d.ts.map +0 -1
  258. package/lib/components/page-not-found.component.d.ts.map +0 -1
  259. package/lib/components/page-not-found.component.ngfactory.d.ts.map +0 -1
  260. package/lib/components/payment-list/payment-list.component.css.shim.ngstyle.d.ts.map +0 -1
  261. package/lib/components/payment-list/payment-list.component.d.ts.map +0 -1
  262. package/lib/components/payment-list/payment-list.component.ngfactory.d.ts.map +0 -1
  263. package/lib/components/payment-view/payment-view.component.d.ts.map +0 -1
  264. package/lib/components/payment-view/payment-view.component.ngfactory.d.ts.map +0 -1
  265. package/lib/components/payment-view/payment-view.component.scss.shim.ngstyle.d.ts.map +0 -1
  266. package/lib/components/pba-details/pba-details.component.css.shim.ngstyle.d.ts.map +0 -1
  267. package/lib/components/pba-details/pba-details.component.d.ts.map +0 -1
  268. package/lib/components/pba-details/pba-details.component.ngfactory.d.ts.map +0 -1
  269. package/lib/components/pba-payment/pba-payment.component.d.ts.map +0 -1
  270. package/lib/components/pba-payment/pba-payment.component.ngfactory.d.ts.map +0 -1
  271. package/lib/components/pba-payment/pba-payment.component.scss.shim.ngstyle.d.ts.map +0 -1
  272. package/lib/components/process-refund/process-refund.component.css.shim.ngstyle.d.ts.map +0 -1
  273. package/lib/components/process-refund/process-refund.component.d.ts.map +0 -1
  274. package/lib/components/process-refund/process-refund.component.ngfactory.d.ts.map +0 -1
  275. package/lib/components/processed-payments/processed-payments.component.d.ts.map +0 -1
  276. package/lib/components/processed-payments/processed-payments.component.ngfactory.d.ts.map +0 -1
  277. package/lib/components/processed-payments/processed-payments.component.scss.shim.ngstyle.d.ts.map +0 -1
  278. package/lib/components/refund-list/refund-list.component.css.shim.ngstyle.d.ts.map +0 -1
  279. package/lib/components/refund-list/refund-list.component.d.ts.map +0 -1
  280. package/lib/components/refund-list/refund-list.component.ngfactory.d.ts.map +0 -1
  281. package/lib/components/refund-status/refund-status.component.css.shim.ngstyle.d.ts.map +0 -1
  282. package/lib/components/refund-status/refund-status.component.d.ts.map +0 -1
  283. package/lib/components/refund-status/refund-status.component.ngfactory.d.ts.map +0 -1
  284. package/lib/components/reports/reports.component.d.ts.map +0 -1
  285. package/lib/components/reports/reports.component.ngfactory.d.ts.map +0 -1
  286. package/lib/components/reports/reports.component.scss.shim.ngstyle.d.ts.map +0 -1
  287. package/lib/components/service-request/service-request.component.d.ts.map +0 -1
  288. package/lib/components/service-request/service-request.component.ngfactory.d.ts.map +0 -1
  289. package/lib/components/service-request/service-request.component.scss.shim.ngstyle.d.ts.map +0 -1
  290. package/lib/components/status-history/status-history.component.css.shim.ngstyle.d.ts.map +0 -1
  291. package/lib/components/status-history/status-history.component.d.ts.map +0 -1
  292. package/lib/components/status-history/status-history.component.ngfactory.d.ts.map +0 -1
  293. package/lib/components/table/table.component.css.shim.ngstyle.d.ts.map +0 -1
  294. package/lib/components/table/table.component.d.ts.map +0 -1
  295. package/lib/components/table/table.component.ngfactory.d.ts.map +0 -1
  296. package/lib/components/unprocessed-payments/unprocessed-payments.component.d.ts.map +0 -1
  297. package/lib/components/unprocessed-payments/unprocessed-payments.component.ngfactory.d.ts.map +0 -1
  298. package/lib/components/unprocessed-payments/unprocessed-payments.component.scss.shim.ngstyle.d.ts.map +0 -1
  299. package/lib/interfaces/AddRemissionRequest.d.ts.map +0 -1
  300. package/lib/interfaces/AddRetroRemissionRequest.d.ts.map +0 -1
  301. package/lib/interfaces/AllocatePaymentRequest.d.ts.map +0 -1
  302. package/lib/interfaces/IAllocationPaymentsRequest.d.ts.map +0 -1
  303. package/lib/interfaces/IBSPayments.d.ts.map +0 -1
  304. package/lib/interfaces/ICardDetails.d.ts.map +0 -1
  305. package/lib/interfaces/IFee.d.ts.map +0 -1
  306. package/lib/interfaces/INotificationPreview.d.ts.map +0 -1
  307. package/lib/interfaces/IOrderReferenceFee.d.ts.map +0 -1
  308. package/lib/interfaces/IPatchRefundAction.d.ts.map +0 -1
  309. package/lib/interfaces/IPayment.d.ts.map +0 -1
  310. package/lib/interfaces/IPaymentFailure.d.ts.map +0 -1
  311. package/lib/interfaces/IPaymentGroup.d.ts.map +0 -1
  312. package/lib/interfaces/IPaymentStatus.d.ts.map +0 -1
  313. package/lib/interfaces/IPaymentView.d.ts.map +0 -1
  314. package/lib/interfaces/IPayments.d.ts.map +0 -1
  315. package/lib/interfaces/IPutNotificationRequest.d.ts.map +0 -1
  316. package/lib/interfaces/IRefundAction.d.ts.map +0 -1
  317. package/lib/interfaces/IRefundContactDetails.d.ts.map +0 -1
  318. package/lib/interfaces/IRefundFee.d.ts.map +0 -1
  319. package/lib/interfaces/IRefundList.d.ts.map +0 -1
  320. package/lib/interfaces/IRefundReasons.d.ts.map +0 -1
  321. package/lib/interfaces/IRefundRejectReason.d.ts.map +0 -1
  322. package/lib/interfaces/IRefundStatus.d.ts.map +0 -1
  323. package/lib/interfaces/IRefundStatusHistory.d.ts.map +0 -1
  324. package/lib/interfaces/IRefundsNotifications.d.ts.map +0 -1
  325. package/lib/interfaces/IRemission.d.ts.map +0 -1
  326. package/lib/interfaces/IResubmitRefundRequest.d.ts.map +0 -1
  327. package/lib/interfaces/IStatusHistories.d.ts.map +0 -1
  328. package/lib/interfaces/IStatusHistory.d.ts.map +0 -1
  329. package/lib/interfaces/IserviceRequestCardPayment.d.ts.map +0 -1
  330. package/lib/interfaces/IserviceRequestPbaPayment.d.ts.map +0 -1
  331. package/lib/interfaces/IssueRefundRequest.d.ts.map +0 -1
  332. package/lib/interfaces/NotificationPreviewRequest.d.ts.map +0 -1
  333. package/lib/interfaces/PayhubAntennaRequest.d.ts.map +0 -1
  334. package/lib/interfaces/PaymentToPayhubRequest.d.ts.map +0 -1
  335. package/lib/interfaces/PostIssueRefundRetroRemission.d.ts.map +0 -1
  336. package/lib/interfaces/PostRefundRetroRemission.d.ts.map +0 -1
  337. package/lib/interfaces/RefundsRequest.d.ts.map +0 -1
  338. package/lib/interfaces/UnidentifiedPaymentsRequest.d.ts.map +0 -1
  339. package/lib/interfaces/UnsolicitedPaymentsRequest.d.ts.map +0 -1
  340. package/lib/payment-lib.component.d.ts.map +0 -1
  341. package/lib/payment-lib.component.ngfactory.d.ts.map +0 -1
  342. package/lib/payment-lib.module.d.ts.map +0 -1
  343. package/lib/payment-lib.module.ngfactory.d.ts.map +0 -1
  344. package/lib/payment-lib.service.d.ts.map +0 -1
  345. package/lib/payment-lib.service.ngfactory.d.ts.map +0 -1
  346. package/lib/pipes/capitalize.pipe.d.ts.map +0 -1
  347. package/lib/pipes/capitalize.pipe.ngfactory.d.ts.map +0 -1
  348. package/lib/pipes/ccd-hyphens.pipe.d.ts.map +0 -1
  349. package/lib/pipes/ccd-hyphens.pipe.ngfactory.d.ts.map +0 -1
  350. package/lib/pipes/key-value.pipe.d.ts.map +0 -1
  351. package/lib/pipes/key-value.pipe.ngfactory.d.ts.map +0 -1
  352. package/lib/pipes/sanitize-html.pipe.d.ts.map +0 -1
  353. package/lib/pipes/sanitize-html.pipe.ngfactory.d.ts.map +0 -1
  354. package/lib/services/bulk-scaning-payment/bulk-scaning-payment.service.d.ts.map +0 -1
  355. package/lib/services/bulk-scaning-payment/bulk-scaning-payment.service.ngfactory.d.ts.map +0 -1
  356. package/lib/services/card-details/card-details.service.d.ts.map +0 -1
  357. package/lib/services/card-details/card-details.service.ngfactory.d.ts.map +0 -1
  358. package/lib/services/case-transactions/case-transactions.service.d.ts.map +0 -1
  359. package/lib/services/case-transactions/case-transactions.service.ngfactory.d.ts.map +0 -1
  360. package/lib/services/notification/notification.service.d.ts.map +0 -1
  361. package/lib/services/notification/notification.service.ngfactory.d.ts.map +0 -1
  362. package/lib/services/orderslist.service.d.ts.map +0 -1
  363. package/lib/services/orderslist.service.ngfactory.d.ts.map +0 -1
  364. package/lib/services/payment-list/payment-list.service.d.ts.map +0 -1
  365. package/lib/services/payment-list/payment-list.service.ngfactory.d.ts.map +0 -1
  366. package/lib/services/payment-view/payment-view.service.d.ts.map +0 -1
  367. package/lib/services/payment-view/payment-view.service.ngfactory.d.ts.map +0 -1
  368. package/lib/services/refunds/refunds.service.d.ts.map +0 -1
  369. package/lib/services/refunds/refunds.service.ngfactory.d.ts.map +0 -1
  370. package/lib/services/shared/error-handler.service.d.ts.map +0 -1
  371. package/lib/services/shared/error-handler.service.ngfactory.d.ts.map +0 -1
  372. package/lib/services/shared/httpclient/webcomponent.http.client.d.ts.map +0 -1
  373. package/lib/services/shared/httpclient/webcomponent.http.client.ngfactory.d.ts.map +0 -1
  374. package/lib/services/shared/logger/console-logger.service.d.ts.map +0 -1
  375. package/lib/services/shared/logger/console-logger.service.ngfactory.d.ts.map +0 -1
  376. package/lib/services/shared/logger/logger.service.d.ts.map +0 -1
  377. package/lib/services/shared/logger/logger.service.ngfactory.d.ts.map +0 -1
  378. package/lib/services/status-history/status-history.service.d.ts.map +0 -1
  379. package/lib/services/status-history/status-history.service.ngfactory.d.ts.map +0 -1
  380. package/lib/services/xl-file/xl-file.service.d.ts.map +0 -1
  381. package/lib/services/xl-file/xl-file.service.ngfactory.d.ts.map +0 -1
  382. package/public_api.d.ts.map +0 -1
  383. /package/{esm2015/lib/interfaces/IBSPayments.js → esm2022/lib/interfaces/IBSPayments.mjs} +0 -0
  384. /package/{esm2015/lib/interfaces/ICardDetails.js → esm2022/lib/interfaces/ICardDetails.mjs} +0 -0
  385. /package/{esm2015/lib/interfaces/IFee.js → esm2022/lib/interfaces/IFee.mjs} +0 -0
  386. /package/{esm2015/lib/interfaces/INotificationPreview.js → esm2022/lib/interfaces/INotificationPreview.mjs} +0 -0
  387. /package/{esm2015/lib/interfaces/IOrderReferenceFee.js → esm2022/lib/interfaces/IOrderReferenceFee.mjs} +0 -0
  388. /package/{esm2015/lib/interfaces/IPatchRefundAction.js → esm2022/lib/interfaces/IPatchRefundAction.mjs} +0 -0
  389. /package/{esm2015/lib/interfaces/IPayment.js → esm2022/lib/interfaces/IPayment.mjs} +0 -0
  390. /package/{esm2015/lib/interfaces/IPaymentFailure.js → esm2022/lib/interfaces/IPaymentFailure.mjs} +0 -0
  391. /package/{esm2015/lib/interfaces/IPaymentGroup.js → esm2022/lib/interfaces/IPaymentGroup.mjs} +0 -0
  392. /package/{esm2015/lib/interfaces/IPaymentView.js → esm2022/lib/interfaces/IPaymentView.mjs} +0 -0
  393. /package/{esm2015/lib/interfaces/IPayments.js → esm2022/lib/interfaces/IPayments.mjs} +0 -0
  394. /package/{esm2015/lib/interfaces/IRefundAction.js → esm2022/lib/interfaces/IRefundAction.mjs} +0 -0
  395. /package/{esm2015/lib/interfaces/IRefundContactDetails.js → esm2022/lib/interfaces/IRefundContactDetails.mjs} +0 -0
  396. /package/{esm2015/lib/interfaces/IRefundFee.js → esm2022/lib/interfaces/IRefundFee.mjs} +0 -0
  397. /package/{esm2015/lib/interfaces/IRefundList.js → esm2022/lib/interfaces/IRefundList.mjs} +0 -0
  398. /package/{esm2015/lib/interfaces/IRefundReasons.js → esm2022/lib/interfaces/IRefundReasons.mjs} +0 -0
  399. /package/{esm2015/lib/interfaces/IRefundRejectReason.js → esm2022/lib/interfaces/IRefundRejectReason.mjs} +0 -0
  400. /package/{esm2015/lib/interfaces/IRefundStatus.js → esm2022/lib/interfaces/IRefundStatus.mjs} +0 -0
  401. /package/{esm2015/lib/interfaces/IRefundStatusHistory.js → esm2022/lib/interfaces/IRefundStatusHistory.mjs} +0 -0
  402. /package/{esm2015/lib/interfaces/IRefundsNotifications.js → esm2022/lib/interfaces/IRefundsNotifications.mjs} +0 -0
  403. /package/{esm2015/lib/interfaces/IRemission.js → esm2022/lib/interfaces/IRemission.mjs} +0 -0
  404. /package/{esm2015/lib/interfaces/IStatusHistories.js → esm2022/lib/interfaces/IStatusHistories.mjs} +0 -0
  405. /package/{esm2015/lib/interfaces/IStatusHistory.js → esm2022/lib/interfaces/IStatusHistory.mjs} +0 -0
  406. /package/{esm2015/public_api.js → esm2022/public_api.mjs} +0 -0
@@ -0,0 +1,407 @@
1
+ import { Component, Input, Inject } from '@angular/core';
2
+ import { FormBuilder, Validators, FormControl } from '@angular/forms';
3
+ import { PaymentViewService } from '../../services/payment-view/payment-view.service';
4
+ import { CaseTransactionsService } from '../../services/case-transactions/case-transactions.service';
5
+ import { BulkScaningPaymentService } from '../../services/bulk-scaning-payment/bulk-scaning-payment.service';
6
+ import { ErrorHandlerService } from '../../services/shared/error-handler.service';
7
+ import { AllocatePaymentRequest } from '../../interfaces/AllocatePaymentRequest';
8
+ import { IAllocationPaymentsRequest } from '../../interfaces/IAllocationPaymentsRequest';
9
+ import { OrderslistService } from '../../services/orderslist.service';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../../services/shared/error-handler.service";
12
+ import * as i2 from "../../services/case-transactions/case-transactions.service";
13
+ import * as i3 from "@angular/forms";
14
+ import * as i4 from "../../services/payment-view/payment-view.service";
15
+ import * as i5 from "../../services/bulk-scaning-payment/bulk-scaning-payment.service";
16
+ import * as i6 from "../../services/orderslist.service";
17
+ import * as i7 from "@angular/common";
18
+ import * as i8 from "../error-banner/error-banner.component";
19
+ import * as i9 from "../../pipes/key-value.pipe";
20
+ export class AllocatePaymentsComponent {
21
+ errorHandlerService;
22
+ caseTransactionsService;
23
+ formBuilder;
24
+ paymentViewService;
25
+ paymentLibComponent;
26
+ bulkScaningPaymentService;
27
+ OrderslistService;
28
+ isTurnOff;
29
+ caseType;
30
+ overUnderPaymentForm;
31
+ viewStatus;
32
+ ccdCaseNumber;
33
+ bspaymentdcn;
34
+ recordId;
35
+ feedbackUrlLabel;
36
+ unAllocatedPayment = {
37
+ amount: 0
38
+ };
39
+ siteID = null;
40
+ // errorMessage = this.errorHandlerService.getServerErrorMessage(false, false, '');
41
+ errorMessage = null;
42
+ paymentGroup;
43
+ paymentGroups = [];
44
+ remainingAmount;
45
+ isRemainingAmountGtZero;
46
+ isMoreDetailsBoxHide = true;
47
+ isRemainingAmountLtZero;
48
+ afterFeeAllocateOutstanding;
49
+ amountForAllocation;
50
+ isConfirmButtondisabled = false;
51
+ isContinueButtondisabled = true;
52
+ otherPaymentExplanation = null;
53
+ selectedOption = null;
54
+ isFeeAmountZero = false;
55
+ paymentReasonHasError = false;
56
+ paymentExplanationHasError = false;
57
+ isPaymentDetailsEmpty = false;
58
+ isPaymentDetailsInvalid = false;
59
+ paymentDetailsMinHasError = false;
60
+ paymentDetailsMaxHasError = false;
61
+ isUserNameEmpty = false;
62
+ isUserNameInvalid = false;
63
+ ccdReference = null;
64
+ exceptionReference = null;
65
+ paymentReason = null;
66
+ paymentExplanation = null;
67
+ userName = null;
68
+ paymentSectionLabel;
69
+ paymentRef = null;
70
+ isStrategicFixEnable = true;
71
+ orderLevelFees = [];
72
+ cookieUserName = [];
73
+ enCookieUserName;
74
+ userNameField = null;
75
+ reasonList = {
76
+ overPayment: {
77
+ hwfReward: 'Help with Fees (HWF) awarded. Please include the HWF reference number in the explanatory note',
78
+ wrongFee: 'Incorrect payment received',
79
+ notIssueCase: 'Unable to issue case',
80
+ otherDeduction: 'Other'
81
+ },
82
+ shortFall: {
83
+ helpWithFee: 'Help with Fees (HWF) application declined',
84
+ wrongFee: 'Incorrect payment received',
85
+ other: 'Other'
86
+ }
87
+ };
88
+ explanationList = {
89
+ overPayment: {
90
+ referRefund: 'Details in case notes. Refund due',
91
+ noRefund: 'Details in case notes. No refund due',
92
+ noCase: 'No case created. Refund due',
93
+ other: 'Other'
94
+ },
95
+ shortFall: {
96
+ holdCase: 'I have put a stop on the case and contacted the applicant requesting the balance of payment',
97
+ heldCase: 'I have put a stop on the case. The applicant needs to be contacted to request the balance of payment',
98
+ other: 'Other'
99
+ }
100
+ };
101
+ refund = {
102
+ reason: {
103
+ duplicate: 'Duplicate payment',
104
+ humanerror: 'Human error',
105
+ caseWithdrawn: 'Case withdrawn',
106
+ other: 'Other'
107
+ }
108
+ };
109
+ constructor(errorHandlerService, caseTransactionsService, formBuilder, paymentViewService, paymentLibComponent, bulkScaningPaymentService, OrderslistService) {
110
+ this.errorHandlerService = errorHandlerService;
111
+ this.caseTransactionsService = caseTransactionsService;
112
+ this.formBuilder = formBuilder;
113
+ this.paymentViewService = paymentViewService;
114
+ this.paymentLibComponent = paymentLibComponent;
115
+ this.bulkScaningPaymentService = bulkScaningPaymentService;
116
+ this.OrderslistService = OrderslistService;
117
+ }
118
+ ngOnInit() {
119
+ this.viewStatus = 'mainForm';
120
+ if (this.paymentLibComponent.paymentGroupReference !== null) {
121
+ this.viewStatus = 'allocatePaymentConfirmation';
122
+ }
123
+ this.ccdCaseNumber = this.paymentLibComponent.CCD_CASE_NUMBER;
124
+ this.bspaymentdcn = this.paymentLibComponent.bspaymentdcn;
125
+ this.paymentRef = this.paymentLibComponent.paymentGroupReference;
126
+ this.selectedOption = this.paymentLibComponent.SELECTED_OPTION;
127
+ this.isStrategicFixEnable = this.paymentLibComponent.ISSFENABLE;
128
+ this.isTurnOff = this.paymentLibComponent.isTurnOff;
129
+ this.overUnderPaymentForm = this.formBuilder.group({
130
+ moreDetails: new FormControl('', Validators.compose([
131
+ Validators.required,
132
+ Validators.minLength(3),
133
+ Validators.maxLength(255),
134
+ Validators.pattern('^([a-zA-Z0-9\\s,\\.]*)$')
135
+ ])),
136
+ userName: new FormControl('', Validators.compose([
137
+ Validators.required,
138
+ Validators.pattern('^([a-zA-Z0-9\\s]*)$')
139
+ ])),
140
+ });
141
+ this.OrderslistService.getOrdersList().subscribe((data) => this.orderLevelFees = data.filter(data => data.orderStatus !== 'Paid'));
142
+ this.OrderslistService.getCaseType().subscribe((data) => this.caseType = data);
143
+ this.getUnassignedPayment();
144
+ }
145
+ getGroupOutstandingAmount(paymentGroup) {
146
+ return this.bulkScaningPaymentService.calculateOutStandingAmount(paymentGroup);
147
+ }
148
+ getPaymentGroupDetails() {
149
+ if (!this.isTurnOff) {
150
+ this.paymentViewService.getPaymentGroupDetails(this.paymentRef).subscribe(paymentGroup => {
151
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(false, false, '');
152
+ this.paymentGroup = paymentGroup;
153
+ this.saveAndContinue();
154
+ }, (error) => {
155
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(true, false, '');
156
+ });
157
+ }
158
+ else {
159
+ this.caseTransactionsService.getPaymentGroups(this.ccdCaseNumber).subscribe(paymentGroups => {
160
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(false, false, '');
161
+ this.paymentGroups = paymentGroups['payment_groups'].filter(paymentGroup => {
162
+ paymentGroup.fees.forEach(fee => {
163
+ if (fee.calculated_amount === 0) {
164
+ this.isFeeAmountZero = true;
165
+ }
166
+ });
167
+ let fstCon = this.getGroupOutstandingAmount(paymentGroup), scndCn = fstCon > 0 || (fstCon == 0 && this.isFeeAmountZero) && paymentGroup.payment_group_reference === this.paymentRef;
168
+ return this.paymentRef ? scndCn : fstCon > 0 || (fstCon == 0 && this.isFeeAmountZero);
169
+ });
170
+ }, (error) => {
171
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(true, false, '');
172
+ });
173
+ }
174
+ }
175
+ selectedPaymentGroup(paymentGroup) {
176
+ this.isContinueButtondisabled = false;
177
+ this.paymentGroup = paymentGroup;
178
+ }
179
+ gotoCasetransationPage() {
180
+ this.paymentLibComponent.viewName = 'case-transactions';
181
+ this.paymentLibComponent.isTurnOff = this.isTurnOff;
182
+ this.paymentLibComponent.TAKEPAYMENT = true;
183
+ this.paymentLibComponent.ISBSENABLE = true;
184
+ }
185
+ gotoSummaryPage(event) {
186
+ event.preventDefault();
187
+ this.paymentLibComponent.viewName = 'fee-summary';
188
+ this.paymentLibComponent.isTurnOff = this.isTurnOff;
189
+ this.paymentLibComponent.TAKEPAYMENT = true;
190
+ this.paymentLibComponent.ISBSENABLE = true;
191
+ }
192
+ cancelAllocatePayment(event) {
193
+ event.preventDefault();
194
+ this.resetForm([false, false, false, false, false, false, false, false], 'all');
195
+ if (!this.isTurnOff) {
196
+ this.paymentLibComponent.viewName = 'fee-summary';
197
+ this.paymentLibComponent.isTurnOff = this.isTurnOff;
198
+ this.paymentLibComponent.TAKEPAYMENT = true;
199
+ this.paymentLibComponent.ISBSENABLE = true;
200
+ }
201
+ else {
202
+ this.viewStatus = 'mainForm';
203
+ }
204
+ }
205
+ confirmAllocatePayement() {
206
+ this.enCookieUserName = document.cookie.split(";").find(row => row.includes("user-info")).split("=")[1].split(";");
207
+ this.cookieUserName = JSON.parse(decodeURIComponent(this.enCookieUserName));
208
+ const fullName = this.cookieUserName['forename'] + ' ' + this.cookieUserName['surname'];
209
+ const paymentDetailsField = this.overUnderPaymentForm.controls.moreDetails, paymentFormError = this.overUnderPaymentForm.controls.moreDetails.errors, userNameField = fullName, isEmptyCondtion = this.paymentReason && this.paymentExplanation, isOtherOptionSelected = this.paymentExplanation === 'Other';
210
+ this.resetForm([false, false, false, false, false, false, false, false], 'all');
211
+ if ((!this.isRemainingAmountGtZero && !this.isRemainingAmountLtZero) || isEmptyCondtion && (!isOtherOptionSelected && userNameField.length > 0 || isOtherOptionSelected && userNameField.length > 0 && paymentDetailsField.valid)) {
212
+ this.isConfirmButtondisabled = true;
213
+ this.otherPaymentExplanation = this.paymentExplanation === 'Other' ? paymentDetailsField.value : this.paymentExplanation;
214
+ this.userName = userNameField;
215
+ this.finalServiceCall();
216
+ }
217
+ else {
218
+ if (!this.paymentReason) {
219
+ this.resetForm([true, false, false, false, false, false, false, false], 'reason');
220
+ }
221
+ if (!this.paymentExplanation) {
222
+ this.resetForm([false, true, false, false, false, false, false, false], 'explanation');
223
+ }
224
+ if (this.paymentExplanation && isOtherOptionSelected) {
225
+ if (paymentDetailsField.value == '') {
226
+ this.resetForm([false, false, true, false, false, false, false, false], 'other');
227
+ }
228
+ if (paymentDetailsField.value != '' && paymentDetailsField.invalid) {
229
+ this.resetForm([false, false, false, true, false, false, false, false], 'other');
230
+ }
231
+ if (paymentFormError && paymentFormError.minlength && paymentFormError.minlength.actualLength < 3) {
232
+ this.resetForm([false, false, false, false, true, false, false, false], 'other');
233
+ }
234
+ if (paymentFormError && paymentFormError.maxlength && paymentFormError.maxlength.actualLength > 255) {
235
+ this.resetForm([false, false, false, false, false, true, false, false], 'other');
236
+ }
237
+ }
238
+ if (userNameField.length === 0) {
239
+ this.resetForm([false, false, false, false, false, false, true, false], 'username');
240
+ }
241
+ }
242
+ }
243
+ resetForm(vals, field) {
244
+ if (field === 'reason' || field === 'all') {
245
+ this.paymentReasonHasError = vals[0];
246
+ }
247
+ if (field === 'explanation' || field === 'all') {
248
+ this.paymentExplanationHasError = vals[1];
249
+ }
250
+ if (field === 'other' || field === 'all') {
251
+ this.isPaymentDetailsEmpty = vals[2];
252
+ this.isPaymentDetailsInvalid = vals[3];
253
+ this.paymentDetailsMinHasError = vals[4];
254
+ this.paymentDetailsMaxHasError = vals[5];
255
+ }
256
+ if (field === 'username' || field === 'all') {
257
+ this.isUserNameEmpty = vals[6];
258
+ this.isUserNameInvalid = vals[7];
259
+ }
260
+ }
261
+ finalServiceCall() {
262
+ if (!this.isStrategicFixEnable) {
263
+ let allocatedRequest = {
264
+ reason: this.paymentReason,
265
+ allocation_status: 'Allocated',
266
+ explanation: this.otherPaymentExplanation,
267
+ payment_allocation_status: {
268
+ description: '',
269
+ name: 'Allocated'
270
+ },
271
+ payment_group_reference: this.paymentGroup.payment_group_reference,
272
+ case_type: this.caseType,
273
+ user_name: this.userName
274
+ };
275
+ const postStrategicBody = new AllocatePaymentRequest(this.ccdReference, this.unAllocatedPayment, this.caseType, this.exceptionReference, allocatedRequest);
276
+ this.bulkScaningPaymentService.postBSPaymentStrategic(postStrategicBody, this.paymentGroup.payment_group_reference).subscribe(res => {
277
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(false, false, '');
278
+ let response = JSON.parse(res);
279
+ if (response.success) {
280
+ this.gotoCasetransationPage();
281
+ }
282
+ }, (error) => {
283
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(true, false, '');
284
+ window.scrollTo(0, 0);
285
+ this.isConfirmButtondisabled = false;
286
+ });
287
+ }
288
+ else {
289
+ this.bulkScaningPaymentService.patchBSChangeStatus(this.unAllocatedPayment.dcn_reference, 'PROCESSED').subscribe(res1 => {
290
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(false, false, '');
291
+ let response1 = JSON.parse(res1);
292
+ if (response1.success) {
293
+ const requestBody = new AllocatePaymentRequest(this.ccdReference, this.unAllocatedPayment, this.siteID, this.exceptionReference);
294
+ this.bulkScaningPaymentService.postBSAllocatePayment(requestBody, this.paymentGroup.payment_group_reference).subscribe(res2 => {
295
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(false, false, '');
296
+ let response2 = JSON.parse(res2);
297
+ const reqBody = new IAllocationPaymentsRequest(response2['data'].payment_group_reference, response2['data'].reference, this.paymentReason, this.otherPaymentExplanation, this.userName);
298
+ if (response2.success) {
299
+ this.paymentViewService.postBSAllocationPayments(reqBody).subscribe(res3 => {
300
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(false, false, '');
301
+ let response3 = JSON.parse(res3);
302
+ if (response3.success) {
303
+ this.gotoCasetransationPage();
304
+ }
305
+ }, (error) => {
306
+ this.bulkScaningPaymentService.patchBSChangeStatus(this.unAllocatedPayment.dcn_reference, 'COMPLETE').subscribe();
307
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(true, false, '');
308
+ window.scrollTo(0, 0);
309
+ this.isConfirmButtondisabled = false;
310
+ });
311
+ }
312
+ }, (error) => {
313
+ this.bulkScaningPaymentService.patchBSChangeStatus(this.unAllocatedPayment.dcn_reference, 'COMPLETE').subscribe();
314
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(true, false, '');
315
+ window.scrollTo(0, 0);
316
+ this.isConfirmButtondisabled = false;
317
+ });
318
+ }
319
+ }, (error) => {
320
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(true, false, '');
321
+ window.scrollTo(0, 0);
322
+ this.isConfirmButtondisabled = false;
323
+ });
324
+ }
325
+ }
326
+ saveAndContinue() {
327
+ if (this.paymentGroup) {
328
+ this.isMoreDetailsBoxHide = true;
329
+ this.overUnderPaymentForm.get('moreDetails').reset();
330
+ this.overUnderPaymentForm.get('moreDetails').setValue('');
331
+ this.overUnderPaymentForm.get('userName').reset();
332
+ this.overUnderPaymentForm.get('userName').setValue('');
333
+ this.paymentReason = '';
334
+ this.paymentExplanation = '';
335
+ let GroupOutstandingAmount = this.getGroupOutstandingAmount(this.paymentGroup);
336
+ const remainingToBeAssigned = this.unAllocatedPayment.amount - GroupOutstandingAmount;
337
+ this.isRemainingAmountGtZero = remainingToBeAssigned > 0;
338
+ this.isRemainingAmountLtZero = remainingToBeAssigned < 0;
339
+ this.paymentSectionLabel = this.isRemainingAmountGtZero ? {
340
+ title: 'There is an Over payment of',
341
+ reason: 'Provide a reason. This will be used in the Refund process.',
342
+ } : this.isRemainingAmountLtZero ? {
343
+ title: 'There is an Under payment of',
344
+ reason: 'Provide a reason',
345
+ } : {
346
+ title: 'Amount left to be allocated',
347
+ reason: '',
348
+ };
349
+ this.feedbackUrlLabel = this.isRemainingAmountGtZero ? 'CONFIRMALLOCATION_SURPLUS' : this.isRemainingAmountLtZero ? 'CONFIRMALLOCATION_SHORTFALL' : 'CONFIRMALLOCATION';
350
+ this.remainingAmount = this.isRemainingAmountGtZero ? remainingToBeAssigned : this.isRemainingAmountLtZero ? remainingToBeAssigned * -1 : 0;
351
+ this.afterFeeAllocateOutstanding = remainingToBeAssigned >= 0 ? 0 : (remainingToBeAssigned * -1);
352
+ this.amountForAllocation = GroupOutstandingAmount >= this.unAllocatedPayment.amount ? this.unAllocatedPayment.amount : GroupOutstandingAmount;
353
+ if (this.isTurnOff) {
354
+ this.viewStatus = 'allocatePaymentConfirmation';
355
+ }
356
+ }
357
+ }
358
+ getUnassignedPayment() {
359
+ this.bulkScaningPaymentService.getBSPaymentsByDCN(this.bspaymentdcn).subscribe(unassignedPayments => {
360
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(false, false, '');
361
+ this.unAllocatedPayment = unassignedPayments['data'].payments.filter(payment => {
362
+ return payment && payment.dcn_reference == this.bspaymentdcn;
363
+ })[0];
364
+ this.siteID = unassignedPayments['data'].responsible_service_id;
365
+ const beCcdNumber = unassignedPayments['data'].ccd_reference, beExceptionNumber = unassignedPayments['data'].exception_record_reference, exceptionReference = beCcdNumber ? beCcdNumber === this.ccdCaseNumber ? null : this.ccdCaseNumber : this.ccdCaseNumber;
366
+ this.ccdReference = beCcdNumber ? beCcdNumber : null;
367
+ this.exceptionReference = beExceptionNumber ? beExceptionNumber : exceptionReference;
368
+ this.getPaymentGroupDetails();
369
+ }, (error) => {
370
+ this.errorMessage = this.errorHandlerService.getServerErrorMessage(true, false, '');
371
+ });
372
+ }
373
+ selectRadioButton(key, type) {
374
+ this.isMoreDetailsBoxHide = true;
375
+ if (type === 'explanation' && key === 'other') {
376
+ this.isPaymentDetailsEmpty = false;
377
+ this.isPaymentDetailsInvalid = false;
378
+ this.paymentDetailsMinHasError = false;
379
+ this.paymentDetailsMaxHasError = false;
380
+ this.isMoreDetailsBoxHide = false;
381
+ }
382
+ }
383
+ OrderListSelectEvent(orderef) {
384
+ this.isContinueButtondisabled = false;
385
+ this.recordId = orderef;
386
+ }
387
+ redirectToOrderFeeSearchPage() {
388
+ // this.paymentLibComponent.bspaymentdcn = null;
389
+ this.paymentLibComponent.paymentGroupReference = this.recordId;
390
+ this.paymentLibComponent.isTurnOff = this.isTurnOff;
391
+ this.paymentLibComponent.viewName = 'fee-summary';
392
+ }
393
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AllocatePaymentsComponent, deps: [{ token: i1.ErrorHandlerService }, { token: i2.CaseTransactionsService }, { token: i3.FormBuilder }, { token: i4.PaymentViewService }, { token: 'PAYMENT_LIB' }, { token: i5.BulkScaningPaymentService }, { token: i6.OrderslistService }], target: i0.ɵɵFactoryTarget.Component });
394
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AllocatePaymentsComponent, selector: "app-allocate-payments", inputs: { isTurnOff: "isTurnOff", caseType: "caseType" }, ngImport: i0, template: "<div class=\"allocate-payments\">\n <ng-container *ngIf=\"viewStatus === 'mainForm' && !isTurnOff\">\n\n <div class=\"govuk-breadcrumbs\">\n <ol class=\"govuk-breadcrumbs__list\">\n <li class=\"govuk-breadcrumbs__list-item\">\n <a (click)=\"gotoCasetransationPage()\" class=\"govuk-back-link govuk-label\">Back</a>\n </li>\n </ol>\n </div>\n \n <div class=\"paymentrequest\">\n <h1 class=\"govuk-heading-xl govuk-!-margin-top-3 govuk-!-margin-bottom-4\">Select payment request</h1>\n <p class=\"govuk-!-margin-top-5 casererf\">Case reference: {{ccdReference}}</p>\n </div>\n \n <div *ngFor=\"let orderRef of orderLevelFees; let i = index;\" class=\"multiple-choice unprocessed-payments--radio-button\">\n <input id=\"'orderfee'+i+''\"\n aria-label=\"orderLevelRecord\"\n name=\"orderLevelRecord\"\n \n (click)=\"OrderListSelectEvent(orderRef.orderRefId)\"\n type=\"radio\"\n value=\"{{orderRef.orderTotalFees}}\" />\n <label for=\"radio-inline-1\"> {{orderRef.orderTotalFees | currency :'GBP':'symbol':'1.2-2'}}({{orderRef.orderStatus}})</label>\n </div>\n \n <div class=\"paymentrequest\">\n <button [disabled]=\"isContinueButtondisabled\" type=\"submit\" (click)=\"redirectToOrderFeeSearchPage()\" class=\"button allbtb button--disabled govuk-!-margin-right-1\">\n Continue\n </button>\n </div>\n \n </ng-container>\n\n <div *ngIf=\"viewStatus==='mainForm' && isTurnOff\">\n <input #myInput type='hidden' class='iFrameDrivenImageValue' value='ALLOCATEPAYMENTS'>\n <div class=\"govuk-breadcrumbs\" *ngIf=\"paymentRef\">\n <ol class=\"govuk-breadcrumbs__list\">\n <li class=\"govuk-breadcrumbs__list-item\">\n <a href=\"#\" (click)=\"gotoSummaryPage($event)\" class=\"govuk-back-link\">Back</a>\n </li>\n </ol>\n </div>\n <div class=\"govuk-heading-section\">\n <h1 class=\"govuk-heading-xl\">Allocate payment to fee group</h1>\n <h2 class=\"govuk-heading-l\">Amount left to be allocated:\n {{ unAllocatedPayment.amount | currency:'GBP':'symbol-narrow':'1.2-2' }}</h2>\n </div>\n <div class=\"payment-group-section\" *ngFor=\"let paymentGroup of paymentGroups\">\n <h3 class=\"govuk-heading-m\">Group reference: {{paymentGroup.payment_group_reference}}</h3>\n <table class=\"govuk-table\">\n <thead class=\"govuk-table__head\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__header\" scope=\"col\"></td>\n <td class=\"govuk-table__header\" scope=\"col\">Code</td>\n <td class=\"govuk-table__header\" scope=\"col\">Description</td>\n <td class=\"govuk-table__header\" scope=\"col\">Volume</td>\n <td class=\"govuk-table__header\" scope=\"col\">Fee amount</td>\n <td class=\"govuk-table__header\" scope=\"col\">Calculated amount</td>\n <td class=\"govuk-table__header\" scope=\"col\">Group amount outstanding</td>\n </tr>\n </thead>\n <tbody class=\"govuk-table__body\">\n <tr class=\"govuk-table__row\" *ngFor=\"let fee of paymentGroup.fees; let i = index;\">\n <td class=\"govuk-table__cell govuk-table__cell--col1 govuk-table__custom--col1\"\n [attr.rowspan]=\"paymentGroup.fees.length\" *ngIf=\"i==0\">\n <div class=\"multiple-choice\">\n <input id=\"unpaiedFee-{{i}}\" name=\"unassignedRecord\" type=\"radio\"\n (click)=\"selectedPaymentGroup(paymentGroup)\" />\n <label for=\"unpaiedFee-{{i}}\"></label>\n </div>\n </td>\n <td class=\"govuk-table__cell govuk-table__cell--col1\">{{fee.code}}</td>\n <td class=\"govuk-table__cell govuk-table__cell--col2\"> {{fee.description}} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col3\"> {{fee.volume? fee.volume : '-'}} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col4\">\n {{ fee.fee_amount | currency:'GBP':'symbol-narrow':'1.2-2' }} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col5\">\n {{fee.calculated_amount | currency:'GBP':'symbol-narrow':'1.2-2' }} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col6 govuk-table__custom--col6\"\n [attr.rowspan]=\"paymentGroup.fees.length\" *ngIf=\"i==0\">\n {{getGroupOutstandingAmount(paymentGroup) | currency:'GBP':'symbol-narrow':'1.2-2' }} </td>\n\n </tr>\n\n </tbody>\n <tbody class=\"govuk-table__body\" *ngIf=\"paymentGroup.fees.length==0\">\n <td class=\"govuk-table__cell\" colspan=\"6\">No payments recorded</td>\n </tbody>\n </table>\n </div>\n <div class=\"govuk-button-group-allocate\">\n <button type=\"button\" class=\"button govuk-!-margin-right-1\" [disabled]=\"isContinueButtondisabled\"\n (click)=\"saveAndContinue()\">\n Continue\n </button>\n <button type=\"button\" class=\"button govuk-button--secondary\" (click)=\"gotoCasetransationPage()\">\n Cancel\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"(viewStatus === 'mainForm' && isTurnOff) || viewStatus === 'allocatePaymentConfirmation'\">\n <ccpay-error-banner *ngIf=\"errorMessage.showError\" [errorMessage]=\"errorMessage\"></ccpay-error-banner>\n <input #myInput type='hidden' class='iFrameDrivenImageValue' value='{{feedbackUrlLabel}}'>\n <h1 class=\"govuk-heading-xl\">Confirm allocation</h1>\n <h2 class=\"govuk-heading-l govuk-heading-l--custom\">\n Amount to be allocated: {{amountForAllocation | currency:'GBP':'symbol-narrow':'1.2-2'}}\n </h2>\n <div class=\"payment-group-section\" *ngIf=\"paymentGroup\">\n <h3 class=\"govuk-heading-m--custom\" *ngIf=\"isTurnOff\">Group reference: {{paymentGroup.payment_group_reference}}\n </h3>\n <table class=\"govuk-table\">\n <thead class=\"govuk-table__head\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__header\" scope=\"col\">Code</td>\n <td class=\"govuk-table__header\" scope=\"col\">Description</td>\n <td class=\"govuk-table__header\" scope=\"col\">Volume</td>\n <td class=\"govuk-table__header\" scope=\"col\">Fee amount</td>\n <td class=\"govuk-table__header\" scope=\"col\">Calculated amount</td>\n <td class=\"govuk-table__header\" scope=\"col\">Amount Due</td>\n </tr>\n </thead>\n <tbody class=\"govuk-table__body\">\n <tr class=\"govuk-table__row\" *ngFor=\"let fee of paymentGroup.fees; let i = index;\">\n <td class=\"govuk-table__cell govuk-table__cell--col1\">{{fee.code}}</td>\n <td class=\"govuk-table__cell govuk-table__cell--col2\"> {{fee.description}} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col3\"> {{fee.volume? fee.volume : '-'}} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col4\">\n {{ fee.fee_amount | currency:'GBP':'symbol-narrow':'1.2-2' }} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col5\">\n {{fee.calculated_amount | currency:'GBP':'symbol-narrow':'1.2-2'}} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col6\" [attr.rowspan]=\"paymentGroup.fees.length\"\n *ngIf=\"i==0\"> {{afterFeeAllocateOutstanding | currency:'GBP':'symbol-narrow':'1.2-2'}} </td>\n </tr>\n </tbody>\n <tbody class=\"govuk-table__body\" *ngIf=\"paymentGroup.fees.length == 0\">\n <td class=\"govuk-table__cell\" colspan=\"6\">No payments recorded</td>\n </tbody>\n </table>\n </div>\n <div class=\"govuk-warning-text\" *ngIf=\"isRemainingAmountGtZero || isRemainingAmountLtZero || remainingAmount === 0\">\n <span class=\"govuk-warning-text__icon\" aria-hidden=\"true\">!</span>\n <strong class=\"govuk-warning-text__text govuk-warning-text__custom\">\n <span class=\"govuk-warning-text__assistive\">Warning</span>\n {{paymentSectionLabel.title}} {{ remainingAmount | currency:'GBP':'symbol-narrow':'1.2-2' }}\n </strong>\n </div>\n <div class=\"govuk-form-group\" *ngIf=\"isRemainingAmountGtZero || isRemainingAmountLtZero\">\n <div class=\"govuk-form-group\">\n <fieldset class=\"govuk-fieldset\" aria-describedby=\"how-contacted-conditional-hint\">\n <span id=\"how-contacted-conditional-hint\" class=\"govuk-hint\"\n [ngClass]=\"{'inline-error-message': paymentReasonHasError}\">\n {{paymentSectionLabel.reason}}\n </span>\n <div\n [ngClass]=\"paymentReasonHasError ? 'govuk-radios govuk-radios--conditional form-group-error' : 'govuk-radios govuk-radios--conditional'\"\n data-module=\"govuk-radios\" *ngIf=\"isRemainingAmountGtZero\">\n <div class=\"govuk-radios__item\" *ngFor=\"let reason of reasonList.overPayment | keyValue\">\n <input class=\"govuk-radios__input\" id=\"{{reason.key}}\" name=\"paymentReason\" type=\"radio\"\n [(ngModel)]=\"paymentReason\" value={{reason.value}}>\n <label class=\"govuk-label govuk-radios__label govuk-font__custom\" for=\"how-contacted-conditional\">\n {{reason.value}}\n </label>\n </div>\n </div>\n <div\n [ngClass]=\"paymentReasonHasError ? 'govuk-radios govuk-radios--conditional form-group-error' : 'govuk-radios govuk-radios--conditional'\"\n data-module=\"govuk-radios\" *ngIf=\"isRemainingAmountLtZero\">\n <div class=\"govuk-radios__item\" *ngFor=\"let reason of reasonList.shortFall | keyValue\">\n <input class=\"govuk-radios__input\" id=\"{{reason.key}}\" name=\"paymentReason\" type=\"radio\"\n [(ngModel)]=\"paymentReason\" value={{reason.value}}>\n <label class=\"govuk-label govuk-radios__label govuk-font__custom\" for=\"how-contacted-conditional\">\n {{reason.value}}\n </label>\n </div>\n </div>\n </fieldset>\n </div>\n <div class=\"govuk-form-group\">\n <fieldset class=\"govuk-fieldset\" aria-describedby=\"how-contacted-conditional-hint\">\n <span id=\"how-contacted-conditional-hint\" class=\"govuk-hint\"\n [ngClass]=\"{'inline-error-message': paymentExplanationHasError}\">\n Provide an explanatory note\n </span>\n <div\n [ngClass]=\"paymentExplanationHasError ? 'govuk-radios govuk-radios--conditional form-group-error' : 'govuk-radios govuk-radios--conditional'\"\n data-module=\"govuk-radios\" *ngIf=\"isRemainingAmountGtZero\">\n <div class=\"govuk-radios__item\" *ngFor=\"let explanation of explanationList.overPayment | keyValue\">\n <input class=\"govuk-radios__input\" id=\"{{explanation.key}}\" name=\"paymentExplanation\" type=\"radio\"\n [(ngModel)]=\"paymentExplanation\" value={{explanation.value}}\n (click)=\"selectRadioButton(explanation.key, 'explanation')\">\n <label class=\"govuk-label govuk-radios__label govuk-font__custom\" for=\"how-contacted-conditional\">\n {{explanation.value}}\n </label>\n </div>\n </div>\n <div\n [ngClass]=\"paymentExplanationHasError ? 'govuk-radios govuk-radios--conditional form-group-error' : 'govuk-radios govuk-radios--conditional'\"\n data-module=\"govuk-radios\" *ngIf=\"isRemainingAmountLtZero\">\n <div class=\"govuk-radios__item\" *ngFor=\"let explanation of explanationList.shortFall | keyValue\">\n <input class=\"govuk-radios__input\" id=\"{{explanation.key}}\" name=\"paymentExplanation\" type=\"radio\"\n [(ngModel)]=\"paymentExplanation\" value={{explanation.value}}\n (click)=\"selectRadioButton(explanation.key, 'explanation')\">\n <label class=\"govuk-label govuk-radios__label govuk-font__custom\" for=\"how-contacted-conditional\">\n {{explanation.value}}\n </label>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n\n <form [formGroup]=\"overUnderPaymentForm\" novalidate>\n <div\n [ngClass]=\"isMoreDetailsBoxHide ? 'govuk-radios__conditional govuk-radios__conditional--hidden' : isPaymentDetailsEmpty || isPaymentDetailsInvalid || paymentDetailsMinHasError || paymentDetailsMaxHasError ? 'govuk-radios__conditional inline-error-border' : 'govuk-radios__conditional'\"\n id=\"conditional-how-contacted-conditional-3\">\n <div class=\"govuk-form-group\">\n <span id=\"more-detail-hint\" class=\"govuk-hint govuk-font__custom\">\n Please enter details\n </span>\n <textarea class=\"govuk-textarea\"\n [ngClass]=\"{'inline-error-class': isPaymentDetailsEmpty || isPaymentDetailsInvalid || paymentDetailsMinHasError || paymentDetailsMaxHasError}\"\n id=\"moreDetails\" name=\"moreDetails\" rows=\"5\" formControlName=\"moreDetails\">\n </textarea>\n <p class=\"inline-error-message\"\n *ngIf=\"isPaymentDetailsEmpty || isPaymentDetailsInvalid || paymentDetailsMinHasError || paymentDetailsMaxHasError\">\n <span *ngIf=\"isPaymentDetailsEmpty\">Enter a explanation</span>\n <span *ngIf=\"isPaymentDetailsInvalid\">Enter a valid explanation</span>\n <span *ngIf=\"paymentDetailsMinHasError\">Explanation should be at least 3 characters.</span>\n <span *ngIf=\"paymentDetailsMaxHasError\">Explanation should be 255 characters or under.</span>\n </p>\n </div>\n </div>\n <div class=\"govuk-button--group\">\n <button type=\"submit\" [disabled]=\"isConfirmButtondisabled\"\n [ngClass]=\"isConfirmButtondisabled ? 'button button--disabled' : 'button'\"\n (click)=\"confirmAllocatePayement()\">\n Confirm\n </button>\n <button type=\"button\" class=\"button govuk-button--secondary\" (click)=\"cancelAllocatePayment($event)\">\n Cancel\n </button>\n </div>\n </form>\n </ng-container>\n</div>", styles: [".allocate-payments{margin:20px 0}.allocate-payments .govuk-table__cell--col1,.allocate-payments .govuk-table__cell--col3{width:10%}.allocate-payments .govuk-table__cell--col2,.allocate-payments .govuk-table__cell--col6{width:25%}.allocate-payments .govuk-table__cell--col4,.allocate-payments .govuk-table__cell--col5{width:15%}.allocate-payments .govuk-button-group-allocate{display:flex;justify-content:flex-start}.allocate-payments .govuk-button--secondary{margin-left:10px;background-color:#b3b8bdf2}.allocate-payments .govuk-custom-warning__message{font-size:30px;position:relative;top:12px;font-weight:700}.allocate-payments .govuk-warning-text-custom{margin-bottom:0!important;padding:10px 0 5px}.allocate-payments .govuk-table__custom--col1{padding-top:0;padding-bottom:20px;padding-left:15px}.allocate-payments .govuk-table__custom--col6{text-align:center}.allocate-payments .govuk-list__custom{padding-left:20px}.allocate-payments .govuk-warning-text__custom,.allocate-payments .govuk-list__custom,.allocate-payments .govuk-heading-m--custom,.allocate-payments .govuk-label--m,.allocate-payments .govuk-radios__item,.allocate-payments .govuk-hint,.allocate-payments .govuk-font__custom{font-size:19px}.allocate-payments .govuk-radios__conditional--hidden{display:none}.allocate-payments .form-group-error{border-left:5px solid #b10e1e;padding-left:15px}.allocate-payments .inline-error-class{outline:3px solid #a71414;outline-offset:0}.allocate-payments .inline-error-message{color:#a71414;font-weight:700;margin-top:10px}.allocate-payments .inline-error-border{border-color:#a71414}.allbtb{margin-top:2em}.govuk-back-link{font-size:1.5rem!important}.multiple-choice{font-size:19px}.casererf{align-self:flex-end;font-size:19px}.paymentrequest{display:flex;flex-direction:row;justify-content:space-between;width:960px}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.ErrorBannerComponent, selector: "ccpay-error-banner", inputs: ["errorMessage"] }, { kind: "pipe", type: i7.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i9.keyValuePipe, name: "keyValue" }] });
395
+ }
396
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AllocatePaymentsComponent, decorators: [{
397
+ type: Component,
398
+ args: [{ selector: 'app-allocate-payments', template: "<div class=\"allocate-payments\">\n <ng-container *ngIf=\"viewStatus === 'mainForm' && !isTurnOff\">\n\n <div class=\"govuk-breadcrumbs\">\n <ol class=\"govuk-breadcrumbs__list\">\n <li class=\"govuk-breadcrumbs__list-item\">\n <a (click)=\"gotoCasetransationPage()\" class=\"govuk-back-link govuk-label\">Back</a>\n </li>\n </ol>\n </div>\n \n <div class=\"paymentrequest\">\n <h1 class=\"govuk-heading-xl govuk-!-margin-top-3 govuk-!-margin-bottom-4\">Select payment request</h1>\n <p class=\"govuk-!-margin-top-5 casererf\">Case reference: {{ccdReference}}</p>\n </div>\n \n <div *ngFor=\"let orderRef of orderLevelFees; let i = index;\" class=\"multiple-choice unprocessed-payments--radio-button\">\n <input id=\"'orderfee'+i+''\"\n aria-label=\"orderLevelRecord\"\n name=\"orderLevelRecord\"\n \n (click)=\"OrderListSelectEvent(orderRef.orderRefId)\"\n type=\"radio\"\n value=\"{{orderRef.orderTotalFees}}\" />\n <label for=\"radio-inline-1\"> {{orderRef.orderTotalFees | currency :'GBP':'symbol':'1.2-2'}}({{orderRef.orderStatus}})</label>\n </div>\n \n <div class=\"paymentrequest\">\n <button [disabled]=\"isContinueButtondisabled\" type=\"submit\" (click)=\"redirectToOrderFeeSearchPage()\" class=\"button allbtb button--disabled govuk-!-margin-right-1\">\n Continue\n </button>\n </div>\n \n </ng-container>\n\n <div *ngIf=\"viewStatus==='mainForm' && isTurnOff\">\n <input #myInput type='hidden' class='iFrameDrivenImageValue' value='ALLOCATEPAYMENTS'>\n <div class=\"govuk-breadcrumbs\" *ngIf=\"paymentRef\">\n <ol class=\"govuk-breadcrumbs__list\">\n <li class=\"govuk-breadcrumbs__list-item\">\n <a href=\"#\" (click)=\"gotoSummaryPage($event)\" class=\"govuk-back-link\">Back</a>\n </li>\n </ol>\n </div>\n <div class=\"govuk-heading-section\">\n <h1 class=\"govuk-heading-xl\">Allocate payment to fee group</h1>\n <h2 class=\"govuk-heading-l\">Amount left to be allocated:\n {{ unAllocatedPayment.amount | currency:'GBP':'symbol-narrow':'1.2-2' }}</h2>\n </div>\n <div class=\"payment-group-section\" *ngFor=\"let paymentGroup of paymentGroups\">\n <h3 class=\"govuk-heading-m\">Group reference: {{paymentGroup.payment_group_reference}}</h3>\n <table class=\"govuk-table\">\n <thead class=\"govuk-table__head\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__header\" scope=\"col\"></td>\n <td class=\"govuk-table__header\" scope=\"col\">Code</td>\n <td class=\"govuk-table__header\" scope=\"col\">Description</td>\n <td class=\"govuk-table__header\" scope=\"col\">Volume</td>\n <td class=\"govuk-table__header\" scope=\"col\">Fee amount</td>\n <td class=\"govuk-table__header\" scope=\"col\">Calculated amount</td>\n <td class=\"govuk-table__header\" scope=\"col\">Group amount outstanding</td>\n </tr>\n </thead>\n <tbody class=\"govuk-table__body\">\n <tr class=\"govuk-table__row\" *ngFor=\"let fee of paymentGroup.fees; let i = index;\">\n <td class=\"govuk-table__cell govuk-table__cell--col1 govuk-table__custom--col1\"\n [attr.rowspan]=\"paymentGroup.fees.length\" *ngIf=\"i==0\">\n <div class=\"multiple-choice\">\n <input id=\"unpaiedFee-{{i}}\" name=\"unassignedRecord\" type=\"radio\"\n (click)=\"selectedPaymentGroup(paymentGroup)\" />\n <label for=\"unpaiedFee-{{i}}\"></label>\n </div>\n </td>\n <td class=\"govuk-table__cell govuk-table__cell--col1\">{{fee.code}}</td>\n <td class=\"govuk-table__cell govuk-table__cell--col2\"> {{fee.description}} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col3\"> {{fee.volume? fee.volume : '-'}} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col4\">\n {{ fee.fee_amount | currency:'GBP':'symbol-narrow':'1.2-2' }} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col5\">\n {{fee.calculated_amount | currency:'GBP':'symbol-narrow':'1.2-2' }} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col6 govuk-table__custom--col6\"\n [attr.rowspan]=\"paymentGroup.fees.length\" *ngIf=\"i==0\">\n {{getGroupOutstandingAmount(paymentGroup) | currency:'GBP':'symbol-narrow':'1.2-2' }} </td>\n\n </tr>\n\n </tbody>\n <tbody class=\"govuk-table__body\" *ngIf=\"paymentGroup.fees.length==0\">\n <td class=\"govuk-table__cell\" colspan=\"6\">No payments recorded</td>\n </tbody>\n </table>\n </div>\n <div class=\"govuk-button-group-allocate\">\n <button type=\"button\" class=\"button govuk-!-margin-right-1\" [disabled]=\"isContinueButtondisabled\"\n (click)=\"saveAndContinue()\">\n Continue\n </button>\n <button type=\"button\" class=\"button govuk-button--secondary\" (click)=\"gotoCasetransationPage()\">\n Cancel\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"(viewStatus === 'mainForm' && isTurnOff) || viewStatus === 'allocatePaymentConfirmation'\">\n <ccpay-error-banner *ngIf=\"errorMessage.showError\" [errorMessage]=\"errorMessage\"></ccpay-error-banner>\n <input #myInput type='hidden' class='iFrameDrivenImageValue' value='{{feedbackUrlLabel}}'>\n <h1 class=\"govuk-heading-xl\">Confirm allocation</h1>\n <h2 class=\"govuk-heading-l govuk-heading-l--custom\">\n Amount to be allocated: {{amountForAllocation | currency:'GBP':'symbol-narrow':'1.2-2'}}\n </h2>\n <div class=\"payment-group-section\" *ngIf=\"paymentGroup\">\n <h3 class=\"govuk-heading-m--custom\" *ngIf=\"isTurnOff\">Group reference: {{paymentGroup.payment_group_reference}}\n </h3>\n <table class=\"govuk-table\">\n <thead class=\"govuk-table__head\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__header\" scope=\"col\">Code</td>\n <td class=\"govuk-table__header\" scope=\"col\">Description</td>\n <td class=\"govuk-table__header\" scope=\"col\">Volume</td>\n <td class=\"govuk-table__header\" scope=\"col\">Fee amount</td>\n <td class=\"govuk-table__header\" scope=\"col\">Calculated amount</td>\n <td class=\"govuk-table__header\" scope=\"col\">Amount Due</td>\n </tr>\n </thead>\n <tbody class=\"govuk-table__body\">\n <tr class=\"govuk-table__row\" *ngFor=\"let fee of paymentGroup.fees; let i = index;\">\n <td class=\"govuk-table__cell govuk-table__cell--col1\">{{fee.code}}</td>\n <td class=\"govuk-table__cell govuk-table__cell--col2\"> {{fee.description}} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col3\"> {{fee.volume? fee.volume : '-'}} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col4\">\n {{ fee.fee_amount | currency:'GBP':'symbol-narrow':'1.2-2' }} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col5\">\n {{fee.calculated_amount | currency:'GBP':'symbol-narrow':'1.2-2'}} </td>\n <td class=\"govuk-table__cell govuk-table__cell--col6\" [attr.rowspan]=\"paymentGroup.fees.length\"\n *ngIf=\"i==0\"> {{afterFeeAllocateOutstanding | currency:'GBP':'symbol-narrow':'1.2-2'}} </td>\n </tr>\n </tbody>\n <tbody class=\"govuk-table__body\" *ngIf=\"paymentGroup.fees.length == 0\">\n <td class=\"govuk-table__cell\" colspan=\"6\">No payments recorded</td>\n </tbody>\n </table>\n </div>\n <div class=\"govuk-warning-text\" *ngIf=\"isRemainingAmountGtZero || isRemainingAmountLtZero || remainingAmount === 0\">\n <span class=\"govuk-warning-text__icon\" aria-hidden=\"true\">!</span>\n <strong class=\"govuk-warning-text__text govuk-warning-text__custom\">\n <span class=\"govuk-warning-text__assistive\">Warning</span>\n {{paymentSectionLabel.title}} {{ remainingAmount | currency:'GBP':'symbol-narrow':'1.2-2' }}\n </strong>\n </div>\n <div class=\"govuk-form-group\" *ngIf=\"isRemainingAmountGtZero || isRemainingAmountLtZero\">\n <div class=\"govuk-form-group\">\n <fieldset class=\"govuk-fieldset\" aria-describedby=\"how-contacted-conditional-hint\">\n <span id=\"how-contacted-conditional-hint\" class=\"govuk-hint\"\n [ngClass]=\"{'inline-error-message': paymentReasonHasError}\">\n {{paymentSectionLabel.reason}}\n </span>\n <div\n [ngClass]=\"paymentReasonHasError ? 'govuk-radios govuk-radios--conditional form-group-error' : 'govuk-radios govuk-radios--conditional'\"\n data-module=\"govuk-radios\" *ngIf=\"isRemainingAmountGtZero\">\n <div class=\"govuk-radios__item\" *ngFor=\"let reason of reasonList.overPayment | keyValue\">\n <input class=\"govuk-radios__input\" id=\"{{reason.key}}\" name=\"paymentReason\" type=\"radio\"\n [(ngModel)]=\"paymentReason\" value={{reason.value}}>\n <label class=\"govuk-label govuk-radios__label govuk-font__custom\" for=\"how-contacted-conditional\">\n {{reason.value}}\n </label>\n </div>\n </div>\n <div\n [ngClass]=\"paymentReasonHasError ? 'govuk-radios govuk-radios--conditional form-group-error' : 'govuk-radios govuk-radios--conditional'\"\n data-module=\"govuk-radios\" *ngIf=\"isRemainingAmountLtZero\">\n <div class=\"govuk-radios__item\" *ngFor=\"let reason of reasonList.shortFall | keyValue\">\n <input class=\"govuk-radios__input\" id=\"{{reason.key}}\" name=\"paymentReason\" type=\"radio\"\n [(ngModel)]=\"paymentReason\" value={{reason.value}}>\n <label class=\"govuk-label govuk-radios__label govuk-font__custom\" for=\"how-contacted-conditional\">\n {{reason.value}}\n </label>\n </div>\n </div>\n </fieldset>\n </div>\n <div class=\"govuk-form-group\">\n <fieldset class=\"govuk-fieldset\" aria-describedby=\"how-contacted-conditional-hint\">\n <span id=\"how-contacted-conditional-hint\" class=\"govuk-hint\"\n [ngClass]=\"{'inline-error-message': paymentExplanationHasError}\">\n Provide an explanatory note\n </span>\n <div\n [ngClass]=\"paymentExplanationHasError ? 'govuk-radios govuk-radios--conditional form-group-error' : 'govuk-radios govuk-radios--conditional'\"\n data-module=\"govuk-radios\" *ngIf=\"isRemainingAmountGtZero\">\n <div class=\"govuk-radios__item\" *ngFor=\"let explanation of explanationList.overPayment | keyValue\">\n <input class=\"govuk-radios__input\" id=\"{{explanation.key}}\" name=\"paymentExplanation\" type=\"radio\"\n [(ngModel)]=\"paymentExplanation\" value={{explanation.value}}\n (click)=\"selectRadioButton(explanation.key, 'explanation')\">\n <label class=\"govuk-label govuk-radios__label govuk-font__custom\" for=\"how-contacted-conditional\">\n {{explanation.value}}\n </label>\n </div>\n </div>\n <div\n [ngClass]=\"paymentExplanationHasError ? 'govuk-radios govuk-radios--conditional form-group-error' : 'govuk-radios govuk-radios--conditional'\"\n data-module=\"govuk-radios\" *ngIf=\"isRemainingAmountLtZero\">\n <div class=\"govuk-radios__item\" *ngFor=\"let explanation of explanationList.shortFall | keyValue\">\n <input class=\"govuk-radios__input\" id=\"{{explanation.key}}\" name=\"paymentExplanation\" type=\"radio\"\n [(ngModel)]=\"paymentExplanation\" value={{explanation.value}}\n (click)=\"selectRadioButton(explanation.key, 'explanation')\">\n <label class=\"govuk-label govuk-radios__label govuk-font__custom\" for=\"how-contacted-conditional\">\n {{explanation.value}}\n </label>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n\n <form [formGroup]=\"overUnderPaymentForm\" novalidate>\n <div\n [ngClass]=\"isMoreDetailsBoxHide ? 'govuk-radios__conditional govuk-radios__conditional--hidden' : isPaymentDetailsEmpty || isPaymentDetailsInvalid || paymentDetailsMinHasError || paymentDetailsMaxHasError ? 'govuk-radios__conditional inline-error-border' : 'govuk-radios__conditional'\"\n id=\"conditional-how-contacted-conditional-3\">\n <div class=\"govuk-form-group\">\n <span id=\"more-detail-hint\" class=\"govuk-hint govuk-font__custom\">\n Please enter details\n </span>\n <textarea class=\"govuk-textarea\"\n [ngClass]=\"{'inline-error-class': isPaymentDetailsEmpty || isPaymentDetailsInvalid || paymentDetailsMinHasError || paymentDetailsMaxHasError}\"\n id=\"moreDetails\" name=\"moreDetails\" rows=\"5\" formControlName=\"moreDetails\">\n </textarea>\n <p class=\"inline-error-message\"\n *ngIf=\"isPaymentDetailsEmpty || isPaymentDetailsInvalid || paymentDetailsMinHasError || paymentDetailsMaxHasError\">\n <span *ngIf=\"isPaymentDetailsEmpty\">Enter a explanation</span>\n <span *ngIf=\"isPaymentDetailsInvalid\">Enter a valid explanation</span>\n <span *ngIf=\"paymentDetailsMinHasError\">Explanation should be at least 3 characters.</span>\n <span *ngIf=\"paymentDetailsMaxHasError\">Explanation should be 255 characters or under.</span>\n </p>\n </div>\n </div>\n <div class=\"govuk-button--group\">\n <button type=\"submit\" [disabled]=\"isConfirmButtondisabled\"\n [ngClass]=\"isConfirmButtondisabled ? 'button button--disabled' : 'button'\"\n (click)=\"confirmAllocatePayement()\">\n Confirm\n </button>\n <button type=\"button\" class=\"button govuk-button--secondary\" (click)=\"cancelAllocatePayment($event)\">\n Cancel\n </button>\n </div>\n </form>\n </ng-container>\n</div>", styles: [".allocate-payments{margin:20px 0}.allocate-payments .govuk-table__cell--col1,.allocate-payments .govuk-table__cell--col3{width:10%}.allocate-payments .govuk-table__cell--col2,.allocate-payments .govuk-table__cell--col6{width:25%}.allocate-payments .govuk-table__cell--col4,.allocate-payments .govuk-table__cell--col5{width:15%}.allocate-payments .govuk-button-group-allocate{display:flex;justify-content:flex-start}.allocate-payments .govuk-button--secondary{margin-left:10px;background-color:#b3b8bdf2}.allocate-payments .govuk-custom-warning__message{font-size:30px;position:relative;top:12px;font-weight:700}.allocate-payments .govuk-warning-text-custom{margin-bottom:0!important;padding:10px 0 5px}.allocate-payments .govuk-table__custom--col1{padding-top:0;padding-bottom:20px;padding-left:15px}.allocate-payments .govuk-table__custom--col6{text-align:center}.allocate-payments .govuk-list__custom{padding-left:20px}.allocate-payments .govuk-warning-text__custom,.allocate-payments .govuk-list__custom,.allocate-payments .govuk-heading-m--custom,.allocate-payments .govuk-label--m,.allocate-payments .govuk-radios__item,.allocate-payments .govuk-hint,.allocate-payments .govuk-font__custom{font-size:19px}.allocate-payments .govuk-radios__conditional--hidden{display:none}.allocate-payments .form-group-error{border-left:5px solid #b10e1e;padding-left:15px}.allocate-payments .inline-error-class{outline:3px solid #a71414;outline-offset:0}.allocate-payments .inline-error-message{color:#a71414;font-weight:700;margin-top:10px}.allocate-payments .inline-error-border{border-color:#a71414}.allbtb{margin-top:2em}.govuk-back-link{font-size:1.5rem!important}.multiple-choice{font-size:19px}.casererf{align-self:flex-end;font-size:19px}.paymentrequest{display:flex;flex-direction:row;justify-content:space-between;width:960px}\n"] }]
399
+ }], ctorParameters: function () { return [{ type: i1.ErrorHandlerService }, { type: i2.CaseTransactionsService }, { type: i3.FormBuilder }, { type: i4.PaymentViewService }, { type: undefined, decorators: [{
400
+ type: Inject,
401
+ args: ['PAYMENT_LIB']
402
+ }] }, { type: i5.BulkScaningPaymentService }, { type: i6.OrderslistService }]; }, propDecorators: { isTurnOff: [{
403
+ type: Input
404
+ }], caseType: [{
405
+ type: Input
406
+ }] } });
407
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb2NhdGUtcGF5bWVudHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF5bWVudC1saWIvc3JjL2xpYi9jb21wb25lbnRzL2FsbG9jYXRlLXBheW1lbnRzL2FsbG9jYXRlLXBheW1lbnRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BheW1lbnQtbGliL3NyYy9saWIvY29tcG9uZW50cy9hbGxvY2F0ZS1wYXltZW50cy9hbGxvY2F0ZS1wYXltZW50cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBYSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDdEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDckcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0VBQWtFLENBQUM7QUFDN0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFHbEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7Ozs7O0FBU3RFLE1BQU0sT0FBTyx5QkFBeUI7SUF5RjFCO0lBQ0E7SUFDQTtJQUNBO0lBQ3VCO0lBQ3ZCO0lBQ0E7SUE5RkQsU0FBUyxDQUFVO0lBQ25CLFFBQVEsQ0FBUztJQUUxQixvQkFBb0IsQ0FBWTtJQUNoQyxVQUFVLENBQVM7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b0IsR0FBRyxLQUFLLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBQ0Qsb0JBQW9CLENBQUMsT0FBWTtRQUMvQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCw0QkFBNEI7UUFDMUIsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9ELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQztJQUNwRCxDQUFDO3VHQTdaVSx5QkFBeUIseUpBNkYxQixhQUFhOzJGQTdGWix5QkFBeUIsdUhDckJ0Qyw4b2NBdVBNOzsyRkRsT08seUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHVCQUF1Qjs7MEJBaUc5QixNQUFNOzJCQUFDLGFBQWE7b0hBNUZkLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB0eXBlIHsgUGF5bWVudExpYkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BheW1lbnQtbGliLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXltZW50Vmlld1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wYXltZW50LXZpZXcvcGF5bWVudC12aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FzZVRyYW5zYWN0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYXNlLXRyYW5zYWN0aW9ucy9jYXNlLXRyYW5zYWN0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IEJ1bGtTY2FuaW5nUGF5bWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9idWxrLXNjYW5pbmctcGF5bWVudC9idWxrLXNjYW5pbmctcGF5bWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEVycm9ySGFuZGxlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zaGFyZWQvZXJyb3ItaGFuZGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IElQYXltZW50R3JvdXAgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lQYXltZW50R3JvdXAnO1xuaW1wb3J0IHsgSUJTUGF5bWVudHMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lCU1BheW1lbnRzJztcbmltcG9ydCB7IEFsbG9jYXRlUGF5bWVudFJlcXVlc3QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0FsbG9jYXRlUGF5bWVudFJlcXVlc3QnO1xuaW1wb3J0IHsgSUFsbG9jYXRpb25QYXltZW50c1JlcXVlc3QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lBbGxvY2F0aW9uUGF5bWVudHNSZXF1ZXN0JztcbmltcG9ydCB7IElPcmRlclJlZmVyZW5jZUZlZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSU9yZGVyUmVmZXJlbmNlRmVlJztcbmltcG9ydCB7IE9yZGVyc2xpc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3JkZXJzbGlzdC5zZXJ2aWNlJztcblxuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hbGxvY2F0ZS1wYXltZW50cycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbGxvY2F0ZS1wYXltZW50cy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FsbG9jYXRlLXBheW1lbnRzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQWxsb2NhdGVQYXltZW50c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGlzVHVybk9mZjogYm9vbGVhbjtcbiAgQElucHV0KCkgY2FzZVR5cGU6IHN0cmluZztcblxuICBvdmVyVW5kZXJQYXltZW50Rm9ybTogRm9ybUdyb3VwO1xuICB2aWV3U3RhdHVzOiBzdHJpbmc7XG4gIGNjZENhc2VOdW1iZXI6IHN0cmluZztcbiAgYnNwYXltZW50ZGNuOiBzdHJpbmc7XG4gIHJlY29yZElkOiBzdHJpbmc7XG4gIGZlZWRiYWNrVXJsTGFiZWw6IHN0cmluZztcbiAgdW5BbGxvY2F0ZWRQYXltZW50OiBJQlNQYXltZW50cyA9IHtcbiAgICBhbW91bnQ6IDBcbiAgfTtcbiAgc2l0ZUlEOiBzdHJpbmcgPSBudWxsO1xuICAvLyBlcnJvck1lc3NhZ2UgPSB0aGlzLmVycm9ySGFuZGxlclNlcnZpY2UuZ2V0U2VydmVyRXJyb3JNZXNzYWdlKGZhbHNlLCBmYWxzZSwgJycpO1xuICBlcnJvck1lc3NhZ2UgPSBudWxsXG4gIHBheW1lbnRHcm91cDogSVBheW1lbnRHcm91cDtcbiAgcGF5bWVudEdyb3VwczogSVBheW1lbnRHcm91cFtdID0gW107XG4gIHJlbWFpbmluZ0Ftb3VudDogbnVtYmVyO1xuICBpc1JlbWFpbmluZ0Ftb3VudEd0WmVybzogYm9vbGVhbjtcbiAgaXNNb3JlRGV0YWlsc0JveEhpZGU6IGJvb2xlYW4gPSB0cnVlO1xuICBpc1JlbWFpbmluZ0Ftb3VudEx0WmVybzogYm9vbGVhbjtcbiAgYWZ0ZXJGZWVBbGxvY2F0ZU91dHN0YW5kaW5nOiBudW1iZXI7XG4gIGFtb3VudEZvckFsbG9jYXRpb246IG51bWJlcjtcbiAgaXNDb25maXJtQnV0dG9uZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNDb250aW51ZUJ1dHRvbmRpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgb3RoZXJQYXltZW50RXhwbGFuYXRpb246IHN0cmluZyA9IG51bGw7XG4gIHNlbGVjdGVkT3B0aW9uOiBzdHJpbmcgPSBudWxsO1xuICBpc0ZlZUFtb3VudFplcm86IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwYXltZW50UmVhc29uSGFzRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGF5bWVudEV4cGxhbmF0aW9uSGFzRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNQYXltZW50RGV0YWlsc0VtcHR5OiBib29sZWFuID0gZmFsc2U7XG4gIGlzUGF5bWVudERldGFpbHNJbnZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gIHBheW1lbnREZXRhaWxzTWluSGFzRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGF5bWVudERldGFpbHNNYXhIYXNFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1VzZXJOYW1lRW1wdHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNVc2VyTmFtZUludmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2NkUmVmZXJlbmNlOiBzdHJpbmcgPSBudWxsO1xuICBleGNlcHRpb25SZWZlcmVuY2U6IHN0cmluZyA9IG51bGw7XG4gIHBheW1lbnRSZWFzb246IHN0cmluZyA9IG51bGw7XG4gIHBheW1lbnRFeHBsYW5hdGlvbjogc3RyaW5nID0gbnVsbDtcbiAgdXNlck5hbWU6IHN0cmluZyA9IG51bGw7XG4gIHBheW1lbnRTZWN0aW9uTGFiZWw6IGFueTtcbiAgcGF5bWVudFJlZjogc3RyaW5nID0gbnVsbDtcbiAgaXNTdHJhdGVnaWNGaXhFbmFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBvcmRlckxldmVsRmVlczogSU9yZGVyUmVmZXJlbmNlRmVlW10gPSBbXTtcbiAgY29va2llVXNlck5hbWU6IHN0cmluZ1tdID0gW107XG4gIGVuQ29va2llVXNlck5hbWU6IGFueTtcbiAgdXNlck5hbWVGaWVsZDogc3RyaW5nID0gbnVsbDtcblxuICByZWFzb25MaXN0OiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfSA9IHtcbiAgICBvdmVyUGF5bWVudDoge1xuICAgICAgaHdmUmV3YXJkOiAnSGVscCB3aXRoIEZlZXMgKEhXRikgYXdhcmRlZC4gIFBsZWFzZSBpbmNsdWRlIHRoZSBIV0YgcmVmZXJlbmNlIG51bWJlciBpbiB0aGUgZXhwbGFuYXRvcnkgbm90ZScsXG4gICAgICB3cm9uZ0ZlZTogJ0luY29ycmVjdCBwYXltZW50IHJlY2VpdmVkJyxcbiAgICAgIG5vdElzc3VlQ2FzZTogJ1VuYWJsZSB0byBpc3N1ZSBjYXNlJyxcbiAgICAgIG90aGVyRGVkdWN0aW9uOiAnT3RoZXInXG4gICAgfSxcbiAgICBzaG9ydEZhbGw6IHtcbiAgICAgIGhlbHBXaXRoRmVlOiAnSGVscCB3aXRoIEZlZXMgKEhXRikgYXBwbGljYXRpb24gZGVjbGluZWQnLFxuICAgICAgd3JvbmdGZWU6ICdJbmNvcnJlY3QgcGF5bWVudCByZWNlaXZlZCcsXG4gICAgICBvdGhlcjogJ090aGVyJ1xuICAgIH1cbiAgfVxuICBleHBsYW5hdGlvbkxpc3QgPSB7XG4gICAgb3ZlclBheW1lbnQ6IHtcbiAgICAgIHJlZmVyUmVmdW5kOiAnRGV0YWlscyBpbiBjYXNlIG5vdGVzLiAgUmVmdW5kIGR1ZScsXG4gICAgICBub1JlZnVuZDogJ0RldGFpbHMgaW4gY2FzZSBub3Rlcy4gTm8gcmVmdW5kIGR1ZScsXG4gICAgICBub0Nhc2U6ICdObyBjYXNlIGNyZWF0ZWQuICBSZWZ1bmQgZHVlJyxcbiAgICAgIG90aGVyOiAnT3RoZXInXG4gICAgfSxcbiAgICBzaG9ydEZhbGw6IHtcbiAgICAgIGhvbGRDYXNlOiAnSSBoYXZlIHB1dCBhIHN0b3Agb24gdGhlIGNhc2UgYW5kIGNvbnRhY3RlZCB0aGUgYXBwbGljYW50IHJlcXVlc3RpbmcgdGhlIGJhbGFuY2Ugb2YgcGF5bWVudCcsXG4gICAgICBoZWxkQ2FzZTogJ0kgaGF2ZSBwdXQgYSBzdG9wIG9uIHRoZSBjYXNlLiAgVGhlIGFwcGxpY2FudCBuZWVkcyB0byBiZSBjb250YWN0ZWQgdG8gcmVxdWVzdCB0aGUgYmFsYW5jZSBvZiBwYXltZW50JyxcbiAgICAgIG90aGVyOiAnT3RoZXInXG4gICAgfVxuICB9XG5cbiAgcmVmdW5kID0ge1xuICAgIHJlYXNvbjoge1xuICAgICAgZHVwbGljYXRlOiAnRHVwbGljYXRlIHBheW1lbnQnLFxuICAgICAgaHVtYW5lcnJvcjogJ0h1bWFuIGVycm9yJyxcbiAgICAgIGNhc2VXaXRoZHJhd246ICdDYXNlIHdpdGhkcmF3bicsXG4gICAgICBvdGhlcjogJ090aGVyJ1xuICAgIH1cbiAgfVxuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlcnJvckhhbmRsZXJTZXJ2aWNlOiBFcnJvckhhbmRsZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2FzZVRyYW5zYWN0aW9uc1NlcnZpY2U6IENhc2VUcmFuc2FjdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcGF5bWVudFZpZXdTZXJ2aWNlOiBQYXltZW50Vmlld1NlcnZpY2UsXG4gICAgQEluamVjdCgnUEFZTUVOVF9MSUInKSBwcml2YXRlIHBheW1lbnRMaWJDb21wb25lbnQ6IFBheW1lbnRMaWJDb21wb25lbnQsXG4gICAgcHJpdmF0ZSBidWxrU2NhbmluZ1BheW1lbnRTZXJ2aWNlOiBCdWxrU2NhbmluZ1BheW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgT3JkZXJzbGlzdFNlcnZpY2U6IE9yZGVyc2xpc3RTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnZpZXdTdGF0dXMgPSAnbWFpbkZvcm0nO1xuICAgIGlmICh0aGlzLnBheW1lbnRMaWJDb21wb25lbnQucGF5bWVudEdyb3VwUmVmZXJlbmNlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnZpZXdTdGF0dXMgPSAnYWxsb2NhdGVQYXltZW50Q29uZmlybWF0aW9uJztcbiAgICB9XG5cbiAgICB0aGlzLmNjZENhc2VOdW1iZXIgPSB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuQ0NEX0NBU0VfTlVNQkVSO1xuICAgIHRoaXMuYnNwYXltZW50ZGNuID0gdGhpcy5wYXltZW50TGliQ29tcG9uZW50LmJzcGF5bWVudGRjbjtcbiAgICB0aGlzLnBheW1lbnRSZWYgPSB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQucGF5bWVudEdyb3VwUmVmZXJlbmNlO1xuICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuU0VMRUNURURfT1BUSU9OO1xuICAgIHRoaXMuaXNTdHJhdGVnaWNGaXhFbmFibGUgPSB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuSVNTRkVOQUJMRTtcbiAgICB0aGlzLmlzVHVybk9mZiA9IHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5pc1R1cm5PZmY7XG4gICAgdGhpcy5vdmVyVW5kZXJQYXltZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgbW9yZURldGFpbHM6IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgVmFsaWRhdG9ycy5taW5MZW5ndGgoMyksXG4gICAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksXG4gICAgICAgIFZhbGlkYXRvcnMucGF0dGVybignXihbYS16QS1aMC05XFxcXHMsXFxcXC5dKikkJylcbiAgICAgIF0pKSxcbiAgICAgIHVzZXJOYW1lOiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgIFZhbGlkYXRvcnMucGF0dGVybignXihbYS16QS1aMC05XFxcXHNdKikkJylcbiAgICAgIF0pKSxcbiAgICB9KTtcbiAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLmdldE9yZGVyc0xpc3QoKS5zdWJzY3JpYmUoKGRhdGEpID0+XG4gICAgICB0aGlzLm9yZGVyTGV2ZWxGZWVzID0gZGF0YS5maWx0ZXIoZGF0YSA9PiBkYXRhLm9yZGVyU3RhdHVzICE9PSAnUGFpZCcpKTtcbiAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLmdldENhc2VUeXBlKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB0aGlzLmNhc2VUeXBlID0gZGF0YSk7XG4gICAgdGhpcy5nZXRVbmFzc2lnbmVkUGF5bWVudCgpO1xuICB9XG4gIGdldEdyb3VwT3V0c3RhbmRpbmdBbW91bnQocGF5bWVudEdyb3VwOiBJUGF5bWVudEdyb3VwKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5idWxrU2NhbmluZ1BheW1lbnRTZXJ2aWNlLmNhbGN1bGF0ZU91dFN0YW5kaW5nQW1vdW50KHBheW1lbnRHcm91cCk7XG4gIH1cblxuICBnZXRQYXltZW50R3JvdXBEZXRhaWxzKCkge1xuXG4gICAgaWYgKCF0aGlzLmlzVHVybk9mZikge1xuICAgICAgdGhpcy5wYXltZW50Vmlld1NlcnZpY2UuZ2V0UGF5bWVudEdyb3VwRGV0YWlscyh0aGlzLnBheW1lbnRSZWYpLnN1YnNjcmliZShcbiAgICAgICAgcGF5bWVudEdyb3VwID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHRoaXMuZXJyb3JIYW5kbGVyU2VydmljZS5nZXRTZXJ2ZXJFcnJvck1lc3NhZ2UoZmFsc2UsIGZhbHNlLCAnJyk7XG4gICAgICAgICAgdGhpcy5wYXltZW50R3JvdXAgPSBwYXltZW50R3JvdXA7XG4gICAgICAgICAgdGhpcy5zYXZlQW5kQ29udGludWUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHRoaXMuZXJyb3JIYW5kbGVyU2VydmljZS5nZXRTZXJ2ZXJFcnJvck1lc3NhZ2UodHJ1ZSwgZmFsc2UsICcnKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXNlVHJhbnNhY3Rpb25zU2VydmljZS5nZXRQYXltZW50R3JvdXBzKHRoaXMuY2NkQ2FzZU51bWJlcikuc3Vic2NyaWJlKFxuICAgICAgICBwYXltZW50R3JvdXBzID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHRoaXMuZXJyb3JIYW5kbGVyU2VydmljZS5nZXRTZXJ2ZXJFcnJvck1lc3NhZ2UoZmFsc2UsIGZhbHNlLCAnJyk7XG4gICAgICAgICAgdGhpcy5wYXltZW50R3JvdXBzID0gcGF5bWVudEdyb3Vwc1sncGF5bWVudF9ncm91cHMnXS5maWx0ZXIocGF5bWVudEdyb3VwID0+IHtcbiAgICAgICAgICAgIHBheW1lbnRHcm91cC5mZWVzLmZvckVhY2goZmVlID0+IHtcbiAgICAgICAgICAgICAgaWYgKGZlZS5jYWxjdWxhdGVkX2Ftb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNGZWVBbW91bnRaZXJvID0gdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBmc3RDb24gPSB0aGlzLmdldEdyb3VwT3V0c3RhbmRpbmdBbW91bnQoPElQYXltZW50R3JvdXA+cGF5bWVudEdyb3VwKSxcbiAgICAgICAgICAgICAgc2NuZENuID0gZnN0Q29uID4gMCB8fCAoZnN0Q29uID09IDAgJiYgdGhpcy5pc0ZlZUFtb3VudFplcm8pICYmIHBheW1lbnRHcm91cC5wYXltZW50X2dyb3VwX3JlZmVyZW5jZSA9PT0gdGhpcy5wYXltZW50UmVmO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGF5bWVudFJlZiA/IHNjbmRDbiA6IGZzdENvbiA+IDAgfHwgKGZzdENvbiA9PSAwICYmIHRoaXMuaXNGZWVBbW91bnRaZXJvKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHRoaXMuZXJyb3JIYW5kbGVyU2VydmljZS5nZXRTZXJ2ZXJFcnJvck1lc3NhZ2UodHJ1ZSwgZmFsc2UsICcnKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgfVxuXG4gIHNlbGVjdGVkUGF5bWVudEdyb3VwKHBheW1lbnRHcm91cDogSVBheW1lbnRHcm91cCkge1xuICAgIHRoaXMuaXNDb250aW51ZUJ1dHRvbmRpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5wYXltZW50R3JvdXAgPSBwYXltZW50R3JvdXA7XG4gIH1cblxuICBnb3RvQ2FzZXRyYW5zYXRpb25QYWdlKCkge1xuICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC52aWV3TmFtZSA9ICdjYXNlLXRyYW5zYWN0aW9ucyc7XG4gICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LmlzVHVybk9mZiA9IHRoaXMuaXNUdXJuT2ZmO1xuICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5UQUtFUEFZTUVOVCA9IHRydWU7XG4gICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LklTQlNFTkFCTEUgPSB0cnVlO1xuICB9XG5cbiAgZ290b1N1bW1hcnlQYWdlKGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC52aWV3TmFtZSA9ICdmZWUtc3VtbWFyeSc7XG4gICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LmlzVHVybk9mZiA9IHRoaXMuaXNUdXJuT2ZmO1xuICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5UQUtFUEFZTUVOVCA9IHRydWU7XG4gICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LklTQlNFTkFCTEUgPSB0cnVlO1xuICB9XG5cbiAgY2FuY2VsQWxsb2NhdGVQYXltZW50KGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMucmVzZXRGb3JtKFtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2VdLCAnYWxsJyk7XG4gICAgaWYgKCF0aGlzLmlzVHVybk9mZikge1xuICAgICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LnZpZXdOYW1lID0gJ2ZlZS1zdW1tYXJ5JztcbiAgICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5pc1R1cm5PZmYgPSB0aGlzLmlzVHVybk9mZjtcbiAgICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5UQUtFUEFZTUVOVCA9IHRydWU7XG4gICAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuSVNCU0VOQUJMRSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlld1N0YXR1cyA9ICdtYWluRm9ybSc7XG4gICAgfVxuICB9XG4gIGNvbmZpcm1BbGxvY2F0ZVBheWVtZW50KCkge1xuICAgIHRoaXMuZW5Db29raWVVc2VyTmFtZSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdChcIjtcIikuZmluZChyb3cgPT4gcm93LmluY2x1ZGVzKFwidXNlci1pbmZvXCIpKS5zcGxpdChcIj1cIilbMV0uc3BsaXQoXCI7XCIpO1xuICAgIHRoaXMuY29va2llVXNlck5hbWUgPSBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLmVuQ29va2llVXNlck5hbWUpKTtcblxuICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5jb29raWVVc2VyTmFtZVsnZm9yZW5hbWUnXSArICcgJyArIHRoaXMuY29va2llVXNlck5hbWVbJ3N1cm5hbWUnXTtcblxuICAgIGNvbnN0IHBheW1lbnREZXRhaWxzRmllbGQgPSB0aGlzLm92ZXJVbmRlclBheW1lbnRGb3JtLmNvbnRyb2xzLm1vcmVEZXRhaWxzLFxuICAgICAgcGF5bWVudEZvcm1FcnJvciA9IHRoaXMub3ZlclVuZGVyUGF5bWVudEZvcm0uY29udHJvbHMubW9yZURldGFpbHMuZXJyb3JzLFxuICAgICAgdXNlck5hbWVGaWVsZCA9IGZ1bGxOYW1lLFxuICAgICAgaXNFbXB0eUNvbmR0aW9uID0gdGhpcy5wYXltZW50UmVhc29uICYmIHRoaXMucGF5bWVudEV4cGxhbmF0aW9uLFxuICAgICAgaXNPdGhlck9wdGlvblNlbGVjdGVkID0gdGhpcy5wYXltZW50RXhwbGFuYXRpb24gPT09ICdPdGhlcic7XG5cbiAgICB0aGlzLnJlc2V0Rm9ybShbZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlXSwgJ2FsbCcpO1xuICAgIGlmICgoIXRoaXMuaXNSZW1haW5pbmdBbW91bnRHdFplcm8gJiYgIXRoaXMuaXNSZW1haW5pbmdBbW91bnRMdFplcm8pIHx8IGlzRW1wdHlDb25kdGlvbiAmJiAoIWlzT3RoZXJPcHRpb25TZWxlY3RlZCAmJiB1c2VyTmFtZUZpZWxkLmxlbmd0aCA+IDAgfHwgaXNPdGhlck9wdGlvblNlbGVjdGVkICYmIHVzZXJOYW1lRmllbGQubGVuZ3RoID4gMCAmJiBwYXltZW50RGV0YWlsc0ZpZWxkLnZhbGlkKSkge1xuICAgICAgdGhpcy5pc0NvbmZpcm1CdXR0b25kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLm90aGVyUGF5bWVudEV4cGxhbmF0aW9uID0gdGhpcy5wYXltZW50RXhwbGFuYXRpb24gPT09ICdPdGhlcicgPyBwYXltZW50RGV0YWlsc0ZpZWxkLnZhbHVlIDogdGhpcy5wYXltZW50RXhwbGFuYXRpb247XG4gICAgICB0aGlzLnVzZXJOYW1lID0gdXNlck5hbWVGaWVsZDtcbiAgICAgIHRoaXMuZmluYWxTZXJ2aWNlQ2FsbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMucGF5bWVudFJlYXNvbikge1xuICAgICAgICB0aGlzLnJlc2V0Rm9ybShbdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2VdLCAncmVhc29uJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMucGF5bWVudEV4cGxhbmF0aW9uKSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtKFtmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZV0sICdleHBsYW5hdGlvbicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGF5bWVudEV4cGxhbmF0aW9uICYmIGlzT3RoZXJPcHRpb25TZWxlY3RlZCkge1xuICAgICAgICBpZiAocGF5bWVudERldGFpbHNGaWVsZC52YWx1ZSA9PSAnJykge1xuICAgICAgICAgIHRoaXMucmVzZXRGb3JtKFtmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZV0sICdvdGhlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXltZW50RGV0YWlsc0ZpZWxkLnZhbHVlICE9ICcnICYmIHBheW1lbnREZXRhaWxzRmllbGQuaW52YWxpZCkge1xuICAgICAgICAgIHRoaXMucmVzZXRGb3JtKFtmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZV0sICdvdGhlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXltZW50Rm9ybUVycm9yICYmIHBheW1lbnRGb3JtRXJyb3IubWlubGVuZ3RoICYmIHBheW1lbnRGb3JtRXJyb3IubWlubGVuZ3RoLmFjdHVhbExlbmd0aCA8IDMpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0Rm9ybShbZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2VdLCAnb3RoZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF5bWVudEZvcm1FcnJvciAmJiBwYXltZW50Rm9ybUVycm9yLm1heGxlbmd0aCAmJiBwYXltZW50Rm9ybUVycm9yLm1heGxlbmd0aC5hY3R1YWxMZW5ndGggPiAyNTUpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0Rm9ybShbZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2VdLCAnb3RoZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHVzZXJOYW1lRmllbGQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtKFtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZV0sICd1c2VybmFtZScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXNldEZvcm0odmFscywgZmllbGQpIHtcbiAgICBpZiAoZmllbGQgPT09ICdyZWFzb24nIHx8IGZpZWxkID09PSAnYWxsJykge1xuICAgICAgdGhpcy5wYXltZW50UmVhc29uSGFzRXJyb3IgPSB2YWxzWzBdO1xuICAgIH1cbiAgICBpZiAoZmllbGQgPT09ICdleHBsYW5hdGlvbicgfHwgZmllbGQgPT09ICdhbGwnKSB7XG4gICAgICB0aGlzLnBheW1lbnRFeHBsYW5hdGlvbkhhc0Vycm9yID0gdmFsc1sxXTtcbiAgICB9XG4gICAgaWYgKGZpZWxkID09PSAnb3RoZXInIHx8IGZpZWxkID09PSAnYWxsJykge1xuICAgICAgdGhpcy5pc1BheW1lbnREZXRhaWxzRW1wdHkgPSB2YWxzWzJdO1xuICAgICAgdGhpcy5pc1BheW1lbnREZXRhaWxzSW52YWxpZCA9IHZhbHNbM107XG4gICAgICB0aGlzLnBheW1lbnREZXRhaWxzTWluSGFzRXJyb3IgPSB2YWxzWzRdO1xuICAgICAgdGhpcy5wYXltZW50RGV0YWlsc01heEhhc0Vycm9yID0gdmFsc1s1XTtcbiAgICB9XG4gICAgaWYgKGZpZWxkID09PSAndXNlcm5hbWUnIHx8IGZpZWxkID09PSAnYWxsJykge1xuICAgICAgdGhpcy5pc1VzZXJOYW1lRW1wdHkgPSB2YWxzWzZdO1xuICAgICAgdGhpcy5pc1VzZXJOYW1lSW52YWxpZCA9IHZhbHNbN107XG4gICAgfVxuICB9XG4gIGZpbmFsU2VydmljZUNhbGwoKSB7XG4gICAgaWYgKCF0aGlzLmlzU3RyYXRlZ2ljRml4RW5hYmxlKSB7XG4gICAgICBsZXQgYWxsb2NhdGVkUmVxdWVzdCA9IHtcbiAgICAgICAgcmVhc29uOiB0aGlzLnBheW1lbnRSZWFzb24sXG4gICAgICAgIGFsbG9jYXRpb25fc3RhdHVzOiAnQWxsb2NhdGVkJyxcbiAgICAgICAgZXhwbGFuYXRpb246IHRoaXMub3RoZXJQYXltZW50RXhwbGFuYXRpb24sXG4gICAgICAgIHBheW1lbnRfYWxsb2NhdGlvbl9zdGF0dXM6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgbmFtZTogJ0FsbG9jYXRlZCdcbiAgICAgICAgfSxcbiAgICAgICAgcGF5bWVudF9ncm91cF9yZWZlcmVuY2U6IHRoaXMucGF5bWVudEdyb3VwLnBheW1lbnRfZ3JvdXBfcmVmZXJlbmNlLFxuICAgICAgICBjYXNlX3R5cGU6IHRoaXMuY2FzZVR5cGUsXG4gICAgICAgIHVzZXJfbmFtZTogdGhpcy51c2VyTmFtZVxuICAgICAgfVxuICAgICAgY29uc3QgcG9zdFN0cmF0ZWdpY0JvZHkgPSBuZXcgQWxsb2NhdGVQYXltZW50UmVxdWVzdFxuICAgICAgICAodGhpcy5jY2RSZWZlcmVuY2UsIHRoaXMudW5BbGxvY2F0ZWRQYXltZW50LCB0aGlzLmNhc2VUeXBlLCB0aGlzLmV4Y2VwdGlvblJlZmVyZW5jZSwgYWxsb2NhdGVkUmVxdWVzdCk7XG4gICAgICB0aGlzLmJ1bGtTY2FuaW5nUGF5bWVudFNlcnZpY2UucG9zdEJTUGF5bWVudFN0cmF0ZWdpYyhwb3N0U3RyYXRlZ2ljQm9keSwgdGhpcy5wYXltZW50R3JvdXAucGF5bWVudF9ncm91cF9yZWZlcmVuY2UpLnN1YnNjcmliZShcbiAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHRoaXMuZXJyb3JIYW5kbGVyU2VydmljZS5nZXRTZXJ2ZXJFcnJvck1lc3NhZ2UoZmFsc2UsIGZhbHNlLCAnJyk7XG4gICAgICAgICAgbGV0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXMpO1xuICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLmdvdG9DYXNldHJhbnNhdGlvblBhZ2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB0aGlzLmVycm9ySGFuZGxlclNlcnZpY2UuZ2V0U2VydmVyRXJyb3JNZXNzYWdlKHRydWUsIGZhbHNlLCAnJyk7XG4gICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDApO1xuICAgICAgICAgIHRoaXMuaXNDb25maXJtQnV0dG9uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWxrU2NhbmluZ1BheW1lbnRTZXJ2aWNlLnBhdGNoQlNDaGFuZ2VTdGF0dXModGhpcy51bkFsbG9jYXRlZFBheW1lbnQuZGNuX3JlZmVyZW5jZSwgJ1BST0NFU1NFRCcpLnN1YnNjcmliZShcbiAgICAgICAgcmVzMSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB0aGlzLmVycm9ySGFuZGxlclNlcnZpY2UuZ2V0U2VydmVyRXJyb3JNZXNzYWdlKGZhbHNlLCBmYWxzZSwgJycpO1xuICAgICAgICAgIGxldCByZXNwb25zZTEgPSBKU09OLnBhcnNlKHJlczEpO1xuICAgICAgICAgIGlmIChyZXNwb25zZTEuc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSBuZXcgQWxsb2NhdGVQYXltZW50UmVxdWVzdFxuICAgICAgICAgICAgICAodGhpcy5jY2RSZWZlcmVuY2UsIHRoaXMudW5BbGxvY2F0ZWRQYXltZW50LCB0aGlzLnNpdGVJRCwgdGhpcy5leGNlcHRpb25SZWZlcmVuY2UpO1xuICAgICAgICAgICAgdGhpcy5idWxrU2NhbmluZ1BheW1lbnRTZXJ2aWNlLnBvc3RCU0FsbG9jYXRlUGF5bWVudChyZXF1ZXN0Qm9keSwgdGhpcy5wYXltZW50R3JvdXAucGF5bWVudF9ncm91cF9yZWZlcmVuY2UpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgcmVzMiA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB0aGlzLmVycm9ySGFuZGxlclNlcnZpY2UuZ2V0U2VydmVyRXJyb3JNZXNzYWdlKGZhbHNlLCBmYWxzZSwgJycpO1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZTIgPSBKU09OLnBhcnNlKHJlczIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcUJvZHkgPSBuZXcgSUFsbG9jYXRpb25QYXltZW50c1JlcXVlc3RcbiAgICAgICAgICAgICAgICAgIChyZXNwb25zZTJbJ2RhdGEnXS5wYXltZW50X2dyb3VwX3JlZmVyZW5jZSwgcmVzcG9uc2UyWydkYXRhJ10ucmVmZXJlbmNlLCB0aGlzLnBheW1lbnRSZWFzb24sIHRoaXMub3RoZXJQYXltZW50RXhwbGFuYXRpb24sIHRoaXMudXNlck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZTIuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgdGhpcy5wYXltZW50Vmlld1NlcnZpY2UucG9zdEJTQWxsb2NhdGlvblBheW1lbnRzKHJlcUJvZHkpLnN1YnNjcmliZShcblxuICAgICAgICAgICAgICAgICAgICByZXMzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHRoaXMuZXJyb3JIYW5kbGVyU2VydmljZS5nZXRTZXJ2ZXJFcnJvck1lc3NhZ2UoZmFsc2UsIGZhbHNlLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlMyA9IEpTT04ucGFyc2UocmVzMyk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlMy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdvdG9DYXNldHJhbnNhdGlvblBhZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWxrU2NhbmluZ1BheW1lbnRTZXJ2aWNlLnBhdGNoQlNDaGFuZ2VTdGF0dXModGhpcy51bkFsbG9jYXRlZFBheW1lbnQuZGNuX3JlZmVyZW5jZSwgJ0NPTVBMRVRFJykuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB0aGlzLmVycm9ySGFuZGxlclNlcnZpY2UuZ2V0U2VydmVyRXJyb3JNZXNzYWdlKHRydWUsIGZhbHNlLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDApO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDb25maXJtQnV0dG9uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWxrU2NhbmluZ1BheW1lbnRTZXJ2aWNlLnBhdGNoQlNDaGFuZ2VTdGF0dXModGhpcy51bkFsbG9jYXRlZFBheW1lbnQuZGNuX3JlZmVyZW5jZSwgJ0NPTVBMRVRFJykuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB0aGlzLmVycm9ySGFuZGxlclNlcnZpY2UuZ2V0U2VydmVyRXJyb3JNZXNzYWdlKHRydWUsIGZhbHNlLCAnJyk7XG4gICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDApO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNDb25maXJtQnV0dG9uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB0aGlzLmVycm9ySGFuZGxlclNlcnZpY2UuZ2V0U2VydmVyRXJyb3JNZXNzYWdlKHRydWUsIGZhbHNlLCAnJyk7XG4gICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDApO1xuICAgICAgICAgIHRoaXMuaXNDb25maXJtQnV0dG9uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzYXZlQW5kQ29udGludWUoKSB7XG4gICAgaWYgKHRoaXMucGF5bWVudEdyb3VwKSB7XG4gICAgICB0aGlzLmlzTW9yZURldGFpbHNCb3hIaWRlID0gdHJ1ZTtcbiAgICAgIHRoaXMub3ZlclVuZGVyUGF5bWVudEZvcm0uZ2V0KCdtb3JlRGV0YWlscycpLnJlc2V0KCk7XG4gICAgICB0aGlzLm92ZXJVbmRlclBheW1lbnRGb3JtLmdldCgnbW9yZURldGFpbHMnKS5zZXRWYWx1ZSgnJyk7XG4gICAgICB0aGlzLm92ZXJVbmRlclBheW1lbnRGb3JtLmdldCgndXNlck5hbWUnKS5yZXNldCgpO1xuICAgICAgdGhpcy5vdmVyVW5kZXJQYXltZW50Rm9ybS5nZXQoJ3VzZXJOYW1lJykuc2V0VmFsdWUoJycpO1xuICAgICAgdGhpcy5wYXltZW50UmVhc29uID0gJyc7XG4gICAgICB0aGlzLnBheW1lbnRFeHBsYW5hdGlvbiA9ICcnO1xuICAgICAgbGV0IEdyb3VwT3V0c3RhbmRpbmdBbW91bnQgPSB0aGlzLmdldEdyb3VwT3V0c3RhbmRpbmdBbW91bnQodGhpcy5wYXltZW50R3JvdXApO1xuICAgICAgY29uc3QgcmVtYWluaW5nVG9CZUFzc2lnbmVkID0gdGhpcy51bkFsbG9jYXRlZFBheW1lbnQuYW1vdW50IC0gR3JvdXBPdXRzdGFuZGluZ0Ftb3VudDtcbiAgICAgIHRoaXMuaXNSZW1haW5pbmdBbW91bnRHdFplcm8gPSByZW1haW5pbmdUb0JlQXNzaWduZWQgPiAwO1xuICAgICAgdGhpcy5pc1JlbWFpbmluZ0Ftb3VudEx0WmVybyA9IHJlbWFpbmluZ1RvQmVBc3NpZ25lZCA8IDA7XG4gICAgICB0aGlzLnBheW1lbnRTZWN0aW9uTGFiZWwgPSB0aGlzLmlzUmVtYWluaW5nQW1vdW50R3RaZXJvID8ge1xuICAgICAgICB0aXRsZTogJ1RoZXJlIGlzIGFuIE92ZXIgcGF5bWVudCBvZicsXG4gICAgICAgIHJlYXNvbjogJ1Byb3ZpZGUgYSByZWFzb24uIFRoaXMgd2lsbCBiZSB1c2VkIGluIHRoZSBSZWZ1bmQgcHJvY2Vzcy4nLFxuICAgICAgfSA6IHRoaXMuaXNSZW1haW5pbmdBbW91bnRMdFplcm8gPyB7XG4gICAgICAgIHRpdGxlOiAnVGhlcmUgaXMgYW4gVW5kZXIgcGF5bWVudCBvZicsXG4gICAgICAgIHJlYXNvbjogJ1Byb3ZpZGUgYSByZWFzb24nLFxuICAgICAgfSA6IHtcbiAgICAgICAgdGl0bGU6ICdBbW91bnQgbGVmdCB0byBiZSBhbGxvY2F0ZWQnLFxuICAgICAgICByZWFzb246ICcnLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZmVlZGJhY2tVcmxMYWJlbCA9IHRoaXMuaXNSZW1haW5pbmdBbW91bnRHdFplcm8gPyAnQ09ORklSTUFMTE9DQVRJT05fU1VSUExVUycgOiB0aGlzLmlzUmVtYWluaW5nQW1vdW50THRaZXJvID8gJ0NPTkZJUk1BTExPQ0FUSU9OX1NIT1JURkFMTCcgOiAnQ09ORklSTUFMTE9DQVRJT04nO1xuICAgICAgdGhpcy5yZW1haW5pbmdBbW91bnQgPSB0aGlzLmlzUmVtYWluaW5nQW1vdW50R3RaZXJvID8gcmVtYWluaW5nVG9CZUFzc2lnbmVkIDogdGhpcy5pc1JlbWFpbmluZ0Ftb3VudEx0WmVybyA/IHJlbWFpbmluZ1RvQmVBc3NpZ25lZCAqIC0xIDogMDtcbiAgICAgIHRoaXMuYWZ0ZXJGZWVBbGxvY2F0ZU91dHN0YW5kaW5nID0gcmVtYWluaW5nVG9CZUFzc2lnbmVkID49IDAgPyAwIDogKHJlbWFpbmluZ1RvQmVBc3NpZ25lZCAqIC0xKTtcbiAgICAgIHRoaXMuYW1vdW50Rm9yQWxsb2NhdGlvbiA9IEdyb3VwT3V0c3RhbmRpbmdBbW91bnQgPj0gdGhpcy51bkFsbG9jYXRlZFBheW1lbnQuYW1vdW50ID8gdGhpcy51bkFsbG9jYXRlZFBheW1lbnQuYW1vdW50IDogR3JvdXBPdXRzdGFuZGluZ0Ftb3VudDtcbiAgICAgIGlmICh0aGlzLmlzVHVybk9mZikge1xuICAgICAgICB0aGlzLnZpZXdTdGF0dXMgPSAnYWxsb2NhdGVQYXltZW50Q29uZmlybWF0aW9uJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0VW5hc3NpZ25lZFBheW1lbnQoKSB7XG4gICAgdGhpcy5idWxrU2NhbmluZ1BheW1lbnRTZXJ2aWNlLmdldEJTUGF5bWVudHNCeURDTih0aGlzLmJzcGF5bWVudGRjbikuc3Vic2NyaWJlKFxuICAgICAgdW5hc3NpZ25lZFBheW1lbnRzID0+IHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB0aGlzLmVycm9ySGFuZGxlclNlcnZpY2UuZ2V0U2VydmVyRXJyb3JNZXNzYWdlKGZhbHNlLCBmYWxzZSwgJycpO1xuICAgICAgICB0aGlzLnVuQWxsb2NhdGVkUGF5bWVudCA9IHVuYXNzaWduZWRQYXltZW50c1snZGF0YSddLnBheW1lbnRzLmZpbHRlcihwYXltZW50ID0+IHtcbiAgICAgICAgICByZXR1cm4gcGF5bWVudCAmJiBwYXltZW50LmRjbl9yZWZlcmVuY2UgPT0gdGhpcy5ic3BheW1lbnRkY247XG4gICAgICAgIH0pWzBdO1xuICAgICAgICB0aGlzLnNpdGVJRCA9IHVuYXNzaWduZWRQYXltZW50c1snZGF0YSddLnJlc3BvbnNpYmxlX3NlcnZpY2VfaWQ7XG4gICAgICAgIGNvbnN0IGJlQ2NkTnVtYmVyID0gdW5hc3NpZ25lZFBheW1lbnRzWydkYXRhJ10uY2NkX3JlZmVyZW5jZSxcbiAgICAgICAgICBiZUV4Y2VwdGlvbk51bWJlciA9IHVuYXNzaWduZWRQYXltZW50c1snZGF0YSddLmV4Y2VwdGlvbl9yZWNvcmRfcmVmZXJlbmNlLFxuICAgICAgICAgIGV4Y2VwdGlvblJlZmVyZW5jZSA9IGJlQ2NkTnVtYmVyID8gYmVDY2ROdW1iZXIgPT09IHRoaXMuY2NkQ2FzZU51bWJlciA/IG51bGwgOiB0aGlzLmNjZENhc2VOdW1iZXIgOiB0aGlzLmNjZENhc2VOdW1iZXI7XG4gICAgICAgIHRoaXMuY2NkUmVmZXJlbmNlID0gYmVDY2ROdW1iZXIgPyBiZUNjZE51bWJlciA6IG51bGw7XG4gICAgICAgIHRoaXMuZXhjZXB0aW9uUmVmZXJlbmNlID0gYmVFeGNlcHRpb25OdW1iZXIgPyBiZUV4Y2VwdGlvbk51bWJlciA6IGV4Y2VwdGlvblJlZmVyZW5jZTtcbiAgICAgICAgdGhpcy5nZXRQYXltZW50R3JvdXBEZXRhaWxzKCk7XG4gICAgICB9LFxuICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB0aGlzLmVycm9ySGFuZGxlclNlcnZpY2UuZ2V0U2VydmVyRXJyb3JNZXNzYWdlKHRydWUsIGZhbHNlLCAnJyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBzZWxlY3RSYWRpb0J1dHRvbihrZXksIHR5cGUpIHtcbiAgICB0aGlzLmlzTW9yZURldGFpbHNCb3hIaWRlID0gdHJ1ZTtcbiAgICBpZiAodHlwZSA9PT0gJ2V4cGxhbmF0aW9uJyAmJiBrZXkgPT09ICdvdGhlcicpIHtcbiAgICAgIHRoaXMuaXNQYXltZW50RGV0YWlsc0VtcHR5ID0gZmFsc2U7XG4gICAgICB0aGlzLmlzUGF5bWVudERldGFpbHNJbnZhbGlkID0gZmFsc2U7XG4gICAgICB0aGlzLnBheW1lbnREZXRhaWxzTWluSGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMucGF5bWVudERldGFpbHNNYXhIYXNFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5pc01vcmVEZXRhaWxzQm94SGlkZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBPcmRlckxpc3RTZWxlY3RFdmVudChvcmRlcmVmOiBhbnkpIHtcbiAgICB0aGlzLmlzQ29udGludWVCdXR0b25kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMucmVjb3JkSWQgPSBvcmRlcmVmO1xuICB9XG5cbiAgcmVkaXJlY3RUb09yZGVyRmVlU2VhcmNoUGFnZSgpIHtcbiAgICAvLyB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuYnNwYXltZW50ZGNuID0gbnVsbDtcbiAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQucGF5bWVudEdyb3VwUmVmZXJlbmNlID0gdGhpcy5yZWNvcmRJZDtcbiAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuaXNUdXJuT2ZmID0gdGhpcy5pc1R1cm5PZmY7XG4gICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LnZpZXdOYW1lID0gJ2ZlZS1zdW1tYXJ5JztcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFsbG9jYXRlLXBheW1lbnRzXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3U3RhdHVzID09PSAnbWFpbkZvcm0nICYmICFpc1R1cm5PZmZcIj5cblxuICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLWJyZWFkY3J1bWJzXCI+XG4gICAgICAgICAgPG9sIGNsYXNzPVwiZ292dWstYnJlYWRjcnVtYnNfX2xpc3RcIj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImdvdnVrLWJyZWFkY3J1bWJzX19saXN0LWl0ZW1cIj5cbiAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cImdvdG9DYXNldHJhbnNhdGlvblBhZ2UoKVwiIGNsYXNzPVwiZ292dWstYmFjay1saW5rIGdvdnVrLWxhYmVsXCI+QmFjazwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC9vbD5cbiAgICAgICAgPC9kaXY+XG4gIFxuICAgIDxkaXYgY2xhc3M9XCJwYXltZW50cmVxdWVzdFwiPlxuICAgICAgICA8aDEgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLXhsIGdvdnVrLSEtbWFyZ2luLXRvcC0zIGdvdnVrLSEtbWFyZ2luLWJvdHRvbS00XCI+U2VsZWN0IHBheW1lbnQgcmVxdWVzdDwvaDE+XG4gICAgICAgIDxwIGNsYXNzPVwiZ292dWstIS1tYXJnaW4tdG9wLTUgY2FzZXJlcmZcIj5DYXNlIHJlZmVyZW5jZToge3tjY2RSZWZlcmVuY2V9fTwvcD5cbiAgICA8L2Rpdj5cbiBcbiAgICA8ZGl2ICAqbmdGb3I9XCJsZXQgb3JkZXJSZWYgb2Ygb3JkZXJMZXZlbEZlZXM7IGxldCBpID0gaW5kZXg7XCIgY2xhc3M9XCJtdWx0aXBsZS1jaG9pY2UgdW5wcm9jZXNzZWQtcGF5bWVudHMtLXJhZGlvLWJ1dHRvblwiPlxuICAgICAgPGlucHV0IGlkPVwiJ29yZGVyZmVlJytpKycnXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJvcmRlckxldmVsUmVjb3JkXCJcbiAgICAgIG5hbWU9XCJvcmRlckxldmVsUmVjb3JkXCJcbiAgICBcbiAgICAgIChjbGljayk9XCJPcmRlckxpc3RTZWxlY3RFdmVudChvcmRlclJlZi5vcmRlclJlZklkKVwiXG4gICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgdmFsdWU9XCJ7e29yZGVyUmVmLm9yZGVyVG90YWxGZWVzfX1cIiAvPlxuICAgICAgPGxhYmVsIGZvcj1cInJhZGlvLWlubGluZS0xXCI+IHt7b3JkZXJSZWYub3JkZXJUb3RhbEZlZXMgfCBjdXJyZW5jeSA6J0dCUCc6J3N5bWJvbCc6JzEuMi0yJ319KHt7b3JkZXJSZWYub3JkZXJTdGF0dXN9fSk8L2xhYmVsPlxuICAgIDwvZGl2PlxuICBcbiAgICA8ZGl2IGNsYXNzPVwicGF5bWVudHJlcXVlc3RcIj5cbiAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNDb250aW51ZUJ1dHRvbmRpc2FibGVkXCIgdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJyZWRpcmVjdFRvT3JkZXJGZWVTZWFyY2hQYWdlKClcIiBjbGFzcz1cImJ1dHRvbiBhbGxidGIgYnV0dG9uLS1kaXNhYmxlZCBnb3Z1ay0hLW1hcmdpbi1yaWdodC0xXCI+XG4gICAgICAgICAgQ29udGludWVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgIFxuICA8L25nLWNvbnRhaW5lcj5cblxuICAgPGRpdiAqbmdJZj1cInZpZXdTdGF0dXM9PT0nbWFpbkZvcm0nICYmIGlzVHVybk9mZlwiPlxuICAgIDxpbnB1dCAjbXlJbnB1dCB0eXBlPSdoaWRkZW4nIGNsYXNzPSdpRnJhbWVEcml2ZW5JbWFnZVZhbHVlJyB2YWx1ZT0nQUxMT0NBVEVQQVlNRU5UUyc+XG4gICAgPGRpdiBjbGFzcz1cImdvdnVrLWJyZWFkY3J1bWJzXCIgKm5nSWY9XCJwYXltZW50UmVmXCI+XG4gICAgICA8b2wgY2xhc3M9XCJnb3Z1ay1icmVhZGNydW1ic19fbGlzdFwiPlxuICAgICAgICA8bGkgY2xhc3M9XCJnb3Z1ay1icmVhZGNydW1ic19fbGlzdC1pdGVtXCI+XG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwiZ290b1N1bW1hcnlQYWdlKCRldmVudClcIiBjbGFzcz1cImdvdnVrLWJhY2stbGlua1wiPkJhY2s8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L29sPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLXNlY3Rpb25cIj5cbiAgICAgIDxoMSBjbGFzcz1cImdvdnVrLWhlYWRpbmcteGxcIj5BbGxvY2F0ZSBwYXltZW50IHRvIGZlZSBncm91cDwvaDE+XG4gICAgICA8aDIgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLWxcIj5BbW91bnQgbGVmdCB0byBiZSBhbGxvY2F0ZWQ6XG4gICAgICAgIHt7IHVuQWxsb2NhdGVkUGF5bWVudC5hbW91bnQgfCBjdXJyZW5jeTonR0JQJzonc3ltYm9sLW5hcnJvdyc6JzEuMi0yJyB9fTwvaDI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBheW1lbnQtZ3JvdXAtc2VjdGlvblwiICpuZ0Zvcj1cImxldCBwYXltZW50R3JvdXAgb2YgcGF5bWVudEdyb3Vwc1wiPlxuICAgICAgPGgzIGNsYXNzPVwiZ292dWstaGVhZGluZy1tXCI+R3JvdXAgcmVmZXJlbmNlOiB7e3BheW1lbnRHcm91cC5wYXltZW50X2dyb3VwX3JlZmVyZW5jZX19PC9oMz5cbiAgICAgIDx0YWJsZSBjbGFzcz1cImdvdnVrLXRhYmxlXCI+XG4gICAgICAgIDx0aGVhZCBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkXCI+XG4gICAgICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2hlYWRlclwiIHNjb3BlPVwiY29sXCI+PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkZXJcIiBzY29wZT1cImNvbFwiPkNvZGU8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2hlYWRlclwiIHNjb3BlPVwiY29sXCI+RGVzY3JpcHRpb248L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2hlYWRlclwiIHNjb3BlPVwiY29sXCI+Vm9sdW1lPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkZXJcIiBzY29wZT1cImNvbFwiPkZlZSBhbW91bnQ8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2hlYWRlclwiIHNjb3BlPVwiY29sXCI+Q2FsY3VsYXRlZCBhbW91bnQ8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2hlYWRlclwiIHNjb3BlPVwiY29sXCI+R3JvdXAgYW1vdW50IG91dHN0YW5kaW5nPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHkgY2xhc3M9XCJnb3Z1ay10YWJsZV9fYm9keVwiPlxuICAgICAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIiAqbmdGb3I9XCJsZXQgZmVlIG9mIHBheW1lbnRHcm91cC5mZWVzOyAgbGV0IGkgPSBpbmRleDtcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLXRhYmxlX19jZWxsLS1jb2wxIGdvdnVrLXRhYmxlX19jdXN0b20tLWNvbDFcIlxuICAgICAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cInBheW1lbnRHcm91cC5mZWVzLmxlbmd0aFwiICpuZ0lmPVwiaT09MFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGlwbGUtY2hvaWNlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPVwidW5wYWllZEZlZS17e2l9fVwiIG5hbWU9XCJ1bmFzc2lnbmVkUmVjb3JkXCIgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZFBheW1lbnRHcm91cChwYXltZW50R3JvdXApXCIgLz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidW5wYWllZEZlZS17e2l9fVwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLXRhYmxlX19jZWxsLS1jb2wxXCI+e3tmZWUuY29kZX19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLXRhYmxlX19jZWxsLS1jb2wyXCI+IHt7ZmVlLmRlc2NyaXB0aW9ufX0gPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLXRhYmxlX19jZWxsLS1jb2wzXCI+IHt7ZmVlLnZvbHVtZT8gZmVlLnZvbHVtZSA6ICctJ319IDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay10YWJsZV9fY2VsbC0tY29sNFwiPlxuICAgICAgICAgICAgICB7eyBmZWUuZmVlX2Ftb3VudCB8IGN1cnJlbmN5OidHQlAnOidzeW1ib2wtbmFycm93JzonMS4yLTInIH19IDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay10YWJsZV9fY2VsbC0tY29sNVwiPlxuICAgICAgICAgICAgICB7e2ZlZS5jYWxjdWxhdGVkX2Ftb3VudCB8IGN1cnJlbmN5OidHQlAnOidzeW1ib2wtbmFycm93JzonMS4yLTInIH19IDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay10YWJsZV9fY2VsbC0tY29sNiBnb3Z1ay10YWJsZV9fY3VzdG9tLS1jb2w2XCJcbiAgICAgICAgICAgICAgW2F0dHIucm93c3Bhbl09XCJwYXltZW50R3JvdXAuZmVlcy5sZW5ndGhcIiAqbmdJZj1cImk9PTBcIj5cbiAgICAgICAgICAgICAge3tnZXRHcm91cE91dHN0YW5kaW5nQW1vdW50KHBheW1lbnRHcm91cCkgfCBjdXJyZW5jeTonR0JQJzonc3ltYm9sLW5hcnJvdyc6JzEuMi0yJyB9fSA8L3RkPlxuXG4gICAgICAgICAgPC90cj5cblxuICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8dGJvZHkgY2xhc3M9XCJnb3Z1ay10YWJsZV9fYm9keVwiICpuZ0lmPVwicGF5bWVudEdyb3VwLmZlZXMubGVuZ3RoPT0wXCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGxcIiBjb2xzcGFuPVwiNlwiPk5vIHBheW1lbnRzIHJlY29yZGVkPC90ZD5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImdvdnVrLWJ1dHRvbi1ncm91cC1hbGxvY2F0ZVwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidXR0b24gZ292dWstIS1tYXJnaW4tcmlnaHQtMVwiIFtkaXNhYmxlZF09XCJpc0NvbnRpbnVlQnV0dG9uZGlzYWJsZWRcIlxuICAgICAgICAoY2xpY2spPVwic2F2ZUFuZENvbnRpbnVlKClcIj5cbiAgICAgICAgQ29udGludWVcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidXR0b24gZ292dWstYnV0dG9uLS1zZWNvbmRhcnlcIiAoY2xpY2spPVwiZ290b0Nhc2V0cmFuc2F0aW9uUGFnZSgpXCI+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIodmlld1N0YXR1cyA9PT0gJ21haW5Gb3JtJyAmJiBpc1R1cm5PZmYpIHx8IHZpZXdTdGF0dXMgPT09ICdhbGxvY2F0ZVBheW1lbnRDb25maXJtYXRpb24nXCI+XG4gICAgPGNjcGF5LWVycm9yLWJhbm5lciAqbmdJZj1cImVycm9yTWVzc2FnZS5zaG93RXJyb3JcIiBbZXJyb3JNZXNzYWdlXT1cImVycm9yTWVzc2FnZVwiPjwvY2NwYXktZXJyb3ItYmFubmVyPlxuICAgIDxpbnB1dCAjbXlJbnB1dCB0eXBlPSdoaWRkZW4nIGNsYXNzPSdpRnJhbWVEcml2ZW5JbWFnZVZhbHVlJyB2YWx1ZT0ne3tmZWVkYmFja1VybExhYmVsfX0nPlxuICAgIDxoMSBjbGFzcz1cImdvdnVrLWhlYWRpbmcteGxcIj5Db25maXJtIGFsbG9jYXRpb248L2gxPlxuICAgIDxoMiBjbGFzcz1cImdvdnVrLWhlYWRpbmctbCBnb3Z1ay1oZWFkaW5nLWwtLWN1c3RvbVwiPlxuICAgICAgQW1vdW50IHRvIGJlIGFsbG9jYXRlZDoge3thbW91bnRGb3JBbGxvY2F0aW9uIHwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMid9fVxuICAgIDwvaDI+XG4gICAgPGRpdiBjbGFzcz1cInBheW1lbnQtZ3JvdXAtc2VjdGlvblwiICpuZ0lmPVwicGF5bWVudEdyb3VwXCI+XG4gICAgICA8aDMgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLW0tLWN1c3RvbVwiICpuZ0lmPVwiaXNUdXJuT2ZmXCI+R3JvdXAgcmVmZXJlbmNlOiB7e3BheW1lbnRHcm91cC5wYXltZW50X2dyb3VwX3JlZmVyZW5jZX19XG4gICAgICA8L2gzPlxuICAgICAgPHRhYmxlIGNsYXNzPVwiZ292dWstdGFibGVcIj5cbiAgICAgICAgPHRoZWFkIGNsYXNzPVwiZ292dWstdGFibGVfX2hlYWRcIj5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9faGVhZGVyXCIgc2NvcGU9XCJjb2xcIj5Db2RlPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkZXJcIiBzY29wZT1cImNvbFwiPkRlc2NyaXB0aW9uPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkZXJcIiBzY29wZT1cImNvbFwiPlZvbHVtZTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9faGVhZGVyXCIgc2NvcGU9XCJjb2xcIj5GZWUgYW1vdW50PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkZXJcIiBzY29wZT1cImNvbFwiPkNhbGN1bGF0ZWQgYW1vdW50PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkZXJcIiBzY29wZT1cImNvbFwiPkFtb3VudCBEdWU8L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keSBjbGFzcz1cImdvdnVrLXRhYmxlX19ib2R5XCI+XG4gICAgICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiICpuZ0Zvcj1cImxldCBmZWUgb2YgcGF5bWVudEdyb3VwLmZlZXM7IGxldCBpID0gaW5kZXg7XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay10YWJsZV9fY2VsbC0tY29sMVwiPnt7ZmVlLmNvZGV9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay10YWJsZV9fY2VsbC0tY29sMlwiPiB7e2ZlZS5kZXNjcmlwdGlvbn19IDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay10YWJsZV9fY2VsbC0tY29sM1wiPiB7e2ZlZS52b2x1bWU/IGZlZS52b2x1bWUgOiAnLSd9fSA8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstdGFibGVfX2NlbGwtLWNvbDRcIj5cbiAgICAgICAgICAgICAge3sgZmVlLmZlZV9hbW91bnQgfCBjdXJyZW5jeTonR0JQJzonc3ltYm9sLW5hcnJvdyc6JzEuMi0yJyB9fSA8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstdGFibGVfX2NlbGwtLWNvbDVcIj5cbiAgICAgICAgICAgICAge3tmZWUuY2FsY3VsYXRlZF9hbW91bnQgfCBjdXJyZW5jeTonR0JQJzonc3ltYm9sLW5hcnJvdyc6JzEuMi0yJ319IDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay10YWJsZV9fY2VsbC0tY29sNlwiIFthdHRyLnJvd3NwYW5dPVwicGF5bWVudEdyb3VwLmZlZXMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpPT0wXCI+IHt7YWZ0ZXJGZWVBbGxvY2F0ZU91dHN0YW5kaW5nIHwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMid9fSA8L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDx0Ym9keSBjbGFzcz1cImdvdnVrLXRhYmxlX19ib2R5XCIgKm5nSWY9XCJwYXltZW50R3JvdXAuZmVlcy5sZW5ndGggPT0gMFwiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCIgY29sc3Bhbj1cIjZcIj5ObyBwYXltZW50cyByZWNvcmRlZDwvdGQ+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay13YXJuaW5nLXRleHRcIiAqbmdJZj1cImlzUmVtYWluaW5nQW1vdW50R3RaZXJvIHx8IGlzUmVtYWluaW5nQW1vdW50THRaZXJvIHx8IHJlbWFpbmluZ0Ftb3VudCA9PT0gMFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJnb3Z1ay13YXJuaW5nLXRleHRfX2ljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj4hPC9zcGFuPlxuICAgICAgPHN0cm9uZyBjbGFzcz1cImdvdnVrLXdhcm5pbmctdGV4dF9fdGV4dCBnb3Z1ay13YXJuaW5nLXRleHRfX2N1c3RvbVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImdvdnVrLXdhcm5pbmctdGV4dF9fYXNzaXN0aXZlXCI+V2FybmluZzwvc3Bhbj5cbiAgICAgICAge3twYXltZW50U2VjdGlvbkxhYmVsLnRpdGxlfX0ge3sgcmVtYWluaW5nQW1vdW50IHwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMicgfX1cbiAgICAgIDwvc3Ryb25nPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1mb3JtLWdyb3VwXCIgKm5nSWY9XCJpc1JlbWFpbmluZ0Ftb3VudEd0WmVybyB8fCBpc1JlbWFpbmluZ0Ftb3VudEx0WmVyb1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLWZvcm0tZ3JvdXBcIj5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiZ292dWstZmllbGRzZXRcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiaG93LWNvbnRhY3RlZC1jb25kaXRpb25hbC1oaW50XCI+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJob3ctY29udGFjdGVkLWNvbmRpdGlvbmFsLWhpbnRcIiBjbGFzcz1cImdvdnVrLWhpbnRcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpbmxpbmUtZXJyb3ItbWVzc2FnZSc6IHBheW1lbnRSZWFzb25IYXNFcnJvcn1cIj5cbiAgICAgICAgICAgIHt7cGF5bWVudFNlY3Rpb25MYWJlbC5yZWFzb259fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBbbmdDbGFzc109XCJwYXltZW50UmVhc29uSGFzRXJyb3IgPyAnZ292dWstcmFkaW9zIGdvdnVrLXJhZGlvcy0tY29uZGl0aW9uYWwgZm9ybS1ncm91cC1lcnJvcicgOiAnZ292dWstcmFkaW9zIGdvdnVrLXJhZGlvcy0tY29uZGl0aW9uYWwnXCJcbiAgICAgICAgICAgIGRhdGEtbW9kdWxlPVwiZ292dWstcmFkaW9zXCIgKm5nSWY9XCJpc1JlbWFpbmluZ0Ftb3VudEd0WmVyb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLXJhZGlvc19faXRlbVwiICpuZ0Zvcj1cImxldCByZWFzb24gb2YgcmVhc29uTGlzdC5vdmVyUGF5bWVudCB8IGtleVZhbHVlXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImdvdnVrLXJhZGlvc19faW5wdXRcIiBpZD1cInt7cmVhc29uLmtleX19XCIgbmFtZT1cInBheW1lbnRSZWFzb25cIiB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGF5bWVudFJlYXNvblwiIHZhbHVlPXt7cmVhc29uLnZhbHVlfX0+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdvdnVrLWxhYmVsIGdvdnVrLXJhZGlvc19fbGFiZWwgZ292dWstZm9udF9fY3VzdG9tXCIgZm9yPVwiaG93LWNvbnRhY3RlZC1jb25kaXRpb25hbFwiPlxuICAgICAgICAgICAgICAgIHt7cmVhc29uLnZhbHVlfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInBheW1lbnRSZWFzb25IYXNFcnJvciA/ICdnb3Z1ay1yYWRpb3MgZ292dWstcmFkaW9zLS1jb25kaXRpb25hbCBmb3JtLWdyb3VwLWVycm9yJyA6ICdnb3Z1ay1yYWRpb3MgZ292dWstcmFkaW9zLS1jb25kaXRpb25hbCdcIlxuICAgICAgICAgICAgZGF0YS1tb2R1bGU9XCJnb3Z1ay1yYWRpb3NcIiAqbmdJZj1cImlzUmVtYWluaW5nQW1vdW50THRaZXJvXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ292dWstcmFkaW9zX19pdGVtXCIgKm5nRm9yPVwibGV0IHJlYXNvbiBvZiByZWFzb25MaXN0LnNob3J0RmFsbCB8IGtleVZhbHVlXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImdvdnVrLXJhZGlvc19faW5wdXRcIiBpZD1cInt7cmVhc29uLmtleX19XCIgbmFtZT1cInBheW1lbnRSZWFzb25cIiB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGF5bWVudFJlYXNvblwiIHZhbHVlPXt7cmVhc29uLnZhbHVlfX0+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdvdnVrLWxhYmVsIGdvdnVrLXJhZGlvc19fbGFiZWwgZ292dWstZm9udF9fY3VzdG9tXCIgZm9yPVwiaG93LWNvbnRhY3RlZC1jb25kaXRpb25hbFwiPlxuICAgICAgICAgICAgICAgIHt7cmVhc29uLnZhbHVlfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ292dWstZm9ybS1ncm91cFwiPlxuICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJnb3Z1ay1maWVsZHNldFwiIGFyaWEtZGVzY3JpYmVkYnk9XCJob3ctY29udGFjdGVkLWNvbmRpdGlvbmFsLWhpbnRcIj5cbiAgICAgICAgICA8c3BhbiBpZD1cImhvdy1jb250YWN0ZWQtY29uZGl0aW9uYWwtaGludFwiIGNsYXNzPVwiZ292dWstaGludFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lubGluZS1lcnJvci1tZXNzYWdlJzogcGF5bWVudEV4cGxhbmF0aW9uSGFzRXJyb3J9XCI+XG4gICAgICAgICAgICBQcm92aWRlIGFuIGV4cGxhbmF0b3J5IG5vdGVcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwicGF5bWVudEV4cGxhbmF0aW9uSGFzRXJyb3IgPyAnZ292dWstcmFkaW9zIGdvdnVrLXJhZGlvcy0tY29uZGl0aW9uYWwgZm9ybS1ncm91cC1lcnJvcicgOiAnZ292dWstcmFkaW9zIGdvdnVrLXJhZGlvcy0tY29uZGl0aW9uYWwnXCJcbiAgICAgICAgICAgIGRhdGEtbW9kdWxlPVwiZ292dWstcmFkaW9zXCIgKm5nSWY9XCJpc1JlbWFpbmluZ0Ftb3VudEd0WmVyb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLXJhZGlvc19faXRlbVwiICpuZ0Zvcj1cImxldCBleHBsYW5hdGlvbiBvZiBleHBsYW5hdGlvbkxpc3Qub3ZlclBheW1lbnQgfCBrZXlWYWx1ZVwiPlxuICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJnb3Z1ay1yYWRpb3NfX2lucHV0XCIgaWQ9XCJ7e2V4cGxhbmF0aW9uLmtleX19XCIgbmFtZT1cInBheW1lbnRFeHBsYW5hdGlvblwiIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYXltZW50RXhwbGFuYXRpb25cIiB2YWx1ZT17e2V4cGxhbmF0aW9uLnZhbHVlfX1cbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UmFkaW9CdXR0b24oZXhwbGFuYXRpb24ua2V5LCAnZXhwbGFuYXRpb24nKVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnb3Z1ay1sYWJlbCBnb3Z1ay1yYWRpb3NfX2xhYmVsIGdvdnVrLWZvbnRfX2N1c3RvbVwiIGZvcj1cImhvdy1jb250YWN0ZWQtY29uZGl0aW9uYWxcIj5cbiAgICAgICAgICAgICAgICB7e2V4cGxhbmF0aW9uLnZhbHVlfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInBheW1lbnRFeHBsYW5hdGlvbkhhc0Vycm9yID8gJ2dvdnVrLXJhZGlvcyBnb3Z1ay1yYWRpb3MtLWNvbmRpdGlvbmFsIGZvcm0tZ3JvdXAtZXJyb3InIDogJ2dvdnVrLXJhZGlvcyBnb3Z1ay1yYWRpb3MtLWNvbmRpdGlvbmFsJ1wiXG4gICAgICAgICAgICBkYXRhLW1vZHVsZT1cImdvdnVrLXJhZGlvc1wiICpuZ0lmPVwiaXNSZW1haW5pbmdBbW91bnRMdFplcm9cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1yYWRpb3NfX2l0ZW1cIiAqbmdGb3I9XCJsZXQgZXhwbGFuYXRpb24gb2YgZXhwbGFuYXRpb25MaXN0LnNob3J0RmFsbCB8IGtleVZhbHVlXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImdvdnVrLXJhZGlvc19faW5wdXRcIiBpZD1cInt7ZXhwbGFuYXRpb24ua2V5fX1cIiBuYW1lPVwicGF5bWVudEV4cGxhbmF0aW9uXCIgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBheW1lbnRFeHBsYW5hdGlvblwiIHZhbHVlPXt7ZXhwbGFuYXRpb24udmFsdWV9fVxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RSYWRpb0J1dHRvbihleHBsYW5hdGlvbi5rZXksICdleHBsYW5hdGlvbicpXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdvdnVrLWxhYmVsIGdvdnVrLXJhZGlvc19fbGFiZWwgZ292dWstZm9udF9fY3VzdG9tXCIgZm9yPVwiaG93LWNvbnRhY3RlZC1jb25kaXRpb25hbFwiPlxuICAgICAgICAgICAgICAgIHt7ZXhwbGFuYXRpb24udmFsdWV9fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwib3ZlclVuZGVyUGF5bWVudEZvcm1cIiBub3ZhbGlkYXRlPlxuICAgICAgPGRpdlxuICAgICAgICBbbmdDbGFzc109XCJpc01vcmVEZXRhaWxzQm94SGlkZSA/ICdnb3Z1ay1yYWRpb3NfX2NvbmRpdGlvbmFsIGdvdnVrLXJhZGlvc19fY29uZGl0aW9uYWwtLWhpZGRlbicgOiBpc1BheW1lbnREZXRhaWxzRW1wdHkgfHwgaXNQYXltZW50RGV0YWlsc0ludmFsaWQgfHwgcGF5bWVudERldGFpbHNNaW5IYXNFcnJvciB8fCBwYXltZW50RGV0YWlsc01heEhhc0Vycm9yID8gJ2dvdnVrLXJhZGlvc19fY29uZGl0aW9uYWwgaW5saW5lLWVycm9yLWJvcmRlcicgOiAnZ292dWstcmFkaW9zX19jb25kaXRpb25hbCdcIlxuICAgICAgICBpZD1cImNvbmRpdGlvbmFsLWhvdy1jb250YWN0ZWQtY29uZGl0aW9uYWwtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ292dWstZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxzcGFuIGlkPVwibW9yZS1kZXRhaWwtaGludFwiIGNsYXNzPVwiZ292dWstaGludCBnb3Z1ay1mb250X19jdXN0b21cIj5cbiAgICAgICAgICAgIFBsZWFzZSBlbnRlciBkZXRhaWxzXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImdvdnVrLXRleHRhcmVhXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW5saW5lLWVycm9yLWNsYXNzJzogaXNQYXltZW50RGV0YWlsc0VtcHR5IHx8IGlzUGF5bWVudERldGFpbHNJbnZhbGlkIHx8IHBheW1lbnREZXRhaWxzTWluSGFzRXJyb3IgfHwgcGF5bWVudERldGFpbHNNYXhIYXNFcnJvcn1cIlxuICAgICAgICAgICAgaWQ9XCJtb3JlRGV0YWlsc1wiIG5hbWU9XCJtb3JlRGV0YWlsc1wiIHJvd3M9XCI1XCIgZm9ybUNvbnRyb2xOYW1lPVwibW9yZURldGFpbHNcIj5cbiAgICAgICAgICA8L3RleHRhcmVhPlxuICAgICAgICAgIDxwIGNsYXNzPVwiaW5saW5lLWVycm9yLW1lc3NhZ2VcIlxuICAgICAgICAgICAgKm5nSWY9XCJpc1BheW1lbnREZXRhaWxzRW1wdHkgfHwgaXNQYXltZW50RGV0YWlsc0ludmFsaWQgfHwgcGF5bWVudERldGFpbHNNaW5IYXNFcnJvciB8fCBwYXltZW50RGV0YWlsc01heEhhc0Vycm9yXCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzUGF5bWVudERldGFpbHNFbXB0eVwiPkVudGVyIGEgZXhwbGFuYXRpb248L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzUGF5bWVudERldGFpbHNJbnZhbGlkXCI+RW50ZXIgYSB2YWxpZCBleHBsYW5hdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGF5bWVudERldGFpbHNNaW5IYXNFcnJvclwiPkV4cGxhbmF0aW9uIHNob3VsZCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnMuPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwYXltZW50RGV0YWlsc01heEhhc0Vycm9yXCI+RXhwbGFuYXRpb24gc2hvdWxkIGJlIDI1NSBjaGFyYWN0ZXJzIG9yIHVuZGVyLjwvc3Bhbj5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ292dWstYnV0dG9uLS1ncm91cFwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwiaXNDb25maXJtQnV0dG9uZGlzYWJsZWRcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImlzQ29uZmlybUJ1dHRvbmRpc2FibGVkID8gJ2J1dHRvbiBidXR0b24tLWRpc2FibGVkJyA6ICdidXR0b24nXCJcbiAgICAgICAgICAoY2xpY2spPVwiY29uZmlybUFsbG9jYXRlUGF5ZW1lbnQoKVwiPlxuICAgICAgICAgIENvbmZpcm1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnV0dG9uIGdvdnVrLWJ1dHRvbi0tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImNhbmNlbEFsbG9jYXRlUGF5bWVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgQ2FuY2VsXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PiJdfQ==