@c8y/ngx-components 1021.22.54 → 1021.22.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/common/interval-based-reload.abstract.d.ts +13 -3
- package/core/common/interval-based-reload.abstract.d.ts.map +1 -1
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +5 -4
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -1
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -1
- package/core/dashboard/widgets-dashboard-event.service.d.ts +1 -0
- package/core/dashboard/widgets-dashboard-event.service.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +9 -3
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +11 -8
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +4 -2
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector.component.d.ts +6 -2
- package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts +17 -0
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -1
- package/esm2022/core/common/aggregation/aggregation.model.mjs +2 -2
- package/esm2022/core/common/interval-based-reload.abstract.mjs +13 -13
- package/esm2022/core/dashboard/dashboard-child.component.mjs +3 -3
- package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +12 -10
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +2 -2
- package/esm2022/core/dashboard/widgets-dashboard-event.service.mjs +10 -1
- package/esm2022/core/dashboard/widgets-dashboard.component.mjs +3 -3
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +3 -3
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +37 -15
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +22 -27
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +29 -6
- package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +18 -8
- package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +18 -1
- package/esm2022/interval-picker/interval-picker.model.mjs +5 -1
- package/esm2022/widgets/definitions/datapoints-table/index.mjs +3 -2
- package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +3 -3
- package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +17 -100
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +45 -41
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +35 -13
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +3 -3
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +81 -38
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +3 -5
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +79 -36
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-interval-picker.mjs +5 -1
- package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +18 -101
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +152 -88
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +75 -42
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/interval-picker/interval-picker.model.d.ts +6 -0
- package/interval-picker/interval-picker.model.d.ts.map +1 -1
- package/locales/de.po +60 -62
- package/locales/es.po +10 -12
- package/locales/fr.po +109 -109
- package/locales/ja_JP.po +149 -94
- package/locales/ko.po +10 -12
- package/locales/locales.pot +3 -4
- package/locales/nl.po +11 -13
- package/locales/pl.po +11 -13
- package/locales/pt_BR.po +9 -11
- package/locales/zh_CN.po +9 -11
- package/locales/zh_TW.po +11 -13
- package/package.json +1 -1
- package/widgets/definitions/datapoints-table/index.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +18 -63
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +4 -3
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +16 -8
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +23 -5
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +4 -1
- package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -1
|
@@ -175,6 +175,27 @@ export class DataFetchingService {
|
|
|
175
175
|
const fetchedSources = await Promise.all(fetchedDataPromises);
|
|
176
176
|
return fetchedSources.filter((source) => source !== null);
|
|
177
177
|
}
|
|
178
|
+
/**
|
|
179
|
+
* Adjusts the given date by adding the specified number of minutes and setting seconds to 0.
|
|
180
|
+
*
|
|
181
|
+
* @param date - The date to be adjusted in string format.
|
|
182
|
+
* @param minutes - The number of minutes to add to the date.
|
|
183
|
+
* @param roundSeconds - Whether to round the seconds or not.
|
|
184
|
+
* If true, the seconds will be rounded to 0.
|
|
185
|
+
* If false, the seconds will be displayed as they are.
|
|
186
|
+
* @returns The adjusted date in ISO string format.
|
|
187
|
+
*/
|
|
188
|
+
adjustDate(date, minutes, roundSeconds = true) {
|
|
189
|
+
const dateTime = new Date(date);
|
|
190
|
+
if (isNaN(dateTime.getTime())) {
|
|
191
|
+
throw new Error('Invalid date');
|
|
192
|
+
}
|
|
193
|
+
dateTime.setUTCMinutes(dateTime.getUTCMinutes() + minutes);
|
|
194
|
+
if (roundSeconds) {
|
|
195
|
+
dateTime.setUTCSeconds(0, 0);
|
|
196
|
+
}
|
|
197
|
+
return dateTime.toISOString();
|
|
198
|
+
}
|
|
178
199
|
/**
|
|
179
200
|
* Fetches and prepares measurement data for preview.
|
|
180
201
|
*
|
|
@@ -199,8 +220,6 @@ export class DataFetchingService {
|
|
|
199
220
|
let measurements;
|
|
200
221
|
const filter = this.prepareMeasurementsFilter(details, exportConfig, MEASUREMENTS_PREVIEW_ITEMS_LIMIT);
|
|
201
222
|
try {
|
|
202
|
-
// TODO: consider adding a cache mechanism -> MTM-60289
|
|
203
|
-
// When user switches between report types, and rest of the settings are the same, then the data should not be fetched again?
|
|
204
223
|
measurements = await this.measurementService.list(filter);
|
|
205
224
|
}
|
|
206
225
|
catch (error) {
|
|
@@ -344,30 +363,6 @@ export class DataFetchingService {
|
|
|
344
363
|
};
|
|
345
364
|
});
|
|
346
365
|
}
|
|
347
|
-
/**
|
|
348
|
-
* Adjusts the given date by adding the specified number of minutes and setting seconds to 0.
|
|
349
|
-
*
|
|
350
|
-
* @param date - The date to be adjusted in string format.
|
|
351
|
-
* @param minutes - The number of minutes to add to the date.
|
|
352
|
-
* @returns The adjusted date in the format 'YYYY-MM-DDTHH:mm:ss+HH:MM'.
|
|
353
|
-
*/
|
|
354
|
-
adjustDate(date, minutes) {
|
|
355
|
-
const dateTime = new Date(date);
|
|
356
|
-
dateTime.setMinutes(dateTime.getMinutes() + minutes);
|
|
357
|
-
dateTime.setSeconds(0);
|
|
358
|
-
const offset = -dateTime.getTimezoneOffset();
|
|
359
|
-
const offsetSign = offset >= 0 ? '+' : '-';
|
|
360
|
-
const pad = (num) => (num < 10 ? '0' + num : num.toString());
|
|
361
|
-
const offsetHours = pad(Math.floor(Math.abs(offset) / 60));
|
|
362
|
-
const offsetMinutes = pad(Math.abs(offset) % 60);
|
|
363
|
-
const year = dateTime.getFullYear();
|
|
364
|
-
const month = pad(dateTime.getMonth() + 1);
|
|
365
|
-
const day = pad(dateTime.getDate());
|
|
366
|
-
const hours = pad(dateTime.getHours());
|
|
367
|
-
const minutesString = pad(dateTime.getMinutes());
|
|
368
|
-
const seconds = '00';
|
|
369
|
-
return `${year}-${month}-${day}T${hours}:${minutesString}:${seconds}${offsetSign}${offsetHours}:${offsetMinutes}`;
|
|
370
|
-
}
|
|
371
366
|
/**
|
|
372
367
|
* Trims the given HTML message by removing list items that correspond to zero counts.
|
|
373
368
|
*
|
|
@@ -404,4 +399,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
404
399
|
providedIn: 'root'
|
|
405
400
|
}]
|
|
406
401
|
}], ctorParameters: () => [{ type: i1.AlertService }, { type: i2.MeasurementService }, { type: i3.DomSanitizer }, { type: i4.TranslateService }, { type: i5.UtilsService }] });
|
|
407
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1mZXRjaGluZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItbW9kYWwvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci9kYXRhLWZldGNoaW5nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQVNMLGtCQUFrQixFQUNuQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFRTCxnQ0FBZ0MsRUFFakMsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRCxPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7QUFLM0QsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixZQUNVLFlBQTBCLEVBQzFCLGtCQUFzQyxFQUN0QyxTQUF1QixFQUN2QixnQkFBa0MsRUFDbEMsWUFBMEI7UUFKMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7SUFDakMsQ0FBQztJQUVKOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLDJCQUEyQixDQUMvQixZQUEwQjtRQUUxQixNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQztRQUV0QyxNQUFNLFFBQVEsR0FBd0MsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FDckYsS0FBSyxFQUFDLE9BQU8sRUFBQyxFQUFFO1lBQ2QsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUF1QjtvQkFDakMsUUFBUSxFQUFFLFlBQVksQ0FBQyxRQUFRO29CQUMvQixNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07b0JBQzNCLFFBQVEsRUFBRSxDQUFDO29CQUNYLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtvQkFDdEIsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLG1CQUFtQjtvQkFDaEQsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQjtvQkFDNUMsaUJBQWlCLEVBQUUsSUFBSTtpQkFDeEIsQ0FBQztnQkFFRixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRTVELElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxhQUFhLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztvQkFDN0QsT0FBTzt3QkFDTCxlQUFlLEVBQUU7NEJBQ2YsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNOzRCQUN0QixtQkFBbUIsRUFBRSxPQUFPLENBQUMsbUJBQW1COzRCQUNoRCxpQkFBaUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCO3lCQUM3Qzt3QkFDRCxhQUFhLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhO3FCQUM3QyxDQUFDO2dCQUNKLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQyxDQUNGLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBK0IsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sd0JBQXdCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQztRQUUzRSxPQUFPLHdCQUF3QixDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCx1QkFBdUIsQ0FDckIsbUJBQTRCLEVBQzVCLHFCQUE4QixFQUM5Qix3QkFBaUMsRUFDakMsbUJBQTRCLEVBQzVCLHFDQUE4QztRQUU5QyxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FDM0MsT0FBTyxDQUNMLDRKQUE0SixDQUM3SixDQUNGLENBQUM7WUFDRixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FDM0MsT0FBTyxDQUNMOzs7Ozs7OzhJQU9zSSxDQUN2SSxFQUNEO1lBQ0UseUJBQXlCLEVBQUUsd0JBQXdCO1lBQ25ELHNCQUFzQixFQUFFLHFCQUFxQjtZQUM3QyxvQkFBb0IsRUFBRSxtQkFBbUI7WUFDekMsc0NBQXNDLEVBQUUscUNBQXFDO1lBQzdFLCtCQUErQixFQUFFLHdCQUF3QixHQUFHLHFCQUFxQjtTQUNsRixDQUNGLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFO1lBQzVELHdCQUF3QjtZQUN4QixxQkFBcUI7WUFDckIsbUJBQW1CO1NBQ3BCLENBQUMsQ0FBQztRQUVILE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gseUJBQXlCLENBQ3ZCLFFBQWdCLEVBQ2hCLHdCQUFvRDtRQUVwRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUNuRCxPQUFPLENBQUMseUVBQXlFLENBQUMsRUFDbEYsRUFBRSxNQUFNLEVBQUUsd0JBQXdCLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsQ0FDckUsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLHdCQUF3QjthQUMzQyxHQUFHLENBQ0YsU0FBUyxDQUFDLEVBQUUsQ0FDVixLQUFLLFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLElBQUksU0FBUyxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsRUFBRSxDQUMxSTthQUNBLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVkLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlEQUFpRCxDQUNyRCxjQUFzQixFQUN0QixZQUEwQjtRQUUxQixNQUFNLHFCQUFxQixHQUEwQjtZQUNuRCxZQUFZO1lBQ1osY0FBYztTQUNmLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQy9ELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUscUJBQXFCLENBQUMsQ0FDcEUsQ0FBQztRQUNGLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsS0FBSyxDQUFDLDhCQUE4QixDQUNsQyxPQUF5QixFQUN6QixxQkFBNEM7UUFFNUMsTUFBTSxNQUFNLEdBQXVCLElBQUksQ0FBQyx5QkFBeUIsQ0FDL0QsT0FBTyxFQUNQLHFCQUFxQixDQUFDLFlBQVksQ0FDbkMsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRWhFLElBQUksQ0FBQztZQUNILE1BQU0sdUJBQXVCLEdBQzNCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUVwRSwwREFBMEQ7WUFDMUQsbUdBQW1HO1lBQ25HLElBQUksdUJBQXVCLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUMzQyxPQUFPLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxPQUFPLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztZQUN0RixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLHFDQUFxQyxDQUN6QyxPQUF5QixFQUN6QixlQUErQjtRQUUvQixPQUFPO1lBQ0wsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxtQkFBbUI7WUFDaEQsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQjtZQUM1QywyQkFBMkIsRUFBRSxNQUFNLGVBQWUsQ0FBQyxJQUFJLEVBQUU7U0FDMUQsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsMkJBQTJCLENBQy9CLFlBQTBCLEVBQzFCLGFBQXNCO1FBRXRCLE9BQU8sYUFBYTtZQUNsQixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsZ0RBQWdELENBQUMsWUFBWSxDQUFDO1lBQzNFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsS0FBSyxDQUFDLCtCQUErQixDQUFDLGdCQUFvQztRQUN4RSxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWxDLE1BQU0sbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBQyxTQUFTLEVBQUMsRUFBRTtZQUNqRSxNQUFNLFNBQVMsR0FBa0I7Z0JBQy9CLFFBQVE7Z0JBQ1IsTUFBTTtnQkFDTixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07YUFDekIsQ0FBQztZQUVGLElBQUksQ0FBQztnQkFDSCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQXFCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxHQUFHLEVBQUUsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUN4QixPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUM7Z0JBQzFCLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZiw0RUFBNEU7Z0JBQzVFLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxjQUFjLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDOUQsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFvQixFQUFFLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyxLQUFLLENBQUMsZ0RBQWdELENBQzVELFlBQTBCO1FBRTFCLE1BQU0sb0JBQW9CLEdBQTRCLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQ3JGLEtBQUssRUFBQyxPQUFPLEVBQUMsRUFBRTtZQUNkLE1BQU0sc0JBQXNCLEdBQzFCLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUVuRSxJQUFJLHNCQUFzQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDekMsT0FBTyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JGLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FDRixDQUFDO1FBRUYsT0FBTyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8sS0FBSyxDQUFDLDhCQUE4QixDQUMxQyxPQUF5QixFQUN6QixZQUEwQjtRQUUxQixJQUFJLFlBQW1ELENBQUM7UUFFeEQsTUFBTSxNQUFNLEdBQXVCLElBQUksQ0FBQyx5QkFBeUIsQ0FDL0QsT0FBTyxFQUNQLFlBQVksRUFDWixnQ0FBZ0MsQ0FDakMsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILHVEQUF1RDtZQUN2RCw2SEFBNkg7WUFDN0gsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyx5QkFBeUIsQ0FDL0IsT0FBeUIsRUFDekIsWUFBMEIsRUFDMUIsUUFBaUI7UUFFakIsTUFBTSxNQUFNLEdBQXVCO1lBQ2pDLHFEQUFxRDtZQUNyRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BELGtEQUFrRDtZQUNsRCxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUMvQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLG1CQUFtQjtZQUNoRCxpQkFBaUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCO1NBQzdDLENBQUM7UUFFRixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDN0IsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxnQ0FBZ0MsQ0FDdEMsT0FBeUIsRUFDekIsSUFBb0I7UUFFcEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7UUFFekYsTUFBTSxNQUFNLEdBQW9DLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUN0QixXQUFXLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzlFLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVPLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxZQUEwQjtRQUN4RSxNQUFNLHVCQUF1QixHQUE0QixJQUFJLENBQUMscUJBQXFCLENBQ2pGLFlBQVksQ0FBQyxnQkFBZ0IsQ0FDOUIsQ0FBQztRQUVGLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEdBQUcsQ0FDakUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7WUFDekIsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsWUFBWSxDQUFDO1lBRXZELE1BQU0sU0FBUyxHQUFrQjtnQkFDL0IsUUFBUTtnQkFDUixNQUFNO2dCQUNOLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixlQUFlLEVBQUUsV0FBOEI7YUFDaEQsQ0FBQztZQUVGLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBcUIsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUNGLENBQUM7UUFFRixNQUFNLDBCQUEwQixHQUFpQixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUV4RixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0sscUJBQXFCLENBQUMsZ0JBQW9DO1FBQ2hFLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxDQUM1QixDQUNFLEdBQTRCLEVBQzVCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFvQixFQUNwRSxFQUFFO1lBQ0YsTUFBTSxLQUFLLEdBQUcsR0FBRyxpQkFBaUIsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQzVELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzVDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzQyxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFDRCxJQUFJLEdBQUcsRUFBb0IsQ0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQXdCO1FBQ3BELElBQUksVUFBd0MsQ0FBQztRQUU3QyxNQUFNLE1BQU0sR0FBa0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBQ3JELFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtZQUM1QixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07WUFDeEIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO1lBQ3hCLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtZQUN4QixlQUFlLEVBQUUsU0FBUyxDQUFDLGVBQWU7U0FDM0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDO1lBQ0gsdURBQXVEO1lBQ3ZELDZIQUE2SDtZQUM3SCxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE9BQXNCO1FBQ2hELE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ3RFLHFEQUFxRDtRQUNyRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLGtEQUFrRDtRQUNsRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV0QyxNQUFNLE1BQU0sR0FBa0I7WUFDNUIsUUFBUSxFQUFFLElBQUk7WUFDZCxNQUFNLEVBQUUsRUFBRTtZQUNWLE1BQU0sRUFBRSxNQUFNO1lBQ2QsTUFBTSxFQUFFLElBQUk7U0FDYixDQUFDO1FBRUYsNkhBQTZIO1FBQzdILElBQUksZUFBZSxJQUFJLGVBQWUsS0FBTSxrQkFBa0IsQ0FBQyxJQUF3QixFQUFFLENBQUM7WUFDeEYsTUFBTSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7UUFDM0MsQ0FBQztRQUVELDhEQUE4RDtRQUM5RCxzRUFBc0U7UUFDdEUsb0RBQW9EO1FBQ3BELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxNQUFNLGlCQUFpQixHQUFJLE1BQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLGlCQUFpQixDQUFDLGdCQUFvQyxFQUFFLGNBQTRCO1FBQzFGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV2RixPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQXlCLEVBQUUsRUFBRTtZQUN4RCxJQUFJLElBQXdCLENBQUM7WUFDN0IsSUFBSSxJQUFvQixDQUFDO1lBRXpCOzs7ZUFHRztZQUNILE1BQU0sU0FBUyxHQUFHLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRWhGLElBQUkscUJBQXFCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELElBQUksR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztnQkFDM0UsSUFBSSxHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDakUsQ0FBQztZQUVELE9BQU87Z0JBQ0wsR0FBRyxPQUFPO2dCQUNWLElBQUk7Z0JBQ0osWUFBWSxFQUFFLElBQUk7YUFDbkIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLFVBQVUsQ0FBQyxJQUFtQixFQUFFLE9BQWU7UUFDckQsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDckQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2QixNQUFNLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdDLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzNDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBVyxFQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRCxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUVqRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNqRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFckIsT0FBTyxHQUFHLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxhQUFhLElBQUksT0FBTyxHQUFHLFVBQVUsR0FBRyxXQUFXLElBQUksYUFBYSxFQUFFLENBQUM7SUFDcEgsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNLLHdCQUF3QixDQUFDLE9BQWUsRUFBRSxNQUFnQixFQUFFLFdBQVcsR0FBRyxDQUFDO1FBQ2pGLE1BQU0sTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDekQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWhELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDaEMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzVCLENBQUM7OEdBcmdCVSxtQkFBbUI7a0hBQW5CLG1CQUFtQixjQUZsQixNQUFNOzsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQge1xuICBhZ2dyZWdhdGlvblR5cGUsXG4gIElGZXRjaFJlc3BvbnNlLFxuICBJTWVhc3VyZW1lbnQsXG4gIElNZWFzdXJlbWVudEZpbHRlcixcbiAgSVJlc3VsdCxcbiAgSVJlc3VsdExpc3QsXG4gIElTZXJpZXMsXG4gIElTZXJpZXNGaWx0ZXIsXG4gIE1lYXN1cmVtZW50U2VydmljZVxufSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBR0dSRUdBVElPTl9WQUxVRVMsIEFsZXJ0U2VydmljZSwgZ2V0dGV4dCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGF0YXBvaW50RGV0YWlscyxcbiAgRGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0LFxuICBEYXRhcG9pbnRzVmFsdWVzRGF0YU1hcCxcbiAgRGF0YVRvRXhwb3J0LFxuICBEYXRhVG9FeHBvcnRXaXRoQmFja2VuZENyZWF0ZWRGaWxlLFxuICBFeHBvcnRDb25maWcsXG4gIE1lYXN1cmVtZW50RmlsZUNvbmZpZyxcbiAgTUVBU1VSRU1FTlRTX1BSRVZJRVdfSVRFTVNfTElNSVQsXG4gIFRpbWVTZXJpZXNEYXRhXG59IGZyb20gJy4uLy4uL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLm1vZGVsJztcbmltcG9ydCB7IFNvdXJjZUl0ZW0sIFV0aWxzU2VydmljZSB9IGZyb20gJy4vdXRpbHMuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERhdGFGZXRjaGluZ1NlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWVhc3VyZW1lbnRTZXJ2aWNlOiBNZWFzdXJlbWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dGlsc1NlcnZpY2U6IFV0aWxzU2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbnkgb2YgbWVhc3VyZW1lbnRzIHJlcXVlc3RzIG1heSBleGNlZWRlZCB0aGUgbGltaXQsXG4gICAqIGFmdGVyIHdoaWNoIHRoZSBleHBvcnQgZGF0YSBpcyBwcm9jZXNzZWQgYnkgdGhlIGJhY2tlbmQgYW5kIHRoZSBnZW5lcmF0ZWQgQ1NWL0V4Y2VsIGZpbGUgaXMgc2VudCBieSBlbWFpbC5cbiAgICpcbiAgICogVGhlIHRocmVzaG9sZCBpcyBzZXQgdG8gNTBfMDAwIHJlY29yZHMgaW4gYXBwbGljYXRpb24ncyBjb3JlIHByb3BlcnRpZXMgKGV4cG9ydC5kYXRhLnN5bmNocm9ub3VzLmxpbWl0KS5cbiAgICpcbiAgICogQHBhcmFtIGV4cG9ydENvbmZpZyAtIFRoZSBleHBvcnQgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzIHJlcHJlc2VudGluZyBkYXRhcG9pbnRzIGZpbGVzIHRoYXQgd2lsbCBiZSBzZW50IGJ5IGVtYWlsLlxuICAgKi9cbiAgYXN5bmMgZ2V0RGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0KFxuICAgIGV4cG9ydENvbmZpZzogRXhwb3J0Q29uZmlnXG4gICk6IFByb21pc2U8RGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0W10+IHtcbiAgICBjb25zdCBiYWNrZW5kUHJvY2Vzc2luZ0xpbWl0ID0gNTBfMDAwO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8RGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0PltdID0gZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMubWFwKFxuICAgICAgYXN5bmMgZGV0YWlscyA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyOiBJTWVhc3VyZW1lbnRGaWx0ZXIgPSB7XG4gICAgICAgICAgICBkYXRlRnJvbTogZXhwb3J0Q29uZmlnLmRhdGVGcm9tLFxuICAgICAgICAgICAgZGF0ZVRvOiBleHBvcnRDb25maWcuZGF0ZVRvLFxuICAgICAgICAgICAgcGFnZVNpemU6IDEsXG4gICAgICAgICAgICBzb3VyY2U6IGRldGFpbHMuc291cmNlLFxuICAgICAgICAgICAgdmFsdWVGcmFnbWVudFNlcmllczogZGV0YWlscy52YWx1ZUZyYWdtZW50U2VyaWVzLFxuICAgICAgICAgICAgdmFsdWVGcmFnbWVudFR5cGU6IGRldGFpbHMudmFsdWVGcmFnbWVudFR5cGUsXG4gICAgICAgICAgICB3aXRoVG90YWxFbGVtZW50czogdHJ1ZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmxpc3QoZmlsdGVyKTtcblxuICAgICAgICAgIGlmIChyZXNwb25zZT8ucGFnaW5nPy50b3RhbEVsZW1lbnRzID4gYmFja2VuZFByb2Nlc3NpbmdMaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZGF0YXBvaW50RGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgc291cmNlOiBkZXRhaWxzLnNvdXJjZSxcbiAgICAgICAgICAgICAgICB2YWx1ZUZyYWdtZW50U2VyaWVzOiBkZXRhaWxzLnZhbHVlRnJhZ21lbnRTZXJpZXMsXG4gICAgICAgICAgICAgICAgdmFsdWVGcmFnbWVudFR5cGU6IGRldGFpbHMudmFsdWVGcmFnbWVudFR5cGVcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdG90YWxFbGVtZW50czogcmVzcG9uc2UucGFnaW5nLnRvdGFsRWxlbWVudHNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHRzOiBEYXRhcG9pbnRzRXhjZWVkaW5nTGltaXRbXSA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblxuICAgIGNvbnN0IGRhdGFwb2ludHNFeGNlZWRpbmdMaW1pdCA9IHJlc3VsdHMuZmlsdGVyKHJlc3VsdCA9PiByZXN1bHQgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGRhdGFwb2ludHNFeGNlZWRpbmdMaW1pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIHdoZW4gdGhlIGxpbWl0IG9mIGRhdGFwb2ludHMgaXMgZXhjZWVkZWQgZHVyaW5nIGZpbGUgZXhwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gaGFzTm9FeHBvcnRhYmxlRGF0YSAtIEluZGljYXRlcyBpZiB0aGVyZSBpcyBubyBleHBvcnRhYmxlIGRhdGEgYmVjYXVzZSB0aGUgZGF0ZSByYW5nZSBvZiBhbGwgc2VsZWN0ZWQgZGF0YXBvaW50cyBleGNlZWRzIDEsMDAwLDAwMCByZWNvcmRzLlxuICAgKiBAcGFyYW0gZW1haWxEZWxpdmVyYWJsZUNvdW50IC0gVGhlIG51bWJlciBvZiBkYXRhcG9pbnQgZXhwb3J0cyB0aGF0IGV4Y2VlZCB0aGUgbGltaXQsIHdpbGwgYmUgcHJvY2VlZGVkIGJ5IHRoZSBiYWNrZW5kIGFuZCBzZW50IGJ5IGVtYWlsLlxuICAgKiBAcGFyYW0gYnJvd3NlckRvd25sb2FkYWJsZUNvdW50IC0gVGhlIG51bWJlciBvZiBkYXRhcG9pbnQgZXhwb3J0cyB0aGF0IGNhbiBiZSBkb3dubG9hZGVkIGRpcmVjdGx5LlxuICAgKiBAcGFyYW0gc2tpcHBlZERhdGFwb2ludENvdW50IC0gVGhlIG51bWJlciBvZiBkYXRhcG9pbnQgZXhwb3J0cyBza2lwcGVkIGR1ZSB0byBleGNlZWRpbmcgdGhlIG1lYXN1cmVtZW50cyBBUEkgbGltaXQgb2YgMSwwMDAsMDAwIHJlY29yZHMuXG4gICAqIEBwYXJhbSB0b3RhbERhdGFwb2ludHNTZWxlY3RlZEZvckV4cG9ydENvdW50IC0gVG90YWwgbnVtYmVyIG9mIGRhdGFwb2ludCBzZWxlY3RlZCBmb3IgZXhwb3J0cy5cbiAgICogQHJldHVybnMgVGhlIG1lc3NhZ2UgdGhhdCBjYW4gYmUgaW5qZWN0ZWQuXG4gICAqL1xuICBnZXRMaW1pdEV4Y2VlZGVkTWVzc2FnZShcbiAgICBoYXNOb0V4cG9ydGFibGVEYXRhOiBib29sZWFuLFxuICAgIGVtYWlsRGVsaXZlcmFibGVDb3VudD86IG51bWJlcixcbiAgICBicm93c2VyRG93bmxvYWRhYmxlQ291bnQ/OiBudW1iZXIsXG4gICAgbm9uUmV0cmlldmFibGVDb3VudD86IG51bWJlcixcbiAgICB0b3RhbERhdGFwb2ludHNTZWxlY3RlZEZvckV4cG9ydENvdW50PzogbnVtYmVyXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKGhhc05vRXhwb3J0YWJsZURhdGEpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICBgVGhlIGRhdGEgZm9yIHNlbGVjdGVkIGRhdGFwb2ludChzKSBleGNlZWQgMSwwMDAsMDAwIHJlY29yZHMsIHdoaWNoIGlzIHRoZSBsaW1pdCBmb3IgYmFja2VuZCBwcm9jZXNzaW5nLiBUbyBleHBvcnQgdGhpcyBkYXRhLCBwbGVhc2UgcmVkdWNlIHRoZSBkYXRlIHJhbmdlLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgIGdldHRleHQoXG4gICAgICAgIGBBZnRlciBjbGlja2luZyBcIkRvd25sb2FkXCI6PGJyPlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpPjxzdHJvbmc+e3skYnJvd3NlckRvd25sb2FkYWJsZUNvdW50fX08L3N0cm9uZz4gZGF0YXBvaW50KHMpIGV4cG9ydHMgd2lsbCBiZSBkb3dubG9hZGVkIGRpcmVjdGx5IHdpdGhpbiBvbmUgZmlsZTogPGVtPmV4cG9ydGVkX1tjc3YvZXhjZWxdLnppcDwvZW0+PC9saT5cbiAgICAgICAgICA8bGk+PHN0cm9uZz57eyRlbWFpbERlbGl2ZXJhYmxlQ291bnR9fTwvc3Ryb25nPiBkYXRhcG9pbnQocykgZXhwb3J0cyByZXF1aXJlIGZ1cnRoZXIgcHJvY2Vzc2luZy4gVGhlIGZpbGVzIHdpbGwgYmUgc2VudCB0byB5b3UgdmlhIHNlcGFyYXRlIGVtYWlscyBvbmNlIGNvbXBsZXRlZCwgd2hpY2ggbWF5IHRha2Ugc29tZSB0aW1lLjwvbGk+XG4gICAgICAgICAgPGxpPjxzdHJvbmc+e3skbm9uUmV0cmlldmFibGVDb3VudH19PC9zdHJvbmc+IGRhdGFwb2ludChzKSBleHBvcnRzIGV4Y2VlZGVkIDEsMDAwLDAwMCByZWNvcmRzLCB3aGljaCBpcyB0aGUgbGltaXQgZm9yIGJhY2tlbmQgcHJvY2Vzc2luZy4gVG8gZXhwb3J0IHRoZXNlIGRhdGEsIHBsZWFzZSByZWR1Y2UgdGhlIGRhdGUgcmFuZ2UuIE90aGVyd2lzZSwgdGhlIGRhdGEgd2lsbCBuZWl0aGVyIGJlIGRvd25sb2FkZWQgbm9yIHNlbnQgdmlhIGVtYWlsLjwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICAgIDxwPlRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgdGhhdCBjYW4gYmUgZXhwb3J0ZWQgaXM6IDxzdHJvbmc+e3skdG90YWxFeHBvcnRhYmxlRGF0YXBvaW50c0NvdW50fX0gb3V0IG9mIHt7JHRvdGFsRGF0YXBvaW50c1NlbGVjdGVkRm9yRXhwb3J0Q291bnR9fTwvc3Ryb25nPi5cbiAgICAgICAgPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgZmlsZSBuYW1lIGNvbnZlbnRpb24gb2YgZmlsZXMgd2l0aGluIHppcCBmaWxlIGlzOiA8Y29kZT5bc291cmNlXV9bZnJhZ21lbnRfc2VyaWVzXS5bY3N2L3hsc108L2NvZGU+PC9wPmBcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgICRicm93c2VyRG93bmxvYWRhYmxlQ291bnQ6IGJyb3dzZXJEb3dubG9hZGFibGVDb3VudCxcbiAgICAgICAgJGVtYWlsRGVsaXZlcmFibGVDb3VudDogZW1haWxEZWxpdmVyYWJsZUNvdW50LFxuICAgICAgICAkbm9uUmV0cmlldmFibGVDb3VudDogbm9uUmV0cmlldmFibGVDb3VudCxcbiAgICAgICAgJHRvdGFsRGF0YXBvaW50c1NlbGVjdGVkRm9yRXhwb3J0Q291bnQ6IHRvdGFsRGF0YXBvaW50c1NlbGVjdGVkRm9yRXhwb3J0Q291bnQsXG4gICAgICAgICR0b3RhbEV4cG9ydGFibGVEYXRhcG9pbnRzQ291bnQ6IGJyb3dzZXJEb3dubG9hZGFibGVDb3VudCArIGVtYWlsRGVsaXZlcmFibGVDb3VudFxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCB0cmltbWVkTWVzc2FnZSA9IHRoaXMucmVtb3ZlWmVyb0NvdW50TGlzdEl0ZW1zKG1lc3NhZ2UsIFtcbiAgICAgIGJyb3dzZXJEb3dubG9hZGFibGVDb3VudCxcbiAgICAgIGVtYWlsRGVsaXZlcmFibGVDb3VudCxcbiAgICAgIG5vblJldHJpZXZhYmxlQ291bnRcbiAgICBdKTtcblxuICAgIHJldHVybiB0cmltbWVkTWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5cyBhbiBpbmZvcm1hdGlvbiBhbGVydCBhYm91dCBzZW5kaW5nIGRhdGEgdmlhIGVtYWlsLlxuICAgKlxuICAgKiBPbmx5IG1lYXN1cmVtZW50cyBBUEkgY2FuIHNlbmQgZmlsZXMgdmlhIGVtYWlsLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZVR5cGUgLSBUaGUgdHlwZSBvZiBmaWxlIHRvIGJlIHNlbnQuXG4gICAqIEBwYXJhbSBkYXRhcG9pbnRzRXhjZWVkaW5nTGltaXQgLSBUaGUgYXJyYXkgb2YgZGF0YXBvaW50cyBleGNlZWRpbmcgdGhlIGxpbWl0LlxuICAgKi9cbiAgc2hvd1NlbmRWaWFFbWFpbEluZm9BbGVydChcbiAgICBmaWxlVHlwZTogc3RyaW5nLFxuICAgIGRhdGFwb2ludHNFeGNlZWRpbmdMaW1pdDogRGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0W11cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbWVzc2FnZVRlbXBsYXRlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICBnZXR0ZXh0KGBZb3Ugd2lsbCBnZXQge3skZmlsZVR5cGVUZXh0fX0gZmlsZShzKSBmb3Ige3skY291bnR9fSBzZXJpZXMgdmlhIGVtYWlsLmApLFxuICAgICAgeyAkY291bnQ6IGRhdGFwb2ludHNFeGNlZWRpbmdMaW1pdC5sZW5ndGgsICRmaWxlVHlwZVRleHQ6IGZpbGVUeXBlIH1cbiAgICApO1xuICAgIGNvbnN0IGZvcm1hdHRlZExpc3QgPSBkYXRhcG9pbnRzRXhjZWVkaW5nTGltaXRcbiAgICAgIC5tYXAoXG4gICAgICAgIGRhdGFwb2ludCA9PlxuICAgICAgICAgIGDigKIgJHtkYXRhcG9pbnQuZGF0YXBvaW50RGV0YWlsLnNvdXJjZX1fJHtkYXRhcG9pbnQuZGF0YXBvaW50RGV0YWlsLnZhbHVlRnJhZ21lbnRUeXBlfV8ke2RhdGFwb2ludC5kYXRhcG9pbnREZXRhaWwudmFsdWVGcmFnbWVudFNlcmllc31gXG4gICAgICApXG4gICAgICAuam9pbignXFxuJyk7XG5cbiAgICB0aGlzLmFsZXJ0U2VydmljZS5pbmZvKG1lc3NhZ2VUZW1wbGF0ZSwgZm9ybWF0dGVkTGlzdCk7XG4gIH1cblxuICBhc3luYyBmZXRjaE1lYXN1cmVtZW50RGF0YUZpbGVzQW5kUGFpcldpdGhTb3VyY2VEZXRhaWxzKFxuICAgIGFjY2VwdEZpbGVUeXBlOiBzdHJpbmcsXG4gICAgZXhwb3J0Q29uZmlnOiBFeHBvcnRDb25maWdcbiAgKTogUHJvbWlzZTxEYXRhVG9FeHBvcnRXaXRoQmFja2VuZENyZWF0ZWRGaWxlW10+IHtcbiAgICBjb25zdCBtZWFzdXJlbWVudEZpbGVDb25maWc6IE1lYXN1cmVtZW50RmlsZUNvbmZpZyA9IHtcbiAgICAgIGV4cG9ydENvbmZpZyxcbiAgICAgIGFjY2VwdEZpbGVUeXBlXG4gICAgfTtcbiAgICBjb25zdCBmaWxlUHJvbWlzZXMgPSBleHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscy5tYXAoZGV0YWlscyA9PlxuICAgICAgdGhpcy5mZXRjaEFuZFByb2Nlc3NNZWFzdXJlbWVudEZpbGUoZGV0YWlscywgbWVhc3VyZW1lbnRGaWxlQ29uZmlnKVxuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGZpbGVQcm9taXNlcyk7XG4gIH1cblxuICBhc3luYyBmZXRjaEFuZFByb2Nlc3NNZWFzdXJlbWVudEZpbGUoXG4gICAgZGV0YWlsczogRGF0YXBvaW50RGV0YWlscyxcbiAgICBtZWFzdXJlbWVudEZpbGVDb25maWc6IE1lYXN1cmVtZW50RmlsZUNvbmZpZ1xuICApOiBQcm9taXNlPERhdGFUb0V4cG9ydFdpdGhCYWNrZW5kQ3JlYXRlZEZpbGUgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBmaWx0ZXI6IElNZWFzdXJlbWVudEZpbHRlciA9IHRoaXMucHJlcGFyZU1lYXN1cmVtZW50c0ZpbHRlcihcbiAgICAgIGRldGFpbHMsXG4gICAgICBtZWFzdXJlbWVudEZpbGVDb25maWcuZXhwb3J0Q29uZmlnXG4gICAgKTtcbiAgICBjb25zdCBoZWFkZXIgPSB7IGFjY2VwdDogbWVhc3VyZW1lbnRGaWxlQ29uZmlnLmFjY2VwdEZpbGVUeXBlIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbWVhc3VyZW1lbnRGaWxlUmVzcG9uc2U6IElGZXRjaFJlc3BvbnNlID1cbiAgICAgICAgYXdhaXQgdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0TWVhc3VyZW1lbnRzRmlsZShmaWx0ZXIsIGhlYWRlcik7XG5cbiAgICAgIC8vIElmIHRoZSBzdGF0dXMgaXMgMjAwLCB0aGVuIHRoZSBmaWxlIGlzIGluIHRoZSByZXNwb25zZS5cbiAgICAgIC8vIElmIHRoZSBzdGF0dXMgaXMgMjAyLCB0aGVuIHRoZSBmaWxlIGlzIGJlaW5nIHByb2Nlc3NlZCBieSB0aGUgYmFja2VuZCBhbmQgd2lsbCBiZSBzZW50IGJ5IGVtYWlsLlxuICAgICAgaWYgKG1lYXN1cmVtZW50RmlsZVJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lcmdlTWVhc3VyZW1lbnRzV2l0aEl0c1NvdXJjZURldGFpbHMoZGV0YWlscywgbWVhc3VyZW1lbnRGaWxlUmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBtZXJnZU1lYXN1cmVtZW50c1dpdGhJdHNTb3VyY2VEZXRhaWxzKFxuICAgIGRldGFpbHM6IERhdGFwb2ludERldGFpbHMsXG4gICAgbWVhc3VyZW1lbnRGaWxlOiBJRmV0Y2hSZXNwb25zZVxuICApOiBQcm9taXNlPERhdGFUb0V4cG9ydFdpdGhCYWNrZW5kQ3JlYXRlZEZpbGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlOiBkZXRhaWxzLnNvdXJjZSxcbiAgICAgIHZhbHVlRnJhZ21lbnRTZXJpZXM6IGRldGFpbHMudmFsdWVGcmFnbWVudFNlcmllcyxcbiAgICAgIHZhbHVlRnJhZ21lbnRUeXBlOiBkZXRhaWxzLnZhbHVlRnJhZ21lbnRUeXBlLFxuICAgICAgZmV0Y2hlZE1lYXN1cmVtZW50c0Jsb2JGaWxlOiBhd2FpdCBtZWFzdXJlbWVudEZpbGUuYmxvYigpXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoQW5kUHJlcGFyZURhdGFUb0V4cG9ydChcbiAgICBleHBvcnRDb25maWc6IEV4cG9ydENvbmZpZyxcbiAgICBpc01lYXN1cmVtZW50OiBib29sZWFuXG4gICk6IFByb21pc2U8RGF0YVRvRXhwb3J0W10+IHtcbiAgICByZXR1cm4gaXNNZWFzdXJlbWVudFxuICAgICAgPyBhd2FpdCB0aGlzLmZldGNoQW5kUHJlcGFyZU1lYXN1cmVtZW50RGF0YVRvRXhwb3J0Rm9yUHJldmlldyhleHBvcnRDb25maWcpXG4gICAgICA6IGF3YWl0IHRoaXMuZmV0Y2hBbmRQcmVwYXJlU2VyaWVzRGF0YVRvRXhwb3J0KGV4cG9ydENvbmZpZyk7XG4gIH1cblxuICBhc3luYyBnZXRTb3VyY2VzV2l0aFBlcm1pc3Npb25zVG9SZWFkKGRhdGFwb2ludERldGFpbHM6IERhdGFwb2ludERldGFpbHNbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBkYXRlRnJvbSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgZGF0ZVRvID0gbmV3IERhdGUoZGF0ZUZyb20pO1xuXG4gICAgY29uc3QgZmV0Y2hlZERhdGFQcm9taXNlcyA9IGRhdGFwb2ludERldGFpbHMubWFwKGFzeW5jIGRhdGFwb2ludCA9PiB7XG4gICAgICBjb25zdCByYXdGaWx0ZXI6IElTZXJpZXNGaWx0ZXIgPSB7XG4gICAgICAgIGRhdGVGcm9tLFxuICAgICAgICBkYXRlVG8sXG4gICAgICAgIHNvdXJjZTogZGF0YXBvaW50LnNvdXJjZVxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyByZXMgfTogSVJlc3VsdDxJU2VyaWVzPiA9IGF3YWl0IHRoaXMuZmV0Y2hTZXJpZXNEYXRhKHJhd0ZpbHRlcik7XG4gICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGFwb2ludC5zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGZldGNoLCByZXR1cm4gbnVsbCB0byBwcmV2ZW50IHByb21pc2UgcmVqZWN0aW9uXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZmV0Y2hlZFNvdXJjZXMgPSBhd2FpdCBQcm9taXNlLmFsbChmZXRjaGVkRGF0YVByb21pc2VzKTtcbiAgICByZXR1cm4gZmV0Y2hlZFNvdXJjZXMuZmlsdGVyKChzb3VyY2UpOiBzb3VyY2UgaXMgc3RyaW5nID0+IHNvdXJjZSAhPT0gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBhbmQgcHJlcGFyZXMgbWVhc3VyZW1lbnQgZGF0YSBmb3IgcHJldmlldy5cbiAgICpcbiAgICogRW1wdHkgRGF0YVRvRXhwb3J0IG9iamVjdCBjYW4gYmUgcmV0dXJuZWQsIGJlY2F1c2UgdW5saWtlIHNlcmllcyBkYXRhLFxuICAgKiBtZWFzdXJlbWVudCBkYXRhIGlzIG5vdCBmdXJ0aGVyIHByb2Nlc3NlZCBiZXNpZGVzIHNob3dpbmcgb25seSBpbiB0aGUgcHJldmlldy5cbiAgICogQ1NWL0V4Y2VsIGZpbGVzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGJhY2tlbmQgZm9yIG1lYXN1cmVtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIGV4cG9ydENvbmZpZyAtIFRoZSBleHBvcnQgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgRGF0YVRvRXhwb3J0IG9iamVjdHMgb3IgbnVsbCB3aGVuIG5vIGRhdGEgaXMgZmV0Y2hlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hBbmRQcmVwYXJlTWVhc3VyZW1lbnREYXRhVG9FeHBvcnRGb3JQcmV2aWV3KFxuICAgIGV4cG9ydENvbmZpZzogRXhwb3J0Q29uZmlnXG4gICk6IFByb21pc2U8RGF0YVRvRXhwb3J0W10+IHwgbnVsbCB7XG4gICAgY29uc3QgZGF0YVRvRXhwb3J0UHJvbWlzZXM6IFByb21pc2U8RGF0YVRvRXhwb3J0PltdID0gZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMubWFwKFxuICAgICAgYXN5bmMgZGV0YWlscyA9PiB7XG4gICAgICAgIGNvbnN0IGZldGNoZWRNZWFzdXJlbWVudERhdGE6IElSZXN1bHRMaXN0PElNZWFzdXJlbWVudD4gPVxuICAgICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hNZWFzdXJlbWVudERhdGFGb3JQcmV2aWV3KGRldGFpbHMsIGV4cG9ydENvbmZpZyk7XG5cbiAgICAgICAgaWYgKGZldGNoZWRNZWFzdXJlbWVudERhdGE/LmRhdGE/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NNZWFzdXJlbWVudERhdGFGb3JQcmV2aWV3KGRldGFpbHMsIGZldGNoZWRNZWFzdXJlbWVudERhdGEuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChkYXRhVG9FeHBvcnRQcm9taXNlcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoTWVhc3VyZW1lbnREYXRhRm9yUHJldmlldyhcbiAgICBkZXRhaWxzOiBEYXRhcG9pbnREZXRhaWxzLFxuICAgIGV4cG9ydENvbmZpZzogRXhwb3J0Q29uZmlnXG4gICk6IFByb21pc2U8SVJlc3VsdExpc3Q8SU1lYXN1cmVtZW50Pj4gfCB1bmRlZmluZWQge1xuICAgIGxldCBtZWFzdXJlbWVudHM6IElSZXN1bHRMaXN0PElNZWFzdXJlbWVudD4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBmaWx0ZXI6IElNZWFzdXJlbWVudEZpbHRlciA9IHRoaXMucHJlcGFyZU1lYXN1cmVtZW50c0ZpbHRlcihcbiAgICAgIGRldGFpbHMsXG4gICAgICBleHBvcnRDb25maWcsXG4gICAgICBNRUFTVVJFTUVOVFNfUFJFVklFV19JVEVNU19MSU1JVFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIGEgY2FjaGUgbWVjaGFuaXNtIC0+IE1UTS02MDI4OVxuICAgICAgLy8gV2hlbiB1c2VyIHN3aXRjaGVzIGJldHdlZW4gcmVwb3J0IHR5cGVzLCBhbmQgcmVzdCBvZiB0aGUgc2V0dGluZ3MgYXJlIHRoZSBzYW1lLCB0aGVuIHRoZSBkYXRhIHNob3VsZCBub3QgYmUgZmV0Y2hlZCBhZ2Fpbj9cbiAgICAgIG1lYXN1cmVtZW50cyA9IGF3YWl0IHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmxpc3QoZmlsdGVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lYXN1cmVtZW50cztcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZU1lYXN1cmVtZW50c0ZpbHRlcihcbiAgICBkZXRhaWxzOiBEYXRhcG9pbnREZXRhaWxzLFxuICAgIGV4cG9ydENvbmZpZzogRXhwb3J0Q29uZmlnLFxuICAgIHBhZ2VTaXplPzogbnVtYmVyXG4gICk6IElNZWFzdXJlbWVudEZpbHRlciB7XG4gICAgY29uc3QgZmlsdGVyOiBJTWVhc3VyZW1lbnRGaWx0ZXIgPSB7XG4gICAgICAvLyBSb3VuZCB0aGUgJ2Zyb20nIHRpbWUgdG8gdGhlIHByZXZpb3VzIGZ1bGwgbWludXRlLlxuICAgICAgZGF0ZUZyb206IHRoaXMuYWRqdXN0RGF0ZShleHBvcnRDb25maWcuZGF0ZUZyb20sIC0xKSxcbiAgICAgIC8vIFJvdW5kIHRoZSAndG8nIHRpbWUgdG8gdGhlIG5lYXJlc3QgZnVsbCBtaW51dGUuXG4gICAgICBkYXRlVG86IHRoaXMuYWRqdXN0RGF0ZShleHBvcnRDb25maWcuZGF0ZVRvLCAxKSxcbiAgICAgIHNvdXJjZTogZGV0YWlscy5zb3VyY2UsXG4gICAgICB2YWx1ZUZyYWdtZW50U2VyaWVzOiBkZXRhaWxzLnZhbHVlRnJhZ21lbnRTZXJpZXMsXG4gICAgICB2YWx1ZUZyYWdtZW50VHlwZTogZGV0YWlscy52YWx1ZUZyYWdtZW50VHlwZVxuICAgIH07XG5cbiAgICBpZiAocGFnZVNpemUpIHtcbiAgICAgIGZpbHRlci5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NNZWFzdXJlbWVudERhdGFGb3JQcmV2aWV3KFxuICAgIGRldGFpbHM6IERhdGFwb2ludERldGFpbHMsXG4gICAgZGF0YTogSU1lYXN1cmVtZW50W11cbiAgKTogRGF0YVRvRXhwb3J0IHtcbiAgICBjb25zdCB1bml0ID0gZGF0YVswXVtkZXRhaWxzLnZhbHVlRnJhZ21lbnRUeXBlXVtkZXRhaWxzLnZhbHVlRnJhZ21lbnRTZXJpZXNdPy51bml0IHx8ICcnO1xuXG4gICAgY29uc3QgdmFsdWVzOiB7IFt0aW1lc3RhbXA6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgZGF0YS5mb3JFYWNoKG1lYXN1cmVtZW50ID0+IHtcbiAgICAgIHZhbHVlc1ttZWFzdXJlbWVudC50aW1lXSA9XG4gICAgICAgIG1lYXN1cmVtZW50W2RldGFpbHMudmFsdWVGcmFnbWVudFR5cGVdW2RldGFpbHMudmFsdWVGcmFnbWVudFNlcmllc10udmFsdWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyAuLi5kZXRhaWxzLCB1bml0LCB0aW1lVmFsdWVNYXA6IHZhbHVlcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEFuZFByZXBhcmVTZXJpZXNEYXRhVG9FeHBvcnQoZXhwb3J0Q29uZmlnOiBFeHBvcnRDb25maWcpIHtcbiAgICBjb25zdCBkYXRhcG9pbnRzVmFsdWVzRGF0YU1hcDogRGF0YXBvaW50c1ZhbHVlc0RhdGFNYXAgPSB0aGlzLmdyb3VwU2VyaWVzQnlEZXZpY2VJZChcbiAgICAgIGV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzXG4gICAgKTtcblxuICAgIGNvbnN0IGZldGNoZWREYXRhUHJvbWlzZXMgPSBBcnJheS5mcm9tKGRhdGFwb2ludHNWYWx1ZXNEYXRhTWFwKS5tYXAoXG4gICAgICBhc3luYyAoW3NvdXJjZSwgc2VyaWVzXSkgPT4ge1xuICAgICAgICBjb25zdCB7IGRhdGVGcm9tLCBkYXRlVG8sIGFnZ3JlZ2F0aW9uIH0gPSBleHBvcnRDb25maWc7XG5cbiAgICAgICAgY29uc3QgcmF3RmlsdGVyOiBJU2VyaWVzRmlsdGVyID0ge1xuICAgICAgICAgIGRhdGVGcm9tLFxuICAgICAgICAgIGRhdGVUbyxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgc2VyaWVzLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uVHlwZTogYWdncmVnYXRpb24gYXMgYWdncmVnYXRpb25UeXBlXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgeyBkYXRhIH06IElSZXN1bHQ8SVNlcmllcz4gPSBhd2FpdCB0aGlzLmZldGNoU2VyaWVzRGF0YShyYXdGaWx0ZXIpO1xuXG4gICAgICAgIHJldHVybiB7IHNvdXJjZSwgZGF0YSB9O1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBmZXRjaGVkRGF0YUdyb3VwZWRCeVNvdXJjZTogU291cmNlSXRlbVtdID0gYXdhaXQgUHJvbWlzZS5hbGwoZmV0Y2hlZERhdGFQcm9taXNlcyk7XG5cbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2VyaWVzRGF0YShleHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscywgZmV0Y2hlZERhdGFHcm91cGVkQnlTb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBtYXAgb2YgYWN0aXZlIGRhdGEgcG9pbnRzIGRldmljZSBJRHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHNlcmllcy5cbiAgICpcbiAgICogRXhhbXBsZSBvdXRwdXQ6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IE1hcChbXG4gICAqICAgWyc4NDQ2NTcyMDInLCBbJ2M4eV9UZW1wZXJhdHVyZS5UJ11dLFxuICAgKiAgIFsnMzI2NjY0MjcnLCBbJ2M4eV9CYXR0ZXJ5LkJhdHRlcnknXV1cbiAgICogXSk7XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gZGF0YXBvaW50RGV0YWlscyAtIEFuIGFycmF5IG9mIGRhdGEgcG9pbnRzIGRldGFpbHMuXG4gICAqIEByZXR1cm5zIEEgbWFwIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGRhdGEgcG9pbnQgSUQgYW5kIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSBvZiBkYXRhIHBvaW50IHNlcmllcy5cbiAgICovXG4gIHByaXZhdGUgZ3JvdXBTZXJpZXNCeURldmljZUlkKGRhdGFwb2ludERldGFpbHM6IERhdGFwb2ludERldGFpbHNbXSk6IERhdGFwb2ludHNWYWx1ZXNEYXRhTWFwIHtcbiAgICByZXR1cm4gZGF0YXBvaW50RGV0YWlscy5yZWR1Y2UoXG4gICAgICAoXG4gICAgICAgIG1hcDogRGF0YXBvaW50c1ZhbHVlc0RhdGFNYXAsXG4gICAgICAgIHsgdmFsdWVGcmFnbWVudFR5cGUsIHZhbHVlRnJhZ21lbnRTZXJpZXMsIHNvdXJjZSB9OiBEYXRhcG9pbnREZXRhaWxzXG4gICAgICApID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBgJHt2YWx1ZUZyYWdtZW50VHlwZX0uJHt2YWx1ZUZyYWdtZW50U2VyaWVzfWA7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nVmFsdWUgPSBtYXAuZ2V0KHNvdXJjZSkgPz8gW107XG4gICAgICAgIG1hcC5zZXQoc291cmNlLCBbLi4uZXhpc3RpbmdWYWx1ZSwgdmFsdWVdKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sXG4gICAgICBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFNlcmllc0RhdGEocmF3RmlsdGVyOiBJU2VyaWVzRmlsdGVyKTogUHJvbWlzZTxJUmVzdWx0PElTZXJpZXM+PiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHNlcmllc0RhdGE6IElSZXN1bHQ8SVNlcmllcz4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBmaWx0ZXI6IElTZXJpZXNGaWx0ZXIgPSB0aGlzLnByZXBhcmVTZXJpZXNGaWx0ZXIoe1xuICAgICAgZGF0ZUZyb206IHJhd0ZpbHRlci5kYXRlRnJvbSxcbiAgICAgIGRhdGVUbzogcmF3RmlsdGVyLmRhdGVUbyxcbiAgICAgIHNvdXJjZTogcmF3RmlsdGVyLnNvdXJjZSxcbiAgICAgIHNlcmllczogcmF3RmlsdGVyLnNlcmllcyxcbiAgICAgIGFnZ3JlZ2F0aW9uVHlwZTogcmF3RmlsdGVyLmFnZ3JlZ2F0aW9uVHlwZVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBhIGNhY2hlIG1lY2hhbmlzbSAtPiBNVE0tNjAyODlcbiAgICAgIC8vIFdoZW4gdXNlciBzd2l0Y2hlcyBiZXR3ZWVuIHJlcG9ydCB0eXBlcywgYW5kIHJlc3Qgb2YgdGhlIHNldHRpbmdzIGFyZSB0aGUgc2FtZSwgdGhlbiB0aGUgZGF0YSBzaG91bGQgbm90IGJlIGZldGNoZWQgYWdhaW4/XG4gICAgICBzZXJpZXNEYXRhID0gYXdhaXQgdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UubGlzdFNlcmllcyhmaWx0ZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VyaWVzRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVNlcmllc0ZpbHRlcihmaWx0ZXJzOiBJU2VyaWVzRmlsdGVyKTogSVNlcmllc0ZpbHRlciB7XG4gICAgY29uc3QgeyBkYXRlRnJvbSwgZGF0ZVRvLCBzb3VyY2UsIHNlcmllcywgYWdncmVnYXRpb25UeXBlIH0gPSBmaWx0ZXJzO1xuICAgIC8vIFJvdW5kIHRoZSAnZnJvbScgdGltZSB0byB0aGUgcHJldmlvdXMgZnVsbCBtaW51dGUuXG4gICAgY29uc3QgZnJvbSA9IHRoaXMuYWRqdXN0RGF0ZShkYXRlRnJvbSwgLTEpO1xuICAgIC8vIFJvdW5kIHRoZSAndG8nIHRpbWUgdG8gdGhlIG5lYXJlc3QgZnVsbCBtaW51dGUuXG4gICAgY29uc3QgdG8gPSB0aGlzLmFkanVzdERhdGUoZGF0ZVRvLCAxKTtcblxuICAgIGNvbnN0IGZpbHRlcjogSVNlcmllc0ZpbHRlciA9IHtcbiAgICAgIGRhdGVGcm9tOiBmcm9tLFxuICAgICAgZGF0ZVRvOiB0byxcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgcmV2ZXJ0OiB0cnVlXG4gICAgfTtcblxuICAgIC8vIFRoZSAnTk9ORScgYWdncmVnYXRpb24gdHlwZSBpcyBub3QgaGFuZGxlZCBieSBhIGJhY2tlbmQsIHNvIGV2ZW4gd2hlbiBpcyBzZWxlY3RlZCwgaXQgaXMgbm90IHBhc3NlZCBhcyBhIGZpbHRlciBwYXJhbWV0ZXIuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uVHlwZSAmJiBhZ2dyZWdhdGlvblR5cGUgIT09IChBR0dSRUdBVElPTl9WQUxVRVMubm9uZSBhcyBhZ2dyZWdhdGlvblR5cGUpKSB7XG4gICAgICBmaWx0ZXIuYWdncmVnYXRpb25UeXBlID0gYWdncmVnYXRpb25UeXBlO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGl0IGlzIGEgdGVtcG9yYWwgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gdGhlIGJhY2tlbmQsXG4gICAgLy8gd2hlcmUgdGhlIHNlcmllcyB3aXRoIG1vcmUgdGhhbiBvbmUgZG90IGFyZSBpbXBvc3NpYmxlIHRvIHJldHJpZXZlOlxuICAgIC8vIGh0dHBzOi8vY3VtdWxvY2l0eS5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9NVE0tNTkyNzdcbiAgICBpZiAoc2VyaWVzKSB7XG4gICAgICBjb25zdCBoYXNNb3JlVGhhbk9uZURvdCA9IChzZXJpZXMgYXMgc3RyaW5nW10pLnNvbWUocyA9PiBzLnNwbGl0KCcuJykubGVuZ3RoID4gMik7XG4gICAgICBpZiAoIWhhc01vcmVUaGFuT25lRG90KSB7XG4gICAgICAgIGZpbHRlci5zZXJpZXMgPSBzZXJpZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgdGhlIGZldGNoZWQgc2VyaWVzIGRhdGEgYW5kIHByZXBhcmVzIGl0IGZvciBleHBvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhcG9pbnREZXRhaWxzIC0gQW4gYXJyYXkgb2YgZGF0YSBwb2ludCBkZXRhaWxzLlxuICAgKiBAcGFyYW0gZmV0Y2hlZERhdGFNYXAgLSBBIG1hcCBvZiBmZXRjaGVkIHNlcmllcyBkYXRhIGdyb3VwZWQgYnkgc291cmNlLlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBEYXRhVG9FeHBvcnQgb2JqZWN0cy5cbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1Nlcmllc0RhdGEoZGF0YXBvaW50RGV0YWlsczogRGF0YXBvaW50RGV0YWlsc1tdLCBmZXRjaGVkRGF0YU1hcDogU291cmNlSXRlbVtdKSB7XG4gICAgY29uc3QgdmFsdWVzR3JvdXBlZEJ5U291cmNlID0gdGhpcy51dGlsc1NlcnZpY2UudHJhbnNmb3JtRGF0YVN0cnVjdHVyZShmZXRjaGVkRGF0YU1hcCk7XG5cbiAgICByZXR1cm4gZGF0YXBvaW50RGV0YWlscy5tYXAoKGRldGFpbHM6IERhdGFwb2ludERldGFpbHMpID0+IHtcbiAgICAgIGxldCB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZGF0YTogVGltZVNlcmllc0RhdGE7XG5cbiAgICAgIC8qKlxuICAgICAgICogVW5pcXVlIGtleSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRpZmZlcmVudCBzZXJpZXMgZnJvbSBzYW1lIHNvdXJjZSxcbiAgICAgICAqIGUuZy46IGM4eV9BY2NlbGVyYXRpb24uYWNjZWxlcmF0aW9uWCwgYzh5X0FjY2VsZXJhdGlvbi5hY2NlbGVyYXRpb25ZLCBjOHlfQWNjZWxlcmF0aW9uLmFjY2VsZXJhdGlvblpcbiAgICAgICAqL1xuICAgICAgY29uc3Qgc2VyaWVzS2V5ID0gYCR7ZGV0YWlscy52YWx1ZUZyYWdtZW50VHlwZX0uJHtkZXRhaWxzLnZhbHVlRnJhZ21lbnRTZXJpZXN9YDtcblxuICAgICAgaWYgKHZhbHVlc0dyb3VwZWRCeVNvdXJjZVtkZXRhaWxzLnNvdXJjZV1bc2VyaWVzS2V5XSkge1xuICAgICAgICB1bml0ID0gdmFsdWVzR3JvdXBlZEJ5U291cmNlW2RldGFpbHMuc291cmNlXVtzZXJpZXNLZXldLnNlcmllc0RldGFpbHMudW5pdDtcbiAgICAgICAgZGF0YSA9IHZhbHVlc0dyb3VwZWRCeVNvdXJjZVtkZXRhaWxzLnNvdXJjZV1bc2VyaWVzS2V5XS52YWx1ZXM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRldGFpbHMsXG4gICAgICAgIHVuaXQsXG4gICAgICAgIHRpbWVWYWx1ZU1hcDogZGF0YVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGp1c3RzIHRoZSBnaXZlbiBkYXRlIGJ5IGFkZGluZyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaW51dGVzIGFuZCBzZXR0aW5nIHNlY29uZHMgdG8gMC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBhZGp1c3RlZCBpbiBzdHJpbmcgZm9ybWF0LlxuICAgKiBAcGFyYW0gbWludXRlcyAtIFRoZSBudW1iZXIgb2YgbWludXRlcyB0byBhZGQgdG8gdGhlIGRhdGUuXG4gICAqIEByZXR1cm5zIFRoZSBhZGp1c3RlZCBkYXRlIGluIHRoZSBmb3JtYXQgJ1lZWVktTU0tRERUSEg6bW06c3MrSEg6TU0nLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGp1c3REYXRlKGRhdGU6IHN0cmluZyB8IERhdGUsIG1pbnV0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZVRpbWUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBkYXRlVGltZS5zZXRNaW51dGVzKGRhdGVUaW1lLmdldE1pbnV0ZXMoKSArIG1pbnV0ZXMpO1xuICAgIGRhdGVUaW1lLnNldFNlY29uZHMoMCk7XG5cbiAgICBjb25zdCBvZmZzZXQgPSAtZGF0ZVRpbWUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBjb25zdCBvZmZzZXRTaWduID0gb2Zmc2V0ID49IDAgPyAnKycgOiAnLSc7XG4gICAgY29uc3QgcGFkID0gKG51bTogbnVtYmVyKTogc3RyaW5nID0+IChudW0gPCAxMCA/ICcwJyArIG51bSA6IG51bS50b1N0cmluZygpKTtcbiAgICBjb25zdCBvZmZzZXRIb3VycyA9IHBhZChNYXRoLmZsb29yKE1hdGguYWJzKG9mZnNldCkgLyA2MCkpO1xuICAgIGNvbnN0IG9mZnNldE1pbnV0ZXMgPSBwYWQoTWF0aC5hYnMob2Zmc2V0KSAlIDYwKTtcblxuICAgIGNvbnN0IHllYXIgPSBkYXRlVGltZS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gcGFkKGRhdGVUaW1lLmdldE1vbnRoKCkgKyAxKTtcbiAgICBjb25zdCBkYXkgPSBwYWQoZGF0ZVRpbWUuZ2V0RGF0ZSgpKTtcbiAgICBjb25zdCBob3VycyA9IHBhZChkYXRlVGltZS5nZXRIb3VycygpKTtcbiAgICBjb25zdCBtaW51dGVzU3RyaW5nID0gcGFkKGRhdGVUaW1lLmdldE1pbnV0ZXMoKSk7XG4gICAgY29uc3Qgc2Vjb25kcyA9ICcwMCc7XG5cbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9VCR7aG91cnN9OiR7bWludXRlc1N0cmluZ306JHtzZWNvbmRzfSR7b2Zmc2V0U2lnbn0ke29mZnNldEhvdXJzfToke29mZnNldE1pbnV0ZXN9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmltcyB0aGUgZ2l2ZW4gSFRNTCBtZXNzYWdlIGJ5IHJlbW92aW5nIGxpc3QgaXRlbXMgdGhhdCBjb3JyZXNwb25kIHRvIHplcm8gY291bnRzLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBIVE1MIHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHdpdGggbGlzdCBpdGVtcy5cbiAgICogQHBhcmFtIGNvdW50cyAtIEFuIGFycmF5IG9mIG51bWJlciB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGxpc3QgaXRlbS5cbiAgICogQHBhcmFtIGNvdW50VG9UcmltIC0gQSBjb3VudCB0aGF0IHdpbGwgYmUgdHJpbW1lZCB3aXRoIGNvcnJlc3BvbmRpbmcgbGlzdCBpdGVtLlxuICAgKiBAcmV0dXJucyBBIHRyaW1tZWQgSFRNTCBzdHJpbmcgd2l0aCBsaXN0IGl0ZW1zIHJlbW92ZWQgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY291bnQgaXMgemVyby5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBtZXNzYWdlID0gJzx1bD48bGk+SXRlbSAxPC9saT48bGk+SXRlbSAyPC9saT48bGk+SXRlbSAzPC9saT48L3VsPic7XG4gICAqIGNvbnN0IGNvdW50cyA9IFsxLCAwLCAyXTtcbiAgICogY29uc3QgdHJpbW1lZE1lc3NhZ2UgPSB0aGlzLnJlbW92ZVplcm9Db3VudExpc3RJdGVtcyhtZXNzYWdlLCBjb3VudHMpO1xuICAgKiAvLyBSZXN1bHQ6ICc8dWw+PGxpPkl0ZW0gMTwvbGk+PGxpPkl0ZW0gMzwvbGk+PC91bD4nXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVaZXJvQ291bnRMaXN0SXRlbXMobWVzc2FnZTogc3RyaW5nLCBjb3VudHM6IG51bWJlcltdLCBjb3VudFRvVHJpbSA9IDApOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UsICd0ZXh0L2h0bWwnKTtcbiAgICBjb25zdCBsaXN0SXRlbXMgPSBkb2MucXVlcnlTZWxlY3RvckFsbCgndWwgbGknKTtcblxuICAgIGxpc3RJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGNvdW50c1tpbmRleF0gPT09IGNvdW50VG9UcmltKSB7XG4gICAgICAgIGl0ZW0ucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZG9jLmJvZHkuaW5uZXJIVE1MO1xuICB9XG59XG4iXX0=
|
|
402
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1mZXRjaGluZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItbW9kYWwvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci9kYXRhLWZldGNoaW5nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQVNMLGtCQUFrQixFQUNuQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFRTCxnQ0FBZ0MsRUFFakMsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRCxPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7QUFLM0QsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixZQUNVLFlBQTBCLEVBQzFCLGtCQUFzQyxFQUN0QyxTQUF1QixFQUN2QixnQkFBa0MsRUFDbEMsWUFBMEI7UUFKMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7SUFDakMsQ0FBQztJQUVKOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLDJCQUEyQixDQUMvQixZQUEwQjtRQUUxQixNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FB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QixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO2dCQUMzRSxJQUFJLEdBQUcscUJBQXFCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNqRSxDQUFDO1lBRUQsT0FBTztnQkFDTCxHQUFHLE9BQU87Z0JBQ1YsSUFBSTtnQkFDSixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0ssd0JBQXdCLENBQUMsT0FBZSxFQUFFLE1BQWdCLEVBQUUsV0FBVyxHQUFHLENBQUM7UUFDakYsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN6RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFaEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNoQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDNUIsQ0FBQzs4R0EvZlUsbUJBQW1CO2tIQUFuQixtQkFBbUIsY0FGbEIsTUFBTTs7MkZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtcbiAgYWdncmVnYXRpb25UeXBlLFxuICBJRmV0Y2hSZXNwb25zZSxcbiAgSU1lYXN1cmVtZW50LFxuICBJTWVhc3VyZW1lbnRGaWx0ZXIsXG4gIElSZXN1bHQsXG4gIElSZXN1bHRMaXN0LFxuICBJU2VyaWVzLFxuICBJU2VyaWVzRmlsdGVyLFxuICBNZWFzdXJlbWVudFNlcnZpY2Vcbn0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQUdHUkVHQVRJT05fVkFMVUVTLCBBbGVydFNlcnZpY2UsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7XG4gIERhdGFwb2ludERldGFpbHMsXG4gIERhdGFwb2ludHNFeGNlZWRpbmdMaW1pdCxcbiAgRGF0YXBvaW50c1ZhbHVlc0RhdGFNYXAsXG4gIERhdGFUb0V4cG9ydCxcbiAgRGF0YVRvRXhwb3J0V2l0aEJhY2tlbmRDcmVhdGVkRmlsZSxcbiAgRXhwb3J0Q29uZmlnLFxuICBNZWFzdXJlbWVudEZpbGVDb25maWcsXG4gIE1FQVNVUkVNRU5UU19QUkVWSUVXX0lURU1TX0xJTUlULFxuICBUaW1lU2VyaWVzRGF0YVxufSBmcm9tICcuLi8uLi9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci5tb2RlbCc7XG5pbXBvcnQgeyBTb3VyY2VJdGVtLCBVdGlsc1NlcnZpY2UgfSBmcm9tICcuL3V0aWxzLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEYXRhRmV0Y2hpbmdTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIG1lYXN1cmVtZW50U2VydmljZTogTWVhc3VyZW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbHNTZXJ2aWNlOiBVdGlsc1NlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW55IG9mIG1lYXN1cmVtZW50cyByZXF1ZXN0cyBtYXkgZXhjZWVkZWQgdGhlIGxpbWl0LFxuICAgKiBhZnRlciB3aGljaCB0aGUgZXhwb3J0IGRhdGEgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBiYWNrZW5kIGFuZCB0aGUgZ2VuZXJhdGVkIENTVi9FeGNlbCBmaWxlIGlzIHNlbnQgYnkgZW1haWwuXG4gICAqXG4gICAqIFRoZSB0aHJlc2hvbGQgaXMgc2V0IHRvIDUwXzAwMCByZWNvcmRzIGluIGFwcGxpY2F0aW9uJ3MgY29yZSBwcm9wZXJ0aWVzIChleHBvcnQuZGF0YS5zeW5jaHJvbm91cy5saW1pdCkuXG4gICAqXG4gICAqIEBwYXJhbSBleHBvcnRDb25maWcgLSBUaGUgZXhwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgZGF0YXBvaW50cyBmaWxlcyB0aGF0IHdpbGwgYmUgc2VudCBieSBlbWFpbC5cbiAgICovXG4gIGFzeW5jIGdldERhdGFwb2ludHNFeGNlZWRpbmdMaW1pdChcbiAgICBleHBvcnRDb25maWc6IEV4cG9ydENvbmZpZ1xuICApOiBQcm9taXNlPERhdGFwb2ludHNFeGNlZWRpbmdMaW1pdFtdPiB7XG4gICAgY29uc3QgYmFja2VuZFByb2Nlc3NpbmdMaW1pdCA9IDUwXzAwMDtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPERhdGFwb2ludHNFeGNlZWRpbmdMaW1pdD5bXSA9IGV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzLm1hcChcbiAgICAgIGFzeW5jIGRldGFpbHMgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcjogSU1lYXN1cmVtZW50RmlsdGVyID0ge1xuICAgICAgICAgICAgZGF0ZUZyb206IGV4cG9ydENvbmZpZy5kYXRlRnJvbSxcbiAgICAgICAgICAgIGRhdGVUbzogZXhwb3J0Q29uZmlnLmRhdGVUbyxcbiAgICAgICAgICAgIHBhZ2VTaXplOiAxLFxuICAgICAgICAgICAgc291cmNlOiBkZXRhaWxzLnNvdXJjZSxcbiAgICAgICAgICAgIHZhbHVlRnJhZ21lbnRTZXJpZXM6IGRldGFpbHMudmFsdWVGcmFnbWVudFNlcmllcyxcbiAgICAgICAgICAgIHZhbHVlRnJhZ21lbnRUeXBlOiBkZXRhaWxzLnZhbHVlRnJhZ21lbnRUeXBlLFxuICAgICAgICAgICAgd2l0aFRvdGFsRWxlbWVudHM6IHRydWVcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5saXN0KGZpbHRlcik7XG5cbiAgICAgICAgICBpZiAocmVzcG9uc2U/LnBhZ2luZz8udG90YWxFbGVtZW50cyA+IGJhY2tlbmRQcm9jZXNzaW5nTGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRhdGFwb2ludERldGFpbDoge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogZGV0YWlscy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgdmFsdWVGcmFnbWVudFNlcmllczogZGV0YWlscy52YWx1ZUZyYWdtZW50U2VyaWVzLFxuICAgICAgICAgICAgICAgIHZhbHVlRnJhZ21lbnRUeXBlOiBkZXRhaWxzLnZhbHVlRnJhZ21lbnRUeXBlXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRvdGFsRWxlbWVudHM6IHJlc3BvbnNlLnBhZ2luZy50b3RhbEVsZW1lbnRzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0czogRGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0W10gPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG5cbiAgICBjb25zdCBkYXRhcG9pbnRzRXhjZWVkaW5nTGltaXQgPSByZXN1bHRzLmZpbHRlcihyZXN1bHQgPT4gcmVzdWx0ICE9PSBudWxsKTtcblxuICAgIHJldHVybiBkYXRhcG9pbnRzRXhjZWVkaW5nTGltaXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCB3aGVuIHRoZSBsaW1pdCBvZiBkYXRhcG9pbnRzIGlzIGV4Y2VlZGVkIGR1cmluZyBmaWxlIGV4cG9ydC5cbiAgICpcbiAgICogQHBhcmFtIGhhc05vRXhwb3J0YWJsZURhdGEgLSBJbmRpY2F0ZXMgaWYgdGhlcmUgaXMgbm8gZXhwb3J0YWJsZSBkYXRhIGJlY2F1c2UgdGhlIGRhdGUgcmFuZ2Ugb2YgYWxsIHNlbGVjdGVkIGRhdGFwb2ludHMgZXhjZWVkcyAxLDAwMCwwMDAgcmVjb3Jkcy5cbiAgICogQHBhcmFtIGVtYWlsRGVsaXZlcmFibGVDb3VudCAtIFRoZSBudW1iZXIgb2YgZGF0YXBvaW50IGV4cG9ydHMgdGhhdCBleGNlZWQgdGhlIGxpbWl0LCB3aWxsIGJlIHByb2NlZWRlZCBieSB0aGUgYmFja2VuZCBhbmQgc2VudCBieSBlbWFpbC5cbiAgICogQHBhcmFtIGJyb3dzZXJEb3dubG9hZGFibGVDb3VudCAtIFRoZSBudW1iZXIgb2YgZGF0YXBvaW50IGV4cG9ydHMgdGhhdCBjYW4gYmUgZG93bmxvYWRlZCBkaXJlY3RseS5cbiAgICogQHBhcmFtIHNraXBwZWREYXRhcG9pbnRDb3VudCAtIFRoZSBudW1iZXIgb2YgZGF0YXBvaW50IGV4cG9ydHMgc2tpcHBlZCBkdWUgdG8gZXhjZWVkaW5nIHRoZSBtZWFzdXJlbWVudHMgQVBJIGxpbWl0IG9mIDEsMDAwLDAwMCByZWNvcmRzLlxuICAgKiBAcGFyYW0gdG90YWxEYXRhcG9pbnRzU2VsZWN0ZWRGb3JFeHBvcnRDb3VudCAtIFRvdGFsIG51bWJlciBvZiBkYXRhcG9pbnQgc2VsZWN0ZWQgZm9yIGV4cG9ydHMuXG4gICAqIEByZXR1cm5zIFRoZSBtZXNzYWdlIHRoYXQgY2FuIGJlIGluamVjdGVkLlxuICAgKi9cbiAgZ2V0TGltaXRFeGNlZWRlZE1lc3NhZ2UoXG4gICAgaGFzTm9FeHBvcnRhYmxlRGF0YTogYm9vbGVhbixcbiAgICBlbWFpbERlbGl2ZXJhYmxlQ291bnQ/OiBudW1iZXIsXG4gICAgYnJvd3NlckRvd25sb2FkYWJsZUNvdW50PzogbnVtYmVyLFxuICAgIG5vblJldHJpZXZhYmxlQ291bnQ/OiBudW1iZXIsXG4gICAgdG90YWxEYXRhcG9pbnRzU2VsZWN0ZWRGb3JFeHBvcnRDb3VudD86IG51bWJlclxuICApOiBzdHJpbmcge1xuICAgIGlmIChoYXNOb0V4cG9ydGFibGVEYXRhKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgIGdldHRleHQoXG4gICAgICAgICAgYFRoZSBkYXRhIGZvciBzZWxlY3RlZCBkYXRhcG9pbnQocykgZXhjZWVkIDEsMDAwLDAwMCByZWNvcmRzLCB3aGljaCBpcyB0aGUgbGltaXQgZm9yIGJhY2tlbmQgcHJvY2Vzc2luZy4gVG8gZXhwb3J0IHRoaXMgZGF0YSwgcGxlYXNlIHJlZHVjZSB0aGUgZGF0ZSByYW5nZS5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICBnZXR0ZXh0KFxuICAgICAgICBgQWZ0ZXIgY2xpY2tpbmcgXCJEb3dubG9hZFwiOjxicj5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT48c3Ryb25nPnt7JGJyb3dzZXJEb3dubG9hZGFibGVDb3VudH19PC9zdHJvbmc+IGRhdGFwb2ludChzKSBleHBvcnRzIHdpbGwgYmUgZG93bmxvYWRlZCBkaXJlY3RseSB3aXRoaW4gb25lIGZpbGU6IDxlbT5leHBvcnRlZF9bY3N2L2V4Y2VsXS56aXA8L2VtPjwvbGk+XG4gICAgICAgICAgPGxpPjxzdHJvbmc+e3skZW1haWxEZWxpdmVyYWJsZUNvdW50fX08L3N0cm9uZz4gZGF0YXBvaW50KHMpIGV4cG9ydHMgcmVxdWlyZSBmdXJ0aGVyIHByb2Nlc3NpbmcuIFRoZSBmaWxlcyB3aWxsIGJlIHNlbnQgdG8geW91IHZpYSBzZXBhcmF0ZSBlbWFpbHMgb25jZSBjb21wbGV0ZWQsIHdoaWNoIG1heSB0YWtlIHNvbWUgdGltZS48L2xpPlxuICAgICAgICAgIDxsaT48c3Ryb25nPnt7JG5vblJldHJpZXZhYmxlQ291bnR9fTwvc3Ryb25nPiBkYXRhcG9pbnQocykgZXhwb3J0cyBleGNlZWRlZCAxLDAwMCwwMDAgcmVjb3Jkcywgd2hpY2ggaXMgdGhlIGxpbWl0IGZvciBiYWNrZW5kIHByb2Nlc3NpbmcuIFRvIGV4cG9ydCB0aGVzZSBkYXRhLCBwbGVhc2UgcmVkdWNlIHRoZSBkYXRlIHJhbmdlLiBPdGhlcndpc2UsIHRoZSBkYXRhIHdpbGwgbmVpdGhlciBiZSBkb3dubG9hZGVkIG5vciBzZW50IHZpYSBlbWFpbC48L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgICA8cD5UaGUgdG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIHRoYXQgY2FuIGJlIGV4cG9ydGVkIGlzOiA8c3Ryb25nPnt7JHRvdGFsRXhwb3J0YWJsZURhdGFwb2ludHNDb3VudH19IG91dCBvZiB7eyR0b3RhbERhdGFwb2ludHNTZWxlY3RlZEZvckV4cG9ydENvdW50fX08L3N0cm9uZz4uXG4gICAgICAgIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIGZpbGUgbmFtZSBjb252ZW50aW9uIG9mIGZpbGVzIHdpdGhpbiB6aXAgZmlsZSBpczogPGNvZGU+W3NvdXJjZV1fW2ZyYWdtZW50X3Nlcmllc10uW2Nzdi94bHNdPC9jb2RlPjwvcD5gXG4gICAgICApLFxuICAgICAge1xuICAgICAgICAkYnJvd3NlckRvd25sb2FkYWJsZUNvdW50OiBicm93c2VyRG93bmxvYWRhYmxlQ291bnQsXG4gICAgICAgICRlbWFpbERlbGl2ZXJhYmxlQ291bnQ6IGVtYWlsRGVsaXZlcmFibGVDb3VudCxcbiAgICAgICAgJG5vblJldHJpZXZhYmxlQ291bnQ6IG5vblJldHJpZXZhYmxlQ291bnQsXG4gICAgICAgICR0b3RhbERhdGFwb2ludHNTZWxlY3RlZEZvckV4cG9ydENvdW50OiB0b3RhbERhdGFwb2ludHNTZWxlY3RlZEZvckV4cG9ydENvdW50LFxuICAgICAgICAkdG90YWxFeHBvcnRhYmxlRGF0YXBvaW50c0NvdW50OiBicm93c2VyRG93bmxvYWRhYmxlQ291bnQgKyBlbWFpbERlbGl2ZXJhYmxlQ291bnRcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgdHJpbW1lZE1lc3NhZ2UgPSB0aGlzLnJlbW92ZVplcm9Db3VudExpc3RJdGVtcyhtZXNzYWdlLCBbXG4gICAgICBicm93c2VyRG93bmxvYWRhYmxlQ291bnQsXG4gICAgICBlbWFpbERlbGl2ZXJhYmxlQ291bnQsXG4gICAgICBub25SZXRyaWV2YWJsZUNvdW50XG4gICAgXSk7XG5cbiAgICByZXR1cm4gdHJpbW1lZE1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgYW4gaW5mb3JtYXRpb24gYWxlcnQgYWJvdXQgc2VuZGluZyBkYXRhIHZpYSBlbWFpbC5cbiAgICpcbiAgICogT25seSBtZWFzdXJlbWVudHMgQVBJIGNhbiBzZW5kIGZpbGVzIHZpYSBlbWFpbC5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVUeXBlIC0gVGhlIHR5cGUgb2YgZmlsZSB0byBiZSBzZW50LlxuICAgKiBAcGFyYW0gZGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0IC0gVGhlIGFycmF5IG9mIGRhdGFwb2ludHMgZXhjZWVkaW5nIHRoZSBsaW1pdC5cbiAgICovXG4gIHNob3dTZW5kVmlhRW1haWxJbmZvQWxlcnQoXG4gICAgZmlsZVR5cGU6IHN0cmluZyxcbiAgICBkYXRhcG9pbnRzRXhjZWVkaW5nTGltaXQ6IERhdGFwb2ludHNFeGNlZWRpbmdMaW1pdFtdXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1lc3NhZ2VUZW1wbGF0ZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgZ2V0dGV4dChgWW91IHdpbGwgZ2V0IHt7JGZpbGVUeXBlVGV4dH19IGZpbGUocykgZm9yIHt7JGNvdW50fX0gc2VyaWVzIHZpYSBlbWFpbC5gKSxcbiAgICAgIHsgJGNvdW50OiBkYXRhcG9pbnRzRXhjZWVkaW5nTGltaXQubGVuZ3RoLCAkZmlsZVR5cGVUZXh0OiBmaWxlVHlwZSB9XG4gICAgKTtcbiAgICBjb25zdCBmb3JtYXR0ZWRMaXN0ID0gZGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0XG4gICAgICAubWFwKFxuICAgICAgICBkYXRhcG9pbnQgPT5cbiAgICAgICAgICBg4oCiICR7ZGF0YXBvaW50LmRhdGFwb2ludERldGFpbC5zb3VyY2V9XyR7ZGF0YXBvaW50LmRhdGFwb2ludERldGFpbC52YWx1ZUZyYWdtZW50VHlwZX1fJHtkYXRhcG9pbnQuZGF0YXBvaW50RGV0YWlsLnZhbHVlRnJhZ21lbnRTZXJpZXN9YFxuICAgICAgKVxuICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgdGhpcy5hbGVydFNlcnZpY2UuaW5mbyhtZXNzYWdlVGVtcGxhdGUsIGZvcm1hdHRlZExpc3QpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hNZWFzdXJlbWVudERhdGFGaWxlc0FuZFBhaXJXaXRoU291cmNlRGV0YWlscyhcbiAgICBhY2NlcHRGaWxlVHlwZTogc3RyaW5nLFxuICAgIGV4cG9ydENvbmZpZzogRXhwb3J0Q29uZmlnXG4gICk6IFByb21pc2U8RGF0YVRvRXhwb3J0V2l0aEJhY2tlbmRDcmVhdGVkRmlsZVtdPiB7XG4gICAgY29uc3QgbWVhc3VyZW1lbnRGaWxlQ29uZmlnOiBNZWFzdXJlbWVudEZpbGVDb25maWcgPSB7XG4gICAgICBleHBvcnRDb25maWcsXG4gICAgICBhY2NlcHRGaWxlVHlwZVxuICAgIH07XG4gICAgY29uc3QgZmlsZVByb21pc2VzID0gZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMubWFwKGRldGFpbHMgPT5cbiAgICAgIHRoaXMuZmV0Y2hBbmRQcm9jZXNzTWVhc3VyZW1lbnRGaWxlKGRldGFpbHMsIG1lYXN1cmVtZW50RmlsZUNvbmZpZylcbiAgICApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChmaWxlUHJvbWlzZXMpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hBbmRQcm9jZXNzTWVhc3VyZW1lbnRGaWxlKFxuICAgIGRldGFpbHM6IERhdGFwb2ludERldGFpbHMsXG4gICAgbWVhc3VyZW1lbnRGaWxlQ29uZmlnOiBNZWFzdXJlbWVudEZpbGVDb25maWdcbiAgKTogUHJvbWlzZTxEYXRhVG9FeHBvcnRXaXRoQmFja2VuZENyZWF0ZWRGaWxlIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZmlsdGVyOiBJTWVhc3VyZW1lbnRGaWx0ZXIgPSB0aGlzLnByZXBhcmVNZWFzdXJlbWVudHNGaWx0ZXIoXG4gICAgICBkZXRhaWxzLFxuICAgICAgbWVhc3VyZW1lbnRGaWxlQ29uZmlnLmV4cG9ydENvbmZpZ1xuICAgICk7XG4gICAgY29uc3QgaGVhZGVyID0geyBhY2NlcHQ6IG1lYXN1cmVtZW50RmlsZUNvbmZpZy5hY2NlcHRGaWxlVHlwZSB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1lYXN1cmVtZW50RmlsZVJlc3BvbnNlOiBJRmV0Y2hSZXNwb25zZSA9XG4gICAgICAgIGF3YWl0IHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmdldE1lYXN1cmVtZW50c0ZpbGUoZmlsdGVyLCBoZWFkZXIpO1xuXG4gICAgICAvLyBJZiB0aGUgc3RhdHVzIGlzIDIwMCwgdGhlbiB0aGUgZmlsZSBpcyBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICAvLyBJZiB0aGUgc3RhdHVzIGlzIDIwMiwgdGhlbiB0aGUgZmlsZSBpcyBiZWluZyBwcm9jZXNzZWQgYnkgdGhlIGJhY2tlbmQgYW5kIHdpbGwgYmUgc2VudCBieSBlbWFpbC5cbiAgICAgIGlmIChtZWFzdXJlbWVudEZpbGVSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXJnZU1lYXN1cmVtZW50c1dpdGhJdHNTb3VyY2VEZXRhaWxzKGRldGFpbHMsIG1lYXN1cmVtZW50RmlsZVJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbWVyZ2VNZWFzdXJlbWVudHNXaXRoSXRzU291cmNlRGV0YWlscyhcbiAgICBkZXRhaWxzOiBEYXRhcG9pbnREZXRhaWxzLFxuICAgIG1lYXN1cmVtZW50RmlsZTogSUZldGNoUmVzcG9uc2VcbiAgKTogUHJvbWlzZTxEYXRhVG9FeHBvcnRXaXRoQmFja2VuZENyZWF0ZWRGaWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNvdXJjZTogZGV0YWlscy5zb3VyY2UsXG4gICAgICB2YWx1ZUZyYWdtZW50U2VyaWVzOiBkZXRhaWxzLnZhbHVlRnJhZ21lbnRTZXJpZXMsXG4gICAgICB2YWx1ZUZyYWdtZW50VHlwZTogZGV0YWlscy52YWx1ZUZyYWdtZW50VHlwZSxcbiAgICAgIGZldGNoZWRNZWFzdXJlbWVudHNCbG9iRmlsZTogYXdhaXQgbWVhc3VyZW1lbnRGaWxlLmJsb2IoKVxuICAgIH07XG4gIH1cblxuICBhc3luYyBmZXRjaEFuZFByZXBhcmVEYXRhVG9FeHBvcnQoXG4gICAgZXhwb3J0Q29uZmlnOiBFeHBvcnRDb25maWcsXG4gICAgaXNNZWFzdXJlbWVudDogYm9vbGVhblxuICApOiBQcm9taXNlPERhdGFUb0V4cG9ydFtdPiB7XG4gICAgcmV0dXJuIGlzTWVhc3VyZW1lbnRcbiAgICAgID8gYXdhaXQgdGhpcy5mZXRjaEFuZFByZXBhcmVNZWFzdXJlbWVudERhdGFUb0V4cG9ydEZvclByZXZpZXcoZXhwb3J0Q29uZmlnKVxuICAgICAgOiBhd2FpdCB0aGlzLmZldGNoQW5kUHJlcGFyZVNlcmllc0RhdGFUb0V4cG9ydChleHBvcnRDb25maWcpO1xuICB9XG5cbiAgYXN5bmMgZ2V0U291cmNlc1dpdGhQZXJtaXNzaW9uc1RvUmVhZChkYXRhcG9pbnREZXRhaWxzOiBEYXRhcG9pbnREZXRhaWxzW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgZGF0ZUZyb20gPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGRhdGVUbyA9IG5ldyBEYXRlKGRhdGVGcm9tKTtcblxuICAgIGNvbnN0IGZldGNoZWREYXRhUHJvbWlzZXMgPSBkYXRhcG9pbnREZXRhaWxzLm1hcChhc3luYyBkYXRhcG9pbnQgPT4ge1xuICAgICAgY29uc3QgcmF3RmlsdGVyOiBJU2VyaWVzRmlsdGVyID0ge1xuICAgICAgICBkYXRlRnJvbSxcbiAgICAgICAgZGF0ZVRvLFxuICAgICAgICBzb3VyY2U6IGRhdGFwb2ludC5zb3VyY2VcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgcmVzIH06IElSZXN1bHQ8SVNlcmllcz4gPSBhd2FpdCB0aGlzLmZldGNoU2VyaWVzRGF0YShyYXdGaWx0ZXIpO1xuICAgICAgICBpZiAocmVzPy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgIHJldHVybiBkYXRhcG9pbnQuc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBmZXRjaCwgcmV0dXJuIG51bGwgdG8gcHJldmVudCBwcm9taXNlIHJlamVjdGlvblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGZldGNoZWRTb3VyY2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoZmV0Y2hlZERhdGFQcm9taXNlcyk7XG4gICAgcmV0dXJuIGZldGNoZWRTb3VyY2VzLmZpbHRlcigoc291cmNlKTogc291cmNlIGlzIHN0cmluZyA9PiBzb3VyY2UgIT09IG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkanVzdHMgdGhlIGdpdmVuIGRhdGUgYnkgYWRkaW5nIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbnV0ZXMgYW5kIHNldHRpbmcgc2Vjb25kcyB0byAwLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGFkanVzdGVkIGluIHN0cmluZyBmb3JtYXQuXG4gICAqIEBwYXJhbSBtaW51dGVzIC0gVGhlIG51bWJlciBvZiBtaW51dGVzIHRvIGFkZCB0byB0aGUgZGF0ZS5cbiAgICogQHBhcmFtIHJvdW5kU2Vjb25kcyAtIFdoZXRoZXIgdG8gcm91bmQgdGhlIHNlY29uZHMgb3Igbm90LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgSWYgdHJ1ZSwgdGhlIHNlY29uZHMgd2lsbCBiZSByb3VuZGVkIHRvIDAuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBJZiBmYWxzZSwgdGhlIHNlY29uZHMgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgdGhleSBhcmUuXG4gICAqIEByZXR1cm5zIFRoZSBhZGp1c3RlZCBkYXRlIGluIElTTyBzdHJpbmcgZm9ybWF0LlxuICAgKi9cbiAgYWRqdXN0RGF0ZShkYXRlOiBzdHJpbmcgfCBEYXRlLCBtaW51dGVzOiBudW1iZXIsIHJvdW5kU2Vjb25kcyA9IHRydWUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGVUaW1lID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgaWYgKGlzTmFOKGRhdGVUaW1lLmdldFRpbWUoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRlJyk7XG4gICAgfVxuXG4gICAgZGF0ZVRpbWUuc2V0VVRDTWludXRlcyhkYXRlVGltZS5nZXRVVENNaW51dGVzKCkgKyBtaW51dGVzKTtcbiAgICBpZiAocm91bmRTZWNvbmRzKSB7XG4gICAgICBkYXRlVGltZS5zZXRVVENTZWNvbmRzKDAsIDApO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRlVGltZS50b0lTT1N0cmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYW5kIHByZXBhcmVzIG1lYXN1cmVtZW50IGRhdGEgZm9yIHByZXZpZXcuXG4gICAqXG4gICAqIEVtcHR5IERhdGFUb0V4cG9ydCBvYmplY3QgY2FuIGJlIHJldHVybmVkLCBiZWNhdXNlIHVubGlrZSBzZXJpZXMgZGF0YSxcbiAgICogbWVhc3VyZW1lbnQgZGF0YSBpcyBub3QgZnVydGhlciBwcm9jZXNzZWQgYmVzaWRlcyBzaG93aW5nIG9ubHkgaW4gdGhlIHByZXZpZXcuXG4gICAqIENTVi9FeGNlbCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBiYWNrZW5kIGZvciBtZWFzdXJlbWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSBleHBvcnRDb25maWcgLSBUaGUgZXhwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIERhdGFUb0V4cG9ydCBvYmplY3RzIG9yIG51bGwgd2hlbiBubyBkYXRhIGlzIGZldGNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoQW5kUHJlcGFyZU1lYXN1cmVtZW50RGF0YVRvRXhwb3J0Rm9yUHJldmlldyhcbiAgICBleHBvcnRDb25maWc6IEV4cG9ydENvbmZpZ1xuICApOiBQcm9taXNlPERhdGFUb0V4cG9ydFtdPiB8IG51bGwge1xuICAgIGNvbnN0IGRhdGFUb0V4cG9ydFByb21pc2VzOiBQcm9taXNlPERhdGFUb0V4cG9ydD5bXSA9IGV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzLm1hcChcbiAgICAgIGFzeW5jIGRldGFpbHMgPT4ge1xuICAgICAgICBjb25zdCBmZXRjaGVkTWVhc3VyZW1lbnREYXRhOiBJUmVzdWx0TGlzdDxJTWVhc3VyZW1lbnQ+ID1cbiAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoTWVhc3VyZW1lbnREYXRhRm9yUHJldmlldyhkZXRhaWxzLCBleHBvcnRDb25maWcpO1xuXG4gICAgICAgIGlmIChmZXRjaGVkTWVhc3VyZW1lbnREYXRhPy5kYXRhPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTWVhc3VyZW1lbnREYXRhRm9yUHJldmlldyhkZXRhaWxzLCBmZXRjaGVkTWVhc3VyZW1lbnREYXRhLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoZGF0YVRvRXhwb3J0UHJvbWlzZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE1lYXN1cmVtZW50RGF0YUZvclByZXZpZXcoXG4gICAgZGV0YWlsczogRGF0YXBvaW50RGV0YWlscyxcbiAgICBleHBvcnRDb25maWc6IEV4cG9ydENvbmZpZ1xuICApOiBQcm9taXNlPElSZXN1bHRMaXN0PElNZWFzdXJlbWVudD4+IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbWVhc3VyZW1lbnRzOiBJUmVzdWx0TGlzdDxJTWVhc3VyZW1lbnQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZmlsdGVyOiBJTWVhc3VyZW1lbnRGaWx0ZXIgPSB0aGlzLnByZXBhcmVNZWFzdXJlbWVudHNGaWx0ZXIoXG4gICAgICBkZXRhaWxzLFxuICAgICAgZXhwb3J0Q29uZmlnLFxuICAgICAgTUVBU1VSRU1FTlRTX1BSRVZJRVdfSVRFTVNfTElNSVRcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIG1lYXN1cmVtZW50cyA9IGF3YWl0IHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmxpc3QoZmlsdGVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lYXN1cmVtZW50cztcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZU1lYXN1cmVtZW50c0ZpbHRlcihcbiAgICBkZXRhaWxzOiBEYXRhcG9pbnREZXRhaWxzLFxuICAgIGV4cG9ydENvbmZpZzogRXhwb3J0Q29uZmlnLFxuICAgIHBhZ2VTaXplPzogbnVtYmVyXG4gICk6IElNZWFzdXJlbWVudEZpbHRlciB7XG4gICAgY29uc3QgZmlsdGVyOiBJTWVhc3VyZW1lbnRGaWx0ZXIgPSB7XG4gICAgICAvLyBSb3VuZCB0aGUgJ2Zyb20nIHRpbWUgdG8gdGhlIHByZXZpb3VzIGZ1bGwgbWludXRlLlxuICAgICAgZGF0ZUZyb206IHRoaXMuYWRqdXN0RGF0ZShleHBvcnRDb25maWcuZGF0ZUZyb20sIC0xKSxcbiAgICAgIC8vIFJvdW5kIHRoZSAndG8nIHRpbWUgdG8gdGhlIG5lYXJlc3QgZnVsbCBtaW51dGUuXG4gICAgICBkYXRlVG86IHRoaXMuYWRqdXN0RGF0ZShleHBvcnRDb25maWcuZGF0ZVRvLCAxKSxcbiAgICAgIHNvdXJjZTogZGV0YWlscy5zb3VyY2UsXG4gICAgICB2YWx1ZUZyYWdtZW50U2VyaWVzOiBkZXRhaWxzLnZhbHVlRnJhZ21lbnRTZXJpZXMsXG4gICAgICB2YWx1ZUZyYWdtZW50VHlwZTogZGV0YWlscy52YWx1ZUZyYWdtZW50VHlwZVxuICAgIH07XG5cbiAgICBpZiAocGFnZVNpemUpIHtcbiAgICAgIGZpbHRlci5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NNZWFzdXJlbWVudERhdGFGb3JQcmV2aWV3KFxuICAgIGRldGFpbHM6IERhdGFwb2ludERldGFpbHMsXG4gICAgZGF0YTogSU1lYXN1cmVtZW50W11cbiAgKTogRGF0YVRvRXhwb3J0IHtcbiAgICBjb25zdCB1bml0ID0gZGF0YVswXVtkZXRhaWxzLnZhbHVlRnJhZ21lbnRUeXBlXVtkZXRhaWxzLnZhbHVlRnJhZ21lbnRTZXJpZXNdPy51bml0IHx8ICcnO1xuXG4gICAgY29uc3QgdmFsdWVzOiB7IFt0aW1lc3RhbXA6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgZGF0YS5mb3JFYWNoKG1lYXN1cmVtZW50ID0+IHtcbiAgICAgIHZhbHVlc1ttZWFzdXJlbWVudC50aW1lXSA9XG4gICAgICAgIG1lYXN1cmVtZW50W2RldGFpbHMudmFsdWVGcmFnbWVudFR5cGVdW2RldGFpbHMudmFsdWVGcmFnbWVudFNlcmllc10udmFsdWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyAuLi5kZXRhaWxzLCB1bml0LCB0aW1lVmFsdWVNYXA6IHZhbHVlcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEFuZFByZXBhcmVTZXJpZXNEYXRhVG9FeHBvcnQoZXhwb3J0Q29uZmlnOiBFeHBvcnRDb25maWcpIHtcbiAgICBjb25zdCBkYXRhcG9pbnRzVmFsdWVzRGF0YU1hcDogRGF0YXBvaW50c1ZhbHVlc0RhdGFNYXAgPSB0aGlzLmdyb3VwU2VyaWVzQnlEZXZpY2VJZChcbiAgICAgIGV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzXG4gICAgKTtcblxuICAgIGNvbnN0IGZldGNoZWREYXRhUHJvbWlzZXMgPSBBcnJheS5mcm9tKGRhdGFwb2ludHNWYWx1ZXNEYXRhTWFwKS5tYXAoXG4gICAgICBhc3luYyAoW3NvdXJjZSwgc2VyaWVzXSkgPT4ge1xuICAgICAgICBjb25zdCB7IGRhdGVGcm9tLCBkYXRlVG8sIGFnZ3JlZ2F0aW9uIH0gPSBleHBvcnRDb25maWc7XG5cbiAgICAgICAgY29uc3QgcmF3RmlsdGVyOiBJU2VyaWVzRmlsdGVyID0ge1xuICAgICAgICAgIGRhdGVGcm9tLFxuICAgICAgICAgIGRhdGVUbyxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgc2VyaWVzLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uVHlwZTogYWdncmVnYXRpb24gYXMgYWdncmVnYXRpb25UeXBlXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgeyBkYXRhIH06IElSZXN1bHQ8SVNlcmllcz4gPSBhd2FpdCB0aGlzLmZldGNoU2VyaWVzRGF0YShyYXdGaWx0ZXIpO1xuXG4gICAgICAgIHJldHVybiB7IHNvdXJjZSwgZGF0YSB9O1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBmZXRjaGVkRGF0YUdyb3VwZWRCeVNvdXJjZTogU291cmNlSXRlbVtdID0gYXdhaXQgUHJvbWlzZS5hbGwoZmV0Y2hlZERhdGFQcm9taXNlcyk7XG5cbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2VyaWVzRGF0YShleHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscywgZmV0Y2hlZERhdGFHcm91cGVkQnlTb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBtYXAgb2YgYWN0aXZlIGRhdGEgcG9pbnRzIGRldmljZSBJRHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHNlcmllcy5cbiAgICpcbiAgICogRXhhbXBsZSBvdXRwdXQ6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IE1hcChbXG4gICAqICAgWyc4NDQ2NTcyMDInLCBbJ2M4eV9UZW1wZXJhdHVyZS5UJ11dLFxuICAgKiAgIFsnMzI2NjY0MjcnLCBbJ2M4eV9CYXR0ZXJ5LkJhdHRlcnknXV1cbiAgICogXSk7XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gZGF0YXBvaW50RGV0YWlscyAtIEFuIGFycmF5IG9mIGRhdGEgcG9pbnRzIGRldGFpbHMuXG4gICAqIEByZXR1cm5zIEEgbWFwIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGRhdGEgcG9pbnQgSUQgYW5kIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSBvZiBkYXRhIHBvaW50IHNlcmllcy5cbiAgICovXG4gIHByaXZhdGUgZ3JvdXBTZXJpZXNCeURldmljZUlkKGRhdGFwb2ludERldGFpbHM6IERhdGFwb2ludERldGFpbHNbXSk6IERhdGFwb2ludHNWYWx1ZXNEYXRhTWFwIHtcbiAgICByZXR1cm4gZGF0YXBvaW50RGV0YWlscy5yZWR1Y2UoXG4gICAgICAoXG4gICAgICAgIG1hcDogRGF0YXBvaW50c1ZhbHVlc0RhdGFNYXAsXG4gICAgICAgIHsgdmFsdWVGcmFnbWVudFR5cGUsIHZhbHVlRnJhZ21lbnRTZXJpZXMsIHNvdXJjZSB9OiBEYXRhcG9pbnREZXRhaWxzXG4gICAgICApID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBgJHt2YWx1ZUZyYWdtZW50VHlwZX0uJHt2YWx1ZUZyYWdtZW50U2VyaWVzfWA7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nVmFsdWUgPSBtYXAuZ2V0KHNvdXJjZSkgPz8gW107XG4gICAgICAgIG1hcC5zZXQoc291cmNlLCBbLi4uZXhpc3RpbmdWYWx1ZSwgdmFsdWVdKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sXG4gICAgICBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFNlcmllc0RhdGEocmF3RmlsdGVyOiBJU2VyaWVzRmlsdGVyKTogUHJvbWlzZTxJUmVzdWx0PElTZXJpZXM+PiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHNlcmllc0RhdGE6IElSZXN1bHQ8SVNlcmllcz4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBmaWx0ZXI6IElTZXJpZXNGaWx0ZXIgPSB0aGlzLnByZXBhcmVTZXJpZXNGaWx0ZXIoe1xuICAgICAgZGF0ZUZyb206IHJhd0ZpbHRlci5kYXRlRnJvbSxcbiAgICAgIGRhdGVUbzogcmF3RmlsdGVyLmRhdGVUbyxcbiAgICAgIHNvdXJjZTogcmF3RmlsdGVyLnNvdXJjZSxcbiAgICAgIHNlcmllczogcmF3RmlsdGVyLnNlcmllcyxcbiAgICAgIGFnZ3JlZ2F0aW9uVHlwZTogcmF3RmlsdGVyLmFnZ3JlZ2F0aW9uVHlwZVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBhIGNhY2hlIG1lY2hhbmlzbSAtPiBNVE0tNjAyODlcbiAgICAgIC8vIFdoZW4gdXNlciBzd2l0Y2hlcyBiZXR3ZWVuIHJlcG9ydCB0eXBlcywgYW5kIHJlc3Qgb2YgdGhlIHNldHRpbmdzIGFyZSB0aGUgc2FtZSwgdGhlbiB0aGUgZGF0YSBzaG91bGQgbm90IGJlIGZldGNoZWQgYWdhaW4/XG4gICAgICBzZXJpZXNEYXRhID0gYXdhaXQgdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UubGlzdFNlcmllcyhmaWx0ZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VyaWVzRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVNlcmllc0ZpbHRlcihmaWx0ZXJzOiBJU2VyaWVzRmlsdGVyKTogSVNlcmllc0ZpbHRlciB7XG4gICAgY29uc3QgeyBkYXRlRnJvbSwgZGF0ZVRvLCBzb3VyY2UsIHNlcmllcywgYWdncmVnYXRpb25UeXBlIH0gPSBmaWx0ZXJzO1xuICAgIC8vIFJvdW5kIHRoZSAnZnJvbScgdGltZSB0byB0aGUgcHJldmlvdXMgZnVsbCBtaW51dGUuXG4gICAgY29uc3QgZnJvbSA9IHRoaXMuYWRqdXN0RGF0ZShkYXRlRnJvbSwgLTEpO1xuICAgIC8vIFJvdW5kIHRoZSAndG8nIHRpbWUgdG8gdGhlIG5lYXJlc3QgZnVsbCBtaW51dGUuXG4gICAgY29uc3QgdG8gPSB0aGlzLmFkanVzdERhdGUoZGF0ZVRvLCAxKTtcblxuICAgIGNvbnN0IGZpbHRlcjogSVNlcmllc0ZpbHRlciA9IHtcbiAgICAgIGRhdGVGcm9tOiBmcm9tLFxuICAgICAgZGF0ZVRvOiB0byxcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgcmV2ZXJ0OiB0cnVlXG4gICAgfTtcblxuICAgIC8vIFRoZSAnTk9ORScgYWdncmVnYXRpb24gdHlwZSBpcyBub3QgaGFuZGxlZCBieSBhIGJhY2tlbmQsIHNvIGV2ZW4gd2hlbiBpcyBzZWxlY3RlZCwgaXQgaXMgbm90IHBhc3NlZCBhcyBhIGZpbHRlciBwYXJhbWV0ZXIuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uVHlwZSAmJiBhZ2dyZWdhdGlvblR5cGUgIT09IChBR0dSRUdBVElPTl9WQUxVRVMubm9uZSBhcyBhZ2dyZWdhdGlvblR5cGUpKSB7XG4gICAgICBmaWx0ZXIuYWdncmVnYXRpb25UeXBlID0gYWdncmVnYXRpb25UeXBlO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGl0IGlzIGEgdGVtcG9yYWwgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gdGhlIGJhY2tlbmQsXG4gICAgLy8gd2hlcmUgdGhlIHNlcmllcyB3aXRoIG1vcmUgdGhhbiBvbmUgZG90IGFyZSBpbXBvc3NpYmxlIHRvIHJldHJpZXZlOlxuICAgIC8vIGh0dHBzOi8vY3VtdWxvY2l0eS5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9NVE0tNTkyNzdcbiAgICBpZiAoc2VyaWVzKSB7XG4gICAgICBjb25zdCBoYXNNb3JlVGhhbk9uZURvdCA9IChzZXJpZXMgYXMgc3RyaW5nW10pLnNvbWUocyA9PiBzLnNwbGl0KCcuJykubGVuZ3RoID4gMik7XG4gICAgICBpZiAoIWhhc01vcmVUaGFuT25lRG90KSB7XG4gICAgICAgIGZpbHRlci5zZXJpZXMgPSBzZXJpZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgdGhlIGZldGNoZWQgc2VyaWVzIGRhdGEgYW5kIHByZXBhcmVzIGl0IGZvciBleHBvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhcG9pbnREZXRhaWxzIC0gQW4gYXJyYXkgb2YgZGF0YSBwb2ludCBkZXRhaWxzLlxuICAgKiBAcGFyYW0gZmV0Y2hlZERhdGFNYXAgLSBBIG1hcCBvZiBmZXRjaGVkIHNlcmllcyBkYXRhIGdyb3VwZWQgYnkgc291cmNlLlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBEYXRhVG9FeHBvcnQgb2JqZWN0cy5cbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1Nlcmllc0RhdGEoZGF0YXBvaW50RGV0YWlsczogRGF0YXBvaW50RGV0YWlsc1tdLCBmZXRjaGVkRGF0YU1hcDogU291cmNlSXRlbVtdKSB7XG4gICAgY29uc3QgdmFsdWVzR3JvdXBlZEJ5U291cmNlID0gdGhpcy51dGlsc1NlcnZpY2UudHJhbnNmb3JtRGF0YVN0cnVjdHVyZShmZXRjaGVkRGF0YU1hcCk7XG5cbiAgICByZXR1cm4gZGF0YXBvaW50RGV0YWlscy5tYXAoKGRldGFpbHM6IERhdGFwb2ludERldGFpbHMpID0+IHtcbiAgICAgIGxldCB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZGF0YTogVGltZVNlcmllc0RhdGE7XG5cbiAgICAgIC8qKlxuICAgICAgICogVW5pcXVlIGtleSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRpZmZlcmVudCBzZXJpZXMgZnJvbSBzYW1lIHNvdXJjZSxcbiAgICAgICAqIGUuZy46IGM4eV9BY2NlbGVyYXRpb24uYWNjZWxlcmF0aW9uWCwgYzh5X0FjY2VsZXJhdGlvbi5hY2NlbGVyYXRpb25ZLCBjOHlfQWNjZWxlcmF0aW9uLmFjY2VsZXJhdGlvblpcbiAgICAgICAqL1xuICAgICAgY29uc3Qgc2VyaWVzS2V5ID0gYCR7ZGV0YWlscy52YWx1ZUZyYWdtZW50VHlwZX0uJHtkZXRhaWxzLnZhbHVlRnJhZ21lbnRTZXJpZXN9YDtcblxuICAgICAgaWYgKHZhbHVlc0dyb3VwZWRCeVNvdXJjZVtkZXRhaWxzLnNvdXJjZV1bc2VyaWVzS2V5XSkge1xuICAgICAgICB1bml0ID0gdmFsdWVzR3JvdXBlZEJ5U291cmNlW2RldGFpbHMuc291cmNlXVtzZXJpZXNLZXldLnNlcmllc0RldGFpbHMudW5pdDtcbiAgICAgICAgZGF0YSA9IHZhbHVlc0dyb3VwZWRCeVNvdXJjZVtkZXRhaWxzLnNvdXJjZV1bc2VyaWVzS2V5XS52YWx1ZXM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRldGFpbHMsXG4gICAgICAgIHVuaXQsXG4gICAgICAgIHRpbWVWYWx1ZU1hcDogZGF0YVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmltcyB0aGUgZ2l2ZW4gSFRNTCBtZXNzYWdlIGJ5IHJlbW92aW5nIGxpc3QgaXRlbXMgdGhhdCBjb3JyZXNwb25kIHRvIHplcm8gY291bnRzLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBIVE1MIHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHdpdGggbGlzdCBpdGVtcy5cbiAgICogQHBhcmFtIGNvdW50cyAtIEFuIGFycmF5IG9mIG51bWJlciB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGxpc3QgaXRlbS5cbiAgICogQHBhcmFtIGNvdW50VG9UcmltIC0gQSBjb3VudCB0aGF0IHdpbGwgYmUgdHJpbW1lZCB3aXRoIGNvcnJlc3BvbmRpbmcgbGlzdCBpdGVtLlxuICAgKiBAcmV0dXJucyBBIHRyaW1tZWQgSFRNTCBzdHJpbmcgd2l0aCBsaXN0IGl0ZW1zIHJlbW92ZWQgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY291bnQgaXMgemVyby5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBtZXNzYWdlID0gJzx1bD48bGk+SXRlbSAxPC9saT48bGk+SXRlbSAyPC9saT48bGk+SXRlbSAzPC9saT48L3VsPic7XG4gICAqIGNvbnN0IGNvdW50cyA9IFsxLCAwLCAyXTtcbiAgICogY29uc3QgdHJpbW1lZE1lc3NhZ2UgPSB0aGlzLnJlbW92ZVplcm9Db3VudExpc3RJdGVtcyhtZXNzYWdlLCBjb3VudHMpO1xuICAgKiAvLyBSZXN1bHQ6ICc8dWw+PGxpPkl0ZW0gMTwvbGk+PGxpPkl0ZW0gMzwvbGk+PC91bD4nXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVaZXJvQ291bnRMaXN0SXRlbXMobWVzc2FnZTogc3RyaW5nLCBjb3VudHM6IG51bWJlcltdLCBjb3VudFRvVHJpbSA9IDApOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UsICd0ZXh0L2h0bWwnKTtcbiAgICBjb25zdCBsaXN0SXRlbXMgPSBkb2MucXVlcnlTZWxlY3RvckFsbCgndWwgbGknKTtcblxuICAgIGxpc3RJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGNvdW50c1tpbmRleF0gPT09IGNvdW50VG9UcmltKSB7XG4gICAgICAgIGl0ZW0ucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZG9jLmJvZHkuaW5uZXJIVE1MO1xuICB9XG59XG4iXX0=
|