kwikid-agent-dashboard 0.0.21 → 0.0.22

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.
@@ -1,73 +1,27 @@
1
1
  import { ElementRef, EventEmitter, OnInit } from '@angular/core';
2
- import { MapInfoWindow } from '@angular/google-maps';
3
- import { InfoWindowService } from '../../services/info-window.service';
4
2
  import { MapService } from '../../services/map.service';
5
- import { UserService } from '../../services/user.service';
3
+ import { AgentService } from '../../services/agent.service';
6
4
  import * as i0 from "@angular/core";
7
5
  export declare class CustomerTileComponent implements OnInit {
8
6
  mapService: MapService;
9
- infoWindowService: InfoWindowService;
10
- userService: UserService;
7
+ agentService: AgentService;
11
8
  private hostElement;
12
9
  windowResizeWatcher(): void;
13
- /**
14
- * @description
15
- * Determines Customer Data
16
- *
17
- * @default
18
- * `{}`
19
- */
20
10
  customer: any;
21
- /**
22
- * @description
23
- * Determines Index of Customer Data in Customer List
24
- *
25
- * @default
26
- *
27
- */
28
11
  index: number;
29
- agentConfig: any;
12
+ config: any;
30
13
  isMobileView: boolean;
31
14
  viewTaskDetails: Array<string>;
32
- /**
33
- * @description
34
- * Emitter to emit next Step
35
- *
36
- * @emits KwikIDAgentDashboardComponent#nextStep
37
- * @fires KwikIDAgentDashboardComponent#nextStep
38
- */
39
15
  nextStep: EventEmitter<any>;
40
16
  removeTask: EventEmitter<any>;
41
- /**
42
- * @description
43
- *
44
- * @constructor
45
- */
46
- constructor(mapService: MapService, infoWindowService: InfoWindowService, userService: UserService, hostElement: ElementRef);
47
- infoWindow: MapInfoWindow;
48
- /**
49
- * @description
50
- * To set Google Maps API on script
51
- *
52
- * @ngOnInit
53
- */
17
+ constructor(mapService: MapService, agentService: AgentService, hostElement: ElementRef);
54
18
  ngOnInit(): void;
55
19
  getTaskDetails(taskData: any): any;
56
20
  openDetails(): void;
57
- tileClick(): void;
58
- /**
59
- * @description
60
- * Wrapper method to show Customer Info Window
61
- *
62
- * @function showDetails
63
- * @func showDetails
64
- * @method showDetails
65
- */
66
- showDetails(customer: any, index: any): void;
67
21
  getClass(): string;
68
22
  goToMaps(location: any): void;
69
- goToNextStep(e: any): void;
23
+ handleOnClickNext(e: any): void;
70
24
  handleOnClickRemoveTask(task: any): void;
71
25
  static ɵfac: i0.ɵɵFactoryDeclaration<CustomerTileComponent, never>;
72
- static ɵcmp: i0.ɵɵComponentDeclaration<CustomerTileComponent, "customer-tile", never, { "customer": "customer"; "index": "index"; "agentConfig": "agentConfig"; }, { "nextStep": "nextStep"; "removeTask": "removeTask"; }, never, never>;
26
+ static ɵcmp: i0.ɵɵComponentDeclaration<CustomerTileComponent, "customer-tile", never, { "customer": "customer"; "index": "index"; "config": "config"; }, { "nextStep": "nextStep"; "removeTask": "removeTask"; }, never, never>;
73
27
  }
@@ -1,34 +1,32 @@
1
1
  import { HttpClient } from '@angular/common/http';
2
2
  import { ElementRef, EventEmitter, OnInit } from '@angular/core';
3
3
  import { MapInfoWindow, MapMarker } from '@angular/google-maps';
4
- import { TuiSheetOptions } from '@taiga-ui/addon-mobile';
5
4
  import { TuiDialogContext, TuiDialogService } from '@taiga-ui/core';
6
5
  import { PolymorpheusContent } from '@tinkoff/ng-polymorpheus';
7
- import { Observable } from 'rxjs';
8
6
  import { MapService } from './services/map.service';
9
- import { UserService } from './services/user.service';
7
+ import { AgentService } from './services/agent.service';
10
8
  import * as i0 from "@angular/core";
