@sachin9822/reports-lib 0.0.211 → 0.0.212

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 (211) hide show
  1. package/karma.conf.js +44 -0
  2. package/ng-package.json +17 -0
  3. package/package.json +16 -31
  4. package/src/assets/images/BreadcrumbArrow.png +0 -0
  5. package/src/lib/assets/images/Search.svg +10 -0
  6. package/src/lib/assets/images/XMLogo.png +0 -0
  7. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.html +27 -0
  8. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.scss +46 -0
  9. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.spec.ts +23 -0
  10. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.ts +292 -0
  11. package/src/lib/components/accounting-report/accounting-report.component.html +64 -0
  12. package/src/lib/components/accounting-report/accounting-report.component.scss +24 -0
  13. package/src/lib/components/accounting-report/accounting-report.component.spec.ts +23 -0
  14. package/src/lib/components/accounting-report/accounting-report.component.ts +738 -0
  15. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.html +46 -0
  16. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.scss +2 -0
  17. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.spec.ts +23 -0
  18. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.ts +247 -0
  19. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.html +46 -0
  20. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.scss +3 -0
  21. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.spec.ts +23 -0
  22. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.ts +276 -0
  23. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.html +51 -0
  24. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.scss +7 -0
  25. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.spec.ts +23 -0
  26. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.ts +840 -0
  27. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.html +68 -0
  28. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.scss +65 -0
  29. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.spec.ts +23 -0
  30. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.ts +290 -0
  31. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.html +25 -0
  32. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.scss +1 -0
  33. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.spec.ts +23 -0
  34. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.ts +213 -0
  35. package/src/lib/components/funding-report/funding-report.component.html +49 -0
  36. package/src/lib/components/funding-report/funding-report.component.scss +1 -0
  37. package/src/lib/components/funding-report/funding-report.component.spec.ts +23 -0
  38. package/src/lib/components/funding-report/funding-report.component.ts +221 -0
  39. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.html +26 -0
  40. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.scss +1 -0
  41. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.spec.ts +23 -0
  42. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.ts +267 -0
  43. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.html +95 -0
  44. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.scss +54 -0
  45. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.spec.ts +23 -0
  46. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.ts +904 -0
  47. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.html +49 -0
  48. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.scss +2 -0
  49. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.spec.ts +32 -0
  50. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.ts +304 -0
  51. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.html +46 -0
  52. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.scss +7 -0
  53. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.ts +343 -0
  54. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.html +25 -0
  55. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.scss +23 -0
  56. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.spec.ts +23 -0
  57. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.ts +745 -0
  58. package/src/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.ts +10 -0
  59. package/src/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.ts +20 -0
  60. package/src/lib/models/accounting-report/accounting-report-branch-group.ts +7 -0
  61. package/src/lib/models/accounting-report/accounting-report-entry-model.ts +25 -0
  62. package/src/lib/models/accounting-report/accounting-report-model.ts +7 -0
  63. package/{lib/models/accounting-report/accounting-report-sub-group.d.ts → src/lib/models/accounting-report/accounting-report-sub-group.ts} +3 -2
  64. package/{lib/models/app-config.model.d.ts → src/lib/models/app-config.model.ts} +8 -7
  65. package/src/lib/models/branch-activity-receive-report/branch-activity-receive.model.ts +18 -0
  66. package/src/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.ts +16 -0
  67. package/src/lib/models/branch-activity-report/branch-activity-send-report.ts +26 -0
  68. package/src/lib/models/cancellation-transaction-report/cancellation-transaction.model.ts +65 -0
  69. package/src/lib/models/component-loading-states.ts +5 -0
  70. package/src/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.ts +28 -0
  71. package/{lib/models/revenue-per-transaction-report/revenue-per-transaction.model.d.ts → src/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.ts} +1 -1
  72. package/src/lib/models/statement-of-account-report/statement-of-accounts.model.ts +21 -0
  73. package/src/lib/models/transaction-enquiry-report/transaction-enquiry.model.ts +127 -0
  74. package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.ts +16 -0
  75. package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report.ts +29 -0
  76. package/src/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.ts +46 -0
  77. package/src/lib/reports-lib-routing.module.ts +20 -0
  78. package/src/lib/reports-lib.component.spec.ts +23 -0
  79. package/src/lib/reports-lib.component.ts +20 -0
  80. package/src/lib/reports-lib.module.ts +102 -0
  81. package/src/lib/reports-lib.service.spec.ts +16 -0
  82. package/src/lib/reports-lib.service.ts +9 -0
  83. package/src/lib/services/config.service.ts +43 -0
  84. package/src/lib/services/report.service.spec.ts +16 -0
  85. package/src/lib/services/report.service.ts +463 -0
  86. package/src/lib/shared/export-generic.service.ts +557 -0
  87. package/src/lib/shared/export.service.spec.ts +16 -0
  88. package/src/lib/shared/export.service.ts +457 -0
  89. package/src/lib/shared/loader/loader.component.html +8 -0
  90. package/src/lib/shared/loader/loader.component.scss +52 -0
  91. package/src/lib/shared/loader/loader.component.ts +10 -0
  92. package/src/lib/shared/metadata/metadata.component.html +42 -0
  93. package/src/lib/shared/metadata/metadata.component.scss +95 -0
  94. package/src/lib/shared/metadata/metadata.component.spec.ts +23 -0
  95. package/src/lib/shared/metadata/metadata.component.ts +38 -0
  96. package/src/lib/shared/page-size-selector/page-size-selector.component.html +7 -0
  97. package/src/lib/shared/page-size-selector/page-size-selector.component.scss +42 -0
  98. package/src/lib/shared/page-size-selector/page-size-selector.component.spec.ts +23 -0
  99. package/src/lib/shared/page-size-selector/page-size-selector.component.ts +38 -0
  100. package/src/lib/shared/search-filter/search-filter.component.html +601 -0
  101. package/src/lib/shared/search-filter/search-filter.component.scss +203 -0
  102. package/src/lib/shared/search-filter/search-filter.component.spec.ts +23 -0
  103. package/src/lib/shared/search-filter/search-filter.component.ts +2387 -0
  104. package/src/lib/shared/shared.module.ts +13 -0
  105. package/{public-api.d.ts → src/public-api.ts} +17 -7
  106. package/src/styles/ag-grid-report-style.scss +71 -0
  107. package/src/styles/common-ag-grid-style.scss +146 -0
  108. package/src/styles/common-report-style.scss +395 -0
  109. package/src/styles/common-style.scss +615 -0
  110. package/src/test.ts +27 -0
  111. package/tsconfig.lib.json +15 -0
  112. package/tsconfig.lib.prod.json +10 -0
  113. package/tsconfig.spec.json +17 -0
  114. package/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +0 -240
  115. package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +0 -596
  116. package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +0 -218
  117. package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +0 -243
  118. package/esm2020/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.mjs +0 -700
  119. package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +0 -255
  120. package/esm2020/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.mjs +0 -192
  121. package/esm2020/lib/components/funding-report/funding-report.component.mjs +0 -198
  122. package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +0 -244
  123. package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +0 -776
  124. package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +0 -266
  125. package/esm2020/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.mjs +0 -311
  126. package/esm2020/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.mjs +0 -631
  127. package/esm2020/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.mjs +0 -2
  128. package/esm2020/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.mjs +0 -2
  129. package/esm2020/lib/models/accounting-report/accounting-report-branch-group.mjs +0 -2
  130. package/esm2020/lib/models/accounting-report/accounting-report-entry-model.mjs +0 -2
  131. package/esm2020/lib/models/accounting-report/accounting-report-model.mjs +0 -2
  132. package/esm2020/lib/models/accounting-report/accounting-report-sub-group.mjs +0 -2
  133. package/esm2020/lib/models/app-config.model.mjs +0 -2
  134. package/esm2020/lib/models/branch-activity-receive-report/branch-activity-receive.model.mjs +0 -2
  135. package/esm2020/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.mjs +0 -6
  136. package/esm2020/lib/models/branch-activity-report/branch-activity-send-report.mjs +0 -3
  137. package/esm2020/lib/models/cancellation-transaction-report/cancellation-transaction.model.mjs +0 -10
  138. package/esm2020/lib/models/component-loading-states.mjs +0 -7
  139. package/esm2020/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.mjs +0 -5
  140. package/esm2020/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.mjs +0 -2
  141. package/esm2020/lib/models/statement-of-account-report/statement-of-accounts.model.mjs +0 -2
  142. package/esm2020/lib/models/transaction-enquiry-report/transaction-enquiry.model.mjs +0 -8
  143. package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.mjs +0 -6
  144. package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report.mjs +0 -5
  145. package/esm2020/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.mjs +0 -3
  146. package/esm2020/lib/reports-lib-routing.module.mjs +0 -24
  147. package/esm2020/lib/reports-lib.component.mjs +0 -22
  148. package/esm2020/lib/reports-lib.module.mjs +0 -172
  149. package/esm2020/lib/reports-lib.service.mjs +0 -14
  150. package/esm2020/lib/services/config.service.mjs +0 -39
  151. package/esm2020/lib/services/report.service.mjs +0 -374
  152. package/esm2020/lib/shared/export-generic.service.mjs +0 -443
  153. package/esm2020/lib/shared/export.service.mjs +0 -379
  154. package/esm2020/lib/shared/loader/loader.component.mjs +0 -11
  155. package/esm2020/lib/shared/metadata/metadata.component.mjs +0 -51
  156. package/esm2020/lib/shared/page-size-selector/page-size-selector.component.mjs +0 -44
  157. package/esm2020/lib/shared/search-filter/search-filter.component.mjs +0 -2134
  158. package/esm2020/lib/shared/shared.module.mjs +0 -21
  159. package/esm2020/public-api.mjs +0 -41
  160. package/esm2020/sachin9822-reports-lib.mjs +0 -5
  161. package/fesm2015/sachin9822-reports-lib.mjs +0 -8402
  162. package/fesm2015/sachin9822-reports-lib.mjs.map +0 -1
  163. package/fesm2020/sachin9822-reports-lib.mjs +0 -8384
  164. package/fesm2020/sachin9822-reports-lib.mjs.map +0 -1
  165. package/index.d.ts +0 -5
  166. package/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.d.ts +0 -70
  167. package/lib/components/accounting-report/accounting-report.component.d.ts +0 -76
  168. package/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.d.ts +0 -58
  169. package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +0 -69
  170. package/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.d.ts +0 -78
  171. package/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.d.ts +0 -95
  172. package/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.d.ts +0 -55
  173. package/lib/components/funding-report/funding-report.component.d.ts +0 -55
  174. package/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.d.ts +0 -57
  175. package/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.d.ts +0 -109
  176. package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +0 -76
  177. package/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.d.ts +0 -68
  178. package/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.d.ts +0 -71
  179. package/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.d.ts +0 -8
  180. package/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.d.ts +0 -18
  181. package/lib/models/accounting-report/accounting-report-branch-group.d.ts +0 -6
  182. package/lib/models/accounting-report/accounting-report-entry-model.d.ts +0 -24
  183. package/lib/models/accounting-report/accounting-report-model.d.ts +0 -6
  184. package/lib/models/branch-activity-receive-report/branch-activity-receive.model.d.ts +0 -18
  185. package/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.d.ts +0 -13
  186. package/lib/models/branch-activity-report/branch-activity-send-report.d.ts +0 -24
  187. package/lib/models/cancellation-transaction-report/cancellation-transaction.model.d.ts +0 -44
  188. package/lib/models/component-loading-states.d.ts +0 -5
  189. package/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.d.ts +0 -26
  190. package/lib/models/statement-of-account-report/statement-of-accounts.model.d.ts +0 -18
  191. package/lib/models/transaction-enquiry-report/transaction-enquiry.model.d.ts +0 -113
  192. package/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.d.ts +0 -13
  193. package/lib/models/transaction-monitoring-report/transaction-monitoring-report.d.ts +0 -23
  194. package/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.d.ts +0 -38
  195. package/lib/reports-lib-routing.module.d.ts +0 -7
  196. package/lib/reports-lib.component.d.ts +0 -8
  197. package/lib/reports-lib.module.d.ts +0 -33
  198. package/lib/reports-lib.service.d.ts +0 -6
  199. package/lib/services/config.service.d.ts +0 -20
  200. package/lib/services/report.service.d.ts +0 -80
  201. package/lib/shared/export-generic.service.d.ts +0 -50
  202. package/lib/shared/export.service.d.ts +0 -32
  203. package/lib/shared/loader/loader.component.d.ts +0 -5
  204. package/lib/shared/metadata/metadata.component.d.ts +0 -24
  205. package/lib/shared/page-size-selector/page-size-selector.component.d.ts +0 -15
  206. package/lib/shared/search-filter/search-filter.component.d.ts +0 -127
  207. package/lib/shared/shared.module.d.ts +0 -11
  208. /package/{lib → src}/assets/images/Search.svg +0 -0
  209. /package/{lib/assets/images/XMLogo.png → src/assets/images/XMCoral.png} +0 -0
  210. /package/{lib → src/lib}/assets/config/app-config.json +0 -0
  211. /package/{lib → src/lib}/assets/svg-loaders/blue-tail-spin.svg +0 -0
