@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,718 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { themeAlpine } from '@ag-grid-community/theming';
|
|
3
|
+
import { ComponentLoadingStates } from '../../models/component-loading-states';
|
|
4
|
+
import { GenericExportService } from '../../shared/export-generic.service';
|
|
5
|
+
// import { formatDate } from '@angular/common';
|
|
6
|
+
// import { ComponentLoadingStates } from 'src/app/models/component-loading-states';
|
|
7
|
+
// import { GenericExportService } from 'src/app/shared/export-generic.service';
|
|
8
|
+
// import { ExportOptions } from 'projects/reports-lib/src/lib/shared/export-generic.service';
|
|
9
|
+
// import { Injectable } from '@angular/core';
|
|
10
|
+
// import jsPDF from 'jspdf';
|
|
11
|
+
// import 'jspdf-autotable';
|
|
12
|
+
import * as ExcelJS from 'exceljs';
|
|
13
|
+
import * as FileSaver from 'file-saver';
|
|
14
|
+
import { formatDate } from '@angular/common';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "../../services/report.service";
|
|
17
|
+
import * as i2 from "ag-grid-angular";
|
|
18
|
+
import * as i3 from "@angular/common";
|
|
19
|
+
import * as i4 from "../../shared/page-size-selector/page-size-selector.component";
|
|
20
|
+
import * as i5 from "../../shared/metadata/metadata.component";
|
|
21
|
+
import * as i6 from "@ng-bootstrap/ng-bootstrap";
|
|
22
|
+
import * as i7 from "../../shared/loader/loader.component";
|
|
23
|
+
import * as i8 from "../../shared/search-filter/search-filter.component";
|
|
24
|
+
export class BranchActivitySendSummaryReportComponent {
|
|
25
|
+
constructor(reportService, ngZone) {
|
|
26
|
+
this.reportService = reportService;
|
|
27
|
+
this.ngZone = ngZone;
|
|
28
|
+
this.dataMap = {};
|
|
29
|
+
this.filteredData = {};
|
|
30
|
+
this.proxyData = {};
|
|
31
|
+
this.selectedExportOption = 'excel';
|
|
32
|
+
this.gridApis = [];
|
|
33
|
+
this.user = "";
|
|
34
|
+
this.ComponentLoadingState = ComponentLoadingStates;
|
|
35
|
+
this.loadingState = ComponentLoadingStates.Loading;
|
|
36
|
+
this.ReportName = "Branch Activity Send Summary";
|
|
37
|
+
this.exportService = inject(GenericExportService);
|
|
38
|
+
this.searchCriteria = [];
|
|
39
|
+
// flags
|
|
40
|
+
this.showMessage = false;
|
|
41
|
+
this.noDataFound = false;
|
|
42
|
+
this.isFormValid = false;
|
|
43
|
+
this.clearSearch = false;
|
|
44
|
+
this.isTotalSummary = false;
|
|
45
|
+
this.columnDefs = [
|
|
46
|
+
{
|
|
47
|
+
field: 'businessDateTime', headerName: 'Business Date', flex: 1, wrapText: true, autoHeight: true, headerClass: 'ag-left-aligned-header', minWidth: 70, width: 70, tooltipField: 'businessDateTime',
|
|
48
|
+
valueFormatter: (params) => {
|
|
49
|
+
const row = params.data;
|
|
50
|
+
if (row && row.payinCCcode === 'Total') {
|
|
51
|
+
return ''; // hide date for total row
|
|
52
|
+
}
|
|
53
|
+
return params.value;
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{ field: 'product', headerName: 'Product', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, width: 120, tooltipField: 'product' },
|
|
57
|
+
{ headerName: 'Is Sender Corporate', field: 'senderType', flex: 1, minWidth: 80,
|
|
58
|
+
valueFormatter: (params) => { if (!params.value)
|
|
59
|
+
return ''; const value = params.value.toUpperCase(); if (value === 'CORPORATE')
|
|
60
|
+
return 'YES'; if (value === 'INDIVIDUAL')
|
|
61
|
+
return 'NO'; return ''; },
|
|
62
|
+
tooltipValueGetter: (params) => { if (!params.value)
|
|
63
|
+
return ''; const value = params.value.toUpperCase(); if (value === 'CORPORATE')
|
|
64
|
+
return 'YES'; if (value === 'INDIVIDUAL')
|
|
65
|
+
return 'NO'; return ''; } },
|
|
66
|
+
{ headerName: 'Is Beneficiary Corporate', field: 'beneficiaryType', flex: 1, minWidth: 80,
|
|
67
|
+
valueFormatter: (params) => { if (!params.value)
|
|
68
|
+
return ''; const value = params.value.toUpperCase(); if (value === 'CORPORATE')
|
|
69
|
+
return 'YES'; if (value === 'INDIVIDUAL')
|
|
70
|
+
return 'NO'; return ''; },
|
|
71
|
+
tooltipValueGetter: (params) => { if (!params.value)
|
|
72
|
+
return ''; const value = params.value.toUpperCase(); if (value === 'CORPORATE')
|
|
73
|
+
return 'YES'; if (value === 'INDIVIDUAL')
|
|
74
|
+
return 'NO'; return ''; } },
|
|
75
|
+
{ field: 'payoutCCcode', headerName: 'Receive Currency', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, width: 110, tooltipField: 'payoutCCcode' },
|
|
76
|
+
{ field: 'payoutAmount', headerName: 'Receive Amount', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, maxWidth: 120, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'payoutAmount' },
|
|
77
|
+
{ field: 'payinCCcode', headerName: 'Send Currency', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, maxWidth: 90, tooltipField: 'payinCCcode' },
|
|
78
|
+
{ field: 'payinAmount', headerName: 'Send Amount', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, maxWidth: 120, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'payinAmount' },
|
|
79
|
+
{ field: 'transactionCommissionAmount', headerName: 'Service Fee', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, maxWidth: 100, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'transactionCommissionAmount' },
|
|
80
|
+
{ field: 'tax', headerName: 'Tax', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, maxWidth: 100, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'tax' },
|
|
81
|
+
{ field: 'totalPayinAmount', headerName: 'Total Send Amount', minWidth: 100, flex: 1, wrapText: true, autoHeight: true, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'totalPayinAmount' },
|
|
82
|
+
{ field: 'transactionCount', headerName: 'Transaction Count', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, maxWidth: 100, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'txnCount' },
|
|
83
|
+
{ field: 'status', headerName: 'Transaction Status', minWidth: 100, flex: 1, wrapText: true, autoHeight: true, tooltipField: 'status' }
|
|
84
|
+
];
|
|
85
|
+
this.defaultColDef = {
|
|
86
|
+
sortable: true,
|
|
87
|
+
filter: true,
|
|
88
|
+
resizable: true,
|
|
89
|
+
minwidth: 40,
|
|
90
|
+
wrapHeaderText: true,
|
|
91
|
+
autoHeaderHeight: true,
|
|
92
|
+
suppressSizeToFit: false,
|
|
93
|
+
wrapText: true
|
|
94
|
+
};
|
|
95
|
+
// rowClassRules = {
|
|
96
|
+
// debugger
|
|
97
|
+
// 'total-row': params => params.data?.isTotalRow
|
|
98
|
+
// };
|
|
99
|
+
this.rowClassRules = {
|
|
100
|
+
'total-row': (params) => {
|
|
101
|
+
console.log('Row Data:', params.data.isTotalRow);
|
|
102
|
+
if (params.data.isTotalRow) {
|
|
103
|
+
return params.data?.isTotalRow;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
this.rowData = [];
|
|
108
|
+
this.reportTheme = themeAlpine.withParams({
|
|
109
|
+
headerFontSize: '10px',
|
|
110
|
+
fontFamily: ['Arial', 'sans-serif'],
|
|
111
|
+
fontSize: '9px'
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
ngOnInit() {
|
|
115
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
|
116
|
+
// Check if User is falcon user or fossilUser
|
|
117
|
+
if (sessionStorage.getItem('fossilusername')) {
|
|
118
|
+
this.sysUserId = sessionStorage.getItem('fossilusername');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
this.sysUserId = sessionStorage.getItem('ezremitusername');
|
|
122
|
+
}
|
|
123
|
+
this.sysUserId = this.sysUserId.replace(/^["'](.*)["']$/, '$1');
|
|
124
|
+
this.user = this.sysUserId;
|
|
125
|
+
console.log("System User Id : " + this.sysUserId);
|
|
126
|
+
}
|
|
127
|
+
filter(text) {
|
|
128
|
+
this.searchText = text;
|
|
129
|
+
if (this.searchText == null) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (this.searchText?.length === 0) {
|
|
133
|
+
this.filteredData = structuredClone(this.dataMap);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.searchText = this.searchText?.trim()?.toLowerCase();
|
|
137
|
+
for (const [key, entries] of Object.entries(this.proxyData)) {
|
|
138
|
+
const filteredData = entries.filter(entry => Object.values(entry)
|
|
139
|
+
.some(val => {
|
|
140
|
+
let a = val?.toString().toLowerCase();
|
|
141
|
+
if (a == null) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
return a?.search(this.searchText) == -1 ? false : true;
|
|
145
|
+
}));
|
|
146
|
+
this.filteredData[key] = filteredData;
|
|
147
|
+
}
|
|
148
|
+
this.filteredData;
|
|
149
|
+
}
|
|
150
|
+
onGridReady(params, id) {
|
|
151
|
+
params.api.sizeColumnsToFit();
|
|
152
|
+
this.gridColumnApi = params.columnApi;
|
|
153
|
+
this.gridApis[id] = params.api;
|
|
154
|
+
params.columnApi.setColumnVisible('businessDateTime', !this.isTotalSummary);
|
|
155
|
+
params.api.sizeColumnsToFit();
|
|
156
|
+
}
|
|
157
|
+
handleExport(option) {
|
|
158
|
+
this.selectedExportOption = option;
|
|
159
|
+
if (!this.hasAnyGroups()) {
|
|
160
|
+
alert("There is no data to export based on your current filter.");
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// If no data, do nothing.
|
|
164
|
+
if (!this.filteredData || Object.keys(this.filteredData).length === 0) {
|
|
165
|
+
alert("No data to export");
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const title = "Branch Activity Send Summary";
|
|
169
|
+
const reportTimeFormatter = this.dateValueFormatter('dd/MM/yyyy hh:mm a');
|
|
170
|
+
const metadata = [
|
|
171
|
+
['Report Period ', this.fromDate + " - " + this.toDate],
|
|
172
|
+
['Report User & Time', this.user ? this.user + " @ " + this.reportDate : '' + " @ " + this.reportDate],
|
|
173
|
+
];
|
|
174
|
+
// --- search criteria ---
|
|
175
|
+
const searchCriteria = this.searchCriteria;
|
|
176
|
+
//const columns = this.columnDefs;
|
|
177
|
+
//exclude Business Date col for Total Summary Report.
|
|
178
|
+
let columns = [...this.columnDefs];
|
|
179
|
+
const summaryReport = this.searchCriteria.find(x => x[0] === 'Summary Report:')?.[1];
|
|
180
|
+
if (summaryReport === 'Total Summary') {
|
|
181
|
+
columns = columns.filter(col => col.field !== 'businessDateTime');
|
|
182
|
+
}
|
|
183
|
+
// const data = this.dataMap;
|
|
184
|
+
const cleanedData = {};
|
|
185
|
+
Object.keys(this.dataMap).forEach(key => {
|
|
186
|
+
cleanedData[key] = this.dataMap[key].map(row => {
|
|
187
|
+
if (row.isTotalRow) {
|
|
188
|
+
return {
|
|
189
|
+
...row,
|
|
190
|
+
businessDateTime: '',
|
|
191
|
+
product: '',
|
|
192
|
+
receiveCurrency: '',
|
|
193
|
+
receiveAmount: ''
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
return row;
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
const data = cleanedData;
|
|
200
|
+
const options = {
|
|
201
|
+
currencyFields: [
|
|
202
|
+
'payoutAmount', 'payinAmount', 'transactionCommissionAmount', 'tax', 'totalPayinAmount'
|
|
203
|
+
],
|
|
204
|
+
// specify all date fields expected
|
|
205
|
+
dateFields: [],
|
|
206
|
+
dateFieldFormats: {
|
|
207
|
+
txnDateAndTime: 'dd/MM/yyyy hh:mm a',
|
|
208
|
+
cancellationBranchDateTime: 'dd/MM/yyyy HH:mm',
|
|
209
|
+
cancellationBusinessDate: 'dd/MM/yyyy'
|
|
210
|
+
},
|
|
211
|
+
specialDecimalFields: {
|
|
212
|
+
rate: 8 // future field with 8 decimal places
|
|
213
|
+
},
|
|
214
|
+
groupByKey: true
|
|
215
|
+
};
|
|
216
|
+
switch (this.selectedExportOption) {
|
|
217
|
+
case 'excel':
|
|
218
|
+
this.exportToExcel({ title, metadata, searchCriteria, columns, data, options });
|
|
219
|
+
break;
|
|
220
|
+
case 'pdf':
|
|
221
|
+
this.exportService.exportToPdf({ title, metadata, searchCriteria, columns, data, options });
|
|
222
|
+
break;
|
|
223
|
+
case 'csv':
|
|
224
|
+
this.exportService.exportToCsv({ title, metadata, searchCriteria, columns, data, options });
|
|
225
|
+
break;
|
|
226
|
+
default:
|
|
227
|
+
alert("Please select an export format.");
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async exportToExcel({ title, metadata, searchCriteria, columns, data, options = {} }) {
|
|
231
|
+
const workbook = new ExcelJS.Workbook();
|
|
232
|
+
const worksheet = workbook.addWorksheet(title);
|
|
233
|
+
// ===================== PRE CALC =====================
|
|
234
|
+
const headerLabels = ['Sr No', ...columns.map(col => col.headerName || col.field)];
|
|
235
|
+
const totalCols = headerLabels.length;
|
|
236
|
+
const titleStartCol = 4;
|
|
237
|
+
const titleColLetter = String.fromCharCode(64 + titleStartCol);
|
|
238
|
+
const titleMergeEnd = String.fromCharCode(64 + totalCols);
|
|
239
|
+
// ===================== LOGO =====================
|
|
240
|
+
if (this.logoBase64) {
|
|
241
|
+
const base64Data = this.logoBase64.replace(/^data:image\/\w+;base64,/, '');
|
|
242
|
+
const imageId = workbook.addImage({
|
|
243
|
+
base64: base64Data,
|
|
244
|
+
extension: 'png',
|
|
245
|
+
});
|
|
246
|
+
worksheet.addImage(imageId, {
|
|
247
|
+
tl: { col: 0, row: 0 },
|
|
248
|
+
ext: { width: 145, height: 66 }
|
|
249
|
+
});
|
|
250
|
+
worksheet.getRow(1).height = 24;
|
|
251
|
+
worksheet.getRow(2).height = 22;
|
|
252
|
+
worksheet.getRow(3).height = 22;
|
|
253
|
+
}
|
|
254
|
+
// ===================== TITLE =====================
|
|
255
|
+
worksheet.mergeCells(`${titleColLetter}1:${titleMergeEnd}1`);
|
|
256
|
+
const titleCell = worksheet.getRow(1).getCell(titleStartCol);
|
|
257
|
+
titleCell.value = title;
|
|
258
|
+
titleCell.font = { bold: true, size: 16 };
|
|
259
|
+
titleCell.alignment = { vertical: 'middle', horizontal: 'left' };
|
|
260
|
+
// ===================== METADATA =====================
|
|
261
|
+
let metaRowStart = 4;
|
|
262
|
+
metadata.forEach(([label, value], idx) => {
|
|
263
|
+
const row = worksheet.getRow(metaRowStart + idx);
|
|
264
|
+
row.getCell(1).value = {
|
|
265
|
+
richText: [
|
|
266
|
+
{ text: `${label} : `, font: { bold: true } },
|
|
267
|
+
{ text: value ?? '', font: { bold: false } }
|
|
268
|
+
]
|
|
269
|
+
};
|
|
270
|
+
worksheet.mergeCells(`A${row.number}:${titleMergeEnd}${row.number}`);
|
|
271
|
+
});
|
|
272
|
+
let currentRow = metaRowStart + metadata.length;
|
|
273
|
+
worksheet.getRow(++currentRow).height = 6;
|
|
274
|
+
currentRow++;
|
|
275
|
+
// ===================== SEARCH CRITERIA =====================
|
|
276
|
+
worksheet.mergeCells(currentRow, 1, currentRow, 6);
|
|
277
|
+
worksheet.getCell(currentRow, 1).value = 'Search Criteria:-';
|
|
278
|
+
worksheet.getCell(currentRow, 1).font = { bold: true };
|
|
279
|
+
currentRow += 2;
|
|
280
|
+
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
281
|
+
const left = searchCriteria[i];
|
|
282
|
+
const right = searchCriteria[i + 1];
|
|
283
|
+
const row = worksheet.getRow(currentRow++);
|
|
284
|
+
worksheet.mergeCells(row.number, 1, row.number, 3);
|
|
285
|
+
row.getCell(1).value = {
|
|
286
|
+
richText: [
|
|
287
|
+
{ text: (left?.[0] ?? '') + ' ', font: { bold: true } },
|
|
288
|
+
{ text: left?.[1] ?? '' }
|
|
289
|
+
]
|
|
290
|
+
};
|
|
291
|
+
row.getCell(1).alignment = { wrapText: true, vertical: 'middle' };
|
|
292
|
+
if (right) {
|
|
293
|
+
worksheet.mergeCells(row.number, 4, row.number, 6);
|
|
294
|
+
row.getCell(4).value = {
|
|
295
|
+
richText: [
|
|
296
|
+
{ text: (right?.[0] ?? '') + ' ', font: { bold: true } },
|
|
297
|
+
{ text: right?.[1] ?? '' }
|
|
298
|
+
]
|
|
299
|
+
};
|
|
300
|
+
row.getCell(4).alignment = { wrapText: true, vertical: 'middle' };
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
currentRow++;
|
|
304
|
+
// ===================== HEADER ROW =====================
|
|
305
|
+
const headerRow = worksheet.getRow(currentRow++);
|
|
306
|
+
headerLabels.forEach((header, i) => {
|
|
307
|
+
const cell = headerRow.getCell(i + 1);
|
|
308
|
+
cell.value = header;
|
|
309
|
+
cell.font = { bold: true };
|
|
310
|
+
cell.fill = {
|
|
311
|
+
type: 'pattern',
|
|
312
|
+
pattern: 'solid',
|
|
313
|
+
fgColor: { argb: 'D9D9D9' }
|
|
314
|
+
};
|
|
315
|
+
cell.alignment = { vertical: 'middle', horizontal: 'center' };
|
|
316
|
+
cell.border = {
|
|
317
|
+
top: { style: 'thin' },
|
|
318
|
+
bottom: { style: 'thin' },
|
|
319
|
+
left: { style: 'thin' },
|
|
320
|
+
right: { style: 'thin' }
|
|
321
|
+
};
|
|
322
|
+
});
|
|
323
|
+
headerRow.eachCell((cell) => {
|
|
324
|
+
if (cell.value === 'Transaction Count') {
|
|
325
|
+
cell.value = 'Transaction\nCount';
|
|
326
|
+
cell.alignment = {
|
|
327
|
+
horizontal: 'center',
|
|
328
|
+
vertical: 'middle',
|
|
329
|
+
wrapText: true
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
// ===================== DATA SECTION =====================
|
|
334
|
+
let rowIdx = currentRow;
|
|
335
|
+
let serialNumber = 1;
|
|
336
|
+
if (options.groupByKey && !Array.isArray(data)) {
|
|
337
|
+
for (const [group, items] of Object.entries(data)) {
|
|
338
|
+
const groupRow = worksheet.getRow(rowIdx++);
|
|
339
|
+
groupRow.getCell(1).value = group;
|
|
340
|
+
groupRow.font = { bold: true };
|
|
341
|
+
worksheet.mergeCells(`A${groupRow.number}:${titleMergeEnd}${groupRow.number}`);
|
|
342
|
+
items.forEach((item) => {
|
|
343
|
+
const rowData = this.prepareTableRows([item], columns, options)[0];
|
|
344
|
+
const dataRow = worksheet.getRow(rowIdx++);
|
|
345
|
+
const fullRow = [
|
|
346
|
+
!item?.isTotalRow ? serialNumber++ : '',
|
|
347
|
+
...rowData
|
|
348
|
+
];
|
|
349
|
+
fullRow.forEach((val, cIdx) => {
|
|
350
|
+
const cell = dataRow.getCell(cIdx + 1);
|
|
351
|
+
// cell.value = val;
|
|
352
|
+
//added by bharati for
|
|
353
|
+
const field = columns[cIdx - 1]?.field;
|
|
354
|
+
// ✅ Amount fields (Receive Amount, Send Amount, Total Send Amount etc.)
|
|
355
|
+
/*
|
|
356
|
+
if (
|
|
357
|
+
field=='totalPayinAmount'||
|
|
358
|
+
field=='payinAmount'||
|
|
359
|
+
field === 'transactionCommissionAmount' ||
|
|
360
|
+
field === 'tax'
|
|
361
|
+
) {
|
|
362
|
+
if (val !== '' && val !== null && val !== undefined) {
|
|
363
|
+
cell.value = Number(val);
|
|
364
|
+
cell.numFmt = '#,##0.000';
|
|
365
|
+
cell.alignment = { horizontal: 'right', vertical: 'middle' };
|
|
366
|
+
} else {
|
|
367
|
+
cell.value = '';
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
cell.value = val;
|
|
372
|
+
} */
|
|
373
|
+
if (item?.isTotalRow && field === 'receiveAmount') {
|
|
374
|
+
cell.value = '';
|
|
375
|
+
}
|
|
376
|
+
else if (field?.toLowerCase().includes('amount') ||
|
|
377
|
+
field === 'serviceFee' ||
|
|
378
|
+
field === 'tax') {
|
|
379
|
+
if (val !== '' && val !== null && val !== undefined) {
|
|
380
|
+
cell.value = val; // already number
|
|
381
|
+
cell.numFmt = '#,##0.000'; // Excel formatting
|
|
382
|
+
cell.alignment = { horizontal: 'right', vertical: 'middle' };
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
cell.value = '';
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
cell.value = val;
|
|
390
|
+
}
|
|
391
|
+
cell.border = {
|
|
392
|
+
top: { style: 'thin' },
|
|
393
|
+
bottom: { style: 'thin' },
|
|
394
|
+
left: { style: 'thin' },
|
|
395
|
+
right: { style: 'thin' }
|
|
396
|
+
};
|
|
397
|
+
});
|
|
398
|
+
if (item?.isTotalRow) {
|
|
399
|
+
dataRow.eachCell(cell => {
|
|
400
|
+
cell.font = {
|
|
401
|
+
...cell.font,
|
|
402
|
+
bold: true,
|
|
403
|
+
size: 12
|
|
404
|
+
};
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
this.prepareTableRows(data, columns, options)
|
|
412
|
+
.forEach((rowData, index) => {
|
|
413
|
+
const dataRow = worksheet.getRow(rowIdx++);
|
|
414
|
+
const originalItem = data[index];
|
|
415
|
+
const fullRow = [
|
|
416
|
+
!originalItem?.isTotalRow ? serialNumber++ : '',
|
|
417
|
+
...rowData
|
|
418
|
+
];
|
|
419
|
+
fullRow.forEach((val, cIdx) => {
|
|
420
|
+
const cell = dataRow.getCell(cIdx + 1);
|
|
421
|
+
//cell.value = val;
|
|
422
|
+
/* if (cIdx === 0) {
|
|
423
|
+
cell.value = val;
|
|
424
|
+
} else {
|
|
425
|
+
|
|
426
|
+
const field = columns[cIdx - 1]?.field;
|
|
427
|
+
|
|
428
|
+
if (
|
|
429
|
+
field=='totalPayinAmount'||
|
|
430
|
+
field=='payinAmount'||
|
|
431
|
+
field === 'transactionCommissionAmount' ||
|
|
432
|
+
field === 'tax'
|
|
433
|
+
) {
|
|
434
|
+
cell.value = Number(val);
|
|
435
|
+
cell.numFmt = '#,##0.000';
|
|
436
|
+
cell.alignment = { horizontal: 'right', vertical: 'middle' };
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
cell.value = val;
|
|
440
|
+
}
|
|
441
|
+
} */
|
|
442
|
+
const field = columns[cIdx - 1]?.field;
|
|
443
|
+
if (cIdx === 0) {
|
|
444
|
+
cell.value = val;
|
|
445
|
+
}
|
|
446
|
+
else if (originalItem?.isTotalRow && field === 'receiveAmount') {
|
|
447
|
+
cell.value = '';
|
|
448
|
+
}
|
|
449
|
+
else if (field?.toLowerCase().includes('amount') ||
|
|
450
|
+
field === 'serviceFee' ||
|
|
451
|
+
field === 'tax') {
|
|
452
|
+
if (val !== '' && val !== null && val !== undefined) {
|
|
453
|
+
cell.value = val; // already number
|
|
454
|
+
cell.numFmt = '#,##0.000'; // Excel formatting
|
|
455
|
+
cell.alignment = { horizontal: 'right', vertical: 'middle' };
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
cell.value = '';
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
cell.value = val;
|
|
463
|
+
}
|
|
464
|
+
cell.border = {
|
|
465
|
+
top: { style: 'thin' },
|
|
466
|
+
bottom: { style: 'thin' },
|
|
467
|
+
left: { style: 'thin' },
|
|
468
|
+
right: { style: 'thin' }
|
|
469
|
+
};
|
|
470
|
+
});
|
|
471
|
+
if (originalItem?.isTotalRow) {
|
|
472
|
+
dataRow.eachCell(cell => {
|
|
473
|
+
cell.font = {
|
|
474
|
+
...cell.font,
|
|
475
|
+
bold: true,
|
|
476
|
+
size: 12
|
|
477
|
+
};
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
// ===================== AUTO WIDTH =====================
|
|
483
|
+
for (let i = 1; i <= totalCols; i++) {
|
|
484
|
+
let maxLength = 10;
|
|
485
|
+
worksheet.eachRow({ includeEmpty: true }, (row) => {
|
|
486
|
+
const cell = row.getCell(i);
|
|
487
|
+
if (cell.isMerged)
|
|
488
|
+
return;
|
|
489
|
+
let cellValue = '';
|
|
490
|
+
if (cell.value == null) {
|
|
491
|
+
cellValue = '';
|
|
492
|
+
}
|
|
493
|
+
else if (typeof cell.value === 'object' && 'richText' in cell.value) {
|
|
494
|
+
cellValue = cell.value.richText.map(rt => rt.text).join('');
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
cellValue = cell.value.toString();
|
|
498
|
+
}
|
|
499
|
+
maxLength = Math.max(maxLength, cellValue.length);
|
|
500
|
+
});
|
|
501
|
+
worksheet.getColumn(i).width = Math.min(maxLength, 50);
|
|
502
|
+
}
|
|
503
|
+
//new code:bharati
|
|
504
|
+
worksheet.columns.forEach((column, index) => {
|
|
505
|
+
if (index === 0)
|
|
506
|
+
return; // skip Sr No
|
|
507
|
+
const field = columns[index - 1]?.field;
|
|
508
|
+
if (field === 'payinAmount') {
|
|
509
|
+
column.width = 14;
|
|
510
|
+
}
|
|
511
|
+
if (field === 'payoutAmount') {
|
|
512
|
+
column.width = 15;
|
|
513
|
+
}
|
|
514
|
+
if (field === 'transactionCount') {
|
|
515
|
+
column.width = 14;
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
// worksheet.columns.forEach((column) => {
|
|
519
|
+
// if (column.header === 'Send Amount') {
|
|
520
|
+
// column.width = 25;
|
|
521
|
+
// }
|
|
522
|
+
// });
|
|
523
|
+
// ===================== SAVE FILE =====================
|
|
524
|
+
const buffer = await workbook.xlsx.writeBuffer();
|
|
525
|
+
FileSaver.saveAs(new Blob([buffer], {
|
|
526
|
+
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
527
|
+
}), title.replace(/\s/g, '-') + '.xlsx');
|
|
528
|
+
}
|
|
529
|
+
// private prepareTableRows(data: any[], columns: any[], options: ExportOptions = {}): any[][] {
|
|
530
|
+
// const {
|
|
531
|
+
// excludeFields = [],
|
|
532
|
+
// currencyFields = [],
|
|
533
|
+
// dateFields = [],
|
|
534
|
+
// dateFieldFormats = {},
|
|
535
|
+
// specialDecimalFields = {}
|
|
536
|
+
// } = options;
|
|
537
|
+
// const filtered = columns.filter(c =>
|
|
538
|
+
// c.field && !excludeFields.some(f => c.field.toLowerCase().includes(f))
|
|
539
|
+
// );
|
|
540
|
+
// return data.map((row) => ([
|
|
541
|
+
// ...filtered.map(col => {
|
|
542
|
+
// let value = row[col.field];
|
|
543
|
+
// // Format date fields with custom formats if specified
|
|
544
|
+
// if (col.field && (dateFields.includes(col.field) || col.field in dateFieldFormats)) {
|
|
545
|
+
// const format = dateFieldFormats[col.field] || 'dd/MM/yyyy';
|
|
546
|
+
// value = this.formatDateByFormat(value, format);
|
|
547
|
+
// }
|
|
548
|
+
// // Format special decimal fields with specific decimals
|
|
549
|
+
// else if (col.field && col.field in specialDecimalFields && value != null) {
|
|
550
|
+
// const decimals = specialDecimalFields[col.field];
|
|
551
|
+
// value = parseFloat(value).toFixed(decimals);
|
|
552
|
+
// }
|
|
553
|
+
// // Format regular currency fields with 3 decimals
|
|
554
|
+
// else if (col.field && currencyFields.includes(col.field) && value != null) {
|
|
555
|
+
// value = parseFloat(value).toFixed(3);
|
|
556
|
+
// }
|
|
557
|
+
// return value ?? '';
|
|
558
|
+
// })
|
|
559
|
+
// ]));
|
|
560
|
+
// }
|
|
561
|
+
prepareTableRows(data, columns, options = {}) {
|
|
562
|
+
const { excludeFields = [], currencyFields = [], dateFields = [], dateFieldFormats = {}, specialDecimalFields = {} } = options;
|
|
563
|
+
const filtered = columns.filter(c => c.field && !excludeFields.some(f => c.field.toLowerCase().includes(f)));
|
|
564
|
+
return data.map((row) => ([
|
|
565
|
+
...filtered.map(col => {
|
|
566
|
+
let value = row[col.field];
|
|
567
|
+
// ✅ Date formatting (keep as string)
|
|
568
|
+
if (col.field &&
|
|
569
|
+
(dateFields.includes(col.field) || col.field in dateFieldFormats)) {
|
|
570
|
+
const format = dateFieldFormats[col.field] || 'dd/MM/yyyy';
|
|
571
|
+
value = this.formatDateByFormat(value, format);
|
|
572
|
+
}
|
|
573
|
+
// ✅ Special decimal fields → return NUMBER (no toFixed)
|
|
574
|
+
else if (col.field &&
|
|
575
|
+
col.field in specialDecimalFields &&
|
|
576
|
+
value != null) {
|
|
577
|
+
value = Number(value);
|
|
578
|
+
}
|
|
579
|
+
// ✅ Currency fields → return NUMBER (no toFixed)
|
|
580
|
+
else if (col.field &&
|
|
581
|
+
currencyFields.includes(col.field) &&
|
|
582
|
+
value != null) {
|
|
583
|
+
value = Number(value);
|
|
584
|
+
}
|
|
585
|
+
return value ?? '';
|
|
586
|
+
})
|
|
587
|
+
]));
|
|
588
|
+
}
|
|
589
|
+
formatDateByFormat(val, format) {
|
|
590
|
+
// Helper to pad single digits
|
|
591
|
+
const pad = (n) => n.toString().padStart(2, '0');
|
|
592
|
+
// Parse date for "DD/MM/YYYY hh:mm AM/PM" format manually
|
|
593
|
+
if (typeof val === 'string' && /^\d{2}\/\d{2}\/\d{4} \d{2}:\d{2} [AP]M$/.test(val)) {
|
|
594
|
+
const parts = val.match(/^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}) ([AP]M)$/);
|
|
595
|
+
if (!parts)
|
|
596
|
+
return '';
|
|
597
|
+
let [, dd, mm, yyyy, hh, min, ampm] = parts;
|
|
598
|
+
let hours = parseInt(hh, 10);
|
|
599
|
+
if (ampm === 'PM' && hours !== 12)
|
|
600
|
+
hours += 12;
|
|
601
|
+
if (ampm === 'AM' && hours === 12)
|
|
602
|
+
hours = 0;
|
|
603
|
+
val = new Date(parseInt(yyyy, 10), parseInt(mm, 10) - 1, parseInt(dd, 10), hours, parseInt(min, 10));
|
|
604
|
+
}
|
|
605
|
+
else {
|
|
606
|
+
val = new Date(val);
|
|
607
|
+
}
|
|
608
|
+
if (isNaN(val.getTime()))
|
|
609
|
+
return '';
|
|
610
|
+
const dt = val;
|
|
611
|
+
switch (format) {
|
|
612
|
+
case 'dd/MM/yyyy hh:mm a': { // 11/07/2025 10:56 PM
|
|
613
|
+
let hours12 = dt.getHours() % 12 || 12;
|
|
614
|
+
let ampm = dt.getHours() >= 12 ? 'PM' : 'AM';
|
|
615
|
+
return `${pad(dt.getDate())}/${pad(dt.getMonth() + 1)}/${dt.getFullYear()} ${pad(hours12)}:${pad(dt.getMinutes())} ${ampm}`;
|
|
616
|
+
}
|
|
617
|
+
case 'dd/MM/yyyy HH:mm': { // 28/07/2025 13:08
|
|
618
|
+
return `${pad(dt.getDate())}/${pad(dt.getMonth() + 1)}/${dt.getFullYear()} ${pad(dt.getHours())}:${pad(dt.getMinutes())}`;
|
|
619
|
+
}
|
|
620
|
+
case 'dd/MM/yyyy': { // 28/07/2025
|
|
621
|
+
return `${pad(dt.getDate())}/${pad(dt.getMonth() + 1)}/${dt.getFullYear()}`;
|
|
622
|
+
}
|
|
623
|
+
default:
|
|
624
|
+
return dt.toLocaleString();
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
dateValueFormatter(format) {
|
|
628
|
+
return (params) => {
|
|
629
|
+
if (!params.value)
|
|
630
|
+
return '';
|
|
631
|
+
try {
|
|
632
|
+
return formatDate(params.value, format, 'en-US');
|
|
633
|
+
}
|
|
634
|
+
catch {
|
|
635
|
+
return '';
|
|
636
|
+
}
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
getKeys(obj) {
|
|
640
|
+
return obj ? Object.keys(obj) : [];
|
|
641
|
+
}
|
|
642
|
+
hasAnyGroups() {
|
|
643
|
+
return this.filteredData && this.getKeys(this.filteredData).length > 0;
|
|
644
|
+
}
|
|
645
|
+
formatAmount(params) {
|
|
646
|
+
const value = params?.value;
|
|
647
|
+
if (value !== null && value !== undefined && value !== '') {
|
|
648
|
+
const num = Number(value);
|
|
649
|
+
return (Math.trunc(num * 1000) / 1000).toFixed(3);
|
|
650
|
+
}
|
|
651
|
+
return '';
|
|
652
|
+
}
|
|
653
|
+
handleSearch(criteria) {
|
|
654
|
+
this.searchCriteria = criteria.searchCriteria;
|
|
655
|
+
this.reportDate = new Date().toISOString();
|
|
656
|
+
this.reportDate = formatDate(this.reportDate, 'dd/MM/yyyy hh:mm a', 'en-US');
|
|
657
|
+
const modal = criteria.modal;
|
|
658
|
+
this.user = criteria.sysUserID;
|
|
659
|
+
this.fromDate = formatDate(modal.fromDate, 'dd/MM/yyyy hh:mm a', 'en-US').slice(0, 10);
|
|
660
|
+
this.toDate = formatDate(modal.toDate, 'dd/MM/yyyy hh:mm a', 'en-US').slice(0, 10);
|
|
661
|
+
console.log(modal);
|
|
662
|
+
// Code For Meta Data
|
|
663
|
+
this.leftData = {
|
|
664
|
+
'Report Period': this.fromDate + " - " + this.toDate,
|
|
665
|
+
};
|
|
666
|
+
this.metaDataTwo = {
|
|
667
|
+
'Report User & Time': this.user + " @ " + this.reportDate,
|
|
668
|
+
};
|
|
669
|
+
const isTotalSummary = modal.summaryReport === 'Total Summary';
|
|
670
|
+
this.isTotalSummary = isTotalSummary;
|
|
671
|
+
const searchData = {
|
|
672
|
+
"StartDate": modal.fromDate,
|
|
673
|
+
"EndDate": modal.toDate,
|
|
674
|
+
"SendCountryCode": modal.sendCountry,
|
|
675
|
+
"RecvCountryCode": modal.receiveCountry,
|
|
676
|
+
"BusinessPartnerCode": modal.client,
|
|
677
|
+
"TransactionStatus": modal.transactionStatus.join(","),
|
|
678
|
+
"PayoutCurrency": modal.receiveCurrency,
|
|
679
|
+
"TransactionType": modal.product,
|
|
680
|
+
"BranchCode": modal.branch,
|
|
681
|
+
"SummaryReport": modal.summaryReport
|
|
682
|
+
};
|
|
683
|
+
this.showMessage = true;
|
|
684
|
+
this.clearSearch = true;
|
|
685
|
+
this.loadingState = ComponentLoadingStates.Loading;
|
|
686
|
+
this.reportService.getBranchActivitySendSummaryReport(searchData).subscribe({
|
|
687
|
+
next: (data) => {
|
|
688
|
+
console.log(data);
|
|
689
|
+
this.dataMap = JSON.parse(JSON.stringify(data));
|
|
690
|
+
this.filteredData = data;
|
|
691
|
+
this.noDataFound = Object.keys(this.filteredData).length == 0 ? true : false;
|
|
692
|
+
this.proxyData = structuredClone(data);
|
|
693
|
+
this.paginationArray = new Array(Object.keys(this.filteredData).length).fill(15);
|
|
694
|
+
this.showMessage = Object.keys(this.filteredData).length == 0 ? true : false;
|
|
695
|
+
this.showReport = true;
|
|
696
|
+
},
|
|
697
|
+
error: (err) => {
|
|
698
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
|
699
|
+
this.clearSearch = false;
|
|
700
|
+
},
|
|
701
|
+
complete: () => {
|
|
702
|
+
this.loadingState = ComponentLoadingStates.Complete;
|
|
703
|
+
this.showReport = true;
|
|
704
|
+
this.clearSearch = false;
|
|
705
|
+
}
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
handleFormValid(isValid) {
|
|
709
|
+
this.isFormValid = isValid;
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
BranchActivitySendSummaryReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BranchActivitySendSummaryReportComponent, deps: [{ token: i1.ReportService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
713
|
+
BranchActivitySendSummaryReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BranchActivitySendSummaryReportComponent, selector: "lib-branch-activity-send-summary-report", ngImport: i0, template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\"\r\n (formValid)=\"handleFormValid($event)\">\r\n</lib-search-filter >\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<section *ngIf=\"showReport && isFormValid && !clearSearch\" class=\"my-2\">\r\n <ng-container *ngIf=\"!noDataFound\">\r\n <lib-metadata [reportName]=\"ReportName\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\" [metaDataOne]=\"leftData\" [metaDataTwo]=\"metaDataTwo\"(exportEvent)=\"handleExport($event)\" (searchEvent)=\"filter($event)\"></lib-metadata>\r\n\r\n <ngb-accordion #acc=\"ngbAccordion\" [closeOthers]=\"false\">\r\n <ng-container *ngFor=\"let item of filteredData | keyvalue; let i = index\">\r\n <ngb-panel *ngIf=\"item.value.length > 0\" [id]=\"'panel-' + i\">\r\n\r\n <ng-template ngbPanelTitle style=\"height: 10%;\">\r\n <label\r\n class=\"panel-cls\">{{\r\n item.key\r\n }}</label>\r\n </ng-template>\r\n\r\n <ng-template ngbPanelContent>\r\n <div style=\"position: relative;\">\r\n <lib-page-size-selector [totalEntries]=\"item?.value?.length\"\r\n [defaultSize]=\"'15'\" [gridApi]=\"gridApis[i]\">\r\n ></lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid\" style=\"width: 100%;height: 380px;\"\r\n [columnDefs]=\"columnDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [rowData]=\"item.value\" \r\n [rowHeight]=\"20\"\r\n [headerHeight]=\"22\"\r\n [pagination]=\"true\" \r\n [paginationPageSize]=\"paginationArray[i]\" \r\n [rowClassRules]=\"rowClassRules\"\r\n (gridReady)=\"onGridReady($event,i)\"\r\n >\r\n </ag-grid-angular>\r\n </div>\r\n </ng-template>\r\n\r\n </ngb-panel>\r\n </ng-container>\r\n </ngb-accordion>\r\n </ng-container>\r\n <div class=\"alert alert-warning mt-3\" *ngIf=\"noDataFound\">\r\n No Data found matching your search criteria.\r\n </div>\r\n</section>", 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}.transaction-grid ::ng-deep .ag-row.total-row .ag-cell{font-weight:700!important;font-size:11px!important}\n"], dependencies: [{ kind: "component", type: i2.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.PageSizeSelectorComponent, selector: "lib-page-size-selector", inputs: ["pageSizeArray", "defaultSize", "totalEntries", "gridApi"] }, { kind: "component", type: i5.MetadataComponent, selector: "lib-metadata", inputs: ["metaDataOne", "metaDataTwo", "showmetaDataOne", "showmetaDataTwo", "reportName"], outputs: ["searchEvent", "exportEvent"] }, { kind: "component", type: i6.NgbAccordion, selector: "ngb-accordion", inputs: ["animation", "activeIds", "closeOthers", "destroyOnHide", "type"], outputs: ["panelChange", "shown", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i6.NgbPanel, selector: "ngb-panel", inputs: ["disabled", "id", "title", "type", "cardClass"], outputs: ["shown", "hidden"] }, { kind: "directive", type: i6.NgbPanelTitle, selector: "ng-template[ngbPanelTitle]" }, { kind: "directive", type: i6.NgbPanelContent, selector: "ng-template[ngbPanelContent]" }, { kind: "component", type: i7.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i8.SearchFilterComponent, selector: "lib-search-filter", inputs: ["ReportName", "initialFilters"], outputs: ["searchClicked", "formValid"] }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }] });
|
|
714
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BranchActivitySendSummaryReportComponent, decorators: [{
|
|
715
|
+
type: Component,
|
|
716
|
+
args: [{ selector: 'lib-branch-activity-send-summary-report', template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\"\r\n (formValid)=\"handleFormValid($event)\">\r\n</lib-search-filter >\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<section *ngIf=\"showReport && isFormValid && !clearSearch\" class=\"my-2\">\r\n <ng-container *ngIf=\"!noDataFound\">\r\n <lib-metadata [reportName]=\"ReportName\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\" [metaDataOne]=\"leftData\" [metaDataTwo]=\"metaDataTwo\"(exportEvent)=\"handleExport($event)\" (searchEvent)=\"filter($event)\"></lib-metadata>\r\n\r\n <ngb-accordion #acc=\"ngbAccordion\" [closeOthers]=\"false\">\r\n <ng-container *ngFor=\"let item of filteredData | keyvalue; let i = index\">\r\n <ngb-panel *ngIf=\"item.value.length > 0\" [id]=\"'panel-' + i\">\r\n\r\n <ng-template ngbPanelTitle style=\"height: 10%;\">\r\n <label\r\n class=\"panel-cls\">{{\r\n item.key\r\n }}</label>\r\n </ng-template>\r\n\r\n <ng-template ngbPanelContent>\r\n <div style=\"position: relative;\">\r\n <lib-page-size-selector [totalEntries]=\"item?.value?.length\"\r\n [defaultSize]=\"'15'\" [gridApi]=\"gridApis[i]\">\r\n ></lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid\" style=\"width: 100%;height: 380px;\"\r\n [columnDefs]=\"columnDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [rowData]=\"item.value\" \r\n [rowHeight]=\"20\"\r\n [headerHeight]=\"22\"\r\n [pagination]=\"true\" \r\n [paginationPageSize]=\"paginationArray[i]\" \r\n [rowClassRules]=\"rowClassRules\"\r\n (gridReady)=\"onGridReady($event,i)\"\r\n >\r\n </ag-grid-angular>\r\n </div>\r\n </ng-template>\r\n\r\n </ngb-panel>\r\n </ng-container>\r\n </ngb-accordion>\r\n </ng-container>\r\n <div class=\"alert alert-warning mt-3\" *ngIf=\"noDataFound\">\r\n No Data found matching your search criteria.\r\n </div>\r\n</section>", 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}.transaction-grid ::ng-deep .ag-row.total-row .ag-cell{font-weight:700!important;font-size:11px!important}\n"] }]
|
|
717
|
+
}], ctorParameters: function () { return [{ type: i1.ReportService }, { type: i0.NgZone }]; } });
|
|
718
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmNoLWFjdGl2aXR5LXNlbmQtc3VtbWFyeS1yZXBvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL2JyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0L2JyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy9icmFuY2gtYWN0aXZpdHktc2VuZC1zdW1tYXJ5LXJlcG9ydC9icmFuY2gtYWN0aXZpdHktc2VuZC1zdW1tYXJ5LXJlcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFrQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBaUIsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUUxRixnREFBZ0Q7QUFDaEQsb0ZBQW9GO0FBQ3BGLGdGQUFnRjtBQUNoRiw4RkFBOEY7QUFDOUYsOENBQThDO0FBQzlDLDZCQUE2QjtBQUM3Qiw0QkFBNEI7QUFDM0IsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7O0FBTzdDLE1BQU0sT0FBTyx3Q0FBd0M7SUE0Rm5ELFlBQW9CLGFBQTRCLEVBQVUsTUFBYztRQUFwRCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLFdB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LElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQzNCLENBQUM7WUFFRCxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUNiLElBQUksQ0FBQyxZQUFZLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDO2dCQUNwRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDM0IsQ0FBQztTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxlQUFlLENBQUMsT0FBZ0I7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7SUFDN0IsQ0FBQzs7cUlBbHpCVSx3Q0FBd0M7eUhBQXhDLHdDQUF3QywrRUN4QnJELDJyRUFrRFU7MkZEMUJHLHdDQUF3QztrQkFMcEQsU0FBUzsrQkFDRSx5Q0FBeUMiLCJzb3VyY2VzQ29udGVudCI6WyIgaW1wb3J0IHsgQ29tcG9uZW50LCBOZ1pvbmUsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbiAvLyBpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbiBpbXBvcnQgeyBDb2xEZWYsIEdyaWRBcGksIEdyaWRSZWFkeUV2ZW50IH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xyXG4gaW1wb3J0IHsgdGhlbWVBbHBpbmUgfSBmcm9tICdAYWctZ3JpZC1jb21tdW5pdHkvdGhlbWluZyc7XHJcbmltcG9ydCB7IEJyYW5jaEFjdGl2aXR5UmVwb3J0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2JyYW5jaC1hY3Rpdml0eS1yZXBvcnQvYnJhbmNoLWFjdGl2aXR5LXNlbmQtcmVwb3J0JztcclxuaW1wb3J0IHsgQ29tcG9uZW50TG9hZGluZ1N0YXRlcyB9IGZyb20gJy4uLy4uL21vZGVscy9jb21wb25lbnQtbG9hZGluZy1zdGF0ZXMnO1xyXG5pbXBvcnQgeyBFeHBvcnRPcHRpb25zLCBHZW5lcmljRXhwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9leHBvcnQtZ2VuZXJpYy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC5zZXJ2aWNlJztcclxuLy8gaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbi8vIGltcG9ydCB7IENvbXBvbmVudExvYWRpbmdTdGF0ZXMgfSBmcm9tICdzcmMvYXBwL21vZGVscy9jb21wb25lbnQtbG9hZGluZy1zdGF0ZXMnO1xyXG4vLyBpbXBvcnQgeyBHZW5lcmljRXhwb3J0U2VydmljZSB9IGZyb20gJ3NyYy9hcHAvc2hhcmVkL2V4cG9ydC1nZW5lcmljLnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBFeHBvcnRPcHRpb25zIH0gZnJvbSAncHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9zaGFyZWQvZXhwb3J0LWdlbmVyaWMuc2VydmljZSc7XHJcbi8vIGltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuLy8gaW1wb3J0IGpzUERGIGZyb20gJ2pzcGRmJztcclxuLy8gaW1wb3J0ICdqc3BkZi1hdXRvdGFibGUnO1xyXG4gaW1wb3J0ICogYXMgRXhjZWxKUyBmcm9tICdleGNlbGpzJztcclxuIGltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcclxuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1icmFuY2gtYWN0aXZpdHktc2VuZC1zdW1tYXJ5LXJlcG9ydCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2JyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9icmFuY2gtYWN0aXZpdHktc2VuZC1zdW1tYXJ5LXJlcG9ydC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCcmFuY2hBY3Rpdml0eVNlbmRTdW1tYXJ5UmVwb3J0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBkYXRhTWFwOiBSZWNvcmQ8c3RyaW5nLCBCcmFuY2hBY3Rpdml0eVJlcG9ydFtdPiA9IHt9XHJcbiAgZmlsdGVyZWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBCcmFuY2hBY3Rpdml0eVJlcG9ydFtdPiA9IHt9XHJcbiAgcHJveHlEYXRhOiBSZWNvcmQ8c3RyaW5nLCBCcmFuY2hBY3Rpdml0eVJlcG9ydFtdPiA9IHt9XHJcbiAgc2hvd1JlcG9ydDogYm9vbGVhbjtcclxuICBwYWdpbmF0aW9uQXJyYXk6IGFueVtdO1xyXG4gIHNlbGVjdGVkRXhwb3J0T3B0aW9uID0gJ2V4Y2VsJztcclxuICBncmlkQXBpczogR3JpZEFwaVtdID0gW107XHJcbiAgZ3JpZENvbHVtbkFwaTtcclxuICB1c2VyOiBzdHJpbmcgPSBcIlwiO1xyXG4gIHJlcG9ydERhdGU6IHN0cmluZztcclxuICBmcm9tRGF0ZTogc3RyaW5nO1xyXG4gIHRvRGF0ZTogc3RyaW5nO1xyXG4gIHNlYXJjaFRleHQ6IHN0cmluZztcclxuICBidWZmZXI6IGFueTtcclxuICBzeXNVc2VySWQ6IHN0cmluZztcclxuICBwcml2YXRlIGxvZ29CYXNlNjQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBDb21wb25lbnRMb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzO1xyXG4gIGxvYWRpbmdTdGF0ZTogQ29tcG9uZW50TG9hZGluZ1N0YXRlcyA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuTG9hZGluZztcclxuICBSZXBvcnROYW1lOiBzdHJpbmcgPSBcIkJyYW5jaCBBY3Rpdml0eSBTZW5kIFN1bW1hcnlcIjtcclxuICBsZWZ0RGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICBtZXRhRGF0YVR3bzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICBleHBvcnRTZXJ2aWNlOiBHZW5lcmljRXhwb3J0U2VydmljZSA9IGluamVjdChHZW5lcmljRXhwb3J0U2VydmljZSk7XHJcbiAgc2VhcmNoQ3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xyXG5cclxuICAvLyBmbGFnc1xyXG4gIHNob3dNZXNzYWdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbm9EYXRhRm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0Zvcm1WYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNsZWFyU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNUb3RhbFN1bW1hcnk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjb2x1bW5EZWZzOiBDb2xEZWY8QnJhbmNoQWN0aXZpdHlSZXBvcnQ+W10gPSBbXHJcblxyXG4gICAge1xyXG4gICAgICBmaWVsZDogJ2J1c2luZXNzRGF0ZVRpbWUnLCBoZWFkZXJOYW1lOiAnQnVzaW5lc3MgRGF0ZScsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBoZWFkZXJDbGFzczogJ2FnLWxlZnQtYWxpZ25lZC1oZWFkZXInLCBtaW5XaWR0aDogNzAsIHdpZHRoOiA3MCwgdG9vbHRpcEZpZWxkOiAnYnVzaW5lc3NEYXRlVGltZScsXHJcbiAgICAgIHZhbHVlRm9ybWF0dGVyOiAocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gcGFyYW1zLmRhdGEgYXMgQnJhbmNoQWN0aXZpdHlSZXBvcnQgfCBudWxsO1xyXG5cclxuICAgICAgICBpZiAocm93ICYmIHJvdy5wYXlpbkNDY29kZSA9PT0gJ1RvdGFsJykge1xyXG4gICAgICAgICAgcmV0dXJuICcnOyAvLyBoaWRlIGRhdGUgZm9yIHRvdGFsIHJvd1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHBhcmFtcy52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHsgZmllbGQ6ICdwcm9kdWN0JywgaGVhZGVyTmFtZTogJ1Byb2R1Y3QnLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgbWluV2lkdGg6IDgwLCB3aWR0aDogMTIwLCB0b29sdGlwRmllbGQ6ICdwcm9kdWN0JyB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnSXMgU2VuZGVyIENvcnBvcmF0ZScsIGZpZWxkOiAnc2VuZGVyVHlwZScsIGZsZXg6IDEsIG1pbldpZHRoOiA4MCwgXHJcbiAgICAgIHZhbHVlRm9ybWF0dGVyOiAocGFyYW1zKSA9PiB7IGlmICghcGFyYW1zLnZhbHVlKSByZXR1cm4gJyc7IGNvbnN0IHZhbHVlID0gcGFyYW1zLnZhbHVlLnRvVXBwZXJDYXNlKCk7IGlmICh2YWx1ZSA9PT0gJ0NPUlBPUkFURScpIHJldHVybiAnWUVTJzsgaWYgKHZhbHVlID09PSAnSU5ESVZJRFVBTCcpIHJldHVybiAnTk8nOyByZXR1cm4gJyc7IH0sXHJcbiAgICAgIHRvb2x0aXBWYWx1ZUdldHRlcjogKHBhcmFtcykgPT4geyBpZiAoIXBhcmFtcy52YWx1ZSkgcmV0dXJuICcnOyBjb25zdCB2YWx1ZSA9IHBhcmFtcy52YWx1ZS50b1VwcGVyQ2FzZSgpOyBpZiAodmFsdWUgPT09ICdDT1JQT1JBVEUnKSByZXR1cm4gJ1lFUyc7IGlmICh2YWx1ZSA9PT0gJ0lORElWSURVQUwnKSByZXR1cm4gJ05PJzsgcmV0dXJuICcnOyB9IH0sXHJcbiAgICB7IGhlYWRlck5hbWU6ICdJcyBCZW5lZmljaWFyeSBDb3Jwb3JhdGUnLCBmaWVsZDogJ2JlbmVmaWNpYXJ5VHlwZScsIGZsZXg6IDEsIG1pbldpZHRoOiA4MCxcclxuICAgICAgdmFsdWVGb3JtYXR0ZXI6IChwYXJhbXMpID0+IHsgaWYgKCFwYXJhbXMudmFsdWUpIHJldHVybiAnJzsgY29uc3QgdmFsdWUgPSBwYXJhbXMudmFsdWUudG9VcHBlckNhc2UoKTsgaWYgKHZhbHVlID09PSAnQ09SUE9SQVRFJykgcmV0dXJuICdZRVMnOyBpZiAodmFsdWUgPT09ICdJTkRJVklEVUFMJykgcmV0dXJuICdOTyc7IHJldHVybiAnJzsgfSxcclxuICAgICAgdG9vbHRpcFZhbHVlR2V0dGVyOiAocGFyYW1zKSA9PiB7IGlmICghcGFyYW1zLnZhbHVlKSByZXR1cm4gJyc7IGNvbnN0IHZhbHVlID0gcGFyYW1zLnZhbHVlLnRvVXBwZXJDYXNlKCk7IGlmICh2YWx1ZSA9PT0gJ0NPUlBPUkFURScpIHJldHVybiAnWUVTJzsgaWYgKHZhbHVlID09PSAnSU5ESVZJRFVBTCcpIHJldHVybiAnTk8nOyByZXR1cm4gJyc7IH0gfSxcclxuICAgIHsgZmllbGQ6ICdwYXlvdXRDQ2NvZGUnLCBoZWFkZXJOYW1lOiAnUmVjZWl2ZSBDdXJyZW5jeScsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBtaW5XaWR0aDogOTAsIHdpZHRoOiAxMTAsIHRvb2x0aXBGaWVsZDogJ3BheW91dENDY29kZScgfSxcclxuICAgIHsgZmllbGQ6ICdwYXlvdXRBbW91bnQnLCBoZWFkZXJOYW1lOiAnUmVjZWl2ZSBBbW91bnQnLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgbWluV2lkdGg6IDkwLCBtYXhXaWR0aDogMTIwLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwgY29tcGFjdC1jZWxsJywgdG9vbHRpcEZpZWxkOiAncGF5b3V0QW1vdW50JyB9LFxyXG4gICAgeyBmaWVsZDogJ3BheWluQ0Njb2RlJywgaGVhZGVyTmFtZTogJ1NlbmQgQ3VycmVuY3knLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgbWluV2lkdGg6IDkwLCBtYXhXaWR0aDogOTAsIHRvb2x0aXBGaWVsZDogJ3BheWluQ0Njb2RlJyB9LFxyXG4gICAgeyBmaWVsZDogJ3BheWluQW1vdW50JywgaGVhZGVyTmFtZTogJ1NlbmQgQW1vdW50JywgZmxleDogMSwgd3JhcFRleHQ6IHRydWUsIGF1dG9IZWlnaHQ6IHRydWUsIG1pbldpZHRoOiA4MCwgbWF4V2lkdGg6IDEyMCwgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsIGNvbXBhY3QtY2VsbCcsIHRvb2x0aXBGaWVsZDogJ3BheWluQW1vdW50JyB9LFxyXG4gICAgeyBmaWVsZDogJ3RyYW5zYWN0aW9uQ29tbWlzc2lvbkFtb3VudCcsIGhlYWRlck5hbWU6ICdTZXJ2aWNlIEZlZScsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBtaW5XaWR0aDogOTAsIG1heFdpZHRoOiAxMDAsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCBjb21wYWN0LWNlbGwnLCB0b29sdGlwRmllbGQ6ICd0cmFuc2FjdGlvbkNvbW1pc3Npb25BbW91bnQnIH0sXHJcbiAgICB7IGZpZWxkOiAndGF4JywgaGVhZGVyTmFtZTogJ1RheCcsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBtaW5XaWR0aDogODAsIG1heFdpZHRoOiAxMDAsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCBjb21wYWN0LWNlbGwnLCB0b29sdGlwRmllbGQ6ICd0YXgnIH0sXHJcbiAgICB7IGZpZWxkOiAndG90YWxQYXlpbkFtb3VudCcsIGhlYWRlck5hbWU6ICdUb3RhbCBTZW5kIEFtb3VudCcsIG1pbldpZHRoOiAxMDAsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwgY29tcGFjdC1jZWxsJywgdG9vbHRpcEZpZWxkOiAndG90YWxQYXlpbkFtb3VudCcgfSxcclxuICAgIHsgZmllbGQ6ICd0cmFuc2FjdGlvbkNvdW50JywgaGVhZGVyTmFtZTogJ1RyYW5zYWN0aW9uIENvdW50JywgZmxleDogMSwgd3JhcFRleHQ6IHRydWUsIGF1dG9IZWlnaHQ6IHRydWUsIG1pbldpZHRoOiA4MCwgbWF4V2lkdGg6IDEwMCwgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsIGNvbXBhY3QtY2VsbCcsIHRvb2x0aXBGaWVsZDogJ3R4bkNvdW50JyB9LFxyXG4gICAgeyBmaWVsZDogJ3N0YXR1cycsIGhlYWRlck5hbWU6ICdUcmFuc2FjdGlvbiBTdGF0dXMnLCBtaW5XaWR0aDogMTAwLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgdG9vbHRpcEZpZWxkOiAnc3RhdHVzJyB9XHJcbiAgXTtcclxuXHJcblxyXG4gIGRlZmF1bHRDb2xEZWYgPSB7XHJcbiAgICBzb3J0YWJsZTogdHJ1ZSxcclxuICAgIGZpbHRlcjogdHJ1ZSxcclxuICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgIG1pbndpZHRoOiA0MCxcclxuICAgIHdyYXBIZWFkZXJUZXh0OiB0cnVlLFxyXG4gICAgYXV0b0hlYWRlckhlaWdodDogdHJ1ZSxcclxuICAgIHN1cHByZXNzU2l6ZVRvRml0OiBmYWxzZSxcclxuICAgIHdyYXBUZXh0OiB0cnVlXHJcbiAgfTtcclxuXHJcbiAgLy8gcm93Q2xhc3NSdWxlcyA9IHtcclxuICAvLyAgIGRlYnVnZ2VyXHJcbiAgLy8gICAndG90YWwtcm93JzogcGFyYW1zID0+IHBhcmFtcy5kYXRhPy5pc1RvdGFsUm93XHJcbiAgLy8gfTtcclxuXHJcbiAgcm93Q2xhc3NSdWxlcyA9IHtcclxuICAgICd0b3RhbC1yb3cnOiAocGFyYW1zKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdSb3cgRGF0YTonLCBwYXJhbXMuZGF0YS5pc1RvdGFsUm93KTtcclxuICAgICAgaWYgKHBhcmFtcy5kYXRhLmlzVG90YWxSb3cpIHtcclxuICAgICAgICByZXR1cm4gcGFyYW1zLmRhdGE/LmlzVG90YWxSb3c7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcm93RGF0YTogQnJhbmNoQWN0aXZpdHlSZXBvcnRbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlcG9ydFNlcnZpY2U6IFJlcG9ydFNlcnZpY2UsIHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxyXG5cclxuICByZXBvcnRUaGVtZSA9IHRoZW1lQWxwaW5lLndpdGhQYXJhbXMoe1xyXG4gICAgaGVhZGVyRm9udFNpemU6ICcxMHB4JyxcclxuICAgIGZvbnRGYW1pbHk6IFsnQXJpYWwnLCAnc2Fucy1zZXJpZiddLFxyXG4gICAgZm9udFNpemU6ICc5cHgnXHJcbiAgfSk7XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkNvbXBsZXRlO1xyXG4gICAgLy8gQ2hlY2sgaWYgVXNlciBpcyBmYWxjb24gdXNlciBvciBmb3NzaWxVc2VyXHJcbiAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZm9zc2lsdXNlcm5hbWUnKSkge1xyXG4gICAgICB0aGlzLnN5c1VzZXJJZCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvc3NpbHVzZXJuYW1lJylcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnN5c1VzZXJJZCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2V6cmVtaXR1c2VybmFtZScpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zeXNVc2VySWQgPSB0aGlzLnN5c1VzZXJJZC5yZXBsYWNlKC9eW1wiJ10oLiopW1wiJ10kLywgJyQxJyk7XHJcbiAgICB0aGlzLnVzZXIgPSB0aGlzLnN5c1VzZXJJZDtcclxuICAgIGNvbnNvbGUubG9nKFwiU3lzdGVtIFVzZXIgSWQgOiBcIiArIHRoaXMuc3lzVXNlcklkKTtcclxuICB9XHJcblxyXG4gIGZpbHRlcih0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHRleHQ7XHJcbiAgICBpZiAodGhpcy5zZWFyY2hUZXh0ID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dD8ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gc3RydWN0dXJlZENsb25lKHRoaXMuZGF0YU1hcCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoVGV4dD8udHJpbSgpPy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnByb3h5RGF0YSkpIHtcclxuICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gZW50cmllcy5maWx0ZXIoZW50cnkgPT4gT2JqZWN0LnZhbHVlcyhlbnRyeSlcclxuICAgICAgICAuc29tZSh2YWwgPT4ge1xyXG4gICAgICAgICAgbGV0IGE6IHN0cmluZyA9IHZhbD8udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgaWYoYSA9PSBudWxsKXtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGE/LnNlYXJjaCh0aGlzLnNlYXJjaFRleHQpID09IC0xID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgICAgIH0pKVxyXG5cclxuICAgICAgdGhpcy5maWx0ZXJlZERhdGFba2V5XSA9IGZpbHRlcmVkRGF0YTtcclxuICAgIH1cclxuICAgIHRoaXMuZmlsdGVyZWREYXRhO1xyXG4gIH1cclxuXHJcbiAgb25HcmlkUmVhZHkocGFyYW1zOiBHcmlkUmVhZHlFdmVudCwgaWQ6IG51bWJlcikge1xyXG4gICAgcGFyYW1zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICB0aGlzLmdyaWRDb2x1bW5BcGkgPSBwYXJhbXMuY29sdW1uQXBpO1xyXG4gICAgdGhpcy5ncmlkQXBpc1tpZF0gPSBwYXJhbXMuYXBpO1xyXG4gICAgcGFyYW1zLmNvbHVtbkFwaS5zZXRDb2x1bW5WaXNpYmxlKCdidXNpbmVzc0RhdGVUaW1lJywgIXRoaXMuaXNUb3RhbFN1bW1hcnkpO1xyXG4gICAgcGFyYW1zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFeHBvcnQob3B0aW9uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRFeHBvcnRPcHRpb24gPSBvcHRpb247XHJcbiAgICBpZiAoIXRoaXMuaGFzQW55R3JvdXBzKCkpIHtcclxuICAgICAgYWxlcnQoXCJUaGVyZSBpcyBubyBkYXRhIHRvIGV4cG9ydCBiYXNlZCBvbiB5b3VyIGN1cnJlbnQgZmlsdGVyLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgbm8gZGF0YSwgZG8gbm90aGluZy5cclxuICAgIGlmICghdGhpcy5maWx0ZXJlZERhdGEgfHwgT2JqZWN0LmtleXModGhpcy5maWx0ZXJlZERhdGEpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBhbGVydChcIk5vIGRhdGEgdG8gZXhwb3J0XCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB0aXRsZSA9IFwiQnJhbmNoIEFjdGl2aXR5IFNlbmQgU3VtbWFyeVwiO1xyXG4gICAgY29uc3QgcmVwb3J0VGltZUZvcm1hdHRlciA9IHRoaXMuZGF0ZVZhbHVlRm9ybWF0dGVyKCdkZC9NTS95eXl5IGhoOm1tIGEnKTtcclxuICAgIGNvbnN0IG1ldGFkYXRhOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXHJcbiAgICAgIFsnUmVwb3J0IFBlcmlvZCAnLCB0aGlzLmZyb21EYXRlICsgXCIgLSBcIiArIHRoaXMudG9EYXRlXSxcclxuICAgICAgWydSZXBvcnQgVXNlciAmIFRpbWUnLCB0aGlzLnVzZXIgPyB0aGlzLnVzZXIgKyBcIiBAIFwiICsgdGhpcy5yZXBvcnREYXRlIDogJycgKyBcIiBAIFwiICsgdGhpcy5yZXBvcnREYXRlXSxcclxuICAgIF07XHJcbiAgICAvLyAtLS0gc2VhcmNoIGNyaXRlcmlhIC0tLVxyXG4gICAgY29uc3Qgc2VhcmNoQ3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXSA9IHRoaXMuc2VhcmNoQ3JpdGVyaWE7XHJcbiAgICAvL2NvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbkRlZnM7XHJcblxyXG4gICAgLy9leGNsdWRlIEJ1c2luZXNzIERhdGUgY29sIGZvciBUb3RhbCBTdW1tYXJ5IFJlcG9ydC5cclxuICAgIGxldCBjb2x1bW5zID0gWy4uLnRoaXMuY29sdW1uRGVmc107XHJcbiAgICBjb25zdCBzdW1tYXJ5UmVwb3J0ID0gdGhpcy5zZWFyY2hDcml0ZXJpYS5maW5kKHggPT4geFswXSA9PT0gJ1N1bW1hcnkgUmVwb3J0OicpPy5bMV07XHJcbiAgICAgXHJcbiAgICBpZiAoc3VtbWFyeVJlcG9ydCA9PT0gJ1RvdGFsIFN1bW1hcnknKSB7XHJcbiAgICAgIGNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmZpZWxkICE9PSAnYnVzaW5lc3NEYXRlVGltZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFNYXA7XHJcbiAgICBjb25zdCBjbGVhbmVkRGF0YSA9IHt9O1xyXG5cclxuICAgIE9iamVjdC5rZXlzKHRoaXMuZGF0YU1hcCkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBjbGVhbmVkRGF0YVtrZXldID0gdGhpcy5kYXRhTWFwW2tleV0ubWFwKHJvdyA9PiB7XHJcbiAgICAgICAgaWYgKHJvdy5pc1RvdGFsUm93KSB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5yb3csXHJcbiAgICAgICAgICAgIGJ1c2luZXNzRGF0ZVRpbWU6ICcnLFxyXG4gICAgICAgICAgICBwcm9kdWN0OiAnJyxcclxuICAgICAgICAgICAgcmVjZWl2ZUN1cnJlbmN5OiAnJyxcclxuICAgICAgICAgICAgcmVjZWl2ZUFtb3VudDogJydcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByb3c7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZGF0YSA9IGNsZWFuZWREYXRhO1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgY3VycmVuY3lGaWVsZHM6IFtcclxuICAgICAgICAncGF5b3V0QW1vdW50JywgJ3BheWluQW1vdW50JywgJ3RyYW5zYWN0aW9uQ29tbWlzc2lvbkFtb3VudCcsICd0YXgnLCAndG90YWxQYXlpbkFtb3VudCdcclxuICAgICAgXSxcclxuICAgICAgLy8gc3BlY2lmeSBhbGwgZGF0ZSBmaWVsZHMgZXhwZWN0ZWRcclxuICAgICAgZGF0ZUZpZWxkczogW10sXHJcblxyXG4gICAgICBkYXRlRmllbGRGb3JtYXRzOiB7XHJcbiAgICAgICAgdHhuRGF0ZUFuZFRpbWU6ICdkZC9NTS95eXl5IGhoOm1tIGEnLFxyXG4gICAgICAgIGNhbmNlbGxhdGlvbkJyYW5jaERhdGVUaW1lOiAnZGQvTU0veXl5eSBISDptbScsXHJcbiAgICAgICAgY2FuY2VsbGF0aW9uQnVzaW5lc3NEYXRlOiAnZGQvTU0veXl5eSdcclxuICAgICAgfSxcclxuXHJcbiAgICAgIHNwZWNpYWxEZWNpbWFsRmllbGRzOiB7XHJcbiAgICAgICAgcmF0ZTogOCAgICAgICAvLyBmdXR1cmUgZmllbGQgd2l0aCA4IGRlY2ltYWwgcGxhY2VzXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBncm91cEJ5S2V5OiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZEV4cG9ydE9wdGlvbikge1xyXG4gICAgICBjYXNlICdleGNlbCc6XHJcbiAgICAgICAgdGhpcy5leHBvcnRUb0V4Y2VsKHsgdGl0bGUsIG1ldGFkYXRhLCBzZWFyY2hDcml0ZXJpYSwgY29sdW1ucywgZGF0YSwgb3B0aW9ucyB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncGRmJzpcclxuICAgICAgICB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0VG9QZGYoeyB0aXRsZSwgbWV0YWRhdGEsIHNlYXJjaENyaXRlcmlhLCBjb2x1bW5zLCBkYXRhLCBvcHRpb25zIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjc3YnOlxyXG4gICAgICAgIHRoaXMuZXhwb3J0U2VydmljZS5leHBvcnRUb0Nzdih7IHRpdGxlLCBtZXRhZGF0YSwgc2VhcmNoQ3JpdGVyaWEsIGNvbHVtbnMsIGRhdGEsIG9wdGlvbnMgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYWxlcnQoXCJQbGVhc2Ugc2VsZWN0IGFuIGV4cG9ydCBmb3JtYXQuXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZXhwb3J0VG9FeGNlbCh7XHJcbiAgICB0aXRsZSxcclxuICAgIG1ldGFkYXRhLFxyXG4gICAgc2VhcmNoQ3JpdGVyaWEsXHJcbiAgICBjb2x1bW5zLFxyXG4gICAgZGF0YSxcclxuICAgIG9wdGlvbnMgPSB7fVxyXG4gIH06IHtcclxuICAgIHRpdGxlOiBzdHJpbmc7XHJcbiAgICBtZXRhZGF0YTogW3N0cmluZywgc3RyaW5nXVtdO1xyXG4gICAgc2VhcmNoQ3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXTtcclxuICAgIGNvbHVtbnM6IGFueVtdO1xyXG4gICAgZGF0YTogYW55W10gfCBSZWNvcmQ8c3RyaW5nLCBhbnlbXT47XHJcbiAgICBvcHRpb25zPzogRXhwb3J0T3B0aW9ucztcclxuICB9KTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgRXhjZWxKUy5Xb3JrYm9vaygpO1xyXG4gICAgY29uc3Qgd29ya3NoZWV0ID0gd29ya2Jvb2suYWRkV29ya3NoZWV0KHRpdGxlKTtcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gUFJFIENBTEMgPT09PT09PT09PT09PT09PT09PT09XHJcbiAgICBjb25zdCBoZWFkZXJMYWJlbHMgPSBbJ1NyIE5vJywgLi4uY29sdW1ucy5tYXAoY29sID0+IGNvbC5oZWFkZXJOYW1lIHx8IGNvbC5maWVsZCldO1xyXG4gICAgY29uc3QgdG90YWxDb2xzID0gaGVhZGVyTGFiZWxzLmxlbmd0aDtcclxuXHJcbiAgICBjb25zdCB0aXRsZVN0YXJ0Q29sID0gNDtcclxuICAgIGNvbnN0IHRpdGxlQ29sTGV0dGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZSg2NCArIHRpdGxlU3RhcnRDb2wpO1xyXG4gICAgY29uc3QgdGl0bGVNZXJnZUVuZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNjQgKyB0b3RhbENvbHMpO1xyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBMT0dPID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgaWYgKHRoaXMubG9nb0Jhc2U2NCkge1xyXG4gICAgICBjb25zdCBiYXNlNjREYXRhID0gdGhpcy5sb2dvQmFzZTY0LnJlcGxhY2UoL15kYXRhOmltYWdlXFwvXFx3KztiYXNlNjQsLywgJycpO1xyXG5cclxuICAgICAgY29uc3QgaW1hZ2VJZCA9IHdvcmtib29rLmFkZEltYWdlKHtcclxuICAgICAgICBiYXNlNjQ6IGJhc2U2NERhdGEsXHJcbiAgICAgICAgZXh0ZW5zaW9uOiAncG5nJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB3b3Jrc2hlZXQuYWRkSW1hZ2UoaW1hZ2VJZCwge1xyXG4gICAgICAgIHRsOiB7IGNvbDogMCwgcm93OiAwIH0sXHJcbiAgICAgICAgZXh0OiB7IHdpZHRoOiAxNDUsIGhlaWdodDogNjYgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHdvcmtzaGVldC5nZXRSb3coMSkuaGVpZ2h0ID0gMjQ7XHJcbiAgICAgIHdvcmtzaGVldC5nZXRSb3coMikuaGVpZ2h0ID0gMjI7XHJcbiAgICAgIHdvcmtzaGVldC5nZXRSb3coMykuaGVpZ2h0ID0gMjI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IFRJVExFID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgd29ya3NoZWV0Lm1lcmdlQ2VsbHMoYCR7dGl0bGVDb2xMZXR0ZXJ9MToke3RpdGxlTWVyZ2VFbmR9MWApO1xyXG4gICAgY29uc3QgdGl0bGVDZWxsID0gd29ya3NoZWV0LmdldFJvdygxKS5nZXRDZWxsKHRpdGxlU3RhcnRDb2wpO1xyXG4gICAgdGl0bGVDZWxsLnZhbHVlID0gdGl0bGU7XHJcbiAgICB0aXRsZUNlbGwuZm9udCA9IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTYgfTtcclxuICAgIHRpdGxlQ2VsbC5hbGlnbm1lbnQgPSB7IHZlcnRpY2FsOiAnbWlkZGxlJywgaG9yaXpvbnRhbDogJ2xlZnQnIH07XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IE1FVEFEQVRBID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgbGV0IG1ldGFSb3dTdGFydCA9IDQ7XHJcblxyXG4gICAgbWV0YWRhdGEuZm9yRWFjaCgoW2xhYmVsLCB2YWx1ZV0sIGlkeCkgPT4ge1xyXG4gICAgICBjb25zdCByb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KG1ldGFSb3dTdGFydCArIGlkeCk7XHJcblxyXG4gICAgICByb3cuZ2V0Q2VsbCgxKS52YWx1ZSA9IHtcclxuICAgICAgICByaWNoVGV4dDogW1xyXG4gICAgICAgICAgeyB0ZXh0OiBgJHtsYWJlbH0gOiBgLCBmb250OiB7IGJvbGQ6IHRydWUgfSB9LFxyXG4gICAgICAgICAgeyB0ZXh0OiB2YWx1ZSA/PyAnJywgZm9udDogeyBib2xkOiBmYWxzZSB9IH1cclxuICAgICAgICBdXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB3b3Jrc2hlZXQubWVyZ2VDZWxscyhgQSR7cm93Lm51bWJlcn06JHt0aXRsZU1lcmdlRW5kfSR7cm93Lm51bWJlcn1gKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBjdXJyZW50Um93ID0gbWV0YVJvd1N0YXJ0ICsgbWV0YWRhdGEubGVuZ3RoO1xyXG5cclxuICAgIHdvcmtzaGVldC5nZXRSb3coKytjdXJyZW50Um93KS5oZWlnaHQgPSA2O1xyXG4gICAgY3VycmVudFJvdysrO1xyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBTRUFSQ0ggQ1JJVEVSSUEgPT09PT09PT09PT09PT09PT09PT09XHJcbiAgICB3b3Jrc2hlZXQubWVyZ2VDZWxscyhjdXJyZW50Um93LCAxLCBjdXJyZW50Um93LCA2KTtcclxuICAgIHdvcmtzaGVldC5nZXRDZWxsKGN1cnJlbnRSb3csIDEpLnZhbHVlID0gJ1NlYXJjaCBDcml0ZXJpYTotJztcclxuICAgIHdvcmtzaGVldC5nZXRDZWxsKGN1cnJlbnRSb3csIDEpLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgIGN1cnJlbnRSb3cgKz0gMjtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIGNvbnN0IGxlZnQgPSBzZWFyY2hDcml0ZXJpYVtpXTtcclxuICAgICAgY29uc3QgcmlnaHQgPSBzZWFyY2hDcml0ZXJpYVtpICsgMV07XHJcblxyXG4gICAgICBjb25zdCByb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KGN1cnJlbnRSb3crKyk7XHJcblxyXG4gICAgICB3b3Jrc2hlZXQubWVyZ2VDZWxscyhyb3cubnVtYmVyLCAxLCByb3cubnVtYmVyLCAzKTtcclxuICAgICAgcm93LmdldENlbGwoMSkudmFsdWUgPSB7XHJcbiAgICAgICAgcmljaFRleHQ6IFtcclxuICAgICAgICAgIHsgdGV4dDogKGxlZnQ/LlswXSA/PyAnJykgKyAnICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICB7IHRleHQ6IGxlZnQ/LlsxXSA/PyAnJyB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG4gICAgICByb3cuZ2V0Q2VsbCgxKS5hbGlnbm1lbnQgPSB7IHdyYXBUZXh0OiB0cnVlLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuXHJcbiAgICAgIGlmIChyaWdodCkge1xyXG4gICAgICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKHJvdy5udW1iZXIsIDQsIHJvdy5udW1iZXIsIDYpO1xyXG4gICAgICAgIHJvdy5nZXRDZWxsKDQpLnZhbHVlID0ge1xyXG4gICAgICAgICAgcmljaFRleHQ6IFtcclxuICAgICAgICAgICAgeyB0ZXh0OiAocmlnaHQ/LlswXSA/PyAnJykgKyAnICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICAgIHsgdGV4dDogcmlnaHQ/LlsxXSA/PyAnJyB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfTtcclxuICAgICAgICByb3cuZ2V0Q2VsbCg0KS5hbGlnbm1lbnQgPSB7IHdyYXBUZXh0OiB0cnVlLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGN1cnJlbnRSb3crKztcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gSEVBREVSIFJPVyA9PT09PT09PT09PT09PT09PT09PT1cclxuICAgIGNvbnN0IGhlYWRlclJvdyA9IHdvcmtzaGVldC5nZXRSb3coY3VycmVudFJvdysrKTtcclxuXHJcbiAgICBoZWFkZXJMYWJlbHMuZm9yRWFjaCgoaGVhZGVyLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNlbGwgPSBoZWFkZXJSb3cuZ2V0Q2VsbChpICsgMSk7XHJcbiAgICAgIGNlbGwudmFsdWUgPSBoZWFkZXI7XHJcbiAgICAgIGNlbGwuZm9udCA9IHsgYm9sZDogdHJ1ZSB9O1xyXG4gICAgICBjZWxsLmZpbGwgPSB7XHJcbiAgICAgICAgdHlwZTogJ3BhdHRlcm4nLFxyXG4gICAgICAgIHBhdHRlcm46ICdzb2xpZCcsXHJcbiAgICAgICAgZmdDb2xvcjogeyBhcmdiOiAnRDlEOUQ5JyB9XHJcbiAgICAgIH07XHJcbiAgICAgIGNlbGwuYWxpZ25tZW50ID0geyB2ZXJ0aWNhbDogJ21pZGRsZScsIGhvcml6b250YWw6ICdjZW50ZXInIH07XHJcbiAgICAgIGNlbGwuYm9yZGVyID0ge1xyXG4gICAgICAgIHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICByaWdodDogeyBzdHlsZTogJ3RoaW4nIH1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgaGVhZGVyUm93LmVhY2hDZWxsKChjZWxsKSA9PiB7XHJcbiAgICAgIGlmIChjZWxsLnZhbHVlID09PSAnVHJhbnNhY3Rpb24gQ291bnQnKSB7XHJcbiAgICAgICAgY2VsbC52YWx1ZSA9ICdUcmFuc2FjdGlvblxcbkNvdW50JztcclxuICAgICAgICBjZWxsLmFsaWdubWVudCA9IHtcclxuICAgICAgICAgIGhvcml6b250YWw6ICdjZW50ZXInLFxyXG4gICAgICAgICAgdmVydGljYWw6ICdtaWRkbGUnLFxyXG4gICAgICAgICAgd3JhcFRleHQ6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBEQVRBIFNFQ1RJT04gPT09PT09PT09PT09PT09PT09PT09XHJcbiAgICBsZXQgcm93SWR4ID0gY3VycmVudFJvdztcclxuICAgIGxldCBzZXJpYWxOdW1iZXIgPSAxO1xyXG5cclxuICAgIGlmIChvcHRpb25zLmdyb3VwQnlLZXkgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgW2dyb3VwLCBpdGVtc10gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBSb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KHJvd0lkeCsrKTtcclxuICAgICAgICBncm91cFJvdy5nZXRDZWxsKDEpLnZhbHVlID0gZ3JvdXA7XHJcbiAgICAgICAgZ3JvdXBSb3cuZm9udCA9IHsgYm9sZDogdHJ1ZSB9O1xyXG4gICAgICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKGBBJHtncm91cFJvdy5udW1iZXJ9OiR7dGl0bGVNZXJnZUVuZH0ke2dyb3VwUm93Lm51bWJlcn1gKTtcclxuXHJcbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG5cclxuICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSB0aGlzLnByZXBhcmVUYWJsZVJvd3MoW2l0ZW1dLCBjb2x1bW5zLCBvcHRpb25zKVswXTtcclxuICAgICAgICAgIGNvbnN0IGRhdGFSb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KHJvd0lkeCsrKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBmdWxsUm93ID0gW1xyXG4gICAgICAgICAgICAhaXRlbT8uaXNUb3RhbFJvdyA/IHNlcmlhbE51bWJlcisrIDogJycsXHJcbiAgICAgICAgICAgIC4uLnJvd0RhdGFcclxuICAgICAgICAgIF07XHJcblxyXG4gICAgICAgICAgZnVsbFJvdy5mb3JFYWNoKCh2YWwsIGNJZHgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGRhdGFSb3cuZ2V0Q2VsbChjSWR4ICsgMSk7XHJcbiAgICAgICAgICAgIC8vICAgY2VsbC52YWx1ZSA9IHZhbDtcclxuICAgICAgICAgICAgLy9hZGRlZCBieSBiaGFyYXRpIGZvciBcclxuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW5zW2NJZHggLSAxXT8uZmllbGQ7XHJcblxyXG4gICAgICAgICAgICAvLyDinIUgQW1vdW50IGZpZWxkcyAoUmVjZWl2ZSBBbW91bnQsIFNlbmQgQW1vdW50LCBUb3RhbCBTZW5kIEFtb3VudCBldGMuKVxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgZmllbGQ9PSd0b3RhbFBheWluQW1vdW50J3x8XHJcbiAgICAgICAgICAgICAgZmllbGQ9PSdwYXlpbkFtb3VudCd8fFxyXG4gICAgICAgICAgICAgIGZpZWxkID09PSAndHJhbnNhY3Rpb25Db21taXNzaW9uQW1vdW50JyB8fFxyXG4gICAgICAgICAgICAgIGZpZWxkID09PSAndGF4J1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gJycgJiYgdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gTnVtYmVyKHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLm51bUZtdCA9ICcjLCMjMC4wMDAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdyaWdodCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gdmFsO1xyXG4gICAgICAgICAgICB9ICovXHJcblxyXG4gICAgICAgICAgICBpZiAoaXRlbT8uaXNUb3RhbFJvdyAmJiBmaWVsZCA9PT0gJ3JlY2VpdmVBbW91bnQnKSB7XHJcbiAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgIGZpZWxkPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhbW91bnQnKSB8fFxyXG4gICAgICAgICAgICAgIGZpZWxkID09PSAnc2VydmljZUZlZScgfHxcclxuICAgICAgICAgICAgICBmaWVsZCA9PT0gJ3RheCdcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gJycgJiYgdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gdmFsOyAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IG51bWJlclxyXG4gICAgICAgICAgICAgICAgY2VsbC5udW1GbXQgPSAnIywjIzAuMDAwJzsgICAgICAgLy8gRXhjZWwgZm9ybWF0dGluZ1xyXG4gICAgICAgICAgICAgICAgY2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdyaWdodCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPSB2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2VsbC5ib3JkZXIgPSB7XHJcbiAgICAgICAgICAgICAgdG9wOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICAgICAgICBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgICAgICAgIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgICAgICAgIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgaWYgKGl0ZW0/LmlzVG90YWxSb3cpIHtcclxuICAgICAgICAgICAgZGF0YVJvdy5lYWNoQ2VsbChjZWxsID0+IHtcclxuICAgICAgICAgICAgICAgY2VsbC5mb250ID0ge1xyXG4gICAgICAgICAgICAgICAgLi4uY2VsbC5mb250LFxyXG4gICAgICAgICAgICAgICAgYm9sZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNpemU6IDEyXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgdGhpcy5wcmVwYXJlVGFibGVSb3dzKGRhdGEgYXMgYW55W10sIGNvbHVtbnMsIG9wdGlvbnMpXHJcbiAgICAgICAgLmZvckVhY2goKHJvd0RhdGEsIGluZGV4KSA9PiB7XHJcblxyXG4gICAgICAgICAgY29uc3QgZGF0YVJvdyA9IHdvcmtzaGVldC5nZXRSb3cocm93SWR4KyspO1xyXG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxJdGVtID0gKGRhdGEgYXMgYW55W10pW2luZGV4XTtcclxuXHJcbiAgICAgICAgICBjb25zdCBmdWxsUm93ID0gW1xyXG4gICAgICAgICAgICAhb3JpZ2luYWxJdGVtPy5pc1RvdGFsUm93ID8gc2VyaWFsTnVtYmVyKysgOiAnJyxcclxuICAgICAgICAgICAgLi4ucm93RGF0YVxyXG4gICAgICAgICAgXTtcclxuXHJcbiAgICAgICAgICBmdWxsUm93LmZvckVhY2goKHZhbCwgY0lkeCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZGF0YVJvdy5nZXRDZWxsKGNJZHggKyAxKTtcclxuICAgICAgICAgICAgLy9jZWxsLnZhbHVlID0gdmFsO1xyXG4gICAgICAgICAgICAvKiAgIGlmIChjSWR4ID09PSAwKSB7XHJcbiBjZWxsLnZhbHVlID0gdmFsO1xyXG59IGVsc2Uge1xyXG5cclxuIGNvbnN0IGZpZWxkID0gY29sdW1uc1tjSWR4IC0gMV0/LmZpZWxkO1xyXG5cclxuIGlmIChcclxuICAgICBmaWVsZD09J3RvdGFsUGF5aW5BbW91bnQnfHxcclxuICAgICBmaWVsZD09J3BheWluQW1vdW50J3x8XHJcbiAgICAgZmllbGQgPT09ICd0cmFuc2FjdGlvbkNvbW1pc3Npb25BbW91bnQnIHx8XHJcbiAgICAgZmllbGQgPT09ICd0YXgnXHJcbiApIHtcclxuICAgICBjZWxsLnZhbHVlID0gTnVtYmVyKHZhbCk7XHJcbiAgICAgY2VsbC5udW1GbXQgPSAnIywjIzAuMDAwJztcclxuICAgICBjZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JywgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcbiB9XHJcbiBlbHNlIHtcclxuICAgICBjZWxsLnZhbHVlID0gdmFsO1xyXG4gfVxyXG59ICovXHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbnNbY0lkeCAtIDFdPy5maWVsZDtcclxuXHJcbiAgICAgICAgICAgIGlmIChjSWR4ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IHZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChvcmlnaW5hbEl0ZW0/LmlzVG90YWxSb3cgJiYgZmllbGQgPT09ICdyZWNlaXZlQW1vdW50Jykge1xyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgICAgICBmaWVsZD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYW1vdW50JykgfHxcclxuICAgICAgICAgICAgICBmaWVsZCA9PT0gJ3NlcnZpY2VGZWUnIHx8XHJcbiAgICAgICAgICAgICAgZmllbGQgPT09ICd0YXgnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIGlmICh2YWwgIT09ICcnICYmIHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IHZhbDsgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBudW1iZXJcclxuICAgICAgICAgICAgICAgIGNlbGwubnVtRm10ID0gJyMsIyMwLjAwMCc7ICAgICAgIC8vIEV4Y2VsIGZvcm1hdHRpbmdcclxuICAgICAgICAgICAgICAgIGNlbGwuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAncmlnaHQnLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gdmFsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjZWxsLmJvcmRlciA9IHtcclxuICAgICAgICAgICAgICB0b3A6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgICAgICAgIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgICAgICAgbGVmdDogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgICAgICAgcmlnaHQ6IHsgc3R5bGU6ICd0aGluJyB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtPy5pc1RvdGFsUm93KSB7XHJcbiAgICAgICAgICAgIGRhdGFSb3cuZWFjaENlbGwoY2VsbCA9PiB7XHJcbiAgICAgICAgICAgICAgIGNlbGwuZm9udCA9IHtcclxuICAgICAgICAgICAgICAgIC4uLmNlbGwuZm9udCxcclxuICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzaXplOiAxMlxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBBVVRPIFdJRFRIID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWxDb2xzOyBpKyspIHtcclxuICAgICAgbGV0IG1heExlbmd0aCA9IDEwO1xyXG5cclxuICAgICAgd29ya3NoZWV0LmVhY2hSb3coeyBpbmNsdWRlRW1wdHk6IHRydWUgfSwgKHJvdykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNlbGwgPSByb3cuZ2V0Q2VsbChpKTtcclxuICAgICAgICBpZiAoY2VsbC5pc01lcmdlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgY2VsbFZhbHVlID0gJyc7XHJcblxyXG4gICAgICAgIGlmIChjZWxsLnZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgIGNlbGxWYWx1ZSA9ICcnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNlbGwudmFsdWUgPT09ICdvYmplY3QnICYmICdyaWNoVGV4dCcgaW4gY2VsbC52YWx1ZSkge1xyXG4gICAgICAgICAgY2VsbFZhbHVlID0gY2VsbC52YWx1ZS5yaWNoVGV4dC5tYXAocnQgPT4gcnQudGV4dCkuam9pbignJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNlbGxWYWx1ZSA9IGNlbGwudmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG1heExlbmd0aCA9IE1hdGgubWF4KG1heExlbmd0aCwgY2VsbFZhbHVlLmxlbmd0aCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgd29ya3NoZWV0LmdldENvbHVtbihpKS53aWR0aCA9IE1hdGgubWluKG1heExlbmd0aCwgNTApO1xyXG4gICAgfVxyXG4gICAgLy9uZXcgY29kZTpiaGFyYXRpXHJcblxyXG4gICAgd29ya3NoZWV0LmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xyXG5cclxuICAgICAgaWYgKGluZGV4ID09PSAwKSByZXR1cm47IC8vIHNraXAgU3IgTm9cclxuXHJcbiAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uc1tpbmRleCAtIDFdPy5maWVsZDtcclxuXHJcbiAgICAgIGlmIChmaWVsZCA9PT0gJ3BheWluQW1vdW50Jykge1xyXG4gICAgICAgIGNvbHVtbi53aWR0aCA9IDE0O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmaWVsZCA9PT0gJ3BheW91dEFtb3VudCcpIHtcclxuICAgICAgICBjb2x1bW4ud2lkdGggPSAxNTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZmllbGQgPT09ICd0cmFuc2FjdGlvbkNvdW50Jykge1xyXG4gICAgICAgIGNvbHVtbi53aWR0aCA9IDE0O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyB3b3Jrc2hlZXQuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgIC8vICAgaWYgKGNvbHVtbi5oZWFkZXIgPT09ICdTZW5kIEFtb3VudCcpIHtcclxuICAgIC8vICAgICBjb2x1bW4ud2lkdGggPSAyNTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcblxyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBTQVZFIEZJTEUgPT09PT09PT09PT09PT09PT09PT09XHJcbiAgICBjb25zdCBidWZmZXIgPSBhd2FpdCB3b3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCk7XHJcblxyXG4gICAgRmlsZVNhdmVyLnNhdmVBcyhcclxuICAgICAgbmV3IEJsb2IoW2J1ZmZlcl0sIHtcclxuICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnXHJcbiAgICAgIH0pLFxyXG4gICAgICB0aXRsZS5yZXBsYWNlKC9cXHMvZywgJy0nKSArICcueGxzeCdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyAgIHByaXZhdGUgcHJlcGFyZVRhYmxlUm93cyhkYXRhOiBhbnlbXSwgY29sdW1uczogYW55W10sIG9wdGlvbnM6IEV4cG9ydE9wdGlvbnMgPSB7fSk6IGFueVtdW10ge1xyXG4gIC8vICAgICAgICAgICBjb25zdCB7XHJcbiAgLy8gICAgICAgICAgICAgICBleGNsdWRlRmllbGRzID0gW10sXHJcbiAgLy8gICAgICAgICAgICAgICBjdXJyZW5jeUZpZWxkcyA9IFtdLFxyXG4gIC8vICAgICAgICAgICAgICAgZGF0ZUZpZWxkcyA9IFtdLFxyXG4gIC8vICAgICAgICAgICAgICAgZGF0ZUZpZWxkRm9ybWF0cyA9IHt9LFxyXG4gIC8vICAgICAgICAgICAgICAgc3BlY2lhbERlY2ltYWxGaWVsZHMgPSB7fVxyXG4gIC8vICAgICAgICAgICB9ID0gb3B0aW9ucztcclxuXHJcbiAgLy8gICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gY29sdW1ucy5maWx0ZXIoYyA9PlxyXG4gIC8vICAgICAgICAgICAgICAgYy5maWVsZCAmJiAhZXhjbHVkZUZpZWxkcy5zb21lKGYgPT4gYy5maWVsZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGYpKVxyXG4gIC8vICAgICAgICAgICApO1xyXG5cclxuICAvLyAgICAgICAgIHJldHVybiBkYXRhLm1hcCgocm93KSA9PiAoW1xyXG4gIC8vIC4uLmZpbHRlcmVkLm1hcChjb2wgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHJvd1tjb2wuZmllbGRdO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdCBkYXRlIGZpZWxkcyB3aXRoIGN1c3RvbSBmb3JtYXRzIGlmIHNwZWNpZmllZFxyXG4gIC8vICAgICAgICAgICAgICAgICAgIGlmIChjb2wuZmllbGQgJiYgKGRhdGVGaWVsZHMuaW5jbHVkZXMoY29sLmZpZWxkKSB8fCBjb2wuZmllbGQgaW4gZGF0ZUZpZWxkRm9ybWF0cykpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gZGF0ZUZpZWxkRm9ybWF0c1tjb2wuZmllbGRdIHx8ICdkZC9NTS95eXl5JztcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmZvcm1hdERhdGVCeUZvcm1hdCh2YWx1ZSwgZm9ybWF0KTtcclxuICAvLyAgICAgICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0IHNwZWNpYWwgZGVjaW1hbCBmaWVsZHMgd2l0aCBzcGVjaWZpYyBkZWNpbWFsc1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5maWVsZCAmJiBjb2wuZmllbGQgaW4gc3BlY2lhbERlY2ltYWxGaWVsZHMgJiYgdmFsdWUgIT0gbnVsbCkge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNpbWFscyA9IHNwZWNpYWxEZWNpbWFsRmllbGRzW2NvbC5maWVsZF07XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSkudG9GaXhlZChkZWNpbWFscyk7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdCByZWd1bGFyIGN1cnJlbmN5IGZpZWxkcyB3aXRoIDMgZGVjaW1hbHNcclxuICAvLyAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZmllbGQgJiYgY3VycmVuY3lGaWVsZHMuaW5jbHVkZXMoY29sLmZpZWxkKSAmJiB2YWx1ZSAhPSBudWxsKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSkudG9GaXhlZCgzKTtcclxuICAvLyAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/PyAnJztcclxuICAvLyAgICAgICAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICAgIF0pKTtcclxuICAvLyAgICAgICB9XHJcbiAgcHJpdmF0ZSBwcmVwYXJlVGFibGVSb3dzKFxyXG4gICAgZGF0YTogYW55W10sXHJcbiAgICBjb2x1bW5zOiBhbnlbXSxcclxuICAgIG9wdGlvbnM6IEV4cG9ydE9wdGlvbnMgPSB7fVxyXG4gICk6IGFueVtdW10ge1xyXG5cclxuICAgIGNvbnN0IHtcclxuICAgICAgZXhjbHVkZUZpZWxkcyA9IFtdLFxyXG4gICAgICBjdXJyZW5jeUZpZWxkcyA9IFtdLFxyXG4gICAgICBkYXRlRmllbGRzID0gW10sXHJcbiAgICAgIGRhdGVGaWVsZEZvcm1hdHMgPSB7fSxcclxuICAgICAgc3BlY2lhbERlY2ltYWxGaWVsZHMgPSB7fVxyXG4gICAgfSA9IG9wdGlvbnM7XHJcblxyXG4gICAgY29uc3QgZmlsdGVyZWQgPSBjb2x1bW5zLmZpbHRlcihjID0+XHJcbiAgICAgIGMuZmllbGQgJiYgIWV4Y2x1ZGVGaWVsZHMuc29tZShmID0+IGMuZmllbGQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmKSlcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIGRhdGEubWFwKChyb3cpID0+IChbXHJcbiAgICAgIC4uLmZpbHRlcmVkLm1hcChjb2wgPT4ge1xyXG5cclxuICAgICAgICBsZXQgdmFsdWUgPSByb3dbY29sLmZpZWxkXTtcclxuXHJcbiAgICAgICAgLy8g4pyFIERhdGUgZm9ybWF0dGluZyAoa2VlcCBhcyBzdHJpbmcpXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgY29sLmZpZWxkICYmXHJcbiAgICAgICAgICAoZGF0ZUZpZWxkcy5pbmNsdWRlcyhjb2wuZmllbGQpIHx8IGNvbC5maWVsZCBpbiBkYXRlRmllbGRGb3JtYXRzKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgY29uc3QgZm9ybWF0ID0gZGF0ZUZpZWxkRm9ybWF0c1tjb2wuZmllbGRdIHx8ICdkZC9NTS95eXl5JztcclxuICAgICAgICAgIHZhbHVlID0gdGhpcy5mb3JtYXREYXRlQnlGb3JtYXQodmFsdWUsIGZvcm1hdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDinIUgU3BlY2lhbCBkZWNpbWFsIGZpZWxkcyDihpIgcmV0dXJuIE5VTUJFUiAobm8gdG9GaXhlZClcclxuICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgIGNvbC5maWVsZCAmJlxyXG4gICAgICAgICAgY29sLmZpZWxkIGluIHNwZWNpYWxEZWNpbWFsRmllbGRzICYmXHJcbiAgICAgICAgICB2YWx1ZSAhPSBudWxsXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDinIUgQ3VycmVuY3kgZmllbGRzIOKGkiByZXR1cm4gTlVNQkVSIChubyB0b0ZpeGVkKVxyXG4gICAgICAgIGVsc2UgaWYgKFxyXG4gICAgICAgICAgY29sLmZpZWxkICYmXHJcbiAgICAgICAgICBjdXJyZW5jeUZpZWxkcy5pbmNsdWRlcyhjb2wuZmllbGQpICYmXHJcbiAgICAgICAgICB2YWx1ZSAhPSBudWxsXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWUgPz8gJyc7XHJcbiAgICAgIH0pXHJcbiAgICBdKSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZm9ybWF0RGF0ZUJ5Rm9ybWF0KHZhbDogYW55LCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAvLyBIZWxwZXIgdG8gcGFkIHNpbmdsZSBkaWdpdHNcclxuICAgIGNvbnN0IHBhZCA9IChuOiBudW1iZXIpID0+IG4udG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG5cclxuICAgIC8vIFBhcnNlIGRhdGUgZm9yIFwiREQvTU0vWVlZWSBoaDptbSBBTS9QTVwiIGZvcm1hdCBtYW51YWxseVxyXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIC9eXFxkezJ9XFwvXFxkezJ9XFwvXFxkezR9IFxcZHsyfTpcXGR7Mn0gW0FQXU0kLy50ZXN0KHZhbCkpIHtcclxuXHJcbiAgICAgIGNvbnN0IHBhcnRzID0gdmFsLm1hdGNoKC9eKFxcZHsyfSlcXC8oXFxkezJ9KVxcLyhcXGR7NH0pIChcXGR7Mn0pOihcXGR7Mn0pIChbQVBdTSkkLyk7XHJcbiAgICAgIGlmICghcGFydHMpIHJldHVybiAnJztcclxuICAgICAgbGV0IFssIGRkLCBtbSwgeXl5eSwgaGgsIG1pbiwgYW1wbV0gPSBwYXJ0cztcclxuICAgICAgbGV0IGhvdXJzID0gcGFyc2VJbnQoaGgsIDEwKTtcclxuICAgICAgaWYgKGFtcG0gPT09ICdQTScgJiYgaG91cnMgIT09IDEyKSBob3VycyArPSAxMjtcclxuICAgICAgaWYgKGFtcG0gPT09ICdBTScgJiYgaG91cnMgPT09IDEyKSBob3VycyA9IDA7XHJcbiAgICAgIHZhbCA9IG5ldyBEYXRlKHBhcnNlSW50KHl5eXksIDEwKSwgcGFyc2VJbnQobW0sIDEwKSAtIDEsIHBhcnNlSW50KGRkLCAxMCksIGhvdXJzLCBwYXJzZUludChtaW4sIDEwKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YWwgPSBuZXcgRGF0ZSh2YWwpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc05hTih2YWwuZ2V0VGltZSgpKSkgcmV0dXJuICcnO1xyXG5cclxuICAgIGNvbnN0IGR0ID0gdmFsO1xyXG5cclxuICAgIHN3aXRjaCAoZm9ybWF0KSB7XHJcbiAgICAgIGNhc2UgJ2RkL01NL3l5eXkgaGg6bW0gYSc6IHsgLy8gMTEvMDcvMjAyNSAxMDo1NiBQTVxyXG4gICAgICAgIGxldCBob3VyczEyID0gZHQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyO1xyXG4gICAgICAgIGxldCBhbXBtID0gZHQuZ2V0SG91cnMoKSA+PSAxMiA/ICdQTScgOiAnQU0nO1xyXG4gICAgICAgIHJldHVybiBgJHtwYWQoZHQuZ2V0RGF0ZSgpKX0vJHtwYWQoZHQuZ2V0TW9udGgoKSArIDEpfS8ke2R0LmdldEZ1bGxZZWFyKCl9ICR7cGFkKGhvdXJzMTIpfToke3BhZChkdC5nZXRNaW51dGVzKCkpfSAke2FtcG19YDtcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdkZC9NTS95eXl5IEhIOm1tJzogeyAvLyAyOC8wNy8yMDI1IDEzOjA4XHJcbiAgICAgICAgcmV0dXJuIGAke3BhZChkdC5nZXREYXRlKCkpfS8ke3BhZChkdC5nZXRNb250aCgpICsgMSl9LyR7ZHQuZ2V0RnVsbFllYXIoKX0gJHtwYWQoZHQuZ2V0SG91cnMoKSl9OiR7cGFkKGR0LmdldE1pbnV0ZXMoKSl9YDtcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdkZC9NTS95eXl5JzogeyAvLyAyOC8wNy8yMDI1XHJcbiAgICAgICAgcmV0dXJuIGAke3BhZChkdC5nZXREYXRlKCkpfS8ke3BhZChkdC5nZXRNb250aCgpICsgMSl9LyR7ZHQuZ2V0RnVsbFllYXIoKX1gO1xyXG4gICAgICB9XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGR0LnRvTG9jYWxlU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkYXRlVmFsdWVGb3JtYXR0ZXIoZm9ybWF0OiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAocGFyYW1zOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFwYXJhbXMudmFsdWUpIHJldHVybiAnJztcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZShwYXJhbXMudmFsdWUsIGZvcm1hdCwgJ2VuLVVTJyk7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0S2V5cyhvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIG9iaiA/IE9iamVjdC5rZXlzKG9iaikgOiBbXTtcclxuICB9XHJcblxyXG4gIGhhc0FueUdyb3VwcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkRGF0YSAmJiB0aGlzLmdldEtleXModGhpcy5maWx0ZXJlZERhdGEpLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICBmb3JtYXRBbW91bnQocGFyYW1zOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbXM/LnZhbHVlO1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnKSB7XHJcbiAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICAgIHJldHVybiAoTWF0aC50cnVuYyhudW0gKiAxMDAwKSAvIDEwMDApLnRvRml4ZWQoMyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTZWFyY2goY3JpdGVyaWE6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2hDcml0ZXJpYSA9IGNyaXRlcmlhLnNlYXJjaENyaXRlcmlhO1xyXG4gICAgdGhpcy5yZXBvcnREYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xyXG4gICAgdGhpcy5yZXBvcnREYXRlID0gZm9ybWF0RGF0ZSh0aGlzLnJlcG9ydERhdGUsICdkZC9NTS95eXl5IGhoOm1tIGEnLCAnZW4tVVMnKTtcclxuICAgIGNvbnN0IG1vZGFsID0gY3JpdGVyaWEubW9kYWw7XHJcbiAgICB0aGlzLnVzZXIgPSBjcml0ZXJpYS5zeXNVc2VySUQ7XHJcbiAgICB0aGlzLmZyb21EYXRlID0gZm9ybWF0RGF0ZShtb2RhbC5mcm9tRGF0ZSwgJ2RkL01NL3l5eXkgaGg6bW0gYScsICdlbi1VUycpLnNsaWNlKDAsIDEwKTtcclxuICAgIHRoaXMudG9EYXRlID0gZm9ybWF0RGF0ZShtb2RhbC50b0RhdGUsICdkZC9NTS95eXl5IGhoOm1tIGEnLCAnZW4tVVMnKS5zbGljZSgwLCAxMCk7XHJcbiAgICBjb25zb2xlLmxvZyhtb2RhbCk7XHJcbiAgICAvLyBDb2RlIEZvciBNZXRhIERhdGFcclxuICAgIHRoaXMubGVmdERhdGEgPSB7XHJcbiAgICAgICdSZXBvcnQgUGVyaW9kJzogdGhpcy5mcm9tRGF0ZSArIFwiIC0gXCIgKyB0aGlzLnRvRGF0ZSxcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1ldGFEYXRhVHdvID0ge1xyXG4gICAgICAnUmVwb3J0IFVzZXIgJiBUaW1lJzogdGhpcy51c2VyICsgXCIgQCBcIiArIHRoaXMucmVwb3J0RGF0ZSxcclxuICAgIH1cclxuICAgIGNvbnN0IGlzVG90YWxTdW1tYXJ5ID0gbW9kYWwuc3VtbWFyeVJlcG9ydCA9PT0gJ1RvdGFsIFN1bW1hcnknO1xyXG4gICAgdGhpcy5pc1RvdGFsU3VtbWFyeSA9IGlzVG90YWxTdW1tYXJ5O1xyXG5cclxuICAgIGNvbnN0IHNlYXJjaERhdGEgPSB7XHJcbiAgICAgIFwiU3RhcnREYXRlXCI6IG1vZGFsLmZyb21EYXRlLFxyXG4gICAgICBcIkVuZERhdGVcIjogbW9kYWwudG9EYXRlLFxyXG4gICAgICBcIlNlbmRDb3VudHJ5Q29kZVwiOiBtb2RhbC5zZW5kQ291bnRyeSxcclxuICAgICAgXCJSZWN2Q291bnRyeUNvZGVcIjogbW9kYWwucmVjZWl2ZUNvdW50cnksXHJcbiAgICAgIFwiQnVzaW5lc3NQYXJ0bmVyQ29kZVwiOiBtb2RhbC5jbGllbnQsXHJcbiAgICAgIFwiVHJhbnNhY3Rpb25TdGF0dXNcIjogbW9kYWwudHJhbnNhY3Rpb25TdGF0dXMuam9pbihcIixcIiksXHJcbiAgICAgIFwiUGF5b3V0Q3VycmVuY3lcIjogbW9kYWwucmVjZWl2ZUN1cnJlbmN5LFxyXG4gICAgICBcIlRyYW5zYWN0aW9uVHlwZVwiOiBtb2RhbC5wcm9kdWN0LFxyXG4gICAgICBcIkJyYW5jaENvZGVcIjogbW9kYWwuYnJhbmNoLFxyXG4gICAgICBcIlN1bW1hcnlSZXBvcnRcIjogbW9kYWwuc3VtbWFyeVJlcG9ydFxyXG5cclxuICAgIH07XHJcbiAgICB0aGlzLnNob3dNZXNzYWdlID0gdHJ1ZTtcclxuICAgIHRoaXMuY2xlYXJTZWFyY2ggPSB0cnVlO1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkxvYWRpbmc7XHJcbiAgICB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0QnJhbmNoQWN0aXZpdHlTZW5kU3VtbWFyeVJlcG9ydChzZWFyY2hEYXRhKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xyXG4gICAgICAgIHRoaXMuZGF0YU1hcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLm5vRGF0YUZvdW5kID0gT2JqZWN0LmtleXModGhpcy5maWx0ZXJlZERhdGEpLmxlbmd0aCA9PSAwID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucHJveHlEYXRhID0gc3RydWN0dXJlZENsb25lKGRhdGEpO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvbkFycmF5ID0gbmV3IEFycmF5KE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyZWREYXRhKS5sZW5ndGgpLmZpbGwoMTUpO1xyXG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UgPSBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcmVkRGF0YSkubGVuZ3RoID09IDAgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zaG93UmVwb3J0ID0gdHJ1ZTtcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkNvbXBsZXRlO1xyXG4gICAgICAgIHRoaXMuY2xlYXJTZWFyY2ggPSBmYWxzZTtcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkNvbXBsZXRlO1xyXG4gICAgICAgIHRoaXMuc2hvd1JlcG9ydCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jbGVhclNlYXJjaCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRm9ybVZhbGlkKGlzVmFsaWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNGb3JtVmFsaWQgPSBpc1ZhbGlkO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbiIsIjxsaWItc2VhcmNoLWZpbHRlciBcclxuICAgIFtSZXBvcnROYW1lXT1cIlJlcG9ydE5hbWVcIiBcclxuICAgIChzZWFyY2hDbGlja2VkKT1cImhhbmRsZVNlYXJjaCgkZXZlbnQpXCJcclxuICAgIChmb3JtVmFsaWQpPVwiaGFuZGxlRm9ybVZhbGlkKCRldmVudClcIj5cclxuPC9saWItc2VhcmNoLWZpbHRlciA+XHJcbjxhcHAtbG9hZGVyIGNsYXNzPVwiXCIgKm5nSWY9XCJsb2FkaW5nU3RhdGUgPT0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmdcIj48L2FwcC1sb2FkZXI+XHJcblxyXG48c2VjdGlvbiAqbmdJZj1cInNob3dSZXBvcnQgJiYgaXNGb3JtVmFsaWQgJiYgIWNsZWFyU2VhcmNoXCIgY2xhc3M9XCJteS0yXCI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFub0RhdGFGb3VuZFwiPlxyXG4gICAgIDxsaWItbWV0YWRhdGEgW3JlcG9ydE5hbWVdPVwiUmVwb3J0TmFtZVwiIFtzaG93bWV0YURhdGFPbmVdPVwidHJ1ZVwiIFtzaG93bWV0YURhdGFUd29dPVwidHJ1ZVwiIFttZXRhRGF0YU9uZV09XCJsZWZ0RGF0YVwiIFttZXRhRGF0YVR3b109XCJtZXRhRGF0YVR3b1wiKGV4cG9ydEV2ZW50KT1cImhhbmRsZUV4cG9ydCgkZXZlbnQpXCIgKHNlYXJjaEV2ZW50KT1cImZpbHRlcigkZXZlbnQpXCI+PC9saWItbWV0YWRhdGE+XHJcblxyXG4gIDxuZ2ItYWNjb3JkaW9uICNhY2M9XCJuZ2JBY2NvcmRpb25cIiBbY2xvc2VPdGhlcnNdPVwiZmFsc2VcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWREYXRhIHwga2V5dmFsdWU7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgPG5nYi1wYW5lbCAqbmdJZj1cIml0ZW0udmFsdWUubGVuZ3RoID4gMFwiIFtpZF09XCIncGFuZWwtJyArIGlcIj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nYlBhbmVsVGl0bGUgc3R5bGU9XCJoZWlnaHQ6IDEwJTtcIj5cclxuICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cInBhbmVsLWNsc1wiPnt7XHJcbiAgICAgICAgICAgIGl0ZW0ua2V5XHJcbiAgICAgICAgICAgIH19PC9sYWJlbD5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgbmdiUGFuZWxDb250ZW50PlxyXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgICAgICAgPGxpYi1wYWdlLXNpemUtc2VsZWN0b3IgW3RvdGFsRW50cmllc109XCJpdGVtPy52YWx1ZT8ubGVuZ3RoXCJcclxuICAgICAgICAgICAgW2RlZmF1bHRTaXplXT1cIicxNSdcIiBbZ3JpZEFwaV09XCJncmlkQXBpc1tpXVwiPlxyXG4gICAgICAgICAgICA+PC9saWItcGFnZS1zaXplLXNlbGVjdG9yPlxyXG5cclxuICAgICAgICAgICAgPGFnLWdyaWQtYW5ndWxhciBjbGFzcz1cImFnLXRoZW1lLWFscGluZSB0cmFuc2FjdGlvbi1ncmlkXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtoZWlnaHQ6IDM4MHB4O1wiXHJcbiAgICAgICAgICAgICAgW2NvbHVtbkRlZnNdPVwiY29sdW1uRGVmc1wiIFxyXG4gICAgICAgICAgICAgIFtkZWZhdWx0Q29sRGVmXT1cImRlZmF1bHRDb2xEZWZcIiBcclxuICAgICAgICAgICAgICBbcm93RGF0YV09XCJpdGVtLnZhbHVlXCIgXHJcbiAgICAgICAgICAgICAgW3Jvd0hlaWdodF09XCIyMFwiXHJcbiAgICAgICAgICAgICAgW2hlYWRlckhlaWdodF09XCIyMlwiXHJcbiAgICAgICAgICAgICAgW3BhZ2luYXRpb25dPVwidHJ1ZVwiIFxyXG4gICAgICAgICAgICAgIFtwYWdpbmF0aW9uUGFnZVNpemVdPVwicGFnaW5hdGlvbkFycmF5W2ldXCIgXHJcbiAgICAgICAgICAgICAgW3Jvd0NsYXNzUnVsZXNdPVwicm93Q2xhc3NSdWxlc1wiXHJcbiAgICAgICAgICAgICAgKGdyaWRSZWFkeSk9XCJvbkdyaWRSZWFkeSgkZXZlbnQsaSlcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9hZy1ncmlkLWFuZ3VsYXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPC9uZ2ItcGFuZWw+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nYi1hY2NvcmRpb24+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbiAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmcgbXQtM1wiICpuZ0lmPVwibm9EYXRhRm91bmRcIj5cclxuICAgIE5vIERhdGEgZm91bmQgbWF0Y2hpbmcgeW91ciBzZWFyY2ggY3JpdGVyaWEuXHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj4iXX0=
|