@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,1189 @@
1
+ import { Component, Input, Output, EventEmitter, Inject, forwardRef } from '@angular/core';
2
+ import { FormBuilder, Validators, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
3
+ import { Router } from '@angular/router';
4
+ import { AddRemissionRequest } from '../../interfaces/AddRemissionRequest';
5
+ import { PaymentViewService } from '../../services/payment-view/payment-view.service';
6
+ import { RefundsService } from '../../services/refunds/refunds.service';
7
+ import { NotificationService } from '../../services/notification/notification.service';
8
+ import { AddRetroRemissionRequest } from '../../interfaces/AddRetroRemissionRequest';
9
+ import { PostRefundRetroRemission } from '../../interfaces/PostRefundRetroRemission';
10
+ import { PostIssueRefundRetroRemission } from '../../interfaces/PostIssueRefundRetroRemission';
11
+ import { ChangeDetectorRef } from '@angular/core';
12
+ import { OrderslistService } from '../../services/orderslist.service';
13
+ import { PaymentViewComponent } from '../payment-view/payment-view.component';
14
+ import { CommonModule } from '@angular/common';
15
+ import { ServiceRequestComponent } from '../service-request/service-request.component';
16
+ import { NotificationPreviewComponent } from '../notification-preview/notification-preview.component';
17
+ import { CcdHyphensPipe } from '../../pipes/ccd-hyphens.pipe';
18
+ import { CapitalizePipe } from '../../pipes/capitalize.pipe';
19
+ import { ContactDetailsComponent } from '../contact-details/contact-details.component';
20
+ import * as i0 from "@angular/core";
21
+ import * as i1 from "@angular/forms";
22
+ import * as i2 from "@angular/router";
23
+ import * as i3 from "../../services/payment-view/payment-view.service";
24
+ import * as i4 from "../../services/notification/notification.service";
25
+ import * as i5 from "../../services/refunds/refunds.service";
26
+ import * as i6 from "../../services/orderslist.service";
27
+ import * as i7 from "@angular/common";
28
+ const BS_ENABLE_FLAG = 'bulk-scan-enabling-fe';
29
+ const resolvedPromise = Promise.resolve(null);
30
+ export class AddRemissionComponent {
31
+ formBuilder;
32
+ router;
33
+ paymentViewService;
34
+ notificationService;
35
+ paymentLibComponent;
36
+ refundService;
37
+ cd;
38
+ OrderslistService;
39
+ fee;
40
+ fees;
41
+ payment;
42
+ remission;
43
+ ccdCaseNumber;
44
+ caseType;
45
+ viewCompStatus;
46
+ paymentGroupRef;
47
+ isTurnOff;
48
+ isRefundRemission;
49
+ isStrategicFixEnable;
50
+ paidAmount;
51
+ isFromRefundListPage;
52
+ isFromPaymentDetailPage;
53
+ isFromServiceRequestPage;
54
+ isFullyRefund;
55
+ feeamount;
56
+ refundPaymentReference;
57
+ isFromRefundStatusPage;
58
+ changeRefundReason;
59
+ isServiceRequest;
60
+ LOGGEDINUSERROLES;
61
+ orderDetail;
62
+ orderRef;
63
+ orderStatus;
64
+ orderParty;
65
+ orderCreated;
66
+ orderCCDEvent;
67
+ takePayment;
68
+ orderFeesTotal;
69
+ orderTotalPayments;
70
+ orderRemissionTotal;
71
+ cancelRemission = new EventEmitter();
72
+ //@Output() refundListReason: EventEmitter<any> = new EventEmitter({reason:string, code:string});
73
+ refundListReason = new EventEmitter();
74
+ refundListAmount = new EventEmitter();
75
+ refundFees = new EventEmitter();
76
+ refund = {
77
+ reason: {
78
+ duplicate: 'Duplicate payment',
79
+ humanerror: 'Human error',
80
+ caseWithdrawn: 'Case withdrawn',
81
+ other: 'Other'
82
+ }
83
+ };
84
+ contactDetailsObj;
85
+ notification;
86
+ remissionForm;
87
+ hasErrors = false;
88
+ viewStatus = 'main';
89
+ errorMessage = null;
90
+ option = null;
91
+ isConfirmationBtnDisabled = false;
92
+ bsPaymentDcnNumber;
93
+ selectedValue = 'yes';
94
+ amount;
95
+ retroRemission = false;
96
+ remissionReference = '';
97
+ refundReference;
98
+ refundAmount;
99
+ paymentExplanationHasError = false;
100
+ refundReason;
101
+ selectedRefundReason;
102
+ selectedRefundReasonCode;
103
+ displayRefundReason;
104
+ refundCode;
105
+ remessionPayment;
106
+ isRemissionCodeEmpty = false;
107
+ remissionCodeHasError = false;
108
+ isAmountEmpty = false;
109
+ isReasonEmpty = false;
110
+ amountHasError = false;
111
+ isRemissionLessThanFeeError = false;
112
+ refundHasError = false;
113
+ isPaymentSuccess = false;
114
+ isRemissionApplied = false;
115
+ remissionamt;
116
+ elementId;
117
+ // refundReasons: any[] = [];
118
+ commonRefundReasons = [];
119
+ showReasonText;
120
+ isRefundReasonsSelected;
121
+ default;
122
+ reasonLength;
123
+ refundReasons;
124
+ pattern1;
125
+ pattern2;
126
+ sendOrderDetail;
127
+ sendOrderRef;
128
+ paymentReference;
129
+ class = '';
130
+ errorMsg = new Array();
131
+ totalRefundAmount;
132
+ quantityUpdated;
133
+ fullRefund;
134
+ allowedRefundAmount;
135
+ isRemissionsMatch;
136
+ paymentFees;
137
+ paymentGroup;
138
+ isStatusAllocated;
139
+ isFromCheckAnsPage;
140
+ refundAmtForFeeVolumes;
141
+ paymentObj;
142
+ templateInstructionType;
143
+ notificationPreview;
144
+ component;
145
+ constructor(formBuilder, router, paymentViewService, notificationService, paymentLibComponent, refundService, cd, OrderslistService) {
146
+ this.formBuilder = formBuilder;
147
+ this.router = router;
148
+ this.paymentViewService = paymentViewService;
149
+ this.notificationService = notificationService;
150
+ this.paymentLibComponent = paymentLibComponent;
151
+ this.refundService = refundService;
152
+ this.cd = cd;
153
+ this.OrderslistService = OrderslistService;
154
+ }
155
+ ngOnInit() {
156
+ this.errorMessage = '';
157
+ this.errorMsg = [];
158
+ this.default = 'Select a different reason';
159
+ this.pattern1 = '^([a-zA-Z0-9]{3})-([a-zA-Z0-9]{3})-([a-zA-Z0-9]{3})$';
160
+ this.pattern2 = '^([A-Za-z]{2}[0-9]{2})-([0-9]{6})$';
161
+ if (this.viewCompStatus !== '' && this.viewCompStatus !== undefined) {
162
+ this.viewStatus = '';
163
+ }
164
+ if (this.remission) {
165
+ }
166
+ if (this.fee) {
167
+ this.amount = (this.fee.volume * this.fee.calculated_amount);
168
+ }
169
+ if (this.payment) {
170
+ this.paymentReference = this.payment.reference;
171
+ this.remessionPayment = this.payment;
172
+ if (this.payment.status === 'Success') {
173
+ this.isPaymentSuccess = true;
174
+ }
175
+ }
176
+ this.option = this.paymentLibComponent.SELECTED_OPTION;
177
+ this.bsPaymentDcnNumber = this.paymentLibComponent.bspaymentdcn;
178
+ this.remissionForm = this.formBuilder.group({
179
+ remissionCode: new FormControl('', Validators.compose([
180
+ Validators.required,
181
+ Validators.pattern(`(${this.pattern1})|(${this.pattern2})`)
182
+ ])),
183
+ amount: new FormControl('', Validators.compose([
184
+ Validators.required,
185
+ Validators.pattern('^[0-9]+(\.[0-9]{1,2})?$')
186
+ ])),
187
+ refundReason: new FormControl('', Validators.compose([Validators.required])),
188
+ refundDDReason: new FormControl('', Validators.compose([Validators.required])),
189
+ reason: new FormControl(),
190
+ feeAmount: new FormControl(),
191
+ feesList: this.formBuilder.array([])
192
+ });
193
+ const remissionctrls = this.remissionForm.controls;
194
+ remissionctrls['refundDDReason'].setValue('Select a different reason', { onlySelf: true });
195
+ if (this.refundPaymentReference !== undefined && this.refundPaymentReference.length > 0) {
196
+ this.paymentReference = this.refundPaymentReference;
197
+ }
198
+ else {
199
+ this.paymentReference = (this.payment !== undefined) ? this.payment.reference : '';
200
+ }
201
+ if (this.isFromServiceRequestPage) {
202
+ this.paymentViewService.getApportionPaymentDetails(this.paymentReference).subscribe(paymentGroup => {
203
+ let fees = [];
204
+ paymentGroup.fees.forEach(fee => {
205
+ this.isRemissionsMatch = false;
206
+ paymentGroup.remissions.forEach(rem => {
207
+ if (rem.fee_code === fee.code) {
208
+ this.isRemissionsMatch = true;
209
+ fee['remissions'] = rem;
210
+ fees.push(fee);
211
+ }
212
+ });
213
+ if (!this.isRemissionsMatch) {
214
+ fees.push(fee);
215
+ }
216
+ });
217
+ paymentGroup.fees = fees;
218
+ this.paymentFees = fees;
219
+ this.fees = fees;
220
+ this.paymentGroup = paymentGroup;
221
+ this.paymentGroup.payments = this.paymentGroup.payments.filter(paymentGroupObj => paymentGroupObj['reference'].includes(this.paymentLibComponent.paymentReference));
222
+ // const paymentAllocation = this.paymentGroup.payments[0].payment_allocation;
223
+ // this.isStatusAllocated = paymentAllocation.length > 0 && paymentAllocation[0].allocation_status === 'Allocated' || paymentAllocation.length === 0;
224
+ this.refundFeesList();
225
+ }, (error) => this.errorMessage = error);
226
+ }
227
+ if (this.fees && this.viewCompStatus === 'issuerefund') {
228
+ this.refundFeesList();
229
+ }
230
+ if (this.viewCompStatus === '') {
231
+ this.viewStatus = 'main';
232
+ }
233
+ if (this.viewCompStatus === 'issuerefundpage1') {
234
+ this.refundService.getRefundReasons().subscribe(refundReasons => {
235
+ this.refundReasons = refundReasons.filter((data) => data.recently_used === false);
236
+ this.refundReasons = this.refundReasons.filter((data) => data.name !== 'Retrospective remission' && data.name !== 'Overpayment');
237
+ this.cd.detectChanges();
238
+ this.commonRefundReasons = refundReasons.filter((data) => data.recently_used === true);
239
+ this.commonRefundReasons.sort((a, b) => a.toString().localeCompare(b));
240
+ this.cd.detectChanges();
241
+ });
242
+ this.refundReason = this.changeRefundReason;
243
+ }
244
+ if (this.viewCompStatus === 'processretroremissonpage' && this.isFromRefundListPage) {
245
+ this.viewStatus = 'processretroremissonpage';
246
+ }
247
+ if (this.orderDetail !== undefined) {
248
+ this.paymentViewService.getApportionPaymentDetails(this.orderDetail[0].payments[0].reference).subscribe(paymentGroup => {
249
+ this.fees = paymentGroup.fees;
250
+ this.paymentReference = paymentGroup.payments[0].reference;
251
+ }, (error) => this.errorMessage = error);
252
+ }
253
+ }
254
+ goToPaymentViewComponent() {
255
+ this.paymentLibComponent.paymentMethod = this.payment.method;
256
+ this.paymentLibComponent.paymentGroupReference = this.paymentGroupRef;
257
+ this.paymentLibComponent.paymentReference = this.paymentReference;
258
+ //this.PaymentViewComponent.viewCompStatus = 'overpayment';
259
+ this.paymentLibComponent.viewName = 'payment-view';
260
+ }
261
+ refundFeesList() {
262
+ const creds = this.remissionForm.controls.feesList;
263
+ // if(creds.controls.length > 0) {
264
+ for (var i = 0; i < this.fees.length; i++) {
265
+ creds.push(this.formBuilder.group({
266
+ id: this.fees[i].id,
267
+ code: this.fees[i].code,
268
+ volume: this.fees[i].volume,
269
+ calculated_amount: this.fees[i].calculated_amount,
270
+ apportion_amount: this.fees[i].apportion_amount,
271
+ ccd_case_number: this.fees[i].ccd_case_number,
272
+ description: this.fees[i].description,
273
+ net_amount: this.fees[i].net_amount,
274
+ version: this.fees[i].version,
275
+ refund_amount: [''],
276
+ selected: [''],
277
+ updated_volume: this.fees[i].volume
278
+ }));
279
+ }
280
+ this.cd.detectChanges();
281
+ //}
282
+ }
283
+ get feesList() {
284
+ const dd = this.remissionForm.get('feesList');
285
+ return this.remissionForm.get('feesList');
286
+ }
287
+ noneSelected() {
288
+ if (this.isFullyRefund) {
289
+ return false;
290
+ }
291
+ else {
292
+ if (!this.feesList.controls.some(item => item.get('selected').value === true)) {
293
+ this.errorMsg = [];
294
+ [].forEach.call(document.querySelectorAll('input'), function (el) {
295
+ el.classList.remove('inline-error-class');
296
+ });
297
+ }
298
+ return !this.feesList.controls.some(item => item.get('selected').value === true);
299
+ }
300
+ }
301
+ check_en(i, v1, AppAmt, Volume) {
302
+ const ele = document.getElementById(v1);
303
+ const formArray = this.remissionForm.controls.feesList;
304
+ if (ele.checked) {
305
+ formArray.at(i).get('refund_amount').setValue(AppAmt);
306
+ formArray.at(i).get('volume').setValue(Volume);
307
+ formArray.at(i).get('selected').setValue(true);
308
+ formArray.at(i).get('updated_volume').setValue(Volume);
309
+ document.getElementById('feeAmount_' + v1).value = AppAmt;
310
+ document.getElementById('feeAmount_' + v1).removeAttribute("disabled");
311
+ if (Volume === 1) {
312
+ document.getElementById('VolumeUpdated_' + v1).value = Volume;
313
+ }
314
+ else {
315
+ document.getElementById('feeVolumeUpdated_' + v1).value = Volume;
316
+ }
317
+ if (document.getElementById('feeVolumeUpdated_' + v1) !== null) {
318
+ document.getElementById('feeAmount_' + v1).removeAttribute("disabled");
319
+ document.getElementById('feeVolumeUpdated_' + v1).removeAttribute("disabled");
320
+ }
321
+ this.cd.detectChanges();
322
+ }
323
+ else {
324
+ this.errorMsg = [];
325
+ document.getElementById('feeAmount_' + v1).setAttribute("disabled", "true");
326
+ this.remissionForm.value.feesList[i]["refund_amount"] = '';
327
+ this.remissionForm.value.feesList[i]["volume"] = '';
328
+ this.remissionForm.value.feesList[i]["selected"] = false;
329
+ document.getElementById('feeAmount_' + v1).value = '';
330
+ if (Volume > 1) {
331
+ this.remissionForm.value.feesList[i]["volume"] = '';
332
+ document.getElementById('feeVolumeUpdated_' + v1).value = '';
333
+ }
334
+ if (document.getElementById('feeVolumeUpdated_' + v1) !== null) {
335
+ document.getElementById('feeVolumeUpdated_' + v1).removeAttribute("disabled");
336
+ }
337
+ this.cd.detectChanges();
338
+ }
339
+ }
340
+ addRemission() {
341
+ this.resetRemissionForm([false, false, false, false, false, false], 'All');
342
+ const remissionctrls = this.remissionForm.controls, isRemissionLessThanFee = this.fee.calculated_amount > remissionctrls.amount.value;
343
+ this.remissionForm.controls['refundReason'].setErrors(null);
344
+ this.remissionForm.controls['refundDDReason'].setErrors(null);
345
+ if (this.remissionForm.dirty && this.remissionForm.valid && isRemissionLessThanFee) {
346
+ this.viewStatus = 'confirmation';
347
+ }
348
+ else {
349
+ if (remissionctrls['remissionCode'].value == '') {
350
+ this.resetRemissionForm([true, false, false, false, false, false], 'remissionCode');
351
+ }
352
+ if (remissionctrls['remissionCode'].value != '' && remissionctrls['remissionCode'].invalid) {
353
+ this.resetRemissionForm([false, true, false, false, false, false], 'remissionCode');
354
+ }
355
+ if (remissionctrls['amount'].value == '') {
356
+ this.resetRemissionForm([false, false, true, false, false, false], 'amount');
357
+ }
358
+ if (remissionctrls['amount'].value != '' && remissionctrls['amount'].invalid) {
359
+ this.resetRemissionForm([false, true, false, true, false, false], 'amount');
360
+ }
361
+ if (remissionctrls.amount.valid && !isRemissionLessThanFee) {
362
+ this.resetRemissionForm([false, false, false, false, true, false], 'amount');
363
+ }
364
+ }
365
+ }
366
+ confirmRemission() {
367
+ this.isConfirmationBtnDisabled = true;
368
+ const newNetAmount = this.remissionForm.controls.amount.value, remissionAmount = this.fee.net_amount - newNetAmount, requestBody = new AddRemissionRequest(this.ccdCaseNumber, this.fee, remissionAmount, this.remissionForm.controls.remissionCode.value, this.caseType);
369
+ this.paymentViewService.postPaymentGroupWithRemissions(decodeURIComponent(this.paymentGroupRef).trim(), this.fee.id, requestBody).subscribe(response => {
370
+ if (JSON.parse(response).success) {
371
+ let LDUrl = this.isTurnOff ? '&isTurnOff=Enable' : '&isTurnOff=Disable';
372
+ LDUrl += `&caseType=${this.caseType}`;
373
+ if (this.paymentLibComponent.bspaymentdcn) {
374
+ this.router.routeReuseStrategy.shouldReuseRoute = () => false;
375
+ this.router.onSameUrlNavigation = 'reload';
376
+ this.router.navigateByUrl(`/payment-history/${this.ccdCaseNumber}?view=fee-summary&selectedOption=${this.option}&paymentGroupRef=${this.paymentGroupRef}&dcn=${this.paymentLibComponent.bspaymentdcn}${LDUrl}`);
377
+ }
378
+ else {
379
+ this.gotoCasetransationPage();
380
+ }
381
+ }
382
+ }, (error) => {
383
+ this.errorMessage = error;
384
+ this.isConfirmationBtnDisabled = false;
385
+ });
386
+ }
387
+ resetRemissionForm(val, field) {
388
+ if (field === 'All') {
389
+ this.isRemissionCodeEmpty = val[0];
390
+ this.remissionCodeHasError = val[1];
391
+ this.isAmountEmpty = val[2];
392
+ this.amountHasError = val[3];
393
+ this.isRemissionLessThanFeeError = val[4];
394
+ this.isReasonEmpty = val[5];
395
+ }
396
+ else if (field === 'remissionCode' || field === 'All') {
397
+ this.isRemissionCodeEmpty = val[0];
398
+ this.remissionCodeHasError = val[1];
399
+ }
400
+ else if (field === 'amount' || field === 'All') {
401
+ this.isAmountEmpty = val[2];
402
+ this.amountHasError = val[3];
403
+ this.isRemissionLessThanFeeError = val[4];
404
+ }
405
+ else if (field === 'reason' || field === 'All') {
406
+ this.isReasonEmpty = val[5];
407
+ }
408
+ }
409
+ // Add retro remission changes
410
+ addRemissionCode() {
411
+ this.errorMessage = false;
412
+ // this.isFromCheckAnsPage = true;
413
+ this.errorMsg = [];
414
+ this.viewStatus = '';
415
+ this.isRefundRemission = false;
416
+ this.resetRemissionForm([false, false, false, false, false, false], 'All');
417
+ const remissionctrls = this.remissionForm.controls;
418
+ // isRemissionLessThanFee = this.fee.calculated_amount >= remissionctrls.amount.value;
419
+ this.remissionForm.controls['refundReason'].setErrors(null);
420
+ this.remissionForm.controls['refundDDReason'].setErrors(null);
421
+ this.remissionForm.controls['amount'].setErrors(null);
422
+ if (this.remissionForm.dirty && this.remissionForm.valid) {
423
+ if (!this.isFromCheckAnsPage) {
424
+ this.viewCompStatus = '';
425
+ this.viewStatus = "processretroremissonpage";
426
+ }
427
+ else {
428
+ this.viewCompStatus = '';
429
+ this.viewStatus = 'checkretroremissionpage';
430
+ }
431
+ }
432
+ else {
433
+ if (remissionctrls['remissionCode'].value == '') {
434
+ this.resetRemissionForm([true, false, false, false, false], 'remissionCode');
435
+ }
436
+ if (remissionctrls['remissionCode'].value != '' && remissionctrls['remissionCode'].invalid) {
437
+ this.resetRemissionForm([false, true, false, false, false], 'remissionCode');
438
+ }
439
+ if (remissionctrls['amount'].value == '') {
440
+ this.resetRemissionForm([false, false, true, false, false], 'amount');
441
+ }
442
+ if (remissionctrls['amount'].value != '' && remissionctrls['amount'].invalid) {
443
+ this.resetRemissionForm([false, true, false, true, false], 'amount');
444
+ }
445
+ if (remissionctrls['reason'].value == '') {
446
+ this.resetRemissionForm([false, false, false, true, false, true], 'reason');
447
+ }
448
+ if (remissionctrls.amount.valid) {
449
+ this.resetRemissionForm([false, false, false, false, true], 'amount');
450
+ }
451
+ }
452
+ }
453
+ gotoAddRetroRemissionCodePage() {
454
+ this.errorMessage = false;
455
+ this.isFromCheckAnsPage = false;
456
+ this.errorMsg = [];
457
+ if (this.isRefundRemission) {
458
+ this.refundListAmount.emit();
459
+ this.paymentLibComponent.isFromRefundStatusPage = true;
460
+ return;
461
+ }
462
+ if (this.isFromRefundListPage) {
463
+ this.paymentLibComponent.iscancelClicked = true;
464
+ this.refundListReason.emit({ reason: this.selectedRefundReason, code: this.refundReason });
465
+ this.paymentLibComponent.isFromRefundStatusPage = true;
466
+ return;
467
+ }
468
+ this.viewStatus = '';
469
+ this.selectedValue = 'yes';
470
+ this.viewCompStatus = "addremission";
471
+ this.isRefundRemission = true;
472
+ this.errorMessage = '';
473
+ this.errorMsg = [];
474
+ if (this.isFromPaymentDetailPage) {
475
+ this.paymentLibComponent.viewName = 'payment-view';
476
+ }
477
+ }
478
+ gotoCheckRetroRemissionPage(payment) {
479
+ this.paymentLibComponent.iscancelClicked = false;
480
+ this.errorMessage = '';
481
+ this.resetRemissionForm([false, false, false, false, false], 'All');
482
+ if (!this.isRefundRemission) {
483
+ var remissionctrls = this.remissionForm.controls, isRemissionLessThanFee = this.fee.calculated_amount >= remissionctrls.amount.value;
484
+ if (this.remissionForm.dirty) {
485
+ if (remissionctrls['amount'].value == '' || remissionctrls['amount'].value < 0) {
486
+ this.resetRemissionForm([false, false, true, false, false], 'amount');
487
+ }
488
+ else if (remissionctrls['amount'].value != '' && remissionctrls['amount'].invalid) {
489
+ this.resetRemissionForm([false, false, false, true, false], 'amount');
490
+ }
491
+ else if (remissionctrls.amount.valid && !isRemissionLessThanFee) {
492
+ this.resetRemissionForm([false, false, false, false, true], 'amount');
493
+ }
494
+ else {
495
+ this.viewCompStatus = '';
496
+ this.viewStatus = "checkretroremissionpage";
497
+ }
498
+ }
499
+ }
500
+ else {
501
+ var remissionctrls = this.remissionForm.controls;
502
+ //if (this.remissionForm.dirty ) {
503
+ if (remissionctrls['amount'].value == '' || remissionctrls['amount'].value < 0) {
504
+ this.resetRemissionForm([false, false, true, false, false], 'amount');
505
+ }
506
+ else {
507
+ this.viewCompStatus = '';
508
+ this.viewStatus = "checkretroremissionpage";
509
+ this.refundListAmount.emit(remissionctrls['amount'].value);
510
+ }
511
+ //}
512
+ }
513
+ }
514
+ gotoAmountRetroRemission() {
515
+ this.isFromCheckAnsPage = false;
516
+ this.viewStatus = 'processretroremissonpage';
517
+ this.viewCompStatus = '';
518
+ // this.isRefundRemission = true;
519
+ this.errorMessage = '';
520
+ }
521
+ gotoProcessRetroRemissionPage() {
522
+ this.isFromCheckAnsPage = true;
523
+ this.viewStatus = '';
524
+ this.viewCompStatus = 'addremission';
525
+ this.isRefundRemission = true;
526
+ this.errorMessage = '';
527
+ this.errorMsg = [];
528
+ }
529
+ gotoProcessRetroRemission(note) {
530
+ if (note) {
531
+ this.notification = { contact_details: note, notification_type: note.notification_type };
532
+ }
533
+ this.isFromCheckAnsPage = true;
534
+ this.viewStatus = 'remissionAddressPage';
535
+ this.viewCompStatus = '';
536
+ this.isRefundRemission = true;
537
+ this.errorMessage = '';
538
+ }
539
+ confirmRetroRemission() {
540
+ if (!this.isConfirmationBtnDisabled) {
541
+ this.retroRemission = true;
542
+ this.remissionamt = this.remissionForm.controls.amount.value;
543
+ const requestBody = new AddRetroRemissionRequest(this.remissionamt, this.remissionForm.controls.remissionCode.value);
544
+ this.paymentViewService.postPaymentGroupWithRetroRemissions(decodeURIComponent(this.paymentGroupRef).trim(), this.fee.id, requestBody).subscribe(response => {
545
+ if (JSON.parse(response)) {
546
+ this.isRemissionApplied = true;
547
+ this.viewCompStatus = '';
548
+ this.viewStatus = 'retroremissionconfirmationpage';
549
+ this.remissionReference = JSON.parse(response).remission_reference;
550
+ }
551
+ }, (error) => {
552
+ this.errorMessage = error;
553
+ this.isConfirmationBtnDisabled = false;
554
+ this.cd.detectChanges();
555
+ });
556
+ }
557
+ }
558
+ processRefund() {
559
+ this.errorMessage = '';
560
+ this.errorMsg = [];
561
+ this.isConfirmationBtnDisabled = true;
562
+ if (this.isRefundRemission) {
563
+ this.retroRemission = true;
564
+ }
565
+ if (this.remissionReference === undefined || this.remissionReference === '') {
566
+ this.remissionReference = this.remission.remission_reference;
567
+ }
568
+ const requestBody = new PostIssueRefundRetroRemission(this.remissionReference, this.contactDetailsObj);
569
+ this.paymentViewService.postRefundRetroRemission(requestBody).subscribe(response => {
570
+ if (JSON.parse(response)) {
571
+ this.viewCompStatus = '';
572
+ this.viewStatus = 'refundconfirmationpage';
573
+ this.refundReference = JSON.parse(response).refund_reference;
574
+ this.refundAmount = JSON.parse(response).refund_amount;
575
+ }
576
+ }, (error) => {
577
+ this.errorMessage = error;
578
+ this.isConfirmationBtnDisabled = false;
579
+ });
580
+ }
581
+ // Issue Refund changes
582
+ gotoIssueRefundConfirmation(payment) {
583
+ this.paymentLibComponent.iscancelClicked = false;
584
+ if (this.paymentLibComponent.REFUNDLIST === "true") {
585
+ this.isFromRefundListPage = true;
586
+ }
587
+ this.totalRefundAmount = this.remissionForm.value.feesList.reduce((a, c) => a + c.refund_amount * c.selected, 0);
588
+ this.errorMessage = '';
589
+ this.errorMsg = [];
590
+ this.refundReason = this.remissionForm.controls['refundReason'].value === null ? this.remissionForm.controls['refundDDReason'].value : this.remissionForm.controls['refundReason'].value;
591
+ if (!this.refundReason || this.refundReason === 'Select a different reason') {
592
+ this.refundHasError = true;
593
+ }
594
+ else if (this.selectedRefundReason.includes('Other') && (this.remissionForm.controls['reason'].value == '' || this.remissionForm.controls['reason'].value == null)) {
595
+ this.resetRemissionForm([false, false, false, true, false, true], 'reason');
596
+ }
597
+ else if (this.selectedRefundReason.includes('Other') && this.remissionForm.controls['reason'].value !== '') {
598
+ this.refundHasError = false;
599
+ this.refundReason += '-' + this.remissionForm.controls['reason'].value;
600
+ this.displayRefundReason = this.selectedRefundReason + '-' + this.remissionForm.controls['reason'].value;
601
+ if (this.isFromRefundListPage) {
602
+ this.refundListReason.emit({ reason: this.displayRefundReason, code: this.refundReason });
603
+ }
604
+ else {
605
+ if (this.isFromCheckAnsPage) {
606
+ this.totalRefundAmount = this.remissionForm.value.feesList.reduce((a, c) => a + c.refund_amount * c.selected, 0);
607
+ this.isFromCheckAnsPage = false;
608
+ this.viewStatus = 'checkissuerefundpage';
609
+ this.viewCompStatus = '';
610
+ this.notificationPreview = false;
611
+ return;
612
+ }
613
+ this.viewCompStatus = '';
614
+ this.viewStatus = 'contactDetailsPage';
615
+ }
616
+ }
617
+ else {
618
+ this.displayRefundReason = this.selectedRefundReason;
619
+ if (this.isFromCheckAnsPage) {
620
+ this.totalRefundAmount = this.remissionForm.value.feesList.reduce((a, c) => a + c.refund_amount * c.selected, 0);
621
+ this.isFromCheckAnsPage = false;
622
+ this.viewStatus = 'checkissuerefundpage';
623
+ this.viewCompStatus = '';
624
+ this.notificationPreview = false;
625
+ return;
626
+ }
627
+ if (this.isFromRefundListPage) {
628
+ this.paymentLibComponent.isFromRefundStatusPage = true;
629
+ this.refundListReason.emit({ reason: this.selectedRefundReason, code: this.refundReason });
630
+ }
631
+ else {
632
+ this.viewCompStatus = '';
633
+ this.viewStatus = 'contactDetailsPage';
634
+ }
635
+ }
636
+ }
637
+ gotoIssueRefundPage() {
638
+ this.errorMessage = '';
639
+ this.viewCompStatus = 'issuerefund';
640
+ this.viewStatus = '';
641
+ this.isRefundRemission = true;
642
+ this.errorMessage = false;
643
+ this.errorMsg = [];
644
+ this.refundHasError = false;
645
+ this.isReasonEmpty = false;
646
+ }
647
+ gotoIssuePage(isFullyRefund) {
648
+ if (isFullyRefund) {
649
+ this.viewCompStatus = 'issuerefundpage1';
650
+ this.getRefundReasons();
651
+ }
652
+ else {
653
+ [].forEach.call(document.querySelectorAll('input'), function (el) {
654
+ el.classList.remove('inline-error-class');
655
+ });
656
+ var checkboxs = document.getElementsByTagName('input');
657
+ this.errorMessage = '';
658
+ this.totalRefundAmount = 0;
659
+ this.errorMsg = [];
660
+ for (var j = 0; j < checkboxs.length; j++) {
661
+ if (checkboxs[j].checked) {
662
+ this.fullRefund = false;
663
+ let quantity = +document.getElementById('feeVolume_' + checkboxs[j].value).value;
664
+ let amountToRefund = +document.getElementById('feeAmount_' + checkboxs[j].value).value;
665
+ let apportionAmount = +document.getElementById('feeApportionAmount_' + checkboxs[j].value).value;
666
+ let calculatedAmount = +document.getElementById('calculatedAmount_' + checkboxs[j].value).value;
667
+ if (amountToRefund === apportionAmount) {
668
+ this.fullRefund = true;
669
+ }
670
+ if (amountToRefund === 0) {
671
+ this.elementId = 'feeAmount_' + checkboxs[j].value;
672
+ this.errorMsg.push('You need to enter a refund amount');
673
+ this.getErrorClass(this.elementId);
674
+ }
675
+ if (quantity === 1) {
676
+ if (amountToRefund > 0 && amountToRefund > apportionAmount) {
677
+ this.elementId = 'feeAmount_' + checkboxs[j].value;
678
+ this.errorMsg.push('The amount you want to refund is more than the amount paid');
679
+ this.getErrorClass(this.elementId);
680
+ }
681
+ }
682
+ if (quantity > 1) {
683
+ this.quantityUpdated = +document.getElementById('feeVolumeUpdated_' + checkboxs[j].value).value;
684
+ if (this.quantityUpdated === 0) {
685
+ this.elementId = 'feeVolumeUpdated_' + checkboxs[j].value;
686
+ this.errorMsg.push('You need to enter quantity');
687
+ this.getErrorClass(this.elementId);
688
+ }
689
+ if (this.fullRefund && quantity !== this.quantityUpdated) {
690
+ this.elementId = 'feeVolumeUpdated_' + checkboxs[j].value;
691
+ this.errorMsg.push('The quantity you want to refund should be maximun available quantity');
692
+ this.getErrorClass(this.elementId);
693
+ }
694
+ if (!this.fullRefund && this.quantityUpdated > 0 && amountToRefund > 0) {
695
+ this.refundAmtForFeeVolumes = +document.getElementById('feeVOl_' + checkboxs[j].value).innerText;
696
+ this.allowedRefundAmount = this.quantityUpdated * this.refundAmtForFeeVolumes;
697
+ if (this.allowedRefundAmount !== amountToRefund) {
698
+ this.elementId = 'feeAmount_' + checkboxs[j].value;
699
+ this.errorMsg.push('The Amount to Refund should be equal to the product of Fee Amount and quantity');
700
+ this.getErrorClass(this.elementId);
701
+ }
702
+ }
703
+ if (!this.fullRefund && amountToRefund > apportionAmount) {
704
+ this.elementId = 'feeAmount_' + checkboxs[j].value;
705
+ this.errorMsg.push('The amount you want to refund is more than the amount paid');
706
+ this.getErrorClass(this.elementId);
707
+ }
708
+ if (!this.fullRefund && this.quantityUpdated > 0 && this.quantityUpdated > quantity) {
709
+ this.elementId = 'feeVolumeUpdated_' + checkboxs[j].value;
710
+ this.errorMsg.push('The quantity you want to refund is more than the available quantity');
711
+ this.getErrorClass(this.elementId);
712
+ }
713
+ }
714
+ //this.remissionForm.value.feesList.find(id=>id=checkboxs[j].value)['refund_amount'] = apportionAmount;
715
+ }
716
+ }
717
+ if (this.errorMsg.length === 0) {
718
+ if (this.isFromCheckAnsPage) {
719
+ this.isFromCheckAnsPage = false;
720
+ this.totalRefundAmount = this.remissionForm.value.feesList.reduce((a, c) => a + c.refund_amount * c.selected, 0);
721
+ this.fees = this.remissionForm.value.feesList.filter(value => value.selected === true);
722
+ this.viewStatus = 'checkissuerefundpage';
723
+ this.viewCompStatus = '';
724
+ this.notificationPreview = false;
725
+ return;
726
+ }
727
+ else if (this.isFromRefundStatusPage) {
728
+ var remissionctrls = this.remissionForm.controls;
729
+ this.totalRefundAmount = this.remissionForm.value.feesList.reduce((a, c) => a + c.refund_amount * c.selected, 0);
730
+ this.refundListAmount.emit(this.totalRefundAmount.toString());
731
+ this.fees = this.remissionForm.value.feesList.filter(value => value.selected === true);
732
+ this.refundFees.emit(this.fees);
733
+ return;
734
+ }
735
+ this.viewCompStatus = 'issuerefundpage1';
736
+ this.getRefundReasons();
737
+ }
738
+ }
739
+ }
740
+ calAmtToRefund(value, amount, volume, i) {
741
+ const volumeFee = amount / volume;
742
+ const amtToRefund = value * volumeFee;
743
+ const formArray = this.remissionForm.controls.feesList;
744
+ formArray.at(i).get('refund_amount').setValue(amtToRefund);
745
+ // formArray.at(i).get('volume').setValue(value);
746
+ // (<HTMLInputElement>document.getElementById('feeAmount_'+i)).value = +amtToRefund;
747
+ // const formControl = this.remissionForm.controls.feesList['volume'].at(i);
748
+ // formControl.setValue(value);
749
+ }
750
+ gotoContactDetailsPage(note) {
751
+ if (note) {
752
+ this.notification = { contact_details: note, notification_type: note.notification_type };
753
+ }
754
+ this.errorMessage = '';
755
+ this.viewCompStatus = '';
756
+ this.viewStatus = 'contactDetailsPage';
757
+ this.isRefundRemission = true;
758
+ this.errorMessage = false;
759
+ }
760
+ getRefundReasons() {
761
+ if (this.viewCompStatus === 'issuerefundpage1') {
762
+ this.refundService.getRefundReasons().subscribe(refundReasons => {
763
+ this.refundReasons = refundReasons.filter((data) => data.recently_used === false);
764
+ this.refundReasons = this.refundReasons.filter((data) => data.name !== 'Retrospective remission');
765
+ this.cd.detectChanges();
766
+ this.commonRefundReasons = refundReasons.filter((data) => data.recently_used === true);
767
+ this.commonRefundReasons.sort((a, b) => a.toString().localeCompare(b));
768
+ this.cd.detectChanges();
769
+ });
770
+ }
771
+ }
772
+ getErrorClass(elementId) {
773
+ if (this.errorMsg.length > 0) {
774
+ const ele = document.getElementById(elementId);
775
+ ele.classList.add('inline-error-class');
776
+ }
777
+ }
778
+ changeIssueRefundReason() {
779
+ this.isFromCheckAnsPage = true;
780
+ this.errorMessage = '';
781
+ this.errorMsg = [];
782
+ this.refundHasError = false;
783
+ this.isReasonEmpty = false;
784
+ this.viewCompStatus = 'issuerefundpage1';
785
+ this.viewStatus = '';
786
+ this.isRefundRemission = true;
787
+ }
788
+ confirmIssueRefund(isFullyRefund) {
789
+ this.isConfirmationBtnDisabled = true;
790
+ this.errorMessage = '';
791
+ this.errorMsg = [];
792
+ if (this.isRefundRemission) {
793
+ this.retroRemission = true;
794
+ }
795
+ if (isFullyRefund) {
796
+ this.totalRefundAmount = this.payment.amount;
797
+ }
798
+ if (!isFullyRefund) {
799
+ this.fees = this.remissionForm.value.feesList.filter(value => value.selected === true);
800
+ }
801
+ this.fees = this.fees.map(obj => ({
802
+ id: obj.id,
803
+ code: obj.code,
804
+ version: obj.version,
805
+ apportion_amount: obj.apportion_amount,
806
+ calculated_amount: obj.calculated_amount,
807
+ updated_volume: obj.updated_volume ? obj.updated_volume : obj.volume,
808
+ refund_amount: obj.refund_amount ? obj.refund_amount : this.totalRefundAmount
809
+ }));
810
+ const requestBody = new PostRefundRetroRemission(this.contactDetailsObj, this.fees, this.payment.reference, this.refundReason, this.totalRefundAmount, 'op');
811
+ this.paymentViewService.postRefundsReason(requestBody).subscribe(response => {
812
+ if (JSON.parse(response)) {
813
+ this.viewCompStatus = '';
814
+ this.viewStatus = 'refundconfirmationpage';
815
+ this.refundReference = JSON.parse(response).refund_reference;
816
+ if (JSON.parse(response).refund_amount) {
817
+ this.refundAmount = JSON.parse(response).refund_amount;
818
+ }
819
+ }
820
+ }, (error) => {
821
+ this.errorMessage = error;
822
+ this.isConfirmationBtnDisabled = false;
823
+ this.cd.detectChanges();
824
+ });
825
+ }
826
+ gotoRefundReasonPage() {
827
+ this.viewStatus = '';
828
+ this.viewCompStatus = 'issuerefundpage1';
829
+ }
830
+ // Retro Refund
831
+ // confirmRetroRefund() {
832
+ // this.isConfirmationBtnDisabled = true;
833
+ // this.errorMessage = '';
834
+ // this.errorMsg = [];
835
+ // if( this.isRefundRemission) {
836
+ // this.retroRemission = true;
837
+ // }
838
+ // const requestBody = new PostRefundRetroRemission(this.payment.reference,'RR004-Retrospective remission', this.contactDetailsObj);
839
+ // this.paymentViewService.postRefundsReason(requestBody).subscribe(
840
+ // response => {
841
+ // if (JSON.parse(response)) {
842
+ // this.viewCompStatus = '';
843
+ // this.viewStatus = 'retrorefundconfirmationpage';
844
+ // this.refundReference =JSON.parse(response).refund_reference;
845
+ // if(JSON.parse(response).refund_amount) {
846
+ // this.refundAmount = JSON.parse(response).refund_amount;
847
+ // }
848
+ // }
849
+ // },
850
+ // (error: any) => {
851
+ // this.errorMessage = error;
852
+ // this.isConfirmationBtnDisabled = false;
853
+ // });
854
+ // }
855
+ selectRadioButton(key, value) {
856
+ localStorage.setItem("myradio", value);
857
+ const remissionctrls = this.remissionForm.controls;
858
+ remissionctrls['refundDDReason'].setValue('Select a different reason', { onlySelf: true });
859
+ remissionctrls['reason'].reset();
860
+ this.isRefundReasonsSelected = true;
861
+ this.errorMessage = false;
862
+ this.errorMsg = [];
863
+ this.isReasonEmpty = false;
864
+ this.showReasonText = false;
865
+ this.refundHasError = false;
866
+ this.selectedRefundReason = value;
867
+ this.selectedRefundReasonCode = key;
868
+ if (this.selectedRefundReason.includes('Other')) {
869
+ this.showReasonText = true;
870
+ this.refundHasError = false;
871
+ this.refundReason = value;
872
+ }
873
+ }
874
+ selectchange(args) {
875
+ const remissionctrls = this.remissionForm.controls;
876
+ remissionctrls['refundReason'].reset();
877
+ remissionctrls['reason'].reset();
878
+ this.isRefundReasonsSelected = false;
879
+ this.showReasonText = false;
880
+ this.refundHasError = false;
881
+ this.selectedRefundReason = args.target.options[args.target.options.selectedIndex].id;
882
+ this.selectedRefundReasonCode = args.target.options[args.target.options.selectedIndex].value;
883
+ this.reasonLength = (29 - this.selectedRefundReason.split('- ')[1].length);
884
+ if (this.selectedRefundReason.includes('Other')) {
885
+ this.showReasonText = true;
886
+ this.refundHasError = false;
887
+ this.refundReason = args.target.options[args.target.options.selectedIndex].id;
888
+ }
889
+ }
890
+ getContactDetails(obj, type) {
891
+ this.contactDetailsObj = obj;
892
+ this.viewCompStatus = '';
893
+ this.notificationPreview = false;
894
+ if (type == 'checkaddRefundpage') {
895
+ this.getTemplateInstructionType(this.remessionPayment.reference, this.remessionPayment);
896
+ }
897
+ else if (type == 'checkissuerefundpage') {
898
+ this.getTemplateInstructionType(this.payment.reference, this.payment);
899
+ }
900
+ else if (type == 'addrefundcheckandanswer') {
901
+ this.getTemplateInstructionType(this.paymentReference, this.paymentObj);
902
+ }
903
+ this.viewStatus = type;
904
+ }
905
+ gotoPartialFeeRefundScreen() {
906
+ if (this.isFromRefundStatusPage) {
907
+ var remissionctrls = this.remissionForm.controls;
908
+ this.refundListReason.emit({ reason: this.displayRefundReason, code: this.refundReason });
909
+ return;
910
+ }
911
+ this.refundHasError = false;
912
+ this.viewCompStatus = 'issuerefund';
913
+ this.viewStatus = '';
914
+ }
915
+ gotoServiceRequestPage(event) {
916
+ this.errorMessage = '';
917
+ this.errorMsg = [];
918
+ this.isFromCheckAnsPage = false;
919
+ event.preventDefault();
920
+ if (this.isFromRefundStatusPage) {
921
+ var remissionctrls = this.remissionForm.controls;
922
+ this.totalRefundAmount = 0;
923
+ this.refundListAmount.emit(this.totalRefundAmount.toString());
924
+ return;
925
+ }
926
+ if (this.isFromServiceRequestPage && !this.isFromPaymentDetailPage) {
927
+ this.viewStatus = 'order-full-view';
928
+ this.viewCompStatus = '';
929
+ }
930
+ else if (this.isFromRefundListPage) {
931
+ this.paymentLibComponent.iscancelClicked = true;
932
+ this.refundListReason.emit({ reason: this.selectedRefundReason, code: this.refundReason });
933
+ this.paymentLibComponent.isFromRefundStatusPage = true;
934
+ }
935
+ else {
936
+ this.paymentLibComponent.paymentMethod = this.payment.method;
937
+ this.paymentLibComponent.paymentGroupReference = this.paymentLibComponent.paymentGroupReference;
938
+ this.paymentLibComponent.paymentReference = this.payment.reference;
939
+ this.paymentLibComponent.viewName = 'payment-view';
940
+ this.OrderslistService.setOrderRef(this.orderRef);
941
+ this.OrderslistService.setorderCCDEvent(this.orderCCDEvent);
942
+ this.OrderslistService.setorderCreated(this.orderCreated);
943
+ this.OrderslistService.setorderDetail(this.orderDetail);
944
+ this.OrderslistService.setorderParty(this.orderParty);
945
+ this.OrderslistService.setorderTotalPayments(this.orderTotalPayments);
946
+ this.OrderslistService.setorderRemissionTotal(this.orderRemissionTotal);
947
+ this.OrderslistService.setorderFeesTotal(this.orderFeesTotal);
948
+ this.viewStatus = 'payment-view';
949
+ this.sendOrderDetail = this.orderDetail;
950
+ this.sendOrderRef = this.orderRef;
951
+ if (this.LOGGEDINUSERROLES === undefined) {
952
+ this.OrderslistService.getUserRolesList().subscribe((data) => this.LOGGEDINUSERROLES = data);
953
+ }
954
+ this.viewCompStatus = '';
955
+ }
956
+ }
957
+ gotoAddressPage(note) {
958
+ if (note) {
959
+ this.notification = { contact_details: note, notification_type: note.notification_type };
960
+ }
961
+ this.errorMessage = '';
962
+ this.viewCompStatus = 'addrefundforremission';
963
+ this.viewStatus = '';
964
+ this.isRefundRemission = true;
965
+ this.errorMessage = false;
966
+ }
967
+ gotoRemissionSuccess(event) {
968
+ event.preventDefault();
969
+ this.errorMessage = '';
970
+ this.viewCompStatus = '';
971
+ this.viewStatus = 'retroremissionconfirmationpage';
972
+ this.isRefundRemission = true;
973
+ this.errorMessage = false;
974
+ }
975
+ gotoCasetransationPage() {
976
+ this.OrderslistService.setnavigationPage('casetransactions');
977
+ this.errorMessage = '';
978
+ this.errorMsg = [];
979
+ this.paymentLibComponent.viewName = 'case-transactions';
980
+ this.paymentLibComponent.VIEW = 'case-transactions';
981
+ this.paymentLibComponent.ISTURNOFF = this.isTurnOff;
982
+ this.paymentLibComponent.isFromServiceRequestPage = true;
983
+ this.resetOrderData();
984
+ let partUrl = this.bsPaymentDcnNumber ? `&dcn=${this.bsPaymentDcnNumber}` : '';
985
+ partUrl += this.paymentLibComponent.ISBSENABLE ? '&isBulkScanning=Enable' : '&isBulkScanning=Disable';
986
+ partUrl += this.paymentLibComponent.ISTURNOFF ? '&isTurnOff=Enable' : '&isTurnOff=Disable';
987
+ partUrl += this.isStrategicFixEnable ? '&isStFixEnable=Enable' : '&isStFixEnable=Disable';
988
+ partUrl += `&caseType=${this.caseType}`;
989
+ const url = `/payment-history/${this.ccdCaseNumber}?view=case-transactions&takePayment=${this.paymentLibComponent.TAKEPAYMENT}&selectedOption=${this.option}${partUrl}`;
990
+ this.router.routeReuseStrategy.shouldReuseRoute = () => false;
991
+ this.router.onSameUrlNavigation = 'reload';
992
+ this.router.navigateByUrl(url);
993
+ }
994
+ gotoCasetransationPageCancelBtnClicked(event) {
995
+ event.preventDefault();
996
+ this.errorMsg = [];
997
+ if (this.paymentLibComponent.isFromServiceRequestPage !== undefined && !this.paymentLibComponent.isFromServiceRequestPage) {
998
+ this.OrderslistService.setnavigationPage('casetransactions');
999
+ this.OrderslistService.setisFromServiceRequestPage(false);
1000
+ this.paymentLibComponent.VIEW = 'case-transactions';
1001
+ this.paymentLibComponent.viewName = 'case-transactions';
1002
+ this.paymentLibComponent.ISBSENABLE = true;
1003
+ this.paymentLibComponent.isRefundStatusView = false;
1004
+ }
1005
+ else {
1006
+ if (this.paymentLibComponent.REFUNDLIST) {
1007
+ this.paymentLibComponent.viewName = 'refund-list';
1008
+ return;
1009
+ }
1010
+ if (this.paymentLibComponent.TAKEPAYMENT === undefined && this.paymentLibComponent.SERVICEREQUEST === undefined) {
1011
+ this.paymentLibComponent.SERVICEREQUEST = 'false';
1012
+ }
1013
+ this.OrderslistService.setisFromServiceRequestPage(false);
1014
+ this.OrderslistService.setpaymentPageView({ method: '', payment_group_reference: '', reference: '' });
1015
+ this.OrderslistService.setnavigationPage('casetransactions');
1016
+ this.errorMessage = '';
1017
+ this.paymentLibComponent.viewName = 'case-transactions';
1018
+ this.paymentLibComponent.ISTURNOFF = this.isTurnOff;
1019
+ this.paymentLibComponent.isFromServiceRequestPage = true;
1020
+ this.paymentLibComponent.ISBSENABLE = true;
1021
+ let partUrl = this.bsPaymentDcnNumber ? `&dcn=${this.bsPaymentDcnNumber}` : '';
1022
+ partUrl += this.paymentLibComponent.ISBSENABLE ? '&isBulkScanning=Enable' : '&isBulkScanning=Disable';
1023
+ partUrl += this.paymentLibComponent.ISTURNOFF ? '&isTurnOff=Enable' : '&isTurnOff=Disable';
1024
+ partUrl += this.isStrategicFixEnable ? '&isStFixEnable=Enable' : '&isStFixEnable=Disable';
1025
+ partUrl += `&caseType=${this.caseType}`;
1026
+ if (this.isFromPaymentDetailPage) {
1027
+ partUrl += this.paymentLibComponent.isFromPaymentDetailPage;
1028
+ }
1029
+ if (!this.paymentLibComponent.SERVICEREQUEST) {
1030
+ const url = `/payment-history/${this.ccdCaseNumber}?view=case-transactions&takePayment=${this.paymentLibComponent.TAKEPAYMENT}&selectedOption=${this.option}${partUrl}`;
1031
+ this.router.routeReuseStrategy.shouldReuseRoute = () => false;
1032
+ this.router.onSameUrlNavigation = 'reload';
1033
+ this.router.navigateByUrl(url);
1034
+ }
1035
+ else {
1036
+ const url = `/payment-history/${this.ccdCaseNumber}?selectedOption=${this.option}${partUrl}`;
1037
+ this.router.routeReuseStrategy.shouldReuseRoute = () => false;
1038
+ this.router.onSameUrlNavigation = 'reload';
1039
+ this.router.navigateByUrl(url);
1040
+ }
1041
+ }
1042
+ }
1043
+ resetOrderData() {
1044
+ this.OrderslistService.setOrderRef(null);
1045
+ this.OrderslistService.setorderCCDEvent(null);
1046
+ this.OrderslistService.setorderCreated(null);
1047
+ this.OrderslistService.setorderDetail(null);
1048
+ this.OrderslistService.setorderParty(null);
1049
+ this.OrderslistService.setorderTotalPayments(null);
1050
+ this.OrderslistService.setorderRemissionTotal(null);
1051
+ this.OrderslistService.setorderFeesTotal(null);
1052
+ }
1053
+ changeRefundAmount() {
1054
+ this.isFromCheckAnsPage = true;
1055
+ this.viewCompStatus = 'issuerefund';
1056
+ this.viewStatus = '';
1057
+ }
1058
+ getFormattedCurrency(currency) {
1059
+ if (currency.toString().includes(".")) {
1060
+ return currency;
1061
+ }
1062
+ return currency.toString().concat(".00");
1063
+ }
1064
+ showNotificationPreview() {
1065
+ this.notificationPreview = true;
1066
+ }
1067
+ hideNotificationPreview() {
1068
+ this.notificationPreview = false;
1069
+ }
1070
+ getTemplateInstructionType(paymentReference, payment) {
1071
+ if (payment == undefined || payment == null || payment.reference != paymentReference) {
1072
+ this.paymentViewService.getPaymentDetails(paymentReference).subscribe(payment => {
1073
+ this.paymentObj = payment;
1074
+ this.paymentObj.reference = paymentReference;
1075
+ this.templateInstructionType = this.notificationService.getNotificationInstructionType(this.paymentObj.channel, this.paymentObj.method);
1076
+ }, (error) => {
1077
+ this.templateInstructionType = 'Template';
1078
+ });
1079
+ }
1080
+ else {
1081
+ this.templateInstructionType = this.notificationService.getNotificationInstructionType(payment.channel, payment.method);
1082
+ }
1083
+ }
1084
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddRemissionComponent, deps: [{ token: i1.FormBuilder }, { token: i2.Router }, { token: i3.PaymentViewService }, { token: i4.NotificationService }, { token: 'PAYMENT_LIB' }, { token: i5.RefundsService }, { token: i0.ChangeDetectorRef }, { token: i6.OrderslistService }], target: i0.ɵɵFactoryTarget.Component });
1085
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddRemissionComponent, isStandalone: true, selector: "ccpay-add-remission", inputs: { fee: "fee", fees: "fees", payment: "payment", remission: "remission", ccdCaseNumber: "ccdCaseNumber", caseType: "caseType", viewCompStatus: "viewCompStatus", paymentGroupRef: "paymentGroupRef", isTurnOff: "isTurnOff", isRefundRemission: "isRefundRemission", isStrategicFixEnable: "isStrategicFixEnable", paidAmount: "paidAmount", isFromRefundListPage: "isFromRefundListPage", isFromPaymentDetailPage: "isFromPaymentDetailPage", isFromServiceRequestPage: "isFromServiceRequestPage", isFullyRefund: "isFullyRefund", feeamount: "feeamount", refundPaymentReference: "refundPaymentReference", isFromRefundStatusPage: "isFromRefundStatusPage", changeRefundReason: "changeRefundReason", isServiceRequest: "isServiceRequest", LOGGEDINUSERROLES: "LOGGEDINUSERROLES", orderDetail: "orderDetail", orderRef: "orderRef", orderStatus: "orderStatus", orderParty: "orderParty", orderCreated: "orderCreated", orderCCDEvent: "orderCCDEvent", takePayment: ["takepayment", "takePayment"], orderFeesTotal: "orderFeesTotal", orderTotalPayments: "orderTotalPayments", orderRemissionTotal: "orderRemissionTotal" }, outputs: { cancelRemission: "cancelRemission", refundListReason: "refundListReason", refundListAmount: "refundListAmount", refundFees: "refundFees" }, providers: [{ provide: 'ADD_REMISSION', useExisting: AddRemissionComponent }], ngImport: i0, template: "<div class=\"add-remission pagesize\">\n <div *ngIf=\"errorMessage\">\n <div class=\"error-summary\" role=\"group\" aria-labelledby=\"failure-error-summary-heading\" tabindex=\"-1\">\n <h2 class=\"heading-medium error-summary-heading\" id=\"failure-error-summary-heading\">\n Error in processing the request\n </h2>\n <div class=\"govuk-error-summary__body\">\n {{ errorMessage }}\n </div>\n </div>\n </div>\n <div *ngIf=\"errorMsg.length > 0\">\n <div class=\"error-summary\" role=\"group\" aria-labelledby=\"failure-error-summary-heading\" tabindex=\"-1\">\n <h2 class=\"heading-medium error-summary-heading\" id=\"failure-error-summary-heading\">\n Error in processing the request\n </h2>\n <div *ngFor=\"let err of errorMsg; let i = index\" class=\"govuk-error-summary__body\">\n \n <li>{{err}}</li>\n </div>\n </div>\n </div>\n\n<ng-container *ngIf=\"viewStatus === 'main' && !isRefundRemission \">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ADDREMISSION'>\n <h1 class=\"heading-large\">Add remission </h1>\n <form novalidate>\n <div class=\"govuk-form-group\">\n <form [formGroup]=\"remissionForm\" novalidate>\n <div class=\"govuk-form-group\">\n <label class=\"govuk-label govuk-label--s\" for=\"remission-code\">\n Add remission to {{ fee?.code }}: {{ fee?.description }}\n <span class=\"form-hint\">Enter remission for reference. For example: HWF-A1B-23C OR PA21-123456</span>\n </label>\n <input [ngClass]=\"{'inline-error-class': isRemissionCodeEmpty || remissionCodeHasError}\" class=\"govuk-input govuk-input--width-20 govuk-!-margin-right-1\" id=\"remissionCode\" aria-label=\"remissionCode\" name=\"remissionCode\" type=\"text\" formControlName=\"remissionCode\">\n <p class=\"inline-error-message\" *ngIf=\"isRemissionCodeEmpty || remissionCodeHasError\">\n <span *ngIf=\"isRemissionCodeEmpty\">Enter a remission code</span>\n <span *ngIf=\"remissionCodeHasError\">Enter a vaild remission code</span>\n </p>\n </div>\n <div class=\"govuk-form-group\">\n <label class=\"govuk-label govuk-label--s\" for=\"amount\">\n How much does the applicant need to pay?\n </label>\n\n <div id=\"amount-currency\" class=\"govuk-visually-hidden\">in pounds</div>\n <div class=\"hmcts-currency-input\">\n <div class=\"hmcts-currency-input__symbol\" aria-hidden=\"true\">\u00A3</div>\n <input class=\"govuk-input govuk-input--width-10\" [ngClass]=\"{'inline-error-class': isAmountEmpty || amountHasError || isRemissionLessThanFeeError}\" id=\"amount\" aria-label=\"amount\" name=\"amount\" type=\"text\" aria-describedby=\"amount-currency\" formControlName=\"amount\">\n <p class=\"inline-error-message\" *ngIf=\"isAmountEmpty || amountHasError || isRemissionLessThanFeeError\">\n <span *ngIf=\"isAmountEmpty\">Enter a amount</span>\n <span *ngIf=\"amountHasError\">Enter a vaild amount</span>\n <span *ngIf=\"isRemissionLessThanFeeError\">The remission amount must be less than the total fee</span>\n </p>\n </div>\n </div>\n </form>\n <button class=\"button\" type=\"submit\" (click)=\"addRemission()\">\n Submit\n </button>\n </div>\n </form>\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'confirmation'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ADDREMISSIONCONFIRMATION'> \n <div class=\"govuk-warning-text\">\n <span class=\"govuk-warning-text__icon\" aria-hidden=\"true\">!</span>\n <strong class=\"govuk-warning-text__text\">\n <span class=\"govuk-warning-text__assistive\">Warning</span>\n Are you sure you want to add remission to this fee?\n </strong>\n </div>\n <table class=\"govuk-table\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Remission code:</td>\n <td class=\"govuk-table__cell\">{{ remissionForm.controls.remissionCode.value }}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee code:</td>\n <td class=\"govuk-table__cell\">{{ fee.code }}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee description:</td>\n <td class=\"govuk-table__cell\">{{ fee.description }}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Amount the applicant must pay:</td>\n <td class=\"govuk-table__cell\">{{ remissionForm.controls.amount.value | currency:'GBP':'symbol-narrow':'1.2-2' }}</td>\n </tr>\n </table>\n\n <button type=\"submit\" class=\"button govuk-button--secondary\" (click)=\"cancelRemission.emit()\">\n Cancel\n </button>\n <button type=\"submit\"\n [disabled]=\"isConfirmationBtnDisabled\"\n [ngClass]='isConfirmationBtnDisabled ? \"button button--disabled govuk-!-margin-right-1\" : \"button govuk-!-margin-right-1\"'\n (click)=\"confirmRemission()\">\n Confirm\n </button>\n\n</ng-container>\n\n<!-- Add retro remission changes-->\n\n<ng-container *ngIf=\"viewCompStatus === 'addremission'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='PROCESSADDRETROREMISSIONPAGE'> \n <h1 class=\"heading-large\">Process remission</h1>\n <h1 class=\"heading-medium\">#{{ccdCaseNumber | ccdHyphens}}</h1>\n <h1 class=\"heading-large\">Enter help with fees or remission reference</h1>\n <form novalidate>\n <div class=\"govuk-form-group\">\n <form [formGroup]=\"remissionForm\" novalidate>\n <div class=\"govuk-form-group\">\n <label class=\"govuk-label govuk-label--s\" for=\"remission-code\">\n <span class=\"form-hint\">For example: HWF-A1B-23C OR PA21-123456</span>\n </label>\n <p class=\"inline-error-message\" *ngIf=\"isRemissionCodeEmpty || remissionCodeHasError\">\n <span *ngIf=\"isRemissionCodeEmpty\">Enter a remission code</span>\n <span *ngIf=\"remissionCodeHasError\">Enter a vaild remission code</span>\n </p>\n <input [ngClass]=\"{'inline-error-class': isRemissionCodeEmpty || remissionCodeHasError}\" class=\"govuk-input govuk-input--width-20 govuk-!-margin-right-1\" id=\"remissionCode\" aria-label=\"remissionCode\" name=\"remissionCode\" type=\"text\" formControlName=\"remissionCode\">\n \n </div>\n \n </form>\n <div class=\"govuk-button-group\">\n <button (click)=\"gotoServiceRequestPage($event)\" class=\"govuk-button govuk-button--secondary\"> Previous</button>\n <button (click)=\"addRemissionCode()\" class=\"govuk-button\"> Continue</button>\n </div>\n <p><a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link pointer\" data-module=\"govuk-button\">Cancel</a></p>\n </div>\n </form>\n\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'processretroremissonpage'\" >\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='PROCESSRETROREMISSIONPAGE'> \n <h1 class=\"heading-large\">Process remission</h1>\n <h1 class=\"heading-medium\">#{{ccdCaseNumber | ccdHyphens }}</h1>\n <div class=\"govuk-form-group\">\n <form novalidate>\n <div class=\"govuk-form-group\">\n <form [formGroup]=\"remissionForm\" novalidate>\n <fieldset class=\"govuk-fieldset\">\n <legend class=\"govuk-fieldset__legend govuk-fieldset__legend--m\"> \n <h1 *ngIf=\"remessionPayment?.status === 'Success' || isFromRefundListPage\" class=\"heading-medium\">\n Enter the amount to be refunded\n </h1> \n <h1 *ngIf=\"remessionPayment?.status !== 'Success' && !isFromRefundListPage\" class=\"heading-medium\">\n Enter the remission amount\n </h1> \n <h1 *ngIf=\"remessionPayment?.status === 'undefined'\" class=\"heading-medium\">\n Enter the amount\n </h1> \n </legend>\n <div id=\"amount-currency\" class=\"govuk-visually-hidden\">in pounds</div>\n <p class=\"inline-error-message\" *ngIf=\"isAmountEmpty || amountHasError || isRemissionLessThanFeeError\">\n <span *ngIf=\"isAmountEmpty\">Enter a amount</span>\n <span *ngIf=\"amountHasError\">Enter a vaild amount</span>\n <span *ngIf=\"isRemissionLessThanFeeError\">You cannot add a remission that's more than the fee amount.</span>\n </p>\n <div class=\"hmcts-currency-input\">\n \n <div class=\"hmcts-currency-input__symbol\" aria-hidden=\"true\">\u00A3</div>\n <input class=\"govuk-input govuk-input--width-10\" [ngClass]=\"{'inline-error-class': isAmountEmpty || amountHasError || isRemissionLessThanFeeError}\" id=\"amount\" aria-label=\"amount\" name=\"amount\" type=\"number\" aria-describedby=\"amount-currency\" formControlName=\"amount\">\n \n \n </div>\n </fieldset>\n </form>\n \n <div class=\"govuk-button-group\">\n <button (click)=\"gotoAddRetroRemissionCodePage()\" class=\"govuk-button govuk-button--secondary\"> Previous</button>\n <button (click)=\"gotoCheckRetroRemissionPage(payment)\" class=\"govuk-button\"> Continue</button>\n \n </div>\n <p>\n <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">Cancel</a>\n </p>\n </div>\n \n </form>\n </div>\n</ng-container>\n<ng-container *ngIf=\"viewStatus === 'checkretroremissionpage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='CHECKRETROREMISSIONCONFIRMATION'> \n <div class=\"govuk-warning-text\">\n <h1 class=\"heading-large\"> Check your answers</h1>\n </div>\n <table class=\"govuk-table\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment reference</td>\n <td class=\"govuk-table__cell\">{{remessionPayment ? remessionPayment.reference: ' '}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment amount</td>\n <td class=\"govuk-table__cell\">\u00A3{{ remessionPayment ? getFormattedCurrency(remessionPayment.amount): ' ' | currency :'GBP':'symbol':'1.2-2'}} </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment status</td>\n <td class=\"govuk-table__cell\">{{remessionPayment ? remessionPayment.status: ''}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee</td>\n <td class=\"govuk-table__cell\">{{ fee.code }} - {{ fee.description }} </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee amount</td>\n <td class=\"govuk-table__cell\">{{ fee.calculated_amount/fee.volume| currency:'GBP':'symbol-narrow':'1.2-2' }}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Help with fees or remission reference</td>\n <td class=\"govuk-table__cell\">{{ remissionForm.controls.remissionCode.value?.trim() }}\n <a (click)=\"gotoProcessRetroRemissionPage()\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td *ngIf=\"remessionPayment.status === 'Success'\" class=\"govuk-table__cell govuk-!-font-weight-bold\">Refund amount</td>\n <td *ngIf=\"remessionPayment.status !== 'Success'\" class=\"govuk-table__cell govuk-!-font-weight-bold\">Remission amount</td>\n <td class=\"govuk-table__cell\">{{remissionForm.controls.amount.value | currency:'GBP':'symbol-narrow':'1.2-2' }}\n <a (click)=\"gotoAmountRetroRemission()\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n </table>\n\n <button type=\"submit\" class=\"button govuk-button--secondary\" (click)=\"gotoAmountRetroRemission()\">Previous</button>\n <button type=\"submit\" [disabled]=\"isConfirmationBtnDisabled\" [ngClass]='isConfirmationBtnDisabled ? \"button button--disabled govuk-!-margin-right-1\" : \"button govuk-!-margin-right-1\"' (click)=\"confirmRetroRemission()\"> Add remission </button>\n <p> <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\"> Cancel</a> </p>\n\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'retroremissionconfirmationpage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='RETROREMISSIONCONFIRMATIONPAGE'> \n <div class=\"govuk-grid-row\">\n <div >\n <div class=\"govuk-panel govuk-panel-border--confirmation\">\n <h1 class=\"govuk-panel__title\">\n Remission added\n </h1>\n <div *ngIf=\"remessionPayment.status === 'Success'\" class=\"govuk-panel__body\">\n <p class=\"govuk-body\"><strong>The amount to be refunded should be {{remissionForm.controls.amount.value | currency:'GBP':'symbol-narrow':'1.2-2' }}</strong></p>\n \n </div>\n </div>\n <div *ngIf=\"remessionPayment.status === 'Success'\" >\n <button type=\"submit\" [disabled]=\"!isRemissionApplied\" [ngClass]='isConfirmationBtnDisabled ? \"button button--disabled govuk-!-margin-right-1\" : \"button govuk-!-margin-right-1\"' (click)=\"gotoProcessRetroRemission()\">Continue </button>\n </div>\n <p class=\"govuk-body\">\n <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link pointer\" data-module=\"govuk-button\">\n Return to case\n </a>\n </p>\n </div>\n </div>\n</ng-container>\n\n\n<ng-container *ngIf=\"viewStatus === 'remissionAddressPage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ADDRESSDETAILSRETROREMISSIONPAGE'> \n <h1 class=\"govuk-heading-l\">Process refund</h1>\n <h2 class=\"govuk-heading-m govuk-font19px\">Case reference: {{ccdCaseNumber | ccdHyphens }}</h2>\n <ccpay-contact-details\n [addressObj] = notification\n (assignContactDetails)=\"getContactDetails($event, 'checkaddRefundpage')\"\n (redirectToIssueRefund)=\"gotoRemissionSuccess($event)\" ></ccpay-contact-details>\n <p>\n <a (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n Cancel\n </a>\n </p>\n\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'checkaddRefundpage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='CHECKRETROREMISSIONCONFIRMATION'> \n <div class=\"govuk-warning-text\">\n <h1 class=\"heading-large\"> Check your answers</h1>\n </div>\n <table class=\"govuk-table\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment reference</td>\n <td class=\"govuk-table__cell\">{{remessionPayment ? remessionPayment.reference: ' '}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment amount</td>\n <td class=\"govuk-table__cell\">\u00A3{{ remessionPayment ? getFormattedCurrency(remessionPayment.amount): ' ' | currency :'GBP':'symbol':'1.2-2'}} </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment status</td>\n <td class=\"govuk-table__cell\">{{remessionPayment ? remessionPayment.status: ''}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee</td>\n <td class=\"govuk-table__cell\">{{ fee.code }} - {{ fee.description }} ({{ fee.calculated_amount/fee.volume| currency:'GBP':'symbol-narrow':'1.2-2' }}) </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Help with fees or remission reference</td>\n <td class=\"govuk-table__cell\">{{ remissionForm.controls.remissionCode.value?.trim() }}\n </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td *ngIf=\"remessionPayment.status === 'Success'\" class=\"govuk-table__cell govuk-!-font-weight-bold\">Refund amount</td>\n <td *ngIf=\"remessionPayment.status !== 'Success'\" class=\"govuk-table__cell govuk-!-font-weight-bold\">Remission amount</td>\n <td class=\"govuk-table__cell\">{{remissionForm.controls.amount.value | currency:'GBP':'symbol-narrow':'1.2-2' }}\n </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Send to</td>\n <td class=\"govuk-table__cell\">{{orderParty}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Send via</td>\n <td class=\"govuk-table__cell whitespace-inherit\">\n <div *ngIf=\"contactDetailsObj?.notification_type === 'EMAIL'\" class=\"contactDetails-width\">\n <strong>Email</strong>\n <br/>\n {{contactDetailsObj?.email?.trim()}}\n </div>\n <div *ngIf=\"contactDetailsObj?.notification_type === 'LETTER'\" class=\"contactDetails-width\">\n <strong>Post</strong>\n <br/>\n {{contactDetailsObj?.address_line?.trim()}}&nbsp;{{contactDetailsObj?.city?.trim()}}&nbsp;{{contactDetailsObj?.county?.trim()}}&nbsp;{{contactDetailsObj?.country?.trim()}}&nbsp;{{contactDetailsObj?.postal_code?.trim()}}\n </div>\n <a (click)=\"gotoProcessRetroRemission(contactDetailsObj)\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Notification</td>\n <td class=\"govuk-table__cell\">{{templateInstructionType}}\n <a *ngIf=\"!notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"showNotificationPreview()\">\n Preview\n </a>\n <a *ngIf=\"notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"hideNotificationPreview()\">\n Hide Preview\n </a>\n </td>\n </tr>\n </table>\n\n <app-notification-preview *ngIf=\"notificationPreview\" \n [payment]=\"remessionPayment\" \n [contactDetails]=\"contactDetailsObj\"\n [refundReason]=\"'RR036'\"\n [refundAmount]=\"remissionForm.controls.amount.value\"></app-notification-preview>\n\n <button type=\"submit\" class=\"button govuk-button--secondary\" (click)=\"gotoProcessRetroRemission(contactDetailsObj)\">Previous</button>\n <button type=\"submit\" [disabled]=\"isConfirmationBtnDisabled\" [ngClass]='isConfirmationBtnDisabled ? \"button button--disabled govuk-!-margin-right-1\" : \"button govuk-!-margin-right-1\"' (click)=\"processRefund()\"> Submit refund </button>\n <p> <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\"> Cancel</a> </p>\n\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'refundconfirmationpage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='RETROREMISSIONREFUNDCONFIRMATIONPAGE'> \n <div class=\"govuk-grid-row\">\n <div >\n <div class=\"govuk-panel govuk-panel--confirmation\">\n <h1 class=\"govuk-panel__title\">\n Refund submitted\n </h1>\n\n <div class=\"govuk-panel__body\">\n <p class=\"govuk-body white\"><strong>Refund reference: {{refundReference}}</strong></p>\n </div>\n\n </div>\n <div *ngIf=\"isPaymentSuccess\">\n <h2 class=\"govuk-heading-l\">What happens next</h2>\n <p class=\"govuk-body\">\n A refund request for {{refundAmount | currency:'GBP':'symbol-narrow':'1.2-2' }} has been created and will be passed to a team leader to approve.\n </p>\n </div>\n <p class=\"govuk-body\">\n <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link pointer\" data-module=\"govuk-button\">\n Return to case\n </a>\n </p>\n </div>\n </div>\n \n</ng-container>\n\n<!-- Issue Refund Section -->\n<ng-container *ngIf=\"viewCompStatus === 'issuerefund' && isRefundRemission\">\n <div class=\"govuk-form-group\">\n <form [formGroup]=\"remissionForm\" novalidate>\n <h1 class=\"heading-large\">Process refund</h1>\n <h2 class=\"heading-medium\">Case reference:{{ccdCaseNumber | ccdHyphens }}</h2>\n <span id=\"how-contacted-conditional-hint\" class=\"form-hint govuk-font19px\">\n Payment reference: {{paymentReference}}\n </span>\n <h3 class=\"heading-small\">Select fees to be refunded</h3>\n <!--TABLE-->\n <div>\n <table class=\"govuk-table\">\n <thead class=\"govuk-table__head\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__header col-1\" scope=\"col\">Select</td>\n <td class=\"govuk-table__header col-18\" scope=\"col\">Fee description</td>\n <td class=\"govuk-table__header col-6\" scope=\"col\">Fee amount</td>\n <td class=\"govuk-table__header col-6\" scope=\"col\">Total paid</td>\n <td class=\"govuk-table__header col-6\" scope=\"col\">Quantity</td>\n <td class=\"govuk-table__header col-8\" scope=\"col\">Amount to refund</td>\n <td class=\"govuk-table__header\" scope=\"col\"></td>\n </tr>\n </thead>\n <tbody class=\"govuk-table__body\" *ngIf=\"!isFullyRefund\">\n <tr class=\"govuk-table__row\" formArrayName=\"feesList\" *ngFor=\"let fee of feesList?.controls; let i = index\">\n <td class=\"govuk-table__cell\">\n <div [formGroupName]=\"i\" class=\"govuk-checkboxes govuk-checkboxes--large\" data-module=\"govuk-checkboxes\">\n <div class=\"govuk-checkboxes__item\">\n\n <input\n class=\"govuk-checkboxes__input\" \n (click)=\"check_en(i,fee.controls['id'].value,fee.controls['apportion_amount'].value,fee.controls['volume'].value)\" \n id=\"{{fee.controls['id'].value}}\" \n name=\"organisation\" \n type=\"checkbox\" \n value=\"{{fee.controls['id'].value}}\" \n formControlName=\"selected\" >\n <label class=\"govuk-label govuk-checkboxes__label\" for=\"{{fee.controls['id'].value}}\">\n <span style=\"display:none\">Select</span>\n </label>\n </div>\n </div>\n </td>\n <td class=\"govuk-table__cell whitespace-inherit\">{{fee.controls['description'].value}} </td>\n <td class=\"govuk-table__cell whitespace-inherit left\" >\n <div type=\"hidden\" style=\"display:none;background-color:white;\" id=\"feeVOl_{{fee.controls['id'].value}}\">{{ fee.controls['calculated_amount'].value / fee.controls['volume'].value }}</div>\n {{ fee.controls['calculated_amount'].value / fee.controls['volume'].value | currency:'GBP':'symbol-narrow':'1.2-2' }}\n </td>\n <td class=\"govuk-table__cell whitespace-inherit left\" >{{ fee.controls['apportion_amount'].value | currency:'GBP':'symbol-narrow':'1.2-2'}} </td>\n <td class=\"govuk-table__cell whitespace-inherit left\" *ngIf=\"fee.controls['volume'].value >1\">\n <div [formGroupName]=\"i\">\n <input disabled=\"disabled\" class=\"govuk-input govuk-input--width-4 center\" id=\"feeVolumeUpdated_{{fee.controls['id'].value}}\" (keyup)=\"calAmtToRefund($event.target.value,fee.controls['calculated_amount'].value,fee.controls['volume'].value,i)\" value=\"{{fee.controls['updated_volume'].value}}\" name=\"feeVolumeUpdated_{{fee.controls['id'].value}}\" formControlName=\"updated_volume\" type=\"text\" >\n </div>\n </td>\n <td class=\"govuk-table__cell whitespace-inherit left\" *ngIf=\"fee.controls['volume'].value ===1\">\n <input disabled=\"disabled\" class=\"govuk-input govuk-input--width-4 center\" id=\"VolumeUpdated_{{fee.controls['id'].value}}\" name=\"VolumeUpdated_{{fee.controls['id'].value}}\" type=\"text\" value=\"{{fee.controls['volume'].value}}\">\n </td>\n <td class=\"govuk-table__cell whitespace-inherit center\" scope=\"row\">\n \n <div [formGroupName]=\"i\" class=\"hmcts-currency-input\">\n \n <div class=\"hmcts-currency-input__symbol\" aria-hidden=\"true\">\u00A3</div>\n <input disabled=\"disabled\" class=\"govuk-input govuk-input--width-10\" id=\"feeAmount_{{fee.controls['id'].value}}\" name=\"feeAmount_{{fee.controls['id'].value}}\" type=\"text\" aria-describedby=\"amount-currency \" pattern=\"[0-9]*\" formControlName=\"refund_amount\">\n <input id=\"feeVolume_{{fee.controls['id'].value}}\" name=\"feeVolume_{{fee.controls['id'].value}}\" value= \"{{fee.controls['volume'].value}}\" type=\"hidden\" formControlName=\"volume\">\n <input id=\"feeApportionAmount_{{fee.controls['id'].value}}\" name=\"feeApportionAmount_{{fee.controls['id'].value}}\" value= \"{{fee.controls['apportion_amount'].value}}\" type=\"hidden\" formControlName=\"apportion_amount\">\n <input id=\"calculatedAmount_{{fee.controls['id'].value}}\" name=\"calculatedAmount_{{fee.controls['id'].value}}\" value= \"{{fee.controls['calculated_amount'].value}}\" type=\"hidden\" formControlName=\"calculated_amount\">\n </div> \n \n </td>\n </tr>\n </tbody>\n <tbody class=\"govuk-table__body\" *ngIf=\"isFullyRefund\">\n <tr class=\"govuk-table__row\" *ngFor=\"let fee of fees; let i = index\">\n <td class=\"govuk-table__cell\">\n <div class=\"govuk-checkboxes govuk-checkboxes--large\" data-module=\"govuk-checkboxes\">\n <div class=\"govuk-checkboxes__item\">\n <input \n class=\"govuk-checkboxes__input\" \n \n id=\"{{fee.id}}\" \n name=\"organisation\" \n type=\"checkbox\" \n value=\"{{fee.id}}\"\n disabled=\"disabled\"\n [checked]=\"true\" >\n <label class=\"govuk-label govuk-checkboxes__label\" for=\"{{fee.id}}\">\n <span style=\"display:none\">Select</span>\n </label>\n </div>\n </div>\n </td>\n <td class=\"govuk-table__cell whitespace-inherit\">{{fee.description}} </td>\n <td class=\"govuk-table__cell whitespace-inherit left\" >\n <div type=\"hidden\" style=\"display:none;background-color:white;\" id=\"feeVOl_{{fee.id}}\">{{ fee.calculated_amount / fee.volume }}</div>\n {{ fee.calculated_amount / fee.volume| currency:'GBP':'symbol-narrow':'1.2-2' }}\n </td>\n <td class=\"govuk-table__cell whitespace-inherit left\" >{{ payment.amount | currency:'GBP':'symbol-narrow':'1.2-2'}} </td>\n <td class=\"govuk-table__cell whitespace-inherit left\">\n <div >\n <input disabled=\"disabled\" class=\"govuk-input govuk-input--width-4 center\" id=\"feeVolumeUpdated_{{fee.id}}\" value=\"{{fee.volume}}\" name=\"feeVolumeUpdated_{{fee.id}}\" type=\"text\" >\n </div>\n </td>\n \n <td class=\"govuk-table__cell whitespace-inherit center\" scope=\"row\">\n \n <div class=\"hmcts-currency-input\">\n \n <div class=\"hmcts-currency-input__symbol\" aria-hidden=\"true\">\u00A3</div>\n <input disabled=\"disabled\" class=\"govuk-input govuk-input--width-10\" id=\"feeAmount_{{fee.id}}\" name=\"feeAmount_{{fee.id}}\" type=\"text\" aria-describedby=\"amount-currency \" value=\"{{ payment.amount | currency:'GBP':'symbol-narrow':'1.2-2'}}\" pattern=\"[0-9]*\" >\n </div> \n \n </td>\n </tr>\n </tbody>\n <tbody class=\"govuk-table__body\" *ngIf=\"fees?.length === 0\">\n <td class=\"govuk-table__cell\" colspan=\"6\">No fees recorded</td>\n </tbody>\n </table>\n </div>\n <div class=\"govuk-button-group\">\n\n \n <a (click)=\"gotoServiceRequestPage($event)\" *ngIf=\"!isFullyRefund\" draggable=\"false\" class=\"govuk-button govuk-button--secondary\" data-module=\"govuk-button\">\n Previous\n </a>\n <a (click)=\"goToPaymentViewComponent()\" *ngIf=\"isFullyRefund\" draggable=\"false\" class=\"govuk-button govuk-button--secondary\" data-module=\"govuk-button\">\n Previous\n </a>\n \n <button [disabled] = \"noneSelected()\" (click)=\"gotoIssuePage(isFullyRefund)\" class=\"govuk-button\">\n Continue\n </button>\n \n </div>\n <p>\n <a (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">Cancel</a>\n </p>\n </form>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"viewCompStatus === 'issuerefundpage1' && isRefundRemission\">\n\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ISSUEREFUNDPAGE'> \n <h1 class=\"heading-large\">Process refund</h1>\n <h1 class=\"heading-medium\">Case reference: {{ccdCaseNumber | ccdHyphens }}</h1>\n <span id=\"how-contacted-conditional-hint govuk-font19px\" *ngIf=\"payment\" class=\"form-hint\">\n Payment reference: {{paymentReference}}\n </span>\n <span id=\"how-contacted-conditional-hint govuk-font19px\" *ngIf=\"refundPaymentReference\" class=\"form-hint\">\n Payment reference: {{refundPaymentReference}}\n </span>\n <h1 class=\"heading-large\">Why are you making this refund?\n </h1>\n \n\n <div class=\"govuk-form-group\">\n <form novalidate>\n <div class=\"govuk-form-group\">\n <form [formGroup]=\"remissionForm\" novalidate>\n <fieldset class=\"govuk-fieldset\" aria-describedby=\"how-contacted-conditional-hint\">\n \n <div\n [ngClass]=\"refundHasError ? 'govuk-radios govuk-radios--conditional form-group-error' : 'govuk-radios govuk-radios--conditional'\"\n data-module=\"govuk-radios\" >\n <p class=\"inline-error-message\" *ngIf=\"refundHasError\">\n <span *ngIf=\"refundHasError\">Select a reason why you\u2019re making this refund</span>\n </p>\n\n \n\n <div class = \"container-fluid\">\n <div class=\"row\">\n <div class=\"govuk-radios__item col-md-4\" *ngFor=\"let refund of commonRefundReasons; let i = index;\">\n <!-- <div *ngIf = \"{{refund.name}} !== 'Retrospective remission'\"> -->\n <input class=\"govuk-radios__input\" id=\"{{refund.name}}\" name=\"refundReason\" type=\"radio\"\n formControlName=\"refundReason\" value={{refund.code}}\n (change)=\"selectRadioButton(refund.code, refund.name)\">\n <label class=\"govuk-label--s govuk-radios__label govuk-font__custom\" for=\"how-contacted-conditional\">\n {{refund.name}}\n </label>\n\n <div class=\"govuk-radios__conditional\" *ngIf=\"isRefundReasonsSelected && showReasonText && selectedRefundReason === refund.name \" >\n <label class=\"govuk-label govuk-label--m\" for=\"{{refund.name}}\">\n Enter reason\n </label>\n <div [ngClass]=\"{'form-group-error': isReasonEmpty}\">\n <p class=\"inline-error-message\" *ngIf=\"isReasonEmpty\">\n <span *ngIf=\"isReasonEmpty\">Enter a reason why you\u2019re making this refund</span>\n </p>\n \n <input class=\"govuk-input govuk-input--width-10\" [ngClass]=\"{'inline-error-class': isReasonEmpty}\" id=\"reason\" aria-label=\"reason\" name=\"reason\" type=\"text\" aria-describedby=\"reason\" maxlength=\"30\" formControlName=\"reason\">\n </div>\n </div>\n <!-- </div> -->\n </div>\n </div>\n </div>\n <br/>\n <div>\n <select formControlName=\"refundDDReason\" class=\"govuk-select\" id=\"sort\" (change)=\"selectchange($event)\">\n <option selected='selected' [defaultSelected]=true [value]=\"default\" >{{default}}</option> \n <!-- <option value=\"\" selected='selected'>Select a different reason</option> -->\n <option *ngFor=\"let refund of refundReasons;\" id=\"{{refund.name}}\" value=\"{{refund.code}}\">{{refund.name}}</option>\n </select>\n \n </div>\n <br/>\n <div class=\"govuk-radios__conditional\" *ngIf=\"showReasonText && !isRefundReasonsSelected\" >\n <div [ngClass]=\"{'form-group-error': isReasonEmpty}\">\n <label class=\"govuk-label govuk-label--m\" for=\"amount\">\n Enter reason\n </label>\n <p class=\"inline-error-message\" *ngIf=\"isReasonEmpty\">\n <span *ngIf=\"isReasonEmpty\">Enter a reason why you\u2019re making this refund</span>\n </p>\n <input class=\"govuk-input govuk-input--width-10\" [ngClass]=\"{'inline-error-class': isReasonEmpty}\" id=\"reason\" aria-label=\"reason\" name=\"reason\" type=\"text\" aria-describedby=\"reason\" maxlength=\"{{reasonLength}}\" formControlName=\"reason\">\n </div>\n </div>\n\n \n </div>\n </fieldset>\n </form>\n </div>\n </form>\n </div>\n <div class=\"govuk-button-group\">\n <button (click)=\"gotoPartialFeeRefundScreen()\" class=\"govuk-button govuk-button--secondary\"> Previous</button>\n <button (click)=\"gotoIssueRefundConfirmation(payment)\" class=\"govuk-button\"> Continue</button>\n </div>\n <p>\n <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n Cancel\n </a>\n </p>\n \n</ng-container>\n<ng-container *ngIf=\"viewStatus === 'contactDetailsPage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='CAPTUREADDRESSDETAILSPAGE'> \n <h1 class=\"govuk-heading-l\">Process refund</h1>\n <h2 class=\"govuk-heading-m govuk-font19px\">Case reference: {{ccdCaseNumber | ccdHyphens }}</h2>\n <span id=\"how-contacted-conditional-hint\" class=\"govuk-hint govuk-font19px\">\n Payment reference: {{paymentReference}}\n </span>\n <ccpay-contact-details\n [addressObj] = notification\n (assignContactDetails)=\"getContactDetails($event, 'checkissuerefundpage')\"\n (redirectToIssueRefund)=\"gotoRefundReasonPage()\" ></ccpay-contact-details>\n <p>\n <a (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n Cancel\n </a>\n </p>\n\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'checkissuerefundpage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='CHECKISSUEREFUNDPAGE'> \n <div class=\"govuk-warning-text\">\n \n <h1 class=\"heading-large\"> Check your answers</h1>\n </div>\n <table class=\"govuk-table\">\n \n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment reference</td>\n <td class=\"govuk-table__cell\">{{paymentReference}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment amount</td>\n <td class=\"govuk-table__cell\">{{payment.amount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr>\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Reason for refund</td>\n <td class=\"govuk-table__cell\">{{ displayRefundReason?.trim() }} \n <a (click)=\"changeIssueRefundReason()\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n <tr class=\"govuk-table__row\" *ngIf=\"!isFullyRefund\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Refund amount</td>\n <td class=\"govuk-table__cell\">{{totalRefundAmount | currency:'GBP':'symbol-narrow':'1.2-2'}}\n <a (click)=\"changeRefundAmount()\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n <tr class=\"govuk-table__row\" *ngIf=\"isFullyRefund\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Refund amount</td>\n <td class=\"govuk-table__cell\">{{payment.amount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Send to</td>\n <td class=\"govuk-table__cell\">{{orderParty}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Send via</td>\n <td class=\"govuk-table__cell whitespace-inherit\">\n <div *ngIf=\"contactDetailsObj?.notification_type === 'EMAIL'\" class=\"contactDetails-width\">\n <strong>Email</strong>\n <br/>\n {{contactDetailsObj?.email?.trim()}}\n </div>\n <div *ngIf=\"contactDetailsObj?.notification_type === 'LETTER'\" class=\"contactDetails-width\">\n <strong>Post</strong>\n <br/>\n {{contactDetailsObj?.address_line?.trim()}}&nbsp;{{contactDetailsObj?.city?.trim()}}&nbsp;{{contactDetailsObj?.county?.trim()}}&nbsp;{{contactDetailsObj?.country?.trim()}}&nbsp;{{contactDetailsObj?.postal_code?.trim()}}\n </div>\n <a (click)=\"gotoContactDetailsPage(contactDetailsObj)\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Notification</td>\n <td class=\"govuk-table__cell\">{{templateInstructionType}}\n <a *ngIf=\"!notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"showNotificationPreview()\">\n Preview\n </a>\n <a *ngIf=\"notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"hideNotificationPreview()\">\n Hide Preview\n </a>\n </td>\n </tr>\n </table>\n\n <app-notification-preview *ngIf=\"notificationPreview\" \n [payment]=\"payment\" \n [contactDetails]=\"contactDetailsObj\"\n [refundReason]=\"selectedRefundReasonCode\"\n [refundAmount]=\"isFullyRefund ? payment.amount : totalRefundAmount\"></app-notification-preview>\n\n\n <div class=\"govuk-button-group\">\n <button type=\"submit\" class=\"button govuk-button--secondary\" (click)=\"gotoContactDetailsPage(contactDetailsObj)\"> Previous </button>\n <button type=\"submit\"\n [disabled]=\"isConfirmationBtnDisabled\"\n [ngClass]='isConfirmationBtnDisabled ? \"button button--disabled govuk-!-margin-right-1\" : \"button govuk-!-margin-right-1\"'\n (click)=\"confirmIssueRefund(isFullyRefund)\">\n Submit refund\n </button>\n </div>\n <p>\n <a (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n Cancel\n </a>\n </p>\n\n</ng-container>\n\n<!--Retro Refund-->\n<ng-container *ngIf=\"viewCompStatus === 'addrefundforremission'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ADDRESSDETAILSRETROREMISSIONPAGE'> \n <h1 class=\"govuk-heading-l\">Process refund</h1>\n <h2 class=\"govuk-heading-m govuk-font19px\">Case reference: {{ccdCaseNumber | ccdHyphens }}</h2>\n <span id=\"how-contacted-conditional-hint\" class=\"govuk-hint govuk-font19px\">\n Payment reference: {{paymentReference}}\n </span>\n<ccpay-contact-details \n[addressObj] = notification\n(assignContactDetails)=\"getContactDetails($event, 'addrefundcheckandanswer')\"\n(redirectToIssueRefund)=\"gotoServiceRequestPage($event)\" ></ccpay-contact-details>\n<p>\n <a (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n Cancel\n </a>\n</p>\n</ng-container>\n<ng-container *ngIf=\"viewStatus === 'addrefundcheckandanswer'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ADDREFUNDFORREMISSION'> \n <div class=\"govuk-warning-text\">\n \n <h1 class=\"heading-large\"> Check your answers</h1>\n </div>\n <table class=\"govuk-table\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Reason for refund</td>\n <td class=\"govuk-table__cell\">Retrospective remission</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment reference</td>\n <td class=\"govuk-table__cell\">{{paymentReference}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Refund amount</td>\n <td class=\"govuk-table__cell\">{{remission.hwf_amount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee code</td>\n <td class=\"govuk-table__cell\">{{remission.fee_code}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee amount</td>\n <td class=\"govuk-table__cell\">{{feeamount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Send to</td>\n <td class=\"govuk-table__cell\">{{orderParty}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Send via</td>\n <td class=\"govuk-table__cell whitespace-inherit\">\n <div *ngIf=\"contactDetailsObj?.notification_type === 'EMAIL'\" class=\"contactDetails-width\">\n <strong>Email</strong>\n <br/>\n {{contactDetailsObj?.email?.trim()}}\n </div>\n <div *ngIf=\"contactDetailsObj?.notification_type === 'LETTER'\" class=\"contactDetails-width\">\n <strong>Post</strong>\n <br/>\n {{contactDetailsObj?.address_line?.trim()}}&nbsp;{{contactDetailsObj?.city?.trim()}}&nbsp;{{contactDetailsObj?.county?.trim()}}&nbsp;{{contactDetailsObj?.country?.trim()}}&nbsp;{{contactDetailsObj?.postal_code?.trim()}}\n </div>\n <a (click)=\"gotoAddressPage(contactDetailsObj)\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Notification</td>\n <td class=\"govuk-table__cell\">{{templateInstructionType}}\n <a *ngIf=\"!notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"showNotificationPreview()\">\n Preview\n </a>\n <a *ngIf=\"notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"hideNotificationPreview()\">\n Hide Preview\n </a>\n </td>\n </tr>\n </table>\n\n <app-notification-preview *ngIf=\"notificationPreview\" \n [contactDetails]=\"contactDetailsObj\"\n [paymentReference]=\"paymentReference\"\n [payment]=\"paymentObj\"\n [refundReason]=\"'RR036'\"\n [refundAmount]=\"remission.hwf_amount\"></app-notification-preview>\n\n <div class=\"govuk-button-group\">\n <button type=\"submit\" class=\"button govuk-button--secondary\" (click)=\"gotoAddressPage(contactDetailsObj)\">Previous</button>\n <button type=\"submit\"\n [disabled]=\"isConfirmationBtnDisabled\"\n [ngClass]='isConfirmationBtnDisabled ? \"button button--disabled govuk-!-margin-right-1\" : \"button govuk-!-margin-right-1\"'\n (click)=\"processRefund()\">\n Submit refund\n </button>\n </div>\n <p>\n <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n Cancel\n </a>\n </p>\n\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'retrorefundconfirmationpage'\">\n <div class=\"govuk-grid-row\">\n <div >\n <div class=\"govuk-panel govuk-panel--confirmation\">\n <h1 class=\"govuk-panel__title\">\n Refund submitted\n </h1>\n \n <div class=\"govuk-panel__body\">\n <p class=\"govuk-body white\"><strong>Refund reference: {{refundReference}}</strong></p>\n </div>\n \n </div>\n <div *ngIf=\"isPaymentSuccess\">\n <h2 class=\"govuk-heading-l\">What happens next</h2>\n <p class=\"govuk-body\">\n A refund request for {{ refundAmount| currency:'GBP':'symbol-narrow':'1.2-2'}} has been passed to a team leader to approve.\n </p>\n </div>\n <p class=\"govuk-body\">\n <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link pointer\" data-module=\"govuk-button\">\n Return to case\n </a>\n </p>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'order-full-view'\">\n <ccpay-service-request\n [viewStatus] = \"viewStatus\"\n [orderRef] = \"orderRef\"\n [isServiceRequest]=\"isServiceRequest\"\n [orderStatus] = \"orderStatus\"\n [orderCreated] = \"orderCreated\"\n [orderParty] = \"orderParty\"\n [orderCCDEvent] = \"orderCCDEvent\"\n [orderDetail] = \"orderDetail\"\n [LOGGEDINUSERROLES] = \"LOGGEDINUSERROLES\"\n [takePayment] = \"takePayment\"\n [ccdCaseNumber] = \"ccdCaseNumber\"\n [orderFeesTotal] = \"orderFeesTotal\"\n [orderTotalPayments] = \"orderTotalPayments\"\n [orderRemissionTotal] = \"orderRemissionTotal\">\n</ccpay-service-request>\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'payment-view'\">\n <ccpay-payment-view \n [LOGGEDINUSERROLES] = \"LOGGEDINUSERROLES\"\n [isTurnOff] = \"isTurnOff\" \n [isTakePayment] = \"takePayment\" \n [caseType] = \"caseType\"\n [isServiceRequest]=\"isServiceRequest\"\n [orderRef] = \"orderRef\"\n [orderStatus] = \"orderStatus\"\n [orderCreated] = \"orderCreated\"\n [orderParty] = \"orderParty\"\n [orderCCDEvent] = \"orderCCDEvent\"\n [orderDetail] = \"orderDetail\"\n [orderFeesTotal] = \"orderFeesTotal\"\n [orderTotalPayments] = \"orderTotalPayments\"\n [orderRemissionTotal] = \"orderRemissionTotal\"\n >\n</ccpay-payment-view>\n</ng-container>\n\n</div>", styles: [".add-remission .button{margin:20px 2px;padding:.5em;font-size:19px;font-weight:200}.add-remission td.govuk-table__cell{width:50%}.add-remission .govuk-button--secondary{background-color:#dee0e2;box-shadow:0 2px #858688;color:#0b0c0c;margin-right:.5em}.add-remission .govuk-warning-text__text,.add-remission .govuk-label--s,.add-remission .hmcts-currency-input__symbol{font-size:19px;font-weight:400}.add-remission .inline-error-class{outline:3px solid #a71414;outline-offset:0;border-color:#a71414}.add-remission .inline-error-message{color:#a71414;border-color:#a71414;font-weight:700;margin-top:10px;font-size:20px}.add-remission .govuk-button,.add-remission .govuk-link{margin-right:1em;font-size:19px;font-weight:200}.add-remission .govuk-button-group{padding-top:2em}.add-remission .heading-medium{margin-top:.875em}.add-remission .heading-large{margin-top:.25em}.add-remission .govuk-panel--confirmation{color:#fff;background:#00703C}.add-remission .govuk-panel__title{font-size:5rem}.add-remission .govuk-body-m,.add-remission .govuk-body{font-size:2.1875rem}.add-remission .govuk-radios__item{clear:initial!important;display:inline-block;width:45%!important}.add-remission .govuk-radios__conditional{padding-top:12px!important}.add-remission .right{float:right;cursor:pointer}.add-remission .radio{float:right}.govuk-input,.govuk-font19px{font-size:19px}.govuk-select{font-size:19px;font-weight:400}.govuk-input--width-10{max-width:50ex}.govuk-label--m{font-size:19px;font-weight:400}.govuk-error-summary__body{font-size:19px!important}.govuk-error-summary__title{font-size:24px!important}.white{color:#fff}.pagesize{margin:2em;width:97%}.pointer{cursor:pointer}.col-18{min-width:18em}.col-6{min-width:6em}.col-8{min-width:8em}.col-1{min-width:1em}.col-25{width:25%!important}.col-24{width:24%!important}.left{text-align:left}.center{text-align:center}.col-60{width:60%;text-align:left}.margin-top--size{margin-top:-30px}.contactDetails-width{width:70%}.right{cursor:pointer}.form-hint{font-size:19px!important}.govuk-panel-border--confirmation{color:#0b0c0c;border:5px solid #00703C}.whitespace-inherit{white-space:inherit!important}.govuk-link{cursor:pointer}\n"], dependencies: [{ kind: "component", type: i0.forwardRef(function () { return PaymentViewComponent; }), selector: "ccpay-payment-view", inputs: ["isTurnOff", "isTakePayment", "caseType", "orderRef", "orderStatus", "orderTotalPayments", "payment", "LOGGEDINUSERROLES", "ISPAYMENTSTATUSENABLED", "orderParty", "orderCreated", "orderCCDEvent", "orderFeesTotal", "orderRemissionTotal", "orderDetail", "isServiceRequest"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return CommonModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i0.forwardRef(function () { return i7.CurrencyPipe; }), name: "currency" }, { kind: "component", type: i0.forwardRef(function () { return ServiceRequestComponent; }), selector: "ccpay-service-request", inputs: ["LOGGEDINUSERROLES", "viewStatus", "orderDetail", "orderRef", "orderStatus", "orderParty", "orderCreated", "orderCCDEvent", "orderFeesTotal", "orderTotalPayments", "orderRemissionTotal", "paymentGroupList", "takePayment", "ccdCaseNumber", "isServiceRequest"], outputs: ["goToServiceRquestComponent"] }, { kind: "component", type: i0.forwardRef(function () { return NotificationPreviewComponent; }), selector: "app-notification-preview", inputs: ["payment", "contactDetails", "refundReason", "refundAmount", "paymentReference", "refundReference", "previewJourney", "notificationSent"], outputs: ["notificationPreviewEvent"] }, { kind: "component", type: i0.forwardRef(function () { return ContactDetailsComponent; }), selector: "ccpay-contact-details", inputs: ["isEditOperation", "isEditOperationInRefundList", "addressObj"], outputs: ["assignContactDetails", "assignContactDetailsInFefundsList", "redirectToIssueRefund"] }, { kind: "pipe", type: i0.forwardRef(function () { return CcdHyphensPipe; }), name: "ccdHyphens" }, { kind: "ngmodule", type: i0.forwardRef(function () { return FormsModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i1.ɵNgNoValidate; }), selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgSelectOption; }), selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.ɵNgSelectMultipleOption; }), selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.DefaultValueAccessor; }), selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i0.forwardRef(function () { return i1.NumberValueAccessor; }), selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i0.forwardRef(function () { return i1.CheckboxControlValueAccessor; }), selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i0.forwardRef(function () { return i1.SelectControlValueAccessor; }), selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.RadioControlValueAccessor; }), selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgControlStatus; }), selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgControlStatusGroup; }), selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i0.forwardRef(function () { return i1.MaxLengthValidator; }), selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.PatternValidator; }), selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgForm; }), selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return ReactiveFormsModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i1.FormGroupDirective; }), selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.FormControlName; }), selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.FormGroupName; }), selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.FormArrayName; }), selector: "[formArrayName]", inputs: ["formArrayName"] }] });
1086
+ }
1087
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddRemissionComponent, decorators: [{
1088
+ type: Component,
1089
+ args: [{ selector: 'ccpay-add-remission', providers: [{ provide: 'ADD_REMISSION', useExisting: AddRemissionComponent }], imports: [
1090
+ forwardRef(() => PaymentViewComponent),
1091
+ CommonModule,
1092
+ forwardRef(() => ServiceRequestComponent),
1093
+ forwardRef(() => NotificationPreviewComponent),
1094
+ forwardRef(() => ContactDetailsComponent),
1095
+ CcdHyphensPipe,
1096
+ CapitalizePipe,
1097
+ FormsModule,
1098
+ ReactiveFormsModule
1099
+ ], standalone: true, template: "<div class=\"add-remission pagesize\">\n <div *ngIf=\"errorMessage\">\n <div class=\"error-summary\" role=\"group\" aria-labelledby=\"failure-error-summary-heading\" tabindex=\"-1\">\n <h2 class=\"heading-medium error-summary-heading\" id=\"failure-error-summary-heading\">\n Error in processing the request\n </h2>\n <div class=\"govuk-error-summary__body\">\n {{ errorMessage }}\n </div>\n </div>\n </div>\n <div *ngIf=\"errorMsg.length > 0\">\n <div class=\"error-summary\" role=\"group\" aria-labelledby=\"failure-error-summary-heading\" tabindex=\"-1\">\n <h2 class=\"heading-medium error-summary-heading\" id=\"failure-error-summary-heading\">\n Error in processing the request\n </h2>\n <div *ngFor=\"let err of errorMsg; let i = index\" class=\"govuk-error-summary__body\">\n \n <li>{{err}}</li>\n </div>\n </div>\n </div>\n\n<ng-container *ngIf=\"viewStatus === 'main' && !isRefundRemission \">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ADDREMISSION'>\n <h1 class=\"heading-large\">Add remission </h1>\n <form novalidate>\n <div class=\"govuk-form-group\">\n <form [formGroup]=\"remissionForm\" novalidate>\n <div class=\"govuk-form-group\">\n <label class=\"govuk-label govuk-label--s\" for=\"remission-code\">\n Add remission to {{ fee?.code }}: {{ fee?.description }}\n <span class=\"form-hint\">Enter remission for reference. For example: HWF-A1B-23C OR PA21-123456</span>\n </label>\n <input [ngClass]=\"{'inline-error-class': isRemissionCodeEmpty || remissionCodeHasError}\" class=\"govuk-input govuk-input--width-20 govuk-!-margin-right-1\" id=\"remissionCode\" aria-label=\"remissionCode\" name=\"remissionCode\" type=\"text\" formControlName=\"remissionCode\">\n <p class=\"inline-error-message\" *ngIf=\"isRemissionCodeEmpty || remissionCodeHasError\">\n <span *ngIf=\"isRemissionCodeEmpty\">Enter a remission code</span>\n <span *ngIf=\"remissionCodeHasError\">Enter a vaild remission code</span>\n </p>\n </div>\n <div class=\"govuk-form-group\">\n <label class=\"govuk-label govuk-label--s\" for=\"amount\">\n How much does the applicant need to pay?\n </label>\n\n <div id=\"amount-currency\" class=\"govuk-visually-hidden\">in pounds</div>\n <div class=\"hmcts-currency-input\">\n <div class=\"hmcts-currency-input__symbol\" aria-hidden=\"true\">\u00A3</div>\n <input class=\"govuk-input govuk-input--width-10\" [ngClass]=\"{'inline-error-class': isAmountEmpty || amountHasError || isRemissionLessThanFeeError}\" id=\"amount\" aria-label=\"amount\" name=\"amount\" type=\"text\" aria-describedby=\"amount-currency\" formControlName=\"amount\">\n <p class=\"inline-error-message\" *ngIf=\"isAmountEmpty || amountHasError || isRemissionLessThanFeeError\">\n <span *ngIf=\"isAmountEmpty\">Enter a amount</span>\n <span *ngIf=\"amountHasError\">Enter a vaild amount</span>\n <span *ngIf=\"isRemissionLessThanFeeError\">The remission amount must be less than the total fee</span>\n </p>\n </div>\n </div>\n </form>\n <button class=\"button\" type=\"submit\" (click)=\"addRemission()\">\n Submit\n </button>\n </div>\n </form>\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'confirmation'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ADDREMISSIONCONFIRMATION'> \n <div class=\"govuk-warning-text\">\n <span class=\"govuk-warning-text__icon\" aria-hidden=\"true\">!</span>\n <strong class=\"govuk-warning-text__text\">\n <span class=\"govuk-warning-text__assistive\">Warning</span>\n Are you sure you want to add remission to this fee?\n </strong>\n </div>\n <table class=\"govuk-table\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Remission code:</td>\n <td class=\"govuk-table__cell\">{{ remissionForm.controls.remissionCode.value }}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee code:</td>\n <td class=\"govuk-table__cell\">{{ fee.code }}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee description:</td>\n <td class=\"govuk-table__cell\">{{ fee.description }}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Amount the applicant must pay:</td>\n <td class=\"govuk-table__cell\">{{ remissionForm.controls.amount.value | currency:'GBP':'symbol-narrow':'1.2-2' }}</td>\n </tr>\n </table>\n\n <button type=\"submit\" class=\"button govuk-button--secondary\" (click)=\"cancelRemission.emit()\">\n Cancel\n </button>\n <button type=\"submit\"\n [disabled]=\"isConfirmationBtnDisabled\"\n [ngClass]='isConfirmationBtnDisabled ? \"button button--disabled govuk-!-margin-right-1\" : \"button govuk-!-margin-right-1\"'\n (click)=\"confirmRemission()\">\n Confirm\n </button>\n\n</ng-container>\n\n<!-- Add retro remission changes-->\n\n<ng-container *ngIf=\"viewCompStatus === 'addremission'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='PROCESSADDRETROREMISSIONPAGE'> \n <h1 class=\"heading-large\">Process remission</h1>\n <h1 class=\"heading-medium\">#{{ccdCaseNumber | ccdHyphens}}</h1>\n <h1 class=\"heading-large\">Enter help with fees or remission reference</h1>\n <form novalidate>\n <div class=\"govuk-form-group\">\n <form [formGroup]=\"remissionForm\" novalidate>\n <div class=\"govuk-form-group\">\n <label class=\"govuk-label govuk-label--s\" for=\"remission-code\">\n <span class=\"form-hint\">For example: HWF-A1B-23C OR PA21-123456</span>\n </label>\n <p class=\"inline-error-message\" *ngIf=\"isRemissionCodeEmpty || remissionCodeHasError\">\n <span *ngIf=\"isRemissionCodeEmpty\">Enter a remission code</span>\n <span *ngIf=\"remissionCodeHasError\">Enter a vaild remission code</span>\n </p>\n <input [ngClass]=\"{'inline-error-class': isRemissionCodeEmpty || remissionCodeHasError}\" class=\"govuk-input govuk-input--width-20 govuk-!-margin-right-1\" id=\"remissionCode\" aria-label=\"remissionCode\" name=\"remissionCode\" type=\"text\" formControlName=\"remissionCode\">\n \n </div>\n \n </form>\n <div class=\"govuk-button-group\">\n <button (click)=\"gotoServiceRequestPage($event)\" class=\"govuk-button govuk-button--secondary\"> Previous</button>\n <button (click)=\"addRemissionCode()\" class=\"govuk-button\"> Continue</button>\n </div>\n <p><a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link pointer\" data-module=\"govuk-button\">Cancel</a></p>\n </div>\n </form>\n\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'processretroremissonpage'\" >\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='PROCESSRETROREMISSIONPAGE'> \n <h1 class=\"heading-large\">Process remission</h1>\n <h1 class=\"heading-medium\">#{{ccdCaseNumber | ccdHyphens }}</h1>\n <div class=\"govuk-form-group\">\n <form novalidate>\n <div class=\"govuk-form-group\">\n <form [formGroup]=\"remissionForm\" novalidate>\n <fieldset class=\"govuk-fieldset\">\n <legend class=\"govuk-fieldset__legend govuk-fieldset__legend--m\"> \n <h1 *ngIf=\"remessionPayment?.status === 'Success' || isFromRefundListPage\" class=\"heading-medium\">\n Enter the amount to be refunded\n </h1> \n <h1 *ngIf=\"remessionPayment?.status !== 'Success' && !isFromRefundListPage\" class=\"heading-medium\">\n Enter the remission amount\n </h1> \n <h1 *ngIf=\"remessionPayment?.status === 'undefined'\" class=\"heading-medium\">\n Enter the amount\n </h1> \n </legend>\n <div id=\"amount-currency\" class=\"govuk-visually-hidden\">in pounds</div>\n <p class=\"inline-error-message\" *ngIf=\"isAmountEmpty || amountHasError || isRemissionLessThanFeeError\">\n <span *ngIf=\"isAmountEmpty\">Enter a amount</span>\n <span *ngIf=\"amountHasError\">Enter a vaild amount</span>\n <span *ngIf=\"isRemissionLessThanFeeError\">You cannot add a remission that's more than the fee amount.</span>\n </p>\n <div class=\"hmcts-currency-input\">\n \n <div class=\"hmcts-currency-input__symbol\" aria-hidden=\"true\">\u00A3</div>\n <input class=\"govuk-input govuk-input--width-10\" [ngClass]=\"{'inline-error-class': isAmountEmpty || amountHasError || isRemissionLessThanFeeError}\" id=\"amount\" aria-label=\"amount\" name=\"amount\" type=\"number\" aria-describedby=\"amount-currency\" formControlName=\"amount\">\n \n \n </div>\n </fieldset>\n </form>\n \n <div class=\"govuk-button-group\">\n <button (click)=\"gotoAddRetroRemissionCodePage()\" class=\"govuk-button govuk-button--secondary\"> Previous</button>\n <button (click)=\"gotoCheckRetroRemissionPage(payment)\" class=\"govuk-button\"> Continue</button>\n \n </div>\n <p>\n <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">Cancel</a>\n </p>\n </div>\n \n </form>\n </div>\n</ng-container>\n<ng-container *ngIf=\"viewStatus === 'checkretroremissionpage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='CHECKRETROREMISSIONCONFIRMATION'> \n <div class=\"govuk-warning-text\">\n <h1 class=\"heading-large\"> Check your answers</h1>\n </div>\n <table class=\"govuk-table\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment reference</td>\n <td class=\"govuk-table__cell\">{{remessionPayment ? remessionPayment.reference: ' '}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment amount</td>\n <td class=\"govuk-table__cell\">\u00A3{{ remessionPayment ? getFormattedCurrency(remessionPayment.amount): ' ' | currency :'GBP':'symbol':'1.2-2'}} </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment status</td>\n <td class=\"govuk-table__cell\">{{remessionPayment ? remessionPayment.status: ''}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee</td>\n <td class=\"govuk-table__cell\">{{ fee.code }} - {{ fee.description }} </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee amount</td>\n <td class=\"govuk-table__cell\">{{ fee.calculated_amount/fee.volume| currency:'GBP':'symbol-narrow':'1.2-2' }}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Help with fees or remission reference</td>\n <td class=\"govuk-table__cell\">{{ remissionForm.controls.remissionCode.value?.trim() }}\n <a (click)=\"gotoProcessRetroRemissionPage()\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td *ngIf=\"remessionPayment.status === 'Success'\" class=\"govuk-table__cell govuk-!-font-weight-bold\">Refund amount</td>\n <td *ngIf=\"remessionPayment.status !== 'Success'\" class=\"govuk-table__cell govuk-!-font-weight-bold\">Remission amount</td>\n <td class=\"govuk-table__cell\">{{remissionForm.controls.amount.value | currency:'GBP':'symbol-narrow':'1.2-2' }}\n <a (click)=\"gotoAmountRetroRemission()\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n </table>\n\n <button type=\"submit\" class=\"button govuk-button--secondary\" (click)=\"gotoAmountRetroRemission()\">Previous</button>\n <button type=\"submit\" [disabled]=\"isConfirmationBtnDisabled\" [ngClass]='isConfirmationBtnDisabled ? \"button button--disabled govuk-!-margin-right-1\" : \"button govuk-!-margin-right-1\"' (click)=\"confirmRetroRemission()\"> Add remission </button>\n <p> <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\"> Cancel</a> </p>\n\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'retroremissionconfirmationpage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='RETROREMISSIONCONFIRMATIONPAGE'> \n <div class=\"govuk-grid-row\">\n <div >\n <div class=\"govuk-panel govuk-panel-border--confirmation\">\n <h1 class=\"govuk-panel__title\">\n Remission added\n </h1>\n <div *ngIf=\"remessionPayment.status === 'Success'\" class=\"govuk-panel__body\">\n <p class=\"govuk-body\"><strong>The amount to be refunded should be {{remissionForm.controls.amount.value | currency:'GBP':'symbol-narrow':'1.2-2' }}</strong></p>\n \n </div>\n </div>\n <div *ngIf=\"remessionPayment.status === 'Success'\" >\n <button type=\"submit\" [disabled]=\"!isRemissionApplied\" [ngClass]='isConfirmationBtnDisabled ? \"button button--disabled govuk-!-margin-right-1\" : \"button govuk-!-margin-right-1\"' (click)=\"gotoProcessRetroRemission()\">Continue </button>\n </div>\n <p class=\"govuk-body\">\n <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link pointer\" data-module=\"govuk-button\">\n Return to case\n </a>\n </p>\n </div>\n </div>\n</ng-container>\n\n\n<ng-container *ngIf=\"viewStatus === 'remissionAddressPage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ADDRESSDETAILSRETROREMISSIONPAGE'> \n <h1 class=\"govuk-heading-l\">Process refund</h1>\n <h2 class=\"govuk-heading-m govuk-font19px\">Case reference: {{ccdCaseNumber | ccdHyphens }}</h2>\n <ccpay-contact-details\n [addressObj] = notification\n (assignContactDetails)=\"getContactDetails($event, 'checkaddRefundpage')\"\n (redirectToIssueRefund)=\"gotoRemissionSuccess($event)\" ></ccpay-contact-details>\n <p>\n <a (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n Cancel\n </a>\n </p>\n\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'checkaddRefundpage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='CHECKRETROREMISSIONCONFIRMATION'> \n <div class=\"govuk-warning-text\">\n <h1 class=\"heading-large\"> Check your answers</h1>\n </div>\n <table class=\"govuk-table\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment reference</td>\n <td class=\"govuk-table__cell\">{{remessionPayment ? remessionPayment.reference: ' '}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment amount</td>\n <td class=\"govuk-table__cell\">\u00A3{{ remessionPayment ? getFormattedCurrency(remessionPayment.amount): ' ' | currency :'GBP':'symbol':'1.2-2'}} </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment status</td>\n <td class=\"govuk-table__cell\">{{remessionPayment ? remessionPayment.status: ''}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee</td>\n <td class=\"govuk-table__cell\">{{ fee.code }} - {{ fee.description }} ({{ fee.calculated_amount/fee.volume| currency:'GBP':'symbol-narrow':'1.2-2' }}) </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Help with fees or remission reference</td>\n <td class=\"govuk-table__cell\">{{ remissionForm.controls.remissionCode.value?.trim() }}\n </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td *ngIf=\"remessionPayment.status === 'Success'\" class=\"govuk-table__cell govuk-!-font-weight-bold\">Refund amount</td>\n <td *ngIf=\"remessionPayment.status !== 'Success'\" class=\"govuk-table__cell govuk-!-font-weight-bold\">Remission amount</td>\n <td class=\"govuk-table__cell\">{{remissionForm.controls.amount.value | currency:'GBP':'symbol-narrow':'1.2-2' }}\n </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Send to</td>\n <td class=\"govuk-table__cell\">{{orderParty}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Send via</td>\n <td class=\"govuk-table__cell whitespace-inherit\">\n <div *ngIf=\"contactDetailsObj?.notification_type === 'EMAIL'\" class=\"contactDetails-width\">\n <strong>Email</strong>\n <br/>\n {{contactDetailsObj?.email?.trim()}}\n </div>\n <div *ngIf=\"contactDetailsObj?.notification_type === 'LETTER'\" class=\"contactDetails-width\">\n <strong>Post</strong>\n <br/>\n {{contactDetailsObj?.address_line?.trim()}}&nbsp;{{contactDetailsObj?.city?.trim()}}&nbsp;{{contactDetailsObj?.county?.trim()}}&nbsp;{{contactDetailsObj?.country?.trim()}}&nbsp;{{contactDetailsObj?.postal_code?.trim()}}\n </div>\n <a (click)=\"gotoProcessRetroRemission(contactDetailsObj)\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Notification</td>\n <td class=\"govuk-table__cell\">{{templateInstructionType}}\n <a *ngIf=\"!notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"showNotificationPreview()\">\n Preview\n </a>\n <a *ngIf=\"notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"hideNotificationPreview()\">\n Hide Preview\n </a>\n </td>\n </tr>\n </table>\n\n <app-notification-preview *ngIf=\"notificationPreview\" \n [payment]=\"remessionPayment\" \n [contactDetails]=\"contactDetailsObj\"\n [refundReason]=\"'RR036'\"\n [refundAmount]=\"remissionForm.controls.amount.value\"></app-notification-preview>\n\n <button type=\"submit\" class=\"button govuk-button--secondary\" (click)=\"gotoProcessRetroRemission(contactDetailsObj)\">Previous</button>\n <button type=\"submit\" [disabled]=\"isConfirmationBtnDisabled\" [ngClass]='isConfirmationBtnDisabled ? \"button button--disabled govuk-!-margin-right-1\" : \"button govuk-!-margin-right-1\"' (click)=\"processRefund()\"> Submit refund </button>\n <p> <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\"> Cancel</a> </p>\n\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'refundconfirmationpage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='RETROREMISSIONREFUNDCONFIRMATIONPAGE'> \n <div class=\"govuk-grid-row\">\n <div >\n <div class=\"govuk-panel govuk-panel--confirmation\">\n <h1 class=\"govuk-panel__title\">\n Refund submitted\n </h1>\n\n <div class=\"govuk-panel__body\">\n <p class=\"govuk-body white\"><strong>Refund reference: {{refundReference}}</strong></p>\n </div>\n\n </div>\n <div *ngIf=\"isPaymentSuccess\">\n <h2 class=\"govuk-heading-l\">What happens next</h2>\n <p class=\"govuk-body\">\n A refund request for {{refundAmount | currency:'GBP':'symbol-narrow':'1.2-2' }} has been created and will be passed to a team leader to approve.\n </p>\n </div>\n <p class=\"govuk-body\">\n <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link pointer\" data-module=\"govuk-button\">\n Return to case\n </a>\n </p>\n </div>\n </div>\n \n</ng-container>\n\n<!-- Issue Refund Section -->\n<ng-container *ngIf=\"viewCompStatus === 'issuerefund' && isRefundRemission\">\n <div class=\"govuk-form-group\">\n <form [formGroup]=\"remissionForm\" novalidate>\n <h1 class=\"heading-large\">Process refund</h1>\n <h2 class=\"heading-medium\">Case reference:{{ccdCaseNumber | ccdHyphens }}</h2>\n <span id=\"how-contacted-conditional-hint\" class=\"form-hint govuk-font19px\">\n Payment reference: {{paymentReference}}\n </span>\n <h3 class=\"heading-small\">Select fees to be refunded</h3>\n <!--TABLE-->\n <div>\n <table class=\"govuk-table\">\n <thead class=\"govuk-table__head\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__header col-1\" scope=\"col\">Select</td>\n <td class=\"govuk-table__header col-18\" scope=\"col\">Fee description</td>\n <td class=\"govuk-table__header col-6\" scope=\"col\">Fee amount</td>\n <td class=\"govuk-table__header col-6\" scope=\"col\">Total paid</td>\n <td class=\"govuk-table__header col-6\" scope=\"col\">Quantity</td>\n <td class=\"govuk-table__header col-8\" scope=\"col\">Amount to refund</td>\n <td class=\"govuk-table__header\" scope=\"col\"></td>\n </tr>\n </thead>\n <tbody class=\"govuk-table__body\" *ngIf=\"!isFullyRefund\">\n <tr class=\"govuk-table__row\" formArrayName=\"feesList\" *ngFor=\"let fee of feesList?.controls; let i = index\">\n <td class=\"govuk-table__cell\">\n <div [formGroupName]=\"i\" class=\"govuk-checkboxes govuk-checkboxes--large\" data-module=\"govuk-checkboxes\">\n <div class=\"govuk-checkboxes__item\">\n\n <input\n class=\"govuk-checkboxes__input\" \n (click)=\"check_en(i,fee.controls['id'].value,fee.controls['apportion_amount'].value,fee.controls['volume'].value)\" \n id=\"{{fee.controls['id'].value}}\" \n name=\"organisation\" \n type=\"checkbox\" \n value=\"{{fee.controls['id'].value}}\" \n formControlName=\"selected\" >\n <label class=\"govuk-label govuk-checkboxes__label\" for=\"{{fee.controls['id'].value}}\">\n <span style=\"display:none\">Select</span>\n </label>\n </div>\n </div>\n </td>\n <td class=\"govuk-table__cell whitespace-inherit\">{{fee.controls['description'].value}} </td>\n <td class=\"govuk-table__cell whitespace-inherit left\" >\n <div type=\"hidden\" style=\"display:none;background-color:white;\" id=\"feeVOl_{{fee.controls['id'].value}}\">{{ fee.controls['calculated_amount'].value / fee.controls['volume'].value }}</div>\n {{ fee.controls['calculated_amount'].value / fee.controls['volume'].value | currency:'GBP':'symbol-narrow':'1.2-2' }}\n </td>\n <td class=\"govuk-table__cell whitespace-inherit left\" >{{ fee.controls['apportion_amount'].value | currency:'GBP':'symbol-narrow':'1.2-2'}} </td>\n <td class=\"govuk-table__cell whitespace-inherit left\" *ngIf=\"fee.controls['volume'].value >1\">\n <div [formGroupName]=\"i\">\n <input disabled=\"disabled\" class=\"govuk-input govuk-input--width-4 center\" id=\"feeVolumeUpdated_{{fee.controls['id'].value}}\" (keyup)=\"calAmtToRefund($event.target.value,fee.controls['calculated_amount'].value,fee.controls['volume'].value,i)\" value=\"{{fee.controls['updated_volume'].value}}\" name=\"feeVolumeUpdated_{{fee.controls['id'].value}}\" formControlName=\"updated_volume\" type=\"text\" >\n </div>\n </td>\n <td class=\"govuk-table__cell whitespace-inherit left\" *ngIf=\"fee.controls['volume'].value ===1\">\n <input disabled=\"disabled\" class=\"govuk-input govuk-input--width-4 center\" id=\"VolumeUpdated_{{fee.controls['id'].value}}\" name=\"VolumeUpdated_{{fee.controls['id'].value}}\" type=\"text\" value=\"{{fee.controls['volume'].value}}\">\n </td>\n <td class=\"govuk-table__cell whitespace-inherit center\" scope=\"row\">\n \n <div [formGroupName]=\"i\" class=\"hmcts-currency-input\">\n \n <div class=\"hmcts-currency-input__symbol\" aria-hidden=\"true\">\u00A3</div>\n <input disabled=\"disabled\" class=\"govuk-input govuk-input--width-10\" id=\"feeAmount_{{fee.controls['id'].value}}\" name=\"feeAmount_{{fee.controls['id'].value}}\" type=\"text\" aria-describedby=\"amount-currency \" pattern=\"[0-9]*\" formControlName=\"refund_amount\">\n <input id=\"feeVolume_{{fee.controls['id'].value}}\" name=\"feeVolume_{{fee.controls['id'].value}}\" value= \"{{fee.controls['volume'].value}}\" type=\"hidden\" formControlName=\"volume\">\n <input id=\"feeApportionAmount_{{fee.controls['id'].value}}\" name=\"feeApportionAmount_{{fee.controls['id'].value}}\" value= \"{{fee.controls['apportion_amount'].value}}\" type=\"hidden\" formControlName=\"apportion_amount\">\n <input id=\"calculatedAmount_{{fee.controls['id'].value}}\" name=\"calculatedAmount_{{fee.controls['id'].value}}\" value= \"{{fee.controls['calculated_amount'].value}}\" type=\"hidden\" formControlName=\"calculated_amount\">\n </div> \n \n </td>\n </tr>\n </tbody>\n <tbody class=\"govuk-table__body\" *ngIf=\"isFullyRefund\">\n <tr class=\"govuk-table__row\" *ngFor=\"let fee of fees; let i = index\">\n <td class=\"govuk-table__cell\">\n <div class=\"govuk-checkboxes govuk-checkboxes--large\" data-module=\"govuk-checkboxes\">\n <div class=\"govuk-checkboxes__item\">\n <input \n class=\"govuk-checkboxes__input\" \n \n id=\"{{fee.id}}\" \n name=\"organisation\" \n type=\"checkbox\" \n value=\"{{fee.id}}\"\n disabled=\"disabled\"\n [checked]=\"true\" >\n <label class=\"govuk-label govuk-checkboxes__label\" for=\"{{fee.id}}\">\n <span style=\"display:none\">Select</span>\n </label>\n </div>\n </div>\n </td>\n <td class=\"govuk-table__cell whitespace-inherit\">{{fee.description}} </td>\n <td class=\"govuk-table__cell whitespace-inherit left\" >\n <div type=\"hidden\" style=\"display:none;background-color:white;\" id=\"feeVOl_{{fee.id}}\">{{ fee.calculated_amount / fee.volume }}</div>\n {{ fee.calculated_amount / fee.volume| currency:'GBP':'symbol-narrow':'1.2-2' }}\n </td>\n <td class=\"govuk-table__cell whitespace-inherit left\" >{{ payment.amount | currency:'GBP':'symbol-narrow':'1.2-2'}} </td>\n <td class=\"govuk-table__cell whitespace-inherit left\">\n <div >\n <input disabled=\"disabled\" class=\"govuk-input govuk-input--width-4 center\" id=\"feeVolumeUpdated_{{fee.id}}\" value=\"{{fee.volume}}\" name=\"feeVolumeUpdated_{{fee.id}}\" type=\"text\" >\n </div>\n </td>\n \n <td class=\"govuk-table__cell whitespace-inherit center\" scope=\"row\">\n \n <div class=\"hmcts-currency-input\">\n \n <div class=\"hmcts-currency-input__symbol\" aria-hidden=\"true\">\u00A3</div>\n <input disabled=\"disabled\" class=\"govuk-input govuk-input--width-10\" id=\"feeAmount_{{fee.id}}\" name=\"feeAmount_{{fee.id}}\" type=\"text\" aria-describedby=\"amount-currency \" value=\"{{ payment.amount | currency:'GBP':'symbol-narrow':'1.2-2'}}\" pattern=\"[0-9]*\" >\n </div> \n \n </td>\n </tr>\n </tbody>\n <tbody class=\"govuk-table__body\" *ngIf=\"fees?.length === 0\">\n <td class=\"govuk-table__cell\" colspan=\"6\">No fees recorded</td>\n </tbody>\n </table>\n </div>\n <div class=\"govuk-button-group\">\n\n \n <a (click)=\"gotoServiceRequestPage($event)\" *ngIf=\"!isFullyRefund\" draggable=\"false\" class=\"govuk-button govuk-button--secondary\" data-module=\"govuk-button\">\n Previous\n </a>\n <a (click)=\"goToPaymentViewComponent()\" *ngIf=\"isFullyRefund\" draggable=\"false\" class=\"govuk-button govuk-button--secondary\" data-module=\"govuk-button\">\n Previous\n </a>\n \n <button [disabled] = \"noneSelected()\" (click)=\"gotoIssuePage(isFullyRefund)\" class=\"govuk-button\">\n Continue\n </button>\n \n </div>\n <p>\n <a (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">Cancel</a>\n </p>\n </form>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"viewCompStatus === 'issuerefundpage1' && isRefundRemission\">\n\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ISSUEREFUNDPAGE'> \n <h1 class=\"heading-large\">Process refund</h1>\n <h1 class=\"heading-medium\">Case reference: {{ccdCaseNumber | ccdHyphens }}</h1>\n <span id=\"how-contacted-conditional-hint govuk-font19px\" *ngIf=\"payment\" class=\"form-hint\">\n Payment reference: {{paymentReference}}\n </span>\n <span id=\"how-contacted-conditional-hint govuk-font19px\" *ngIf=\"refundPaymentReference\" class=\"form-hint\">\n Payment reference: {{refundPaymentReference}}\n </span>\n <h1 class=\"heading-large\">Why are you making this refund?\n </h1>\n \n\n <div class=\"govuk-form-group\">\n <form novalidate>\n <div class=\"govuk-form-group\">\n <form [formGroup]=\"remissionForm\" novalidate>\n <fieldset class=\"govuk-fieldset\" aria-describedby=\"how-contacted-conditional-hint\">\n \n <div\n [ngClass]=\"refundHasError ? 'govuk-radios govuk-radios--conditional form-group-error' : 'govuk-radios govuk-radios--conditional'\"\n data-module=\"govuk-radios\" >\n <p class=\"inline-error-message\" *ngIf=\"refundHasError\">\n <span *ngIf=\"refundHasError\">Select a reason why you\u2019re making this refund</span>\n </p>\n\n \n\n <div class = \"container-fluid\">\n <div class=\"row\">\n <div class=\"govuk-radios__item col-md-4\" *ngFor=\"let refund of commonRefundReasons; let i = index;\">\n <!-- <div *ngIf = \"{{refund.name}} !== 'Retrospective remission'\"> -->\n <input class=\"govuk-radios__input\" id=\"{{refund.name}}\" name=\"refundReason\" type=\"radio\"\n formControlName=\"refundReason\" value={{refund.code}}\n (change)=\"selectRadioButton(refund.code, refund.name)\">\n <label class=\"govuk-label--s govuk-radios__label govuk-font__custom\" for=\"how-contacted-conditional\">\n {{refund.name}}\n </label>\n\n <div class=\"govuk-radios__conditional\" *ngIf=\"isRefundReasonsSelected && showReasonText && selectedRefundReason === refund.name \" >\n <label class=\"govuk-label govuk-label--m\" for=\"{{refund.name}}\">\n Enter reason\n </label>\n <div [ngClass]=\"{'form-group-error': isReasonEmpty}\">\n <p class=\"inline-error-message\" *ngIf=\"isReasonEmpty\">\n <span *ngIf=\"isReasonEmpty\">Enter a reason why you\u2019re making this refund</span>\n </p>\n \n <input class=\"govuk-input govuk-input--width-10\" [ngClass]=\"{'inline-error-class': isReasonEmpty}\" id=\"reason\" aria-label=\"reason\" name=\"reason\" type=\"text\" aria-describedby=\"reason\" maxlength=\"30\" formControlName=\"reason\">\n </div>\n </div>\n <!-- </div> -->\n </div>\n </div>\n </div>\n <br/>\n <div>\n <select formControlName=\"refundDDReason\" class=\"govuk-select\" id=\"sort\" (change)=\"selectchange($event)\">\n <option selected='selected' [defaultSelected]=true [value]=\"default\" >{{default}}</option> \n <!-- <option value=\"\" selected='selected'>Select a different reason</option> -->\n <option *ngFor=\"let refund of refundReasons;\" id=\"{{refund.name}}\" value=\"{{refund.code}}\">{{refund.name}}</option>\n </select>\n \n </div>\n <br/>\n <div class=\"govuk-radios__conditional\" *ngIf=\"showReasonText && !isRefundReasonsSelected\" >\n <div [ngClass]=\"{'form-group-error': isReasonEmpty}\">\n <label class=\"govuk-label govuk-label--m\" for=\"amount\">\n Enter reason\n </label>\n <p class=\"inline-error-message\" *ngIf=\"isReasonEmpty\">\n <span *ngIf=\"isReasonEmpty\">Enter a reason why you\u2019re making this refund</span>\n </p>\n <input class=\"govuk-input govuk-input--width-10\" [ngClass]=\"{'inline-error-class': isReasonEmpty}\" id=\"reason\" aria-label=\"reason\" name=\"reason\" type=\"text\" aria-describedby=\"reason\" maxlength=\"{{reasonLength}}\" formControlName=\"reason\">\n </div>\n </div>\n\n \n </div>\n </fieldset>\n </form>\n </div>\n </form>\n </div>\n <div class=\"govuk-button-group\">\n <button (click)=\"gotoPartialFeeRefundScreen()\" class=\"govuk-button govuk-button--secondary\"> Previous</button>\n <button (click)=\"gotoIssueRefundConfirmation(payment)\" class=\"govuk-button\"> Continue</button>\n </div>\n <p>\n <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n Cancel\n </a>\n </p>\n \n</ng-container>\n<ng-container *ngIf=\"viewStatus === 'contactDetailsPage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='CAPTUREADDRESSDETAILSPAGE'> \n <h1 class=\"govuk-heading-l\">Process refund</h1>\n <h2 class=\"govuk-heading-m govuk-font19px\">Case reference: {{ccdCaseNumber | ccdHyphens }}</h2>\n <span id=\"how-contacted-conditional-hint\" class=\"govuk-hint govuk-font19px\">\n Payment reference: {{paymentReference}}\n </span>\n <ccpay-contact-details\n [addressObj] = notification\n (assignContactDetails)=\"getContactDetails($event, 'checkissuerefundpage')\"\n (redirectToIssueRefund)=\"gotoRefundReasonPage()\" ></ccpay-contact-details>\n <p>\n <a (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n Cancel\n </a>\n </p>\n\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'checkissuerefundpage'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='CHECKISSUEREFUNDPAGE'> \n <div class=\"govuk-warning-text\">\n \n <h1 class=\"heading-large\"> Check your answers</h1>\n </div>\n <table class=\"govuk-table\">\n \n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment reference</td>\n <td class=\"govuk-table__cell\">{{paymentReference}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment amount</td>\n <td class=\"govuk-table__cell\">{{payment.amount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr>\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Reason for refund</td>\n <td class=\"govuk-table__cell\">{{ displayRefundReason?.trim() }} \n <a (click)=\"changeIssueRefundReason()\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n <tr class=\"govuk-table__row\" *ngIf=\"!isFullyRefund\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Refund amount</td>\n <td class=\"govuk-table__cell\">{{totalRefundAmount | currency:'GBP':'symbol-narrow':'1.2-2'}}\n <a (click)=\"changeRefundAmount()\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n <tr class=\"govuk-table__row\" *ngIf=\"isFullyRefund\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Refund amount</td>\n <td class=\"govuk-table__cell\">{{payment.amount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Send to</td>\n <td class=\"govuk-table__cell\">{{orderParty}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Send via</td>\n <td class=\"govuk-table__cell whitespace-inherit\">\n <div *ngIf=\"contactDetailsObj?.notification_type === 'EMAIL'\" class=\"contactDetails-width\">\n <strong>Email</strong>\n <br/>\n {{contactDetailsObj?.email?.trim()}}\n </div>\n <div *ngIf=\"contactDetailsObj?.notification_type === 'LETTER'\" class=\"contactDetails-width\">\n <strong>Post</strong>\n <br/>\n {{contactDetailsObj?.address_line?.trim()}}&nbsp;{{contactDetailsObj?.city?.trim()}}&nbsp;{{contactDetailsObj?.county?.trim()}}&nbsp;{{contactDetailsObj?.country?.trim()}}&nbsp;{{contactDetailsObj?.postal_code?.trim()}}\n </div>\n <a (click)=\"gotoContactDetailsPage(contactDetailsObj)\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Notification</td>\n <td class=\"govuk-table__cell\">{{templateInstructionType}}\n <a *ngIf=\"!notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"showNotificationPreview()\">\n Preview\n </a>\n <a *ngIf=\"notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"hideNotificationPreview()\">\n Hide Preview\n </a>\n </td>\n </tr>\n </table>\n\n <app-notification-preview *ngIf=\"notificationPreview\" \n [payment]=\"payment\" \n [contactDetails]=\"contactDetailsObj\"\n [refundReason]=\"selectedRefundReasonCode\"\n [refundAmount]=\"isFullyRefund ? payment.amount : totalRefundAmount\"></app-notification-preview>\n\n\n <div class=\"govuk-button-group\">\n <button type=\"submit\" class=\"button govuk-button--secondary\" (click)=\"gotoContactDetailsPage(contactDetailsObj)\"> Previous </button>\n <button type=\"submit\"\n [disabled]=\"isConfirmationBtnDisabled\"\n [ngClass]='isConfirmationBtnDisabled ? \"button button--disabled govuk-!-margin-right-1\" : \"button govuk-!-margin-right-1\"'\n (click)=\"confirmIssueRefund(isFullyRefund)\">\n Submit refund\n </button>\n </div>\n <p>\n <a (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n Cancel\n </a>\n </p>\n\n</ng-container>\n\n<!--Retro Refund-->\n<ng-container *ngIf=\"viewCompStatus === 'addrefundforremission'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ADDRESSDETAILSRETROREMISSIONPAGE'> \n <h1 class=\"govuk-heading-l\">Process refund</h1>\n <h2 class=\"govuk-heading-m govuk-font19px\">Case reference: {{ccdCaseNumber | ccdHyphens }}</h2>\n <span id=\"how-contacted-conditional-hint\" class=\"govuk-hint govuk-font19px\">\n Payment reference: {{paymentReference}}\n </span>\n<ccpay-contact-details \n[addressObj] = notification\n(assignContactDetails)=\"getContactDetails($event, 'addrefundcheckandanswer')\"\n(redirectToIssueRefund)=\"gotoServiceRequestPage($event)\" ></ccpay-contact-details>\n<p>\n <a (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n Cancel\n </a>\n</p>\n</ng-container>\n<ng-container *ngIf=\"viewStatus === 'addrefundcheckandanswer'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ADDREFUNDFORREMISSION'> \n <div class=\"govuk-warning-text\">\n \n <h1 class=\"heading-large\"> Check your answers</h1>\n </div>\n <table class=\"govuk-table\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Reason for refund</td>\n <td class=\"govuk-table__cell\">Retrospective remission</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Payment reference</td>\n <td class=\"govuk-table__cell\">{{paymentReference}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Refund amount</td>\n <td class=\"govuk-table__cell\">{{remission.hwf_amount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee code</td>\n <td class=\"govuk-table__cell\">{{remission.fee_code}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Fee amount</td>\n <td class=\"govuk-table__cell\">{{feeamount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Send to</td>\n <td class=\"govuk-table__cell\">{{orderParty}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Send via</td>\n <td class=\"govuk-table__cell whitespace-inherit\">\n <div *ngIf=\"contactDetailsObj?.notification_type === 'EMAIL'\" class=\"contactDetails-width\">\n <strong>Email</strong>\n <br/>\n {{contactDetailsObj?.email?.trim()}}\n </div>\n <div *ngIf=\"contactDetailsObj?.notification_type === 'LETTER'\" class=\"contactDetails-width\">\n <strong>Post</strong>\n <br/>\n {{contactDetailsObj?.address_line?.trim()}}&nbsp;{{contactDetailsObj?.city?.trim()}}&nbsp;{{contactDetailsObj?.county?.trim()}}&nbsp;{{contactDetailsObj?.country?.trim()}}&nbsp;{{contactDetailsObj?.postal_code?.trim()}}\n </div>\n <a (click)=\"gotoAddressPage(contactDetailsObj)\" class=\"govuk-link right\" >Change</a>\n </td>\n </tr>\n\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">Notification</td>\n <td class=\"govuk-table__cell\">{{templateInstructionType}}\n <a *ngIf=\"!notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"showNotificationPreview()\">\n Preview\n </a>\n <a *ngIf=\"notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"hideNotificationPreview()\">\n Hide Preview\n </a>\n </td>\n </tr>\n </table>\n\n <app-notification-preview *ngIf=\"notificationPreview\" \n [contactDetails]=\"contactDetailsObj\"\n [paymentReference]=\"paymentReference\"\n [payment]=\"paymentObj\"\n [refundReason]=\"'RR036'\"\n [refundAmount]=\"remission.hwf_amount\"></app-notification-preview>\n\n <div class=\"govuk-button-group\">\n <button type=\"submit\" class=\"button govuk-button--secondary\" (click)=\"gotoAddressPage(contactDetailsObj)\">Previous</button>\n <button type=\"submit\"\n [disabled]=\"isConfirmationBtnDisabled\"\n [ngClass]='isConfirmationBtnDisabled ? \"button button--disabled govuk-!-margin-right-1\" : \"button govuk-!-margin-right-1\"'\n (click)=\"processRefund()\">\n Submit refund\n </button>\n </div>\n <p>\n <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n Cancel\n </a>\n </p>\n\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'retrorefundconfirmationpage'\">\n <div class=\"govuk-grid-row\">\n <div >\n <div class=\"govuk-panel govuk-panel--confirmation\">\n <h1 class=\"govuk-panel__title\">\n Refund submitted\n </h1>\n \n <div class=\"govuk-panel__body\">\n <p class=\"govuk-body white\"><strong>Refund reference: {{refundReference}}</strong></p>\n </div>\n \n </div>\n <div *ngIf=\"isPaymentSuccess\">\n <h2 class=\"govuk-heading-l\">What happens next</h2>\n <p class=\"govuk-body\">\n A refund request for {{ refundAmount| currency:'GBP':'symbol-narrow':'1.2-2'}} has been passed to a team leader to approve.\n </p>\n </div>\n <p class=\"govuk-body\">\n <a href=\"javascript:void(0)\" (click)=\"gotoCasetransationPageCancelBtnClicked($event)\" class=\"govuk-link pointer\" data-module=\"govuk-button\">\n Return to case\n </a>\n </p>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'order-full-view'\">\n <ccpay-service-request\n [viewStatus] = \"viewStatus\"\n [orderRef] = \"orderRef\"\n [isServiceRequest]=\"isServiceRequest\"\n [orderStatus] = \"orderStatus\"\n [orderCreated] = \"orderCreated\"\n [orderParty] = \"orderParty\"\n [orderCCDEvent] = \"orderCCDEvent\"\n [orderDetail] = \"orderDetail\"\n [LOGGEDINUSERROLES] = \"LOGGEDINUSERROLES\"\n [takePayment] = \"takePayment\"\n [ccdCaseNumber] = \"ccdCaseNumber\"\n [orderFeesTotal] = \"orderFeesTotal\"\n [orderTotalPayments] = \"orderTotalPayments\"\n [orderRemissionTotal] = \"orderRemissionTotal\">\n</ccpay-service-request>\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'payment-view'\">\n <ccpay-payment-view \n [LOGGEDINUSERROLES] = \"LOGGEDINUSERROLES\"\n [isTurnOff] = \"isTurnOff\" \n [isTakePayment] = \"takePayment\" \n [caseType] = \"caseType\"\n [isServiceRequest]=\"isServiceRequest\"\n [orderRef] = \"orderRef\"\n [orderStatus] = \"orderStatus\"\n [orderCreated] = \"orderCreated\"\n [orderParty] = \"orderParty\"\n [orderCCDEvent] = \"orderCCDEvent\"\n [orderDetail] = \"orderDetail\"\n [orderFeesTotal] = \"orderFeesTotal\"\n [orderTotalPayments] = \"orderTotalPayments\"\n [orderRemissionTotal] = \"orderRemissionTotal\"\n >\n</ccpay-payment-view>\n</ng-container>\n\n</div>", styles: [".add-remission .button{margin:20px 2px;padding:.5em;font-size:19px;font-weight:200}.add-remission td.govuk-table__cell{width:50%}.add-remission .govuk-button--secondary{background-color:#dee0e2;box-shadow:0 2px #858688;color:#0b0c0c;margin-right:.5em}.add-remission .govuk-warning-text__text,.add-remission .govuk-label--s,.add-remission .hmcts-currency-input__symbol{font-size:19px;font-weight:400}.add-remission .inline-error-class{outline:3px solid #a71414;outline-offset:0;border-color:#a71414}.add-remission .inline-error-message{color:#a71414;border-color:#a71414;font-weight:700;margin-top:10px;font-size:20px}.add-remission .govuk-button,.add-remission .govuk-link{margin-right:1em;font-size:19px;font-weight:200}.add-remission .govuk-button-group{padding-top:2em}.add-remission .heading-medium{margin-top:.875em}.add-remission .heading-large{margin-top:.25em}.add-remission .govuk-panel--confirmation{color:#fff;background:#00703C}.add-remission .govuk-panel__title{font-size:5rem}.add-remission .govuk-body-m,.add-remission .govuk-body{font-size:2.1875rem}.add-remission .govuk-radios__item{clear:initial!important;display:inline-block;width:45%!important}.add-remission .govuk-radios__conditional{padding-top:12px!important}.add-remission .right{float:right;cursor:pointer}.add-remission .radio{float:right}.govuk-input,.govuk-font19px{font-size:19px}.govuk-select{font-size:19px;font-weight:400}.govuk-input--width-10{max-width:50ex}.govuk-label--m{font-size:19px;font-weight:400}.govuk-error-summary__body{font-size:19px!important}.govuk-error-summary__title{font-size:24px!important}.white{color:#fff}.pagesize{margin:2em;width:97%}.pointer{cursor:pointer}.col-18{min-width:18em}.col-6{min-width:6em}.col-8{min-width:8em}.col-1{min-width:1em}.col-25{width:25%!important}.col-24{width:24%!important}.left{text-align:left}.center{text-align:center}.col-60{width:60%;text-align:left}.margin-top--size{margin-top:-30px}.contactDetails-width{width:70%}.right{cursor:pointer}.form-hint{font-size:19px!important}.govuk-panel-border--confirmation{color:#0b0c0c;border:5px solid #00703C}.whitespace-inherit{white-space:inherit!important}.govuk-link{cursor:pointer}\n"] }]
1100
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.Router }, { type: i3.PaymentViewService }, { type: i4.NotificationService }, { type: undefined, decorators: [{
1101
+ type: Inject,
1102
+ args: ['PAYMENT_LIB']
1103
+ }] }, { type: i5.RefundsService }, { type: i0.ChangeDetectorRef }, { type: i6.OrderslistService }]; }, propDecorators: { fee: [{
1104
+ type: Input
1105
+ }], fees: [{
1106
+ type: Input
1107
+ }], payment: [{
1108
+ type: Input
1109
+ }], remission: [{
1110
+ type: Input
1111
+ }], ccdCaseNumber: [{
1112
+ type: Input
1113
+ }], caseType: [{
1114
+ type: Input
1115
+ }], viewCompStatus: [{
1116
+ type: Input
1117
+ }], paymentGroupRef: [{
1118
+ type: Input
1119
+ }], isTurnOff: [{
1120
+ type: Input
1121
+ }], isRefundRemission: [{
1122
+ type: Input
1123
+ }], isStrategicFixEnable: [{
1124
+ type: Input
1125
+ }], paidAmount: [{
1126
+ type: Input
1127
+ }], isFromRefundListPage: [{
1128
+ type: Input
1129
+ }], isFromPaymentDetailPage: [{
1130
+ type: Input
1131
+ }], isFromServiceRequestPage: [{
1132
+ type: Input
1133
+ }], isFullyRefund: [{
1134
+ type: Input,
1135
+ args: ['isFullyRefund']
1136
+ }], feeamount: [{
1137
+ type: Input
1138
+ }], refundPaymentReference: [{
1139
+ type: Input
1140
+ }], isFromRefundStatusPage: [{
1141
+ type: Input
1142
+ }], changeRefundReason: [{
1143
+ type: Input
1144
+ }], isServiceRequest: [{
1145
+ type: Input,
1146
+ args: ["isServiceRequest"]
1147
+ }], LOGGEDINUSERROLES: [{
1148
+ type: Input,
1149
+ args: ['LOGGEDINUSERROLES']
1150
+ }], orderDetail: [{
1151
+ type: Input,
1152
+ args: ['orderDetail']
1153
+ }], orderRef: [{
1154
+ type: Input,
1155
+ args: ['orderRef']
1156
+ }], orderStatus: [{
1157
+ type: Input,
1158
+ args: ['orderStatus']
1159
+ }], orderParty: [{
1160
+ type: Input,
1161
+ args: ['orderParty']
1162
+ }], orderCreated: [{
1163
+ type: Input,
1164
+ args: ['orderCreated']
1165
+ }], orderCCDEvent: [{
1166
+ type: Input,
1167
+ args: ['orderCCDEvent']
1168
+ }], takePayment: [{
1169
+ type: Input,
1170
+ args: ['takepayment']
1171
+ }], orderFeesTotal: [{
1172
+ type: Input,
1173
+ args: ['orderFeesTotal']
1174
+ }], orderTotalPayments: [{
1175
+ type: Input,
1176
+ args: ['orderTotalPayments']
1177
+ }], orderRemissionTotal: [{
1178
+ type: Input,
1179
+ args: ['orderRemissionTotal']
1180
+ }], cancelRemission: [{
1181
+ type: Output
1182
+ }], refundListReason: [{
1183
+ type: Output
1184
+ }], refundListAmount: [{
1185
+ type: Output
1186
+ }], refundFees: [{
1187
+ type: Output
1188
+ }] } });
1189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXJlbWlzc2lvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXltZW50LWxpYi9zcmMvbGliL2NvbXBvbmVudHMvYWRkLXJlbWlzc2lvbi9hZGQtcmVtaXNzaW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BheW1lbnQtbGliL3NyYy9saWIvY29tcG9uZW50cy9hZGQtcmVtaXNzaW9uL2FkZC1yZW1pc3Npb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxXQUFXLEVBQWEsVUFBVSxFQUFFLFdBQVcsRUFBZ0MsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakosT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBSXRGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUV2RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVyRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNyRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUMvRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUFFLGlCQUFp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QkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMsIEZvcm1Db250cm9sLCBSZXF1aXJlZFZhbGlkYXRvciwgRm9ybUFycmF5LCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElGZWUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lGZWUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEFkZFJlbWlzc2lvblJlcXVlc3QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0FkZFJlbWlzc2lvblJlcXVlc3QnO1xuaW1wb3J0IHsgUGF5bWVudFZpZXdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGF5bWVudC12aWV3L3BheW1lbnQtdmlldy5zZXJ2aWNlJztcbmltcG9ydCB0eXBlIHsgUGF5bWVudExpYkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BheW1lbnQtbGliLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IElQYXltZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUGF5bWVudCc7XG5pbXBvcnQgeyBSZWZ1bmRzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlZnVuZHMvcmVmdW5kcy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSVJlZnVuZFJlYXNvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lSZWZ1bmRSZWFzb25zJztcbmltcG9ydCB7IEFkZFJldHJvUmVtaXNzaW9uUmVxdWVzdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQWRkUmV0cm9SZW1pc3Npb25SZXF1ZXN0JztcbmltcG9ydCB7IElSZWZ1bmRDb250YWN0RGV0YWlscyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVJlZnVuZENvbnRhY3REZXRhaWxzJztcbmltcG9ydCB7IFBvc3RSZWZ1bmRSZXRyb1JlbWlzc2lvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvUG9zdFJlZnVuZFJldHJvUmVtaXNzaW9uJztcbmltcG9ydCB7IFBvc3RJc3N1ZVJlZnVuZFJldHJvUmVtaXNzaW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9Qb3N0SXNzdWVSZWZ1bmRSZXRyb1JlbWlzc2lvbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSVJlbWlzc2lvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVJlbWlzc2lvbic7XG5pbXBvcnQgeyBPcmRlcnNsaXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL29yZGVyc2xpc3Quc2VydmljZSc7XG5pbXBvcnQgeyBJUGF5bWVudEdyb3VwIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUGF5bWVudEdyb3VwJztcbmltcG9ydCB7IFBheW1lbnRWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vcGF5bWVudC12aWV3L3BheW1lbnQtdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNlcnZpY2VSZXF1ZXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VydmljZS1yZXF1ZXN0L3NlcnZpY2UtcmVxdWVzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uUHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4uL25vdGlmaWNhdGlvbi1wcmV2aWV3L25vdGlmaWNhdGlvbi1wcmV2aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDY2RIeXBoZW5zUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL2NjZC1oeXBoZW5zLnBpcGUnO1xuaW1wb3J0IHsgQ2FwaXRhbGl6ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9jYXBpdGFsaXplLnBpcGUnO1xuaW1wb3J0IHsgQ29udGFjdERldGFpbHNDb21wb25lbnQgfSBmcm9tICcuLi9jb250YWN0LWRldGFpbHMvY29udGFjdC1kZXRhaWxzLmNvbXBvbmVudCc7XG5cbmNvbnN0IEJTX0VOQUJMRV9GTEFHID0gJ2J1bGstc2Nhbi1lbmFibGluZy1mZSc7XG5jb25zdCByZXNvbHZlZFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NjcGF5LWFkZC1yZW1pc3Npb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vYWRkLXJlbWlzc2lvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FkZC1yZW1pc3Npb24uY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiAnQUREX1JFTUlTU0lPTicsIHVzZUV4aXN0aW5nOiBBZGRSZW1pc3Npb25Db21wb25lbnQgfV0sXG4gIGltcG9ydHM6IFtcbiAgICBmb3J3YXJkUmVmKCgpID0+IFBheW1lbnRWaWV3Q29tcG9uZW50KSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgZm9yd2FyZFJlZigoKSA9PiBTZXJ2aWNlUmVxdWVzdENvbXBvbmVudCksXG4gICAgZm9yd2FyZFJlZigoKSA9PiBOb3RpZmljYXRpb25QcmV2aWV3Q29tcG9uZW50KSxcbiAgICBmb3J3YXJkUmVmKCgpID0+IENvbnRhY3REZXRhaWxzQ29tcG9uZW50KSxcbiAgICBDY2RIeXBoZW5zUGlwZSxcbiAgICBDYXBpdGFsaXplUGlwZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgQWRkUmVtaXNzaW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZmVlOiBJRmVlO1xuICBASW5wdXQoKSBmZWVzOiBhbnlbXTtcbiAgQElucHV0KCkgcGF5bWVudDogSVBheW1lbnQ7XG4gIEBJbnB1dCgpIHJlbWlzc2lvbjogSVJlbWlzc2lvbjtcbiAgQElucHV0KCkgY2NkQ2FzZU51bWJlcjogc3RyaW5nO1xuICBASW5wdXQoKSBjYXNlVHlwZTogc3RyaW5nO1xuICBASW5wdXQoKSB2aWV3Q29tcFN0YXR1czogc3RyaW5nO1xuICBASW5wdXQoKSBwYXltZW50R3JvdXBSZWY6IHN0cmluZztcbiAgQElucHV0KCkgaXNUdXJuT2ZmOiBib29sZWFuO1xuICBASW5wdXQoKSBpc1JlZnVuZFJlbWlzc2lvbjogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNTdHJhdGVnaWNGaXhFbmFibGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHBhaWRBbW91bnQ6IGFueTtcbiAgQElucHV0KCkgaXNGcm9tUmVmdW5kTGlzdFBhZ2U6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzRnJvbVBheW1lbnREZXRhaWxQYWdlOiBib29sZWFuO1xuICBASW5wdXQoKSBpc0Zyb21TZXJ2aWNlUmVxdWVzdFBhZ2U6IGJvb2xlYW47XG4gIEBJbnB1dCgnaXNGdWxseVJlZnVuZCcpIGlzRnVsbHlSZWZ1bmQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGZlZWFtb3VudDogbnVtYmVyO1xuICBASW5wdXQoKSByZWZ1bmRQYXltZW50UmVmZXJlbmNlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlzRnJvbVJlZnVuZFN0YXR1c1BhZ2U6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNoYW5nZVJlZnVuZFJlYXNvbjogc3RyaW5nO1xuICBASW5wdXQoXCJpc1NlcnZpY2VSZXF1ZXN0XCIpIGlzU2VydmljZVJlcXVlc3Q6IHN0cmluZztcbiAgQElucHV0KCdMT0dHRURJTlVTRVJST0xFUycpIExPR0dFRElOVVNFUlJPTEVTOiBzdHJpbmdbXTtcbiAgQElucHV0KCdvcmRlckRldGFpbCcpIG9yZGVyRGV0YWlsOiBhbnlbXTtcbiAgQElucHV0KCdvcmRlclJlZicpIG9yZGVyUmVmOiBzdHJpbmc7XG4gIEBJbnB1dCgnb3JkZXJTdGF0dXMnKSBvcmRlclN0YXR1czogc3RyaW5nO1xuICBASW5wdXQoJ29yZGVyUGFydHknKSBvcmRlclBhcnR5OiBzdHJpbmc7XG4gIEBJbnB1dCgnb3JkZXJDcmVhdGVkJykgb3JkZXJDcmVhdGVkOiBEYXRlO1xuICBASW5wdXQoJ29yZGVyQ0NERXZlbnQnKSBvcmRlckNDREV2ZW50OiBzdHJpbmc7XG4gIEBJbnB1dCgndGFrZXBheW1lbnQnKSB0YWtlUGF5bWVudDogYm9vbGVhbjtcbiAgQElucHV0KCdvcmRlckZlZXNUb3RhbCcpIG9yZGVyRmVlc1RvdGFsOiBudW1iZXI7XG4gIEBJbnB1dCgnb3JkZXJUb3RhbFBheW1lbnRzJykgb3JkZXJUb3RhbFBheW1lbnRzOiBudW1iZXI7XG4gIEBJbnB1dCgnb3JkZXJSZW1pc3Npb25Ub3RhbCcpIG9yZGVyUmVtaXNzaW9uVG90YWw6IG51bWJlcjtcbiAgQE91dHB1dCgpIGNhbmNlbFJlbWlzc2lvbjogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvL0BPdXRwdXQoKSByZWZ1bmRMaXN0UmVhc29uOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoe3JlYXNvbjpzdHJpbmcsIGNvZGU6c3RyaW5nfSk7XG4gIEBPdXRwdXQoKSByZWZ1bmRMaXN0UmVhc29uID0gbmV3IEV2ZW50RW1pdHRlcjx7IHJlYXNvbjogc3RyaW5nLCBjb2RlOiBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIHJlZnVuZExpc3RBbW91bnQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcmVmdW5kRmVlczogRXZlbnRFbWl0dGVyPElGZWVbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPElGZWVbXT4oKTtcbiAgcmVmdW5kID0ge1xuICAgIHJlYXNvbjoge1xuICAgICAgZHVwbGljYXRlOiAnRHVwbGljYXRlIHBheW1lbnQnLFxuICAgICAgaHVtYW5lcnJvcjogJ0h1bWFuIGVycm9yJyxcbiAgICAgIGNhc2VXaXRoZHJhd246ICdDYXNlIHdpdGhkcmF3bicsXG4gICAgICBvdGhlcjogJ090aGVyJ1xuICAgIH1cbiAgfVxuICBjb250YWN0RGV0YWlsc09iajogSVJlZnVuZENvbnRhY3REZXRhaWxzO1xuICBub3RpZmljYXRpb246IGFueTtcbiAgcmVtaXNzaW9uRm9ybTogRm9ybUdyb3VwO1xuICBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgdmlld1N0YXR1cyA9ICdtYWluJztcbiAgZXJyb3JNZXNzYWdlID0gbnVsbDtcbiAgb3B0aW9uOiBzdHJpbmcgPSBudWxsO1xuICBpc0NvbmZpcm1hdGlvbkJ0bkRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGJzUGF5bWVudERjbk51bWJlcjogc3RyaW5nO1xuICBzZWxlY3RlZFZhbHVlID0gJ3llcyc7XG4gIGFtb3VudDogYW55O1xuICByZXRyb1JlbWlzc2lvbjogYm9vbGVhbiA9IGZhbHNlO1xuICByZW1pc3Npb25SZWZlcmVuY2U6IHN0cmluZyA9ICcnO1xuICByZWZ1bmRSZWZlcmVuY2U6IHN0cmluZztcbiAgcmVmdW5kQW1vdW50OiBzdHJpbmc7XG4gIHBheW1lbnRFeHBsYW5hdGlvbkhhc0Vycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIHJlZnVuZFJlYXNvbjogc3RyaW5nO1xuICBzZWxlY3RlZFJlZnVuZFJlYXNvbjogc3RyaW5nO1xuICBzZWxlY3RlZFJlZnVuZFJlYXNvbkNvZGU6IHN0cmluZztcbiAgZGlzcGxheVJlZnVuZFJlYXNvbjogc3RyaW5nO1xuICByZWZ1bmRDb2RlOiBzdHJpbmc7XG4gIHJlbWVzc2lvblBheW1lbnQ6IElQYXltZW50O1xuICBpc1JlbWlzc2lvbkNvZGVFbXB0eTogYm9vbGVhbiA9IGZhbHNlO1xuICByZW1pc3Npb25Db2RlSGFzRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNBbW91bnRFbXB0eTogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1JlYXNvbkVtcHR5OiBib29sZWFuID0gZmFsc2U7XG4gIGFtb3VudEhhc0Vycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIGlzUmVtaXNzaW9uTGVzc1RoYW5GZWVFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICByZWZ1bmRIYXNFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1BheW1lbnRTdWNjZXNzOiBib29sZWFuID0gZmFsc2U7XG4gIGlzUmVtaXNzaW9uQXBwbGllZDogYm9vbGVhbiA9IGZhbHNlO1xuICByZW1pc3Npb25hbXQ6IG51bWJlcjtcbiAgZWxlbWVudElkOiBhbnk7XG4gIC8vIHJlZnVuZFJlYXNvbnM6IGFueVtdID0gW107XG4gIGNvbW1vblJlZnVuZFJlYXNvbnM6IGFueVtdID0gW107XG4gIHNob3dSZWFzb25UZXh0OiBib29sZWFuO1xuICBpc1JlZnVuZFJlYXNvbnNTZWxlY3RlZDogYm9vbGVhbjtcbiAgZGVmYXVsdDogc3RyaW5nO1xuICByZWFzb25MZW5ndGg6IG51bWJlcjtcbiAgcmVmdW5kUmVhc29uczogSVJlZnVuZFJlYXNvbnNbXTtcbiAgcGF0dGVybjE6IHN0cmluZztcbiAgcGF0dGVybjI6IHN0cmluZztcbiAgc2VuZE9yZGVyRGV0YWlsOiBhbnlbXTtcbiAgc2VuZE9yZGVyUmVmOiBzdHJpbmc7XG4gIHBheW1lbnRSZWZlcmVuY2U6IHN0cmluZztcbiAgY2xhc3MgPSAnJztcbiAgZXJyb3JNc2cgPSBuZXcgQXJyYXkoKTtcbiAgdG90YWxSZWZ1bmRBbW91bnQ6IG51bWJlcjtcbiAgcXVhbnRpdHlVcGRhdGVkOiBudW1iZXI7XG4gIGZ1bGxSZWZ1bmQ6IGJvb2xlYW47XG4gIGFsbG93ZWRSZWZ1bmRBbW91bnQ6IG51bWJlcjtcbiAgaXNSZW1pc3Npb25zTWF0Y2g6IGJvb2xlYW47XG4gIHBheW1lbnRGZWVzOiBJRmVlW107XG4gIHBheW1lbnRHcm91cDogSVBheW1lbnRHcm91cDtcbiAgaXNTdGF0dXNBbGxvY2F0ZWQ6IGJvb2xlYW47XG4gIGlzRnJvbUNoZWNrQW5zUGFnZTogYm9vbGVhbjtcbiAgcmVmdW5kQW10Rm9yRmVlVm9sdW1lczogbnVtYmVyO1xuICBwYXltZW50T2JqOiBJUGF5bWVudDtcbiAgdGVtcGxhdGVJbnN0cnVjdGlvblR5cGU6IHN0cmluZztcbiAgbm90aWZpY2F0aW9uUHJldmlldzogYm9vbGVhbjtcblxuICBjb21wb25lbnQ6IHsgYWNjb3VudF9udW1iZXI6IHN0cmluZzsgYW1vdW50OiBudW1iZXI7IGNhc2VfcmVmZXJlbmNlOiBzdHJpbmc7IGNjZF9jYXNlX251bWJlcjogc3RyaW5nOyBjaGFubmVsOiBzdHJpbmc7IGN1cnJlbmN5OiBzdHJpbmc7IGN1c3RvbWVyX3JlZmVyZW5jZTogc3RyaW5nOyBkYXRlX2NyZWF0ZWQ6IHN0cmluZzsgZGF0ZV91cGRhdGVkOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IG1ldGhvZDogc3RyaW5nOyBvcmdhbmlzYXRpb25fbmFtZTogc3RyaW5nOyBwYXltZW50X2FsbG9jYXRpb246IGFueVtdOyByZWZlcmVuY2U6IHN0cmluZzsgc2VydmljZV9uYW1lOiBzdHJpbmc7IHNpdGVfaWQ6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmc7IH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHBheW1lbnRWaWV3U2VydmljZTogUGF5bWVudFZpZXdTZXJ2aWNlLFxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSxcbiAgICBASW5qZWN0KCdQQVlNRU5UX0xJQicpIHByaXZhdGUgcGF5bWVudExpYkNvbXBvbmVudDogUGF5bWVudExpYkNvbXBvbmVudCxcbiAgICBwcml2YXRlIHJlZnVuZFNlcnZpY2U6IFJlZnVuZHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgT3JkZXJzbGlzdFNlcnZpY2U6IE9yZGVyc2xpc3RTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JNc2cgPSBbXTtcbiAgICB0aGlzLmRlZmF1bHQgPSAnU2VsZWN0IGEgZGlmZmVyZW50IHJlYXNvbic7XG4gICAgdGhpcy5wYXR0ZXJuMSA9ICdeKFthLXpBLVowLTldezN9KS0oW2EtekEtWjAtOV17M30pLShbYS16QS1aMC05XXszfSkkJztcbiAgICB0aGlzLnBhdHRlcm4yID0gJ14oW0EtWmEtel17Mn1bMC05XXsyfSktKFswLTldezZ9KSQnO1xuICAgIGlmICh0aGlzLnZpZXdDb21wU3RhdHVzICE9PSAnJyAmJiB0aGlzLnZpZXdDb21wU3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmlld1N0YXR1cyA9ICcnO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZW1pc3Npb24pIHtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmVlKSB7XG4gICAgICB0aGlzLmFtb3VudCA9ICh0aGlzLmZlZS52b2x1bWUgKiB0aGlzLmZlZS5jYWxjdWxhdGVkX2Ftb3VudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGF5bWVudCkge1xuICAgICAgdGhpcy5wYXltZW50UmVmZXJlbmNlID0gdGhpcy5wYXltZW50LnJlZmVyZW5jZTtcbiAgICAgIHRoaXMucmVtZXNzaW9uUGF5bWVudCA9IHRoaXMucGF5bWVudDtcbiAgICAgIGlmICh0aGlzLnBheW1lbnQuc3RhdHVzID09PSAnU3VjY2VzcycpIHtcbiAgICAgICAgdGhpcy5pc1BheW1lbnRTdWNjZXNzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vcHRpb24gPSB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuU0VMRUNURURfT1BUSU9OO1xuICAgIHRoaXMuYnNQYXltZW50RGNuTnVtYmVyID0gdGhpcy5wYXltZW50TGliQ29tcG9uZW50LmJzcGF5bWVudGRjbjtcbiAgICB0aGlzLnJlbWlzc2lvbkZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHJlbWlzc2lvbkNvZGU6IG5ldyBGb3JtQ29udHJvbCgnJyxcbiAgICAgICAgVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgICAgIFZhbGlkYXRvcnMucGF0dGVybihgKCR7dGhpcy5wYXR0ZXJuMX0pfCgke3RoaXMucGF0dGVybjJ9KWApXG4gICAgICAgIF0pXG4gICAgICApLFxuICAgICAgYW1vdW50OiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgIFZhbGlkYXRvcnMucGF0dGVybignXlswLTldKyhcXC5bMC05XXsxLDJ9KT8kJylcbiAgICAgIF0pKSxcbiAgICAgIHJlZnVuZFJlYXNvbjogbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSksXG4gICAgICByZWZ1bmRERFJlYXNvbjogbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSksXG4gICAgICByZWFzb246IG5ldyBGb3JtQ29udHJvbCgpLFxuICAgICAgZmVlQW1vdW50OiBuZXcgRm9ybUNvbnRyb2woKSxcbiAgICAgIGZlZXNMaXN0OiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtdKVxuICAgIH0pO1xuICAgIGNvbnN0IHJlbWlzc2lvbmN0cmxzID0gdGhpcy5yZW1pc3Npb25Gb3JtLmNvbnRyb2xzO1xuICAgIHJlbWlzc2lvbmN0cmxzWydyZWZ1bmRERFJlYXNvbiddLnNldFZhbHVlKCdTZWxlY3QgYSBkaWZmZXJlbnQgcmVhc29uJywgeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICBpZiAodGhpcy5yZWZ1bmRQYXltZW50UmVmZXJlbmNlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yZWZ1bmRQYXltZW50UmVmZXJlbmNlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucGF5bWVudFJlZmVyZW5jZSA9IHRoaXMucmVmdW5kUGF5bWVudFJlZmVyZW5jZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBheW1lbnRSZWZlcmVuY2UgPSAodGhpcy5wYXltZW50ICE9PSB1bmRlZmluZWQpID8gdGhpcy5wYXltZW50LnJlZmVyZW5jZSA6ICcnO1xuICAgIH1cblxuXG4gICAgaWYgKHRoaXMuaXNGcm9tU2VydmljZVJlcXVlc3RQYWdlKSB7XG4gICAgICB0aGlzLnBheW1lbnRWaWV3U2VydmljZS5nZXRBcHBvcnRpb25QYXltZW50RGV0YWlscyh0aGlzLnBheW1lbnRSZWZlcmVuY2UpLnN1YnNjcmliZShcbiAgICAgICAgcGF5bWVudEdyb3VwID0+IHtcbiAgICAgICAgICBsZXQgZmVlcyA9IFtdO1xuICAgICAgICAgIHBheW1lbnRHcm91cC5mZWVzLmZvckVhY2goZmVlID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNSZW1pc3Npb25zTWF0Y2ggPSBmYWxzZTtcblxuICAgICAgICAgICAgcGF5bWVudEdyb3VwLnJlbWlzc2lvbnMuZm9yRWFjaChyZW0gPT4ge1xuICAgICAgICAgICAgICBpZiAocmVtLmZlZV9jb2RlID09PSBmZWUuY29kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNSZW1pc3Npb25zTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZlZVsncmVtaXNzaW9ucyddID0gcmVtO1xuICAgICAgICAgICAgICAgIGZlZXMucHVzaChmZWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1JlbWlzc2lvbnNNYXRjaCkge1xuICAgICAgICAgICAgICBmZWVzLnB1c2goZmVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXltZW50R3JvdXAuZmVlcyA9IGZlZXNcbiAgICAgICAgICB0aGlzLnBheW1lbnRGZWVzID0gZmVlcztcbiAgICAgICAgICB0aGlzLmZlZXMgPSBmZWVzO1xuICAgICAgICAgIHRoaXMucGF5bWVudEdyb3VwID0gcGF5bWVudEdyb3VwO1xuXG4gICAgICAgICAgdGhpcy5wYXltZW50R3JvdXAucGF5bWVudHMgPSB0aGlzLnBheW1lbnRHcm91cC5wYXltZW50cy5maWx0ZXJcbiAgICAgICAgICAgIChwYXltZW50R3JvdXBPYmogPT4gcGF5bWVudEdyb3VwT2JqWydyZWZlcmVuY2UnXS5pbmNsdWRlcyh0aGlzLnBheW1lbnRMaWJDb21wb25lbnQucGF5bWVudFJlZmVyZW5jZSkpO1xuICAgICAgICAgIC8vIGNvbnN0IHBheW1lbnRBbGxvY2F0aW9uID0gdGhpcy5wYXltZW50R3JvdXAucGF5bWVudHNbMF0ucGF5bWVudF9hbGxvY2F0aW9uO1xuICAgICAgICAgIC8vIHRoaXMuaXNTdGF0dXNBbGxvY2F0ZWQgPSBwYXltZW50QWxsb2NhdGlvbi5sZW5ndGggPiAwICYmIHBheW1lbnRBbGxvY2F0aW9uWzBdLmFsbG9jYXRpb25fc3RhdHVzID09PSAnQWxsb2NhdGVkJyB8fCBwYXltZW50QWxsb2NhdGlvbi5sZW5ndGggPT09IDA7XG4gICAgICAgICAgdGhpcy5yZWZ1bmRGZWVzTGlzdCgpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyb3I6IGFueSkgPT4gdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvclxuICAgICAgKTtcbiAgICB9XG5cblxuICAgIGlmICh0aGlzLmZlZXMgJiYgdGhpcy52aWV3Q29tcFN0YXR1cyA9PT0gJ2lzc3VlcmVmdW5kJykge1xuICAgICAgdGhpcy5yZWZ1bmRGZWVzTGlzdCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZpZXdDb21wU3RhdHVzID09PSAnJykge1xuICAgICAgdGhpcy52aWV3U3RhdHVzID0gJ21haW4nO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZpZXdDb21wU3RhdHVzID09PSAnaXNzdWVyZWZ1bmRwYWdlMScpIHtcbiAgICAgIHRoaXMucmVmdW5kU2VydmljZS5nZXRSZWZ1bmRSZWFzb25zKCkuc3Vic2NyaWJlKFxuICAgICAgICByZWZ1bmRSZWFzb25zID0+IHtcbiAgICAgICAgICB0aGlzLnJlZnVuZFJlYXNvbnMgPSByZWZ1bmRSZWFzb25zLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5yZWNlbnRseV91c2VkID09PSBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5yZWZ1bmRSZWFzb25zID0gdGhpcy5yZWZ1bmRSZWFzb25zLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5uYW1lICE9PSAnUmV0cm9zcGVjdGl2ZSByZW1pc3Npb24nICYmIGRhdGEubmFtZSAhPT0gJ092ZXJwYXltZW50Jyk7XG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgdGhpcy5jb21tb25SZWZ1bmRSZWFzb25zID0gcmVmdW5kUmVhc29ucy5maWx0ZXIoKGRhdGEpID0+IGRhdGEucmVjZW50bHlfdXNlZCA9PT0gdHJ1ZSk7XG4gICAgICAgICAgdGhpcy5jb21tb25SZWZ1bmRSZWFzb25zLnNvcnQoKGEsIGIpID0+IGEudG9TdHJpbmcoKS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB0aGlzLnJlZnVuZFJlYXNvbiA9IHRoaXMuY2hhbmdlUmVmdW5kUmVhc29uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZpZXdDb21wU3RhdHVzID09PSAncHJvY2Vzc3JldHJvcmVtaXNzb25wYWdlJyAmJiB0aGlzLmlzRnJvbVJlZnVuZExpc3RQYWdlKSB7XG4gICAgICB0aGlzLnZpZXdTdGF0dXMgPSAncHJvY2Vzc3JldHJvcmVtaXNzb25wYWdlJztcbiAgICB9XG4gICAgaWYgKHRoaXMub3JkZXJEZXRhaWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5wYXltZW50Vmlld1NlcnZpY2UuZ2V0QXBwb3J0aW9uUGF5bWVudERldGFpbHModGhpcy5vcmRlckRldGFpbFswXS5wYXltZW50c1swXS5yZWZlcmVuY2UpLnN1YnNjcmliZShcbiAgICAgICAgcGF5bWVudEdyb3VwID0+IHtcbiAgICAgICAgICB0aGlzLmZlZXMgPSBwYXltZW50R3JvdXAuZmVlcztcbiAgICAgICAgICB0aGlzLnBheW1lbnRSZWZlcmVuY2UgPSBwYXltZW50R3JvdXAucGF5bWVudHNbMF0ucmVmZXJlbmNlO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyb3I6IGFueSkgPT4gdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvclxuICAgICAgKTtcbiAgICB9XG5cbiAgfVxuICBnb1RvUGF5bWVudFZpZXdDb21wb25lbnQoKSB7XG4gICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LnBheW1lbnRNZXRob2QgPSB0aGlzLnBheW1lbnQubWV0aG9kO1xuICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5wYXltZW50R3JvdXBSZWZlcmVuY2UgPSB0aGlzLnBheW1lbnRHcm91cFJlZjtcbiAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQucGF5bWVudFJlZmVyZW5jZSA9IHRoaXMucGF5bWVudFJlZmVyZW5jZTtcbiAgICAvL3RoaXMuUGF5bWVudFZpZXdDb21wb25lbnQudmlld0NvbXBTdGF0dXMgPSAnb3ZlcnBheW1lbnQnO1xuICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC52aWV3TmFtZSA9ICdwYXltZW50LXZpZXcnO1xuICB9XG4gIHJlZnVuZEZlZXNMaXN0KCkge1xuICAgIGNvbnN0IGNyZWRzID0gdGhpcy5yZW1pc3Npb25Gb3JtLmNvbnRyb2xzLmZlZXNMaXN0IGFzIEZvcm1BcnJheTtcbiAgICAvLyBpZihjcmVkcy5jb250cm9scy5sZW5ndGggPiAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZlZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNyZWRzLnB1c2godGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgIGlkOiB0aGlzLmZlZXNbaV0uaWQsXG4gICAgICAgIGNvZGU6IHRoaXMuZmVlc1tpXS5jb2RlLFxuICAgICAgICB2b2x1bWU6IHRoaXMuZmVlc1tpXS52b2x1bWUsXG4gICAgICAgIGNhbGN1bGF0ZWRfYW1vdW50OiB0aGlzLmZlZXNbaV0uY2FsY3VsYXRlZF9hbW91bnQsXG4gICAgICAgIGFwcG9ydGlvbl9hbW91bnQ6IHRoaXMuZmVlc1tpXS5hcHBvcnRpb25fYW1vdW50LFxuICAgICAgICBjY2RfY2FzZV9udW1iZXI6IHRoaXMuZmVlc1tpXS5jY2RfY2FzZV9udW1iZXIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmZlZXNbaV0uZGVzY3JpcHRpb24sXG4gICAgICAgIG5ldF9hbW91bnQ6IHRoaXMuZmVlc1tpXS5uZXRfYW1vdW50LFxuICAgICAgICB2ZXJzaW9uOiB0aGlzLmZlZXNbaV0udmVyc2lvbixcbiAgICAgICAgcmVmdW5kX2Ftb3VudDogWycnXSxcbiAgICAgICAgc2VsZWN0ZWQ6IFsnJ10sXG4gICAgICAgIHVwZGF0ZWRfdm9sdW1lOiB0aGlzLmZlZXNbaV0udm9sdW1lXG4gICAgICB9KSk7XG4gICAgfVxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIC8vfVxuICB9XG5cbiAgZ2V0IGZlZXNMaXN0KCkge1xuICAgIGNvbnN0IGRkID0gdGhpcy5yZW1pc3Npb25Gb3JtLmdldCgnZmVlc0xpc3QnKSBhcyBGb3JtQXJyYXk7XG4gICAgcmV0dXJuIHRoaXMucmVtaXNzaW9uRm9ybS5nZXQoJ2ZlZXNMaXN0JykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgbm9uZVNlbGVjdGVkKCkge1xuICAgIGlmICh0aGlzLmlzRnVsbHlSZWZ1bmQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLmZlZXNMaXN0LmNvbnRyb2xzLnNvbWUoaXRlbSA9PiBpdGVtLmdldCgnc2VsZWN0ZWQnKS52YWx1ZSA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgdGhpcy5lcnJvck1zZyA9IFtdO1xuICAgICAgICBbXS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQnKSwgZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnaW5saW5lLWVycm9yLWNsYXNzJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuICF0aGlzLmZlZXNMaXN0LmNvbnRyb2xzLnNvbWUoaXRlbSA9PiBpdGVtLmdldCgnc2VsZWN0ZWQnKS52YWx1ZSA9PT0gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tfZW4oaSwgdjE6IGFueSwgQXBwQW10LCBWb2x1bWUpIHtcbiAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2MSkgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLnJlbWlzc2lvbkZvcm0uY29udHJvbHMuZmVlc0xpc3QgYXMgRm9ybUFycmF5O1xuXG4gICAgaWYgKGVsZS5jaGVja2VkKSB7XG4gICAgICBmb3JtQXJyYXkuYXQoaSkuZ2V0KCdyZWZ1bmRfYW1vdW50Jykuc2V0VmFsdWUoQXBwQW10KTtcbiAgICAgIGZvcm1BcnJheS5hdChpKS5nZXQoJ3ZvbHVtZScpLnNldFZhbHVlKFZvbHVtZSk7XG4gICAgICBmb3JtQXJyYXkuYXQoaSkuZ2V0KCdzZWxlY3RlZCcpLnNldFZhbHVlKHRydWUpO1xuICAgICAgZm9ybUFycmF5LmF0KGkpLmdldCgndXBkYXRlZF92b2x1bWUnKS5zZXRWYWx1ZShWb2x1bWUpO1xuICAgICAgKDxIVE1MSW5wdXRFbGVtZW50PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmZWVBbW91bnRfJyArIHYxKSkudmFsdWUgPSBBcHBBbXQ7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmVlQW1vdW50XycgKyB2MSkucmVtb3ZlQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICBpZiAoVm9sdW1lID09PSAxKSB7XG4gICAgICAgICg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnVm9sdW1lVXBkYXRlZF8nICsgdjEpKS52YWx1ZSA9IFZvbHVtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmVlVm9sdW1lVXBkYXRlZF8nICsgdjEpKS52YWx1ZSA9IFZvbHVtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmZWVWb2x1bWVVcGRhdGVkXycgKyB2MSkgIT09IG51bGwpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZlZUFtb3VudF8nICsgdjEpLnJlbW92ZUF0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmVlVm9sdW1lVXBkYXRlZF8nICsgdjEpLnJlbW92ZUF0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3JNc2cgPSBbXTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmZWVBbW91bnRfJyArIHYxKS5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcInRydWVcIik7XG4gICAgICB0aGlzLnJlbWlzc2lvbkZvcm0udmFsdWUuZmVlc0xpc3RbaV1bXCJyZWZ1bmRfYW1vdW50XCJdID0gJyc7XG4gICAgICB0aGlzLnJlbWlzc2lvbkZvcm0udmFsdWUuZmVlc0xpc3RbaV1bXCJ2b2x1bWVcIl0gPSAnJztcbiAgICAgIHRoaXMucmVtaXNzaW9uRm9ybS52YWx1ZS5mZWVzTGlzdFtpXVtcInNlbGVjdGVkXCJdID0gZmFsc2U7XG4gICAgICAoPEhUTUxJbnB1dEVsZW1lbnQ+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZlZUFtb3VudF8nICsgdjEpKS52YWx1ZSA9ICcnO1xuICAgICAgaWYgKFZvbHVtZSA+IDEpIHtcbiAgICAgICAgdGhpcy5yZW1pc3Npb25Gb3JtLnZhbHVlLmZlZXNMaXN0W2ldW1widm9sdW1lXCJdID0gJyc7XG4gICAgICAgICg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmVlVm9sdW1lVXBkYXRlZF8nICsgdjEpKS52YWx1ZSA9ICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZlZVZvbHVtZVVwZGF0ZWRfJyArIHYxKSAhPT0gbnVsbCkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmVlVm9sdW1lVXBkYXRlZF8nICsgdjEpLnJlbW92ZUF0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cblxuICBhZGRSZW1pc3Npb24oKSB7XG4gICAgdGhpcy5yZXNldFJlbWlzc2lvbkZvcm0oW2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2VdLCAnQWxsJyk7XG4gICAgY29uc3QgcmVtaXNzaW9uY3RybHMgPSB0aGlzLnJlbWlzc2lvbkZvcm0uY29udHJvbHMsXG4gICAgICBpc1JlbWlzc2lvbkxlc3NUaGFuRmVlID0gdGhpcy5mZWUuY2FsY3VsYXRlZF9hbW91bnQgPiByZW1pc3Npb25jdHJscy5hbW91bnQudmFsdWU7XG4gICAgdGhpcy5yZW1pc3Npb25Gb3JtLmNvbnRyb2xzWydyZWZ1bmRSZWFzb24nXS5zZXRFcnJvcnMobnVsbCk7XG4gICAgdGhpcy5yZW1pc3Npb25Gb3JtLmNvbnRyb2xzWydyZWZ1bmRERFJlYXNvbiddLnNldEVycm9ycyhudWxsKTtcbiAgICBpZiAodGhpcy5yZW1pc3Npb25Gb3JtLmRpcnR5ICYmIHRoaXMucmVtaXNzaW9uRm9ybS52YWxpZCAmJiBpc1JlbWlzc2lvbkxlc3NUaGFuRmVlKSB7XG4gICAgICB0aGlzLnZpZXdTdGF0dXMgPSAnY29uZmlybWF0aW9uJztcbiAgICB9IGVsc2Uge1xuXG4gICAgICBpZiAocmVtaXNzaW9uY3RybHNbJ3JlbWlzc2lvbkNvZGUnXS52YWx1ZSA9PSAnJykge1xuICAgICAgICB0aGlzLnJlc2V0UmVtaXNzaW9uRm9ybShbdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlXSwgJ3JlbWlzc2lvbkNvZGUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZW1pc3Npb25jdHJsc1sncmVtaXNzaW9uQ29kZSddLnZhbHVlICE9ICcnICYmIHJlbWlzc2lvbmN0cmxzWydyZW1pc3Npb25Db2RlJ10uaW52YWxpZCkge1xuICAgICAgICB0aGlzLnJlc2V0UmVtaXNzaW9uRm9ybShbZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlXSwgJ3JlbWlzc2lvbkNvZGUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZW1pc3Npb25jdHJsc1snYW1vdW50J10udmFsdWUgPT0gJycpIHtcbiAgICAgICAgdGhpcy5yZXNldFJlbWlzc2lvbkZvcm0oW2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZV0sICdhbW91bnQnKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZW1pc3Npb25jdHJsc1snYW1vdW50J10udmFsdWUgIT0gJycgJiYgcmVtaXNzaW9uY3RybHNbJ2Ftb3VudCddLmludmFsaWQpIHtcbiAgICAgICAgdGhpcy5yZXNldFJlbWlzc2lvbkZvcm0oW2ZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlXSwgJ2Ftb3VudCcpO1xuICAgICAgfVxuICAgICAgaWYgKHJlbWlzc2lvbmN0cmxzLmFtb3VudC52YWxpZCAmJiAhaXNSZW1pc3Npb25MZXNzVGhhbkZlZSkge1xuICAgICAgICB0aGlzLnJlc2V0UmVtaXNzaW9uRm9ybShbZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlXSwgJ2Ftb3VudCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbmZpcm1SZW1pc3Npb24oKSB7XG4gICAgdGhpcy5pc0NvbmZpcm1hdGlvbkJ0bkRpc2FibGVkID0gdHJ1ZTtcbiAgICBjb25zdCBuZXdOZXRBbW91bnQgPSB0aGlzLnJlbWlzc2lvbkZvcm0uY29udHJvbHMuYW1vdW50LnZhbHVlLFxuICAgICAgcmVtaXNzaW9uQW1vdW50ID0gdGhpcy5mZWUubmV0X2Ftb3VudCAtIG5ld05ldEFtb3VudCxcbiAgICAgIHJlcXVlc3RCb2R5ID0gbmV3IEFkZFJlbWlzc2lvblJlcXVlc3RcbiAgICAgICAgKHRoaXMuY2NkQ2FzZU51bWJlciwgdGhpcy5mZWUsIHJlbWlzc2lvbkFtb3VudCwgdGhpcy5yZW1pc3Npb25Gb3JtLmNvbnRyb2xzLnJlbWlzc2lvbkNvZGUudmFsdWUsIHRoaXMuY2FzZVR5cGUpO1xuICAgIHRoaXMucGF5bWVudFZpZXdTZXJ2aWNlLnBvc3RQYXltZW50R3JvdXBXaXRoUmVtaXNzaW9ucyhkZWNvZGVVUklDb21wb25lbnQodGhpcy5wYXltZW50R3JvdXBSZWYpLnRyaW0oKSwgdGhpcy5mZWUuaWQsIHJlcXVlc3RCb2R5KS5zdWJzY3JpYmUoXG4gICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgIGlmIChKU09OLnBhcnNlKHJlc3BvbnNlKS5zdWNjZXNzKSB7XG4gICAgICAgICAgbGV0IExEVXJsID0gdGhpcy5pc1R1cm5PZmYgPyAnJmlzVHVybk9mZj1FbmFibGUnIDogJyZpc1R1cm5PZmY9RGlzYWJsZSdcbiAgICAgICAgICBMRFVybCArPSBgJmNhc2VUeXBlPSR7dGhpcy5jYXNlVHlwZX1gXG4gICAgICAgICAgaWYgKHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5ic3BheW1lbnRkY24pIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLnJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRSZXVzZVJvdXRlID0gKCkgPT4gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5vblNhbWVVcmxOYXZpZ2F0aW9uID0gJ3JlbG9hZCc7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGAvcGF5bWVudC1oaXN0b3J5LyR7dGhpcy5jY2RDYXNlTnVtYmVyfT92aWV3PWZlZS1zdW1tYXJ5JnNlbGVjdGVkT3B0aW9uPSR7dGhpcy5vcHRpb259JnBheW1lbnRHcm91cFJlZj0ke3RoaXMucGF5bWVudEdyb3VwUmVmfSZkY249JHt0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuYnNwYXltZW50ZGNufSR7TERVcmx9YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ290b0Nhc2V0cmFuc2F0aW9uUGFnZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5pc0NvbmZpcm1hdGlvbkJ0bkRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHJlc2V0UmVtaXNzaW9uRm9ybSh2YWwsIGZpZWxkKSB7XG4gICAgaWYgKGZpZWxkID09PSAnQWxsJykge1xuICAgICAgdGhpcy5pc1JlbWlzc2lvbkNvZGVFbXB0eSA9IHZhbFswXTtcbiAgICAgIHRoaXMucmVtaXNzaW9uQ29kZUhhc0Vycm9yID0gdmFsWzFdO1xuICAgICAgdGhpcy5pc0Ftb3VudEVtcHR5ID0gdmFsWzJdO1xuICAgICAgdGhpcy5hbW91bnRIYXNFcnJvciA9IHZhbFszXTtcbiAgICAgIHRoaXMuaXNSZW1pc3Npb25MZXNzVGhhbkZlZUVycm9yID0gdmFsWzRdO1xuICAgICAgdGhpcy5pc1JlYXNvbkVtcHR5ID0gdmFsWzVdO1xuICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICdyZW1pc3Npb25Db2RlJyB8fCBmaWVsZCA9PT0gJ0FsbCcpIHtcbiAgICAgIHRoaXMuaXNSZW1pc3Npb25Db2RlRW1wdHkgPSB2YWxbMF07XG4gICAgICB0aGlzLnJlbWlzc2lvbkNvZGVIYXNFcnJvciA9IHZhbFsxXTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkID09PSAnYW1vdW50JyB8fCBmaWVsZCA9PT0gJ0FsbCcpIHtcbiAgICAgIHRoaXMuaXNBbW91bnRFbXB0eSA9IHZhbFsyXTtcbiAgICAgIHRoaXMuYW1vdW50SGFzRXJyb3IgPSB2YWxbM107XG4gICAgICB0aGlzLmlzUmVtaXNzaW9uTGVzc1RoYW5GZWVFcnJvciA9IHZhbFs0XTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkID09PSAncmVhc29uJyB8fCBmaWVsZCA9PT0gJ0FsbCcpIHtcbiAgICAgIHRoaXMuaXNSZWFzb25FbXB0eSA9IHZhbFs1XTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgcmV0cm8gcmVtaXNzaW9uIGNoYW5nZXNcbiAgYWRkUmVtaXNzaW9uQ29kZSgpIHtcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGZhbHNlO1xuICAgIC8vIHRoaXMuaXNGcm9tQ2hlY2tBbnNQYWdlID0gdHJ1ZTtcbiAgICB0aGlzLmVycm9yTXNnID0gW107XG4gICAgdGhpcy52aWV3U3RhdHVzID0gJyc7XG4gICAgdGhpcy5pc1JlZnVuZFJlbWlzc2lvbiA9IGZhbHNlO1xuICAgIHRoaXMucmVzZXRSZW1pc3Npb25Gb3JtKFtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlXSwgJ0FsbCcpO1xuICAgIGNvbnN0IHJlbWlzc2lvbmN0cmxzID0gdGhpcy5yZW1pc3Npb25Gb3JtLmNvbnRyb2xzXG4gICAgLy8gaXNSZW1pc3Npb25MZXNzVGhhbkZlZSA9IHRoaXMuZmVlLmNhbGN1bGF0ZWRfYW1vdW50ID49IHJlbWlzc2lvbmN0cmxzLmFtb3VudC52YWx1ZTtcbiAgICB0aGlzLnJlbWlzc2lvbkZvcm0uY29udHJvbHNbJ3JlZnVuZFJlYXNvbiddLnNldEVycm9ycyhudWxsKTtcbiAgICB0aGlzLnJlbWlzc2lvbkZvcm0uY29udHJvbHNbJ3JlZnVuZEREUmVhc29uJ10uc2V0RXJyb3JzKG51bGwpO1xuICAgIHRoaXMucmVtaXNzaW9uRm9ybS5jb250cm9sc1snYW1vdW50J10uc2V0RXJyb3JzKG51bGwpO1xuICAgIGlmICh0aGlzLnJlbWlzc2lvbkZvcm0uZGlydHkgJiYgdGhpcy5yZW1pc3Npb25Gb3JtLnZhbGlkKSB7XG4gICAgICBpZiAoIXRoaXMuaXNGcm9tQ2hlY2tBbnNQYWdlKSB7XG4gICAgICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnJztcbiAgICAgICAgdGhpcy52aWV3U3RhdHVzID0gXCJwcm9jZXNzcmV0cm9yZW1pc3NvbnBhZ2VcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnJztcbiAgICAgICAgdGhpcy52aWV3U3RhdHVzID0gJ2NoZWNrcmV0cm9yZW1pc3Npb25wYWdlJztcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIGlmIChyZW1pc3Npb25jdHJsc1sncmVtaXNzaW9uQ29kZSddLnZhbHVlID09ICcnKSB7XG4gICAgICAgIHRoaXMucmVzZXRSZW1pc3Npb25Gb3JtKFt0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZV0sICdyZW1pc3Npb25Db2RlJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVtaXNzaW9uY3RybHNbJ3JlbWlzc2lvbkNvZGUnXS52YWx1ZSAhPSAnJyAmJiByZW1pc3Npb25jdHJsc1sncmVtaXNzaW9uQ29kZSddLmludmFsaWQpIHtcbiAgICAgICAgdGhpcy5yZXNldFJlbWlzc2lvbkZvcm0oW2ZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlXSwgJ3JlbWlzc2lvbkNvZGUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZW1pc3Npb25jdHJsc1snYW1vdW50J10udmFsdWUgPT0gJycpIHtcbiAgICAgICAgdGhpcy5yZXNldFJlbWlzc2lvbkZvcm0oW2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlXSwgJ2Ftb3VudCcpO1xuICAgICAgfVxuICAgICAgaWYgKHJlbWlzc2lvbmN0cmxzWydhbW91bnQnXS52YWx1ZSAhPSAnJyAmJiByZW1pc3Npb25jdHJsc1snYW1vdW50J10uaW52YWxpZCkge1xuICAgICAgICB0aGlzLnJlc2V0UmVtaXNzaW9uRm9ybShbZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZV0sICdhbW91bnQnKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZW1pc3Npb25jdHJsc1sncmVhc29uJ10udmFsdWUgPT0gJycpIHtcbiAgICAgICAgdGhpcy5yZXNldFJlbWlzc2lvbkZvcm0oW2ZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlXSwgJ3JlYXNvbicpO1xuICAgICAgfVxuICAgICAgaWYgKHJlbWlzc2lvbmN0cmxzLmFtb3VudC52YWxpZCkge1xuICAgICAgICB0aGlzLnJlc2V0UmVtaXNzaW9uRm9ybShbZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWVdLCAnYW1vdW50Jyk7XG4gICAgICB9XG5cbiAgICB9XG4gIH1cblxuXG4gIGdvdG9BZGRSZXRyb1JlbWlzc2lvbkNvZGVQYWdlKCkge1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZmFsc2U7XG4gICAgdGhpcy5pc0Zyb21DaGVja0Fuc1BhZ2UgPSBmYWxzZTtcbiAgICB0aGlzLmVycm9yTXNnID0gW107XG4gICAgaWYgKHRoaXMuaXNSZWZ1bmRSZW1pc3Npb24pIHtcbiAgICAgIHRoaXMucmVmdW5kTGlzdEFtb3VudC5lbWl0KCk7XG4gICAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuaXNGcm9tUmVmdW5kU3RhdHVzUGFnZSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRnJvbVJlZnVuZExpc3RQYWdlKSB7XG4gICAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuaXNjYW5jZWxDbGlja2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVmdW5kTGlzdFJlYXNvbi5lbWl0KHsgcmVhc29uOiB0aGlzLnNlbGVjdGVkUmVmdW5kUmVhc29uLCBjb2RlOiB0aGlzLnJlZnVuZFJlYXNvbiB9KTtcbiAgICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5pc0Zyb21SZWZ1bmRTdGF0dXNQYWdlID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3U3RhdHVzID0gJyc7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gJ3llcyc7XG4gICAgdGhpcy52aWV3Q29tcFN0YXR1cyA9IFwiYWRkcmVtaXNzaW9uXCI7XG4gICAgdGhpcy5pc1JlZnVuZFJlbWlzc2lvbiA9IHRydWU7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLmVycm9yTXNnID0gW107XG4gICAgaWYgKHRoaXMuaXNGcm9tUGF5bWVudERldGFpbFBhZ2UpIHtcbiAgICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC52aWV3TmFtZSA9ICdwYXltZW50LXZpZXcnO1xuICAgIH1cbiAgfVxuXG4gIGdvdG9DaGVja1JldHJvUmVtaXNzaW9uUGFnZShwYXltZW50OiBJUGF5bWVudCkge1xuICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5pc2NhbmNlbENsaWNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMucmVzZXRSZW1pc3Npb25Gb3JtKFtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2VdLCAnQWxsJyk7XG4gICAgaWYgKCF0aGlzLmlzUmVmdW5kUmVtaXNzaW9uKSB7XG4gICAgICB2YXIgcmVtaXNzaW9uY3RybHMgPSB0aGlzLnJlbWlzc2lvbkZvcm0uY29udHJvbHMsXG4gICAgICAgIGlzUmVtaXNzaW9uTGVzc1RoYW5GZWUgPSB0aGlzLmZlZS5jYWxjdWxhdGVkX2Ftb3VudCA+PSByZW1pc3Npb25jdHJscy5hbW91bnQudmFsdWU7XG4gICAgICBpZiAodGhpcy5yZW1pc3Npb25Gb3JtLmRpcnR5KSB7XG4gICAgICAgIGlmIChyZW1pc3Npb25jdHJsc1snYW1vdW50J10udmFsdWUgPT0gJycgfHwgcmVtaXNzaW9uY3RybHNbJ2Ftb3VudCddLnZhbHVlIDwgMCkge1xuICAgICAgICAgIHRoaXMucmVzZXRSZW1pc3Npb25Gb3JtKFtmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZV0sICdhbW91bnQnKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZW1pc3Npb25jdHJsc1snYW1vdW50J10udmFsdWUgIT0gJycgJiYgcmVtaXNzaW9uY3RybHNbJ2Ftb3VudCddLmludmFsaWQpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0UmVtaXNzaW9uRm9ybShbZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2VdLCAnYW1vdW50Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVtaXNzaW9uY3RybHMuYW1vdW50LnZhbGlkICYmICFpc1JlbWlzc2lvbkxlc3NUaGFuRmVlKSB7XG4gICAgICAgICAgdGhpcy5yZXNldFJlbWlzc2lvbkZvcm0oW2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlXSwgJ2Ftb3VudCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnJztcbiAgICAgICAgICB0aGlzLnZpZXdTdGF0dXMgPSBcImNoZWNrcmV0cm9yZW1pc3Npb25wYWdlXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlbWlzc2lvbmN0cmxzID0gdGhpcy5yZW1pc3Npb25Gb3JtLmNvbnRyb2xzO1xuICAgICAgLy9pZiAodGhpcy5yZW1pc3Npb25Gb3JtLmRpcnR5ICkge1xuICAgICAgaWYgKHJlbWlzc2lvbmN0cmxzWydhbW91bnQnXS52YWx1ZSA9PSAnJyB8fCByZW1pc3Npb25jdHJsc1snYW1vdW50J10udmFsdWUgPCAwKSB7XG4gICAgICAgIHRoaXMucmVzZXRSZW1pc3Npb25Gb3JtKFtmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZV0sICdhbW91bnQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnJztcbiAgICAgICAgdGhpcy52aWV3U3RhdHVzID0gXCJjaGVja3JldHJvcmVtaXNzaW9ucGFnZVwiO1xuICAgICAgICB0aGlzLnJlZnVuZExpc3RBbW91bnQuZW1pdChyZW1pc3Npb25jdHJsc1snYW1vdW50J10udmFsdWUpO1xuICAgICAgfVxuICAgICAgLy99XG5cbiAgICB9XG4gIH1cbiAgZ290b0Ftb3VudFJldHJvUmVtaXNzaW9uKCkge1xuICAgIHRoaXMuaXNGcm9tQ2hlY2tBbnNQYWdlID0gZmFsc2U7XG4gICAgdGhpcy52aWV3U3RhdHVzID0gJ3Byb2Nlc3NyZXRyb3JlbWlzc29ucGFnZSc7XG4gICAgdGhpcy52aWV3Q29tcFN0YXR1cyA9ICcnO1xuICAgIC8vIHRoaXMuaXNSZWZ1bmRSZW1pc3Npb24gPSB0cnVlO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gIH1cbiAgZ290b1Byb2Nlc3NSZXRyb1JlbWlzc2lvblBhZ2UoKSB7XG4gICAgdGhpcy5pc0Zyb21DaGVja0Fuc1BhZ2UgPSB0cnVlO1xuICAgIHRoaXMudmlld1N0YXR1cyA9ICcnO1xuICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnYWRkcmVtaXNzaW9uJztcbiAgICB0aGlzLmlzUmVmdW5kUmVtaXNzaW9uID0gdHJ1ZTtcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JNc2cgPSBbXTtcbiAgfVxuXG4gIGdvdG9Qcm9jZXNzUmV0cm9SZW1pc3Npb24obm90ZT86IElSZWZ1bmRDb250YWN0RGV0YWlscykge1xuICAgIGlmIChub3RlKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbiA9IHsgY29udGFjdF9kZXRhaWxzOiBub3RlLCBub3RpZmljYXRpb25fdHlwZTogbm90ZS5ub3RpZmljYXRpb25fdHlwZSB9O1xuICAgIH1cbiAgICB0aGlzLmlzRnJvbUNoZWNrQW5zUGFnZSA9IHRydWU7XG4gICAgdGhpcy52aWV3U3RhdHVzID0gJ3JlbWlzc2lvbkFkZHJlc3NQYWdlJztcbiAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJyc7XG4gICAgdGhpcy5pc1JlZnVuZFJlbWlzc2lvbiA9IHRydWU7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgfVxuXG4gIGNvbmZpcm1SZXRyb1JlbWlzc2lvbigpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25maXJtYXRpb25CdG5EaXNhYmxlZCkge1xuICAgICAgdGhpcy5yZXRyb1JlbWlzc2lvbiA9IHRydWU7XG4gICAgICB0aGlzLnJlbWlzc2lvbmFtdCA9IHRoaXMucmVtaXNzaW9uRm9ybS5jb250cm9scy5hbW91bnQudmFsdWU7XG4gICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IG5ldyBBZGRSZXRyb1JlbWlzc2lvblJlcXVlc3QodGhpcy5yZW1pc3Npb25hbXQsIHRoaXMucmVtaXNzaW9uRm9ybS5jb250cm9scy5yZW1pc3Npb25Db2RlLnZhbHVlKVxuICAgICAgdGhpcy5wYXltZW50Vmlld1NlcnZpY2UucG9zdFBheW1lbnRHcm91cFdpdGhSZXRyb1JlbWlzc2lvbnMoZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMucGF5bWVudEdyb3VwUmVmKS50cmltKCksIHRoaXMuZmVlLmlkLCByZXF1ZXN0Qm9keSkuc3Vic2NyaWJlKFxuICAgICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgICAgaWYgKEpTT04ucGFyc2UocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICB0aGlzLmlzUmVtaXNzaW9uQXBwbGllZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJyc7XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0dXMgPSAncmV0cm9yZW1pc3Npb25jb25maXJtYXRpb25wYWdlJztcbiAgICAgICAgICAgIHRoaXMucmVtaXNzaW9uUmVmZXJlbmNlID0gSlNPTi5wYXJzZShyZXNwb25zZSkucmVtaXNzaW9uX3JlZmVyZW5jZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgICAgICB0aGlzLmlzQ29uZmlybWF0aW9uQnRuRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzUmVmdW5kKCkge1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdGhpcy5lcnJvck1zZyA9IFtdO1xuICAgIHRoaXMuaXNDb25maXJtYXRpb25CdG5EaXNhYmxlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuaXNSZWZ1bmRSZW1pc3Npb24pIHtcbiAgICAgIHRoaXMucmV0cm9SZW1pc3Npb24gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZW1pc3Npb25SZWZlcmVuY2UgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnJlbWlzc2lvblJlZmVyZW5jZSA9PT0gJycpIHtcbiAgICAgIHRoaXMucmVtaXNzaW9uUmVmZXJlbmNlID0gdGhpcy5yZW1pc3Npb24ucmVtaXNzaW9uX3JlZmVyZW5jZTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSBuZXcgUG9zdElzc3VlUmVmdW5kUmV0cm9SZW1pc3Npb24odGhpcy5yZW1pc3Npb25SZWZlcmVuY2UsIHRoaXMuY29udGFjdERldGFpbHNPYmopO1xuICAgIHRoaXMucGF5bWVudFZpZXdTZXJ2aWNlLnBvc3RSZWZ1bmRSZXRyb1JlbWlzc2lvbihyZXF1ZXN0Qm9keSkuc3Vic2NyaWJlKFxuICAgICAgcmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAoSlNPTi5wYXJzZShyZXNwb25zZSkpIHtcbiAgICAgICAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJyc7XG4gICAgICAgICAgdGhpcy52aWV3U3RhdHVzID0gJ3JlZnVuZGNvbmZpcm1hdGlvbnBhZ2UnO1xuICAgICAgICAgIHRoaXMucmVmdW5kUmVmZXJlbmNlID0gSlNPTi5wYXJzZShyZXNwb25zZSkucmVmdW5kX3JlZmVyZW5jZTtcbiAgICAgICAgICB0aGlzLnJlZnVuZEFtb3VudCA9IEpTT04ucGFyc2UocmVzcG9uc2UpLnJlZnVuZF9hbW91bnQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yO1xuICAgICAgICB0aGlzLmlzQ29uZmlybWF0aW9uQnRuRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH0pXG4gIH1cblxuICAvLyBJc3N1ZSBSZWZ1bmQgY2hhbmdlc1xuXG4gIGdvdG9Jc3N1ZVJlZnVuZENvbmZpcm1hdGlvbihwYXltZW50OiBJUGF5bWVudCkge1xuXG4gICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LmlzY2FuY2VsQ2xpY2tlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuUkVGVU5ETElTVCA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHRoaXMuaXNGcm9tUmVmdW5kTGlzdFBhZ2UgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMudG90YWxSZWZ1bmRBbW91bnQgPSB0aGlzLnJlbWlzc2lvbkZvcm0udmFsdWUuZmVlc0xpc3QucmVkdWNlKChhLCBjKSA9PiBhICsgYy5yZWZ1bmRfYW1vdW50ICogYy5zZWxlY3RlZCwgMCk7XG5cblxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdGhpcy5lcnJvck1zZyA9IFtdO1xuICAgIHRoaXMucmVmdW5kUmVhc29uID0gdGhpcy5yZW1pc3Npb25Gb3JtLmNvbnRyb2xzWydyZWZ1bmRSZWFzb24nXS52YWx1ZSA9PT0gbnVsbCA/IHRoaXMucmVtaXNzaW9uRm9ybS5jb250cm9sc1sncmVmdW5kRERSZWFzb24nXS52YWx1ZSA6IHRoaXMucmVtaXNzaW9uRm9ybS5jb250cm9sc1sncmVmdW5kUmVhc29uJ10udmFsdWU7XG4gICAgaWYgKCF0aGlzLnJlZnVuZFJlYXNvbiB8fCB0aGlzLnJlZnVuZFJlYXNvbiA9PT0gJ1NlbGVjdCBhIGRpZmZlcmVudCByZWFzb24nKSB7XG4gICAgICB0aGlzLnJlZnVuZEhhc0Vycm9yID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSZWZ1bmRSZWFzb24uaW5jbHVkZXMoJ090aGVyJykgJiYgKHRoaXMucmVtaXNzaW9uRm9ybS5jb250cm9sc1sncmVhc29uJ10udmFsdWUgPT0gJycgfHwgdGhpcy5yZW1pc3Npb25Gb3JtLmNvbnRyb2xzWydyZWFzb24nXS52YWx1ZSA9PSBudWxsKSkge1xuICAgICAgdGhpcy5yZXNldFJlbWlzc2lvbkZvcm0oW2ZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlXSwgJ3JlYXNvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFJlZnVuZFJlYXNvbi5pbmNsdWRlcygnT3RoZXInKSAmJiB0aGlzLnJlbWlzc2lvbkZvcm0uY29udHJvbHNbJ3JlYXNvbiddLnZhbHVlICE9PSAnJykge1xuICAgICAgdGhpcy5yZWZ1bmRIYXNFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5yZWZ1bmRSZWFzb24gKz0gJy0nICsgdGhpcy5yZW1pc3Npb25Gb3JtLmNvbnRyb2xzWydyZWFzb24nXS52YWx1ZTtcbiAgICAgIHRoaXMuZGlzcGxheVJlZnVuZFJlYXNvbiA9IHRoaXMuc2VsZWN0ZWRSZWZ1bmRSZWFzb24gKyAnLScgKyB0aGlzLnJlbWlzc2lvbkZvcm0uY29udHJvbHNbJ3JlYXNvbiddLnZhbHVlO1xuICAgICAgaWYgKHRoaXMuaXNGcm9tUmVmdW5kTGlzdFBhZ2UpIHtcbiAgICAgICAgdGhpcy5yZWZ1bmRMaXN0UmVhc29uLmVtaXQoeyByZWFzb246IHRoaXMuZGlzcGxheVJlZnVuZFJlYXNvbiwgY29kZTogdGhpcy5yZWZ1bmRSZWFzb24gfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5pc0Zyb21DaGVja0Fuc1BhZ2UpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsUmVmdW5kQW1vdW50ID0gdGhpcy5yZW1pc3Npb25Gb3JtLnZhbHVlLmZlZXNMaXN0LnJlZHVjZSgoYSwgYykgPT4gYSArIGMucmVmdW5kX2Ftb3VudCAqIGMuc2VsZWN0ZWQsIDApO1xuICAgICAgICAgIHRoaXMuaXNGcm9tQ2hlY2tBbnNQYWdlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy52aWV3U3RhdHVzID0gJ2NoZWNraXNzdWVyZWZ1bmRwYWdlJztcbiAgICAgICAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJyc7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25QcmV2aWV3ID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnJztcbiAgICAgICAgdGhpcy52aWV3U3RhdHVzID0gJ2NvbnRhY3REZXRhaWxzUGFnZSc7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwbGF5UmVmdW5kUmVhc29uID0gdGhpcy5zZWxlY3RlZFJlZnVuZFJlYXNvbjtcbiAgICAgIGlmICh0aGlzLmlzRnJvbUNoZWNrQW5zUGFnZSkge1xuICAgICAgICB0aGlzLnRvdGFsUmVmdW5kQW1vdW50ID0gdGhpcy5yZW1pc3Npb25Gb3JtLnZhbHVlLmZlZXNMaXN0LnJlZHVjZSgoYSwgYykgPT4gYSArIGMucmVmdW5kX2Ftb3VudCAqIGMuc2VsZWN0ZWQsIDApO1xuICAgICAgICB0aGlzLmlzRnJvbUNoZWNrQW5zUGFnZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZpZXdTdGF0dXMgPSAnY2hlY2tpc3N1ZXJlZnVuZHBhZ2UnO1xuICAgICAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJyc7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uUHJldmlldyA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0Zyb21SZWZ1bmRMaXN0UGFnZSkge1xuICAgICAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuaXNGcm9tUmVmdW5kU3RhdHVzUGFnZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVmdW5kTGlzdFJlYXNvbi5lbWl0KHsgcmVhc29uOiB0aGlzLnNlbGVjdGVkUmVmdW5kUmVhc29uLCBjb2RlOiB0aGlzLnJlZnVuZFJlYXNvbiB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnJztcbiAgICAgICAgdGhpcy52aWV3U3RhdHVzID0gJ2NvbnRhY3REZXRhaWxzUGFnZSc7XG4gICAgICB9XG5cbiAgICB9XG4gIH1cblxuICBnb3RvSXNzdWVSZWZ1bmRQYWdlKCkge1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdGhpcy52aWV3Q29tcFN0YXR1cyA9ICdpc3N1ZXJlZnVuZCc7XG4gICAgdGhpcy52aWV3U3RhdHVzID0gJyc7XG4gICAgdGhpcy5pc1JlZnVuZFJlbWlzc2lvbiA9IHRydWU7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBmYWxzZTtcbiAgICB0aGlzLmVycm9yTXNnID0gW107XG4gICAgdGhpcy5yZWZ1bmRIYXNFcnJvciA9IGZhbHNlO1xuICAgIHRoaXMuaXNSZWFzb25FbXB0eSA9IGZhbHNlO1xuICB9XG5cbiAgZ290b0lzc3VlUGFnZShpc0Z1bGx5UmVmdW5kOiBhbnkpIHtcbiAgICBpZiAoaXNGdWxseVJlZnVuZCkge1xuICAgICAgdGhpcy52aWV3Q29tcFN0YXR1cyA9ICdpc3N1ZXJlZnVuZHBhZ2UxJztcbiAgICAgIHRoaXMuZ2V0UmVmdW5kUmVhc29ucygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBbXS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQnKSwgZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2lubGluZS1lcnJvci1jbGFzcycpO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBjaGVja2JveHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgICB0aGlzLnRvdGFsUmVmdW5kQW1vdW50ID0gMDtcbiAgICAgIHRoaXMuZXJyb3JNc2cgPSBbXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hlY2tib3hzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChjaGVja2JveHNbal0uY2hlY2tlZCkge1xuICAgICAgICAgIHRoaXMuZnVsbFJlZnVuZCA9IGZhbHNlO1xuICAgICAgICAgIGxldCBxdWFudGl0eTogbnVtYmVyID0gKyg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmVlVm9sdW1lXycgKyBjaGVja2JveHNbal0udmFsdWUpKS52YWx1ZTtcbiAgICAgICAgICBsZXQgYW1vdW50VG9SZWZ1bmQ6IG51bWJlciA9ICsoPEhUTUxJbnB1dEVsZW1lbnQ+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZlZUFtb3VudF8nICsgY2hlY2tib3hzW2pdLnZhbHVlKSkudmFsdWU7XG4gICAgICAgICAgbGV0IGFwcG9ydGlvbkFtb3VudDogbnVtYmVyID0gKyg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmVlQXBwb3J0aW9uQW1vdW50XycgKyBjaGVja2JveHNbal0udmFsdWUpKS52YWx1ZTtcbiAgICAgICAgICBsZXQgY2FsY3VsYXRlZEFtb3VudDogbnVtYmVyID0gKyg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsY3VsYXRlZEFtb3VudF8nICsgY2hlY2tib3hzW2pdLnZhbHVlKSkudmFsdWU7XG5cbiAgICAgICAgICBpZiAoYW1vdW50VG9SZWZ1bmQgPT09IGFwcG9ydGlvbkFtb3VudCkge1xuICAgICAgICAgICAgdGhpcy5mdWxsUmVmdW5kID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYW1vdW50VG9SZWZ1bmQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudElkID0gJ2ZlZUFtb3VudF8nICsgY2hlY2tib3hzW2pdLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5lcnJvck1zZy5wdXNoKCdZb3UgbmVlZCB0byBlbnRlciBhIHJlZnVuZCBhbW91bnQnKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0RXJyb3JDbGFzcyh0aGlzLmVsZW1lbnRJZCk7XG4gICAgICAgICAgfVxuXG5cblxuICAgICAgICAgIGlmIChxdWFudGl0eSA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKGFtb3VudFRvUmVmdW5kID4gMCAmJiBhbW91bnRUb1JlZnVuZCA+IGFwcG9ydGlvbkFtb3VudCkge1xuICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRJZCA9ICdmZWVBbW91bnRfJyArIGNoZWNrYm94c1tqXS52YWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvck1zZy5wdXNoKCdUaGUgYW1vdW50IHlvdSB3YW50IHRvIHJlZnVuZCBpcyBtb3JlIHRoYW4gdGhlIGFtb3VudCBwYWlkJyk7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0RXJyb3JDbGFzcyh0aGlzLmVsZW1lbnRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHF1YW50aXR5ID4gMSkge1xuXG4gICAgICAgICAgICB0aGlzLnF1YW50aXR5VXBkYXRlZCA9ICsoPEhUTUxJbnB1dEVsZW1lbnQ+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZlZVZvbHVtZVVwZGF0ZWRfJyArIGNoZWNrYm94c1tqXS52YWx1ZSkpLnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5xdWFudGl0eVVwZGF0ZWQgPT09IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5lbGVtZW50SWQgPSAnZmVlVm9sdW1lVXBkYXRlZF8nICsgY2hlY2tib3hzW2pdLnZhbHVlO1xuICAgICAgICAgICAgICB0aGlzLmVycm9yTXNnLnB1c2goJ1lvdSBuZWVkIHRvIGVudGVyIHF1YW50aXR5JylcbiAgICAgICAgICAgICAgdGhpcy5nZXRFcnJvckNsYXNzKHRoaXMuZWxlbWVudElkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZnVsbFJlZnVuZCAmJiBxdWFudGl0eSAhPT0gdGhpcy5xdWFudGl0eVVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5lbGVtZW50SWQgPSAnZmVlVm9sdW1lVXBkYXRlZF8nICsgY2hlY2tib3hzW2pdLnZhbHVlO1xuICAgICAgICAgICAgICB0aGlzLmVycm9yTXNnLnB1c2goJ1RoZSBxdWFudGl0eSB5b3Ugd2FudCB0byByZWZ1bmQgc2hvdWxkIGJlIG1heGltdW4gYXZhaWxhYmxlIHF1YW50aXR5Jyk7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0RXJyb3JDbGFzcyh0aGlzLmVsZW1lbnRJZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5mdWxsUmVmdW5kICYmIHRoaXMucXVhbnRpdHlVcGRhdGVkID4gMCAmJiBhbW91bnRUb1JlZnVuZCA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5yZWZ1bmRBbXRGb3JGZWVWb2x1bWVzID0gKyg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmVlVk9sXycgKyBjaGVja2JveHNbal0udmFsdWUpKS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgIHRoaXMuYWxsb3dlZFJlZnVuZEFtb3VudCA9IHRoaXMucXVhbnRpdHlVcGRhdGVkICogdGhpcy5yZWZ1bmRBbXRGb3JGZWVWb2x1bWVzO1xuICAgICAgICAgICAgICBpZiAodGhpcy5hbGxvd2VkUmVmdW5kQW1vdW50ICE9PSBhbW91bnRUb1JlZnVuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudElkID0gJ2ZlZUFtb3VudF8nICsgY2hlY2tib3hzW2pdLnZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JNc2cucHVzaCgnVGhlIEFtb3VudCB0byBSZWZ1bmQgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBwcm9kdWN0IG9mIEZlZSBBbW91bnQgYW5kIHF1YW50aXR5Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRFcnJvckNsYXNzKHRoaXMuZWxlbWVudElkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZnVsbFJlZnVuZCAmJiBhbW91bnRUb1JlZnVuZCA+IGFwcG9ydGlvbkFtb3VudCkge1xuICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRJZCA9ICdmZWVBbW91bnRfJyArIGNoZWNrYm94c1tqXS52YWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvck1zZy5wdXNoKCdUaGUgYW1vdW50IHlvdSB3YW50IHRvIHJlZnVuZCBpcyBtb3JlIHRoYW4gdGhlIGFtb3VudCBwYWlkJyk7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0RXJyb3JDbGFzcyh0aGlzLmVsZW1lbnRJZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5mdWxsUmVmdW5kICYmIHRoaXMucXVhbnRpdHlVcGRhdGVkID4gMCAmJiB0aGlzLnF1YW50aXR5VXBkYXRlZCA+IHF1YW50aXR5KSB7XG4gICAgICAgICAgICAgIHRoaXMuZWxlbWVudElkID0gJ2ZlZVZvbHVtZVVwZGF0ZWRfJyArIGNoZWNrYm94c1tqXS52YWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvck1zZy5wdXNoKCdUaGUgcXVhbnRpdHkgeW91IHdhbnQgdG8gcmVmdW5kIGlzIG1vcmUgdGhhbiB0aGUgYXZhaWxhYmxlIHF1YW50aXR5Jyk7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0RXJyb3JDbGFzcyh0aGlzLmVsZW1lbnRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vdGhpcy5yZW1pc3Npb25Gb3JtLnZhbHVlLmZlZXNMaXN0LmZpbmQoaWQ9PmlkPWNoZWNrYm94c1tqXS52YWx1ZSlbJ3JlZnVuZF9hbW91bnQnXSA9IGFwcG9ydGlvbkFtb3VudDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5lcnJvck1zZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGcm9tQ2hlY2tBbnNQYWdlKSB7XG4gICAgICAgICAgdGhpcy5pc0Zyb21DaGVja0Fuc1BhZ2UgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnRvdGFsUmVmdW5kQW1vdW50ID0gdGhpcy5yZW1pc3Npb25Gb3JtLnZhbHVlLmZlZXNMaXN0LnJlZHVjZSgoYSwgYykgPT4gYSArIGMucmVmdW5kX2Ftb3VudCAqIGMuc2VsZWN0ZWQsIDApO1xuICAgICAgICAgIHRoaXMuZmVlcyA9IHRoaXMucmVtaXNzaW9uRm9ybS52YWx1ZS5mZWVzTGlzdC5maWx0ZXIodmFsdWUgPT4gdmFsdWUuc2VsZWN0ZWQgPT09IHRydWUpO1xuICAgICAgICAgIHRoaXMudmlld1N0YXR1cyA9ICdjaGVja2lzc3VlcmVmdW5kcGFnZSdcbiAgICAgICAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJyc7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25QcmV2aWV3ID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNGcm9tUmVmdW5kU3RhdHVzUGFnZSkge1xuICAgICAgICAgIHZhciByZW1pc3Npb25jdHJscyA9IHRoaXMucmVtaXNzaW9uRm9ybS5jb250cm9scztcbiAgICAgICAgICB0aGlzLnRvdGFsUmVmdW5kQW1vdW50ID0gdGhpcy5yZW1pc3Npb25Gb3JtLnZhbHVlLmZlZXNMaXN0LnJlZHVjZSgoYSwgYykgPT4gYSArIGMucmVmdW5kX2Ftb3VudCAqIGMuc2VsZWN0ZWQsIDApO1xuICAgICAgICAgIHRoaXMucmVmdW5kTGlzdEFtb3VudC5lbWl0KHRoaXMudG90YWxSZWZ1bmRBbW91bnQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgdGhpcy5mZWVzID0gdGhpcy5yZW1pc3Npb25Gb3JtLnZhbHVlLmZlZXNMaXN0LmZpbHRlcih2YWx1ZSA9PiB2YWx1ZS5zZWxlY3RlZCA9PT0gdHJ1ZSk7XG4gICAgICAgICAgdGhpcy5yZWZ1bmRGZWVzLmVtaXQodGhpcy5mZWVzKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWV3Q29tcFN0YXR1cyA9ICdpc3N1ZXJlZnVuZHBhZ2UxJztcbiAgICAgICAgdGhpcy5nZXRSZWZ1bmRSZWFzb25zKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FsQW10VG9SZWZ1bmQodmFsdWUsIGFtb3VudCwgdm9sdW1lLCBpOiBhbnkpIHtcbiAgICBjb25zdCB2b2x1bWVGZWUgPSBhbW91bnQgLyB2b2x1bWU7XG4gICAgY29uc3QgYW10VG9SZWZ1bmQgPSB2YWx1ZSAqIHZvbHVtZUZlZTtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLnJlbWlzc2lvbkZvcm0uY29udHJvbHMuZmVlc0xpc3QgYXMgRm9ybUFycmF5O1xuICAgIGZvcm1BcnJheS5hdChpKS5nZXQoJ3JlZnVuZF9hbW91bnQnKS5zZXRWYWx1ZShhbXRUb1JlZnVuZCk7XG4gICAgLy8gZm9ybUFycmF5LmF0KGkpLmdldCgndm9sdW1lJykuc2V0VmFsdWUodmFsdWUpO1xuICAgIC8vICAoPEhUTUxJbnB1dEVsZW1lbnQ+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZlZUFtb3VudF8nK2kpKS52YWx1ZSA9ICthbXRUb1JlZnVuZDtcbiAgICAvLyAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLnJlbWlzc2lvbkZvcm0uY29udHJvbHMuZmVlc0xpc3RbJ3ZvbHVtZSddLmF0KGkpO1xuICAgIC8vICBmb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG5cbiAgfVxuICBnb3RvQ29udGFjdERldGFpbHNQYWdlKG5vdGU/OiBJUmVmdW5kQ29udGFjdERldGFpbHMpIHtcbiAgICBpZiAobm90ZSkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSB7IGNvbnRhY3RfZGV0YWlsczogbm90ZSwgbm90aWZpY2F0aW9uX3R5cGU6IG5vdGUubm90aWZpY2F0aW9uX3R5cGUgfTtcbiAgICB9XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJyc7XG4gICAgdGhpcy52aWV3U3RhdHVzID0gJ2NvbnRhY3REZXRhaWxzUGFnZSc7XG4gICAgdGhpcy5pc1JlZnVuZFJlbWlzc2lvbiA9IHRydWU7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBmYWxzZTtcbiAgfVxuXG4gIGdldFJlZnVuZFJlYXNvbnMoKSB7XG4gICAgaWYgKHRoaXMudmlld0NvbXBTdGF0dXMgPT09ICdpc3N1ZXJlZnVuZHBhZ2UxJykge1xuICAgICAgdGhpcy5yZWZ1bmRTZXJ2aWNlLmdldFJlZnVuZFJlYXNvbnMoKS5zdWJzY3JpYmUoXG4gICAgICAgIHJlZnVuZFJlYXNvbnMgPT4ge1xuICAgICAgICAgIHRoaXMucmVmdW5kUmVhc29ucyA9IHJlZnVuZFJlYXNvbnMuZmlsdGVyKChkYXRhKSA9PiBkYXRhLnJlY2VudGx5X3VzZWQgPT09IGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnJlZnVuZFJlYXNvbnMgPSB0aGlzLnJlZnVuZFJlYXNvbnMuZmlsdGVyKChkYXRhKSA9PiBkYXRhLm5hbWUgIT09ICdSZXRyb3NwZWN0aXZlIHJlbWlzc2lvbicpO1xuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIHRoaXMuY29tbW9uUmVmdW5kUmVhc29ucyA9IHJlZnVuZFJlYXNvbnMuZmlsdGVyKChkYXRhKSA9PiBkYXRhLnJlY2VudGx5X3VzZWQgPT09IHRydWUpO1xuICAgICAgICAgIHRoaXMuY29tbW9uUmVmdW5kUmVhc29ucy5zb3J0KChhLCBiKSA9PiBhLnRvU3RyaW5nKCkubG9jYWxlQ29tcGFyZShiKSk7XG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBnZXRFcnJvckNsYXNzKGVsZW1lbnRJZCkge1xuICAgIGlmICh0aGlzLmVycm9yTXNnLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7XG4gICAgICBlbGUuY2xhc3NMaXN0LmFkZCgnaW5saW5lLWVycm9yLWNsYXNzJyk7XG4gICAgfVxuXG4gIH1cblxuICBjaGFuZ2VJc3N1ZVJlZnVuZFJlYXNvbigpIHtcbiAgICB0aGlzLmlzRnJvbUNoZWNrQW5zUGFnZSA9IHRydWU7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLmVycm9yTXNnID0gW107XG4gICAgdGhpcy5yZWZ1bmRIYXNFcnJvciA9IGZhbHNlO1xuICAgIHRoaXMuaXNSZWFzb25FbXB0eSA9IGZhbHNlO1xuICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnaXNzdWVyZWZ1bmRwYWdlMSc7XG4gICAgdGhpcy52aWV3U3RhdHVzID0gJyc7XG4gICAgdGhpcy5pc1JlZnVuZFJlbWlzc2lvbiA9IHRydWU7XG4gIH1cblxuICBjb25maXJtSXNzdWVSZWZ1bmQoaXNGdWxseVJlZnVuZDogYW55KSB7XG4gICAgdGhpcy5pc0NvbmZpcm1hdGlvbkJ0bkRpc2FibGVkID0gdHJ1ZTtcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JNc2cgPSBbXTtcbiAgICBpZiAodGhpcy5pc1JlZnVuZFJlbWlzc2lvbikge1xuICAgICAgdGhpcy5yZXRyb1JlbWlzc2lvbiA9IHRydWU7XG4gICAgfVxuICAgIGlmIChpc0Z1bGx5UmVmdW5kKSB7XG4gICAgICB0aGlzLnRvdGFsUmVmdW5kQW1vdW50ID0gdGhpcy5wYXltZW50LmFtb3VudDtcbiAgICB9XG4gICAgaWYgKCFpc0Z1bGx5UmVmdW5kKSB7XG4gICAgICB0aGlzLmZlZXMgPSB0aGlzLnJlbWlzc2lvbkZvcm0udmFsdWUuZmVlc0xpc3QuZmlsdGVyKHZhbHVlID0+IHZhbHVlLnNlbGVjdGVkID09PSB0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5mZWVzID0gdGhpcy5mZWVzLm1hcChvYmogPT4gKHtcbiAgICAgIGlkOiBvYmouaWQsXG4gICAgICBjb2RlOiBvYmouY29kZSxcbiAgICAgIHZlcnNpb246IG9iai52ZXJzaW9uLFxuICAgICAgYXBwb3J0aW9uX2Ftb3VudDogb2JqLmFwcG9ydGlvbl9hbW91bnQsXG4gICAgICBjYWxjdWxhdGVkX2Ftb3VudDogb2JqLmNhbGN1bGF0ZWRfYW1vdW50LFxuICAgICAgdXBkYXRlZF92b2x1bWU6IG9iai51cGRhdGVkX3ZvbHVtZSA/IG9iai51cGRhdGVkX3ZvbHVtZSA6IG9iai52b2x1bWUsXG4gICAgICByZWZ1bmRfYW1vdW50OiBvYmoucmVmdW5kX2Ftb3VudCA/IG9iai5yZWZ1bmRfYW1vdW50IDogdGhpcy50b3RhbFJlZnVuZEFtb3VudFxuICAgIH0pKTtcblxuXG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSBuZXcgUG9zdFJlZnVuZFJldHJvUmVtaXNzaW9uKHRoaXMuY29udGFjdERldGFpbHNPYmosIHRoaXMuZmVlcywgdGhpcy5wYXltZW50LnJlZmVyZW5jZSwgdGhpcy5yZWZ1bmRSZWFzb24sXG4gICAgICB0aGlzLnRvdGFsUmVmdW5kQW1vdW50LCAnb3AnKTtcbiAgICB0aGlzLnBheW1lbnRWaWV3U2VydmljZS5wb3N0UmVmdW5kc1JlYXNvbihyZXF1ZXN0Qm9keSkuc3Vic2NyaWJlKFxuICAgICAgcmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAoSlNPTi5wYXJzZShyZXNwb25zZSkpIHtcbiAgICAgICAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJyc7XG4gICAgICAgICAgdGhpcy52aWV3U3RhdHVzID0gJ3JlZnVuZGNvbmZpcm1hdGlvbnBhZ2UnO1xuICAgICAgICAgIHRoaXMucmVmdW5kUmVmZXJlbmNlID0gSlNPTi5wYXJzZShyZXNwb25zZSkucmVmdW5kX3JlZmVyZW5jZTtcbiAgICAgICAgICBpZiAoSlNPTi5wYXJzZShyZXNwb25zZSkucmVmdW5kX2Ftb3VudCkge1xuICAgICAgICAgICAgdGhpcy5yZWZ1bmRBbW91bnQgPSBKU09OLnBhcnNlKHJlc3BvbnNlKS5yZWZ1bmRfYW1vdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3I7XG4gICAgICAgIHRoaXMuaXNDb25maXJtYXRpb25CdG5EaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pXG4gIH1cblxuICBnb3RvUmVmdW5kUmVhc29uUGFnZSgpIHtcbiAgICB0aGlzLnZpZXdTdGF0dXMgPSAnJztcbiAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJ2lzc3VlcmVmdW5kcGFnZTEnO1xuXG4gIH1cblxuICAvLyBSZXRybyBSZWZ1bmRcblxuICAvLyBjb25maXJtUmV0cm9SZWZ1bmQoKSB7XG4gIC8vICAgdGhpcy5pc0NvbmZpcm1hdGlvbkJ0bkRpc2FibGVkID0gdHJ1ZTtcbiAgLy8gICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuICAvLyAgIHRoaXMuZXJyb3JNc2cgPSBbXTtcbiAgLy8gICBpZiggdGhpcy5pc1JlZnVuZFJlbWlzc2lvbikge1xuICAvLyAgICAgdGhpcy5yZXRyb1JlbWlzc2lvbiA9IHRydWU7XG4gIC8vICAgfVxuXG4gIC8vICAgY29uc3QgcmVxdWVzdEJvZHkgPSBuZXcgUG9zdFJlZnVuZFJldHJvUmVtaXNzaW9uKHRoaXMucGF5bWVudC5yZWZlcmVuY2UsJ1JSMDA0LVJldHJvc3BlY3RpdmUgcmVtaXNzaW9uJywgdGhpcy5jb250YWN0RGV0YWlsc09iaik7XG4gIC8vICAgdGhpcy5wYXltZW50Vmlld1NlcnZpY2UucG9zdFJlZnVuZHNSZWFzb24ocmVxdWVzdEJvZHkpLnN1YnNjcmliZShcbiAgLy8gICAgIHJlc3BvbnNlID0+IHtcbiAgLy8gICAgICAgICBpZiAoSlNPTi5wYXJzZShyZXNwb25zZSkpIHtcbiAgLy8gICAgICAgICAgIHRoaXMudmlld0NvbXBTdGF0dXMgID0gJyc7XG4gIC8vICAgICAgICAgICB0aGlzLnZpZXdTdGF0dXMgPSAncmV0cm9yZWZ1bmRjb25maXJtYXRpb25wYWdlJztcbiAgLy8gICAgICAgICAgIHRoaXMucmVmdW5kUmVmZXJlbmNlID1KU09OLnBhcnNlKHJlc3BvbnNlKS5yZWZ1bmRfcmVmZXJlbmNlO1xuICAvLyAgICAgICAgICAgaWYoSlNPTi5wYXJzZShyZXNwb25zZSkucmVmdW5kX2Ftb3VudCkge1xuICAvLyAgICAgICAgICAgICB0aGlzLnJlZnVuZEFtb3VudCA9IEpTT04ucGFyc2UocmVzcG9uc2UpLnJlZnVuZF9hbW91bnQ7XG4gIC8vICAgICAgICAgICAgIH1cbiAgLy8gICAgICAgICB9XG4gIC8vICAgICB9LFxuICAvLyAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgLy8gICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvcjtcbiAgLy8gICAgICAgdGhpcy5pc0NvbmZpcm1hdGlvbkJ0bkRpc2FibGVkID0gZmFsc2U7XG4gIC8vICAgICB9KTtcbiAgLy8gfVxuXG4gIHNlbGVjdFJhZGlvQnV0dG9uKGtleSwgdmFsdWUpIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIm15cmFkaW9cIiwgdmFsdWUpO1xuICAgIGNvbnN0IHJlbWlzc2lvbmN0cmxzID0gdGhpcy5yZW1pc3Npb25Gb3JtLmNvbnRyb2xzO1xuICAgIHJlbWlzc2lvbmN0cmxzWydyZWZ1bmRERFJlYXNvbiddLnNldFZhbHVlKCdTZWxlY3QgYSBkaWZmZXJlbnQgcmVhc29uJywgeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICByZW1pc3Npb25jdHJsc1sncmVhc29uJ10ucmVzZXQoKTtcbiAgICB0aGlzLmlzUmVmdW5kUmVhc29uc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGZhbHNlO1xuICAgIHRoaXMuZXJyb3JNc2cgPSBbXTtcbiAgICB0aGlzLmlzUmVhc29uRW1wdHkgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dSZWFzb25UZXh0ID0gZmFsc2U7XG4gICAgdGhpcy5yZWZ1bmRIYXNFcnJvciA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRSZWZ1bmRSZWFzb24gPSB2YWx1ZTtcbiAgICB0aGlzLnNlbGVjdGVkUmVmdW5kUmVhc29uQ29kZSA9IGtleTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJlZnVuZFJlYXNvbi5pbmNsdWRlcygnT3RoZXInKSkge1xuICAgICAgdGhpcy5zaG93UmVhc29uVGV4dCA9IHRydWU7XG4gICAgICB0aGlzLnJlZnVuZEhhc0Vycm9yID0gZmFsc2U7XG4gICAgICB0aGlzLnJlZnVuZFJlYXNvbiA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdGNoYW5nZShhcmdzKSB7XG4gICAgY29uc3QgcmVtaXNzaW9uY3RybHMgPSB0aGlzLnJlbWlzc2lvbkZvcm0uY29udHJvbHM7XG4gICAgcmVtaXNzaW9uY3RybHNbJ3JlZnVuZFJlYXNvbiddLnJlc2V0KCk7XG4gICAgcmVtaXNzaW9uY3RybHNbJ3JlYXNvbiddLnJlc2V0KCk7XG4gICAgdGhpcy5pc1JlZnVuZFJlYXNvbnNTZWxlY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1JlYXNvblRleHQgPSBmYWxzZTtcbiAgICB0aGlzLnJlZnVuZEhhc0Vycm9yID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZFJlZnVuZFJlYXNvbiA9IGFyZ3MudGFyZ2V0Lm9wdGlvbnNbYXJncy50YXJnZXQub3B0aW9ucy5zZWxlY3RlZEluZGV4XS5pZDtcbiAgICB0aGlzLnNlbGVjdGVkUmVmdW5kUmVhc29uQ29kZSA9IGFyZ3MudGFyZ2V0Lm9wdGlvbnNbYXJncy50YXJnZXQub3B0aW9ucy5zZWxlY3RlZEluZGV4XS52YWx1ZTtcbiAgICB0aGlzLnJlYXNvbkxlbmd0aCA9ICgyOSAtIHRoaXMuc2VsZWN0ZWRSZWZ1bmRSZWFzb24uc3BsaXQoJy0gJylbMV0ubGVuZ3RoKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkUmVmdW5kUmVhc29uLmluY2x1ZGVzKCdPdGhlcicpKSB7XG4gICAgICB0aGlzLnNob3dSZWFzb25UZXh0ID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVmdW5kSGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVmdW5kUmVhc29uID0gYXJncy50YXJnZXQub3B0aW9uc1thcmdzLnRhcmdldC5vcHRpb25zLnNlbGVjdGVkSW5kZXhdLmlkO1xuICAgIH1cblxuXG4gIH1cbiAgZ2V0Q29udGFjdERldGFpbHMob2JqOiBJUmVmdW5kQ29udGFjdERldGFpbHMsIHR5cGUpIHtcbiAgICB0aGlzLmNvbnRhY3REZXRhaWxzT2JqID0gb2JqO1xuICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnJztcbiAgICB0aGlzLm5vdGlmaWNhdGlvblByZXZpZXcgPSBmYWxzZTtcbiAgICBpZiAodHlwZSA9PSAnY2hlY2thZGRSZWZ1bmRwYWdlJykge1xuICAgICAgdGhpcy5nZXRUZW1wbGF0ZUluc3RydWN0aW9uVHlwZSh0aGlzLnJlbWVzc2lvblBheW1lbnQucmVmZXJlbmNlLCB0aGlzLnJlbWVzc2lvblBheW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnY2hlY2tpc3N1ZXJlZnVuZHBhZ2UnKSB7XG4gICAgICB0aGlzLmdldFRlbXBsYXRlSW5zdHJ1Y3Rpb25UeXBlKHRoaXMucGF5bWVudC5yZWZlcmVuY2UsIHRoaXMucGF5bWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09ICdhZGRyZWZ1bmRjaGVja2FuZGFuc3dlcicpIHtcbiAgICAgIHRoaXMuZ2V0VGVtcGxhdGVJbnN0cnVjdGlvblR5cGUodGhpcy5wYXltZW50UmVmZXJlbmNlLCB0aGlzLnBheW1lbnRPYmopO1xuICAgIH1cbiAgICB0aGlzLnZpZXdTdGF0dXMgPSB0eXBlO1xuICB9XG5cbiAgZ290b1BhcnRpYWxGZWVSZWZ1bmRTY3JlZW4oKSB7XG5cbiAgICBpZiAodGhpcy5pc0Zyb21SZWZ1bmRTdGF0dXNQYWdlKSB7XG4gICAgICB2YXIgcmVtaXNzaW9uY3RybHMgPSB0aGlzLnJlbWlzc2lvbkZvcm0uY29udHJvbHM7XG4gICAgICB0aGlzLnJlZnVuZExpc3RSZWFzb24uZW1pdCh7IHJlYXNvbjogdGhpcy5kaXNwbGF5UmVmdW5kUmVhc29uLCBjb2RlOiB0aGlzLnJlZnVuZFJlYXNvbiB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZWZ1bmRIYXNFcnJvciA9IGZhbHNlO1xuICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnaXNzdWVyZWZ1bmQnO1xuICAgIHRoaXMudmlld1N0YXR1cyA9ICcnO1xuICB9XG5cblxuXG4gIGdvdG9TZXJ2aWNlUmVxdWVzdFBhZ2UoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdGhpcy5lcnJvck1zZyA9IFtdO1xuICAgIHRoaXMuaXNGcm9tQ2hlY2tBbnNQYWdlID0gZmFsc2U7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLmlzRnJvbVJlZnVuZFN0YXR1c1BhZ2UpIHtcbiAgICAgIHZhciByZW1pc3Npb25jdHJscyA9IHRoaXMucmVtaXNzaW9uRm9ybS5jb250cm9scztcbiAgICAgIHRoaXMudG90YWxSZWZ1bmRBbW91bnQgPSAwO1xuICAgICAgdGhpcy5yZWZ1bmRMaXN0QW1vdW50LmVtaXQodGhpcy50b3RhbFJlZnVuZEFtb3VudC50b1N0cmluZygpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNGcm9tU2VydmljZVJlcXVlc3RQYWdlICYmICF0aGlzLmlzRnJvbVBheW1lbnREZXRhaWxQYWdlKSB7XG4gICAgICB0aGlzLnZpZXdTdGF0dXMgPSAnb3JkZXItZnVsbC12aWV3JztcbiAgICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNGcm9tUmVmdW5kTGlzdFBhZ2UpIHtcbiAgICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5pc2NhbmNlbENsaWNrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5yZWZ1bmRMaXN0UmVhc29uLmVtaXQoeyByZWFzb246IHRoaXMuc2VsZWN0ZWRSZWZ1bmRSZWFzb24sIGNvZGU6IHRoaXMucmVmdW5kUmVhc29uIH0pO1xuICAgICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LmlzRnJvbVJlZnVuZFN0YXR1c1BhZ2UgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQucGF5bWVudE1ldGhvZCA9IHRoaXMucGF5bWVudC5tZXRob2Q7XG4gICAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQucGF5bWVudEdyb3VwUmVmZXJlbmNlID0gdGhpcy5wYXltZW50TGliQ29tcG9uZW50LnBheW1lbnRHcm91cFJlZmVyZW5jZVxuICAgICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LnBheW1lbnRSZWZlcmVuY2UgPSB0aGlzLnBheW1lbnQucmVmZXJlbmNlO1xuICAgICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LnZpZXdOYW1lID0gJ3BheW1lbnQtdmlldyc7XG4gICAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLnNldE9yZGVyUmVmKHRoaXMub3JkZXJSZWYpO1xuICAgICAgdGhpcy5PcmRlcnNsaXN0U2VydmljZS5zZXRvcmRlckNDREV2ZW50KHRoaXMub3JkZXJDQ0RFdmVudCk7XG4gICAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLnNldG9yZGVyQ3JlYXRlZCh0aGlzLm9yZGVyQ3JlYXRlZCk7XG4gICAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLnNldG9yZGVyRGV0YWlsKHRoaXMub3JkZXJEZXRhaWwpO1xuICAgICAgdGhpcy5PcmRlcnNsaXN0U2VydmljZS5zZXRvcmRlclBhcnR5KHRoaXMub3JkZXJQYXJ0eSk7XG4gICAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLnNldG9yZGVyVG90YWxQYXltZW50cyh0aGlzLm9yZGVyVG90YWxQYXltZW50cyk7XG4gICAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLnNldG9yZGVyUmVtaXNzaW9uVG90YWwodGhpcy5vcmRlclJlbWlzc2lvblRvdGFsKTtcbiAgICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0b3JkZXJGZWVzVG90YWwodGhpcy5vcmRlckZlZXNUb3RhbCk7XG4gICAgICB0aGlzLnZpZXdTdGF0dXMgPSAncGF5bWVudC12aWV3JztcbiAgICAgIHRoaXMuc2VuZE9yZGVyRGV0YWlsID0gdGhpcy5vcmRlckRldGFpbDtcbiAgICAgIHRoaXMuc2VuZE9yZGVyUmVmID0gdGhpcy5vcmRlclJlZjtcbiAgICAgIGlmICh0aGlzLkxPR0dFRElOVVNFUlJPTEVTID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5PcmRlcnNsaXN0U2VydmljZS5nZXRVc2VyUm9sZXNMaXN0KCkuc3Vic2NyaWJlKChkYXRhKSA9PiB0aGlzLkxPR0dFRElOVVNFUlJPTEVTID0gZGF0YSk7XG4gICAgICB9XG4gICAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJyc7XG4gICAgfVxuXG4gIH1cbiAgZ290b0FkZHJlc3NQYWdlKG5vdGU/OiBJUmVmdW5kQ29udGFjdERldGFpbHMpIHtcbiAgICBpZiAobm90ZSkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSB7IGNvbnRhY3RfZGV0YWlsczogbm90ZSwgbm90aWZpY2F0aW9uX3R5cGU6IG5vdGUubm90aWZpY2F0aW9uX3R5cGUgfTtcbiAgICB9XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJ2FkZHJlZnVuZGZvcnJlbWlzc2lvbic7XG4gICAgdGhpcy52aWV3U3RhdHVzID0gJyc7XG4gICAgdGhpcy5pc1JlZnVuZFJlbWlzc2lvbiA9IHRydWU7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBmYWxzZTtcbiAgfVxuICBnb3RvUmVtaXNzaW9uU3VjY2VzcyhldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdGhpcy52aWV3Q29tcFN0YXR1cyA9ICcnO1xuICAgIHRoaXMudmlld1N0YXR1cyA9ICdyZXRyb3JlbWlzc2lvbmNvbmZpcm1hdGlvbnBhZ2UnO1xuICAgIHRoaXMuaXNSZWZ1bmRSZW1pc3Npb24gPSB0cnVlO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZmFsc2U7XG4gIH1cblxuICBnb3RvQ2FzZXRyYW5zYXRpb25QYWdlKCkge1xuICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0bmF2aWdhdGlvblBhZ2UoJ2Nhc2V0cmFuc2FjdGlvbnMnKTtcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JNc2cgPSBbXTtcbiAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQudmlld05hbWUgPSAnY2FzZS10cmFuc2FjdGlvbnMnO1xuICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5WSUVXID0gJ2Nhc2UtdHJhbnNhY3Rpb25zJztcbiAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuSVNUVVJOT0ZGID0gdGhpcy5pc1R1cm5PZmY7XG4gICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LmlzRnJvbVNlcnZpY2VSZXF1ZXN0UGFnZSA9IHRydWU7XG4gICAgdGhpcy5yZXNldE9yZGVyRGF0YSgpO1xuICAgIGxldCBwYXJ0VXJsID0gdGhpcy5ic1BheW1lbnREY25OdW1iZXIgPyBgJmRjbj0ke3RoaXMuYnNQYXltZW50RGNuTnVtYmVyfWAgOiAnJztcbiAgICBwYXJ0VXJsICs9IHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5JU0JTRU5BQkxFID8gJyZpc0J1bGtTY2FubmluZz1FbmFibGUnIDogJyZpc0J1bGtTY2FubmluZz1EaXNhYmxlJztcbiAgICBwYXJ0VXJsICs9IHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5JU1RVUk5PRkYgPyAnJmlzVHVybk9mZj1FbmFibGUnIDogJyZpc1R1cm5PZmY9RGlzYWJsZSc7XG4gICAgcGFydFVybCArPSB0aGlzLmlzU3RyYXRlZ2ljRml4RW5hYmxlID8gJyZpc1N0Rml4RW5hYmxlPUVuYWJsZScgOiAnJmlzU3RGaXhFbmFibGU9RGlzYWJsZSc7XG4gICAgcGFydFVybCArPSBgJmNhc2VUeXBlPSR7dGhpcy5jYXNlVHlwZX1gO1xuICAgIGNvbnN0IHVybCA9IGAvcGF5bWVudC1oaXN0b3J5LyR7dGhpcy5jY2RDYXNlTnVtYmVyfT92aWV3PWNhc2UtdHJhbnNhY3Rpb25zJnRha2VQYXltZW50PSR7dGhpcy5wYXltZW50TGliQ29tcG9uZW50LlRBS0VQQVlNRU5UfSZzZWxlY3RlZE9wdGlvbj0ke3RoaXMub3B0aW9ufSR7cGFydFVybH1gO1xuICAgIHRoaXMucm91dGVyLnJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRSZXVzZVJvdXRlID0gKCkgPT4gZmFsc2U7XG4gICAgdGhpcy5yb3V0ZXIub25TYW1lVXJsTmF2aWdhdGlvbiA9ICdyZWxvYWQnO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodXJsKTtcbiAgfVxuXG4gIGdvdG9DYXNldHJhbnNhdGlvblBhZ2VDYW5jZWxCdG5DbGlja2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5lcnJvck1zZyA9IFtdO1xuICAgIGlmICh0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuaXNGcm9tU2VydmljZVJlcXVlc3RQYWdlICE9PSB1bmRlZmluZWQgJiYgIXRoaXMucGF5bWVudExpYkNvbXBvbmVudC5pc0Zyb21TZXJ2aWNlUmVxdWVzdFBhZ2UpIHtcbiAgICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0bmF2aWdhdGlvblBhZ2UoJ2Nhc2V0cmFuc2FjdGlvbnMnKTtcbiAgICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0aXNGcm9tU2VydmljZVJlcXVlc3RQYWdlKGZhbHNlKTtcbiAgICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5WSUVXID0gJ2Nhc2UtdHJhbnNhY3Rpb25zJztcbiAgICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC52aWV3TmFtZSA9ICdjYXNlLXRyYW5zYWN0aW9ucyc7XG4gICAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuSVNCU0VOQUJMRSA9IHRydWU7XG4gICAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuaXNSZWZ1bmRTdGF0dXNWaWV3ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcblxuICAgICAgaWYgKHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5SRUZVTkRMSVNUKSB7XG4gICAgICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC52aWV3TmFtZSA9ICdyZWZ1bmQtbGlzdCc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuVEFLRVBBWU1FTlQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuU0VSVklDRVJFUVVFU1QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuU0VSVklDRVJFUVVFU1QgPSAnZmFsc2UnO1xuICAgICAgfVxuICAgICAgdGhpcy5PcmRlcnNsaXN0U2VydmljZS5zZXRpc0Zyb21TZXJ2aWNlUmVxdWVzdFBhZ2UoZmFsc2UpO1xuICAgICAgdGhpcy5PcmRlcnNsaXN0U2VydmljZS5zZXRwYXltZW50UGFnZVZpZXcoeyBtZXRob2Q6ICcnLCBwYXltZW50X2dyb3VwX3JlZmVyZW5jZTogJycsIHJlZmVyZW5jZTogJycgfSk7XG4gICAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLnNldG5hdmlnYXRpb25QYWdlKCdjYXNldHJhbnNhY3Rpb25zJyk7XG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LnZpZXdOYW1lID0gJ2Nhc2UtdHJhbnNhY3Rpb25zJztcbiAgICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5JU1RVUk5PRkYgPSB0aGlzLmlzVHVybk9mZjtcbiAgICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5pc0Zyb21TZXJ2aWNlUmVxdWVzdFBhZ2UgPSB0cnVlO1xuICAgICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LklTQlNFTkFCTEUgPSB0cnVlO1xuICAgICAgbGV0IHBhcnRVcmwgPSB0aGlzLmJzUGF5bWVudERjbk51bWJlciA/IGAmZGNuPSR7dGhpcy5ic1BheW1lbnREY25OdW1iZXJ9YCA6ICcnO1xuICAgICAgcGFydFVybCArPSB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuSVNCU0VOQUJMRSA/ICcmaXNCdWxrU2Nhbm5pbmc9RW5hYmxlJyA6ICcmaXNCdWxrU2Nhbm5pbmc9RGlzYWJsZSc7XG4gICAgICBwYXJ0VXJsICs9IHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5JU1RVUk5PRkYgPyAnJmlzVHVybk9mZj1FbmFibGUnIDogJyZpc1R1cm5PZmY9RGlzYWJsZSc7XG4gICAgICBwYXJ0VXJsICs9IHRoaXMuaXNTdHJhdGVnaWNGaXhFbmFibGUgPyAnJmlzU3RGaXhFbmFibGU9RW5hYmxlJyA6ICcmaXNTdEZpeEVuYWJsZT1EaXNhYmxlJztcbiAgICAgIHBhcnRVcmwgKz0gYCZjYXNlVHlwZT0ke3RoaXMuY2FzZVR5cGV9YDtcbiAgICAgIGlmICh0aGlzLmlzRnJvbVBheW1lbnREZXRhaWxQYWdlKSB7XG4gICAgICAgIHBhcnRVcmwgKz0gdGhpcy5wYXltZW50TGliQ29tcG9uZW50LmlzRnJvbVBheW1lbnREZXRhaWxQYWdlXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5wYXltZW50TGliQ29tcG9uZW50LlNFUlZJQ0VSRVFVRVNUKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAvcGF5bWVudC1oaXN0b3J5LyR7dGhpcy5jY2RDYXNlTnVtYmVyfT92aWV3PWNhc2UtdHJhbnNhY3Rpb25zJnRha2VQYXltZW50PSR7dGhpcy5wYXltZW50TGliQ29tcG9uZW50LlRBS0VQQVlNRU5UfSZzZWxlY3RlZE9wdGlvbj0ke3RoaXMub3B0aW9ufSR7cGFydFVybH1gO1xuICAgICAgICB0aGlzLnJvdXRlci5yb3V0ZVJldXNlU3RyYXRlZ3kuc2hvdWxkUmV1c2VSb3V0ZSA9ICgpID0+IGZhbHNlO1xuICAgICAgICB0aGlzLnJvdXRlci5vblNhbWVVcmxOYXZpZ2F0aW9uID0gJ3JlbG9hZCc7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAvcGF5bWVudC1oaXN0b3J5LyR7dGhpcy5jY2RDYXNlTnVtYmVyfT9zZWxlY3RlZE9wdGlvbj0ke3RoaXMub3B0aW9ufSR7cGFydFVybH1gO1xuICAgICAgICB0aGlzLnJvdXRlci5yb3V0ZVJldXNlU3RyYXRlZ3kuc2hvdWxkUmV1c2VSb3V0ZSA9ICgpID0+IGZhbHNlO1xuICAgICAgICB0aGlzLnJvdXRlci5vblNhbWVVcmxOYXZpZ2F0aW9uID0gJ3JlbG9hZCc7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodXJsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIHJlc2V0T3JkZXJEYXRhKCkge1xuICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0T3JkZXJSZWYobnVsbCk7XG4gICAgdGhpcy5PcmRlcnNsaXN0U2VydmljZS5zZXRvcmRlckNDREV2ZW50KG51bGwpO1xuICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0b3JkZXJDcmVhdGVkKG51bGwpO1xuICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0b3JkZXJEZXRhaWwobnVsbCk7XG4gICAgdGhpcy5PcmRlcnNsaXN0U2VydmljZS5zZXRvcmRlclBhcnR5KG51bGwpO1xuICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0b3JkZXJUb3RhbFBheW1lbnRzKG51bGwpO1xuICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0b3JkZXJSZW1pc3Npb25Ub3RhbChudWxsKTtcbiAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLnNldG9yZGVyRmVlc1RvdGFsKG51bGwpO1xuICB9XG5cbiAgY2hhbmdlUmVmdW5kQW1vdW50KCkge1xuICAgIHRoaXMuaXNGcm9tQ2hlY2tBbnNQYWdlID0gdHJ1ZTtcbiAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJ2lzc3VlcmVmdW5kJztcbiAgICB0aGlzLnZpZXdTdGF0dXMgPSAnJztcbiAgfVxuXG4gIGdldEZvcm1hdHRlZEN1cnJlbmN5KGN1cnJlbmN5OiBudW1iZXIpIHtcbiAgICBpZiAoY3VycmVuY3kudG9TdHJpbmcoKS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIHJldHVybiBjdXJyZW5jeVxuICAgIH1cbiAgICByZXR1cm4gY3VycmVuY3kudG9TdHJpbmcoKS5jb25jYXQoXCIuMDBcIik7XG4gIH1cblxuICBzaG93Tm90aWZpY2F0aW9uUHJldmlldygpOiB2b2lkIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvblByZXZpZXcgPSB0cnVlO1xuICB9XG5cbiAgaGlkZU5vdGlmaWNhdGlvblByZXZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25QcmV2aWV3ID0gZmFsc2U7XG4gIH1cblxuICBnZXRUZW1wbGF0ZUluc3RydWN0aW9uVHlwZShwYXltZW50UmVmZXJlbmNlOiBzdHJpbmcsIHBheW1lbnQ/OiBJUGF5bWVudCk6IHZvaWQge1xuXG4gICAgaWYgKHBheW1lbnQgPT0gdW5kZWZpbmVkIHx8IHBheW1lbnQgPT0gbnVsbCB8fCBwYXltZW50LnJlZmVyZW5jZSAhPSBwYXltZW50UmVmZXJlbmNlKSB7XG4gICAgICB0aGlzLnBheW1lbnRWaWV3U2VydmljZS5nZXRQYXltZW50RGV0YWlscyhwYXltZW50UmVmZXJlbmNlKS5zdWJzY3JpYmUoXG4gICAgICAgIHBheW1lbnQgPT4ge1xuICAgICAgICAgIHRoaXMucGF5bWVudE9iaiA9IHBheW1lbnQ7XG4gICAgICAgICAgdGhpcy5wYXltZW50T2JqLnJlZmVyZW5jZSA9IHBheW1lbnRSZWZlcmVuY2U7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZUluc3RydWN0aW9uVHlwZSA9IHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5nZXROb3RpZmljYXRpb25JbnN0cnVjdGlvblR5cGUodGhpcy5wYXltZW50T2JqLmNoYW5uZWwsIHRoaXMucGF5bWVudE9iai5tZXRob2QpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMudGVtcGxhdGVJbnN0cnVjdGlvblR5cGUgPSAnVGVtcGxhdGUnO1xuICAgICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlbXBsYXRlSW5zdHJ1Y3Rpb25UeXBlID0gdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmdldE5vdGlmaWNhdGlvbkluc3RydWN0aW9uVHlwZShwYXltZW50LmNoYW5uZWwsIHBheW1lbnQubWV0aG9kKTtcbiAgICB9XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImFkZC1yZW1pc3Npb24gcGFnZXNpemVcIj5cbiAgPGRpdiAqbmdJZj1cImVycm9yTWVzc2FnZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJlcnJvci1zdW1tYXJ5XCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbGxlZGJ5PVwiZmFpbHVyZS1lcnJvci1zdW1tYXJ5LWhlYWRpbmdcIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICA8aDIgY2xhc3M9XCJoZWFkaW5nLW1lZGl1bSBlcnJvci1zdW1tYXJ5LWhlYWRpbmdcIiBpZD1cImZhaWx1cmUtZXJyb3Itc3VtbWFyeS1oZWFkaW5nXCI+XG4gICAgICAgIEVycm9yIGluIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3RcbiAgICAgIDwvaDI+XG4gICAgICA8ZGl2ICBjbGFzcz1cImdvdnVrLWVycm9yLXN1bW1hcnlfX2JvZHlcIj5cbiAgICAgICAge3sgZXJyb3JNZXNzYWdlIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJlcnJvck1zZy5sZW5ndGggPiAwXCI+XG4gICAgPGRpdiBjbGFzcz1cImVycm9yLXN1bW1hcnlcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsbGVkYnk9XCJmYWlsdXJlLWVycm9yLXN1bW1hcnktaGVhZGluZ1wiIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgIDxoMiBjbGFzcz1cImhlYWRpbmctbWVkaXVtIGVycm9yLXN1bW1hcnktaGVhZGluZ1wiIGlkPVwiZmFpbHVyZS1lcnJvci1zdW1tYXJ5LWhlYWRpbmdcIj5cbiAgICAgICAgRXJyb3IgaW4gcHJvY2Vzc2luZyB0aGUgcmVxdWVzdFxuICAgICAgPC9oMj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVyciBvZiBlcnJvck1zZzsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZ292dWstZXJyb3Itc3VtbWFyeV9fYm9keVwiPlxuICAgICAgIFxuICAgICAgICA8bGk+e3tlcnJ9fTwvbGk+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3U3RhdHVzID09PSAnbWFpbicgJiYgIWlzUmVmdW5kUmVtaXNzaW9uIFwiPlxuICAgIDxpbnB1dCAjbXlJbnB1dCB0eXBlPSdoaWRkZW4nIGlkPSdpRnJhbWVEcml2ZW5JbWFnZVZhbHVlJyB2YWx1ZT0nQUREUkVNSVNTSU9OJz5cbiAgICA8aDEgY2xhc3M9XCJoZWFkaW5nLWxhcmdlXCI+QWRkIHJlbWlzc2lvbiA8L2gxPlxuICAgIDxmb3JtIG5vdmFsaWRhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ292dWstZm9ybS1ncm91cFwiPlxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInJlbWlzc2lvbkZvcm1cIiBub3ZhbGlkYXRlPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1mb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnb3Z1ay1sYWJlbCBnb3Z1ay1sYWJlbC0tc1wiIGZvcj1cInJlbWlzc2lvbi1jb2RlXCI+XG4gICAgICAgICAgICAgICAgQWRkIHJlbWlzc2lvbiB0byB7eyBmZWU/LmNvZGUgfX06IHt7IGZlZT8uZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLWhpbnRcIj5FbnRlciByZW1pc3Npb24gZm9yIHJlZmVyZW5jZS4gRm9yIGV4YW1wbGU6IEhXRi1BMUItMjNDIE9SIFBBMjEtMTIzNDU2PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBbbmdDbGFzc109XCJ7J2lubGluZS1lcnJvci1jbGFzcyc6IGlzUmVtaXNzaW9uQ29kZUVtcHR5IHx8IHJlbWlzc2lvbkNvZGVIYXNFcnJvcn1cIiBjbGFzcz1cImdvdnVrLWlucHV0IGdvdnVrLWlucHV0LS13aWR0aC0yMCBnb3Z1ay0hLW1hcmdpbi1yaWdodC0xXCIgaWQ9XCJyZW1pc3Npb25Db2RlXCIgYXJpYS1sYWJlbD1cInJlbWlzc2lvbkNvZGVcIiAgbmFtZT1cInJlbWlzc2lvbkNvZGVcIiB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInJlbWlzc2lvbkNvZGVcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwiaW5saW5lLWVycm9yLW1lc3NhZ2VcIiAqbmdJZj1cImlzUmVtaXNzaW9uQ29kZUVtcHR5IHx8IHJlbWlzc2lvbkNvZGVIYXNFcnJvclwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzUmVtaXNzaW9uQ29kZUVtcHR5XCI+RW50ZXIgYSByZW1pc3Npb24gY29kZTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyZW1pc3Npb25Db2RlSGFzRXJyb3JcIj5FbnRlciBhIHZhaWxkIHJlbWlzc2lvbiBjb2RlPC9zcGFuPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1mb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnb3Z1ay1sYWJlbCBnb3Z1ay1sYWJlbC0tc1wiIGZvcj1cImFtb3VudFwiPlxuICAgICAgICAgICAgICBIb3cgbXVjaCBkb2VzIHRoZSBhcHBsaWNhbnQgbmVlZCB0byBwYXk/XG4gICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICA8ZGl2IGlkPVwiYW1vdW50LWN1cnJlbmN5XCIgY2xhc3M9XCJnb3Z1ay12aXN1YWxseS1oaWRkZW5cIj5pbiBwb3VuZHM8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhtY3RzLWN1cnJlbmN5LWlucHV0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJobWN0cy1jdXJyZW5jeS1pbnB1dF9fc3ltYm9sXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+wqM8L2Rpdj5cbiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZ292dWstaW5wdXQgZ292dWstaW5wdXQtLXdpZHRoLTEwXCIgW25nQ2xhc3NdPVwieydpbmxpbmUtZXJyb3ItY2xhc3MnOiBpc0Ftb3VudEVtcHR5IHx8IGFtb3VudEhhc0Vycm9yIHx8IGlzUmVtaXNzaW9uTGVzc1RoYW5GZWVFcnJvcn1cIiBpZD1cImFtb3VudFwiIGFyaWEtbGFiZWw9XCJhbW91bnRcIiAgbmFtZT1cImFtb3VudFwiIHR5cGU9XCJ0ZXh0XCIgYXJpYS1kZXNjcmliZWRieT1cImFtb3VudC1jdXJyZW5jeVwiIGZvcm1Db250cm9sTmFtZT1cImFtb3VudFwiPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImlubGluZS1lcnJvci1tZXNzYWdlXCIgKm5nSWY9XCJpc0Ftb3VudEVtcHR5IHx8IGFtb3VudEhhc0Vycm9yIHx8IGlzUmVtaXNzaW9uTGVzc1RoYW5GZWVFcnJvclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNBbW91bnRFbXB0eVwiPkVudGVyIGEgYW1vdW50PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYW1vdW50SGFzRXJyb3JcIj5FbnRlciBhIHZhaWxkIGFtb3VudDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzUmVtaXNzaW9uTGVzc1RoYW5GZWVFcnJvclwiPlRoZSByZW1pc3Npb24gYW1vdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSB0b3RhbCBmZWU8L3NwYW4+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b25cIiB0eXBlPVwic3VibWl0XCIgKGNsaWNrKT1cImFkZFJlbWlzc2lvbigpXCI+XG4gICAgICAgICAgICBTdWJtaXRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwidmlld1N0YXR1cyA9PT0gJ2NvbmZpcm1hdGlvbidcIj5cbiAgICA8aW5wdXQgI215SW5wdXQgdHlwZT0naGlkZGVuJyBpZD0naUZyYW1lRHJpdmVuSW1hZ2VWYWx1ZScgdmFsdWU9J0FERFJFTUlTU0lPTkNPTkZJUk1BVElPTic+IFxuICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay13YXJuaW5nLXRleHRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZ292dWstd2FybmluZy10ZXh0X19pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+ITwvc3Bhbj5cbiAgICAgIDxzdHJvbmcgY2xhc3M9XCJnb3Z1ay13YXJuaW5nLXRleHRfX3RleHRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJnb3Z1ay13YXJuaW5nLXRleHRfX2Fzc2lzdGl2ZVwiPldhcm5pbmc8L3NwYW4+XG4gICAgICAgIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBhZGQgcmVtaXNzaW9uIHRvIHRoaXMgZmVlP1xuICAgICAgPC9zdHJvbmc+XG4gICAgPC9kaXY+XG4gICAgPHRhYmxlIGNsYXNzPVwiZ292dWstdGFibGVcIj5cbiAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5SZW1pc3Npb24gY29kZTo8L3RkPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3sgcmVtaXNzaW9uRm9ybS5jb250cm9scy5yZW1pc3Npb25Db2RlLnZhbHVlIH19PC90ZD5cbiAgICAgIDwvdHI+XG4gICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+RmVlIGNvZGU6PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7IGZlZS5jb2RlIH19PC90ZD5cbiAgICAgIDwvdHI+XG4gICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+RmVlIGRlc2NyaXB0aW9uOjwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGxcIj57eyBmZWUuZGVzY3JpcHRpb24gfX08L3RkPlxuICAgICAgPC90cj5cbiAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5BbW91bnQgdGhlIGFwcGxpY2FudCBtdXN0IHBheTo8L3RkPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3sgIHJlbWlzc2lvbkZvcm0uY29udHJvbHMuYW1vdW50LnZhbHVlICB8IGN1cnJlbmN5OidHQlAnOidzeW1ib2wtbmFycm93JzonMS4yLTInIH19PC90ZD5cbiAgICAgIDwvdHI+XG4gICAgPC90YWJsZT5cblxuICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnV0dG9uIGdvdnVrLWJ1dHRvbi0tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImNhbmNlbFJlbWlzc2lvbi5lbWl0KClcIj5cbiAgICAgIENhbmNlbFxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiXG4gICAgW2Rpc2FibGVkXT1cImlzQ29uZmlybWF0aW9uQnRuRGlzYWJsZWRcIlxuICAgIFtuZ0NsYXNzXT0naXNDb25maXJtYXRpb25CdG5EaXNhYmxlZCA/IFwiYnV0dG9uIGJ1dHRvbi0tZGlzYWJsZWQgZ292dWstIS1tYXJnaW4tcmlnaHQtMVwiIDogXCJidXR0b24gZ292dWstIS1tYXJnaW4tcmlnaHQtMVwiJ1xuICAgIChjbGljayk9XCJjb25maXJtUmVtaXNzaW9uKClcIj5cbiAgICAgIENvbmZpcm1cbiAgICA8L2J1dHRvbj5cblxuPC9uZy1jb250YWluZXI+XG5cbjwhLS0gQWRkIHJldHJvIHJlbWlzc2lvbiBjaGFuZ2VzLS0+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3Q29tcFN0YXR1cyA9PT0gJ2FkZHJlbWlzc2lvbidcIj5cbiAgICA8aW5wdXQgI215SW5wdXQgdHlwZT0naGlkZGVuJyBpZD0naUZyYW1lRHJpdmVuSW1hZ2VWYWx1ZScgdmFsdWU9J1BST0NFU1NBRERSRVRST1JFTUlTU0lPTlBBR0UnPiBcbiAgICA8aDEgY2xhc3M9XCJoZWFkaW5nLWxhcmdlXCI+UHJvY2VzcyByZW1pc3Npb248L2gxPlxuICAgIDxoMSBjbGFzcz1cImhlYWRpbmctbWVkaXVtXCI+I3t7Y2NkQ2FzZU51bWJlciB8IGNjZEh5cGhlbnN9fTwvaDE+XG4gICAgPGgxIGNsYXNzPVwiaGVhZGluZy1sYXJnZVwiPkVudGVyIGhlbHAgd2l0aCBmZWVzIG9yIHJlbWlzc2lvbiByZWZlcmVuY2U8L2gxPlxuICAgIDxmb3JtIG5vdmFsaWRhdGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1mb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJyZW1pc3Npb25Gb3JtXCIgbm92YWxpZGF0ZT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1mb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdvdnVrLWxhYmVsIGdvdnVrLWxhYmVsLS1zXCIgZm9yPVwicmVtaXNzaW9uLWNvZGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0taGludFwiPkZvciBleGFtcGxlOiBIV0YtQTFCLTIzQyBPUiBQQTIxLTEyMzQ1Njwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJpbmxpbmUtZXJyb3ItbWVzc2FnZVwiICpuZ0lmPVwiaXNSZW1pc3Npb25Db2RlRW1wdHkgfHwgcmVtaXNzaW9uQ29kZUhhc0Vycm9yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1JlbWlzc2lvbkNvZGVFbXB0eVwiPkVudGVyIGEgcmVtaXNzaW9uIGNvZGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyZW1pc3Npb25Db2RlSGFzRXJyb3JcIj5FbnRlciBhIHZhaWxkIHJlbWlzc2lvbiBjb2RlPC9zcGFuPlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxpbnB1dCBbbmdDbGFzc109XCJ7J2lubGluZS1lcnJvci1jbGFzcyc6IGlzUmVtaXNzaW9uQ29kZUVtcHR5IHx8IHJlbWlzc2lvbkNvZGVIYXNFcnJvcn1cIiBjbGFzcz1cImdvdnVrLWlucHV0IGdvdnVrLWlucHV0LS13aWR0aC0yMCBnb3Z1ay0hLW1hcmdpbi1yaWdodC0xXCIgaWQ9XCJyZW1pc3Npb25Db2RlXCIgYXJpYS1sYWJlbD1cInJlbWlzc2lvbkNvZGVcIiAgbmFtZT1cInJlbWlzc2lvbkNvZGVcIiB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInJlbWlzc2lvbkNvZGVcIj5cbiAgICAgICAgICAgXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLWJ1dHRvbi1ncm91cFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJnb3RvU2VydmljZVJlcXVlc3RQYWdlKCRldmVudClcIiBjbGFzcz1cImdvdnVrLWJ1dHRvbiBnb3Z1ay1idXR0b24tLXNlY29uZGFyeVwiPiBQcmV2aW91czwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhZGRSZW1pc3Npb25Db2RlKClcIiBjbGFzcz1cImdvdnVrLWJ1dHRvblwiPiBDb250aW51ZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwPjxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAoY2xpY2spPVwiZ290b0Nhc2V0cmFuc2F0aW9uUGFnZUNhbmNlbEJ0bkNsaWNrZWQoJGV2ZW50KVwiIGNsYXNzPVwiZ292dWstbGluayBwb2ludGVyXCIgZGF0YS1tb2R1bGU9XCJnb3Z1ay1idXR0b25cIj5DYW5jZWw8L2E+PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+XG5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwidmlld1N0YXR1cyA9PT0gJ3Byb2Nlc3NyZXRyb3JlbWlzc29ucGFnZSdcIiA+XG4gICAgPGlucHV0ICNteUlucHV0IHR5cGU9J2hpZGRlbicgaWQ9J2lGcmFtZURyaXZlbkltYWdlVmFsdWUnIHZhbHVlPSdQUk9DRVNTUkVUUk9SRU1JU1NJT05QQUdFJz4gXG4gICAgPGgxIGNsYXNzPVwiaGVhZGluZy1sYXJnZVwiPlByb2Nlc3MgcmVtaXNzaW9uPC9oMT5cbiAgICA8aDEgY2xhc3M9XCJoZWFkaW5nLW1lZGl1bVwiPiN7e2NjZENhc2VOdW1iZXIgfCBjY2RIeXBoZW5zIH19PC9oMT5cbiAgICA8ZGl2IGNsYXNzPVwiZ292dWstZm9ybS1ncm91cFwiPlxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLWZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInJlbWlzc2lvbkZvcm1cIiBub3ZhbGlkYXRlPlxuICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJnb3Z1ay1maWVsZHNldFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3M9XCJnb3Z1ay1maWVsZHNldF9fbGVnZW5kIGdvdnVrLWZpZWxkc2V0X19sZWdlbmQtLW1cIj4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxoMSAqbmdJZj1cInJlbWVzc2lvblBheW1lbnQ/LnN0YXR1cyA9PT0gJ1N1Y2Nlc3MnIHx8ICAgaXNGcm9tUmVmdW5kTGlzdFBhZ2VcIiBjbGFzcz1cImhlYWRpbmctbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRlciB0aGUgYW1vdW50IHRvIGJlIHJlZnVuZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDE+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aDEgKm5nSWY9XCJyZW1lc3Npb25QYXltZW50Py5zdGF0dXMgIT09ICdTdWNjZXNzJyAmJiAhaXNGcm9tUmVmdW5kTGlzdFBhZ2VcIiBjbGFzcz1cImhlYWRpbmctbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRlciB0aGUgcmVtaXNzaW9uIGFtb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gxPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxICpuZ0lmPVwicmVtZXNzaW9uUGF5bWVudD8uc3RhdHVzID09PSAndW5kZWZpbmVkJ1wiIGNsYXNzPVwiaGVhZGluZy1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGVyIHRoZSAgYW1vdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDE+IFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiYW1vdW50LWN1cnJlbmN5XCIgY2xhc3M9XCJnb3Z1ay12aXN1YWxseS1oaWRkZW5cIj5pbiBwb3VuZHM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaW5saW5lLWVycm9yLW1lc3NhZ2VcIiAqbmdJZj1cImlzQW1vdW50RW1wdHkgfHwgYW1vdW50SGFzRXJyb3IgfHwgaXNSZW1pc3Npb25MZXNzVGhhbkZlZUVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0Ftb3VudEVtcHR5XCI+RW50ZXIgYSBhbW91bnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJhbW91bnRIYXNFcnJvclwiPkVudGVyIGEgdmFpbGQgYW1vdW50PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNSZW1pc3Npb25MZXNzVGhhbkZlZUVycm9yXCI+WW91IGNhbm5vdCBhZGQgYSByZW1pc3Npb24gdGhhdCdzIG1vcmUgdGhhbiB0aGUgZmVlIGFtb3VudC48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJobWN0cy1jdXJyZW5jeS1pbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJobWN0cy1jdXJyZW5jeS1pbnB1dF9fc3ltYm9sXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+wqM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJnb3Z1ay1pbnB1dCBnb3Z1ay1pbnB1dC0td2lkdGgtMTBcIiBbbmdDbGFzc109XCJ7J2lubGluZS1lcnJvci1jbGFzcyc6IGlzQW1vdW50RW1wdHkgfHwgYW1vdW50SGFzRXJyb3IgfHwgaXNSZW1pc3Npb25MZXNzVGhhbkZlZUVycm9yfVwiIGlkPVwiYW1vdW50XCIgYXJpYS1sYWJlbD1cImFtb3VudFwiICBuYW1lPVwiYW1vdW50XCIgIHR5cGU9XCJudW1iZXJcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiYW1vdW50LWN1cnJlbmN5XCIgZm9ybUNvbnRyb2xOYW1lPVwiYW1vdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLWJ1dHRvbi1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJnb3RvQWRkUmV0cm9SZW1pc3Npb25Db2RlUGFnZSgpXCIgY2xhc3M9XCJnb3Z1ay1idXR0b24gZ292dWstYnV0dG9uLS1zZWNvbmRhcnlcIj4gUHJldmlvdXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZ290b0NoZWNrUmV0cm9SZW1pc3Npb25QYWdlKHBheW1lbnQpXCIgY2xhc3M9XCJnb3Z1ay1idXR0b25cIj4gQ29udGludWU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAoY2xpY2spPVwiZ290b0Nhc2V0cmFuc2F0aW9uUGFnZUNhbmNlbEJ0bkNsaWNrZWQoJGV2ZW50KVwiIGNsYXNzPVwiZ292dWstbGlua1wiIGRhdGEtbW9kdWxlPVwiZ292dWstYnV0dG9uXCI+Q2FuY2VsPC9hPlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgXG4gICAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdTdGF0dXMgPT09ICdjaGVja3JldHJvcmVtaXNzaW9ucGFnZSdcIj5cbiAgICA8aW5wdXQgI215SW5wdXQgdHlwZT0naGlkZGVuJyBpZD0naUZyYW1lRHJpdmVuSW1hZ2VWYWx1ZScgdmFsdWU9J0NIRUNLUkVUUk9SRU1JU1NJT05DT05GSVJNQVRJT04nPiBcbiAgICA8ZGl2IGNsYXNzPVwiZ292dWstd2FybmluZy10ZXh0XCI+XG4gICAgICAgIDxoMSBjbGFzcz1cImhlYWRpbmctbGFyZ2VcIj4gQ2hlY2sgeW91ciBhbnN3ZXJzPC9oMT5cbiAgICA8L2Rpdj5cbiAgICA8dGFibGUgY2xhc3M9XCJnb3Z1ay10YWJsZVwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5QYXltZW50IHJlZmVyZW5jZTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7cmVtZXNzaW9uUGF5bWVudCA/IHJlbWVzc2lvblBheW1lbnQucmVmZXJlbmNlOiAnICd9fTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPlBheW1lbnQgYW1vdW50PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+wqN7eyByZW1lc3Npb25QYXltZW50ID8gZ2V0Rm9ybWF0dGVkQ3VycmVuY3kocmVtZXNzaW9uUGF5bWVudC5hbW91bnQpOiAnICcgfCBjdXJyZW5jeSA6J0dCUCc6J3N5bWJvbCc6JzEuMi0yJ319IDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPlBheW1lbnQgc3RhdHVzPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3tyZW1lc3Npb25QYXltZW50ID8gcmVtZXNzaW9uUGF5bWVudC5zdGF0dXM6ICcnfX08L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5GZWU8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGxcIj57eyBmZWUuY29kZSB9fSAtIHt7IGZlZS5kZXNjcmlwdGlvbiB9fSA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+RmVlIGFtb3VudDwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGxcIj57eyBmZWUuY2FsY3VsYXRlZF9hbW91bnQvZmVlLnZvbHVtZXwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMicgfX08L3RkPlxuICAgICAgPC90cj5cbiAgICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+SGVscCB3aXRoIGZlZXMgb3IgcmVtaXNzaW9uIHJlZmVyZW5jZTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7IHJlbWlzc2lvbkZvcm0uY29udHJvbHMucmVtaXNzaW9uQ29kZS52YWx1ZT8udHJpbSgpIH19XG4gICAgICAgICAgICAgPGEgKGNsaWNrKT1cImdvdG9Qcm9jZXNzUmV0cm9SZW1pc3Npb25QYWdlKClcIiBjbGFzcz1cImdvdnVrLWxpbmsgcmlnaHRcIiA+Q2hhbmdlPC9hPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwicmVtZXNzaW9uUGF5bWVudC5zdGF0dXMgPT09ICdTdWNjZXNzJ1wiIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+UmVmdW5kIGFtb3VudDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJyZW1lc3Npb25QYXltZW50LnN0YXR1cyAhPT0gJ1N1Y2Nlc3MnXCIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5SZW1pc3Npb24gYW1vdW50PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3tyZW1pc3Npb25Gb3JtLmNvbnRyb2xzLmFtb3VudC52YWx1ZSAgfCBjdXJyZW5jeTonR0JQJzonc3ltYm9sLW5hcnJvdyc6JzEuMi0yJyB9fVxuICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJnb3RvQW1vdW50UmV0cm9SZW1pc3Npb24oKVwiIGNsYXNzPVwiZ292dWstbGluayByaWdodFwiID5DaGFuZ2U8L2E+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGFibGU+XG5cbiAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ1dHRvbiBnb3Z1ay1idXR0b24tLXNlY29uZGFyeVwiIChjbGljayk9XCJnb3RvQW1vdW50UmV0cm9SZW1pc3Npb24oKVwiPlByZXZpb3VzPC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cImlzQ29uZmlybWF0aW9uQnRuRGlzYWJsZWRcIiBbbmdDbGFzc109J2lzQ29uZmlybWF0aW9uQnRuRGlzYWJsZWQgPyBcImJ1dHRvbiBidXR0b24tLWRpc2FibGVkIGdvdnVrLSEtbWFyZ2luLXJpZ2h0LTFcIiA6IFwiYnV0dG9uIGdvdnVrLSEtbWFyZ2luLXJpZ2h0LTFcIicgKGNsaWNrKT1cImNvbmZpcm1SZXRyb1JlbWlzc2lvbigpXCI+IEFkZCByZW1pc3Npb24gPC9idXR0b24+XG4gICAgPHA+IDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAoY2xpY2spPVwiZ290b0Nhc2V0cmFuc2F0aW9uUGFnZUNhbmNlbEJ0bkNsaWNrZWQoJGV2ZW50KVwiIGNsYXNzPVwiZ292dWstbGlua1wiIGRhdGEtbW9kdWxlPVwiZ292dWstYnV0dG9uXCI+IENhbmNlbDwvYT4gPC9wPlxuXG48L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdTdGF0dXMgPT09ICdyZXRyb3JlbWlzc2lvbmNvbmZpcm1hdGlvbnBhZ2UnXCI+XG4gICAgPGlucHV0ICNteUlucHV0IHR5cGU9J2hpZGRlbicgaWQ9J2lGcmFtZURyaXZlbkltYWdlVmFsdWUnIHZhbHVlPSdSRVRST1JFTUlTU0lPTkNPTkZJUk1BVElPTlBBR0UnPiBcbiAgPGRpdiBjbGFzcz1cImdvdnVrLWdyaWQtcm93XCI+XG4gICAgPGRpdiA+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ292dWstcGFuZWwgZ292dWstcGFuZWwtYm9yZGVyLS1jb25maXJtYXRpb25cIj5cbiAgICAgICAgPGgxIGNsYXNzPVwiZ292dWstcGFuZWxfX3RpdGxlXCI+XG4gICAgICAgICAgUmVtaXNzaW9uIGFkZGVkXG4gICAgICAgIDwvaDE+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJyZW1lc3Npb25QYXltZW50LnN0YXR1cyA9PT0gJ1N1Y2Nlc3MnXCIgY2xhc3M9XCJnb3Z1ay1wYW5lbF9fYm9keVwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJnb3Z1ay1ib2R5XCI+PHN0cm9uZz5UaGUgYW1vdW50IHRvIGJlIHJlZnVuZGVkIHNob3VsZCBiZSB7e3JlbWlzc2lvbkZvcm0uY29udHJvbHMuYW1vdW50LnZhbHVlIHwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMicgfX08L3N0cm9uZz48L3A+XG4gICAgICAgICAgIFxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInJlbWVzc2lvblBheW1lbnQuc3RhdHVzID09PSAnU3VjY2VzcydcIiA+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwiIWlzUmVtaXNzaW9uQXBwbGllZFwiIFtuZ0NsYXNzXT0naXNDb25maXJtYXRpb25CdG5EaXNhYmxlZCA/IFwiYnV0dG9uIGJ1dHRvbi0tZGlzYWJsZWQgZ292dWstIS1tYXJnaW4tcmlnaHQtMVwiIDogXCJidXR0b24gZ292dWstIS1tYXJnaW4tcmlnaHQtMVwiJyAoY2xpY2spPVwiZ290b1Byb2Nlc3NSZXRyb1JlbWlzc2lvbigpXCI+Q29udGludWUgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAgY2xhc3M9XCJnb3Z1ay1ib2R5XCI+XG4gICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIChjbGljayk9XCJnb3RvQ2FzZXRyYW5zYXRpb25QYWdlQ2FuY2VsQnRuQ2xpY2tlZCgkZXZlbnQpXCIgY2xhc3M9XCJnb3Z1ay1saW5rIHBvaW50ZXJcIiBkYXRhLW1vZHVsZT1cImdvdnVrLWJ1dHRvblwiPlxuICAgICAgICAgICAgUmV0dXJuIHRvIGNhc2VcbiAgICAgICAgPC9hPlxuICAgICAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuXG48bmctY29udGFpbmVyICpuZ0lmPVwidmlld1N0YXR1cyA9PT0gJ3JlbWlzc2lvbkFkZHJlc3NQYWdlJ1wiPlxuICA8aW5wdXQgI215SW5wdXQgdHlwZT0naGlkZGVuJyBpZD0naUZyYW1lRHJpdmVuSW1hZ2VWYWx1ZScgdmFsdWU9J0FERFJFU1NERVRBSUxTUkVUUk9SRU1JU1NJT05QQUdFJz4gICAgICBcbiAgICA8aDEgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLWxcIj5Qcm9jZXNzIHJlZnVuZDwvaDE+XG4gICAgPGgyIGNsYXNzPVwiZ292dWstaGVhZGluZy1tIGdvdnVrLWZvbnQxOXB4XCI+Q2FzZSByZWZlcmVuY2U6IHt7Y2NkQ2FzZU51bWJlciB8IGNjZEh5cGhlbnMgfX08L2gyPlxuICA8Y2NwYXktY29udGFjdC1kZXRhaWxzXG4gIFthZGRyZXNzT2JqXSA9IG5vdGlmaWNhdGlvblxuICAoYXNzaWduQ29udGFjdERldGFpbHMpPVwiZ2V0Q29udGFjdERldGFpbHMoJGV2ZW50LCAnY2hlY2thZGRSZWZ1bmRwYWdlJylcIlxuICAocmVkaXJlY3RUb0lzc3VlUmVmdW5kKT1cImdvdG9SZW1pc3Npb25TdWNjZXNzKCRldmVudClcIiA+PC9jY3BheS1jb250YWN0LWRldGFpbHM+XG4gIDxwPlxuICAgICAgPGEgKGNsaWNrKT1cImdvdG9DYXNldHJhbnNhdGlvblBhZ2VDYW5jZWxCdG5DbGlja2VkKCRldmVudClcIiBjbGFzcz1cImdvdnVrLWxpbmtcIiBkYXRhLW1vZHVsZT1cImdvdnVrLWJ1dHRvblwiPlxuICAgICAgICAgIENhbmNlbFxuICAgICAgPC9hPlxuICA8L3A+XG5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwidmlld1N0YXR1cyA9PT0gJ2NoZWNrYWRkUmVmdW5kcGFnZSdcIj5cbiAgICA8aW5wdXQgI215SW5wdXQgdHlwZT0naGlkZGVuJyBpZD0naUZyYW1lRHJpdmVuSW1hZ2VWYWx1ZScgdmFsdWU9J0NIRUNLUkVUUk9SRU1JU1NJT05DT05GSVJNQVRJT04nPiBcbiAgICA8ZGl2IGNsYXNzPVwiZ292dWstd2FybmluZy10ZXh0XCI+XG4gICAgICAgIDxoMSBjbGFzcz1cImhlYWRpbmctbGFyZ2VcIj4gQ2hlY2sgeW91ciBhbnN3ZXJzPC9oMT5cbiAgICA8L2Rpdj5cbiAgICA8dGFibGUgY2xhc3M9XCJnb3Z1ay10YWJsZVwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5QYXltZW50IHJlZmVyZW5jZTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7cmVtZXNzaW9uUGF5bWVudCA/IHJlbWVzc2lvblBheW1lbnQucmVmZXJlbmNlOiAnICd9fTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPlBheW1lbnQgYW1vdW50PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+wqN7eyByZW1lc3Npb25QYXltZW50ID8gZ2V0Rm9ybWF0dGVkQ3VycmVuY3kocmVtZXNzaW9uUGF5bWVudC5hbW91bnQpOiAnICcgfCBjdXJyZW5jeSA6J0dCUCc6J3N5bWJvbCc6JzEuMi0yJ319IDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPlBheW1lbnQgc3RhdHVzPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3tyZW1lc3Npb25QYXltZW50ID8gcmVtZXNzaW9uUGF5bWVudC5zdGF0dXM6ICcnfX08L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5GZWU8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGxcIj57eyBmZWUuY29kZSB9fSAtIHt7IGZlZS5kZXNjcmlwdGlvbiB9fSAoe3sgZmVlLmNhbGN1bGF0ZWRfYW1vdW50L2ZlZS52b2x1bWV8IGN1cnJlbmN5OidHQlAnOidzeW1ib2wtbmFycm93JzonMS4yLTInIH19KSA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5IZWxwIHdpdGggZmVlcyBvciByZW1pc3Npb24gcmVmZXJlbmNlPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3sgcmVtaXNzaW9uRm9ybS5jb250cm9scy5yZW1pc3Npb25Db2RlLnZhbHVlPy50cmltKCkgfX1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cInJlbWVzc2lvblBheW1lbnQuc3RhdHVzID09PSAnU3VjY2VzcydcIiBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPlJlZnVuZCBhbW91bnQ8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwicmVtZXNzaW9uUGF5bWVudC5zdGF0dXMgIT09ICdTdWNjZXNzJ1wiIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+UmVtaXNzaW9uIGFtb3VudDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7cmVtaXNzaW9uRm9ybS5jb250cm9scy5hbW91bnQudmFsdWUgIHwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMicgfX1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5TZW5kIHRvPC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7b3JkZXJQYXJ0eX19PC90ZD5cbiAgICAgIDwvdHI+XG4gICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPlNlbmQgdmlhPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgd2hpdGVzcGFjZS1pbmhlcml0XCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRhY3REZXRhaWxzT2JqPy5ub3RpZmljYXRpb25fdHlwZSA9PT0gJ0VNQUlMJ1wiIGNsYXNzPVwiY29udGFjdERldGFpbHMtd2lkdGhcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+RW1haWw8L3N0cm9uZz5cbiAgICAgICAgICAgIDxici8+XG4gICAgICAgICAgICB7e2NvbnRhY3REZXRhaWxzT2JqPy5lbWFpbD8udHJpbSgpfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udGFjdERldGFpbHNPYmo/Lm5vdGlmaWNhdGlvbl90eXBlID09PSAnTEVUVEVSJ1wiIGNsYXNzPVwiY29udGFjdERldGFpbHMtd2lkdGhcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+UG9zdDwvc3Ryb25nPlxuICAgICAgICAgICAgPGJyLz5cbiAgICAgICAgICAgIHt7Y29udGFjdERldGFpbHNPYmo/LmFkZHJlc3NfbGluZT8udHJpbSgpfX0mbmJzcDt7e2NvbnRhY3REZXRhaWxzT2JqPy5jaXR5Py50cmltKCl9fSZuYnNwO3t7Y29udGFjdERldGFpbHNPYmo/LmNvdW50eT8udHJpbSgpfX0mbmJzcDt7e2NvbnRhY3REZXRhaWxzT2JqPy5jb3VudHJ5Py50cmltKCl9fSZuYnNwO3t7Y29udGFjdERldGFpbHNPYmo/LnBvc3RhbF9jb2RlPy50cmltKCl9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxhIChjbGljayk9XCJnb3RvUHJvY2Vzc1JldHJvUmVtaXNzaW9uKGNvbnRhY3REZXRhaWxzT2JqKVwiIGNsYXNzPVwiZ292dWstbGluayByaWdodFwiID5DaGFuZ2U8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5Ob3RpZmljYXRpb248L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7dGVtcGxhdGVJbnN0cnVjdGlvblR5cGV9fVxuICAgICAgICAgICAgPGEgKm5nSWY9XCIhbm90aWZpY2F0aW9uUHJldmlld1wiIGhyZWY9XCJKYXZhc2NyaXB0OnZvaWQoMClcIiBjbGFzcz1cImdvdnVrLWxpbmsgcmlnaHRcIiAoY2xpY2spPVwic2hvd05vdGlmaWNhdGlvblByZXZpZXcoKVwiPlxuICAgICAgICAgICAgICBQcmV2aWV3XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8YSAqbmdJZj1cIm5vdGlmaWNhdGlvblByZXZpZXdcIiBocmVmPVwiSmF2YXNjcmlwdDp2b2lkKDApXCIgY2xhc3M9XCJnb3Z1ay1saW5rIHJpZ2h0XCIgKGNsaWNrKT1cImhpZGVOb3RpZmljYXRpb25QcmV2aWV3KClcIj5cbiAgICAgICAgICAgICAgSGlkZSBQcmV2aWV3XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvdGFibGU+XG5cbiAgICA8YXBwLW5vdGlmaWNhdGlvbi1wcmV2aWV3ICpuZ0lmPVwibm90aWZpY2F0aW9uUHJldmlld1wiIFxuICAgIFtwYXltZW50XT1cInJlbWVzc2lvblBheW1lbnRcIiBcbiAgICBbY29udGFjdERldGFpbHNdPVwiY29udGFjdERldGFpbHNPYmpcIlxuICAgIFtyZWZ1bmRSZWFzb25dPVwiJ1JSMDM2J1wiXG4gICAgW3JlZnVuZEFtb3VudF09XCJyZW1pc3Npb25Gb3JtLmNvbnRyb2xzLmFtb3VudC52YWx1ZVwiPjwvYXBwLW5vdGlmaWNhdGlvbi1wcmV2aWV3PlxuXG4gICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidXR0b24gZ292dWstYnV0dG9uLS1zZWNvbmRhcnlcIiAoY2xpY2spPVwiZ290b1Byb2Nlc3NSZXRyb1JlbWlzc2lvbihjb250YWN0RGV0YWlsc09iailcIj5QcmV2aW91czwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJpc0NvbmZpcm1hdGlvbkJ0bkRpc2FibGVkXCIgW25nQ2xhc3NdPSdpc0NvbmZpcm1hdGlvbkJ0bkRpc2FibGVkID8gXCJidXR0b24gYnV0dG9uLS1kaXNhYmxlZCBnb3Z1ay0hLW1hcmdpbi1yaWdodC0xXCIgOiBcImJ1dHRvbiBnb3Z1ay0hLW1hcmdpbi1yaWdodC0xXCInIChjbGljayk9XCJwcm9jZXNzUmVmdW5kKClcIj4gU3VibWl0IHJlZnVuZCA8L2J1dHRvbj5cbiAgICA8cD4gPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIChjbGljayk9XCJnb3RvQ2FzZXRyYW5zYXRpb25QYWdlQ2FuY2VsQnRuQ2xpY2tlZCgkZXZlbnQpXCIgY2xhc3M9XCJnb3Z1ay1saW5rXCIgZGF0YS1tb2R1bGU9XCJnb3Z1ay1idXR0b25cIj4gQ2FuY2VsPC9hPiA8L3A+XG5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwidmlld1N0YXR1cyA9PT0gJ3JlZnVuZGNvbmZpcm1hdGlvbnBhZ2UnXCI+XG4gICAgPGlucHV0ICNteUlucHV0IHR5cGU9J2hpZGRlbicgaWQ9J2lGcmFtZURyaXZlbkltYWdlVmFsdWUnIHZhbHVlPSdSRVRST1JFTUlTU0lPTlJFRlVORENPTkZJUk1BVElPTlBBR0UnPiBcbiAgICA8ZGl2IGNsYXNzPVwiZ292dWstZ3JpZC1yb3dcIj5cbiAgICAgIDxkaXYgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ292dWstcGFuZWwgZ292dWstcGFuZWwtLWNvbmZpcm1hdGlvblwiPlxuICAgICAgICAgIDxoMSBjbGFzcz1cImdvdnVrLXBhbmVsX190aXRsZVwiPlxuICAgICAgICAgICAgUmVmdW5kIHN1Ym1pdHRlZFxuICAgICAgICAgIDwvaDE+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ292dWstcGFuZWxfX2JvZHlcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwiZ292dWstYm9keSB3aGl0ZVwiPjxzdHJvbmc+UmVmdW5kIHJlZmVyZW5jZToge3tyZWZ1bmRSZWZlcmVuY2V9fTwvc3Ryb25nPjwvcD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzUGF5bWVudFN1Y2Nlc3NcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwiZ292dWstaGVhZGluZy1sXCI+V2hhdCBoYXBwZW5zIG5leHQ8L2gyPlxuICAgICAgICA8cCBjbGFzcz1cImdvdnVrLWJvZHlcIj5cbiAgICAgICAgICBBIHJlZnVuZCByZXF1ZXN0IGZvciB7e3JlZnVuZEFtb3VudCAgfCBjdXJyZW5jeTonR0JQJzonc3ltYm9sLW5hcnJvdyc6JzEuMi0yJyB9fSBoYXMgYmVlbiBjcmVhdGVkIGFuZCB3aWxsIGJlIHBhc3NlZCB0byBhIHRlYW0gbGVhZGVyIHRvIGFwcHJvdmUuXG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgY2xhc3M9XCJnb3Z1ay1ib2R5XCI+XG4gICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cImdvdG9DYXNldHJhbnNhdGlvblBhZ2VDYW5jZWxCdG5DbGlja2VkKCRldmVudClcIiBjbGFzcz1cImdvdnVrLWxpbmsgcG9pbnRlclwiIGRhdGEtbW9kdWxlPVwiZ292dWstYnV0dG9uXCI+XG4gICAgICAgIFJldHVybiB0byBjYXNlXG4gICAgPC9hPlxuICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIFxuPC9uZy1jb250YWluZXI+XG5cbjwhLS0gSXNzdWUgUmVmdW5kIFNlY3Rpb24gLS0+XG48bmctY29udGFpbmVyICpuZ0lmPVwidmlld0NvbXBTdGF0dXMgPT09ICdpc3N1ZXJlZnVuZCcgJiYgaXNSZWZ1bmRSZW1pc3Npb25cIj5cbiAgPGRpdiBjbGFzcz1cImdvdnVrLWZvcm0tZ3JvdXBcIj5cbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInJlbWlzc2lvbkZvcm1cIiBub3ZhbGlkYXRlPlxuICAgIDxoMSBjbGFzcz1cImhlYWRpbmctbGFyZ2VcIj5Qcm9jZXNzIHJlZnVuZDwvaDE+XG4gICAgPGgyIGNsYXNzPVwiaGVhZGluZy1tZWRpdW1cIj5DYXNlIHJlZmVyZW5jZTp7e2NjZENhc2VOdW1iZXIgfCBjY2RIeXBoZW5zIH19PC9oMj5cbiAgICA8c3BhbiBpZD1cImhvdy1jb250YWN0ZWQtY29uZGl0aW9uYWwtaGludFwiIGNsYXNzPVwiZm9ybS1oaW50IGdvdnVrLWZvbnQxOXB4XCI+XG4gICAgICBQYXltZW50IHJlZmVyZW5jZToge3twYXltZW50UmVmZXJlbmNlfX1cbiAgICA8L3NwYW4+XG4gICAgPGgzIGNsYXNzPVwiaGVhZGluZy1zbWFsbFwiPlNlbGVjdCBmZWVzIHRvIGJlIHJlZnVuZGVkPC9oMz5cbiAgICA8IS0tVEFCTEUtLT5cbiAgICA8ZGl2PlxuICAgICAgPHRhYmxlIGNsYXNzPVwiZ292dWstdGFibGVcIj5cbiAgICAgICAgPHRoZWFkIGNsYXNzPVwiZ292dWstdGFibGVfX2hlYWRcIj5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9faGVhZGVyICBjb2wtMVwiIHNjb3BlPVwiY29sXCI+U2VsZWN0PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkZXIgY29sLTE4XCIgc2NvcGU9XCJjb2xcIj5GZWUgZGVzY3JpcHRpb248L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2hlYWRlciBjb2wtNlwiIHNjb3BlPVwiY29sXCI+RmVlIGFtb3VudDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9faGVhZGVyIGNvbC02XCIgc2NvcGU9XCJjb2xcIj5Ub3RhbCBwYWlkPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkZXIgY29sLTZcIiBzY29wZT1cImNvbFwiPlF1YW50aXR5PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkZXIgY29sLThcIiBzY29wZT1cImNvbFwiPkFtb3VudCB0byByZWZ1bmQ8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2hlYWRlclwiIHNjb3BlPVwiY29sXCI+PC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHkgY2xhc3M9XCJnb3Z1ay10YWJsZV9fYm9keVwiICpuZ0lmPVwiIWlzRnVsbHlSZWZ1bmRcIj5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCIgZm9ybUFycmF5TmFtZT1cImZlZXNMaXN0XCIgKm5nRm9yPVwibGV0IGZlZSBvZiBmZWVzTGlzdD8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+XG4gICAgICAgICAgICAgIDxkaXYgIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjbGFzcz1cImdvdnVrLWNoZWNrYm94ZXMgZ292dWstY2hlY2tib3hlcy0tbGFyZ2VcIiBkYXRhLW1vZHVsZT1cImdvdnVrLWNoZWNrYm94ZXNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ292dWstY2hlY2tib3hlc19faXRlbVwiPlxuXG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ292dWstY2hlY2tib3hlc19faW5wdXRcIiBcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGVja19lbihpLGZlZS5jb250cm9sc1snaWQnXS52YWx1ZSxmZWUuY29udHJvbHNbJ2FwcG9ydGlvbl9hbW91bnQnXS52YWx1ZSxmZWUuY29udHJvbHNbJ3ZvbHVtZSddLnZhbHVlKVwiIFxuICAgICAgICAgICAgICAgICAgaWQ9XCJ7e2ZlZS5jb250cm9sc1snaWQnXS52YWx1ZX19XCIgXG4gICAgICAgICAgICAgICAgICBuYW1lPVwib3JnYW5pc2F0aW9uXCIgXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3tmZWUuY29udHJvbHNbJ2lkJ10udmFsdWV9fVwiIFxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0ZWRcIiA+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnb3Z1ay1sYWJlbCBnb3Z1ay1jaGVja2JveGVzX19sYWJlbFwiIGZvcj1cInt7ZmVlLmNvbnRyb2xzWydpZCddLnZhbHVlfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5TZWxlY3Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCAgd2hpdGVzcGFjZS1pbmhlcml0XCI+e3tmZWUuY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10udmFsdWV9fSA8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgIHdoaXRlc3BhY2UtaW5oZXJpdCBsZWZ0XCIgPlxuICAgICAgICAgICAgICA8ZGl2IHR5cGU9XCJoaWRkZW5cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOndoaXRlO1wiIGlkPVwiZmVlVk9sX3t7ZmVlLmNvbnRyb2xzWydpZCddLnZhbHVlfX1cIj57eyBmZWUuY29udHJvbHNbJ2NhbGN1bGF0ZWRfYW1vdW50J10udmFsdWUgLyBmZWUuY29udHJvbHNbJ3ZvbHVtZSddLnZhbHVlIH19PC9kaXY+XG4gICAgICAgICAgICAgIHt7IGZlZS5jb250cm9sc1snY2FsY3VsYXRlZF9hbW91bnQnXS52YWx1ZSAvIGZlZS5jb250cm9sc1sndm9sdW1lJ10udmFsdWUgfCBjdXJyZW5jeTonR0JQJzonc3ltYm9sLW5hcnJvdyc6JzEuMi0yJyB9fVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsICB3aGl0ZXNwYWNlLWluaGVyaXQgbGVmdFwiID57eyBmZWUuY29udHJvbHNbJ2FwcG9ydGlvbl9hbW91bnQnXS52YWx1ZSB8IGN1cnJlbmN5OidHQlAnOidzeW1ib2wtbmFycm93JzonMS4yLTInfX0gPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsICB3aGl0ZXNwYWNlLWluaGVyaXQgbGVmdFwiICAqbmdJZj1cImZlZS5jb250cm9sc1sndm9sdW1lJ10udmFsdWUgPjFcIj5cbiAgICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBkaXNhYmxlZD1cImRpc2FibGVkXCIgIGNsYXNzPVwiZ292dWstaW5wdXQgZ292dWstaW5wdXQtLXdpZHRoLTQgY2VudGVyXCIgIGlkPVwiZmVlVm9sdW1lVXBkYXRlZF97e2ZlZS5jb250cm9sc1snaWQnXS52YWx1ZX19XCIgKGtleXVwKT1cImNhbEFtdFRvUmVmdW5kKCRldmVudC50YXJnZXQudmFsdWUsZmVlLmNvbnRyb2xzWydjYWxjdWxhdGVkX2Ftb3VudCddLnZhbHVlLGZlZS5jb250cm9sc1sndm9sdW1lJ10udmFsdWUsaSlcIiB2YWx1ZT1cInt7ZmVlLmNvbnRyb2xzWyd1cGRhdGVkX3ZvbHVtZSddLnZhbHVlfX1cIiAgbmFtZT1cImZlZVZvbHVtZVVwZGF0ZWRfe3tmZWUuY29udHJvbHNbJ2lkJ10udmFsdWV9fVwiIGZvcm1Db250cm9sTmFtZT1cInVwZGF0ZWRfdm9sdW1lXCIgdHlwZT1cInRleHRcIiA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCAgd2hpdGVzcGFjZS1pbmhlcml0IGxlZnRcIiAgKm5nSWY9XCJmZWUuY29udHJvbHNbJ3ZvbHVtZSddLnZhbHVlID09PTFcIj5cbiAgICAgICAgICAgICAgPGlucHV0IGRpc2FibGVkPVwiZGlzYWJsZWRcIiAgY2xhc3M9XCJnb3Z1ay1pbnB1dCBnb3Z1ay1pbnB1dC0td2lkdGgtNCBjZW50ZXJcIiAgaWQ9XCJWb2x1bWVVcGRhdGVkX3t7ZmVlLmNvbnRyb2xzWydpZCddLnZhbHVlfX1cIiBuYW1lPVwiVm9sdW1lVXBkYXRlZF97e2ZlZS5jb250cm9sc1snaWQnXS52YWx1ZX19XCIgdHlwZT1cInRleHRcIiAgIHZhbHVlPVwie3tmZWUuY29udHJvbHNbJ3ZvbHVtZSddLnZhbHVlfX1cIj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCAgd2hpdGVzcGFjZS1pbmhlcml0IGNlbnRlclwiIHNjb3BlPVwicm93XCI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2ICBbZm9ybUdyb3VwTmFtZV09XCJpXCIgIGNsYXNzPVwiaG1jdHMtY3VycmVuY3ktaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhtY3RzLWN1cnJlbmN5LWlucHV0X19zeW1ib2xcIiBhcmlhLWhpZGRlbj1cInRydWVcIj7CozwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGlucHV0IGRpc2FibGVkPVwiZGlzYWJsZWRcIiBjbGFzcz1cImdvdnVrLWlucHV0IGdvdnVrLWlucHV0LS13aWR0aC0xMFwiIGlkPVwiZmVlQW1vdW50X3t7ZmVlLmNvbnRyb2xzWydpZCddLnZhbHVlfX1cIiBuYW1lPVwiZmVlQW1vdW50X3t7ZmVlLmNvbnRyb2xzWydpZCddLnZhbHVlfX1cIiB0eXBlPVwidGV4dFwiIGFyaWEtZGVzY3JpYmVkYnk9XCJhbW91bnQtY3VycmVuY3kgXCIgIHBhdHRlcm49XCJbMC05XSpcIiBmb3JtQ29udHJvbE5hbWU9XCJyZWZ1bmRfYW1vdW50XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJmZWVWb2x1bWVfe3tmZWUuY29udHJvbHNbJ2lkJ10udmFsdWV9fVwiIG5hbWU9XCJmZWVWb2x1bWVfe3tmZWUuY29udHJvbHNbJ2lkJ10udmFsdWV9fVwiIHZhbHVlPSBcInt7ZmVlLmNvbnRyb2xzWyd2b2x1bWUnXS52YWx1ZX19XCIgdHlwZT1cImhpZGRlblwiIGZvcm1Db250cm9sTmFtZT1cInZvbHVtZVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiZmVlQXBwb3J0aW9uQW1vdW50X3t7ZmVlLmNvbnRyb2xzWydpZCddLnZhbHVlfX1cIiBuYW1lPVwiZmVlQXBwb3J0aW9uQW1vdW50X3t7ZmVlLmNvbnRyb2xzWydpZCddLnZhbHVlfX1cIiB2YWx1ZT0gXCJ7e2ZlZS5jb250cm9sc1snYXBwb3J0aW9uX2Ftb3VudCddLnZhbHVlfX1cIiB0eXBlPVwiaGlkZGVuXCIgZm9ybUNvbnRyb2xOYW1lPVwiYXBwb3J0aW9uX2Ftb3VudFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiY2FsY3VsYXRlZEFtb3VudF97e2ZlZS5jb250cm9sc1snaWQnXS52YWx1ZX19XCIgbmFtZT1cImNhbGN1bGF0ZWRBbW91bnRfe3tmZWUuY29udHJvbHNbJ2lkJ10udmFsdWV9fVwiIHZhbHVlPSBcInt7ZmVlLmNvbnRyb2xzWydjYWxjdWxhdGVkX2Ftb3VudCddLnZhbHVlfX1cIiB0eXBlPVwiaGlkZGVuXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2FsY3VsYXRlZF9hbW91bnRcIj5cbiAgICAgICAgICAgICAgIDwvZGl2PiBcbiBcbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPHRib2R5IGNsYXNzPVwiZ292dWstdGFibGVfX2JvZHlcIiAqbmdJZj1cImlzRnVsbHlSZWZ1bmRcIj5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCIgKm5nRm9yPVwibGV0IGZlZSBvZiBmZWVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPlxuICAgICAgICAgICAgICA8ZGl2ICBjbGFzcz1cImdvdnVrLWNoZWNrYm94ZXMgZ292dWstY2hlY2tib3hlcy0tbGFyZ2VcIiBkYXRhLW1vZHVsZT1cImdvdnVrLWNoZWNrYm94ZXNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ292dWstY2hlY2tib3hlc19faXRlbVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0ICAgXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImdvdnVrLWNoZWNrYm94ZXNfX2lucHV0XCIgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBpZD1cInt7ZmVlLmlkfX1cIiBcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJvcmdhbmlzYXRpb25cIiBcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxuICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7e2ZlZS5pZH19XCJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJ1ZVwiID5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdvdnVrLWxhYmVsIGdvdnVrLWNoZWNrYm94ZXNfX2xhYmVsXCIgZm9yPVwie3tmZWUuaWR9fVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlNlbGVjdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsICB3aGl0ZXNwYWNlLWluaGVyaXRcIj57e2ZlZS5kZXNjcmlwdGlvbn19IDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCAgd2hpdGVzcGFjZS1pbmhlcml0IGxlZnRcIiA+XG4gICAgICAgICAgICAgIDxkaXYgdHlwZT1cImhpZGRlblwiIHN0eWxlPVwiZGlzcGxheTpub25lO2JhY2tncm91bmQtY29sb3I6d2hpdGU7XCIgaWQ9XCJmZWVWT2xfe3tmZWUuaWR9fVwiPnt7IGZlZS5jYWxjdWxhdGVkX2Ftb3VudCAvIGZlZS52b2x1bWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAge3sgZmVlLmNhbGN1bGF0ZWRfYW1vdW50IC8gZmVlLnZvbHVtZXwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMicgfX1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCAgd2hpdGVzcGFjZS1pbmhlcml0IGxlZnRcIiA+e3sgcGF5bWVudC5hbW91bnQgfCBjdXJyZW5jeTonR0JQJzonc3ltYm9sLW5hcnJvdyc6JzEuMi0yJ319IDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCAgd2hpdGVzcGFjZS1pbmhlcml0IGxlZnRcIj5cbiAgICAgICAgICAgICAgPGRpdiA+XG4gICAgICAgICAgICAgIDxpbnB1dCBkaXNhYmxlZD1cImRpc2FibGVkXCIgIGNsYXNzPVwiZ292dWstaW5wdXQgZ292dWstaW5wdXQtLXdpZHRoLTQgY2VudGVyXCIgIGlkPVwiZmVlVm9sdW1lVXBkYXRlZF97e2ZlZS5pZH19XCIgIHZhbHVlPVwie3tmZWUudm9sdW1lfX1cIiAgbmFtZT1cImZlZVZvbHVtZVVwZGF0ZWRfe3tmZWUuaWR9fVwiIHR5cGU9XCJ0ZXh0XCIgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICBcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsICB3aGl0ZXNwYWNlLWluaGVyaXQgY2VudGVyXCIgc2NvcGU9XCJyb3dcIj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJobWN0cy1jdXJyZW5jeS1pbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG1jdHMtY3VycmVuY3ktaW5wdXRfX3N5bWJvbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPsKjPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgZGlzYWJsZWQ9XCJkaXNhYmxlZFwiIGNsYXNzPVwiZ292dWstaW5wdXQgZ292dWstaW5wdXQtLXdpZHRoLTEwXCIgaWQ9XCJmZWVBbW91bnRfe3tmZWUuaWR9fVwiIG5hbWU9XCJmZWVBbW91bnRfe3tmZWUuaWR9fVwiIHR5cGU9XCJ0ZXh0XCIgYXJpYS1kZXNjcmliZWRieT1cImFtb3VudC1jdXJyZW5jeSBcIiAgdmFsdWU9XCJ7eyBwYXltZW50LmFtb3VudCB8IGN1cnJlbmN5OidHQlAnOidzeW1ib2wtbmFycm93JzonMS4yLTInfX1cIiBwYXR0ZXJuPVwiWzAtOV0qXCIgPlxuICAgICAgICAgICAgICAgIDwvZGl2PiBcbiAgICAgICAgXG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDx0Ym9keSBjbGFzcz1cImdvdnVrLXRhYmxlX19ib2R5XCIgKm5nSWY9XCJmZWVzPy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiIGNvbHNwYW49XCI2XCI+Tm8gZmVlcyByZWNvcmRlZDwvdGQ+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1idXR0b24tZ3JvdXBcIj5cblxuICBcbiAgPGEgIChjbGljayk9XCJnb3RvU2VydmljZVJlcXVlc3RQYWdlKCRldmVudClcIiAgKm5nSWY9XCIhaXNGdWxseVJlZnVuZFwiIGRyYWdnYWJsZT1cImZhbHNlXCIgY2xhc3M9XCJnb3Z1ay1idXR0b24gZ292dWstYnV0dG9uLS1zZWNvbmRhcnlcIiBkYXRhLW1vZHVsZT1cImdvdnVrLWJ1dHRvblwiPlxuICAgIFByZXZpb3VzXG4gIDwvYT5cbiAgPGEgIChjbGljayk9XCJnb1RvUGF5bWVudFZpZXdDb21wb25lbnQoKVwiICAqbmdJZj1cImlzRnVsbHlSZWZ1bmRcIiBkcmFnZ2FibGU9XCJmYWxzZVwiIGNsYXNzPVwiZ292dWstYnV0dG9uIGdvdnVrLWJ1dHRvbi0tc2Vjb25kYXJ5XCIgZGF0YS1tb2R1bGU9XCJnb3Z1ay1idXR0b25cIj5cbiAgICBQcmV2aW91c1xuICA8L2E+XG4gICAgXG4gIDxidXR0b24gW2Rpc2FibGVkXSA9IFwibm9uZVNlbGVjdGVkKClcIiAoY2xpY2spPVwiZ290b0lzc3VlUGFnZShpc0Z1bGx5UmVmdW5kKVwiIGNsYXNzPVwiZ292dWstYnV0dG9uXCI+XG4gICAgQ29udGludWVcbiAgPC9idXR0b24+XG4gIFxuICAgIDwvZGl2PlxuICAgIDxwPlxuICAgICAgPGEgIChjbGljayk9XCJnb3RvQ2FzZXRyYW5zYXRpb25QYWdlQ2FuY2VsQnRuQ2xpY2tlZCgkZXZlbnQpXCIgY2xhc3M9XCJnb3Z1ay1saW5rXCIgZGF0YS1tb2R1bGU9XCJnb3Z1ay1idXR0b25cIj5DYW5jZWw8L2E+XG4gICAgPC9wPlxuICA8L2Zvcm0+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3Q29tcFN0YXR1cyA9PT0gJ2lzc3VlcmVmdW5kcGFnZTEnICYmIGlzUmVmdW5kUmVtaXNzaW9uXCI+XG5cbiAgICA8aW5wdXQgI215SW5wdXQgdHlwZT0naGlkZGVuJyBpZD0naUZyYW1lRHJpdmVuSW1hZ2VWYWx1ZScgdmFsdWU9J0lTU1VFUkVGVU5EUEFHRSc+IFxuICAgIDxoMSBjbGFzcz1cImhlYWRpbmctbGFyZ2VcIj5Qcm9jZXNzIHJlZnVuZDwvaDE+XG4gICAgPGgxIGNsYXNzPVwiaGVhZGluZy1tZWRpdW1cIj5DYXNlIHJlZmVyZW5jZToge3tjY2RDYXNlTnVtYmVyIHwgY2NkSHlwaGVucyB9fTwvaDE+XG4gICAgPHNwYW4gaWQ9XCJob3ctY29udGFjdGVkLWNvbmRpdGlvbmFsLWhpbnQgZ292dWstZm9udDE5cHhcIiAqbmdJZj1cInBheW1lbnRcIiBjbGFzcz1cImZvcm0taGludFwiPlxuICAgICAgUGF5bWVudCByZWZlcmVuY2U6IHt7cGF5bWVudFJlZmVyZW5jZX19XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuIGlkPVwiaG93LWNvbnRhY3RlZC1jb25kaXRpb25hbC1oaW50IGdvdnVrLWZvbnQxOXB4XCIgKm5nSWY9XCJyZWZ1bmRQYXltZW50UmVmZXJlbmNlXCIgY2xhc3M9XCJmb3JtLWhpbnRcIj5cbiAgICAgIFBheW1lbnQgcmVmZXJlbmNlOiB7e3JlZnVuZFBheW1lbnRSZWZlcmVuY2V9fVxuICAgIDwvc3Bhbj5cbiAgICA8aDEgY2xhc3M9XCJoZWFkaW5nLWxhcmdlXCI+V2h5IGFyZSB5b3UgbWFraW5nIHRoaXMgcmVmdW5kP1xuICAgICAgPC9oMT5cbiAgICAgXG5cbiAgICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1mb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGZvcm0gbm92YWxpZGF0ZT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLWZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInJlbWlzc2lvbkZvcm1cIiBub3ZhbGlkYXRlPlxuICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiZ292dWstZmllbGRzZXRcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiaG93LWNvbnRhY3RlZC1jb25kaXRpb25hbC1oaW50XCI+XG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicmVmdW5kSGFzRXJyb3IgPyAnZ292dWstcmFkaW9zIGdvdnVrLXJhZGlvcy0tY29uZGl0aW9uYWwgZm9ybS1ncm91cC1lcnJvcicgOiAnZ292dWstcmFkaW9zIGdvdnVrLXJhZGlvcy0tY29uZGl0aW9uYWwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb2R1bGU9XCJnb3Z1ay1yYWRpb3NcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaW5saW5lLWVycm9yLW1lc3NhZ2VcIiAqbmdJZj1cInJlZnVuZEhhc0Vycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyZWZ1bmRIYXNFcnJvclwiPlNlbGVjdCBhIHJlYXNvbiB3aHkgeW914oCZcmUgbWFraW5nIHRoaXMgcmVmdW5kPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzID0gXCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLXJhZGlvc19faXRlbSBjb2wtbWQtNFwiICpuZ0Zvcj1cImxldCByZWZ1bmQgb2YgY29tbW9uUmVmdW5kUmVhc29uczsgbGV0IGkgPSBpbmRleDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZiA9IFwie3tyZWZ1bmQubmFtZX19ICE9PSAnUmV0cm9zcGVjdGl2ZSByZW1pc3Npb24nXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgICBjbGFzcz1cImdvdnVrLXJhZGlvc19faW5wdXRcIiBpZD1cInt7cmVmdW5kLm5hbWV9fVwiIG5hbWU9XCJyZWZ1bmRSZWFzb25cIiB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZWZ1bmRSZWFzb25cIiB2YWx1ZT17e3JlZnVuZC5jb2RlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNlbGVjdFJhZGlvQnV0dG9uKHJlZnVuZC5jb2RlLCByZWZ1bmQubmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ292dWstbGFiZWwtLXMgZ292dWstcmFkaW9zX19sYWJlbCBnb3Z1ay1mb250X19jdXN0b21cIiBmb3I9XCJob3ctY29udGFjdGVkLWNvbmRpdGlvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tyZWZ1bmQubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLXJhZGlvc19fY29uZGl0aW9uYWxcIiAqbmdJZj1cImlzUmVmdW5kUmVhc29uc1NlbGVjdGVkICYmIHNob3dSZWFzb25UZXh0ICYmIHNlbGVjdGVkUmVmdW5kUmVhc29uID09PSByZWZ1bmQubmFtZSBcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnb3Z1ay1sYWJlbCBnb3Z1ay1sYWJlbC0tbVwiIGZvcj1cInt7cmVmdW5kLm5hbWV9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGVyIHJlYXNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydmb3JtLWdyb3VwLWVycm9yJzogaXNSZWFzb25FbXB0eX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwICBjbGFzcz1cImlubGluZS1lcnJvci1tZXNzYWdlXCIgKm5nSWY9XCJpc1JlYXNvbkVtcHR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1JlYXNvbkVtcHR5XCI+RW50ZXIgYSByZWFzb24gd2h5IHlvdeKAmXJlIG1ha2luZyB0aGlzIHJlZnVuZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImdvdnVrLWlucHV0IGdvdnVrLWlucHV0LS13aWR0aC0xMFwiIFtuZ0NsYXNzXT1cInsnaW5saW5lLWVycm9yLWNsYXNzJzogaXNSZWFzb25FbXB0eX1cIiBpZD1cInJlYXNvblwiIGFyaWEtbGFiZWw9XCJyZWFzb25cIiAgbmFtZT1cInJlYXNvblwiIHR5cGU9XCJ0ZXh0XCIgYXJpYS1kZXNjcmliZWRieT1cInJlYXNvblwiIG1heGxlbmd0aD1cIjMwXCIgZm9ybUNvbnRyb2xOYW1lPVwicmVhc29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicmVmdW5kRERSZWFzb25cIiBjbGFzcz1cImdvdnVrLXNlbGVjdFwiIGlkPVwic29ydFwiICAoY2hhbmdlKT1cInNlbGVjdGNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQ9J3NlbGVjdGVkJyBbZGVmYXVsdFNlbGVjdGVkXT10cnVlIFt2YWx1ZV09XCJkZWZhdWx0XCIgPnt7ZGVmYXVsdH19PC9vcHRpb24+ICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8b3B0aW9uIHZhbHVlPVwiXCIgc2VsZWN0ZWQ9J3NlbGVjdGVkJz5TZWxlY3QgYSBkaWZmZXJlbnQgcmVhc29uPC9vcHRpb24+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gICpuZ0Zvcj1cImxldCByZWZ1bmQgb2YgcmVmdW5kUmVhc29ucztcIiBpZD1cInt7cmVmdW5kLm5hbWV9fVwiICB2YWx1ZT1cInt7cmVmdW5kLmNvZGV9fVwiPnt7cmVmdW5kLm5hbWV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLXJhZGlvc19fY29uZGl0aW9uYWxcIiAqbmdJZj1cInNob3dSZWFzb25UZXh0ICYmICAhaXNSZWZ1bmRSZWFzb25zU2VsZWN0ZWRcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydmb3JtLWdyb3VwLWVycm9yJzogaXNSZWFzb25FbXB0eX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnb3Z1ay1sYWJlbCBnb3Z1ay1sYWJlbC0tbVwiIGZvcj1cImFtb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRlciByZWFzb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaW5saW5lLWVycm9yLW1lc3NhZ2VcIiAqbmdJZj1cImlzUmVhc29uRW1wdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1JlYXNvbkVtcHR5XCI+RW50ZXIgYSByZWFzb24gd2h5IHlvdeKAmXJlIG1ha2luZyB0aGlzIHJlZnVuZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZ292dWstaW5wdXQgZ292dWstaW5wdXQtLXdpZHRoLTEwXCIgW25nQ2xhc3NdPVwieydpbmxpbmUtZXJyb3ItY2xhc3MnOiBpc1JlYXNvbkVtcHR5fVwiIGlkPVwicmVhc29uXCIgYXJpYS1sYWJlbD1cInJlYXNvblwiICBuYW1lPVwicmVhc29uXCIgdHlwZT1cInRleHRcIiBhcmlhLWRlc2NyaWJlZGJ5PVwicmVhc29uXCIgbWF4bGVuZ3RoPVwie3tyZWFzb25MZW5ndGh9fVwiICBmb3JtQ29udHJvbE5hbWU9XCJyZWFzb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLWJ1dHRvbi1ncm91cFwiPlxuICAgICAgICAgIDxidXR0b24gIChjbGljayk9XCJnb3RvUGFydGlhbEZlZVJlZnVuZFNjcmVlbigpXCIgY2xhc3M9XCJnb3Z1ay1idXR0b24gZ292dWstYnV0dG9uLS1zZWNvbmRhcnlcIj4gUHJldmlvdXM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJnb3RvSXNzdWVSZWZ1bmRDb25maXJtYXRpb24ocGF5bWVudClcIiBjbGFzcz1cImdvdnVrLWJ1dHRvblwiPiBDb250aW51ZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8cD5cbiAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIChjbGljayk9XCJnb3RvQ2FzZXRyYW5zYXRpb25QYWdlQ2FuY2VsQnRuQ2xpY2tlZCgkZXZlbnQpXCIgY2xhc3M9XCJnb3Z1ay1saW5rXCIgZGF0YS1tb2R1bGU9XCJnb3Z1ay1idXR0b25cIj5cbiAgICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2E+XG4gICAgPC9wPlxuICAgIFxuPC9uZy1jb250YWluZXI+XG48bmctY29udGFpbmVyICpuZ0lmPVwidmlld1N0YXR1cyA9PT0gJ2NvbnRhY3REZXRhaWxzUGFnZSdcIj5cbiAgPGlucHV0ICNteUlucHV0IHR5cGU9J2hpZGRlbicgaWQ9J2lGcmFtZURyaXZlbkltYWdlVmFsdWUnIHZhbHVlPSdDQVBUVVJFQUREUkVTU0RFVEFJTFNQQUdFJz4gICAgICBcbiAgICA8aDEgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLWxcIj5Qcm9jZXNzIHJlZnVuZDwvaDE+XG4gICAgPGgyIGNsYXNzPVwiZ292dWstaGVhZGluZy1tIGdvdnVrLWZvbnQxOXB4XCI+Q2FzZSByZWZlcmVuY2U6IHt7Y2NkQ2FzZU51bWJlciB8IGNjZEh5cGhlbnMgfX08L2gyPlxuICAgIDxzcGFuIGlkPVwiaG93LWNvbnRhY3RlZC1jb25kaXRpb25hbC1oaW50XCIgY2xhc3M9XCJnb3Z1ay1oaW50IGdvdnVrLWZvbnQxOXB4XCI+XG4gICAgICBQYXltZW50IHJlZmVyZW5jZToge3twYXltZW50UmVmZXJlbmNlfX1cbiAgICA8L3NwYW4+XG4gIDxjY3BheS1jb250YWN0LWRldGFpbHNcbiAgW2FkZHJlc3NPYmpdID0gbm90aWZpY2F0aW9uXG4gIChhc3NpZ25Db250YWN0RGV0YWlscyk9XCJnZXRDb250YWN0RGV0YWlscygkZXZlbnQsICdjaGVja2lzc3VlcmVmdW5kcGFnZScpXCJcbiAgKHJlZGlyZWN0VG9Jc3N1ZVJlZnVuZCk9XCJnb3RvUmVmdW5kUmVhc29uUGFnZSgpXCIgPjwvY2NwYXktY29udGFjdC1kZXRhaWxzPlxuICA8cD5cbiAgICAgIDxhIChjbGljayk9XCJnb3RvQ2FzZXRyYW5zYXRpb25QYWdlQ2FuY2VsQnRuQ2xpY2tlZCgkZXZlbnQpXCIgY2xhc3M9XCJnb3Z1ay1saW5rXCIgZGF0YS1tb2R1bGU9XCJnb3Z1ay1idXR0b25cIj5cbiAgICAgICAgICBDYW5jZWxcbiAgICAgIDwvYT5cbiAgPC9wPlxuXG48L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdTdGF0dXMgPT09ICdjaGVja2lzc3VlcmVmdW5kcGFnZSdcIj5cbiAgICA8aW5wdXQgI215SW5wdXQgdHlwZT0naGlkZGVuJyBpZD0naUZyYW1lRHJpdmVuSW1hZ2VWYWx1ZScgdmFsdWU9J0NIRUNLSVNTVUVSRUZVTkRQQUdFJz4gXG4gICAgPGRpdiBjbGFzcz1cImdvdnVrLXdhcm5pbmctdGV4dFwiPlxuICAgICBcbiAgICAgICAgPGgxIGNsYXNzPVwiaGVhZGluZy1sYXJnZVwiPiBDaGVjayB5b3VyIGFuc3dlcnM8L2gxPlxuICAgIDwvZGl2PlxuICAgIDx0YWJsZSBjbGFzcz1cImdvdnVrLXRhYmxlXCI+XG4gICAgICAgIFxuICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5QYXltZW50IHJlZmVyZW5jZTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7cGF5bWVudFJlZmVyZW5jZX19PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+UGF5bWVudCBhbW91bnQ8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGxcIj57e3BheW1lbnQuYW1vdW50IHwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMid9fTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+UmVhc29uIGZvciByZWZ1bmQ8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7IGRpc3BsYXlSZWZ1bmRSZWFzb24/LnRyaW0oKSAgfX0gXG4gICAgICAgICA8YSAoY2xpY2spPVwiY2hhbmdlSXNzdWVSZWZ1bmRSZWFzb24oKVwiIGNsYXNzPVwiZ292dWstbGluayByaWdodFwiID5DaGFuZ2U8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiICpuZ0lmPVwiIWlzRnVsbHlSZWZ1bmRcIj5cbiAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+UmVmdW5kIGFtb3VudDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3t0b3RhbFJlZnVuZEFtb3VudCB8IGN1cnJlbmN5OidHQlAnOidzeW1ib2wtbmFycm93JzonMS4yLTInfX1cbiAgICAgICAgPGEgKGNsaWNrKT1cImNoYW5nZVJlZnVuZEFtb3VudCgpXCIgY2xhc3M9XCJnb3Z1ay1saW5rIHJpZ2h0XCIgPkNoYW5nZTwvYT5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCIgKm5nSWY9XCJpc0Z1bGx5UmVmdW5kXCI+XG4gICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPlJlZnVuZCBhbW91bnQ8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7cGF5bWVudC5hbW91bnQgfCBjdXJyZW5jeTonR0JQJzonc3ltYm9sLW5hcnJvdyc6JzEuMi0yJ319PC90ZD5cbiAgICAgIDwvdHI+XG4gICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+U2VuZCB0bzwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGxcIj57e29yZGVyUGFydHl9fTwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5TZW5kIHZpYTwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIHdoaXRlc3BhY2UtaW5oZXJpdFwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250YWN0RGV0YWlsc09iaj8ubm90aWZpY2F0aW9uX3R5cGUgPT09ICdFTUFJTCdcIiBjbGFzcz1cImNvbnRhY3REZXRhaWxzLXdpZHRoXCI+XG4gICAgICAgICAgICA8c3Ryb25nPkVtYWlsPC9zdHJvbmc+XG4gICAgICAgICAgICA8YnIvPlxuICAgICAgICAgICAge3tjb250YWN0RGV0YWlsc09iaj8uZW1haWw/LnRyaW0oKX19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRhY3REZXRhaWxzT2JqPy5ub3RpZmljYXRpb25fdHlwZSA9PT0gJ0xFVFRFUidcIiBjbGFzcz1cImNvbnRhY3REZXRhaWxzLXdpZHRoXCI+XG4gICAgICAgICAgICA8c3Ryb25nPlBvc3Q8L3N0cm9uZz5cbiAgICAgICAgICAgIDxici8+XG4gICAgICAgICAgICB7e2NvbnRhY3REZXRhaWxzT2JqPy5hZGRyZXNzX2xpbmU/LnRyaW0oKX19Jm5ic3A7e3tjb250YWN0RGV0YWlsc09iaj8uY2l0eT8udHJpbSgpfX0mbmJzcDt7e2NvbnRhY3REZXRhaWxzT2JqPy5jb3VudHk/LnRyaW0oKX19Jm5ic3A7e3tjb250YWN0RGV0YWlsc09iaj8uY291bnRyeT8udHJpbSgpfX0mbmJzcDt7e2NvbnRhY3REZXRhaWxzT2JqPy5wb3N0YWxfY29kZT8udHJpbSgpfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YSAoY2xpY2spPVwiZ290b0NvbnRhY3REZXRhaWxzUGFnZShjb250YWN0RGV0YWlsc09iailcIiBjbGFzcz1cImdvdnVrLWxpbmsgcmlnaHRcIiA+Q2hhbmdlPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cblxuICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5Ob3RpZmljYXRpb248L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7dGVtcGxhdGVJbnN0cnVjdGlvblR5cGV9fVxuICAgICAgICAgICAgPGEgKm5nSWY9XCIhbm90aWZpY2F0aW9uUHJldmlld1wiIGhyZWY9XCJKYXZhc2NyaXB0OnZvaWQoMClcIiBjbGFzcz1cImdvdnVrLWxpbmsgcmlnaHRcIiAoY2xpY2spPVwic2hvd05vdGlmaWNhdGlvblByZXZpZXcoKVwiPlxuICAgICAgICAgICAgICBQcmV2aWV3XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8YSAqbmdJZj1cIm5vdGlmaWNhdGlvblByZXZpZXdcIiBocmVmPVwiSmF2YXNjcmlwdDp2b2lkKDApXCIgY2xhc3M9XCJnb3Z1ay1saW5rIHJpZ2h0XCIgKGNsaWNrKT1cImhpZGVOb3RpZmljYXRpb25QcmV2aWV3KClcIj5cbiAgICAgICAgICAgICAgSGlkZSBQcmV2aWV3XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvdGFibGU+XG5cbiAgICA8YXBwLW5vdGlmaWNhdGlvbi1wcmV2aWV3ICpuZ0lmPVwibm90aWZpY2F0aW9uUHJldmlld1wiIFxuICAgIFtwYXltZW50XT1cInBheW1lbnRcIiBcbiAgICBbY29udGFjdERldGFpbHNdPVwiY29udGFjdERldGFpbHNPYmpcIlxuICAgIFtyZWZ1bmRSZWFzb25dPVwic2VsZWN0ZWRSZWZ1bmRSZWFzb25Db2RlXCJcbiAgICBbcmVmdW5kQW1vdW50XT1cImlzRnVsbHlSZWZ1bmQgPyBwYXltZW50LmFtb3VudCA6IHRvdGFsUmVmdW5kQW1vdW50XCI+PC9hcHAtbm90aWZpY2F0aW9uLXByZXZpZXc+XG5cblxuICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1idXR0b24tZ3JvdXBcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ1dHRvbiBnb3Z1ay1idXR0b24tLXNlY29uZGFyeVwiIChjbGljayk9XCJnb3RvQ29udGFjdERldGFpbHNQYWdlKGNvbnRhY3REZXRhaWxzT2JqKVwiPiBQcmV2aW91cyA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIlxuICAgIFtkaXNhYmxlZF09XCJpc0NvbmZpcm1hdGlvbkJ0bkRpc2FibGVkXCJcbiAgICBbbmdDbGFzc109J2lzQ29uZmlybWF0aW9uQnRuRGlzYWJsZWQgPyBcImJ1dHRvbiBidXR0b24tLWRpc2FibGVkIGdvdnVrLSEtbWFyZ2luLXJpZ2h0LTFcIiA6IFwiYnV0dG9uIGdvdnVrLSEtbWFyZ2luLXJpZ2h0LTFcIidcbiAgICAoY2xpY2spPVwiY29uZmlybUlzc3VlUmVmdW5kKGlzRnVsbHlSZWZ1bmQpXCI+XG4gICAgICBTdWJtaXQgcmVmdW5kXG4gICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPHA+XG4gICAgICAgIDxhIChjbGljayk9XCJnb3RvQ2FzZXRyYW5zYXRpb25QYWdlQ2FuY2VsQnRuQ2xpY2tlZCgkZXZlbnQpXCIgY2xhc3M9XCJnb3Z1ay1saW5rXCIgZGF0YS1tb2R1bGU9XCJnb3Z1ay1idXR0b25cIj5cbiAgICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2E+XG4gICAgPC9wPlxuXG48L25nLWNvbnRhaW5lcj5cblxuPCEtLVJldHJvIFJlZnVuZC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdDb21wU3RhdHVzID09PSAnYWRkcmVmdW5kZm9ycmVtaXNzaW9uJ1wiPlxuICA8aW5wdXQgI215SW5wdXQgdHlwZT0naGlkZGVuJyBpZD0naUZyYW1lRHJpdmVuSW1hZ2VWYWx1ZScgdmFsdWU9J0FERFJFU1NERVRBSUxTUkVUUk9SRU1JU1NJT05QQUdFJz4gICAgICBcbiAgPGgxIGNsYXNzPVwiZ292dWstaGVhZGluZy1sXCI+UHJvY2VzcyByZWZ1bmQ8L2gxPlxuICA8aDIgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLW0gZ292dWstZm9udDE5cHhcIj5DYXNlIHJlZmVyZW5jZToge3tjY2RDYXNlTnVtYmVyIHwgY2NkSHlwaGVucyB9fTwvaDI+XG4gIDxzcGFuIGlkPVwiaG93LWNvbnRhY3RlZC1jb25kaXRpb25hbC1oaW50XCIgY2xhc3M9XCJnb3Z1ay1oaW50IGdvdnVrLWZvbnQxOXB4XCI+XG4gICAgUGF5bWVudCByZWZlcmVuY2U6IHt7cGF5bWVudFJlZmVyZW5jZX19XG4gIDwvc3Bhbj5cbjxjY3BheS1jb250YWN0LWRldGFpbHMgXG5bYWRkcmVzc09ial0gPSBub3RpZmljYXRpb25cbihhc3NpZ25Db250YWN0RGV0YWlscyk9XCJnZXRDb250YWN0RGV0YWlscygkZXZlbnQsICdhZGRyZWZ1bmRjaGVja2FuZGFuc3dlcicpXCJcbihyZWRpcmVjdFRvSXNzdWVSZWZ1bmQpPVwiZ290b1NlcnZpY2VSZXF1ZXN0UGFnZSgkZXZlbnQpXCIgPjwvY2NwYXktY29udGFjdC1kZXRhaWxzPlxuPHA+XG4gICAgPGEgKGNsaWNrKT1cImdvdG9DYXNldHJhbnNhdGlvblBhZ2VDYW5jZWxCdG5DbGlja2VkKCRldmVudClcIiBjbGFzcz1cImdvdnVrLWxpbmtcIiBkYXRhLW1vZHVsZT1cImdvdnVrLWJ1dHRvblwiPlxuICAgICAgICBDYW5jZWxcbiAgICA8L2E+XG48L3A+XG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3U3RhdHVzID09PSAnYWRkcmVmdW5kY2hlY2thbmRhbnN3ZXInXCI+XG4gICAgPGlucHV0ICNteUlucHV0IHR5cGU9J2hpZGRlbicgaWQ9J2lGcmFtZURyaXZlbkltYWdlVmFsdWUnIHZhbHVlPSdBRERSRUZVTkRGT1JSRU1JU1NJT04nPiBcbiAgICA8ZGl2IGNsYXNzPVwiZ292dWstd2FybmluZy10ZXh0XCI+XG4gICAgIFxuICAgICAgICA8aDEgY2xhc3M9XCJoZWFkaW5nLWxhcmdlXCI+IENoZWNrIHlvdXIgYW5zd2VyczwvaDE+XG4gICAgPC9kaXY+XG4gICAgPHRhYmxlIGNsYXNzPVwiZ292dWstdGFibGVcIj5cbiAgICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+UmVhc29uIGZvciByZWZ1bmQ8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGxcIj5SZXRyb3NwZWN0aXZlIHJlbWlzc2lvbjwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPlBheW1lbnQgcmVmZXJlbmNlPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3twYXltZW50UmVmZXJlbmNlfX08L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5SZWZ1bmQgYW1vdW50PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3tyZW1pc3Npb24uaHdmX2Ftb3VudCB8IGN1cnJlbmN5OidHQlAnOidzeW1ib2wtbmFycm93JzonMS4yLTInfX08L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5GZWUgY29kZTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7cmVtaXNzaW9uLmZlZV9jb2RlfX08L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5GZWUgYW1vdW50PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3tmZWVhbW91bnQgfCBjdXJyZW5jeTonR0JQJzonc3ltYm9sLW5hcnJvdyc6JzEuMi0yJ319PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPlNlbmQgdG88L3RkPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3tvcmRlclBhcnR5fX08L3RkPlxuICAgICAgPC90cj5cbiAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+U2VuZCB2aWE8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCB3aGl0ZXNwYWNlLWluaGVyaXRcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udGFjdERldGFpbHNPYmo/Lm5vdGlmaWNhdGlvbl90eXBlID09PSAnRU1BSUwnXCIgY2xhc3M9XCJjb250YWN0RGV0YWlscy13aWR0aFwiPlxuICAgICAgICAgICAgPHN0cm9uZz5FbWFpbDwvc3Ryb25nPlxuICAgICAgICAgICAgPGJyLz5cbiAgICAgICAgICAgIHt7Y29udGFjdERldGFpbHNPYmo/LmVtYWlsPy50cmltKCl9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250YWN0RGV0YWlsc09iaj8ubm90aWZpY2F0aW9uX3R5cGUgPT09ICdMRVRURVInXCIgY2xhc3M9XCJjb250YWN0RGV0YWlscy13aWR0aFwiPlxuICAgICAgICAgICAgPHN0cm9uZz5Qb3N0PC9zdHJvbmc+XG4gICAgICAgICAgICA8YnIvPlxuICAgICAgICAgICAge3tjb250YWN0RGV0YWlsc09iaj8uYWRkcmVzc19saW5lPy50cmltKCl9fSZuYnNwO3t7Y29udGFjdERldGFpbHNPYmo/LmNpdHk/LnRyaW0oKX19Jm5ic3A7e3tjb250YWN0RGV0YWlsc09iaj8uY291bnR5Py50cmltKCl9fSZuYnNwO3t7Y29udGFjdERldGFpbHNPYmo/LmNvdW50cnk/LnRyaW0oKX19Jm5ic3A7e3tjb250YWN0RGV0YWlsc09iaj8ucG9zdGFsX2NvZGU/LnRyaW0oKX19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGEgKGNsaWNrKT1cImdvdG9BZGRyZXNzUGFnZShjb250YWN0RGV0YWlsc09iailcIiBjbGFzcz1cImdvdnVrLWxpbmsgcmlnaHRcIiA+Q2hhbmdlPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cblxuICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj5Ob3RpZmljYXRpb248L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7dGVtcGxhdGVJbnN0cnVjdGlvblR5cGV9fVxuICAgICAgICAgICAgPGEgKm5nSWY9XCIhbm90aWZpY2F0aW9uUHJldmlld1wiIGhyZWY9XCJKYXZhc2NyaXB0OnZvaWQoMClcIiBjbGFzcz1cImdvdnVrLWxpbmsgcmlnaHRcIiAoY2xpY2spPVwic2hvd05vdGlmaWNhdGlvblByZXZpZXcoKVwiPlxuICAgICAgICAgICAgICBQcmV2aWV3XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8YSAqbmdJZj1cIm5vdGlmaWNhdGlvblByZXZpZXdcIiBocmVmPVwiSmF2YXNjcmlwdDp2b2lkKDApXCIgY2xhc3M9XCJnb3Z1ay1saW5rIHJpZ2h0XCIgKGNsaWNrKT1cImhpZGVOb3RpZmljYXRpb25QcmV2aWV3KClcIj5cbiAgICAgICAgICAgICAgSGlkZSBQcmV2aWV3XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvdGFibGU+XG5cbiAgICA8YXBwLW5vdGlmaWNhdGlvbi1wcmV2aWV3ICpuZ0lmPVwibm90aWZpY2F0aW9uUHJldmlld1wiIFxuICAgIFtjb250YWN0RGV0YWlsc109XCJjb250YWN0RGV0YWlsc09ialwiXG4gICAgW3BheW1lbnRSZWZlcmVuY2VdPVwicGF5bWVudFJlZmVyZW5jZVwiXG4gICAgW3BheW1lbnRdPVwicGF5bWVudE9ialwiXG4gICAgW3JlZnVuZFJlYXNvbl09XCInUlIwMzYnXCJcbiAgICBbcmVmdW5kQW1vdW50XT1cInJlbWlzc2lvbi5od2ZfYW1vdW50XCI+PC9hcHAtbm90aWZpY2F0aW9uLXByZXZpZXc+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZ292dWstYnV0dG9uLWdyb3VwXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidXR0b24gZ292dWstYnV0dG9uLS1zZWNvbmRhcnlcIiAoY2xpY2spPVwiZ290b0FkZHJlc3NQYWdlKGNvbnRhY3REZXRhaWxzT2JqKVwiPlByZXZpb3VzPC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCJcbiAgICBbZGlzYWJsZWRdPVwiaXNDb25maXJtYXRpb25CdG5EaXNhYmxlZFwiXG4gICAgW25nQ2xhc3NdPSdpc0NvbmZpcm1hdGlvbkJ0bkRpc2FibGVkID8gXCJidXR0b24gYnV0dG9uLS1kaXNhYmxlZCBnb3Z1ay0hLW1hcmdpbi1yaWdodC0xXCIgOiBcImJ1dHRvbiBnb3Z1ay0hLW1hcmdpbi1yaWdodC0xXCInXG4gICAgKGNsaWNrKT1cInByb2Nlc3NSZWZ1bmQoKVwiPlxuICAgICAgU3VibWl0IHJlZnVuZFxuICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxwPlxuICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgIChjbGljayk9XCJnb3RvQ2FzZXRyYW5zYXRpb25QYWdlQ2FuY2VsQnRuQ2xpY2tlZCgkZXZlbnQpXCIgY2xhc3M9XCJnb3Z1ay1saW5rXCIgZGF0YS1tb2R1bGU9XCJnb3Z1ay1idXR0b25cIj5cbiAgICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2E+XG4gICAgPC9wPlxuXG48L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdTdGF0dXMgPT09ICdyZXRyb3JlZnVuZGNvbmZpcm1hdGlvbnBhZ2UnXCI+XG4gIDxkaXYgY2xhc3M9XCJnb3Z1ay1ncmlkLXJvd1wiPlxuICAgIDxkaXYgPlxuICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLXBhbmVsIGdvdnVrLXBhbmVsLS1jb25maXJtYXRpb25cIj5cbiAgICAgICAgPGgxIGNsYXNzPVwiZ292dWstcGFuZWxfX3RpdGxlXCI+XG4gICAgICAgICAgUmVmdW5kIHN1Ym1pdHRlZFxuICAgICAgICA8L2gxPlxuICAgICAgICBcbiAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLXBhbmVsX19ib2R5XCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJnb3Z1ay1ib2R5IHdoaXRlXCI+PHN0cm9uZz5SZWZ1bmQgcmVmZXJlbmNlOiB7e3JlZnVuZFJlZmVyZW5jZX19PC9zdHJvbmc+PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJpc1BheW1lbnRTdWNjZXNzXCI+XG4gICAgICA8aDIgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLWxcIj5XaGF0IGhhcHBlbnMgbmV4dDwvaDI+XG4gICAgICA8cCBjbGFzcz1cImdvdnVrLWJvZHlcIj5cbiAgICAgICAgQSByZWZ1bmQgcmVxdWVzdCBmb3Ige3sgcmVmdW5kQW1vdW50fCBjdXJyZW5jeTonR0JQJzonc3ltYm9sLW5hcnJvdyc6JzEuMi0yJ319IGhhcyBiZWVuIHBhc3NlZCB0byBhIHRlYW0gbGVhZGVyIHRvIGFwcHJvdmUuXG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gICAgPHAgY2xhc3M9XCJnb3Z1ay1ib2R5XCI+XG4gICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIChjbGljayk9XCJnb3RvQ2FzZXRyYW5zYXRpb25QYWdlQ2FuY2VsQnRuQ2xpY2tlZCgkZXZlbnQpXCIgY2xhc3M9XCJnb3Z1ay1saW5rIHBvaW50ZXJcIiBkYXRhLW1vZHVsZT1cImdvdnVrLWJ1dHRvblwiPlxuICAgICAgUmV0dXJuIHRvIGNhc2VcbiAgPC9hPlxuICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdTdGF0dXMgPT09ICdvcmRlci1mdWxsLXZpZXcnXCI+XG4gIDxjY3BheS1zZXJ2aWNlLXJlcXVlc3RcbiAgW3ZpZXdTdGF0dXNdID0gXCJ2aWV3U3RhdHVzXCJcbiAgW29yZGVyUmVmXSA9IFwib3JkZXJSZWZcIlxuICBbaXNTZXJ2aWNlUmVxdWVzdF09XCJpc1NlcnZpY2VSZXF1ZXN0XCJcbiAgW29yZGVyU3RhdHVzXSA9IFwib3JkZXJTdGF0dXNcIlxuICBbb3JkZXJDcmVhdGVkXSA9IFwib3JkZXJDcmVhdGVkXCJcbiAgW29yZGVyUGFydHldID0gXCJvcmRlclBhcnR5XCJcbiAgW29yZGVyQ0NERXZlbnRdID0gXCJvcmRlckNDREV2ZW50XCJcbiAgW29yZGVyRGV0YWlsXSA9IFwib3JkZXJEZXRhaWxcIlxuICBbTE9HR0VESU5VU0VSUk9MRVNdID0gXCJMT0dHRURJTlVTRVJST0xFU1wiXG4gIFt0YWtlUGF5bWVudF0gPSBcInRha2VQYXltZW50XCJcbiAgW2NjZENhc2VOdW1iZXJdID0gXCJjY2RDYXNlTnVtYmVyXCJcbiAgW29yZGVyRmVlc1RvdGFsXSA9IFwib3JkZXJGZWVzVG90YWxcIlxuICBbb3JkZXJUb3RhbFBheW1lbnRzXSA9IFwib3JkZXJUb3RhbFBheW1lbnRzXCJcbiAgW29yZGVyUmVtaXNzaW9uVG90YWxdID0gXCJvcmRlclJlbWlzc2lvblRvdGFsXCI+XG48L2NjcGF5LXNlcnZpY2UtcmVxdWVzdD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwidmlld1N0YXR1cyA9PT0gJ3BheW1lbnQtdmlldydcIj5cbiAgPGNjcGF5LXBheW1lbnQtdmlldyBcbiAgW0xPR0dFRElOVVNFUlJPTEVTXSA9IFwiTE9HR0VESU5VU0VSUk9MRVNcIlxuICBbaXNUdXJuT2ZmXSA9IFwiaXNUdXJuT2ZmXCIgXG4gIFtpc1Rha2VQYXltZW50XSA9IFwidGFrZVBheW1lbnRcIiAgXG4gIFtjYXNlVHlwZV0gPSBcImNhc2VUeXBlXCJcbiAgW2lzU2VydmljZVJlcXVlc3RdPVwiaXNTZXJ2aWNlUmVxdWVzdFwiXG4gIFtvcmRlclJlZl0gPSBcIm9yZGVyUmVmXCJcbiAgW29yZGVyU3RhdHVzXSA9IFwib3JkZXJTdGF0dXNcIlxuICBbb3JkZXJDcmVhdGVkXSA9IFwib3JkZXJDcmVhdGVkXCJcbiAgW29yZGVyUGFydHldID0gXCJvcmRlclBhcnR5XCJcbiAgW29yZGVyQ0NERXZlbnRdID0gXCJvcmRlckNDREV2ZW50XCJcbiAgW29yZGVyRGV0YWlsXSA9IFwib3JkZXJEZXRhaWxcIlxuICBbb3JkZXJGZWVzVG90YWxdID0gXCJvcmRlckZlZXNUb3RhbFwiXG4gIFtvcmRlclRvdGFsUGF5bWVudHNdID0gXCJvcmRlclRvdGFsUGF5bWVudHNcIlxuICBbb3JkZXJSZW1pc3Npb25Ub3RhbF0gPSBcIm9yZGVyUmVtaXNzaW9uVG90YWxcIlxuICA+XG48L2NjcGF5LXBheW1lbnQtdmlldz5cbjwvbmctY29udGFpbmVyPlxuXG48L2Rpdj4iXX0=