11
9
  export declare class KwikIDAgentDashboardComponent implements OnInit {
12
10
  mapService: MapService;
13
- userService: UserService;
11
+ agentService: AgentService;
14
12
  httpClient: HttpClient;
15
13
  private hostElement;
16
14
  private readonly dialogService;
17
15
  windowResizeWatcher(): void;
18
16
  isMobileView: any;
19
- agentConfig: any;
17
+ config: any;
20
18
  taskList: Array<any>;
21
19
  nextStep: EventEmitter<any>;
22
20
  addTask: EventEmitter<any>;
23
21
  removeTask: EventEmitter<any>;
24
22
  filterTaskList: EventEmitter<any>;
25
23
  loading: boolean;
26
- apiLoaded: Observable<boolean>;
27
- readonly options: Partial<TuiSheetOptions>;
24
+ map: any;
28
25
  infoWindow: MapInfoWindow;
29
- constructor(mapService: MapService, userService: UserService, httpClient: HttpClient, hostElement: ElementRef, dialogService: TuiDialogService);
26
+ mapElement: ElementRef;
27
+ constructor(mapService: MapService, agentService: AgentService, httpClient: HttpClient, hostElement: ElementRef, dialogService: TuiDialogService);
30
28
  ngOnInit(): void;
31
- goToNextStep(e: any): void;
29
+ handleOnClickNext(e: any): void;
32
30
  handleOnClickAddTask(task: any): void;
33
31
  handleOnClickRemoveTask(task: any): void;
34
32
  handleOnFilterTaskList(filter: any): void;
@@ -44,5 +42,5 @@ export declare class KwikIDAgentDashboardComponent implements OnInit {
44
42
  handleOnClickSaveForm(e: any): void;
45
43
  handleOnClickViewForms(e: any): void;
46
44
  static ɵfac: i0.ɵɵFactoryDeclaration<KwikIDAgentDashboardComponent, never>;
47
- static ɵcmp: i0.ɵɵComponentDeclaration<KwikIDAgentDashboardComponent, "kwikid-agent-dashboard", never, { "agentConfig": "agentConfig"; "taskList": "taskList"; }, { "nextStep": "nextStep"; "addTask": "addTask"; "removeTask": "removeTask"; "filterTaskList": "filterTaskList"; }, never, never>;
45
+ static ɵcmp: i0.ɵɵComponentDeclaration<KwikIDAgentDashboardComponent, "kwikid-agent-dashboard", never, { "config": "config"; "taskList": "taskList"; }, { "nextStep": "nextStep"; "addTask": "addTask"; "removeTask": "removeTask"; "filterTaskList": "filterTaskList"; }, never, never>;
48
46
  }
@@ -0,0 +1,70 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class AgentService {
3
+ config: any;
4
+ isListOpen: boolean;
5
+ isMobileView: any;
6
+ showMapview: boolean;
7
+ isShowTaskDetails: any;
8
+ addTaskForm: {
9
+ key: string;
10
+ title: string;
11
+ fields: ({
12
+ key: string;
13
+ label: string;
14
+ validators: {
15
+ required: boolean;
16
+ };
17
+ properties: {
18
+ placeholder: string;
19
+ readOnly: boolean;
20
+ case: string;
21
+ countryCode?: undefined;
22
+ removeCountryCodeFromValue?: undefined;
23
+ phoneMaskAfterCountryCode?: undefined;
24
+ };
25
+ type: string;
26
+ } | {
27
+ key: string;
28
+ label: string;
29
+ validators: {
30
+ required: boolean;
31
+ };
32
+ properties: {
33
+ countryCode: string;
34
+ removeCountryCodeFromValue: boolean;
35
+ phoneMaskAfterCountryCode: string;
36
+ placeholder: string;
37
+ readOnly: boolean;
38
+ case?: undefined;
39
+ };
40
+ type: string;
41
+ })[];
42
+ properties: {
43
+ header: {
44
+ title: {
45
+ hidden: boolean;
46
+ label: string;
47
+ };
48
+ steps: {
49
+ hidden: boolean;
50
+ };
51
+ };
52
+ footer: {
53
+ viewFormsButton: {
54
+ hidden: boolean;
55
+ label: string;
56
+ };
57
+ saveButton: {
58
+ hidden: boolean;
59
+ label: string;
60
+ };
61
+ };
62
+ };
63
+ };
64
+ constructor();
65
+ ngOnInit(): void;
66
+ setAgentConfig(config: any): void;
67
+ toggleMapview(): void;
68
+ static ɵfac: i0.ɵɵFactoryDeclaration<AgentService, never>;
69
+ static ɵprov: i0.ɵɵInjectableDeclaration<AgentService>;
70
+ }
@@ -1,26 +1,42 @@
1
1
  /// <reference types="googlemaps" />
2
2
  import { ElementRef, QueryList } from '@angular/core';
3
- import { MapDirectionsService } from '@angular/google-maps';
3
+ import 'leaflet-routing-machine';
4
+ import { AgentService } from './agent.service';
4
5
  import * as i0 from "@angular/core";
5
6
  export declare class MapService {
6
- mapDirectionsService: MapDirectionsService;
7
+ private agentService;
7
8
  myPosition: any;
8
9
  map: any;
9
- markers: any;
10
- directionsResults$: any;
11
- directionsRenderOption: {};
10
+ allMarkers: any;
11
+ allTasksRoutes: any;
12
+ selectedTaskRoutes: any;
13
+ selectedTaskDistanceAndTime: any;
12
14
  directionsRenders: QueryList<ElementRef<google.maps.DirectionsRenderer>>;
13
- constructor(mapDirectionsService: MapDirectionsService);
14
- getMarkers(): any;
15
- setMarkers(markers: any): void;
15
+ constructor(agentService: AgentService);
16
16
  initMap(): Promise<void>;
17
- plotMarkers(customers: any): any;
17
+ addMarker({ lat, lng, title, color }: {
18
+ lat: any;
19
+ lng: any;
20
+ title: any;
21
+ color: any;
22
+ }): void;
23
+ plotDirectionsForAllTasks(tasks: any): any;
24
+ plotDirectionsForSelectedTask(index: any): void;
25
+ getSelectedTaskDistanceAndTime(): any;
26
+ setSelectedTaskDistanceAndTime(): void;
27
+ sortTasksAsPerDistance(order: any, tasks: any, isMarker: any): any[];
28
+ setRoutes(markers: any, styles: any): any;
29
+ fitMapBounds(): void;
18
30
  getPosition(): Promise<any>;
19
- getLatLng(data: any): {
20
- lat: number;
21
- lng: number;
31
+ getLocation(task: any): any;
32
+ getLatLng(data: any, index: any): {
33
+ lat: any;
34
+ lng: any;
35
+ title: any;
36
+ color: string;
22
37
  };
23
- sortList(order: any, customersData: any): any[];
38
+ calculateDistance(point1: any, point2: any): number;
39
+ nearestNeighborAlgorithm(startingPoint: any, unvisitedPoints: any[]): any[];
24
40
  static ɵfac: i0.ɵɵFactoryDeclaration<MapService, never>;
25
41
  static ɵprov: i0.ɵɵInjectableDeclaration<MapService>;
26
42
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kwikid-agent-dashboard",
3
- "version": "0.0.21",
3
+ "version": "0.0.22",
4
4
  "description": "KwikID's EKYC Agent Map View Module.",
5
5
  "author": {
6
6
  "name": "Gaurang Thakker"
@@ -36,6 +36,8 @@
36
36
  "kwikid-forms": "^0.6.21",
37
37
  "kwikid-toolkit": "^0.2.1",
38
38
  "kwikui": "^0.3.7",
39
+ "leaflet": "^1.9.4",
40
+ "leaflet-routing-machine": "^3.2.12",
39
41
  "tslib": "^2.2.0"
40
42
  },
41
43
  "main": "bundles/kwikid-agent-dashboard.umd.js",
@@ -1,185 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "./map.service";
4
- export class InfoWindowService {
5
- constructor(mapService) {
6
- this.mapService = mapService;
7
- this.config = {
8
- fields: {
9
- name: {
10
- label: 'Name',
11
- value: 'name',
12
- display: 'value',
13
- style: {
14
- fontSize: '1rem',
15
- fontWeight: 600
16
- }
17
- },
18
- phone: {
19
- label: 'Call',
20
- value: 'phone',
21
- display: 'label',
22
- style: {
23
- fontSize: '0.8rem',
24
- padding: '0.1rem 0',
25
- textAlign: 'justify'
26
- },
27
- icon: 'https://cdn-icons-png.flaticon.com/512/60/60720.png'
28
- },
29
- address: {
30
- label: 'Directions',
31
- value: 'address',
32
- display: 'label',
33
- style: {
34
- fontSize: '0.8rem',
35
- padding: '0.1rem 0'
36
- },
37
- icon: 'https://cdn-icons-png.flaticon.com/512/62/62516.png'
38
- }
39
- }
40
- };
41
- this.mainInfoWindowStyle = {
42
- display: 'flex',
43
- 'flex-direction': 'column',
44
- 'justify-content': 'center',
45
- 'align-items': 'stretch',
46
- gap: '0.5rem',
47
- padding: '0.5rem'
48
- };
49
- this.fieldDivStyle = {
50
- gap: ' 0.5rem',
51
- display: 'flex',
52
- 'flex-direction': 'row'
53
- };
54
- }
55
- getOpenMarker() {
56
- return this.openMarker;
57
- }
58
- setOpenMarker(value) {
59
- this.openMarker = value;
60
- }
61
- /**
62
- * @description
63
- * Wrapper method to show Customer Info Window
64
- *
65
- * @function showInfo
66
- * @func showInfo
67
- * @method showInfo
68
- */
69
- showCustomerInformation(customer, marker) {
70
- let map = this.mapService.map;
71
- let contentString = this.createInfoContent(customer);
72
- let infowindow = new google.maps.InfoWindow({
73
- content: contentString
74
- });
75
- this.addEventListeners(customer, infowindow);
76
- this.closeLastOpenedInfoWindow();
77
- infowindow.open(map, marker);
78
- this.lastInfoWindowOpened = infowindow;
79
- this.mapService.map = Object.assign(Object.assign({}, this.mapService.map), { center: marker.getPosition });
80
- // map.setCenter(marker.getPosition());
81
- return { infowindow: infowindow };
82
- }
83
- addEventListeners(customer, infowindow) {
84
- // chnage -
85
- let addressLink = `http://maps.google.com/?q=${customer.extras.loc[0]}, ${customer.extras.loc[1]}`;
86
- google.maps.event.addListener(infowindow, 'domready', function () {
87
- document.getElementById('Call').addEventListener('click', function (e) {
88
- window.open(`tel:${customer.extras.phone}`, '_self');
89
- });
90
- document
91
- .getElementById('Directions')
92
- .addEventListener('click', function (e) {
93
- window.open(`${addressLink}`, '_blank');
94
- });
95
- document
96
- .getElementsByClassName('gm-ui-hover-effect')[0]
97
- .setAttribute('style', ' background: none;\
98
- display: block; \
99
- border: 0px; \
100
- margin: 0px; \
101
- padding: 0px; \
102
- text-transform: none; \
103
- appearance: none; \
104
- position: absolute; \
105
- cursor: pointer; \
106
- user-select: none; \
107
- top: 0px; \
108
- right: 0px; \
109
- width: 30px; \
110
- height: 30px; \
111
- ');
112
- });
113
- }
114
- /**
115
- * @description
116
- * Wrapper method to close Last Info Window
117
- *
118
- * @function closeLastOpenedInfoWindow
119
- * @func closeLastOpenedInfoWindow
120
- * @method closeLastOpenedInfoWindow
121
- */
122
- closeLastOpenedInfoWindow() {
123
- if (this.lastInfoWindowOpened) {
124
- this.lastInfoWindowOpened.close();
125
- }
126
- }
127
- /**
128
- * @description
129
- * Closes the previously opened info window.
130
- *
131
- * @function infoData
132
- * @func infoData
133
- * @method infoData
134
- */
135
- createInfoContent(customer) {
136
- let content = "<div style='padding:4px; font-family: Manrope;' >";
137
- content += this.createFields(customer, this.config.fields);
138
- content += '</div>';
139
- return content;
140
- }
141
- /**
142
- * @description
143
- * Wrapper method to create Fields Container
144
- *
145
- * @function createFields
146
- * @func createFields
147
- * @method createFields
148
- */
149
- createFields(customer, fields) {
150
- let _div = document.createElement('div');
151
- for (const property in this.mainInfoWindowStyle)
152
- _div.style[property] = this.mainInfoWindowStyle[property];
153
- for (let key of Object.keys(fields)) {
154
- let field = fields[key];
155
- let _fieldDiv = document.createElement('div');
156
- _fieldDiv.setAttribute('id', field.label);
157
- for (const property in this.fieldDivStyle)
158
- _fieldDiv.style[property] = this.fieldDivStyle[property];
159
- for (const property in field.style)
160
- _fieldDiv.style[property] = field.style[property];
161
- let string = field.display == 'label' ? field.label : customer.extras[field.value];
162
- if (field.icon) {
163
- let _icon = document.createElement('img');
164
- _icon.src = field.icon;
165
- _icon.style.width = field.style.fontSize;
166
- _icon.style.height = field.style.fontSize;
167
- _fieldDiv.appendChild(_icon);
168
- }
169
- let _fieldText = document.createElement('div');
170
- _fieldText.innerHTML = string;
171
- _fieldDiv.appendChild(_fieldText);
172
- _div.appendChild(_fieldDiv);
173
- }
174
- return _div.outerHTML;
175
- }
176
- }
177
- /** @nocollapse */ InfoWindowService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: InfoWindowService, deps: [{ token: i1.MapService }], target: i0.ɵɵFactoryTarget.Injectable });
178
- /** @nocollapse */ InfoWindowService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: InfoWindowService, providedIn: 'root' });
179
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: InfoWindowService, decorators: [{
180
- type: Injectable,
181
- args: [{
182
- providedIn: 'root'
183
- }]
184
- }], ctorParameters: function () { return [{ type: i1.MapService }]; } });
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby13aW5kb3cuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1hZ2VudC1kYXNoYm9hcmQvc3JjL2xpYi9zZXJ2aWNlcy9pbmZvLXdpbmRvdy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQVEzQyxNQUFNLE9BQU8saUJBQWlCO0lBc0Q1QixZQUFtQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBbER6QyxXQUFNLEdBQUc7WUFDUCxNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFO29CQUNKLEtBQUssRUFBRSxNQUFNO29CQUNiLEtBQUssRUFBRSxNQUFNO29CQUNiLE9BQU8sRUFBRSxPQUFPO29CQUNoQixLQUFLLEVBQUU7d0JBQ0wsUUFBUSxFQUFFLE1BQU07d0JBQ2hCLFVBQVUsRUFBRSxHQUFHO3FCQUNoQjtpQkFDRjtnQkFDRCxLQUFLLEVBQUU7b0JBQ0wsS0FBSyxFQUFFLE1BQU07b0JBQ2IsS0FBSyxFQUFFLE9BQU87b0JBQ2QsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLEtBQUssRUFBRTt3QkFDTCxRQUFRLEVBQUUsUUFBUTt3QkFDbEIsT0FBTyxFQUFFLFVBQVU7d0JBQ25CLFNBQVMsRUFBRSxTQUFTO3FCQUNyQjtvQkFDRCxJQUFJLEVBQUUscURBQXFEO2lCQUM1RDtnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsS0FBSyxFQUFFLFlBQVk7b0JBQ25CLEtBQUssRUFBRSxTQUFTO29CQUNoQixPQUFPLEVBQUUsT0FBTztvQkFDaEIsS0FBSyxFQUFFO3dCQUNMLFFBQVEsRUFBRSxRQUFRO3dCQUNsQixPQUFPLEVBQUUsVUFBVTtxQkFDcEI7b0JBQ0QsSUFBSSxFQUFFLHFEQUFxRDtpQkFDNUQ7YUFDRjtTQUNGLENBQUM7UUFFRix3QkFBbUIsR0FBRztZQUNwQixPQUFPLEVB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LENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXhFLElBQUksS0FBSyxDQUFDLElBQUksRUFBRTtnQkFDZCxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUN6QyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztnQkFDMUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM5QjtZQUVELElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsVUFBVSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7WUFDOUIsU0FBUyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVsQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7O2tJQTVNVSxpQkFBaUI7c0lBQWpCLGlCQUFpQixjQUZoQixNQUFNOzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXBTZXJ2aWNlIH0gZnJvbSAnLi9tYXAuc2VydmljZSc7XG5cbmRlY2xhcmUgY29uc3QgZ29vZ2xlOiBhbnk7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEluZm9XaW5kb3dTZXJ2aWNlIHtcbiAgb3Blbk1hcmtlcjtcbiAgbGFzdEluZm9XaW5kb3dPcGVuZWQ7XG5cbiAgY29uZmlnID0ge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZToge1xuICAgICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgICB2YWx1ZTogJ25hbWUnLFxuICAgICAgICBkaXNwbGF5OiAndmFsdWUnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIGZvbnRTaXplOiAnMXJlbScsXG4gICAgICAgICAgZm9udFdlaWdodDogNjAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwaG9uZToge1xuICAgICAgICBsYWJlbDogJ0NhbGwnLFxuICAgICAgICB2YWx1ZTogJ3Bob25lJyxcbiAgICAgICAgZGlzcGxheTogJ2xhYmVsJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBmb250U2l6ZTogJzAuOHJlbScsXG4gICAgICAgICAgcGFkZGluZzogJzAuMXJlbSAwJyxcbiAgICAgICAgICB0ZXh0QWxpZ246ICdqdXN0aWZ5J1xuICAgICAgICB9LFxuICAgICAgICBpY29uOiAnaHR0cHM6Ly9jZG4taWNvbnMtcG5nLmZsYXRpY29uLmNvbS81MTIvNjAvNjA3MjAucG5nJ1xuICAgICAgfSxcbiAgICAgIGFkZHJlc3M6IHtcbiAgICAgICAgbGFiZWw6ICdEaXJlY3Rpb25zJyxcbiAgICAgICAgdmFsdWU6ICdhZGRyZXNzJyxcbiAgICAgICAgZGlzcGxheTogJ2xhYmVsJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBmb250U2l6ZTogJzAuOHJlbScsXG4gICAgICAgICAgcGFkZGluZzogJzAuMXJlbSAwJ1xuICAgICAgICB9LFxuICAgICAgICBpY29uOiAnaHR0cHM6Ly9jZG4taWNvbnMtcG5nLmZsYXRpY29uLmNvbS81MTIvNjIvNjI1MTYucG5nJ1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBtYWluSW5mb1dpbmRvd1N0eWxlID0ge1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAnZmxleC1kaXJlY3Rpb24nOiAnY29sdW1uJyxcbiAgICAnanVzdGlmeS1jb250ZW50JzogJ2NlbnRlcicsXG4gICAgJ2FsaWduLWl0ZW1zJzogJ3N0cmV0Y2gnLFxuICAgIGdhcDogJzAuNXJlbScsXG4gICAgcGFkZGluZzogJzAuNXJlbSdcbiAgfTtcblxuICBmaWVsZERpdlN0eWxlID0ge1xuICAgIGdhcDogJyAwLjVyZW0nLFxuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAnZmxleC1kaXJlY3Rpb24nOiAncm93J1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtYXBTZXJ2aWNlOiBNYXBTZXJ2aWNlKSB7fVxuXG4gIGdldE9wZW5NYXJrZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMub3Blbk1hcmtlcjtcbiAgfVxuXG4gIHNldE9wZW5NYXJrZXIodmFsdWUpIHtcbiAgICB0aGlzLm9wZW5NYXJrZXIgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV3JhcHBlciBtZXRob2QgdG8gc2hvdyBDdXN0b21lciBJbmZvIFdpbmRvd1xuICAgKlxuICAgKiBAZnVuY3Rpb24gc2hvd0luZm9cbiAgICogQGZ1bmMgc2hvd0luZm9cbiAgICogQG1ldGhvZCBzaG93SW5mb1xuICAgKi9cbiAgc2hvd0N1c3RvbWVySW5mb3JtYXRpb24oY3VzdG9tZXIsIG1hcmtlcikge1xuICAgIGxldCBtYXAgPSB0aGlzLm1hcFNlcnZpY2UubWFwO1xuICAgIGxldCBjb250ZW50U3RyaW5nID0gdGhpcy5jcmVhdGVJbmZvQ29udGVudChjdXN0b21lcik7XG5cbiAgICBsZXQgaW5mb3dpbmRvdyA9IG5ldyBnb29nbGUubWFwcy5JbmZvV2luZG93KHtcbiAgICAgIGNvbnRlbnQ6IGNvbnRlbnRTdHJpbmdcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoY3VzdG9tZXIsIGluZm93aW5kb3cpO1xuXG4gICAgdGhpcy5jbG9zZUxhc3RPcGVuZWRJbmZvV2luZG93KCk7XG4gICAgaW5mb3dpbmRvdy5vcGVuKG1hcCwgbWFya2VyKTtcbiAgICB0aGlzLmxhc3RJbmZvV2luZG93T3BlbmVkID0gaW5mb3dpbmRvdztcblxuICAgIHRoaXMubWFwU2VydmljZS5tYXAgPSB7XG4gICAgICAuLi50aGlzLm1hcFNlcnZpY2UubWFwLFxuICAgICAgY2VudGVyOiBtYXJrZXIuZ2V0UG9zaXRpb25cbiAgICB9O1xuICAgIC8vIG1hcC5zZXRDZW50ZXIobWFya2VyLmdldFBvc2l0aW9uKCkpO1xuXG4gICAgcmV0dXJuIHsgaW5mb3dpbmRvdzogaW5mb3dpbmRvdyB9O1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcnMoY3VzdG9tZXIsIGluZm93aW5kb3cpIHtcbiAgICAvLyBjaG5hZ2UgLVxuICAgIGxldCBhZGRyZXNzTGluayA9IGBodHRwOi8vbWFwcy5nb29nbGUuY29tLz9xPSR7Y3VzdG9tZXIuZXh0cmFzLmxvY1swXX0sICR7Y3VzdG9tZXIuZXh0cmFzLmxvY1sxXX1gO1xuXG4gICAgZ29vZ2xlLm1hcHMuZXZlbnQuYWRkTGlzdGVuZXIoaW5mb3dpbmRvdywgJ2RvbXJlYWR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ0NhbGwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHdpbmRvdy5vcGVuKGB0ZWw6JHtjdXN0b21lci5leHRyYXMucGhvbmV9YCwgJ19zZWxmJyk7XG4gICAgICB9KTtcbiAgICAgIGRvY3VtZW50XG4gICAgICAgIC5nZXRFbGVtZW50QnlJZCgnRGlyZWN0aW9ucycpXG4gICAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgd2luZG93Lm9wZW4oYCR7YWRkcmVzc0xpbmt9YCwgJ19ibGFuaycpO1xuICAgICAgICB9KTtcblxuICAgICAgZG9jdW1lbnRcbiAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2dtLXVpLWhvdmVyLWVmZmVjdCcpWzBdXG4gICAgICAgIC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAnICAgYmFja2dyb3VuZDogbm9uZTtcXFxuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7IFxcXG4gICAgICAgICAgICBib3JkZXI6IDBweDsgXFxcbiAgICAgICAgICAgIG1hcmdpbjogMHB4OyBcXFxuICAgICAgICAgICAgcGFkZGluZzogMHB4OyBcXFxuICAgICAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7IFxcXG4gICAgICAgICAgICBhcHBlYXJhbmNlOiBub25lOyBcXFxuICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOyBcXFxuICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOyBcXFxuICAgICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7IFxcXG4gICAgICAgICAgICB0b3A6IDBweDsgXFxcbiAgICAgICAgICAgIHJpZ2h0OiAwcHg7IFxcXG4gICAgICAgICAgICB3aWR0aDogMzBweDsgXFxcbiAgICAgICAgICAgIGhlaWdodDogMzBweDsgXFxcbiAgICAgICAgICAgICdcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV3JhcHBlciBtZXRob2QgdG8gY2xvc2UgTGFzdCBJbmZvIFdpbmRvd1xuICAgKlxuICAgKiBAZnVuY3Rpb24gY2xvc2VMYXN0T3BlbmVkSW5mb1dpbmRvd1xuICAgKiBAZnVuYyBjbG9zZUxhc3RPcGVuZWRJbmZvV2luZG93XG4gICAqIEBtZXRob2QgY2xvc2VMYXN0T3BlbmVkSW5mb1dpbmRvd1xuICAgKi9cbiAgY2xvc2VMYXN0T3BlbmVkSW5mb1dpbmRvdygpIHtcbiAgICBpZiAodGhpcy5sYXN0SW5mb1dpbmRvd09wZW5lZCkge1xuICAgICAgdGhpcy5sYXN0SW5mb1dpbmRvd09wZW5lZC5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQ2xvc2VzIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBpbmZvIHdpbmRvdy5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGluZm9EYXRhXG4gICAqIEBmdW5jIGluZm9EYXRhXG4gICAqIEBtZXRob2QgaW5mb0RhdGFcbiAgICovXG4gIGNyZWF0ZUluZm9Db250ZW50KGN1c3RvbWVyKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBcIjxkaXYgc3R5bGU9J3BhZGRpbmc6NHB4OyBmb250LWZhbWlseTogTWFucm9wZTsnID5cIjtcblxuICAgIGNvbnRlbnQgKz0gdGhpcy5jcmVhdGVGaWVsZHMoY3VzdG9tZXIsIHRoaXMuY29uZmlnLmZpZWxkcyk7XG4gICAgY29udGVudCArPSAnPC9kaXY+JztcblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXcmFwcGVyIG1ldGhvZCB0byBjcmVhdGUgRmllbGRzIENvbnRhaW5lclxuICAgKlxuICAgKiBAZnVuY3Rpb24gY3JlYXRlRmllbGRzXG4gICAqIEBmdW5jIGNyZWF0ZUZpZWxkc1xuICAgKiBAbWV0aG9kIGNyZWF0ZUZpZWxkc1xuICAgKi9cbiAgY3JlYXRlRmllbGRzKGN1c3RvbWVyLCBmaWVsZHMpIHtcbiAgICBsZXQgX2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5tYWluSW5mb1dpbmRvd1N0eWxlKVxuICAgICAgX2Rpdi5zdHlsZVtwcm9wZXJ0eV0gPSB0aGlzLm1haW5JbmZvV2luZG93U3R5bGVbcHJvcGVydHldO1xuXG4gICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKGZpZWxkcykpIHtcbiAgICAgIGxldCBmaWVsZCA9IGZpZWxkc1trZXldO1xuXG4gICAgICBsZXQgX2ZpZWxkRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBfZmllbGREaXYuc2V0QXR0cmlidXRlKCdpZCcsIGZpZWxkLmxhYmVsKTtcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5maWVsZERpdlN0eWxlKVxuICAgICAgICBfZmllbGREaXYuc3R5bGVbcHJvcGVydHldID0gdGhpcy5maWVsZERpdlN0eWxlW3Byb3BlcnR5XTtcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gZmllbGQuc3R5bGUpXG4gICAgICAgIF9maWVsZERpdi5zdHlsZVtwcm9wZXJ0eV0gPSBmaWVsZC5zdHlsZVtwcm9wZXJ0eV07XG5cbiAgICAgIGxldCBzdHJpbmcgPVxuICAgICAgICBmaWVsZC5kaXNwbGF5ID09ICdsYWJlbCcgPyBmaWVsZC5sYWJlbCA6IGN1c3RvbWVyLmV4dHJhc1tmaWVsZC52YWx1ZV07XG5cbiAgICAgIGlmIChmaWVsZC5pY29uKSB7XG4gICAgICAgIGxldCBfaWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgICBfaWNvbi5zcmMgPSBmaWVsZC5pY29uO1xuICAgICAgICBfaWNvbi5zdHlsZS53aWR0aCA9IGZpZWxkLnN0eWxlLmZvbnRTaXplO1xuICAgICAgICBfaWNvbi5zdHlsZS5oZWlnaHQgPSBmaWVsZC5zdHlsZS5mb250U2l6ZTtcbiAgICAgICAgX2ZpZWxkRGl2LmFwcGVuZENoaWxkKF9pY29uKTtcbiAgICAgIH1cblxuICAgICAgbGV0IF9maWVsZFRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIF9maWVsZFRleHQuaW5uZXJIVE1MID0gc3RyaW5nO1xuICAgICAgX2ZpZWxkRGl2LmFwcGVuZENoaWxkKF9maWVsZFRleHQpO1xuXG4gICAgICBfZGl2LmFwcGVuZENoaWxkKF9maWVsZERpdik7XG4gICAgfVxuICAgIHJldHVybiBfZGl2Lm91dGVySFRNTDtcbiAgfVxufVxuIl19