@igo2/geo 18.0.0-next.7 → 18.0.0-next.8
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,7 +1,7 @@
|
|
|
1
1
|
import { HttpClient } from '@angular/common/http';
|
|
2
2
|
import { Injectable } from '@angular/core';
|
|
3
3
|
import { ConfigService } from '@igo2/core/config';
|
|
4
|
-
import { downloadBlob, downloadContent, isIsoDate } from '@igo2/utils';
|
|
4
|
+
import { addExcelSheetToWorkBook, createExcelWorkBook, downloadBlob, downloadContent, isIsoDate, writeExcelFile } from '@igo2/utils';
|
|
5
5
|
import OlFeature from 'ol/Feature';
|
|
6
6
|
import * as olformat from 'ol/format';
|
|
7
7
|
import { circular } from 'ol/geom/Polygon';
|
|
@@ -72,7 +72,6 @@ export class ExportService {
|
|
|
72
72
|
let comment = '';
|
|
73
73
|
const properties = keys.reduce((acc, key) => {
|
|
74
74
|
if (key && key !== 'geometry') {
|
|
75
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
76
75
|
key === 'id' && olFeature.get('draw')
|
|
77
76
|
? (comment += key + ':' + olFeature.get('draw') + ' \r\n')
|
|
78
77
|
: (comment += key + ':' + olFeature.get(key) + ' \r\n');
|
|
@@ -145,18 +144,23 @@ export class ExportService {
|
|
|
145
144
|
}
|
|
146
145
|
}
|
|
147
146
|
async exportExcel(map, store, data) {
|
|
148
|
-
const
|
|
149
|
-
const workbook = utils.book_new();
|
|
147
|
+
const workBook = await createExcelWorkBook();
|
|
150
148
|
for (const layerName of data.layers) {
|
|
151
149
|
const layer = map.getLayerById(layerName);
|
|
152
150
|
const features = await lastValueFrom(this.getFeatures(map, layer, data, store));
|
|
153
151
|
const formattedFeatures = features?.length
|
|
154
152
|
? this.formatFeatures(features, 'GeoJSON')
|
|
155
153
|
: null;
|
|
156
|
-
|
|
154
|
+
const collection = features
|
|
155
|
+
? JSON.parse(formattedFeatures)
|
|
156
|
+
: {
|
|
157
|
+
features: []
|
|
158
|
+
};
|
|
159
|
+
const rows = collection.features.map((feature) => this.formatRecord(feature.properties));
|
|
160
|
+
await addExcelSheetToWorkBook(layer.title, rows, workBook);
|
|
157
161
|
}
|
|
158
162
|
const title = this.getTitleFromLayers(data.layers, map);
|
|
159
|
-
|
|
163
|
+
writeExcelFile(workBook, title, { compression: true });
|
|
160
164
|
}
|
|
161
165
|
getTitleFromLayers(layers, map) {
|
|
162
166
|
return layers.length === 1
|
|
@@ -167,28 +171,6 @@ export class ExportService {
|
|
|
167
171
|
const layer = map.getLayerById(id);
|
|
168
172
|
return layer.title;
|
|
169
173
|
}
|
|
170
|
-
async addExcelSheet(title, features, workbook) {
|
|
171
|
-
const { utils } = await import('xlsx');
|
|
172
|
-
const collection = features
|
|
173
|
-
? JSON.parse(features)
|
|
174
|
-
: {
|
|
175
|
-
features: []
|
|
176
|
-
};
|
|
177
|
-
const rows = collection.features.map((feature) => this.formatRecord(feature.properties));
|
|
178
|
-
const worksheet = utils.json_to_sheet(rows);
|
|
179
|
-
/* calculate column width */
|
|
180
|
-
if (rows?.length) {
|
|
181
|
-
worksheet['!cols'] = this.getColumnsInfo(rows);
|
|
182
|
-
}
|
|
183
|
-
const SHEET_NAME_MAX_LENGTH = 31;
|
|
184
|
-
let sheetName = title.length >= SHEET_NAME_MAX_LENGTH
|
|
185
|
-
? title.substring(0, SHEET_NAME_MAX_LENGTH)
|
|
186
|
-
: title;
|
|
187
|
-
if (workbook.SheetNames.includes(sheetName)) {
|
|
188
|
-
sheetName = `${sheetName.substring(0, SHEET_NAME_MAX_LENGTH - 3)}_${workbook.SheetNames.length}`;
|
|
189
|
-
}
|
|
190
|
-
utils.book_append_sheet(workbook, worksheet, sheetName);
|
|
191
|
-
}
|
|
192
174
|
formatRecord(record) {
|
|
193
175
|
return Object.entries(record).reduce((formatted, [key, value]) => {
|
|
194
176
|
formatted[key] = this.formatDataType(value);
|
|
@@ -211,15 +193,6 @@ export class ExportService {
|
|
|
211
193
|
return value;
|
|
212
194
|
}
|
|
213
195
|
}
|
|
214
|
-
getColumnsInfo(rows) {
|
|
215
|
-
const columns = Object.keys(rows[0]);
|
|
216
|
-
return columns.map((column) => ({
|
|
217
|
-
wch: this.getColumnMaxWidth(column, rows)
|
|
218
|
-
}));
|
|
219
|
-
}
|
|
220
|
-
getColumnMaxWidth(column, rows) {
|
|
221
|
-
return rows.reduce((width, row) => Math.max(width, row[column]?.length ?? 0), column.length);
|
|
222
|
-
}
|
|
223
196
|
exportWithOgre(olFeatures, { format, csvSeparator = null }, title, projectionIn, projectionOut) {
|
|
224
197
|
const featuresText = new olformat.GeoJSON().writeFeatures(olFeatures, {
|
|
225
198
|
dataProjection: projectionOut,
|
|
@@ -399,4 +372,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
399
372
|
providedIn: 'root'
|
|
400
373
|
}]
|
|
401
374
|
}], ctorParameters: () => [{ type: i1.ConfigService }, { type: i2.HttpClient }] });
|
|
402
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9pbXBvcnQtZXhwb3J0L3NoYXJlZC9leHBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXZFLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0MsT0FBTyxFQUFFLFVBQVUsRUFBWSxVQUFVLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBFLE9BQU8sRUFBWSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFPcEQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QiwwQkFBMEIsRUFDM0IsTUFBTSxpQkFBaUIsQ0FBQztBQUd6QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFFN0MsTUFBTSwwQkFBMEIsR0FBRyxHQUFHLENBQUM7QUFLdkMsTUFBTSxPQUFPLGFBQWE7SUFtQmQ7SUFDQTtJQW5CVixNQUFNLENBQUMsV0FBVyxHQUFxQztRQUNyRCxHQUFHLEVBQUUsS0FBSztRQUNWLEdBQUcsRUFBRSxLQUFLO1FBQ1YsR0FBRyxFQUFFLEtB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LENBQUM7UUFDbkQsQ0FBQztRQUVELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM3QixRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNwQyxNQUFNLE1BQU0sR0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNYLE1BQU0sVUFBVSxHQUFrQjt3QkFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7d0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO3FCQUN4QixDQUFDO29CQUNGLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUNqRCxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7b0JBQzFELE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQzt3R0F4aUJVLGFBQWE7NEdBQWIsYUFBYSxjQUZaLE1BQU07OzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRW50aXR5UmVjb3JkIH0gZnJvbSAnQGlnbzIvY29tbW9uL2VudGl0eSc7XG5pbXBvcnQgeyBXb3Jrc3BhY2UsIFdvcmtzcGFjZVN0b3JlIH0gZnJvbSAnQGlnbzIvY29tbW9uL3dvcmtzcGFjZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgZG93bmxvYWRCbG9iLCBkb3dubG9hZENvbnRlbnQsIGlzSXNvRGF0ZSB9IGZyb20gJ0BpZ28yL3V0aWxzJztcblxuaW1wb3J0IE9sRmVhdHVyZSBmcm9tICdvbC9GZWF0dXJlJztcbmltcG9ydCAqIGFzIG9sZm9ybWF0IGZyb20gJ29sL2Zvcm1hdCc7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuaW1wb3J0IHsgY2lyY3VsYXIgfSBmcm9tICdvbC9nZW9tL1BvbHlnb24nO1xuXG5pbXBvcnQgeyBGZWF0dXJlQ29sbGVjdGlvbiB9IGZyb20gJ2dlb2pzb24nO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIGNhdGNoRXJyb3IsIGxhc3RWYWx1ZUZyb20sIG9mLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB0eXBlIHsgQ29sSW5mbywgV29ya0Jvb2sgfSBmcm9tICd4bHN4JztcblxuaW1wb3J0IHsgQ2x1c3RlckRhdGFTb3VyY2UsIFdGU0RhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9kYXRhc291cmNlJztcbmltcG9ydCB7IEZlYXR1cmUgfSBmcm9tICcuLi8uLi9mZWF0dXJlJztcbmltcG9ydCB7IEFueUxheWVyLCBWZWN0b3JMYXllciB9IGZyb20gJy4uLy4uL2xheWVyJztcbmltcG9ydCB7IElnb01hcCB9IGZyb20gJy4uLy4uL21hcCc7XG5pbXBvcnQge1xuICBFZGl0aW9uV29ya3NwYWNlLFxuICBGZWF0dXJlV29ya3NwYWNlLFxuICBXZnNXb3Jrc3BhY2Vcbn0gZnJvbSAnLi4vLi4vd29ya3NwYWNlJztcbmltcG9ydCB7XG4gIEV4cG9ydEludmFsaWRGaWxlRXJyb3IsXG4gIEV4cG9ydE5vdGhpbmdUb0V4cG9ydEVycm9yXG59IGZyb20gJy4vZXhwb3J0LmVycm9ycyc7XG5pbXBvcnQgeyBFeHBvcnRPcHRpb25zLCBHZW9tZXRyeUNvbGxlY3Rpb24gfSBmcm9tICcuL2V4cG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQW55RXhwb3J0Rm9ybWF0LCBFeHBvcnRPZ3JlRm9ybWF0IH0gZnJvbSAnLi9leHBvcnQudHlwZSc7XG5pbXBvcnQgeyBpc0NzdkV4cG9ydCB9IGZyb20gJy4vZXhwb3J0LnV0aWxzJztcblxuY29uc3QgU0hBUEVGSUxFX0ZJRUxEX01BWF9MRU5HSFQgPSAyNTU7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEV4cG9ydFNlcnZpY2Uge1xuICBzdGF0aWMgb2dyZUZvcm1hdHM6IFJlY29yZDxFeHBvcnRPZ3JlRm9ybWF0LCBzdHJpbmc+ID0ge1xuICAgIEdNTDogJ2dtbCcsXG4gICAgR1BYOiAnZ3B4JyxcbiAgICBLTUw6ICdrbWwnLFxuICAgIFNoYXBlZmlsZTogJ0VTUkkgU2hhcGVmaWxlJyxcbiAgICBDU1Y6ICdDU1YnLFxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgQ1NWICovXG4gICAgQ1NWY29tbWE6ICdDU1Zjb21tYScsXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBDU1YgKi9cbiAgICBDU1ZzZW1pY29sb246ICdDU1ZzZW1pY29sb24nXG4gIH07XG5cbiAgc3RhdGljIG5vT2dyZUZhbGxiYWNrczogUGFydGlhbDxBbnlFeHBvcnRGb3JtYXRbXT4gPSBbJ0dNTCcsICdHUFgnLCAnS01MJ107XG5cbiAgcHJpdmF0ZSBvZ3JlVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgYWdncmVnYXRlSW5Db21tZW50ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnRcbiAgKSB7XG4gICAgdGhpcy5vZ3JlVXJsID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdpbXBvcnRFeHBvcnQudXJsJyk7XG4gICAgY29uc3QgZ3B4QWdncmVnYXRlSW5Db21tZW50ID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKFxuICAgICAgJ2ltcG9ydEV4cG9ydC5ncHhBZ2dyZWdhdGVJbkNvbW1lbnQnXG4gICAgKTtcbiAgICBpZiAoZ3B4QWdncmVnYXRlSW5Db21tZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWdncmVnYXRlSW5Db21tZW50ID0gZ3B4QWdncmVnYXRlSW5Db21tZW50O1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydChcbiAgICBvbEZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBvcHRpb25zOiBFeHBvcnRPcHRpb25zLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbkluID0gJ0VQU0c6NDMyNicsXG4gICAgcHJvamVjdGlvbk91dCA9ICdFUFNHOjQzMjYnXG4gICk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IGV4cG9ydE9sRmVhdHVyZXMgPSB0aGlzLmNsZWFuRmVhdHVyZXMoXG4gICAgICBvbEZlYXR1cmVzLFxuICAgICAgb3B0aW9ucy5mb3JtYXQsXG4gICAgICAnX2ZlYXR1cmVTdG9yZSdcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhwb3J0QXN5bmMoXG4gICAgICBleHBvcnRPbEZlYXR1cmVzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHRpdGxlLFxuICAgICAgcHJvamVjdGlvbkluLFxuICAgICAgcHJvamVjdGlvbk91dFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xlYW5GZWF0dXJlcyhcbiAgICBvbEZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBmb3JtYXQ6IEFueUV4cG9ydEZvcm1hdCxcbiAgICBleGNsdWRlUHJlZml4ID0gJ18nXG4gICk6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdIHtcbiAgICBpZiAoZm9ybWF0ID09PSAnR1BYJyAmJiB0aGlzLmFnZ3JlZ2F0ZUluQ29tbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVBZ2dyZWdhdGVkRmVhdHVyZShvbEZlYXR1cmVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2xGZWF0dXJlcy5tYXAoKG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+KSA9PiB7XG4gICAgICBsZXQga2V5cyA9IG9sRmVhdHVyZVxuICAgICAgICAuZ2V0S2V5cygpXG4gICAgICAgIC5maWx0ZXIoKGtleTogc3RyaW5nKSA9PiAha2V5LnN0YXJ0c1dpdGgoZXhjbHVkZVByZWZpeCkpO1xuXG4gICAgICBpZiAoZm9ybWF0ID09PSAnU2hhcGVmaWxlJyAmJiBvbEZlYXR1cmUuZ2V0KCdfc3R5bGUnKSkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IEpTT04uc3RyaW5naWZ5KG9sRmVhdHVyZS5nZXQoJ19zdHlsZScpKTtcbiAgICAgICAgaWYgKHN0eWxlLmxlbmd0aCA+IFNIQVBFRklMRV9GSUVMRF9NQVhfTEVOR0hUKVxuICAgICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdfc3R5bGUnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IGtleXMucmVkdWNlKFxuICAgICAgICAoYWNjOiBvYmplY3QsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgYWNjW2tleV0gPSBvbEZlYXR1cmUuZ2V0KGtleSk7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgeyBnZW9tZXRyeTogb2xGZWF0dXJlLmdldEdlb21ldHJ5KCkgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgT2xGZWF0dXJlKHByb3BlcnRpZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUFnZ3JlZ2F0ZWRGZWF0dXJlKFxuICAgIG9sRmVhdHVyZXM6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdXG4gICk6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdIHtcbiAgICByZXR1cm4gb2xGZWF0dXJlcy5tYXAoKG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+KSA9PiB7XG4gICAgICBjb25zdCBrZXlzID0gb2xGZWF0dXJlXG4gICAgICAgIC5nZXRLZXlzKClcbiAgICAgICAgLmZpbHRlcigoa2V5OiBzdHJpbmcpID0+ICFrZXkuc3RhcnRzV2l0aCgnXycpKTtcbiAgICAgIGxldCBjb21tZW50ID0gJyc7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0ga2V5cy5yZWR1Y2UoXG4gICAgICAgIChhY2M6IG9iamVjdCwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ICYmIGtleSAhPT0gJ2dlb21ldHJ5Jykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgIGtleSA9PT0gJ2lkJyAmJiBvbEZlYXR1cmUuZ2V0KCdkcmF3JylcbiAgICAgICAgICAgICAgPyAoY29tbWVudCArPSBrZXkgKyAnOicgKyBvbEZlYXR1cmUuZ2V0KCdkcmF3JykgKyAnICAgXFxyXFxuJylcbiAgICAgICAgICAgICAgOiAoY29tbWVudCArPSBrZXkgKyAnOicgKyBvbEZlYXR1cmUuZ2V0KGtleSkgKyAnICAgXFxyXFxuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjY1trZXldID0gb2xGZWF0dXJlLmdldChrZXkpO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBnZW9tZXRyeTogb2xGZWF0dXJlLmdldEdlb21ldHJ5KClcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ld0ZlYXR1cmUgPSBuZXcgT2xGZWF0dXJlKHByb3BlcnRpZXMpO1xuICAgICAgbmV3RmVhdHVyZS5zZXQoJ25hbWUnLCBvbEZlYXR1cmUuZ2V0SWQoKSk7XG4gICAgICBuZXdGZWF0dXJlLnNldCgnY210JywgY29tbWVudCk7XG5cbiAgICAgIHJldHVybiBuZXdGZWF0dXJlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBvcnRBc3luYyhcbiAgICBvbEZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBvcHRpb25zOiBFeHBvcnRPcHRpb25zLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbkluOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbk91dDogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IHsgZm9ybWF0IH0gPSBvcHRpb25zO1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPHZvaWQ+KSA9PiB7XG4gICAgICBjb25zdCBub3RoaW5nVG9FeHBvcnQgPSB0aGlzLm5vdGhpbmdUb0V4cG9ydChvbEZlYXR1cmVzLCBmb3JtYXQpO1xuICAgICAgaWYgKG5vdGhpbmdUb0V4cG9ydCkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihuZXcgRXhwb3J0Tm90aGluZ1RvRXhwb3J0RXJyb3IoKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2dyZUZvcm1hdHMgPSBPYmplY3Qua2V5cyhFeHBvcnRTZXJ2aWNlLm9ncmVGb3JtYXRzKTtcbiAgICAgIGlmIChvZ3JlRm9ybWF0cy5pbmRleE9mKGZvcm1hdCkgPj0gMCkge1xuICAgICAgICBpZiAoIXRoaXMub2dyZVVybCkge1xuICAgICAgICAgIGlmIChFeHBvcnRTZXJ2aWNlLm5vT2dyZUZhbGxiYWNrcy5pbmRleE9mKGZvcm1hdCkgPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5leHBvcnRUb0ZpbGUoXG4gICAgICAgICAgICAgIG9sRmVhdHVyZXMsXG4gICAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIHByb2plY3Rpb25JbixcbiAgICAgICAgICAgICAgcHJvamVjdGlvbk91dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBFeHBvcnRJbnZhbGlkRmlsZUVycm9yKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5leHBvcnRXaXRoT2dyZShcbiAgICAgICAgICBvbEZlYXR1cmVzLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgcHJvamVjdGlvbkluLFxuICAgICAgICAgIHByb2plY3Rpb25PdXRcbiAgICAgICAgKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiBvYnNlcnZlci5jb21wbGV0ZSgpLFxuICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IG9ic2VydmVyLmVycm9yKGVycm9yKVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwb3J0VG9GaWxlKFxuICAgICAgICAgIG9sRmVhdHVyZXMsXG4gICAgICAgICAgZm9ybWF0LFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHByb2plY3Rpb25JbixcbiAgICAgICAgICBwcm9qZWN0aW9uT3V0XG4gICAgICAgICk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZXhwb3J0VG9GaWxlKFxuICAgIG9sRmVhdHVyZXM6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdLFxuICAgIGZvcm1hdDogQW55RXhwb3J0Rm9ybWF0LFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbkluOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbk91dDogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5mb3JtYXRGZWF0dXJlcyhcbiAgICAgIG9sRmVhdHVyZXMsXG4gICAgICBmb3JtYXQsXG4gICAgICBwcm9qZWN0aW9uSW4sXG4gICAgICBwcm9qZWN0aW9uT3V0XG4gICAgKTtcblxuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7dGl0bGV9LiR7Zm9ybWF0LnRvTG93ZXJDYXNlKCl9YDtcbiAgICBkb3dubG9hZENvbnRlbnQoZmVhdHVyZXMsICdhdHRhY2htZW50L3BsYWluO2NoYXJzZXQ9dXRmLTgnLCBmaWxlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEZlYXR1cmVzKFxuICAgIGZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBmb3JtYXQ6IEFueUV4cG9ydEZvcm1hdCxcbiAgICBwcm9qZWN0aW9uSW4gPSAnRVBTRzo0MzI2JyxcbiAgICBwcm9qZWN0aW9uT3V0ID0gJ0VQU0c6NDMyNidcbiAgKSB7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gdGhpcy5nZXRGb3JtYXR0ZXIoZm9ybWF0KTtcbiAgICBjb25zdCBjbGVhbkZlYXR1cmVzID0gdGhpcy5jbGVhbkZlYXR1cmVzKGZlYXR1cmVzLCBmb3JtYXQsICdfZmVhdHVyZVN0b3JlJyk7XG4gICAgcmV0dXJuIGZvcm1hdHRlci53cml0ZUZlYXR1cmVzKGNsZWFuRmVhdHVyZXMsIHtcbiAgICAgIGRhdGFQcm9qZWN0aW9uOiBwcm9qZWN0aW9uT3V0LFxuICAgICAgZmVhdHVyZVByb2plY3Rpb246IHByb2plY3Rpb25JblxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Rm9ybWF0dGVyKGZvcm1hdDogQW55RXhwb3J0Rm9ybWF0KSB7XG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgJ0dQWCc6XG4gICAgICAgIHJldHVybiBuZXcgb2xmb3JtYXQuR1BYKCk7XG4gICAgICBjYXNlICdHTUwnOlxuICAgICAgICByZXR1cm4gbmV3IG9sZm9ybWF0LkdNTCgpO1xuICAgICAgY2FzZSAnS01MJzpcbiAgICAgICAgcmV0dXJuIG5ldyBvbGZvcm1hdC5LTUwoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgb2xmb3JtYXQuR2VvSlNPTigpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4cG9ydEV4Y2VsKG1hcDogSWdvTWFwLCBzdG9yZTogV29ya3NwYWNlU3RvcmUsIGRhdGE6IEV4cG9ydE9wdGlvbnMpIHtcbiAgICBjb25zdCB7IHV0aWxzLCB3cml0ZUZpbGUgfSA9IGF3YWl0IGltcG9ydCgneGxzeCcpO1xuXG4gICAgY29uc3Qgd29ya2Jvb2sgPSB1dGlscy5ib29rX25ldygpO1xuXG4gICAgZm9yIChjb25zdCBsYXllck5hbWUgb2YgZGF0YS5sYXllcnMpIHtcbiAgICAgIGNvbnN0IGxheWVyID0gbWFwLmdldExheWVyQnlJZChsYXllck5hbWUpO1xuICAgICAgY29uc3QgZmVhdHVyZXMgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmdldEZlYXR1cmVzKG1hcCwgbGF5ZXIsIGRhdGEsIHN0b3JlKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZm9ybWF0dGVkRmVhdHVyZXMgPSBmZWF0dXJlcz8ubGVuZ3RoXG4gICAgICAgID8gdGhpcy5mb3JtYXRGZWF0dXJlcyhmZWF0dXJlcywgJ0dlb0pTT04nKVxuICAgICAgICA6IG51bGw7XG4gICAgICBhd2FpdCB0aGlzLmFkZEV4Y2VsU2hlZXQobGF5ZXIudGl0bGUsIGZvcm1hdHRlZEZlYXR1cmVzLCB3b3JrYm9vayk7XG4gICAgfVxuXG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLmdldFRpdGxlRnJvbUxheWVycyhkYXRhLmxheWVycywgbWFwKTtcbiAgICB3cml0ZUZpbGUod29ya2Jvb2ssIGAke3RpdGxlfS54bHN4YCwgeyBjb21wcmVzc2lvbjogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGl0bGVGcm9tTGF5ZXJzKGxheWVyczogc3RyaW5nW10sIG1hcDogSWdvTWFwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbGF5ZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgPyB0aGlzLmdldExheWVyVGl0bGVGcm9tSWQobGF5ZXJzWzBdLCBtYXApXG4gICAgICA6ICdpZ28nO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYXllclRpdGxlRnJvbUlkKGlkOiBzdHJpbmcsIG1hcDogSWdvTWFwKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXllciA9IG1hcC5nZXRMYXllckJ5SWQoaWQpO1xuICAgIHJldHVybiBsYXllci50aXRsZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkRXhjZWxTaGVldChcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGZlYXR1cmVzOiBzdHJpbmcgfCBudWxsLFxuICAgIHdvcmtib29rOiBXb3JrQm9va1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHV0aWxzIH0gPSBhd2FpdCBpbXBvcnQoJ3hsc3gnKTtcblxuICAgIGNvbnN0IGNvbGxlY3Rpb246IEZlYXR1cmVDb2xsZWN0aW9uID0gZmVhdHVyZXNcbiAgICAgID8gSlNPTi5wYXJzZShmZWF0dXJlcylcbiAgICAgIDoge1xuICAgICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgICB9O1xuICAgIGNvbnN0IHJvd3MgPSBjb2xsZWN0aW9uLmZlYXR1cmVzLm1hcCgoZmVhdHVyZSkgPT5cbiAgICAgIHRoaXMuZm9ybWF0UmVjb3JkKGZlYXR1cmUucHJvcGVydGllcylcbiAgICApO1xuXG4gICAgY29uc3Qgd29ya3NoZWV0ID0gdXRpbHMuanNvbl90b19zaGVldChyb3dzKTtcblxuICAgIC8qIGNhbGN1bGF0ZSBjb2x1bW4gd2lkdGggKi9cbiAgICBpZiAocm93cz8ubGVuZ3RoKSB7XG4gICAgICB3b3Jrc2hlZXRbJyFjb2xzJ10gPSB0aGlzLmdldENvbHVtbnNJbmZvKHJvd3MpO1xuICAgIH1cblxuICAgIGNvbnN0IFNIRUVUX05BTUVfTUFYX0xFTkdUSCA9IDMxO1xuICAgIGxldCBzaGVldE5hbWUgPVxuICAgICAgdGl0bGUubGVuZ3RoID49IFNIRUVUX05BTUVfTUFYX0xFTkdUSFxuICAgICAgICA/IHRpdGxlLnN1YnN0cmluZygwLCBTSEVFVF9OQU1FX01BWF9MRU5HVEgpXG4gICAgICAgIDogdGl0bGU7XG5cbiAgICBpZiAod29ya2Jvb2suU2hlZXROYW1lcy5pbmNsdWRlcyhzaGVldE5hbWUpKSB7XG4gICAgICBzaGVldE5hbWUgPSBgJHtzaGVldE5hbWUuc3Vic3RyaW5nKDAsIFNIRUVUX05BTUVfTUFYX0xFTkdUSCAtIDMpfV8ke3dvcmtib29rLlNoZWV0TmFtZXMubGVuZ3RofWA7XG4gICAgfVxuXG4gICAgdXRpbHMuYm9va19hcHBlbmRfc2hlZXQod29ya2Jvb2ssIHdvcmtzaGVldCwgc2hlZXROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhyZWNvcmQpLnJlZHVjZSgoZm9ybWF0dGVkLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGZvcm1hdHRlZFtrZXldID0gdGhpcy5mb3JtYXREYXRhVHlwZSh2YWx1ZSk7XG4gICAgICByZXR1cm4gZm9ybWF0dGVkO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RGF0YVR5cGUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgIGNhc2UgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoaXNJc29EYXRlKHZhbHVlIGFzIHN0cmluZykpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUgYXMgc3RyaW5nKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgY2FzZSB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnOlxuICAgICAgY2FzZSB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5OiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2x1bW5zSW5mbyhyb3dzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10pOiBDb2xJbmZvW10ge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBPYmplY3Qua2V5cyhyb3dzWzBdKTtcbiAgICByZXR1cm4gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gKHtcbiAgICAgIHdjaDogdGhpcy5nZXRDb2x1bW5NYXhXaWR0aChjb2x1bW4sIHJvd3MpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2x1bW5NYXhXaWR0aChcbiAgICBjb2x1bW46IHN0cmluZyxcbiAgICByb3dzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcm93cy5yZWR1Y2UoXG4gICAgICAod2lkdGgsIHJvdykgPT4gTWF0aC5tYXgod2lkdGgsIHJvd1tjb2x1bW5dPy5sZW5ndGggPz8gMCksXG4gICAgICBjb2x1bW4ubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwb3J0V2l0aE9ncmUoXG4gICAgb2xGZWF0dXJlczogT2xGZWF0dXJlPE9sR2VvbWV0cnk+W10sXG4gICAgeyBmb3JtYXQsIGNzdlNlcGFyYXRvciA9IG51bGwgfTogRXhwb3J0T3B0aW9ucyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHByb2plY3Rpb25Jbjogc3RyaW5nLFxuICAgIHByb2plY3Rpb25PdXQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBmZWF0dXJlc1RleHQgPSBuZXcgb2xmb3JtYXQuR2VvSlNPTigpLndyaXRlRmVhdHVyZXMob2xGZWF0dXJlcywge1xuICAgICAgZGF0YVByb2plY3Rpb246IHByb2plY3Rpb25PdXQsXG4gICAgICBmZWF0dXJlUHJvamVjdGlvbjogcHJvamVjdGlvbkluXG4gICAgfSk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vZ3JlVXJsfS9jb252ZXJ0SnNvbmA7XG5cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgZm9ybURhdGEuYXBwZW5kKCdqc29uJywgZmVhdHVyZXNUZXh0KTtcblxuICAgIGxldCBvdXRwdXROYW1lID1cbiAgICAgIGZvcm1hdCA9PT0gJ1NoYXBlZmlsZSdcbiAgICAgICAgPyBgJHt0aXRsZX0uemlwYFxuICAgICAgICA6IGAke3RpdGxlfS4ke2Zvcm1hdC50b0xvd2VyQ2FzZSgpfWA7XG4gICAgbGV0IG9ncmVGb3JtYXQgPSBFeHBvcnRTZXJ2aWNlLm9ncmVGb3JtYXRzW2Zvcm1hdF07XG5cbiAgICBpZiAoaXNDc3ZFeHBvcnQoZm9ybWF0KSkge1xuICAgICAgb3V0cHV0TmFtZSA9IGAke3RpdGxlfS5jc3ZgO1xuXG4gICAgICBpZiAoZm9ybWF0ID09PSAnQ1NWY29tbWEnIHx8IGZvcm1hdCA9PT0gJ0NTVnNlbWljb2xvbicpIHtcbiAgICAgICAgb2dyZUZvcm1hdCA9ICdDU1YnO1xuICAgICAgfVxuXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2xjbycsIGBTRVBBUkFUT1I9JHtjc3ZTZXBhcmF0b3J9YCk7XG5cbiAgICAgIGlmIChmb3JtYXQgPT09ICdDU1ZzZW1pY29sb24nKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnbGNvJywgYFNFUEFSQVRPUj0ke2NzdlNlcGFyYXRvcn1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQoJ291dHB1dE5hbWUnLCB0aGlzLmZvcm1hdEZpbGVuYW1lKG91dHB1dE5hbWUpKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2Zvcm1hdCcsIG9ncmVGb3JtYXQpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLnBvc3QodXJsLCBmb3JtRGF0YSwge1xuICAgICAgICByZXNwb25zZVR5cGU6ICdibG9iJ1xuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgZG93bmxvYWRCbG9iKHZhbHVlLCBvdXRwdXROYW1lKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWVcbiAgICAgIC5yZXBsYWNlQWxsKCcgJywgJ18nKVxuICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC/igJkvZywgXCInXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RoaW5nVG9FeHBvcnQoXG4gICAgb2xGZWF0dXJlczogT2xGZWF0dXJlPE9sR2VvbWV0cnk+W10sXG4gICAgZm9ybWF0OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKG9sRmVhdHVyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGZvcm1hdCA9PT0gJ0dQWCcpIHtcbiAgICAgIGNvbnN0IHBvaW50T3JMaW5lID0gb2xGZWF0dXJlcy5maW5kKChvbEZlYXR1cmUpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBbJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnTXVsdGlMaW5lU3RyaW5nJ10uaW5kZXhPZihcbiAgICAgICAgICAgIG9sRmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKVxuICAgICAgICAgICkgPj0gMFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcG9pbnRPckxpbmUgPT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGZWF0dXJlc0Zyb21NYXAoXG4gICAgbGF5ZXI6IFZlY3RvckxheWVyLFxuICAgIG9wdGlvbnM6IEV4cG9ydE9wdGlvbnNcbiAgKTogT2xGZWF0dXJlW10ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBsYXllci5kYXRhU291cmNlLm9sO1xuICAgIGNvbnN0IGV4dGVudCA9IGxheWVyLm1hcC52aWV3Q29udHJvbGxlci5nZXRFeHRlbnQoKTtcblxuICAgIGxldCBmZWF0dXJlczogT2xGZWF0dXJlW10gPSBvcHRpb25zLmZlYXR1cmVJbk1hcEV4dGVudFxuICAgICAgPyBkYXRhU291cmNlLmdldEZlYXR1cmVzSW5FeHRlbnQoZXh0ZW50KVxuICAgICAgOiBkYXRhU291cmNlLmdldEZlYXR1cmVzKCk7XG5cbiAgICBpZiAobGF5ZXIuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIENsdXN0ZXJEYXRhU291cmNlKSB7XG4gICAgICBmZWF0dXJlcyA9IGZlYXR1cmVzLmZsYXRNYXAoKGNsdXN0ZXIpID0+IGNsdXN0ZXIuZ2V0KCdmZWF0dXJlcycpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGZWF0dXJlc0Zyb21Xb3Jrc3BhY2UoXG4gICAgd2tzOiBXb3Jrc3BhY2UsXG4gICAgbGF5ZXJOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogRXhwb3J0T3B0aW9uc1xuICApOiBPbEZlYXR1cmVbXSB7XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gZGF0YS5sYXllcnNXaXRoU2VsZWN0aW9uLmluZGV4T2YobGF5ZXJOYW1lKSAhPT0gLTE7XG4gICAgY29uc3QgaXNJbk1hcEV4dGVudCA9IGRhdGEuZmVhdHVyZUluTWFwRXh0ZW50O1xuICAgIGlmIChoYXNTZWxlY3Rpb24gJiYgaXNJbk1hcEV4dGVudCkge1xuICAgICAgLy8gT25seSBleHBvcnQgc2VsZWN0ZWQgZmVhdHVyZSAmJiBpbnRvIG1hcCBleHRlbnRcbiAgICAgIHJldHVybiB3a3MuZW50aXR5U3RvcmUuc3RhdGVWaWV3XG4gICAgICAgIC5hbGwoKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChlOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PikgPT4gZS5zdGF0ZS5pbk1hcEV4dGVudCAmJiBlLnN0YXRlLnNlbGVjdGVkXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoZSkgPT4gKGUuZW50aXR5IGFzIEZlYXR1cmUpLm9sIGFzIE9sRmVhdHVyZSk7XG4gICAgfSBlbHNlIGlmIChoYXNTZWxlY3Rpb24gJiYgIWlzSW5NYXBFeHRlbnQpIHtcbiAgICAgIC8vIE9ubHkgZXhwb3J0IHNlbGVjdGVkIGZlYXR1cmUgJiYgIChpbnRvIG1hcCBleHRlbnQgT1Igbm90KVxuICAgICAgcmV0dXJuIHdrcy5lbnRpdHlTdG9yZS5zdGF0ZVZpZXdcbiAgICAgICAgLmFsbCgpXG4gICAgICAgIC5maWx0ZXIoKGU6IEVudGl0eVJlY29yZDxvYmplY3Q+KSA9PiBlLnN0YXRlLnNlbGVjdGVkKVxuICAgICAgICAubWFwKChlKSA9PiAoZS5lbnRpdHkgYXMgRmVhdHVyZSkub2wgYXMgT2xGZWF0dXJlKTtcbiAgICB9IGVsc2UgaWYgKGlzSW5NYXBFeHRlbnQpIHtcbiAgICAgIC8vIE9ubHkgaW50byBtYXAgZXh0ZW50XG4gICAgICByZXR1cm4gd2tzLmVudGl0eVN0b3JlLnN0YXRlVmlld1xuICAgICAgICAuYWxsKClcbiAgICAgICAgLmZpbHRlcigoZTogRW50aXR5UmVjb3JkPG9iamVjdD4pID0+IGUuc3RhdGUuaW5NYXBFeHRlbnQpXG4gICAgICAgIC5tYXAoKGUpID0+IChlLmVudGl0eSBhcyBGZWF0dXJlKS5vbCBhcyBPbEZlYXR1cmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBbGwgZmVhdHVyZXNcbiAgICAgIHJldHVybiB3a3MuZW50aXR5U3RvcmUuc3RhdGVWaWV3XG4gICAgICAgIC5hbGwoKVxuICAgICAgICAubWFwKChlKSA9PiAoZS5lbnRpdHkgYXMgRmVhdHVyZSkub2wgYXMgT2xGZWF0dXJlKTtcbiAgICB9XG4gIH1cblxuICBnZXRGZWF0dXJlcyhcbiAgICBtYXA6IElnb01hcCxcbiAgICBsYXllcjogQW55TGF5ZXIsXG4gICAgZGF0YTogRXhwb3J0T3B0aW9ucyxcbiAgICBzdG9yZTogV29ya3NwYWNlU3RvcmVcbiAgKTogT2JzZXJ2YWJsZTxPbEZlYXR1cmVbXT4ge1xuICAgIGNvbnN0IHByb2plY3Rpb24gPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0T2xQcm9qZWN0aW9uKCk7XG4gICAgY29uc3QgZXh0ZW50ID0gZGF0YS5mZWF0dXJlSW5NYXBFeHRlbnRcbiAgICAgID8gbWFwLnZpZXdDb250cm9sbGVyLmdldEV4dGVudCgpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChsYXllci5kYXRhU291cmNlIGluc3RhbmNlb2YgV0ZTRGF0YVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGxheWVyLmRhdGFTb3VyY2VcbiAgICAgICAgLmZldGNoRmVhdHVyZXMoe1xuICAgICAgICAgIGV4dGVudCxcbiAgICAgICAgICBwcm9qZWN0aW9uLFxuICAgICAgICAgIGh0dHBDbGllbnQ6IHRoaXMuaHR0cENsaWVudFxuICAgICAgICB9KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8vIEZpbHRlciBzcGF0aWFsIHVzZSBleHRlcm5hbCBBUEkgdG8gbWFrZSBxdWVyeSBhbmQgdXNlIFdvcmtzcGFjZSB0byBzdG9yZSBkYXRhXG4gICAgZWxzZSBpZiAobGF5ZXIub3B0aW9ucy53b3Jrc3BhY2U/LmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHdrcyA9IHRoaXMuZ2V0V29ya3NwYWNlQnlMYXllcklkKGxheWVyLmlkLCBzdG9yZSk7XG4gICAgICBpZiAod2tzPy5lbnRpdHlTdG9yZT8uc3RhdGVWaWV3LmFsbCgpLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuZ2V0RmVhdHVyZXNGcm9tV29ya3NwYWNlKHdrcywgbGF5ZXIuaWQsIGRhdGEpO1xuICAgICAgICByZXR1cm4gb2YoZmVhdHVyZXMpLnBpcGUoXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZSkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobGF5ZXIgaW5zdGFuY2VvZiBWZWN0b3JMYXllcikge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuZ2V0RmVhdHVyZXNGcm9tTWFwKGxheWVyLCBkYXRhKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mKFtdKTtcbiAgfVxuXG4gIGdldFdvcmtzcGFjZUJ5TGF5ZXJJZChpZDogc3RyaW5nLCBzdG9yZTogV29ya3NwYWNlU3RvcmUpOiBXb3Jrc3BhY2Uge1xuICAgIGNvbnN0IHdrc0Zyb21MYXllcklkID0gc3RvcmVcbiAgICAgIC5hbGwoKVxuICAgICAgLmZpbmQoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgKHdvcmtzcGFjZSBhcyBXZnNXb3Jrc3BhY2UgfCBGZWF0dXJlV29ya3NwYWNlIHwgRWRpdGlvbldvcmtzcGFjZSlcbiAgICAgICAgICAgIC5sYXllci5pZCA9PT0gaWRcbiAgICAgICk7XG4gICAgaWYgKHdrc0Zyb21MYXllcklkKSB7XG4gICAgICByZXR1cm4gd2tzRnJvbUxheWVySWQ7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGdldEdlb21UeXBlcyhcbiAgICBmZWF0dXJlczogT2xGZWF0dXJlW10sXG4gICAgZm9ybWF0PzogQW55RXhwb3J0Rm9ybWF0XG4gICk6IEdlb21ldHJ5Q29sbGVjdGlvbltdIHtcbiAgICBsZXQgZ2VvbVR5cGVzOiBHZW9tZXRyeUNvbGxlY3Rpb25bXSA9IFtdO1xuICAgIGlmIChmb3JtYXQgPT09ICdTaGFwZWZpbGUnIHx8IGZvcm1hdCA9PT0gJ0dQWCcpIHtcbiAgICAgIGZlYXR1cmVzLmZvckVhY2goKG9sRmVhdHVyZSkgPT4ge1xuICAgICAgICBjb25zdCBmZWF0dXJlR2VvbVR5cGUgPSBvbEZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRUeXBlKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRHZW9tVHlwZSA9IGdlb21UeXBlcy5maW5kKFxuICAgICAgICAgIChnZW9tVHlwZSkgPT4gZ2VvbVR5cGUudHlwZSA9PT0gZmVhdHVyZUdlb21UeXBlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChjdXJyZW50R2VvbVR5cGUpIHtcbiAgICAgICAgICBjdXJyZW50R2VvbVR5cGUuZmVhdHVyZXMucHVzaChvbEZlYXR1cmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdlb21UeXBlcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IGZlYXR1cmVHZW9tVHlwZSxcbiAgICAgICAgICAgIGZlYXR1cmVzOiBbb2xGZWF0dXJlXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VvbVR5cGVzID0gW3sgdHlwZTogbnVsbCwgZmVhdHVyZXM6IGZlYXR1cmVzIH1dO1xuICAgIH1cblxuICAgIGdlb21UeXBlcy5mb3JFYWNoKChnZW9tVHlwZSkgPT4ge1xuICAgICAgZ2VvbVR5cGUuZmVhdHVyZXMuZm9yRWFjaCgoZmVhdHVyZSkgPT4ge1xuICAgICAgICBjb25zdCByYWRpdXM6IG51bWJlciA9IGZlYXR1cmUuZ2V0KCdyYWQnKTtcbiAgICAgICAgaWYgKHJhZGl1cykge1xuICAgICAgICAgIGNvbnN0IGNlbnRlcjQzMjY6IEFycmF5PG51bWJlcj4gPSBbXG4gICAgICAgICAgICBmZWF0dXJlLmdldCgnbG9uZ2l0dWRlJyksXG4gICAgICAgICAgICBmZWF0dXJlLmdldCgnbGF0aXR1ZGUnKVxuICAgICAgICAgIF07XG4gICAgICAgICAgY29uc3QgY2lyY2xlID0gY2lyY3VsYXIoY2VudGVyNDMyNiwgcmFkaXVzLCA1MDApO1xuICAgICAgICAgIGNpcmNsZS50cmFuc2Zvcm0oJ0VQU0c6NDMyNicsIGZlYXR1cmUuZ2V0KCdfcHJvamVjdGlvbicpKTtcbiAgICAgICAgICBmZWF0dXJlLnNldEdlb21ldHJ5KGNpcmNsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdlb21UeXBlcztcbiAgfVxufVxuIl19
|
|
375
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9pbXBvcnQtZXhwb3J0L3NoYXJlZC9leHBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIsWUFBWSxFQUNaLGVBQWUsRUFDZixTQUFTLEVBQ1QsY0FBYyxFQUNmLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0MsT0FBTyxFQUFFLFVBQVUsRUFBWSxVQUFVLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBFLE9BQU8sRUFBWSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFPcEQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QiwwQkFBMEIsRUFDM0IsTUFBTSxpQkFBaUIsQ0FBQztBQUd6QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFFN0MsTUFBTSwwQkFBMEIsR0FBRyxHQUFHLENBQUM7QUFLdkMsTUFBTSxPQUFPLGFBQWE7SUFtQmQ7SUFDQTtJQW5CVixNQUFNLENBQUMsV0FBVyxHQUFxQztRQUNyRCxHQUFHLEVBQUUsS0FBSztR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VSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDakQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO29CQUMxRCxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM5QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7d0dBNWZVLGFBQWE7NEdBQWIsYUFBYSxjQUZaLE1BQU07OzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRW50aXR5UmVjb3JkIH0gZnJvbSAnQGlnbzIvY29tbW9uL2VudGl0eSc7XG5pbXBvcnQgeyBXb3Jrc3BhY2UsIFdvcmtzcGFjZVN0b3JlIH0gZnJvbSAnQGlnbzIvY29tbW9uL3dvcmtzcGFjZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9jb25maWcnO1xuaW1wb3J0IHtcbiAgYWRkRXhjZWxTaGVldFRvV29ya0Jvb2ssXG4gIGNyZWF0ZUV4Y2VsV29ya0Jvb2ssXG4gIGRvd25sb2FkQmxvYixcbiAgZG93bmxvYWRDb250ZW50LFxuICBpc0lzb0RhdGUsXG4gIHdyaXRlRXhjZWxGaWxlXG59IGZyb20gJ0BpZ28yL3V0aWxzJztcblxuaW1wb3J0IE9sRmVhdHVyZSBmcm9tICdvbC9GZWF0dXJlJztcbmltcG9ydCAqIGFzIG9sZm9ybWF0IGZyb20gJ29sL2Zvcm1hdCc7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuaW1wb3J0IHsgY2lyY3VsYXIgfSBmcm9tICdvbC9nZW9tL1BvbHlnb24nO1xuXG5pbXBvcnQgeyBGZWF0dXJlQ29sbGVjdGlvbiB9IGZyb20gJ2dlb2pzb24nO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIGNhdGNoRXJyb3IsIGxhc3RWYWx1ZUZyb20sIG9mLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ2x1c3RlckRhdGFTb3VyY2UsIFdGU0RhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9kYXRhc291cmNlJztcbmltcG9ydCB7IEZlYXR1cmUgfSBmcm9tICcuLi8uLi9mZWF0dXJlJztcbmltcG9ydCB7IEFueUxheWVyLCBWZWN0b3JMYXllciB9IGZyb20gJy4uLy4uL2xheWVyJztcbmltcG9ydCB7IElnb01hcCB9IGZyb20gJy4uLy4uL21hcCc7XG5pbXBvcnQge1xuICBFZGl0aW9uV29ya3NwYWNlLFxuICBGZWF0dXJlV29ya3NwYWNlLFxuICBXZnNXb3Jrc3BhY2Vcbn0gZnJvbSAnLi4vLi4vd29ya3NwYWNlJztcbmltcG9ydCB7XG4gIEV4cG9ydEludmFsaWRGaWxlRXJyb3IsXG4gIEV4cG9ydE5vdGhpbmdUb0V4cG9ydEVycm9yXG59IGZyb20gJy4vZXhwb3J0LmVycm9ycyc7XG5pbXBvcnQgeyBFeHBvcnRPcHRpb25zLCBHZW9tZXRyeUNvbGxlY3Rpb24gfSBmcm9tICcuL2V4cG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQW55RXhwb3J0Rm9ybWF0LCBFeHBvcnRPZ3JlRm9ybWF0IH0gZnJvbSAnLi9leHBvcnQudHlwZSc7XG5pbXBvcnQgeyBpc0NzdkV4cG9ydCB9IGZyb20gJy4vZXhwb3J0LnV0aWxzJztcblxuY29uc3QgU0hBUEVGSUxFX0ZJRUxEX01BWF9MRU5HSFQgPSAyNTU7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEV4cG9ydFNlcnZpY2Uge1xuICBzdGF0aWMgb2dyZUZvcm1hdHM6IFJlY29yZDxFeHBvcnRPZ3JlRm9ybWF0LCBzdHJpbmc+ID0ge1xuICAgIEdNTDogJ2dtbCcsXG4gICAgR1BYOiAnZ3B4JyxcbiAgICBLTUw6ICdrbWwnLFxuICAgIFNoYXBlZmlsZTogJ0VTUkkgU2hhcGVmaWxlJyxcbiAgICBDU1Y6ICdDU1YnLFxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgQ1NWICovXG4gICAgQ1NWY29tbWE6ICdDU1Zjb21tYScsXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBDU1YgKi9cbiAgICBDU1ZzZW1pY29sb246ICdDU1ZzZW1pY29sb24nXG4gIH07XG5cbiAgc3RhdGljIG5vT2dyZUZhbGxiYWNrczogUGFydGlhbDxBbnlFeHBvcnRGb3JtYXRbXT4gPSBbJ0dNTCcsICdHUFgnLCAnS01MJ107XG5cbiAgcHJpdmF0ZSBvZ3JlVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgYWdncmVnYXRlSW5Db21tZW50ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnRcbiAgKSB7XG4gICAgdGhpcy5vZ3JlVXJsID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdpbXBvcnRFeHBvcnQudXJsJyk7XG4gICAgY29uc3QgZ3B4QWdncmVnYXRlSW5Db21tZW50ID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKFxuICAgICAgJ2ltcG9ydEV4cG9ydC5ncHhBZ2dyZWdhdGVJbkNvbW1lbnQnXG4gICAgKTtcbiAgICBpZiAoZ3B4QWdncmVnYXRlSW5Db21tZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWdncmVnYXRlSW5Db21tZW50ID0gZ3B4QWdncmVnYXRlSW5Db21tZW50O1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydChcbiAgICBvbEZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBvcHRpb25zOiBFeHBvcnRPcHRpb25zLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbkluID0gJ0VQU0c6NDMyNicsXG4gICAgcHJvamVjdGlvbk91dCA9ICdFUFNHOjQzMjYnXG4gICk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IGV4cG9ydE9sRmVhdHVyZXMgPSB0aGlzLmNsZWFuRmVhdHVyZXMoXG4gICAgICBvbEZlYXR1cmVzLFxuICAgICAgb3B0aW9ucy5mb3JtYXQsXG4gICAgICAnX2ZlYXR1cmVTdG9yZSdcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhwb3J0QXN5bmMoXG4gICAgICBleHBvcnRPbEZlYXR1cmVzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHRpdGxlLFxuICAgICAgcHJvamVjdGlvbkluLFxuICAgICAgcHJvamVjdGlvbk91dFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xlYW5GZWF0dXJlcyhcbiAgICBvbEZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBmb3JtYXQ6IEFueUV4cG9ydEZvcm1hdCxcbiAgICBleGNsdWRlUHJlZml4ID0gJ18nXG4gICk6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdIHtcbiAgICBpZiAoZm9ybWF0ID09PSAnR1BYJyAmJiB0aGlzLmFnZ3JlZ2F0ZUluQ29tbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVBZ2dyZWdhdGVkRmVhdHVyZShvbEZlYXR1cmVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2xGZWF0dXJlcy5tYXAoKG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+KSA9PiB7XG4gICAgICBsZXQga2V5cyA9IG9sRmVhdHVyZVxuICAgICAgICAuZ2V0S2V5cygpXG4gICAgICAgIC5maWx0ZXIoKGtleTogc3RyaW5nKSA9PiAha2V5LnN0YXJ0c1dpdGgoZXhjbHVkZVByZWZpeCkpO1xuXG4gICAgICBpZiAoZm9ybWF0ID09PSAnU2hhcGVmaWxlJyAmJiBvbEZlYXR1cmUuZ2V0KCdfc3R5bGUnKSkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IEpTT04uc3RyaW5naWZ5KG9sRmVhdHVyZS5nZXQoJ19zdHlsZScpKTtcbiAgICAgICAgaWYgKHN0eWxlLmxlbmd0aCA+IFNIQVBFRklMRV9GSUVMRF9NQVhfTEVOR0hUKVxuICAgICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdfc3R5bGUnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IGtleXMucmVkdWNlKFxuICAgICAgICAoYWNjOiBvYmplY3QsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgYWNjW2tleV0gPSBvbEZlYXR1cmUuZ2V0KGtleSk7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgeyBnZW9tZXRyeTogb2xGZWF0dXJlLmdldEdlb21ldHJ5KCkgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgT2xGZWF0dXJlKHByb3BlcnRpZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUFnZ3JlZ2F0ZWRGZWF0dXJlKFxuICAgIG9sRmVhdHVyZXM6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdXG4gICk6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdIHtcbiAgICByZXR1cm4gb2xGZWF0dXJlcy5tYXAoKG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+KSA9PiB7XG4gICAgICBjb25zdCBrZXlzID0gb2xGZWF0dXJlXG4gICAgICAgIC5nZXRLZXlzKClcbiAgICAgICAgLmZpbHRlcigoa2V5OiBzdHJpbmcpID0+ICFrZXkuc3RhcnRzV2l0aCgnXycpKTtcbiAgICAgIGxldCBjb21tZW50ID0gJyc7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0ga2V5cy5yZWR1Y2UoXG4gICAgICAgIChhY2M6IG9iamVjdCwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ICYmIGtleSAhPT0gJ2dlb21ldHJ5Jykge1xuICAgICAgICAgICAga2V5ID09PSAnaWQnICYmIG9sRmVhdHVyZS5nZXQoJ2RyYXcnKVxuICAgICAgICAgICAgICA/IChjb21tZW50ICs9IGtleSArICc6JyArIG9sRmVhdHVyZS5nZXQoJ2RyYXcnKSArICcgICBcXHJcXG4nKVxuICAgICAgICAgICAgICA6IChjb21tZW50ICs9IGtleSArICc6JyArIG9sRmVhdHVyZS5nZXQoa2V5KSArICcgICBcXHJcXG4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWNjW2tleV0gPSBvbEZlYXR1cmUuZ2V0KGtleSk7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGdlb21ldHJ5OiBvbEZlYXR1cmUuZ2V0R2VvbWV0cnkoKVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgY29uc3QgbmV3RmVhdHVyZSA9IG5ldyBPbEZlYXR1cmUocHJvcGVydGllcyk7XG4gICAgICBuZXdGZWF0dXJlLnNldCgnbmFtZScsIG9sRmVhdHVyZS5nZXRJZCgpKTtcbiAgICAgIG5ld0ZlYXR1cmUuc2V0KCdjbXQnLCBjb21tZW50KTtcblxuICAgICAgcmV0dXJuIG5ld0ZlYXR1cmU7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGV4cG9ydEFzeW5jKFxuICAgIG9sRmVhdHVyZXM6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdLFxuICAgIG9wdGlvbnM6IEV4cG9ydE9wdGlvbnMsXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBwcm9qZWN0aW9uSW46IHN0cmluZyxcbiAgICBwcm9qZWN0aW9uT3V0OiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmb3JtYXQgfSA9IG9wdGlvbnM7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8dm9pZD4pID0+IHtcbiAgICAgIGNvbnN0IG5vdGhpbmdUb0V4cG9ydCA9IHRoaXMubm90aGluZ1RvRXhwb3J0KG9sRmVhdHVyZXMsIGZvcm1hdCk7XG4gICAgICBpZiAobm90aGluZ1RvRXhwb3J0KSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBFeHBvcnROb3RoaW5nVG9FeHBvcnRFcnJvcigpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvZ3JlRm9ybWF0cyA9IE9iamVjdC5rZXlzKEV4cG9ydFNlcnZpY2Uub2dyZUZvcm1hdHMpO1xuICAgICAgaWYgKG9ncmVGb3JtYXRzLmluZGV4T2YoZm9ybWF0KSA+PSAwKSB7XG4gICAgICAgIGlmICghdGhpcy5vZ3JlVXJsKSB7XG4gICAgICAgICAgaWYgKEV4cG9ydFNlcnZpY2Uubm9PZ3JlRmFsbGJhY2tzLmluZGV4T2YoZm9ybWF0KSA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmV4cG9ydFRvRmlsZShcbiAgICAgICAgICAgICAgb2xGZWF0dXJlcyxcbiAgICAgICAgICAgICAgZm9ybWF0LFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgcHJvamVjdGlvbkluLFxuICAgICAgICAgICAgICBwcm9qZWN0aW9uT3V0XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEV4cG9ydEludmFsaWRGaWxlRXJyb3IoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4cG9ydFdpdGhPZ3JlKFxuICAgICAgICAgIG9sRmVhdHVyZXMsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICBwcm9qZWN0aW9uSW4sXG4gICAgICAgICAgcHJvamVjdGlvbk91dFxuICAgICAgICApLnN1YnNjcmliZSh7XG4gICAgICAgICAgY29tcGxldGU6ICgpID0+IG9ic2VydmVyLmNvbXBsZXRlKCksXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4gb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leHBvcnRUb0ZpbGUoXG4gICAgICAgICAgb2xGZWF0dXJlcyxcbiAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgcHJvamVjdGlvbkluLFxuICAgICAgICAgIHByb2plY3Rpb25PdXRcbiAgICAgICAgKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBleHBvcnRUb0ZpbGUoXG4gICAgb2xGZWF0dXJlczogT2xGZWF0dXJlPE9sR2VvbWV0cnk+W10sXG4gICAgZm9ybWF0OiBBbnlFeHBvcnRGb3JtYXQsXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBwcm9qZWN0aW9uSW46IHN0cmluZyxcbiAgICBwcm9qZWN0aW9uT3V0OiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmZvcm1hdEZlYXR1cmVzKFxuICAgICAgb2xGZWF0dXJlcyxcbiAgICAgIGZvcm1hdCxcbiAgICAgIHByb2plY3Rpb25JbixcbiAgICAgIHByb2plY3Rpb25PdXRcbiAgICApO1xuXG4gICAgY29uc3QgZmlsZU5hbWUgPSBgJHt0aXRsZX0uJHtmb3JtYXQudG9Mb3dlckNhc2UoKX1gO1xuICAgIGRvd25sb2FkQ29udGVudChmZWF0dXJlcywgJ2F0dGFjaG1lbnQvcGxhaW47Y2hhcnNldD11dGYtOCcsIGZpbGVOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RmVhdHVyZXMoXG4gICAgZmVhdHVyZXM6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdLFxuICAgIGZvcm1hdDogQW55RXhwb3J0Rm9ybWF0LFxuICAgIHByb2plY3Rpb25JbiA9ICdFUFNHOjQzMjYnLFxuICAgIHByb2plY3Rpb25PdXQgPSAnRVBTRzo0MzI2J1xuICApIHtcbiAgICBjb25zdCBmb3JtYXR0ZXIgPSB0aGlzLmdldEZvcm1hdHRlcihmb3JtYXQpO1xuICAgIGNvbnN0IGNsZWFuRmVhdHVyZXMgPSB0aGlzLmNsZWFuRmVhdHVyZXMoZmVhdHVyZXMsIGZvcm1hdCwgJ19mZWF0dXJlU3RvcmUnKTtcbiAgICByZXR1cm4gZm9ybWF0dGVyLndyaXRlRmVhdHVyZXMoY2xlYW5GZWF0dXJlcywge1xuICAgICAgZGF0YVByb2plY3Rpb246IHByb2plY3Rpb25PdXQsXG4gICAgICBmZWF0dXJlUHJvamVjdGlvbjogcHJvamVjdGlvbkluXG4gICAgfSk7XG4gIH1cblxuICBnZXRGb3JtYXR0ZXIoZm9ybWF0OiBBbnlFeHBvcnRGb3JtYXQpIHtcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSAnR1BYJzpcbiAgICAgICAgcmV0dXJuIG5ldyBvbGZvcm1hdC5HUFgoKTtcbiAgICAgIGNhc2UgJ0dNTCc6XG4gICAgICAgIHJldHVybiBuZXcgb2xmb3JtYXQuR01MKCk7XG4gICAgICBjYXNlICdLTUwnOlxuICAgICAgICByZXR1cm4gbmV3IG9sZm9ybWF0LktNTCgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBvbGZvcm1hdC5HZW9KU09OKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXhwb3J0RXhjZWwobWFwOiBJZ29NYXAsIHN0b3JlOiBXb3Jrc3BhY2VTdG9yZSwgZGF0YTogRXhwb3J0T3B0aW9ucykge1xuICAgIGNvbnN0IHdvcmtCb29rID0gYXdhaXQgY3JlYXRlRXhjZWxXb3JrQm9vaygpO1xuXG4gICAgZm9yIChjb25zdCBsYXllck5hbWUgb2YgZGF0YS5sYXllcnMpIHtcbiAgICAgIGNvbnN0IGxheWVyID0gbWFwLmdldExheWVyQnlJZChsYXllck5hbWUpO1xuICAgICAgY29uc3QgZmVhdHVyZXMgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmdldEZlYXR1cmVzKG1hcCwgbGF5ZXIsIGRhdGEsIHN0b3JlKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZm9ybWF0dGVkRmVhdHVyZXMgPSBmZWF0dXJlcz8ubGVuZ3RoXG4gICAgICAgID8gdGhpcy5mb3JtYXRGZWF0dXJlcyhmZWF0dXJlcywgJ0dlb0pTT04nKVxuICAgICAgICA6IG51bGw7XG5cbiAgICAgIGNvbnN0IGNvbGxlY3Rpb246IEZlYXR1cmVDb2xsZWN0aW9uID0gZmVhdHVyZXNcbiAgICAgICAgPyBKU09OLnBhcnNlKGZvcm1hdHRlZEZlYXR1cmVzKVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgICAgIH07XG4gICAgICBjb25zdCByb3dzID0gY29sbGVjdGlvbi5mZWF0dXJlcy5tYXAoKGZlYXR1cmUpID0+XG4gICAgICAgIHRoaXMuZm9ybWF0UmVjb3JkKGZlYXR1cmUucHJvcGVydGllcylcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IGFkZEV4Y2VsU2hlZXRUb1dvcmtCb29rKGxheWVyLnRpdGxlLCByb3dzLCB3b3JrQm9vayk7XG4gICAgfVxuXG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLmdldFRpdGxlRnJvbUxheWVycyhkYXRhLmxheWVycywgbWFwKTtcbiAgICB3cml0ZUV4Y2VsRmlsZSh3b3JrQm9vaywgdGl0bGUsIHsgY29tcHJlc3Npb246IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRpdGxlRnJvbUxheWVycyhsYXllcnM6IHN0cmluZ1tdLCBtYXA6IElnb01hcCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxheWVycy5sZW5ndGggPT09IDFcbiAgICAgID8gdGhpcy5nZXRMYXllclRpdGxlRnJvbUlkKGxheWVyc1swXSwgbWFwKVxuICAgICAgOiAnaWdvJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGF5ZXJUaXRsZUZyb21JZChpZDogc3RyaW5nLCBtYXA6IElnb01hcCk6IHN0cmluZyB7XG4gICAgY29uc3QgbGF5ZXIgPSBtYXAuZ2V0TGF5ZXJCeUlkKGlkKTtcbiAgICByZXR1cm4gbGF5ZXIudGl0bGU7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFJlY29yZChcbiAgICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVjb3JkKS5yZWR1Y2UoKGZvcm1hdHRlZCwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBmb3JtYXR0ZWRba2V5XSA9IHRoaXMuZm9ybWF0RGF0YVR5cGUodmFsdWUpO1xuICAgICAgcmV0dXJuIGZvcm1hdHRlZDtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdERhdGFUeXBlKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICBjYXNlIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc6IHtcbiAgICAgICAgaWYgKGlzSXNvRGF0ZSh2YWx1ZSBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlIGFzIHN0cmluZykudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JzpcbiAgICAgIGNhc2UgdmFsdWUgaW5zdGFuY2VvZiBBcnJheToge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXhwb3J0V2l0aE9ncmUoXG4gICAgb2xGZWF0dXJlczogT2xGZWF0dXJlPE9sR2VvbWV0cnk+W10sXG4gICAgeyBmb3JtYXQsIGNzdlNlcGFyYXRvciA9IG51bGwgfTogRXhwb3J0T3B0aW9ucyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHByb2plY3Rpb25Jbjogc3RyaW5nLFxuICAgIHByb2plY3Rpb25PdXQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBmZWF0dXJlc1RleHQgPSBuZXcgb2xmb3JtYXQuR2VvSlNPTigpLndyaXRlRmVhdHVyZXMob2xGZWF0dXJlcywge1xuICAgICAgZGF0YVByb2plY3Rpb246IHByb2plY3Rpb25PdXQsXG4gICAgICBmZWF0dXJlUHJvamVjdGlvbjogcHJvamVjdGlvbkluXG4gICAgfSk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vZ3JlVXJsfS9jb252ZXJ0SnNvbmA7XG5cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgZm9ybURhdGEuYXBwZW5kKCdqc29uJywgZmVhdHVyZXNUZXh0KTtcblxuICAgIGxldCBvdXRwdXROYW1lID1cbiAgICAgIGZvcm1hdCA9PT0gJ1NoYXBlZmlsZSdcbiAgICAgICAgPyBgJHt0aXRsZX0uemlwYFxuICAgICAgICA6IGAke3RpdGxlfS4ke2Zvcm1hdC50b0xvd2VyQ2FzZSgpfWA7XG4gICAgbGV0IG9ncmVGb3JtYXQgPSBFeHBvcnRTZXJ2aWNlLm9ncmVGb3JtYXRzW2Zvcm1hdF07XG5cbiAgICBpZiAoaXNDc3ZFeHBvcnQoZm9ybWF0KSkge1xuICAgICAgb3V0cHV0TmFtZSA9IGAke3RpdGxlfS5jc3ZgO1xuXG4gICAgICBpZiAoZm9ybWF0ID09PSAnQ1NWY29tbWEnIHx8IGZvcm1hdCA9PT0gJ0NTVnNlbWljb2xvbicpIHtcbiAgICAgICAgb2dyZUZvcm1hdCA9ICdDU1YnO1xuICAgICAgfVxuXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2xjbycsIGBTRVBBUkFUT1I9JHtjc3ZTZXBhcmF0b3J9YCk7XG5cbiAgICAgIGlmIChmb3JtYXQgPT09ICdDU1ZzZW1pY29sb24nKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnbGNvJywgYFNFUEFSQVRPUj0ke2NzdlNlcGFyYXRvcn1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQoJ291dHB1dE5hbWUnLCB0aGlzLmZvcm1hdEZpbGVuYW1lKG91dHB1dE5hbWUpKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2Zvcm1hdCcsIG9ncmVGb3JtYXQpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLnBvc3QodXJsLCBmb3JtRGF0YSwge1xuICAgICAgICByZXNwb25zZVR5cGU6ICdibG9iJ1xuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgZG93bmxvYWRCbG9iKHZhbHVlLCBvdXRwdXROYW1lKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWVcbiAgICAgIC5yZXBsYWNlQWxsKCcgJywgJ18nKVxuICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC/igJkvZywgXCInXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RoaW5nVG9FeHBvcnQoXG4gICAgb2xGZWF0dXJlczogT2xGZWF0dXJlPE9sR2VvbWV0cnk+W10sXG4gICAgZm9ybWF0OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKG9sRmVhdHVyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGZvcm1hdCA9PT0gJ0dQWCcpIHtcbiAgICAgIGNvbnN0IHBvaW50T3JMaW5lID0gb2xGZWF0dXJlcy5maW5kKChvbEZlYXR1cmUpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBbJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnTXVsdGlMaW5lU3RyaW5nJ10uaW5kZXhPZihcbiAgICAgICAgICAgIG9sRmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKVxuICAgICAgICAgICkgPj0gMFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcG9pbnRPckxpbmUgPT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGZWF0dXJlc0Zyb21NYXAoXG4gICAgbGF5ZXI6IFZlY3RvckxheWVyLFxuICAgIG9wdGlvbnM6IEV4cG9ydE9wdGlvbnNcbiAgKTogT2xGZWF0dXJlW10ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBsYXllci5kYXRhU291cmNlLm9sO1xuICAgIGNvbnN0IGV4dGVudCA9IGxheWVyLm1hcC52aWV3Q29udHJvbGxlci5nZXRFeHRlbnQoKTtcblxuICAgIGxldCBmZWF0dXJlczogT2xGZWF0dXJlW10gPSBvcHRpb25zLmZlYXR1cmVJbk1hcEV4dGVudFxuICAgICAgPyBkYXRhU291cmNlLmdldEZlYXR1cmVzSW5FeHRlbnQoZXh0ZW50KVxuICAgICAgOiBkYXRhU291cmNlLmdldEZlYXR1cmVzKCk7XG5cbiAgICBpZiAobGF5ZXIuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIENsdXN0ZXJEYXRhU291cmNlKSB7XG4gICAgICBmZWF0dXJlcyA9IGZlYXR1cmVzLmZsYXRNYXAoKGNsdXN0ZXIpID0+IGNsdXN0ZXIuZ2V0KCdmZWF0dXJlcycpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGZWF0dXJlc0Zyb21Xb3Jrc3BhY2UoXG4gICAgd2tzOiBXb3Jrc3BhY2UsXG4gICAgbGF5ZXJOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogRXhwb3J0T3B0aW9uc1xuICApOiBPbEZlYXR1cmVbXSB7XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gZGF0YS5sYXllcnNXaXRoU2VsZWN0aW9uLmluZGV4T2YobGF5ZXJOYW1lKSAhPT0gLTE7XG4gICAgY29uc3QgaXNJbk1hcEV4dGVudCA9IGRhdGEuZmVhdHVyZUluTWFwRXh0ZW50O1xuICAgIGlmIChoYXNTZWxlY3Rpb24gJiYgaXNJbk1hcEV4dGVudCkge1xuICAgICAgLy8gT25seSBleHBvcnQgc2VsZWN0ZWQgZmVhdHVyZSAmJiBpbnRvIG1hcCBleHRlbnRcbiAgICAgIHJldHVybiB3a3MuZW50aXR5U3RvcmUuc3RhdGVWaWV3XG4gICAgICAgIC5hbGwoKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChlOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PikgPT4gZS5zdGF0ZS5pbk1hcEV4dGVudCAmJiBlLnN0YXRlLnNlbGVjdGVkXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoZSkgPT4gKGUuZW50aXR5IGFzIEZlYXR1cmUpLm9sIGFzIE9sRmVhdHVyZSk7XG4gICAgfSBlbHNlIGlmIChoYXNTZWxlY3Rpb24gJiYgIWlzSW5NYXBFeHRlbnQpIHtcbiAgICAgIC8vIE9ubHkgZXhwb3J0IHNlbGVjdGVkIGZlYXR1cmUgJiYgIChpbnRvIG1hcCBleHRlbnQgT1Igbm90KVxuICAgICAgcmV0dXJuIHdrcy5lbnRpdHlTdG9yZS5zdGF0ZVZpZXdcbiAgICAgICAgLmFsbCgpXG4gICAgICAgIC5maWx0ZXIoKGU6IEVudGl0eVJlY29yZDxvYmplY3Q+KSA9PiBlLnN0YXRlLnNlbGVjdGVkKVxuICAgICAgICAubWFwKChlKSA9PiAoZS5lbnRpdHkgYXMgRmVhdHVyZSkub2wgYXMgT2xGZWF0dXJlKTtcbiAgICB9IGVsc2UgaWYgKGlzSW5NYXBFeHRlbnQpIHtcbiAgICAgIC8vIE9ubHkgaW50byBtYXAgZXh0ZW50XG4gICAgICByZXR1cm4gd2tzLmVudGl0eVN0b3JlLnN0YXRlVmlld1xuICAgICAgICAuYWxsKClcbiAgICAgICAgLmZpbHRlcigoZTogRW50aXR5UmVjb3JkPG9iamVjdD4pID0+IGUuc3RhdGUuaW5NYXBFeHRlbnQpXG4gICAgICAgIC5tYXAoKGUpID0+IChlLmVudGl0eSBhcyBGZWF0dXJlKS5vbCBhcyBPbEZlYXR1cmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBbGwgZmVhdHVyZXNcbiAgICAgIHJldHVybiB3a3MuZW50aXR5U3RvcmUuc3RhdGVWaWV3XG4gICAgICAgIC5hbGwoKVxuICAgICAgICAubWFwKChlKSA9PiAoZS5lbnRpdHkgYXMgRmVhdHVyZSkub2wgYXMgT2xGZWF0dXJlKTtcbiAgICB9XG4gIH1cblxuICBnZXRGZWF0dXJlcyhcbiAgICBtYXA6IElnb01hcCxcbiAgICBsYXllcjogQW55TGF5ZXIsXG4gICAgZGF0YTogRXhwb3J0T3B0aW9ucyxcbiAgICBzdG9yZTogV29ya3NwYWNlU3RvcmVcbiAgKTogT2JzZXJ2YWJsZTxPbEZlYXR1cmVbXT4ge1xuICAgIGNvbnN0IHByb2plY3Rpb24gPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0T2xQcm9qZWN0aW9uKCk7XG4gICAgY29uc3QgZXh0ZW50ID0gZGF0YS5mZWF0dXJlSW5NYXBFeHRlbnRcbiAgICAgID8gbWFwLnZpZXdDb250cm9sbGVyLmdldEV4dGVudCgpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChsYXllci5kYXRhU291cmNlIGluc3RhbmNlb2YgV0ZTRGF0YVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGxheWVyLmRhdGFTb3VyY2VcbiAgICAgICAgLmZldGNoRmVhdHVyZXMoe1xuICAgICAgICAgIGV4dGVudCxcbiAgICAgICAgICBwcm9qZWN0aW9uLFxuICAgICAgICAgIGh0dHBDbGllbnQ6IHRoaXMuaHR0cENsaWVudFxuICAgICAgICB9KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8vIEZpbHRlciBzcGF0aWFsIHVzZSBleHRlcm5hbCBBUEkgdG8gbWFrZSBxdWVyeSBhbmQgdXNlIFdvcmtzcGFjZSB0byBzdG9yZSBkYXRhXG4gICAgZWxzZSBpZiAobGF5ZXIub3B0aW9ucy53b3Jrc3BhY2U/LmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHdrcyA9IHRoaXMuZ2V0V29ya3NwYWNlQnlMYXllcklkKGxheWVyLmlkLCBzdG9yZSk7XG4gICAgICBpZiAod2tzPy5lbnRpdHlTdG9yZT8uc3RhdGVWaWV3LmFsbCgpLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuZ2V0RmVhdHVyZXNGcm9tV29ya3NwYWNlKHdrcywgbGF5ZXIuaWQsIGRhdGEpO1xuICAgICAgICByZXR1cm4gb2YoZmVhdHVyZXMpLnBpcGUoXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZSkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobGF5ZXIgaW5zdGFuY2VvZiBWZWN0b3JMYXllcikge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuZ2V0RmVhdHVyZXNGcm9tTWFwKGxheWVyLCBkYXRhKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mKFtdKTtcbiAgfVxuXG4gIGdldFdvcmtzcGFjZUJ5TGF5ZXJJZChpZDogc3RyaW5nLCBzdG9yZTogV29ya3NwYWNlU3RvcmUpOiBXb3Jrc3BhY2Uge1xuICAgIGNvbnN0IHdrc0Zyb21MYXllcklkID0gc3RvcmVcbiAgICAgIC5hbGwoKVxuICAgICAgLmZpbmQoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgKHdvcmtzcGFjZSBhcyBXZnNXb3Jrc3BhY2UgfCBGZWF0dXJlV29ya3NwYWNlIHwgRWRpdGlvbldvcmtzcGFjZSlcbiAgICAgICAgICAgIC5sYXllci5pZCA9PT0gaWRcbiAgICAgICk7XG4gICAgaWYgKHdrc0Zyb21MYXllcklkKSB7XG4gICAgICByZXR1cm4gd2tzRnJvbUxheWVySWQ7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGdldEdlb21UeXBlcyhcbiAgICBmZWF0dXJlczogT2xGZWF0dXJlW10sXG4gICAgZm9ybWF0PzogQW55RXhwb3J0Rm9ybWF0XG4gICk6IEdlb21ldHJ5Q29sbGVjdGlvbltdIHtcbiAgICBsZXQgZ2VvbVR5cGVzOiBHZW9tZXRyeUNvbGxlY3Rpb25bXSA9IFtdO1xuICAgIGlmIChmb3JtYXQgPT09ICdTaGFwZWZpbGUnIHx8IGZvcm1hdCA9PT0gJ0dQWCcpIHtcbiAgICAgIGZlYXR1cmVzLmZvckVhY2goKG9sRmVhdHVyZSkgPT4ge1xuICAgICAgICBjb25zdCBmZWF0dXJlR2VvbVR5cGUgPSBvbEZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRUeXBlKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRHZW9tVHlwZSA9IGdlb21UeXBlcy5maW5kKFxuICAgICAgICAgIChnZW9tVHlwZSkgPT4gZ2VvbVR5cGUudHlwZSA9PT0gZmVhdHVyZUdlb21UeXBlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChjdXJyZW50R2VvbVR5cGUpIHtcbiAgICAgICAgICBjdXJyZW50R2VvbVR5cGUuZmVhdHVyZXMucHVzaChvbEZlYXR1cmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdlb21UeXBlcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IGZlYXR1cmVHZW9tVHlwZSxcbiAgICAgICAgICAgIGZlYXR1cmVzOiBbb2xGZWF0dXJlXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VvbVR5cGVzID0gW3sgdHlwZTogbnVsbCwgZmVhdHVyZXM6IGZlYXR1cmVzIH1dO1xuICAgIH1cblxuICAgIGdlb21UeXBlcy5mb3JFYWNoKChnZW9tVHlwZSkgPT4ge1xuICAgICAgZ2VvbVR5cGUuZmVhdHVyZXMuZm9yRWFjaCgoZmVhdHVyZSkgPT4ge1xuICAgICAgICBjb25zdCByYWRpdXM6IG51bWJlciA9IGZlYXR1cmUuZ2V0KCdyYWQnKTtcbiAgICAgICAgaWYgKHJhZGl1cykge1xuICAgICAgICAgIGNvbnN0IGNlbnRlcjQzMjY6IG51bWJlcltdID0gW1xuICAgICAgICAgICAgZmVhdHVyZS5nZXQoJ2xvbmdpdHVkZScpLFxuICAgICAgICAgICAgZmVhdHVyZS5nZXQoJ2xhdGl0dWRlJylcbiAgICAgICAgICBdO1xuICAgICAgICAgIGNvbnN0IGNpcmNsZSA9IGNpcmN1bGFyKGNlbnRlcjQzMjYsIHJhZGl1cywgNTAwKTtcbiAgICAgICAgICBjaXJjbGUudHJhbnNmb3JtKCdFUFNHOjQzMjYnLCBmZWF0dXJlLmdldCgnX3Byb2plY3Rpb24nKSk7XG4gICAgICAgICAgZmVhdHVyZS5zZXRHZW9tZXRyeShjaXJjbGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBnZW9tVHlwZXM7XG4gIH1cbn1cbiJdfQ==
|
package/fesm2022/igo2-geo.mjs
CHANGED
|
@@ -13,7 +13,7 @@ import { IgoLanguageModule, LanguageService } from '@igo2/core/language';
|
|
|
13
13
|
import * as i2 from '@igo2/core/message';
|
|
14
14
|
import { IgoMessageModule } from '@igo2/core/message';
|
|
15
15
|
import * as i3$1 from '@igo2/core/route';
|
|
16
|
-
import { NumberUtils, strEnum, SubjectStatus, uuid, ObjectUtils, Watcher, Clipboard, isValidJSON, userAgent, Compression, ChangeUtils, downloadContent, isIsoDate, downloadBlob, customCacheHasher } from '@igo2/utils';
|
|
16
|
+
import { NumberUtils, strEnum, SubjectStatus, uuid, ObjectUtils, Watcher, Clipboard, isValidJSON, userAgent, Compression, ChangeUtils, downloadContent, createExcelWorkBook, addExcelSheetToWorkBook, writeExcelFile, isIsoDate, downloadBlob, customCacheHasher } from '@igo2/utils';
|
|
17
17
|
import { Subject, Observable, forkJoin, map as map$1, catchError, of, combineLatest, BehaviorSubject, fromEvent, zip, interval, pairwise, skipWhile, from, debounceTime as debounceTime$1, Subscription, throwError, ReplaySubject, EMPTY, timer, lastValueFrom, tap, first as first$1, take as take$1 } from 'rxjs';
|
|
18
18
|
import { MAC } from 'ol/has';
|
|
19
19
|
import * as olproj from 'ol/proj';
|
|
@@ -29056,7 +29056,6 @@ class ExportService {
|
|
|
29056
29056
|
let comment = '';
|
|
29057
29057
|
const properties = keys.reduce((acc, key) => {
|
|
29058
29058
|
if (key && key !== 'geometry') {
|
|
29059
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
29060
29059
|
key === 'id' && olFeature.get('draw')
|
|
29061
29060
|
? (comment += key + ':' + olFeature.get('draw') + ' \r\n')
|
|
29062
29061
|
: (comment += key + ':' + olFeature.get(key) + ' \r\n');
|
|
@@ -29129,18 +29128,23 @@ class ExportService {
|
|
|
29129
29128
|
}
|
|
29130
29129
|
}
|
|
29131
29130
|
async exportExcel(map, store, data) {
|
|
29132
|
-
const
|
|
29133
|
-
const workbook = utils.book_new();
|
|
29131
|
+
const workBook = await createExcelWorkBook();
|
|
29134
29132
|
for (const layerName of data.layers) {
|
|
29135
29133
|
const layer = map.getLayerById(layerName);
|
|
29136
29134
|
const features = await lastValueFrom(this.getFeatures(map, layer, data, store));
|
|
29137
29135
|
const formattedFeatures = features?.length
|
|
29138
29136
|
? this.formatFeatures(features, 'GeoJSON')
|
|
29139
29137
|
: null;
|
|
29140
|
-
|
|
29138
|
+
const collection = features
|
|
29139
|
+
? JSON.parse(formattedFeatures)
|
|
29140
|
+
: {
|
|
29141
|
+
features: []
|
|
29142
|
+
};
|
|
29143
|
+
const rows = collection.features.map((feature) => this.formatRecord(feature.properties));
|
|
29144
|
+
await addExcelSheetToWorkBook(layer.title, rows, workBook);
|
|
29141
29145
|
}
|
|
29142
29146
|
const title = this.getTitleFromLayers(data.layers, map);
|
|
29143
|
-
|
|
29147
|
+
writeExcelFile(workBook, title, { compression: true });
|
|
29144
29148
|
}
|
|
29145
29149
|
getTitleFromLayers(layers, map) {
|
|
29146
29150
|
return layers.length === 1
|
|
@@ -29151,28 +29155,6 @@ class ExportService {
|
|
|
29151
29155
|
const layer = map.getLayerById(id);
|
|
29152
29156
|
return layer.title;
|
|
29153
29157
|
}
|
|
29154
|
-
async addExcelSheet(title, features, workbook) {
|
|
29155
|
-
const { utils } = await import('xlsx');
|
|
29156
|
-
const collection = features
|
|
29157
|
-
? JSON.parse(features)
|
|
29158
|
-
: {
|
|
29159
|
-
features: []
|
|
29160
|
-
};
|
|
29161
|
-
const rows = collection.features.map((feature) => this.formatRecord(feature.properties));
|
|
29162
|
-
const worksheet = utils.json_to_sheet(rows);
|
|
29163
|
-
/* calculate column width */
|
|
29164
|
-
if (rows?.length) {
|
|
29165
|
-
worksheet['!cols'] = this.getColumnsInfo(rows);
|
|
29166
|
-
}
|
|
29167
|
-
const SHEET_NAME_MAX_LENGTH = 31;
|
|
29168
|
-
let sheetName = title.length >= SHEET_NAME_MAX_LENGTH
|
|
29169
|
-
? title.substring(0, SHEET_NAME_MAX_LENGTH)
|
|
29170
|
-
: title;
|
|
29171
|
-
if (workbook.SheetNames.includes(sheetName)) {
|
|
29172
|
-
sheetName = `${sheetName.substring(0, SHEET_NAME_MAX_LENGTH - 3)}_${workbook.SheetNames.length}`;
|
|
29173
|
-
}
|
|
29174
|
-
utils.book_append_sheet(workbook, worksheet, sheetName);
|
|
29175
|
-
}
|
|
29176
29158
|
formatRecord(record) {
|
|
29177
29159
|
return Object.entries(record).reduce((formatted, [key, value]) => {
|
|
29178
29160
|
formatted[key] = this.formatDataType(value);
|
|
@@ -29195,15 +29177,6 @@ class ExportService {
|
|
|
29195
29177
|
return value;
|
|
29196
29178
|
}
|
|
29197
29179
|
}
|
|
29198
|
-
getColumnsInfo(rows) {
|
|
29199
|
-
const columns = Object.keys(rows[0]);
|
|
29200
|
-
return columns.map((column) => ({
|
|
29201
|
-
wch: this.getColumnMaxWidth(column, rows)
|
|
29202
|
-
}));
|
|
29203
|
-
}
|
|
29204
|
-
getColumnMaxWidth(column, rows) {
|
|
29205
|
-
return rows.reduce((width, row) => Math.max(width, row[column]?.length ?? 0), column.length);
|
|
29206
|
-
}
|
|
29207
29180
|
exportWithOgre(olFeatures, { format, csvSeparator = null }, title, projectionIn, projectionOut) {
|
|
29208
29181
|
const featuresText = new olformat.GeoJSON().writeFeatures(olFeatures, {
|
|
29209
29182
|
dataProjection: projectionOut,
|