@sachin9822/reports-lib 0.0.213 → 0.0.214

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/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +240 -0
  2. package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +596 -0
  3. package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +218 -0
  4. package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +243 -0
  5. package/esm2020/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.mjs +700 -0
  6. package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +255 -0
  7. package/esm2020/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.mjs +192 -0
  8. package/esm2020/lib/components/funding-report/funding-report.component.mjs +198 -0
  9. package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +244 -0
  10. package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +776 -0
  11. package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +266 -0
  12. package/esm2020/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.mjs +311 -0
  13. package/esm2020/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.mjs +658 -0
  14. package/esm2020/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.mjs +2 -0
  15. package/esm2020/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.mjs +2 -0
  16. package/esm2020/lib/models/accounting-report/accounting-report-branch-group.mjs +2 -0
  17. package/esm2020/lib/models/accounting-report/accounting-report-entry-model.mjs +2 -0
  18. package/esm2020/lib/models/accounting-report/accounting-report-model.mjs +2 -0
  19. package/esm2020/lib/models/accounting-report/accounting-report-sub-group.mjs +2 -0
  20. package/esm2020/lib/models/app-config.model.mjs +2 -0
  21. package/esm2020/lib/models/branch-activity-receive-report/branch-activity-receive.model.mjs +2 -0
  22. package/esm2020/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.mjs +6 -0
  23. package/esm2020/lib/models/branch-activity-report/branch-activity-send-report.mjs +3 -0
  24. package/esm2020/lib/models/cancellation-transaction-report/cancellation-transaction.model.mjs +10 -0
  25. package/esm2020/lib/models/component-loading-states.mjs +7 -0
  26. package/esm2020/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.mjs +5 -0
  27. package/esm2020/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.mjs +2 -0
  28. package/esm2020/lib/models/statement-of-account-report/statement-of-accounts.model.mjs +2 -0
  29. package/esm2020/lib/models/transaction-enquiry-report/transaction-enquiry.model.mjs +8 -0
  30. package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.mjs +6 -0
  31. package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report.mjs +5 -0
  32. package/esm2020/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.mjs +3 -0
  33. package/esm2020/lib/reports-lib-routing.module.mjs +24 -0
  34. package/esm2020/lib/reports-lib.component.mjs +22 -0
  35. package/esm2020/lib/reports-lib.module.mjs +172 -0
  36. package/esm2020/lib/reports-lib.service.mjs +14 -0
  37. package/esm2020/lib/services/config.service.mjs +39 -0
  38. package/esm2020/lib/services/report.service.mjs +374 -0
  39. package/esm2020/lib/shared/export-generic.service.mjs +443 -0
  40. package/esm2020/lib/shared/export.service.mjs +379 -0
  41. package/esm2020/lib/shared/loader/loader.component.mjs +11 -0
  42. package/esm2020/lib/shared/metadata/metadata.component.mjs +51 -0
  43. package/esm2020/lib/shared/page-size-selector/page-size-selector.component.mjs +44 -0
  44. package/esm2020/lib/shared/search-filter/search-filter.component.mjs +2134 -0
  45. package/esm2020/lib/shared/shared.module.mjs +21 -0
  46. package/esm2020/public-api.mjs +41 -0
  47. package/esm2020/sachin9822-reports-lib.mjs +5 -0
  48. package/fesm2015/sachin9822-reports-lib.mjs +8429 -0
  49. package/fesm2015/sachin9822-reports-lib.mjs.map +1 -0
  50. package/fesm2020/sachin9822-reports-lib.mjs +8411 -0
  51. package/fesm2020/sachin9822-reports-lib.mjs.map +1 -0
  52. package/index.d.ts +5 -0
  53. package/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.d.ts +70 -0
  54. package/lib/components/accounting-report/accounting-report.component.d.ts +76 -0
  55. package/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.d.ts +58 -0
  56. package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +69 -0
  57. package/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.d.ts +78 -0
  58. package/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.d.ts +95 -0
  59. package/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.d.ts +55 -0
  60. package/lib/components/funding-report/funding-report.component.d.ts +55 -0
  61. package/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.d.ts +57 -0
  62. package/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.d.ts +109 -0
  63. package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +76 -0
  64. package/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.d.ts +68 -0
  65. package/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.d.ts +72 -0
  66. package/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.d.ts +8 -0
  67. package/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.d.ts +18 -0
  68. package/lib/models/accounting-report/accounting-report-branch-group.d.ts +6 -0
  69. package/lib/models/accounting-report/accounting-report-entry-model.d.ts +24 -0
  70. package/lib/models/accounting-report/accounting-report-model.d.ts +6 -0
  71. package/{src/lib/models/accounting-report/accounting-report-sub-group.ts → lib/models/accounting-report/accounting-report-sub-group.d.ts} +2 -3
  72. package/{src/lib/models/app-config.model.ts → lib/models/app-config.model.d.ts} +7 -8
  73. package/lib/models/branch-activity-receive-report/branch-activity-receive.model.d.ts +18 -0
  74. package/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.d.ts +13 -0
  75. package/lib/models/branch-activity-report/branch-activity-send-report.d.ts +24 -0
  76. package/lib/models/cancellation-transaction-report/cancellation-transaction.model.d.ts +44 -0
  77. package/lib/models/component-loading-states.d.ts +5 -0
  78. package/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.d.ts +26 -0
  79. package/{src/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.ts → lib/models/revenue-per-transaction-report/revenue-per-transaction.model.d.ts} +1 -1
  80. package/lib/models/statement-of-account-report/statement-of-accounts.model.d.ts +18 -0
  81. package/lib/models/transaction-enquiry-report/transaction-enquiry.model.d.ts +113 -0
  82. package/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.d.ts +13 -0
  83. package/lib/models/transaction-monitoring-report/transaction-monitoring-report.d.ts +23 -0
  84. package/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.d.ts +39 -0
  85. package/lib/reports-lib-routing.module.d.ts +7 -0
  86. package/lib/reports-lib.component.d.ts +8 -0
  87. package/lib/reports-lib.module.d.ts +33 -0
  88. package/lib/reports-lib.service.d.ts +6 -0
  89. package/lib/services/config.service.d.ts +20 -0
  90. package/lib/services/report.service.d.ts +80 -0
  91. package/lib/shared/export-generic.service.d.ts +50 -0
  92. package/lib/shared/export.service.d.ts +32 -0
  93. package/lib/shared/loader/loader.component.d.ts +5 -0
  94. package/lib/shared/metadata/metadata.component.d.ts +24 -0
  95. package/lib/shared/page-size-selector/page-size-selector.component.d.ts +15 -0
  96. package/lib/shared/search-filter/search-filter.component.d.ts +127 -0
  97. package/lib/shared/shared.module.d.ts +11 -0
  98. package/package.json +31 -16
  99. package/{src/public-api.ts → public-api.d.ts} +7 -17
  100. package/karma.conf.js +0 -44
  101. package/ng-package.json +0 -17
  102. package/src/assets/images/BreadcrumbArrow.png +0 -0
  103. package/src/assets/images/XMCoral.png +0 -0
  104. package/src/lib/assets/images/Search.svg +0 -10
  105. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.html +0 -27
  106. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.scss +0 -46
  107. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.spec.ts +0 -23
  108. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.ts +0 -292
  109. package/src/lib/components/accounting-report/accounting-report.component.html +0 -64
  110. package/src/lib/components/accounting-report/accounting-report.component.scss +0 -24
  111. package/src/lib/components/accounting-report/accounting-report.component.spec.ts +0 -23
  112. package/src/lib/components/accounting-report/accounting-report.component.ts +0 -738
  113. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.html +0 -46
  114. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.scss +0 -2
  115. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.spec.ts +0 -23
  116. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.ts +0 -247
  117. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.html +0 -46
  118. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.scss +0 -3
  119. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.spec.ts +0 -23
  120. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.ts +0 -276
  121. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.html +0 -51
  122. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.scss +0 -7
  123. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.spec.ts +0 -23
  124. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.ts +0 -840
  125. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.html +0 -68
  126. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.scss +0 -65
  127. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.spec.ts +0 -23
  128. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.ts +0 -290
  129. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.html +0 -25
  130. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.scss +0 -1
  131. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.spec.ts +0 -23
  132. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.ts +0 -213
  133. package/src/lib/components/funding-report/funding-report.component.html +0 -49
  134. package/src/lib/components/funding-report/funding-report.component.scss +0 -1
  135. package/src/lib/components/funding-report/funding-report.component.spec.ts +0 -23
  136. package/src/lib/components/funding-report/funding-report.component.ts +0 -221
  137. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.html +0 -26
  138. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.scss +0 -1
  139. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.spec.ts +0 -23
  140. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.ts +0 -267
  141. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.html +0 -95
  142. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.scss +0 -54
  143. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.spec.ts +0 -23
  144. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.ts +0 -904
  145. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.html +0 -49
  146. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.scss +0 -2
  147. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.spec.ts +0 -32
  148. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.ts +0 -304
  149. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.html +0 -46
  150. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.scss +0 -7
  151. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.ts +0 -343
  152. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.html +0 -25
  153. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.scss +0 -23
  154. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.spec.ts +0 -23
  155. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.ts +0 -745
  156. package/src/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.ts +0 -10
  157. package/src/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.ts +0 -20
  158. package/src/lib/models/accounting-report/accounting-report-branch-group.ts +0 -7
  159. package/src/lib/models/accounting-report/accounting-report-entry-model.ts +0 -25
  160. package/src/lib/models/accounting-report/accounting-report-model.ts +0 -7
  161. package/src/lib/models/branch-activity-receive-report/branch-activity-receive.model.ts +0 -18
  162. package/src/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.ts +0 -16
  163. package/src/lib/models/branch-activity-report/branch-activity-send-report.ts +0 -26
  164. package/src/lib/models/cancellation-transaction-report/cancellation-transaction.model.ts +0 -65
  165. package/src/lib/models/component-loading-states.ts +0 -5
  166. package/src/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.ts +0 -28
  167. package/src/lib/models/statement-of-account-report/statement-of-accounts.model.ts +0 -21
  168. package/src/lib/models/transaction-enquiry-report/transaction-enquiry.model.ts +0 -127
  169. package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.ts +0 -16
  170. package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report.ts +0 -29
  171. package/src/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.ts +0 -46
  172. package/src/lib/reports-lib-routing.module.ts +0 -20
  173. package/src/lib/reports-lib.component.spec.ts +0 -23
  174. package/src/lib/reports-lib.component.ts +0 -20
  175. package/src/lib/reports-lib.module.ts +0 -102
  176. package/src/lib/reports-lib.service.spec.ts +0 -16
  177. package/src/lib/reports-lib.service.ts +0 -9
  178. package/src/lib/services/config.service.ts +0 -43
  179. package/src/lib/services/report.service.spec.ts +0 -16
  180. package/src/lib/services/report.service.ts +0 -463
  181. package/src/lib/shared/export-generic.service.ts +0 -557
  182. package/src/lib/shared/export.service.spec.ts +0 -16
  183. package/src/lib/shared/export.service.ts +0 -457
  184. package/src/lib/shared/loader/loader.component.html +0 -8
  185. package/src/lib/shared/loader/loader.component.scss +0 -52
  186. package/src/lib/shared/loader/loader.component.ts +0 -10
  187. package/src/lib/shared/metadata/metadata.component.html +0 -42
  188. package/src/lib/shared/metadata/metadata.component.scss +0 -95
  189. package/src/lib/shared/metadata/metadata.component.spec.ts +0 -23
  190. package/src/lib/shared/metadata/metadata.component.ts +0 -38
  191. package/src/lib/shared/page-size-selector/page-size-selector.component.html +0 -7
  192. package/src/lib/shared/page-size-selector/page-size-selector.component.scss +0 -42
  193. package/src/lib/shared/page-size-selector/page-size-selector.component.spec.ts +0 -23
  194. package/src/lib/shared/page-size-selector/page-size-selector.component.ts +0 -38
  195. package/src/lib/shared/search-filter/search-filter.component.html +0 -601
  196. package/src/lib/shared/search-filter/search-filter.component.scss +0 -203
  197. package/src/lib/shared/search-filter/search-filter.component.spec.ts +0 -23
  198. package/src/lib/shared/search-filter/search-filter.component.ts +0 -2387
  199. package/src/lib/shared/shared.module.ts +0 -13
  200. package/src/styles/ag-grid-report-style.scss +0 -71
  201. package/src/styles/common-ag-grid-style.scss +0 -146
  202. package/src/styles/common-report-style.scss +0 -395
  203. package/src/styles/common-style.scss +0 -615
  204. package/src/test.ts +0 -27
  205. package/tsconfig.lib.json +0 -15
  206. package/tsconfig.lib.prod.json +0 -10
  207. package/tsconfig.spec.json +0 -17
  208. /package/{src/lib → lib}/assets/config/app-config.json +0 -0
  209. /package/{src → lib}/assets/images/Search.svg +0 -0
  210. /package/{src/lib → lib}/assets/images/XMLogo.png +0 -0
  211. /package/{src/lib → lib}/assets/svg-loaders/blue-tail-spin.svg +0 -0
