@aggdirect/coolmap-services 1.0.9 → 1.1.1

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,258 +1,259 @@
1
- import { Injectable, Inject } from '@angular/core';
2
- import { BehaviorSubject } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common/http";
5
- import * as i2 from "@angular/material/snack-bar";
6
- import * as i3 from "./data-model";
7
- export class UtilsService {
8
- constructor(http, snackBar, config) {
9
- this.http = http;
10
- this.snackBar = snackBar;
11
- this.config = config;
12
- this.analyticsRESTURL = '';
13
- this.RESTURLPrefix = '';
14
- this.pickupOptions = [];
15
- this.destOptions = [];
16
- this.ownerOptions = [];
17
- this.customerOptions = [];
18
- this.unitOptions = [];
19
- this.materialOptions = [];
20
- this.jcodeOptions = [];
21
- this.driverOption = [];
22
- this.truckingCompanayOption = [];
23
- this.routeNameOptions = [];
24
- this.preventnavChange = new BehaviorSubject(false);
25
- this.navChangeObserve = this.preventnavChange.asObservable();
26
- this.clearViewRouteforJobCode = new BehaviorSubject(false);
27
- this.clearViewRouteforJobCodeObserve = this.clearViewRouteforJobCode.asObservable();
28
- this.preVentJobdetailclose = new BehaviorSubject(false);
29
- this.getpreVentJobdetailclose = this.preVentJobdetailclose.asObservable();
30
- this.routeDetailsUtility = new BehaviorSubject({});
31
- this.getrouteDetailsUtility = this.routeDetailsUtility.asObservable();
32
- this.removeMapEntity = new BehaviorSubject({});
33
- this.removeMapEntityUtility = this.removeMapEntity.asObservable();
34
- this.dict = new Map();
35
- this.analyticsRESTURL = config.analyticsRESTURL;
36
- this.RESTURLPrefix = config.RESTURLPrefix;
37
- }
38
- getDateFormat(strVal, seprater) {
39
- seprater = seprater ? seprater : '-';
40
- const mydate = strVal;
41
- return mydate?.getFullYear() + seprater + ((mydate ? mydate.getMonth() : 0) + 1) + seprater + mydate?.getDate();
42
- }
43
- getData(path) { return this.http.get(`${this.analyticsRESTURL}${this.config.repository}/${path}`); }
44
- postdata(path, data) { return this.http.post(`${this.analyticsRESTURL}${this.config.repository}/${path}`, data); }
45
- postDataWithRestUrl(path, data) { return this.http.post(`${this.RESTURLPrefix}${path}`, data); }
46
- fetchAutoCompleteLocations(keyword) {
47
- return this.http.get(`https://api.mapbox.com/geocoding/v5/mapbox.places/${keyword}.json?access_token=pk.eyJ1Ijoic2FudGFudS1vZ21hIiwiYSI6ImNsOGQ0cDVrNjAweTMzb3RmdG9ieTU5ZDkifQ.I6ZS7mViZYSvBo4zz-mGQQ&country=US`);
48
- }
49
- openSnackBar(message, className) {
50
- this.snackBar.open(message, '', {
51
- duration: 5000, verticalPosition: 'top', horizontalPosition: 'center', panelClass: [className ? className : 'default']
52
- });
53
- }
54
- makeOptions(item) {
55
- if (item.order_number) {
56
- (this.jcodeOptions.findIndex((elem) => elem.job_id === item.job_id) === -1) ? this.jcodeOptions.push({ job_code: item.order_number, job_id: item.job_id }) : null;
57
- if (item.driver_list && item.driver_list?.length > 0) {
58
- item.driver_list.forEach((driver) => {
59
- this.driverOption.findIndex(elem => elem === driver['driver_name']) === -1 ? this.driverOption.push(driver['driver_name']) : null;
60
- this.truckingCompanayOption.findIndex(elem => elem === driver['trucking_company']) === -1 ? this.truckingCompanayOption.push(driver['trucking_company']) : null;
61
- });
62
- }
63
- }
64
- ((this.pickupOptions.findIndex((elem) => elem === item.pickup_location)) === -1) ? this.pickupOptions.push(item.pickup_location) : null;
65
- ((this.destOptions.findIndex((elem) => elem === item.delivery_location)) === -1) ? this.destOptions.push(item.delivery_location) : null;
66
- (this.customerOptions.findIndex((customer) => customer === item.customer_name) === -1) ? this.customerOptions.push(item.customer_name) : null;
67
- (this.unitOptions.findIndex((elem) => elem === item.unit) === -1) ? this.unitOptions.push(item.unit) : null;
68
- (this.materialOptions.findIndex((elem) => elem === item.material) === -1) ? this.materialOptions.push(item.material) : null;
69
- if (item.route_name)
70
- this.routeNameOptions.findIndex(elem => elem === item.route_name) === -1 ? this.routeNameOptions.push(item.route_name) : null;
71
- }
72
- filter(value, filters) {
73
- if (typeof value !== 'string') {
74
- return [];
75
- }
76
- const filterValue = value.toLowerCase();
77
- if (filterValue === '') {
78
- return [];
79
- }
80
- const searchResults = [];
81
- this.unitOptions.map(unit => {
82
- if (unit.toLowerCase().includes(filterValue)) {
83
- searchResults.push({ "type": "unit", "label": unit, "value": unit });
84
- }
85
- });
86
- this.customerOptions.map(unit => {
87
- if (unit.toLowerCase().includes(filterValue)) {
88
- searchResults.push({ "type": "customer", "label": unit, "value": unit });
89
- }
90
- });
91
- this.materialOptions.map(unit => {
92
- if (unit.toLowerCase().includes(filterValue)) {
93
- searchResults.push({ "type": "material", "label": unit, "value": unit });
94
- }
95
- });
96
- this.pickupOptions.map(unit => {
97
- if (unit.toLowerCase().includes(filterValue)) {
98
- searchResults.push({ "type": "pickup location", "label": unit, "value": unit });
99
- }
100
- });
101
- this.destOptions.map(unit => {
102
- if (unit.toLowerCase().includes(filterValue)) {
103
- searchResults.push({ "type": "destination location", "label": unit, "value": unit });
104
- }
105
- });
106
- this.jcodeOptions.map(unit => {
107
- if (unit.job_code.toLowerCase().includes(filterValue)) {
108
- searchResults.push({ "type": "job", "label": unit['job_code'], "value": unit });
109
- }
110
- });
111
- this.driverOption.map(unit => {
112
- if (unit.toLowerCase().includes(filterValue)) {
113
- searchResults.push({ "type": "Driver", "label": unit, "value": unit });
114
- }
115
- });
116
- this.truckingCompanayOption.map(unit => {
117
- if (unit.toLowerCase().includes(filterValue)) {
118
- searchResults.push({ "type": "Trucking Company", "label": unit, "value": unit });
119
- }
120
- });
121
- this.routeNameOptions.map(unit => {
122
- if (unit.toLowerCase().includes(filterValue)) {
123
- searchResults.push({ "type": "Route name", "label": unit, "value": unit });
124
- }
125
- });
126
- const searchDict = {};
127
- filters.map((filter) => {
128
- searchDict[filter['name'] + filter['type']] = filter;
129
- });
130
- const furtherFilter = [];
131
- searchResults.map(search => {
132
- if ((search['label'] + search['type']) in searchDict) { }
133
- else {
134
- furtherFilter.push(search);
135
- }
136
- });
137
- return furtherFilter;
138
- }
139
- getSearchResults(list, filterval) {
140
- return list.filter(element => {
141
- const result_list_boolean = [];
142
- if (filterval.length > 0) {
143
- if (filterval[0]['type'] === 'unit') {
144
- result_list_boolean.push(filterval[0]['name'] === element[filterval[0]['type']]);
145
- }
146
- if (filterval[0]['type'] === 'customer') {
147
- result_list_boolean.push(filterval[0]['name'] === element['customer_name']);
148
- }
149
- if (filterval[0]['type'] === 'material') {
150
- result_list_boolean.push(filterval[0]['name'] === element[filterval[0]['type']]);
151
- }
152
- if (filterval[0]['type'] === 'pickup location') {
153
- result_list_boolean.push(filterval[0]['name'] === element['pickup_location']);
154
- }
155
- if (filterval[0]['type'] === 'destination location') {
156
- result_list_boolean.push(filterval[0]['name'] === element['delivery_location']);
157
- }
158
- if (filterval[0]['type'] === 'job') {
159
- result_list_boolean.push(filterval[0]['name'] === element['order_number']);
160
- }
161
- if (filterval[0]['type'] === 'Route name') {
162
- result_list_boolean.push(filterval[0]['name'] === element['route_name']);
163
- }
164
- if (filterval[0]['type'] === 'Driver') {
165
- const index = element.driver_list?.findIndex(ele => { return filterval[0]['name'] === ele['driver_name']; });
166
- if (index !== -1)
167
- result_list_boolean.push(true);
168
- }
169
- if (filterval[0]['type'] === 'Trucking Company') {
170
- const index = element.driver_list?.findIndex(ele => { return filterval[0]['name'] === ele['trucking_company']; });
171
- if (index !== -1)
172
- result_list_boolean.push(true);
173
- }
174
- }
175
- if (result_list_boolean.length > 0) {
176
- return result_list_boolean.reduce((prev, curr) => prev && curr);
177
- }
178
- return false;
179
- });
180
- }
181
- clearOptions() {
182
- this.pickupOptions = [];
183
- this.destOptions = [];
184
- this.ownerOptions = [];
185
- this.customerOptions = [];
186
- this.unitOptions = [];
187
- this.materialOptions = [];
188
- this.jcodeOptions = [];
189
- this.routeNameOptions = [];
190
- }
191
- setdictValue(key, value) {
192
- this.dict.set(key, value);
193
- }
194
- getdictValue(key) {
195
- return JSON.parse(this.dict.get(key));
196
- }
197
- removedictValue(key) {
198
- this.dict.delete(key);
199
- }
200
- conveySearchIcon(value) {
201
- if (value && typeof (value) !== 'object')
202
- return true;
203
- return false;
204
- }
205
- fetchUnitsList() {
206
- return new Promise((resolve, reject) => {
207
- if (!this.unitsList) {
208
- this.getData('unit/list/view').subscribe((res) => {
209
- if (res) {
210
- this.unitsList = res.data;
211
- resolve(this.unitsList);
212
- }
213
- });
214
- }
215
- else {
216
- resolve(this.unitsList);
217
- }
218
- });
219
- }
220
- fetchMaterialsList() {
221
- return new Promise((resolve, reject) => {
222
- if (!this.materialsList) {
223
- this.getData('material/list/view').subscribe(((res) => {
224
- res.data.sort((a, b) => a.material.localeCompare(b.material));
225
- this.materialsList = res.data;
226
- resolve(this.materialsList);
227
- }));
228
- }
229
- else {
230
- resolve(this.materialsList);
231
- }
232
- });
233
- }
234
- fetchCustomersList() {
235
- return new Promise((resolve, reject) => {
236
- if (!this.customersList) {
237
- this.getData('company/list/view').subscribe((res) => {
238
- if (res) {
239
- this.customersList = res.data;
240
- }
241
- });
242
- }
243
- else {
244
- resolve(this.customersList);
245
- }
246
- });
247
- }
248
- }
249
- UtilsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: UtilsService, deps: [{ token: i1.HttpClient }, { token: i2.MatSnackBar }, { token: 'memberData' }], target: i0.ɵɵFactoryTarget.Injectable });
250
- UtilsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: UtilsService, providedIn: 'root' });
251
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: UtilsService, decorators: [{
252
- type: Injectable,
253
- args: [{ providedIn: 'root' }]
254
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.MatSnackBar }, { type: i3.CoolmapConfigModel, decorators: [{
255
- type: Inject,
256
- args: ['memberData']
257
- }] }]; } });
258
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvb2xtYXAtc2VydmljZXMvc3JjL2xpYi9zZXJ2aWNlL3V0aWxzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGVBQWUsRUFBYSxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFJbEQsTUFBTSxPQUFPLFlBQVk7SUEyQnZCLFlBQW1CLElBQWdCLEVBQVMsUUFBcUIsRUFDakMsTUFBMEI7UUFEdkMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFTLGFBQVEsR0FBUixRQUFRLENBQWE7UUFDakMsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUEzQjFELHFCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUN0QixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQUMxQixnQkFBVyxHQUFVLEVBQUUsQ0FBQztRQUN4QixpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6QixvQkFBZSxHQUFVLEVBQUUsQ0FBQztRQUM1QixnQkFBVyxHQUFVLEVBQUUsQ0FBQztRQUN4QixvQkFBZSxHQUFVLEVBQUUsQ0FBQztRQUM1QixpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6QixpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6QiwyQkFBc0IsR0FBVSxFQUFFLENBQUM7UUFDbkMscUJBQWdCLEdBQVUsRUFBRSxDQUFDO1FBQ3RCLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JELHFCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4RCw2QkFBd0IsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxvQ0FBK0IsR0FBRyxJ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Q0FBQyxDQUFDO2FBQzdCO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDOzt5R0F0T1UsWUFBWSx1RUE0QmIsWUFBWTs2R0E1QlgsWUFBWSxjQURDLE1BQU07MkZBQ25CLFlBQVk7a0JBRHhCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkE2QjdCLE1BQU07MkJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb29sbWFwQ29uZmlnTW9kZWwsIFJvdXRlIH0gZnJvbSAnLi9kYXRhLW1vZGVsJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBVdGlsc1NlcnZpY2Uge1xuICBhbmFseXRpY3NSRVNUVVJMID0gJyc7XG4gIFJFU1RVUkxQcmVmaXggPSAnJztcbiAgcGlja3VwT3B0aW9uczogYW55W10gPSBbXTtcbiAgZGVzdE9wdGlvbnM6IGFueVtdID0gW107XG4gIG93bmVyT3B0aW9uczogYW55W10gPSBbXTtcbiAgY3VzdG9tZXJPcHRpb25zOiBhbnlbXSA9IFtdO1xuICB1bml0T3B0aW9uczogYW55W10gPSBbXTtcbiAgbWF0ZXJpYWxPcHRpb25zOiBhbnlbXSA9IFtdO1xuICBqY29kZU9wdGlvbnM6IGFueVtdID0gW107XG4gIGRyaXZlck9wdGlvbjogYW55W10gPSBbXTtcbiAgdHJ1Y2tpbmdDb21wYW5heU9wdGlvbjogYW55W10gPSBbXTtcbiAgcm91dGVOYW1lT3B0aW9uczogYW55W10gPSBbXTtcbiAgcHVibGljIHByZXZlbnRuYXZDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgbmF2Q2hhbmdlT2JzZXJ2ZSA9IHRoaXMucHJldmVudG5hdkNoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgY2xlYXJWaWV3Um91dGVmb3JKb2JDb2RlID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIGNsZWFyVmlld1JvdXRlZm9ySm9iQ29kZU9ic2VydmUgPSB0aGlzLmNsZWFyVmlld1JvdXRlZm9ySm9iQ29kZS5hc09ic2VydmFibGUoKTtcbiAgcHJlVmVudEpvYmRldGFpbGNsb3NlID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIGdldHByZVZlbnRKb2JkZXRhaWxjbG9zZSA9IHRoaXMucHJlVmVudEpvYmRldGFpbGNsb3NlLmFzT2JzZXJ2YWJsZSgpO1xuICByb3V0ZURldGFpbHNVdGlsaXR5ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7fSk7XG4gIGdldHJvdXRlRGV0YWlsc1V0aWxpdHkgPSB0aGlzLnJvdXRlRGV0YWlsc1V0aWxpdHkuYXNPYnNlcnZhYmxlKCk7XG4gIHJlbW92ZU1hcEVudGl0eSA9IG5ldyBCZWhhdmlvclN1YmplY3Qoe30pO1xuICByZW1vdmVNYXBFbnRpdHlVdGlsaXR5ID0gdGhpcy5yZW1vdmVNYXBFbnRpdHkuYXNPYnNlcnZhYmxlKCk7XG4gIGRpY3QgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICB1bml0c0xpc3Q6IGFueTtcbiAgbWF0ZXJpYWxzTGlzdDogYW55O1xuICBjdXN0b21lcnNMaXN0OiBhbnk7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBodHRwOiBIdHRwQ2xpZW50LCBwdWJsaWMgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIEBJbmplY3QoJ21lbWJlckRhdGEnKSBwcml2YXRlIGNvbmZpZzogQ29vbG1hcENvbmZpZ01vZGVsKSB7XG4gICAgdGhpcy5hbmFseXRpY3NSRVNUVVJMID0gY29uZmlnLmFuYWx5dGljc1JFU1RVUkw7XG4gICAgdGhpcy5SRVNUVVJMUHJlZml4ID0gY29uZmlnLlJFU1RVUkxQcmVmaXg7XG4gIH1cbiAgZ2V0RGF0ZUZvcm1hdChzdHJWYWw6IERhdGUgfCBudWxsLCBzZXByYXRlcj86IHN0cmluZykge1xuICAgIHNlcHJhdGVyID0gc2VwcmF0ZXIgPyBzZXByYXRlciA6ICctJztcbiAgICBjb25zdCBteWRhdGUgPSBzdHJWYWw7XG4gICAgcmV0dXJuIG15ZGF0ZT8uZ2V0RnVsbFllYXIoKSArIHNlcHJhdGVyICsgKChteWRhdGUgPyBteWRhdGUuZ2V0TW9udGgoKSA6IDApICsgMSkgKyBzZXByYXRlciArIG15ZGF0ZT8uZ2V0RGF0ZSgpO1xuICB9XG4gIGdldERhdGEocGF0aDogc3RyaW5nKSB7IHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuYW5hbHl0aWNzUkVTVFVSTH0ke3RoaXMuY29uZmlnLnJlcG9zaXRvcnl9LyR7cGF0aH1gKSB9XG4gIHBvc3RkYXRhKHBhdGg6IHN0cmluZywgZGF0YTogYW55KSB7IHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmFuYWx5dGljc1JFU1RVUkx9JHt0aGlzLmNvbmZpZy5yZXBvc2l0b3J5fS8ke3BhdGh9YCwgZGF0YSkgfVxuICBwb3N0RGF0YVdpdGhSZXN0VXJsKHBhdGg6IHN0cmluZywgZGF0YTogYW55KSB7IHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLlJFU1RVUkxQcmVmaXh9JHtwYXRofWAsIGRhdGEpIH1cbiAgZmV0Y2hBdXRvQ29tcGxldGVMb2NhdGlvbnMoa2V5d29yZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYGh0dHBzOi8vYXBpLm1hcGJveC5jb20vZ2VvY29kaW5nL3Y1L21hcGJveC5wbGFjZXMvJHtrZXl3b3JkfS5qc29uP2FjY2Vzc190b2tlbj1way5leUoxSWpvaWMyRnVkR0Z1ZFMxdloyMWhJaXdpWVNJNkltTnNPR1EwY0RWck5qQXdlVE16YjNSbWRHOWllVFU1WkRraWZRLkk2WlM3bVZpWllTdkJvNHp6LW1HUVEmY291bnRyeT1VU2ApXG4gIH1cbiAgb3BlblNuYWNrQmFyKG1lc3NhZ2U6IHN0cmluZywgY2xhc3NOYW1lPzogc3RyaW5nKSB7XG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKG1lc3NhZ2UsICcnLCB7XG4gICAgICBkdXJhdGlvbjogNTAwMCwgdmVydGljYWxQb3NpdGlvbjogJ3RvcCcsIGhvcml6b250YWxQb3NpdGlvbjogJ2NlbnRlcicsIHBhbmVsQ2xhc3M6IFtjbGFzc05hbWUgPyBjbGFzc05hbWUgOiAnZGVmYXVsdCddXG4gICAgfSk7XG4gIH1cblxuICBtYWtlT3B0aW9ucyhpdGVtOiBSb3V0ZSkge1xuICAgIGlmIChpdGVtLm9yZGVyX251bWJlcikge1xuICAgICAgKHRoaXMuamNvZGVPcHRpb25zLmZpbmRJbmRleCgoZWxlbSkgPT4gZWxlbS5qb2JfaWQgPT09IGl0ZW0uam9iX2lkKSA9PT0gLTEpID8gdGhpcy5qY29kZU9wdGlvbnMucHVzaCh7IGpvYl9jb2RlOiBpdGVtLm9yZGVyX251bWJlciwgam9iX2lkOiBpdGVtLmpvYl9pZCB9KSA6IG51bGw7XG4gICAgICBpZiAoaXRlbS5kcml2ZXJfbGlzdCAmJiBpdGVtLmRyaXZlcl9saXN0Py5sZW5ndGggPiAwKSB7XG4gICAgICAgIGl0ZW0uZHJpdmVyX2xpc3QuZm9yRWFjaCgoZHJpdmVyKSA9PiB7XG4gICAgICAgICAgdGhpcy5kcml2ZXJPcHRpb24uZmluZEluZGV4KGVsZW0gPT4gZWxlbSA9PT0gZHJpdmVyWydkcml2ZXJfbmFtZSddKSA9PT0gLTEgPyB0aGlzLmRyaXZlck9wdGlvbi5wdXNoKGRyaXZlclsnZHJpdmVyX25hbWUnXSkgOiBudWxsO1xuICAgICAgICAgIHRoaXMudHJ1Y2tpbmdDb21wYW5heU9wdGlvbi5maW5kSW5kZXgoZWxlbSA9PiBlbGVtID09PSBkcml2ZXJbJ3RydWNraW5nX2NvbXBhbnknXSkgPT09IC0xID8gdGhpcy50cnVja2luZ0NvbXBhbmF5T3B0aW9uLnB1c2goZHJpdmVyWyd0cnVja2luZ19jb21wYW55J10pIDogbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgICgodGhpcy5waWNrdXBPcHRpb25zLmZpbmRJbmRleCgoZWxlbSkgPT4gZWxlbSA9PT0gaXRlbS5waWNrdXBfbG9jYXRpb24pKSA9PT0gLTEpID8gdGhpcy5waWNrdXBPcHRpb25zLnB1c2goaXRlbS5waWNrdXBfbG9jYXRpb24pIDogbnVsbDtcbiAgICAoKHRoaXMuZGVzdE9wdGlvbnMuZmluZEluZGV4KChlbGVtKSA9PiBlbGVtID09PSBpdGVtLmRlbGl2ZXJ5X2xvY2F0aW9uKSkgPT09IC0xKSA/IHRoaXMuZGVzdE9wdGlvbnMucHVzaChpdGVtLmRlbGl2ZXJ5X2xvY2F0aW9uKSA6IG51bGw7XG4gICAgKHRoaXMuY3VzdG9tZXJPcHRpb25zLmZpbmRJbmRleCgoY3VzdG9tZXIpID0+IGN1c3RvbWVyID09PSBpdGVtLmN1c3RvbWVyX25hbWUpID09PSAtMSkgPyB0aGlzLmN1c3RvbWVyT3B0aW9ucy5wdXNoKGl0ZW0uY3VzdG9tZXJfbmFtZSkgOiBudWxsO1xuICAgICh0aGlzLnVuaXRPcHRpb25zLmZpbmRJbmRleCgoZWxlbSkgPT4gZWxlbSA9PT0gaXRlbS51bml0KSA9PT0gLTEpID8gdGhpcy51bml0T3B0aW9ucy5wdXNoKGl0ZW0udW5pdCkgOiBudWxsO1xuICAgICh0aGlzLm1hdGVyaWFsT3B0aW9ucy5maW5kSW5kZXgoKGVsZW0pID0+IGVsZW0gPT09IGl0ZW0ubWF0ZXJpYWwpID09PSAtMSkgPyB0aGlzLm1hdGVyaWFsT3B0aW9ucy5wdXNoKGl0ZW0ubWF0ZXJpYWwpIDogbnVsbDtcbiAgICBpZiAoaXRlbS5yb3V0ZV9uYW1lKSB0aGlzLnJvdXRlTmFtZU9wdGlvbnMuZmluZEluZGV4KGVsZW0gPT4gZWxlbSA9PT0gaXRlbS5yb3V0ZV9uYW1lKSA9PT0gLTEgPyB0aGlzLnJvdXRlTmFtZU9wdGlvbnMucHVzaChpdGVtLnJvdXRlX25hbWUpIDogbnVsbDtcbiAgfVxuXG4gIGZpbHRlcih2YWx1ZTogc3RyaW5nLCBmaWx0ZXJzOiBhbnkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgeyByZXR1cm4gW10gfVxuICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoZmlsdGVyVmFsdWUgPT09ICcnKSB7IHJldHVybiBbXSB9XG4gICAgY29uc3Qgc2VhcmNoUmVzdWx0czogYW55W10gPSBbXTtcbiAgICB0aGlzLnVuaXRPcHRpb25zLm1hcCh1bml0ID0+IHtcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcInVuaXRcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmN1c3RvbWVyT3B0aW9ucy5tYXAodW5pdCA9PiB7XG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJjdXN0b21lclwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubWF0ZXJpYWxPcHRpb25zLm1hcCh1bml0ID0+IHtcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcIm1hdGVyaWFsXCIsIFwibGFiZWxcIjogdW5pdCwgXCJ2YWx1ZVwiOiB1bml0IH0pXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5waWNrdXBPcHRpb25zLm1hcCh1bml0ID0+IHtcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcInBpY2t1cCBsb2NhdGlvblwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZGVzdE9wdGlvbnMubWFwKHVuaXQgPT4ge1xuICAgICAgaWYgKHVuaXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcbiAgICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHsgXCJ0eXBlXCI6IFwiZGVzdGluYXRpb24gbG9jYXRpb25cIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmpjb2RlT3B0aW9ucy5tYXAodW5pdCA9PiB7XG4gICAgICBpZiAodW5pdC5qb2JfY29kZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJqb2JcIiwgXCJsYWJlbFwiOiB1bml0Wydqb2JfY29kZSddLCBcInZhbHVlXCI6IHVuaXQgfSlcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmRyaXZlck9wdGlvbi5tYXAodW5pdCA9PiB7XG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJEcml2ZXJcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudHJ1Y2tpbmdDb21wYW5heU9wdGlvbi5tYXAodW5pdCA9PiB7XG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJUcnVja2luZyBDb21wYW55XCIsIFwibGFiZWxcIjogdW5pdCwgXCJ2YWx1ZVwiOiB1bml0IH0pXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZU5hbWVPcHRpb25zLm1hcCh1bml0ID0+IHtcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcIlJvdXRlIG5hbWVcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzZWFyY2hEaWN0OiBhbnkgPSB7fVxuICAgIGZpbHRlcnMubWFwKChmaWx0ZXI6IHsgW3g6IHN0cmluZ106IGFueTsgfSkgPT4ge1xuICAgICAgc2VhcmNoRGljdFtmaWx0ZXJbJ25hbWUnXSArIGZpbHRlclsndHlwZSddXSA9IGZpbHRlcjtcbiAgICB9KVxuICAgIGNvbnN0IGZ1cnRoZXJGaWx0ZXI6IGFueVtdID0gW107XG4gICAgc2VhcmNoUmVzdWx0cy5tYXAoc2VhcmNoID0+IHtcbiAgICAgIGlmICgoc2VhcmNoWydsYWJlbCddICsgc2VhcmNoWyd0eXBlJ10pIGluIHNlYXJjaERpY3QpIHsgfVxuICAgICAgZWxzZSB7IGZ1cnRoZXJGaWx0ZXIucHVzaChzZWFyY2gpIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnVydGhlckZpbHRlcjtcbiAgfVxuXG4gIGdldFNlYXJjaFJlc3VsdHMobGlzdDogUm91dGVbXSwgZmlsdGVydmFsOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBsaXN0LmZpbHRlcihlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdF9saXN0X2Jvb2xlYW4gPSBbXVxuICAgICAgaWYgKGZpbHRlcnZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ3VuaXQnKSB7XG4gICAgICAgICAgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVtZW50W2ZpbHRlcnZhbFswXVsndHlwZSddIGFzIGtleW9mIFJvdXRlXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlcnZhbFswXVsndHlwZSddID09PSAnY3VzdG9tZXInKSB7XG4gICAgICAgICAgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVtZW50WydjdXN0b21lcl9uYW1lJ10pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ21hdGVyaWFsJykge1xuICAgICAgICAgIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaChmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlbWVudFtmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSBhcyBrZXlvZiBSb3V0ZV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ3BpY2t1cCBsb2NhdGlvbicpIHtcbiAgICAgICAgICByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2goZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZW1lbnRbJ3BpY2t1cF9sb2NhdGlvbiddKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdkZXN0aW5hdGlvbiBsb2NhdGlvbicpIHtcbiAgICAgICAgICByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2goZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZW1lbnRbJ2RlbGl2ZXJ5X2xvY2F0aW9uJ10pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ2pvYicpIHtcbiAgICAgICAgICByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2goZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZW1lbnRbJ29yZGVyX251bWJlciddKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdSb3V0ZSBuYW1lJykge1xuICAgICAgICAgIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaChmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlbWVudFsncm91dGVfbmFtZSddKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdEcml2ZXInKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBlbGVtZW50LmRyaXZlcl9saXN0Py5maW5kSW5kZXgoZWxlID0+IHsgcmV0dXJuIGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVbJ2RyaXZlcl9uYW1lJ10gfSk7XG4gICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ1RydWNraW5nIENvbXBhbnknKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBlbGVtZW50LmRyaXZlcl9saXN0Py5maW5kSW5kZXgoZWxlID0+IHsgcmV0dXJuIGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVbJ3RydWNraW5nX2NvbXBhbnknXSB9KTtcbiAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2godHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHRfbGlzdF9ib29sZWFuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdF9saXN0X2Jvb2xlYW4ucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICYmIGN1cnIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJPcHRpb25zKCkge1xuICAgIHRoaXMucGlja3VwT3B0aW9ucyA9IFtdO1xuICAgIHRoaXMuZGVzdE9wdGlvbnMgPSBbXTtcbiAgICB0aGlzLm93bmVyT3B0aW9ucyA9IFtdO1xuICAgIHRoaXMuY3VzdG9tZXJPcHRpb25zID0gW107XG4gICAgdGhpcy51bml0T3B0aW9ucyA9IFtdO1xuICAgIHRoaXMubWF0ZXJpYWxPcHRpb25zID0gW107XG4gICAgdGhpcy5qY29kZU9wdGlvbnMgPSBbXTtcbiAgICB0aGlzLnJvdXRlTmFtZU9wdGlvbnMgPSBbXTtcbiAgfVxuICBzZXRkaWN0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRpY3Quc2V0KGtleSwgdmFsdWUpO1xuICB9XG4gIGdldGRpY3RWYWx1ZShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGljdC5nZXQoa2V5KSk7XG4gIH1cbiAgcmVtb3ZlZGljdFZhbHVlKGtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5kaWN0LmRlbGV0ZShrZXkpO1xuICB9XG4gIGNvbnZleVNlYXJjaEljb24odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlKSAhPT0gJ29iamVjdCcpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGZldGNoVW5pdHNMaXN0KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMudW5pdHNMaXN0KSB7XG4gICAgICAgIHRoaXMuZ2V0RGF0YSgndW5pdC9saXN0L3ZpZXcnKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcykgeyB0aGlzLnVuaXRzTGlzdCA9IHJlcy5kYXRhOyByZXNvbHZlKHRoaXMudW5pdHNMaXN0KTsgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnVuaXRzTGlzdCk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZldGNoTWF0ZXJpYWxzTGlzdCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm1hdGVyaWFsc0xpc3QpIHtcbiAgICAgICAgdGhpcy5nZXREYXRhKCdtYXRlcmlhbC9saXN0L3ZpZXcnKS5zdWJzY3JpYmUoKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHJlcy5kYXRhLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBhLm1hdGVyaWFsLmxvY2FsZUNvbXBhcmUoYi5tYXRlcmlhbCkpXG4gICAgICAgICAgdGhpcy5tYXRlcmlhbHNMaXN0ID0gcmVzLmRhdGFcbiAgICAgICAgICByZXNvbHZlKHRoaXMubWF0ZXJpYWxzTGlzdCk7XG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLm1hdGVyaWFsc0xpc3QpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmZXRjaEN1c3RvbWVyc0xpc3QoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5jdXN0b21lcnNMaXN0KSB7XG4gICAgICAgIHRoaXMuZ2V0RGF0YSgnY29tcGFueS9saXN0L3ZpZXcnKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcykgeyB0aGlzLmN1c3RvbWVyc0xpc3QgPSByZXMuZGF0YTsgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLmN1c3RvbWVyc0xpc3QpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cbn0iXX0=
1
+ import { Injectable, Inject } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common/http";
5
+ import * as i2 from "@angular/material/snack-bar";
6
+ import * as i3 from "./data-model";
7
+ export class UtilsService {
8
+ constructor(http, snackBar, config) {
9
+ this.http = http;
10
+ this.snackBar = snackBar;
11
+ this.config = config;
12
+ this.analyticsRESTURL = '';
13
+ this.RESTURLPrefix = '';
14
+ this.pickupOptions = [];
15
+ this.destOptions = [];
16
+ this.ownerOptions = [];
17
+ this.customerOptions = [];
18
+ this.unitOptions = [];
19
+ this.materialOptions = [];
20
+ this.jcodeOptions = [];
21
+ this.driverOption = [];
22
+ this.truckingCompanayOption = [];
23
+ this.routeNameOptions = [];
24
+ this.preventnavChange = new BehaviorSubject(false);
25
+ this.navChangeObserve = this.preventnavChange.asObservable();
26
+ this.clearViewRouteforJobCode = new BehaviorSubject(false);
27
+ this.clearViewRouteforJobCodeObserve = this.clearViewRouteforJobCode.asObservable();
28
+ this.preVentJobdetailclose = new BehaviorSubject(false);
29
+ this.getpreVentJobdetailclose = this.preVentJobdetailclose.asObservable();
30
+ this.routeDetailsUtility = new BehaviorSubject({});
31
+ this.getrouteDetailsUtility = this.routeDetailsUtility.asObservable();
32
+ this.removeMapEntity = new BehaviorSubject({});
33
+ this.removeMapEntityUtility = this.removeMapEntity.asObservable();
34
+ this.dict = new Map();
35
+ this.analyticsRESTURL = config.analyticsRESTURL;
36
+ this.RESTURLPrefix = config.RESTURLPrefix;
37
+ }
38
+ getDateFormat(strVal, seprater) {
39
+ seprater = seprater ? seprater : '-';
40
+ const mydate = strVal;
41
+ return mydate?.getFullYear() + seprater + ((mydate ? mydate.getMonth() : 0) + 1) + seprater + mydate?.getDate();
42
+ }
43
+ getData(path) { return this.http.get(`${this.analyticsRESTURL}${this.config.repository}/${path}`); }
44
+ postdata(path, data) { return this.http.post(`${this.analyticsRESTURL}${this.config.repository}/${path}`, data); }
45
+ postDataWithRestUrl(path, data) { return this.http.post(`${this.RESTURLPrefix}${path}`, data); }
46
+ fetchAutoCompleteLocations(keyword) {
47
+ return this.http.get(`https://api.mapbox.com/geocoding/v5/mapbox.places/${keyword}.json?access_token=pk.eyJ1Ijoic2FudGFudS1vZ21hIiwiYSI6ImNsOGQ0cDVrNjAweTMzb3RmdG9ieTU5ZDkifQ.I6ZS7mViZYSvBo4zz-mGQQ&country=US`);
48
+ }
49
+ openSnackBar(message, className) {
50
+ this.snackBar.open(message, '', {
51
+ duration: 5000, verticalPosition: 'top', horizontalPosition: 'center', panelClass: [className ? className : 'default']
52
+ });
53
+ }
54
+ makeOptions(item) {
55
+ if (item.order_number) {
56
+ (this.jcodeOptions.findIndex((elem) => elem.job_id === item.job_id) === -1) ? this.jcodeOptions.push({ job_code: item.order_number, job_id: item.job_id }) : null;
57
+ if (item.driver_list && item.driver_list?.length > 0) {
58
+ item.driver_list.forEach((driver) => {
59
+ this.driverOption.findIndex(elem => elem === driver['driver_name']) === -1 ? this.driverOption.push(driver['driver_name']) : null;
60
+ this.truckingCompanayOption.findIndex(elem => elem === driver['trucking_company']) === -1 ? this.truckingCompanayOption.push(driver['trucking_company']) : null;
61
+ });
62
+ }
63
+ }
64
+ ((this.pickupOptions.findIndex((elem) => elem === item.pickup_location)) === -1) ? this.pickupOptions.push(item.pickup_location) : null;
65
+ ((this.destOptions.findIndex((elem) => elem === item.delivery_location)) === -1) ? this.destOptions.push(item.delivery_location) : null;
66
+ (this.customerOptions.findIndex((customer) => customer === item.customer_name) === -1) ? this.customerOptions.push(item.customer_name) : null;
67
+ (this.unitOptions.findIndex((elem) => elem === item.unit) === -1) ? this.unitOptions.push(item.unit) : null;
68
+ (this.materialOptions.findIndex((elem) => elem === item.material) === -1) ? this.materialOptions.push(item.material) : null;
69
+ if (item.route_name)
70
+ this.routeNameOptions.findIndex(elem => elem === item.route_name) === -1 ? this.routeNameOptions.push(item.route_name) : null;
71
+ }
72
+ filter(value, filters) {
73
+ if (typeof value !== 'string') {
74
+ return [];
75
+ }
76
+ const filterValue = value.toLowerCase();
77
+ if (filterValue === '') {
78
+ return [];
79
+ }
80
+ const searchResults = [];
81
+ this.unitOptions.map(unit => {
82
+ if (unit.toLowerCase().includes(filterValue)) {
83
+ searchResults.push({ "type": "unit", "label": unit, "value": unit });
84
+ }
85
+ });
86
+ this.customerOptions.map(unit => {
87
+ if (unit.toLowerCase().includes(filterValue)) {
88
+ searchResults.push({ "type": "customer", "label": unit, "value": unit });
89
+ }
90
+ });
91
+ this.materialOptions.map(unit => {
92
+ if (unit.toLowerCase().includes(filterValue)) {
93
+ searchResults.push({ "type": "material", "label": unit, "value": unit });
94
+ }
95
+ });
96
+ this.pickupOptions.map(unit => {
97
+ if (unit.toLowerCase().includes(filterValue)) {
98
+ searchResults.push({ "type": "pickup location", "label": unit, "value": unit });
99
+ }
100
+ });
101
+ this.destOptions.map(unit => {
102
+ if (unit.toLowerCase().includes(filterValue)) {
103
+ searchResults.push({ "type": "destination location", "label": unit, "value": unit });
104
+ }
105
+ });
106
+ this.jcodeOptions.map(unit => {
107
+ if (unit.job_code.toLowerCase().includes(filterValue)) {
108
+ searchResults.push({ "type": "job", "label": unit['job_code'], "value": unit });
109
+ }
110
+ });
111
+ this.driverOption.map(unit => {
112
+ if (unit.toLowerCase().includes(filterValue)) {
113
+ searchResults.push({ "type": "Driver", "label": unit, "value": unit });
114
+ }
115
+ });
116
+ this.truckingCompanayOption.map(unit => {
117
+ if (unit.toLowerCase().includes(filterValue)) {
118
+ searchResults.push({ "type": "Trucking Company", "label": unit, "value": unit });
119
+ }
120
+ });
121
+ this.routeNameOptions.map(unit => {
122
+ if (unit.toLowerCase().includes(filterValue)) {
123
+ searchResults.push({ "type": "Route name", "label": unit, "value": unit });
124
+ }
125
+ });
126
+ const searchDict = {};
127
+ filters.map((filter) => {
128
+ searchDict[filter['name'] + filter['type']] = filter;
129
+ });
130
+ const furtherFilter = [];
131
+ searchResults.map(search => {
132
+ if ((search['label'] + search['type']) in searchDict) { }
133
+ else {
134
+ furtherFilter.push(search);
135
+ }
136
+ });
137
+ return furtherFilter;
138
+ }
139
+ getSearchResults(list, filterval) {
140
+ return list.filter(element => {
141
+ const result_list_boolean = [];
142
+ if (filterval.length > 0) {
143
+ if (filterval[0]['type'] === 'unit') {
144
+ result_list_boolean.push(filterval[0]['name'] === element[filterval[0]['type']]);
145
+ }
146
+ if (filterval[0]['type'] === 'customer') {
147
+ result_list_boolean.push(filterval[0]['name'] === element['customer_name']);
148
+ }
149
+ if (filterval[0]['type'] === 'material') {
150
+ result_list_boolean.push(filterval[0]['name'] === element[filterval[0]['type']]);
151
+ }
152
+ if (filterval[0]['type'] === 'pickup location') {
153
+ result_list_boolean.push(filterval[0]['name'] === element['pickup_location']);
154
+ }
155
+ if (filterval[0]['type'] === 'destination location') {
156
+ result_list_boolean.push(filterval[0]['name'] === element['delivery_location']);
157
+ }
158
+ if (filterval[0]['type'] === 'job') {
159
+ result_list_boolean.push(filterval[0]['name'] === element['order_number']);
160
+ }
161
+ if (filterval[0]['type'] === 'Route name') {
162
+ result_list_boolean.push(filterval[0]['name'] === element['route_name']);
163
+ }
164
+ if (filterval[0]['type'] === 'Driver') {
165
+ const index = element.driver_list?.findIndex(ele => { return filterval[0]['name'] === ele['driver_name']; });
166
+ if (index !== -1)
167
+ result_list_boolean.push(true);
168
+ }
169
+ if (filterval[0]['type'] === 'Trucking Company') {
170
+ const index = element.driver_list?.findIndex(ele => { return filterval[0]['name'] === ele['trucking_company']; });
171
+ if (index !== -1)
172
+ result_list_boolean.push(true);
173
+ }
174
+ }
175
+ if (result_list_boolean.length > 0) {
176
+ return result_list_boolean.reduce((prev, curr) => prev && curr);
177
+ }
178
+ return false;
179
+ });
180
+ }
181
+ clearOptions() {
182
+ this.pickupOptions = [];
183
+ this.destOptions = [];
184
+ this.ownerOptions = [];
185
+ this.customerOptions = [];
186
+ this.unitOptions = [];
187
+ this.materialOptions = [];
188
+ this.jcodeOptions = [];
189
+ this.routeNameOptions = [];
190
+ }
191
+ setdictValue(key, value) {
192
+ this.dict.set(key, value);
193
+ }
194
+ getdictValue(key) {
195
+ return JSON.parse(this.dict.get(key));
196
+ }
197
+ removedictValue(key) {
198
+ this.dict.delete(key);
199
+ }
200
+ conveySearchIcon(value) {
201
+ if (value && typeof (value) !== 'object')
202
+ return true;
203
+ return false;
204
+ }
205
+ fetchUnitsList() {
206
+ return new Promise((resolve, reject) => {
207
+ if (!this.unitsList) {
208
+ this.getData('unit/list/view').subscribe((res) => {
209
+ if (res) {
210
+ this.unitsList = res.data;
211
+ resolve(this.unitsList);
212
+ }
213
+ });
214
+ }
215
+ else {
216
+ resolve(this.unitsList);
217
+ }
218
+ });
219
+ }
220
+ fetchMaterialsList() {
221
+ return new Promise((resolve, reject) => {
222
+ if (!this.materialsList) {
223
+ this.getData('material/list/view').subscribe(((res) => {
224
+ res.data.sort((a, b) => a.material.localeCompare(b.material));
225
+ this.materialsList = res.data;
226
+ resolve(this.materialsList);
227
+ }));
228
+ }
229
+ else {
230
+ resolve(this.materialsList);
231
+ }
232
+ });
233
+ }
234
+ fetchCustomersList() {
235
+ return new Promise((resolve, reject) => {
236
+ if (!this.customersList) {
237
+ this.getData('company/list/view').subscribe((res) => {
238
+ if (res) {
239
+ this.customersList = res.data;
240
+ resolve(this.customersList);
241
+ }
242
+ });
243
+ }
244
+ else {
245
+ resolve(this.customersList);
246
+ }
247
+ });
248
+ }
249
+ }
250
+ UtilsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: UtilsService, deps: [{ token: i1.HttpClient }, { token: i2.MatSnackBar }, { token: 'memberData' }], target: i0.ɵɵFactoryTarget.Injectable });
251
+ UtilsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: UtilsService, providedIn: 'root' });
252
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: UtilsService, decorators: [{
253
+ type: Injectable,
254
+ args: [{ providedIn: 'root' }]
255
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.MatSnackBar }, { type: i3.CoolmapConfigModel, decorators: [{
256
+ type: Inject,
257
+ args: ['memberData']
258
+ }] }]; } });
259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvb2xtYXAtc2VydmljZXMvc3JjL2xpYi9zZXJ2aWNlL3V0aWxzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGVBQWUsRUFBYSxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFJbEQsTUFBTSxPQUFPLFlBQVk7SUEyQnZCLFlBQW1CLElBQWdCLEVBQVMsUUFBcUIsRUFDakMsTUFBMEI7UUFEdkMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFTLGFBQVEsR0FBUixRQUFRLENBQWE7UUFDakMsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUEzQjFELHFCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUN0QixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQUMxQixnQkFBVyxHQUFVLEVBQUUsQ0FBQztRQUN4QixpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6QixvQkFBZSxHQUFVLEVBQUUsQ0FBQztRQUM1QixnQkFBVyxHQUFVLEVBQUUsQ0FBQztRQUN4QixvQkFBZSxHQUFVLEVBQUUsQ0FBQztRQUM1QixpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6QixpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6QiwyQkFBc0IsR0FBVSxFQUFFLENBQUM7UUFDbkMscUJBQWdCLEdBQVUsRUFBRSxDQUFDO1FBQ3RCLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JELHFCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4RCw2QkFBd0IsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxvQ0FBK0IsR0FBRyxJ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QUNIO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDN0I7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7O3lHQXRPVSxZQUFZLHVFQTRCYixZQUFZOzZHQTVCWCxZQUFZLGNBREMsTUFBTTsyRkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQTZCN0IsTUFBTTsyQkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29vbG1hcENvbmZpZ01vZGVsLCBSb3V0ZSB9IGZyb20gJy4vZGF0YS1tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgVXRpbHNTZXJ2aWNlIHtcclxuICBhbmFseXRpY3NSRVNUVVJMID0gJyc7XHJcbiAgUkVTVFVSTFByZWZpeCA9ICcnO1xyXG4gIHBpY2t1cE9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgZGVzdE9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgb3duZXJPcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIGN1c3RvbWVyT3B0aW9uczogYW55W10gPSBbXTtcclxuICB1bml0T3B0aW9uczogYW55W10gPSBbXTtcclxuICBtYXRlcmlhbE9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgamNvZGVPcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIGRyaXZlck9wdGlvbjogYW55W10gPSBbXTtcclxuICB0cnVja2luZ0NvbXBhbmF5T3B0aW9uOiBhbnlbXSA9IFtdO1xyXG4gIHJvdXRlTmFtZU9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgcHVibGljIHByZXZlbnRuYXZDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcclxuICBuYXZDaGFuZ2VPYnNlcnZlID0gdGhpcy5wcmV2ZW50bmF2Q2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIGNsZWFyVmlld1JvdXRlZm9ySm9iQ29kZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xyXG4gIGNsZWFyVmlld1JvdXRlZm9ySm9iQ29kZU9ic2VydmUgPSB0aGlzLmNsZWFyVmlld1JvdXRlZm9ySm9iQ29kZS5hc09ic2VydmFibGUoKTtcclxuICBwcmVWZW50Sm9iZGV0YWlsY2xvc2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcclxuICBnZXRwcmVWZW50Sm9iZGV0YWlsY2xvc2UgPSB0aGlzLnByZVZlbnRKb2JkZXRhaWxjbG9zZS5hc09ic2VydmFibGUoKTtcclxuICByb3V0ZURldGFpbHNVdGlsaXR5ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7fSk7XHJcbiAgZ2V0cm91dGVEZXRhaWxzVXRpbGl0eSA9IHRoaXMucm91dGVEZXRhaWxzVXRpbGl0eS5hc09ic2VydmFibGUoKTtcclxuICByZW1vdmVNYXBFbnRpdHkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTtcclxuICByZW1vdmVNYXBFbnRpdHlVdGlsaXR5ID0gdGhpcy5yZW1vdmVNYXBFbnRpdHkuYXNPYnNlcnZhYmxlKCk7XHJcbiAgZGljdCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgdW5pdHNMaXN0OiBhbnk7XHJcbiAgbWF0ZXJpYWxzTGlzdDogYW55O1xyXG4gIGN1c3RvbWVyc0xpc3Q6IGFueTtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgaHR0cDogSHR0cENsaWVudCwgcHVibGljIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcclxuICAgIEBJbmplY3QoJ21lbWJlckRhdGEnKSBwcml2YXRlIGNvbmZpZzogQ29vbG1hcENvbmZpZ01vZGVsKSB7XHJcbiAgICB0aGlzLmFuYWx5dGljc1JFU1RVUkwgPSBjb25maWcuYW5hbHl0aWNzUkVTVFVSTDtcclxuICAgIHRoaXMuUkVTVFVSTFByZWZpeCA9IGNvbmZpZy5SRVNUVVJMUHJlZml4O1xyXG4gIH1cclxuICBnZXREYXRlRm9ybWF0KHN0clZhbDogRGF0ZSB8IG51bGwsIHNlcHJhdGVyPzogc3RyaW5nKSB7XHJcbiAgICBzZXByYXRlciA9IHNlcHJhdGVyID8gc2VwcmF0ZXIgOiAnLSc7XHJcbiAgICBjb25zdCBteWRhdGUgPSBzdHJWYWw7XHJcbiAgICByZXR1cm4gbXlkYXRlPy5nZXRGdWxsWWVhcigpICsgc2VwcmF0ZXIgKyAoKG15ZGF0ZSA/IG15ZGF0ZS5nZXRNb250aCgpIDogMCkgKyAxKSArIHNlcHJhdGVyICsgbXlkYXRlPy5nZXREYXRlKCk7XHJcbiAgfVxyXG4gIGdldERhdGEocGF0aDogc3RyaW5nKSB7IHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuYW5hbHl0aWNzUkVTVFVSTH0ke3RoaXMuY29uZmlnLnJlcG9zaXRvcnl9LyR7cGF0aH1gKSB9XHJcbiAgcG9zdGRhdGEocGF0aDogc3RyaW5nLCBkYXRhOiBhbnkpIHsgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYW5hbHl0aWNzUkVTVFVSTH0ke3RoaXMuY29uZmlnLnJlcG9zaXRvcnl9LyR7cGF0aH1gLCBkYXRhKSB9XHJcbiAgcG9zdERhdGFXaXRoUmVzdFVybChwYXRoOiBzdHJpbmcsIGRhdGE6IGFueSkgeyByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5SRVNUVVJMUHJlZml4fSR7cGF0aH1gLCBkYXRhKSB9XHJcbiAgZmV0Y2hBdXRvQ29tcGxldGVMb2NhdGlvbnMoa2V5d29yZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChgaHR0cHM6Ly9hcGkubWFwYm94LmNvbS9nZW9jb2RpbmcvdjUvbWFwYm94LnBsYWNlcy8ke2tleXdvcmR9Lmpzb24/YWNjZXNzX3Rva2VuPXBrLmV5SjFJam9pYzJGdWRHRnVkUzF2WjIxaElpd2lZU0k2SW1Oc09HUTBjRFZyTmpBd2VUTXpiM1JtZEc5aWVUVTVaRGtpZlEuSTZaUzdtVmlaWVN2Qm80enotbUdRUSZjb3VudHJ5PVVTYClcclxuICB9XHJcbiAgb3BlblNuYWNrQmFyKG1lc3NhZ2U6IHN0cmluZywgY2xhc3NOYW1lPzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNuYWNrQmFyLm9wZW4obWVzc2FnZSwgJycsIHtcclxuICAgICAgZHVyYXRpb246IDUwMDAsIHZlcnRpY2FsUG9zaXRpb246ICd0b3AnLCBob3Jpem9udGFsUG9zaXRpb246ICdjZW50ZXInLCBwYW5lbENsYXNzOiBbY2xhc3NOYW1lID8gY2xhc3NOYW1lIDogJ2RlZmF1bHQnXVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBtYWtlT3B0aW9ucyhpdGVtOiBSb3V0ZSkge1xyXG4gICAgaWYgKGl0ZW0ub3JkZXJfbnVtYmVyKSB7XHJcbiAgICAgICh0aGlzLmpjb2RlT3B0aW9ucy5maW5kSW5kZXgoKGVsZW0pID0+IGVsZW0uam9iX2lkID09PSBpdGVtLmpvYl9pZCkgPT09IC0xKSA/IHRoaXMuamNvZGVPcHRpb25zLnB1c2goeyBqb2JfY29kZTogaXRlbS5vcmRlcl9udW1iZXIsIGpvYl9pZDogaXRlbS5qb2JfaWQgfSkgOiBudWxsO1xyXG4gICAgICBpZiAoaXRlbS5kcml2ZXJfbGlzdCAmJiBpdGVtLmRyaXZlcl9saXN0Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgaXRlbS5kcml2ZXJfbGlzdC5mb3JFYWNoKChkcml2ZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuZHJpdmVyT3B0aW9uLmZpbmRJbmRleChlbGVtID0+IGVsZW0gPT09IGRyaXZlclsnZHJpdmVyX25hbWUnXSkgPT09IC0xID8gdGhpcy5kcml2ZXJPcHRpb24ucHVzaChkcml2ZXJbJ2RyaXZlcl9uYW1lJ10pIDogbnVsbDtcclxuICAgICAgICAgIHRoaXMudHJ1Y2tpbmdDb21wYW5heU9wdGlvbi5maW5kSW5kZXgoZWxlbSA9PiBlbGVtID09PSBkcml2ZXJbJ3RydWNraW5nX2NvbXBhbnknXSkgPT09IC0xID8gdGhpcy50cnVja2luZ0NvbXBhbmF5T3B0aW9uLnB1c2goZHJpdmVyWyd0cnVja2luZ19jb21wYW55J10pIDogbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgKCh0aGlzLnBpY2t1cE9wdGlvbnMuZmluZEluZGV4KChlbGVtKSA9PiBlbGVtID09PSBpdGVtLnBpY2t1cF9sb2NhdGlvbikpID09PSAtMSkgPyB0aGlzLnBpY2t1cE9wdGlvbnMucHVzaChpdGVtLnBpY2t1cF9sb2NhdGlvbikgOiBudWxsO1xyXG4gICAgKCh0aGlzLmRlc3RPcHRpb25zLmZpbmRJbmRleCgoZWxlbSkgPT4gZWxlbSA9PT0gaXRlbS5kZWxpdmVyeV9sb2NhdGlvbikpID09PSAtMSkgPyB0aGlzLmRlc3RPcHRpb25zLnB1c2goaXRlbS5kZWxpdmVyeV9sb2NhdGlvbikgOiBudWxsO1xyXG4gICAgKHRoaXMuY3VzdG9tZXJPcHRpb25zLmZpbmRJbmRleCgoY3VzdG9tZXIpID0+IGN1c3RvbWVyID09PSBpdGVtLmN1c3RvbWVyX25hbWUpID09PSAtMSkgPyB0aGlzLmN1c3RvbWVyT3B0aW9ucy5wdXNoKGl0ZW0uY3VzdG9tZXJfbmFtZSkgOiBudWxsO1xyXG4gICAgKHRoaXMudW5pdE9wdGlvbnMuZmluZEluZGV4KChlbGVtKSA9PiBlbGVtID09PSBpdGVtLnVuaXQpID09PSAtMSkgPyB0aGlzLnVuaXRPcHRpb25zLnB1c2goaXRlbS51bml0KSA6IG51bGw7XHJcbiAgICAodGhpcy5tYXRlcmlhbE9wdGlvbnMuZmluZEluZGV4KChlbGVtKSA9PiBlbGVtID09PSBpdGVtLm1hdGVyaWFsKSA9PT0gLTEpID8gdGhpcy5tYXRlcmlhbE9wdGlvbnMucHVzaChpdGVtLm1hdGVyaWFsKSA6IG51bGw7XHJcbiAgICBpZiAoaXRlbS5yb3V0ZV9uYW1lKSB0aGlzLnJvdXRlTmFtZU9wdGlvbnMuZmluZEluZGV4KGVsZW0gPT4gZWxlbSA9PT0gaXRlbS5yb3V0ZV9uYW1lKSA9PT0gLTEgPyB0aGlzLnJvdXRlTmFtZU9wdGlvbnMucHVzaChpdGVtLnJvdXRlX25hbWUpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGZpbHRlcih2YWx1ZTogc3RyaW5nLCBmaWx0ZXJzOiBhbnkpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7IHJldHVybiBbXSB9XHJcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAoZmlsdGVyVmFsdWUgPT09ICcnKSB7IHJldHVybiBbXSB9XHJcbiAgICBjb25zdCBzZWFyY2hSZXN1bHRzOiBhbnlbXSA9IFtdO1xyXG4gICAgdGhpcy51bml0T3B0aW9ucy5tYXAodW5pdCA9PiB7XHJcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XHJcbiAgICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHsgXCJ0eXBlXCI6IFwidW5pdFwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuY3VzdG9tZXJPcHRpb25zLm1hcCh1bml0ID0+IHtcclxuICAgICAgaWYgKHVuaXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcclxuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJjdXN0b21lclwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMubWF0ZXJpYWxPcHRpb25zLm1hcCh1bml0ID0+IHtcclxuICAgICAgaWYgKHVuaXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcclxuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJtYXRlcmlhbFwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMucGlja3VwT3B0aW9ucy5tYXAodW5pdCA9PiB7XHJcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XHJcbiAgICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHsgXCJ0eXBlXCI6IFwicGlja3VwIGxvY2F0aW9uXCIsIFwibGFiZWxcIjogdW5pdCwgXCJ2YWx1ZVwiOiB1bml0IH0pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5kZXN0T3B0aW9ucy5tYXAodW5pdCA9PiB7XHJcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XHJcbiAgICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHsgXCJ0eXBlXCI6IFwiZGVzdGluYXRpb24gbG9jYXRpb25cIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmpjb2RlT3B0aW9ucy5tYXAodW5pdCA9PiB7XHJcbiAgICAgIGlmICh1bml0LmpvYl9jb2RlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XHJcbiAgICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHsgXCJ0eXBlXCI6IFwiam9iXCIsIFwibGFiZWxcIjogdW5pdFsnam9iX2NvZGUnXSwgXCJ2YWx1ZVwiOiB1bml0IH0pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5kcml2ZXJPcHRpb24ubWFwKHVuaXQgPT4ge1xyXG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xyXG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcIkRyaXZlclwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnRydWNraW5nQ29tcGFuYXlPcHRpb24ubWFwKHVuaXQgPT4ge1xyXG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xyXG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcIlRydWNraW5nIENvbXBhbnlcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJvdXRlTmFtZU9wdGlvbnMubWFwKHVuaXQgPT4ge1xyXG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xyXG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcIlJvdXRlIG5hbWVcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBzZWFyY2hEaWN0OiBhbnkgPSB7fVxyXG4gICAgZmlsdGVycy5tYXAoKGZpbHRlcjogeyBbeDogc3RyaW5nXTogYW55OyB9KSA9PiB7XHJcbiAgICAgIHNlYXJjaERpY3RbZmlsdGVyWyduYW1lJ10gKyBmaWx0ZXJbJ3R5cGUnXV0gPSBmaWx0ZXI7XHJcbiAgICB9KVxyXG4gICAgY29uc3QgZnVydGhlckZpbHRlcjogYW55W10gPSBbXTtcclxuICAgIHNlYXJjaFJlc3VsdHMubWFwKHNlYXJjaCA9PiB7XHJcbiAgICAgIGlmICgoc2VhcmNoWydsYWJlbCddICsgc2VhcmNoWyd0eXBlJ10pIGluIHNlYXJjaERpY3QpIHsgfVxyXG4gICAgICBlbHNlIHsgZnVydGhlckZpbHRlci5wdXNoKHNlYXJjaCkgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnVydGhlckZpbHRlcjtcclxuICB9XHJcblxyXG4gIGdldFNlYXJjaFJlc3VsdHMobGlzdDogUm91dGVbXSwgZmlsdGVydmFsOiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKGVsZW1lbnQgPT4ge1xyXG4gICAgICBjb25zdCByZXN1bHRfbGlzdF9ib29sZWFuID0gW11cclxuICAgICAgaWYgKGZpbHRlcnZhbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgaWYgKGZpbHRlcnZhbFswXVsndHlwZSddID09PSAndW5pdCcpIHtcclxuICAgICAgICAgIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaChmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlbWVudFtmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSBhcyBrZXlvZiBSb3V0ZV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdjdXN0b21lcicpIHtcclxuICAgICAgICAgIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaChmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlbWVudFsnY3VzdG9tZXJfbmFtZSddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlcnZhbFswXVsndHlwZSddID09PSAnbWF0ZXJpYWwnKSB7XHJcbiAgICAgICAgICByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2goZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZW1lbnRbZmlsdGVydmFsWzBdWyd0eXBlJ10gYXMga2V5b2YgUm91dGVdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlcnZhbFswXVsndHlwZSddID09PSAncGlja3VwIGxvY2F0aW9uJykge1xyXG4gICAgICAgICAgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVtZW50WydwaWNrdXBfbG9jYXRpb24nXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ2Rlc3RpbmF0aW9uIGxvY2F0aW9uJykge1xyXG4gICAgICAgICAgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVtZW50WydkZWxpdmVyeV9sb2NhdGlvbiddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlcnZhbFswXVsndHlwZSddID09PSAnam9iJykge1xyXG4gICAgICAgICAgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVtZW50WydvcmRlcl9udW1iZXInXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ1JvdXRlIG5hbWUnKSB7XHJcbiAgICAgICAgICByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2goZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZW1lbnRbJ3JvdXRlX25hbWUnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ0RyaXZlcicpIHtcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gZWxlbWVudC5kcml2ZXJfbGlzdD8uZmluZEluZGV4KGVsZSA9PiB7IHJldHVybiBmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlWydkcml2ZXJfbmFtZSddIH0pO1xyXG4gICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdUcnVja2luZyBDb21wYW55Jykge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBlbGVtZW50LmRyaXZlcl9saXN0Py5maW5kSW5kZXgoZWxlID0+IHsgcmV0dXJuIGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVbJ3RydWNraW5nX2NvbXBhbnknXSB9KTtcclxuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlc3VsdF9saXN0X2Jvb2xlYW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHRfbGlzdF9ib29sZWFuLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldiAmJiBjdXJyKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsZWFyT3B0aW9ucygpIHtcclxuICAgIHRoaXMucGlja3VwT3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5kZXN0T3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5vd25lck9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuY3VzdG9tZXJPcHRpb25zID0gW107XHJcbiAgICB0aGlzLnVuaXRPcHRpb25zID0gW107XHJcbiAgICB0aGlzLm1hdGVyaWFsT3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5qY29kZU9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMucm91dGVOYW1lT3B0aW9ucyA9IFtdO1xyXG4gIH1cclxuICBzZXRkaWN0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGljdC5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgfVxyXG4gIGdldGRpY3RWYWx1ZShrZXk6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5kaWN0LmdldChrZXkpKTtcclxuICB9XHJcbiAgcmVtb3ZlZGljdFZhbHVlKGtleTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRpY3QuZGVsZXRlKGtleSk7XHJcbiAgfVxyXG4gIGNvbnZleVNlYXJjaEljb24odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiAodmFsdWUpICE9PSAnb2JqZWN0JykgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgZmV0Y2hVbml0c0xpc3QoKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMudW5pdHNMaXN0KSB7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCd1bml0L2xpc3QvdmlldycpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMpIHsgdGhpcy51bml0c0xpc3QgPSByZXMuZGF0YTsgcmVzb2x2ZSh0aGlzLnVuaXRzTGlzdCk7IH1cclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUodGhpcy51bml0c0xpc3QpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hNYXRlcmlhbHNMaXN0KCkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLm1hdGVyaWFsc0xpc3QpIHtcclxuICAgICAgICB0aGlzLmdldERhdGEoJ21hdGVyaWFsL2xpc3QvdmlldycpLnN1YnNjcmliZSgoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXMuZGF0YS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gYS5tYXRlcmlhbC5sb2NhbGVDb21wYXJlKGIubWF0ZXJpYWwpKVxyXG4gICAgICAgICAgdGhpcy5tYXRlcmlhbHNMaXN0ID0gcmVzLmRhdGFcclxuICAgICAgICAgIHJlc29sdmUodGhpcy5tYXRlcmlhbHNMaXN0KTtcclxuICAgICAgICB9KSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKHRoaXMubWF0ZXJpYWxzTGlzdCk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBmZXRjaEN1c3RvbWVyc0xpc3QoKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuY3VzdG9tZXJzTGlzdCkge1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgnY29tcGFueS9saXN0L3ZpZXcnKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzKSB7IHRoaXMuY3VzdG9tZXJzTGlzdCA9IHJlcy5kYXRhOyByZXNvbHZlKHRoaXMuY3VzdG9tZXJzTGlzdCk7IH1cclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUodGhpcy5jdXN0b21lcnNMaXN0KTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbn0iXX0=