@@ -1,776 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { finalize, takeUntil } from 'rxjs/operators';
4
- import { ComponentLoadingStates } from '../../models/component-loading-states';
5
- import { formatDate } from '@angular/common';
6
- import jsPDF from 'jspdf';
7
- import 'jspdf-autotable';
8
- import * as ExcelJS from 'exceljs';
9
- import * as FileSaver from 'file-saver';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "../../services/report.service";
12
- import * as i2 from "ag-grid-angular";
13
- import * as i3 from "@angular/common";
14
- import * as i4 from "../../shared/metadata/metadata.component";
15
- import * as i5 from "../../shared/loader/loader.component";
16
- import * as i6 from "../../shared/search-filter/search-filter.component";
17
- export class StatementOfAccountsReportComponent {
18
- constructor(reportService) {
19
- this.reportService = reportService;
20
- this.ReportName = "Statement of Accounts";
21
- this.ComponentLoadingState = ComponentLoadingStates;
22
- this.loadingState = ComponentLoadingStates.Complete;
23
- this.destroy$ = new Subject();
24
- this.openingBalAndFunding = [];
25
- this.sendDetails = [];
26
- this.receiveDetails = [];
27
- this.currentDateTime = new Date();
28
- this.sendPinnedBottomRow = [];
29
- this.receivePinnedBottomRow = [];
30
- this.closingBalance = 0;
31
- this.closingBalanceCurrency = 'USD';
32
- this.closingBalanceUSDInWords = '';
33
- this.selectedClientType = '';
34
- this.showTables = false;
35
- this.closingBalanceInSettlment = 0;
36
- this.closingBalanceSettlmentCurrency = '';
37
- this.closingBalanceSettlmentInWords = '';
38
- this.closingBalanceSettlmentFormatted = '0.000';
39
- this.closingBalanceInUsdFormatted = '0.000';
40
- this.isFormValid = false;
41
- this.columnDefs = [
42
- // { headerName: 'ID', field: 'id', width: 100 },
43
- { headerName: 'Description', field: 'description', flex: 4, tooltipField: 'description', cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } },
44
- { headerName: 'Settlment Ccy', field: 'settlmentCcy', flex: 1, tooltipField: 'settlmentCcy', cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } },
45
- { headerName: 'Amount In Settlment Ccy', field: 'amountInSettlmentCcy', flex: 2.1, cellClass: 'ag-right-aligned-cell', valueFormatter: this.currencyFormatter, tooltipValueGetter: (params) => this.currencyFormatter(params), cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } },
46
- { headerName: 'Amount In USD', field: 'amountInUSD', flex: 2.1, cellClass: 'ag-right-aligned-cell', valueFormatter: this.currencyFormatter, tooltipValueGetter: (params) => this.currencyFormatter(params), cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } }
47
- ];
48
- this.defaultColDef = {
49
- sortable: true,
50
- filter: true,
51
- resizable: true,
52
- minwidth: 40,
53
- wrapHeaderText: true,
54
- autoHeaderHeight: true,
55
- suppressSizeToFit: false,
56
- wrapText: true,
57
- autoHeight: true
58
- };
59
- // Helper arrays
60
- this.ones = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"];
61
- this.teens = ["Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"];
62
- this.tens = ["", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"];
63
- }
64
- async ngOnInit() {
65
- this.logoBase64 = await this.loadImageAsBase64('assets/reports-lib/assets/images/XMLogo.png');
66
- }
67
- currencyFormatter(params) {
68
- if (params.value == null)
69
- return '0.000';
70
- const num = Number(params.value);
71
- return num.toFixed(3); // rounds to 3 decimals
72
- }
73
- async handleSearch(criteria) {
74
- this.searchCriteria = criteria.searchCriteria;
75
- const modal = criteria.modal;
76
- this.reportUserandTime = `${criteria.sysUserID} @ ${formatDate(this.currentDateTime, 'dd/MM/yyyy hh:mm a', 'en-US')}`;
77
- const payload = {
78
- businessPartnerID: Number(modal.client),
79
- fromDate: new Date(modal.fromDate).toISOString(),
80
- toDate: new Date(modal.toDate).toISOString(),
81
- clientType: criteria.clientType
82
- };
83
- this.user = criteria.sysUserID;
84
- this.metaDataOne = {
85
- 'Report Period ': criteria.reportPeriod
86
- };
87
- this.metaDataTwo = {
88
- 'Report User & Time ': this.reportUserandTime
89
- };
90
- try {
91
- const sdate = new Date(payload?.fromDate);
92
- const edate = new Date(payload?.toDate);
93
- payload.fromDate = sdate.toISOString().split("T")[0];
94
- payload.toDate = edate.toISOString().split("T")[0];
95
- }
96
- catch (err) {
97
- throw new Error("Invalid Date");
98
- }
99
- this.searchCriteria = criteria.searchCriteria;
100
- console.log(criteria.clientName);
101
- this.loadingState = ComponentLoadingStates.Loading;
102
- this.errorMessage = '';
103
- this.showTables = false;
104
- this.selectedClientType = criteria.clientType;
105
- this.reportService.getStatementOfAccount(payload)
106
- .pipe(finalize(() => {
107
- this.loadingState = ComponentLoadingStates.Complete;
108
- this.hasSearched = true;
109
- this.showTables = true;
110
- }), takeUntil(this.destroy$))
111
- .subscribe({
112
- next: (data) => {
113
- console.log(data);
114
- this.openingBalAndFunding = data.openingBalAndFunding ?? [];
115
- this.sendDetails = data.sendDetails ?? [];
116
- this.receiveDetails = data.receiveDetails ?? [];
117
- // add pinned totals
118
- if (this.selectedClientType == "PayIn") {
119
- this.sendPinnedBottomRow = [this.buildTotalRow(this.sendDetails)];
120
- this.receivePinnedBottomRow = [];
121
- }
122
- else if (this.selectedClientType == "PayOut") {
123
- this.receivePinnedBottomRow = [this.buildTotalRow(this.receiveDetails)];
124
- this.sendPinnedBottomRow = [];
125
- }
126
- else if (this.selectedClientType === "Both") {
127
- this.sendPinnedBottomRow = [this.buildTotalRow(this.sendDetails)];
128
- this.receivePinnedBottomRow = [this.buildTotalRow(this.receiveDetails)];
129
- }
130
- else {
131
- this.sendPinnedBottomRow = [];
132
- this.receivePinnedBottomRow = [];
133
- }
134
- this.calculateClosingBalance();
135
- this.noDataFromApi =
136
- this.openingBalAndFunding.length === 0 &&
137
- this.sendDetails.length === 0 &&
138
- (!this.receiveDetails || this.receiveDetails.length === 0);
139
- },
140
- error: (err) => {
141
- console.error('Error fetching Statement of Accounts:', err);
142
- this.errorMessage = 'Failed to load Statement of Accounts';
143
- this.openingBalAndFunding = [];
144
- this.sendDetails = [];
145
- this.receiveDetails = [];
146
- this.loadingState = ComponentLoadingStates.Error;
147
- this.showTables = false;
148
- }
149
- });
150
- }
151
- buildTotalRow(rows) {
152
- const totalSettle = (rows || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
153
- const totalUsd = (rows || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
154
- return {
155
- id: null,
156
- description: 'Total',
157
- settlmentCcy: '',
158
- amountInSettlmentCcy: Number(totalSettle.toFixed(3)),
159
- amountInUSD: Number(totalUsd.toFixed(3))
160
- };
161
- }
162
- onOpeningGridReady(params) {
163
- this.openingGridApi = params.api;
164
- }
165
- onSendGridReady(params) {
166
- this.sendGridApi = params.api;
167
- }
168
- onReceiveGridReady(params) {
169
- this.receiveGridApi = params.api;
170
- }
171
- filter(text) {
172
- this.searchText = text;
173
- if (this.openingGridApi) {
174
- this.openingGridApi.setQuickFilter(this.searchText);
175
- }
176
- if (this.sendGridApi) {
177
- this.sendGridApi.setQuickFilter(this.searchText);
178
- }
179
- if (this.receiveGridApi) {
180
- this.receiveGridApi.setQuickFilter(this.searchText);
181
- }
182
- }
183
- calculateClosingBalance() {
184
- // USD totals (existing logic)
185
- const openingBalTotalUsd = (this.openingBalAndFunding || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
186
- const sendTotalUsd = (this.sendDetails || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
187
- const receiveTotalUsd = (this.receiveDetails || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
188
- const rawClosingUsd = openingBalTotalUsd + sendTotalUsd + receiveTotalUsd;
189
- this.closingBalance = Number(rawClosingUsd.toFixed(3)); // numeric USD
190
- // Settlement currency totals (new)
191
- const openingSettle = (this.openingBalAndFunding || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
192
- const sendSettle = (this.sendDetails || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
193
- const receiveSettle = (this.receiveDetails || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
194
- const rawClosingSettle = openingSettle + sendSettle + receiveSettle;
195
- this.closingBalanceInSettlment = Number(rawClosingSettle.toFixed(3));
196
- // pick a settlement currency to display (first non-empty)
197
- this.closingBalanceSettlmentCurrency = this.getFirstSettlementCurrency();
198
- // formatted strings (no-thousand-comma, 3 decimals)
199
- this.closingBalanceInUsdFormatted = this.formatNoComma(this.closingBalance);
200
- this.closingBalanceSettlmentFormatted = this.formatNoComma(this.closingBalanceInSettlment);
201
- this.closingBalanceUSDInWords = this.numberToWords(this.closingBalance);
202
- this.closingBalanceSettlmentInWords =
203
- this.closingBalanceInSettlment !== null &&
204
- this.closingBalanceInSettlment !== undefined &&
205
- !isNaN(Number(this.closingBalanceInSettlment))
206
- ? this.numberToWords(this.closingBalanceInSettlment)
207
- : '';
208
- }
209
- formatNoComma(value) {
210
- if (value === null || value === undefined || isNaN(Number(value)))
211
- return '0.000';
212
- const num = Number(value);
213
- const truncated = Math.trunc(num * 1000) / 1000;
214
- return truncated.toFixed(3);
215
- }
216
- getFirstSettlementCurrency() {
217
- const tryGet = (arr) => {
218
- if (!arr || arr.length === 0)
219
- return '';
220
- for (const r of arr) {
221
- if (r && r.settlmentCcy)
222
- return r.settlmentCcy;
223
- }
224
- return '';
225
- };
226
- return tryGet(this.openingBalAndFunding) || tryGet(this.sendDetails) || tryGet(this.receiveDetails) || '';
227
- }
228
- numberToWords(num) {
229
- if (num === 0)
230
- return "Zero Point Zero Zero Zero Only";
231
- let result = "";
232
- // Handle negative numbers
233
- if (num < 0) {
234
- result = "Negative ";
235
- num = Math.abs(num);
236
- }
237
- // Split integer and decimal parts
238
- const integerPart = Math.floor(num);
239
- const decimalPart = Math.round((num - integerPart) * 1000); // up to 3 decimal places
240
- result += this.convertNumber(integerPart);
241
- if (decimalPart > 0) {
242
- result += " Point";
243
- const decimalStr = decimalPart.toString().padStart(3, "0"); // keep 3 digits
244
- for (const digit of decimalStr) {
245
- result += " " + this.ones[+digit];
246
- }
247
- }
248
- return result + " Only";
249
- }
250
- // Convert whole numbers (Indian/International system)
251
- convertNumber(num) {
252
- if (num === 0)
253
- return "";
254
- if (num < 10)
255
- return this.ones[num];
256
- if (num < 20)
257
- return this.teens[num - 10];
258
- if (num < 100)
259
- return this.tens[Math.floor(num / 10)] + (num % 10 !== 0 ? " " + this.ones[num % 10] : "");
260
- if (num < 1000)
261
- return this.convertNumber(Math.floor(num / 100)) + " Hundred" + (num % 100 !== 0 ? " " + this.convertNumber(num % 100) : "");
262
- if (num < 1000000)
263
- return this.convertNumber(Math.floor(num / 1000)) + " Thousand" + (num % 1000 !== 0 ? " " + this.convertNumber(num % 1000) : "");
264
- if (num < 1000000000)
265
- return this.convertNumber(Math.floor(num / 1000000)) + " Million" + (num % 1000000 !== 0 ? " " + this.convertNumber(num % 1000000) : "");
266
- return this.convertNumber(Math.floor(num / 1000000000)) + " Billion" + (num % 1000000000 !== 0 ? " " + this.convertNumber(num % 1000000000) : "");
267
- }
268
- onExportChange(value) {
269
- this.selectedExportOption = value;
270
- }
271
- handleExport(option) {
272
- this.selectedExportOption = option;
273
- switch ((this.selectedExportOption || '').toLowerCase()) {
274
- case 'pdf':
275
- this.exportToPDF();
276
- break;
277
- case 'excel':
278
- this.exportToExcel();
279
- break;
280
- case 'csv':
281
- this.exportToCSV();
282
- break;
283
- default: console.warn('Unknown export type:', this.selectedExportOption);
284
- }
285
- }
286
- exportToPDF() {
287
- const sections = this.getVisibleGrids()
288
- .map(s => {
289
- const data = this.getDisplayedData(s.api);
290
- const headers = this.getHeaders();
291
- let rows = this.buildRows(data);
292
- if (s.title === 'Send Details' && this.sendPinnedBottomRow?.length) {
293
- rows = rows.concat(this.buildRows(this.sendPinnedBottomRow));
294
- }
295
- if (s.title === 'Receive Details' && this.receivePinnedBottomRow?.length) {
296
- rows = rows.concat(this.buildRows(this.receivePinnedBottomRow));
297
- }
298
- return rows.length ? { title: s.title, headers, rows } : null;
299
- })
300
- .filter(Boolean);
301
- if (!sections.length)
302
- return;
303
- const doc = new jsPDF({ orientation: 'landscape', unit: 'mm', format: 'a4' });
304
- if (this.logoBase64) {
305
- doc.addImage(this.logoBase64, 'PNG', 15, 10, 38, 18);
306
- }
307
- const pageWidth = doc.internal.pageSize.getWidth();
308
- const pageHeight = doc.internal.pageSize.getHeight();
309
- doc.setFont('helvetica', 'bold');
310
- doc.setFontSize(15);
311
- doc.text(this.ReportName, pageWidth / 2, 18, { align: 'center' });
312
- let y = 34;
313
- doc.setFontSize(10);
314
- Object.entries(this.metaDataOne || {}).forEach(([k, v]) => {
315
- doc.setFont('helvetica', 'bold');
316
- doc.text(`${k}: `, 15, y);
317
- const w = doc.getTextWidth(`${k}: `);
318
- doc.setFont('helvetica', 'normal');
319
- doc.text(String(v ?? ''), 15 + w, y);
320
- y += 6;
321
- });
322
- Object.entries(this.metaDataTwo || {}).forEach(([k, v]) => {
323
- doc.setFont('helvetica', 'bold');
324
- doc.text(`${k}: `, 15, y);
325
- const w = doc.getTextWidth(`${k}: `);
326
- doc.setFont('helvetica', 'normal');
327
- doc.text(String(v ?? ''), 15 + w, y);
328
- y += 6;
329
- });
330
- // --- search criteria ---
331
- const searchCriteria = this.searchCriteria || [];
332
- // ===================== Search Criteria Section =====================
333
- // Start just below metadata
334
- let marginLeft = 15;
335
- let currentY = y + 5; // continue below metadata
336
- // --- heading ---
337
- doc.setFont('helvetica', 'bold');
338
- doc.text('Search Criteria:-', marginLeft, currentY);
339
- currentY += 8;
340
- const rowHeightPerLine = 6;
341
- const minGap = 2; // gap between key and value
342
- const betweenColumnsGap = 15; // gap between left and right columns
343
- const pageContentWidth = doc.internal.pageSize.width - 2 * marginLeft;
344
- // --- helper to measure pair width ---
345
- const measurePairWidth = (key, value) => {
346
- doc.setFont('helvetica', 'bold');
347
- const keyWidth = doc.getTextWidth(key + ' ');
348
- doc.setFont('helvetica', 'normal');
349
- const valueWidth = doc.getTextWidth(value);
350
- return keyWidth + minGap + valueWidth;
351
- };
352
- // --- compute max width of left column ---
353
- let maxLeftPairWidth = 0;
354
- for (let i = 0; i < searchCriteria.length; i += 2) {
355
- if (searchCriteria[i]) {
356
- const [key, value] = searchCriteria[i];
357
- const width = measurePairWidth(key, value);
358
- if (width > maxLeftPairWidth)
359
- maxLeftPairWidth = width;
360
- }
361
- }
362
- // --- calculate where right column starts ---
363
- const leftColumnStart = marginLeft;
364
- const rightColumnStart = leftColumnStart + maxLeftPairWidth + betweenColumnsGap;
365
- // --- print pairs dynamically ---
366
- for (let i = 0; i < searchCriteria.length; i += 2) {
367
- // Left column
368
- if (searchCriteria[i]) {
369
- const [key, value] = searchCriteria[i];
370
- doc.setFont('helvetica', 'bold');
371
- doc.text(key, leftColumnStart, currentY);
372
- doc.setFont('helvetica', 'normal');
373
- const keyWidth = doc.getTextWidth(key + ' ');
374
- const valueX = leftColumnStart + keyWidth + minGap;
375
- doc.text(value, valueX, currentY);
376
- }
377
- // Right column
378
- if (searchCriteria[i + 1]) {
379
- const [key, value] = searchCriteria[i + 1];
380
- doc.setFont('helvetica', 'bold');
381
- doc.text(key, rightColumnStart, currentY);
382
- doc.setFont('helvetica', 'normal');
383
- const keyWidth = doc.getTextWidth(key + ' ');
384
- const valueX = rightColumnStart + keyWidth + minGap;
385
- doc.text(value, valueX, currentY);
386
- }
387
- currentY += rowHeightPerLine;
388
- }
389
- // Update Y position for next sections
390
- y = currentY + 4;
391
- const HEAD = this.getHeaders();
392
- const margin = { left: 15, right: 15 };
393
- const avail = pageWidth - margin.left - margin.right;
394
- const weights = [4, 1, 2, 2];
395
- const sum = weights.reduce((a, b) => a + b, 0);
396
- const widths = weights.map(w => (w / sum) * avail);
397
- const sharedColumnStyles = {
398
- 0: { cellWidth: widths[0] },
399
- 1: { cellWidth: widths[1] },
400
- 2: { cellWidth: widths[2], halign: 'right' },
401
- 3: { cellWidth: widths[3], halign: 'right' }
402
- };
403
- const titleGapAboveFirst = 0;
404
- const titleGapAboveDefault = 4;
405
- const titleGapAboveBig = 6;
406
- const titleToTableGap = 2;
407
- const topStartY = 20;
408
- const bottomReserve = 20;
409
- sections.forEach((s, idx) => {
410
- const isFirst = idx === 0;
411
- const isSendOrReceive = s.title === 'Send Details' || s.title === 'Receive Details';
412
- const preTitleGap = isFirst ? 0 : (isSendOrReceive ? titleGapAboveBig : titleGapAboveDefault);
413
- if (y + preTitleGap + titleToTableGap > pageHeight - bottomReserve) {
414
- doc.addPage();
415
- y = topStartY;
416
- }
417
- else {
418
- y += preTitleGap;
419
- }
420
- doc.setFont('helvetica', 'bold');
421
- doc.setFontSize(11);
422
- doc.text(s.title, margin.left, y);
423
- const startYForTable = y + (isFirst ? 0 : titleToTableGap);
424
- doc.autoTable({
425
- head: [HEAD],
426
- body: s.rows,
427
- startY: startYForTable,
428
- theme: 'grid',
429
- margin,
430
- tableWidth: avail,
431
- columnStyles: sharedColumnStyles,
432
- headStyles: { fillColor: [220, 220, 220], textColor: 0, fontStyle: 'bold', fontSize: 9, halign: 'center' },
433
- bodyStyles: { fontSize: 8 },
434
- styles: { cellPadding: 2, overflow: 'linebreak', minCellHeight: 6 }
435
- });
436
- y = doc.lastAutoTable.finalY;
437
- });
438
- if (y + 30 > pageHeight - bottomReserve) {
439
- doc.addPage();
440
- y = topStartY;
441
- }
442
- const closingBody = [
443
- [
444
- { content: 'Closing Balance', colSpan: 2, styles: { halign: 'left', fontStyle: 'bold' } },
445
- { content: Number(this.closingBalanceInSettlment || 0).toFixed(3), styles: { halign: 'right' } },
446
- { content: Number(this.closingBalance || 0).toFixed(3), styles: { halign: 'right' } }
447
- ],
448
- [
449
- { content: `${this.closingBalanceSettlmentCurrency || ''} - ${this.closingBalanceSettlmentInWords || ''}`, colSpan: 4, styles: { halign: 'left' } }
450
- ],
451
- [
452
- { content: `${this.closingBalanceCurrency || ''} - ${this.closingBalanceUSDInWords || ''}`, colSpan: 4, styles: { halign: 'left' } }
453
- ]
454
- ];
455
- doc.autoTable({
456
- body: closingBody,
457
- startY: y,
458
- theme: 'grid',
459
- margin,
460
- tableWidth: avail,
461
- columnStyles: sharedColumnStyles,
462
- styles: { cellPadding: 2, fontSize: 9 }
463
- });
464
- doc.save('Statement_of_Accounts.pdf');
465
- }
466
- exportToExcel() {
467
- const sections = this.getVisibleGrids()
468
- .map(s => {
469
- const data = this.getDisplayedData(s.api);
470
- const headers = this.getHeaders();
471
- let rows = this.buildRows(data);
472
- if (s.title === 'Send Details' && this.sendPinnedBottomRow?.length) {
473
- rows = rows.concat(this.buildRows(this.sendPinnedBottomRow));
474
- }
475
- if (s.title === 'Receive Details' && this.receivePinnedBottomRow?.length) {
476
- rows = rows.concat(this.buildRows(this.receivePinnedBottomRow));
477
- }
478
- return rows.length ? { title: s.title, headers, rows } : null;
479
- })
480
- .filter(Boolean);
481
- if (!sections.length)
482
- return;
483
- const wb = new ExcelJS.Workbook();
484
- const ws = wb.addWorksheet('Statement of Accounts');
485
- let r = 1;
486
- if (this.logoBase64) {
487
- const imgId = wb.addImage({ base64: this.logoBase64, extension: 'png' });
488
- ws.addImage(imgId, { tl: { col: 0, row: 0 }, ext: { width: 145, height: 66 }, editAs: 'oneCell' });
489
- }
490
- ws.getRow(r).getCell(2).value = this.ReportName;
491
- ws.getRow(r).getCell(2).font = { bold: true, size: 16 };
492
- r += 3;
493
- Object.entries(this.metaDataOne || {}).forEach(([k, v]) => {
494
- const row = ws.getRow(r++);
495
- row.getCell(1).value = {
496
- richText: [
497
- { text: k + ': ', font: { bold: true } },
498
- { text: v ?? '' } // value normal
499
- ]
500
- };
501
- row.getCell(1).alignment = { wrapText: false, vertical: 'middle' };
502
- });
503
- Object.entries(this.metaDataTwo || {}).forEach(([k, v]) => {
504
- const row = ws.getRow(r++);
505
- row.getCell(1).value = {
506
- richText: [
507
- { text: k + ': ', font: { bold: true } },
508
- { text: v ?? '' } // value normal
509
- ]
510
- };
511
- row.getCell(1).alignment = { wrapText: false, vertical: 'middle' };
512
- });
513
- r++;
514
- // --- search criteria ---
515
- const searchCriteria = this.searchCriteria || [];
516
- ws.mergeCells(r, 1, r, 4); // previously 1..6
517
- ws.getCell(r, 1).value = 'Search Criteria:-';
518
- ws.getCell(r, 1).font = { bold: true };
519
- r += 2;
520
- for (let i = 0; i < searchCriteria.length; i += 2) {
521
- const left = searchCriteria[i];
522
- const right = searchCriteria[i + 1];
523
- const row = ws.getRow(r++);
524
- // Left column (reduced merge)
525
- ws.mergeCells(row.number, 1, row.number, 1); // was 1..3
526
- row.getCell(1).value = {
527
- richText: [
528
- { text: left[0] + ' ', font: { bold: true } },
529
- { text: left[1] }
530
- ]
531
- };
532
- row.getCell(1).alignment = { wrapText: true, vertical: 'middle' };
533
- // Right column (start closer to left)
534
- if (right) {
535
- ws.mergeCells(row.number, 2, row.number, 3); // was 4..6
536
- row.getCell(3).value = {
537
- richText: [
538
- { text: right[0] + ' ', font: { bold: true } },
539
- { text: right[1] }
540
- ]
541
- };
542
- row.getCell(3).alignment = { wrapText: true, vertical: 'middle' };
543
- }
544
- }
545
- r++;
546
- const writeSection = (sec) => {
547
- const titleRow = ws.getRow(r++);
548
- const titleCell = titleRow.getCell(1);
549
- titleCell.value = sec.title;
550
- titleCell.font = { bold: true, size: 12 };
551
- titleCell.alignment = { horizontal: 'left', vertical: 'middle' };
552
- const headerRow = ws.getRow(r++);
553
- sec.headers.forEach((h, i) => {
554
- const c = headerRow.getCell(i + 1);
555
- c.value = h;
556
- c.font = { bold: true };
557
- c.alignment = { vertical: 'middle', horizontal: 'center' };
558
- c.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'D9D9D9' } };
559
- c.border = { top: { style: 'thin' }, bottom: { style: 'thin' }, left: { style: 'thin' }, right: { style: 'thin' } };
560
- });
561
- const dataStart = r;
562
- sec.rows.forEach(rowData => {
563
- const row = ws.getRow(r++);
564
- rowData.forEach((v, i) => {
565
- const c = row.getCell(i + 1);
566
- if (sec.headers[i] === 'Amount In Settlment Ccy' || sec.headers[i] === 'Amount In USD') {
567
- const num = typeof v === 'string' ? Number(v.replace(/[, ]+/g, '')) : Number(v);
568
- c.value = isNaN(num) ? (v ?? '') : num;
569
- c.alignment = { horizontal: 'right' };
570
- if (!isNaN(num))
571
- c.numFmt = '0.000';
572
- }
573
- else {
574
- c.value = v ?? '';
575
- }
576
- c.border = { top: { style: 'thin' }, bottom: { style: 'thin' }, left: { style: 'thin' }, right: { style: 'thin' } };
577
- });
578
- });
579
- for (let col = 1; col <= sec.headers.length; col++) {
580
- let max = (sec.headers[col - 1] || '').toString().length;
581
- for (let rr = dataStart - 1; rr < r; rr++) {
582
- const val = (ws.getRow(rr).getCell(col).value ?? '').toString();
583
- if (val)
584
- max = Math.max(max, val.length + 2);
585
- }
586
- ws.getColumn(col).width = Math.min(Math.max(max, 8), 60);
587
- }
588
- };
589
- sections.forEach((sec, idx) => {
590
- writeSection(sec);
591
- if (idx < sections.length - 1) {
592
- r++;
593
- }
594
- });
595
- const totalCols = sections.length
596
- ? Math.max(...sections.map(s => s.headers.length))
597
- : this.columnDefs.length;
598
- const cols = Math.max(totalCols, 4);
599
- const labelColsEnd = 2;
600
- const settleCol = 3;
601
- const usdCol = 4;
602
- const row1 = ws.getRow(r++);
603
- ws.mergeCells(row1.number, 1, row1.number, labelColsEnd);
604
- row1.getCell(1).value = 'Closing Balance';
605
- row1.getCell(1).font = { bold: true };
606
- row1.getCell(1).alignment = { horizontal: 'left', vertical: 'middle' };
607
- const settleValue = Number(this.closingBalanceInSettlment ?? 0);
608
- const usdValue = Number(this.closingBalance ?? 0);
609
- const settleCell = row1.getCell(settleCol);
610
- settleCell.value = isNaN(settleValue) ? '' : settleValue;
611
- settleCell.alignment = { horizontal: 'right' };
612
- if (!isNaN(settleValue))
613
- settleCell.numFmt = '0.000';
614
- const usdCell = row1.getCell(usdCol);
615
- usdCell.value = isNaN(usdValue) ? '' : usdValue;
616
- usdCell.alignment = { horizontal: 'right' };
617
- if (!isNaN(usdValue))
618
- usdCell.numFmt = '0.000';
619
- for (let c = 1; c <= cols; c++) {
620
- row1.getCell(c).border = {
621
- top: { style: 'thin' },
622
- bottom: { style: 'thin' },
623
- left: { style: 'thin' },
624
- right: { style: 'thin' }
625
- };
626
- }
627
- const row2 = ws.getRow(r++);
628
- ws.mergeCells(row2.number, 1, row2.number, cols);
629
- row2.getCell(1).value = `${this.closingBalanceSettlmentCurrency || ''} - ${this.closingBalanceSettlmentInWords || ''}`;
630
- row2.getCell(1).alignment = { horizontal: 'left', vertical: 'middle' };
631
- row2.getCell(1).font = { italic: false };
632
- for (let c = 1; c <= cols; c++) {
633
- const edge = { top: { style: 'thin' }, bottom: { style: 'thin' } };
634
- if (c === 1)
635
- edge.left = { style: 'thin' };
636
- if (c === cols)
637
- edge.right = { style: 'thin' };
638
- row2.getCell(c).border = edge;
639
- }
640
- const row3 = ws.getRow(r++);
641
- ws.mergeCells(row3.number, 1, row3.number, cols);
642
- row3.getCell(1).value = `${this.closingBalanceCurrency || ''} - ${this.closingBalanceUSDInWords || ''}`;
643
- row3.getCell(1).alignment = { horizontal: 'left', vertical: 'middle' };
644
- for (let c = 1; c <= cols; c++) {
645
- const edge = { top: { style: 'thin' }, bottom: { style: 'thin' } };
646
- if (c === 1)
647
- edge.left = { style: 'thin' };
648
- if (c === cols)
649
- edge.right = { style: 'thin' };
650
- row3.getCell(c).border = edge;
651
- }
652
- wb.xlsx.writeBuffer().then(buf => {
653
- FileSaver.saveAs(new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }), 'Statement_of_Accounts.xlsx');
654
- });
655
- }
656
- exportToCSV() {
657
- const sections = this.getVisibleGrids()
658
- .map(s => {
659
- const data = this.getDisplayedData(s.api);
660
- let rows = this.buildRows(data);
661
- if (s.title === 'Send Details' && this.sendPinnedBottomRow?.length) {
662
- rows = rows.concat(this.buildRows(this.sendPinnedBottomRow));
663
- }
664
- if (s.title === 'Receive Details' && this.receivePinnedBottomRow?.length) {
665
- rows = rows.concat(this.buildRows(this.receivePinnedBottomRow));
666
- }
667
- return rows.length ? { title: s.title, headers: this.getHeaders(), rows } : null;
668
- })
669
- .filter(Boolean);
670
- if (!sections.length)
671
- return;
672
- const lines = [];
673
- lines.push(this.ReportName);
674
- Object.entries(this.metaDataOne || {}).forEach(([k, v]) => lines.push(`${k}: ${v ?? ''}`));
675
- Object.entries(this.metaDataTwo || {}).forEach(([k, v]) => lines.push(`${k}: ${v ?? ''}`));
676
- // --- SEARCH CRITERIA BLOCK ---
677
- const searchCriteria = this.searchCriteria || [];
678
- if (searchCriteria?.length) {
679
- lines.push('');
680
- lines.push('Search Criteria:-');
681
- // Determine max length of left column for padding
682
- const maxLeftLength = Math.max(...searchCriteria.map(([k, v]) => (k + ' ' + v).length));
683
- for (let i = 0; i < searchCriteria.length; i += 2) {
684
- const left = searchCriteria[i];
685
- const right = searchCriteria[i + 1];
686
- const leftText = left ? `${left[0]} ${left[1]}`.padEnd(maxLeftLength + 5, ' ') : '';
687
- const rightText = right ? `${right[0]} ${right[1]}` : '';
688
- // Each pair stays in its own column
689
- lines.push(`"${leftText}${rightText}"`);
690
- }
691
- lines.push(''); // blank line after search criteria
692
- }
693
- sections.forEach((sec, idx) => {
694
- lines.push(sec.title);
695
- lines.push(sec.headers.join(','));
696
- sec.rows.forEach(r => lines.push(r.map(v => `"${v ?? ''}"`).join(',')));
697
- if (idx < sections.length - 1) {
698
- lines.push('');
699
- }
700
- });
701
- lines.push(`"Closing Balance",,"${Number(this.closingBalanceInSettlment || 0).toFixed(3)}","${Number(this.closingBalance || 0).toFixed(3)}"`);
702
- lines.push(`"${this.closingBalanceSettlmentCurrency || ''} - ${this.closingBalanceSettlmentInWords || ''}"`);
703
- lines.push(`"${this.closingBalanceCurrency || ''} - ${this.closingBalanceUSDInWords || ''}"`);
704
- const csv = lines.join('\n');
705
- FileSaver.saveAs(new Blob([csv], { type: 'text/csv;charset=utf-8' }), 'Statement_of_Accounts.csv');
706
- }
707
- loadImageAsBase64(src) {
708
- return new Promise((resolve, reject) => {
709
- const img = new Image();
710
- img.crossOrigin = 'anonymous';
711
- img.src = src;
712
- img.onload = () => {
713
- const canvas = document.createElement('canvas');
714
- canvas.width = img.width;
715
- canvas.height = img.height;
716
- const ctx = canvas.getContext('2d');
717
- if (!ctx)
718
- return reject('Canvas context failed');
719
- ctx.drawImage(img, 0, 0);
720
- resolve(canvas.toDataURL('image/png'));
721
- };
722
- img.onerror = () => reject('Failed to load image: ' + src);
723
- });
724
- }
725
- getDisplayedData(api) {
726
- if (!api)
727
- return [];
728
- const rows = [];
729
- const count = api.getDisplayedRowCount();
730
- for (let i = 0; i < count; i++) {
731
- const node = api.getDisplayedRowAtIndex(i);
732
- if (node && !node.group && !node.rowPinned)
733
- rows.push(node.data);
734
- }
735
- return rows;
736
- }
737
- getHeaders() {
738
- return this.columnDefs.map(c => c.headerName || c.field);
739
- }
740
- format3(n) {
741
- if (n == null || n === '')
742
- return '';
743
- const num = Number(n);
744
- return num.toFixed(3);
745
- }
746
- buildRows(data) {
747
- return data.map(row => this.columnDefs.map(col => {
748
- const f = col.field;
749
- if (f === 'amountInSettlmentCcy' || f === 'amountInUSD') {
750
- return this.format3(row[f]);
751
- }
752
- return row[f] ?? '';
753
- }));
754
- }
755
- getVisibleGrids() {
756
- const out = [];
757
- out.push({ title: '', api: this.openingGridApi });
758
- if (this.selectedClientType === 'PayIn' || this.selectedClientType === 'Both') {
759
- out.push({ title: 'Send Details', api: this.sendGridApi });
760
- }
761
- if (this.selectedClientType === 'PayOut' || this.selectedClientType === 'Both') {
762
- out.push({ title: 'Receive Details', api: this.receiveGridApi });
763
- }
764
- return out;
765
- }
766
- handleFormValid(isValid) {
767
- this.isFormValid = isValid;
768
- }
769
- }
770
- StatementOfAccountsReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StatementOfAccountsReportComponent, deps: [{ token: i1.ReportService }], target: i0.ɵɵFactoryTarget.Component });
771
- StatementOfAccountsReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StatementOfAccountsReportComponent, selector: "lib-statement-of-accounts-report", ngImport: i0, template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\"\r\n (formValid)=\"handleFormValid($event)\"\r\n >\r\n</lib-search-filter>\r\n\r\n<app-loader *ngIf=\"loadingState === ComponentLoadingState.Loading\"></app-loader>\r\n<span *ngIf=\"loadingState === ComponentLoadingState.Error\">{{ errorMessage }}</span>\r\n<div *ngIf=\"showTables && isFormValid\">\r\n<lib-metadata \r\n [reportName]=\"ReportName\" \r\n [showmetaDataOne]=\"true\" \r\n [showmetaDataTwo]=\"true\" \r\n [metaDataOne]=\"metaDataOne\"\r\n [metaDataTwo]=\"metaDataTwo\" \r\n (exportEvent)=\"handleExport($event)\" \r\n (searchEvent)=\"filter($event)\">\r\n </lib-metadata>\r\n\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"openingBalAndFunding\"\r\n [columnDefs]=\"columnDefs\"\r\n [pinnedBottomRowData]=\"[]\"\r\n [headerHeight]=\"32\" \r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n (gridReady)=\"onOpeningGridReady($event)\"\r\n style=\"width: 80%; height: 91px; margin: 0 auto; display: block;\">\r\n</ag-grid-angular>\r\n\r\n<div *ngIf=\"(selectedClientType === 'PayIn' || selectedClientType === 'Both')\">\r\n<h3 class=\"details-table\"><span style=\"margin-left: 3px;\">Send Details</span></h3>\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"sendDetails\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n [headerHeight]=\"32\" \r\n [pinnedBottomRowData]=\"sendPinnedBottomRow\"\r\n (gridReady)=\"onSendGridReady($event)\" \r\n style=\"width: 80%; height: 204px; margin: 0 auto; display: block;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n<div *ngIf=\"(selectedClientType === 'PayOut' || selectedClientType === 'Both')\">\r\n<h3 class=\"details-table\"><span style=\"margin-left: 3px;\">Receive Details</span></h3>\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"receiveDetails\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n [headerHeight]=\"32\" \r\n [pinnedBottomRowData]=\"receivePinnedBottomRow\"\r\n (gridReady)=\"onReceiveGridReady($event)\" \r\n style=\"width: 80%; height: 204px; margin: 0 auto; display: block;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n\r\n<!-- Closing balance row -->\r\n<div class=\"closing-balance-row\">\r\n <div class=\"label\" title=\"Closing Balance\">\r\n Closing Balance\r\n </div>\r\n\r\n <div class=\"settlement\" \r\n [title]=\"closingBalanceSettlmentFormatted\">\r\n {{ closingBalanceSettlmentFormatted }}\r\n </div>\r\n\r\n <div class=\"value\" [title]=\"closingBalanceInUsdFormatted\">\r\n {{ closingBalanceInUsdFormatted }}\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- settlement currency words row -->\r\n<div class=\"closing-balance-row closing-balance-words\"\r\n *ngIf=\"closingBalanceSettlmentInWords\">\r\n <div class=\"label\"\r\n [title]=\"closingBalanceSettlmentCurrency + ' - ' + closingBalanceSettlmentInWords\">\r\n {{ closingBalanceSettlmentCurrency }} - {{ closingBalanceSettlmentInWords }}\r\n </div>\r\n</div>\r\n\r\n<!-- existing USD words row (keep as-is) -->\r\n<div class=\"closing-balance-row closing-balance-words\">\r\n <div class=\"label\" [title]=\"closingBalanceCurrency + ' - ' + closingBalanceUSDInWords\">\r\n {{ closingBalanceCurrency }} - {{ closingBalanceUSDInWords }}\r\n </div>\r\n</div>\r\n", styles: [".transaction-grid ::ng-deep .ag-header{background-color:#f9f9f9;font-weight:600;font-size:10px;color:#000;border-right:1px solid #e0e0e0}:host ::ng-deep .ag-header-cell{padding:2px!important;align-items:center!important;justify-content:center!important;border-right:1px solid #e0e0e0;white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-align:center!important}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important;font-weight:500!important}.btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:110px;margin:0 0 0 20px!important;padding:4px 15px!important}.tooltip-block{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid #ccc!important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2!important}.cal:focus{box-shadow:none!important}.input-group-button{background:none;border:1px solid #0081c6;background-color:#0081c6;border-radius:0 3px 3px 0;min-width:35px;margin-left:1px;cursor:pointer}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}.meta-td{padding:0!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important;margin-right:-1;margin-left:.4rem}.opt-cls{display:block;height:100%;width:5rem;border:1px solid #ccc!important;border-radius:4px!important;margin-right:1rem!important;outline:none!important}.opt-cls:focus{box-shadow:0 0 5px 3px #1877f2}.export-selector{height:2rem!important;width:100%}.search-btn{height:32px!important;height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-btn:hover{background-color:#8091a5}.search-icon{height:16px;width:16px;object-fit:contain}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.searchBox{margin-right:auto;display:flex}table{width:100%;border-collapse:separate;margin-bottom:0!important;table-layout:fixed!important}td{padding:0 1rem 6px 0!important;border-right:0 solid #ffffff!important;background-color:#fff!important}.row-cls{height:2.5rem!important}.inputbox{padding-left:1rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"}::ng-deep .ng-select.ng-select-single .ng-select-container{height:32px I!important}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;overflow-y:auto;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container .ng-value{max-width:200px!important;overflow:hidden!important;text-overflow:hidden!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-container{cursor:default;display:flex;outline:none;overflow:hidden;position:relative;width:100%}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{box-sizing:border-box;cursor:pointer;display:block;white-space:nowrap;overflow-x:scroll!important;text-overflow:clip!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option::-webkit-scrollbar{display:none!important;width:0!important}::ng-deep .ng-select .ng-select-container:focus-within{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container:focus{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container,::ng-deep .ng-select.ng-select-single .ng-select-container,::ng-deep .ng-select.ng-select-multiple .ng-select-container{min-height:32px!important;height:32px!important;font-size:12px!important}.panel-cls{font-weight:700;font-size:13px;line-height:1.2;margin:0;padding:2px 0;color:#16181e}::ng-deep .ag-theme-alpine .pinned-total-cell{font-weight:700!important}.details-table{background-color:#d3d3d3;margin:0 auto;height:32px;align-content:center;width:80%;text-align:left}.transaction-grid{display:block;margin:0 auto;width:80%}.closing-balance-row{display:flex;border:1px solid #ccc;border-top:none;font-size:10px!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-weight:700;height:28px;align-items:center;width:80%;margin:0 auto}.closing-balance-row .label{flex:4.9;padding:6px;text-align:left;border-right:1px solid #ccc}.closing-balance-row .settlement{flex:2;padding:6px;text-align:right;border-right:1px solid #ccc}.closing-balance-row .value{flex:2;padding:6px;text-align:right}\n"], dependencies: [{ kind: "component", type: i2.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MetadataComponent, selector: "lib-metadata", inputs: ["metaDataOne", "metaDataTwo", "showmetaDataOne", "showmetaDataTwo", "reportName"], outputs: ["searchEvent", "exportEvent"] }, { kind: "component", type: i5.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i6.SearchFilterComponent, selector: "lib-search-filter", inputs: ["ReportName", "initialFilters"], outputs: ["searchClicked", "formValid"] }] });
772
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StatementOfAccountsReportComponent, decorators: [{
773
- type: Component,
774
- args: [{ selector: 'lib-statement-of-accounts-report', template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\"\r\n (formValid)=\"handleFormValid($event)\"\r\n >\r\n</lib-search-filter>\r\n\r\n<app-loader *ngIf=\"loadingState === ComponentLoadingState.Loading\"></app-loader>\r\n<span *ngIf=\"loadingState === ComponentLoadingState.Error\">{{ errorMessage }}</span>\r\n<div *ngIf=\"showTables && isFormValid\">\r\n<lib-metadata \r\n [reportName]=\"ReportName\" \r\n [showmetaDataOne]=\"true\" \r\n [showmetaDataTwo]=\"true\" \r\n [metaDataOne]=\"metaDataOne\"\r\n [metaDataTwo]=\"metaDataTwo\" \r\n (exportEvent)=\"handleExport($event)\" \r\n (searchEvent)=\"filter($event)\">\r\n </lib-metadata>\r\n\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"openingBalAndFunding\"\r\n [columnDefs]=\"columnDefs\"\r\n [pinnedBottomRowData]=\"[]\"\r\n [headerHeight]=\"32\" \r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n (gridReady)=\"onOpeningGridReady($event)\"\r\n style=\"width: 80%; height: 91px; margin: 0 auto; display: block;\">\r\n</ag-grid-angular>\r\n\r\n<div *ngIf=\"(selectedClientType === 'PayIn' || selectedClientType === 'Both')\">\r\n<h3 class=\"details-table\"><span style=\"margin-left: 3px;\">Send Details</span></h3>\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"sendDetails\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n [headerHeight]=\"32\" \r\n [pinnedBottomRowData]=\"sendPinnedBottomRow\"\r\n (gridReady)=\"onSendGridReady($event)\" \r\n style=\"width: 80%; height: 204px; margin: 0 auto; display: block;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n<div *ngIf=\"(selectedClientType === 'PayOut' || selectedClientType === 'Both')\">\r\n<h3 class=\"details-table\"><span style=\"margin-left: 3px;\">Receive Details</span></h3>\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"receiveDetails\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n [headerHeight]=\"32\" \r\n [pinnedBottomRowData]=\"receivePinnedBottomRow\"\r\n (gridReady)=\"onReceiveGridReady($event)\" \r\n style=\"width: 80%; height: 204px; margin: 0 auto; display: block;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n\r\n<!-- Closing balance row -->\r\n<div class=\"closing-balance-row\">\r\n <div class=\"label\" title=\"Closing Balance\">\r\n Closing Balance\r\n </div>\r\n\r\n <div class=\"settlement\" \r\n [title]=\"closingBalanceSettlmentFormatted\">\r\n {{ closingBalanceSettlmentFormatted }}\r\n </div>\r\n\r\n <div class=\"value\" [title]=\"closingBalanceInUsdFormatted\">\r\n {{ closingBalanceInUsdFormatted }}\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- settlement currency words row -->\r\n<div class=\"closing-balance-row closing-balance-words\"\r\n *ngIf=\"closingBalanceSettlmentInWords\">\r\n <div class=\"label\"\r\n [title]=\"closingBalanceSettlmentCurrency + ' - ' + closingBalanceSettlmentInWords\">\r\n {{ closingBalanceSettlmentCurrency }} - {{ closingBalanceSettlmentInWords }}\r\n </div>\r\n</div>\r\n\r\n<!-- existing USD words row (keep as-is) -->\r\n<div class=\"closing-balance-row closing-balance-words\">\r\n <div class=\"label\" [title]=\"closingBalanceCurrency + ' - ' + closingBalanceUSDInWords\">\r\n {{ closingBalanceCurrency }} - {{ closingBalanceUSDInWords }}\r\n </div>\r\n</div>\r\n", styles: [".transaction-grid ::ng-deep .ag-header{background-color:#f9f9f9;font-weight:600;font-size:10px;color:#000;border-right:1px solid #e0e0e0}:host ::ng-deep .ag-header-cell{padding:2px!important;align-items:center!important;justify-content:center!important;border-right:1px solid #e0e0e0;white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-align:center!important}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important;font-weight:500!important}.btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:110px;margin:0 0 0 20px!important;padding:4px 15px!important}.tooltip-block{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid #ccc!important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2!important}.cal:focus{box-shadow:none!important}.input-group-button{background:none;border:1px solid #0081c6;background-color:#0081c6;border-radius:0 3px 3px 0;min-width:35px;margin-left:1px;cursor:pointer}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}.meta-td{padding:0!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important;margin-right:-1;margin-left:.4rem}.opt-cls{display:block;height:100%;width:5rem;border:1px solid #ccc!important;border-radius:4px!important;margin-right:1rem!important;outline:none!important}.opt-cls:focus{box-shadow:0 0 5px 3px #1877f2}.export-selector{height:2rem!important;width:100%}.search-btn{height:32px!important;height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-btn:hover{background-color:#8091a5}.search-icon{height:16px;width:16px;object-fit:contain}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.searchBox{margin-right:auto;display:flex}table{width:100%;border-collapse:separate;margin-bottom:0!important;table-layout:fixed!important}td{padding:0 1rem 6px 0!important;border-right:0 solid #ffffff!important;background-color:#fff!important}.row-cls{height:2.5rem!important}.inputbox{padding-left:1rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"}::ng-deep .ng-select.ng-select-single .ng-select-container{height:32px I!important}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;overflow-y:auto;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container .ng-value{max-width:200px!important;overflow:hidden!important;text-overflow:hidden!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-container{cursor:default;display:flex;outline:none;overflow:hidden;position:relative;width:100%}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{box-sizing:border-box;cursor:pointer;display:block;white-space:nowrap;overflow-x:scroll!important;text-overflow:clip!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option::-webkit-scrollbar{display:none!important;width:0!important}::ng-deep .ng-select .ng-select-container:focus-within{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container:focus{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container,::ng-deep .ng-select.ng-select-single .ng-select-container,::ng-deep .ng-select.ng-select-multiple .ng-select-container{min-height:32px!important;height:32px!important;font-size:12px!important}.panel-cls{font-weight:700;font-size:13px;line-height:1.2;margin:0;padding:2px 0;color:#16181e}::ng-deep .ag-theme-alpine .pinned-total-cell{font-weight:700!important}.details-table{background-color:#d3d3d3;margin:0 auto;height:32px;align-content:center;width:80%;text-align:left}.transaction-grid{display:block;margin:0 auto;width:80%}.closing-balance-row{display:flex;border:1px solid #ccc;border-top:none;font-size:10px!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-weight:700;height:28px;align-items:center;width:80%;margin:0 auto}.closing-balance-row .label{flex:4.9;padding:6px;text-align:left;border-right:1px solid #ccc}.closing-balance-row .settlement{flex:2;padding:6px;text-align:right;border-right:1px solid #ccc}.closing-balance-row .value{flex:2;padding:6px;text-align:right}\n"] }]
775
- }], ctorParameters: function () { return [{ type: i1.ReportService }]; } });
776
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50LW9mLWFjY291bnRzLXJlcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvc3RhdGVtZW50LW9mLWFjY291bnRzLXJlcG9ydC9zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy9zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0L3N0YXRlbWVudC1vZi1hY2NvdW50cy1yZXBvcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUVsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDOzs7Ozs7OztBQVF4QyxNQUFNLE9BQU8sa0NBQWtDO0lBeUM3QyxZQUFvQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXZDaEQsZUFBVSxHQUFHLHVCQUF1QixDQUFDO1FBQ3JDLDBCQUFxQixHQUFHLHNCQUFzQixDQUFDO1FBQy9DLGlCQUFZLEdBQTJCLHNCQUFzQixDQUFDLFFBQVEsQ0FB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QUFDLENBQUMsQ0FBQyxDQUFDO2FBQzdCO1lBQ0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU8sZUFBZTtRQUNyQixNQUFNLEdBQUcsR0FBdUMsRUFBRSxDQUFDO1FBQ25ELEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNsRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLE1BQU0sRUFBRTtZQUM3RSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDNUQ7UUFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLE1BQU0sRUFBRTtZQUM5RSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztTQUNsRTtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFnQjtRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztJQUM3QixDQUFDOzsrSEFsM0JVLGtDQUFrQzttSEFBbEMsa0NBQWtDLHdFQ25CL0MsdTZHQStGQTsyRkQ1RWEsa0NBQWtDO2tCQU45QyxTQUFTOytCQUNFLGtDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEdyaWRBcGkgfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmluYWxpemUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50TG9hZGluZ1N0YXRlcyB9IGZyb20gJy4uLy4uL21vZGVscy9jb21wb25lbnQtbG9hZGluZy1zdGF0ZXMnO1xyXG5pbXBvcnQgeyBSZXBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgU3RhdGVtZW50T2ZBY2NvdW50SXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9zdGF0ZW1lbnQtb2YtYWNjb3VudC1yZXBvcnQvc3RhdGVtZW50LW9mLWFjY291bnRzLm1vZGVsJztcclxuaW1wb3J0IGpzUERGIGZyb20gJ2pzcGRmJztcclxuaW1wb3J0ICdqc3BkZi1hdXRvdGFibGUnO1xyXG5pbXBvcnQgKiBhcyBFeGNlbEpTIGZyb20gJ2V4Y2VsanMnO1xyXG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3RhdGVtZW50LW9mLWFjY291bnRzLXJlcG9ydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3RhdGVtZW50LW9mLWFjY291bnRzLXJlcG9ydC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgU3RhdGVtZW50T2ZBY2NvdW50c1JlcG9ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIFJlcG9ydE5hbWUgPSBcIlN0YXRlbWVudCBvZiBBY2NvdW50c1wiO1xyXG4gIENvbXBvbmVudExvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXM7XHJcbiAgbG9hZGluZ1N0YXRlOiBDb21wb25lbnRMb2FkaW5nU3RhdGVzID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuICBoYXNTZWFyY2hlZDogYm9vbGVhbjtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBvcGVuaW5nQmFsQW5kRnVuZGluZzogU3RhdGVtZW50T2ZBY2NvdW50SXRlbVtdID0gW107XHJcbiAgc2VuZERldGFpbHM6IFN0YXRlbWVudE9mQWNjb3VudEl0ZW1bXSA9IFtdO1xyXG4gIHJlY2VpdmVEZXRhaWxzOiBTdGF0ZW1lbnRPZkFjY291bnRJdGVtW10gPSBbXTtcclxuICBub0RhdGFGcm9tQXBpOiBib29sZWFuO1xyXG4gIG1ldGFEYXRhT25lOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIG1ldGFEYXRhVHdvOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIHVzZXI6IGFueTtcclxuICBjdXJyZW50RGF0ZVRpbWU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIHNlbmRQaW5uZWRCb3R0b21Sb3c6IGFueVtdID0gW107XHJcbiAgcmVjZWl2ZVBpbm5lZEJvdHRvbVJvdzogYW55W10gPSBbXTtcclxuICBwcml2YXRlIHNlbmRHcmlkQXBpITogR3JpZEFwaTtcclxuICBwcml2YXRlIHJlY2VpdmVHcmlkQXBpITogR3JpZEFwaTtcclxuICBwcml2YXRlIG9wZW5pbmdHcmlkQXBpITogR3JpZEFwaTtcclxuICBzZWFyY2hUZXh0OiBzdHJpbmc7XHJcbiAgY2xvc2luZ0JhbGFuY2U6IG51bWJlciA9IDA7XHJcblxyXG4gIGNsb3NpbmdCYWxhbmNlQ3VycmVuY3kgPSAnVVNEJztcclxuICBjbG9zaW5nQmFsYW5jZVVTREluV29yZHM6IHN0cmluZyA9ICcnO1xyXG5cclxuICBzZWxlY3RlZENsaWVudFR5cGU6IHN0cmluZyA9ICcnO1xyXG4gIHNob3dUYWJsZXMgPSBmYWxzZTtcclxuICBwcml2YXRlIGxvZ29CYXNlNjQ/OiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRFeHBvcnRPcHRpb246IHN0cmluZztcclxuXHJcbiAgY2xvc2luZ0JhbGFuY2VJblNldHRsbWVudDogbnVtYmVyID0gMDtcclxuICBjbG9zaW5nQmFsYW5jZVNldHRsbWVudEN1cnJlbmN5OiBzdHJpbmcgPSAnJztcclxuICBjbG9zaW5nQmFsYW5jZVNldHRsbWVudEluV29yZHM6IHN0cmluZyA9ICcnO1xyXG4gIGNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Rm9ybWF0dGVkOiBzdHJpbmcgPSAnMC4wMDAnO1xyXG4gIGNsb3NpbmdCYWxhbmNlSW5Vc2RGb3JtYXR0ZWQ6IHN0cmluZyA9ICcwLjAwMCc7XHJcbiAgcmVwb3J0VXNlcmFuZFRpbWU6IHN0cmluZztcclxuICBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdO1xyXG4gIGlzRm9ybVZhbGlkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVwb3J0U2VydmljZTogUmVwb3J0U2VydmljZSkgeyB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5sb2dvQmFzZTY0ID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2VBc0Jhc2U2NCgnYXNzZXRzL3JlcG9ydHMtbGliL2Fzc2V0cy9pbWFnZXMvWE1Mb2dvLnBuZycpO1xyXG4gIH1cclxuXHJcbiAgY29sdW1uRGVmcyA9IFtcclxuICAgIC8vIHsgaGVhZGVyTmFtZTogJ0lEJywgZmllbGQ6ICdpZCcsIHdpZHRoOiAxMDAgfSxcclxuICAgIHsgaGVhZGVyTmFtZTogJ0Rlc2NyaXB0aW9uJywgZmllbGQ6ICdkZXNjcmlwdGlvbicsIGZsZXg6IDQsIHRvb2x0aXBGaWVsZDogJ2Rlc2NyaXB0aW9uJywgY2VsbENsYXNzUnVsZXM6IHsgJ3Bpbm5lZC10b3RhbC1jZWxsJzogcGFyYW1zID0+IHBhcmFtcy5ub2RlLnJvd1Bpbm5lZCA9PT0gJ2JvdHRvbScgfSB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnU2V0dGxtZW50IENjeScsIGZpZWxkOiAnc2V0dGxtZW50Q2N5JywgZmxleDogMSwgdG9vbHRpcEZpZWxkOiAnc2V0dGxtZW50Q2N5JywgY2VsbENsYXNzUnVsZXM6IHsgJ3Bpbm5lZC10b3RhbC1jZWxsJzogcGFyYW1zID0+IHBhcmFtcy5ub2RlLnJvd1Bpbm5lZCA9PT0gJ2JvdHRvbScgfSB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnQW1vdW50IEluIFNldHRsbWVudCBDY3knLCBmaWVsZDogJ2Ftb3VudEluU2V0dGxtZW50Q2N5JywgZmxleDogMi4xLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwnLCB2YWx1ZUZvcm1hdHRlcjogdGhpcy5jdXJyZW5jeUZvcm1hdHRlciwgdG9vbHRpcFZhbHVlR2V0dGVyOiAocGFyYW1zOiBhbnkpID0+IHRoaXMuY3VycmVuY3lGb3JtYXR0ZXIocGFyYW1zKSwgY2VsbENsYXNzUnVsZXM6IHsgJ3Bpbm5lZC10b3RhbC1jZWxsJzogcGFyYW1zID0+IHBhcmFtcy5ub2RlLnJvd1Bpbm5lZCA9PT0gJ2JvdHRvbScgfSB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnQW1vdW50IEluIFVTRCcsIGZpZWxkOiAnYW1vdW50SW5VU0QnLCBmbGV4OiAyLjEsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCcsIHZhbHVlRm9ybWF0dGVyOiB0aGlzLmN1cnJlbmN5Rm9ybWF0dGVyLCB0b29sdGlwVmFsdWVHZXR0ZXI6IChwYXJhbXM6IGFueSkgPT4gdGhpcy5jdXJyZW5jeUZvcm1hdHRlcihwYXJhbXMpLCBjZWxsQ2xhc3NSdWxlczogeyAncGlubmVkLXRvdGFsLWNlbGwnOiBwYXJhbXMgPT4gcGFyYW1zLm5vZGUucm93UGlubmVkID09PSAnYm90dG9tJyB9IH1cclxuICBdO1xyXG5cclxuICBkZWZhdWx0Q29sRGVmID0ge1xyXG4gICAgc29ydGFibGU6IHRydWUsXHJcbiAgICBmaWx0ZXI6IHRydWUsXHJcbiAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICBtaW53aWR0aDogNDAsXHJcbiAgICB3cmFwSGVhZGVyVGV4dDogdHJ1ZSxcclxuICAgIGF1dG9IZWFkZXJIZWlnaHQ6IHRydWUsXHJcbiAgICBzdXBwcmVzc1NpemVUb0ZpdDogZmFsc2UsXHJcbiAgICB3cmFwVGV4dDogdHJ1ZSxcclxuICAgIGF1dG9IZWlnaHQ6IHRydWVcclxuICB9O1xyXG5cclxuICBjdXJyZW5jeUZvcm1hdHRlcihwYXJhbXM6IGFueSkge1xyXG4gICAgaWYgKHBhcmFtcy52YWx1ZSA9PSBudWxsKSByZXR1cm4gJzAuMDAwJztcclxuICAgIGNvbnN0IG51bSA9IE51bWJlcihwYXJhbXMudmFsdWUpO1xyXG4gICAgcmV0dXJuIG51bS50b0ZpeGVkKDMpOyAvLyByb3VuZHMgdG8gMyBkZWNpbWFsc1xyXG4gIH1cclxuXHJcblxyXG4gIGFzeW5jIGhhbmRsZVNlYXJjaChjcml0ZXJpYTogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnNlYXJjaENyaXRlcmlhID0gY3JpdGVyaWEuc2VhcmNoQ3JpdGVyaWE7XHJcbiAgICBjb25zdCBtb2RhbCA9IGNyaXRlcmlhLm1vZGFsO1xyXG4gICAgdGhpcy5yZXBvcnRVc2VyYW5kVGltZSA9IGAke2NyaXRlcmlhLnN5c1VzZXJJRH0gQCAke2Zvcm1hdERhdGUodGhpcy5jdXJyZW50RGF0ZVRpbWUsICdkZC9NTS95eXl5IGhoOm1tIGEnLCAnZW4tVVMnKX1gO1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgYnVzaW5lc3NQYXJ0bmVySUQ6IE51bWJlcihtb2RhbC5jbGllbnQpLFxyXG4gICAgICBmcm9tRGF0ZTogbmV3IERhdGUobW9kYWwuZnJvbURhdGUpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgIHRvRGF0ZTogbmV3IERhdGUobW9kYWwudG9EYXRlKS50b0lTT1N0cmluZygpLFxyXG4gICAgICBjbGllbnRUeXBlOiBjcml0ZXJpYS5jbGllbnRUeXBlXHJcbiAgICB9O1xyXG4gICAgdGhpcy51c2VyID0gY3JpdGVyaWEuc3lzVXNlcklEXHJcbiAgICB0aGlzLm1ldGFEYXRhT25lID0ge1xyXG4gICAgICAnUmVwb3J0IFBlcmlvZCAnOiBjcml0ZXJpYS5yZXBvcnRQZXJpb2RcclxuICAgIH1cclxuICAgIHRoaXMubWV0YURhdGFUd28gPSB7XHJcbiAgICAgICdSZXBvcnQgVXNlciAmIFRpbWUgJzogdGhpcy5yZXBvcnRVc2VyYW5kVGltZVxyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc2RhdGUgPSBuZXcgRGF0ZShwYXlsb2FkPy5mcm9tRGF0ZSk7XHJcbiAgICAgIGNvbnN0IGVkYXRlID0gbmV3IERhdGUocGF5bG9hZD8udG9EYXRlKTtcclxuICAgICAgcGF5bG9hZC5mcm9tRGF0ZSA9IHNkYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdO1xyXG4gICAgICBwYXlsb2FkLnRvRGF0ZSA9IGVkYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgRGF0ZVwiKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VhcmNoQ3JpdGVyaWEgPSBjcml0ZXJpYS5zZWFyY2hDcml0ZXJpYTtcclxuICAgIGNvbnNvbGUubG9nKGNyaXRlcmlhLmNsaWVudE5hbWUpXHJcbiAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuTG9hZGluZztcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XHJcbiAgICB0aGlzLnNob3dUYWJsZXMgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRDbGllbnRUeXBlID0gY3JpdGVyaWEuY2xpZW50VHlwZTtcclxuXHJcbiAgICB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0U3RhdGVtZW50T2ZBY2NvdW50KHBheWxvYWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgICAgICAgIHRoaXMuaGFzU2VhcmNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5zaG93VGFibGVzID0gdHJ1ZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZGF0YSlcclxuICAgICAgICAgIHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcgPSBkYXRhLm9wZW5pbmdCYWxBbmRGdW5kaW5nID8/IFtdO1xyXG4gICAgICAgICAgdGhpcy5zZW5kRGV0YWlscyA9IGRhdGEuc2VuZERldGFpbHMgPz8gW107XHJcbiAgICAgICAgICB0aGlzLnJlY2VpdmVEZXRhaWxzID0gZGF0YS5yZWNlaXZlRGV0YWlscyA/PyBbXTtcclxuXHJcbiAgICAgICAgICAvLyBhZGQgcGlubmVkIHRvdGFsc1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDbGllbnRUeXBlID09IFwiUGF5SW5cIikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3cgPSBbdGhpcy5idWlsZFRvdGFsUm93KHRoaXMuc2VuZERldGFpbHMpXTtcclxuICAgICAgICAgICAgdGhpcy5yZWNlaXZlUGlubmVkQm90dG9tUm93ID0gW107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQ2xpZW50VHlwZSA9PSBcIlBheU91dFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVBpbm5lZEJvdHRvbVJvdyA9IFt0aGlzLmJ1aWxkVG90YWxSb3codGhpcy5yZWNlaXZlRGV0YWlscyldO1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3cgPSBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDbGllbnRUeXBlID09PSBcIkJvdGhcIikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3cgPSBbdGhpcy5idWlsZFRvdGFsUm93KHRoaXMuc2VuZERldGFpbHMpXTtcclxuICAgICAgICAgICAgdGhpcy5yZWNlaXZlUGlubmVkQm90dG9tUm93ID0gW3RoaXMuYnVpbGRUb3RhbFJvdyh0aGlzLnJlY2VpdmVEZXRhaWxzKV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZW5kUGlubmVkQm90dG9tUm93ID0gW107XHJcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVBpbm5lZEJvdHRvbVJvdyA9IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVDbG9zaW5nQmFsYW5jZSgpO1xyXG5cclxuICAgICAgICAgIHRoaXMubm9EYXRhRnJvbUFwaSA9XHJcbiAgICAgICAgICAgIHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcubGVuZ3RoID09PSAwICYmXHJcbiAgICAgICAgICAgIHRoaXMuc2VuZERldGFpbHMubGVuZ3RoID09PSAwICYmXHJcbiAgICAgICAgICAgICghdGhpcy5yZWNlaXZlRGV0YWlscyB8fCB0aGlzLnJlY2VpdmVEZXRhaWxzLmxlbmd0aCA9PT0gMCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgU3RhdGVtZW50IG9mIEFjY291bnRzOicsIGVycik7XHJcbiAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICdGYWlsZWQgdG8gbG9hZCBTdGF0ZW1lbnQgb2YgQWNjb3VudHMnO1xyXG4gICAgICAgICAgdGhpcy5vcGVuaW5nQmFsQW5kRnVuZGluZyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5zZW5kRGV0YWlscyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5yZWNlaXZlRGV0YWlscyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkVycm9yO1xyXG4gICAgICAgICAgdGhpcy5zaG93VGFibGVzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRUb3RhbFJvdyhyb3dzOiB7IGFtb3VudEluU2V0dGxtZW50Q2N5OiBudW1iZXI7IGFtb3VudEluVVNEOiBudW1iZXIgfVtdKSB7XHJcbiAgICBjb25zdCB0b3RhbFNldHRsZSA9IChyb3dzIHx8IFtdKS5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgKE51bWJlcihyLmFtb3VudEluU2V0dGxtZW50Q2N5KSB8fCAwKSwgMCk7XHJcbiAgICBjb25zdCB0b3RhbFVzZCA9IChyb3dzIHx8IFtdKS5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgKE51bWJlcihyLmFtb3VudEluVVNEKSB8fCAwKSwgMCk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IG51bGwsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwnLFxyXG4gICAgICBzZXR0bG1lbnRDY3k6ICcnLFxyXG4gICAgICBhbW91bnRJblNldHRsbWVudENjeTogTnVtYmVyKHRvdGFsU2V0dGxlLnRvRml4ZWQoMykpLFxyXG4gICAgICBhbW91bnRJblVTRDogTnVtYmVyKHRvdGFsVXNkLnRvRml4ZWQoMykpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgb25PcGVuaW5nR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XHJcbiAgICB0aGlzLm9wZW5pbmdHcmlkQXBpID0gcGFyYW1zLmFwaTtcclxuICB9XHJcbiAgb25TZW5kR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XHJcbiAgICB0aGlzLnNlbmRHcmlkQXBpID0gcGFyYW1zLmFwaTtcclxuICB9XHJcbiAgb25SZWNlaXZlR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XHJcbiAgICB0aGlzLnJlY2VpdmVHcmlkQXBpID0gcGFyYW1zLmFwaTtcclxuICB9XHJcblxyXG4gIGZpbHRlcih0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHRleHQ7XHJcbiAgICBpZiAodGhpcy5vcGVuaW5nR3JpZEFwaSkge1xyXG4gICAgICB0aGlzLm9wZW5pbmdHcmlkQXBpLnNldFF1aWNrRmlsdGVyKHRoaXMuc2VhcmNoVGV4dCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZW5kR3JpZEFwaSkge1xyXG4gICAgICB0aGlzLnNlbmRHcmlkQXBpLnNldFF1aWNrRmlsdGVyKHRoaXMuc2VhcmNoVGV4dCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5yZWNlaXZlR3JpZEFwaSkge1xyXG4gICAgICB0aGlzLnJlY2VpdmVHcmlkQXBpLnNldFF1aWNrRmlsdGVyKHRoaXMuc2VhcmNoVGV4dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZUNsb3NpbmdCYWxhbmNlKCk6IHZvaWQge1xyXG4gICAgLy8gVVNEIHRvdGFscyAoZXhpc3RpbmcgbG9naWMpXHJcbiAgICBjb25zdCBvcGVuaW5nQmFsVG90YWxVc2QgPSAodGhpcy5vcGVuaW5nQmFsQW5kRnVuZGluZyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAoc3VtLCByOiBhbnkpID0+IHN1bSArIChOdW1iZXIoci5hbW91bnRJblVTRCkgfHwgMCksIDBcclxuICAgICk7XHJcbiAgICBjb25zdCBzZW5kVG90YWxVc2QgPSAodGhpcy5zZW5kRGV0YWlscyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAoc3VtLCByOiBhbnkpID0+IHN1bSArIChOdW1iZXIoci5hbW91bnRJblVTRCkgfHwgMCksIDBcclxuICAgICk7XHJcbiAgICBjb25zdCByZWNlaXZlVG90YWxVc2QgPSAodGhpcy5yZWNlaXZlRGV0YWlscyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAoc3VtLCByOiBhbnkpID0+IHN1bSArIChOdW1iZXIoci5hbW91bnRJblVTRCkgfHwgMCksIDBcclxuICAgICk7XHJcbiAgICBjb25zdCByYXdDbG9zaW5nVXNkID0gb3BlbmluZ0JhbFRvdGFsVXNkICsgc2VuZFRvdGFsVXNkICsgcmVjZWl2ZVRvdGFsVXNkO1xyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZSA9IE51bWJlcihyYXdDbG9zaW5nVXNkLnRvRml4ZWQoMykpOyAvLyBudW1lcmljIFVTRFxyXG5cclxuICAgIC8vIFNldHRsZW1lbnQgY3VycmVuY3kgdG90YWxzIChuZXcpXHJcbiAgICBjb25zdCBvcGVuaW5nU2V0dGxlID0gKHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcgfHwgW10pLnJlZHVjZShcclxuICAgICAgKHN1bSwgcjogYW55KSA9PiBzdW0gKyAoTnVtYmVyKHIuYW1vdW50SW5TZXR0bG1lbnRDY3kpIHx8IDApLCAwXHJcbiAgICApO1xyXG4gICAgY29uc3Qgc2VuZFNldHRsZSA9ICh0aGlzLnNlbmREZXRhaWxzIHx8IFtdKS5yZWR1Y2UoXHJcbiAgICAgIChzdW0sIHI6IGFueSkgPT4gc3VtICsgKE51bWJlcihyLmFtb3VudEluU2V0dGxtZW50Q2N5KSB8fCAwKSwgMFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHJlY2VpdmVTZXR0bGUgPSAodGhpcy5yZWNlaXZlRGV0YWlscyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAoc3VtLCByOiBhbnkpID0+IHN1bSArIChOdW1iZXIoci5hbW91bnRJblNldHRsbWVudENjeSkgfHwgMCksIDBcclxuICAgICk7XHJcbiAgICBjb25zdCByYXdDbG9zaW5nU2V0dGxlID0gb3BlbmluZ1NldHRsZSArIHNlbmRTZXR0bGUgKyByZWNlaXZlU2V0dGxlO1xyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50ID0gTnVtYmVyKHJhd0Nsb3NpbmdTZXR0bGUudG9GaXhlZCgzKSk7XHJcblxyXG4gICAgLy8gcGljayBhIHNldHRsZW1lbnQgY3VycmVuY3kgdG8gZGlzcGxheSAoZmlyc3Qgbm9uLWVtcHR5KVxyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZVNldHRsbWVudEN1cnJlbmN5ID0gdGhpcy5nZXRGaXJzdFNldHRsZW1lbnRDdXJyZW5jeSgpO1xyXG5cclxuICAgIC8vIGZvcm1hdHRlZCBzdHJpbmdzIChuby10aG91c2FuZC1jb21tYSwgMyBkZWNpbWFscylcclxuICAgIHRoaXMuY2xvc2luZ0JhbGFuY2VJblVzZEZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0Tm9Db21tYSh0aGlzLmNsb3NpbmdCYWxhbmNlKTtcclxuICAgIHRoaXMuY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRGb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdE5vQ29tbWEodGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50KTtcclxuXHJcbiAgICB0aGlzLmNsb3NpbmdCYWxhbmNlVVNESW5Xb3JkcyA9IHRoaXMubnVtYmVyVG9Xb3Jkcyh0aGlzLmNsb3NpbmdCYWxhbmNlKTtcclxuICAgIHRoaXMuY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRJbldvcmRzID1cclxuICAgICAgdGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50ICE9PSBudWxsICYmXHJcbiAgICAgICAgdGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50ICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAhaXNOYU4oTnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2VJblNldHRsbWVudCkpXHJcbiAgICAgICAgPyB0aGlzLm51bWJlclRvV29yZHModGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50KVxyXG4gICAgICAgIDogJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdE5vQ29tbWEodmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHJldHVybiAnMC4wMDAnO1xyXG4gICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTtcclxuICAgIGNvbnN0IHRydW5jYXRlZCA9IE1hdGgudHJ1bmMobnVtICogMTAwMCkgLyAxMDAwO1xyXG4gICAgcmV0dXJuIHRydW5jYXRlZC50b0ZpeGVkKDMpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgZ2V0Rmlyc3RTZXR0bGVtZW50Q3VycmVuY3koKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRyeUdldCA9IChhcnI6IGFueVtdKSA9PiB7XHJcbiAgICAgIGlmICghYXJyIHx8IGFyci5sZW5ndGggPT09IDApIHJldHVybiAnJztcclxuICAgICAgZm9yIChjb25zdCByIG9mIGFycikge1xyXG4gICAgICAgIGlmIChyICYmIHIuc2V0dGxtZW50Q2N5KSByZXR1cm4gci5zZXR0bG1lbnRDY3k7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdHJ5R2V0KHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcpIHx8IHRyeUdldCh0aGlzLnNlbmREZXRhaWxzKSB8fCB0cnlHZXQodGhpcy5yZWNlaXZlRGV0YWlscykgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBudW1iZXJUb1dvcmRzKG51bTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmIChudW0gPT09IDApIHJldHVybiBcIlplcm8gUG9pbnQgWmVybyBaZXJvIFplcm8gT25seVwiO1xyXG5cclxuICAgIGxldCByZXN1bHQgPSBcIlwiO1xyXG5cclxuICAgIC8vIEhhbmRsZSBuZWdhdGl2ZSBudW1iZXJzXHJcbiAgICBpZiAobnVtIDwgMCkge1xyXG4gICAgICByZXN1bHQgPSBcIk5lZ2F0aXZlIFwiO1xyXG4gICAgICBudW0gPSBNYXRoLmFicyhudW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNwbGl0IGludGVnZXIgYW5kIGRlY2ltYWwgcGFydHNcclxuICAgIGNvbnN0IGludGVnZXJQYXJ0ID0gTWF0aC5mbG9vcihudW0pO1xyXG4gICAgY29uc3QgZGVjaW1hbFBhcnQgPSBNYXRoLnJvdW5kKChudW0gLSBpbnRlZ2VyUGFydCkgKiAxMDAwKTsgLy8gdXAgdG8gMyBkZWNpbWFsIHBsYWNlc1xyXG5cclxuICAgIHJlc3VsdCArPSB0aGlzLmNvbnZlcnROdW1iZXIoaW50ZWdlclBhcnQpO1xyXG5cclxuICAgIGlmIChkZWNpbWFsUGFydCA+IDApIHtcclxuICAgICAgcmVzdWx0ICs9IFwiIFBvaW50XCI7XHJcbiAgICAgIGNvbnN0IGRlY2ltYWxTdHIgPSBkZWNpbWFsUGFydC50b1N0cmluZygpLnBhZFN0YXJ0KDMsIFwiMFwiKTsgLy8ga2VlcCAzIGRpZ2l0c1xyXG4gICAgICBmb3IgKGNvbnN0IGRpZ2l0IG9mIGRlY2ltYWxTdHIpIHtcclxuICAgICAgICByZXN1bHQgKz0gXCIgXCIgKyB0aGlzLm9uZXNbK2RpZ2l0XTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQgKyBcIiBPbmx5XCI7XHJcbiAgfVxyXG5cclxuICAvLyBIZWxwZXIgYXJyYXlzXHJcbiAgcHJpdmF0ZSBvbmVzID0gW1wiWmVyb1wiLCBcIk9uZVwiLCBcIlR3b1wiLCBcIlRocmVlXCIsIFwiRm91clwiLCBcIkZpdmVcIiwgXCJTaXhcIiwgXCJTZXZlblwiLCBcIkVpZ2h0XCIsIFwiTmluZVwiXTtcclxuICBwcml2YXRlIHRlZW5zID0gW1wiVGVuXCIsIFwiRWxldmVuXCIsIFwiVHdlbHZlXCIsIFwiVGhpcnRlZW5cIiwgXCJGb3VydGVlblwiLCBcIkZpZnRlZW5cIiwgXCJTaXh0ZWVuXCIsIFwiU2V2ZW50ZWVuXCIsIFwiRWlnaHRlZW5cIiwgXCJOaW5ldGVlblwiXTtcclxuICBwcml2YXRlIHRlbnMgPSBbXCJcIiwgXCJcIiwgXCJUd2VudHlcIiwgXCJUaGlydHlcIiwgXCJGb3J0eVwiLCBcIkZpZnR5XCIsIFwiU2l4dHlcIiwgXCJTZXZlbnR5XCIsIFwiRWlnaHR5XCIsIFwiTmluZXR5XCJdO1xyXG5cclxuICAvLyBDb252ZXJ0IHdob2xlIG51bWJlcnMgKEluZGlhbi9JbnRlcm5hdGlvbmFsIHN5c3RlbSlcclxuICBwcml2YXRlIGNvbnZlcnROdW1iZXIobnVtOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKG51bSA9PT0gMCkgcmV0dXJuIFwiXCI7XHJcbiAgICBpZiAobnVtIDwgMTApIHJldHVybiB0aGlzLm9uZXNbbnVtXTtcclxuICAgIGlmIChudW0gPCAyMCkgcmV0dXJuIHRoaXMudGVlbnNbbnVtIC0gMTBdO1xyXG4gICAgaWYgKG51bSA8IDEwMCkgcmV0dXJuIHRoaXMudGVuc1tNYXRoLmZsb29yKG51bSAvIDEwKV0gKyAobnVtICUgMTAgIT09IDAgPyBcIiBcIiArIHRoaXMub25lc1tudW0gJSAxMF0gOiBcIlwiKTtcclxuICAgIGlmIChudW0gPCAxMDAwKSByZXR1cm4gdGhpcy5jb252ZXJ0TnVtYmVyKE1hdGguZmxvb3IobnVtIC8gMTAwKSkgKyBcIiBIdW5kcmVkXCIgKyAobnVtICUgMTAwICE9PSAwID8gXCIgXCIgKyB0aGlzLmNvbnZlcnROdW1iZXIobnVtICUgMTAwKSA6IFwiXCIpO1xyXG4gICAgaWYgKG51bSA8IDEwMDAwMDApIHJldHVybiB0aGlzLmNvbnZlcnROdW1iZXIoTWF0aC5mbG9vcihudW0gLyAxMDAwKSkgKyBcIiBUaG91c2FuZFwiICsgKG51bSAlIDEwMDAgIT09IDAgPyBcIiBcIiArIHRoaXMuY29udmVydE51bWJlcihudW0gJSAxMDAwKSA6IFwiXCIpO1xyXG4gICAgaWYgKG51bSA8IDEwMDAwMDAwMDApIHJldHVybiB0aGlzLmNvbnZlcnROdW1iZXIoTWF0aC5mbG9vcihudW0gLyAxMDAwMDAwKSkgKyBcIiBNaWxsaW9uXCIgKyAobnVtICUgMTAwMDAwMCAhPT0gMCA/IFwiIFwiICsgdGhpcy5jb252ZXJ0TnVtYmVyKG51bSAlIDEwMDAwMDApIDogXCJcIik7XHJcbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0TnVtYmVyKE1hdGguZmxvb3IobnVtIC8gMTAwMDAwMDAwMCkpICsgXCIgQmlsbGlvblwiICsgKG51bSAlIDEwMDAwMDAwMDAgIT09IDAgPyBcIiBcIiArIHRoaXMuY29udmVydE51bWJlcihudW0gJSAxMDAwMDAwMDAwKSA6IFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgb25FeHBvcnRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEV4cG9ydE9wdGlvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXhwb3J0KG9wdGlvbjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRXhwb3J0T3B0aW9uID0gb3B0aW9uO1xyXG4gICAgc3dpdGNoICgodGhpcy5zZWxlY3RlZEV4cG9ydE9wdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdwZGYnOiB0aGlzLmV4cG9ydFRvUERGKCk7IGJyZWFrO1xyXG4gICAgICBjYXNlICdleGNlbCc6IHRoaXMuZXhwb3J0VG9FeGNlbCgpOyBicmVhaztcclxuICAgICAgY2FzZSAnY3N2JzogdGhpcy5leHBvcnRUb0NTVigpOyBicmVhaztcclxuICAgICAgZGVmYXVsdDogY29uc29sZS53YXJuKCdVbmtub3duIGV4cG9ydCB0eXBlOicsIHRoaXMuc2VsZWN0ZWRFeHBvcnRPcHRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0VG9QREYoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWN0aW9ucyA9IHRoaXMuZ2V0VmlzaWJsZUdyaWRzKClcclxuICAgICAgLm1hcChzID0+IHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXREaXNwbGF5ZWREYXRhKHMuYXBpKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKCk7XHJcbiAgICAgICAgbGV0IHJvd3MgPSB0aGlzLmJ1aWxkUm93cyhkYXRhKTtcclxuXHJcbiAgICAgICAgaWYgKHMudGl0bGUgPT09ICdTZW5kIERldGFpbHMnICYmIHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByb3dzID0gcm93cy5jb25jYXQodGhpcy5idWlsZFJvd3ModGhpcy5zZW5kUGlubmVkQm90dG9tUm93KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzLnRpdGxlID09PSAnUmVjZWl2ZSBEZXRhaWxzJyAmJiB0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3c/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cyA9IHJvd3MuY29uY2F0KHRoaXMuYnVpbGRSb3dzKHRoaXMucmVjZWl2ZVBpbm5lZEJvdHRvbVJvdykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJvd3MubGVuZ3RoID8geyB0aXRsZTogcy50aXRsZSwgaGVhZGVycywgcm93cyB9IDogbnVsbDtcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyB7IHRpdGxlOiBzdHJpbmc7IGhlYWRlcnM6IHN0cmluZ1tdOyByb3dzOiBhbnlbXVtdIH1bXTtcclxuICAgIGlmICghc2VjdGlvbnMubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgZG9jID0gbmV3IGpzUERGKHsgb3JpZW50YXRpb246ICdsYW5kc2NhcGUnLCB1bml0OiAnbW0nLCBmb3JtYXQ6ICdhNCcgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMubG9nb0Jhc2U2NCkge1xyXG4gICAgICBkb2MuYWRkSW1hZ2UodGhpcy5sb2dvQmFzZTY0LCAnUE5HJywgMTUsIDEwLCAzOCwgMTgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpO1xyXG4gICAgY29uc3QgcGFnZUhlaWdodCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKTtcclxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgZG9jLnNldEZvbnRTaXplKDE1KTtcclxuICAgIGRvYy50ZXh0KHRoaXMuUmVwb3J0TmFtZSwgcGFnZVdpZHRoIC8gMiwgMTgsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xyXG5cclxuICAgIGxldCB5ID0gMzQ7XHJcbiAgICBkb2Muc2V0Rm9udFNpemUoMTApO1xyXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5tZXRhRGF0YU9uZSB8fCB7fSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICBkb2MudGV4dChgJHtrfTogYCwgMTUsIHkpO1xyXG4gICAgICBjb25zdCB3ID0gZG9jLmdldFRleHRXaWR0aChgJHtrfTogYCk7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XHJcbiAgICAgIGRvYy50ZXh0KFN0cmluZyh2ID8/ICcnKSwgMTUgKyB3LCB5KTtcclxuICAgICAgeSArPSA2O1xyXG4gICAgfSk7XHJcblxyXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5tZXRhRGF0YVR3byB8fCB7fSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICBkb2MudGV4dChgJHtrfTogYCwgMTUsIHkpO1xyXG4gICAgICBjb25zdCB3ID0gZG9jLmdldFRleHRXaWR0aChgJHtrfTogYCk7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XHJcbiAgICAgIGRvYy50ZXh0KFN0cmluZyh2ID8/ICcnKSwgMTUgKyB3LCB5KTtcclxuICAgICAgeSArPSA2O1xyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8vIC0tLSBzZWFyY2ggY3JpdGVyaWEgLS0tXHJcbiAgICBjb25zdCBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdID0gdGhpcy5zZWFyY2hDcml0ZXJpYSB8fCBbXTtcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU2VhcmNoIENyaXRlcmlhIFNlY3Rpb24gPT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gICAgLy8gU3RhcnQganVzdCBiZWxvdyBtZXRhZGF0YVxyXG4gICAgbGV0IG1hcmdpbkxlZnQgPSAxNTtcclxuICAgIGxldCBjdXJyZW50WSA9IHkgKyA1OyAvLyBjb250aW51ZSBiZWxvdyBtZXRhZGF0YVxyXG5cclxuICAgIC8vIC0tLSBoZWFkaW5nIC0tLVxyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICBkb2MudGV4dCgnU2VhcmNoIENyaXRlcmlhOi0nLCBtYXJnaW5MZWZ0LCBjdXJyZW50WSk7XHJcbiAgICBjdXJyZW50WSArPSA4O1xyXG5cclxuICAgIGNvbnN0IHJvd0hlaWdodFBlckxpbmUgPSA2O1xyXG4gICAgY29uc3QgbWluR2FwID0gMjsgLy8gZ2FwIGJldHdlZW4ga2V5IGFuZCB2YWx1ZVxyXG4gICAgY29uc3QgYmV0d2VlbkNvbHVtbnNHYXAgPSAxNTsgLy8gZ2FwIGJldHdlZW4gbGVmdCBhbmQgcmlnaHQgY29sdW1uc1xyXG4gICAgY29uc3QgcGFnZUNvbnRlbnRXaWR0aCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIDIgKiBtYXJnaW5MZWZ0O1xyXG5cclxuICAgIC8vIC0tLSBoZWxwZXIgdG8gbWVhc3VyZSBwYWlyIHdpZHRoIC0tLVxyXG4gICAgY29uc3QgbWVhc3VyZVBhaXJXaWR0aCA9IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IG51bWJlciA9PiB7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICBjb25zdCBrZXlXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoa2V5ICsgJyAnKTtcclxuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgICAgY29uc3QgdmFsdWVXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodmFsdWUpO1xyXG4gICAgICByZXR1cm4ga2V5V2lkdGggKyBtaW5HYXAgKyB2YWx1ZVdpZHRoO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyAtLS0gY29tcHV0ZSBtYXggd2lkdGggb2YgbGVmdCBjb2x1bW4gLS0tXHJcbiAgICBsZXQgbWF4TGVmdFBhaXJXaWR0aCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIGlmIChzZWFyY2hDcml0ZXJpYVtpXSkge1xyXG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHNlYXJjaENyaXRlcmlhW2ldO1xyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gbWVhc3VyZVBhaXJXaWR0aChrZXksIHZhbHVlKTtcclxuICAgICAgICBpZiAod2lkdGggPiBtYXhMZWZ0UGFpcldpZHRoKSBtYXhMZWZ0UGFpcldpZHRoID0gd2lkdGg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0gY2FsY3VsYXRlIHdoZXJlIHJpZ2h0IGNvbHVtbiBzdGFydHMgLS0tXHJcbiAgICBjb25zdCBsZWZ0Q29sdW1uU3RhcnQgPSBtYXJnaW5MZWZ0O1xyXG4gICAgY29uc3QgcmlnaHRDb2x1bW5TdGFydCA9IGxlZnRDb2x1bW5TdGFydCArIG1heExlZnRQYWlyV2lkdGggKyBiZXR3ZWVuQ29sdW1uc0dhcDtcclxuXHJcbiAgICAvLyAtLS0gcHJpbnQgcGFpcnMgZHluYW1pY2FsbHkgLS0tXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIC8vIExlZnQgY29sdW1uXHJcbiAgICAgIGlmIChzZWFyY2hDcml0ZXJpYVtpXSkge1xyXG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHNlYXJjaENyaXRlcmlhW2ldO1xyXG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICAgIGRvYy50ZXh0KGtleSwgbGVmdENvbHVtblN0YXJ0LCBjdXJyZW50WSk7XHJcblxyXG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XHJcbiAgICAgICAgY29uc3Qga2V5V2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKGtleSArICcgJyk7XHJcbiAgICAgICAgY29uc3QgdmFsdWVYID0gbGVmdENvbHVtblN0YXJ0ICsga2V5V2lkdGggKyBtaW5HYXA7XHJcbiAgICAgICAgZG9jLnRleHQodmFsdWUsIHZhbHVlWCwgY3VycmVudFkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBSaWdodCBjb2x1bW5cclxuICAgICAgaWYgKHNlYXJjaENyaXRlcmlhW2kgKyAxXSkge1xyXG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHNlYXJjaENyaXRlcmlhW2kgKyAxXTtcclxuICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcclxuICAgICAgICBkb2MudGV4dChrZXksIHJpZ2h0Q29sdW1uU3RhcnQsIGN1cnJlbnRZKTtcclxuXHJcbiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgICAgICBjb25zdCBrZXlXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoa2V5ICsgJyAnKTtcclxuICAgICAgICBjb25zdCB2YWx1ZVggPSByaWdodENvbHVtblN0YXJ0ICsga2V5V2lkdGggKyBtaW5HYXA7XHJcbiAgICAgICAgZG9jLnRleHQodmFsdWUsIHZhbHVlWCwgY3VycmVudFkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjdXJyZW50WSArPSByb3dIZWlnaHRQZXJMaW5lO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSBZIHBvc2l0aW9uIGZvciBuZXh0IHNlY3Rpb25zXHJcbiAgICB5ID0gY3VycmVudFkgKyA0O1xyXG5cclxuICAgIGNvbnN0IEhFQUQgPSB0aGlzLmdldEhlYWRlcnMoKTtcclxuXHJcbiAgICBjb25zdCBtYXJnaW4gPSB7IGxlZnQ6IDE1LCByaWdodDogMTUgfTtcclxuICAgIGNvbnN0IGF2YWlsID0gcGFnZVdpZHRoIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQ7XHJcbiAgICBjb25zdCB3ZWlnaHRzID0gWzQsIDEsIDIsIDJdO1xyXG4gICAgY29uc3Qgc3VtID0gd2VpZ2h0cy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcclxuICAgIGNvbnN0IHdpZHRocyA9IHdlaWdodHMubWFwKHcgPT4gKHcgLyBzdW0pICogYXZhaWwpO1xyXG5cclxuICAgIGNvbnN0IHNoYXJlZENvbHVtblN0eWxlcyA9IHtcclxuICAgICAgMDogeyBjZWxsV2lkdGg6IHdpZHRoc1swXSB9LFxyXG4gICAgICAxOiB7IGNlbGxXaWR0aDogd2lkdGhzWzFdIH0sXHJcbiAgICAgIDI6IHsgY2VsbFdpZHRoOiB3aWR0aHNbMl0sIGhhbGlnbjogJ3JpZ2h0JyB9LFxyXG4gICAgICAzOiB7IGNlbGxXaWR0aDogd2lkdGhzWzNdLCBoYWxpZ246ICdyaWdodCcgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB0aXRsZUdhcEFib3ZlRmlyc3QgPSAwO1xyXG4gICAgY29uc3QgdGl0bGVHYXBBYm92ZURlZmF1bHQgPSA0O1xyXG4gICAgY29uc3QgdGl0bGVHYXBBYm92ZUJpZyA9IDY7XHJcbiAgICBjb25zdCB0aXRsZVRvVGFibGVHYXAgPSAyO1xyXG4gICAgY29uc3QgdG9wU3RhcnRZID0gMjA7XHJcbiAgICBjb25zdCBib3R0b21SZXNlcnZlID0gMjA7XHJcblxyXG4gICAgc2VjdGlvbnMuZm9yRWFjaCgocywgaWR4KSA9PiB7XHJcbiAgICAgIGNvbnN0IGlzRmlyc3QgPSBpZHggPT09IDA7XHJcbiAgICAgIGNvbnN0IGlzU2VuZE9yUmVjZWl2ZSA9IHMudGl0bGUgPT09ICdTZW5kIERldGFpbHMnIHx8IHMudGl0bGUgPT09ICdSZWNlaXZlIERldGFpbHMnO1xyXG4gICAgICBjb25zdCBwcmVUaXRsZUdhcCA9IGlzRmlyc3QgPyAwIDogKGlzU2VuZE9yUmVjZWl2ZSA/IHRpdGxlR2FwQWJvdmVCaWcgOiB0aXRsZUdhcEFib3ZlRGVmYXVsdCk7XHJcblxyXG4gICAgICBpZiAoeSArIHByZVRpdGxlR2FwICsgdGl0bGVUb1RhYmxlR2FwID4gcGFnZUhlaWdodCAtIGJvdHRvbVJlc2VydmUpIHtcclxuICAgICAgICBkb2MuYWRkUGFnZSgpO1xyXG4gICAgICAgIHkgPSB0b3BTdGFydFk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgeSArPSBwcmVUaXRsZUdhcDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICAgIGRvYy5zZXRGb250U2l6ZSgxMSk7XHJcbiAgICAgIGRvYy50ZXh0KHMudGl0bGUsIG1hcmdpbi5sZWZ0LCB5KTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXJ0WUZvclRhYmxlID0geSArIChpc0ZpcnN0ID8gMCA6IHRpdGxlVG9UYWJsZUdhcCk7XHJcblxyXG4gICAgICBkb2MuYXV0b1RhYmxlKHtcclxuICAgICAgICBoZWFkOiBbSEVBRF0sXHJcbiAgICAgICAgYm9keTogcy5yb3dzLFxyXG4gICAgICAgIHN0YXJ0WTogc3RhcnRZRm9yVGFibGUsXHJcbiAgICAgICAgdGhlbWU6ICdncmlkJyxcclxuICAgICAgICBtYXJnaW4sXHJcbiAgICAgICAgdGFibGVXaWR0aDogYXZhaWwsXHJcbiAgICAgICAgY29sdW1uU3R5bGVzOiBzaGFyZWRDb2x1bW5TdHlsZXMsXHJcbiAgICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6IFsyMjAsIDIyMCwgMjIwXSwgdGV4dENvbG9yOiAwLCBmb250U3R5bGU6ICdib2xkJywgZm9udFNpemU6IDksIGhhbGlnbjogJ2NlbnRlcicgfSxcclxuICAgICAgICBib2R5U3R5bGVzOiB7IGZvbnRTaXplOiA4IH0sXHJcbiAgICAgICAgc3R5bGVzOiB7IGNlbGxQYWRkaW5nOiAyLCBvdmVyZmxvdzogJ2xpbmVicmVhaycsIG1pbkNlbGxIZWlnaHQ6IDYgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHkgPSAoZG9jIGFzIGFueSkubGFzdEF1dG9UYWJsZS5maW5hbFk7XHJcbiAgICB9KTtcclxuICAgIGlmICh5ICsgMzAgPiBwYWdlSGVpZ2h0IC0gYm90dG9tUmVzZXJ2ZSkge1xyXG4gICAgICBkb2MuYWRkUGFnZSgpO1xyXG4gICAgICB5ID0gdG9wU3RhcnRZO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNsb3NpbmdCb2R5ID0gW1xyXG4gICAgICBbXHJcbiAgICAgICAgeyBjb250ZW50OiAnQ2xvc2luZyBCYWxhbmNlJywgY29sU3BhbjogMiwgc3R5bGVzOiB7IGhhbGlnbjogJ2xlZnQnLCBmb250U3R5bGU6ICdib2xkJyB9IH0sXHJcbiAgICAgICAgeyBjb250ZW50OiBOdW1iZXIodGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50IHx8IDApLnRvRml4ZWQoMyksIHN0eWxlczogeyBoYWxpZ246ICdyaWdodCcgfSB9LFxyXG4gICAgICAgIHsgY29udGVudDogTnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2UgfHwgMCkudG9GaXhlZCgzKSwgc3R5bGVzOiB7IGhhbGlnbjogJ3JpZ2h0JyB9IH1cclxuICAgICAgXSxcclxuICAgICAgW1xyXG4gICAgICAgIHsgY29udGVudDogYCR7dGhpcy5jbG9zaW5nQmFsYW5jZVNldHRsbWVudEN1cnJlbmN5IHx8ICcnfSAtICR7dGhpcy5jbG9zaW5nQmFsYW5jZVNldHRsbWVudEluV29yZHMgfHwgJyd9YCwgY29sU3BhbjogNCwgc3R5bGVzOiB7IGhhbGlnbjogJ2xlZnQnIH0gfVxyXG4gICAgICBdLFxyXG4gICAgICBbXHJcbiAgICAgICAgeyBjb250ZW50OiBgJHt0aGlzLmNsb3NpbmdCYWxhbmNlQ3VycmVuY3kgfHwgJyd9IC0gJHt0aGlzLmNsb3NpbmdCYWxhbmNlVVNESW5Xb3JkcyB8fCAnJ31gLCBjb2xTcGFuOiA0LCBzdHlsZXM6IHsgaGFsaWduOiAnbGVmdCcgfSB9XHJcbiAgICAgIF1cclxuICAgIF07XHJcblxyXG4gICAgZG9jLmF1dG9UYWJsZSh7XHJcbiAgICAgIGJvZHk6IGNsb3NpbmdCb2R5LFxyXG4gICAgICBzdGFydFk6IHksXHJcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXHJcbiAgICAgIG1hcmdpbixcclxuICAgICAgdGFibGVXaWR0aDogYXZhaWwsXHJcbiAgICAgIGNvbHVtblN0eWxlczogc2hhcmVkQ29sdW1uU3R5bGVzLFxyXG4gICAgICBzdHlsZXM6IHsgY2VsbFBhZGRpbmc6IDIsIGZvbnRTaXplOiA5IH1cclxuICAgIH0pO1xyXG5cclxuICAgIGRvYy5zYXZlKCdTdGF0ZW1lbnRfb2ZfQWNjb3VudHMucGRmJyk7XHJcbiAgfVxyXG5cclxuICBleHBvcnRUb0V4Y2VsKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLmdldFZpc2libGVHcmlkcygpXHJcbiAgICAgIC5tYXAocyA9PiB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RGlzcGxheWVkRGF0YShzLmFwaSk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycygpO1xyXG4gICAgICAgIGxldCByb3dzID0gdGhpcy5idWlsZFJvd3MoZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChzLnRpdGxlID09PSAnU2VuZCBEZXRhaWxzJyAmJiB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3c/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cyA9IHJvd3MuY29uY2F0KHRoaXMuYnVpbGRSb3dzKHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocy50aXRsZSA9PT0gJ1JlY2VpdmUgRGV0YWlscycgJiYgdGhpcy5yZWNlaXZlUGlubmVkQm90dG9tUm93Py5sZW5ndGgpIHtcclxuICAgICAgICAgIHJvd3MgPSByb3dzLmNvbmNhdCh0aGlzLmJ1aWxkUm93cyh0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByb3dzLmxlbmd0aCA/IHsgdGl0bGU6IHMudGl0bGUsIGhlYWRlcnMsIHJvd3MgfSA6IG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgeyB0aXRsZTogc3RyaW5nOyBoZWFkZXJzOiBzdHJpbmdbXTsgcm93czogYW55W11bXSB9W107XHJcblxyXG4gICAgaWYgKCFzZWN0aW9ucy5sZW5ndGgpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB3YiA9IG5ldyBFeGNlbEpTLldvcmtib29rKCk7XHJcbiAgICBjb25zdCB3cyA9IHdiLmFkZFdvcmtzaGVldCgnU3RhdGVtZW50IG9mIEFjY291bnRzJyk7XHJcbiAgICBsZXQgciA9IDE7XHJcblxyXG4gICAgaWYgKHRoaXMubG9nb0Jhc2U2NCkge1xyXG4gICAgICBjb25zdCBpbWdJZCA9IHdiLmFkZEltYWdlKHsgYmFzZTY0OiB0aGlzLmxvZ29CYXNlNjQsIGV4dGVuc2lvbjogJ3BuZycgfSk7XHJcbiAgICAgIHdzLmFkZEltYWdlKGltZ0lkLCB7IHRsOiB7IGNvbDogMCwgcm93OiAwIH0sIGV4dDogeyB3aWR0aDogMTQ1LCBoZWlnaHQ6IDY2IH0sIGVkaXRBczogJ29uZUNlbGwnIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHdzLmdldFJvdyhyKS5nZXRDZWxsKDIpLnZhbHVlID0gdGhpcy5SZXBvcnROYW1lO1xyXG4gICAgd3MuZ2V0Um93KHIpLmdldENlbGwoMikuZm9udCA9IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTYgfTtcclxuICAgIHIgKz0gMztcclxuXHJcbiAgICBPYmplY3QuZW50cmllcyh0aGlzLm1ldGFEYXRhT25lIHx8IHt9KS5mb3JFYWNoKChbaywgdl0pID0+IHtcclxuICAgICAgY29uc3Qgcm93ID0gd3MuZ2V0Um93KHIrKyk7XHJcbiAgICAgIHJvdy5nZXRDZWxsKDEpLnZhbHVlID0ge1xyXG4gICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICB7IHRleHQ6IGsgKyAnOiAnLCBmb250OiB7IGJvbGQ6IHRydWUgfSB9LCAvLyBrZXkgYm9sZFxyXG4gICAgICAgICAgeyB0ZXh0OiB2ID8/ICcnIH0gICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBub3JtYWxcclxuICAgICAgICBdXHJcbiAgICAgIH07XHJcbiAgICAgIHJvdy5nZXRDZWxsKDEpLmFsaWdubWVudCA9IHsgd3JhcFRleHQ6IGZhbHNlLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMubWV0YURhdGFUd28gfHwge30pLmZvckVhY2goKFtrLCB2XSkgPT4ge1xyXG4gICAgICBjb25zdCByb3cgPSB3cy5nZXRSb3cocisrKTtcclxuICAgICAgcm93LmdldENlbGwoMSkudmFsdWUgPSB7XHJcbiAgICAgICAgcmljaFRleHQ6IFtcclxuICAgICAgICAgIHsgdGV4dDogayArICc6ICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sIC8vIGtleSBib2xkXHJcbiAgICAgICAgICB7IHRleHQ6IHYgPz8gJycgfSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIG5vcm1hbFxyXG4gICAgICAgIF1cclxuICAgICAgfTtcclxuICAgICAgcm93LmdldENlbGwoMSkuYWxpZ25tZW50ID0geyB3cmFwVGV4dDogZmFsc2UsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgcisrO1xyXG4gICAgLy8gLS0tIHNlYXJjaCBjcml0ZXJpYSAtLS1cclxuICAgIGNvbnN0IHNlYXJjaENyaXRlcmlhOiBbc3RyaW5nLCBzdHJpbmddW10gPSB0aGlzLnNlYXJjaENyaXRlcmlhIHx8IFtdO1xyXG5cclxuICAgIHdzLm1lcmdlQ2VsbHMociwgMSwgciwgNCk7IC8vIHByZXZpb3VzbHkgMS4uNlxyXG4gICAgd3MuZ2V0Q2VsbChyLCAxKS52YWx1ZSA9ICdTZWFyY2ggQ3JpdGVyaWE6LSc7XHJcbiAgICB3cy5nZXRDZWxsKHIsIDEpLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgIHIgKz0gMjtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIGNvbnN0IGxlZnQgPSBzZWFyY2hDcml0ZXJpYVtpXTtcclxuICAgICAgY29uc3QgcmlnaHQgPSBzZWFyY2hDcml0ZXJpYVtpICsgMV07XHJcbiAgICAgIGNvbnN0IHJvdyA9IHdzLmdldFJvdyhyKyspO1xyXG5cclxuICAgICAgLy8gTGVmdCBjb2x1bW4gKHJlZHVjZWQgbWVyZ2UpXHJcbiAgICAgIHdzLm1lcmdlQ2VsbHMocm93Lm51bWJlciwgMSwgcm93Lm51bWJlciwgMSk7IC8vIHdhcyAxLi4zXHJcbiAgICAgIHJvdy5nZXRDZWxsKDEpLnZhbHVlID0ge1xyXG4gICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICB7IHRleHQ6IGxlZnRbMF0gKyAnICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICB7IHRleHQ6IGxlZnRbMV0gfVxyXG4gICAgICAgIF1cclxuICAgICAgfTtcclxuICAgICAgcm93LmdldENlbGwoMSkuYWxpZ25tZW50ID0geyB3cmFwVGV4dDogdHJ1ZSwgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcblxyXG4gICAgICAvLyBSaWdodCBjb2x1bW4gKHN0YXJ0IGNsb3NlciB0byBsZWZ0KVxyXG4gICAgICBpZiAocmlnaHQpIHtcclxuICAgICAgICB3cy5tZXJnZUNlbGxzKHJvdy5udW1iZXIsIDIsIHJvdy5udW1iZXIsIDMpOyAvLyB3YXMgNC4uNlxyXG4gICAgICAgIHJvdy5nZXRDZWxsKDMpLnZhbHVlID0ge1xyXG4gICAgICAgICAgcmljaFRleHQ6IFtcclxuICAgICAgICAgICAgeyB0ZXh0OiByaWdodFswXSArICcgJywgZm9udDogeyBib2xkOiB0cnVlIH0gfSxcclxuICAgICAgICAgICAgeyB0ZXh0OiByaWdodFsxXSB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfTtcclxuICAgICAgICByb3cuZ2V0Q2VsbCgzKS5hbGlnbm1lbnQgPSB7IHdyYXBUZXh0OiB0cnVlLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHIrKztcclxuXHJcbiAgICBjb25zdCB3cml0ZVNlY3Rpb24gPSAoc2VjOiB7IHRpdGxlOiBzdHJpbmc7IGhlYWRlcnM6IHN0cmluZ1tdOyByb3dzOiBhbnlbXVtdIH0pID0+IHtcclxuICAgICAgY29uc3QgdGl0bGVSb3cgPSB3cy5nZXRSb3cocisrKTtcclxuICAgICAgY29uc3QgdGl0bGVDZWxsID0gdGl0bGVSb3cuZ2V0Q2VsbCgxKTtcclxuICAgICAgdGl0bGVDZWxsLnZhbHVlID0gc2VjLnRpdGxlO1xyXG4gICAgICB0aXRsZUNlbGwuZm9udCA9IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTIgfTtcclxuICAgICAgdGl0bGVDZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ2xlZnQnLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuXHJcbiAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHdzLmdldFJvdyhyKyspO1xyXG4gICAgICBzZWMuaGVhZGVycy5mb3JFYWNoKChoLCBpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYyA9IGhlYWRlclJvdy5nZXRDZWxsKGkgKyAxKTtcclxuICAgICAgICBjLnZhbHVlID0gaDtcclxuICAgICAgICBjLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgICAgICBjLmFsaWdubWVudCA9IHsgdmVydGljYWw6ICdtaWRkbGUnLCBob3Jpem9udGFsOiAnY2VudGVyJyB9O1xyXG4gICAgICAgIGMuZmlsbCA9IHsgdHlwZTogJ3BhdHRlcm4nLCBwYXR0ZXJuOiAnc29saWQnLCBmZ0NvbG9yOiB7IGFyZ2I6ICdEOUQ5RDknIH0gfTtcclxuICAgICAgICBjLmJvcmRlciA9IHsgdG9wOiB7IHN0eWxlOiAndGhpbicgfSwgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSwgbGVmdDogeyBzdHlsZTogJ3RoaW4nIH0sIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfSB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGRhdGFTdGFydCA9IHI7XHJcblxyXG4gICAgICBzZWMucm93cy5mb3JFYWNoKHJvd0RhdGEgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHdzLmdldFJvdyhyKyspO1xyXG4gICAgICAgIHJvd0RhdGEuZm9yRWFjaCgodiwgaSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgYyA9IHJvdy5nZXRDZWxsKGkgKyAxKTtcclxuICAgICAgICAgIGlmIChzZWMuaGVhZGVyc1tpXSA9PT0gJ0Ftb3VudCBJbiBTZXR0bG1lbnQgQ2N5JyB8fCBzZWMuaGVhZGVyc1tpXSA9PT0gJ0Ftb3VudCBJbiBVU0QnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bSA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IE51bWJlcih2LnJlcGxhY2UoL1ssIF0rL2csICcnKSkgOiBOdW1iZXIodik7XHJcbiAgICAgICAgICAgIGMudmFsdWUgPSBpc05hTihudW0pID8gKHYgPz8gJycpIDogbnVtO1xyXG4gICAgICAgICAgICBjLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JyB9O1xyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGMubnVtRm10ID0gJzAuMDAwJztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGMudmFsdWUgPSB2ID8/ICcnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYy5ib3JkZXIgPSB7IHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LCByaWdodDogeyBzdHlsZTogJ3RoaW4nIH0gfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBjb2wgPSAxOyBjb2wgPD0gc2VjLmhlYWRlcnMubGVuZ3RoOyBjb2wrKykge1xyXG4gICAgICAgIGxldCBtYXggPSAoc2VjLmhlYWRlcnNbY29sIC0gMV0gfHwgJycpLnRvU3RyaW5nKCkubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IHJyID0gZGF0YVN0YXJ0IC0gMTsgcnIgPCByOyBycisrKSB7XHJcbiAgICAgICAgICBjb25zdCB2YWwgPSAod3MuZ2V0Um93KHJyKS5nZXRDZWxsKGNvbCkudmFsdWUgPz8gJycpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICBpZiAodmFsKSBtYXggPSBNYXRoLm1heChtYXgsIHZhbC5sZW5ndGggKyAyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd3MuZ2V0Q29sdW1uKGNvbCkud2lkdGggPSBNYXRoLm1pbihNYXRoLm1heChtYXgsIDgpLCA2MCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgc2VjdGlvbnMuZm9yRWFjaCgoc2VjLCBpZHgpID0+IHtcclxuICAgICAgd3JpdGVTZWN0aW9uKHNlYyk7XHJcbiAgICAgIGlmIChpZHggPCBzZWN0aW9ucy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgcisrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0b3RhbENvbHMgPSBzZWN0aW9ucy5sZW5ndGhcclxuICAgICAgPyBNYXRoLm1heCguLi5zZWN0aW9ucy5tYXAocyA9PiBzLmhlYWRlcnMubGVuZ3RoKSlcclxuICAgICAgOiB0aGlzLmNvbHVtbkRlZnMubGVuZ3RoO1xyXG4gICAgY29uc3QgY29scyA9IE1hdGgubWF4KHRvdGFsQ29scywgNCk7XHJcbiAgICBjb25zdCBsYWJlbENvbHNFbmQgPSAyO1xyXG4gICAgY29uc3Qgc2V0dGxlQ29sID0gMztcclxuICAgIGNvbnN0IHVzZENvbCA9IDQ7XHJcblxyXG4gICAgY29uc3Qgcm93MSA9IHdzLmdldFJvdyhyKyspO1xyXG4gICAgd3MubWVyZ2VDZWxscyhyb3cxLm51bWJlciwgMSwgcm93MS5udW1iZXIsIGxhYmVsQ29sc0VuZCk7XHJcbiAgICByb3cxLmdldENlbGwoMSkudmFsdWUgPSAnQ2xvc2luZyBCYWxhbmNlJztcclxuICAgIHJvdzEuZ2V0Q2VsbCgxKS5mb250ID0geyBib2xkOiB0cnVlIH07XHJcbiAgICByb3cxLmdldENlbGwoMSkuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG5cclxuICAgIGNvbnN0IHNldHRsZVZhbHVlID0gTnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2VJblNldHRsbWVudCA/PyAwKTtcclxuICAgIGNvbnN0IHVzZFZhbHVlID0gTnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2UgPz8gMCk7XHJcblxyXG4gICAgY29uc3Qgc2V0dGxlQ2VsbCA9IHJvdzEuZ2V0Q2VsbChzZXR0bGVDb2wpO1xyXG4gICAgc2V0dGxlQ2VsbC52YWx1ZSA9IGlzTmFOKHNldHRsZVZhbHVlKSA/ICcnIDogc2V0dGxlVmFsdWU7XHJcbiAgICBzZXR0bGVDZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JyB9O1xyXG4gICAgaWYgKCFpc05hTihzZXR0bGVWYWx1ZSkpIHNldHRsZUNlbGwubnVtRm10ID0gJzAuMDAwJztcclxuXHJcbiAgICBjb25zdCB1c2RDZWxsID0gcm93MS5nZXRDZWxsKHVzZENvbCk7XHJcbiAgICB1c2RDZWxsLnZhbHVlID0gaXNOYU4odXNkVmFsdWUpID8gJycgOiB1c2RWYWx1ZTtcclxuICAgIHVzZENlbGwuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAncmlnaHQnIH07XHJcbiAgICBpZiAoIWlzTmFOKHVzZFZhbHVlKSkgdXNkQ2VsbC5udW1GbXQgPSAnMC4wMDAnO1xyXG5cclxuICAgIGZvciAobGV0IGMgPSAxOyBjIDw9IGNvbHM7IGMrKykge1xyXG4gICAgICByb3cxLmdldENlbGwoYykuYm9yZGVyID0ge1xyXG4gICAgICAgIHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICByaWdodDogeyBzdHlsZTogJ3RoaW4nIH1cclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByb3cyID0gd3MuZ2V0Um93KHIrKyk7XHJcbiAgICB3cy5tZXJnZUNlbGxzKHJvdzIubnVtYmVyLCAxLCByb3cyLm51bWJlciwgY29scyk7XHJcbiAgICByb3cyLmdldENlbGwoMSkudmFsdWUgPSBgJHt0aGlzLmNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Q3VycmVuY3kgfHwgJyd9IC0gJHt0aGlzLmNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3JkcyB8fCAnJ31gO1xyXG4gICAgcm93Mi5nZXRDZWxsKDEpLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ2xlZnQnLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgIHJvdzIuZ2V0Q2VsbCgxKS5mb250ID0geyBpdGFsaWM6IGZhbHNlIH07XHJcblxyXG4gICAgZm9yIChsZXQgYyA9IDE7IGMgPD0gY29sczsgYysrKSB7XHJcbiAgICAgIGNvbnN0IGVkZ2U6IGFueSA9IHsgdG9wOiB7IHN0eWxlOiAndGhpbicgfSwgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSB9O1xyXG4gICAgICBpZiAoYyA9PT0gMSkgZWRnZS5sZWZ0ID0geyBzdHlsZTogJ3RoaW4nIH07XHJcbiAgICAgIGlmIChjID09PSBjb2xzKSBlZGdlLnJpZ2h0ID0geyBzdHlsZTogJ3RoaW4nIH07XHJcbiAgICAgIHJvdzIuZ2V0Q2VsbChjKS5ib3JkZXIgPSBlZGdlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvdzMgPSB3cy5nZXRSb3cocisrKTtcclxuICAgIHdzLm1lcmdlQ2VsbHMocm93My5udW1iZXIsIDEsIHJvdzMubnVtYmVyLCBjb2xzKTtcclxuICAgIHJvdzMuZ2V0Q2VsbCgxKS52YWx1ZSA9IGAke3RoaXMuY2xvc2luZ0JhbGFuY2VDdXJyZW5jeSB8fCAnJ30gLSAke3RoaXMuY2xvc2luZ0JhbGFuY2VVU0RJbldvcmRzIHx8ICcnfWA7XHJcbiAgICByb3czLmdldENlbGwoMSkuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG5cclxuICAgIGZvciAobGV0IGMgPSAxOyBjIDw9IGNvbHM7IGMrKykge1xyXG4gICAgICBjb25zdCBlZGdlOiBhbnkgPSB7IHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0gfTtcclxuICAgICAgaWYgKGMgPT09IDEpIGVkZ2UubGVmdCA9IHsgc3R5bGU6ICd0aGluJyB9O1xyXG4gICAgICBpZiAoYyA9PT0gY29scykgZWRnZS5yaWdodCA9IHsgc3R5bGU6ICd0aGluJyB9O1xyXG4gICAgICByb3czLmdldENlbGwoYykuYm9yZGVyID0gZWRnZTtcclxuICAgIH1cclxuXHJcbiAgICB3Yi54bHN4LndyaXRlQnVmZmVyKCkudGhlbihidWYgPT4ge1xyXG4gICAgICBGaWxlU2F2ZXIuc2F2ZUFzKFxyXG4gICAgICAgIG5ldyBCbG9iKFtidWZdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcgfSksXHJcbiAgICAgICAgJ1N0YXRlbWVudF9vZl9BY2NvdW50cy54bHN4J1xyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBleHBvcnRUb0NTVigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlY3Rpb25zID0gdGhpcy5nZXRWaXNpYmxlR3JpZHMoKVxyXG4gICAgICAubWFwKHMgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERpc3BsYXllZERhdGEocy5hcGkpO1xyXG4gICAgICAgIGxldCByb3dzID0gdGhpcy5idWlsZFJvd3MoZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChzLnRpdGxlID09PSAnU2VuZCBEZXRhaWxzJyAmJiB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3c/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cyA9IHJvd3MuY29uY2F0KHRoaXMuYnVpbGRSb3dzKHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocy50aXRsZSA9PT0gJ1JlY2VpdmUgRGV0YWlscycgJiYgdGhpcy5yZWNlaXZlUGlubmVkQm90dG9tUm93Py5sZW5ndGgpIHtcclxuICAgICAgICAgIHJvd3MgPSByb3dzLmNvbmNhdCh0aGlzLmJ1aWxkUm93cyh0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByb3dzLmxlbmd0aCA/IHsgdGl0bGU6IHMudGl0bGUsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLCByb3dzIH0gOiBudWxsO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHsgdGl0bGU6IHN0cmluZzsgaGVhZGVyczogc3RyaW5nW107IHJvd3M6IGFueVtdW10gfVtdO1xyXG5cclxuICAgIGlmICghc2VjdGlvbnMubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsaW5lcy5wdXNoKHRoaXMuUmVwb3J0TmFtZSk7XHJcblxyXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5tZXRhRGF0YU9uZSB8fCB7fSkuZm9yRWFjaCgoW2ssIHZdKSA9PiBsaW5lcy5wdXNoKGAke2t9OiAke3YgPz8gJyd9YCkpO1xyXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5tZXRhRGF0YVR3byB8fCB7fSkuZm9yRWFjaCgoW2ssIHZdKSA9PiBsaW5lcy5wdXNoKGAke2t9OiAke3YgPz8gJyd9YCkpO1xyXG5cclxuICAgIC8vIC0tLSBTRUFSQ0ggQ1JJVEVSSUEgQkxPQ0sgLS0tXHJcbiAgICBjb25zdCBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdID0gdGhpcy5zZWFyY2hDcml0ZXJpYSB8fCBbXTtcclxuXHJcbiAgICBpZiAoc2VhcmNoQ3JpdGVyaWE/Lmxlbmd0aCkge1xyXG4gICAgICBsaW5lcy5wdXNoKCcnKTtcclxuICAgICAgbGluZXMucHVzaCgnU2VhcmNoIENyaXRlcmlhOi0nKTtcclxuXHJcbiAgICAgIC8vIERldGVybWluZSBtYXggbGVuZ3RoIG9mIGxlZnQgY29sdW1uIGZvciBwYWRkaW5nXHJcbiAgICAgIGNvbnN0IG1heExlZnRMZW5ndGggPSBNYXRoLm1heCguLi5zZWFyY2hDcml0ZXJpYS5tYXAoKFtrLCB2XSkgPT4gKGsgKyAnICcgKyB2KS5sZW5ndGgpKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoQ3JpdGVyaWEubGVuZ3RoOyBpICs9IDIpIHtcclxuICAgICAgICBjb25zdCBsZWZ0ID0gc2VhcmNoQ3JpdGVyaWFbaV07XHJcbiAgICAgICAgY29uc3QgcmlnaHQgPSBzZWFyY2hDcml0ZXJpYVtpICsgMV07XHJcblxyXG4gICAgICAgIGNvbnN0IGxlZnRUZXh0ID0gbGVmdCA/IGAke2xlZnRbMF19ICR7bGVmdFsxXX1gLnBhZEVuZChtYXhMZWZ0TGVuZ3RoICsgNSwgJyAnKSA6ICcnO1xyXG4gICAgICAgIGNvbnN0IHJpZ2h0VGV4dCA9IHJpZ2h0ID8gYCR7cmlnaHRbMF19ICR7cmlnaHRbMV19YCA6ICcnO1xyXG5cclxuICAgICAgICAvLyBFYWNoIHBhaXIgc3RheXMgaW4gaXRzIG93biBjb2x1bW5cclxuICAgICAgICBsaW5lcy5wdXNoKGBcIiR7bGVmdFRleHR9JHtyaWdodFRleHR9XCJgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGluZXMucHVzaCgnJyk7IC8vIGJsYW5rIGxpbmUgYWZ0ZXIgc2VhcmNoIGNyaXRlcmlhXHJcbiAgICB9XHJcblxyXG4gICAgc2VjdGlvbnMuZm9yRWFjaCgoc2VjLCBpZHgpID0+IHtcclxuICAgICAgbGluZXMucHVzaChzZWMudGl0bGUpO1xyXG4gICAgICBsaW5lcy5wdXNoKHNlYy5oZWFkZXJzLmpvaW4oJywnKSk7XHJcbiAgICAgIHNlYy5yb3dzLmZvckVhY2gociA9PiBsaW5lcy5wdXNoKHIubWFwKHYgPT4gYFwiJHt2ID8/ICcnfVwiYCkuam9pbignLCcpKSk7XHJcblxyXG4gICAgICBpZiAoaWR4IDwgc2VjdGlvbnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBsaW5lcy5wdXNoKFxyXG4gICAgICBgXCJDbG9zaW5nIEJhbGFuY2VcIiwsXCIke051bWJlcih0aGlzLmNsb3NpbmdCYWxhbmNlSW5TZXR0bG1lbnQgfHwgMCkudG9GaXhlZCgzKX1cIixcIiR7TnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2UgfHwgMCkudG9GaXhlZCgzKX1cImBcclxuICAgICk7XHJcblxyXG4gICAgbGluZXMucHVzaChgXCIke3RoaXMuY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRDdXJyZW5jeSB8fCAnJ30gLSAke3RoaXMuY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRJbldvcmRzIHx8ICcnfVwiYCk7XHJcblxyXG4gICAgbGluZXMucHVzaChgXCIke3RoaXMuY2xvc2luZ0JhbGFuY2VDdXJyZW5jeSB8fCAnJ30gLSAke3RoaXMuY2xvc2luZ0JhbGFuY2VVU0RJbldvcmRzIHx8ICcnfVwiYCk7XHJcblxyXG4gICAgY29uc3QgY3N2ID0gbGluZXMuam9pbignXFxuJyk7XHJcbiAgICBGaWxlU2F2ZXIuc2F2ZUFzKFxyXG4gICAgICBuZXcgQmxvYihbY3N2XSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtOCcgfSksXHJcbiAgICAgICdTdGF0ZW1lbnRfb2ZfQWNjb3VudHMuY3N2J1xyXG4gICAgKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGxvYWRJbWFnZUFzQmFzZTY0KHNyYzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcclxuICAgICAgaW1nLnNyYyA9IHNyYztcclxuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgaWYgKCFjdHgpIHJldHVybiByZWplY3QoJ0NhbnZhcyBjb250ZXh0IGZhaWxlZCcpO1xyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcclxuICAgICAgICByZXNvbHZlKGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpKTtcclxuICAgICAgfTtcclxuICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoJ0ZhaWxlZCB0byBsb2FkIGltYWdlOiAnICsgc3JjKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREaXNwbGF5ZWREYXRhKGFwaT86IEdyaWRBcGkpOiBhbnlbXSB7XHJcbiAgICBpZiAoIWFwaSkgcmV0dXJuIFtdO1xyXG4gICAgY29uc3Qgcm93czogYW55W10gPSBbXTtcclxuICAgIGNvbnN0IGNvdW50ID0gYXBpLmdldERpc3BsYXllZFJvd0NvdW50KCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgY29uc3Qgbm9kZSA9IGFwaS5nZXREaXNwbGF5ZWRSb3dBdEluZGV4KGkpO1xyXG4gICAgICBpZiAobm9kZSAmJiAhbm9kZS5ncm91cCAmJiAhbm9kZS5yb3dQaW5uZWQpIHJvd3MucHVzaChub2RlLmRhdGEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvd3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEhlYWRlcnMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uRGVmcy5tYXAoYyA9PiBjLmhlYWRlck5hbWUgfHwgYy5maWVsZCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZm9ybWF0MyhuOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKG4gPT0gbnVsbCB8fCBuID09PSAnJykgcmV0dXJuICcnO1xyXG4gICAgY29uc3QgbnVtID0gTnVtYmVyKG4pO1xyXG4gICAgcmV0dXJuIG51bS50b0ZpeGVkKDMpO1xyXG4gIH1cclxuICBwcml2YXRlIGJ1aWxkUm93cyhkYXRhOiBhbnlbXSk6IGFueVtdW10ge1xyXG4gICAgcmV0dXJuIGRhdGEubWFwKHJvdyA9PlxyXG4gICAgICB0aGlzLmNvbHVtbkRlZnMubWFwKGNvbCA9PiB7XHJcbiAgICAgICAgY29uc3QgZiA9IGNvbC5maWVsZDtcclxuICAgICAgICBpZiAoZiA9PT0gJ2Ftb3VudEluU2V0dGxtZW50Q2N5JyB8fCBmID09PSAnYW1vdW50SW5VU0QnKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQzKHJvd1tmXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByb3dbZl0gPz8gJyc7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWaXNpYmxlR3JpZHMoKTogeyB0aXRsZTogc3RyaW5nOyBhcGk/OiBHcmlkQXBpIH1bXSB7XHJcbiAgICBjb25zdCBvdXQ6IHsgdGl0bGU6IHN0cmluZzsgYXBpPzogR3JpZEFwaSB9W10gPSBbXTtcclxuICAgIG91dC5wdXNoKHsgdGl0bGU6ICcnLCBhcGk6IHRoaXMub3BlbmluZ0dyaWRBcGkgfSk7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZENsaWVudFR5cGUgPT09ICdQYXlJbicgfHwgdGhpcy5zZWxlY3RlZENsaWVudFR5cGUgPT09ICdCb3RoJykge1xyXG4gICAgICBvdXQucHVzaCh7IHRpdGxlOiAnU2VuZCBEZXRhaWxzJywgYXBpOiB0aGlzLnNlbmRHcmlkQXBpIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDbGllbnRUeXBlID09PSAnUGF5T3V0JyB8fCB0aGlzLnNlbGVjdGVkQ2xpZW50VHlwZSA9PT0gJ0JvdGgnKSB7XHJcbiAgICAgIG91dC5wdXNoKHsgdGl0bGU6ICdSZWNlaXZlIERldGFpbHMnLCBhcGk6IHRoaXMucmVjZWl2ZUdyaWRBcGkgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3V0O1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRm9ybVZhbGlkKGlzVmFsaWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNGb3JtVmFsaWQgPSBpc1ZhbGlkO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGxpYi1zZWFyY2gtZmlsdGVyIFxyXG4gIFtSZXBvcnROYW1lXT1cIlJlcG9ydE5hbWVcIiBcclxuICAoc2VhcmNoQ2xpY2tlZCk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiXHJcbiAgKGZvcm1WYWxpZCk9XCJoYW5kbGVGb3JtVmFsaWQoJGV2ZW50KVwiXHJcbiAgPlxyXG48L2xpYi1zZWFyY2gtZmlsdGVyPlxyXG5cclxuPGFwcC1sb2FkZXIgKm5nSWY9XCJsb2FkaW5nU3RhdGUgPT09IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Mb2FkaW5nXCI+PC9hcHAtbG9hZGVyPlxyXG48c3BhbiAqbmdJZj1cImxvYWRpbmdTdGF0ZSA9PT0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkVycm9yXCI+e3sgZXJyb3JNZXNzYWdlIH19PC9zcGFuPlxyXG48ZGl2ICpuZ0lmPVwic2hvd1RhYmxlcyAmJiBpc0Zvcm1WYWxpZFwiPlxyXG48bGliLW1ldGFkYXRhIFxyXG4gICAgW3JlcG9ydE5hbWVdPVwiUmVwb3J0TmFtZVwiIFxyXG4gICAgW3Nob3dtZXRhRGF0YU9uZV09XCJ0cnVlXCIgXHJcbiAgICBbc2hvd21ldGFEYXRhVHdvXT1cInRydWVcIiBcclxuICAgIFttZXRhRGF0YU9uZV09XCJtZXRhRGF0YU9uZVwiXHJcbiAgICBbbWV0YURhdGFUd29dPVwibWV0YURhdGFUd29cIiBcclxuICAgIChleHBvcnRFdmVudCk9XCJoYW5kbGVFeHBvcnQoJGV2ZW50KVwiIFxyXG4gICAgKHNlYXJjaEV2ZW50KT1cImZpbHRlcigkZXZlbnQpXCI+XHJcbiAgPC9saWItbWV0YWRhdGE+XHJcblxyXG48YWctZ3JpZC1hbmd1bGFyXHJcbiAgY2xhc3M9XCJhZy10aGVtZS1hbHBpbmUgdHJhbnNhY3Rpb24tZ3JpZFwiXHJcbiAgW3Jvd0RhdGFdPVwib3BlbmluZ0JhbEFuZEZ1bmRpbmdcIlxyXG4gIFtjb2x1bW5EZWZzXT1cImNvbHVtbkRlZnNcIlxyXG4gIFtwaW5uZWRCb3R0b21Sb3dEYXRhXT1cIltdXCJcclxuICBbaGVhZGVySGVpZ2h0XT1cIjMyXCIgXHJcbiAgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiXHJcbiAgW3Jvd0hlaWdodF09XCIyOFwiXHJcbiAgKGdyaWRSZWFkeSk9XCJvbk9wZW5pbmdHcmlkUmVhZHkoJGV2ZW50KVwiXHJcbiAgc3R5bGU9XCJ3aWR0aDogODAlOyBoZWlnaHQ6IDkxcHg7IG1hcmdpbjogMCBhdXRvOyBkaXNwbGF5OiBibG9jaztcIj5cclxuPC9hZy1ncmlkLWFuZ3VsYXI+XHJcblxyXG48ZGl2ICpuZ0lmPVwiKHNlbGVjdGVkQ2xpZW50VHlwZSA9PT0gJ1BheUluJyB8fCBzZWxlY3RlZENsaWVudFR5cGUgPT09ICdCb3RoJylcIj5cclxuPGgzIGNsYXNzPVwiZGV0YWlscy10YWJsZVwiPjxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDNweDtcIj5TZW5kIERldGFpbHM8L3NwYW4+PC9oMz5cclxuPGFnLWdyaWQtYW5ndWxhclxyXG4gIGNsYXNzPVwiYWctdGhlbWUtYWxwaW5lIHRyYW5zYWN0aW9uLWdyaWRcIlxyXG4gIFtyb3dEYXRhXT1cInNlbmREZXRhaWxzXCJcclxuICBbY29sdW1uRGVmc109XCJjb2x1bW5EZWZzXCJcclxuICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCJcclxuICBbcm93SGVpZ2h0XT1cIjI4XCJcclxuICBbaGVhZGVySGVpZ2h0XT1cIjMyXCIgXHJcbiAgW3Bpbm5lZEJvdHRvbVJvd0RhdGFdPVwic2VuZFBpbm5lZEJvdHRvbVJvd1wiXHJcbiAgKGdyaWRSZWFkeSk9XCJvblNlbmRHcmlkUmVhZHkoJGV2ZW50KVwiIFxyXG4gIHN0eWxlPVwid2lkdGg6IDgwJTsgaGVpZ2h0OiAyMDRweDsgbWFyZ2luOiAwIGF1dG87IGRpc3BsYXk6IGJsb2NrO1wiPlxyXG48L2FnLWdyaWQtYW5ndWxhcj5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwiKHNlbGVjdGVkQ2xpZW50VHlwZSA9PT0gJ1BheU91dCcgfHwgc2VsZWN0ZWRDbGllbnRUeXBlID09PSAnQm90aCcpXCI+XHJcbjxoMyBjbGFzcz1cImRldGFpbHMtdGFibGVcIj48c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAzcHg7XCI+UmVjZWl2ZSBEZXRhaWxzPC9zcGFuPjwvaDM+XHJcbjxhZy1ncmlkLWFuZ3VsYXJcclxuICBjbGFzcz1cImFnLXRoZW1lLWFscGluZSB0cmFuc2FjdGlvbi1ncmlkXCJcclxuICBbcm93RGF0YV09XCJyZWNlaXZlRGV0YWlsc1wiXHJcbiAgW2NvbHVtbkRlZnNdPVwiY29sdW1uRGVmc1wiXHJcbiAgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiXHJcbiAgW3Jvd0hlaWdodF09XCIyOFwiXHJcbiAgW2hlYWRlckhlaWdodF09XCIzMlwiIFxyXG4gIFtwaW5uZWRCb3R0b21Sb3dEYXRhXT1cInJlY2VpdmVQaW5uZWRCb3R0b21Sb3dcIlxyXG4gIChncmlkUmVhZHkpPVwib25SZWNlaXZlR3JpZFJlYWR5KCRldmVudClcIiBcclxuICBzdHlsZT1cIndpZHRoOiA4MCU7IGhlaWdodDogMjA0cHg7IG1hcmdpbjogMCBhdXRvOyBkaXNwbGF5OiBibG9jaztcIj5cclxuPC9hZy1ncmlkLWFuZ3VsYXI+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjwhLS0gQ2xvc2luZyBiYWxhbmNlIHJvdyAtLT5cclxuPGRpdiBjbGFzcz1cImNsb3NpbmctYmFsYW5jZS1yb3dcIj5cclxuICA8ZGl2IGNsYXNzPVwibGFiZWxcIiB0aXRsZT1cIkNsb3NpbmcgQmFsYW5jZVwiPlxyXG4gICAgQ2xvc2luZyBCYWxhbmNlXHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJzZXR0bGVtZW50XCIgXHJcbiAgICAgICBbdGl0bGVdPVwiY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRGb3JtYXR0ZWRcIj5cclxuICAgIHt7IGNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Rm9ybWF0dGVkIH19XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJ2YWx1ZVwiIFt0aXRsZV09XCJjbG9zaW5nQmFsYW5jZUluVXNkRm9ybWF0dGVkXCI+XHJcbiAgICB7eyBjbG9zaW5nQmFsYW5jZUluVXNkRm9ybWF0dGVkIH19XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjwhLS0gc2V0dGxlbWVudCBjdXJyZW5jeSB3b3JkcyByb3cgLS0+XHJcbjxkaXYgY2xhc3M9XCJjbG9zaW5nLWJhbGFuY2Utcm93IGNsb3NpbmctYmFsYW5jZS13b3Jkc1wiXHJcbiAgICAgKm5nSWY9XCJjbG9zaW5nQmFsYW5jZVNldHRsbWVudEluV29yZHNcIj5cclxuICA8ZGl2IGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgW3RpdGxlXT1cImNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Q3VycmVuY3kgKyAnIC0gJyArIGNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3Jkc1wiPlxyXG4gICAge3sgY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRDdXJyZW5jeSB9fSAtIHt7IGNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3JkcyB9fVxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gZXhpc3RpbmcgVVNEIHdvcmRzIHJvdyAoa2VlcCBhcy1pcykgLS0+XHJcbjxkaXYgY2xhc3M9XCJjbG9zaW5nLWJhbGFuY2Utcm93IGNsb3NpbmctYmFsYW5jZS13b3Jkc1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJsYWJlbFwiIFt0aXRsZV09XCJjbG9zaW5nQmFsYW5jZUN1cnJlbmN5ICsgJyAtICcgKyBjbG9zaW5nQmFsYW5jZVVTREluV29yZHNcIj5cclxuICAgIHt7IGNsb3NpbmdCYWxhbmNlQ3VycmVuY3kgfX0gLSB7eyBjbG9zaW5nQmFsYW5jZVVTREluV29yZHMgfX1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==