@sachin9822/reports-lib 0.0.213 → 0.0.215
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.
- package/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +240 -0
- package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +614 -0
- package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +218 -0
- package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +263 -0
- package/esm2020/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.mjs +718 -0
- package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +275 -0
- package/esm2020/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.mjs +192 -0
- package/esm2020/lib/components/funding-report/funding-report.component.mjs +198 -0
- package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +244 -0
- package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +776 -0
- package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +282 -0
- package/esm2020/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.mjs +332 -0
- package/esm2020/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.mjs +631 -0
- package/esm2020/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.mjs +2 -0
- package/esm2020/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.mjs +2 -0
- package/esm2020/lib/models/accounting-report/accounting-report-branch-group.mjs +2 -0
- package/esm2020/lib/models/accounting-report/accounting-report-entry-model.mjs +2 -0
- package/esm2020/lib/models/accounting-report/accounting-report-model.mjs +2 -0
- package/esm2020/lib/models/accounting-report/accounting-report-sub-group.mjs +2 -0
- package/esm2020/lib/models/app-config.model.mjs +2 -0
- package/esm2020/lib/models/branch-activity-receive-report/branch-activity-receive.model.mjs +2 -0
- package/esm2020/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.mjs +6 -0
- package/esm2020/lib/models/branch-activity-report/branch-activity-send-report.mjs +3 -0
- package/esm2020/lib/models/cancellation-transaction-report/cancellation-transaction.model.mjs +10 -0
- package/esm2020/lib/models/component-loading-states.mjs +7 -0
- package/esm2020/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.mjs +5 -0
- package/esm2020/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.mjs +2 -0
- package/esm2020/lib/models/statement-of-account-report/statement-of-accounts.model.mjs +2 -0
- package/esm2020/lib/models/transaction-enquiry-report/transaction-enquiry.model.mjs +8 -0
- package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.mjs +6 -0
- package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report.mjs +5 -0
- package/esm2020/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.mjs +3 -0
- package/esm2020/lib/reports-lib-routing.module.mjs +24 -0
- package/esm2020/lib/reports-lib.component.mjs +22 -0
- package/esm2020/lib/reports-lib.module.mjs +172 -0
- package/esm2020/lib/reports-lib.service.mjs +14 -0
- package/esm2020/lib/services/config.service.mjs +39 -0
- package/esm2020/lib/services/report.service.mjs +374 -0
- package/esm2020/lib/shared/export-generic.service.mjs +443 -0
- package/esm2020/lib/shared/export.service.mjs +379 -0
- package/esm2020/lib/shared/loader/loader.component.mjs +11 -0
- package/esm2020/lib/shared/metadata/metadata.component.mjs +51 -0
- package/esm2020/lib/shared/page-size-selector/page-size-selector.component.mjs +44 -0
- package/esm2020/lib/shared/search-filter/search-filter.component.mjs +2147 -0
- package/esm2020/lib/shared/shared.module.mjs +21 -0
- package/esm2020/public-api.mjs +41 -0
- package/esm2020/sachin9822-reports-lib.mjs +5 -0
- package/fesm2015/sachin9822-reports-lib.mjs +8649 -0
- package/fesm2015/sachin9822-reports-lib.mjs.map +1 -0
- package/fesm2020/sachin9822-reports-lib.mjs +8510 -0
- package/fesm2020/sachin9822-reports-lib.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.d.ts +70 -0
- package/lib/components/accounting-report/accounting-report.component.d.ts +76 -0
- package/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.d.ts +58 -0
- package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +69 -0
- package/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.d.ts +78 -0
- package/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.d.ts +108 -0
- package/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.d.ts +55 -0
- package/lib/components/funding-report/funding-report.component.d.ts +55 -0
- package/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.d.ts +57 -0
- package/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.d.ts +109 -0
- package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +76 -0
- package/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.d.ts +69 -0
- package/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.d.ts +71 -0
- package/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.d.ts +8 -0
- package/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.d.ts +18 -0
- package/lib/models/accounting-report/accounting-report-branch-group.d.ts +6 -0
- package/lib/models/accounting-report/accounting-report-entry-model.d.ts +24 -0
- package/lib/models/accounting-report/accounting-report-model.d.ts +6 -0
- package/{src/lib/models/accounting-report/accounting-report-sub-group.ts → lib/models/accounting-report/accounting-report-sub-group.d.ts} +2 -3
- package/{src/lib/models/app-config.model.ts → lib/models/app-config.model.d.ts} +7 -8
- package/lib/models/branch-activity-receive-report/branch-activity-receive.model.d.ts +18 -0
- package/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.d.ts +13 -0
- package/lib/models/branch-activity-report/branch-activity-send-report.d.ts +24 -0
- package/lib/models/cancellation-transaction-report/cancellation-transaction.model.d.ts +44 -0
- package/lib/models/component-loading-states.d.ts +5 -0
- package/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.d.ts +26 -0
- 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
- package/lib/models/statement-of-account-report/statement-of-accounts.model.d.ts +18 -0
- package/lib/models/transaction-enquiry-report/transaction-enquiry.model.d.ts +113 -0
- package/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.d.ts +13 -0
- package/lib/models/transaction-monitoring-report/transaction-monitoring-report.d.ts +23 -0
- package/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.d.ts +38 -0
- package/lib/reports-lib-routing.module.d.ts +7 -0
- package/lib/reports-lib.component.d.ts +8 -0
- package/lib/reports-lib.module.d.ts +33 -0
- package/lib/reports-lib.service.d.ts +6 -0
- package/lib/services/config.service.d.ts +20 -0
- package/lib/services/report.service.d.ts +80 -0
- package/lib/shared/export-generic.service.d.ts +50 -0
- package/lib/shared/export.service.d.ts +32 -0
- package/lib/shared/loader/loader.component.d.ts +5 -0
- package/lib/shared/metadata/metadata.component.d.ts +24 -0
- package/lib/shared/page-size-selector/page-size-selector.component.d.ts +15 -0
- package/lib/shared/search-filter/search-filter.component.d.ts +127 -0
- package/lib/shared/shared.module.d.ts +11 -0
- package/package.json +31 -16
- package/{src/public-api.ts → public-api.d.ts} +7 -17
- package/karma.conf.js +0 -44
- package/ng-package.json +0 -17
- package/src/assets/images/BreadcrumbArrow.png +0 -0
- package/src/assets/images/XMCoral.png +0 -0
- package/src/lib/assets/images/Search.svg +0 -10
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.html +0 -27
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.scss +0 -46
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.spec.ts +0 -23
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.ts +0 -292
- package/src/lib/components/accounting-report/accounting-report.component.html +0 -64
- package/src/lib/components/accounting-report/accounting-report.component.scss +0 -24
- package/src/lib/components/accounting-report/accounting-report.component.spec.ts +0 -23
- package/src/lib/components/accounting-report/accounting-report.component.ts +0 -738
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.html +0 -46
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.scss +0 -2
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.spec.ts +0 -23
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.ts +0 -247
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.html +0 -46
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.scss +0 -3
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.spec.ts +0 -23
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.ts +0 -276
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.html +0 -51
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.scss +0 -7
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.spec.ts +0 -23
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.ts +0 -840
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.html +0 -68
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.scss +0 -65
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.spec.ts +0 -23
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.ts +0 -290
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.html +0 -25
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.scss +0 -1
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.spec.ts +0 -23
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.ts +0 -213
- package/src/lib/components/funding-report/funding-report.component.html +0 -49
- package/src/lib/components/funding-report/funding-report.component.scss +0 -1
- package/src/lib/components/funding-report/funding-report.component.spec.ts +0 -23
- package/src/lib/components/funding-report/funding-report.component.ts +0 -221
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.html +0 -26
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.scss +0 -1
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.spec.ts +0 -23
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.ts +0 -267
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.html +0 -95
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.scss +0 -54
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.spec.ts +0 -23
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.ts +0 -904
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.html +0 -49
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.scss +0 -2
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.spec.ts +0 -32
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.ts +0 -304
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.html +0 -46
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.scss +0 -7
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.ts +0 -343
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.html +0 -25
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.scss +0 -23
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.spec.ts +0 -23
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.ts +0 -745
- package/src/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.ts +0 -10
- package/src/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.ts +0 -20
- package/src/lib/models/accounting-report/accounting-report-branch-group.ts +0 -7
- package/src/lib/models/accounting-report/accounting-report-entry-model.ts +0 -25
- package/src/lib/models/accounting-report/accounting-report-model.ts +0 -7
- package/src/lib/models/branch-activity-receive-report/branch-activity-receive.model.ts +0 -18
- package/src/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.ts +0 -16
- package/src/lib/models/branch-activity-report/branch-activity-send-report.ts +0 -26
- package/src/lib/models/cancellation-transaction-report/cancellation-transaction.model.ts +0 -65
- package/src/lib/models/component-loading-states.ts +0 -5
- package/src/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.ts +0 -28
- package/src/lib/models/statement-of-account-report/statement-of-accounts.model.ts +0 -21
- package/src/lib/models/transaction-enquiry-report/transaction-enquiry.model.ts +0 -127
- package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.ts +0 -16
- package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report.ts +0 -29
- package/src/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.ts +0 -46
- package/src/lib/reports-lib-routing.module.ts +0 -20
- package/src/lib/reports-lib.component.spec.ts +0 -23
- package/src/lib/reports-lib.component.ts +0 -20
- package/src/lib/reports-lib.module.ts +0 -102
- package/src/lib/reports-lib.service.spec.ts +0 -16
- package/src/lib/reports-lib.service.ts +0 -9
- package/src/lib/services/config.service.ts +0 -43
- package/src/lib/services/report.service.spec.ts +0 -16
- package/src/lib/services/report.service.ts +0 -463
- package/src/lib/shared/export-generic.service.ts +0 -557
- package/src/lib/shared/export.service.spec.ts +0 -16
- package/src/lib/shared/export.service.ts +0 -457
- package/src/lib/shared/loader/loader.component.html +0 -8
- package/src/lib/shared/loader/loader.component.scss +0 -52
- package/src/lib/shared/loader/loader.component.ts +0 -10
- package/src/lib/shared/metadata/metadata.component.html +0 -42
- package/src/lib/shared/metadata/metadata.component.scss +0 -95
- package/src/lib/shared/metadata/metadata.component.spec.ts +0 -23
- package/src/lib/shared/metadata/metadata.component.ts +0 -38
- package/src/lib/shared/page-size-selector/page-size-selector.component.html +0 -7
- package/src/lib/shared/page-size-selector/page-size-selector.component.scss +0 -42
- package/src/lib/shared/page-size-selector/page-size-selector.component.spec.ts +0 -23
- package/src/lib/shared/page-size-selector/page-size-selector.component.ts +0 -38
- package/src/lib/shared/search-filter/search-filter.component.html +0 -601
- package/src/lib/shared/search-filter/search-filter.component.scss +0 -203
- package/src/lib/shared/search-filter/search-filter.component.spec.ts +0 -23
- package/src/lib/shared/search-filter/search-filter.component.ts +0 -2387
- package/src/lib/shared/shared.module.ts +0 -13
- package/src/styles/ag-grid-report-style.scss +0 -71
- package/src/styles/common-ag-grid-style.scss +0 -146
- package/src/styles/common-report-style.scss +0 -395
- package/src/styles/common-style.scss +0 -615
- package/src/test.ts +0 -27
- package/tsconfig.lib.json +0 -15
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -17
- /package/{src/lib → lib}/assets/config/app-config.json +0 -0
- /package/{src → lib}/assets/images/Search.svg +0 -0
- /package/{src/lib → lib}/assets/images/XMLogo.png +0 -0
- /package/{src/lib → lib}/assets/svg-loaders/blue-tail-spin.svg +0 -0
|
@@ -0,0 +1,614 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { formatDate } from '@angular/common';
|
|
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 "@ng-bootstrap/ng-bootstrap";
|
|
16
|
+
import * as i8 from "../../shared/loader/loader.component";
|
|
17
|
+
import * as i9 from "../../shared/search-filter/search-filter.component";
|
|
18
|
+
export class AccountingReportComponent {
|
|
19
|
+
constructor(reportService, exportService) {
|
|
20
|
+
this.reportService = reportService;
|
|
21
|
+
this.exportService = exportService;
|
|
22
|
+
this.ReportName = "Accounting";
|
|
23
|
+
this.ComponentLoadingState = ComponentLoadingStates;
|
|
24
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
|
25
|
+
this.noDataFound = false;
|
|
26
|
+
this.searchText = '';
|
|
27
|
+
this.rowData = [];
|
|
28
|
+
this.pageSize = 15;
|
|
29
|
+
this.selectedExportOption = 'excel';
|
|
30
|
+
this.exportFormats = [{ formatName: "Excel", code: 'excel' }, { formatName: "PDF", code: 'pdf' }, { formatName: "CSV", code: 'csv' }];
|
|
31
|
+
this.isFormValid = false;
|
|
32
|
+
this.defaultColDef = {
|
|
33
|
+
resizable: true,
|
|
34
|
+
sortable: true,
|
|
35
|
+
filter: true,
|
|
36
|
+
minWidth: 40,
|
|
37
|
+
suppressSizeToFit: false,
|
|
38
|
+
cellStyle: { userSelect: 'text', 'line-height': '1.2', 'white-space': 'normal', 'word-break': 'normal', 'overflow-wrap': 'break-word' },
|
|
39
|
+
// Header wrapping
|
|
40
|
+
wrapHeaderText: true,
|
|
41
|
+
autoHeaderHeight: true,
|
|
42
|
+
// Cell wrapping
|
|
43
|
+
wrapText: true,
|
|
44
|
+
autoHeight: true
|
|
45
|
+
};
|
|
46
|
+
this.columnDefs = [
|
|
47
|
+
{ headerName: 'BusinessDate', field: 'businessDate', tooltipField: 'businessDate' },
|
|
48
|
+
{ headerName: 'TxnDate&Time', field: 'transactionDateAndTime', tooltipField: 'transactionDateAndTime', minWidth: 110, },
|
|
49
|
+
{ headerName: 'Transaction Number', field: 'transactionNumber', tooltipField: 'transactionNumber' },
|
|
50
|
+
{ headerName: 'SendClient', field: 'sendClient', tooltipField: 'sendClient' },
|
|
51
|
+
{ headerName: 'Principle SendClient (If Applicable)', field: 'principleSendClient', tooltipField: 'principleSendClient', width: 90, minWidth: 80, maxWidth: 110 },
|
|
52
|
+
{ headerName: 'ReceiveClient', field: 'receiveClient', tooltipField: 'receiveClient' },
|
|
53
|
+
{ headerName: 'Principle ReceiveClient (If Applicable)', field: 'principleReceiveClient', tooltipField: 'principleReceiveClient', width: 100, minWidth: 90, maxWidth: 120 },
|
|
54
|
+
{ headerName: 'Is Sender Corporate', field: 'senderType', flex: 1, minWidth: 80,
|
|
55
|
+
valueFormatter: (params) => { if (!params.value)
|
|
56
|
+
return ''; const value = params.value.toUpperCase(); if (value === 'CORPORATE')
|
|
57
|
+
return 'YES'; if (value === 'INDIVIDUAL')
|
|
58
|
+
return 'NO'; return ''; },
|
|
59
|
+
tooltipValueGetter: (params) => { if (!params.value)
|
|
60
|
+
return ''; const value = params.value.toUpperCase(); if (value === 'CORPORATE')
|
|
61
|
+
return 'YES'; if (value === 'INDIVIDUAL')
|
|
62
|
+
return 'NO'; return ''; } },
|
|
63
|
+
{ headerName: 'Is Beneficiary Corporate', field: 'beneficiaryType', flex: 1, minWidth: 80,
|
|
64
|
+
valueFormatter: (params) => { if (!params.value)
|
|
65
|
+
return ''; const value = params.value.toUpperCase(); if (value === 'CORPORATE')
|
|
66
|
+
return 'YES'; if (value === 'INDIVIDUAL')
|
|
67
|
+
return 'NO'; return ''; },
|
|
68
|
+
tooltipValueGetter: (params) => { if (!params.value)
|
|
69
|
+
return ''; const value = params.value.toUpperCase(); if (value === 'CORPORATE')
|
|
70
|
+
return 'YES'; if (value === 'INDIVIDUAL')
|
|
71
|
+
return 'NO'; return ''; } },
|
|
72
|
+
{ headerName: 'ReceiveCcy', field: 'receiveCurrency', tooltipField: 'receiveCurrency' },
|
|
73
|
+
{ headerName: 'AmountPaid', field: 'amountPaid', tooltipField: 'amountPaid', cellClass: 'ag-right-aligned-cell' },
|
|
74
|
+
{ headerName: 'SendCcy', field: 'sendCurrency', tooltipField: 'sendCurrency', },
|
|
75
|
+
{ headerName: 'ServiceFee', field: 'serviceFee', tooltipField: 'serviceFee', cellClass: 'ag-right-aligned-cell' },
|
|
76
|
+
{ headerName: 'Tax', field: 'tax', tooltipField: 'tax', cellClass: 'ag-right-aligned-cell' },
|
|
77
|
+
{ headerName: 'PrincipleSend Amount', field: 'principleSendAmount', tooltipField: 'principleSendAmount', cellClass: 'ag-right-aligned-cell' },
|
|
78
|
+
{ headerName: 'Transaction Status', field: 'transactionStatus', tooltipField: 'transactionStatus' },
|
|
79
|
+
{ headerName: 'SettlementCcy', field: 'settlementCurrency', tooltipField: 'settlementCurrency', cellClass: 'ag-right-aligned-cell' },
|
|
80
|
+
{ headerName: 'ClientSettl (in SCcy)', field: 'clientSettlementInSCcy', tooltipField: 'clientSettlementInSCcy', cellClass: 'ag-right-aligned-cell' },
|
|
81
|
+
{ headerName: 'ClientSettl (in USD)', field: 'clientSettlementInUSD', tooltipField: 'clientSettlementInUSD', cellClass: 'ag-right-aligned-cell' },
|
|
82
|
+
{ headerName: 'ShareType', field: 'shareType', tooltipField: 'shareType' },
|
|
83
|
+
{ headerName: 'ShareValue', field: 'shareValue', tooltipField: 'shareValue', cellClass: 'ag-right-aligned-cell' },
|
|
84
|
+
{ headerName: 'Send/Receive FeeCcy', field: 'sendReceiveFeeCcy', tooltipField: 'sendReceiveFeeCcy' },
|
|
85
|
+
{ headerName: 'ShareAmt (in USD)', field: 'shareAmountInUSD', tooltipField: 'shareAmountInUSD', cellClass: 'ag-right-aligned-cell' },
|
|
86
|
+
{ headerName: 'Settlement Rate', field: 'settlementRate', tooltipField: 'settlementRate', cellClass: 'ag-right-aligned-cell' },
|
|
87
|
+
];
|
|
88
|
+
this.gridApis = [];
|
|
89
|
+
this.gridColumnApis = [];
|
|
90
|
+
this.ezremitUser = false;
|
|
91
|
+
this.originalGroupEntries = [];
|
|
92
|
+
}
|
|
93
|
+
ngOnInit() {
|
|
94
|
+
const ezremitusername = sessionStorage.getItem('ezremitusername');
|
|
95
|
+
if (ezremitusername) {
|
|
96
|
+
this.ezremitUser = true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
getAccountingReport(request) {
|
|
100
|
+
this.loadingState = ComponentLoadingStates.Loading;
|
|
101
|
+
this.accountingReportModel = undefined;
|
|
102
|
+
this.branchNameAndCode = undefined;
|
|
103
|
+
this.subGroupColumn = undefined;
|
|
104
|
+
const finalReq = request;
|
|
105
|
+
this.reportService.getAccountingReport(finalReq).subscribe(data => {
|
|
106
|
+
this.accountingReportModel = data;
|
|
107
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
|
108
|
+
this.noDataFound = Object.keys(this.accountingReportModel.accountingReportByBranchGroups).length == 0 ? true : false;
|
|
109
|
+
const branchCount = this.accountingReportModel.accountingReportByBranchGroups.length;
|
|
110
|
+
this.paginationArray = new Array(branchCount * 2).fill(15);
|
|
111
|
+
this.reportUser = this.accountingReportModel.reportUser;
|
|
112
|
+
this.reportTime = formatDate(new Date(), 'dd/MM/yyyy hh:mm a', 'en-US');
|
|
113
|
+
this.reportPeriod = `${formatDate(finalReq.startDate, 'dd/MM/yyyy', 'en-US')} - ${formatDate(finalReq.endDate, 'dd/MM/yyyy', 'en-US')}`;
|
|
114
|
+
this.leftData = {
|
|
115
|
+
'Report Period': `${this.reportPeriod}`,
|
|
116
|
+
};
|
|
117
|
+
this.rightData = {
|
|
118
|
+
'Report User & Time': `${this.reportUser} @ ${this.reportTime}`,
|
|
119
|
+
};
|
|
120
|
+
// Deep copy to preserve original data for search
|
|
121
|
+
this.originalGroupEntries = this.accountingReportModel.accountingReportByBranchGroups.map(group => ({
|
|
122
|
+
...group,
|
|
123
|
+
sendTransactions: {
|
|
124
|
+
...group.sendTransactions,
|
|
125
|
+
entries: [...group.sendTransactions.entries]
|
|
126
|
+
},
|
|
127
|
+
receiveTransactions: {
|
|
128
|
+
...group.receiveTransactions,
|
|
129
|
+
entries: [...group.receiveTransactions.entries]
|
|
130
|
+
}
|
|
131
|
+
}));
|
|
132
|
+
}, error => {
|
|
133
|
+
console.log(error);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
async handleExport(option) {
|
|
137
|
+
this.selectedExportOption = option;
|
|
138
|
+
switch (this.selectedExportOption) {
|
|
139
|
+
case 'excel':
|
|
140
|
+
this.exportToExcel();
|
|
141
|
+
break;
|
|
142
|
+
case 'pdf':
|
|
143
|
+
this.exportToPdf();
|
|
144
|
+
break;
|
|
145
|
+
case 'csv':
|
|
146
|
+
this.exportToCsv();
|
|
147
|
+
break;
|
|
148
|
+
default:
|
|
149
|
+
alert('Please select an export format.');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
onSearch(text) {
|
|
153
|
+
const normalize = (str) => str?.toString()
|
|
154
|
+
.toLowerCase()
|
|
155
|
+
.replace(/,/g, '')
|
|
156
|
+
.replace(/\s+/g, ' ')
|
|
157
|
+
.replace(/[\u200B-\u200D\uFEFF]/g, '')
|
|
158
|
+
.trim();
|
|
159
|
+
this.searchText = text;
|
|
160
|
+
const search = normalize(text);
|
|
161
|
+
if (!this.originalGroupEntries?.length)
|
|
162
|
+
return;
|
|
163
|
+
// Build filtered branch groups
|
|
164
|
+
const filteredGroups = this.originalGroupEntries.map(group => {
|
|
165
|
+
const originalSendEntries = group.sendTransactions.entries || [];
|
|
166
|
+
const originalReceiveEntries = group.receiveTransactions.entries || [];
|
|
167
|
+
const filteredSend = search
|
|
168
|
+
? originalSendEntries.filter(entry => Object.values(entry).some(value => normalize(value).includes(search)))
|
|
169
|
+
: [...originalSendEntries];
|
|
170
|
+
const filteredReceive = search
|
|
171
|
+
? originalReceiveEntries.filter(entry => Object.values(entry).some(value => normalize(value).includes(search)))
|
|
172
|
+
: [...originalReceiveEntries];
|
|
173
|
+
return {
|
|
174
|
+
...group,
|
|
175
|
+
sendTransactions: { ...group.sendTransactions, entries: filteredSend },
|
|
176
|
+
receiveTransactions: { ...group.receiveTransactions, entries: filteredReceive }
|
|
177
|
+
};
|
|
178
|
+
});
|
|
179
|
+
// 🔹 Keep only branches that have any matching entries
|
|
180
|
+
this.accountingReportModel.accountingReportByBranchGroups =
|
|
181
|
+
filteredGroups.filter(g => g.sendTransactions.entries.length > 0 || g.receiveTransactions.entries.length > 0);
|
|
182
|
+
// Reset grids for visible branches
|
|
183
|
+
this.accountingReportModel.accountingReportByBranchGroups.forEach((group, index) => {
|
|
184
|
+
[group.sendTransactions.entries, group.receiveTransactions.entries].forEach((entries, idx) => {
|
|
185
|
+
const gridApi = this.gridApis[index * 2 + idx];
|
|
186
|
+
if (gridApi) {
|
|
187
|
+
gridApi.setRowData(entries);
|
|
188
|
+
if (gridApi.paginationGoToFirstPage)
|
|
189
|
+
gridApi.paginationGoToFirstPage();
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
onGridReady(params, id) {
|
|
195
|
+
this.gridApis[id] = params.api;
|
|
196
|
+
this.gridColumnApis[id] = params.columnApi;
|
|
197
|
+
setTimeout(() => this.autoSizeAllColumns(id), 100);
|
|
198
|
+
}
|
|
199
|
+
onGridSizeChanged(params, id) {
|
|
200
|
+
this.autoSizeAllColumns(id);
|
|
201
|
+
}
|
|
202
|
+
autoSizeAllColumns(id, skipHeader = false) {
|
|
203
|
+
const columnApi = this.gridColumnApis[id];
|
|
204
|
+
if (!columnApi)
|
|
205
|
+
return;
|
|
206
|
+
const allColumnIds = [];
|
|
207
|
+
columnApi.getColumns().forEach((column) => {
|
|
208
|
+
allColumnIds.push(column.getId());
|
|
209
|
+
});
|
|
210
|
+
columnApi.autoSizeColumns(allColumnIds, skipHeader);
|
|
211
|
+
}
|
|
212
|
+
formatNumber(params) {
|
|
213
|
+
if (params.value == null)
|
|
214
|
+
return '';
|
|
215
|
+
const field = params.colDef.field;
|
|
216
|
+
if (field === 'settlementRate') {
|
|
217
|
+
return Number(params.value).toFixed(8);
|
|
218
|
+
}
|
|
219
|
+
return Number(params.value).toFixed(3);
|
|
220
|
+
}
|
|
221
|
+
exportToPdf() {
|
|
222
|
+
if (!this.accountingReportModel.accountingReportByBranchGroups?.length)
|
|
223
|
+
return;
|
|
224
|
+
const title = 'Accounting Report';
|
|
225
|
+
const fileName = 'Accounting-Report.pdf';
|
|
226
|
+
const metadata = [
|
|
227
|
+
['Report Period:', this.reportPeriod],
|
|
228
|
+
['Report User & Time : ', `${this.reportUser}@${this.reportTime}`],
|
|
229
|
+
];
|
|
230
|
+
// // --- search criteria ---
|
|
231
|
+
const searchCriteria = this.searchCriteria;
|
|
232
|
+
const doc = new jsPDF({ orientation: 'landscape', unit: 'mm', format: [700, 210] });
|
|
233
|
+
const logoWidth = 38.4, logoHeight = 17.5, logoX = 15, logoY = 8;
|
|
234
|
+
const pageWidth = doc.internal.pageSize.width;
|
|
235
|
+
const marginLeft = 15;
|
|
236
|
+
const titleY = 18;
|
|
237
|
+
// Logo
|
|
238
|
+
if (this.exportService['logoBase64']) {
|
|
239
|
+
doc.addImage(this.exportService['logoBase64'], 'PNG', logoX, logoY, logoWidth, logoHeight);
|
|
240
|
+
}
|
|
241
|
+
// Title
|
|
242
|
+
doc.setFontSize(15);
|
|
243
|
+
doc.setFont('helvetica', 'bold');
|
|
244
|
+
doc.text(title, pageWidth / 2, titleY, { align: 'center' });
|
|
245
|
+
let currentY = titleY + 14;
|
|
246
|
+
// Metadata
|
|
247
|
+
doc.setFontSize(10);
|
|
248
|
+
metadata.forEach(([label, value], i) => {
|
|
249
|
+
const y = currentY + i * 7;
|
|
250
|
+
doc.setFont('helvetica', 'bold');
|
|
251
|
+
doc.text(label, 15, y);
|
|
252
|
+
const labelWidth = doc.getTextWidth(label + ' ');
|
|
253
|
+
doc.setFont('helvetica', 'normal');
|
|
254
|
+
doc.text(value ?? '', 15 + labelWidth, y);
|
|
255
|
+
});
|
|
256
|
+
currentY += metadata.length * 7 + 5;
|
|
257
|
+
//==================================
|
|
258
|
+
// --- draw search criteria heading ---
|
|
259
|
+
doc.setFont('helvetica', 'bold');
|
|
260
|
+
doc.text('Search Criteria:-', marginLeft, currentY);
|
|
261
|
+
currentY += 8;
|
|
262
|
+
const rowHeightPerLine = 6;
|
|
263
|
+
const minGap = 2; // gap between key and value
|
|
264
|
+
const betweenColumnsGap = 15; // gap between left and right columns (you can tune this)
|
|
265
|
+
const pageContentWidth = doc.internal.pageSize.width - 2 * marginLeft;
|
|
266
|
+
// --- helper function to measure total width of a key-value pair ---
|
|
267
|
+
const measurePairWidth = (key, value) => {
|
|
268
|
+
doc.setFont('helvetica', 'bold');
|
|
269
|
+
const keyWidth = doc.getTextWidth(key + ' ');
|
|
270
|
+
doc.setFont('helvetica', 'normal');
|
|
271
|
+
const valueWidth = doc.getTextWidth(value);
|
|
272
|
+
return keyWidth + minGap + valueWidth;
|
|
273
|
+
};
|
|
274
|
+
// --- calculate max width of left column pairs dynamically ---
|
|
275
|
+
let maxLeftPairWidth = 0;
|
|
276
|
+
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
277
|
+
if (searchCriteria[i]) {
|
|
278
|
+
const [key, value] = searchCriteria[i];
|
|
279
|
+
const width = measurePairWidth(key, value);
|
|
280
|
+
if (width > maxLeftPairWidth)
|
|
281
|
+
maxLeftPairWidth = width;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// --- compute where right column should start ---
|
|
285
|
+
const leftColumnStart = marginLeft;
|
|
286
|
+
const rightColumnStart = leftColumnStart + maxLeftPairWidth + betweenColumnsGap;
|
|
287
|
+
// --- print search criteria dynamically ---
|
|
288
|
+
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
289
|
+
let maxLineCount = 1;
|
|
290
|
+
// Left column
|
|
291
|
+
if (searchCriteria[i]) {
|
|
292
|
+
const [key, value] = searchCriteria[i];
|
|
293
|
+
doc.setFont('helvetica', 'bold');
|
|
294
|
+
doc.text(key, leftColumnStart, currentY);
|
|
295
|
+
doc.setFont('helvetica', 'normal');
|
|
296
|
+
const keyWidth = doc.getTextWidth(key + ' ');
|
|
297
|
+
const valueX = leftColumnStart + keyWidth + minGap;
|
|
298
|
+
doc.text(value, valueX, currentY);
|
|
299
|
+
}
|
|
300
|
+
// Right column
|
|
301
|
+
if (searchCriteria[i + 1]) {
|
|
302
|
+
const [key, value] = searchCriteria[i + 1];
|
|
303
|
+
doc.setFont('helvetica', 'bold');
|
|
304
|
+
doc.text(key, rightColumnStart, currentY);
|
|
305
|
+
doc.setFont('helvetica', 'normal');
|
|
306
|
+
const keyWidth = doc.getTextWidth(key + ' ');
|
|
307
|
+
const valueX = rightColumnStart + keyWidth + minGap;
|
|
308
|
+
doc.text(value, valueX, currentY);
|
|
309
|
+
}
|
|
310
|
+
currentY += rowHeightPerLine;
|
|
311
|
+
}
|
|
312
|
+
currentY += 8;
|
|
313
|
+
//==================================
|
|
314
|
+
// Branches
|
|
315
|
+
this.accountingReportModel.accountingReportByBranchGroups.forEach(group => {
|
|
316
|
+
doc.setFontSize(10);
|
|
317
|
+
doc.setFont('helvetica', 'bold');
|
|
318
|
+
const branchText = `Branch (Name & Code): ${group.branchNameAndCode}`;
|
|
319
|
+
doc.text(branchText, 15, currentY);
|
|
320
|
+
currentY += 7;
|
|
321
|
+
// Loop subgroups (Send + Receive)
|
|
322
|
+
[group.sendTransactions, group.receiveTransactions].forEach(subGroup => {
|
|
323
|
+
if (!subGroup.entries?.length)
|
|
324
|
+
return;
|
|
325
|
+
doc.setFont('helvetica', 'bold');
|
|
326
|
+
doc.text(`Sub Group: ${subGroup.subGroupName}`, 15, currentY);
|
|
327
|
+
currentY += 5;
|
|
328
|
+
const { headers, rows } = this.prepareAccountingTable(subGroup.entries);
|
|
329
|
+
doc.autoTable({
|
|
330
|
+
head: [headers],
|
|
331
|
+
body: rows,
|
|
332
|
+
startY: currentY,
|
|
333
|
+
theme: 'grid',
|
|
334
|
+
headStyles: {
|
|
335
|
+
fillColor: [220, 220, 220], textColor: 0,
|
|
336
|
+
fontStyle: 'bold', fontSize: 9, halign: 'center',
|
|
337
|
+
},
|
|
338
|
+
bodyStyles: { fontSize: 8, fillColor: [255, 255, 255], textColor: [0, 0, 0] },
|
|
339
|
+
styles: { cellPadding: 2, overflow: 'linebreak', minCellHeight: 6 },
|
|
340
|
+
});
|
|
341
|
+
currentY = doc.lastAutoTable.finalY + 10;
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
const pageCount = doc.internal.getNumberOfPages();
|
|
345
|
+
for (let i = 1; i <= pageCount; i++) {
|
|
346
|
+
doc.setFont("helvetica", "bold");
|
|
347
|
+
doc.setPage(i);
|
|
348
|
+
doc.setFontSize(9);
|
|
349
|
+
doc.setTextColor(100);
|
|
350
|
+
const footerY = doc.internal.pageSize.height - 6;
|
|
351
|
+
doc.text(`Page ${i} of ${pageCount}`, pageWidth - 15, footerY, { align: 'right' });
|
|
352
|
+
}
|
|
353
|
+
doc.save(fileName);
|
|
354
|
+
}
|
|
355
|
+
exportToExcel() {
|
|
356
|
+
if (!this.accountingReportModel.accountingReportByBranchGroups?.length)
|
|
357
|
+
return;
|
|
358
|
+
const title = 'Accounting Report';
|
|
359
|
+
const fileName = 'Accounting-Report.xlsx';
|
|
360
|
+
const workbook = new ExcelJS.Workbook();
|
|
361
|
+
const worksheet = workbook.addWorksheet('Accounting Report');
|
|
362
|
+
let currentRow = 1;
|
|
363
|
+
// Logo
|
|
364
|
+
if (this.exportService.logoBase64) {
|
|
365
|
+
const base64Data = this.exportService.logoBase64.replace(/^data:image\/\w+;base64,/, '');
|
|
366
|
+
const imageId = workbook.addImage({
|
|
367
|
+
base64: base64Data,
|
|
368
|
+
extension: 'png',
|
|
369
|
+
});
|
|
370
|
+
worksheet.addImage(imageId, { tl: { col: 0, row: 0 }, ext: { width: 145, height: 66 }, editAs: 'oneCell' });
|
|
371
|
+
}
|
|
372
|
+
// Title
|
|
373
|
+
const titleRow = worksheet.getRow(currentRow);
|
|
374
|
+
titleRow.getCell(6).value = title;
|
|
375
|
+
titleRow.getCell(6).font = { bold: true, size: 16 };
|
|
376
|
+
titleRow.getCell(6).alignment = { vertical: 'middle', horizontal: 'left' };
|
|
377
|
+
worksheet.mergeCells(`F${currentRow}:J${currentRow}`);
|
|
378
|
+
currentRow += 3;
|
|
379
|
+
// Metadata
|
|
380
|
+
const metadata = [
|
|
381
|
+
['Report Period', this.reportPeriod],
|
|
382
|
+
['Report User & Time : ', `${this.reportUser}@${this.reportTime}`],
|
|
383
|
+
];
|
|
384
|
+
metadata.forEach(([label, value]) => {
|
|
385
|
+
const row = worksheet.getRow(currentRow++);
|
|
386
|
+
row.getCell(1).value = {
|
|
387
|
+
richText: [
|
|
388
|
+
{ text: `${label}: `, font: { bold: true } },
|
|
389
|
+
{ text: value ?? '', font: { bold: false } }
|
|
390
|
+
]
|
|
391
|
+
};
|
|
392
|
+
});
|
|
393
|
+
worksheet.addRow([]);
|
|
394
|
+
currentRow++;
|
|
395
|
+
// --- search criteria ---
|
|
396
|
+
const searchCriteria = this.searchCriteria;
|
|
397
|
+
// --- search criteria heading ---
|
|
398
|
+
// --- Heading ---
|
|
399
|
+
worksheet.mergeCells(currentRow, 1, currentRow, 8);
|
|
400
|
+
const headingCell = worksheet.getCell(currentRow, 1);
|
|
401
|
+
headingCell.value = 'Search Criteria:-';
|
|
402
|
+
headingCell.font = { bold: true, size: 12 };
|
|
403
|
+
headingCell.alignment = { vertical: 'middle', horizontal: 'left' };
|
|
404
|
+
currentRow += 2;
|
|
405
|
+
// --- Draw pairs dynamically (two per row) ---
|
|
406
|
+
const leftColEnd = 4; // columns 1–4 for left pair
|
|
407
|
+
const rightColStart = 5; // columns 5–8 for right pair
|
|
408
|
+
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
409
|
+
const row = worksheet.getRow(currentRow++);
|
|
410
|
+
// Left pair
|
|
411
|
+
if (searchCriteria[i]) {
|
|
412
|
+
const [key, value] = searchCriteria[i];
|
|
413
|
+
worksheet.mergeCells(row.number, 1, row.number, leftColEnd);
|
|
414
|
+
const leftCell = row.getCell(1);
|
|
415
|
+
leftCell.value = { richText: [{ text: key + ' ', font: { bold: true } }, { text: value }] };
|
|
416
|
+
leftCell.alignment = { vertical: 'middle', wrapText: true };
|
|
417
|
+
}
|
|
418
|
+
// Right pair
|
|
419
|
+
if (searchCriteria[i + 1]) {
|
|
420
|
+
const [key, value] = searchCriteria[i + 1];
|
|
421
|
+
worksheet.mergeCells(row.number, rightColStart, row.number, rightColStart + 3);
|
|
422
|
+
const rightCell = row.getCell(rightColStart);
|
|
423
|
+
rightCell.value = { richText: [{ text: key + ' ', font: { bold: true } }, { text: value }] };
|
|
424
|
+
rightCell.alignment = { vertical: 'middle', wrapText: true };
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
currentRow++;
|
|
428
|
+
// Branches
|
|
429
|
+
this.accountingReportModel.accountingReportByBranchGroups.forEach(group => {
|
|
430
|
+
const branchRow = worksheet.getRow(currentRow++);
|
|
431
|
+
branchRow.getCell(1).value = {
|
|
432
|
+
richText: [
|
|
433
|
+
{ text: 'Branch (Name & Code): ', font: { bold: true } },
|
|
434
|
+
{ text: group.branchNameAndCode ?? '', font: { bold: false } }
|
|
435
|
+
]
|
|
436
|
+
};
|
|
437
|
+
worksheet.addRow([]);
|
|
438
|
+
currentRow++;
|
|
439
|
+
// Loop subgroups
|
|
440
|
+
[group.sendTransactions, group.receiveTransactions].forEach(subGroup => {
|
|
441
|
+
if (!subGroup.entries?.length)
|
|
442
|
+
return;
|
|
443
|
+
const subGroupRow = worksheet.getRow(currentRow++);
|
|
444
|
+
subGroupRow.getCell(1).value = {
|
|
445
|
+
richText: [
|
|
446
|
+
{ text: 'Sub Group: ', font: { bold: true } },
|
|
447
|
+
{ text: subGroup.subGroupName ?? '', font: { bold: false } }
|
|
448
|
+
]
|
|
449
|
+
};
|
|
450
|
+
worksheet.addRow([]);
|
|
451
|
+
currentRow++;
|
|
452
|
+
// Headers
|
|
453
|
+
const { headers, rows } = this.prepareAccountingTable(subGroup.entries);
|
|
454
|
+
const headerRow = worksheet.getRow(currentRow++);
|
|
455
|
+
headers.forEach((header, i) => {
|
|
456
|
+
const cell = headerRow.getCell(i + 1);
|
|
457
|
+
cell.value = header;
|
|
458
|
+
cell.font = { bold: true };
|
|
459
|
+
cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'D9D9D9' } };
|
|
460
|
+
cell.alignment = { vertical: 'middle', horizontal: 'center' };
|
|
461
|
+
cell.border = { top: { style: 'thin' }, bottom: { style: 'thin' }, left: { style: 'thin' }, right: { style: 'thin' } };
|
|
462
|
+
});
|
|
463
|
+
// Rows
|
|
464
|
+
rows.forEach(r => {
|
|
465
|
+
const row = worksheet.getRow(currentRow++);
|
|
466
|
+
r.forEach((val, i) => {
|
|
467
|
+
const cell = row.getCell(i + 1);
|
|
468
|
+
cell.value = val;
|
|
469
|
+
cell.border = { top: { style: 'thin' }, bottom: { style: 'thin' }, left: { style: 'thin' }, right: { style: 'thin' } };
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
worksheet.addRow([]);
|
|
473
|
+
currentRow++;
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
// Auto-adjust column widths (including Sr No)
|
|
477
|
+
const allHeaders = ['Sr No', ...this.columnDefs.map(c => c.headerName)];
|
|
478
|
+
allHeaders.forEach((header, i) => {
|
|
479
|
+
let maxLength = header.length; // start with header length
|
|
480
|
+
this.accountingReportModel.accountingReportByBranchGroups.forEach(group => {
|
|
481
|
+
[group.sendTransactions, group.receiveTransactions].forEach(subGroup => {
|
|
482
|
+
subGroup.entries.forEach(entry => {
|
|
483
|
+
// Sr No column (i = 0) is just numbers
|
|
484
|
+
let val = i === 0 ? (subGroup.entries.indexOf(entry) + 1).toString() : (entry[this.columnDefs[i - 1]?.field] ?? '');
|
|
485
|
+
const len = val.toString().length;
|
|
486
|
+
if (len > maxLength)
|
|
487
|
+
maxLength = len;
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
});
|
|
491
|
+
worksheet.getColumn(i + 1).width = maxLength + 5; // padding
|
|
492
|
+
});
|
|
493
|
+
workbook.xlsx.writeBuffer().then(buffer => {
|
|
494
|
+
const blob = new Blob([buffer], {
|
|
495
|
+
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
496
|
+
});
|
|
497
|
+
FileSaver.saveAs(blob, fileName);
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
prepareAccountingTable(data) {
|
|
501
|
+
const currencyFields = ['amountPaid', 'serviceFee', 'tax', 'principleSendAmount', 'clientSettlementInSCcy'];
|
|
502
|
+
const headers = ['Sr No', ...this.columnDefs.map(c => c.headerName)];
|
|
503
|
+
if (!data || data.length === 0) {
|
|
504
|
+
return { headers, rows: [] }; // return headers only, empty rows
|
|
505
|
+
}
|
|
506
|
+
const rows = data.map((row, i) => {
|
|
507
|
+
return [
|
|
508
|
+
i + 1,
|
|
509
|
+
...this.columnDefs.map(col => {
|
|
510
|
+
let val = row[col.field];
|
|
511
|
+
if (val == null)
|
|
512
|
+
return '';
|
|
513
|
+
if (currencyFields.includes(col.field))
|
|
514
|
+
return parseFloat(val).toFixed(3);
|
|
515
|
+
if (col.field === 'settlementRate')
|
|
516
|
+
return parseFloat(val).toFixed(8);
|
|
517
|
+
return val;
|
|
518
|
+
})
|
|
519
|
+
];
|
|
520
|
+
});
|
|
521
|
+
return { headers, rows };
|
|
522
|
+
}
|
|
523
|
+
exportToCsv() {
|
|
524
|
+
if (!this.accountingReportModel.accountingReportByBranchGroups?.length)
|
|
525
|
+
return;
|
|
526
|
+
const fileName = 'Accounting-Report.csv';
|
|
527
|
+
const rows = [];
|
|
528
|
+
rows.push('Report Title: Accounting Report');
|
|
529
|
+
rows.push('');
|
|
530
|
+
rows.push(`Report Period: ${this.reportPeriod}`);
|
|
531
|
+
rows.push(`Report User & Time: ${this.reportUser}@${this.reportTime}`);
|
|
532
|
+
rows.push('');
|
|
533
|
+
// // --- search criteria ---
|
|
534
|
+
const searchCriteria = this.searchCriteria;
|
|
535
|
+
if (searchCriteria?.length) {
|
|
536
|
+
rows.push('Search Criteria:-');
|
|
537
|
+
// calculate max length of left key-value pairs for padding
|
|
538
|
+
const maxLeftLength = Math.max(...searchCriteria.map(([k, v]) => (k + ' ' + v).length));
|
|
539
|
+
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
540
|
+
const left = searchCriteria[i];
|
|
541
|
+
const right = searchCriteria[i + 1];
|
|
542
|
+
const leftText = left ? `${left[0]} ${left[1]}`.padEnd(maxLeftLength + 5, ' ') : '';
|
|
543
|
+
const rightText = right ? `${right[0]} ${right[1]}` : '';
|
|
544
|
+
// Each row in single CSV row; first and second pair separated by a column
|
|
545
|
+
rows.push(`"${leftText}${rightText}"`);
|
|
546
|
+
}
|
|
547
|
+
rows.push(''); // blank line after search criteria
|
|
548
|
+
}
|
|
549
|
+
this.accountingReportModel.accountingReportByBranchGroups.forEach(group => {
|
|
550
|
+
rows.push(`Branch (Name & Code): ${group.branchNameAndCode}`);
|
|
551
|
+
[group.sendTransactions, group.receiveTransactions].forEach(subGroup => {
|
|
552
|
+
if (!subGroup.entries?.length)
|
|
553
|
+
return;
|
|
554
|
+
rows.push(`Sub Group: ${subGroup.subGroupName}`);
|
|
555
|
+
// Add "Sr No" at the beginning of headers
|
|
556
|
+
rows.push(['"Sr No"', ...this.columnDefs.map(col => `"${col.headerName}"`)].join(','));
|
|
557
|
+
subGroup.entries.forEach((entry, idx) => {
|
|
558
|
+
// Add serial number at start of each row
|
|
559
|
+
const row = [
|
|
560
|
+
(idx + 1).toString(),
|
|
561
|
+
...this.columnDefs.map(col => {
|
|
562
|
+
const val = entry[col.field];
|
|
563
|
+
if (val == null)
|
|
564
|
+
return '';
|
|
565
|
+
if (['amountPaid', 'serviceFee', 'tax', 'principleSendAmount', 'clientSettlementInSCcy'].includes(col.field)) {
|
|
566
|
+
return parseFloat(val).toFixed(3);
|
|
567
|
+
}
|
|
568
|
+
if (col.field === 'settlementRate') {
|
|
569
|
+
return parseFloat(val).toFixed(8);
|
|
570
|
+
}
|
|
571
|
+
return `"${val}"`;
|
|
572
|
+
})
|
|
573
|
+
].join(',');
|
|
574
|
+
rows.push(row);
|
|
575
|
+
});
|
|
576
|
+
rows.push('');
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
const blob = new Blob([rows.join('\n')], { type: 'text/csv;charset=utf-8;' });
|
|
580
|
+
const link = document.createElement('a');
|
|
581
|
+
link.href = URL.createObjectURL(blob);
|
|
582
|
+
link.setAttribute('download', fileName);
|
|
583
|
+
document.body.appendChild(link);
|
|
584
|
+
link.click();
|
|
585
|
+
document.body.removeChild(link);
|
|
586
|
+
}
|
|
587
|
+
getReport(payload) {
|
|
588
|
+
const modal = payload?.modal || payload;
|
|
589
|
+
const req = {
|
|
590
|
+
startDate: modal.fromDate,
|
|
591
|
+
endDate: modal.toDate,
|
|
592
|
+
sendCountryCode: modal.sendCountry ?? 'ALL',
|
|
593
|
+
recvCountryCode: modal.receiveCountry ?? 'ALL',
|
|
594
|
+
businessPartnerCorrelationID: modal.client ?? 'ALL',
|
|
595
|
+
transactionStatus: modal.transactionStatus.join(","),
|
|
596
|
+
payoutCurrency: modal.currency ?? 'ALL',
|
|
597
|
+
transactionType: modal.product ?? 'ALL',
|
|
598
|
+
branchCode: modal.branch ?? 'ALL',
|
|
599
|
+
companyCode: 'ALL' // or 'BH' if your API requires it specifically
|
|
600
|
+
};
|
|
601
|
+
this.searchCriteria = payload.searchCriteria;
|
|
602
|
+
this.getAccountingReport(req);
|
|
603
|
+
}
|
|
604
|
+
handleFormValid(isValid) {
|
|
605
|
+
this.isFormValid = isValid;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
AccountingReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AccountingReportComponent, deps: [{ token: i1.ReportService }, { token: i2.ExportService }], target: i0.ɵɵFactoryTarget.Component });
|
|
609
|
+
AccountingReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: AccountingReportComponent, selector: "lib-accounting-report", ngImport: i0, template: "<lib-search-filter [ReportName]=\"ReportName\" (searchClicked)=\"getReport($event)\" (formValid)=\"handleFormValid($event)\"></lib-search-filter>\r\n\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<div *ngIf=\"accountingReportModel!=undefined && loadingState == ComponentLoadingState.Complete && !noDataFound && isFormValid\"\r\n style=\"margin-bottom: 30px;\">\r\n\r\n <lib-metadata [reportName]=\"ReportName\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\" [metaDataOne]=\"leftData\"\r\n [metaDataTwo]=\"rightData\" (exportEvent)=\"handleExport($event)\" (searchEvent)=\"onSearch($event)\"></lib-metadata>\r\n\r\n <div *ngIf=\"accountingReportModel.accountingReportByBranchGroups?.length\">\r\n <ngb-accordion #acc=\"ngbAccordion\" [closeOthers]=\"false\">\r\n <ng-container *ngFor=\"let group of accountingReportModel?.accountingReportByBranchGroups; let i = index\">\r\n <ngb-panel [id]=\"'panel-' + i\">\r\n <ng-template ngbPanelTitle>\r\n <label class=\"panel-cls\">\r\n {{ group.branchNameAndCode }}\r\n </label>\r\n </ng-template>\r\n\r\n <ng-template ngbPanelContent>\r\n <!-- Send Transactions -->\r\n <div *ngIf=\"group.sendTransactions.entries.length\">\r\n <h6 class=\"subgroupcolumn\">{{ group.sendTransactions.subGroupName }}</h6>\r\n <div style=\"position: relative;\">\r\n <lib-page-size-selector [totalEntries]=\"group.sendTransactions.entries.length\" [defaultSize]=\"'15'\"\r\n [gridApi]=\"gridApis[i * 2]\">\r\n </lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid grid-size\" style=\"width: 100%;\"\r\n [columnDefs]=\"columnDefs\" [defaultColDef]=\"defaultColDef\" [rowData]=\"group.sendTransactions.entries\"\r\n [rowHeight]=\"20\" [headerHeight]=\"24\" [pagination]=\"true\" [paginationPageSize]=\"paginationArray[i]\"\r\n (gridReady)=\"onGridReady($event, i * 2)\" (gridSizeChanged)=\"onGridSizeChanged($event, i * 2)\">\r\n </ag-grid-angular>\r\n </div>\r\n </div>\r\n\r\n <!-- Receive Transactions -->\r\n <div *ngIf=\"group.receiveTransactions.entries.length\" class=\"mt-3\">\r\n <h6 class=\"subgroupcolumn\">{{ group.receiveTransactions.subGroupName }}</h6>\r\n <div style=\"position: relative;\">\r\n <lib-page-size-selector [totalEntries]=\"group.receiveTransactions.entries.length\" [defaultSize]=\"'15'\"\r\n [gridApi]=\"gridApis[i * 2 + 1]\">\r\n </lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid grid-size\" style=\"width: 100%;\"\r\n [columnDefs]=\"columnDefs\" [defaultColDef]=\"defaultColDef\"\r\n [rowData]=\"group.receiveTransactions.entries\" [rowHeight]=\"20\" [headerHeight]=\"24\" [pagination]=\"true\"\r\n [paginationPageSize]=\"paginationArray[i]\" (gridReady)=\"onGridReady($event, i * 2 + 1)\"\r\n (gridSizeChanged)=\"onGridSizeChanged($event, i * 2)\">\r\n </ag-grid-angular>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ngb-panel>\r\n </ng-container>\r\n </ngb-accordion>\r\n </div>\r\n\r\n</div>\r\n\r\n<div class=\"alert alert-warning mt-3\" *ngIf=\"noDataFound && loadingState!=ComponentLoadingState.Loading\">\r\n No Data found matching your search criteria.\r\n</div>", styles: [".btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:110px;margin:0 0 0 20px!important;padding:4px 15px!important}.tooltip-block{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid #ccc!important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2!important}.cal:focus{box-shadow:none!important}.input-group-button{background:none;border:1px solid #0081c6;background-color:#0081c6;border-radius:0 3px 3px 0;min-width:35px;margin-left:1px;cursor:pointer}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}.meta-td{padding:0!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important;margin-right:-1;margin-left:.4rem}.opt-cls{display:block;height:100%;width:5rem;border:1px solid #ccc!important;border-radius:4px!important;margin-right:1rem!important;outline:none!important}.opt-cls:focus{box-shadow:0 0 5px 3px #1877f2}.export-selector{height:2rem!important;width:100%}.search-btn{height:32px!important;height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-btn:hover{background-color:#8091a5}.search-icon{height:16px;width:16px;object-fit:contain}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.searchBox{margin-right:auto;display:flex}table{width:100%;border-collapse:separate;margin-bottom:0!important;table-layout:fixed!important}td{padding:0 1rem 6px 0!important;border-right:0 solid #ffffff!important;background-color:#fff!important}.row-cls{height:2.5rem!important}.inputbox{padding-left:1rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"}::ng-deep .ng-select.ng-select-single .ng-select-container{height:32px I!important}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;overflow-y:auto;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container .ng-value{max-width:200px!important;overflow:hidden!important;text-overflow:hidden!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-container{cursor:default;display:flex;outline:none;overflow:hidden;position:relative;width:100%}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{box-sizing:border-box;cursor:pointer;display:block;white-space:nowrap;overflow-x:scroll!important;text-overflow:clip!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option::-webkit-scrollbar{display:none!important;width:0!important}::ng-deep .ng-select .ng-select-container:focus-within{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container:focus{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container,::ng-deep .ng-select.ng-select-single .ng-select-container,::ng-deep .ng-select.ng-select-multiple .ng-select-container{min-height:32px!important;height:32px!important;font-size:12px!important}.panel-cls{font-weight:700;font-size:13px;line-height:1.2;margin:0;padding:2px 0;color:#16181e}.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}.grid-size{width:100%!important;font-weight:500!important;height:375px!important}::ng-deep .ag-cell{-webkit-user-select:text!important;user-select:text!important}.subgroupcolumn{font-family:Open Sans!important;font-size:13px!important;color:#16181e!important;font-weight:700!important}:host ::ng-deep .my-2{margin-bottom:10px!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.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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.NgbAccordion, selector: "ngb-accordion", inputs: ["animation", "activeIds", "closeOthers", "destroyOnHide", "type"], outputs: ["panelChange", "shown", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i7.NgbPanel, selector: "ngb-panel", inputs: ["disabled", "id", "title", "type", "cardClass"], outputs: ["shown", "hidden"] }, { kind: "directive", type: i7.NgbPanelTitle, selector: "ng-template[ngbPanelTitle]" }, { kind: "directive", type: i7.NgbPanelContent, selector: "ng-template[ngbPanelContent]" }, { kind: "component", type: i8.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i9.SearchFilterComponent, selector: "lib-search-filter", inputs: ["ReportName", "initialFilters"], outputs: ["searchClicked", "formValid"] }] });
|
|
610
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AccountingReportComponent, decorators: [{
|
|
611
|
+
type: Component,
|
|
612
|
+
args: [{ selector: 'lib-accounting-report', template: "<lib-search-filter [ReportName]=\"ReportName\" (searchClicked)=\"getReport($event)\" (formValid)=\"handleFormValid($event)\"></lib-search-filter>\r\n\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<div *ngIf=\"accountingReportModel!=undefined && loadingState == ComponentLoadingState.Complete && !noDataFound && isFormValid\"\r\n style=\"margin-bottom: 30px;\">\r\n\r\n <lib-metadata [reportName]=\"ReportName\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\" [metaDataOne]=\"leftData\"\r\n [metaDataTwo]=\"rightData\" (exportEvent)=\"handleExport($event)\" (searchEvent)=\"onSearch($event)\"></lib-metadata>\r\n\r\n <div *ngIf=\"accountingReportModel.accountingReportByBranchGroups?.length\">\r\n <ngb-accordion #acc=\"ngbAccordion\" [closeOthers]=\"false\">\r\n <ng-container *ngFor=\"let group of accountingReportModel?.accountingReportByBranchGroups; let i = index\">\r\n <ngb-panel [id]=\"'panel-' + i\">\r\n <ng-template ngbPanelTitle>\r\n <label class=\"panel-cls\">\r\n {{ group.branchNameAndCode }}\r\n </label>\r\n </ng-template>\r\n\r\n <ng-template ngbPanelContent>\r\n <!-- Send Transactions -->\r\n <div *ngIf=\"group.sendTransactions.entries.length\">\r\n <h6 class=\"subgroupcolumn\">{{ group.sendTransactions.subGroupName }}</h6>\r\n <div style=\"position: relative;\">\r\n <lib-page-size-selector [totalEntries]=\"group.sendTransactions.entries.length\" [defaultSize]=\"'15'\"\r\n [gridApi]=\"gridApis[i * 2]\">\r\n </lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid grid-size\" style=\"width: 100%;\"\r\n [columnDefs]=\"columnDefs\" [defaultColDef]=\"defaultColDef\" [rowData]=\"group.sendTransactions.entries\"\r\n [rowHeight]=\"20\" [headerHeight]=\"24\" [pagination]=\"true\" [paginationPageSize]=\"paginationArray[i]\"\r\n (gridReady)=\"onGridReady($event, i * 2)\" (gridSizeChanged)=\"onGridSizeChanged($event, i * 2)\">\r\n </ag-grid-angular>\r\n </div>\r\n </div>\r\n\r\n <!-- Receive Transactions -->\r\n <div *ngIf=\"group.receiveTransactions.entries.length\" class=\"mt-3\">\r\n <h6 class=\"subgroupcolumn\">{{ group.receiveTransactions.subGroupName }}</h6>\r\n <div style=\"position: relative;\">\r\n <lib-page-size-selector [totalEntries]=\"group.receiveTransactions.entries.length\" [defaultSize]=\"'15'\"\r\n [gridApi]=\"gridApis[i * 2 + 1]\">\r\n </lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid grid-size\" style=\"width: 100%;\"\r\n [columnDefs]=\"columnDefs\" [defaultColDef]=\"defaultColDef\"\r\n [rowData]=\"group.receiveTransactions.entries\" [rowHeight]=\"20\" [headerHeight]=\"24\" [pagination]=\"true\"\r\n [paginationPageSize]=\"paginationArray[i]\" (gridReady)=\"onGridReady($event, i * 2 + 1)\"\r\n (gridSizeChanged)=\"onGridSizeChanged($event, i * 2)\">\r\n </ag-grid-angular>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ngb-panel>\r\n </ng-container>\r\n </ngb-accordion>\r\n </div>\r\n\r\n</div>\r\n\r\n<div class=\"alert alert-warning mt-3\" *ngIf=\"noDataFound && loadingState!=ComponentLoadingState.Loading\">\r\n No Data found matching your search criteria.\r\n</div>", styles: [".btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:110px;margin:0 0 0 20px!important;padding:4px 15px!important}.tooltip-block{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid #ccc!important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2!important}.cal:focus{box-shadow:none!important}.input-group-button{background:none;border:1px solid #0081c6;background-color:#0081c6;border-radius:0 3px 3px 0;min-width:35px;margin-left:1px;cursor:pointer}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}.meta-td{padding:0!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important;margin-right:-1;margin-left:.4rem}.opt-cls{display:block;height:100%;width:5rem;border:1px solid #ccc!important;border-radius:4px!important;margin-right:1rem!important;outline:none!important}.opt-cls:focus{box-shadow:0 0 5px 3px #1877f2}.export-selector{height:2rem!important;width:100%}.search-btn{height:32px!important;height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-btn:hover{background-color:#8091a5}.search-icon{height:16px;width:16px;object-fit:contain}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.searchBox{margin-right:auto;display:flex}table{width:100%;border-collapse:separate;margin-bottom:0!important;table-layout:fixed!important}td{padding:0 1rem 6px 0!important;border-right:0 solid #ffffff!important;background-color:#fff!important}.row-cls{height:2.5rem!important}.inputbox{padding-left:1rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"}::ng-deep .ng-select.ng-select-single .ng-select-container{height:32px I!important}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;overflow-y:auto;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container .ng-value{max-width:200px!important;overflow:hidden!important;text-overflow:hidden!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-container{cursor:default;display:flex;outline:none;overflow:hidden;position:relative;width:100%}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{box-sizing:border-box;cursor:pointer;display:block;white-space:nowrap;overflow-x:scroll!important;text-overflow:clip!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option::-webkit-scrollbar{display:none!important;width:0!important}::ng-deep .ng-select .ng-select-container:focus-within{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container:focus{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container,::ng-deep .ng-select.ng-select-single .ng-select-container,::ng-deep .ng-select.ng-select-multiple .ng-select-container{min-height:32px!important;height:32px!important;font-size:12px!important}.panel-cls{font-weight:700;font-size:13px;line-height:1.2;margin:0;padding:2px 0;color:#16181e}.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}.grid-size{width:100%!important;font-weight:500!important;height:375px!important}::ng-deep .ag-cell{-webkit-user-select:text!important;user-select:text!important}.subgroupcolumn{font-family:Open Sans!important;font-size:13px!important;color:#16181e!important;font-weight:700!important}:host ::ng-deep .my-2{margin-bottom:10px!important}\n"] }]
|
|
613
|
+
}], ctorParameters: function () { return [{ type: i1.ReportService }, { type: i2.ExportService }]; } });
|
|
614
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudGluZy1yZXBvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL2FjY291bnRpbmctcmVwb3J0L2FjY291bnRpbmctcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy9hY2NvdW50aW5nLXJlcG9ydC9hY2NvdW50aW5nLXJlcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUE2QixNQUFNLGVBQWUsQ0FBQztBQUtyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFL0UsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8saUJBQWlCLENBQUM7QUFDekIsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7O0FBMEJ4QyxNQUFNLE9BQU8seUJBQXlCO0lBaUZwQyxZQUFvQixhQUE0QixFQUFVLGFBQTRCO1FBQWxFLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUEvRXRGLGVBQVUsR0FBVyxZQUFZLENBQUM7UUFNbEMsMEJBQXFCLEdBQUcsc0JBQXNCLENBQUM7UUFDL0MsaUJBQVksR0FBMkIsc0JBQXNCLENBQUMsUUFBUSxDQUFDO1FBQ3ZFLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBTTdCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUViLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFF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R0FBRyxPQUFPLEVBQUUsS0FBSyxJQUFJLE9BQU8sQ0FBQztRQUV4QyxNQUFNLEdBQUcsR0FBNEI7WUFDbkMsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3pCLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNyQixlQUFlLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLO1lBQzNDLGVBQWUsRUFBRSxLQUFLLENBQUMsY0FBYyxJQUFJLEtBQUs7WUFDOUMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLO1lBQ25ELGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ3BELGNBQWMsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUs7WUFDdkMsZUFBZSxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSztZQUN2QyxVQUFVLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLO1lBQ2pDLFdBQVcsRUFBRSxLQUFLLENBQUMsK0NBQStDO1NBQ25FLENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFFN0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxlQUFlLENBQUMsT0FBZ0I7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7SUFDN0IsQ0FBQzs7c0hBaHNCVSx5QkFBeUI7MEdBQXpCLHlCQUF5Qiw2RENyQ3RDLGluSEErRE07MkZEMUJPLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWNjb3VudGluZ1JlcG9ydE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjY291bnRpbmctcmVwb3J0L2FjY291bnRpbmctcmVwb3J0LW1vZGVsJztcclxuaW1wb3J0IHsgQ29sRGVmLCBDb2x1bW5BcGksIEdyaWRBcGksIEdyaWRSZWFkeUV2ZW50IH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xyXG5pbXBvcnQgeyBSZXBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2V4cG9ydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudExvYWRpbmdTdGF0ZXMgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29tcG9uZW50LWxvYWRpbmctc3RhdGVzJztcclxuaW1wb3J0IHsgQWNjb3VudGluZ1JlcG9ydEJyYW5jaEdyb3VwIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjY291bnRpbmctcmVwb3J0L2FjY291bnRpbmctcmVwb3J0LWJyYW5jaC1ncm91cCc7XHJcbmltcG9ydCBqc1BERiBmcm9tICdqc3BkZic7XHJcbmltcG9ydCAnanNwZGYtYXV0b3RhYmxlJztcclxuaW1wb3J0ICogYXMgRXhjZWxKUyBmcm9tICdleGNlbGpzJztcclxuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5cclxuZGVjbGFyZSBtb2R1bGUgJ2pzcGRmJyB7XHJcbiAgaW50ZXJmYWNlIGpzUERGIHtcclxuICAgIGF1dG9UYWJsZTogKG9wdGlvbnM6IGFueSkgPT4ganNQREY7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRpbmdSZXBvcnRSZXF1ZXN0IHtcclxuICBzdGFydERhdGU6IHN0cmluZztcclxuICBlbmREYXRlOiBzdHJpbmc7XHJcbiAgc2VuZENvdW50cnlDb2RlOiBzdHJpbmc7XHJcbiAgcmVjdkNvdW50cnlDb2RlOiBzdHJpbmc7XHJcbiAgYnVzaW5lc3NQYXJ0bmVyQ29ycmVsYXRpb25JRDogc3RyaW5nO1xyXG4gIHRyYW5zYWN0aW9uU3RhdHVzOiBzdHJpbmc7XHJcbiAgcGF5b3V0Q3VycmVuY3k6IHN0cmluZztcclxuICB0cmFuc2FjdGlvblR5cGU6IHN0cmluZztcclxuICBicmFuY2hDb2RlOiBzdHJpbmc7XHJcbiAgY29tcGFueUNvZGU6IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYWNjb3VudGluZy1yZXBvcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hY2NvdW50aW5nLXJlcG9ydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYWNjb3VudGluZy1yZXBvcnQuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjY291bnRpbmdSZXBvcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBSZXBvcnROYW1lOiBzdHJpbmcgPSBcIkFjY291bnRpbmdcIjtcclxuICByZXBvcnRVc2VyOiBhbnk7XHJcbiAgcmVwb3J0VGltZTogYW55O1xyXG4gIHJlcG9ydFBlcmlvZDogYW55O1xyXG4gIGJyYW5jaE5hbWVBbmRDb2RlOiBhbnk7XHJcbiAgc3ViR3JvdXBDb2x1bW46IGFueTtcclxuICBDb21wb25lbnRMb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzO1xyXG4gIGxvYWRpbmdTdGF0ZTogQ29tcG9uZW50TG9hZGluZ1N0YXRlcyA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuQ29tcGxldGU7XHJcbiAgbm9EYXRhRm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgbGVmdERhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcbiAgcmlnaHREYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIHNlYXJjaENyaXRlcmlhOiBbc3RyaW5nLCBzdHJpbmddW107XHJcblxyXG4gIHNlYXJjaFRleHQ6IHN0cmluZyA9ICcnO1xyXG4gIHJvd0RhdGEgPSBbXTtcclxuICBhY2NvdW50aW5nUmVwb3J0TW9kZWw6IEFjY291bnRpbmdSZXBvcnRNb2RlbDtcclxuICBwYWdlU2l6ZTogbnVtYmVyID0gMTU7XHJcblxyXG4gIHNlbGVjdGVkRXhwb3J0T3B0aW9uOiBzdHJpbmcgPSAnZXhjZWwnO1xyXG4gIGV4cG9ydEZvcm1hdHMgPSBbeyBmb3JtYXROYW1lOiBcIkV4Y2VsXCIsIGNvZGU6ICdleGNlbCcgfSwgeyBmb3JtYXROYW1lOiBcIlBERlwiLCBjb2RlOiAncGRmJyB9LCB7IGZvcm1hdE5hbWU6IFwiQ1NWXCIsIGNvZGU6ICdjc3YnIH1dXHJcbiAgaXNGb3JtVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZGVmYXVsdENvbERlZjogQ29sRGVmID0ge1xyXG4gICAgcmVzaXphYmxlOiB0cnVlLFxyXG4gICAgc29ydGFibGU6IHRydWUsXHJcbiAgICBmaWx0ZXI6IHRydWUsXHJcbiAgICBtaW5XaWR0aDogNDAsXHJcbiAgICBzdXBwcmVzc1NpemVUb0ZpdDogZmFsc2UsXHJcbiAgICBjZWxsU3R5bGU6IHsgdXNlclNlbGVjdDogJ3RleHQnLCAnbGluZS1oZWlnaHQnOiAnMS4yJywgJ3doaXRlLXNwYWNlJzogJ25vcm1hbCcsICd3b3JkLWJyZWFrJzogJ25vcm1hbCcsICdvdmVyZmxvdy13cmFwJzogJ2JyZWFrLXdvcmQnIH0sXHJcblxyXG4gICAgLy8gIEhlYWRlciB3cmFwcGluZ1xyXG4gICAgd3JhcEhlYWRlclRleHQ6IHRydWUsXHJcbiAgICBhdXRvSGVhZGVySGVpZ2h0OiB0cnVlLFxyXG5cclxuICAgIC8vICBDZWxsIHdyYXBwaW5nXHJcbiAgICB3cmFwVGV4dDogdHJ1ZSxcclxuICAgIGF1dG9IZWlnaHQ6IHRydWVcclxuICB9O1xyXG5cclxuICBjb2x1bW5EZWZzOiBDb2xEZWZbXSA9IFtcclxuICAgIHsgaGVhZGVyTmFtZTogJ0J1c2luZXNzRGF0ZScsIGZpZWxkOiAnYnVzaW5lc3NEYXRlJywgdG9vbHRpcEZpZWxkOiAnYnVzaW5lc3NEYXRlJyB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnVHhuRGF0ZSZUaW1lJywgZmllbGQ6ICd0cmFuc2FjdGlvbkRhdGVBbmRUaW1lJywgdG9vbHRpcEZpZWxkOiAndHJhbnNhY3Rpb25EYXRlQW5kVGltZScsIG1pbldpZHRoOiAxMTAsIH0sXHJcbiAgICB7IGhlYWRlck5hbWU6ICdUcmFuc2FjdGlvbiBOdW1iZXInLCBmaWVsZDogJ3RyYW5zYWN0aW9uTnVtYmVyJywgdG9vbHRpcEZpZWxkOiAndHJhbnNhY3Rpb25OdW1iZXInIH0sXHJcbiAgICB7IGhlYWRlck5hbWU6ICdTZW5kQ2xpZW50JywgZmllbGQ6ICdzZW5kQ2xpZW50JywgdG9vbHRpcEZpZWxkOiAnc2VuZENsaWVudCcgfSxcclxuICAgIHsgaGVhZGVyTmFtZTogJ1ByaW5jaXBsZSBTZW5kQ2xpZW50IChJZiBBcHBsaWNhYmxlKScsIGZpZWxkOiAncHJpbmNpcGxlU2VuZENsaWVudCcsIHRvb2x0aXBGaWVsZDogJ3ByaW5jaXBsZVNlbmRDbGllbnQnLCB3aWR0aDogOTAsIG1pbldpZHRoOiA4MCwgbWF4V2lkdGg6IDExMCB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnUmVjZWl2ZUNsaWVudCcsIGZpZWxkOiAncmVjZWl2ZUNsaWVudCcsIHRvb2x0aXBGaWVsZDogJ3JlY2VpdmVDbGllbnQnIH0sXHJcbiAgICB7IGhlYWRlck5hbWU6ICdQcmluY2lwbGUgUmVjZWl2ZUNsaWVudCAoSWYgQXBwbGljYWJsZSknLCBmaWVsZDogJ3ByaW5jaXBsZVJlY2VpdmVDbGllbnQnLCB0b29sdGlwRmllbGQ6ICdwcmluY2lwbGVSZWNlaXZlQ2xpZW50Jywgd2lkdGg6IDEwMCwgbWluV2lkdGg6IDkwLCBtYXhXaWR0aDogMTIwIH0sXHJcbiAgICB7IGhlYWRlck5hbWU6ICdJcyBTZW5kZXIgQ29ycG9yYXRlJywgZmllbGQ6ICdzZW5kZXJUeXBlJywgZmxleDogMSwgbWluV2lkdGg6IDgwLCBcclxuICAgICAgdmFsdWVGb3JtYXR0ZXI6IChwYXJhbXMpID0+IHsgaWYgKCFwYXJhbXMudmFsdWUpIHJldHVybiAnJzsgY29uc3QgdmFsdWUgPSBwYXJhbXMudmFsdWUudG9VcHBlckNhc2UoKTsgaWYgKHZhbHVlID09PSAnQ09SUE9SQVRFJykgcmV0dXJuICdZRVMnOyBpZiAodmFsdWUgPT09ICdJTkRJVklEVUFMJykgcmV0dXJuICdOTyc7IHJldHVybiAnJzsgfSxcclxuICAgICAgdG9vbHRpcFZhbHVlR2V0dGVyOiAocGFyYW1zKSA9PiB7IGlmICghcGFyYW1zLnZhbHVlKSByZXR1cm4gJyc7IGNvbnN0IHZhbHVlID0gcGFyYW1zLnZhbHVlLnRvVXBwZXJDYXNlKCk7IGlmICh2YWx1ZSA9PT0gJ0NPUlBPUkFURScpIHJldHVybiAnWUVTJzsgaWYgKHZhbHVlID09PSAnSU5ESVZJRFVBTCcpIHJldHVybiAnTk8nOyByZXR1cm4gJyc7IH0gfSxcclxuICAgIHsgaGVhZGVyTmFtZTogJ0lzIEJlbmVmaWNpYXJ5IENvcnBvcmF0ZScsIGZpZWxkOiAnYmVuZWZpY2lhcnlUeXBlJywgZmxleDogMSwgbWluV2lkdGg6IDgwLFxyXG4gICAgICB2YWx1ZUZvcm1hdHRlcjogKHBhcmFtcykgPT4geyBpZiAoIXBhcmFtcy52YWx1ZSkgcmV0dXJuICcnOyBjb25zdCB2YWx1ZSA9IHBhcmFtcy52YWx1ZS50b1VwcGVyQ2FzZSgpOyBpZiAodmFsdWUgPT09ICdDT1JQT1JBVEUnKSByZXR1cm4gJ1lFUyc7IGlmICh2YWx1ZSA9PT0gJ0lORElWSURVQUwnKSByZXR1cm4gJ05PJzsgcmV0dXJuICcnOyB9LFxyXG4gICAgICB0b29sdGlwVmFsdWVHZXR0ZXI6IChwYXJhbXMpID0+IHsgaWYgKCFwYXJhbXMudmFsdWUpIHJldHVybiAnJzsgY29uc3QgdmFsdWUgPSBwYXJhbXMudmFsdWUudG9VcHBlckNhc2UoKTsgaWYgKHZhbHVlID09PSAnQ09SUE9SQVRFJykgcmV0dXJuICdZRVMnOyBpZiAodmFsdWUgPT09ICdJTkRJVklEVUFMJykgcmV0dXJuICdOTyc7IHJldHVybiAnJzsgfSB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnUmVjZWl2ZUNjeScsIGZpZWxkOiAncmVjZWl2ZUN1cnJlbmN5JywgdG9vbHRpcEZpZWxkOiAncmVjZWl2ZUN1cnJlbmN5JyB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnQW1vdW50UGFpZCcsIGZpZWxkOiAnYW1vdW50UGFpZCcsIHRvb2x0aXBGaWVsZDogJ2Ftb3VudFBhaWQnLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwnIH0sXHJcbiAgICB7IGhlYWRlck5hbWU6ICdTZW5kQ2N5JywgZmllbGQ6ICdzZW5kQ3VycmVuY3knLCB0b29sdGlwRmllbGQ6ICdzZW5kQ3VycmVuY3knLCB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnU2VydmljZUZlZScsIGZpZWxkOiAnc2VydmljZUZlZScsIHRvb2x0aXBGaWVsZDogJ3NlcnZpY2VGZWUnLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwnIH0sXHJcbiAgICB7IGhlYWRlck5hbWU6ICdUYXgnLCBmaWVsZDogJ3RheCcsIHRvb2x0aXBGaWVsZDogJ3RheCcsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCcgfSxcclxuICAgIHsgaGVhZGVyTmFtZTogJ1ByaW5jaXBsZVNlbmQgQW1vdW50JywgZmllbGQ6ICdwcmluY2lwbGVTZW5kQW1vdW50JywgdG9vbHRpcEZpZWxkOiAncHJpbmNpcGxlU2VuZEFtb3VudCcsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCcgfSxcclxuICAgIHsgaGVhZGVyTmFtZTogJ1RyYW5zYWN0aW9uIFN0YXR1cycsIGZpZWxkOiAndHJhbnNhY3Rpb25TdGF0dXMnLCB0b29sdGlwRmllbGQ6ICd0cmFuc2FjdGlvblN0YXR1cycgfSxcclxuICAgIHsgaGVhZGVyTmFtZTogJ1NldHRsZW1lbnRDY3knLCBmaWVsZDogJ3NldHRsZW1lbnRDdXJyZW5jeScsIHRvb2x0aXBGaWVsZDogJ3NldHRsZW1lbnRDdXJyZW5jeScsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCcgfSxcclxuICAgIHsgaGVhZGVyTmFtZTogJ0NsaWVudFNldHRsIChpbiBTQ2N5KScsIGZpZWxkOiAnY2xpZW50U2V0dGxlbWVudEluU0NjeScsIHRvb2x0aXBGaWVsZDogJ2NsaWVudFNldHRsZW1lbnRJblNDY3knLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwnIH0sXHJcbiAgICB7IGhlYWRlck5hbWU6ICdDbGllbnRTZXR0bCAoaW4gVVNEKScsIGZpZWxkOiAnY2xpZW50U2V0dGxlbWVudEluVVNEJywgdG9vbHRpcEZpZWxkOiAnY2xpZW50U2V0dGxlbWVudEluVVNEJywgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsJyB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnU2hhcmVUeXBlJywgZmllbGQ6ICdzaGFyZVR5cGUnLCB0b29sdGlwRmllbGQ6ICdzaGFyZVR5cGUnIH0sXHJcbiAgICB7IGhlYWRlck5hbWU6ICdTaGFyZVZhbHVlJywgZmllbGQ6ICdzaGFyZVZhbHVlJywgdG9vbHRpcEZpZWxkOiAnc2hhcmVWYWx1ZScsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCcgfSxcclxuICAgIHsgaGVhZGVyTmFtZTogJ1NlbmQvUmVjZWl2ZSBGZWVDY3knLCBmaWVsZDogJ3NlbmRSZWNlaXZlRmVlQ2N5JywgdG9vbHRpcEZpZWxkOiAnc2VuZFJlY2VpdmVGZWVDY3knIH0sXHJcbiAgICB7IGhlYWRlck5hbWU6ICdTaGFyZUFtdCAoaW4gVVNEKScsIGZpZWxkOiAnc2hhcmVBbW91bnRJblVTRCcsIHRvb2x0aXBGaWVsZDogJ3NoYXJlQW1vdW50SW5VU0QnLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwnIH0sXHJcbiAgICB7IGhlYWRlck5hbWU6ICdTZXR0bGVtZW50IFJhdGUnLCBmaWVsZDogJ3NldHRsZW1lbnRSYXRlJywgdG9vbHRpcEZpZWxkOiAnc2V0dGxlbWVudFJhdGUnLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwnIH0sXHJcbiAgXTtcclxuXHJcblxyXG4gIGdyaWRBcGlzOiBHcmlkQXBpW10gPSBbXTtcclxuICBncmlkQ29sdW1uQXBpczogQ29sdW1uQXBpW10gPSBbXTtcclxuXHJcbiAgcGFnaW5hdGlvbkFycmF5OiBhbnlbXTtcclxuICBlenJlbWl0VXNlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG9yaWdpbmFsR3JvdXBFbnRyaWVzOiBBY2NvdW50aW5nUmVwb3J0QnJhbmNoR3JvdXBbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlcG9ydFNlcnZpY2U6IFJlcG9ydFNlcnZpY2UsIHByaXZhdGUgZXhwb3J0U2VydmljZTogRXhwb3J0U2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZXpyZW1pdHVzZXJuYW1lID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZXpyZW1pdHVzZXJuYW1lJyk7XHJcbiAgICBpZiAoZXpyZW1pdHVzZXJuYW1lKSB7XHJcbiAgICAgIHRoaXMuZXpyZW1pdFVzZXIgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEFjY291bnRpbmdSZXBvcnQocmVxdWVzdD86IEFjY291bnRpbmdSZXBvcnRSZXF1ZXN0KSB7XHJcbiAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuTG9hZGluZztcclxuICAgIHRoaXMuYWNjb3VudGluZ1JlcG9ydE1vZGVsID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5icmFuY2hOYW1lQW5kQ29kZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc3ViR3JvdXBDb2x1bW4gPSB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBmaW5hbFJlcSA9IHJlcXVlc3Q7XHJcblxyXG4gICAgdGhpcy5yZXBvcnRTZXJ2aWNlLmdldEFjY291bnRpbmdSZXBvcnQoZmluYWxSZXEpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5hY2NvdW50aW5nUmVwb3J0TW9kZWwgPSBkYXRhO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuQ29tcGxldGU7XHJcbiAgICAgIHRoaXMubm9EYXRhRm91bmQgPSBPYmplY3Qua2V5cyh0aGlzLmFjY291bnRpbmdSZXBvcnRNb2RlbC5hY2NvdW50aW5nUmVwb3J0QnlCcmFuY2hHcm91cHMpLmxlbmd0aCA9PSAwID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICBjb25zdCBicmFuY2hDb3VudCA9IHRoaXMuYWNjb3VudGluZ1JlcG9ydE1vZGVsLmFjY291bnRpbmdSZXBvcnRCeUJyYW5jaEdyb3Vwcy5sZW5ndGg7XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvbkFycmF5ID0gbmV3IEFycmF5KGJyYW5jaENvdW50ICogMikuZmlsbCgxNSk7XHJcblxyXG4gICAgICB0aGlzLnJlcG9ydFVzZXIgPSB0aGlzLmFjY291bnRpbmdSZXBvcnRNb2RlbC5yZXBvcnRVc2VyO1xyXG4gICAgICB0aGlzLnJlcG9ydFRpbWUgPSBmb3JtYXREYXRlKG5ldyBEYXRlKCksICdkZC9NTS95eXl5IGhoOm1tIGEnLCAnZW4tVVMnKTtcclxuICAgICAgdGhpcy5yZXBvcnRQZXJpb2QgPSBgJHtmb3JtYXREYXRlKGZpbmFsUmVxLnN0YXJ0RGF0ZSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKX0gLSAke2Zvcm1hdERhdGUoZmluYWxSZXEuZW5kRGF0ZSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKX1gO1xyXG5cclxuICAgICAgdGhpcy5sZWZ0RGF0YSA9IHtcclxuICAgICAgICAnUmVwb3J0IFBlcmlvZCc6IGAke3RoaXMucmVwb3J0UGVyaW9kfWAsXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucmlnaHREYXRhID0ge1xyXG4gICAgICAgICdSZXBvcnQgVXNlciAmIFRpbWUnOiBgJHt0aGlzLnJlcG9ydFVzZXJ9IEAgJHt0aGlzLnJlcG9ydFRpbWV9YCxcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gRGVlcCBjb3B5IHRvIHByZXNlcnZlIG9yaWdpbmFsIGRhdGEgZm9yIHNlYXJjaFxyXG4gICAgICB0aGlzLm9yaWdpbmFsR3JvdXBFbnRyaWVzID0gdGhpcy5hY2NvdW50aW5nUmVwb3J0TW9kZWwuYWNjb3VudGluZ1JlcG9ydEJ5QnJhbmNoR3JvdXBzLm1hcChncm91cCA9PiAoe1xyXG4gICAgICAgIC4uLmdyb3VwLFxyXG4gICAgICAgIHNlbmRUcmFuc2FjdGlvbnM6IHtcclxuICAgICAgICAgIC4uLmdyb3VwLnNlbmRUcmFuc2FjdGlvbnMsXHJcbiAgICAgICAgICBlbnRyaWVzOiBbLi4uZ3JvdXAuc2VuZFRyYW5zYWN0aW9ucy5lbnRyaWVzXVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVjZWl2ZVRyYW5zYWN0aW9uczoge1xyXG4gICAgICAgICAgLi4uZ3JvdXAucmVjZWl2ZVRyYW5zYWN0aW9ucyxcclxuICAgICAgICAgIGVudHJpZXM6IFsuLi5ncm91cC5yZWNlaXZlVHJhbnNhY3Rpb25zLmVudHJpZXNdXHJcbiAgICAgICAgfVxyXG4gICAgICB9KSk7XHJcblxyXG5cclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBoYW5kbGVFeHBvcnQob3B0aW9uOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRFeHBvcnRPcHRpb24gPSBvcHRpb247XHJcbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRFeHBvcnRPcHRpb24pIHtcclxuICAgICAgY2FzZSAnZXhjZWwnOlxyXG4gICAgICAgIHRoaXMuZXhwb3J0VG9FeGNlbCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdwZGYnOlxyXG4gICAgICAgIHRoaXMuZXhwb3J0VG9QZGYoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY3N2JzpcclxuICAgICAgICB0aGlzLmV4cG9ydFRvQ3N2KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYWxlcnQoJ1BsZWFzZSBzZWxlY3QgYW4gZXhwb3J0IGZvcm1hdC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2VhcmNoKHRleHQ6IHN0cmluZykge1xyXG4gICAgY29uc3Qgbm9ybWFsaXplID0gKHN0cjogYW55KTogc3RyaW5nID0+XHJcbiAgICAgIHN0cj8udG9TdHJpbmcoKVxyXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgLnJlcGxhY2UoLywvZywgJycpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKVxyXG4gICAgICAgIC5yZXBsYWNlKC9bXFx1MjAwQi1cXHUyMDBEXFx1RkVGRl0vZywgJycpXHJcbiAgICAgICAgLnRyaW0oKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB0ZXh0O1xyXG4gICAgY29uc3Qgc2VhcmNoID0gbm9ybWFsaXplKHRleHQpO1xyXG5cclxuICAgIGlmICghdGhpcy5vcmlnaW5hbEdyb3VwRW50cmllcz8ubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gICAgLy8gQnVpbGQgZmlsdGVyZWQgYnJhbmNoIGdyb3Vwc1xyXG4gICAgY29uc3QgZmlsdGVyZWRHcm91cHMgPSB0aGlzLm9yaWdpbmFsR3JvdXBFbnRyaWVzLm1hcChncm91cCA9PiB7XHJcbiAgICAgIGNvbnN0IG9yaWdpbmFsU2VuZEVudHJpZXMgPSBncm91cC5zZW5kVHJhbnNhY3Rpb25zLmVudHJpZXMgfHwgW107XHJcbiAgICAgIGNvbnN0IG9yaWdpbmFsUmVjZWl2ZUVudHJpZXMgPSBncm91cC5yZWNlaXZlVHJhbnNhY3Rpb25zLmVudHJpZXMgfHwgW107XHJcblxyXG4gICAgICBjb25zdCBmaWx0ZXJlZFNlbmQgPSBzZWFyY2hcclxuICAgICAgICA/IG9yaWdpbmFsU2VuZEVudHJpZXMuZmlsdGVyKGVudHJ5ID0+XHJcbiAgICAgICAgICBPYmplY3QudmFsdWVzKGVudHJ5KS5zb21lKHZhbHVlID0+IG5vcm1hbGl6ZSh2YWx1ZSkuaW5jbHVkZXMoc2VhcmNoKSlcclxuICAgICAgICApXHJcbiAgICAgICAgOiBbLi4ub3JpZ2luYWxTZW5kRW50cmllc107XHJcblxyXG4gICAgICBjb25zdCBmaWx0ZXJlZFJlY2VpdmUgPSBzZWFyY2hcclxuICAgICAgICA/IG9yaWdpbmFsUmVjZWl2ZUVudHJpZXMuZmlsdGVyKGVudHJ5ID0+XHJcbiAgICAgICAgICBPYmplY3QudmFsdWVzKGVudHJ5KS5zb21lKHZhbHVlID0+IG5vcm1hbGl6ZSh2YWx1ZSkuaW5jbHVkZXMoc2VhcmNoKSlcclxuICAgICAgICApXHJcbiAgICAgICAgOiBbLi4ub3JpZ2luYWxSZWNlaXZlRW50cmllc107XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLmdyb3VwLFxyXG4gICAgICAgIHNlbmRUcmFuc2FjdGlvbnM6IHsgLi4uZ3JvdXAuc2VuZFRyYW5zYWN0aW9ucywgZW50cmllczogZmlsdGVyZWRTZW5kIH0sXHJcbiAgICAgICAgcmVjZWl2ZVRyYW5zYWN0aW9uczogeyAuLi5ncm91cC5yZWNlaXZlVHJhbnNhY3Rpb25zLCBlbnRyaWVzOiBmaWx0ZXJlZFJlY2VpdmUgfVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g8J+UuSBLZWVwIG9ubHkgYnJhbmNoZXMgdGhhdCBoYXZlIGFueSBtYXRjaGluZyBlbnRyaWVzXHJcbiAgICB0aGlzLmFjY291bnRpbmdSZXBvcnRNb2RlbC5hY2NvdW50aW5nUmVwb3J0QnlCcmFuY2hHcm91cHMgPVxyXG4gICAgICBmaWx0ZXJlZEdyb3Vwcy5maWx0ZXIoZyA9PlxyXG4gICAgICAgIGcuc2VuZFRyYW5zYWN0aW9ucy5lbnRyaWVzLmxlbmd0aCA+IDAgfHwgZy5yZWNlaXZlVHJhbnNhY3Rpb25zLmVudHJpZXMubGVuZ3RoID4gMFxyXG4gICAgICApO1xyXG5cclxuICAgIC8vIFJlc2V0IGdyaWRzIGZvciB2aXNpYmxlIGJyYW5jaGVzXHJcbiAgICB0aGlzLmFjY291bnRpbmdSZXBvcnRNb2RlbC5hY2NvdW50aW5nUmVwb3J0QnlCcmFuY2hHcm91cHMuZm9yRWFjaCgoZ3JvdXAsIGluZGV4KSA9PiB7XHJcbiAgICAgIFtncm91cC5zZW5kVHJhbnNhY3Rpb25zLmVudHJpZXMsIGdyb3VwLnJlY2VpdmVUcmFuc2FjdGlvbnMuZW50cmllc10uZm9yRWFjaCgoZW50cmllcywgaWR4KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JpZEFwaSA9IHRoaXMuZ3JpZEFwaXNbaW5kZXggKiAyICsgaWR4XTtcclxuICAgICAgICBpZiAoZ3JpZEFwaSkge1xyXG4gICAgICAgICAgZ3JpZEFwaS5zZXRSb3dEYXRhKGVudHJpZXMpO1xyXG4gICAgICAgICAgaWYgKGdyaWRBcGkucGFnaW5hdGlvbkdvVG9GaXJzdFBhZ2UpIGdyaWRBcGkucGFnaW5hdGlvbkdvVG9GaXJzdFBhZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgb25HcmlkUmVhZHkocGFyYW1zOiBHcmlkUmVhZHlFdmVudCwgaWQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5ncmlkQXBpc1tpZF0gPSBwYXJhbXMuYXBpO1xyXG4gICAgdGhpcy5ncmlkQ29sdW1uQXBpc1tpZF0gPSBwYXJhbXMuY29sdW1uQXBpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hdXRvU2l6ZUFsbENvbHVtbnMoaWQpLCAxMDApO1xyXG4gIH1cclxuXHJcblxyXG4gIG9uR3JpZFNpemVDaGFuZ2VkKHBhcmFtczogYW55LCBpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmF1dG9TaXplQWxsQ29sdW1ucyhpZCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgYXV0b1NpemVBbGxDb2x1bW5zKGlkOiBudW1iZXIsIHNraXBIZWFkZXI6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgY29uc3QgY29sdW1uQXBpID0gdGhpcy5ncmlkQ29sdW1uQXBpc1tpZF07XHJcbiAgICBpZiAoIWNvbHVtbkFwaSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGFsbENvbHVtbklkczogc3RyaW5nW10gPSBbXTtcclxuICAgIGNvbHVtbkFwaS5nZXRDb2x1bW5zKCkuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgICAgYWxsQ29sdW1uSWRzLnB1c2goY29sdW1uLmdldElkKCkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29sdW1uQXBpLmF1dG9TaXplQ29sdW1ucyhhbGxDb2x1bW5JZHMsIHNraXBIZWFkZXIpO1xyXG4gIH1cclxuXHJcblxyXG4gIGZvcm1hdE51bWJlcihwYXJhbXM6IGFueSk6IHN0cmluZyB7XHJcbiAgICBpZiAocGFyYW1zLnZhbHVlID09IG51bGwpIHJldHVybiAnJztcclxuXHJcbiAgICBjb25zdCBmaWVsZCA9IHBhcmFtcy5jb2xEZWYuZmllbGQ7XHJcblxyXG4gICAgaWYgKGZpZWxkID09PSAnc2V0dGxlbWVudFJhdGUnKSB7XHJcbiAgICAgIHJldHVybiBOdW1iZXIocGFyYW1zLnZhbHVlKS50b0ZpeGVkKDgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBOdW1iZXIocGFyYW1zLnZhbHVlKS50b0ZpeGVkKDMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleHBvcnRUb1BkZigpIHtcclxuICAgIGlmICghdGhpcy5hY2NvdW50aW5nUmVwb3J0TW9kZWwuYWNjb3VudGluZ1JlcG9ydEJ5QnJhbmNoR3JvdXBzPy5sZW5ndGgpIHJldHVybjtcclxuICAgIGNvbnN0IHRpdGxlID0gJ0FjY291bnRpbmcgUmVwb3J0JztcclxuICAgIGNvbnN0IGZpbGVOYW1lID0gJ0FjY291bnRpbmctUmVwb3J0LnBkZic7XHJcblxyXG4gICAgY29uc3QgbWV0YWRhdGE6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtcclxuICAgICAgWydSZXBvcnQgUGVyaW9kOicsIHRoaXMucmVwb3J0UGVyaW9kXSxcclxuICAgICAgWydSZXBvcnQgVXNlciAmIFRpbWUgOiAnLCBgJHt0aGlzLnJlcG9ydFVzZXJ9QCR7dGhpcy5yZXBvcnRUaW1lfWBdLFxyXG4gICAgXTtcclxuICAgIC8vIC8vIC0tLSBzZWFyY2ggY3JpdGVyaWEgLS0tXHJcbiAgICBjb25zdCBzZWFyY2hDcml0ZXJpYSA9IHRoaXMuc2VhcmNoQ3JpdGVyaWE7XHJcblxyXG4gICAgY29uc3QgZG9jID0gbmV3IGpzUERGKHsgb3JpZW50YXRpb246ICdsYW5kc2NhcGUnLCB1bml0OiAnbW0nLCBmb3JtYXQ6IFs3MDAsIDIxMF0gfSk7XHJcblxyXG4gICAgY29uc3QgbG9nb1dpZHRoID0gMzguNCwgbG9nb0hlaWdodCA9IDE3LjUsIGxvZ29YID0gMTUsIGxvZ29ZID0gODtcclxuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aDtcclxuICAgIGNvbnN0IG1hcmdpbkxlZnQgPSAxNTtcclxuICAgIGNvbnN0IHRpdGxlWSA9IDE4O1xyXG5cclxuICAgIC8vIExvZ29cclxuICAgIGlmICh0aGlzLmV4cG9ydFNlcnZpY2VbJ2xvZ29CYXNlNjQnXSkge1xyXG4gICAgICBkb2MuYWRkSW1hZ2UodGhpcy5leHBvcnRTZXJ2aWNlWydsb2dvQmFzZTY0J10sICdQTkcnLCBsb2dvWCwgbG9nb1ksIGxvZ29XaWR0aCwgbG9nb0hlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGl0bGVcclxuICAgIGRvYy5zZXRGb250U2l6ZSgxNSk7XHJcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcclxuICAgIGRvYy50ZXh0KHRpdGxlLCBwYWdlV2lkdGggLyAyLCB0aXRsZVksIHsgYWxpZ246ICdjZW50ZXInIH0pO1xyXG5cclxuICAgIGxldCBjdXJyZW50WSA9IHRpdGxlWSArIDE0O1xyXG5cclxuICAgIC8vIE1ldGFkYXRhXHJcbiAgICBkb2Muc2V0Rm9udFNpemUoMTApO1xyXG4gICAgbWV0YWRhdGEuZm9yRWFjaCgoW2xhYmVsLCB2YWx1ZV0sIGkpID0+IHtcclxuICAgICAgY29uc3QgeSA9IGN1cnJlbnRZICsgaSAqIDc7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICBkb2MudGV4dChsYWJlbCwgMTUsIHkpO1xyXG4gICAgICBjb25zdCBsYWJlbFdpZHRoID0gZG9jLmdldFRleHRXaWR0aChsYWJlbCArICcgJyk7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XHJcbiAgICAgIGRvYy50ZXh0KHZhbHVlID8/ICcnLCAxNSArIGxhYmVsV2lkdGgsIHkpO1xyXG4gICAgfSk7XHJcbiAgICBjdXJyZW50WSArPSBtZXRhZGF0YS5sZW5ndGggKiA3ICsgNTtcclxuXHJcbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIC8vIC0tLSBkcmF3IHNlYXJjaCBjcml0ZXJpYSBoZWFkaW5nIC0tLVxyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICBkb2MudGV4dCgnU2VhcmNoIENyaXRlcmlhOi0nLCBtYXJnaW5MZWZ0LCBjdXJyZW50WSk7XHJcbiAgICBjdXJyZW50WSArPSA4O1xyXG5cclxuICAgIGNvbnN0IHJvd0hlaWdodFBlckxpbmUgPSA2O1xyXG4gICAgY29uc3QgbWluR2FwID0gMjsgLy8gZ2FwIGJldHdlZW4ga2V5IGFuZCB2YWx1ZVxyXG4gICAgY29uc3QgYmV0d2VlbkNvbHVtbnNHYXAgPSAxNTsgLy8gZ2FwIGJldHdlZW4gbGVmdCBhbmQgcmlnaHQgY29sdW1ucyAoeW91IGNhbiB0dW5lIHRoaXMpXHJcbiAgICBjb25zdCBwYWdlQ29udGVudFdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoIC0gMiAqIG1hcmdpbkxlZnQ7XHJcblxyXG4gICAgLy8gLS0tIGhlbHBlciBmdW5jdGlvbiB0byBtZWFzdXJlIHRvdGFsIHdpZHRoIG9mIGEga2V5LXZhbHVlIHBhaXIgLS0tXHJcbiAgICBjb25zdCBtZWFzdXJlUGFpcldpZHRoID0gKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogbnVtYmVyID0+IHtcclxuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICAgIGNvbnN0IGtleVdpZHRoID0gZG9jLmdldFRleHRXaWR0aChrZXkgKyAnICcpO1xyXG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xyXG4gICAgICBjb25zdCB2YWx1ZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh2YWx1ZSk7XHJcbiAgICAgIHJldHVybiBrZXlXaWR0aCArIG1pbkdhcCArIHZhbHVlV2lkdGg7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIC0tLSBjYWxjdWxhdGUgbWF4IHdpZHRoIG9mIGxlZnQgY29sdW1uIHBhaXJzIGR5bmFtaWNhbGx5IC0tLVxyXG4gICAgbGV0IG1heExlZnRQYWlyV2lkdGggPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWFyY2hDcml0ZXJpYS5sZW5ndGg7IGkgKz0gMikge1xyXG4gICAgICBpZiAoc2VhcmNoQ3JpdGVyaWFbaV0pIHtcclxuICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBzZWFyY2hDcml0ZXJpYVtpXTtcclxuICAgICAgICBjb25zdCB3aWR0aCA9IG1lYXN1cmVQYWlyV2lkdGgoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgaWYgKHdpZHRoID4gbWF4TGVmdFBhaXJXaWR0aCkgbWF4TGVmdFBhaXJXaWR0aCA9IHdpZHRoO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIGNvbXB1dGUgd2hlcmUgcmlnaHQgY29sdW1uIHNob3VsZCBzdGFydCAtLS1cclxuICAgIGNvbnN0IGxlZnRDb2x1bW5TdGFydCA9IG1hcmdpbkxlZnQ7XHJcbiAgICBjb25zdCByaWdodENvbHVtblN0YXJ0ID0gbGVmdENvbHVtblN0YXJ0ICsgbWF4TGVmdFBhaXJXaWR0aCArIGJldHdlZW5Db2x1bW5zR2FwO1xyXG5cclxuICAgIC8vIC0tLSBwcmludCBzZWFyY2ggY3JpdGVyaWEgZHluYW1pY2FsbHkgLS0tXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIGxldCBtYXhMaW5lQ291bnQgPSAxO1xyXG5cclxuICAgICAgLy8gTGVmdCBjb2x1bW5cclxuICAgICAgaWYgKHNlYXJjaENyaXRlcmlhW2ldKSB7XHJcbiAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gc2VhcmNoQ3JpdGVyaWFbaV07XHJcbiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICAgICAgZG9jLnRleHQoa2V5LCBsZWZ0Q29sdW1uU3RhcnQsIGN1cnJlbnRZKTtcclxuXHJcbiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgICAgICBjb25zdCBrZXlXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoa2V5ICsgJyAnKTtcclxuICAgICAgICBjb25zdCB2YWx1ZVggPSBsZWZ0Q29sdW1uU3RhcnQgKyBrZXlXaWR0aCArIG1pbkdhcDtcclxuICAgICAgICBkb2MudGV4dCh2YWx1ZSwgdmFsdWVYLCBjdXJyZW50WSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJpZ2h0IGNvbHVtblxyXG4gICAgICBpZiAoc2VhcmNoQ3JpdGVyaWFbaSArIDFdKSB7XHJcbiAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gc2VhcmNoQ3JpdGVyaWFbaSArIDFdO1xyXG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICAgIGRvYy50ZXh0KGtleSwgcmlnaHRDb2x1bW5TdGFydCwgY3VycmVudFkpO1xyXG5cclxuICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xyXG4gICAgICAgIGNvbnN0IGtleVdpZHRoID0gZG9jLmdldFRleHRXaWR0aChrZXkgKyAnICcpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlWCA9IHJpZ2h0Q29sdW1uU3RhcnQgKyBrZXlXaWR0aCArIG1pbkdhcDtcclxuICAgICAgICBkb2MudGV4dCh2YWx1ZSwgdmFsdWVYLCBjdXJyZW50WSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGN1cnJlbnRZICs9IHJvd0hlaWdodFBlckxpbmU7XHJcbiAgICB9XHJcbiAgICBjdXJyZW50WSArPSA4O1xyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gICAgLy8gQnJhbmNoZXNcclxuICAgIHRoaXMuYWNjb3VudGluZ1JlcG9ydE1vZGVsLmFjY291bnRpbmdSZXBvcnRCeUJyYW5jaEdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcclxuICAgICAgZG9jLnNldEZvbnRTaXplKDEwKTtcclxuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcblxyXG4gICAgICBjb25zdCBicmFuY2hUZXh0ID0gYEJyYW5jaCAoTmFtZSAmIENvZGUpOiAke2dyb3VwLmJyYW5jaE5hbWVBbmRDb2RlfWA7XHJcbiAgICAgIGRvYy50ZXh0KGJyYW5jaFRleHQsIDE1LCBjdXJyZW50WSk7XHJcbiAgICAgIGN1cnJlbnRZICs9IDc7XHJcblxyXG4gICAgICAvLyBMb29wIHN1Ymdyb3VwcyAoU2VuZCArIFJlY2VpdmUpXHJcbiAgICAgIFtncm91cC5zZW5kVHJhbnNhY3Rpb25zLCBncm91cC5yZWNlaXZlVHJhbnNhY3Rpb25zXS5mb3JFYWNoKHN1Ykdyb3VwID0+IHtcclxuICAgICAgICBpZiAoIXN1Ykdyb3VwLmVudHJpZXM/Lmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcclxuICAgICAgICBkb2MudGV4dChgU3ViIEdyb3VwOiAke3N1Ykdyb3VwLnN1Ykdyb3VwTmFtZX1gLCAxNSwgY3VycmVudFkpO1xyXG4gICAgICAgIGN1cnJlbnRZICs9IDU7XHJcblxyXG4gICAgICAgIGNvbnN0IHsgaGVhZGVycywgcm93cyB9ID0gdGhpcy5wcmVwYXJlQWNjb3VudGluZ1RhYmxlKHN1Ykdyb3VwLmVudHJpZXMpO1xyXG5cclxuICAgICAgICAoZG9jIGFzIGFueSkuYXV0b1RhYmxlKHtcclxuICAgICAgICAgIGhlYWQ6IFtoZWFkZXJzXSxcclxuICAgICAgICAgIGJvZHk6IHJvd3MsXHJcbiAgICAgICAgICBzdGFydFk6IGN1cnJlbnRZLFxyXG4gICAgICAgICAgdGhlbWU6ICdncmlkJyxcclxuICAgICAgICAgIGhlYWRTdHlsZXM6IHtcclxuICAgICAgICAgICAgZmlsbENvbG9yOiBbMjIwLCAyMjAsIDIyMF0sIHRleHRDb2xvcjogMCxcclxuICAgICAgICAgICAgZm9udFN0eWxlOiAnYm9sZCcsIGZvbnRTaXplOiA5LCBoYWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGJvZHlTdHlsZXM6IHsgZm9udFNpemU6IDgsIGZpbGxDb2xvcjogWzI1NSwgMjU1LCAyNTVdLCB0ZXh0Q29sb3I6IFswLCAwLCAwXSB9LFxyXG4gICAgICAgICAgc3R5bGVzOiB7IGNlbGxQYWRkaW5nOiAyLCBvdmVyZmxvdzogJ2xpbmVicmVhaycsIG1pbkNlbGxIZWlnaHQ6IDYgfSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3VycmVudFkgPSAoZG9jIGFzIGFueSkubGFzdEF1dG9UYWJsZS5maW5hbFkgKyAxMDtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBwYWdlQ291bnQgPSAoZG9jIGFzIGFueSkuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gcGFnZUNvdW50OyBpKyspIHtcclxuICAgICAgZG9jLnNldEZvbnQoXCJoZWx2ZXRpY2FcIiwgXCJib2xkXCIpO1xyXG4gICAgICBkb2Muc2V0UGFnZShpKTtcclxuICAgICAgZG9jLnNldEZvbnRTaXplKDkpO1xyXG4gICAgICBkb2Muc2V0VGV4dENvbG9yKDEwMCk7XHJcblxyXG4gICAgICBjb25zdCBmb290ZXJZID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodCAtIDY7XHJcblxyXG4gICAgICBkb2MudGV4dChcclxuICAgICAgICBgUGFnZSAke2l9IG9mICR7cGFnZUNvdW50fWAsXHJcbiAgICAgICAgcGFnZVdpZHRoIC0gMTUsXHJcbiAgICAgICAgZm9vdGVyWSxcclxuICAgICAgICB7IGFsaWduOiAncmlnaHQnIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBkb2Muc2F2ZShmaWxlTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4cG9ydFRvRXhjZWwoKSB7XHJcbiAgICBpZiAoIXRoaXMuYWNjb3VudGluZ1JlcG9ydE1vZGVsLmFjY291bnRpbmdSZXBvcnRCeUJyYW5jaEdyb3Vwcz8ubGVuZ3RoKSByZXR1cm47XHJcbiAgICBjb25zdCB0aXRsZSA9ICdBY2NvdW50aW5nIFJlcG9ydCc7XHJcbiAgICBjb25zdCBmaWxlTmFtZSA9ICdBY2NvdW50aW5nLVJlcG9ydC54bHN4JztcclxuXHJcbiAgICBjb25zdCB3b3JrYm9vayA9IG5ldyBFeGNlbEpTLldvcmtib29rKCk7XHJcbiAgICBjb25zdCB3b3Jrc2hlZXQgPSB3b3JrYm9vay5hZGRXb3Jrc2hlZXQoJ0FjY291bnRpbmcgUmVwb3J0Jyk7XHJcbiAgICBsZXQgY3VycmVudFJvdyA9IDE7XHJcblxyXG4gICAgLy8gTG9nb1xyXG4gICAgaWYgKHRoaXMuZXhwb3J0U2VydmljZS5sb2dvQmFzZTY0KSB7XHJcbiAgICAgIGNvbnN0IGJhc2U2NERhdGEgPSB0aGlzLmV4cG9ydFNlcnZpY2UubG9nb0Jhc2U2NC5yZXBsYWNlKC9eZGF0YTppbWFnZVxcL1xcdys7YmFzZTY0LC8sICcnKTtcclxuICAgICAgY29uc3QgaW1hZ2VJZCA9IHdvcmtib29rLmFkZEltYWdlKHtcclxuICAgICAgICBiYXNlNjQ6IGJhc2U2NERhdGEsXHJcbiAgICAgICAgZXh0ZW5zaW9uOiAncG5nJyxcclxuICAgICAgfSk7XHJcbiAgICAgIHdvcmtzaGVldC5hZGRJbWFnZShpbWFnZUlkLCB7IHRsOiB7IGNvbDogMCwgcm93OiAwIH0sIGV4dDogeyB3aWR0aDogMTQ1LCBoZWlnaHQ6IDY2IH0sIGVkaXRBczogJ29uZUNlbGwnIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRpdGxlXHJcbiAgICBjb25zdCB0aXRsZVJvdyA9IHdvcmtzaGVldC5nZXRSb3coY3VycmVudFJvdyk7XHJcbiAgICB0aXRsZVJvdy5nZXRDZWxsKDYpLnZhbHVlID0gdGl0bGU7XHJcbiAgICB0aXRsZVJvdy5nZXRDZWxsKDYpLmZvbnQgPSB7IGJvbGQ6IHRydWUsIHNpemU6IDE2IH07XHJcbiAgICB0aXRsZVJvdy5nZXRDZWxsKDYpLmFsaWdubWVudCA9IHsgdmVydGljYWw6ICdtaWRkbGUnLCBob3Jpem9udGFsOiAnbGVmdCcgfTtcclxuICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKGBGJHtjdXJyZW50Um93fTpKJHtjdXJyZW50Um93fWApO1xyXG4gICAgY3VycmVudFJvdyArPSAzO1xyXG5cclxuICAgIC8vIE1ldGFkYXRhXHJcbiAgICBjb25zdCBtZXRhZGF0YTogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgICBbJ1JlcG9ydCBQZXJpb2QnLCB0aGlzLnJlcG9ydFBlcmlvZF0sXHJcbiAgICAgIFsnUmVwb3J0IFVzZXIgJiBUaW1lIDogJywgYCR7dGhpcy5yZXBvcnRVc2VyfUAke3RoaXMucmVwb3J0VGltZX1gXSxcclxuICAgIF07XHJcbiAgICBtZXRhZGF0YS5mb3JFYWNoKChbbGFiZWwsIHZhbHVlXSkgPT4ge1xyXG4gICAgICBjb25zdCByb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KGN1cnJlbnRSb3crKyk7XHJcbiAgICAgIHJvdy5nZXRDZWxsKDEpLnZhbHVlID0ge1xyXG4gICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICB7IHRleHQ6IGAke2xhYmVsfTogYCwgZm9udDogeyBib2xkOiB0cnVlIH0gfSxcclxuICAgICAgICAgIHsgdGV4dDogdmFsdWUgPz8gJycsIGZvbnQ6IHsgYm9sZDogZmFsc2UgfSB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgd29ya3NoZWV0LmFkZFJvdyhbXSk7IGN1cnJlbnRSb3crKztcclxuXHJcbiAgICAvLyAtLS0gc2VhcmNoIGNyaXRlcmlhIC0tLVxyXG4gICAgY29uc3Qgc2VhcmNoQ3JpdGVyaWEgPSB0aGlzLnNlYXJjaENyaXRlcmlhO1xyXG4gICAgLy8gLS0tIHNlYXJjaCBjcml0ZXJpYSBoZWFkaW5nIC0tLVxyXG4gICAgLy8gLS0tIEhlYWRpbmcgLS0tXHJcbiAgICB3b3Jrc2hlZXQubWVyZ2VDZWxscyhjdXJyZW50Um93LCAxLCBjdXJyZW50Um93LCA4KTtcclxuICAgIGNvbnN0IGhlYWRpbmdDZWxsID0gd29ya3NoZWV0LmdldENlbGwoY3VycmVudFJvdywgMSk7XHJcbiAgICBoZWFkaW5nQ2VsbC52YWx1ZSA9ICdTZWFyY2ggQ3JpdGVyaWE6LSc7XHJcbiAgICBoZWFkaW5nQ2VsbC5mb250ID0geyBib2xkOiB0cnVlLCBzaXplOiAxMiB9O1xyXG4gICAgaGVhZGluZ0NlbGwuYWxpZ25tZW50ID0geyB2ZXJ0aWNhbDogJ21pZGRsZScsIGhvcml6b250YWw6ICdsZWZ0JyB9O1xyXG4gICAgY3VycmVudFJvdyArPSAyO1xyXG5cclxuICAgIC8vIC0tLSBEcmF3IHBhaXJzIGR5bmFtaWNhbGx5ICh0d28gcGVyIHJvdykgLS0tXHJcbiAgICBjb25zdCBsZWZ0Q29sRW5kID0gNDsgLy8gY29sdW1ucyAx4oCTNCBmb3IgbGVmdCBwYWlyXHJcbiAgICBjb25zdCByaWdodENvbFN0YXJ0ID0gNTsgLy8gY29sdW1ucyA14oCTOCBmb3IgcmlnaHQgcGFpclxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoQ3JpdGVyaWEubGVuZ3RoOyBpICs9IDIpIHtcclxuICAgICAgY29uc3Qgcm93ID0gd29ya3NoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xyXG5cclxuICAgICAgLy8gTGVmdCBwYWlyXHJcbiAgICAgIGlmIChzZWFyY2hDcml0ZXJpYVtpXSkge1xyXG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHNlYXJjaENyaXRlcmlhW2ldO1xyXG4gICAgICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKHJvdy5udW1iZXIsIDEsIHJvdy5udW1iZXIsIGxlZnRDb2xFbmQpO1xyXG4gICAgICAgIGNvbnN0IGxlZnRDZWxsID0gcm93LmdldENlbGwoMSk7XHJcbiAgICAgICAgbGVmdENlbGwudmFsdWUgPSB7IHJpY2hUZXh0OiBbeyB0ZXh0OiBrZXkgKyAnICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sIHsgdGV4dDogdmFsdWUgfV0gfTtcclxuICAgICAgICBsZWZ0Q2VsbC5hbGlnbm1lbnQgPSB7IHZlcnRpY2FsOiAnbWlkZGxlJywgd3JhcFRleHQ6IHRydWUgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmlnaHQgcGFpclxyXG4gICAgICBpZiAoc2VhcmNoQ3JpdGVyaWFbaSArIDFdKSB7XHJcbiAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gc2VhcmNoQ3JpdGVyaWFbaSArIDFdO1xyXG4gICAgICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKHJvdy5udW1iZXIsIHJpZ2h0Q29sU3RhcnQsIHJvdy5udW1iZXIsIHJpZ2h0Q29sU3RhcnQgKyAzKTtcclxuICAgICAgICBjb25zdCByaWdodENlbGwgPSByb3cuZ2V0Q2VsbChyaWdodENvbFN0YXJ0KTtcclxuICAgICAgICByaWdodENlbGwudmFsdWUgPSB7IHJpY2hUZXh0OiBbeyB0ZXh0OiBrZXkgKyAnICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sIHsgdGV4dDogdmFsdWUgfV0gfTtcclxuICAgICAgICByaWdodENlbGwuYWxpZ25tZW50ID0geyB2ZXJ0aWNhbDogJ21pZGRsZScsIHdyYXBUZXh0OiB0cnVlIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGN1cnJlbnRSb3crKztcclxuXHJcbiAgICAvLyBCcmFuY2hlc1xyXG4gICAgdGhpcy5hY2NvdW50aW5nUmVwb3J0TW9kZWwuYWNjb3VudGluZ1JlcG9ydEJ5QnJhbmNoR3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xyXG4gICAgICBjb25zdCBicmFuY2hSb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KGN1cnJlbnRSb3crKyk7XHJcbiAgICAgIGJyYW5jaFJvdy5nZXRDZWxsKDEpLnZhbHVlID0ge1xyXG4gICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICB7IHRleHQ6ICdCcmFuY2ggKE5hbWUgJiBDb2RlKTogJywgZm9udDogeyBib2xkOiB0cnVlIH0gfSxcclxuICAgICAgICAgIHsgdGV4dDogZ3JvdXAuYnJhbmNoTmFtZUFuZENvZGUgPz8gJycsIGZvbnQ6IHsgYm9sZDogZmFsc2UgfSB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG4gICAgICB3b3Jrc2hlZXQuYWRkUm93KFtdKTsgY3VycmVudFJvdysrO1xyXG5cclxuICAgICAgLy8gTG9vcCBzdWJncm91cHNcclxuICAgICAgW2dyb3VwLnNlbmRUcmFuc2FjdGlvbnMsIGdyb3VwLnJlY2VpdmVUcmFuc2FjdGlvbnNdLmZvckVhY2goc3ViR3JvdXAgPT4ge1xyXG4gICAgICAgIGlmICghc3ViR3JvdXAuZW50cmllcz8ubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IHN1Ykdyb3VwUm93ID0gd29ya3NoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xyXG4gICAgICAgIHN1Ykdyb3VwUm93LmdldENlbGwoMSkudmFsdWUgPSB7XHJcbiAgICAgICAgICByaWNoVGV4dDogW1xyXG4gICAgICAgICAgICB7IHRleHQ6ICdTdWIgR3JvdXA6ICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICAgIHsgdGV4dDogc3ViR3JvdXAuc3ViR3JvdXBOYW1lID8/ICcnLCBmb250OiB7IGJvbGQ6IGZhbHNlIH0gfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHdvcmtzaGVldC5hZGRSb3coW10pOyBjdXJyZW50Um93Kys7XHJcblxyXG4gICAgICAgIC8vIEhlYWRlcnNcclxuICAgICAgICBjb25zdCB7IGhlYWRlcnMsIHJvd3MgfSA9IHRoaXMucHJlcGFyZUFjY291bnRpbmdUYWJsZShzdWJHcm91cC5lbnRyaWVzKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJSb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KGN1cnJlbnRSb3crKyk7XHJcbiAgICAgICAgaGVhZGVycy5mb3JFYWNoKChoZWFkZXIsIGkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNlbGwgPSBoZWFkZXJSb3cuZ2V0Q2VsbChpICsgMSk7XHJcbiAgICAgICAgICBjZWxsLnZhbHVlID0gaGVhZGVyO1xyXG4gICAgICAgICAgY2VsbC5mb250ID0geyBib2xkOiB0cnVlIH07XHJcbiAgICAgICAgICBjZWxsLmZpbGwgPSB7IHR5cGU6ICdwYXR0ZXJuJywgcGF0dGVybjogJ3NvbGlkJywgZmdDb2xvcjogeyBhcmdiOiAnRDlEOUQ5JyB9IH07XHJcbiAgICAgICAgICBjZWxsLmFsaWdubWVudCA9IHsgdmVydGljYWw6ICdtaWRkbGUnLCBob3Jpem9udGFsOiAnY2VudGVyJyB9O1xyXG4gICAgICAgICAgY2VsbC5ib3JkZXIgPSB7IHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LCByaWdodDogeyBzdHlsZTogJ3RoaW4nIH0gfTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gUm93c1xyXG4gICAgICAgIHJvd3MuZm9yRWFjaChyID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJvdyA9IHdvcmtzaGVldC5nZXRSb3coY3VycmVudFJvdysrKTtcclxuICAgICAgICAgIHIuZm9yRWFjaCgodmFsLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSByb3cuZ2V0Q2VsbChpICsgMSk7XHJcbiAgICAgICAgICAgIGNlbGwudmFsdWUgPSB2YWw7XHJcbiAgICAgICAgICAgIGNlbGwuYm9yZGVyID0geyB0b3A6IHsgc3R5bGU6ICd0aGluJyB9LCBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LCBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSwgcmlnaHQ6IHsgc3R5bGU6ICd0aGluJyB9IH07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgd29ya3NoZWV0LmFkZFJvdyhbXSk7IGN1cnJlbnRSb3crKztcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBBdXRvLWFkanVzdCBjb2x1bW4gd2lkdGhzIChpbmNsdWRpbmcgU3IgTm8pXHJcbiAgICBjb25zdCBhbGxIZWFkZXJzID0gWydTciBObycsIC4uLnRoaXMuY29sdW1uRGVmcy5tYXAoYyA9PiBjLmhlYWRlck5hbWUpXTtcclxuICAgIGFsbEhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyLCBpKSA9PiB7XHJcbiAgICAgIGxldCBtYXhMZW5ndGggPSBoZWFkZXIubGVuZ3RoOyAvLyBzdGFydCB3aXRoIGhlYWRlciBsZW5ndGhcclxuXHJcbiAgICAgIHRoaXMuYWNjb3VudGluZ1JlcG9ydE1vZGVsLmFjY291bnRpbmdSZXBvcnRCeUJyYW5jaEdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcclxuICAgICAgICBbZ3JvdXAuc2VuZFRyYW5zYWN0aW9ucywgZ3JvdXAucmVjZWl2ZVRyYW5zYWN0aW9uc10uZm9yRWFjaChzdWJHcm91cCA9PiB7XHJcbiAgICAgICAgICBzdWJHcm91cC5lbnRyaWVzLmZvckVhY2goZW50cnkgPT4ge1xyXG4gICAgICAgICAgICAvLyBTciBObyBjb2x1bW4gKGkgPSAwKSBpcyBqdXN0IG51bWJlcnNcclxuICAgICAgICAgICAgbGV0IHZhbCA9IGkgPT09IDAgPyAoc3ViR3JvdXAuZW50cmllcy5pbmRleE9mKGVudHJ5KSArIDEpLnRvU3RyaW5nKCkgOiAoZW50cnlbdGhpcy5jb2x1bW5EZWZzW2kgLSAxXT8uZmllbGRdID8/ICcnKTtcclxuICAgICAgICAgICAgY29uc3QgbGVuID0gdmFsLnRvU3RyaW5nKCkubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAobGVuID4gbWF4TGVuZ3RoKSBtYXhMZW5ndGggPSBsZW47XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB3b3Jrc2hlZXQuZ2V0Q29sdW1uKGkgKyAxKS53aWR0aCA9IG1heExlbmd0aCArIDU7IC8vIHBhZGRpbmdcclxuICAgIH0pO1xyXG5cclxuICAgIHdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKS50aGVuKGJ1ZmZlciA9PiB7XHJcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xyXG4gICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCdcclxuICAgICAgfSk7XHJcbiAgICAgIEZpbGVTYXZlci5zYXZlQXMoYmxvYiwgZmlsZU5hbWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlQWNjb3VudGluZ1RhYmxlKGRhdGE6IGFueVtdKTogeyBoZWFkZXJzOiBzdHJpbmdbXSwgcm93czogYW55W11bXSB9IHtcclxuICAgIGNvbnN0IGN1cnJlbmN5RmllbGRzID0gWydhbW91bnRQYWlkJywgJ3NlcnZpY2VGZWUnLCAndGF4JywgJ3ByaW5jaXBsZVNlbmRBbW91bnQnLCAnY2xpZW50U2V0dGxlbWVudEluU0NjeSddO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IFsnU3IgTm8nLCAuLi50aGlzLmNvbHVtbkRlZnMubWFwKGMgPT4gYy5oZWFkZXJOYW1lKV07XHJcblxyXG4gICAgaWYgKCFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB7IGhlYWRlcnMsIHJvd3M6IFtdIH07IC8vIHJldHVybiBoZWFkZXJzIG9ubHksIGVtcHR5IHJvd3NcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByb3dzID0gZGF0YS5tYXAoKHJvdywgaSkgPT4ge1xyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIGkgKyAxLFxyXG4gICAgICAgIC4uLnRoaXMuY29sdW1uRGVmcy5tYXAoY29sID0+IHtcclxuICAgICAgICAgIGxldCB2YWwgPSByb3dbY29sLmZpZWxkXTtcclxuICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkgcmV0dXJuICcnO1xyXG4gICAgICAgICAgaWYgKGN1cnJlbmN5RmllbGRzLmluY2x1ZGVzKGNvbC5maWVsZCkpIHJldHVybiBwYXJzZUZsb2F0KHZhbCkudG9GaXhlZCgzKTtcclxuICAgICAgICAgIGlmIChjb2wuZmllbGQgPT09ICdzZXR0bGVtZW50UmF0ZScpIHJldHVybiBwYXJzZUZsb2F0KHZhbCkudG9GaXhlZCg4KTtcclxuICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgfSlcclxuICAgICAgXTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7IGhlYWRlcnMsIHJvd3MgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXhwb3J0VG9Dc3YoKSB7XHJcbiAgICBpZiAoIXRoaXMuYWNjb3VudGluZ1JlcG9ydE1vZGVsLmFjY291bnRpbmdSZXBvcnRCeUJyYW5jaEdyb3Vwcz8ubGVuZ3RoKSByZXR1cm47XHJcbiAgICBjb25zdCBmaWxlTmFtZSA9ICdBY2NvdW50aW5nLVJlcG9ydC5jc3YnO1xyXG4gICAgY29uc3Qgcm93czogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICByb3dzLnB1c2goJ1JlcG9ydCBUaXRsZTogQWNjb3VudGluZyBSZXBvcnQnKTtcclxuICAgIHJvd3MucHVzaCgnJyk7XHJcbiAgICByb3dzLnB1c2goYFJlcG9ydCBQZXJpb2Q6ICR7dGhpcy5yZXBvcnRQZXJpb2R9YCk7XHJcbiAgICByb3dzLnB1c2goYFJlcG9ydCBVc2VyICYgVGltZTogJHt0aGlzLnJlcG9ydFVzZXJ9QCR7dGhpcy5yZXBvcnRUaW1lfWApO1xyXG4gICAgcm93cy5wdXNoKCcnKTtcclxuXHJcbiAgICAvLyAvLyAtLS0gc2VhcmNoIGNyaXRlcmlhIC0tLVxyXG4gICAgY29uc3Qgc2VhcmNoQ3JpdGVyaWEgPSB0aGlzLnNlYXJjaENyaXRlcmlhO1xyXG5cclxuICAgIGlmIChzZWFyY2hDcml0ZXJpYT8ubGVuZ3RoKSB7XHJcbiAgICAgIHJvd3MucHVzaCgnU2VhcmNoIENyaXRlcmlhOi0nKTtcclxuXHJcbiAgICAgIC8vIGNhbGN1bGF0ZSBtYXggbGVuZ3RoIG9mIGxlZnQga2V5LXZhbHVlIHBhaXJzIGZvciBwYWRkaW5nXHJcbiAgICAgIGNvbnN0IG1heExlZnRMZW5ndGggPSBNYXRoLm1heCguLi5zZWFyY2hDcml0ZXJpYS5tYXAoKFtrLCB2XSkgPT4gKGsgKyAnICcgKyB2KS5sZW5ndGgpKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoQ3JpdGVyaWEubGVuZ3RoOyBpICs9IDIpIHtcclxuICAgICAgICBjb25zdCBsZWZ0ID0gc2VhcmNoQ3JpdGVyaWFbaV07XHJcbiAgICAgICAgY29uc3QgcmlnaHQgPSBzZWFyY2hDcml0ZXJpYVtpICsgMV07XHJcblxyXG4gICAgICAgIGNvbnN0IGxlZnRUZXh0ID0gbGVmdCA/IGAke2xlZnRbMF19ICR7bGVmdFsxXX1gLnBhZEVuZChtYXhMZWZ0TGVuZ3RoICsgNSwgJyAnKSA6ICcnO1xyXG4gICAgICAgIGNvbnN0IHJpZ2h0VGV4dCA9IHJpZ2h0ID8gYCR7cmlnaHRbMF19ICR7cmlnaHRbMV19YCA6ICcnO1xyXG5cclxuICAgICAgICAvLyAgRWFjaCByb3cgaW4gc2luZ2xlIENTViByb3c7IGZpcnN0IGFuZCBzZWNvbmQgcGFpciBzZXBhcmF0ZWQgYnkgYSBjb2x1bW5cclxuICAgICAgICByb3dzLnB1c2goYFwiJHtsZWZ0VGV4dH0ke3JpZ2h0VGV4dH1cImApO1xyXG4gICAgICB9XHJcbiAgICAgIHJvd3MucHVzaCgnJyk7IC8vIGJsYW5rIGxpbmUgYWZ0ZXIgc2VhcmNoIGNyaXRlcmlhXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hY2NvdW50aW5nUmVwb3J0TW9kZWwuYWNjb3VudGluZ1JlcG9ydEJ5QnJhbmNoR3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xyXG4gICAgICByb3dzLnB1c2goYEJyYW5jaCAoTmFtZSAmIENvZGUpOiAke2dyb3VwLmJyYW5jaE5hbWVBbmRDb2RlfWApO1xyXG5cclxuICAgICAgW2dyb3VwLnNlbmRUcmFuc2FjdGlvbnMsIGdyb3VwLnJlY2VpdmVUcmFuc2FjdGlvbnNdLmZvckVhY2goc3ViR3JvdXAgPT4ge1xyXG4gICAgICAgIGlmICghc3ViR3JvdXAuZW50cmllcz8ubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gICAgICAgIHJvd3MucHVzaChgU3ViIEdyb3VwOiAke3N1Ykdyb3VwLnN1Ykdyb3VwTmFtZX1gKTtcclxuXHJcbiAgICAgICAgLy8gIEFkZCBcIlNyIE5vXCIgYXQgdGhlIGJlZ2lubmluZyBvZiBoZWFkZXJzXHJcbiAgICAgICAgcm93cy5wdXNoKFsnXCJTciBOb1wiJywgLi4udGhpcy5jb2x1bW5EZWZzLm1hcChjb2wgPT4gYFwiJHtjb2wuaGVhZGVyTmFtZX1cImApXS5qb2luKCcsJykpO1xyXG5cclxuICAgICAgICBzdWJHcm91cC5lbnRyaWVzLmZvckVhY2goKGVudHJ5LCBpZHgpID0+IHtcclxuICAgICAgICAgIC8vICBBZGQgc2VyaWFsIG51bWJlciBhdCBzdGFydCBvZiBlYWNoIHJvd1xyXG4gICAgICAgICAgY29uc3Qgcm93ID0gW1xyXG4gICAgICAgICAgICAoaWR4ICsgMSkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgLi4udGhpcy5jb2x1bW5EZWZzLm1hcChjb2wgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGVudHJ5W2NvbC5maWVsZF07XHJcbiAgICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsKSByZXR1cm4gJyc7XHJcbiAgICAgICAgICAgICAgaWYgKFsnYW1vdW50UGFpZCcsICdzZXJ2aWNlRmVlJywgJ3RheCcsICdwcmluY2lwbGVTZW5kQW1vdW50JywgJ2NsaWVudFNldHRsZW1lbnRJblNDY3knXS5pbmNsdWRlcyhjb2wuZmllbGQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpLnRvRml4ZWQoMyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChjb2wuZmllbGQgPT09ICdzZXR0bGVtZW50UmF0ZScpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbCkudG9GaXhlZCg4KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGBcIiR7dmFsfVwiYDtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIF0uam9pbignLCcpO1xyXG4gICAgICAgICAgcm93cy5wdXNoKHJvdyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJvd3MucHVzaCgnJyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtyb3dzLmpvaW4oJ1xcbicpXSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnIH0pO1xyXG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBmaWxlTmFtZSk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgbGluay5jbGljaygpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuICBnZXRSZXBvcnQocGF5bG9hZDogYW55KSB7XHJcbiAgICBjb25zdCBtb2RhbCA9IHBheWxvYWQ/Lm1vZGFsIHx8IHBheWxvYWQ7XHJcblxyXG4gICAgY29uc3QgcmVxOiBBY2NvdW50aW5nUmVwb3J0UmVxdWVzdCA9IHtcclxuICAgICAgc3RhcnREYXRlOiBtb2RhbC5mcm9tRGF0ZSwgLy8geXl5eS1NTS1kZCBmcm9tIHRoZSBmaWx0ZXJcclxuICAgICAgZW5kRGF0ZTogbW9kYWwudG9EYXRlLFxyXG4gICAgICBzZW5kQ291bnRyeUNvZGU6IG1vZGFsLnNlbmRDb3VudHJ5ID8/ICdBTEwnLFxyXG4gICAgICByZWN2Q291bnRyeUNvZGU6IG1vZGFsLnJlY2VpdmVDb3VudHJ5ID8/ICdBTEwnLFxyXG4gICAgICBidXNpbmVzc1BhcnRuZXJDb3JyZWxhdGlvbklEOiBtb2RhbC5jbGllbnQgPz8gJ0FMTCcsXHJcbiAgICAgIHRyYW5zYWN0aW9uU3RhdHVzOiBtb2RhbC50cmFuc2FjdGlvblN0YXR1cy5qb2luKFwiLFwiKSxcclxuICAgICAgcGF5b3V0Q3VycmVuY3k6IG1vZGFsLmN1cnJlbmN5ID8/ICdBTEwnLFxyXG4gICAgICB0cmFuc2FjdGlvblR5cGU6IG1vZGFsLnByb2R1Y3QgPz8gJ0FMTCcsXHJcbiAgICAgIGJyYW5jaENvZGU6IG1vZGFsLmJyYW5jaCA/PyAnQUxMJyxcclxuICAgICAgY29tcGFueUNvZGU6ICdBTEwnIC8vIG9yICdCSCcgaWYgeW91ciBBUEkgcmVxdWlyZXMgaXQgc3BlY2lmaWNhbGx5XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuc2VhcmNoQ3JpdGVyaWEgPSBwYXlsb2FkLnNlYXJjaENyaXRlcmlhO1xyXG5cclxuICAgIHRoaXMuZ2V0QWNjb3VudGluZ1JlcG9ydChyZXEpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRm9ybVZhbGlkKGlzVmFsaWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNGb3JtVmFsaWQgPSBpc1ZhbGlkO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGxpYi1zZWFyY2gtZmlsdGVyIFtSZXBvcnROYW1lXT1cIlJlcG9ydE5hbWVcIiAoc2VhcmNoQ2xpY2tlZCk9XCJnZXRSZXBvcnQoJGV2ZW50KVwiIChmb3JtVmFsaWQpPVwiaGFuZGxlRm9ybVZhbGlkKCRldmVudClcIj48L2xpYi1zZWFyY2gtZmlsdGVyPlxyXG5cclxuPGFwcC1sb2FkZXIgY2xhc3M9XCJcIiAqbmdJZj1cImxvYWRpbmdTdGF0ZSA9PSBDb21wb25lbnRMb2FkaW5nU3RhdGUuTG9hZGluZ1wiPjwvYXBwLWxvYWRlcj5cclxuXHJcbjxkaXYgKm5nSWY9XCJhY2NvdW50aW5nUmVwb3J0TW9kZWwhPXVuZGVmaW5lZCAmJiBsb2FkaW5nU3RhdGUgPT0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlICYmICFub0RhdGFGb3VuZCAmJiBpc0Zvcm1WYWxpZFwiXHJcbiAgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAzMHB4O1wiPlxyXG5cclxuICA8bGliLW1ldGFkYXRhIFtyZXBvcnROYW1lXT1cIlJlcG9ydE5hbWVcIiBbc2hvd21ldGFEYXRhT25lXT1cInRydWVcIiBbc2hvd21ldGFEYXRhVHdvXT1cInRydWVcIiBbbWV0YURhdGFPbmVdPVwibGVmdERhdGFcIlxyXG4gICAgW21ldGFEYXRhVHdvXT1cInJpZ2h0RGF0YVwiIChleHBvcnRFdmVudCk9XCJoYW5kbGVFeHBvcnQoJGV2ZW50KVwiIChzZWFyY2hFdmVudCk9XCJvblNlYXJjaCgkZXZlbnQpXCI+PC9saWItbWV0YWRhdGE+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJhY2NvdW50aW5nUmVwb3J0TW9kZWwuYWNjb3VudGluZ1JlcG9ydEJ5QnJhbmNoR3JvdXBzPy5sZW5ndGhcIj5cclxuICAgIDxuZ2ItYWNjb3JkaW9uICNhY2M9XCJuZ2JBY2NvcmRpb25cIiBbY2xvc2VPdGhlcnNdPVwiZmFsc2VcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgYWNjb3VudGluZ1JlcG9ydE1vZGVsPy5hY2NvdW50aW5nUmVwb3J0QnlCcmFuY2hHcm91cHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICA8bmdiLXBhbmVsIFtpZF09XCIncGFuZWwtJyArIGlcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ2JQYW5lbFRpdGxlPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwYW5lbC1jbHNcIj5cclxuICAgICAgICAgICAgICB7eyBncm91cC5icmFuY2hOYW1lQW5kQ29kZSB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgbmdiUGFuZWxDb250ZW50PlxyXG4gICAgICAgICAgICA8IS0tIFNlbmQgVHJhbnNhY3Rpb25zIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ3JvdXAuc2VuZFRyYW5zYWN0aW9ucy5lbnRyaWVzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgIDxoNiBjbGFzcz1cInN1Ymdyb3VwY29sdW1uXCI+e3sgZ3JvdXAuc2VuZFRyYW5zYWN0aW9ucy5zdWJHcm91cE5hbWUgfX08L2g2PlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgICAgICAgICAgICA8bGliLXBhZ2Utc2l6ZS1zZWxlY3RvciBbdG90YWxFbnRyaWVzXT1cImdyb3VwLnNlbmRUcmFuc2FjdGlvbnMuZW50cmllcy5sZW5ndGhcIiBbZGVmYXVsdFNpemVdPVwiJzE1J1wiXHJcbiAgICAgICAgICAgICAgICAgIFtncmlkQXBpXT1cImdyaWRBcGlzW2kgKiAyXVwiPlxyXG4gICAgICAgICAgICAgICAgPC9saWItcGFnZS1zaXplLXNlbGVjdG9yPlxyXG5cclxuICAgICAgICAgICAgICAgIDxhZy1ncmlkLWFuZ3VsYXIgY2xhc3M9XCJhZy10aGVtZS1hbHBpbmUgdHJhbnNhY3Rpb24tZ3JpZCBncmlkLXNpemVcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiXHJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5EZWZzXT1cImNvbHVtbkRlZnNcIiBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCIgW3Jvd0RhdGFdPVwiZ3JvdXAuc2VuZFRyYW5zYWN0aW9ucy5lbnRyaWVzXCJcclxuICAgICAgICAgICAgICAgICAgW3Jvd0hlaWdodF09XCIyMFwiIFtoZWFkZXJIZWlnaHRdPVwiMjRcIiBbcGFnaW5hdGlvbl09XCJ0cnVlXCIgW3BhZ2luYXRpb25QYWdlU2l6ZV09XCJwYWdpbmF0aW9uQXJyYXlbaV1cIlxyXG4gICAgICAgICAgICAgICAgICAoZ3JpZFJlYWR5KT1cIm9uR3JpZFJlYWR5KCRldmVudCwgaSAqIDIpXCIgKGdyaWRTaXplQ2hhbmdlZCk9XCJvbkdyaWRTaXplQ2hhbmdlZCgkZXZlbnQsIGkgKiAyKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9hZy1ncmlkLWFuZ3VsYXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBSZWNlaXZlIFRyYW5zYWN0aW9ucyAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdyb3VwLnJlY2VpdmVUcmFuc2FjdGlvbnMuZW50cmllcy5sZW5ndGhcIiBjbGFzcz1cIm10LTNcIj5cclxuICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJzdWJncm91cGNvbHVtblwiPnt7IGdyb3VwLnJlY2VpdmVUcmFuc2FjdGlvbnMuc3ViR3JvdXBOYW1lIH19PC9oNj5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1wYWdlLXNpemUtc2VsZWN0b3IgW3RvdGFsRW50cmllc109XCJncm91cC5yZWNlaXZlVHJhbnNhY3Rpb25zLmVudHJpZXMubGVuZ3RoXCIgW2RlZmF1bHRTaXplXT1cIicxNSdcIlxyXG4gICAgICAgICAgICAgICAgICBbZ3JpZEFwaV09XCJncmlkQXBpc1tpICogMiArIDFdXCI+XHJcbiAgICAgICAgICAgICAgICA8L2xpYi1wYWdlLXNpemUtc2VsZWN0b3I+XHJcblxyXG4gICAgICAgICAgICAgICAgPGFnLWdyaWQtYW5ndWxhciBjbGFzcz1cImFnLXRoZW1lLWFscGluZSB0cmFuc2FjdGlvbi1ncmlkIGdyaWQtc2l6ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCJcclxuICAgICAgICAgICAgICAgICAgW2NvbHVtbkRlZnNdPVwiY29sdW1uRGVmc1wiIFtkZWZhdWx0Q29sRGVmXT1cImRlZmF1bHRDb2xEZWZcIlxyXG4gICAgICAgICAgICAgICAgICBbcm93RGF0YV09XCJncm91cC5yZWNlaXZlVHJhbnNhY3Rpb25zLmVudHJpZXNcIiBbcm93SGVpZ2h0XT1cIjIwXCIgW2hlYWRlckhlaWdodF09XCIyNFwiIFtwYWdpbmF0aW9uXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbcGFnaW5hdGlvblBhZ2VTaXplXT1cInBhZ2luYXRpb25BcnJheVtpXVwiIChncmlkUmVhZHkpPVwib25HcmlkUmVhZHkoJGV2ZW50LCBpICogMiArIDEpXCJcclxuICAgICAgICAgICAgICAgICAgKGdyaWRTaXplQ2hhbmdlZCk9XCJvbkdyaWRTaXplQ2hhbmdlZCgkZXZlbnQsIGkgKiAyKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9hZy1ncmlkLWFuZ3VsYXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L25nYi1wYW5lbD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nYi1hY2NvcmRpb24+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nIG10LTNcIiAqbmdJZj1cIm5vRGF0YUZvdW5kICYmIGxvYWRpbmdTdGF0ZSE9Q29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmdcIj5cclxuICBObyBEYXRhIGZvdW5kIG1hdGNoaW5nIHlvdXIgc2VhcmNoIGNyaXRlcmlhLlxyXG48L2Rpdj4iXX0=
|