@@ -0,0 +1,658 @@
1
+ import { formatDate } from '@angular/common';
2
+ import { Component, HostListener } from '@angular/core';
3
+ import { ComponentLoadingStates } from '../../models/component-loading-states';
4
+ import jsPDF from 'jspdf';
5
+ import 'jspdf-autotable';
6
+ import * as ExcelJS from 'exceljs';
7
+ import * as FileSaver from 'file-saver';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "../../services/report.service";
10
+ import * as i2 from "../../shared/export.service";
11
+ import * as i3 from "ag-grid-angular";
12
+ import * as i4 from "@angular/common";
13
+ import * as i5 from "../../shared/page-size-selector/page-size-selector.component";
14
+ import * as i6 from "../../shared/metadata/metadata.component";
15
+ import * as i7 from "../../shared/loader/loader.component";
16
+ import * as i8 from "../../shared/search-filter/search-filter.component";
17
+ export class TrialBalanceAccountsReportComponent {
18
+ constructor(reportService, exportService) {
19
+ this.reportService = reportService;
20
+ this.exportService = exportService;
21
+ this.ReportName = "Trial Balance - Accounts";
22
+ this.ComponentLoadingState = ComponentLoadingStates;
23
+ this.loadingState = ComponentLoadingStates.Complete;
24
+ this.selectedExportOption = 'excel';
25
+ this.pageSize = 15;
26
+ this.dataReady = false;
27
+ this.accountStatus = '';
28
+ this.currency = '';
29
+ this.dateType = '';
30
+ this.fromDate = '';
31
+ this.toDate = '';
32
+ this.businessUnit = '';
33
+ this.reportUser = '';
34
+ this.reportTime = '';
35
+ this.reportPeriod = '';
36
+ this.isFormValid = false;
37
+ this.defaultColDef = {
38
+ resizable: true,
39
+ sortable: true,
40
+ filter: true,
41
+ suppressSizeToFit: false,
42
+ cellStyle: {
43
+ userSelect: 'text',
44
+ 'line-height': '1.2',
45
+ 'white-space': 'normal',
46
+ 'word-break': 'normal',
47
+ 'overflow-wrap': 'break-word',
48
+ },
49
+ wrapHeaderText: true,
50
+ autoHeaderHeight: true,
51
+ wrapText: true,
52
+ autoHeight: true,
53
+ cellClassRules: {
54
+ 'total-positive': params => params.data?.isTotalRow && params.value >= 0,
55
+ 'total-negative': params => params.data?.isTotalRow && params.value < 0,
56
+ 'positive-value': params => !params.data?.isTotalRow && params.value >= 0,
57
+ 'negative-value': params => !params.data?.isTotalRow && params.value < 0,
58
+ }
59
+ };
60
+ this.rowClassRules = {
61
+ 'total-row': params => params.data?.isTotalRow
62
+ };
63
+ this.columnDefs = [
64
+ { headerName: 'Business Unit', field: 'companyFullName', tooltipField: 'companyFullName', minWidth: 70, maxWidth: 100 },
65
+ { headerName: 'COA Code', field: 'coaCode', tooltipField: 'coaCode', minWidth: 60, maxWidth: 100 },
66
+ { headerName: 'Account Code', field: 'accountCode', tooltipField: 'accountCode', minWidth: 80, maxWidth: 100 },
67
+ { headerName: 'Account Description', field: 'accountDescription', tooltipField: 'accountDescription', minWidth: 180, maxWidth: 230 },
68
+ { headerName: 'Opening Balance Local Amount', field: 'openingBalance', type: 'numericColumn', tooltipField: 'openingBalance' },
69
+ { headerName: 'Debits Local Amount', field: 'debit', type: 'numericColumn', tooltipField: 'debit' },
70
+ { headerName: 'Credits Local Amount', field: 'credit', type: 'numericColumn', tooltipField: 'credit' },
71
+ { headerName: 'Net Movement Local Amount', field: 'netMovement', type: 'numericColumn', tooltipField: 'netMovement' },
72
+ { headerName: 'Closing Balance Local Amount', field: 'closingBalance', type: 'numericColumn', tooltipField: 'closingBalance' }
73
+ ];
74
+ this.rowData = [];
75
+ this.businessUnits = [];
76
+ }
77
+ ngOnInit() {
78
+ this.loadingState = ComponentLoadingStates.Loading;
79
+ this.reportService.GetBusinessUnitForTrialBalanceAccountsReport().subscribe({
80
+ next: (res) => {
81
+ this.businessUnits = res;
82
+ this.loadingState = ComponentLoadingStates.Complete;
83
+ }, error: (err) => {
84
+ console.error('Error fetching business units:', err);
85
+ this.loadingState = ComponentLoadingStates.Error;
86
+ }, complete: () => {
87
+ console.log("getting business units api completed");
88
+ this.loadingState = ComponentLoadingStates.Complete;
89
+ }
90
+ });
91
+ }
92
+ getTrialBalanceAccountsReport(req) {
93
+ this.dataReady = false;
94
+ this.trialBalanceReport = null;
95
+ this.loadingState = ComponentLoadingStates.Loading;
96
+ this.reportService.getTrialBalanceAccountsReport(req).subscribe({
97
+ next: (report) => {
98
+ this.trialBalanceReport = report;
99
+ this.dataReady = true;
100
+ this.reportUser = this.trialBalanceReport.reportUser;
101
+ this.reportTime = formatDate(new Date(), 'dd/MM/yyyy hh:mm a', 'en-US');
102
+ this.reportPeriod = req.reportPeriod;
103
+ this.accountStatus = req.accountStatus;
104
+ this.currency = req.currency;
105
+ this.dateType = req.dateType == "VD" ? "Value Date" : "Posting Date";
106
+ this.businessUnit = this.businessUnits.find((bu) => bu.companyCode === req.businessUnit).companyFullName;
107
+ this.rowData = this.flattenReport(report).map(acc => ({
108
+ ...acc,
109
+ openingBalance: Number(acc.openingBalance).toFixed(3),
110
+ debit: Number(acc.debit).toFixed(3),
111
+ credit: Number(acc.credit).toFixed(3),
112
+ netMovement: Number(acc.netMovement).toFixed(3),
113
+ closingBalance: Number(acc.closingBalance).toFixed(3)
114
+ }));
115
+ this.metaDataOne = {
116
+ 'Report Period': this.reportPeriod,
117
+ };
118
+ this.metaDataTwo = {
119
+ 'Report User & Time': `${this.reportUser} @ ${this.reportTime}`,
120
+ };
121
+ const searchCriteria = [
122
+ ['Account Status:', this.accountStatus],
123
+ ['Currency:', this.currency],
124
+ ['Date Type:', this.dateType],
125
+ ['From Date:', this.fromDate],
126
+ ['Business Unit:', this.businessUnit],
127
+ ['To Date:', this.toDate],
128
+ ];
129
+ this.searchCriteria = searchCriteria;
130
+ this.loadingState = ComponentLoadingStates.Complete;
131
+ },
132
+ error: (err) => {
133
+ console.error('Error fetching trial balance report:', err);
134
+ }
135
+ });
136
+ }
137
+ flattenReport(report) {
138
+ const rows = [];
139
+ report.mainCOAGroups.forEach(main => {
140
+ main.subCOAGroups.forEach(sub => {
141
+ sub.coaGroups.forEach(coa => {
142
+ coa.accounts.forEach(account => rows.push(account));
143
+ rows.push({
144
+ companyFullName: '',
145
+ coaCode: '',
146
+ accountCode: 'Total:',
147
+ accountDescription: `${coa.coaDescription}`,
148
+ openingBalance: Number(coa.totals.openingBalance).toFixed(3),
149
+ debit: Number(coa.totals.debit).toFixed(3),
150
+ credit: Number(coa.totals.credit).toFixed(3),
151
+ netMovement: Number(coa.totals.netMovement).toFixed(3),
152
+ closingBalance: Number(coa.totals.closingBalance).toFixed(3),
153
+ isTotalRow: true
154
+ });
155
+ });
156
+ rows.push({
157
+ companyFullName: '',
158
+ coaCode: '',
159
+ accountCode: 'Total:',
160
+ accountDescription: `${sub.subCOADescription}`,
161
+ openingBalance: Number(sub.totals.openingBalance).toFixed(3),
162
+ debit: Number(sub.totals.debit).toFixed(3),
163
+ credit: Number(sub.totals.credit).toFixed(3),
164
+ netMovement: Number(sub.totals.netMovement).toFixed(3),
165
+ closingBalance: Number(sub.totals.closingBalance).toFixed(3),
166
+ isTotalRow: true
167
+ });
168
+ });
169
+ rows.push({
170
+ companyFullName: '',
171
+ coaCode: '',
172
+ accountCode: 'Total:',
173
+ accountDescription: `${main.mainCOADescription}`,
174
+ openingBalance: Number(main.totals.openingBalance).toFixed(3),
175
+ debit: Number(main.totals.debit).toFixed(3),
176
+ credit: Number(main.totals.credit).toFixed(3),
177
+ netMovement: Number(main.totals.netMovement).toFixed(3),
178
+ closingBalance: Number(main.totals.closingBalance).toFixed(3),
179
+ isTotalRow: true
180
+ });
181
+ });
182
+ rows.push({
183
+ companyFullName: '',
184
+ coaCode: 'TOTAL:',
185
+ accountCode: '',
186
+ accountDescription: '',
187
+ openingBalance: Number(report.grandTotal.openingBalance).toFixed(3),
188
+ debit: Number(report.grandTotal.debit).toFixed(3),
189
+ credit: Number(report.grandTotal.credit).toFixed(3),
190
+ netMovement: Number(report.grandTotal.netMovement).toFixed(3),
191
+ closingBalance: Number(report.grandTotal.closingBalance).toFixed(3),
192
+ isTotalRow: true
193
+ });
194
+ return rows;
195
+ }
196
+ onGridReady(params) {
197
+ this.gridApi = params.api;
198
+ this.gridColumnApi = params.columnApi;
199
+ const allColumnIds = [];
200
+ params.columnApi.getColumns().forEach((column) => {
201
+ allColumnIds.push(column.getColId());
202
+ });
203
+ params.columnApi.autoSizeColumns(allColumnIds);
204
+ this.onResize();
205
+ }
206
+ onResize() {
207
+ if (this.gridApi && this.gridApi.sizeColumnsToFit) {
208
+ this.gridApi.sizeColumnsToFit();
209
+ }
210
+ }
211
+ onSearch(text) {
212
+ const normalize = (str) => str
213
+ ?.toString()
214
+ .toLowerCase()
215
+ .replace(/,/g, '')
216
+ .replace(/\s+/g, ' ')
217
+ .replace(/[\u200B-\u200D\uFEFF]/g, '')
218
+ .trim();
219
+ const search = normalize(text);
220
+ if (search) {
221
+ // filter from already formatted rowData
222
+ this.rowData = this.flattenReport(this.trialBalanceReport)
223
+ .map(acc => ({
224
+ ...acc,
225
+ openingBalance: Number(acc.openingBalance).toFixed(3),
226
+ debit: Number(acc.debit).toFixed(3),
227
+ credit: Number(acc.credit).toFixed(3),
228
+ netMovement: Number(acc.netMovement).toFixed(3),
229
+ closingBalance: Number(acc.closingBalance).toFixed(3)
230
+ }))
231
+ .filter(item => Object.values(item).some(value => normalize(value).includes(search)));
232
+ }
233
+ else {
234
+ this.rowData = this.flattenReport(this.trialBalanceReport)
235
+ .map(acc => ({
236
+ ...acc,
237
+ openingBalance: Number(acc.openingBalance).toFixed(3),
238
+ debit: Number(acc.debit).toFixed(3),
239
+ credit: Number(acc.credit).toFixed(3),
240
+ netMovement: Number(acc.netMovement).toFixed(3),
241
+ closingBalance: Number(acc.closingBalance).toFixed(3)
242
+ }));
243
+ }
244
+ }
245
+ handleExport(option) {
246
+ this.selectedExportOption = option;
247
+ switch (this.selectedExportOption) {
248
+ case 'excel':
249
+ this.exportToExcel();
250
+ break;
251
+ case 'pdf':
252
+ this.exportToPdf();
253
+ break;
254
+ case 'csv':
255
+ this.exportToCsv();
256
+ break;
257
+ default:
258
+ alert('Please select an export format.');
259
+ }
260
+ }
261
+ exportToPdf() {
262
+ if (!this.trialBalanceReport?.mainCOAGroups?.length)
263
+ return;
264
+ const title = 'Xpress Money - MI Accounts';
265
+ const fileName = 'Trial-Balance-Accounts-Raw.pdf';
266
+ // --- page & layout ---
267
+ const doc = new jsPDF({ orientation: 'landscape', unit: 'mm', format: [312, 210] });
268
+ const pageWidth = doc.internal.pageSize.getWidth();
269
+ const marginLeft = 15;
270
+ const logoWidth = 38.4, logoHeight = 17.5, logoX = marginLeft, logoY = 8;
271
+ const titleY = 18;
272
+ let currentY = titleY + 14;
273
+ const labelValueGap = 2;
274
+ const pairGap = 15;
275
+ // --- metadata ---
276
+ const metadata = [
277
+ ['Report Period:', this.reportPeriod],
278
+ ['Report User & Time : ', `${this.reportUser}@${this.reportTime}`],
279
+ ];
280
+ // --- search criteria ---
281
+ const searchCriteria = this.searchCriteria;
282
+ // --- draw logo + title ---
283
+ if (this.exportService?.logoBase64) {
284
+ try {
285
+ doc.addImage(this.exportService.logoBase64, 'PNG', logoX, logoY, logoWidth, logoHeight);
286
+ }
287
+ catch { }
288
+ }
289
+ doc.setFontSize(15);
290
+ doc.setFont('helvetica', 'bold');
291
+ doc.text(title, pageWidth / 2, titleY, { align: 'center' });
292
+ // --- draw metadata ---
293
+ doc.setFontSize(10);
294
+ metadata.forEach(([label, value], i) => {
295
+ const y = currentY + i * 6;
296
+ doc.setFont('helvetica', 'bold');
297
+ doc.text(label, marginLeft, y);
298
+ doc.setFont('helvetica', 'normal');
299
+ const labelWidth = doc.getTextWidth(label + ' ');
300
+ doc.text(value, marginLeft + labelWidth + labelValueGap, y);
301
+ });
302
+ currentY += metadata.length * 6 + 6;
303
+ // --- draw search criteria heading ---
304
+ doc.setFont('helvetica', 'bold');
305
+ doc.text('Search Criteria:-', marginLeft, currentY);
306
+ currentY += 8;
307
+ // --- draw search criteria pairs ---
308
+ for (let i = 0; i < searchCriteria.length; i += 2) {
309
+ const left = searchCriteria[i];
310
+ const right = searchCriteria[i + 1]; // may be undefined
311
+ // --- Left side ---
312
+ if (left) {
313
+ doc.setFont('helvetica', 'bold');
314
+ doc.text(left[0], marginLeft, currentY);
315
+ doc.setFont('helvetica', 'normal');
316
+ const leftLabelWidth = doc.getTextWidth(left[0] + ' ');
317
+ doc.text(left[1] ?? '', marginLeft + leftLabelWidth + labelValueGap, currentY);
318
+ }
319
+ // --- Right side (if available) ---
320
+ if (right) {
321
+ doc.setFont('helvetica', 'bold');
322
+ doc.text(right[0], pageWidth / 2, currentY);
323
+ doc.setFont('helvetica', 'normal');
324
+ const rightLabelWidth = doc.getTextWidth(right[0] + ' ');
325
+ doc.text(right[1] ?? '', pageWidth / 2 + rightLabelWidth + labelValueGap, currentY);
326
+ }
327
+ currentY += 6; // move down for next line
328
+ }
329
+ currentY += 4;
330
+ // --- headers ---
331
+ const headers = [
332
+ 'Sr No',
333
+ 'Business Unit',
334
+ 'COA Code', 'Account Code', 'Account Description',
335
+ 'Opening Balance Local Amt', 'Debits Local Amt', 'Credits Local Amt',
336
+ 'Net Movement Local Amt', 'Closing Balance Local Amt'
337
+ ];
338
+ const flatReport = this.flattenReport(this.trialBalanceReport);
339
+ // --- rows ---
340
+ const rows = flatReport.map((acc, i) => [
341
+ i + 1,
342
+ acc.companyFullName,
343
+ acc.coaCode,
344
+ acc.accountCode,
345
+ acc.accountDescription,
346
+ acc.openingBalance != null ? Number(acc.openingBalance).toFixed(3) : "",
347
+ acc.debit != null ? Number(acc.debit).toFixed(3) : "",
348
+ acc.credit != null ? Number(acc.credit).toFixed(3) : "",
349
+ acc.netMovement != null ? Number(acc.netMovement).toFixed(3) : "",
350
+ acc.closingBalance != null ? Number(acc.closingBalance).toFixed(3) : ""
351
+ ]);
352
+ // --- column widths ---
353
+ const columnStyles = {
354
+ 0: { cellWidth: 13 },
355
+ 1: { cellWidth: 25 },
356
+ 2: { cellWidth: 25 },
357
+ 3: { cellWidth: 25 },
358
+ 4: { cellWidth: 60 },
359
+ 5: { cellWidth: 30 },
360
+ 6: { cellWidth: 28 },
361
+ 7: { cellWidth: 28 },
362
+ 8: { cellWidth: 28 },
363
+ 9: { cellWidth: 30 },
364
+ };
365
+ // --- draw table ---
366
+ doc.autoTable({
367
+ head: [headers],
368
+ body: rows,
369
+ startY: currentY,
370
+ theme: 'grid',
371
+ headStyles: {
372
+ fillColor: [220, 220, 220],
373
+ textColor: 0,
374
+ fontStyle: 'bold',
375
+ fontSize: 9,
376
+ halign: 'center',
377
+ cellWidth: 'wrap',
378
+ minCellHeight: 10
379
+ },
380
+ bodyStyles: {
381
+ fontSize: 8,
382
+ fillColor: [255, 255, 255],
383
+ textColor: [0, 0, 0]
384
+ },
385
+ styles: { cellPadding: 2, overflow: 'linebreak', minCellHeight: 6 },
386
+ columnStyles,
387
+ didParseCell: (data) => {
388
+ const rowIndex = data.row.index;
389
+ const rowData = flatReport[rowIndex];
390
+ const isTotalRow = rowData.isTotalRow;
391
+ if (isTotalRow)
392
+ data.cell.styles.fontStyle = 'bold';
393
+ // highlight negatives in red
394
+ if (data.column.index > 4) {
395
+ const keyMap = ["openingBalance", "debit", "credit", "netMovement", "closingBalance"];
396
+ const key = keyMap[data.column.index - 5];
397
+ const raw = rowData[key];
398
+ const num = Number(raw);
399
+ if (!isNaN(num) && num < 0) {
400
+ data.cell.styles.textColor = [255, 0, 0];
401
+ }
402
+ }
403
+ }
404
+ });
405
+ // --- page numbers ---
406
+ const totalPages = doc.internal.getNumberOfPages();
407
+ for (let i = 1; i <= totalPages; i++) {
408
+ doc.setPage(i);
409
+ doc.setFontSize(9);
410
+ const footerY = doc.internal.pageSize.height - 6;
411
+ doc.text(`Page ${i} of ${totalPages}`, pageWidth - 15, footerY, { align: 'right' });
412
+ }
413
+ // --- save PDF ---
414
+ doc.save(fileName);
415
+ }
416
+ exportToExcel() {
417
+ if (!this.trialBalanceReport?.mainCOAGroups?.length)
418
+ return;
419
+ const fileName = 'Trial-Balance-Accounts-Raw.xlsx';
420
+ const workbook = new ExcelJS.Workbook();
421
+ const sheet = workbook.addWorksheet('Trial Balance');
422
+ let currentRow = 1;
423
+ // --- add logo if available ---
424
+ if (this.exportService?.logoBase64) {
425
+ const base64Data = this.exportService.logoBase64.replace(/^data:image\/\w+;base64,/, '');
426
+ const imageId = workbook.addImage({ base64: base64Data, extension: 'png' });
427
+ sheet.addImage(imageId, { tl: { col: 0, row: 0 }, ext: { width: 120, height: 60 }, editAs: 'oneCell' });
428
+ }
429
+ // --- title ---
430
+ const title = 'Xpress Money - MI Accounts';
431
+ sheet.mergeCells(1, 3, 1, 10);
432
+ const titleCell = sheet.getCell('C1');
433
+ titleCell.value = title;
434
+ titleCell.font = { size: 15, bold: true };
435
+ titleCell.alignment = { horizontal: 'center', vertical: 'middle' };
436
+ currentRow = 4;
437
+ // --- metadata ---
438
+ const metadata = [
439
+ ['Report Period:', this.reportPeriod],
440
+ ['Report User & Time : ', `${this.reportUser}@${this.reportTime}`],
441
+ ];
442
+ metadata.forEach(([label, value]) => {
443
+ sheet.mergeCells(currentRow, 1, currentRow, 6);
444
+ const row = sheet.getRow(currentRow++);
445
+ row.getCell(1).value = { richText: [{ text: label + ' ', font: { bold: true } }, { text: value }] };
446
+ row.getCell(1).alignment = { vertical: 'middle', wrapText: true };
447
+ });
448
+ currentRow++;
449
+ // --- search criteria heading ---
450
+ sheet.mergeCells(currentRow, 1, currentRow, 6);
451
+ sheet.getCell(currentRow, 1).value = 'Search Criteria:-';
452
+ sheet.getCell(currentRow, 1).font = { bold: true };
453
+ currentRow += 2;
454
+ // --- search criteria ---
455
+ const searchCriteria = this.searchCriteria;
456
+ for (let i = 0; i < searchCriteria.length; i += 2) {
457
+ const left = searchCriteria[i];
458
+ const right = searchCriteria[i + 1]; // may be undefined
459
+ const row = sheet.getRow(currentRow++);
460
+ // Left cell
461
+ sheet.mergeCells(row.number, 1, row.number, 3);
462
+ row.getCell(1).value = {
463
+ richText: [
464
+ { text: (left?.[0] ?? '') + ' ', font: { bold: true } },
465
+ { text: left?.[1] ?? '' }
466
+ ]
467
+ };
468
+ row.getCell(1).alignment = { wrapText: true, vertical: 'middle' };
469
+ // Right cell (only if present)
470
+ if (right) {
471
+ sheet.mergeCells(row.number, 4, row.number, 6);
472
+ row.getCell(4).value = {
473
+ richText: [
474
+ { text: (right?.[0] ?? '') + ' ', font: { bold: true } },
475
+ { text: right?.[1] ?? '' }
476
+ ]
477
+ };
478
+ row.getCell(4).alignment = { wrapText: true, vertical: 'middle' };
479
+ }
480
+ }
481
+ currentRow++;
482
+ // --- headers ---
483
+ const headers = [
484
+ 'Sr No',
485
+ 'Business Unit',
486
+ 'COA Code', 'Account Code', 'Account Description',
487
+ 'Opening Balance Local Amt', 'Debits Local Amt', 'Credits Local Amt',
488
+ 'Net Movement Local Amt', 'Closing Balance Local Amt'
489
+ ];
490
+ const headerRow = sheet.getRow(currentRow++);
491
+ headers.forEach((h, i) => {
492
+ const cell = headerRow.getCell(i + 1);
493
+ cell.value = h;
494
+ cell.font = { bold: true };
495
+ cell.alignment = { horizontal: 'center', vertical: 'middle', wrapText: true };
496
+ cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'DCDCDC' } };
497
+ cell.border = { top: { style: 'thin' }, left: { style: 'thin' }, bottom: { style: 'thin' }, right: { style: 'thin' } };
498
+ });
499
+ // --- rows with 3 decimals for numeric columns ---
500
+ const rows = this.flattenReport(this.trialBalanceReport).map((acc, idx) => {
501
+ const numericColumns = ['openingBalance', 'debit', 'credit', 'netMovement', 'closingBalance'];
502
+ const rowData = numericColumns.map(col => {
503
+ const val = Number(acc[col]);
504
+ return !isNaN(val) ? val.toFixed(3) : '';
505
+ });
506
+ return [
507
+ idx + 1,
508
+ acc.companyFullName,
509
+ acc.coaCode,
510
+ acc.accountCode,
511
+ acc.accountDescription,
512
+ ...rowData,
513
+ acc.isTotalRow || false
514
+ ];
515
+ });
516
+ rows.forEach(r => {
517
+ const row = sheet.getRow(currentRow++);
518
+ r.slice(0, 10).forEach((val, i) => {
519
+ const cell = row.getCell(i + 1);
520
+ // convert back to number for Excel math but show 3 decimals
521
+ if (i > 4 && val !== '')
522
+ cell.value = parseFloat(val.toString());
523
+ else
524
+ cell.value = val;
525
+ cell.border = { top: { style: 'thin' }, left: { style: 'thin' }, bottom: { style: 'thin' }, right: { style: 'thin' } };
526
+ // bold total rows
527
+ if (r[10])
528
+ cell.font = { bold: true };
529
+ // negative numbers red
530
+ if (i > 4 && typeof cell.value === 'number' && cell.value < 0) {
531
+ cell.font = { color: { argb: 'FF0000' }, bold: r[10] ? true : undefined };
532
+ }
533
+ // set number format to show 3 decimals
534
+ if (i > 4)
535
+ cell.numFmt = '0.000';
536
+ });
537
+ });
538
+ // --- column widths ---
539
+ const widths = [8, 16, 15, 15, 40, 20, 20, 20, 20, 20];
540
+ widths.forEach((w, i) => sheet.getColumn(i + 1).width = w);
541
+ // --- save file ---
542
+ workbook.xlsx.writeBuffer().then(buffer => {
543
+ const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
544
+ FileSaver.saveAs(blob, fileName);
545
+ });
546
+ }
547
+ exportToCsv() {
548
+ if (!this.trialBalanceReport?.mainCOAGroups?.length)
549
+ return;
550
+ const fileName = 'Trial-Balance-Accounts-Raw.csv';
551
+ // --- metadata ---
552
+ const metadata = [
553
+ ['Report Title:', 'Xpress Money - MI Accounts'],
554
+ ['Report Period:', this.reportPeriod],
555
+ ['Report User & Time : ', `${this.reportUser}@${this.reportTime}`],
556
+ ];
557
+ // --- search criteria ---
558
+ const searchCriteria = this.searchCriteria;
559
+ // --- table headers (add Sr No at start) ---
560
+ const headers = [
561
+ 'Sr No',
562
+ 'Business Unit',
563
+ 'COA Code', 'Account Code', 'Account Description',
564
+ 'Opening Balance Local Amt', 'Debits Local Amt', 'Credits Local Amt',
565
+ 'Net Movement Local Amt', 'Closing Balance Local Amt'
566
+ ];
567
+ // --- table rows (prepend Sr No) ---
568
+ const rows = this.flattenReport(this.trialBalanceReport).map((acc, index) => [
569
+ index + 1,
570
+ acc.companyFullName,
571
+ acc.coaCode,
572
+ acc.accountCode,
573
+ acc.accountDescription,
574
+ Number(acc.openingBalance).toFixed(3),
575
+ Number(acc.debit).toFixed(3),
576
+ Number(acc.credit).toFixed(3),
577
+ Number(acc.netMovement).toFixed(3),
578
+ Number(acc.closingBalance).toFixed(3)
579
+ ]);
580
+ // --- helper to escape CSV values ---
581
+ const escapeCsv = (value) => {
582
+ if (value === null || value === undefined)
583
+ return '';
584
+ const str = value.toString();
585
+ return str.includes(',') || str.includes('"') || str.includes('\n')
586
+ ? `"${str.replace(/"/g, '""')}"`
587
+ : str;
588
+ };
589
+ // --- build CSV content ---
590
+ let csvContent = '';
591
+ // metadata
592
+ metadata.forEach(([label, value]) => {
593
+ csvContent += `${escapeCsv(label)}${escapeCsv(value)},\n`;
594
+ });
595
+ csvContent += '\n'; // gap
596
+ // --- search criteria heading ---
597
+ csvContent += 'Search Criteria:-\n';
598
+ // --- search criteria (2 per row, dynamic) ---
599
+ for (let i = 0; i < searchCriteria.length; i += 2) {
600
+ const left = searchCriteria[i];
601
+ const right = searchCriteria[i + 1];
602
+ // Left side
603
+ if (left)
604
+ csvContent += `${escapeCsv(left[0])} ${escapeCsv(left[1])},`;
605
+ // Right side
606
+ if (right)
607
+ csvContent += ` ${escapeCsv(right[0])} ${escapeCsv(right[1])},`;
608
+ csvContent += '\n';
609
+ }
610
+ csvContent += '\n'; // blank line after criteria
611
+ // table headers
612
+ csvContent += headers.map(h => escapeCsv(h)).join(',') + '\n';
613
+ // table rows
614
+ rows.forEach(row => {
615
+ csvContent += row.map(cell => escapeCsv(cell)).join(',') + '\n';
616
+ });
617
+ // --- trigger download ---
618
+ const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
619
+ const link = document.createElement('a');
620
+ const url = URL.createObjectURL(blob);
621
+ link.setAttribute('href', url);
622
+ link.setAttribute('download', fileName);
623
+ link.style.visibility = 'hidden';
624
+ document.body.appendChild(link);
625
+ link.click();
626
+ document.body.removeChild(link);
627
+ }
628
+ getReport(payload) {
629
+ const modal = payload?.modal || payload;
630
+ this.fromDate = formatDate(modal.fromDate, 'dd/MM/yyyy', 'en-US');
631
+ this.toDate = formatDate(modal.toDate, 'dd/MM/yyyy', 'en-US');
632
+ const req = {
633
+ year: Number(modal.financialYear),
634
+ dateType: modal.dateType,
635
+ fromDate: modal.fromDay,
636
+ toDate: modal.toDay,
637
+ accountStatus: modal.accountStatus.join(','),
638
+ businessUnit: modal.businessUnit,
639
+ currency: modal.currency,
640
+ companyCode: modal.businessUnit,
641
+ reportPeriod: `${formatDate(modal.fromDate, 'dd/MM/yyyy', 'en-US')} - ${formatDate(modal.toDate, 'dd/MM/yyyy', 'en-US')}`,
642
+ };
643
+ this.getTrialBalanceAccountsReport(req);
644
+ }
645
+ handleFormValid(isValid) {
646
+ this.isFormValid = isValid;
647
+ }
648
+ }
649
+ TrialBalanceAccountsReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TrialBalanceAccountsReportComponent, deps: [{ token: i1.ReportService }, { token: i2.ExportService }], target: i0.ɵɵFactoryTarget.Component });
650
+ TrialBalanceAccountsReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TrialBalanceAccountsReportComponent, selector: "lib-trial-balance-accounts-report", host: { listeners: { "window:resize": "onResize($event)" } }, ngImport: i0, template: "<lib-search-filter [ReportName]=\"ReportName\" (searchClicked)=\"getReport($event)\"\r\n (formValid)=\"handleFormValid($event)\"></lib-search-filter>\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<div *ngIf=\"dataReady && trialBalanceReport?.mainCOAGroups?.length > 0 &&isFormValid\">\r\n <lib-metadata [reportName]=\"'Xpress Money - MI Accounts'\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\"\r\n [metaDataOne]=\"metaDataOne\" [metaDataTwo]=\"metaDataTwo\" (exportEvent)=\"handleExport($event)\"\r\n (searchEvent)=\"onSearch($event)\"></lib-metadata>\r\n\r\n <div style=\"position: relative;\" *ngIf=\"rowData && rowData.length > 0\">\r\n <lib-page-size-selector [totalEntries]=\"rowData?.length\" [defaultSize]=\"'15'\"\r\n [gridApi]=\"gridApi\"></lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid\" style=\"height: 380px;\" [domLayout]=\"'normal'\"\r\n [rowData]=\"rowData\" [defaultColDef]=\"defaultColDef\" [columnDefs]=\"columnDefs\" [rowClassRules]=\"rowClassRules\"\r\n [pagination]=\"true\" (gridReady)=\"onGridReady($event)\" [paginationPageSize]=\"pageSize\" [rowHeight]=\"20\"\r\n [headerHeight]=\"22\" (paginationChanged)=\"onResize()\"></ag-grid-angular>\r\n\r\n </div>\r\n\r\n</div>\r\n\r\n<div class=\"alert alert-warning mt-3\" *ngIf=\"trialBalanceReport?.mainCOAGroups?.length==0\">\r\n No Data found matching your search criteria.\r\n</div>", 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}.transaction-grid ::ng-deep .ag-row.total-row .ag-cell{font-weight:700!important}.transaction-grid ::ng-deep .ag-cell.total-positive{font-weight:700!important;color:#000!important}.transaction-grid ::ng-deep .ag-cell.total-negative{font-weight:700!important;color:red!important}.transaction-grid ::ng-deep .ag-cell.positive-value{color:#000!important}.transaction-grid ::ng-deep .ag-cell.negative-value{color:red!important}\n"], dependencies: [{ kind: "component", type: i3.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: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PageSizeSelectorComponent, selector: "lib-page-size-selector", inputs: ["pageSizeArray", "defaultSize", "totalEntries", "gridApi"] }, { kind: "component", type: i6.MetadataComponent, selector: "lib-metadata", inputs: ["metaDataOne", "metaDataTwo", "showmetaDataOne", "showmetaDataTwo", "reportName"], outputs: ["searchEvent", "exportEvent"] }, { kind: "component", type: i7.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i8.SearchFilterComponent, selector: "lib-search-filter", inputs: ["ReportName", "initialFilters"], outputs: ["searchClicked", "formValid"] }] });
651
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TrialBalanceAccountsReportComponent, decorators: [{
652
+ type: Component,
653
+ args: [{ selector: 'lib-trial-balance-accounts-report', template: "<lib-search-filter [ReportName]=\"ReportName\" (searchClicked)=\"getReport($event)\"\r\n (formValid)=\"handleFormValid($event)\"></lib-search-filter>\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<div *ngIf=\"dataReady && trialBalanceReport?.mainCOAGroups?.length > 0 &&isFormValid\">\r\n <lib-metadata [reportName]=\"'Xpress Money - MI Accounts'\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\"\r\n [metaDataOne]=\"metaDataOne\" [metaDataTwo]=\"metaDataTwo\" (exportEvent)=\"handleExport($event)\"\r\n (searchEvent)=\"onSearch($event)\"></lib-metadata>\r\n\r\n <div style=\"position: relative;\" *ngIf=\"rowData && rowData.length > 0\">\r\n <lib-page-size-selector [totalEntries]=\"rowData?.length\" [defaultSize]=\"'15'\"\r\n [gridApi]=\"gridApi\"></lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid\" style=\"height: 380px;\" [domLayout]=\"'normal'\"\r\n [rowData]=\"rowData\" [defaultColDef]=\"defaultColDef\" [columnDefs]=\"columnDefs\" [rowClassRules]=\"rowClassRules\"\r\n [pagination]=\"true\" (gridReady)=\"onGridReady($event)\" [paginationPageSize]=\"pageSize\" [rowHeight]=\"20\"\r\n [headerHeight]=\"22\" (paginationChanged)=\"onResize()\"></ag-grid-angular>\r\n\r\n </div>\r\n\r\n</div>\r\n\r\n<div class=\"alert alert-warning mt-3\" *ngIf=\"trialBalanceReport?.mainCOAGroups?.length==0\">\r\n No Data found matching your search criteria.\r\n</div>", 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}.transaction-grid ::ng-deep .ag-row.total-row .ag-cell{font-weight:700!important}.transaction-grid ::ng-deep .ag-cell.total-positive{font-weight:700!important;color:#000!important}.transaction-grid ::ng-deep .ag-cell.total-negative{font-weight:700!important;color:red!important}.transaction-grid ::ng-deep .ag-cell.positive-value{color:#000!important}.transaction-grid ::ng-deep .ag-cell.negative-value{color:red!important}\n"] }]
654
+ }], ctorParameters: function () { return [{ type: i1.ReportService }, { type: i2.ExportService }]; }, propDecorators: { onResize: [{
655
+ type: HostListener,
656
+ args: ['window:resize', ['$event']]
657
+ }] } });
658
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpYWwtYmFsYW5jZS1hY2NvdW50cy1yZXBvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL3RyaWFsLWJhbGFuY2UtYWNjb3VudHMtcmVwb3J0L3RyaWFsLWJhbGFuY2UtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy90cmlhbC1iYWxhbmNlLWFjY291bnRzLXJlcG9ydC90cmlhbC1iYWxhbmNlLWFjY291bnRzLXJlcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFaEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFHL0UsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8saUJBQWlCLENBQUM7QUFDekIsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7QUEyQnhDLE1BQU0sT0FBTyxtQ0FBbUM7SUEyRTlDLFlBQW9CLGFBQTRCLEVBQVUsYUFBNEI7UUFBbEUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXhFdEYsZUFBVSxHQUFXLDBCQUEwQixDQUFBO1FBSS9DLDBCQUFxQixHQUFHLHNCQUFzQixDQUFDO1FBQy9DLGlCQUFZLEdBQTJCLHNCQUFzQixDQUFDLFFBQVEsQ0FBQztRQUV2RSx5QkFBb0IsR0FBVyxPQUFPLENBQUM7UUFDdkMsYUFB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QUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDNUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixXQUFXLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDL0IsWUFBWSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsRUFBRTtTQUMxSCxDQUFDO1FBRUYsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxlQUFlLENBQUMsT0FBZ0I7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7SUFDN0IsQ0FBQzs7Z0lBMXRCVSxtQ0FBbUM7b0hBQW5DLG1DQUFtQyx1SUNwQ2hELGcrQ0F3Qk07MkZEWU8sbUNBQW1DO2tCQUwvQyxTQUFTOytCQUNFLG1DQUFtQztnSUEwTzdDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb2xEZWYsIENvbHVtbkFwaSwgR3JpZEFwaSwgR3JpZFJlYWR5RXZlbnQgfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XHJcbmltcG9ydCB7IENvbXBvbmVudExvYWRpbmdTdGF0ZXMgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29tcG9uZW50LWxvYWRpbmctc3RhdGVzJztcclxuaW1wb3J0IHsgQWNjb3VudERldGFpbCwgVHJpYWxCYWxhbmNlUmVwb3J0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RyaWFsLWJhbGFuY2UtYWNjb3VudHMtcmVwb3J0L3RyaWFsLWJhbGFuY2UtYWNjb3VudHMubW9kZWxzJztcclxuaW1wb3J0IHsgUmVwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC5zZXJ2aWNlJztcclxuaW1wb3J0IGpzUERGIGZyb20gJ2pzcGRmJztcclxuaW1wb3J0ICdqc3BkZi1hdXRvdGFibGUnO1xyXG5pbXBvcnQgKiBhcyBFeGNlbEpTIGZyb20gJ2V4Y2VsanMnO1xyXG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XHJcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvZXhwb3J0LnNlcnZpY2UnO1xyXG5cclxuXHJcbmRlY2xhcmUgbW9kdWxlICdqc3BkZicge1xyXG4gIGludGVyZmFjZSBqc1BERiB7XHJcbiAgICBhdXRvVGFibGU6IChvcHRpb25zOiBhbnkpID0+IGpzUERGO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydFJlcXVlc3REVE8ge1xyXG4gIHllYXI6IG51bWJlcjtcclxuICBkYXRlVHlwZTogc3RyaW5nO1xyXG4gIGZyb21EYXRlOiBzdHJpbmc7XHJcbiAgdG9EYXRlOiBzdHJpbmc7XHJcbiAgYWNjb3VudFN0YXR1czogc3RyaW5nO1xyXG4gIGJ1c2luZXNzVW5pdDogc3RyaW5nO1xyXG4gIGN1cnJlbmN5OiBzdHJpbmc7XHJcbiAgY29tcGFueUNvZGU6IHN0cmluZztcclxuICByZXBvcnRQZXJpb2Q6IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItdHJpYWwtYmFsYW5jZS1hY2NvdW50cy1yZXBvcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90cmlhbC1iYWxhbmNlLWFjY291bnRzLXJlcG9ydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdHJpYWwtYmFsYW5jZS1hY2NvdW50cy1yZXBvcnQuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuXHJcbiAgUmVwb3J0TmFtZTogc3RyaW5nID0gXCJUcmlhbCBCYWxhbmNlIC0gQWNjb3VudHNcIlxyXG4gIGdyaWRBcGk6IEdyaWRBcGk7XHJcbiAgbWV0YURhdGFPbmU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcbiAgbWV0YURhdGFUd286IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcbiAgQ29tcG9uZW50TG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcztcclxuICBsb2FkaW5nU3RhdGU6IENvbXBvbmVudExvYWRpbmdTdGF0ZXMgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkNvbXBsZXRlO1xyXG4gIHRyaWFsQmFsYW5jZVJlcG9ydDogVHJpYWxCYWxhbmNlUmVwb3J0O1xyXG4gIHNlbGVjdGVkRXhwb3J0T3B0aW9uOiBzdHJpbmcgPSAnZXhjZWwnO1xyXG4gIHBhZ2VTaXplOiBudW1iZXIgPSAxNTtcclxuICBkYXRhUmVhZHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdO1xyXG5cclxuICBhY2NvdW50U3RhdHVzOiBzdHJpbmcgPSAnJztcclxuICBjdXJyZW5jeTogc3RyaW5nID0gJyc7XHJcbiAgZGF0ZVR5cGU6IHN0cmluZyA9ICcnO1xyXG4gIGZyb21EYXRlOiBzdHJpbmcgPSAnJztcclxuICB0b0RhdGU6IHN0cmluZyA9ICcnO1xyXG4gIGJ1c2luZXNzVW5pdDogc3RyaW5nID0gJyc7XHJcblxyXG4gIHJlcG9ydFVzZXI6IHN0cmluZyA9ICcnO1xyXG4gIHJlcG9ydFRpbWU6IHN0cmluZyA9ICcnO1xyXG4gIHJlcG9ydFBlcmlvZDogc3RyaW5nID0gJyc7XHJcbiAgaXNGb3JtVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gIGRlZmF1bHRDb2xEZWY6IENvbERlZiA9IHtcclxuICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgIHNvcnRhYmxlOiB0cnVlLFxyXG4gICAgZmlsdGVyOiB0cnVlLFxyXG4gICAgc3VwcHJlc3NTaXplVG9GaXQ6IGZhbHNlLFxyXG4gICAgY2VsbFN0eWxlOiB7XHJcbiAgICAgIHVzZXJTZWxlY3Q6ICd0ZXh0JyxcclxuICAgICAgJ2xpbmUtaGVpZ2h0JzogJzEuMicsXHJcbiAgICAgICd3aGl0ZS1zcGFjZSc6ICdub3JtYWwnLFxyXG4gICAgICAnd29yZC1icmVhayc6ICdub3JtYWwnLFxyXG4gICAgICAnb3ZlcmZsb3ctd3JhcCc6ICdicmVhay13b3JkJyxcclxuICAgIH0sXHJcblxyXG4gICAgd3JhcEhlYWRlclRleHQ6IHRydWUsXHJcbiAgICBhdXRvSGVhZGVySGVpZ2h0OiB0cnVlLFxyXG4gICAgd3JhcFRleHQ6IHRydWUsXHJcbiAgICBhdXRvSGVpZ2h0OiB0cnVlLFxyXG5cclxuICAgIGNlbGxDbGFzc1J1bGVzOiB7XHJcbiAgICAgICd0b3RhbC1wb3NpdGl2ZSc6IHBhcmFtcyA9PiBwYXJhbXMuZGF0YT8uaXNUb3RhbFJvdyAmJiBwYXJhbXMudmFsdWUgPj0gMCxcclxuICAgICAgJ3RvdGFsLW5lZ2F0aXZlJzogcGFyYW1zID0+IHBhcmFtcy5kYXRhPy5pc1RvdGFsUm93ICYmIHBhcmFtcy52YWx1ZSA8IDAsXHJcbiAgICAgICdwb3NpdGl2ZS12YWx1ZSc6IHBhcmFtcyA9PiAhcGFyYW1zLmRhdGE/LmlzVG90YWxSb3cgJiYgcGFyYW1zLnZhbHVlID49IDAsXHJcbiAgICAgICduZWdhdGl2ZS12YWx1ZSc6IHBhcmFtcyA9PiAhcGFyYW1zLmRhdGE/LmlzVG90YWxSb3cgJiYgcGFyYW1zLnZhbHVlIDwgMCxcclxuICAgIH1cclxuICB9O1xyXG5cclxuICByb3dDbGFzc1J1bGVzID0ge1xyXG4gICAgJ3RvdGFsLXJvdyc6IHBhcmFtcyA9PiBwYXJhbXMuZGF0YT8uaXNUb3RhbFJvd1xyXG4gIH07XHJcblxyXG4gIGNvbHVtbkRlZnM6IENvbERlZltdID1cclxuICAgIFtcclxuICAgICAgeyBoZWFkZXJOYW1lOiAnQnVzaW5lc3MgVW5pdCcsIGZpZWxkOiAnY29tcGFueUZ1bGxOYW1lJywgdG9vbHRpcEZpZWxkOiAnY29tcGFueUZ1bGxOYW1lJywgbWluV2lkdGg6IDcwLCBtYXhXaWR0aDogMTAwIH0sXHJcbiAgICAgIHsgaGVhZGVyTmFtZTogJ0NPQSBDb2RlJywgZmllbGQ6ICdjb2FDb2RlJywgdG9vbHRpcEZpZWxkOiAnY29hQ29kZScsIG1pbldpZHRoOiA2MCwgbWF4V2lkdGg6IDEwMCB9LFxyXG4gICAgICB7IGhlYWRlck5hbWU6ICdBY2NvdW50IENvZGUnLCBmaWVsZDogJ2FjY291bnRDb2RlJywgdG9vbHRpcEZpZWxkOiAnYWNjb3VudENvZGUnLCBtaW5XaWR0aDogODAsIG1heFdpZHRoOiAxMDAgfSxcclxuICAgICAgeyBoZWFkZXJOYW1lOiAnQWNjb3VudCBEZXNjcmlwdGlvbicsIGZpZWxkOiAnYWNjb3VudERlc2NyaXB0aW9uJywgdG9vbHRpcEZpZWxkOiAnYWNjb3VudERlc2NyaXB0aW9uJywgbWluV2lkdGg6IDE4MCwgbWF4V2lkdGg6IDIzMCB9LFxyXG4gICAgICB7IGhlYWRlck5hbWU6ICdPcGVuaW5nIEJhbGFuY2UgTG9jYWwgQW1vdW50JywgZmllbGQ6ICdvcGVuaW5nQmFsYW5jZScsIHR5cGU6ICdudW1lcmljQ29sdW1uJywgdG9vbHRpcEZpZWxkOiAnb3BlbmluZ0JhbGFuY2UnIH0sXHJcbiAgICAgIHsgaGVhZGVyTmFtZTogJ0RlYml0cyBMb2NhbCBBbW91bnQnLCBmaWVsZDogJ2RlYml0JywgdHlwZTogJ251bWVyaWNDb2x1bW4nLCB0b29sdGlwRmllbGQ6ICdkZWJpdCcgfSxcclxuICAgICAgeyBoZWFkZXJOYW1lOiAnQ3JlZGl0cyBMb2NhbCBBbW91bnQnLCBmaWVsZDogJ2NyZWRpdCcsIHR5cGU6ICdudW1lcmljQ29sdW1uJywgdG9vbHRpcEZpZWxkOiAnY3JlZGl0JyB9LFxyXG4gICAgICB7IGhlYWRlck5hbWU6ICdOZXQgTW92ZW1lbnQgTG9jYWwgQW1vdW50JywgZmllbGQ6ICduZXRNb3ZlbWVudCcsIHR5cGU6ICdudW1lcmljQ29sdW1uJywgdG9vbHRpcEZpZWxkOiAnbmV0TW92ZW1lbnQnIH0sXHJcbiAgICAgIHsgaGVhZGVyTmFtZTogJ0Nsb3NpbmcgQmFsYW5jZSBMb2NhbCBBbW91bnQnLCBmaWVsZDogJ2Nsb3NpbmdCYWxhbmNlJywgdHlwZTogJ251bWVyaWNDb2x1bW4nLCB0b29sdGlwRmllbGQ6ICdjbG9zaW5nQmFsYW5jZScgfVxyXG4gICAgXTtcclxuXHJcbiAgcm93RGF0YTogQWNjb3VudERldGFpbFtdID0gW107XHJcbiAgZ3JpZENvbHVtbkFwaTogQ29sdW1uQXBpO1xyXG4gIGJ1c2luZXNzVW5pdHMgPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZXBvcnRTZXJ2aWNlOiBSZXBvcnRTZXJ2aWNlLCBwcml2YXRlIGV4cG9ydFNlcnZpY2U6IEV4cG9ydFNlcnZpY2UpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Mb2FkaW5nO1xyXG4gICAgdGhpcy5yZXBvcnRTZXJ2aWNlLkdldEJ1c2luZXNzVW5pdEZvclRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KCkuc3Vic2NyaWJlKFxyXG4gICAgICB7XHJcbiAgICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5idXNpbmVzc1VuaXRzID0gcmVzO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkNvbXBsZXRlO1xyXG4gICAgICAgIH0sIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBidXNpbmVzcyB1bml0czonLCBlcnIpO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkVycm9yO1xyXG4gICAgICAgIH0sIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImdldHRpbmcgYnVzaW5lc3MgdW5pdHMgYXBpIGNvbXBsZXRlZFwiKTtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRUcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydChyZXE6IGFueSkge1xyXG5cclxuICAgIHRoaXMuZGF0YVJlYWR5ID0gZmFsc2U7XHJcbiAgICB0aGlzLnRyaWFsQmFsYW5jZVJlcG9ydCA9IG51bGw7XHJcbiAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuTG9hZGluZztcclxuXHJcbiAgICB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0VHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQocmVxKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVwb3J0OiBUcmlhbEJhbGFuY2VSZXBvcnQpID0+IHtcclxuICAgICAgICB0aGlzLnRyaWFsQmFsYW5jZVJlcG9ydCA9IHJlcG9ydDtcclxuICAgICAgICB0aGlzLmRhdGFSZWFkeSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRVc2VyID0gdGhpcy50cmlhbEJhbGFuY2VSZXBvcnQucmVwb3J0VXNlcjtcclxuICAgICAgICB0aGlzLnJlcG9ydFRpbWUgPSBmb3JtYXREYXRlKG5ldyBEYXRlKCksICdkZC9NTS95eXl5IGhoOm1tIGEnLCAnZW4tVVMnKTtcclxuICAgICAgICB0aGlzLnJlcG9ydFBlcmlvZCA9IHJlcS5yZXBvcnRQZXJpb2Q7XHJcblxyXG4gICAgICAgIHRoaXMuYWNjb3VudFN0YXR1cyA9IHJlcS5hY2NvdW50U3RhdHVzO1xyXG4gICAgICAgIHRoaXMuY3VycmVuY3kgPSByZXEuY3VycmVuY3k7XHJcbiAgICAgICAgdGhpcy5kYXRlVHlwZSA9IHJlcS5kYXRlVHlwZSA9PSBcIlZEXCIgPyBcIlZhbHVlIERhdGVcIiA6IFwiUG9zdGluZyBEYXRlXCI7XHJcbiAgICAgICAgdGhpcy5idXNpbmVzc1VuaXQgPSB0aGlzLmJ1c2luZXNzVW5pdHMuZmluZCgoYnUpID0+IGJ1LmNvbXBhbnlDb2RlID09PSByZXEuYnVzaW5lc3NVbml0KS5jb21wYW55RnVsbE5hbWU7XHJcblxyXG4gICAgICAgIHRoaXMucm93RGF0YSA9IHRoaXMuZmxhdHRlblJlcG9ydChyZXBvcnQpLm1hcChhY2MgPT4gKHtcclxuICAgICAgICAgIC4uLmFjYyxcclxuICAgICAgICAgIG9wZW5pbmdCYWxhbmNlOiBOdW1iZXIoYWNjLm9wZW5pbmdCYWxhbmNlKS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgZGViaXQ6IE51bWJlcihhY2MuZGViaXQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICBjcmVkaXQ6IE51bWJlcihhY2MuY3JlZGl0KS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgbmV0TW92ZW1lbnQ6IE51bWJlcihhY2MubmV0TW92ZW1lbnQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICBjbG9zaW5nQmFsYW5jZTogTnVtYmVyKGFjYy5jbG9zaW5nQmFsYW5jZSkudG9GaXhlZCgzKVxyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgdGhpcy5tZXRhRGF0YU9uZSA9IHtcclxuICAgICAgICAgICdSZXBvcnQgUGVyaW9kJzogdGhpcy5yZXBvcnRQZXJpb2QsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5tZXRhRGF0YVR3byA9IHtcclxuICAgICAgICAgICdSZXBvcnQgVXNlciAmIFRpbWUnOiBgJHt0aGlzLnJlcG9ydFVzZXJ9IEAgJHt0aGlzLnJlcG9ydFRpbWV9YCxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgICAgICAgWydBY2NvdW50IFN0YXR1czonLCB0aGlzLmFjY291bnRTdGF0dXNdLFxyXG4gICAgICAgICAgWydDdXJyZW5jeTonLCB0aGlzLmN1cnJlbmN5XSxcclxuICAgICAgICAgIFsnRGF0ZSBUeXBlOicsIHRoaXMuZGF0ZVR5cGVdLFxyXG4gICAgICAgICAgWydGcm9tIERhdGU6JywgdGhpcy5mcm9tRGF0ZV0sXHJcbiAgICAgICAgICBbJ0J1c2luZXNzIFVuaXQ6JywgdGhpcy5idXNpbmVzc1VuaXRdLFxyXG4gICAgICAgICAgWydUbyBEYXRlOicsIHRoaXMudG9EYXRlXSxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaENyaXRlcmlhID0gc2VhcmNoQ3JpdGVyaWE7XHJcblxyXG5cclxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuQ29tcGxldGU7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgdHJpYWwgYmFsYW5jZSByZXBvcnQ6JywgZXJyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmbGF0dGVuUmVwb3J0KHJlcG9ydDogVHJpYWxCYWxhbmNlUmVwb3J0KTogQWNjb3VudERldGFpbFtdIHtcclxuICAgIGNvbnN0IHJvd3M6IEFjY291bnREZXRhaWxbXSA9IFtdO1xyXG5cclxuICAgIHJlcG9ydC5tYWluQ09BR3JvdXBzLmZvckVhY2gobWFpbiA9PiB7XHJcbiAgICAgIG1haW4uc3ViQ09BR3JvdXBzLmZvckVhY2goc3ViID0+IHtcclxuICAgICAgICBzdWIuY29hR3JvdXBzLmZvckVhY2goY29hID0+IHtcclxuICAgICAgICAgIGNvYS5hY2NvdW50cy5mb3JFYWNoKGFjY291bnQgPT4gcm93cy5wdXNoKGFjY291bnQpKTtcclxuXHJcbiAgICAgICAgICByb3dzLnB1c2goe1xyXG4gICAgICAgICAgICBjb21wYW55RnVsbE5hbWU6ICcnLFxyXG4gICAgICAgICAgICBjb2FDb2RlOiAnJyxcclxuICAgICAgICAgICAgYWNjb3VudENvZGU6ICdUb3RhbDonLFxyXG4gICAgICAgICAgICBhY2NvdW50RGVzY3JpcHRpb246IGAke2NvYS5jb2FEZXNjcmlwdGlvbn1gLFxyXG4gICAgICAgICAgICBvcGVuaW5nQmFsYW5jZTogTnVtYmVyKGNvYS50b3RhbHMub3BlbmluZ0JhbGFuY2UpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICAgIGRlYml0OiBOdW1iZXIoY29hLnRvdGFscy5kZWJpdCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgICAgY3JlZGl0OiBOdW1iZXIoY29hLnRvdGFscy5jcmVkaXQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICAgIG5ldE1vdmVtZW50OiBOdW1iZXIoY29hLnRvdGFscy5uZXRNb3ZlbWVudCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgICAgY2xvc2luZ0JhbGFuY2U6IE51bWJlcihjb2EudG90YWxzLmNsb3NpbmdCYWxhbmNlKS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgICBpc1RvdGFsUm93OiB0cnVlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcm93cy5wdXNoKHtcclxuICAgICAgICAgIGNvbXBhbnlGdWxsTmFtZTogJycsXHJcbiAgICAgICAgICBjb2FDb2RlOiAnJyxcclxuICAgICAgICAgIGFjY291bnRDb2RlOiAnVG90YWw6JyxcclxuICAgICAgICAgIGFjY291bnREZXNjcmlwdGlvbjogYCR7c3ViLnN1YkNPQURlc2NyaXB0aW9ufWAsXHJcbiAgICAgICAgICBvcGVuaW5nQmFsYW5jZTogTnVtYmVyKHN1Yi50b3RhbHMub3BlbmluZ0JhbGFuY2UpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICBkZWJpdDogTnVtYmVyKHN1Yi50b3RhbHMuZGViaXQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICBjcmVkaXQ6IE51bWJlcihzdWIudG90YWxzLmNyZWRpdCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIG5ldE1vdmVtZW50OiBOdW1iZXIoc3ViLnRvdGFscy5uZXRNb3ZlbWVudCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIGNsb3NpbmdCYWxhbmNlOiBOdW1iZXIoc3ViLnRvdGFscy5jbG9zaW5nQmFsYW5jZSkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIGlzVG90YWxSb3c6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByb3dzLnB1c2goe1xyXG4gICAgICAgIGNvbXBhbnlGdWxsTmFtZTogJycsXHJcbiAgICAgICAgY29hQ29kZTogJycsXHJcbiAgICAgICAgYWNjb3VudENvZGU6ICdUb3RhbDonLFxyXG4gICAgICAgIGFjY291bnREZXNjcmlwdGlvbjogYCR7bWFpbi5tYWluQ09BRGVzY3JpcHRpb259YCxcclxuICAgICAgICBvcGVuaW5nQmFsYW5jZTogTnVtYmVyKG1haW4udG90YWxzLm9wZW5pbmdCYWxhbmNlKS50b0ZpeGVkKDMpLFxyXG4gICAgICAgIGRlYml0OiBOdW1iZXIobWFpbi50b3RhbHMuZGViaXQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgY3JlZGl0OiBOdW1iZXIobWFpbi50b3RhbHMuY3JlZGl0KS50b0ZpeGVkKDMpLFxyXG4gICAgICAgIG5ldE1vdmVtZW50OiBOdW1iZXIobWFpbi50b3RhbHMubmV0TW92ZW1lbnQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgY2xvc2luZ0JhbGFuY2U6IE51bWJlcihtYWluLnRvdGFscy5jbG9zaW5nQmFsYW5jZSkudG9GaXhlZCgzKSxcclxuICAgICAgICBpc1RvdGFsUm93OiB0cnVlXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcm93cy5wdXNoKHtcclxuICAgICAgY29tcGFueUZ1bGxOYW1lOiAnJyxcclxuICAgICAgY29hQ29kZTogJ1RPVEFMOicsXHJcbiAgICAgIGFjY291bnRDb2RlOiAnJyxcclxuICAgICAgYWNjb3VudERlc2NyaXB0aW9uOiAnJyxcclxuICAgICAgb3BlbmluZ0JhbGFuY2U6IE51bWJlcihyZXBvcnQuZ3JhbmRUb3RhbC5vcGVuaW5nQmFsYW5jZSkudG9GaXhlZCgzKSxcclxuICAgICAgZGViaXQ6IE51bWJlcihyZXBvcnQuZ3JhbmRUb3RhbC5kZWJpdCkudG9GaXhlZCgzKSxcclxuICAgICAgY3JlZGl0OiBOdW1iZXIocmVwb3J0LmdyYW5kVG90YWwuY3JlZGl0KS50b0ZpeGVkKDMpLFxyXG4gICAgICBuZXRNb3ZlbWVudDogTnVtYmVyKHJlcG9ydC5ncmFuZFRvdGFsLm5ldE1vdmVtZW50KS50b0ZpeGVkKDMpLFxyXG4gICAgICBjbG9zaW5nQmFsYW5jZTogTnVtYmVyKHJlcG9ydC5ncmFuZFRvdGFsLmNsb3NpbmdCYWxhbmNlKS50b0ZpeGVkKDMpLFxyXG4gICAgICBpc1RvdGFsUm93OiB0cnVlXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcm93cztcclxuICB9XHJcblxyXG4gIG9uR3JpZFJlYWR5KHBhcmFtczogR3JpZFJlYWR5RXZlbnQpIHtcclxuICAgIHRoaXMuZ3JpZEFwaSA9IHBhcmFtcy5hcGk7XHJcbiAgICB0aGlzLmdyaWRDb2x1bW5BcGkgPSBwYXJhbXMuY29sdW1uQXBpO1xyXG5cclxuICAgIGNvbnN0IGFsbENvbHVtbklkczogc3RyaW5nW10gPSBbXTtcclxuICAgIHBhcmFtcy5jb2x1bW5BcGkuZ2V0Q29sdW1ucygpLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XHJcbiAgICAgIGFsbENvbHVtbklkcy5wdXNoKGNvbHVtbi5nZXRDb2xJZCgpKTtcclxuICAgIH0pO1xyXG4gICAgcGFyYW1zLmNvbHVtbkFwaS5hdXRvU2l6ZUNvbHVtbnMoYWxsQ29sdW1uSWRzKTtcclxuICAgIHRoaXMub25SZXNpemUoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxyXG4gIG9uUmVzaXplKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZEFwaSAmJiB0aGlzLmdyaWRBcGkuc2l6ZUNvbHVtbnNUb0ZpdCkge1xyXG4gICAgICB0aGlzLmdyaWRBcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TZWFyY2godGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBub3JtYWxpemUgPSAoc3RyOiBhbnkpOiBzdHJpbmcgPT5cclxuICAgICAgc3RyXHJcbiAgICAgICAgPy50b1N0cmluZygpXHJcbiAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAucmVwbGFjZSgvLC9nLCAnJylcclxuICAgICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpXHJcbiAgICAgICAgLnJlcGxhY2UoL1tcXHUyMDBCLVxcdTIwMERcXHVGRUZGXS9nLCAnJylcclxuICAgICAgICAudHJpbSgpO1xyXG5cclxuICAgIGNvbnN0IHNlYXJjaCA9IG5vcm1hbGl6ZSh0ZXh0KTtcclxuXHJcbiAgICBpZiAoc2VhcmNoKSB7XHJcbiAgICAgIC8vIGZpbHRlciBmcm9tIGFscmVhZHkgZm9ybWF0dGVkIHJvd0RhdGFcclxuICAgICAgdGhpcy5yb3dEYXRhID0gdGhpcy5mbGF0dGVuUmVwb3J0KHRoaXMudHJpYWxCYWxhbmNlUmVwb3J0KVxyXG4gICAgICAgIC5tYXAoYWNjID0+ICh7XHJcbiAgICAgICAgICAuLi5hY2MsXHJcbiAgICAgICAgICBvcGVuaW5nQmFsYW5jZTogTnVtYmVyKGFjYy5vcGVuaW5nQmFsYW5jZSkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIGRlYml0OiBOdW1iZXIoYWNjLmRlYml0KS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgY3JlZGl0OiBOdW1iZXIoYWNjLmNyZWRpdCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIG5ldE1vdmVtZW50OiBOdW1iZXIoYWNjLm5ldE1vdmVtZW50KS50b0ZpeGVkKDMpLFxyXG4gICAgICAgICAgY2xvc2luZ0JhbGFuY2U6IE51bWJlcihhY2MuY2xvc2luZ0JhbGFuY2UpLnRvRml4ZWQoMylcclxuICAgICAgICB9KSlcclxuICAgICAgICAuZmlsdGVyKGl0ZW0gPT5cclxuICAgICAgICAgIE9iamVjdC52YWx1ZXMoaXRlbSkuc29tZSh2YWx1ZSA9PiBub3JtYWxpemUodmFsdWUpLmluY2x1ZGVzKHNlYXJjaCkpXHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucm93RGF0YSA9IHRoaXMuZmxhdHRlblJlcG9ydCh0aGlzLnRyaWFsQmFsYW5jZVJlcG9ydClcclxuICAgICAgICAubWFwKGFjYyA9PiAoe1xyXG4gICAgICAgICAgLi4uYWNjLFxyXG4gICAgICAgICAgb3BlbmluZ0JhbGFuY2U6IE51bWJlcihhY2Mub3BlbmluZ0JhbGFuY2UpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICBkZWJpdDogTnVtYmVyKGFjYy5kZWJpdCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIGNyZWRpdDogTnVtYmVyKGFjYy5jcmVkaXQpLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICBuZXRNb3ZlbWVudDogTnVtYmVyKGFjYy5uZXRNb3ZlbWVudCkudG9GaXhlZCgzKSxcclxuICAgICAgICAgIGNsb3NpbmdCYWxhbmNlOiBOdW1iZXIoYWNjLmNsb3NpbmdCYWxhbmNlKS50b0ZpeGVkKDMpXHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXhwb3J0KG9wdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRXhwb3J0T3B0aW9uID0gb3B0aW9uO1xyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkRXhwb3J0T3B0aW9uKSB7XHJcbiAgICAgIGNhc2UgJ2V4Y2VsJzpcclxuICAgICAgICB0aGlzLmV4cG9ydFRvRXhjZWwoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncGRmJzpcclxuICAgICAgICB0aGlzLmV4cG9ydFRvUGRmKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2Nzdic6XHJcbiAgICAgICAgdGhpcy5leHBvcnRUb0NzdigpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGFsZXJ0KCdQbGVhc2Ugc2VsZWN0IGFuIGV4cG9ydCBmb3JtYXQuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnRUb1BkZigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy50cmlhbEJhbGFuY2VSZXBvcnQ/Lm1haW5DT0FHcm91cHM/Lmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHRpdGxlID0gJ1hwcmVzcyBNb25leSAtIE1JIEFjY291bnRzJztcclxuICAgIGNvbnN0IGZpbGVOYW1lID0gJ1RyaWFsLUJhbGFuY2UtQWNjb3VudHMtUmF3LnBkZic7XHJcblxyXG4gICAgLy8gLS0tIHBhZ2UgJiBsYXlvdXQgLS0tXHJcbiAgICBjb25zdCBkb2MgPSBuZXcganNQREYoeyBvcmllbnRhdGlvbjogJ2xhbmRzY2FwZScsIHVuaXQ6ICdtbScsIGZvcm1hdDogWzMxMiwgMjEwXSB9KTtcclxuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpO1xyXG4gICAgY29uc3QgbWFyZ2luTGVmdCA9IDE1O1xyXG4gICAgY29uc3QgbG9nb1dpZHRoID0gMzguNCwgbG9nb0hlaWdodCA9IDE3LjUsIGxvZ29YID0gbWFyZ2luTGVmdCwgbG9nb1kgPSA4O1xyXG4gICAgY29uc3QgdGl0bGVZID0gMTg7XHJcbiAgICBsZXQgY3VycmVudFkgPSB0aXRsZVkgKyAxNDtcclxuXHJcbiAgICBjb25zdCBsYWJlbFZhbHVlR2FwID0gMjtcclxuICAgIGNvbnN0IHBhaXJHYXAgPSAxNTtcclxuXHJcbiAgICAvLyAtLS0gbWV0YWRhdGEgLS0tXHJcbiAgICBjb25zdCBtZXRhZGF0YTogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgICBbJ1JlcG9ydCBQZXJpb2Q6JywgdGhpcy5yZXBvcnRQZXJpb2RdLFxyXG4gICAgICBbJ1JlcG9ydCBVc2VyICYgVGltZSA6ICcsIGAke3RoaXMucmVwb3J0VXNlcn1AJHt0aGlzLnJlcG9ydFRpbWV9YF0sXHJcbiAgICBdO1xyXG5cclxuICAgIC8vIC0tLSBzZWFyY2ggY3JpdGVyaWEgLS0tXHJcbiAgICBjb25zdCBzZWFyY2hDcml0ZXJpYSA9IHRoaXMuc2VhcmNoQ3JpdGVyaWE7XHJcblxyXG4gICAgLy8gLS0tIGRyYXcgbG9nbyArIHRpdGxlIC0tLVxyXG4gICAgaWYgKHRoaXMuZXhwb3J0U2VydmljZT8ubG9nb0Jhc2U2NCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGRvYy5hZGRJbWFnZSh0aGlzLmV4cG9ydFNlcnZpY2UubG9nb0Jhc2U2NCwgJ1BORycsIGxvZ29YLCBsb2dvWSwgbG9nb1dpZHRoLCBsb2dvSGVpZ2h0KTtcclxuICAgICAgfSBjYXRjaCB7IH1cclxuICAgIH1cclxuICAgIGRvYy5zZXRGb250U2l6ZSgxNSk7XHJcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcclxuICAgIGRvYy50ZXh0KHRpdGxlLCBwYWdlV2lkdGggLyAyLCB0aXRsZVksIHsgYWxpZ246ICdjZW50ZXInIH0pO1xyXG5cclxuICAgIC8vIC0tLSBkcmF3IG1ldGFkYXRhIC0tLVxyXG4gICAgZG9jLnNldEZvbnRTaXplKDEwKTtcclxuICAgIG1ldGFkYXRhLmZvckVhY2goKFtsYWJlbCwgdmFsdWVdLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IHkgPSBjdXJyZW50WSArIGkgKiA2O1xyXG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcclxuICAgICAgZG9jLnRleHQobGFiZWwsIG1hcmdpbkxlZnQsIHkpO1xyXG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xyXG4gICAgICBjb25zdCBsYWJlbFdpZHRoID0gZG9jLmdldFRleHRXaWR0aChsYWJlbCArICcgJyk7XHJcbiAgICAgIGRvYy50ZXh0KHZhbHVlLCBtYXJnaW5MZWZ0ICsgbGFiZWxXaWR0aCArIGxhYmVsVmFsdWVHYXAsIHkpO1xyXG4gICAgfSk7XHJcbiAgICBjdXJyZW50WSArPSBtZXRhZGF0YS5sZW5ndGggKiA2ICsgNjtcclxuXHJcbiAgICAvLyAtLS0gZHJhdyBzZWFyY2ggY3JpdGVyaWEgaGVhZGluZyAtLS1cclxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgZG9jLnRleHQoJ1NlYXJjaCBDcml0ZXJpYTotJywgbWFyZ2luTGVmdCwgY3VycmVudFkpO1xyXG4gICAgY3VycmVudFkgKz0gODtcclxuXHJcbiAgICAvLyAtLS0gZHJhdyBzZWFyY2ggY3JpdGVyaWEgcGFpcnMgLS0tXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIGNvbnN0IGxlZnQgPSBzZWFyY2hDcml0ZXJpYVtpXTtcclxuICAgICAgY29uc3QgcmlnaHQgPSBzZWFyY2hDcml0ZXJpYVtpICsgMV07IC8vIG1heSBiZSB1bmRlZmluZWRcclxuXHJcbiAgICAgIC8vIC0tLSBMZWZ0IHNpZGUgLS0tXHJcbiAgICAgIGlmIChsZWZ0KSB7XHJcbiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICAgICAgZG9jLnRleHQobGVmdFswXSwgbWFyZ2luTGVmdCwgY3VycmVudFkpO1xyXG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XHJcbiAgICAgICAgY29uc3QgbGVmdExhYmVsV2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKGxlZnRbMF0gKyAnICcpO1xyXG4gICAgICAgIGRvYy50ZXh0KGxlZnRbMV0gPz8gJycsIG1hcmdpbkxlZnQgKyBsZWZ0TGFiZWxXaWR0aCArIGxhYmVsVmFsdWVHYXAsIGN1cnJlbnRZKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gLS0tIFJpZ2h0IHNpZGUgKGlmIGF2YWlsYWJsZSkgLS0tXHJcbiAgICAgIGlmIChyaWdodCkge1xyXG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICAgIGRvYy50ZXh0KHJpZ2h0WzBdLCBwYWdlV2lkdGggLyAyLCBjdXJyZW50WSk7XHJcbiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgICAgICBjb25zdCByaWdodExhYmVsV2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKHJpZ2h0WzBdICsgJyAnKTtcclxuICAgICAgICBkb2MudGV4dChyaWdodFsxXSA/PyAnJywgcGFnZVdpZHRoIC8gMiArIHJpZ2h0TGFiZWxXaWR0aCArIGxhYmVsVmFsdWVHYXAsIGN1cnJlbnRZKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3VycmVudFkgKz0gNjsgLy8gbW92ZSBkb3duIGZvciBuZXh0IGxpbmVcclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50WSArPSA0O1xyXG5cclxuICAgIC8vIC0tLSBoZWFkZXJzIC0tLVxyXG4gICAgY29uc3QgaGVhZGVycyA9IFtcclxuICAgICAgJ1NyIE5vJyxcclxuICAgICAgJ0J1c2luZXNzIFVuaXQnLFxyXG4gICAgICAnQ09BIENvZGUnLCAnQWNjb3VudCBDb2RlJywgJ0FjY291bnQgRGVzY3JpcHRpb24nLFxyXG4gICAgICAnT3BlbmluZyBCYWxhbmNlIExvY2FsIEFtdCcsICdEZWJpdHMgTG9jYWwgQW10JywgJ0NyZWRpdHMgTG9jYWwgQW10JyxcclxuICAgICAgJ05ldCBNb3ZlbWVudCBMb2NhbCBBbXQnLCAnQ2xvc2luZyBCYWxhbmNlIExvY2FsIEFtdCdcclxuICAgIF07XHJcblxyXG4gICAgY29uc3QgZmxhdFJlcG9ydCA9IHRoaXMuZmxhdHRlblJlcG9ydCh0aGlzLnRyaWFsQmFsYW5jZVJlcG9ydCk7XHJcblxyXG4gICAgLy8gLS0tIHJvd3MgLS0tXHJcbiAgICBjb25zdCByb3dzOiBhbnlbXVtdID0gZmxhdFJlcG9ydC5tYXAoKGFjYywgaSkgPT4gW1xyXG4gICAgICBpICsgMSxcclxuICAgICAgYWNjLmNvbXBhbnlGdWxsTmFtZSxcclxuICAgICAgYWNjLmNvYUNvZGUsXHJcbiAgICAgIGFjYy5hY2NvdW50Q29kZSxcclxuICAgICAgYWNjLmFjY291bnREZXNjcmlwdGlvbixcclxuICAgICAgYWNjLm9wZW5pbmdCYWxhbmNlICE9IG51bGwgPyBOdW1iZXIoYWNjLm9wZW5pbmdCYWxhbmNlKS50b0ZpeGVkKDMpIDogXCJcIixcclxuICAgICAgYWNjLmRlYml0ICE9IG51bGwgPyBOdW1iZXIoYWNjLmRlYml0KS50b0ZpeGVkKDMpIDogXCJcIixcclxuICAgICAgYWNjLmNyZWRpdCAhPSBudWxsID8gTnVtYmVyKGFjYy5jcmVkaXQpLnRvRml4ZWQoMykgOiBcIlwiLFxyXG4gICAgICBhY2MubmV0TW92ZW1lbnQgIT0gbnVsbCA/IE51bWJlcihhY2MubmV0TW92ZW1lbnQpLnRvRml4ZWQoMykgOiBcIlwiLFxyXG4gICAgICBhY2MuY2xvc2luZ0JhbGFuY2UgIT0gbnVsbCA/IE51bWJlcihhY2MuY2xvc2luZ0JhbGFuY2UpLnRvRml4ZWQoMykgOiBcIlwiXHJcbiAgICBdKTtcclxuXHJcbiAgICAvLyAtLS0gY29sdW1uIHdpZHRocyAtLS1cclxuICAgIGNvbnN0IGNvbHVtblN0eWxlczogeyBba2V5OiBudW1iZXJdOiBhbnkgfSA9IHtcclxuICAgICAgMDogeyBjZWxsV2lkdGg6IDEzIH0sXHJcbiAgICAgIDE6IHsgY2VsbFdpZHRoOiAyNSB9LFxyXG4gICAgICAyOiB7IGNlbGxXaWR0aDogMjUgfSxcclxuICAgICAgMzogeyBjZWxsV2lkdGg6IDI1IH0sXHJcbiAgICAgIDQ6IHsgY2VsbFdpZHRoOiA2MCB9LFxyXG4gICAgICA1OiB7IGNlbGxXaWR0aDogMzAgfSxcclxuICAgICAgNjogeyBjZWxsV2lkdGg6IDI4IH0sXHJcbiAgICAgIDc6IHsgY2VsbFdpZHRoOiAyOCB9LFxyXG4gICAgICA4OiB7IGNlbGxXaWR0aDogMjggfSxcclxuICAgICAgOTogeyBjZWxsV2lkdGg6IDMwIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIC0tLSBkcmF3IHRhYmxlIC0tLVxyXG4gICAgKGRvYyBhcyBhbnkpLmF1dG9UYWJsZSh7XHJcbiAgICAgIGhlYWQ6IFtoZWFkZXJzXSxcclxuICAgICAgYm9keTogcm93cyxcclxuICAgICAgc3RhcnRZOiBjdXJyZW50WSxcclxuICAgICAgdGhlbWU6ICdncmlkJyxcclxuICAgICAgaGVhZFN0eWxlczoge1xyXG4gICAgICAgIGZpbGxDb2xvcjogWzIyMCwgMjIwLCAyMjBdLFxyXG4gICAgICAgIHRleHRDb2xvcjogMCxcclxuICAgICAgICBmb250U3R5bGU6ICdib2xkJyxcclxuICAgICAgICBmb250U2l6ZTogOSxcclxuICAgICAgICBoYWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgIGNlbGxXaWR0aDogJ3dyYXAnLFxyXG4gICAgICAgIG1pbkNlbGxIZWlnaHQ6IDEwXHJcbiAgICAgIH0sXHJcbiAgICAgIGJvZHlTdHlsZXM6IHtcclxuICAgICAgICBmb250U2l6ZTogOCxcclxuICAgICAgICBmaWxsQ29sb3I6IFsyNTUsIDI1NSwgMjU1XSxcclxuICAgICAgICB0ZXh0Q29sb3I6IFswLCAwLCAwXVxyXG4gICAgICB9LFxyXG4gICAgICBzdHlsZXM6IHsgY2VsbFBhZGRpbmc6IDIsIG92ZXJmbG93OiAnbGluZWJyZWFrJywgbWluQ2VsbEhlaWdodDogNiB9LFxyXG4gICAgICBjb2x1bW5TdHlsZXMsXHJcbiAgICAgIGRpZFBhcnNlQ2VsbDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gZGF0YS5yb3cuaW5kZXg7XHJcbiAgICAgICAgY29uc3Qgcm93RGF0YSA9IGZsYXRSZXBvcnRbcm93SW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IGlzVG90YWxSb3cgPSByb3dEYXRhLmlzVG90YWxSb3c7XHJcblxyXG4gICAgICAgIGlmIChpc1RvdGFsUm93KSBkYXRhLmNlbGwuc3R5bGVzLmZvbnRTdHlsZSA9ICdib2xkJztcclxuXHJcbiAgICAgICAgLy8gaGlnaGxpZ2h0IG5lZ2F0aXZlcyBpbiByZWRcclxuICAgICAgICBpZiAoZGF0YS5jb2x1bW4uaW5kZXggPiA0KSB7XHJcbiAgICAgICAgICBjb25zdCBrZXlNYXAgPSBbXCJvcGVuaW5nQmFsYW5jZVwiLCBcImRlYml0XCIsIFwiY3JlZGl0XCIsIFwibmV0TW92ZW1lbnRcIiwgXCJjbG9zaW5nQmFsYW5jZVwiXTtcclxuICAgICAgICAgIGNvbnN0IGtleSA9IGtleU1hcFtkYXRhLmNvbHVtbi5pbmRleCAtIDVdO1xyXG4gICAgICAgICAgY29uc3QgcmF3ID0gcm93RGF0YVtrZXldO1xyXG4gICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHJhdyk7XHJcbiAgICAgICAgICBpZiAoIWlzTmFOKG51bSkgJiYgbnVtIDwgMCkge1xyXG4gICAgICAgICAgICBkYXRhLmNlbGwuc3R5bGVzLnRleHRDb2xvciA9IFsyNTUsIDAsIDBdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gLS0tIHBhZ2UgbnVtYmVycyAtLS1cclxuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSAoZG9jIGFzIGFueSkuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWxQYWdlczsgaSsrKSB7XHJcbiAgICAgIGRvYy5zZXRQYWdlKGkpO1xyXG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XHJcbiAgICAgIGNvbnN0IGZvb3RlclkgPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gNjtcclxuICAgICAgZG9jLnRleHQoYFBhZ2UgJHtpfSBvZiAke3RvdGFsUGFnZXN9YCwgcGFnZVdpZHRoIC0gMTUsIGZvb3RlclksIHsgYWxpZ246ICdyaWdodCcgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIHNhdmUgUERGIC0tLVxyXG4gICAgZG9jLnNhdmUoZmlsZU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0VG9FeGNlbCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy50cmlhbEJhbGFuY2VSZXBvcnQ/Lm1haW5DT0FHcm91cHM/Lmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGZpbGVOYW1lID0gJ1RyaWFsLUJhbGFuY2UtQWNjb3VudHMtUmF3Lnhsc3gnO1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgRXhjZWxKUy5Xb3JrYm9vaygpO1xyXG4gICAgY29uc3Qgc2hlZXQgPSB3b3JrYm9vay5hZGRXb3Jrc2hlZXQoJ1RyaWFsIEJhbGFuY2UnKTtcclxuXHJcbiAgICBsZXQgY3VycmVudFJvdyA9IDE7XHJcblxyXG4gICAgLy8gLS0tIGFkZCBsb2dvIGlmIGF2YWlsYWJsZSAtLS1cclxuICAgIGlmICh0aGlzLmV4cG9ydFNlcnZpY2U/LmxvZ29CYXNlNjQpIHtcclxuICAgICAgY29uc3QgYmFzZTY0RGF0YSA9IHRoaXMuZXhwb3J0U2VydmljZS5sb2dvQmFzZTY0LnJlcGxhY2UoL15kYXRhOmltYWdlXFwvXFx3KztiYXNlNjQsLywgJycpO1xyXG4gICAgICBjb25zdCBpbWFnZUlkID0gd29ya2Jvb2suYWRkSW1hZ2UoeyBiYXNlNjQ6IGJhc2U2NERhdGEsIGV4dGVuc2lvbjogJ3BuZycgfSk7XHJcbiAgICAgIHNoZWV0LmFkZEltYWdlKGltYWdlSWQsIHsgdGw6IHsgY29sOiAwLCByb3c6IDAgfSwgZXh0OiB7IHdpZHRoOiAxMjAsIGhlaWdodDogNjAgfSwgZWRpdEFzOiAnb25lQ2VsbCcgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIHRpdGxlIC0tLVxyXG4gICAgY29uc3QgdGl0bGUgPSAnWHByZXNzIE1vbmV5IC0gTUkgQWNjb3VudHMnO1xyXG4gICAgc2hlZXQubWVyZ2VDZWxscygxLCAzLCAxLCAxMCk7XHJcbiAgICBjb25zdCB0aXRsZUNlbGwgPSBzaGVldC5nZXRDZWxsKCdDMScpO1xyXG4gICAgdGl0bGVDZWxsLnZhbHVlID0gdGl0bGU7XHJcbiAgICB0aXRsZUNlbGwuZm9udCA9IHsgc2l6ZTogMTUsIGJvbGQ6IHRydWUgfTtcclxuICAgIHRpdGxlQ2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdjZW50ZXInLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgIGN1cnJlbnRSb3cgPSA0O1xyXG5cclxuICAgIC8vIC0tLSBtZXRhZGF0YSAtLS1cclxuICAgIGNvbnN0IG1ldGFkYXRhOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXHJcbiAgICAgIFsnUmVwb3J0IFBlcmlvZDonLCB0aGlzLnJlcG9ydFBlcmlvZF0sXHJcbiAgICAgIFsnUmVwb3J0IFVzZXIgJiBUaW1lIDogJywgYCR7dGhpcy5yZXBvcnRVc2VyfUAke3RoaXMucmVwb3J0VGltZX1gXSxcclxuICAgIF07XHJcbiAgICBtZXRhZGF0YS5mb3JFYWNoKChbbGFiZWwsIHZhbHVlXSkgPT4ge1xyXG4gICAgICBzaGVldC5tZXJnZUNlbGxzKGN1cnJlbnRSb3csIDEsIGN1cnJlbnRSb3csIDYpO1xyXG4gICAgICBjb25zdCByb3cgPSBzaGVldC5nZXRSb3coY3VycmVudFJvdysrKTtcclxuICAgICAgcm93LmdldENlbGwoMSkudmFsdWUgPSB7IHJpY2hUZXh0OiBbeyB0ZXh0OiBsYWJlbCArICcgJywgZm9udDogeyBib2xkOiB0cnVlIH0gfSwgeyB0ZXh0OiB2YWx1ZSB9XSB9O1xyXG4gICAgICByb3cuZ2V0Q2VsbCgxKS5hbGlnbm1lbnQgPSB7IHZlcnRpY2FsOiAnbWlkZGxlJywgd3JhcFRleHQ6IHRydWUgfTtcclxuICAgIH0pO1xyXG4gICAgY3VycmVudFJvdysrO1xyXG5cclxuICAgIC8vIC0tLSBzZWFyY2ggY3JpdGVyaWEgaGVhZGluZyAtLS1cclxuICAgIHNoZWV0Lm1lcmdlQ2VsbHMoY3VycmVudFJvdywgMSwgY3VycmVudFJvdywgNik7XHJcbiAgICBzaGVldC5nZXRDZWxsKGN1cnJlbnRSb3csIDEpLnZhbHVlID0gJ1NlYXJjaCBDcml0ZXJpYTotJztcclxuICAgIHNoZWV0LmdldENlbGwoY3VycmVudFJvdywgMSkuZm9udCA9IHsgYm9sZDogdHJ1ZSB9O1xyXG4gICAgY3VycmVudFJvdyArPSAyO1xyXG5cclxuICAgIC8vIC0tLSBzZWFyY2ggY3JpdGVyaWEgLS0tXHJcbiAgICBjb25zdCBzZWFyY2hDcml0ZXJpYSA9IHRoaXMuc2VhcmNoQ3JpdGVyaWE7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWFyY2hDcml0ZXJpYS5sZW5ndGg7IGkgKz0gMikge1xyXG4gICAgICBjb25zdCBsZWZ0ID0gc2VhcmNoQ3JpdGVyaWFbaV07XHJcbiAgICAgIGNvbnN0IHJpZ2h0ID0gc2VhcmNoQ3JpdGVyaWFbaSArIDFdOyAvLyBtYXkgYmUgdW5kZWZpbmVkXHJcbiAgICAgIGNvbnN0IHJvdyA9IHNoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xyXG5cclxuICAgICAgLy8gTGVmdCBjZWxsXHJcbiAgICAgIHNoZWV0Lm1lcmdlQ2VsbHMocm93Lm51bWJlciwgMSwgcm93Lm51bWJlciwgMyk7XHJcbiAgICAgIHJvdy5nZXRDZWxsKDEpLnZhbHVlID0ge1xyXG4gICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICB7IHRleHQ6IChsZWZ0Py5bMF0gPz8gJycpICsgJyAnLCBmb250OiB7IGJvbGQ6IHRydWUgfSB9LFxyXG4gICAgICAgICAgeyB0ZXh0OiBsZWZ0Py5bMV0gPz8gJycgfVxyXG4gICAgICAgIF1cclxuICAgICAgfTtcclxuICAgICAgcm93LmdldENlbGwoMSkuYWxpZ25tZW50ID0geyB3cmFwVGV4dDogdHJ1ZSwgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcblxyXG4gICAgICAvLyBSaWdodCBjZWxsIChvbmx5IGlmIHByZXNlbnQpXHJcbiAgICAgIGlmIChyaWdodCkge1xyXG4gICAgICAgIHNoZWV0Lm1lcmdlQ2VsbHMocm93Lm51bWJlciwgNCwgcm93Lm51bWJlciwgNik7XHJcbiAgICAgICAgcm93LmdldENlbGwoNCkudmFsdWUgPSB7XHJcbiAgICAgICAgICByaWNoVGV4dDogW1xyXG4gICAgICAgICAgICB7IHRleHQ6IChyaWdodD8uWzBdID8/ICcnKSArICcgJywgZm9udDogeyBib2xkOiB0cnVlIH0gfSxcclxuICAgICAgICAgICAgeyB0ZXh0OiByaWdodD8uWzFdID8/ICcnIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJvdy5nZXRDZWxsKDQpLmFsaWdubWVudCA9IHsgd3JhcFRleHQ6IHRydWUsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjdXJyZW50Um93Kys7XHJcblxyXG4gICAgLy8gLS0tIGhlYWRlcnMgLS0tXHJcbiAgICBjb25zdCBoZWFkZXJzID0gW1xyXG4gICAgICAnU3IgTm8nLFxyXG4gICAgICAnQnVzaW5lc3MgVW5pdCcsXHJcbiAgICAgICdDT0EgQ29kZScsICdBY2NvdW50IENvZGUnLCAnQWNjb3VudCBEZXNjcmlwdGlvbicsXHJcbiAgICAgICdPcGVuaW5nIEJhbGFuY2UgTG9jYWwgQW10JywgJ0RlYml0cyBMb2NhbCBBbXQnLCAnQ3JlZGl0cyBMb2NhbCBBbXQnLFxyXG4gICAgICAnTmV0IE1vdmVtZW50IExvY2FsIEFtdCcsICdDbG9zaW5nIEJhbGFuY2UgTG9jYWwgQW10J1xyXG4gICAgXTtcclxuICAgIGNvbnN0IGhlYWRlclJvdyA9IHNoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xyXG4gICAgaGVhZGVycy5mb3JFYWNoKChoLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNlbGwgPSBoZWFkZXJSb3cuZ2V0Q2VsbChpICsgMSk7XHJcbiAgICAgIGNlbGwudmFsdWUgPSBoO1xyXG4gICAgICBjZWxsLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgICAgY2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdjZW50ZXInLCB2ZXJ0aWNhbDogJ21pZGRsZScsIHdyYXBUZXh0OiB0cnVlIH07XHJcbiAgICAgIGNlbGwuZmlsbCA9IHsgdHlwZTogJ3BhdHRlcm4nLCBwYXR0ZXJuOiAnc29saWQnLCBmZ0NvbG9yOiB7IGFyZ2I6ICdEQ0RDREMnIH0gfTtcclxuICAgICAgY2VsbC5ib3JkZXIgPSB7IHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LCBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LCByaWdodDogeyBzdHlsZTogJ3RoaW4nIH0gfTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIC0tLSByb3dzIHdpdGggMyBkZWNpbWFscyBmb3IgbnVtZXJpYyBjb2x1bW5zIC0tLVxyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZmxhdHRlblJlcG9ydCh0aGlzLnRyaWFsQmFsYW5jZVJlcG9ydCkubWFwKChhY2MsIGlkeCkgPT4ge1xyXG4gICAgICBjb25zdCBudW1lcmljQ29sdW1ucyA9IFsnb3BlbmluZ0JhbGFuY2UnLCAnZGViaXQnLCAnY3JlZGl0JywgJ25ldE1vdmVtZW50JywgJ2Nsb3NpbmdCYWxhbmNlJ107XHJcbiAgICAgIGNvbnN0IHJvd0RhdGEgPSBudW1lcmljQ29sdW1ucy5tYXAoY29sID0+IHtcclxuICAgICAgICBjb25zdCB2YWwgPSBOdW1iZXIoYWNjW2NvbF0pO1xyXG4gICAgICAgIHJldHVybiAhaXNOYU4odmFsKSA/IHZhbC50b0ZpeGVkKDMpIDogJyc7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIGlkeCArIDEsXHJcbiAgICAgICAgYWNjLmNvbXBhbnlGdWxsTmFtZSxcclxuICAgICAgICBhY2MuY29hQ29kZSxcclxuICAgICAgICBhY2MuYWNjb3VudENvZGUsXHJcbiAgICAgICAgYWNjLmFjY291bnREZXNjcmlwdGlvbixcclxuICAgICAgICAuLi5yb3dEYXRhLFxyXG4gICAgICAgIGFjYy5pc1RvdGFsUm93IHx8IGZhbHNlXHJcbiAgICAgIF07XHJcbiAgICB9KTtcclxuXHJcbiAgICByb3dzLmZvckVhY2gociA9PiB7XHJcbiAgICAgIGNvbnN0IHJvdyA9IHNoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xyXG4gICAgICByLnNsaWNlKDAsIDEwKS5mb3JFYWNoKCh2YWwsIGkpID0+IHtcclxuICAgICAgICBjb25zdCBjZWxsID0gcm93LmdldENlbGwoaSArIDEpO1xyXG4gICAgICAgIC8vIGNvbnZlcnQgYmFjayB0byBudW1iZXIgZm9yIEV4Y2VsIG1hdGggYnV0IHNob3cgMyBkZWNpbWFsc1xyXG4gICAgICAgIGlmIChpID4gNCAmJiB2YWwgIT09ICcnKSBjZWxsLnZhbHVlID0gcGFyc2VGbG9hdCh2YWwudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgZWxzZSBjZWxsLnZhbHVlID0gdmFsO1xyXG5cclxuICAgICAgICBjZWxsLmJvcmRlciA9IHsgdG9wOiB7IHN0eWxlOiAndGhpbicgfSwgbGVmdDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfSB9O1xyXG5cclxuICAgICAgICAvLyBib2xkIHRvdGFsIHJvd3NcclxuICAgICAgICBpZiAoclsxMF0pIGNlbGwuZm9udCA9IHsgYm9sZDogdHJ1ZSB9O1xyXG5cclxuICAgICAgICAvLyBuZWdhdGl2ZSBudW1iZXJzIHJlZFxyXG4gICAgICAgIGlmIChpID4gNCAmJiB0eXBlb2YgY2VsbC52YWx1ZSA9PT0gJ251bWJlcicgJiYgY2VsbC52YWx1ZSA8IDApIHtcclxuICAgICAgICAgIGNlbGwuZm9udCA9IHsgY29sb3I6IHsgYXJnYjogJ0ZGMDAwMCcgfSwgYm9sZDogclsxMF0gPyB0cnVlIDogdW5kZWZpbmVkIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzZXQgbnVtYmVyIGZvcm1hdCB0byBzaG93IDMgZGVjaW1hbHNcclxuICAgICAgICBpZiAoaSA+IDQpIGNlbGwubnVtRm10ID0gJzAuMDAwJztcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyAtLS0gY29sdW1uIHdpZHRocyAtLS1cclxuICAgIGNvbnN0IHdpZHRocyA9IFs4LCAxNiwgMTUsIDE1LCA0MCwgMjAsIDIwLCAyMCwgMjAsIDIwXTtcclxuICAgIHdpZHRocy5mb3JFYWNoKCh3LCBpKSA9PiBzaGVldC5nZXRDb2x1bW4oaSArIDEpLndpZHRoID0gdyk7XHJcblxyXG4gICAgLy8gLS0tIHNhdmUgZmlsZSAtLS1cclxuICAgIHdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKS50aGVuKGJ1ZmZlciA9PiB7XHJcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnIH0pO1xyXG4gICAgICBGaWxlU2F2ZXIuc2F2ZUFzKGJsb2IsIGZpbGVOYW1lKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0VG9Dc3YoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMudHJpYWxCYWxhbmNlUmVwb3J0Py5tYWluQ09BR3JvdXBzPy5sZW5ndGgpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBmaWxlTmFtZSA9ICdUcmlhbC1CYWxhbmNlLUFjY291bnRzLVJhdy5jc3YnO1xyXG5cclxuICAgIC8vIC0tLSBtZXRhZGF0YSAtLS1cclxuICAgIGNvbnN0IG1ldGFkYXRhOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXHJcbiAgICAgIFsnUmVwb3J0IFRpdGxlOicsICdYcHJlc3MgTW9uZXkgLSBNSSBBY2NvdW50cyddLFxyXG4gICAgICBbJ1JlcG9ydCBQZXJpb2Q6JywgdGhpcy5yZXBvcnRQZXJpb2RdLFxyXG4gICAgICBbJ1JlcG9ydCBVc2VyICYgVGltZSA6ICcsIGAke3RoaXMucmVwb3J0VXNlcn1AJHt0aGlzLnJlcG9ydFRpbWV9YF0sXHJcbiAgICBdO1xyXG5cclxuICAgIC8vIC0tLSBzZWFyY2ggY3JpdGVyaWEgLS0tXHJcbiAgICBjb25zdCBzZWFyY2hDcml0ZXJpYSA9IHRoaXMuc2VhcmNoQ3JpdGVyaWE7XHJcblxyXG4gICAgLy8gLS0tIHRhYmxlIGhlYWRlcnMgKGFkZCBTciBObyBhdCBzdGFydCkgLS0tXHJcbiAgICBjb25zdCBoZWFkZXJzID0gW1xyXG4gICAgICAnU3IgTm8nLFxyXG4gICAgICAnQnVzaW5lc3MgVW5pdCcsXHJcbiAgICAgICdDT0EgQ29kZScsICdBY2NvdW50IENvZGUnLCAnQWNjb3VudCBEZXNjcmlwdGlvbicsXHJcbiAgICAgICdPcGVuaW5nIEJhbGFuY2UgTG9jYWwgQW10JywgJ0RlYml0cyBMb2NhbCBBbXQnLCAnQ3JlZGl0cyBMb2NhbCBBbXQnLFxyXG4gICAgICAnTmV0IE1vdmVtZW50IExvY2FsIEFtdCcsICdDbG9zaW5nIEJhbGFuY2UgTG9jYWwgQW10J1xyXG4gICAgXTtcclxuXHJcbiAgICAvLyAtLS0gdGFibGUgcm93cyAocHJlcGVuZCBTciBObykgLS0tXHJcbiAgICBjb25zdCByb3dzOiBhbnlbXVtdID0gdGhpcy5mbGF0dGVuUmVwb3J0KHRoaXMudHJpYWxCYWxhbmNlUmVwb3J0KS5tYXAoKGFjYywgaW5kZXgpID0+IFtcclxuICAgICAgaW5kZXggKyAxLCAvLyBTciBOb1xyXG4gICAgICBhY2MuY29tcGFueUZ1bGxOYW1lLFxyXG4gICAgICBhY2MuY29hQ29kZSxcclxuICAgICAgYWNjLmFjY291bnRDb2RlLFxyXG4gICAgICBhY2MuYWNjb3VudERlc2NyaXB0aW9uLFxyXG4gICAgICBOdW1iZXIoYWNjLm9wZW5pbmdCYWxhbmNlKS50b0ZpeGVkKDMpLFxyXG4gICAgICBOdW1iZXIoYWNjLmRlYml0KS50b0ZpeGVkKDMpLFxyXG4gICAgICBOdW1iZXIoYWNjLmNyZWRpdCkudG9GaXhlZCgzKSxcclxuICAgICAgTnVtYmVyKGFjYy5uZXRNb3ZlbWVudCkudG9GaXhlZCgzKSxcclxuICAgICAgTnVtYmVyKGFjYy5jbG9zaW5nQmFsYW5jZSkudG9GaXhlZCgzKVxyXG4gICAgXSk7XHJcblxyXG4gICAgLy8gLS0tIGhlbHBlciB0byBlc2NhcGUgQ1NWIHZhbHVlcyAtLS1cclxuICAgIGNvbnN0IGVzY2FwZUNzdiA9ICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XHJcbiAgICAgIGNvbnN0IHN0ciA9IHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgIHJldHVybiBzdHIuaW5jbHVkZXMoJywnKSB8fCBzdHIuaW5jbHVkZXMoJ1wiJykgfHwgc3RyLmluY2x1ZGVzKCdcXG4nKVxyXG4gICAgICAgID8gYFwiJHtzdHIucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImBcclxuICAgICAgICA6IHN0cjtcclxuICAgIH07XHJcblxyXG4gICAgLy8gLS0tIGJ1aWxkIENTViBjb250ZW50IC0tLVxyXG4gICAgbGV0IGNzdkNvbnRlbnQgPSAnJztcclxuXHJcbiAgICAvLyBtZXRhZGF0YVxyXG4gICAgbWV0YWRhdGEuZm9yRWFjaCgoW2xhYmVsLCB2YWx1ZV0pID0+IHtcclxuICAgICAgY3N2Q29udGVudCArPSBgJHtlc2NhcGVDc3YobGFiZWwpfSR7ZXNjYXBlQ3N2KHZhbHVlKX0sXFxuYDtcclxuICAgIH0pO1xyXG4gICAgY3N2Q29udGVudCArPSAnXFxuJzsgLy8gZ2FwXHJcblxyXG4gICAgLy8gLS0tIHNlYXJjaCBjcml0ZXJpYSBoZWFkaW5nIC0tLVxyXG4gICAgY3N2Q29udGVudCArPSAnU2VhcmNoIENyaXRlcmlhOi1cXG4nO1xyXG5cclxuICAgIC8vIC0tLSBzZWFyY2ggY3JpdGVyaWEgKDIgcGVyIHJvdywgZHluYW1pYykgLS0tXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIGNvbnN0IGxlZnQgPSBzZWFyY2hDcml0ZXJpYVtpXTtcclxuICAgICAgY29uc3QgcmlnaHQgPSBzZWFyY2hDcml0ZXJpYVtpICsgMV07XHJcblxyXG4gICAgICAvLyBMZWZ0IHNpZGVcclxuICAgICAgaWYgKGxlZnQpIGNzdkNvbnRlbnQgKz0gYCR7ZXNjYXBlQ3N2KGxlZnRbMF0pfSAke2VzY2FwZUNzdihsZWZ0WzFdKX0sYDtcclxuXHJcbiAgICAgIC8vIFJpZ2h0IHNpZGVcclxuICAgICAgaWYgKHJpZ2h0KSBjc3ZDb250ZW50ICs9IGAgJHtlc2NhcGVDc3YocmlnaHRbMF0pfSAke2VzY2FwZUNzdihyaWdodFsxXSl9LGA7XHJcblxyXG4gICAgICBjc3ZDb250ZW50ICs9ICdcXG4nO1xyXG4gICAgfVxyXG4gICAgY3N2Q29udGVudCArPSAnXFxuJzsgLy8gYmxhbmsgbGluZSBhZnRlciBjcml0ZXJpYVxyXG5cclxuICAgIC8vIHRhYmxlIGhlYWRlcnNcclxuICAgIGNzdkNvbnRlbnQgKz0gaGVhZGVycy5tYXAoaCA9PiBlc2NhcGVDc3YoaCkpLmpvaW4oJywnKSArICdcXG4nO1xyXG5cclxuICAgIC8vIHRhYmxlIHJvd3NcclxuICAgIHJvd3MuZm9yRWFjaChyb3cgPT4ge1xyXG4gICAgICBjc3ZDb250ZW50ICs9IHJvdy5tYXAoY2VsbCA9PiBlc2NhcGVDc3YoY2VsbCkpLmpvaW4oJywnKSArICdcXG4nO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gLS0tIHRyaWdnZXIgZG93bmxvYWQgLS0tXHJcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NzdkNvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XHJcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcclxuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVOYW1lKTtcclxuICAgIGxpbmsuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgIGxpbmsuY2xpY2soKTtcclxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XHJcbiAgfVxyXG5cclxuICBnZXRSZXBvcnQocGF5bG9hZDogYW55KSB7XHJcbiAgICBjb25zdCBtb2RhbCA9IHBheWxvYWQ/Lm1vZGFsIHx8IHBheWxvYWQ7XHJcblxyXG4gICAgdGhpcy5mcm9tRGF0ZSA9IGZvcm1hdERhdGUobW9kYWwuZnJvbURhdGUsICdkZC9NTS95eXl5JywgJ2VuLVVTJyk7XHJcbiAgICB0aGlzLnRvRGF0ZSA9IGZvcm1hdERhdGUobW9kYWwudG9EYXRlLCAnZGQvTU0veXl5eScsICdlbi1VUycpO1xyXG5cclxuICAgIGNvbnN0IHJlcTogVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnRSZXF1ZXN0RFRPID0ge1xyXG4gICAgICB5ZWFyOiBOdW1iZXIobW9kYWwuZmluYW5jaWFsWWVhciksXHJcbiAgICAgIGRhdGVUeXBlOiBtb2RhbC5kYXRlVHlwZSxcclxuICAgICAgZnJvbURhdGU6IG1vZGFsLmZyb21EYXksXHJcbiAgICAgIHRvRGF0ZTogbW9kYWwudG9EYXksXHJcbiAgICAgIGFjY291bnRTdGF0dXM6IG1vZGFsLmFjY291bnRTdGF0dXMuam9pbignLCcpLFxyXG4gICAgICBidXNpbmVzc1VuaXQ6IG1vZGFsLmJ1c2luZXNzVW5pdCxcclxuICAgICAgY3VycmVuY3k6IG1vZGFsLmN1cnJlbmN5LFxyXG4gICAgICBjb21wYW55Q29kZTogbW9kYWwuYnVzaW5lc3NVbml0LFxyXG4gICAgICByZXBvcnRQZXJpb2Q6IGAke2Zvcm1hdERhdGUobW9kYWwuZnJvbURhdGUsICdkZC9NTS95eXl5JywgJ2VuLVVTJyl9IC0gJHtmb3JtYXREYXRlKG1vZGFsLnRvRGF0ZSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKX1gLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmdldFRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KHJlcSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVGb3JtVmFsaWQoaXNWYWxpZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5pc0Zvcm1WYWxpZCA9IGlzVmFsaWQ7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8bGliLXNlYXJjaC1maWx0ZXIgW1JlcG9ydE5hbWVdPVwiUmVwb3J0TmFtZVwiIChzZWFyY2hDbGlja2VkKT1cImdldFJlcG9ydCgkZXZlbnQpXCJcclxuICAoZm9ybVZhbGlkKT1cImhhbmRsZUZvcm1WYWxpZCgkZXZlbnQpXCI+PC9saWItc2VhcmNoLWZpbHRlcj5cclxuPGFwcC1sb2FkZXIgY2xhc3M9XCJcIiAqbmdJZj1cImxvYWRpbmdTdGF0ZSA9PSBDb21wb25lbnRMb2FkaW5nU3RhdGUuTG9hZGluZ1wiPjwvYXBwLWxvYWRlcj5cclxuXHJcbjxkaXYgKm5nSWY9XCJkYXRhUmVhZHkgJiYgdHJpYWxCYWxhbmNlUmVwb3J0Py5tYWluQ09BR3JvdXBzPy5sZW5ndGggPiAwICYmaXNGb3JtVmFsaWRcIj5cclxuICA8bGliLW1ldGFkYXRhIFtyZXBvcnROYW1lXT1cIidYcHJlc3MgTW9uZXkgLSBNSSBBY2NvdW50cydcIiBbc2hvd21ldGFEYXRhT25lXT1cInRydWVcIiBbc2hvd21ldGFEYXRhVHdvXT1cInRydWVcIlxyXG4gICAgW21ldGFEYXRhT25lXT1cIm1ldGFEYXRhT25lXCIgW21ldGFEYXRhVHdvXT1cIm1ldGFEYXRhVHdvXCIgKGV4cG9ydEV2ZW50KT1cImhhbmRsZUV4cG9ydCgkZXZlbnQpXCJcclxuICAgIChzZWFyY2hFdmVudCk9XCJvblNlYXJjaCgkZXZlbnQpXCI+PC9saWItbWV0YWRhdGE+XHJcblxyXG4gIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCIgKm5nSWY9XCJyb3dEYXRhICYmIHJvd0RhdGEubGVuZ3RoID4gMFwiPlxyXG4gICAgPGxpYi1wYWdlLXNpemUtc2VsZWN0b3IgW3RvdGFsRW50cmllc109XCJyb3dEYXRhPy5sZW5ndGhcIiBbZGVmYXVsdFNpemVdPVwiJzE1J1wiXHJcbiAgICAgIFtncmlkQXBpXT1cImdyaWRBcGlcIj48L2xpYi1wYWdlLXNpemUtc2VsZWN0b3I+XHJcblxyXG4gICAgPGFnLWdyaWQtYW5ndWxhciBjbGFzcz1cImFnLXRoZW1lLWFscGluZSB0cmFuc2FjdGlvbi1ncmlkXCIgc3R5bGU9XCJoZWlnaHQ6IDM4MHB4O1wiIFtkb21MYXlvdXRdPVwiJ25vcm1hbCdcIlxyXG4gICAgICBbcm93RGF0YV09XCJyb3dEYXRhXCIgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiIFtjb2x1bW5EZWZzXT1cImNvbHVtbkRlZnNcIiBbcm93Q2xhc3NSdWxlc109XCJyb3dDbGFzc1J1bGVzXCJcclxuICAgICAgW3BhZ2luYXRpb25dPVwidHJ1ZVwiIChncmlkUmVhZHkpPVwib25HcmlkUmVhZHkoJGV2ZW50KVwiIFtwYWdpbmF0aW9uUGFnZVNpemVdPVwicGFnZVNpemVcIiBbcm93SGVpZ2h0XT1cIjIwXCJcclxuICAgICAgW2hlYWRlckhlaWdodF09XCIyMlwiIChwYWdpbmF0aW9uQ2hhbmdlZCk9XCJvblJlc2l6ZSgpXCI+PC9hZy1ncmlkLWFuZ3VsYXI+XHJcblxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZyBtdC0zXCIgKm5nSWY9XCJ0cmlhbEJhbGFuY2VSZXBvcnQ/Lm1haW5DT0FHcm91cHM/Lmxlbmd0aD09MFwiPlxyXG4gIE5vIERhdGEgZm91bmQgbWF0Y2hpbmcgeW91ciBzZWFyY2ggY3JpdGVyaWEuXHJcbjwvZGl2PiJdfQ==