@c8y/ngx-components 1021.25.5 → 1021.29.0
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/alarms/alarm-details.component.d.ts +8 -13
- package/alarms/alarm-details.component.d.ts.map +1 -1
- package/alarms/alarm-details.service.d.ts +3 -20
- package/alarms/alarm-details.service.d.ts.map +1 -1
- package/alarms/alarm-info.component.d.ts +0 -1
- package/alarms/alarm-info.component.d.ts.map +1 -1
- package/branding/shared/data/branding-version.service.d.ts.map +1 -1
- package/branding/shared/lazy/branding-theme-form/branding-theme-form.component.d.ts.map +1 -1
- package/core/bootstrap/bootstrap.component.d.ts.map +1 -1
- package/core/common/geo.service.d.ts.map +1 -1
- package/core/common/inter-app.service.d.ts +1 -0
- package/core/common/inter-app.service.d.ts.map +1 -1
- package/core/plugins/plugins.model.d.ts +3 -1
- package/core/plugins/plugins.model.d.ts.map +1 -1
- package/core/plugins/plugins.service.d.ts.map +1 -1
- package/device-map/bounds-resolver.service.d.ts +12 -0
- package/device-map/bounds-resolver.service.d.ts.map +1 -0
- package/device-map/c8y-ngx-components-device-map.d.ts.map +1 -0
- package/device-map/device-map-navigation.factory.d.ts +9 -0
- package/device-map/device-map-navigation.factory.d.ts.map +1 -0
- package/device-map/device-map.component.d.ts +10 -0
- package/device-map/device-map.component.d.ts.map +1 -0
- package/device-map/device-map.feature.d.ts +3 -0
- package/device-map/device-map.feature.d.ts.map +1 -0
- package/device-map/index.d.ts +6 -0
- package/device-map/index.d.ts.map +1 -0
- package/device-map/location-resolver.service.d.ts +8 -0
- package/device-map/location-resolver.service.d.ts.map +1 -0
- package/ecosystem/application-plugins/application-plugins.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/orphaned-status-cell-renderer.component.d.ts.map +1 -1
- package/esm2022/alarms/alarm-details.component.mjs +14 -30
- package/esm2022/alarms/alarm-details.service.mjs +5 -25
- package/esm2022/alarms/alarm-info.component.mjs +1 -1
- package/esm2022/branding/shared/data/branding-version.service.mjs +9 -5
- package/esm2022/branding/shared/lazy/branding-theme-form/branding-theme-form.component.mjs +5 -2
- package/esm2022/core/bootstrap/bootstrap.component.mjs +4 -3
- package/esm2022/core/common/geo.service.mjs +2 -5
- package/esm2022/core/common/inter-app.service.mjs +3 -2
- package/esm2022/core/plugins/plugins.model.mjs +2 -1
- package/esm2022/core/plugins/plugins.service.mjs +7 -5
- package/esm2022/core/version/websdk-plugin-version.factory.mjs +2 -2
- package/esm2022/device-map/bounds-resolver.service.mjs +21 -0
- package/esm2022/device-map/c8y-ngx-components-device-map.mjs +5 -0
- package/esm2022/device-map/device-map-navigation.factory.mjs +25 -0
- package/esm2022/device-map/device-map.component.mjs +30 -0
- package/esm2022/device-map/device-map.feature.mjs +15 -0
- package/esm2022/device-map/index.mjs +6 -0
- package/esm2022/device-map/location-resolver.service.mjs +25 -0
- package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +66 -22
- package/esm2022/ecosystem/application-plugins/orphaned-status-cell-renderer.component.mjs +7 -1
- package/esm2022/location/location.component.mjs +3 -3
- package/esm2022/map/map-status.component.mjs +20 -7
- package/esm2022/map/map.component.mjs +15 -7
- package/esm2022/map/map.model.mjs +2 -2
- package/esm2022/map/map.module.mjs +25 -4
- package/esm2022/map/map.service.mjs +73 -7
- package/esm2022/repository/firmware/list/firmware-list.component.mjs +10 -10
- package/esm2022/repository/software/list/software-list.component.mjs +10 -10
- package/esm2022/tracking/tracking-marker-popup.component.mjs +10 -3
- package/esm2022/tracking/tracking.component.mjs +3 -4
- package/esm2022/tracking/tracking.service.mjs +6 -3
- package/fesm2022/c8y-ngx-components-alarms.mjs +18 -54
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-data.mjs +8 -4
- package/fesm2022/c8y-ngx-components-branding-shared-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +4 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-map.mjs +106 -0
- package/fesm2022/c8y-ngx-components-device-map.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +71 -21
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +71 -21
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-location.mjs +2 -2
- package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-map.mjs +122 -14
- package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +9 -9
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +9 -9
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tracking.mjs +16 -7
- package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +14 -12
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +13 -1
- package/locales/es.po +13 -1
- package/locales/fr.po +13 -1
- package/locales/ja_JP.po +15 -3
- package/locales/ko.po +13 -1
- package/locales/locales.pot +12 -0
- package/locales/nl.po +13 -1
- package/locales/pl.po +13 -1
- package/locales/pt_BR.po +13 -1
- package/locales/zh_CN.po +13 -1
- package/locales/zh_TW.po +13 -1
- package/map/map-status.component.d.ts +3 -1
- package/map/map-status.component.d.ts.map +1 -1
- package/map/map.component.d.ts +2 -1
- package/map/map.component.d.ts.map +1 -1
- package/map/map.model.d.ts +1 -0
- package/map/map.model.d.ts.map +1 -1
- package/map/map.module.d.ts +2 -1
- package/map/map.module.d.ts.map +1 -1
- package/map/map.service.d.ts +27 -2
- package/map/map.service.d.ts.map +1 -1
- package/package.json +1 -1
- package/repository/firmware/list/firmware-list.component.d.ts.map +1 -1
- package/repository/software/list/software-list.component.d.ts.map +1 -1
- package/tracking/tracking-marker-popup.component.d.ts +5 -1
- package/tracking/tracking-marker-popup.component.d.ts.map +1 -1
- package/tracking/tracking.component.d.ts.map +1 -1
- package/tracking/tracking.service.d.ts.map +1 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { Component, Input, Optional } from '@angular/core';
|
|
2
2
|
import { ALARM_STATUS_LABELS, AlarmStatus, AlarmService, AuditService, InventoryService, SEVERITY_LABELS } from '@c8y/client';
|
|
3
|
-
import { AlertService, AppStateService, ColorService, RelativeTimePipe, gettext } from '@c8y/ngx-components';
|
|
3
|
+
import { AlertService, AppStateService, ColorService, RelativeTimePipe, gettext, InterAppService, SupportedApps } from '@c8y/ngx-components';
|
|
4
4
|
import { TranslateService } from '@ngx-translate/core';
|
|
5
5
|
import { cloneDeep } from 'lodash-es';
|
|
6
6
|
import { AlarmDetailsService } from './alarm-details.service';
|
|
7
7
|
import { ALARM_DEFAULT_PROPERTIES, ALARM_STATUS_ICON } from './alarms.model';
|
|
8
8
|
import { Ng1SmartRulesUpgradeService } from './ng1-smart-rules-upgrade.service';
|
|
9
9
|
import { AlarmsViewService } from './alarms-view.service';
|
|
10
|
+
import { firstValueFrom } from 'rxjs';
|
|
10
11
|
import * as i0 from "@angular/core";
|
|
11
12
|
import * as i1 from "./alarm-details.service";
|
|
12
13
|
import * as i2 from "@c8y/client";
|
|
@@ -21,7 +22,7 @@ import * as i10 from "./alarm-severity-to-icon.pipe";
|
|
|
21
22
|
import * as i11 from "./alarm-status-to-icon.pipe";
|
|
22
23
|
import * as i12 from "./audit-changes-message.pipe";
|
|
23
24
|
export class AlarmDetailsComponent {
|
|
24
|
-
constructor(alarmDetailsService, alarmService, alertService, appState, auditService, relativeTime, ng1SmartRulesUpgradeService, translateService, inventoryService, alarmsViewService, colorService) {
|
|
25
|
+
constructor(alarmDetailsService, alarmService, alertService, appState, auditService, relativeTime, ng1SmartRulesUpgradeService, translateService, inventoryService, alarmsViewService, colorService, interAppService) {
|
|
25
26
|
this.alarmDetailsService = alarmDetailsService;
|
|
26
27
|
this.alarmService = alarmService;
|
|
27
28
|
this.alertService = alertService;
|
|
@@ -33,6 +34,7 @@ export class AlarmDetailsComponent {
|
|
|
33
34
|
this.inventoryService = inventoryService;
|
|
34
35
|
this.alarmsViewService = alarmsViewService;
|
|
35
36
|
this.colorService = colorService;
|
|
37
|
+
this.interAppService = interAppService;
|
|
36
38
|
this.ACKNOWLEDGED_STATUS_VALUE = AlarmStatus.ACKNOWLEDGED;
|
|
37
39
|
this.ACTIVE_STATUS_VALUE = AlarmStatus.ACTIVE;
|
|
38
40
|
this.CLEARED_STATUS_VALUE = AlarmStatus.CLEARED;
|
|
@@ -41,11 +43,7 @@ export class AlarmDetailsComponent {
|
|
|
41
43
|
this.SEVERITY_LABELS = SEVERITY_LABELS;
|
|
42
44
|
this.BELL_SLASH_ICON = ALARM_STATUS_ICON.BELL_SLASH;
|
|
43
45
|
this.BELL_ICON = ALARM_STATUS_ICON.BELL;
|
|
44
|
-
|
|
45
|
-
* Manages the visibility of the navigation link.
|
|
46
|
-
* If set to true, the link is visible, otherwise, it remains hidden.
|
|
47
|
-
*/
|
|
48
|
-
this.showSourceNavigationLink = false;
|
|
46
|
+
this.deviceManagementAppKey = SupportedApps.devicemanagement;
|
|
49
47
|
this.linkTitle = gettext('Open in {{ appName }}');
|
|
50
48
|
this.PAGE_SIZE = 100;
|
|
51
49
|
/**
|
|
@@ -58,15 +56,14 @@ export class AlarmDetailsComponent {
|
|
|
58
56
|
this.customFragments = null;
|
|
59
57
|
}
|
|
60
58
|
async ngOnInit() {
|
|
61
|
-
const isSmartRulesServiceSubscribed = !!(await this.
|
|
59
|
+
const isSmartRulesServiceSubscribed = !!(await firstValueFrom(this.interAppService.getApp$(SupportedApps.smartrules)));
|
|
62
60
|
const hasAnyRoleAllowingToCreateSmartRule = this.alarmDetailsService.checkIfHasAnyRoleAllowingToCreateSmartRule();
|
|
63
61
|
this.isCreateSmartRulesButtonAvailable =
|
|
64
62
|
!!this.ng1SmartRulesUpgradeService &&
|
|
65
63
|
isSmartRulesServiceSubscribed &&
|
|
66
64
|
hasAnyRoleAllowingToCreateSmartRule;
|
|
67
|
-
this.userDeviceManagementApp =
|
|
68
|
-
this.showSourceNavigationLink =
|
|
69
|
-
!!this.userDeviceManagementApp && !this.isDeviceManagementView();
|
|
65
|
+
this.userDeviceManagementApp$ = this.interAppService.getApp$(this.deviceManagementAppKey);
|
|
66
|
+
this.showSourceNavigationLink$ = this.interAppService.shouldShowAppLink$(this.deviceManagementAppKey);
|
|
70
67
|
this.typeColor = await this.colorService.generateColor(this.selectedAlarm.type);
|
|
71
68
|
}
|
|
72
69
|
async ngOnChanges(changes) {
|
|
@@ -92,10 +89,7 @@ export class AlarmDetailsComponent {
|
|
|
92
89
|
*/
|
|
93
90
|
async goToAlarmSource(sourceId) {
|
|
94
91
|
const { data } = await this.alarmService.detail(sourceId);
|
|
95
|
-
|
|
96
|
-
const path = `#/device/${data.source.id}/alarms`;
|
|
97
|
-
const url = `${baseUrl}/${path}`;
|
|
98
|
-
window.open(url, '_blank');
|
|
92
|
+
await this.interAppService.navigateToApp(this.deviceManagementAppKey, `#/device/${data.source.id}/alarms`);
|
|
99
93
|
}
|
|
100
94
|
/**
|
|
101
95
|
* Reloads audit log data asynchronously.
|
|
@@ -315,16 +309,6 @@ export class AlarmDetailsComponent {
|
|
|
315
309
|
hasReachedOrExceededPageSizeLimit() {
|
|
316
310
|
return this.auditLog.data.length >= this.PAGE_SIZE;
|
|
317
311
|
}
|
|
318
|
-
/**
|
|
319
|
-
* This method checks if the current URL includes the context path of the
|
|
320
|
-
* device management application, indicating whether the user is in the
|
|
321
|
-
* device management view.
|
|
322
|
-
*
|
|
323
|
-
* @returns Returns `true` if the current view is in device management, otherwise, returns `false`.
|
|
324
|
-
*/
|
|
325
|
-
isDeviceManagementView() {
|
|
326
|
-
return window.location.href.includes(this.userDeviceManagementApp.contextPath);
|
|
327
|
-
}
|
|
328
312
|
getCustomFragments(selectedAlarm) {
|
|
329
313
|
let customProperties = null;
|
|
330
314
|
for (const key in selectedAlarm) {
|
|
@@ -337,15 +321,15 @@ export class AlarmDetailsComponent {
|
|
|
337
321
|
}
|
|
338
322
|
return customProperties;
|
|
339
323
|
}
|
|
340
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsComponent, deps: [{ token: i1.AlarmDetailsService }, { token: i2.AlarmService }, { token: i3.AlertService }, { token: i3.AppStateService }, { token: i2.AuditService }, { token: i3.RelativeTimePipe }, { token: i4.Ng1SmartRulesUpgradeService, optional: true }, { token: i5.TranslateService }, { token: i2.InventoryService }, { token: i6.AlarmsViewService }, { token: i3.ColorService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
341
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AlarmDetailsComponent, selector: "c8y-alarm-details", inputs: { selectedAlarm: "selectedAlarm" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex row tight-grid flex-wrap a-i-stretch\">\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 c8y-icon\"\n [c8yIcon]=\"selectedAlarm.status | AlarmStatusToIcon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Status' | translate }}</p>\n <p class=\"small\">{{ statusMessage }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n [c8yIcon]=\"selectedAlarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"selectedAlarm.severity?.toString() | lowercase\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Severity' | translate }}</p>\n <p class=\"small\">{{ SEVERITY_LABELS[selectedAlarm.severity] | translate }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n <button\n class=\"btn-link text-muted p-0 m-r-8 text-left\"\n title=\"{{ selectedAlarm.source.name }}\"\n type=\"button\"\n routerLink=\"{{ selectedAlarmMO | assetLink }}\"\n >\n <small class=\"icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n {{ selectedAlarm.source.name || selectedAlarm.source.id }}\n </small>\n </button>\n <ng-container *ngIf=\"showSourceNavigationLink\">\n <button\n class=\"btn-link p-0 text-left\"\n title=\"{{\n linkTitle\n | translate: { appName: userDeviceManagementApp | humanizeAppName | async }\n }}\"\n type=\"button\"\n (click)=\"goToAlarmSource(selectedAlarm.id)\"\n data-cy=\"alarm-details-device-management-link\"\n >\n {{ userDeviceManagementApp | humanizeAppName | async }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': typeColor }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n title=\"{{ selectedAlarm.type }}\"\n >\n <code>{{ selectedAlarm.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"calendar\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <div class=\"col-4 p-b-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last updated' | translate }}</p>\n <p class=\"small\">\n {{ lastUpdated | c8yDate: 'medium' }}\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span class=\"badge badge-info\">{{ selectedAlarm.count }}</span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'First occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.creationTime | c8yDate: 'medium' }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n *ngIf=\"customFragments\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"alarm-details-custom-data\"\n >\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Custom data' | translate }}</p>\n <pre><code>{{ customFragments | json }}</code></pre>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"d-flex flex-wrap gap-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Reload audit logs' | translate\"\n type=\"submit\"\n (click)=\"reloadAuditLog(true, true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload audit logs' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n \"\n type=\"submit\"\n (click)=\"\n onUpdateDetails(\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? ACKNOWLEDGED_STATUS_VALUE\n : ACTIVE_STATUS_VALUE\n )\n \"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE || isAlarmStatusChanging\"\n >\n <i\n [c8yIcon]=\"selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE ? BELL_SLASH_ICON : BELL_ICON\"\n ></i>\n {{\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Create smart rule' | translate\"\n type=\"submit\"\n *ngIf=\"isCreateSmartRulesButtonAvailable\"\n (click)=\"createSmartRule()\"\n >\n <i c8yIcon=\"c8y-icon c8y-icon-smart-rules\"></i>\n {{ 'Create smart rule' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Clear`alarm`' | translate\"\n type=\"submit\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n class=\"btn btn-default btn-sm\"\n [ngClass]=\"button.additionalButtonClasses\"\n [title]=\"button.title | translate\"\n type=\"button\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i [ngClass]=\"button.additionalIconClasses\" [c8yIcon]=\"button.icon\"></i>\n <span *ngIf=\"button.label\">{{ button.label | translate }}</span>\n </button>\n</div>\n\n<ng-template #noAuditLogAvailable>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'archive'\"\n [title]=\"'No audit logs found.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n\n<div class=\"legend form-block\">{{ 'Audit logs' | translate }}</div>\n\n<ng-container *ngIf=\"isLoading || auditLog?.data.length; else noAuditLogAvailable\">\n <c8y-loading *ngIf=\"isLoading\"></c8y-loading>\n\n <c8y-list-group\n data-cy=\"c8y-alarms-details--audit-logs\"\n *ngIf=\"!isLoading\"\n >\n <c8y-li-timeline *c8yFor=\"let log of auditLog; loadMore: 'hidden'\">\n {{ log.creationTime | date: 'mediumDate' }}\n {{ log.creationTime | date: 'mediumTime' }}\n <c8y-li>\n <c8y-li-body>\n <p class=\"text-truncate-wrap separator-bottom p-b-4\">\n {{ log | auditChangesMessage }}\n </p>\n <div class=\"c8y-list__item__footer\">\n <span\n class=\"m-r-16 small\"\n *ngIf=\"log.user\"\n >\n <span class=\"text-label-small\">\n {{ 'by`user`' | translate }}\n </span>\n {{ log.user }}\n </span>\n <span class=\"small\">\n <span class=\"text-label-small\">\n {{ 'device time' | translate }}\n </span>\n {{ log.time | c8yDate: 'medium' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</ng-container>\n", dependencies: [{ kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i3.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i3.ListItemTimelineComponent, selector: "c8y-list-item-timeline, c8y-li-timeline" }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.LowerCasePipe, name: "lowercase" }, { kind: "pipe", type: i7.JsonPipe, name: "json" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: i3.HumanizeAppNamePipe, name: "humanizeAppName" }, { kind: "pipe", type: i3.DatePipe, name: "c8yDate" }, { kind: "pipe", type: i3.AssetLinkPipe, name: "assetLink" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i9.AlarmDetailsButtonPipe, name: "alarmDetailsButton" }, { kind: "pipe", type: i10.AlarmSeverityToIconPipe, name: "AlarmSeverityToIcon" }, { kind: "pipe", type: i11.AlarmStatusToIconPipe, name: "AlarmStatusToIcon" }, { kind: "pipe", type: i12.AuditChangesMessagePipe, name: "auditChangesMessage" }] }); }
|
|
324
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsComponent, deps: [{ token: i1.AlarmDetailsService }, { token: i2.AlarmService }, { token: i3.AlertService }, { token: i3.AppStateService }, { token: i2.AuditService }, { token: i3.RelativeTimePipe }, { token: i4.Ng1SmartRulesUpgradeService, optional: true }, { token: i5.TranslateService }, { token: i2.InventoryService }, { token: i6.AlarmsViewService }, { token: i3.ColorService }, { token: i3.InterAppService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
325
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AlarmDetailsComponent, selector: "c8y-alarm-details", inputs: { selectedAlarm: "selectedAlarm" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex row tight-grid flex-wrap a-i-stretch\">\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 c8y-icon\"\n [c8yIcon]=\"selectedAlarm.status | AlarmStatusToIcon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Status' | translate }}</p>\n <p class=\"small\">{{ statusMessage }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n [c8yIcon]=\"selectedAlarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"selectedAlarm.severity?.toString() | lowercase\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Severity' | translate }}</p>\n <p class=\"small\">{{ SEVERITY_LABELS[selectedAlarm.severity] | translate }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n <button\n class=\"btn-link text-muted p-0 m-r-8 text-left\"\n title=\"{{ selectedAlarm.source.name }}\"\n type=\"button\"\n routerLink=\"{{ selectedAlarmMO | assetLink }}\"\n >\n <small class=\"icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n {{ selectedAlarm.source.name || selectedAlarm.source.id }}\n </small>\n </button>\n <ng-container *ngIf=\"showSourceNavigationLink$ | async\">\n <button\n class=\"btn-link p-0 text-left\"\n title=\"{{\n linkTitle\n | translate: { appName: userDeviceManagementApp$ | async | humanizeAppName | async }\n }}\"\n type=\"button\"\n (click)=\"goToAlarmSource(selectedAlarm.id)\"\n data-cy=\"alarm-details-device-management-link\"\n >\n {{ userDeviceManagementApp$ | async | humanizeAppName | async }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': typeColor }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n title=\"{{ selectedAlarm.type }}\"\n >\n <code>{{ selectedAlarm.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"calendar\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <div class=\"col-4 p-b-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last updated' | translate }}</p>\n <p class=\"small\">\n {{ lastUpdated | c8yDate: 'medium' }}\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span class=\"badge badge-info\">{{ selectedAlarm.count }}</span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'First occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.creationTime | c8yDate: 'medium' }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n *ngIf=\"customFragments\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"alarm-details-custom-data\"\n >\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Custom data' | translate }}</p>\n <pre><code>{{ customFragments | json }}</code></pre>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"d-flex flex-wrap gap-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Reload audit logs' | translate\"\n type=\"submit\"\n (click)=\"reloadAuditLog(true, true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload audit logs' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n \"\n type=\"submit\"\n (click)=\"\n onUpdateDetails(\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? ACKNOWLEDGED_STATUS_VALUE\n : ACTIVE_STATUS_VALUE\n )\n \"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE || isAlarmStatusChanging\"\n >\n <i\n [c8yIcon]=\"selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE ? BELL_SLASH_ICON : BELL_ICON\"\n ></i>\n {{\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Create smart rule' | translate\"\n type=\"submit\"\n *ngIf=\"isCreateSmartRulesButtonAvailable\"\n (click)=\"createSmartRule()\"\n >\n <i c8yIcon=\"c8y-icon c8y-icon-smart-rules\"></i>\n {{ 'Create smart rule' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Clear`alarm`' | translate\"\n type=\"submit\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n class=\"btn btn-default btn-sm\"\n [ngClass]=\"button.additionalButtonClasses\"\n [title]=\"button.title | translate\"\n type=\"button\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i [ngClass]=\"button.additionalIconClasses\" [c8yIcon]=\"button.icon\"></i>\n <span *ngIf=\"button.label\">{{ button.label | translate }}</span>\n </button>\n</div>\n\n<ng-template #noAuditLogAvailable>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'archive'\"\n [title]=\"'No audit logs found.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n\n<div class=\"legend form-block\">{{ 'Audit logs' | translate }}</div>\n\n<ng-container *ngIf=\"isLoading || auditLog?.data.length; else noAuditLogAvailable\">\n <c8y-loading *ngIf=\"isLoading\"></c8y-loading>\n\n <c8y-list-group\n data-cy=\"c8y-alarms-details--audit-logs\"\n *ngIf=\"!isLoading\"\n >\n <c8y-li-timeline *c8yFor=\"let log of auditLog; loadMore: 'hidden'\">\n {{ log.creationTime | date: 'mediumDate' }}\n {{ log.creationTime | date: 'mediumTime' }}\n <c8y-li>\n <c8y-li-body>\n <p class=\"text-truncate-wrap separator-bottom p-b-4\">\n {{ log | auditChangesMessage }}\n </p>\n <div class=\"c8y-list__item__footer\">\n <span\n class=\"m-r-16 small\"\n *ngIf=\"log.user\"\n >\n <span class=\"text-label-small\">\n {{ 'by`user`' | translate }}\n </span>\n {{ log.user }}\n </span>\n <span class=\"small\">\n <span class=\"text-label-small\">\n {{ 'device time' | translate }}\n </span>\n {{ log.time | c8yDate: 'medium' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</ng-container>\n", dependencies: [{ kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i3.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i3.ListItemTimelineComponent, selector: "c8y-list-item-timeline, c8y-li-timeline" }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.LowerCasePipe, name: "lowercase" }, { kind: "pipe", type: i7.JsonPipe, name: "json" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: i3.HumanizeAppNamePipe, name: "humanizeAppName" }, { kind: "pipe", type: i3.DatePipe, name: "c8yDate" }, { kind: "pipe", type: i3.AssetLinkPipe, name: "assetLink" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i9.AlarmDetailsButtonPipe, name: "alarmDetailsButton" }, { kind: "pipe", type: i10.AlarmSeverityToIconPipe, name: "AlarmSeverityToIcon" }, { kind: "pipe", type: i11.AlarmStatusToIconPipe, name: "AlarmStatusToIcon" }, { kind: "pipe", type: i12.AuditChangesMessagePipe, name: "auditChangesMessage" }] }); }
|
|
342
326
|
}
|
|
343
327
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsComponent, decorators: [{
|
|
344
328
|
type: Component,
|
|
345
|
-
args: [{ selector: 'c8y-alarm-details', template: "<div class=\"d-flex row tight-grid flex-wrap a-i-stretch\">\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 c8y-icon\"\n [c8yIcon]=\"selectedAlarm.status | AlarmStatusToIcon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Status' | translate }}</p>\n <p class=\"small\">{{ statusMessage }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n [c8yIcon]=\"selectedAlarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"selectedAlarm.severity?.toString() | lowercase\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Severity' | translate }}</p>\n <p class=\"small\">{{ SEVERITY_LABELS[selectedAlarm.severity] | translate }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n <button\n class=\"btn-link text-muted p-0 m-r-8 text-left\"\n title=\"{{ selectedAlarm.source.name }}\"\n type=\"button\"\n routerLink=\"{{ selectedAlarmMO | assetLink }}\"\n >\n <small class=\"icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n {{ selectedAlarm.source.name || selectedAlarm.source.id }}\n </small>\n </button>\n <ng-container *ngIf=\"showSourceNavigationLink\">\n <button\n class=\"btn-link p-0 text-left\"\n title=\"{{\n linkTitle\n | translate: { appName: userDeviceManagementApp | humanizeAppName | async }\n }}\"\n type=\"button\"\n (click)=\"goToAlarmSource(selectedAlarm.id)\"\n data-cy=\"alarm-details-device-management-link\"\n >\n {{ userDeviceManagementApp | humanizeAppName | async }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': typeColor }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n title=\"{{ selectedAlarm.type }}\"\n >\n <code>{{ selectedAlarm.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"calendar\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <div class=\"col-4 p-b-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last updated' | translate }}</p>\n <p class=\"small\">\n {{ lastUpdated | c8yDate: 'medium' }}\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span class=\"badge badge-info\">{{ selectedAlarm.count }}</span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'First occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.creationTime | c8yDate: 'medium' }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n *ngIf=\"customFragments\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"alarm-details-custom-data\"\n >\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Custom data' | translate }}</p>\n <pre><code>{{ customFragments | json }}</code></pre>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"d-flex flex-wrap gap-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Reload audit logs' | translate\"\n type=\"submit\"\n (click)=\"reloadAuditLog(true, true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload audit logs' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n \"\n type=\"submit\"\n (click)=\"\n onUpdateDetails(\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? ACKNOWLEDGED_STATUS_VALUE\n : ACTIVE_STATUS_VALUE\n )\n \"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE || isAlarmStatusChanging\"\n >\n <i\n [c8yIcon]=\"selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE ? BELL_SLASH_ICON : BELL_ICON\"\n ></i>\n {{\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Create smart rule' | translate\"\n type=\"submit\"\n *ngIf=\"isCreateSmartRulesButtonAvailable\"\n (click)=\"createSmartRule()\"\n >\n <i c8yIcon=\"c8y-icon c8y-icon-smart-rules\"></i>\n {{ 'Create smart rule' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Clear`alarm`' | translate\"\n type=\"submit\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n class=\"btn btn-default btn-sm\"\n [ngClass]=\"button.additionalButtonClasses\"\n [title]=\"button.title | translate\"\n type=\"button\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i [ngClass]=\"button.additionalIconClasses\" [c8yIcon]=\"button.icon\"></i>\n <span *ngIf=\"button.label\">{{ button.label | translate }}</span>\n </button>\n</div>\n\n<ng-template #noAuditLogAvailable>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'archive'\"\n [title]=\"'No audit logs found.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n\n<div class=\"legend form-block\">{{ 'Audit logs' | translate }}</div>\n\n<ng-container *ngIf=\"isLoading || auditLog?.data.length; else noAuditLogAvailable\">\n <c8y-loading *ngIf=\"isLoading\"></c8y-loading>\n\n <c8y-list-group\n data-cy=\"c8y-alarms-details--audit-logs\"\n *ngIf=\"!isLoading\"\n >\n <c8y-li-timeline *c8yFor=\"let log of auditLog; loadMore: 'hidden'\">\n {{ log.creationTime | date: 'mediumDate' }}\n {{ log.creationTime | date: 'mediumTime' }}\n <c8y-li>\n <c8y-li-body>\n <p class=\"text-truncate-wrap separator-bottom p-b-4\">\n {{ log | auditChangesMessage }}\n </p>\n <div class=\"c8y-list__item__footer\">\n <span\n class=\"m-r-16 small\"\n *ngIf=\"log.user\"\n >\n <span class=\"text-label-small\">\n {{ 'by`user`' | translate }}\n </span>\n {{ log.user }}\n </span>\n <span class=\"small\">\n <span class=\"text-label-small\">\n {{ 'device time' | translate }}\n </span>\n {{ log.time | c8yDate: 'medium' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</ng-container>\n" }]
|
|
329
|
+
args: [{ selector: 'c8y-alarm-details', template: "<div class=\"d-flex row tight-grid flex-wrap a-i-stretch\">\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 c8y-icon\"\n [c8yIcon]=\"selectedAlarm.status | AlarmStatusToIcon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Status' | translate }}</p>\n <p class=\"small\">{{ statusMessage }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n [c8yIcon]=\"selectedAlarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"selectedAlarm.severity?.toString() | lowercase\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Severity' | translate }}</p>\n <p class=\"small\">{{ SEVERITY_LABELS[selectedAlarm.severity] | translate }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n <button\n class=\"btn-link text-muted p-0 m-r-8 text-left\"\n title=\"{{ selectedAlarm.source.name }}\"\n type=\"button\"\n routerLink=\"{{ selectedAlarmMO | assetLink }}\"\n >\n <small class=\"icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n {{ selectedAlarm.source.name || selectedAlarm.source.id }}\n </small>\n </button>\n <ng-container *ngIf=\"showSourceNavigationLink$ | async\">\n <button\n class=\"btn-link p-0 text-left\"\n title=\"{{\n linkTitle\n | translate: { appName: userDeviceManagementApp$ | async | humanizeAppName | async }\n }}\"\n type=\"button\"\n (click)=\"goToAlarmSource(selectedAlarm.id)\"\n data-cy=\"alarm-details-device-management-link\"\n >\n {{ userDeviceManagementApp$ | async | humanizeAppName | async }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': typeColor }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n title=\"{{ selectedAlarm.type }}\"\n >\n <code>{{ selectedAlarm.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"calendar\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <div class=\"col-4 p-b-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last updated' | translate }}</p>\n <p class=\"small\">\n {{ lastUpdated | c8yDate: 'medium' }}\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span class=\"badge badge-info\">{{ selectedAlarm.count }}</span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'First occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.creationTime | c8yDate: 'medium' }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n *ngIf=\"customFragments\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"alarm-details-custom-data\"\n >\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Custom data' | translate }}</p>\n <pre><code>{{ customFragments | json }}</code></pre>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"d-flex flex-wrap gap-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Reload audit logs' | translate\"\n type=\"submit\"\n (click)=\"reloadAuditLog(true, true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload audit logs' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n \"\n type=\"submit\"\n (click)=\"\n onUpdateDetails(\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? ACKNOWLEDGED_STATUS_VALUE\n : ACTIVE_STATUS_VALUE\n )\n \"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE || isAlarmStatusChanging\"\n >\n <i\n [c8yIcon]=\"selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE ? BELL_SLASH_ICON : BELL_ICON\"\n ></i>\n {{\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Create smart rule' | translate\"\n type=\"submit\"\n *ngIf=\"isCreateSmartRulesButtonAvailable\"\n (click)=\"createSmartRule()\"\n >\n <i c8yIcon=\"c8y-icon c8y-icon-smart-rules\"></i>\n {{ 'Create smart rule' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Clear`alarm`' | translate\"\n type=\"submit\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n class=\"btn btn-default btn-sm\"\n [ngClass]=\"button.additionalButtonClasses\"\n [title]=\"button.title | translate\"\n type=\"button\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i [ngClass]=\"button.additionalIconClasses\" [c8yIcon]=\"button.icon\"></i>\n <span *ngIf=\"button.label\">{{ button.label | translate }}</span>\n </button>\n</div>\n\n<ng-template #noAuditLogAvailable>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'archive'\"\n [title]=\"'No audit logs found.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n\n<div class=\"legend form-block\">{{ 'Audit logs' | translate }}</div>\n\n<ng-container *ngIf=\"isLoading || auditLog?.data.length; else noAuditLogAvailable\">\n <c8y-loading *ngIf=\"isLoading\"></c8y-loading>\n\n <c8y-list-group\n data-cy=\"c8y-alarms-details--audit-logs\"\n *ngIf=\"!isLoading\"\n >\n <c8y-li-timeline *c8yFor=\"let log of auditLog; loadMore: 'hidden'\">\n {{ log.creationTime | date: 'mediumDate' }}\n {{ log.creationTime | date: 'mediumTime' }}\n <c8y-li>\n <c8y-li-body>\n <p class=\"text-truncate-wrap separator-bottom p-b-4\">\n {{ log | auditChangesMessage }}\n </p>\n <div class=\"c8y-list__item__footer\">\n <span\n class=\"m-r-16 small\"\n *ngIf=\"log.user\"\n >\n <span class=\"text-label-small\">\n {{ 'by`user`' | translate }}\n </span>\n {{ log.user }}\n </span>\n <span class=\"small\">\n <span class=\"text-label-small\">\n {{ 'device time' | translate }}\n </span>\n {{ log.time | c8yDate: 'medium' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</ng-container>\n" }]
|
|
346
330
|
}], ctorParameters: () => [{ type: i1.AlarmDetailsService }, { type: i2.AlarmService }, { type: i3.AlertService }, { type: i3.AppStateService }, { type: i2.AuditService }, { type: i3.RelativeTimePipe }, { type: i4.Ng1SmartRulesUpgradeService, decorators: [{
|
|
347
331
|
type: Optional
|
|
348
|
-
}] }, { type: i5.TranslateService }, { type: i2.InventoryService }, { type: i6.AlarmsViewService }, { type: i3.ColorService }], propDecorators: { selectedAlarm: [{
|
|
332
|
+
}] }, { type: i5.TranslateService }, { type: i2.InventoryService }, { type: i6.AlarmsViewService }, { type: i3.ColorService }, { type: i3.InterAppService }], propDecorators: { selectedAlarm: [{
|
|
349
333
|
type: Input
|
|
350
334
|
}] } });
|
|
351
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxhcm0tZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hbGFybXMvYWxhcm0tZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9hbGFybXMvYWxhcm0tZGV0YWlscy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYSxRQUFRLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLFlBQVksRUFFWixZQUFZLEVBTVosZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDaEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsaUJBQWlCLEVBR2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBTTFELE1BQU0sT0FBTyxxQkFBcUI7SUFzRWhDLFlBQ1UsbUJBQXdDLEVBQ3hDLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLFFBQXlCLEVBQ3pCLFlBQTBCLEVBQzFCLFlBQThCLEVBQ2xCLDJCQUF3RCxFQUNwRSxnQkFBa0MsRUFDbEMsZ0JBQWtDLEVBQ2xDLGlCQUFvQyxFQUNwQyxZQUEwQjtRQVYx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YW5nZXMsIE9wdGlvbmFsLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBTEFSTV9TVEFUVVNfTEFCRUxTLFxuICBBbGFybVN0YXR1cyxcbiAgQWxhcm1TZXJ2aWNlLFxuICBBbGFybVN0YXR1c1R5cGUsXG4gIEF1ZGl0U2VydmljZSxcbiAgSUFsYXJtLFxuICBJQXBwbGljYXRpb24sXG4gIElBdWRpdFJlY29yZCxcbiAgSU1hbmFnZWRPYmplY3QsXG4gIElSZXN1bHRMaXN0LFxuICBJbnZlbnRvcnlTZXJ2aWNlLFxuICBTRVZFUklUWV9MQUJFTFNcbn0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBBcHBTdGF0ZVNlcnZpY2UsXG4gIENvbG9yU2VydmljZSxcbiAgUmVsYXRpdmVUaW1lUGlwZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBBbGFybURldGFpbHNTZXJ2aWNlIH0gZnJvbSAnLi9hbGFybS1kZXRhaWxzLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQUxBUk1fREVGQVVMVF9QUk9QRVJUSUVTLFxuICBBTEFSTV9TVEFUVVNfSUNPTixcbiAgQWxhcm1EZXRhaWxzQnV0dG9uLFxuICBDdXN0b21GcmFnbWVudFxufSBmcm9tICcuL2FsYXJtcy5tb2RlbCc7XG5pbXBvcnQgeyBOZzFTbWFydFJ1bGVzVXBncmFkZVNlcnZpY2UgfSBmcm9tICcuL25nMS1zbWFydC1ydWxlcy11cGdyYWRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxhcm1zVmlld1NlcnZpY2UgfSBmcm9tICcuL2FsYXJtcy12aWV3LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYWxhcm0tZGV0YWlscycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbGFybS1kZXRhaWxzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBbGFybURldGFpbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBzZWxlY3RlZEFsYXJtOiBJQWxhcm07XG5cbiAgcmVhZG9ubHkgQUNLTk9XTEVER0VEX1NUQVRVU19WQUxVRSA9IEFsYXJtU3RhdHVzLkFDS05PV0xFREdFRDtcbiAgcmVhZG9ubHkgQUNUSVZFX1NUQVRVU19WQUxVRSA9IEFsYXJtU3RhdHVzLkFDVElWRTtcbiAgcmVhZG9ubHkgQ0xFQVJFRF9TVEFUVVNfVkFMVUUgPSBBbGFybVN0YXR1cy5DTEVBUkVEO1xuICByZWFkb25seSBBQ0tOT1dMRURHRV9MQUJFTCA9IGdldHRleHQoJ0Fja25vd2xlZGdlJyk7XG4gIHJlYWRvbmx5IFJFQUNUSVZBVEVfTEFCRUwgPSBnZXR0ZXh0KCdSZWFjdGl2YXRlJyk7XG4gIHJlYWRvbmx5IFNFVkVSSVRZX0xBQkVMUyA9IFNFVkVSSVRZX0xBQkVMUztcbiAgcmVhZG9ubHkgQkVMTF9TTEFTSF9JQ09OID0gQUxBUk1fU1RBVFVTX0lDT04uQkVMTF9TTEFTSDtcbiAgcmVhZG9ubHkgQkVMTF9JQ09OID0gQUxBUk1fU1RBVFVTX0lDT04uQkVMTDtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIERldmljZSBNYW5hZ2VtZW50IGFwcGxpY2F0aW9uIHVzZWQgYnkgdGhlIHVzZXIuXG4gICAqIERldGVybWluZXMgdGhlIGFjY3VyYXRlIG5hbWUgYW5kIGNvbnRleHQgcGF0aCByZXF1aXJlZCBmb3IgbmF2aWdhdGluZyB0byBhbGFybXMgb2YgdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAqL1xuICB1c2VyRGV2aWNlTWFuYWdlbWVudEFwcDogSUFwcGxpY2F0aW9uO1xuICAvKipcbiAgICogTWFuYWdlcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgbmF2aWdhdGlvbiBsaW5rLlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGxpbmsgaXMgdmlzaWJsZSwgb3RoZXJ3aXNlLCBpdCByZW1haW5zIGhpZGRlbi5cbiAgICovXG4gIHNob3dTb3VyY2VOYXZpZ2F0aW9uTGluayA9IGZhbHNlO1xuICByZWFkb25seSBsaW5rVGl0bGUgPSBnZXR0ZXh0KCdPcGVuIGluIHt7IGFwcE5hbWUgfX0nKTtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGF1ZGl0IGxvZ3MsIGluY2x1ZGluZyB0aGUgdmVyeSBmaXJzdCBhdWRpdCBsb2cgcmVjb3JkIGluIHRoZSBhbGFybXMnIGhpc3RvcnkuXG4gICAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBoaXN0b3JpY2FsIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBhdWRpdCBsb2dzIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgZGF0YSBzZXQuXG4gICAqIFVzdWFsbHkgaXQncyBhbiAnQWxhcm0gY3JlYXRlZCcgYXVkaXQgbG9nLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgd2hlbiBhdWRpdCBsb2dzIGV4Y2VlZCBQQUdFX1NJWkUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGV4dGVuZGVkQXVkaXRMb2dzOiBJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IFBBR0VfU0laRSA9IDEwMDtcblxuICAvKipcbiAgICogUHJldmVudHMgdGhlIHBpcGVsaW5lIGZyb20gZmFpbGluZyBmb3IgYSB0dXRvcmlhbCBhcHBsaWNhdGlvblxuICAgKiBiZWNhdXNlIGl0J3MgYSBwdXJlIEFuZ3VsYXIgYXBwbGljYXRpb24gYW5kIGRvZXNuJ3Qgc3VwcG9ydCBhbnlcbiAgICogQW5ndWxhckpTIHNlcnZpY2VzLlxuICAgKi9cbiAgaXNDcmVhdGVTbWFydFJ1bGVzQnV0dG9uQXZhaWxhYmxlOiBib29sZWFuO1xuICAvKipcbiAgICogUHJvcGVydHkgY29udGFpbnMgYSAxMDAgKHNlZSBQQUdFX1NJWkUpIG9mIG1vc3QgcmVjZW50IGF1ZGl0IGxvZ3MgcmVjb3Jkcy5cbiAgICovXG4gIGF1ZGl0TG9nOiBJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+O1xuXG4gIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGVuIGFsYXJtcyBzdGF0dXMgY2hhbmdlIHdhcyBzdGFydGVkIChBY2tub3dsZWRnZS9SZWFjdGl2YXRlKVxuICAgKi9cbiAgaXNBbGFybVN0YXR1c0NoYW5naW5nID0gZmFsc2U7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEgdmFsdWUgZm9yIGEgJ0xhc3QgdXBkYXRlZCcgc2VjdGlvbiBpbiBkZXRhaWxzLlxuICAgKi9cbiAgbGFzdFVwZGF0ZWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSB2YWx1ZSBmb3IgYSAnU3RhdHVzJyBzZWN0aW9uIGluIGRldGFpbHMuXG4gICAqL1xuICBzdGF0dXNNZXNzYWdlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGFsYXJtIHR5cGUuXG4gICAqL1xuICB0eXBlQ29sb3I6IHN0cmluZztcbiAgLyoqXG4gICAqIEN1c3RvbSBmcmFnbWVudHMgb2YgdGhlIHNlbGVjdGVkIGFsYXJtLiBJZiBub25lIGV4aXN0LCBudWxsIGlzIHJldHVybmVkLlxuICAgKi9cbiAgY3VzdG9tRnJhZ21lbnRzOiBDdXN0b21GcmFnbWVudCA9IG51bGw7XG5cbiAgc2VsZWN0ZWRBbGFybU1POiBJTWFuYWdlZE9iamVjdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFsYXJtRGV0YWlsc1NlcnZpY2U6IEFsYXJtRGV0YWlsc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGFybVNlcnZpY2U6IEFsYXJtU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwU3RhdGU6IEFwcFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGF1ZGl0U2VydmljZTogQXVkaXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVsYXRpdmVUaW1lOiBSZWxhdGl2ZVRpbWVQaXBlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbmcxU21hcnRSdWxlc1VwZ3JhZGVTZXJ2aWNlOiBOZzFTbWFydFJ1bGVzVXBncmFkZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGFsYXJtc1ZpZXdTZXJ2aWNlOiBBbGFybXNWaWV3U2VydmljZSxcbiAgICBwcml2YXRlIGNvbG9yU2VydmljZTogQ29sb3JTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpc1NtYXJ0UnVsZXNTZXJ2aWNlU3Vic2NyaWJlZCA9ICEhKGF3YWl0IHRoaXMuYWxhcm1EZXRhaWxzU2VydmljZS5nZXRBcHBsaWNhdGlvbihcbiAgICAgIHRoaXMuYWxhcm1EZXRhaWxzU2VydmljZS5TTUFSVF9SVUxFU19BUFBMSUNBVElPTl9LRVlcbiAgICApKTtcbiAgICBjb25zdCBoYXNBbnlSb2xlQWxsb3dpbmdUb0NyZWF0ZVNtYXJ0UnVsZSA9XG4gICAgICB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuY2hlY2tJZkhhc0FueVJvbGVBbGxvd2luZ1RvQ3JlYXRlU21hcnRSdWxlKCk7XG4gICAgdGhpcy5pc0NyZWF0ZVNtYXJ0UnVsZXNCdXR0b25BdmFpbGFibGUgPVxuICAgICAgISF0aGlzLm5nMVNtYXJ0UnVsZXNVcGdyYWRlU2VydmljZSAmJlxuICAgICAgaXNTbWFydFJ1bGVzU2VydmljZVN1YnNjcmliZWQgJiZcbiAgICAgIGhhc0FueVJvbGVBbGxvd2luZ1RvQ3JlYXRlU21hcnRSdWxlO1xuICAgIHRoaXMudXNlckRldmljZU1hbmFnZW1lbnRBcHAgPSBhd2FpdCB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuZ2V0QXBwbGljYXRpb24oXG4gICAgICB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuREVWSUNFX01BTkFHRU1FTlRfQVBQTElDQVRJT05fS0VZXG4gICAgKTtcbiAgICB0aGlzLnNob3dTb3VyY2VOYXZpZ2F0aW9uTGluayA9XG4gICAgICAhIXRoaXMudXNlckRldmljZU1hbmFnZW1lbnRBcHAgJiYgIXRoaXMuaXNEZXZpY2VNYW5hZ2VtZW50VmlldygpO1xuICAgIHRoaXMudHlwZUNvbG9yID0gYXdhaXQgdGhpcy5jb2xvclNlcnZpY2UuZ2VuZXJhdGVDb2xvcih0aGlzLnNlbGVjdGVkQWxhcm0udHlwZSk7XG4gIH1cblxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGNoYW5nZXMuc2VsZWN0ZWRBbGFybSAmJiBjaGFuZ2VzLnNlbGVjdGVkQWxhcm0uY3VycmVudFZhbHVlKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbG9hZEF1ZGl0TG9nKHRydWUsIHRydWUpO1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdGF0dXNNZXNzYWdlKCk7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5U2VydmljZS5kZXRhaWwodGhpcy5zZWxlY3RlZEFsYXJtLnNvdXJjZS5pZCk7XG4gICAgICB0aGlzLnNlbGVjdGVkQWxhcm1NTyA9IGRhdGE7XG4gICAgICB0aGlzLnVwZGF0ZUxhc3RVcGRhdGVkRGF0ZSh0aGlzLmF1ZGl0TG9nLmRhdGFbMF0pO1xuICAgICAgdGhpcy5jdXN0b21GcmFnbWVudHMgPSB0aGlzLmdldEN1c3RvbUZyYWdtZW50cyh0aGlzLnNlbGVjdGVkQWxhcm0pO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZVNtYXJ0UnVsZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNDcmVhdGVTbWFydFJ1bGVzQnV0dG9uQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubmcxU21hcnRSdWxlc1VwZ3JhZGVTZXJ2aWNlLmFkZE5ld0ZvcklucHV0QWxhcm1BbmRPdXRwdXRVc2VyV2l0aFVJKFxuICAgICAgdGhpcy5zZWxlY3RlZEFsYXJtLFxuICAgICAgdGhpcy5hcHBTdGF0ZS5jdXJyZW50VXNlci52YWx1ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGVzIHRvIGEgc3BlY2lmaWMgYWxhcm0gc291cmNlIGRldmljZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlSWQgLSBUaGUgc291cmNlIGlkLlxuICAgKi9cbiAgYXN5bmMgZ29Ub0FsYXJtU291cmNlKHNvdXJjZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuYWxhcm1TZXJ2aWNlLmRldGFpbChzb3VyY2VJZCk7XG4gICAgY29uc3QgYmFzZVVybCA9IGAvYXBwcy8ke3RoaXMudXNlckRldmljZU1hbmFnZW1lbnRBcHAuY29udGV4dFBhdGh9YDtcbiAgICBjb25zdCBwYXRoID0gYCMvZGV2aWNlLyR7ZGF0YS5zb3VyY2UuaWR9L2FsYXJtc2A7XG4gICAgY29uc3QgdXJsID0gYCR7YmFzZVVybH0vJHtwYXRofWA7XG5cbiAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxvYWRzIGF1ZGl0IGxvZyBkYXRhIGFzeW5jaHJvbm91c2x5LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBmZXRjaGVzIGF1ZGl0IHJlY29yZHMgdXNpbmcgYGdldEFsYXJtQXVkaXRSZWNvcmRzYCBhbmQgb3B0aW9uYWxseSB1cGRhdGVzIHRoZSBhdWRpdCBsb2dzXG4gICAqIHN0YXRlIGluIHRoZSBjb21wb25lbnQgYmFzZWQgb24gdGhlIGBpc1NldEF1ZGl0TG9nc2AgZmxhZy4gSXQgaGFuZGxlcyB0aGUgbG9hZGluZyBzdGF0ZSBhbmQgcG90ZW50aWFsXG4gICAqIGVycm9ycyBkdXJpbmcgdGhlIGZldGNoIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGlzUmV2ZXJ0IC0gQSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHJpZXZlIGEgMTAwIChzZWUgUEFHRV9TSVpFKSByZWNvcmRzICh0cnVlKVxuICAgKiAgICAgICAgICAgICAgICAgICBvciBvbmx5IHJlY29yZCwgdGhhdCBjaHJvbm9sb2dpY2FsbHkgd2lsbCBiZSB0aGUgb2xkZXN0IG9uZSAoZmFsc2UpLiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKiAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gZmFsc2UsIGl0IHdpbGwgc2V0IFBBR0VfU0laRSB0byAxIGFuZCB0cmlnZ2VyIGEgbG9naWNcbiAgICogICAgICAgICAgICAgICAgICAgY29uY2F0ZW5hdGluZyBhIG1vc3QgcmVjZW50IHJlY29yZCB3aXRoIHRoZSB2ZXJ5IGZpcnN0IG9uZSB0b1xuICAgKiAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgdGhlIGFsYXJtIGR1cmF0aW9uIChjaGFuZ2UgdG8gQ0xFQVJFRCBzdGF0dXMpLlxuICAgKiAgICAgICAgICAgICAgICAgICBJdCdzIHBhc3NlZCB0byB0aGUgYGdldEFsYXJtQXVkaXRSZWNvcmRzYCBtZXRob2QuXG4gICAqIEBwYXJhbSBpc1NldEF1ZGl0TG9ncyAtIEEgYm9vbGVhbiBmbGFnIHRvIGRldGVybWluZSBpZiB0aGUgZmV0Y2hlZCBhdWRpdCBsb2dzIHNob3VsZCBiZSBzZXQgaW4gdGhlIGNvbXBvbmVudCBzdGF0ZS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBsaXN0IG9mIGBJQXVkaXRSZWNvcmRgIG9iamVjdHMuXG4gICAqL1xuICBhc3luYyByZWxvYWRBdWRpdExvZyhcbiAgICBpc1JldmVydCA9IHRydWUsXG4gICAgaXNTZXRBdWRpdExvZ3MgPSBmYWxzZVxuICApOiBQcm9taXNlPElSZXN1bHRMaXN0PElBdWRpdFJlY29yZD4+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgYXVkaXRMb2dzID0gYXdhaXQgdGhpcy5nZXRBbGFybUF1ZGl0UmVjb3Jkcyhpc1JldmVydCk7XG5cbiAgICAgIGlmIChpc1NldEF1ZGl0TG9ncykge1xuICAgICAgICB0aGlzLnNldEF1ZGl0TG9ncyhhdWRpdExvZ3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXVkaXRMb2dzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblVwZGF0ZURldGFpbHMoc3RhdHVzOiBBbGFybVN0YXR1c1R5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pc0FsYXJtU3RhdHVzQ2hhbmdpbmcgPSB0cnVlO1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVBbGFybVN0YXR1cyhzdGF0dXMpO1xuICAgICAgYXdhaXQgdGhpcy5yZWxvYWRBdWRpdExvZyh0cnVlLCB0cnVlKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlU3RhdHVzTWVzc2FnZSgpO1xuICAgICAgdGhpcy51cGRhdGVMYXN0VXBkYXRlZERhdGUodGhpcy5hdWRpdExvZy5kYXRhWzBdKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNBbGFybVN0YXR1c0NoYW5naW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGV0YWlsc0J1dHRvbkFjdGlvbihidXR0b246IEFsYXJtRGV0YWlsc0J1dHRvbiwgYWxhcm06IElBbGFybSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGJ1dHRvbi5hY3Rpb24oYWxhcm0pO1xuICAgIGxldCBzaG91bGRSZWxvYWQ6IGJvb2xlYW4gfCBJQWxhcm0gPSBmYWxzZTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgc2hvdWxkUmVsb2FkID0gYXdhaXQgcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG91bGRSZWxvYWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlbG9hZCkge1xuICAgICAgbGV0IGFsYXJtOiBJQWxhcm07XG4gICAgICBpZiAoc2hvdWxkUmVsb2FkID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YTogdXBkYXRlZEFsYXJtIH0gPSBhd2FpdCB0aGlzLmFsYXJtU2VydmljZS5kZXRhaWwodGhpcy5zZWxlY3RlZEFsYXJtLmlkKTtcbiAgICAgICAgYWxhcm0gPSB1cGRhdGVkQWxhcm07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGFybSA9IHNob3VsZFJlbG9hZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWxhcm1zVmlld1NlcnZpY2UudXBkYXRlQWxhcm1MaXN0KCk7XG5cbiAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLnNlbGVjdGVkQWxhcm07XG4gICAgICB0aGlzLnNlbGVjdGVkQWxhcm0gPSBhbGFybTtcbiAgICAgIHRoaXMubmdPbkNoYW5nZXMoe1xuICAgICAgICBzZWxlY3RlZEFsYXJtOiB7XG4gICAgICAgICAgY3VycmVudFZhbHVlOiBhbGFybSxcbiAgICAgICAgICBwcmV2aW91c1ZhbHVlLFxuICAgICAgICAgIGZpcnN0Q2hhbmdlOiBmYWxzZSxcbiAgICAgICAgICBpc0ZpcnN0Q2hhbmdlOiAoKSA9PiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUFsYXJtU3RhdHVzKHN0YXR1czogQWxhcm1TdGF0dXNUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydGlhbGx5VXBkYXRlZEFsYXJtOiBQYXJ0aWFsPElBbGFybT4gPSB7IGlkOiB0aGlzLnNlbGVjdGVkQWxhcm0uaWQsIHN0YXR1cyB9O1xuICAgIGF3YWl0IHRoaXMuYWxhcm1TZXJ2aWNlLnVwZGF0ZShwYXJ0aWFsbHlVcGRhdGVkQWxhcm0pO1xuICAgIGNvbnN0IHRyYW5zbGF0ZWRTdGF0dXNMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KEFMQVJNX1NUQVRVU19MQUJFTFNbc3RhdHVzXSk7XG4gICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhcbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGdldHRleHQoJ0FsYXJtIHN0YXR1cyBjaGFuZ2VkIHRvIHt7IHN0YXR1cyB9fScpLCB7XG4gICAgICAgIHN0YXR1czogdHJhbnNsYXRlZFN0YXR1c0xhYmVsLnRvVXBwZXJDYXNlKClcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdGVkQWxhcm0uc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuYWxhcm1zVmlld1NlcnZpY2UudXBkYXRlQWxhcm1MaXN0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBhdWRpdCBsb2cgYW5kIGFwcGVuZHMgdGhlIGxhc3QgYXVkaXQgcmVjb3JkIHRvIGl0LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBmZXRjaGVzIHRoZSBleGlzdGluZyBhdWRpdCBsb2cgZGF0YSBhbmQgbWFrZXMgYSBkZWVwIGNvcHkgb2YgaXQuIEl0IHRoZW5cbiAgICogcmV0cmlldmVzIHRoZSBsYXN0IGF1ZGl0IHJlY29yZCBhbmQgYXBwZW5kcyBpdCB0byB0aGUgY29waWVkIGF1ZGl0IGxvZyBkYXRhLiBUaGlzIGlzXG4gICAqIHVzZWZ1bCBmb3Igc2NlbmFyaW9zIHdoZXJlIHRoZSBtb3N0IHJlY2VudCBhdWRpdCByZWNvcmQgbmVlZHMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlXG4gICAqIGV4aXN0aW5nIGF1ZGl0IGxvZyBkYXRhIChjYWxjdWxhdGluZyB0aGUgQ0xFQVJFRCBwZXJpb2QpLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb2YgYElSZXN1bHRMaXN0PElBdWRpdFJlY29yZD5gLCB3aGljaCBpbmNsdWRlcyB0aGVcbiAgICogICAgICAgICAgZXhpc3RpbmcgYXVkaXQgbG9nIGRhdGEgYWxvbmcgd2l0aCB0aGUgbGFzdCBhdWRpdCByZWNvcmQgYXBwZW5kZWQuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGF1ZGl0TG9nV2l0aEZpcnN0UmVjb3JkKCk6IFByb21pc2U8SVJlc3VsdExpc3Q8SUF1ZGl0UmVjb3JkPj4ge1xuICAgIGNvbnN0IGV4aXN0aW5nRGF0YSA9IHRoaXMuYXVkaXRMb2c7XG4gICAgY29uc3QgY29waWVkRXhpc3RpbmdEYXRhID0gY2xvbmVEZWVwKGV4aXN0aW5nRGF0YSk7XG5cbiAgICBjb25zdCBsYXN0QXVkaXRSZWNvcmQgPSBhd2FpdCB0aGlzLnJlbG9hZEF1ZGl0TG9nKGZhbHNlKTtcbiAgICBjb25zdCBsYXN0UmVjb3JkID0gbGFzdEF1ZGl0UmVjb3JkLmRhdGFbbGFzdEF1ZGl0UmVjb3JkLmRhdGEubGVuZ3RoIC0gMV07XG4gICAgY29waWVkRXhpc3RpbmdEYXRhLmRhdGEucHVzaChsYXN0UmVjb3JkKTtcbiAgICByZXR1cm4gY29waWVkRXhpc3RpbmdEYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBdWRpdExvZ3MoYXVkaXRMb2dzOiBJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+KTogdm9pZCB7XG4gICAgdGhpcy5hdWRpdExvZyA9IGF1ZGl0TG9ncztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTGFzdFVwZGF0ZWREYXRlKHVwZGF0ZWRBdWRpdFJlY29yZHM6IElBdWRpdFJlY29yZCk6IHZvaWQge1xuICAgIGlmICghdXBkYXRlZEF1ZGl0UmVjb3Jkcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY3JlYXRpb25UaW1lIH0gPSB1cGRhdGVkQXVkaXRSZWNvcmRzO1xuICAgIHRoaXMubGFzdFVwZGF0ZWQgPSBjcmVhdGlvblRpbWU7XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGl2ZVN0YXR1c01lc3NhZ2UodGltZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnQUNUSVZFYGFsYXJtYDogdHJpZ2dlcmVkIHt7YWxhcm1UaW1lRnJvbU5vd319JyksIHtcbiAgICAgIGFsYXJtVGltZUZyb21Ob3c6IHRoaXMucmVsYXRpdmVUaW1lLnRyYW5zZm9ybShuZXcgRGF0ZSh0aW1lKSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWNrbm93bGVkZ2VkU3RhdHVzTWVzc2FnZShzdGF0dXM6IEFsYXJtU3RhdHVzVHlwZSwgY2hhbmdlTG9nOiBJQXVkaXRSZWNvcmRbXSk6IHN0cmluZyB7XG4gICAgaWYgKGNoYW5nZUxvZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdBQ0tOT1dMRURHRURgYWxhcm1gJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGFja25vd2xlZGdlZEJ5ID0gdGhpcy5hbGFybURldGFpbHNTZXJ2aWNlLmdldEFja25vd2xlZGdlZEJ5KHN0YXR1cywgY2hhbmdlTG9nKTtcbiAgICBjb25zdCBhY2tub3dsZWRnZVRpbWUgPSB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuZ2V0QWNrbm93bGVkZ2VUaW1lKGNoYW5nZUxvZyk7XG5cbiAgICBpZiAoYWNrbm93bGVkZ2VkQnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgZ2V0dGV4dCgnQUNLTk9XTEVER0VEYGFsYXJtYCBieToge3thY2tCeX19IHt7YWNrVGltZUZyb21Ob3d9fScpLFxuICAgICAgICB7XG4gICAgICAgICAgYWNrQnk6IGFja25vd2xlZGdlZEJ5LFxuICAgICAgICAgIGFja1RpbWVGcm9tTm93OiB0aGlzLnJlbGF0aXZlVGltZS50cmFuc2Zvcm0obmV3IERhdGUoYWNrbm93bGVkZ2VUaW1lKSlcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnQUNLTk9XTEVER0VEYGFsYXJtYCB7e2Fja1RpbWVGcm9tTm93fX0nKSwge1xuICAgICAgYWNrVGltZUZyb21Ob3c6IHRoaXMucmVsYXRpdmVUaW1lLnRyYW5zZm9ybShuZXcgRGF0ZShhY2tub3dsZWRnZVRpbWUpKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDbGVhcmVkU3RhdHVzTWVzc2FnZShhdWRpdExvZzogSUF1ZGl0UmVjb3JkW10pOiBzdHJpbmcge1xuICAgIGlmIChhdWRpdExvZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdDTEVBUkVEYGFsYXJtYCcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaWZmZXJlbmNlSW5NcyA9IHRoaXMuY2FsY3VsYXRlQWxhcm1EdXJhdGlvbihhdWRpdExvZyk7XG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICBnZXR0ZXh0KCdDTEVBUkVEYGFsYXJtYDogd2FzIGFjdGl2ZSBmb3Ige3thbGFybUR1cmF0aW9ufX0nKSxcbiAgICAgIHtcbiAgICAgICAgYWxhcm1EdXJhdGlvbjogdGhpcy5yZWxhdGl2ZVRpbWUudHJhbnNmb3JtKGRpZmZlcmVuY2VJbk1zLCB0cnVlKVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gb2YgYW4gYWxhcm0gYmFzZWQgb24gYXVkaXQgbG9nIHJlY29yZHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNvbXB1dGVzIHRoZSBkdXJhdGlvbiBvZiBhbiBhbGFybSBieSBmaW5kaW5nIHRoZSBkaWZmZXJlbmNlXG4gICAqIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdGltZXMgb2YgdGhlIGFsYXJtLiBUaGUgc3RhcnQgdGltZSBpcyBkZXRlcm1pbmVkXG4gICAqIGZyb20gdGhlIGxhc3QgcmVjb3JkIGluIHRoZSBhdWRpdCBsb2csIHVzaW5nIHRoZSBmaXJzdCBhdmFpbGFibGUgdGltZSBmaWVsZFxuICAgKiAoYGZpcnN0T2NjdXJyZW5jZVRpbWVgLCBgdGltZWAsIG9yIGBjcmVhdGlvblRpbWVgKS4gVGhlIGVuZCB0aW1lIGlzIG9idGFpbmVkXG4gICAqIGZyb20gdGhlIGBhbGFybURldGFpbHNTZXJ2aWNlYC5cbiAgICpcbiAgICogQHBhcmFtIGF1ZGl0TG9nIC0gQW4gYXJyYXkgb2YgYElBdWRpdFJlY29yZGAgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGF1ZGl0IGxvZyByZWNvcmRzLlxuICAgKiBAcmV0dXJucyBUaGUgZHVyYXRpb24gb2YgdGhlIGFsYXJtIGluIG1pbGxpc2Vjb25kcywgb3IgYG51bGxgIGlmIHRoZSBlbmQgdGltZSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVBbGFybUR1cmF0aW9uKGF1ZGl0TG9nOiBJQXVkaXRSZWNvcmRbXSk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGZpcnN0QWxhcm0gPSBhdWRpdExvZ1thdWRpdExvZy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBmaXJzdEFsYXJtLmZpcnN0T2NjdXJyZW5jZVRpbWUgfHwgZmlyc3RBbGFybS50aW1lIHx8IGZpcnN0QWxhcm0uY3JlYXRpb25UaW1lO1xuICAgIGNvbnN0IGVuZFRpbWUgPSB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuZ2V0RW5kVGltZShhdWRpdExvZyk7XG5cbiAgICBpZiAoIWVuZFRpbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0VGltZVRvRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0VGltZSk7XG4gICAgY29uc3QgZW5kVGltZVRvRGF0ZSA9IG5ldyBEYXRlKGVuZFRpbWUpO1xuXG4gICAgcmV0dXJuIGVuZFRpbWVUb0RhdGUuZ2V0VGltZSgpIC0gc3RhcnRUaW1lVG9EYXRlLmdldFRpbWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGF1ZGl0IHJlY29yZHMgZm9yIGEgc2VsZWN0ZWQgYWxhcm0uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYXVkaXQgcmVjb3JkcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMsIGluY2x1ZGluZ1xuICAgKiB0aGUgZGF0ZSwgcGFnZSBzaXplLCB3aGV0aGVyIHRvIHJldmVydCwgdGhlIHNvdXJjZSBhbGFybSBJRCwgYW5kIHdoZXRoZXIgdG8gaW5jbHVkZSB0b3RhbCBwYWdlcy5cbiAgICpcbiAgICogQHBhcmFtIGlzUmV2ZXJ0IC0gQSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHJpZXZlIGEgMTAwIChzZWUgUEFHRV9TSVpFKSByZWNvcmRzICh0cnVlKVxuICAgKiAgICAgICAgICAgICAgICAgICBvciBvbmx5IHJlY29yZCwgdGhhdCBjaHJvbm9sb2dpY2FsbHkgd2lsbCBiZSB0aGUgb2xkZXN0IG9uZSAoZmFsc2UpLiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKiAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gZmFsc2UsIGl0IHdpbGwgc2V0IFBBR0VfU0laRSB0byAxIGFuZCB0cmlnZ2VyIGEgbG9naWNcbiAgICogICAgICAgICAgICAgICAgICAgY29uY2F0ZW5hdGluZyBhIG1vc3QgcmVjZW50IHJlY29yZCB3aXRoIHRoZSB2ZXJ5IGZpcnN0IG9uZSB0b1xuICAgKiAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgdGhlIGFsYXJtIGR1cmF0aW9uIChjaGFuZ2UgdG8gQ0xFQVJFRCBzdGF0dXMpLlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBJUmVzdWx0TGlzdCBvZiBJQXVkaXRSZWNvcmQgb2JqZWN0cywgcmVwcmVzZW50aW5nIHRoZSBhdWRpdCByZWNvcmRzLlxuICAgKiBAYXN5bmNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWxhcm1BdWRpdFJlY29yZHMoaXNSZXZlcnQgPSB0cnVlKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgIGRhdGVUbzogbmV3IERhdGUoRGF0ZS5ub3coKSkudG9JU09TdHJpbmcoKSxcbiAgICAgIHBhZ2VTaXplOiBpc1JldmVydCA/IHRoaXMuUEFHRV9TSVpFIDogMSxcbiAgICAgIHJldmVydDogaXNSZXZlcnQsXG4gICAgICBzb3VyY2U6IHRoaXMuc2VsZWN0ZWRBbGFybS5pZCxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlXG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmF1ZGl0U2VydmljZS5saXN0KHByb3BlcnRpZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVTdGF0dXNNZXNzYWdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZEFsYXJtLnN0YXR1cykge1xuICAgICAgY2FzZSB0aGlzLkFDVElWRV9TVEFUVVNfVkFMVUU6XG4gICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHRoaXMuZ2V0QWN0aXZlU3RhdHVzTWVzc2FnZSh0aGlzLnNlbGVjdGVkQWxhcm0udGltZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0aGlzLkFDS05PV0xFREdFRF9TVEFUVVNfVkFMVUU6XG4gICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHRoaXMuZ2V0QWNrbm93bGVkZ2VkU3RhdHVzTWVzc2FnZShcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQWxhcm0uc3RhdHVzIGFzIHVua25vd24gYXMgQWxhcm1TdGF0dXNUeXBlLFxuICAgICAgICAgIHRoaXMuYXVkaXRMb2cuZGF0YVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdGhpcy5DTEVBUkVEX1NUQVRVU19WQUxVRTpcbiAgICAgICAgaWYgKHRoaXMuaGFzUmVhY2hlZE9yRXhjZWVkZWRQYWdlU2l6ZUxpbWl0KCkpIHtcbiAgICAgICAgICB0aGlzLmV4dGVuZGVkQXVkaXRMb2dzID0gYXdhaXQgdGhpcy5hdWRpdExvZ1dpdGhGaXJzdFJlY29yZCgpO1xuICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHRoaXMuZ2V0Q2xlYXJlZFN0YXR1c01lc3NhZ2UodGhpcy5leHRlbmRlZEF1ZGl0TG9ncy5kYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlID0gdGhpcy5nZXRDbGVhcmVkU3RhdHVzTWVzc2FnZSh0aGlzLmF1ZGl0TG9nLmRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc1JlYWNoZWRPckV4Y2VlZGVkUGFnZVNpemVMaW1pdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpdExvZy5kYXRhLmxlbmd0aCA+PSB0aGlzLlBBR0VfU0laRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIGN1cnJlbnQgVVJMIGluY2x1ZGVzIHRoZSBjb250ZXh0IHBhdGggb2YgdGhlXG4gICAqIGRldmljZSBtYW5hZ2VtZW50IGFwcGxpY2F0aW9uLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHVzZXIgaXMgaW4gdGhlXG4gICAqIGRldmljZSBtYW5hZ2VtZW50IHZpZXcuXG4gICAqXG4gICAqIEByZXR1cm5zIFJldHVybnMgYHRydWVgIGlmIHRoZSBjdXJyZW50IHZpZXcgaXMgaW4gZGV2aWNlIG1hbmFnZW1lbnQsIG90aGVyd2lzZSwgcmV0dXJucyBgZmFsc2VgLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0RldmljZU1hbmFnZW1lbnRWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcyh0aGlzLnVzZXJEZXZpY2VNYW5hZ2VtZW50QXBwLmNvbnRleHRQYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VzdG9tRnJhZ21lbnRzKHNlbGVjdGVkQWxhcm06IElBbGFybSk6IEN1c3RvbUZyYWdtZW50IHtcbiAgICBsZXQgY3VzdG9tUHJvcGVydGllcyA9IG51bGw7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2VsZWN0ZWRBbGFybSkge1xuICAgICAgaWYgKCFBTEFSTV9ERUZBVUxUX1BST1BFUlRJRVMuZmluZChrID0+IGsgPT09IGtleSkpIHtcbiAgICAgICAgaWYgKCFjdXN0b21Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgY3VzdG9tUHJvcGVydGllcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGN1c3RvbVByb3BlcnRpZXNba2V5XSA9IHNlbGVjdGVkQWxhcm1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VzdG9tUHJvcGVydGllcztcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImQtZmxleCByb3cgdGlnaHQtZ3JpZCBmbGV4LXdyYXAgYS1pLXN0cmV0Y2hcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtbWQtNiBkLWZsZXggcC1iLThcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLWFsbCBmaXQtdyBkLWZsZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLThcIj5cbiAgICAgICAgPGlcbiAgICAgICAgICBjbGFzcz1cImljb24tMjQgdGV4dC1ncmF5LWRhcmsgbS10LTQgYzh5LWljb25cIlxuICAgICAgICAgIFtjOHlJY29uXT1cInNlbGVjdGVkQWxhcm0uc3RhdHVzIHwgQWxhcm1TdGF0dXNUb0ljb25cIlxuICAgICAgICA+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicC10LTggcC1iLTggcC1yLThcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tYi0wIG0tci04XCI+e3sgJ1N0YXR1cycgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgIDxwIGNsYXNzPVwic21hbGxcIj57eyBzdGF0dXNNZXNzYWdlIH19PC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1tZC02IGQtZmxleCBwLWItOFwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3JkZXItYWxsIGZpdC13IGQtZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtOFwiPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiaWNvbi0yNCB0ZXh0LWdyYXktZGFyayBtLXQtNCBzdHJva2VkLWljb24gc3RhdHVzXCJcbiAgICAgICAgICBbYzh5SWNvbl09XCJzZWxlY3RlZEFsYXJtLnNldmVyaXR5IHwgQWxhcm1TZXZlcml0eVRvSWNvblwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRBbGFybS5zZXZlcml0eT8udG9TdHJpbmcoKSB8IGxvd2VyY2FzZVwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtOCBwLWItOCBwLXItOFwiPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnU2V2ZXJpdHknIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8cCBjbGFzcz1cInNtYWxsXCI+e3sgU0VWRVJJVFlfTEFCRUxTW3NlbGVjdGVkQWxhcm0uc2V2ZXJpdHldIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1tZC02IGQtZmxleCBwLWItOFwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3JkZXItYWxsIGZpdC13IGQtZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtOFwiPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiaWNvbi0yNCB0ZXh0LWdyYXktZGFyayBtLXQtNCBzdHJva2VkLWljb24gc3RhdHVzXCJcbiAgICAgICAgICBjOHlJY29uPVwiY29udGFjdGxlc3MtcGF5bWVudFwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtOCBwLWItOCBwLXItOFwiPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnU291cmNlJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJzbWFsbFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWxpbmsgdGV4dC1tdXRlZCBwLTAgbS1yLTggdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgc2VsZWN0ZWRBbGFybS5zb3VyY2UubmFtZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHJvdXRlckxpbms9XCJ7eyBzZWxlY3RlZEFsYXJtTU8gfCBhc3NldExpbmsgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImljb24tZmxleFwiPlxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZXhjaGFuZ2VcIj48L2k+XG4gICAgICAgICAgICAgIHt7IHNlbGVjdGVkQWxhcm0uc291cmNlLm5hbWUgfHwgc2VsZWN0ZWRBbGFybS5zb3VyY2UuaWQgfX1cbiAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dTb3VyY2VOYXZpZ2F0aW9uTGlua1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1saW5rIHAtMCB0ZXh0LWxlZnRcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7XG4gICAgICAgICAgICAgICAgbGlua1RpdGxlXG4gICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBhcHBOYW1lOiB1c2VyRGV2aWNlTWFuYWdlbWVudEFwcCB8IGh1bWFuaXplQXBwTmFtZSB8IGFzeW5jIH1cbiAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9BbGFybVNvdXJjZShzZWxlY3RlZEFsYXJtLmlkKVwiXG4gICAgICAgICAgICAgIGRhdGEtY3k9XCJhbGFybS1kZXRhaWxzLWRldmljZS1tYW5hZ2VtZW50LWxpbmtcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB1c2VyRGV2aWNlTWFuYWdlbWVudEFwcCB8IGh1bWFuaXplQXBwTmFtZSB8IGFzeW5jIH19XG4gICAgICAgICAgICAgIDxpIGM4eUljb249XCJleHRlcm5hbC1saW5rXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtbWQtNiBkLWZsZXggcC1iLThcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLWFsbCBmaXQtdyBkLWZsZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLThcIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImNpcmNsZS1pY29uLXdyYXBwZXJcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQtY29sb3InOiB0eXBlQ29sb3IgfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJzdHJva2VkLWljb25cIlxuICAgICAgICAgICAgYzh5SWNvbj1cImJlbGxcIlxuICAgICAgICAgID48L2k+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInAtdC04IHAtYi04IHAtci04IG1pbi13aWR0aC0wXCI+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWItMCBtLXItOFwiPnt7ICdUeXBlJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgPHBcbiAgICAgICAgICBjbGFzcz1cInNtYWxsIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgIHRpdGxlPVwie3sgc2VsZWN0ZWRBbGFybS50eXBlIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjb2RlPnt7IHNlbGVjdGVkQWxhcm0udHlwZSB9fTwvY29kZT5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjb2wteHMtMTIgY29sLW1kLTEyIHAtYi0xNlwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3JkZXItYWxsIGZpdC13IGQtZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtOFwiPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiaWNvbi0yNCB0ZXh0LWdyYXktZGFyayBtLXQtNFwiXG4gICAgICAgICAgYzh5SWNvbj1cImNhbGVuZGFyXCJcbiAgICAgICAgPjwvaT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInAtdC04IHAtYi0wIHAtci04IGZsZXgtZ3Jvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1mbGV4LTUwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IHAtYi04XCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnTGFzdCB1cGRhdGVkJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGxcIj5cbiAgICAgICAgICAgICAge3sgbGFzdFVwZGF0ZWQgfCBjOHlEYXRlOiAnbWVkaXVtJyB9fVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiY29sLTQgcC1iLThcIlxuICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEFsYXJtLmNvdW50ID4gMVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tYi0wIG0tci04XCI+e3sgJ051bWJlciBvZiBvY2N1cnJlbmNlcycgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1pbmZvXCI+e3sgc2VsZWN0ZWRBbGFybS5jb3VudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNvbC00IHAtYi04XCJcbiAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRBbGFybS5jb3VudCA+IDFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWItMCBtLXItOFwiPnt7ICdGaXJzdCBvY2N1cnJlbmNlJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGxcIj5cbiAgICAgICAgICAgICAge3sgc2VsZWN0ZWRBbGFybS5jcmVhdGlvblRpbWUgfCBjOHlEYXRlOiAnbWVkaXVtJyB9fVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJjb2wteHMtMTIgY29sLW1kLTEyIHAtYi0xNlwiXG4gICAgKm5nSWY9XCJjdXN0b21GcmFnbWVudHNcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImJvcmRlci1hbGwgZml0LXcgZC1mbGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicC04XCI+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJpY29uLTI0IHRleHQtZ3JheS1kYXJrIG0tdC00XCJcbiAgICAgICAgICBjOHlJY29uPVwib3V0Z29pbmctZGF0YVwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwLXQtOCBwLWItMCBwLXItOCBmbGV4LWdyb3dcIlxuICAgICAgICBkYXRhLWN5PVwiYWxhcm0tZGV0YWlscy1jdXN0b20tZGF0YVwiXG4gICAgICA+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWItNCBtLXItOFwiPnt7ICdDdXN0b20gZGF0YScgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgIDxwcmU+PGNvZGU+e3sgY3VzdG9tRnJhZ21lbnRzIHwganNvbiB9fTwvY29kZT48L3ByZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBnYXAtOFwiPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICBbdGl0bGVdPVwiJ1JlbG9hZCBhdWRpdCBsb2dzJyB8IHRyYW5zbGF0ZVwiXG4gICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgKGNsaWNrKT1cInJlbG9hZEF1ZGl0TG9nKHRydWUsIHRydWUpXCJcbiAgPlxuICAgIDxpXG4gICAgICBjOHlJY29uPVwicmVmcmVzaFwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiBpc0xvYWRpbmcgfVwiXG4gICAgPjwvaT5cbiAgICB7eyAnUmVsb2FkIGF1ZGl0IGxvZ3MnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuXG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc21cIlxuICAgIFt0aXRsZV09XCJcbiAgICAgIHNlbGVjdGVkQWxhcm0uc3RhdHVzICE9PSBBQ0tOT1dMRURHRURfU1RBVFVTX1ZBTFVFXG4gICAgICAgID8gKEFDS05PV0xFREdFX0xBQkVMIHwgdHJhbnNsYXRlKVxuICAgICAgICA6IChSRUFDVElWQVRFX0xBQkVMIHwgdHJhbnNsYXRlKVxuICAgIFwiXG4gICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgKGNsaWNrKT1cIlxuICAgICAgb25VcGRhdGVEZXRhaWxzKFxuICAgICAgICBzZWxlY3RlZEFsYXJtLnN0YXR1cyAhPT0gQUNLTk9XTEVER0VEX1NUQVRVU19WQUxVRVxuICAgICAgICAgID8gQUNLTk9XTEVER0VEX1NUQVRVU19WQUxVRVxuICAgICAgICAgIDogQUNUSVZFX1NUQVRVU19WQUxVRVxuICAgICAgKVxuICAgIFwiXG4gICAgW2Rpc2FibGVkXT1cInNlbGVjdGVkQWxhcm0uc3RhdHVzID09PSBDTEVBUkVEX1NUQVRVU19WQUxVRSB8fCBpc0FsYXJtU3RhdHVzQ2hhbmdpbmdcIlxuICA+XG4gICAgPGlcbiAgICAgIFtjOHlJY29uXT1cInNlbGVjdGVkQWxhcm0uc3RhdHVzICE9PSBBQ0tOT1dMRURHRURfU1RBVFVTX1ZBTFVFID8gQkVMTF9TTEFTSF9JQ09OIDogQkVMTF9JQ09OXCJcbiAgICA+PC9pPlxuICAgIHt7XG4gICAgICBzZWxlY3RlZEFsYXJtLnN0YXR1cyAhPT0gQUNLTk9XTEVER0VEX1NUQVRVU19WQUxVRVxuICAgICAgICA/IChBQ0tOT1dMRURHRV9MQUJFTCB8IHRyYW5zbGF0ZSlcbiAgICAgICAgOiAoUkVBQ1RJVkFURV9MQUJFTCB8IHRyYW5zbGF0ZSlcbiAgICB9fVxuICA8L2J1dHRvbj5cblxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICBbdGl0bGVdPVwiJ0NyZWF0ZSBzbWFydCBydWxlJyB8IHRyYW5zbGF0ZVwiXG4gICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgKm5nSWY9XCJpc0NyZWF0ZVNtYXJ0UnVsZXNCdXR0b25BdmFpbGFibGVcIlxuICAgIChjbGljayk9XCJjcmVhdGVTbWFydFJ1bGUoKVwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwiYzh5LWljb24gYzh5LWljb24tc21hcnQtcnVsZXNcIj48L2k+XG4gICAge3sgJ0NyZWF0ZSBzbWFydCBydWxlJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgW3RpdGxlXT1cIidDbGVhcmBhbGFybWAnIHwgdHJhbnNsYXRlXCJcbiAgICB0eXBlPVwic3VibWl0XCJcbiAgICAoY2xpY2spPVwib25VcGRhdGVEZXRhaWxzKENMRUFSRURfU1RBVFVTX1ZBTFVFKVwiXG4gICAgW2Rpc2FibGVkXT1cInNlbGVjdGVkQWxhcm0uc3RhdHVzID09PSBDTEVBUkVEX1NUQVRVU19WQUxVRVwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwiYzh5LWFsZXJ0LWlkbGVcIj48L2k+XG4gICAge3sgJ0NsZWFyYGFsYXJtYCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgICpuZ0Zvcj1cImxldCBidXR0b24gb2Ygc2VsZWN0ZWRBbGFybSB8IGFsYXJtRGV0YWlsc0J1dHRvbjogc2VsZWN0ZWRBbGFybU1PIHwgYXN5bmNcIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgW25nQ2xhc3NdPVwiYnV0dG9uLmFkZGl0aW9uYWxCdXR0b25DbGFzc2VzXCJcbiAgICBbdGl0bGVdPVwiYnV0dG9uLnRpdGxlIHwgdHJhbnNsYXRlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwiZGV0YWlsc0J1dHRvbkFjdGlvbihidXR0b24sIHNlbGVjdGVkQWxhcm0pXCJcbiAgICBbZGlzYWJsZWRdPVwiYnV0dG9uLmRpc2FibGVkXCJcbiAgPlxuICAgIDxpIFtuZ0NsYXNzXT1cImJ1dHRvbi5hZGRpdGlvbmFsSWNvbkNsYXNzZXNcIiBbYzh5SWNvbl09XCJidXR0b24uaWNvblwiPjwvaT5cbiAgICA8c3BhbiAqbmdJZj1cImJ1dHRvbi5sYWJlbFwiPnt7IGJ1dHRvbi5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNub0F1ZGl0TG9nQXZhaWxhYmxlPlxuICA8ZGl2IGNsYXNzPVwicC0xNlwiPlxuICAgIDxjOHktdWktZW1wdHktc3RhdGVcbiAgICAgIFtpY29uXT1cIidhcmNoaXZlJ1wiXG4gICAgICBbdGl0bGVdPVwiJ05vIGF1ZGl0IGxvZ3MgZm91bmQuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICA+PC9jOHktdWktZW1wdHktc3RhdGU+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrXCI+e3sgJ0F1ZGl0IGxvZ3MnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xvYWRpbmcgfHwgYXVkaXRMb2c/LmRhdGEubGVuZ3RoOyBlbHNlIG5vQXVkaXRMb2dBdmFpbGFibGVcIj5cbiAgPGM4eS1sb2FkaW5nICpuZ0lmPVwiaXNMb2FkaW5nXCI+PC9jOHktbG9hZGluZz5cblxuICA8Yzh5LWxpc3QtZ3JvdXBcbiAgICBkYXRhLWN5PVwiYzh5LWFsYXJtcy1kZXRhaWxzLS1hdWRpdC1sb2dzXCJcbiAgICAqbmdJZj1cIiFpc0xvYWRpbmdcIlxuICA+XG4gICAgPGM4eS1saS10aW1lbGluZSAqYzh5Rm9yPVwibGV0IGxvZyBvZiBhdWRpdExvZzsgbG9hZE1vcmU6ICdoaWRkZW4nXCI+XG4gICAgICB7eyBsb2cuY3JlYXRpb25UaW1lIHwgZGF0ZTogJ21lZGl1bURhdGUnIH19XG4gICAgICB7eyBsb2cuY3JlYXRpb25UaW1lIHwgZGF0ZTogJ21lZGl1bVRpbWUnIH19XG4gICAgICA8Yzh5LWxpPlxuICAgICAgICA8Yzh5LWxpLWJvZHk+XG4gICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlLXdyYXAgc2VwYXJhdG9yLWJvdHRvbSBwLWItNFwiPlxuICAgICAgICAgICAge3sgbG9nIHwgYXVkaXRDaGFuZ2VzTWVzc2FnZSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2Zvb3RlclwiPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItMTYgc21hbGxcIlxuICAgICAgICAgICAgICAqbmdJZj1cImxvZy51c2VyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCI+XG4gICAgICAgICAgICAgICAge3sgJ2J5YHVzZXJgJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIHt7IGxvZy51c2VyIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtYWxsXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbFwiPlxuICAgICAgICAgICAgICAgIHt7ICdkZXZpY2UgdGltZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICB7eyBsb2cudGltZSB8IGM4eURhdGU6ICdtZWRpdW0nIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYzh5LWxpLWJvZHk+XG4gICAgICA8L2M4eS1saT5cbiAgICA8L2M4eS1saS10aW1lbGluZT5cbiAgPC9jOHktbGlzdC1ncm91cD5cbjwvbmctY29udGFpbmVyPlxuIl19
|
|
335
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxhcm0tZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hbGFybXMvYWxhcm0tZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9hbGFybXMvYWxhcm0tZGV0YWlscy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYSxRQUFRLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLFlBQVksRUFFWixZQUFZLEVBTVosZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDaEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixPQUFPLEVBRVAsZUFBZSxFQUNmLGFBQWEsRUFDZCxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixpQkFBaUIsRUFHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFjLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQU1sRCxNQUFNLE9BQU8scUJBQXFCO0lBdUVoQyxZQUNVLG1CQUF3QyxFQUN4QyxZQUEwQixFQUMxQixZQUEwQixFQUMxQixRQUF5QixFQUN6QixZQUEwQixFQUMxQixZQUE4QixFQUNsQiwy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LEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RFLE1BQU07UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVPLGlDQUFpQztRQUN2QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3JELENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxhQUFxQjtRQUM5QyxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM1QixLQUFLLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBQ3RCLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztnQkFDeEIsQ0FBQztnQkFDRCxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7OEdBcFpVLHFCQUFxQjtrR0FBckIscUJBQXFCLDBIQzFDbEMscXBTQTBSQTs7MkZEaFBhLHFCQUFxQjtrQkFKakMsU0FBUzsrQkFDRSxtQkFBbUI7OzBCQWlGMUIsUUFBUTtnTUE3RUYsYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT3B0aW9uYWwsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFMQVJNX1NUQVRVU19MQUJFTFMsXG4gIEFsYXJtU3RhdHVzLFxuICBBbGFybVNlcnZpY2UsXG4gIEFsYXJtU3RhdHVzVHlwZSxcbiAgQXVkaXRTZXJ2aWNlLFxuICBJQWxhcm0sXG4gIElBcHBsaWNhdGlvbixcbiAgSUF1ZGl0UmVjb3JkLFxuICBJTWFuYWdlZE9iamVjdCxcbiAgSVJlc3VsdExpc3QsXG4gIEludmVudG9yeVNlcnZpY2UsXG4gIFNFVkVSSVRZX0xBQkVMU1xufSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBBbGVydFNlcnZpY2UsXG4gIEFwcFN0YXRlU2VydmljZSxcbiAgQ29sb3JTZXJ2aWNlLFxuICBSZWxhdGl2ZVRpbWVQaXBlLFxuICBnZXR0ZXh0LFxuICBTdXBwb3J0ZWRBcHBLZXksXG4gIEludGVyQXBwU2VydmljZSxcbiAgU3VwcG9ydGVkQXBwc1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBBbGFybURldGFpbHNTZXJ2aWNlIH0gZnJvbSAnLi9hbGFybS1kZXRhaWxzLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQUxBUk1fREVGQVVMVF9QUk9QRVJUSUVTLFxuICBBTEFSTV9TVEFUVVNfSUNPTixcbiAgQWxhcm1EZXRhaWxzQnV0dG9uLFxuICBDdXN0b21GcmFnbWVudFxufSBmcm9tICcuL2FsYXJtcy5tb2RlbCc7XG5pbXBvcnQgeyBOZzFTbWFydFJ1bGVzVXBncmFkZVNlcnZpY2UgfSBmcm9tICcuL25nMS1zbWFydC1ydWxlcy11cGdyYWRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxhcm1zVmlld1NlcnZpY2UgfSBmcm9tICcuL2FsYXJtcy12aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWFsYXJtLWRldGFpbHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWxhcm0tZGV0YWlscy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQWxhcm1EZXRhaWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgc2VsZWN0ZWRBbGFybTogSUFsYXJtO1xuXG4gIHJlYWRvbmx5IEFDS05PV0xFREdFRF9TVEFUVVNfVkFMVUUgPSBBbGFybVN0YXR1cy5BQ0tOT1dMRURHRUQ7XG4gIHJlYWRvbmx5IEFDVElWRV9TVEFUVVNfVkFMVUUgPSBBbGFybVN0YXR1cy5BQ1RJVkU7XG4gIHJlYWRvbmx5IENMRUFSRURfU1RBVFVTX1ZBTFVFID0gQWxhcm1TdGF0dXMuQ0xFQVJFRDtcbiAgcmVhZG9ubHkgQUNLTk9XTEVER0VfTEFCRUwgPSBnZXR0ZXh0KCdBY2tub3dsZWRnZScpO1xuICByZWFkb25seSBSRUFDVElWQVRFX0xBQkVMID0gZ2V0dGV4dCgnUmVhY3RpdmF0ZScpO1xuICByZWFkb25seSBTRVZFUklUWV9MQUJFTFMgPSBTRVZFUklUWV9MQUJFTFM7XG4gIHJlYWRvbmx5IEJFTExfU0xBU0hfSUNPTiA9IEFMQVJNX1NUQVRVU19JQ09OLkJFTExfU0xBU0g7XG4gIHJlYWRvbmx5IEJFTExfSUNPTiA9IEFMQVJNX1NUQVRVU19JQ09OLkJFTEw7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBEZXZpY2UgTWFuYWdlbWVudCBhcHBsaWNhdGlvbiB1c2VkIGJ5IHRoZSB1c2VyLlxuICAgKiBEZXRlcm1pbmVzIHRoZSBhY2N1cmF0ZSBuYW1lIGFuZCBjb250ZXh0IHBhdGggcmVxdWlyZWQgZm9yIG5hdmlnYXRpbmcgdG8gYWxhcm1zIG9mIHRoZSBjdXJyZW50IGRldmljZVxuICAgKi9cbiAgdXNlckRldmljZU1hbmFnZW1lbnRBcHAkOiBPYnNlcnZhYmxlPElBcHBsaWNhdGlvbj47XG4gIC8qKlxuICAgKiBNYW5hZ2VzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBuYXZpZ2F0aW9uIGxpbmsuXG4gICAqIElmIHNldCB0byB0cnVlLCB0aGUgbGluayBpcyB2aXNpYmxlLCBvdGhlcndpc2UsIGl0IHJlbWFpbnMgaGlkZGVuLlxuICAgKi9cbiAgc2hvd1NvdXJjZU5hdmlnYXRpb25MaW5rJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgZGV2aWNlTWFuYWdlbWVudEFwcEtleTogU3VwcG9ydGVkQXBwS2V5ID0gU3VwcG9ydGVkQXBwcy5kZXZpY2VtYW5hZ2VtZW50O1xuICByZWFkb25seSBsaW5rVGl0bGUgPSBnZXR0ZXh0KCdPcGVuIGluIHt7IGFwcE5hbWUgfX0nKTtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGF1ZGl0IGxvZ3MsIGluY2x1ZGluZyB0aGUgdmVyeSBmaXJzdCBhdWRpdCBsb2cgcmVjb3JkIGluIHRoZSBhbGFybXMnIGhpc3RvcnkuXG4gICAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBoaXN0b3JpY2FsIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBhdWRpdCBsb2dzIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgZGF0YSBzZXQuXG4gICAqIFVzdWFsbHkgaXQncyBhbiAnQWxhcm0gY3JlYXRlZCcgYXVkaXQgbG9nLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgd2hlbiBhdWRpdCBsb2dzIGV4Y2VlZCBQQUdFX1NJWkUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGV4dGVuZGVkQXVkaXRMb2dzOiBJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IFBBR0VfU0laRSA9IDEwMDtcblxuICAvKipcbiAgICogUHJldmVudHMgdGhlIHBpcGVsaW5lIGZyb20gZmFpbGluZyBmb3IgYSB0dXRvcmlhbCBhcHBsaWNhdGlvblxuICAgKiBiZWNhdXNlIGl0J3MgYSBwdXJlIEFuZ3VsYXIgYXBwbGljYXRpb24gYW5kIGRvZXNuJ3Qgc3VwcG9ydCBhbnlcbiAgICogQW5ndWxhckpTIHNlcnZpY2VzLlxuICAgKi9cbiAgaXNDcmVhdGVTbWFydFJ1bGVzQnV0dG9uQXZhaWxhYmxlOiBib29sZWFuO1xuICAvKipcbiAgICogUHJvcGVydHkgY29udGFpbnMgYSAxMDAgKHNlZSBQQUdFX1NJWkUpIG9mIG1vc3QgcmVjZW50IGF1ZGl0IGxvZ3MgcmVjb3Jkcy5cbiAgICovXG4gIGF1ZGl0TG9nOiBJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+O1xuXG4gIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGVuIGFsYXJtcyBzdGF0dXMgY2hhbmdlIHdhcyBzdGFydGVkIChBY2tub3dsZWRnZS9SZWFjdGl2YXRlKVxuICAgKi9cbiAgaXNBbGFybVN0YXR1c0NoYW5naW5nID0gZmFsc2U7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEgdmFsdWUgZm9yIGEgJ0xhc3QgdXBkYXRlZCcgc2VjdGlvbiBpbiBkZXRhaWxzLlxuICAgKi9cbiAgbGFzdFVwZGF0ZWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSB2YWx1ZSBmb3IgYSAnU3RhdHVzJyBzZWN0aW9uIGluIGRldGFpbHMuXG4gICAqL1xuICBzdGF0dXNNZXNzYWdlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGFsYXJtIHR5cGUuXG4gICAqL1xuICB0eXBlQ29sb3I6IHN0cmluZztcbiAgLyoqXG4gICAqIEN1c3RvbSBmcmFnbWVudHMgb2YgdGhlIHNlbGVjdGVkIGFsYXJtLiBJZiBub25lIGV4aXN0LCBudWxsIGlzIHJldHVybmVkLlxuICAgKi9cbiAgY3VzdG9tRnJhZ21lbnRzOiBDdXN0b21GcmFnbWVudCA9IG51bGw7XG5cbiAgc2VsZWN0ZWRBbGFybU1POiBJTWFuYWdlZE9iamVjdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFsYXJtRGV0YWlsc1NlcnZpY2U6IEFsYXJtRGV0YWlsc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGFybVNlcnZpY2U6IEFsYXJtU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwU3RhdGU6IEFwcFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGF1ZGl0U2VydmljZTogQXVkaXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVsYXRpdmVUaW1lOiBSZWxhdGl2ZVRpbWVQaXBlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbmcxU21hcnRSdWxlc1VwZ3JhZGVTZXJ2aWNlOiBOZzFTbWFydFJ1bGVzVXBncmFkZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGFsYXJtc1ZpZXdTZXJ2aWNlOiBBbGFybXNWaWV3U2VydmljZSxcbiAgICBwcml2YXRlIGNvbG9yU2VydmljZTogQ29sb3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW50ZXJBcHBTZXJ2aWNlOiBJbnRlckFwcFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlzU21hcnRSdWxlc1NlcnZpY2VTdWJzY3JpYmVkID0gISEoYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICB0aGlzLmludGVyQXBwU2VydmljZS5nZXRBcHAkKFN1cHBvcnRlZEFwcHMuc21hcnRydWxlcylcbiAgICApKTtcbiAgICBjb25zdCBoYXNBbnlSb2xlQWxsb3dpbmdUb0NyZWF0ZVNtYXJ0UnVsZSA9XG4gICAgICB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuY2hlY2tJZkhhc0FueVJvbGVBbGxvd2luZ1RvQ3JlYXRlU21hcnRSdWxlKCk7XG4gICAgdGhpcy5pc0NyZWF0ZVNtYXJ0UnVsZXNCdXR0b25BdmFpbGFibGUgPVxuICAgICAgISF0aGlzLm5nMVNtYXJ0UnVsZXNVcGdyYWRlU2VydmljZSAmJlxuICAgICAgaXNTbWFydFJ1bGVzU2VydmljZVN1YnNjcmliZWQgJiZcbiAgICAgIGhhc0FueVJvbGVBbGxvd2luZ1RvQ3JlYXRlU21hcnRSdWxlO1xuICAgIHRoaXMudXNlckRldmljZU1hbmFnZW1lbnRBcHAkID0gdGhpcy5pbnRlckFwcFNlcnZpY2UuZ2V0QXBwJCh0aGlzLmRldmljZU1hbmFnZW1lbnRBcHBLZXkpO1xuICAgIHRoaXMuc2hvd1NvdXJjZU5hdmlnYXRpb25MaW5rJCA9IHRoaXMuaW50ZXJBcHBTZXJ2aWNlLnNob3VsZFNob3dBcHBMaW5rJChcbiAgICAgIHRoaXMuZGV2aWNlTWFuYWdlbWVudEFwcEtleVxuICAgICk7XG4gICAgdGhpcy50eXBlQ29sb3IgPSBhd2FpdCB0aGlzLmNvbG9yU2VydmljZS5nZW5lcmF0ZUNvbG9yKHRoaXMuc2VsZWN0ZWRBbGFybS50eXBlKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hhbmdlcy5zZWxlY3RlZEFsYXJtICYmIGNoYW5nZXMuc2VsZWN0ZWRBbGFybS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVsb2FkQXVkaXRMb2codHJ1ZSwgdHJ1ZSk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0YXR1c01lc3NhZ2UoKTtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmRldGFpbCh0aGlzLnNlbGVjdGVkQWxhcm0uc291cmNlLmlkKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGFybU1PID0gZGF0YTtcbiAgICAgIHRoaXMudXBkYXRlTGFzdFVwZGF0ZWREYXRlKHRoaXMuYXVkaXRMb2cuZGF0YVswXSk7XG4gICAgICB0aGlzLmN1c3RvbUZyYWdtZW50cyA9IHRoaXMuZ2V0Q3VzdG9tRnJhZ21lbnRzKHRoaXMuc2VsZWN0ZWRBbGFybSk7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlU21hcnRSdWxlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0NyZWF0ZVNtYXJ0UnVsZXNCdXR0b25BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5uZzFTbWFydFJ1bGVzVXBncmFkZVNlcnZpY2UuYWRkTmV3Rm9ySW5wdXRBbGFybUFuZE91dHB1dFVzZXJXaXRoVUkoXG4gICAgICB0aGlzLnNlbGVjdGVkQWxhcm0sXG4gICAgICB0aGlzLmFwcFN0YXRlLmN1cnJlbnRVc2VyLnZhbHVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBhbGFybSBzb3VyY2UgZGV2aWNlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBzb3VyY2UuXG4gICAqXG4gICAqIEBwYXJhbSBzb3VyY2VJZCAtIFRoZSBzb3VyY2UgaWQuXG4gICAqL1xuICBhc3luYyBnb1RvQWxhcm1Tb3VyY2Uoc291cmNlSWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5hbGFybVNlcnZpY2UuZGV0YWlsKHNvdXJjZUlkKTtcbiAgICBhd2FpdCB0aGlzLmludGVyQXBwU2VydmljZS5uYXZpZ2F0ZVRvQXBwKFxuICAgICAgdGhpcy5kZXZpY2VNYW5hZ2VtZW50QXBwS2V5LFxuICAgICAgYCMvZGV2aWNlLyR7ZGF0YS5zb3VyY2UuaWR9L2FsYXJtc2BcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZHMgYXVkaXQgbG9nIGRhdGEgYXN5bmNocm9ub3VzbHkuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYXVkaXQgcmVjb3JkcyB1c2luZyBgZ2V0QWxhcm1BdWRpdFJlY29yZHNgIGFuZCBvcHRpb25hbGx5IHVwZGF0ZXMgdGhlIGF1ZGl0IGxvZ3NcbiAgICogc3RhdGUgaW4gdGhlIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgYGlzU2V0QXVkaXRMb2dzYCBmbGFnLiBJdCBoYW5kbGVzIHRoZSBsb2FkaW5nIHN0YXRlIGFuZCBwb3RlbnRpYWxcbiAgICogZXJyb3JzIGR1cmluZyB0aGUgZmV0Y2ggb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gaXNSZXZlcnQgLSBBIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcmV0cmlldmUgYSAxMDAgKHNlZSBQQUdFX1NJWkUpIHJlY29yZHMgKHRydWUpXG4gICAqICAgICAgICAgICAgICAgICAgIG9yIG9ubHkgcmVjb3JkLCB0aGF0IGNocm9ub2xvZ2ljYWxseSB3aWxsIGJlIHRoZSBvbGRlc3Qgb25lIChmYWxzZSkuIERlZmF1bHRzIHRvIHRydWUuXG4gICAqICAgICAgICAgICAgICAgICAgIElmIHNldCB0byBmYWxzZSwgaXQgd2lsbCBzZXQgUEFHRV9TSVpFIHRvIDEgYW5kIHRyaWdnZXIgYSBsb2dpY1xuICAgKiAgICAgICAgICAgICAgICAgICBjb25jYXRlbmF0aW5nIGEgbW9zdCByZWNlbnQgcmVjb3JkIHdpdGggdGhlIHZlcnkgZmlyc3Qgb25lIHRvXG4gICAqICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSB0aGUgYWxhcm0gZHVyYXRpb24gKGNoYW5nZSB0byBDTEVBUkVEIHN0YXR1cykuXG4gICAqICAgICAgICAgICAgICAgICAgIEl0J3MgcGFzc2VkIHRvIHRoZSBgZ2V0QWxhcm1BdWRpdFJlY29yZHNgIG1ldGhvZC5cbiAgICogQHBhcmFtIGlzU2V0QXVkaXRMb2dzIC0gQSBib29sZWFuIGZsYWcgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmZXRjaGVkIGF1ZGl0IGxvZ3Mgc2hvdWxkIGJlIHNldCBpbiB0aGUgY29tcG9uZW50IHN0YXRlLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIGxpc3Qgb2YgYElBdWRpdFJlY29yZGAgb2JqZWN0cy5cbiAgICovXG4gIGFzeW5jIHJlbG9hZEF1ZGl0TG9nKFxuICAgIGlzUmV2ZXJ0ID0gdHJ1ZSxcbiAgICBpc1NldEF1ZGl0TG9ncyA9IGZhbHNlXG4gICk6IFByb21pc2U8SVJlc3VsdExpc3Q8SUF1ZGl0UmVjb3JkPj4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICBjb25zdCBhdWRpdExvZ3MgPSBhd2FpdCB0aGlzLmdldEFsYXJtQXVkaXRSZWNvcmRzKGlzUmV2ZXJ0KTtcblxuICAgICAgaWYgKGlzU2V0QXVkaXRMb2dzKSB7XG4gICAgICAgIHRoaXMuc2V0QXVkaXRMb2dzKGF1ZGl0TG9ncyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhdWRpdExvZ3M7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uVXBkYXRlRGV0YWlscyhzdGF0dXM6IEFsYXJtU3RhdHVzVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmlzQWxhcm1TdGF0dXNDaGFuZ2luZyA9IHRydWU7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZUFsYXJtU3RhdHVzKHN0YXR1cyk7XG4gICAgICBhd2FpdCB0aGlzLnJlbG9hZEF1ZGl0TG9nKHRydWUsIHRydWUpO1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdGF0dXNNZXNzYWdlKCk7XG4gICAgICB0aGlzLnVwZGF0ZUxhc3RVcGRhdGVkRGF0ZSh0aGlzLmF1ZGl0TG9nLmRhdGFbMF0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0FsYXJtU3RhdHVzQ2hhbmdpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZXRhaWxzQnV0dG9uQWN0aW9uKGJ1dHRvbjogQWxhcm1EZXRhaWxzQnV0dG9uLCBhbGFybTogSUFsYXJtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYnV0dG9uLmFjdGlvbihhbGFybSk7XG4gICAgbGV0IHNob3VsZFJlbG9hZDogYm9vbGVhbiB8IElBbGFybSA9IGZhbHNlO1xuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICBzaG91bGRSZWxvYWQgPSBhd2FpdCByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3VsZFJlbG9hZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVsb2FkKSB7XG4gICAgICBsZXQgYWxhcm06IElBbGFybTtcbiAgICAgIGlmIChzaG91bGRSZWxvYWQgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgeyBkYXRhOiB1cGRhdGVkQWxhcm0gfSA9IGF3YWl0IHRoaXMuYWxhcm1TZXJ2aWNlLmRldGFpbCh0aGlzLnNlbGVjdGVkQWxhcm0uaWQpO1xuICAgICAgICBhbGFybSA9IHVwZGF0ZWRBbGFybTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFsYXJtID0gc2hvdWxkUmVsb2FkO1xuICAgICAgfVxuICAgICAgdGhpcy5hbGFybXNWaWV3U2VydmljZS51cGRhdGVBbGFybUxpc3QoKTtcblxuICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc2VsZWN0ZWRBbGFybTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGFybSA9IGFsYXJtO1xuICAgICAgdGhpcy5uZ09uQ2hhbmdlcyh7XG4gICAgICAgIHNlbGVjdGVkQWxhcm06IHtcbiAgICAgICAgICBjdXJyZW50VmFsdWU6IGFsYXJtLFxuICAgICAgICAgIHByZXZpb3VzVmFsdWUsXG4gICAgICAgICAgZmlyc3RDaGFuZ2U6IGZhbHNlLFxuICAgICAgICAgIGlzRmlyc3RDaGFuZ2U6ICgpID0+IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlQWxhcm1TdGF0dXMoc3RhdHVzOiBBbGFybVN0YXR1c1R5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJ0aWFsbHlVcGRhdGVkQWxhcm06IFBhcnRpYWw8SUFsYXJtPiA9IHsgaWQ6IHRoaXMuc2VsZWN0ZWRBbGFybS5pZCwgc3RhdHVzIH07XG4gICAgYXdhaXQgdGhpcy5hbGFybVNlcnZpY2UudXBkYXRlKHBhcnRpYWxseVVwZGF0ZWRBbGFybSk7XG4gICAgY29uc3QgdHJhbnNsYXRlZFN0YXR1c0xhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoQUxBUk1fU1RBVFVTX0xBQkVMU1tzdGF0dXNdKTtcbiAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKFxuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnQWxhcm0gc3RhdHVzIGNoYW5nZWQgdG8ge3sgc3RhdHVzIH19JyksIHtcbiAgICAgICAgc3RhdHVzOiB0cmFuc2xhdGVkU3RhdHVzTGFiZWwudG9VcHBlckNhc2UoKVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc2VsZWN0ZWRBbGFybS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5hbGFybXNWaWV3U2VydmljZS51cGRhdGVBbGFybUxpc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGF1ZGl0IGxvZyBhbmQgYXBwZW5kcyB0aGUgbGFzdCBhdWRpdCByZWNvcmQgdG8gaXQuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgdGhlIGV4aXN0aW5nIGF1ZGl0IGxvZyBkYXRhIGFuZCBtYWtlcyBhIGRlZXAgY29weSBvZiBpdC4gSXQgdGhlblxuICAgKiByZXRyaWV2ZXMgdGhlIGxhc3QgYXVkaXQgcmVjb3JkIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjb3BpZWQgYXVkaXQgbG9nIGRhdGEuIFRoaXMgaXNcbiAgICogdXNlZnVsIGZvciBzY2VuYXJpb3Mgd2hlcmUgdGhlIG1vc3QgcmVjZW50IGF1ZGl0IHJlY29yZCBuZWVkcyB0byBiZSBpbmNsdWRlZCBpbiB0aGVcbiAgICogZXhpc3RpbmcgYXVkaXQgbG9nIGRhdGEgKGNhbGN1bGF0aW5nIHRoZSBDTEVBUkVEIHBlcmlvZCkuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSBvZiBgSVJlc3VsdExpc3Q8SUF1ZGl0UmVjb3JkPmAsIHdoaWNoIGluY2x1ZGVzIHRoZVxuICAgKiAgICAgICAgICBleGlzdGluZyBhdWRpdCBsb2cgZGF0YSBhbG9uZyB3aXRoIHRoZSBsYXN0IGF1ZGl0IHJlY29yZCBhcHBlbmRlZC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXVkaXRMb2dXaXRoRmlyc3RSZWNvcmQoKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+PiB7XG4gICAgY29uc3QgZXhpc3RpbmdEYXRhID0gdGhpcy5hdWRpdExvZztcbiAgICBjb25zdCBjb3BpZWRFeGlzdGluZ0RhdGEgPSBjbG9uZURlZXAoZXhpc3RpbmdEYXRhKTtcblxuICAgIGNvbnN0IGxhc3RBdWRpdFJlY29yZCA9IGF3YWl0IHRoaXMucmVsb2FkQXVkaXRMb2coZmFsc2UpO1xuICAgIGNvbnN0IGxhc3RSZWNvcmQgPSBsYXN0QXVkaXRSZWNvcmQuZGF0YVtsYXN0QXVkaXRSZWNvcmQuZGF0YS5sZW5ndGggLSAxXTtcbiAgICBjb3BpZWRFeGlzdGluZ0RhdGEuZGF0YS5wdXNoKGxhc3RSZWNvcmQpO1xuICAgIHJldHVybiBjb3BpZWRFeGlzdGluZ0RhdGE7XG4gIH1cblxuICBwcml2YXRlIHNldEF1ZGl0TG9ncyhhdWRpdExvZ3M6IElSZXN1bHRMaXN0PElBdWRpdFJlY29yZD4pOiB2b2lkIHtcbiAgICB0aGlzLmF1ZGl0TG9nID0gYXVkaXRMb2dzO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVMYXN0VXBkYXRlZERhdGUodXBkYXRlZEF1ZGl0UmVjb3JkczogSUF1ZGl0UmVjb3JkKTogdm9pZCB7XG4gICAgaWYgKCF1cGRhdGVkQXVkaXRSZWNvcmRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBjcmVhdGlvblRpbWUgfSA9IHVwZGF0ZWRBdWRpdFJlY29yZHM7XG4gICAgdGhpcy5sYXN0VXBkYXRlZCA9IGNyZWF0aW9uVGltZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWN0aXZlU3RhdHVzTWVzc2FnZSh0aW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdBQ1RJVkVgYWxhcm1gOiB0cmlnZ2VyZWQge3thbGFybVRpbWVGcm9tTm93fX0nKSwge1xuICAgICAgYWxhcm1UaW1lRnJvbU5vdzogdGhpcy5yZWxhdGl2ZVRpbWUudHJhbnNmb3JtKG5ldyBEYXRlKHRpbWUpKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY2tub3dsZWRnZWRTdGF0dXNNZXNzYWdlKHN0YXR1czogQWxhcm1TdGF0dXNUeXBlLCBjaGFuZ2VMb2c6IElBdWRpdFJlY29yZFtdKTogc3RyaW5nIHtcbiAgICBpZiAoY2hhbmdlTG9nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGdldHRleHQoJ0FDS05PV0xFREdFRGBhbGFybWAnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNrbm93bGVkZ2VkQnkgPSB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuZ2V0QWNrbm93bGVkZ2VkQnkoc3RhdHVzLCBjaGFuZ2VMb2cpO1xuICAgIGNvbnN0IGFja25vd2xlZGdlVGltZSA9IHRoaXMuYWxhcm1EZXRhaWxzU2VydmljZS5nZXRBY2tub3dsZWRnZVRpbWUoY2hhbmdlTG9nKTtcblxuICAgIGlmIChhY2tub3dsZWRnZWRCeSkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICBnZXR0ZXh0KCdBQ0tOT1dMRURHRURgYWxhcm1gIGJ5OiB7e2Fja0J5fX0ge3thY2tUaW1lRnJvbU5vd319JyksXG4gICAgICAgIHtcbiAgICAgICAgICBhY2tCeTogYWNrbm93bGVkZ2VkQnksXG4gICAgICAgICAgYWNrVGltZUZyb21Ob3c6IHRoaXMucmVsYXRpdmVUaW1lLnRyYW5zZm9ybShuZXcgRGF0ZShhY2tub3dsZWRnZVRpbWUpKVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdBQ0tOT1dMRURHRURgYWxhcm1gIHt7YWNrVGltZUZyb21Ob3d9fScpLCB7XG4gICAgICBhY2tUaW1lRnJvbU5vdzogdGhpcy5yZWxhdGl2ZVRpbWUudHJhbnNmb3JtKG5ldyBEYXRlKGFja25vd2xlZGdlVGltZSkpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENsZWFyZWRTdGF0dXNNZXNzYWdlKGF1ZGl0TG9nOiBJQXVkaXRSZWNvcmRbXSk6IHN0cmluZyB7XG4gICAgaWYgKGF1ZGl0TG9nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGdldHRleHQoJ0NMRUFSRURgYWxhcm1gJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGRpZmZlcmVuY2VJbk1zID0gdGhpcy5jYWxjdWxhdGVBbGFybUR1cmF0aW9uKGF1ZGl0TG9nKTtcblxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgIGdldHRleHQoJ0NMRUFSRURgYWxhcm1gOiB3YXMgYWN0aXZlIGZvciB7e2FsYXJtRHVyYXRpb259fScpLFxuICAgICAge1xuICAgICAgICBhbGFybUR1cmF0aW9uOiB0aGlzLnJlbGF0aXZlVGltZS50cmFuc2Zvcm0oZGlmZmVyZW5jZUluTXMsIHRydWUpXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBkdXJhdGlvbiBvZiBhbiBhbGFybSBiYXNlZCBvbiBhdWRpdCBsb2cgcmVjb3Jkcy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY29tcHV0ZXMgdGhlIGR1cmF0aW9uIG9mIGFuIGFsYXJtIGJ5IGZpbmRpbmcgdGhlIGRpZmZlcmVuY2VcbiAgICogYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB0aW1lcyBvZiB0aGUgYWxhcm0uIFRoZSBzdGFydCB0aW1lIGlzIGRldGVybWluZWRcbiAgICogZnJvbSB0aGUgbGFzdCByZWNvcmQgaW4gdGhlIGF1ZGl0IGxvZywgdXNpbmcgdGhlIGZpcnN0IGF2YWlsYWJsZSB0aW1lIGZpZWxkXG4gICAqIChgZmlyc3RPY2N1cnJlbmNlVGltZWAsIGB0aW1lYCwgb3IgYGNyZWF0aW9uVGltZWApLiBUaGUgZW5kIHRpbWUgaXMgb2J0YWluZWRcbiAgICogZnJvbSB0aGUgYGFsYXJtRGV0YWlsc1NlcnZpY2VgLlxuICAgKlxuICAgKiBAcGFyYW0gYXVkaXRMb2cgLSBBbiBhcnJheSBvZiBgSUF1ZGl0UmVjb3JkYCBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgYXVkaXQgbG9nIHJlY29yZHMuXG4gICAqIEByZXR1cm5zIFRoZSBkdXJhdGlvbiBvZiB0aGUgYWxhcm0gaW4gbWlsbGlzZWNvbmRzLCBvciBgbnVsbGAgaWYgdGhlIGVuZCB0aW1lIGlzIG5vdCBhdmFpbGFibGUuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUFsYXJtRHVyYXRpb24oYXVkaXRMb2c6IElBdWRpdFJlY29yZFtdKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgZmlyc3RBbGFybSA9IGF1ZGl0TG9nW2F1ZGl0TG9nLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IGZpcnN0QWxhcm0uZmlyc3RPY2N1cnJlbmNlVGltZSB8fCBmaXJzdEFsYXJtLnRpbWUgfHwgZmlyc3RBbGFybS5jcmVhdGlvblRpbWU7XG4gICAgY29uc3QgZW5kVGltZSA9IHRoaXMuYWxhcm1EZXRhaWxzU2VydmljZS5nZXRFbmRUaW1lKGF1ZGl0TG9nKTtcblxuICAgIGlmICghZW5kVGltZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lVG9EYXRlID0gbmV3IERhdGUoc3RhcnRUaW1lKTtcbiAgICBjb25zdCBlbmRUaW1lVG9EYXRlID0gbmV3IERhdGUoZW5kVGltZSk7XG5cbiAgICByZXR1cm4gZW5kVGltZVRvRGF0ZS5nZXRUaW1lKCkgLSBzdGFydFRpbWVUb0RhdGUuZ2V0VGltZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIGxpc3Qgb2YgYXVkaXQgcmVjb3JkcyBmb3IgYSBzZWxlY3RlZCBhbGFybS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgZmV0Y2hlcyBhdWRpdCByZWNvcmRzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcywgaW5jbHVkaW5nXG4gICAqIHRoZSBkYXRlLCBwYWdlIHNpemUsIHdoZXRoZXIgdG8gcmV2ZXJ0LCB0aGUgc291cmNlIGFsYXJtIElELCBhbmQgd2hldGhlciB0byBpbmNsdWRlIHRvdGFsIHBhZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gaXNSZXZlcnQgLSBBIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcmV0cmlldmUgYSAxMDAgKHNlZSBQQUdFX1NJWkUpIHJlY29yZHMgKHRydWUpXG4gICAqICAgICAgICAgICAgICAgICAgIG9yIG9ubHkgcmVjb3JkLCB0aGF0IGNocm9ub2xvZ2ljYWxseSB3aWxsIGJlIHRoZSBvbGRlc3Qgb25lIChmYWxzZSkuIERlZmF1bHRzIHRvIHRydWUuXG4gICAqICAgICAgICAgICAgICAgICAgIElmIHNldCB0byBmYWxzZSwgaXQgd2lsbCBzZXQgUEFHRV9TSVpFIHRvIDEgYW5kIHRyaWdnZXIgYSBsb2dpY1xuICAgKiAgICAgICAgICAgICAgICAgICBjb25jYXRlbmF0aW5nIGEgbW9zdCByZWNlbnQgcmVjb3JkIHdpdGggdGhlIHZlcnkgZmlyc3Qgb25lIHRvXG4gICAqICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSB0aGUgYWxhcm0gZHVyYXRpb24gKGNoYW5nZSB0byBDTEVBUkVEIHN0YXR1cykuXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIElSZXN1bHRMaXN0IG9mIElBdWRpdFJlY29yZCBvYmplY3RzLCByZXByZXNlbnRpbmcgdGhlIGF1ZGl0IHJlY29yZHMuXG4gICAqIEBhc3luY1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRBbGFybUF1ZGl0UmVjb3Jkcyhpc1JldmVydCA9IHRydWUpOiBQcm9taXNlPElSZXN1bHRMaXN0PElBdWRpdFJlY29yZD4+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgZGF0ZVRvOiBuZXcgRGF0ZShEYXRlLm5vdygpKS50b0lTT1N0cmluZygpLFxuICAgICAgcGFnZVNpemU6IGlzUmV2ZXJ0ID8gdGhpcy5QQUdFX1NJWkUgOiAxLFxuICAgICAgcmV2ZXJ0OiBpc1JldmVydCxcbiAgICAgIHNvdXJjZTogdGhpcy5zZWxlY3RlZEFsYXJtLmlkLFxuICAgICAgd2l0aFRvdGFsUGFnZXM6IHRydWVcbiAgICB9O1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYXVkaXRTZXJ2aWNlLmxpc3QocHJvcGVydGllcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVN0YXR1c01lc3NhZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkQWxhcm0uc3RhdHVzKSB7XG4gICAgICBjYXNlIHRoaXMuQUNUSVZFX1NUQVRVU19WQUxVRTpcbiAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlID0gdGhpcy5nZXRBY3RpdmVTdGF0dXNNZXNzYWdlKHRoaXMuc2VsZWN0ZWRBbGFybS50aW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHRoaXMuQUNLTk9XTEVER0VEX1NUQVRVU19WQUxVRTpcbiAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlID0gdGhpcy5nZXRBY2tub3dsZWRnZWRTdGF0dXNNZXNzYWdlKFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBbGFybS5zdGF0dXMgYXMgdW5rbm93biBhcyBBbGFybVN0YXR1c1R5cGUsXG4gICAgICAgICAgdGhpcy5hdWRpdExvZy5kYXRhXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0aGlzLkNMRUFSRURfU1RBVFVTX1ZBTFVFOlxuICAgICAgICBpZiAodGhpcy5oYXNSZWFjaGVkT3JFeGNlZWRlZFBhZ2VTaXplTGltaXQoKSkge1xuICAgICAgICAgIHRoaXMuZXh0ZW5kZWRBdWRpdExvZ3MgPSBhd2FpdCB0aGlzLmF1ZGl0TG9nV2l0aEZpcnN0UmVjb3JkKCk7XG4gICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlID0gdGhpcy5nZXRDbGVhcmVkU3RhdHVzTWVzc2FnZSh0aGlzLmV4dGVuZGVkQXVkaXRMb2dzLmRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UgPSB0aGlzLmdldENsZWFyZWRTdGF0dXNNZXNzYWdlKHRoaXMuYXVkaXRMb2cuZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzUmVhY2hlZE9yRXhjZWVkZWRQYWdlU2l6ZUxpbWl0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmF1ZGl0TG9nLmRhdGEubGVuZ3RoID49IHRoaXMuUEFHRV9TSVpFO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDdXN0b21GcmFnbWVudHMoc2VsZWN0ZWRBbGFybTogSUFsYXJtKTogQ3VzdG9tRnJhZ21lbnQge1xuICAgIGxldCBjdXN0b21Qcm9wZXJ0aWVzID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzZWxlY3RlZEFsYXJtKSB7XG4gICAgICBpZiAoIUFMQVJNX0RFRkFVTFRfUFJPUEVSVElFUy5maW5kKGsgPT4gayA9PT0ga2V5KSkge1xuICAgICAgICBpZiAoIWN1c3RvbVByb3BlcnRpZXMpIHtcbiAgICAgICAgICBjdXN0b21Qcm9wZXJ0aWVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY3VzdG9tUHJvcGVydGllc1trZXldID0gc2VsZWN0ZWRBbGFybVtrZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdXN0b21Qcm9wZXJ0aWVzO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4IHJvdyB0aWdodC1ncmlkIGZsZXgtd3JhcCBhLWktc3RyZXRjaFwiPlxuICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1tZC02IGQtZmxleCBwLWItOFwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3JkZXItYWxsIGZpdC13IGQtZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtOFwiPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiaWNvbi0yNCB0ZXh0LWdyYXktZGFyayBtLXQtNCBjOHktaWNvblwiXG4gICAgICAgICAgW2M4eUljb25dPVwic2VsZWN0ZWRBbGFybS5zdGF0dXMgfCBBbGFybVN0YXR1c1RvSWNvblwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtOCBwLWItOCBwLXItOFwiPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnU3RhdHVzJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJzbWFsbFwiPnt7IHN0YXR1c01lc3NhZ2UgfX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wteHMtMTIgY29sLW1kLTYgZC1mbGV4IHAtYi04XCI+XG4gICAgPGRpdiBjbGFzcz1cImJvcmRlci1hbGwgZml0LXcgZC1mbGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicC04XCI+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJpY29uLTI0IHRleHQtZ3JheS1kYXJrIG0tdC00IHN0cm9rZWQtaWNvbiBzdGF0dXNcIlxuICAgICAgICAgIFtjOHlJY29uXT1cInNlbGVjdGVkQWxhcm0uc2V2ZXJpdHkgfCBBbGFybVNldmVyaXR5VG9JY29uXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RlZEFsYXJtLnNldmVyaXR5Py50b1N0cmluZygpIHwgbG93ZXJjYXNlXCJcbiAgICAgICAgPjwvaT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInAtdC04IHAtYi04IHAtci04XCI+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWItMCBtLXItOFwiPnt7ICdTZXZlcml0eScgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgIDxwIGNsYXNzPVwic21hbGxcIj57eyBTRVZFUklUWV9MQUJFTFNbc2VsZWN0ZWRBbGFybS5zZXZlcml0eV0gfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wteHMtMTIgY29sLW1kLTYgZC1mbGV4IHAtYi04XCI+XG4gICAgPGRpdiBjbGFzcz1cImJvcmRlci1hbGwgZml0LXcgZC1mbGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicC04XCI+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJpY29uLTI0IHRleHQtZ3JheS1kYXJrIG0tdC00IHN0cm9rZWQtaWNvbiBzdGF0dXNcIlxuICAgICAgICAgIGM4eUljb249XCJjb250YWN0bGVzcy1wYXltZW50XCJcbiAgICAgICAgPjwvaT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInAtdC04IHAtYi04IHAtci04XCI+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWItMCBtLXItOFwiPnt7ICdTb3VyY2UnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8cCBjbGFzcz1cInNtYWxsXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG4tbGluayB0ZXh0LW11dGVkIHAtMCBtLXItOCB0ZXh0LWxlZnRcIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyBzZWxlY3RlZEFsYXJtLnNvdXJjZS5uYW1lIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgcm91dGVyTGluaz1cInt7IHNlbGVjdGVkQWxhcm1NTyB8IGFzc2V0TGluayB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaWNvbi1mbGV4XCI+XG4gICAgICAgICAgICAgIDxpIGM4eUljb249XCJleGNoYW5nZVwiPjwvaT5cbiAgICAgICAgICAgICAge3sgc2VsZWN0ZWRBbGFybS5zb3VyY2UubmFtZSB8fCBzZWxlY3RlZEFsYXJtLnNvdXJjZS5pZCB9fVxuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1NvdXJjZU5hdmlnYXRpb25MaW5rJCB8IGFzeW5jXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWxpbmsgcC0wIHRleHQtbGVmdFwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3tcbiAgICAgICAgICAgICAgICBsaW5rVGl0bGVcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IGFwcE5hbWU6IHVzZXJEZXZpY2VNYW5hZ2VtZW50QXBwJCB8IGFzeW5jIHwgaHVtYW5pemVBcHBOYW1lIHwgYXN5bmMgfVxuICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub0FsYXJtU291cmNlKHNlbGVjdGVkQWxhcm0uaWQpXCJcbiAgICAgICAgICAgICAgZGF0YS1jeT1cImFsYXJtLWRldGFpbHMtZGV2aWNlLW1hbmFnZW1lbnQtbGlua1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHVzZXJEZXZpY2VNYW5hZ2VtZW50QXBwJCB8IGFzeW5jIHwgaHVtYW5pemVBcHBOYW1lIHwgYXN5bmMgfX1cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImV4dGVybmFsLWxpbmtcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1tZC02IGQtZmxleCBwLWItOFwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3JkZXItYWxsIGZpdC13IGQtZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtOFwiPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwiY2lyY2xlLWljb24td3JhcHBlclwiXG4gICAgICAgICAgW25nU3R5bGVdPVwieyAnYmFja2dyb3VuZC1jb2xvcic6IHR5cGVDb2xvciB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cInN0cm9rZWQtaWNvblwiXG4gICAgICAgICAgICBjOHlJY29uPVwiYmVsbFwiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicC10LTggcC1iLTggcC1yLTggbWluLXdpZHRoLTBcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tYi0wIG0tci04XCI+e3sgJ1R5cGUnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8cFxuICAgICAgICAgIGNsYXNzPVwic21hbGwgdGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgdGl0bGU9XCJ7eyBzZWxlY3RlZEFsYXJtLnR5cGUgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAgPGNvZGU+e3sgc2VsZWN0ZWRBbGFybS50eXBlIH19PC9jb2RlPlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtbWQtMTIgcC1iLTE2XCI+XG4gICAgPGRpdiBjbGFzcz1cImJvcmRlci1hbGwgZml0LXcgZC1mbGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicC04XCI+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJpY29uLTI0IHRleHQtZ3JheS1kYXJrIG0tdC00XCJcbiAgICAgICAgICBjOHlJY29uPVwiY2FsZW5kYXJcIlxuICAgICAgICA+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicC10LTggcC1iLTAgcC1yLTggZmxleC1ncm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWZsZXgtNTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTQgcC1iLThcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWItMCBtLXItOFwiPnt7ICdMYXN0IHVwZGF0ZWQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJzbWFsbFwiPlxuICAgICAgICAgICAgICB7eyBsYXN0VXBkYXRlZCB8IGM4eURhdGU6ICdtZWRpdW0nIH19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJjb2wtNCBwLWItOFwiXG4gICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkQWxhcm0uY291bnQgPiAxXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnTnVtYmVyIG9mIG9jY3VycmVuY2VzJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLWluZm9cIj57eyBzZWxlY3RlZEFsYXJtLmNvdW50IH19PC9zcGFuPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiY29sLTQgcC1iLThcIlxuICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEFsYXJtLmNvdW50ID4gMVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tYi0wIG0tci04XCI+e3sgJ0ZpcnN0IG9jY3VycmVuY2UnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJzbWFsbFwiPlxuICAgICAgICAgICAgICB7eyBzZWxlY3RlZEFsYXJtLmNyZWF0aW9uVGltZSB8IGM4eURhdGU6ICdtZWRpdW0nIH19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cImNvbC14cy0xMiBjb2wtbWQtMTIgcC1iLTE2XCJcbiAgICAqbmdJZj1cImN1c3RvbUZyYWdtZW50c1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLWFsbCBmaXQtdyBkLWZsZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLThcIj5cbiAgICAgICAgPGlcbiAgICAgICAgICBjbGFzcz1cImljb24tMjQgdGV4dC1ncmF5LWRhcmsgbS10LTRcIlxuICAgICAgICAgIGM4eUljb249XCJvdXRnb2luZy1kYXRhXCJcbiAgICAgICAgPjwvaT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInAtdC04IHAtYi0wIHAtci04IGZsZXgtZ3Jvd1wiXG4gICAgICAgIGRhdGEtY3k9XCJhbGFybS1kZXRhaWxzLWN1c3RvbS1kYXRhXCJcbiAgICAgID5cbiAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tYi00IG0tci04XCI+e3sgJ0N1c3RvbSBkYXRhJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgPHByZT48Y29kZT57eyBjdXN0b21GcmFnbWVudHMgfCBqc29uIH19PC9jb2RlPjwvcHJlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC13cmFwIGdhcC04XCI+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc21cIlxuICAgIFt0aXRsZV09XCInUmVsb2FkIGF1ZGl0IGxvZ3MnIHwgdHJhbnNsYXRlXCJcbiAgICB0eXBlPVwic3VibWl0XCJcbiAgICAoY2xpY2spPVwicmVsb2FkQXVkaXRMb2codHJ1ZSwgdHJ1ZSlcIlxuICA+XG4gICAgPGlcbiAgICAgIGM4eUljb249XCJyZWZyZXNoXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2ljb24tc3Bpbic6IGlzTG9hZGluZyB9XCJcbiAgICA+PC9pPlxuICAgIHt7ICdSZWxvYWQgYXVkaXQgbG9ncycgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgW3RpdGxlXT1cIlxuICAgICAgc2VsZWN0ZWRBbGFybS5zdGF0dXMgIT09IEFDS05PV0xFREdFRF9TVEFUVVNfVkFMVUVcbiAgICAgICAgPyAoQUNLTk9XTEVER0VfTEFCRUwgfCB0cmFuc2xhdGUpXG4gICAgICAgIDogKFJFQUNUSVZBVEVfTEFCRUwgfCB0cmFuc2xhdGUpXG4gICAgXCJcbiAgICB0eXBlPVwic3VibWl0XCJcbiAgICAoY2xpY2spPVwiXG4gICAgICBvblVwZGF0ZURldGFpbHMoXG4gICAgICAgIHNlbGVjdGVkQWxhcm0uc3RhdHVzICE9PSBBQ0tOT1dMRURHRURfU1RBVFVTX1ZBTFVFXG4gICAgICAgICAgPyBBQ0tOT1dMRURHRURfU1RBVFVTX1ZBTFVFXG4gICAgICAgICAgOiBBQ1RJVkVfU1RBVFVTX1ZBTFVFXG4gICAgICApXG4gICAgXCJcbiAgICBbZGlzYWJsZWRdPVwic2VsZWN0ZWRBbGFybS5zdGF0dXMgPT09IENMRUFSRURfU1RBVFVTX1ZBTFVFIHx8IGlzQWxhcm1TdGF0dXNDaGFuZ2luZ1wiXG4gID5cbiAgICA8aVxuICAgICAgW2M4eUljb25dPVwic2VsZWN0ZWRBbGFybS5zdGF0dXMgIT09IEFDS05PV0xFREdFRF9TVEFUVVNfVkFMVUUgPyBCRUxMX1NMQVNIX0lDT04gOiBCRUxMX0lDT05cIlxuICAgID48L2k+XG4gICAge3tcbiAgICAgIHNlbGVjdGVkQWxhcm0uc3RhdHVzICE9PSBBQ0tOT1dMRURHRURfU1RBVFVTX1ZBTFVFXG4gICAgICAgID8gKEFDS05PV0xFREdFX0xBQkVMIHwgdHJhbnNsYXRlKVxuICAgICAgICA6IChSRUFDVElWQVRFX0xBQkVMIHwgdHJhbnNsYXRlKVxuICAgIH19XG4gIDwvYnV0dG9uPlxuXG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc21cIlxuICAgIFt0aXRsZV09XCInQ3JlYXRlIHNtYXJ0IHJ1bGUnIHwgdHJhbnNsYXRlXCJcbiAgICB0eXBlPVwic3VibWl0XCJcbiAgICAqbmdJZj1cImlzQ3JlYXRlU21hcnRSdWxlc0J1dHRvbkF2YWlsYWJsZVwiXG4gICAgKGNsaWNrKT1cImNyZWF0ZVNtYXJ0UnVsZSgpXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJjOHktaWNvbiBjOHktaWNvbi1zbWFydC1ydWxlc1wiPjwvaT5cbiAgICB7eyAnQ3JlYXRlIHNtYXJ0IHJ1bGUnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICBbdGl0bGVdPVwiJ0NsZWFyYGFsYXJtYCcgfCB0cmFuc2xhdGVcIlxuICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgIChjbGljayk9XCJvblVwZGF0ZURldGFpbHMoQ0xFQVJFRF9TVEFUVVNfVkFMVUUpXCJcbiAgICBbZGlzYWJsZWRdPVwic2VsZWN0ZWRBbGFybS5zdGF0dXMgPT09IENMRUFSRURfU1RBVFVTX1ZBTFVFXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJjOHktYWxlcnQtaWRsZVwiPjwvaT5cbiAgICB7eyAnQ2xlYXJgYWxhcm1gJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cblxuICA8YnV0dG9uXG4gICAgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBzZWxlY3RlZEFsYXJtIHwgYWxhcm1EZXRhaWxzQnV0dG9uOiBzZWxlY3RlZEFsYXJtTU8gfCBhc3luY1wiXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICBbbmdDbGFzc109XCJidXR0b24uYWRkaXRpb25hbEJ1dHRvbkNsYXNzZXNcIlxuICAgIFt0aXRsZV09XCJidXR0b24udGl0bGUgfCB0cmFuc2xhdGVcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJkZXRhaWxzQnV0dG9uQWN0aW9uKGJ1dHRvbiwgc2VsZWN0ZWRBbGFybSlcIlxuICAgIFtkaXNhYmxlZF09XCJidXR0b24uZGlzYWJsZWRcIlxuICA+XG4gICAgPGkgW25nQ2xhc3NdPVwiYnV0dG9uLmFkZGl0aW9uYWxJY29uQ2xhc3Nlc1wiIFtjOHlJY29uXT1cImJ1dHRvbi5pY29uXCI+PC9pPlxuICAgIDxzcGFuICpuZ0lmPVwiYnV0dG9uLmxhYmVsXCI+e3sgYnV0dG9uLmxhYmVsIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICA8L2J1dHRvbj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI25vQXVkaXRMb2dBdmFpbGFibGU+XG4gIDxkaXYgY2xhc3M9XCJwLTE2XCI+XG4gICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgW2ljb25dPVwiJ2FyY2hpdmUnXCJcbiAgICAgIFt0aXRsZV09XCInTm8gYXVkaXQgbG9ncyBmb3VuZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtob3Jpem9udGFsXT1cInRydWVcIlxuICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2IGNsYXNzPVwibGVnZW5kIGZvcm0tYmxvY2tcIj57eyAnQXVkaXQgbG9ncycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZyB8fCBhdWRpdExvZz8uZGF0YS5sZW5ndGg7IGVsc2Ugbm9BdWRpdExvZ0F2YWlsYWJsZVwiPlxuICA8Yzh5LWxvYWRpbmcgKm5nSWY9XCJpc0xvYWRpbmdcIj48L2M4eS1sb2FkaW5nPlxuXG4gIDxjOHktbGlzdC1ncm91cFxuICAgIGRhdGEtY3k9XCJjOHktYWxhcm1zLWRldGFpbHMtLWF1ZGl0LWxvZ3NcIlxuICAgICpuZ0lmPVwiIWlzTG9hZGluZ1wiXG4gID5cbiAgICA8Yzh5LWxpLXRpbWVsaW5lICpjOHlGb3I9XCJsZXQgbG9nIG9mIGF1ZGl0TG9nOyBsb2FkTW9yZTogJ2hpZGRlbidcIj5cbiAgICAgIHt7IGxvZy5jcmVhdGlvblRpbWUgfCBkYXRlOiAnbWVkaXVtRGF0ZScgfX1cbiAgICAgIHt7IGxvZy5jcmVhdGlvblRpbWUgfCBkYXRlOiAnbWVkaXVtVGltZScgfX1cbiAgICAgIDxjOHktbGk+XG4gICAgICAgIDxjOHktbGktYm9keT5cbiAgICAgICAgICA8cCBjbGFzcz1cInRleHQtdHJ1bmNhdGUtd3JhcCBzZXBhcmF0b3ItYm90dG9tIHAtYi00XCI+XG4gICAgICAgICAgICB7eyBsb2cgfCBhdWRpdENoYW5nZXNNZXNzYWdlIH19XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjOHktbGlzdF9faXRlbV9fZm9vdGVyXCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cIm0tci0xNiBzbWFsbFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwibG9nLnVzZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGxcIj5cbiAgICAgICAgICAgICAgICB7eyAnYnlgdXNlcmAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAge3sgbG9nLnVzZXIgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21hbGxcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCI+XG4gICAgICAgICAgICAgICAge3sgJ2RldmljZSB0aW1lJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIHt7IGxvZy50aW1lIHwgYzh5RGF0ZTogJ21lZGl1bScgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9jOHktbGktYm9keT5cbiAgICAgIDwvYzh5LWxpPlxuICAgIDwvYzh5LWxpLXRpbWVsaW5lPlxuICA8L2M4eS1saXN0LWdyb3VwPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import { AlarmStatus } from '@c8y/client';
|
|
3
|
-
import {
|
|
4
|
-
import { firstValueFrom, map, shareReplay } from 'rxjs';
|
|
3
|
+
import { Permissions } from '@c8y/ngx-components';
|
|
5
4
|
import * as i0 from "@angular/core";
|
|
6
5
|
import * as i1 from "@c8y/ngx-components";
|
|
7
6
|
export class AlarmDetailsService {
|
|
8
|
-
constructor(
|
|
9
|
-
this.stateService = stateService;
|
|
7
|
+
constructor(permissions) {
|
|
10
8
|
this.permissions = permissions;
|
|
11
|
-
this.SMART_RULES_APPLICATION_KEY = 'smartrule-key';
|
|
12
|
-
this.DEVICE_MANAGEMENT_APPLICATION_KEY = 'devicemanagement-application-key';
|
|
13
9
|
this.STATUS_ATTRIBUTE = 'status';
|
|
14
10
|
}
|
|
15
11
|
/**
|
|
@@ -112,22 +108,6 @@ export class AlarmDetailsService {
|
|
|
112
108
|
}
|
|
113
109
|
return latestClearedAuditTime || auditLog[0].creationTime;
|
|
114
110
|
}
|
|
115
|
-
/**
|
|
116
|
-
* Retrieves a specified application based on the provided application key.
|
|
117
|
-
*
|
|
118
|
-
* This method first checks if the requested application, identified by its key (which could belong to Device Management
|
|
119
|
-
* or Smart Rules Microservice), is present in the user's current applications cache. If not found in the cache,
|
|
120
|
-
* it fetches the application from the list of current user's applications, which is maintained by the state service.
|
|
121
|
-
*
|
|
122
|
-
* The application is searched by its key, and this method returns a promise that either resolves to the found application
|
|
123
|
-
* or undefined if the application with the specified key does not exist.
|
|
124
|
-
*
|
|
125
|
-
* @param applicationKey The key of the application to retrieve.
|
|
126
|
-
* @returns A promise that resolves to the requested application or undefined if the application is not found.
|
|
127
|
-
*/
|
|
128
|
-
async getApplication(applicationKey) {
|
|
129
|
-
return await firstValueFrom(this.stateService.currentAppsOfUser.pipe(map(apps => apps.find(app => app.key === applicationKey)), shareReplay(1)));
|
|
130
|
-
}
|
|
131
111
|
checkIfHasAnyRoleAllowingToCreateSmartRule() {
|
|
132
112
|
const ROLES_ALLOWING_SMART_RULE_CREATION = [
|
|
133
113
|
[
|
|
@@ -141,7 +121,7 @@ export class AlarmDetailsService {
|
|
|
141
121
|
return (this.permissions.hasAnyRole(ROLES_ALLOWING_SMART_RULE_CREATION[0]) &&
|
|
142
122
|
this.permissions.hasAnyRole(ROLES_ALLOWING_SMART_RULE_CREATION[1]));
|
|
143
123
|
}
|
|
144
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsService, deps: [{ token: i1.
|
|
124
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsService, deps: [{ token: i1.Permissions }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
145
125
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsService, providedIn: 'root' }); }
|
|
146
126
|
}
|
|
147
127
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsService, decorators: [{
|
|
@@ -149,5 +129,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
149
129
|
args: [{
|
|
150
130
|
providedIn: 'root'
|
|
151
131
|
}]
|
|
152
|
-
}], ctorParameters: () => [{ type: i1.
|
|
153
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxhcm0tZGV0YWlscy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYWxhcm1zL2FsYXJtLWRldGFpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBK0MsV0FBVyxFQUFXLE1BQU0sYUFBYSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFLeEQsTUFBTSxPQUFPLG1CQUFtQjtJQU05QixZQUNVLFlBQTZCLEVBQzdCLFdBQXdCO1FBRHhCLGlCQUFZLEdBQVosWUFBWSxDQUFpQjtRQUM3QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQVB6QixnQ0FBMkIsR0FBRyxlQUFlLENBQUM7UUFDOUMsc0NBQWlDLEdBQUcsa0NBQWtDLENBQUM7UUFFL0QscUJBQWdCLEdBQUcsUUFBUSxDQUFDO0lBSzFDLENBQUM7SUFFSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bd0JHO0lBQ0gsaUJBQWlCLENBQUMsTUFBdUIsRUFBRSxRQUF3QjtRQUNqRSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFMUIsSUFBSSxNQUFNLEtBQUssV0FBVyxDQUFDLFlBQVksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMzRSxPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDO1FBRUQsY0FBYyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFbEMsT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxFQUFFO1lBQ2hELE1BQU0sT0FB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QVcsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMENBQTBDO1FBQ3hDLE1BQU0sa0NBQWtDLEdBQUc7WUFDekM7Z0JBQ0UsV0FBVyxDQUFDLG9CQUFvQjtnQkFDaEMsV0FBVyxDQUFDLHFCQUFxQjtnQkFDakMsV0FBVyxDQUFDLHlCQUF5QjtnQkFDckMsV0FBVyxDQUFDLDBCQUEwQjthQUN2QztZQUNELENBQUMsV0FBVyxDQUFDLHlCQUF5QixFQUFFLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQztTQUMxRSxDQUFDO1FBRUYsT0FBTyxDQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ25FLENBQUM7SUFDSixDQUFDOzhHQXhLVSxtQkFBbUI7a0hBQW5CLG1CQUFtQixjQUZsQixNQUFNOzsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWxhcm1TdGF0dXNUeXBlLCBJQXBwbGljYXRpb24sIElBdWRpdFJlY29yZCwgQWxhcm1TdGF0dXMsIElDaGFuZ2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UsIFBlcm1pc3Npb25zIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBbGFybURldGFpbHNTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgU01BUlRfUlVMRVNfQVBQTElDQVRJT05fS0VZID0gJ3NtYXJ0cnVsZS1rZXknO1xuICByZWFkb25seSBERVZJQ0VfTUFOQUdFTUVOVF9BUFBMSUNBVElPTl9LRVkgPSAnZGV2aWNlbWFuYWdlbWVudC1hcHBsaWNhdGlvbi1rZXknO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgU1RBVFVTX0FUVFJJQlVURSA9ICdzdGF0dXMnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RhdGVTZXJ2aWNlOiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZXJtaXNzaW9uczogUGVybWlzc2lvbnNcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHdobyBhY2tub3dsZWRnZWQgYW4gYWxhcm0gc3RhdHVzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHByb3ZpZGVkIHN0YXR1cyBpcyBlcXVhbCB0byB0aGUgYWNrbm93bGVkZ2VkXG4gICAqIHN0YXR1cy4gSWYgaXQgaXMgbm90LCBvciBpZiB0aGVcbiAgICogYXVkaXQgbG9nIGlzIGVtcHR5IG9yIHRoZSBmaXJzdCBsb2cgaXRlbSBkb2VzIG5vdCBjb250YWluIGEgdXNlciwgdGhlXG4gICAqIG1ldGhvZCByZXR1cm5zIGEgZGVmYXVsdCB2YWx1ZSAoJy0tJykuXG4gICAqXG4gICAqIElmIHRoZSBzdGF0dXMgaXMgdGhlIGFja25vd2xlZGdlZCBzdGF0dXMgYW5kIHRoZSBhdWRpdCBsb2cgY29udGFpbnMgdmFsaWRcbiAgICogcmVjb3JkcywgdGhlIG1ldGhvZCBpdGVyYXRlcyBvdmVyIHRoZSBhdWRpdCByZWNvcmRzIGluIHJldmVyc2Ugb3JkZXJcbiAgICogKHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50KS4gSXQgZmluZHMgdGhlIGZpcnN0IHJlY29yZCB3aGVyZSB0aGVcbiAgICogc3RhdHVzIGF0dHJpYnV0ZSAoZGVmaW5lZCBieSB0aGlzLlNUQVRVU19BVFRSSUJVVEUpIGhhcyBiZWVuIGNoYW5nZWQgdG9cbiAgICogdGhlIGFja25vd2xlZGdlZCBzdGF0dXMuIFRoZSBtZXRob2QgdGhlbiByZXR1cm5zIHRoZSB1c2VybmFtZSBvZiB0aGUgdXNlclxuICAgKiB3aG8gbWFkZSB0aGlzIGNoYW5nZS5cbiAgICpcbiAgICogSWYgbm8gc3VjaCBjaGFuZ2UgaXMgZm91bmQgaW4gdGhlIGF1ZGl0IHJlY29yZHMsIGl0IHJldHVybnMgdGhlIHVzZXJuYW1lXG4gICAqIGZyb20gdGhlIGZpcnN0IHJlY29yZCBvZiB0aGUgYXVkaXQgbG9nLlxuICAgKlxuICAgKiBUaGVyZSBjYW4gYmUgbXVsdGlwbGUgYXVkaXQgbG9ncyB3aXRoIEFDS05PV0xFREdFRCBzdGF0dXMuXG4gICAqXG4gICAqIEBwYXJhbSBzdGF0dXMgLSBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGFsYXJtLlxuICAgKiBAcGFyYW0gYXVkaXRMb2cgLSBBbiBhcnJheSBvZiBhdWRpdCByZWNvcmRzIHRvIHByb2Nlc3MuXG4gICAqIEByZXR1cm5zIFRoZSB1c2VybmFtZSBvZiB0aGUgdXNlciB3aG8gYWNrbm93bGVkZ2VkIHRoZSBzdGF0dXNcbiAgICogICAgICAgICAgIG9yICctLScgaWYgdGhlIHN0YXR1cyBpcyBub3QgYWNrbm93bGVkZ2VkIG9yIGF1ZGl0IGxvZyBpcyBpbnZhbGlkLlxuICAgKi9cbiAgZ2V0QWNrbm93bGVkZ2VkQnkoc3RhdHVzOiBBbGFybVN0YXR1c1R5cGUsIGF1ZGl0TG9nOiBJQXVkaXRSZWNvcmRbXSk6IHN0cmluZyB7XG4gICAgbGV0IGFja25vd2xlZGdlZEJ5ID0gJy0tJztcblxuICAgIGlmIChzdGF0dXMgIT09IEFsYXJtU3RhdHVzLkFDS05PV0xFREdFRCB8fCAhYXVkaXRMb2cgfHwgIWF1ZGl0TG9nWzBdPy51c2VyKSB7XG4gICAgICByZXR1cm4gYWNrbm93bGVkZ2VkQnk7XG4gICAgfVxuXG4gICAgYWNrbm93bGVkZ2VkQnkgPSBhdWRpdExvZ1swXS51c2VyO1xuXG4gICAgcmV0dXJuIGF1ZGl0TG9nLnJlZHVjZVJpZ2h0KChhY2MsIGF1ZGl0TG9nSXRlbSkgPT4ge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IEFycmF5LmZyb20oYXVkaXRMb2dJdGVtLmNoYW5nZXMgfHwgW10pO1xuICAgICAgY29uc3QgYWNrbm93bGVkZ2VkU3RhdHVzQ2hhbmdlID0gY2hhbmdlcy5maW5kKFxuICAgICAgICAoY2hhbmdlOiBJQ2hhbmdlKSA9PlxuICAgICAgICAgIGNoYW5nZS5hdHRyaWJ1dGUgPT09IHRoaXMuU1RBVFVTX0FUVFJJQlVURSAmJiBjaGFuZ2UubmV3VmFsdWUgPT09IEFsYXJtU3RhdHVzLkFDS05PV0xFREdFRFxuICAgICAgKTtcbiAgICAgIHJldHVybiAoYWNrbm93bGVkZ2VkU3RhdHVzQ2hhbmdlICYmIGF1ZGl0TG9nSXRlbS51c2VyKSB8fCBhY2M7XG4gICAgfSwgYWNrbm93bGVkZ2VkQnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGFja25vd2xlZGdlIHRpbWUgZnJvbSBhIGxpc3Qgb2YgYXVkaXQgcmVjb3Jkcy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXRlcmF0ZXMgb3ZlciB0aGUgcHJvdmlkZWQgYXVkaXQgcmVjb3JkcyBpbiByZXZlcnNlIG9yZGVyXG4gICAqIChzdGFydGluZyBmcm9tIHRoZSBtb3N0IHJlY2VudCkgYW5kIGZpbmRzIHRoZSBmaXJzdCByZWNvcmQgd2hlcmUgYVxuICAgKiBzcGVjaWZpYyBzdGF0dXMgYXR0cmlidXRlIChkZWZpbmVkIGJ5IHRoaXMuU1RBVFVTX0FUVFJJQlVURSkgaGFzIGJlZW5cbiAgICogYWNrbm93bGVkZ2VkLiBJdCB0aGVuIHJldHVybnMgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhhdCByZWNvcmQuXG4gICAqXG4gICAqIElmIG5vIHN1Y2ggcmVjb3JkIGlzIGZvdW5kLCB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlXG4gICAqIGZpcnN0IGF1ZGl0IHJlY29yZC4gSWYgdGhlIGF1ZGl0IHJlY29yZCBsaXN0IGlzIGVtcHR5LCBpdCByZXR1cm5zIG51bGwuXG4gICAqXG4gICAqIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBhdWRpdCBsb2dzIHdpdGggQUNLTk9XTEVER0VEIHN0YXR1cy5cbiAgICpcbiAgICogQHBhcmFtIGF1ZGl0TG9nIC0gQW4gYXJyYXkgb2YgYXVkaXQgcmVjb3JkcyB0byBwcm9jZXNzLlxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRpb24gdGltZSBvZiB0aGUgYWNrbm93bGVkZ2VkIHJlY29yZCxcbiAgICogICAgICAgICAgIHRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSBmaXJzdCByZWNvcmQgaWYgbm8gYWNrbm93bGVkZ2VkIHJlY29yZCBpcyBmb3VuZCxcbiAgICogICAgICAgICAgIG9yIG51bGwgaWYgdGhlIGF1ZGl0IGxvZyBpcyBlbXB0eS5cbiAgICovXG4gIGdldEFja25vd2xlZGdlVGltZShhdWRpdExvZzogSUF1ZGl0UmVjb3JkW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBhdWRpdExvZy5sZW5ndGggPyBhdWRpdExvZ1swXS5jcmVhdGlvblRpbWUgOiBudWxsO1xuXG4gICAgcmV0dXJuIGF1ZGl0TG9nLnJlZHVjZVJpZ2h0KChhY2MsIGF1ZGl0TG9nSXRlbSkgPT4ge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IEFycmF5LmZyb20oYXVkaXRMb2dJdGVtLmNoYW5nZXMgfHwgW10pO1xuICAgICAgY29uc3QgYWNrbm93bGVkZ2VkU3RhdHVzQ2hhbmdlID0gY2hhbmdlcy5maW5kKFxuICAgICAgICAoY2hhbmdlOiBJQ2hhbmdlKSA9PlxuICAgICAgICAgIGNoYW5nZS5hdHRyaWJ1dGUgPT09IHRoaXMuU1RBVFVTX0FUVFJJQlVURSAmJiBjaGFuZ2UubmV3VmFsdWUgPT09IEFsYXJtU3RhdHVzLkFDS05PV0xFREdFRFxuICAgICAgKTtcbiAgICAgIHJldHVybiBhY2tub3dsZWRnZWRTdGF0dXNDaGFuZ2UgPyBhdWRpdExvZ0l0ZW0uY3JlYXRpb25UaW1lIDogYWNjO1xuICAgIH0sIGluaXRpYWxWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBlbmQgdGltZSBvZiBhbiBldmVudCBmcm9tIGFuIGF1ZGl0IGxvZy5cbiAgICpcbiAgICogVGhlIG1ldGhvZCBwcm9jZXNzZXMgdGhlIHByb3ZpZGVkIGF1ZGl0IGxvZyB0byBmaW5kIHRoZSBmaXJzdCBpbnN0YW5jZVxuICAgKiAoc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCByZWNlbnQgcmVjb3JkKSB3aGVyZSB0aGUgc3RhdHVzIHdhcyBjaGFuZ2VkIHRvICdDTEVBUkVEJy5cbiAgICogSXQgaXRlcmF0ZXMgb3ZlciB0aGUgYXVkaXQgcmVjb3JkcyBhbmRcbiAgICogY2hlY2tzIHRoZSBjaGFuZ2VzIGluIGVhY2ggcmVjb3JkIHRvIGZpbmQgdGhpcyBzdGF0dXMgY2hhbmdlLlxuICAgKlxuICAgKiBJZiBhIHJlY29yZCB3aXRoIHRoZSBDTEVBUkVEIHN0YXR1cyBpcyBmb3VuZCwgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBjcmVhdGlvbiB0aW1lXG4gICAqIG9mIHRoYXQgcmVjb3JkLiBJZiB0aGUgZW50aXJlIGF1ZGl0IGxvZyBpcyBwcm9jZXNzZWQgd2l0aG91dCBmaW5kaW5nIGEgQ0xFQVJFRCBzdGF0dXMsXG4gICAqIHRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSBmaXJzdCBhdWRpdCBsb2cgcmVjb3JkIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBJZiB0aGUgYXVkaXQgbG9nIGlzIGVtcHR5IG9yIG51bGwsIHRoZSBtZXRob2QgcmV0dXJucyBudWxsLlxuICAgKlxuICAgKiBUaGVyZSBjYW4gYmUgb25seSBvbmUgYXVkaXQgbG9nIHdpdGggQ0xFQVJFRCBzdGF0dXMuXG4gICAqXG4gICAqIEBwYXJhbSBhdWRpdExvZyAtIEFuIGFycmF5IG9mIGF1ZGl0IHJlY29yZHMgdG8gcHJvY2Vzcy5cbiAgICogQHJldHVybnMgVGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIHJlY29yZCB3aXRoIHRoZSBDTEVBUkVEIHN0YXR1cyxcbiAgICogICAgICAgICAgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIGZpcnN0IHJlY29yZCBpZiBubyBDTEVBUkVEIHN0YXR1cyBpcyBmb3VuZCxcbiAgICogICAgICAgICAgb3IgbnVsbCBpZiB0aGUgYXVkaXQgbG9nIGlzIGVtcHR5IG9yIG51bGwuXG4gICAqL1xuICBnZXRFbmRUaW1lKGF1ZGl0TG9nOiBJQXVkaXRSZWNvcmRbXSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghYXVkaXRMb2cgfHwgYXVkaXRMb2cubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgbGF0ZXN0Q2xlYXJlZEF1ZGl0VGltZSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGF1ZGl0TG9nSXRlbSBvZiBhdWRpdExvZykge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IEFycmF5LmZyb20oYXVkaXRMb2dJdGVtLmNoYW5nZXMgfHwgW10pO1xuICAgICAgY29uc3QgY2xlYXJlZFN0YXR1c0NoYW5nZSA9IGNoYW5nZXMuZmluZChcbiAgICAgICAgY2hhbmdlID0+XG4gICAgICAgICAgY2hhbmdlLmF0dHJpYnV0ZSA9PT0gdGhpcy5TVEFUVVNfQVRUUklCVVRFICYmIGNoYW5nZS5uZXdWYWx1ZSA9PT0gQWxhcm1TdGF0dXMuQ0xFQVJFRFxuICAgICAgKTtcblxuICAgICAgaWYgKGNsZWFyZWRTdGF0dXNDaGFuZ2UpIHtcbiAgICAgICAgaWYgKCFsYXRlc3RDbGVhcmVkQXVkaXRUaW1lIHx8IGF1ZGl0TG9nSXRlbS5jcmVhdGlvblRpbWUgPiBsYXRlc3RDbGVhcmVkQXVkaXRUaW1lKSB7XG4gICAgICAgICAgbGF0ZXN0Q2xlYXJlZEF1ZGl0VGltZSA9IGF1ZGl0TG9nSXRlbS5jcmVhdGlvblRpbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGF0ZXN0Q2xlYXJlZEF1ZGl0VGltZSB8fCBhdWRpdExvZ1swXS5jcmVhdGlvblRpbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgc3BlY2lmaWVkIGFwcGxpY2F0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcHBsaWNhdGlvbiBrZXkuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGZpcnN0IGNoZWNrcyBpZiB0aGUgcmVxdWVzdGVkIGFwcGxpY2F0aW9uLCBpZGVudGlmaWVkIGJ5IGl0cyBrZXkgKHdoaWNoIGNvdWxkIGJlbG9uZyB0byBEZXZpY2UgTWFuYWdlbWVudFxuICAgKiBvciBTbWFydCBSdWxlcyBNaWNyb3NlcnZpY2UpLCBpcyBwcmVzZW50IGluIHRoZSB1c2VyJ3MgY3VycmVudCBhcHBsaWNhdGlvbnMgY2FjaGUuIElmIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUsXG4gICAqIGl0IGZldGNoZXMgdGhlIGFwcGxpY2F0aW9uIGZyb20gdGhlIGxpc3Qgb2YgY3VycmVudCB1c2VyJ3MgYXBwbGljYXRpb25zLCB3aGljaCBpcyBtYWludGFpbmVkIGJ5IHRoZSBzdGF0ZSBzZXJ2aWNlLlxuICAgKlxuICAgKiBUaGUgYXBwbGljYXRpb24gaXMgc2VhcmNoZWQgYnkgaXRzIGtleSwgYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgZWl0aGVyIHJlc29sdmVzIHRvIHRoZSBmb3VuZCBhcHBsaWNhdGlvblxuICAgKiBvciB1bmRlZmluZWQgaWYgdGhlIGFwcGxpY2F0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIEBwYXJhbSBhcHBsaWNhdGlvbktleSBUaGUga2V5IG9mIHRoZSBhcHBsaWNhdGlvbiB0byByZXRyaWV2ZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBvciB1bmRlZmluZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIGFzeW5jIGdldEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uS2V5OiBzdHJpbmcpOiBQcm9taXNlPElBcHBsaWNhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmN1cnJlbnRBcHBzT2ZVc2VyLnBpcGUoXG4gICAgICAgIG1hcChhcHBzID0+IGFwcHMuZmluZChhcHAgPT4gYXBwLmtleSA9PT0gYXBwbGljYXRpb25LZXkpKSxcbiAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgY2hlY2tJZkhhc0FueVJvbGVBbGxvd2luZ1RvQ3JlYXRlU21hcnRSdWxlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IFJPTEVTX0FMTE9XSU5HX1NNQVJUX1JVTEVfQ1JFQVRJT04gPSBbXG4gICAgICBbXG4gICAgICAgIFBlcm1pc3Npb25zLlJPTEVfSU5WRU5UT1JZX0FETUlOLFxuICAgICAgICBQZXJtaXNzaW9ucy5ST0xFX0lOVkVOVE9SWV9DUkVBVEUsXG4gICAgICAgIFBlcm1pc3Npb25zLlJPTEVfTUFOQUdFRF9PQkpFQ1RfQURNSU4sXG4gICAgICAgIFBlcm1pc3Npb25zLlJPTEVfTUFOQUdFRF9PQkpFQ1RfQ1JFQVRFXG4gICAgICBdLFxuICAgICAgW1Blcm1pc3Npb25zLlJPTEVfQ0VQX01BTkFHRU1FTlRfQURNSU4sIFBlcm1pc3Npb25zLlJPTEVfU01BUlRSVUxFX0FETUlOXVxuICAgIF07XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wZXJtaXNzaW9ucy5oYXNBbnlSb2xlKFJPTEVTX0FMTE9XSU5HX1NNQVJUX1JVTEVfQ1JFQVRJT05bMF0pICYmXG4gICAgICB0aGlzLnBlcm1pc3Npb25zLmhhc0FueVJvbGUoUk9MRVNfQUxMT1dJTkdfU01BUlRfUlVMRV9DUkVBVElPTlsxXSlcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
132
|
+
}], ctorParameters: () => [{ type: i1.Permissions }] });
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxhcm0tZGV0YWlscy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYWxhcm1zL2FsYXJtLWRldGFpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQTBDLE1BQU0sYUFBYSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBS2xELE1BQU0sT0FBTyxtQkFBbUI7SUFHOUIsWUFBb0IsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFGM0IscUJBQWdCLEdBQUcsUUFBUSxDQUFDO0lBRUUsQ0FBQztJQUVoRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bd0JHO0lBQ0gsaUJBQWlCLENBQUMsTUFBdUIsRUFBRSxRQUF3QjtRQUNqRSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFMUIsSUFBSSxNQUFNLEtBQUssV0FBVyxDQUFDLFlBQVksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMzRSxPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDO1FBRUQsY0FBYyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFbEMsT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxFQUFFO1lBQ2hELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2RCxNQUFNLHdCQUF3QixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQzNDLENBQUMsTUFBZSxFQUFFLEVBQUUsQ0FDbEIsTUFBTSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxXQUFXLENBQUMsWUFBWSxDQUM3RixDQUFDO1lBQ0YsT0FBTyxDQUFDLHdCQUF3QixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7UUFDaEUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQkc7SUFDSCxrQkFBa0IsQ0FBQyxRQUF3QjtRQUN6QyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFdkUsT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxFQUFFO1lBQ2hELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2RCxNQUFNLHdCQUF3QixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQzNDLENBQUMsTUFBZSxFQUFFLEVBQUUsQ0FDbEIsTUFBTSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxXQUFXLENBQUMsWUFBWSxDQUM3RixDQUFDO1lBQ0YsT0FBTyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3BFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0JHO0lBQ0gsVUFBVSxDQUFDLFFBQXdCO1FBQ2pDLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUVsQyxLQUFLLE1BQU0sWUFBWSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2RCxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQ3RDLE1BQU0sQ0FBQyxFQUFFLENBQ1AsTUFBTSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxXQUFXLENBQUMsT0FBTyxDQUN4RixDQUFDO1lBRUYsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsc0JBQXNCLElBQUksWUFBWSxDQUFDLFlBQVksR0FBRyxzQkFBc0IsRUFBRSxDQUFDO29CQUNsRixzQkFBc0IsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDO2dCQUNyRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLHNCQUFzQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDNUQsQ0FBQztJQUVELDBDQUEwQztRQUN4QyxNQUFNLGtDQUFrQyxHQUFHO1lBQ3pDO2dCQUNFLFdBQVcsQ0FBQyxvQkFBb0I7Z0JBQ2hDLFdBQVcsQ0FBQyxxQkFBcUI7Z0JBQ2pDLFdBQVcsQ0FBQyx5QkFBeUI7Z0JBQ3JDLFdBQVcsQ0FBQywwQkFBMEI7YUFDdkM7WUFDRCxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsRUFBRSxXQUFXLENBQUMsb0JBQW9CLENBQUM7U0FDMUUsQ0FBQztRQUVGLE9BQU8sQ0FDTCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNuRSxDQUFDO0lBQ0osQ0FBQzs4R0E1SVUsbUJBQW1CO2tIQUFuQixtQkFBbUIsY0FGbEIsTUFBTTs7MkZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsYXJtU3RhdHVzLCBBbGFybVN0YXR1c1R5cGUsIElBdWRpdFJlY29yZCwgSUNoYW5nZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFBlcm1pc3Npb25zIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFsYXJtRGV0YWlsc1NlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IFNUQVRVU19BVFRSSUJVVEUgPSAnc3RhdHVzJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9ucykge31cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB1c2VybmFtZSBvZiB0aGUgdXNlciB3aG8gYWNrbm93bGVkZ2VkIGFuIGFsYXJtIHN0YXR1cy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSBwcm92aWRlZCBzdGF0dXMgaXMgZXF1YWwgdG8gdGhlIGFja25vd2xlZGdlZFxuICAgKiBzdGF0dXMuIElmIGl0IGlzIG5vdCwgb3IgaWYgdGhlXG4gICAqIGF1ZGl0IGxvZyBpcyBlbXB0eSBvciB0aGUgZmlyc3QgbG9nIGl0ZW0gZG9lcyBub3QgY29udGFpbiBhIHVzZXIsIHRoZVxuICAgKiBtZXRob2QgcmV0dXJucyBhIGRlZmF1bHQgdmFsdWUgKCctLScpLlxuICAgKlxuICAgKiBJZiB0aGUgc3RhdHVzIGlzIHRoZSBhY2tub3dsZWRnZWQgc3RhdHVzIGFuZCB0aGUgYXVkaXQgbG9nIGNvbnRhaW5zIHZhbGlkXG4gICAqIHJlY29yZHMsIHRoZSBtZXRob2QgaXRlcmF0ZXMgb3ZlciB0aGUgYXVkaXQgcmVjb3JkcyBpbiByZXZlcnNlIG9yZGVyXG4gICAqIChzdGFydGluZyBmcm9tIHRoZSBtb3N0IHJlY2VudCkuIEl0IGZpbmRzIHRoZSBmaXJzdCByZWNvcmQgd2hlcmUgdGhlXG4gICAqIHN0YXR1cyBhdHRyaWJ1dGUgKGRlZmluZWQgYnkgdGhpcy5TVEFUVVNfQVRUUklCVVRFKSBoYXMgYmVlbiBjaGFuZ2VkIHRvXG4gICAqIHRoZSBhY2tub3dsZWRnZWQgc3RhdHVzLiBUaGUgbWV0aG9kIHRoZW4gcmV0dXJucyB0aGUgdXNlcm5hbWUgb2YgdGhlIHVzZXJcbiAgICogd2hvIG1hZGUgdGhpcyBjaGFuZ2UuXG4gICAqXG4gICAqIElmIG5vIHN1Y2ggY2hhbmdlIGlzIGZvdW5kIGluIHRoZSBhdWRpdCByZWNvcmRzLCBpdCByZXR1cm5zIHRoZSB1c2VybmFtZVxuICAgKiBmcm9tIHRoZSBmaXJzdCByZWNvcmQgb2YgdGhlIGF1ZGl0IGxvZy5cbiAgICpcbiAgICogVGhlcmUgY2FuIGJlIG11bHRpcGxlIGF1ZGl0IGxvZ3Mgd2l0aCBBQ0tOT1dMRURHRUQgc3RhdHVzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhdHVzIC0gVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBhbGFybS5cbiAgICogQHBhcmFtIGF1ZGl0TG9nIC0gQW4gYXJyYXkgb2YgYXVkaXQgcmVjb3JkcyB0byBwcm9jZXNzLlxuICAgKiBAcmV0dXJucyBUaGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgd2hvIGFja25vd2xlZGdlZCB0aGUgc3RhdHVzXG4gICAqICAgICAgICAgICBvciAnLS0nIGlmIHRoZSBzdGF0dXMgaXMgbm90IGFja25vd2xlZGdlZCBvciBhdWRpdCBsb2cgaXMgaW52YWxpZC5cbiAgICovXG4gIGdldEFja25vd2xlZGdlZEJ5KHN0YXR1czogQWxhcm1TdGF0dXNUeXBlLCBhdWRpdExvZzogSUF1ZGl0UmVjb3JkW10pOiBzdHJpbmcge1xuICAgIGxldCBhY2tub3dsZWRnZWRCeSA9ICctLSc7XG5cbiAgICBpZiAoc3RhdHVzICE9PSBBbGFybVN0YXR1cy5BQ0tOT1dMRURHRUQgfHwgIWF1ZGl0TG9nIHx8ICFhdWRpdExvZ1swXT8udXNlcikge1xuICAgICAgcmV0dXJuIGFja25vd2xlZGdlZEJ5O1xuICAgIH1cblxuICAgIGFja25vd2xlZGdlZEJ5ID0gYXVkaXRMb2dbMF0udXNlcjtcblxuICAgIHJldHVybiBhdWRpdExvZy5yZWR1Y2VSaWdodCgoYWNjLCBhdWRpdExvZ0l0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBBcnJheS5mcm9tKGF1ZGl0TG9nSXRlbS5jaGFuZ2VzIHx8IFtdKTtcbiAgICAgIGNvbnN0IGFja25vd2xlZGdlZFN0YXR1c0NoYW5nZSA9IGNoYW5nZXMuZmluZChcbiAgICAgICAgKGNoYW5nZTogSUNoYW5nZSkgPT5cbiAgICAgICAgICBjaGFuZ2UuYXR0cmlidXRlID09PSB0aGlzLlNUQVRVU19BVFRSSUJVVEUgJiYgY2hhbmdlLm5ld1ZhbHVlID09PSBBbGFybVN0YXR1cy5BQ0tOT1dMRURHRURcbiAgICAgICk7XG4gICAgICByZXR1cm4gKGFja25vd2xlZGdlZFN0YXR1c0NoYW5nZSAmJiBhdWRpdExvZ0l0ZW0udXNlcikgfHwgYWNjO1xuICAgIH0sIGFja25vd2xlZGdlZEJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBhY2tub3dsZWRnZSB0aW1lIGZyb20gYSBsaXN0IG9mIGF1ZGl0IHJlY29yZHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGl0ZXJhdGVzIG92ZXIgdGhlIHByb3ZpZGVkIGF1ZGl0IHJlY29yZHMgaW4gcmV2ZXJzZSBvcmRlclxuICAgKiAoc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCByZWNlbnQpIGFuZCBmaW5kcyB0aGUgZmlyc3QgcmVjb3JkIHdoZXJlIGFcbiAgICogc3BlY2lmaWMgc3RhdHVzIGF0dHJpYnV0ZSAoZGVmaW5lZCBieSB0aGlzLlNUQVRVU19BVFRSSUJVVEUpIGhhcyBiZWVuXG4gICAqIGFja25vd2xlZGdlZC4gSXQgdGhlbiByZXR1cm5zIHRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoYXQgcmVjb3JkLlxuICAgKlxuICAgKiBJZiBubyBzdWNoIHJlY29yZCBpcyBmb3VuZCwgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZVxuICAgKiBmaXJzdCBhdWRpdCByZWNvcmQuIElmIHRoZSBhdWRpdCByZWNvcmQgbGlzdCBpcyBlbXB0eSwgaXQgcmV0dXJucyBudWxsLlxuICAgKlxuICAgKiBUaGVyZSBjYW4gYmUgbXVsdGlwbGUgYXVkaXQgbG9ncyB3aXRoIEFDS05PV0xFREdFRCBzdGF0dXMuXG4gICAqXG4gICAqIEBwYXJhbSBhdWRpdExvZyAtIEFuIGFycmF5IG9mIGF1ZGl0IHJlY29yZHMgdG8gcHJvY2Vzcy5cbiAgICogQHJldHVybnMgVGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIGFja25vd2xlZGdlZCByZWNvcmQsXG4gICAqICAgICAgICAgICB0aGUgY3JlYXRpb24gdGltZSBvZiB0aGUgZmlyc3QgcmVjb3JkIGlmIG5vIGFja25vd2xlZGdlZCByZWNvcmQgaXMgZm91bmQsXG4gICAqICAgICAgICAgICBvciBudWxsIGlmIHRoZSBhdWRpdCBsb2cgaXMgZW1wdHkuXG4gICAqL1xuICBnZXRBY2tub3dsZWRnZVRpbWUoYXVkaXRMb2c6IElBdWRpdFJlY29yZFtdKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaW5pdGlhbFZhbHVlID0gYXVkaXRMb2cubGVuZ3RoID8gYXVkaXRMb2dbMF0uY3JlYXRpb25UaW1lIDogbnVsbDtcblxuICAgIHJldHVybiBhdWRpdExvZy5yZWR1Y2VSaWdodCgoYWNjLCBhdWRpdExvZ0l0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBBcnJheS5mcm9tKGF1ZGl0TG9nSXRlbS5jaGFuZ2VzIHx8IFtdKTtcbiAgICAgIGNvbnN0IGFja25vd2xlZGdlZFN0YXR1c0NoYW5nZSA9IGNoYW5nZXMuZmluZChcbiAgICAgICAgKGNoYW5nZTogSUNoYW5nZSkgPT5cbiAgICAgICAgICBjaGFuZ2UuYXR0cmlidXRlID09PSB0aGlzLlNUQVRVU19BVFRSSUJVVEUgJiYgY2hhbmdlLm5ld1ZhbHVlID09PSBBbGFybVN0YXR1cy5BQ0tOT1dMRURHRURcbiAgICAgICk7XG4gICAgICByZXR1cm4gYWNrbm93bGVkZ2VkU3RhdHVzQ2hhbmdlID8gYXVkaXRMb2dJdGVtLmNyZWF0aW9uVGltZSA6IGFjYztcbiAgICB9LCBpbml0aWFsVmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZW5kIHRpbWUgb2YgYW4gZXZlbnQgZnJvbSBhbiBhdWRpdCBsb2cuXG4gICAqXG4gICAqIFRoZSBtZXRob2QgcHJvY2Vzc2VzIHRoZSBwcm92aWRlZCBhdWRpdCBsb2cgdG8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2VcbiAgICogKHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50IHJlY29yZCkgd2hlcmUgdGhlIHN0YXR1cyB3YXMgY2hhbmdlZCB0byAnQ0xFQVJFRCcuXG4gICAqIEl0IGl0ZXJhdGVzIG92ZXIgdGhlIGF1ZGl0IHJlY29yZHMgYW5kXG4gICAqIGNoZWNrcyB0aGUgY2hhbmdlcyBpbiBlYWNoIHJlY29yZCB0byBmaW5kIHRoaXMgc3RhdHVzIGNoYW5nZS5cbiAgICpcbiAgICogSWYgYSByZWNvcmQgd2l0aCB0aGUgQ0xFQVJFRCBzdGF0dXMgaXMgZm91bmQsIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgY3JlYXRpb24gdGltZVxuICAgKiBvZiB0aGF0IHJlY29yZC4gSWYgdGhlIGVudGlyZSBhdWRpdCBsb2cgaXMgcHJvY2Vzc2VkIHdpdGhvdXQgZmluZGluZyBhIENMRUFSRUQgc3RhdHVzLFxuICAgKiB0aGUgY3JlYXRpb24gdGltZSBvZiB0aGUgZmlyc3QgYXVkaXQgbG9nIHJlY29yZCBpcyByZXR1cm5lZC5cbiAgICpcbiAgICogSWYgdGhlIGF1ZGl0IGxvZyBpcyBlbXB0eSBvciBudWxsLCB0aGUgbWV0aG9kIHJldHVybnMgbnVsbC5cbiAgICpcbiAgICogVGhlcmUgY2FuIGJlIG9ubHkgb25lIGF1ZGl0IGxvZyB3aXRoIENMRUFSRUQgc3RhdHVzLlxuICAgKlxuICAgKiBAcGFyYW0gYXVkaXRMb2cgLSBBbiBhcnJheSBvZiBhdWRpdCByZWNvcmRzIHRvIHByb2Nlc3MuXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSByZWNvcmQgd2l0aCB0aGUgQ0xFQVJFRCBzdGF0dXMsXG4gICAqICAgICAgICAgIHRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSBmaXJzdCByZWNvcmQgaWYgbm8gQ0xFQVJFRCBzdGF0dXMgaXMgZm91bmQsXG4gICAqICAgICAgICAgIG9yIG51bGwgaWYgdGhlIGF1ZGl0IGxvZyBpcyBlbXB0eSBvciBudWxsLlxuICAgKi9cbiAgZ2V0RW5kVGltZShhdWRpdExvZzogSUF1ZGl0UmVjb3JkW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWF1ZGl0TG9nIHx8IGF1ZGl0TG9nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGxhdGVzdENsZWFyZWRBdWRpdFRpbWUgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBhdWRpdExvZ0l0ZW0gb2YgYXVkaXRMb2cpIHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBBcnJheS5mcm9tKGF1ZGl0TG9nSXRlbS5jaGFuZ2VzIHx8IFtdKTtcbiAgICAgIGNvbnN0IGNsZWFyZWRTdGF0dXNDaGFuZ2UgPSBjaGFuZ2VzLmZpbmQoXG4gICAgICAgIGNoYW5nZSA9PlxuICAgICAgICAgIGNoYW5nZS5hdHRyaWJ1dGUgPT09IHRoaXMuU1RBVFVTX0FUVFJJQlVURSAmJiBjaGFuZ2UubmV3VmFsdWUgPT09IEFsYXJtU3RhdHVzLkNMRUFSRURcbiAgICAgICk7XG5cbiAgICAgIGlmIChjbGVhcmVkU3RhdHVzQ2hhbmdlKSB7XG4gICAgICAgIGlmICghbGF0ZXN0Q2xlYXJlZEF1ZGl0VGltZSB8fCBhdWRpdExvZ0l0ZW0uY3JlYXRpb25UaW1lID4gbGF0ZXN0Q2xlYXJlZEF1ZGl0VGltZSkge1xuICAgICAgICAgIGxhdGVzdENsZWFyZWRBdWRpdFRpbWUgPSBhdWRpdExvZ0l0ZW0uY3JlYXRpb25UaW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhdGVzdENsZWFyZWRBdWRpdFRpbWUgfHwgYXVkaXRMb2dbMF0uY3JlYXRpb25UaW1lO1xuICB9XG5cbiAgY2hlY2tJZkhhc0FueVJvbGVBbGxvd2luZ1RvQ3JlYXRlU21hcnRSdWxlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IFJPTEVTX0FMTE9XSU5HX1NNQVJUX1JVTEVfQ1JFQVRJT04gPSBbXG4gICAgICBbXG4gICAgICAgIFBlcm1pc3Npb25zLlJPTEVfSU5WRU5UT1JZX0FETUlOLFxuICAgICAgICBQZXJtaXNzaW9ucy5ST0xFX0lOVkVOVE9SWV9DUkVBVEUsXG4gICAgICAgIFBlcm1pc3Npb25zLlJPTEVfTUFOQUdFRF9PQkpFQ1RfQURNSU4sXG4gICAgICAgIFBlcm1pc3Npb25zLlJPTEVfTUFOQUdFRF9PQkpFQ1RfQ1JFQVRFXG4gICAgICBdLFxuICAgICAgW1Blcm1pc3Npb25zLlJPTEVfQ0VQX01BTkFHRU1FTlRfQURNSU4sIFBlcm1pc3Npb25zLlJPTEVfU01BUlRSVUxFX0FETUlOXVxuICAgIF07XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wZXJtaXNzaW9ucy5oYXNBbnlSb2xlKFJPTEVTX0FMTE9XSU5HX1NNQVJUX1JVTEVfQ1JFQVRJT05bMF0pICYmXG4gICAgICB0aGlzLnBlcm1pc3Npb25zLmhhc0FueVJvbGUoUk9MRVNfQUxMT1dJTkdfU01BUlRfUlVMRV9DUkVBVElPTlsxXSlcbiAgICApO1xuICB9XG59XG4iXX0=
|