@aggdirect/coolmap-services 1.1.2 → 1.1.4

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,259 +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=${this.config.mapboxAccessToken}&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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QUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3hJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4SSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDNUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM1SCxJQUFJLElBQUksQ0FB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QUM7cUJBQUU7Z0JBQzFFLENBQUMsQ0FBQyxDQUFBO2FBQ0g7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUM3QjtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQzs7eUdBdE9VLFlBQVksdUVBNEJiLFlBQVk7NkdBNUJYLFlBQVksY0FEQyxNQUFNOzJGQUNuQixZQUFZO2tCQUR4QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBNkI3QixNQUFNOzJCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb29sbWFwQ29uZmlnTW9kZWwsIFJvdXRlIH0gZnJvbSAnLi9kYXRhLW1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBVdGlsc1NlcnZpY2Uge1xyXG4gIGFuYWx5dGljc1JFU1RVUkwgPSAnJztcclxuICBSRVNUVVJMUHJlZml4ID0gJyc7XHJcbiAgcGlja3VwT3B0aW9uczogYW55W10gPSBbXTtcclxuICBkZXN0T3B0aW9uczogYW55W10gPSBbXTtcclxuICBvd25lck9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgY3VzdG9tZXJPcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIHVuaXRPcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIG1hdGVyaWFsT3B0aW9uczogYW55W10gPSBbXTtcclxuICBqY29kZU9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgZHJpdmVyT3B0aW9uOiBhbnlbXSA9IFtdO1xyXG4gIHRydWNraW5nQ29tcGFuYXlPcHRpb246IGFueVtdID0gW107XHJcbiAgcm91dGVOYW1lT3B0aW9uczogYW55W10gPSBbXTtcclxuICBwdWJsaWMgcHJldmVudG5hdkNoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xyXG4gIG5hdkNoYW5nZU9ic2VydmUgPSB0aGlzLnByZXZlbnRuYXZDaGFuZ2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgY2xlYXJWaWV3Um91dGVmb3JKb2JDb2RlID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XHJcbiAgY2xlYXJWaWV3Um91dGVmb3JKb2JDb2RlT2JzZXJ2ZSA9IHRoaXMuY2xlYXJWaWV3Um91dGVmb3JKb2JDb2RlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHByZVZlbnRKb2JkZXRhaWxjbG9zZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xyXG4gIGdldHByZVZlbnRKb2JkZXRhaWxjbG9zZSA9IHRoaXMucHJlVmVudEpvYmRldGFpbGNsb3NlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHJvdXRlRGV0YWlsc1V0aWxpdHkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTtcclxuICBnZXRyb3V0ZURldGFpbHNVdGlsaXR5ID0gdGhpcy5yb3V0ZURldGFpbHNVdGlsaXR5LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHJlbW92ZU1hcEVudGl0eSA9IG5ldyBCZWhhdmlvclN1YmplY3Qoe30pO1xyXG4gIHJlbW92ZU1hcEVudGl0eVV0aWxpdHkgPSB0aGlzLnJlbW92ZU1hcEVudGl0eS5hc09ic2VydmFibGUoKTtcclxuICBkaWN0ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcclxuICB1bml0c0xpc3Q6IGFueTtcclxuICBtYXRlcmlhbHNMaXN0OiBhbnk7XHJcbiAgY3VzdG9tZXJzTGlzdDogYW55O1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBodHRwOiBIdHRwQ2xpZW50LCBwdWJsaWMgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxyXG4gICAgQEluamVjdCgnbWVtYmVyRGF0YScpIHByaXZhdGUgY29uZmlnOiBDb29sbWFwQ29uZmlnTW9kZWwpIHtcclxuICAgIHRoaXMuYW5hbHl0aWNzUkVTVFVSTCA9IGNvbmZpZy5hbmFseXRpY3NSRVNUVVJMO1xyXG4gICAgdGhpcy5SRVNUVVJMUHJlZml4ID0gY29uZmlnLlJFU1RVUkxQcmVmaXg7XHJcbiAgfVxyXG4gIGdldERhdGVGb3JtYXQoc3RyVmFsOiBEYXRlIHwgbnVsbCwgc2VwcmF0ZXI/OiBzdHJpbmcpIHtcclxuICAgIHNlcHJhdGVyID0gc2VwcmF0ZXIgPyBzZXByYXRlciA6ICctJztcclxuICAgIGNvbnN0IG15ZGF0ZSA9IHN0clZhbDtcclxuICAgIHJldHVybiBteWRhdGU/LmdldEZ1bGxZZWFyKCkgKyBzZXByYXRlciArICgobXlkYXRlID8gbXlkYXRlLmdldE1vbnRoKCkgOiAwKSArIDEpICsgc2VwcmF0ZXIgKyBteWRhdGU/LmdldERhdGUoKTtcclxuICB9XHJcbiAgZ2V0RGF0YShwYXRoOiBzdHJpbmcpIHsgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5hbmFseXRpY3NSRVNUVVJMfSR7dGhpcy5jb25maWcucmVwb3NpdG9yeX0vJHtwYXRofWApIH1cclxuICBwb3N0ZGF0YShwYXRoOiBzdHJpbmcsIGRhdGE6IGFueSkgeyByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5hbmFseXRpY3NSRVNUVVJMfSR7dGhpcy5jb25maWcucmVwb3NpdG9yeX0vJHtwYXRofWAsIGRhdGEpIH1cclxuICBwb3N0RGF0YVdpdGhSZXN0VXJsKHBhdGg6IHN0cmluZywgZGF0YTogYW55KSB7IHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLlJFU1RVUkxQcmVmaXh9JHtwYXRofWAsIGRhdGEpIH1cclxuICBmZXRjaEF1dG9Db21wbGV0ZUxvY2F0aW9ucyhrZXl3b3JkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGBodHRwczovL2FwaS5tYXBib3guY29tL2dlb2NvZGluZy92NS9tYXBib3gucGxhY2VzLyR7a2V5d29yZH0uanNvbj9hY2Nlc3NfdG9rZW49JHt0aGlzLmNvbmZpZy5tYXBib3hBY2Nlc3NUb2tlbn0mY291bnRyeT1VU2ApXHJcbiAgfVxyXG4gIG9wZW5TbmFja0JhcihtZXNzYWdlOiBzdHJpbmcsIGNsYXNzTmFtZT86IHN0cmluZykge1xyXG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKG1lc3NhZ2UsICcnLCB7XHJcbiAgICAgIGR1cmF0aW9uOiA1MDAwLCB2ZXJ0aWNhbFBvc2l0aW9uOiAndG9wJywgaG9yaXpvbnRhbFBvc2l0aW9uOiAnY2VudGVyJywgcGFuZWxDbGFzczogW2NsYXNzTmFtZSA/IGNsYXNzTmFtZSA6ICdkZWZhdWx0J11cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbWFrZU9wdGlvbnMoaXRlbTogUm91dGUpIHtcclxuICAgIGlmIChpdGVtLm9yZGVyX251bWJlcikge1xyXG4gICAgICAodGhpcy5qY29kZU9wdGlvbnMuZmluZEluZGV4KChlbGVtKSA9PiBlbGVtLmpvYl9pZCA9PT0gaXRlbS5qb2JfaWQpID09PSAtMSkgPyB0aGlzLmpjb2RlT3B0aW9ucy5wdXNoKHsgam9iX2NvZGU6IGl0ZW0ub3JkZXJfbnVtYmVyLCBqb2JfaWQ6IGl0ZW0uam9iX2lkIH0pIDogbnVsbDtcclxuICAgICAgaWYgKGl0ZW0uZHJpdmVyX2xpc3QgJiYgaXRlbS5kcml2ZXJfbGlzdD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGl0ZW0uZHJpdmVyX2xpc3QuZm9yRWFjaCgoZHJpdmVyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRyaXZlck9wdGlvbi5maW5kSW5kZXgoZWxlbSA9PiBlbGVtID09PSBkcml2ZXJbJ2RyaXZlcl9uYW1lJ10pID09PSAtMSA/IHRoaXMuZHJpdmVyT3B0aW9uLnB1c2goZHJpdmVyWydkcml2ZXJfbmFtZSddKSA6IG51bGw7XHJcbiAgICAgICAgICB0aGlzLnRydWNraW5nQ29tcGFuYXlPcHRpb24uZmluZEluZGV4KGVsZW0gPT4gZWxlbSA9PT0gZHJpdmVyWyd0cnVja2luZ19jb21wYW55J10pID09PSAtMSA/IHRoaXMudHJ1Y2tpbmdDb21wYW5heU9wdGlvbi5wdXNoKGRyaXZlclsndHJ1Y2tpbmdfY29tcGFueSddKSA6IG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgICgodGhpcy5waWNrdXBPcHRpb25zLmZpbmRJbmRleCgoZWxlbSkgPT4gZWxlbSA9PT0gaXRlbS5waWNrdXBfbG9jYXRpb24pKSA9PT0gLTEpID8gdGhpcy5waWNrdXBPcHRpb25zLnB1c2goaXRlbS5waWNrdXBfbG9jYXRpb24pIDogbnVsbDtcclxuICAgICgodGhpcy5kZXN0T3B0aW9ucy5maW5kSW5kZXgoKGVsZW0pID0+IGVsZW0gPT09IGl0ZW0uZGVsaXZlcnlfbG9jYXRpb24pKSA9PT0gLTEpID8gdGhpcy5kZXN0T3B0aW9ucy5wdXNoKGl0ZW0uZGVsaXZlcnlfbG9jYXRpb24pIDogbnVsbDtcclxuICAgICh0aGlzLmN1c3RvbWVyT3B0aW9ucy5maW5kSW5kZXgoKGN1c3RvbWVyKSA9PiBjdXN0b21lciA9PT0gaXRlbS5jdXN0b21lcl9uYW1lKSA9PT0gLTEpID8gdGhpcy5jdXN0b21lck9wdGlvbnMucHVzaChpdGVtLmN1c3RvbWVyX25hbWUpIDogbnVsbDtcclxuICAgICh0aGlzLnVuaXRPcHRpb25zLmZpbmRJbmRleCgoZWxlbSkgPT4gZWxlbSA9PT0gaXRlbS51bml0KSA9PT0gLTEpID8gdGhpcy51bml0T3B0aW9ucy5wdXNoKGl0ZW0udW5pdCkgOiBudWxsO1xyXG4gICAgKHRoaXMubWF0ZXJpYWxPcHRpb25zLmZpbmRJbmRleCgoZWxlbSkgPT4gZWxlbSA9PT0gaXRlbS5tYXRlcmlhbCkgPT09IC0xKSA/IHRoaXMubWF0ZXJpYWxPcHRpb25zLnB1c2goaXRlbS5tYXRlcmlhbCkgOiBudWxsO1xyXG4gICAgaWYgKGl0ZW0ucm91dGVfbmFtZSkgdGhpcy5yb3V0ZU5hbWVPcHRpb25zLmZpbmRJbmRleChlbGVtID0+IGVsZW0gPT09IGl0ZW0ucm91dGVfbmFtZSkgPT09IC0xID8gdGhpcy5yb3V0ZU5hbWVPcHRpb25zLnB1c2goaXRlbS5yb3V0ZV9uYW1lKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXIodmFsdWU6IHN0cmluZywgZmlsdGVyczogYW55KSB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgeyByZXR1cm4gW10gfVxyXG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKGZpbHRlclZhbHVlID09PSAnJykgeyByZXR1cm4gW10gfVxyXG4gICAgY29uc3Qgc2VhcmNoUmVzdWx0czogYW55W10gPSBbXTtcclxuICAgIHRoaXMudW5pdE9wdGlvbnMubWFwKHVuaXQgPT4ge1xyXG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xyXG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcInVuaXRcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmN1c3RvbWVyT3B0aW9ucy5tYXAodW5pdCA9PiB7XHJcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XHJcbiAgICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHsgXCJ0eXBlXCI6IFwiY3VzdG9tZXJcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1hdGVyaWFsT3B0aW9ucy5tYXAodW5pdCA9PiB7XHJcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XHJcbiAgICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHsgXCJ0eXBlXCI6IFwibWF0ZXJpYWxcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnBpY2t1cE9wdGlvbnMubWFwKHVuaXQgPT4ge1xyXG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xyXG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcInBpY2t1cCBsb2NhdGlvblwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGVzdE9wdGlvbnMubWFwKHVuaXQgPT4ge1xyXG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xyXG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcImRlc3RpbmF0aW9uIGxvY2F0aW9uXCIsIFwibGFiZWxcIjogdW5pdCwgXCJ2YWx1ZVwiOiB1bml0IH0pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5qY29kZU9wdGlvbnMubWFwKHVuaXQgPT4ge1xyXG4gICAgICBpZiAodW5pdC5qb2JfY29kZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xyXG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcImpvYlwiLCBcImxhYmVsXCI6IHVuaXRbJ2pvYl9jb2RlJ10sIFwidmFsdWVcIjogdW5pdCB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZHJpdmVyT3B0aW9uLm1hcCh1bml0ID0+IHtcclxuICAgICAgaWYgKHVuaXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcclxuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJEcml2ZXJcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy50cnVja2luZ0NvbXBhbmF5T3B0aW9uLm1hcCh1bml0ID0+IHtcclxuICAgICAgaWYgKHVuaXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcclxuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJUcnVja2luZyBDb21wYW55XCIsIFwibGFiZWxcIjogdW5pdCwgXCJ2YWx1ZVwiOiB1bml0IH0pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5yb3V0ZU5hbWVPcHRpb25zLm1hcCh1bml0ID0+IHtcclxuICAgICAgaWYgKHVuaXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcclxuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJSb3V0ZSBuYW1lXCIsIFwibGFiZWxcIjogdW5pdCwgXCJ2YWx1ZVwiOiB1bml0IH0pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgY29uc3Qgc2VhcmNoRGljdDogYW55ID0ge31cclxuICAgIGZpbHRlcnMubWFwKChmaWx0ZXI6IHsgW3g6IHN0cmluZ106IGFueTsgfSkgPT4ge1xyXG4gICAgICBzZWFyY2hEaWN0W2ZpbHRlclsnbmFtZSddICsgZmlsdGVyWyd0eXBlJ11dID0gZmlsdGVyO1xyXG4gICAgfSlcclxuICAgIGNvbnN0IGZ1cnRoZXJGaWx0ZXI6IGFueVtdID0gW107XHJcbiAgICBzZWFyY2hSZXN1bHRzLm1hcChzZWFyY2ggPT4ge1xyXG4gICAgICBpZiAoKHNlYXJjaFsnbGFiZWwnXSArIHNlYXJjaFsndHlwZSddKSBpbiBzZWFyY2hEaWN0KSB7IH1cclxuICAgICAgZWxzZSB7IGZ1cnRoZXJGaWx0ZXIucHVzaChzZWFyY2gpIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZ1cnRoZXJGaWx0ZXI7XHJcbiAgfVxyXG5cclxuICBnZXRTZWFyY2hSZXN1bHRzKGxpc3Q6IFJvdXRlW10sIGZpbHRlcnZhbDogYW55KTogYW55IHtcclxuICAgIHJldHVybiBsaXN0LmZpbHRlcihlbGVtZW50ID0+IHtcclxuICAgICAgY29uc3QgcmVzdWx0X2xpc3RfYm9vbGVhbiA9IFtdXHJcbiAgICAgIGlmIChmaWx0ZXJ2YWwubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ3VuaXQnKSB7XHJcbiAgICAgICAgICByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2goZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZW1lbnRbZmlsdGVydmFsWzBdWyd0eXBlJ10gYXMga2V5b2YgUm91dGVdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlcnZhbFswXVsndHlwZSddID09PSAnY3VzdG9tZXInKSB7XHJcbiAgICAgICAgICByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2goZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZW1lbnRbJ2N1c3RvbWVyX25hbWUnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ21hdGVyaWFsJykge1xyXG4gICAgICAgICAgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVtZW50W2ZpbHRlcnZhbFswXVsndHlwZSddIGFzIGtleW9mIFJvdXRlXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ3BpY2t1cCBsb2NhdGlvbicpIHtcclxuICAgICAgICAgIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaChmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlbWVudFsncGlja3VwX2xvY2F0aW9uJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdkZXN0aW5hdGlvbiBsb2NhdGlvbicpIHtcclxuICAgICAgICAgIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaChmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlbWVudFsnZGVsaXZlcnlfbG9jYXRpb24nXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ2pvYicpIHtcclxuICAgICAgICAgIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaChmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlbWVudFsnb3JkZXJfbnVtYmVyJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdSb3V0ZSBuYW1lJykge1xyXG4gICAgICAgICAgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVtZW50Wydyb3V0ZV9uYW1lJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdEcml2ZXInKSB7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGVsZW1lbnQuZHJpdmVyX2xpc3Q/LmZpbmRJbmRleChlbGUgPT4geyByZXR1cm4gZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZVsnZHJpdmVyX25hbWUnXSB9KTtcclxuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlcnZhbFswXVsndHlwZSddID09PSAnVHJ1Y2tpbmcgQ29tcGFueScpIHtcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gZWxlbWVudC5kcml2ZXJfbGlzdD8uZmluZEluZGV4KGVsZSA9PiB7IHJldHVybiBmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlWyd0cnVja2luZ19jb21wYW55J10gfSk7XHJcbiAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2godHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZXN1bHRfbGlzdF9ib29sZWFuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0X2xpc3RfYm9vbGVhbi5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgJiYgY3Vycik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbGVhck9wdGlvbnMoKSB7XHJcbiAgICB0aGlzLnBpY2t1cE9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuZGVzdE9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMub3duZXJPcHRpb25zID0gW107XHJcbiAgICB0aGlzLmN1c3RvbWVyT3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy51bml0T3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5tYXRlcmlhbE9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuamNvZGVPcHRpb25zID0gW107XHJcbiAgICB0aGlzLnJvdXRlTmFtZU9wdGlvbnMgPSBbXTtcclxuICB9XHJcbiAgc2V0ZGljdFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRpY3Quc2V0KGtleSwgdmFsdWUpO1xyXG4gIH1cclxuICBnZXRkaWN0VmFsdWUoa2V5OiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGljdC5nZXQoa2V5KSk7XHJcbiAgfVxyXG4gIHJlbW92ZWRpY3RWYWx1ZShrZXk6IHN0cmluZykge1xyXG4gICAgdGhpcy5kaWN0LmRlbGV0ZShrZXkpO1xyXG4gIH1cclxuICBjb252ZXlTZWFyY2hJY29uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlKSAhPT0gJ29iamVjdCcpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIGZldGNoVW5pdHNMaXN0KCkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLnVuaXRzTGlzdCkge1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgndW5pdC9saXN0L3ZpZXcnKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzKSB7IHRoaXMudW5pdHNMaXN0ID0gcmVzLmRhdGE7IHJlc29sdmUodGhpcy51bml0c0xpc3QpOyB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKHRoaXMudW5pdHNMaXN0KTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGZldGNoTWF0ZXJpYWxzTGlzdCgpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5tYXRlcmlhbHNMaXN0KSB7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCdtYXRlcmlhbC9saXN0L3ZpZXcnKS5zdWJzY3JpYmUoKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmVzLmRhdGEuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGEubWF0ZXJpYWwubG9jYWxlQ29tcGFyZShiLm1hdGVyaWFsKSlcclxuICAgICAgICAgIHRoaXMubWF0ZXJpYWxzTGlzdCA9IHJlcy5kYXRhXHJcbiAgICAgICAgICByZXNvbHZlKHRoaXMubWF0ZXJpYWxzTGlzdCk7XHJcbiAgICAgICAgfSkpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZSh0aGlzLm1hdGVyaWFsc0xpc3QpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hDdXN0b21lcnNMaXN0KCkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmN1c3RvbWVyc0xpc3QpIHtcclxuICAgICAgICB0aGlzLmdldERhdGEoJ2NvbXBhbnkvbGlzdC92aWV3Jykuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcykgeyB0aGlzLmN1c3RvbWVyc0xpc3QgPSByZXMuZGF0YTsgcmVzb2x2ZSh0aGlzLmN1c3RvbWVyc0xpc3QpOyB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKHRoaXMuY3VzdG9tZXJzTGlzdCk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG59Il19
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=${this.config.mapboxAccessToken}&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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QUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3hJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4SSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDNUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM1SCxJQUFJLElBQUksQ0FB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QUM7cUJBQUU7Z0JBQzFFLENBQUMsQ0FBQyxDQUFBO2FBQ0g7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUM3QjtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQzs7eUdBdE9VLFlBQVksdUVBNEJiLFlBQVk7NkdBNUJYLFlBQVksY0FEQyxNQUFNOzJGQUNuQixZQUFZO2tCQUR4QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBNkI3QixNQUFNOzJCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29vbG1hcENvbmZpZ01vZGVsLCBSb3V0ZSB9IGZyb20gJy4vZGF0YS1tb2RlbCc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgVXRpbHNTZXJ2aWNlIHtcbiAgYW5hbHl0aWNzUkVTVFVSTCA9ICcnO1xuICBSRVNUVVJMUHJlZml4ID0gJyc7XG4gIHBpY2t1cE9wdGlvbnM6IGFueVtdID0gW107XG4gIGRlc3RPcHRpb25zOiBhbnlbXSA9IFtdO1xuICBvd25lck9wdGlvbnM6IGFueVtdID0gW107XG4gIGN1c3RvbWVyT3B0aW9uczogYW55W10gPSBbXTtcbiAgdW5pdE9wdGlvbnM6IGFueVtdID0gW107XG4gIG1hdGVyaWFsT3B0aW9uczogYW55W10gPSBbXTtcbiAgamNvZGVPcHRpb25zOiBhbnlbXSA9IFtdO1xuICBkcml2ZXJPcHRpb246IGFueVtdID0gW107XG4gIHRydWNraW5nQ29tcGFuYXlPcHRpb246IGFueVtdID0gW107XG4gIHJvdXRlTmFtZU9wdGlvbnM6IGFueVtdID0gW107XG4gIHB1YmxpYyBwcmV2ZW50bmF2Q2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIG5hdkNoYW5nZU9ic2VydmUgPSB0aGlzLnByZXZlbnRuYXZDaGFuZ2UuYXNPYnNlcnZhYmxlKCk7XG4gIGNsZWFyVmlld1JvdXRlZm9ySm9iQ29kZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBjbGVhclZpZXdSb3V0ZWZvckpvYkNvZGVPYnNlcnZlID0gdGhpcy5jbGVhclZpZXdSb3V0ZWZvckpvYkNvZGUuYXNPYnNlcnZhYmxlKCk7XG4gIHByZVZlbnRKb2JkZXRhaWxjbG9zZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBnZXRwcmVWZW50Sm9iZGV0YWlsY2xvc2UgPSB0aGlzLnByZVZlbnRKb2JkZXRhaWxjbG9zZS5hc09ic2VydmFibGUoKTtcbiAgcm91dGVEZXRhaWxzVXRpbGl0eSA9IG5ldyBCZWhhdmlvclN1YmplY3Qoe30pO1xuICBnZXRyb3V0ZURldGFpbHNVdGlsaXR5ID0gdGhpcy5yb3V0ZURldGFpbHNVdGlsaXR5LmFzT2JzZXJ2YWJsZSgpO1xuICByZW1vdmVNYXBFbnRpdHkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTtcbiAgcmVtb3ZlTWFwRW50aXR5VXRpbGl0eSA9IHRoaXMucmVtb3ZlTWFwRW50aXR5LmFzT2JzZXJ2YWJsZSgpO1xuICBkaWN0ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgdW5pdHNMaXN0OiBhbnk7XG4gIG1hdGVyaWFsc0xpc3Q6IGFueTtcbiAgY3VzdG9tZXJzTGlzdDogYW55O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaHR0cDogSHR0cENsaWVudCwgcHVibGljIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBASW5qZWN0KCdtZW1iZXJEYXRhJykgcHJpdmF0ZSBjb25maWc6IENvb2xtYXBDb25maWdNb2RlbCkge1xuICAgIHRoaXMuYW5hbHl0aWNzUkVTVFVSTCA9IGNvbmZpZy5hbmFseXRpY3NSRVNUVVJMO1xuICAgIHRoaXMuUkVTVFVSTFByZWZpeCA9IGNvbmZpZy5SRVNUVVJMUHJlZml4O1xuICB9XG4gIGdldERhdGVGb3JtYXQoc3RyVmFsOiBEYXRlIHwgbnVsbCwgc2VwcmF0ZXI/OiBzdHJpbmcpIHtcbiAgICBzZXByYXRlciA9IHNlcHJhdGVyID8gc2VwcmF0ZXIgOiAnLSc7XG4gICAgY29uc3QgbXlkYXRlID0gc3RyVmFsO1xuICAgIHJldHVybiBteWRhdGU/LmdldEZ1bGxZZWFyKCkgKyBzZXByYXRlciArICgobXlkYXRlID8gbXlkYXRlLmdldE1vbnRoKCkgOiAwKSArIDEpICsgc2VwcmF0ZXIgKyBteWRhdGU/LmdldERhdGUoKTtcbiAgfVxuICBnZXREYXRhKHBhdGg6IHN0cmluZykgeyByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmFuYWx5dGljc1JFU1RVUkx9JHt0aGlzLmNvbmZpZy5yZXBvc2l0b3J5fS8ke3BhdGh9YCkgfVxuICBwb3N0ZGF0YShwYXRoOiBzdHJpbmcsIGRhdGE6IGFueSkgeyByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5hbmFseXRpY3NSRVNUVVJMfSR7dGhpcy5jb25maWcucmVwb3NpdG9yeX0vJHtwYXRofWAsIGRhdGEpIH1cbiAgcG9zdERhdGFXaXRoUmVzdFVybChwYXRoOiBzdHJpbmcsIGRhdGE6IGFueSkgeyByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5SRVNUVVJMUHJlZml4fSR7cGF0aH1gLCBkYXRhKSB9XG4gIGZldGNoQXV0b0NvbXBsZXRlTG9jYXRpb25zKGtleXdvcmQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGBodHRwczovL2FwaS5tYXBib3guY29tL2dlb2NvZGluZy92NS9tYXBib3gucGxhY2VzLyR7a2V5d29yZH0uanNvbj9hY2Nlc3NfdG9rZW49JHt0aGlzLmNvbmZpZy5tYXBib3hBY2Nlc3NUb2tlbn0mY291bnRyeT1VU2ApXG4gIH1cbiAgb3BlblNuYWNrQmFyKG1lc3NhZ2U6IHN0cmluZywgY2xhc3NOYW1lPzogc3RyaW5nKSB7XG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKG1lc3NhZ2UsICcnLCB7XG4gICAgICBkdXJhdGlvbjogNTAwMCwgdmVydGljYWxQb3NpdGlvbjogJ3RvcCcsIGhvcml6b250YWxQb3NpdGlvbjogJ2NlbnRlcicsIHBhbmVsQ2xhc3M6IFtjbGFzc05hbWUgPyBjbGFzc05hbWUgOiAnZGVmYXVsdCddXG4gICAgfSk7XG4gIH1cblxuICBtYWtlT3B0aW9ucyhpdGVtOiBSb3V0ZSkge1xuICAgIGlmIChpdGVtLm9yZGVyX251bWJlcikge1xuICAgICAgKHRoaXMuamNvZGVPcHRpb25zLmZpbmRJbmRleCgoZWxlbSkgPT4gZWxlbS5qb2JfaWQgPT09IGl0ZW0uam9iX2lkKSA9PT0gLTEpID8gdGhpcy5qY29kZU9wdGlvbnMucHVzaCh7IGpvYl9jb2RlOiBpdGVtLm9yZGVyX251bWJlciwgam9iX2lkOiBpdGVtLmpvYl9pZCB9KSA6IG51bGw7XG4gICAgICBpZiAoaXRlbS5kcml2ZXJfbGlzdCAmJiBpdGVtLmRyaXZlcl9saXN0Py5sZW5ndGggPiAwKSB7XG4gICAgICAgIGl0ZW0uZHJpdmVyX2xpc3QuZm9yRWFjaCgoZHJpdmVyKSA9PiB7XG4gICAgICAgICAgdGhpcy5kcml2ZXJPcHRpb24uZmluZEluZGV4KGVsZW0gPT4gZWxlbSA9PT0gZHJpdmVyWydkcml2ZXJfbmFtZSddKSA9PT0gLTEgPyB0aGlzLmRyaXZlck9wdGlvbi5wdXNoKGRyaXZlclsnZHJpdmVyX25hbWUnXSkgOiBudWxsO1xuICAgICAgICAgIHRoaXMudHJ1Y2tpbmdDb21wYW5heU9wdGlvbi5maW5kSW5kZXgoZWxlbSA9PiBlbGVtID09PSBkcml2ZXJbJ3RydWNraW5nX2NvbXBhbnknXSkgPT09IC0xID8gdGhpcy50cnVja2luZ0NvbXBhbmF5T3B0aW9uLnB1c2goZHJpdmVyWyd0cnVja2luZ19jb21wYW55J10pIDogbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgICgodGhpcy5waWNrdXBPcHRpb25zLmZpbmRJbmRleCgoZWxlbSkgPT4gZWxlbSA9PT0gaXRlbS5waWNrdXBfbG9jYXRpb24pKSA9PT0gLTEpID8gdGhpcy5waWNrdXBPcHRpb25zLnB1c2goaXRlbS5waWNrdXBfbG9jYXRpb24pIDogbnVsbDtcbiAgICAoKHRoaXMuZGVzdE9wdGlvbnMuZmluZEluZGV4KChlbGVtKSA9PiBlbGVtID09PSBpdGVtLmRlbGl2ZXJ5X2xvY2F0aW9uKSkgPT09IC0xKSA/IHRoaXMuZGVzdE9wdGlvbnMucHVzaChpdGVtLmRlbGl2ZXJ5X2xvY2F0aW9uKSA6IG51bGw7XG4gICAgKHRoaXMuY3VzdG9tZXJPcHRpb25zLmZpbmRJbmRleCgoY3VzdG9tZXIpID0+IGN1c3RvbWVyID09PSBpdGVtLmN1c3RvbWVyX25hbWUpID09PSAtMSkgPyB0aGlzLmN1c3RvbWVyT3B0aW9ucy5wdXNoKGl0ZW0uY3VzdG9tZXJfbmFtZSkgOiBudWxsO1xuICAgICh0aGlzLnVuaXRPcHRpb25zLmZpbmRJbmRleCgoZWxlbSkgPT4gZWxlbSA9PT0gaXRlbS51bml0KSA9PT0gLTEpID8gdGhpcy51bml0T3B0aW9ucy5wdXNoKGl0ZW0udW5pdCkgOiBudWxsO1xuICAgICh0aGlzLm1hdGVyaWFsT3B0aW9ucy5maW5kSW5kZXgoKGVsZW0pID0+IGVsZW0gPT09IGl0ZW0ubWF0ZXJpYWwpID09PSAtMSkgPyB0aGlzLm1hdGVyaWFsT3B0aW9ucy5wdXNoKGl0ZW0ubWF0ZXJpYWwpIDogbnVsbDtcbiAgICBpZiAoaXRlbS5yb3V0ZV9uYW1lKSB0aGlzLnJvdXRlTmFtZU9wdGlvbnMuZmluZEluZGV4KGVsZW0gPT4gZWxlbSA9PT0gaXRlbS5yb3V0ZV9uYW1lKSA9PT0gLTEgPyB0aGlzLnJvdXRlTmFtZU9wdGlvbnMucHVzaChpdGVtLnJvdXRlX25hbWUpIDogbnVsbDtcbiAgfVxuXG4gIGZpbHRlcih2YWx1ZTogc3RyaW5nLCBmaWx0ZXJzOiBhbnkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgeyByZXR1cm4gW10gfVxuICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoZmlsdGVyVmFsdWUgPT09ICcnKSB7IHJldHVybiBbXSB9XG4gICAgY29uc3Qgc2VhcmNoUmVzdWx0czogYW55W10gPSBbXTtcbiAgICB0aGlzLnVuaXRPcHRpb25zLm1hcCh1bml0ID0+IHtcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcInVuaXRcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmN1c3RvbWVyT3B0aW9ucy5tYXAodW5pdCA9PiB7XG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJjdXN0b21lclwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubWF0ZXJpYWxPcHRpb25zLm1hcCh1bml0ID0+IHtcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcIm1hdGVyaWFsXCIsIFwibGFiZWxcIjogdW5pdCwgXCJ2YWx1ZVwiOiB1bml0IH0pXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5waWNrdXBPcHRpb25zLm1hcCh1bml0ID0+IHtcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcInBpY2t1cCBsb2NhdGlvblwiLCBcImxhYmVsXCI6IHVuaXQsIFwidmFsdWVcIjogdW5pdCB9KVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZGVzdE9wdGlvbnMubWFwKHVuaXQgPT4ge1xuICAgICAgaWYgKHVuaXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcbiAgICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHsgXCJ0eXBlXCI6IFwiZGVzdGluYXRpb24gbG9jYXRpb25cIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmpjb2RlT3B0aW9ucy5tYXAodW5pdCA9PiB7XG4gICAgICBpZiAodW5pdC5qb2JfY29kZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJqb2JcIiwgXCJsYWJlbFwiOiB1bml0Wydqb2JfY29kZSddLCBcInZhbHVlXCI6IHVuaXQgfSlcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmRyaXZlck9wdGlvbi5tYXAodW5pdCA9PiB7XG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJEcml2ZXJcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudHJ1Y2tpbmdDb21wYW5heU9wdGlvbi5tYXAodW5pdCA9PiB7XG4gICAgICBpZiAodW5pdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSkge1xuICAgICAgICBzZWFyY2hSZXN1bHRzLnB1c2goeyBcInR5cGVcIjogXCJUcnVja2luZyBDb21wYW55XCIsIFwibGFiZWxcIjogdW5pdCwgXCJ2YWx1ZVwiOiB1bml0IH0pXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZU5hbWVPcHRpb25zLm1hcCh1bml0ID0+IHtcbiAgICAgIGlmICh1bml0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7IFwidHlwZVwiOiBcIlJvdXRlIG5hbWVcIiwgXCJsYWJlbFwiOiB1bml0LCBcInZhbHVlXCI6IHVuaXQgfSlcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzZWFyY2hEaWN0OiBhbnkgPSB7fVxuICAgIGZpbHRlcnMubWFwKChmaWx0ZXI6IHsgW3g6IHN0cmluZ106IGFueTsgfSkgPT4ge1xuICAgICAgc2VhcmNoRGljdFtmaWx0ZXJbJ25hbWUnXSArIGZpbHRlclsndHlwZSddXSA9IGZpbHRlcjtcbiAgICB9KVxuICAgIGNvbnN0IGZ1cnRoZXJGaWx0ZXI6IGFueVtdID0gW107XG4gICAgc2VhcmNoUmVzdWx0cy5tYXAoc2VhcmNoID0+IHtcbiAgICAgIGlmICgoc2VhcmNoWydsYWJlbCddICsgc2VhcmNoWyd0eXBlJ10pIGluIHNlYXJjaERpY3QpIHsgfVxuICAgICAgZWxzZSB7IGZ1cnRoZXJGaWx0ZXIucHVzaChzZWFyY2gpIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnVydGhlckZpbHRlcjtcbiAgfVxuXG4gIGdldFNlYXJjaFJlc3VsdHMobGlzdDogUm91dGVbXSwgZmlsdGVydmFsOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBsaXN0LmZpbHRlcihlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdF9saXN0X2Jvb2xlYW4gPSBbXVxuICAgICAgaWYgKGZpbHRlcnZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ3VuaXQnKSB7XG4gICAgICAgICAgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVtZW50W2ZpbHRlcnZhbFswXVsndHlwZSddIGFzIGtleW9mIFJvdXRlXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlcnZhbFswXVsndHlwZSddID09PSAnY3VzdG9tZXInKSB7XG4gICAgICAgICAgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVtZW50WydjdXN0b21lcl9uYW1lJ10pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ21hdGVyaWFsJykge1xuICAgICAgICAgIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaChmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlbWVudFtmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSBhcyBrZXlvZiBSb3V0ZV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ3BpY2t1cCBsb2NhdGlvbicpIHtcbiAgICAgICAgICByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2goZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZW1lbnRbJ3BpY2t1cF9sb2NhdGlvbiddKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdkZXN0aW5hdGlvbiBsb2NhdGlvbicpIHtcbiAgICAgICAgICByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2goZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZW1lbnRbJ2RlbGl2ZXJ5X2xvY2F0aW9uJ10pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ2pvYicpIHtcbiAgICAgICAgICByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2goZmlsdGVydmFsWzBdWyduYW1lJ10gPT09IGVsZW1lbnRbJ29yZGVyX251bWJlciddKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdSb3V0ZSBuYW1lJykge1xuICAgICAgICAgIHJlc3VsdF9saXN0X2Jvb2xlYW4ucHVzaChmaWx0ZXJ2YWxbMF1bJ25hbWUnXSA9PT0gZWxlbWVudFsncm91dGVfbmFtZSddKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVydmFsWzBdWyd0eXBlJ10gPT09ICdEcml2ZXInKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBlbGVtZW50LmRyaXZlcl9saXN0Py5maW5kSW5kZXgoZWxlID0+IHsgcmV0dXJuIGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVbJ2RyaXZlcl9uYW1lJ10gfSk7XG4gICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgcmVzdWx0X2xpc3RfYm9vbGVhbi5wdXNoKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXJ2YWxbMF1bJ3R5cGUnXSA9PT0gJ1RydWNraW5nIENvbXBhbnknKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBlbGVtZW50LmRyaXZlcl9saXN0Py5maW5kSW5kZXgoZWxlID0+IHsgcmV0dXJuIGZpbHRlcnZhbFswXVsnbmFtZSddID09PSBlbGVbJ3RydWNraW5nX2NvbXBhbnknXSB9KTtcbiAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSByZXN1bHRfbGlzdF9ib29sZWFuLnB1c2godHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHRfbGlzdF9ib29sZWFuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdF9saXN0X2Jvb2xlYW4ucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICYmIGN1cnIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJPcHRpb25zKCkge1xuICAgIHRoaXMucGlja3VwT3B0aW9ucyA9IFtdO1xuICAgIHRoaXMuZGVzdE9wdGlvbnMgPSBbXTtcbiAgICB0aGlzLm93bmVyT3B0aW9ucyA9IFtdO1xuICAgIHRoaXMuY3VzdG9tZXJPcHRpb25zID0gW107XG4gICAgdGhpcy51bml0T3B0aW9ucyA9IFtdO1xuICAgIHRoaXMubWF0ZXJpYWxPcHRpb25zID0gW107XG4gICAgdGhpcy5qY29kZU9wdGlvbnMgPSBbXTtcbiAgICB0aGlzLnJvdXRlTmFtZU9wdGlvbnMgPSBbXTtcbiAgfVxuICBzZXRkaWN0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRpY3Quc2V0KGtleSwgdmFsdWUpO1xuICB9XG4gIGdldGRpY3RWYWx1ZShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGljdC5nZXQoa2V5KSk7XG4gIH1cbiAgcmVtb3ZlZGljdFZhbHVlKGtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5kaWN0LmRlbGV0ZShrZXkpO1xuICB9XG4gIGNvbnZleVNlYXJjaEljb24odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlKSAhPT0gJ29iamVjdCcpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGZldGNoVW5pdHNMaXN0KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMudW5pdHNMaXN0KSB7XG4gICAgICAgIHRoaXMuZ2V0RGF0YSgndW5pdC9saXN0L3ZpZXcnKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcykgeyB0aGlzLnVuaXRzTGlzdCA9IHJlcy5kYXRhOyByZXNvbHZlKHRoaXMudW5pdHNMaXN0KTsgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnVuaXRzTGlzdCk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZldGNoTWF0ZXJpYWxzTGlzdCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm1hdGVyaWFsc0xpc3QpIHtcbiAgICAgICAgdGhpcy5nZXREYXRhKCdtYXRlcmlhbC9saXN0L3ZpZXcnKS5zdWJzY3JpYmUoKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHJlcy5kYXRhLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBhLm1hdGVyaWFsLmxvY2FsZUNvbXBhcmUoYi5tYXRlcmlhbCkpXG4gICAgICAgICAgdGhpcy5tYXRlcmlhbHNMaXN0ID0gcmVzLmRhdGFcbiAgICAgICAgICByZXNvbHZlKHRoaXMubWF0ZXJpYWxzTGlzdCk7XG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLm1hdGVyaWFsc0xpc3QpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmZXRjaEN1c3RvbWVyc0xpc3QoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5jdXN0b21lcnNMaXN0KSB7XG4gICAgICAgIHRoaXMuZ2V0RGF0YSgnY29tcGFueS9saXN0L3ZpZXcnKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcykgeyB0aGlzLmN1c3RvbWVyc0xpc3QgPSByZXMuZGF0YTsgcmVzb2x2ZSh0aGlzLmN1c3RvbWVyc0xpc3QpOyB9XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKHRoaXMuY3VzdG9tZXJzTGlzdCk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxufSJdfQ==