@igo2/context 18.0.0-next.9 → 18.0.1-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/igo2-context.mjs +174 -222
- package/fesm2022/igo2-context.mjs.map +1 -1
- package/lib/context-import-export/context-import-export/context-import-export.component.d.ts +5 -8
- package/lib/context-import-export/shared/context-export.interface.d.ts +2 -2
- package/lib/context-manager/shared/context.interface.d.ts +2 -9
- package/lib/context-manager/shared/context.service.d.ts +4 -4
- package/lib/context-manager/shared/layer-context.directive.d.ts +1 -0
- package/package.json +12 -14
- package/esm2022/igo2-context.mjs +0 -5
- package/esm2022/lib/context-import-export/context-import-export/context-import-export.component.mjs +0 -162
- package/esm2022/lib/context-import-export/context-import-export.module.mjs +0 -24
- package/esm2022/lib/context-import-export/index.mjs +0 -3
- package/esm2022/lib/context-import-export/shared/context-export.errors.mjs +0 -15
- package/esm2022/lib/context-import-export/shared/context-export.interface.mjs +0 -2
- package/esm2022/lib/context-import-export/shared/context-export.service.mjs +0 -38
- package/esm2022/lib/context-import-export/shared/context-export.utils.mjs +0 -15
- package/esm2022/lib/context-import-export/shared/context-import.errors.mjs +0 -33
- package/esm2022/lib/context-import-export/shared/context-import.service.mjs +0 -82
- package/esm2022/lib/context-import-export/shared/context-import.utils.mjs +0 -148
- package/esm2022/lib/context-import-export/shared/index.mjs +0 -8
- package/esm2022/lib/context-manager/context-edit/context-edit-binding.directive.mjs +0 -56
- package/esm2022/lib/context-manager/context-edit/context-edit.component.mjs +0 -35
- package/esm2022/lib/context-manager/context-edit/index.mjs +0 -3
- package/esm2022/lib/context-manager/context-form/context-form.component.mjs +0 -117
- package/esm2022/lib/context-manager/context-form/index.mjs +0 -2
- package/esm2022/lib/context-manager/context-item/context-item.component.mjs +0 -96
- package/esm2022/lib/context-manager/context-item/index.mjs +0 -2
- package/esm2022/lib/context-manager/context-list/context-list-binding.directive.mjs +0 -259
- package/esm2022/lib/context-manager/context-list/context-list.component.mjs +0 -426
- package/esm2022/lib/context-manager/context-list/context-list.enum.mjs +0 -7
- package/esm2022/lib/context-manager/context-list/index.mjs +0 -3
- package/esm2022/lib/context-manager/context-manager.directive.mjs +0 -19
- package/esm2022/lib/context-manager/context-manager.module.mjs +0 -77
- package/esm2022/lib/context-manager/context-permissions/context-permissions-binding.directive.mjs +0 -109
- package/esm2022/lib/context-manager/context-permissions/context-permissions.component.mjs +0 -170
- package/esm2022/lib/context-manager/context-permissions/index.mjs +0 -3
- package/esm2022/lib/context-manager/index.mjs +0 -8
- package/esm2022/lib/context-manager/shared/context.enum.mjs +0 -13
- package/esm2022/lib/context-manager/shared/context.interface.mjs +0 -2
- package/esm2022/lib/context-manager/shared/context.service.mjs +0 -656
- package/esm2022/lib/context-manager/shared/index.mjs +0 -6
- package/esm2022/lib/context-manager/shared/layer-context.directive.mjs +0 -165
- package/esm2022/lib/context-manager/shared/map-context.directive.mjs +0 -80
- package/esm2022/lib/context-map-button/bookmark-button/bookmark-button.component.mjs +0 -69
- package/esm2022/lib/context-map-button/bookmark-button/bookmark-dialog.component.mjs +0 -37
- package/esm2022/lib/context-map-button/bookmark-button/index.mjs +0 -3
- package/esm2022/lib/context-map-button/context-map-button.directive.mjs +0 -10
- package/esm2022/lib/context-map-button/context-map-button.module.mjs +0 -48
- package/esm2022/lib/context-map-button/index.mjs +0 -5
- package/esm2022/lib/context-map-button/poi-button/index.mjs +0 -4
- package/esm2022/lib/context-map-button/poi-button/poi-button.component.mjs +0 -160
- package/esm2022/lib/context-map-button/poi-button/poi-dialog.component.mjs +0 -37
- package/esm2022/lib/context-map-button/poi-button/shared/index.mjs +0 -3
- package/esm2022/lib/context-map-button/poi-button/shared/poi.interface.mjs +0 -2
- package/esm2022/lib/context-map-button/poi-button/shared/poi.service.mjs +0 -38
- package/esm2022/lib/context-map-button/user-button/index.mjs +0 -3
- package/esm2022/lib/context-map-button/user-button/user-button.animation.mjs +0 -17
- package/esm2022/lib/context-map-button/user-button/user-button.component.mjs +0 -82
- package/esm2022/lib/context-map-button/user-button/user-dialog.component.mjs +0 -43
- package/esm2022/lib/context.module.mjs +0 -42
- package/esm2022/lib/environment/environment.interface.mjs +0 -2
- package/esm2022/lib/environment/index.mjs +0 -2
- package/esm2022/lib/share-map/index.mjs +0 -6
- package/esm2022/lib/share-map/share-map/share-map-api.component.mjs +0 -111
- package/esm2022/lib/share-map/share-map/share-map-url.component.mjs +0 -78
- package/esm2022/lib/share-map/share-map/share-map.component.mjs +0 -35
- package/esm2022/lib/share-map/share-map.module.mjs +0 -31
- package/esm2022/lib/share-map/shared/index.mjs +0 -2
- package/esm2022/lib/share-map/shared/share-map.service.mjs +0 -222
- package/esm2022/lib/sidenav/index.mjs +0 -2
- package/esm2022/lib/sidenav/sidenav.component.mjs +0 -122
- package/esm2022/lib/sidenav/sidenav.module.mjs +0 -24
- package/esm2022/public_api.mjs +0 -16
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { NgClass, NgIf } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
3
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
4
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
5
|
-
import { MatListModule } from '@angular/material/list';
|
|
6
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
7
|
-
import { AuthService } from '@igo2/auth';
|
|
8
|
-
import { CollapseDirective } from '@igo2/common/collapsible';
|
|
9
|
-
import { StopPropagationDirective } from '@igo2/common/stop-propagation';
|
|
10
|
-
import { IgoLanguageModule } from '@igo2/core/language';
|
|
11
|
-
import { StorageService } from '@igo2/core/storage';
|
|
12
|
-
import { TypePermission } from '../shared/context.enum';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@igo2/auth";
|
|
15
|
-
import * as i2 from "@igo2/core/storage";
|
|
16
|
-
import * as i3 from "@angular/material/list";
|
|
17
|
-
import * as i4 from "@angular/material/button";
|
|
18
|
-
import * as i5 from "@angular/material/tooltip";
|
|
19
|
-
import * as i6 from "@angular/material/icon";
|
|
20
|
-
import * as i7 from "@ngx-translate/core";
|
|
21
|
-
export class ContextItemComponent {
|
|
22
|
-
auth;
|
|
23
|
-
storageService;
|
|
24
|
-
typePermission = TypePermission;
|
|
25
|
-
color = 'primary';
|
|
26
|
-
collapsed = true;
|
|
27
|
-
showFavorite = true;
|
|
28
|
-
context;
|
|
29
|
-
default;
|
|
30
|
-
selected;
|
|
31
|
-
edit = new EventEmitter();
|
|
32
|
-
delete = new EventEmitter();
|
|
33
|
-
save = new EventEmitter();
|
|
34
|
-
clone = new EventEmitter();
|
|
35
|
-
hide = new EventEmitter();
|
|
36
|
-
show = new EventEmitter();
|
|
37
|
-
favorite = new EventEmitter();
|
|
38
|
-
managePermissions = new EventEmitter();
|
|
39
|
-
manageTools = new EventEmitter();
|
|
40
|
-
get hidden() {
|
|
41
|
-
return this.context.hidden;
|
|
42
|
-
}
|
|
43
|
-
get canShare() {
|
|
44
|
-
return this.storageService.get('canShare') === true;
|
|
45
|
-
}
|
|
46
|
-
constructor(auth, storageService) {
|
|
47
|
-
this.auth = auth;
|
|
48
|
-
this.storageService = storageService;
|
|
49
|
-
}
|
|
50
|
-
favoriteClick(context) {
|
|
51
|
-
this.favorite.emit(context);
|
|
52
|
-
}
|
|
53
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContextItemComponent, deps: [{ token: i1.AuthService }, { token: i2.StorageService }], target: i0.ɵɵFactoryTarget.Component });
|
|
54
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ContextItemComponent, isStandalone: true, selector: "igo-context-item", inputs: { showFavorite: "showFavorite", context: "context", default: "default", selected: "selected" }, outputs: { edit: "edit", delete: "delete", save: "save", clone: "clone", hide: "hide", show: "show", favorite: "favorite", managePermissions: "managePermissions", manageTools: "manageTools" }, ngImport: i0, template: "<mat-list-item\n class=\"mat-list-item\"\n [ngClass]=\"{ 'mat-list-item-light': hidden }\"\n>\n <button\n *ngIf=\"auth.authenticated\"\n matListItemAvatar\n mat-icon-button\n igoStopPropagation\n [matTooltip]=\"\n auth.authenticated\n ? ('igo.context.contextManager.favorite' | translate)\n : ''\n \"\n matTooltipShowDelay=\"500\"\n [color]=\"default ? 'primary' : 'default'\"\n (click)=\"favoriteClick(context)\"\n >\n <mat-icon *ngIf=\"!context.iconImage\">{{\n context.icon\n ? context.icon\n : context.scope === 'public'\n ? 'public'\n : 'star'\n }}</mat-icon>\n <img *ngIf=\"context.iconImage\" [src]=\"context.iconImage\" />\n </button>\n <button\n matListItemAvatar\n *ngIf=\"!auth.authenticated && showFavorite\"\n mat-icon-button\n igoStopPropagation\n [matTooltip]=\"'igo.context.contextManager.favorite' | translate\"\n matTooltipShowDelay=\"500\"\n [color]=\"default ? 'primary' : 'default'\"\n (click)=\"favoriteClick(context)\"\n >\n <mat-icon>star</mat-icon>\n </button>\n <span matListItemTitle>{{ context.title }}</span>\n\n <div\n *ngIf=\"auth.authenticated\"\n matListItemMeta\n igoStopPropagation\n class=\"igo-actions-container\"\n >\n <button\n *ngIf=\"\n collapsed &&\n selected &&\n (context.permission === typePermission[typePermission.write] ||\n context.imported)\n \"\n class=\"save-button\"\n mat-icon-button\n [matTooltip]=\"'igo.context.contextManager.save' | translate\"\n matTooltipShowDelay=\"500\"\n [color]=\"color\"\n (click)=\"save.emit(context)\"\n >\n <mat-icon>save</mat-icon>\n </button>\n\n <div #actions class=\"igo-actions-expand-container\">\n <button\n *ngIf=\"canShare && !context.imported\"\n mat-icon-button\n [matTooltip]=\"\n 'igo.context.contextManager.managePermissions' | translate\n \"\n matTooltipShowDelay=\"500\"\n [color]=\"color\"\n (click)=\"managePermissions.emit(context)\"\n >\n <mat-icon>manage_accounts</mat-icon>\n </button>\n\n <button\n *ngIf=\"!context.imported\"\n class=\"clone-button\"\n mat-icon-button\n [matTooltip]=\"'igo.context.contextManager.clone' | translate\"\n matTooltipShowDelay=\"500\"\n [color]=\"color\"\n (click)=\"clone.emit(context)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n\n <button\n *ngIf=\"\n context.permission === typePermission[typePermission.write] &&\n !context.imported\n \"\n class=\"edit-button\"\n mat-icon-button\n [color]=\"color\"\n [matTooltip]=\"'igo.context.contextManager.edit' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"edit.emit(context)\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n\n <button\n *ngIf=\"!context.hidden && !context.imported\"\n class=\"hide-button\"\n mat-icon-button\n [color]=\"color\"\n [matTooltip]=\"'igo.context.contextManager.hide' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"hide.emit(context)\"\n >\n <mat-icon>visibility</mat-icon>\n </button>\n\n <button\n *ngIf=\"context.hidden && !context.imported\"\n class=\"hide-button\"\n mat-icon-button\n [color]=\"color\"\n [matTooltip]=\"'igo.context.contextManager.show' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"show.emit(context)\"\n >\n <mat-icon>visibility_off</mat-icon>\n </button>\n\n <button\n *ngIf=\"\n context.permission === typePermission[typePermission.write] ||\n context.imported\n \"\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n [matTooltip]=\"'igo.context.contextManager.delete' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"delete.emit(context)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n <button\n class=\"actions-button\"\n mat-icon-button\n igoCollapse\n [color]=\"color\"\n [target]=\"actions\"\n [collapsed]=\"collapsed\"\n (click)=\"collapsed = !collapsed\"\n >\n <mat-icon>more_horiz</mat-icon>\n </button>\n </div>\n</mat-list-item>\n", styles: [":host{overflow:hidden}:host .igo-actions-container{flex-shrink:0}:host .igo-actions-expand-container{display:inline-flex}:host mat-icon.disabled{color:#00000061}:host button[matlistitemavatar]{margin-right:8px}\n"], dependencies: [{ kind: "ngmodule", type: MatListModule }, { kind: "component", type: i3.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i3.MatListItemAvatar, selector: "[matListItemAvatar]" }, { kind: "directive", type: i3.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i3.MatListItemMeta, selector: "[matListItemMeta]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: StopPropagationDirective, selector: "[igoStopPropagation]" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: CollapseDirective, selector: "[igoCollapse]", inputs: ["target", "collapsed"], outputs: ["toggle"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
55
|
-
}
|
|
56
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContextItemComponent, decorators: [{
|
|
57
|
-
type: Component,
|
|
58
|
-
args: [{ selector: 'igo-context-item', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
59
|
-
MatListModule,
|
|
60
|
-
NgClass,
|
|
61
|
-
NgIf,
|
|
62
|
-
MatButtonModule,
|
|
63
|
-
StopPropagationDirective,
|
|
64
|
-
MatTooltipModule,
|
|
65
|
-
MatIconModule,
|
|
66
|
-
CollapseDirective,
|
|
67
|
-
IgoLanguageModule
|
|
68
|
-
], template: "<mat-list-item\n class=\"mat-list-item\"\n [ngClass]=\"{ 'mat-list-item-light': hidden }\"\n>\n <button\n *ngIf=\"auth.authenticated\"\n matListItemAvatar\n mat-icon-button\n igoStopPropagation\n [matTooltip]=\"\n auth.authenticated\n ? ('igo.context.contextManager.favorite' | translate)\n : ''\n \"\n matTooltipShowDelay=\"500\"\n [color]=\"default ? 'primary' : 'default'\"\n (click)=\"favoriteClick(context)\"\n >\n <mat-icon *ngIf=\"!context.iconImage\">{{\n context.icon\n ? context.icon\n : context.scope === 'public'\n ? 'public'\n : 'star'\n }}</mat-icon>\n <img *ngIf=\"context.iconImage\" [src]=\"context.iconImage\" />\n </button>\n <button\n matListItemAvatar\n *ngIf=\"!auth.authenticated && showFavorite\"\n mat-icon-button\n igoStopPropagation\n [matTooltip]=\"'igo.context.contextManager.favorite' | translate\"\n matTooltipShowDelay=\"500\"\n [color]=\"default ? 'primary' : 'default'\"\n (click)=\"favoriteClick(context)\"\n >\n <mat-icon>star</mat-icon>\n </button>\n <span matListItemTitle>{{ context.title }}</span>\n\n <div\n *ngIf=\"auth.authenticated\"\n matListItemMeta\n igoStopPropagation\n class=\"igo-actions-container\"\n >\n <button\n *ngIf=\"\n collapsed &&\n selected &&\n (context.permission === typePermission[typePermission.write] ||\n context.imported)\n \"\n class=\"save-button\"\n mat-icon-button\n [matTooltip]=\"'igo.context.contextManager.save' | translate\"\n matTooltipShowDelay=\"500\"\n [color]=\"color\"\n (click)=\"save.emit(context)\"\n >\n <mat-icon>save</mat-icon>\n </button>\n\n <div #actions class=\"igo-actions-expand-container\">\n <button\n *ngIf=\"canShare && !context.imported\"\n mat-icon-button\n [matTooltip]=\"\n 'igo.context.contextManager.managePermissions' | translate\n \"\n matTooltipShowDelay=\"500\"\n [color]=\"color\"\n (click)=\"managePermissions.emit(context)\"\n >\n <mat-icon>manage_accounts</mat-icon>\n </button>\n\n <button\n *ngIf=\"!context.imported\"\n class=\"clone-button\"\n mat-icon-button\n [matTooltip]=\"'igo.context.contextManager.clone' | translate\"\n matTooltipShowDelay=\"500\"\n [color]=\"color\"\n (click)=\"clone.emit(context)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n\n <button\n *ngIf=\"\n context.permission === typePermission[typePermission.write] &&\n !context.imported\n \"\n class=\"edit-button\"\n mat-icon-button\n [color]=\"color\"\n [matTooltip]=\"'igo.context.contextManager.edit' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"edit.emit(context)\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n\n <button\n *ngIf=\"!context.hidden && !context.imported\"\n class=\"hide-button\"\n mat-icon-button\n [color]=\"color\"\n [matTooltip]=\"'igo.context.contextManager.hide' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"hide.emit(context)\"\n >\n <mat-icon>visibility</mat-icon>\n </button>\n\n <button\n *ngIf=\"context.hidden && !context.imported\"\n class=\"hide-button\"\n mat-icon-button\n [color]=\"color\"\n [matTooltip]=\"'igo.context.contextManager.show' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"show.emit(context)\"\n >\n <mat-icon>visibility_off</mat-icon>\n </button>\n\n <button\n *ngIf=\"\n context.permission === typePermission[typePermission.write] ||\n context.imported\n \"\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n [matTooltip]=\"'igo.context.contextManager.delete' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"delete.emit(context)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n <button\n class=\"actions-button\"\n mat-icon-button\n igoCollapse\n [color]=\"color\"\n [target]=\"actions\"\n [collapsed]=\"collapsed\"\n (click)=\"collapsed = !collapsed\"\n >\n <mat-icon>more_horiz</mat-icon>\n </button>\n </div>\n</mat-list-item>\n", styles: [":host{overflow:hidden}:host .igo-actions-container{flex-shrink:0}:host .igo-actions-expand-container{display:inline-flex}:host mat-icon.disabled{color:#00000061}:host button[matlistitemavatar]{margin-right:8px}\n"] }]
|
|
69
|
-
}], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.StorageService }], propDecorators: { showFavorite: [{
|
|
70
|
-
type: Input
|
|
71
|
-
}], context: [{
|
|
72
|
-
type: Input
|
|
73
|
-
}], default: [{
|
|
74
|
-
type: Input
|
|
75
|
-
}], selected: [{
|
|
76
|
-
type: Input
|
|
77
|
-
}], edit: [{
|
|
78
|
-
type: Output
|
|
79
|
-
}], delete: [{
|
|
80
|
-
type: Output
|
|
81
|
-
}], save: [{
|
|
82
|
-
type: Output
|
|
83
|
-
}], clone: [{
|
|
84
|
-
type: Output
|
|
85
|
-
}], hide: [{
|
|
86
|
-
type: Output
|
|
87
|
-
}], show: [{
|
|
88
|
-
type: Output
|
|
89
|
-
}], favorite: [{
|
|
90
|
-
type: Output
|
|
91
|
-
}], managePermissions: [{
|
|
92
|
-
type: Output
|
|
93
|
-
}], manageTools: [{
|
|
94
|
-
type: Output
|
|
95
|
-
}] } });
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbnRleHQvc3JjL2xpYi9jb250ZXh0LW1hbmFnZXIvY29udGV4dC1pdGVtL2NvbnRleHQtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb250ZXh0L3NyYy9saWIvY29udGV4dC1tYW5hZ2VyL2NvbnRleHQtaXRlbS9jb250ZXh0LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7OztBQXFCeEQsTUFBTSxPQUFPLG9CQUFvQjtJQTZCdEI7SUFDQztJQTdCSCxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ2hDLEtBQUssR0FBRyxTQUFTLENBQUM7SUFDbEIsU0FBUyxHQUFHLElBQUksQ0FBQztJQUVmLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDcEIsT0FBTyxDQUFrQjtJQUN6QixPQUFPLENBQVU7SUFDakIsUUFBUSxDQUFVO0lBRWpCLElBQUksR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztJQUMzQyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7SUFDN0MsSUFBSSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO0lBQzNDLEtBQUssR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztJQUM1QyxJQUFJLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7SUFDM0MsSUFBSSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO0lBQzNDLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztJQUMvQyxpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztJQUN4RCxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7SUFFNUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUM7SUFDdEQsQ0FBQztJQUVELFlBQ1MsSUFBaUIsRUFDaEIsY0FBOEI7UUFEL0IsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNoQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7SUFDckMsQ0FBQztJQUVKLGFBQWEsQ0FBQyxPQUF3QjtRQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO3dHQW5DVSxvQkFBb0I7NEZBQXBCLG9CQUFvQixxWEN4Q2pDLHM2SUE4SkEsNlFEaklJLGFBQWEsd2JBQ2IsT0FBTyxvRkFDUCxJQUFJLDRGQUNKLGVBQWUsNElBQ2Ysd0JBQXdCLGdFQUN4QixnQkFBZ0IsNFRBQ2hCLGFBQWEsb0xBQ2IsaUJBQWlCLCtHQUNqQixpQkFBaUI7OzRGQUdSLG9CQUFvQjtrQkFsQmhDLFNBQVM7K0JBQ0Usa0JBQWtCLG1CQUdYLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLGFBQWE7d0JBQ2IsT0FBTzt3QkFDUCxJQUFJO3dCQUNKLGVBQWU7d0JBQ2Ysd0JBQXdCO3dCQUN4QixnQkFBZ0I7d0JBQ2hCLGFBQWE7d0JBQ2IsaUJBQWlCO3dCQUNqQixpQkFBaUI7cUJBQ2xCOzZHQU9RLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0NsYXNzLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRMaXN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGlzdCc7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvYXV0aCc7XG5pbXBvcnQgeyBDb2xsYXBzZURpcmVjdGl2ZSB9IGZyb20gJ0BpZ28yL2NvbW1vbi9jb2xsYXBzaWJsZSc7XG5pbXBvcnQgeyBTdG9wUHJvcGFnYXRpb25EaXJlY3RpdmUgfSBmcm9tICdAaWdvMi9jb21tb24vc3RvcC1wcm9wYWdhdGlvbic7XG5pbXBvcnQgeyBJZ29MYW5ndWFnZU1vZHVsZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL3N0b3JhZ2UnO1xuXG5pbXBvcnQgeyBUeXBlUGVybWlzc2lvbiB9IGZyb20gJy4uL3NoYXJlZC9jb250ZXh0LmVudW0nO1xuaW1wb3J0IHsgRGV0YWlsZWRDb250ZXh0IH0gZnJvbSAnLi4vc2hhcmVkL2NvbnRleHQuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWdvLWNvbnRleHQtaXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb250ZXh0LWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb250ZXh0LWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRMaXN0TW9kdWxlLFxuICAgIE5nQ2xhc3MsXG4gICAgTmdJZixcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgU3RvcFByb3BhZ2F0aW9uRGlyZWN0aXZlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBDb2xsYXBzZURpcmVjdGl2ZSxcbiAgICBJZ29MYW5ndWFnZU1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIENvbnRleHRJdGVtQ29tcG9uZW50IHtcbiAgcHVibGljIHR5cGVQZXJtaXNzaW9uID0gVHlwZVBlcm1pc3Npb247XG4gIHB1YmxpYyBjb2xvciA9ICdwcmltYXJ5JztcbiAgcHVibGljIGNvbGxhcHNlZCA9IHRydWU7XG5cbiAgQElucHV0KCkgc2hvd0Zhdm9yaXRlID0gdHJ1ZTtcbiAgQElucHV0KCkgY29udGV4dDogRGV0YWlsZWRDb250ZXh0O1xuICBASW5wdXQoKSBkZWZhdWx0OiBib29sZWFuO1xuICBASW5wdXQoKSBzZWxlY3RlZDogYm9vbGVhbjtcblxuICBAT3V0cHV0KCkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8RGV0YWlsZWRDb250ZXh0PigpO1xuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxEZXRhaWxlZENvbnRleHQ+KCk7XG4gIEBPdXRwdXQoKSBzYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxEZXRhaWxlZENvbnRleHQ+KCk7XG4gIEBPdXRwdXQoKSBjbG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGV0YWlsZWRDb250ZXh0PigpO1xuICBAT3V0cHV0KCkgaGlkZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGV0YWlsZWRDb250ZXh0PigpO1xuICBAT3V0cHV0KCkgc2hvdyA9IG5ldyBFdmVudEVtaXR0ZXI8RGV0YWlsZWRDb250ZXh0PigpO1xuICBAT3V0cHV0KCkgZmF2b3JpdGUgPSBuZXcgRXZlbnRFbWl0dGVyPERldGFpbGVkQ29udGV4dD4oKTtcbiAgQE91dHB1dCgpIG1hbmFnZVBlcm1pc3Npb25zID0gbmV3IEV2ZW50RW1pdHRlcjxEZXRhaWxlZENvbnRleHQ+KCk7XG4gIEBPdXRwdXQoKSBtYW5hZ2VUb29scyA9IG5ldyBFdmVudEVtaXR0ZXI8RGV0YWlsZWRDb250ZXh0PigpO1xuXG4gIGdldCBoaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5oaWRkZW47XG4gIH1cblxuICBnZXQgY2FuU2hhcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KCdjYW5TaGFyZScpID09PSB0cnVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGF1dGg6IEF1dGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlXG4gICkge31cblxuICBmYXZvcml0ZUNsaWNrKGNvbnRleHQ6IERldGFpbGVkQ29udGV4dCkge1xuICAgIHRoaXMuZmF2b3JpdGUuZW1pdChjb250ZXh0KTtcbiAgfVxufVxuIiwiPG1hdC1saXN0LWl0ZW1cbiAgY2xhc3M9XCJtYXQtbGlzdC1pdGVtXCJcbiAgW25nQ2xhc3NdPVwieyAnbWF0LWxpc3QtaXRlbS1saWdodCc6IGhpZGRlbiB9XCJcbj5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiYXV0aC5hdXRoZW50aWNhdGVkXCJcbiAgICBtYXRMaXN0SXRlbUF2YXRhclxuICAgIG1hdC1pY29uLWJ1dHRvblxuICAgIGlnb1N0b3BQcm9wYWdhdGlvblxuICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgYXV0aC5hdXRoZW50aWNhdGVkXG4gICAgICAgID8gKCdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5mYXZvcml0ZScgfCB0cmFuc2xhdGUpXG4gICAgICAgIDogJydcbiAgICBcIlxuICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgIFtjb2xvcl09XCJkZWZhdWx0ID8gJ3ByaW1hcnknIDogJ2RlZmF1bHQnXCJcbiAgICAoY2xpY2spPVwiZmF2b3JpdGVDbGljayhjb250ZXh0KVwiXG4gID5cbiAgICA8bWF0LWljb24gKm5nSWY9XCIhY29udGV4dC5pY29uSW1hZ2VcIj57e1xuICAgICAgY29udGV4dC5pY29uXG4gICAgICAgID8gY29udGV4dC5pY29uXG4gICAgICAgIDogY29udGV4dC5zY29wZSA9PT0gJ3B1YmxpYydcbiAgICAgICAgICA/ICdwdWJsaWMnXG4gICAgICAgICAgOiAnc3RhcidcbiAgICB9fTwvbWF0LWljb24+XG4gICAgPGltZyAqbmdJZj1cImNvbnRleHQuaWNvbkltYWdlXCIgW3NyY109XCJjb250ZXh0Lmljb25JbWFnZVwiIC8+XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uXG4gICAgbWF0TGlzdEl0ZW1BdmF0YXJcbiAgICAqbmdJZj1cIiFhdXRoLmF1dGhlbnRpY2F0ZWQgJiYgc2hvd0Zhdm9yaXRlXCJcbiAgICBtYXQtaWNvbi1idXR0b25cbiAgICBpZ29TdG9wUHJvcGFnYXRpb25cbiAgICBbbWF0VG9vbHRpcF09XCInaWdvLmNvbnRleHQuY29udGV4dE1hbmFnZXIuZmF2b3JpdGUnIHwgdHJhbnNsYXRlXCJcbiAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICBbY29sb3JdPVwiZGVmYXVsdCA/ICdwcmltYXJ5JyA6ICdkZWZhdWx0J1wiXG4gICAgKGNsaWNrKT1cImZhdm9yaXRlQ2xpY2soY29udGV4dClcIlxuICA+XG4gICAgPG1hdC1pY29uPnN0YXI8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbiAgPHNwYW4gbWF0TGlzdEl0ZW1UaXRsZT57eyBjb250ZXh0LnRpdGxlIH19PC9zcGFuPlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cImF1dGguYXV0aGVudGljYXRlZFwiXG4gICAgbWF0TGlzdEl0ZW1NZXRhXG4gICAgaWdvU3RvcFByb3BhZ2F0aW9uXG4gICAgY2xhc3M9XCJpZ28tYWN0aW9ucy1jb250YWluZXJcIlxuICA+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgY29sbGFwc2VkICYmXG4gICAgICAgIHNlbGVjdGVkICYmXG4gICAgICAgIChjb250ZXh0LnBlcm1pc3Npb24gPT09IHR5cGVQZXJtaXNzaW9uW3R5cGVQZXJtaXNzaW9uLndyaXRlXSB8fFxuICAgICAgICAgIGNvbnRleHQuaW1wb3J0ZWQpXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJzYXZlLWJ1dHRvblwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5zYXZlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgIFtjb2xvcl09XCJjb2xvclwiXG4gICAgICAoY2xpY2spPVwic2F2ZS5lbWl0KGNvbnRleHQpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+c2F2ZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgICA8ZGl2ICNhY3Rpb25zIGNsYXNzPVwiaWdvLWFjdGlvbnMtZXhwYW5kLWNvbnRhaW5lclwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImNhblNoYXJlICYmICFjb250ZXh0LmltcG9ydGVkXCJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICAgICdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5tYW5hZ2VQZXJtaXNzaW9ucycgfCB0cmFuc2xhdGVcbiAgICAgICAgXCJcbiAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgIFtjb2xvcl09XCJjb2xvclwiXG4gICAgICAgIChjbGljayk9XCJtYW5hZ2VQZXJtaXNzaW9ucy5lbWl0KGNvbnRleHQpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPm1hbmFnZV9hY2NvdW50czwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIiFjb250ZXh0LmltcG9ydGVkXCJcbiAgICAgICAgY2xhc3M9XCJjbG9uZS1idXR0b25cIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmNsb25lJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgICAgICAoY2xpY2spPVwiY2xvbmUuZW1pdChjb250ZXh0KVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBjb250ZXh0LnBlcm1pc3Npb24gPT09IHR5cGVQZXJtaXNzaW9uW3R5cGVQZXJtaXNzaW9uLndyaXRlXSAmJlxuICAgICAgICAgICFjb250ZXh0LmltcG9ydGVkXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwiZWRpdC1idXR0b25cIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmVkaXQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgIChjbGljayk9XCJlZGl0LmVtaXQoY29udGV4dClcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIiFjb250ZXh0LmhpZGRlbiAmJiAhY29udGV4dC5pbXBvcnRlZFwiXG4gICAgICAgIGNsYXNzPVwiaGlkZS1idXR0b25cIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmhpZGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgIChjbGljayk9XCJoaWRlLmVtaXQoY29udGV4dClcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+dmlzaWJpbGl0eTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImNvbnRleHQuaGlkZGVuICYmICFjb250ZXh0LmltcG9ydGVkXCJcbiAgICAgICAgY2xhc3M9XCJoaWRlLWJ1dHRvblwiXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmNvbnRleHQuY29udGV4dE1hbmFnZXIuc2hvdycgfCB0cmFuc2xhdGVcIlxuICAgICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgICAgKGNsaWNrKT1cInNob3cuZW1pdChjb250ZXh0KVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj52aXNpYmlsaXR5X29mZjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGNvbnRleHQucGVybWlzc2lvbiA9PT0gdHlwZVBlcm1pc3Npb25bdHlwZVBlcm1pc3Npb24ud3JpdGVdIHx8XG4gICAgICAgICAgY29udGV4dC5pbXBvcnRlZFxuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cImRlbGV0ZS1idXR0b25cIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmRlbGV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgICAgKGNsaWNrKT1cImRlbGV0ZS5lbWl0KGNvbnRleHQpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYWN0aW9ucy1idXR0b25cIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBpZ29Db2xsYXBzZVxuICAgICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICAgIFt0YXJnZXRdPVwiYWN0aW9uc1wiXG4gICAgICBbY29sbGFwc2VkXT1cImNvbGxhcHNlZFwiXG4gICAgICAoY2xpY2spPVwiY29sbGFwc2VkID0gIWNvbGxhcHNlZFwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPm1vcmVfaG9yaXo8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbWF0LWxpc3QtaXRlbT5cbiJdfQ==
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export * from './context-item.component';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb250ZXh0L3NyYy9saWIvY29udGV4dC1tYW5hZ2VyL2NvbnRleHQtaXRlbS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jb250ZXh0LWl0ZW0uY29tcG9uZW50JztcbiJdfQ==
|
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectorRef, Directive, HostListener, Self } from '@angular/core';
|
|
2
|
-
import { AuthService } from '@igo2/auth';
|
|
3
|
-
import { ConfirmDialogService } from '@igo2/common/confirm-dialog';
|
|
4
|
-
import { LanguageService } from '@igo2/core/language';
|
|
5
|
-
import { MessageService } from '@igo2/core/message';
|
|
6
|
-
import { StorageService } from '@igo2/core/storage';
|
|
7
|
-
import { MapService } from '@igo2/geo';
|
|
8
|
-
import { debounceTime } from 'rxjs/operators';
|
|
9
|
-
import { ContextService } from '../shared/context.service';
|
|
10
|
-
import { ContextListComponent } from './context-list.component';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "./context-list.component";
|
|
13
|
-
import * as i2 from "../shared/context.service";
|
|
14
|
-
import * as i3 from "@igo2/geo";
|
|
15
|
-
import * as i4 from "@igo2/core/language";
|
|
16
|
-
import * as i5 from "@igo2/common/confirm-dialog";
|
|
17
|
-
import * as i6 from "@igo2/core/message";
|
|
18
|
-
import * as i7 from "@igo2/auth";
|
|
19
|
-
import * as i8 from "@igo2/core/storage";
|
|
20
|
-
export class ContextListBindingDirective {
|
|
21
|
-
contextService;
|
|
22
|
-
mapService;
|
|
23
|
-
languageService;
|
|
24
|
-
confirmDialogService;
|
|
25
|
-
messageService;
|
|
26
|
-
auth;
|
|
27
|
-
storageService;
|
|
28
|
-
cdRef;
|
|
29
|
-
component;
|
|
30
|
-
contexts$$;
|
|
31
|
-
selectedContext$$;
|
|
32
|
-
defaultContextId$$;
|
|
33
|
-
previousMessageId;
|
|
34
|
-
onSelect(context) {
|
|
35
|
-
this.contextService.loadContext(context.uri);
|
|
36
|
-
}
|
|
37
|
-
onEdit(context) {
|
|
38
|
-
this.contextService.loadEditedContext(context.uri);
|
|
39
|
-
}
|
|
40
|
-
onSave(context) {
|
|
41
|
-
const map = this.mapService.getMap();
|
|
42
|
-
const contextFromMap = this.contextService.getContextFromMap(map);
|
|
43
|
-
const msgSuccess = () => {
|
|
44
|
-
this.messageService.success('igo.context.contextManager.dialog.saveMsg', 'igo.context.contextManager.dialog.saveTitle', undefined, {
|
|
45
|
-
value: context.title
|
|
46
|
-
});
|
|
47
|
-
};
|
|
48
|
-
if (context.imported) {
|
|
49
|
-
contextFromMap.title = context.title;
|
|
50
|
-
this.contextService.delete(context.id, true);
|
|
51
|
-
this.contextService.create(contextFromMap).subscribe((contextCreated) => {
|
|
52
|
-
this.contextService.loadContext(contextCreated.uri);
|
|
53
|
-
msgSuccess();
|
|
54
|
-
});
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const changes = {
|
|
58
|
-
layers: contextFromMap.layers,
|
|
59
|
-
map: {
|
|
60
|
-
view: contextFromMap.map.view
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
this.contextService.update(context.id, changes).subscribe(() => {
|
|
64
|
-
msgSuccess();
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
onFavorite(context) {
|
|
68
|
-
if (!context.id) {
|
|
69
|
-
context.id = context.uri;
|
|
70
|
-
}
|
|
71
|
-
this.contextService.setDefault(context.id).subscribe(() => {
|
|
72
|
-
if (this.previousMessageId) {
|
|
73
|
-
this.messageService.remove(this.previousMessageId);
|
|
74
|
-
}
|
|
75
|
-
this.contextService.defaultContextId$.next(context.id);
|
|
76
|
-
const messageObj = this.messageService.success('igo.context.contextManager.dialog.favoriteMsg', 'igo.context.contextManager.dialog.favoriteTitle', undefined, {
|
|
77
|
-
value: context.title
|
|
78
|
-
});
|
|
79
|
-
this.previousMessageId = messageObj.toastId;
|
|
80
|
-
this.cdRef.detectChanges();
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
onManageTools(context) {
|
|
84
|
-
this.contextService.loadEditedContext(context.uri);
|
|
85
|
-
}
|
|
86
|
-
onManagePermissions(context) {
|
|
87
|
-
this.contextService.loadEditedContext(context.uri);
|
|
88
|
-
}
|
|
89
|
-
onDelete(context) {
|
|
90
|
-
const translate = this.languageService.translate;
|
|
91
|
-
this.confirmDialogService
|
|
92
|
-
.open(translate.instant('igo.context.contextManager.dialog.confirmDelete'))
|
|
93
|
-
.subscribe((confirm) => {
|
|
94
|
-
if (confirm) {
|
|
95
|
-
this.contextService
|
|
96
|
-
.delete(context.id, context.imported)
|
|
97
|
-
.subscribe(() => {
|
|
98
|
-
this.messageService.info('igo.context.contextManager.dialog.deleteMsg', 'igo.context.contextManager.dialog.deleteTitle', undefined, { value: context.title });
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
onClone(context) {
|
|
104
|
-
const properties = {
|
|
105
|
-
title: context.title + '-copy',
|
|
106
|
-
uri: context.uri + '-copy'
|
|
107
|
-
};
|
|
108
|
-
this.contextService.clone(context.id, properties).subscribe(() => {
|
|
109
|
-
this.messageService.success('igo.context.contextManager.dialog.cloneMsg', 'igo.context.contextManager.dialog.cloneTitle', undefined, { value: context.title });
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
onCreate(opts) {
|
|
113
|
-
const { title, empty } = opts;
|
|
114
|
-
const context = this.contextService.getContextFromMap(this.component.map, empty);
|
|
115
|
-
context.title = title;
|
|
116
|
-
this.contextService.create(context).subscribe(() => {
|
|
117
|
-
this.messageService.success('igo.context.bookmarkButton.dialog.createMsg', 'igo.context.bookmarkButton.dialog.createTitle', undefined, { value: context.title });
|
|
118
|
-
this.contextService.loadContext(context.uri);
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
loadContexts() {
|
|
122
|
-
const permissions = ['none'];
|
|
123
|
-
for (const p of this.component.permissions) {
|
|
124
|
-
if (p.checked === true || p.indeterminate === true) {
|
|
125
|
-
permissions.push(p.name);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
this.contextService.loadContexts(permissions, this.component.showHidden);
|
|
129
|
-
}
|
|
130
|
-
showHiddenContexts() {
|
|
131
|
-
this.component.showHidden = !this.component.showHidden;
|
|
132
|
-
this.storageService.set('contexts.showHidden', this.component.showHidden);
|
|
133
|
-
this.loadContexts();
|
|
134
|
-
}
|
|
135
|
-
onShowContext(context) {
|
|
136
|
-
this.contextService.showContext(context.id).subscribe();
|
|
137
|
-
}
|
|
138
|
-
onHideContext(context) {
|
|
139
|
-
this.contextService.hideContext(context.id).subscribe();
|
|
140
|
-
}
|
|
141
|
-
constructor(component, contextService, mapService, languageService, confirmDialogService, messageService, auth, storageService, cdRef) {
|
|
142
|
-
this.contextService = contextService;
|
|
143
|
-
this.mapService = mapService;
|
|
144
|
-
this.languageService = languageService;
|
|
145
|
-
this.confirmDialogService = confirmDialogService;
|
|
146
|
-
this.messageService = messageService;
|
|
147
|
-
this.auth = auth;
|
|
148
|
-
this.storageService = storageService;
|
|
149
|
-
this.cdRef = cdRef;
|
|
150
|
-
this.component = component;
|
|
151
|
-
}
|
|
152
|
-
ngOnInit() {
|
|
153
|
-
// Override input contexts
|
|
154
|
-
this.component.contexts = { ours: [] };
|
|
155
|
-
this.component.showHidden = this.storageService.get('contexts.showHidden');
|
|
156
|
-
this.contexts$$ = this.contextService.contexts$.subscribe((contexts) => this.handleContextsChange(contexts));
|
|
157
|
-
this.defaultContextId$$ = this.contextService.defaultContextId$.subscribe((id) => {
|
|
158
|
-
this.component.defaultContextId = id;
|
|
159
|
-
});
|
|
160
|
-
const storedContextUri = this.storageService.get('favorite.context.uri');
|
|
161
|
-
if (storedContextUri && !this.auth.authenticated) {
|
|
162
|
-
this.contextService.defaultContextId$.next(storedContextUri);
|
|
163
|
-
}
|
|
164
|
-
// See feature-list.component for an explanation about the debounce time
|
|
165
|
-
this.selectedContext$$ = this.contextService.context$
|
|
166
|
-
.pipe(debounceTime(100))
|
|
167
|
-
.subscribe((context) => (this.component.selectedContext = context));
|
|
168
|
-
this.auth.authenticate$.subscribe((authenticate) => {
|
|
169
|
-
if (authenticate) {
|
|
170
|
-
this.contextService.getProfilByUser().subscribe((profils) => {
|
|
171
|
-
this.component.users = profils;
|
|
172
|
-
this.component.permissions = [];
|
|
173
|
-
const profilsAcc = this.component.users.reduce((acc, cur) => {
|
|
174
|
-
acc = acc.concat(cur);
|
|
175
|
-
acc = cur.childs ? acc.concat(cur.childs) : acc;
|
|
176
|
-
return acc;
|
|
177
|
-
}, []);
|
|
178
|
-
for (const user of profilsAcc) {
|
|
179
|
-
const permission = {
|
|
180
|
-
name: user.name,
|
|
181
|
-
checked: this.storageService.get('contexts.permissions.' + user.name)
|
|
182
|
-
};
|
|
183
|
-
if (permission.checked === null) {
|
|
184
|
-
permission.checked = true;
|
|
185
|
-
}
|
|
186
|
-
this.component.permissions.push(permission);
|
|
187
|
-
}
|
|
188
|
-
const permissions = ['none'];
|
|
189
|
-
for (const p of this.component.permissions) {
|
|
190
|
-
if (p.checked === true || p.indeterminate === true) {
|
|
191
|
-
permissions.push(p.name);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
this.contextService.loadContexts(permissions, this.component.showHidden);
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
ngOnDestroy() {
|
|
200
|
-
this.contexts$$.unsubscribe();
|
|
201
|
-
this.selectedContext$$.unsubscribe();
|
|
202
|
-
this.defaultContextId$$.unsubscribe();
|
|
203
|
-
}
|
|
204
|
-
handleContextsChange(contexts) {
|
|
205
|
-
this.component.contexts = contexts;
|
|
206
|
-
}
|
|
207
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContextListBindingDirective, deps: [{ token: i1.ContextListComponent, self: true }, { token: i2.ContextService }, { token: i3.MapService }, { token: i4.LanguageService }, { token: i5.ConfirmDialogService }, { token: i6.MessageService }, { token: i7.AuthService }, { token: i8.StorageService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
208
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: ContextListBindingDirective, isStandalone: true, selector: "[igoContextListBinding]", host: { listeners: { "select": "onSelect($event)", "edit": "onEdit($event)", "save": "onSave($event)", "favorite": "onFavorite($event)", "manageTools": "onManageTools($event)", "managePermissions": "onManagePermissions($event)", "delete": "onDelete($event)", "clone": "onClone($event)", "create": "onCreate($event)", "filterPermissionsChanged": "loadContexts()", "showHiddenContexts": "showHiddenContexts()", "show": "onShowContext($event)", "hide": "onHideContext($event)" } }, providers: [ConfirmDialogService], ngImport: i0 });
|
|
209
|
-
}
|
|
210
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContextListBindingDirective, decorators: [{
|
|
211
|
-
type: Directive,
|
|
212
|
-
args: [{
|
|
213
|
-
selector: '[igoContextListBinding]',
|
|
214
|
-
standalone: true,
|
|
215
|
-
providers: [ConfirmDialogService]
|
|
216
|
-
}]
|
|
217
|
-
}], ctorParameters: () => [{ type: i1.ContextListComponent, decorators: [{
|
|
218
|
-
type: Self
|
|
219
|
-
}] }, { type: i2.ContextService }, { type: i3.MapService }, { type: i4.LanguageService }, { type: i5.ConfirmDialogService }, { type: i6.MessageService }, { type: i7.AuthService }, { type: i8.StorageService }, { type: i0.ChangeDetectorRef }], propDecorators: { onSelect: [{
|
|
220
|
-
type: HostListener,
|
|
221
|
-
args: ['select', ['$event']]
|
|
222
|
-
}], onEdit: [{
|
|
223
|
-
type: HostListener,
|
|
224
|
-
args: ['edit', ['$event']]
|
|
225
|
-
}], onSave: [{
|
|
226
|
-
type: HostListener,
|
|
227
|
-
args: ['save', ['$event']]
|
|
228
|
-
}], onFavorite: [{
|
|
229
|
-
type: HostListener,
|
|
230
|
-
args: ['favorite', ['$event']]
|
|
231
|
-
}], onManageTools: [{
|
|
232
|
-
type: HostListener,
|
|
233
|
-
args: ['manageTools', ['$event']]
|
|
234
|
-
}], onManagePermissions: [{
|
|
235
|
-
type: HostListener,
|
|
236
|
-
args: ['managePermissions', ['$event']]
|
|
237
|
-
}], onDelete: [{
|
|
238
|
-
type: HostListener,
|
|
239
|
-
args: ['delete', ['$event']]
|
|
240
|
-
}], onClone: [{
|
|
241
|
-
type: HostListener,
|
|
242
|
-
args: ['clone', ['$event']]
|
|
243
|
-
}], onCreate: [{
|
|
244
|
-
type: HostListener,
|
|
245
|
-
args: ['create', ['$event']]
|
|
246
|
-
}], loadContexts: [{
|
|
247
|
-
type: HostListener,
|
|
248
|
-
args: ['filterPermissionsChanged']
|
|
249
|
-
}], showHiddenContexts: [{
|
|
250
|
-
type: HostListener,
|
|
251
|
-
args: ['showHiddenContexts']
|
|
252
|
-
}], onShowContext: [{
|
|
253
|
-
type: HostListener,
|
|
254
|
-
args: ['show', ['$event']]
|
|
255
|
-
}], onHideContext: [{
|
|
256
|
-
type: HostListener,
|
|
257
|
-
args: ['hide', ['$event']]
|
|
258
|
-
}] } });
|
|
259
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1saXN0LWJpbmRpbmcuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29udGV4dC9zcmMvbGliL2NvbnRleHQtbWFuYWdlci9jb250ZXh0LWxpc3QvY29udGV4dC1saXN0LWJpbmRpbmcuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFHWixJQUFJLEVBQ0wsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVE5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7QUFPaEUsTUFBTSxPQUFPLDJCQUEyQjtJQWlMNUI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXZMRixTQUFTLENBQXVCO0lBQ2hDLFVBQVUsQ0FBZTtJQUN6QixpQkFBaUIsQ0FBZTtJQUNoQyxrQkFBa0IsQ0FBZTtJQUNqQyxpQkFBaUIsQ0FBQztJQUcxQixRQUFRLENBQUMsT0FBZ0I7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsT0FBTyxD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QyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBd0JwQyxhQUFhO3NCQURaLFlBQVk7dUJBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU12QyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTTdDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBd0JsQyxPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWlCakMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFvQmxDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQywwQkFBMEI7Z0JBYXhDLGtCQUFrQjtzQkFEakIsWUFBWTt1QkFBQyxvQkFBb0I7Z0JBUWxDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTWhDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRGlyZWN0aXZlLFxuICBIb3N0TGlzdGVuZXIsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBTZWxmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJ0BpZ28yL2F1dGgnO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb21tb24vY29uZmlybS1kaWFsb2cnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvbWVzc2FnZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvc3RvcmFnZSc7XG5pbXBvcnQgeyBNYXBTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvZ2VvJztcblxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIENvbnRleHRVc2VyUGVybWlzc2lvbixcbiAgQ29udGV4dHNMaXN0LFxuICBEZXRhaWxlZENvbnRleHRcbn0gZnJvbSAnLi4vc2hhcmVkL2NvbnRleHQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL2NvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBDb250ZXh0TGlzdENvbXBvbmVudCB9IGZyb20gJy4vY29udGV4dC1saXN0LmNvbXBvbmVudCc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tpZ29Db250ZXh0TGlzdEJpbmRpbmddJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbQ29uZmlybURpYWxvZ1NlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIENvbnRleHRMaXN0QmluZGluZ0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBjb21wb25lbnQ6IENvbnRleHRMaXN0Q29tcG9uZW50O1xuICBwcml2YXRlIGNvbnRleHRzJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBzZWxlY3RlZENvbnRleHQkJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGRlZmF1bHRDb250ZXh0SWQkJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHByZXZpb3VzTWVzc2FnZUlkO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdCcsIFsnJGV2ZW50J10pXG4gIG9uU2VsZWN0KGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmxvYWRDb250ZXh0KGNvbnRleHQudXJpKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2VkaXQnLCBbJyRldmVudCddKVxuICBvbkVkaXQoY29udGV4dDogQ29udGV4dCkge1xuICAgIHRoaXMuY29udGV4dFNlcnZpY2UubG9hZEVkaXRlZENvbnRleHQoY29udGV4dC51cmkpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignc2F2ZScsIFsnJGV2ZW50J10pXG4gIG9uU2F2ZShjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbWFwID0gdGhpcy5tYXBTZXJ2aWNlLmdldE1hcCgpO1xuICAgIGNvbnN0IGNvbnRleHRGcm9tTWFwID0gdGhpcy5jb250ZXh0U2VydmljZS5nZXRDb250ZXh0RnJvbU1hcChtYXApO1xuXG4gICAgY29uc3QgbXNnU3VjY2VzcyA9ICgpID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2Uuc3VjY2VzcyhcbiAgICAgICAgJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmRpYWxvZy5zYXZlTXNnJyxcbiAgICAgICAgJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmRpYWxvZy5zYXZlVGl0bGUnLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogY29udGV4dC50aXRsZVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH07XG5cbiAgICBpZiAoY29udGV4dC5pbXBvcnRlZCkge1xuICAgICAgY29udGV4dEZyb21NYXAudGl0bGUgPSBjb250ZXh0LnRpdGxlO1xuICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5kZWxldGUoY29udGV4dC5pZCwgdHJ1ZSk7XG4gICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmNyZWF0ZShjb250ZXh0RnJvbU1hcCkuc3Vic2NyaWJlKChjb250ZXh0Q3JlYXRlZCkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmxvYWRDb250ZXh0KGNvbnRleHRDcmVhdGVkLnVyaSk7XG4gICAgICAgIG1zZ1N1Y2Nlc3MoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYW5nZXM6IGFueSA9IHtcbiAgICAgIGxheWVyczogY29udGV4dEZyb21NYXAubGF5ZXJzLFxuICAgICAgbWFwOiB7XG4gICAgICAgIHZpZXc6IGNvbnRleHRGcm9tTWFwLm1hcC52aWV3XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuY29udGV4dFNlcnZpY2UudXBkYXRlKGNvbnRleHQuaWQsIGNoYW5nZXMpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBtc2dTdWNjZXNzKCk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdmYXZvcml0ZScsIFsnJGV2ZW50J10pXG4gIG9uRmF2b3JpdGUoY29udGV4dDogQ29udGV4dCkge1xuICAgIGlmICghY29udGV4dC5pZCkge1xuICAgICAgY29udGV4dC5pZCA9IGNvbnRleHQudXJpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnNldERlZmF1bHQoY29udGV4dC5pZCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnByZXZpb3VzTWVzc2FnZUlkKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UucmVtb3ZlKHRoaXMucHJldmlvdXNNZXNzYWdlSWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5kZWZhdWx0Q29udGV4dElkJC5uZXh0KGNvbnRleHQuaWQpO1xuICAgICAgY29uc3QgbWVzc2FnZU9iaiA9IHRoaXMubWVzc2FnZVNlcnZpY2Uuc3VjY2VzcyhcbiAgICAgICAgJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmRpYWxvZy5mYXZvcml0ZU1zZycsXG4gICAgICAgICdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5kaWFsb2cuZmF2b3JpdGVUaXRsZScsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiBjb250ZXh0LnRpdGxlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLnByZXZpb3VzTWVzc2FnZUlkID0gbWVzc2FnZU9iai50b2FzdElkO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtYW5hZ2VUb29scycsIFsnJGV2ZW50J10pXG4gIG9uTWFuYWdlVG9vbHMoY29udGV4dDogQ29udGV4dCkge1xuICAgIHRoaXMuY29udGV4dFNlcnZpY2UubG9hZEVkaXRlZENvbnRleHQoY29udGV4dC51cmkpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbWFuYWdlUGVybWlzc2lvbnMnLCBbJyRldmVudCddKVxuICBvbk1hbmFnZVBlcm1pc3Npb25zKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmxvYWRFZGl0ZWRDb250ZXh0KGNvbnRleHQudXJpKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RlbGV0ZScsIFsnJGV2ZW50J10pXG4gIG9uRGVsZXRlKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gICAgdGhpcy5jb25maXJtRGlhbG9nU2VydmljZVxuICAgICAgLm9wZW4oXG4gICAgICAgIHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5kaWFsb2cuY29uZmlybURlbGV0ZScpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChjb25maXJtKSA9PiB7XG4gICAgICAgIGlmIChjb25maXJtKSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZVxuICAgICAgICAgICAgLmRlbGV0ZShjb250ZXh0LmlkLCBjb250ZXh0LmltcG9ydGVkKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuaW5mbyhcbiAgICAgICAgICAgICAgICAnaWdvLmNvbnRleHQuY29udGV4dE1hbmFnZXIuZGlhbG9nLmRlbGV0ZU1zZycsXG4gICAgICAgICAgICAgICAgJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmRpYWxvZy5kZWxldGVUaXRsZScsXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHsgdmFsdWU6IGNvbnRleHQudGl0bGUgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xvbmUnLCBbJyRldmVudCddKVxuICBvbkNsb25lKGNvbnRleHQ6IERldGFpbGVkQ29udGV4dCkge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgICB0aXRsZTogY29udGV4dC50aXRsZSArICctY29weScsXG4gICAgICB1cmk6IGNvbnRleHQudXJpICsgJy1jb3B5J1xuICAgIH07XG4gICAgdGhpcy5jb250ZXh0U2VydmljZS5jbG9uZShjb250ZXh0LmlkLCBwcm9wZXJ0aWVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5zdWNjZXNzKFxuICAgICAgICAnaWdvLmNvbnRleHQuY29udGV4dE1hbmFnZXIuZGlhbG9nLmNsb25lTXNnJyxcbiAgICAgICAgJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmRpYWxvZy5jbG9uZVRpdGxlJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7IHZhbHVlOiBjb250ZXh0LnRpdGxlIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjcmVhdGUnLCBbJyRldmVudCddKVxuICBvbkNyZWF0ZShvcHRzOiB7IHRpdGxlOiBzdHJpbmc7IGVtcHR5OiBib29sZWFuIH0pIHtcbiAgICBjb25zdCB7IHRpdGxlLCBlbXB0eSB9ID0gb3B0cztcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0U2VydmljZS5nZXRDb250ZXh0RnJvbU1hcChcbiAgICAgIHRoaXMuY29tcG9uZW50Lm1hcCxcbiAgICAgIGVtcHR5XG4gICAgKTtcbiAgICBjb250ZXh0LnRpdGxlID0gdGl0bGU7XG4gICAgdGhpcy5jb250ZXh0U2VydmljZS5jcmVhdGUoY29udGV4dCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2Uuc3VjY2VzcyhcbiAgICAgICAgJ2lnby5jb250ZXh0LmJvb2ttYXJrQnV0dG9uLmRpYWxvZy5jcmVhdGVNc2cnLFxuICAgICAgICAnaWdvLmNvbnRleHQuYm9va21hcmtCdXR0b24uZGlhbG9nLmNyZWF0ZVRpdGxlJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7IHZhbHVlOiBjb250ZXh0LnRpdGxlIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmxvYWRDb250ZXh0KGNvbnRleHQudXJpKTtcbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2ZpbHRlclBlcm1pc3Npb25zQ2hhbmdlZCcpXG4gIGxvYWRDb250ZXh0cygpIHtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IFsnbm9uZSddO1xuICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLmNvbXBvbmVudC5wZXJtaXNzaW9ucykge1xuICAgICAgaWYgKHAuY2hlY2tlZCA9PT0gdHJ1ZSB8fCBwLmluZGV0ZXJtaW5hdGUgPT09IHRydWUpIHtcbiAgICAgICAgcGVybWlzc2lvbnMucHVzaChwLm5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29udGV4dFNlcnZpY2UubG9hZENvbnRleHRzKHBlcm1pc3Npb25zLCB0aGlzLmNvbXBvbmVudC5zaG93SGlkZGVuKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3Nob3dIaWRkZW5Db250ZXh0cycpXG4gIHNob3dIaWRkZW5Db250ZXh0cygpIHtcbiAgICB0aGlzLmNvbXBvbmVudC5zaG93SGlkZGVuID0gIXRoaXMuY29tcG9uZW50LnNob3dIaWRkZW47XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoJ2NvbnRleHRzLnNob3dIaWRkZW4nLCB0aGlzLmNvbXBvbmVudC5zaG93SGlkZGVuKTtcbiAgICB0aGlzLmxvYWRDb250ZXh0cygpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignc2hvdycsIFsnJGV2ZW50J10pXG4gIG9uU2hvd0NvbnRleHQoY29udGV4dDogRGV0YWlsZWRDb250ZXh0KSB7XG4gICAgdGhpcy5jb250ZXh0U2VydmljZS5zaG93Q29udGV4dChjb250ZXh0LmlkKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2hpZGUnLCBbJyRldmVudCddKVxuICBvbkhpZGVDb250ZXh0KGNvbnRleHQ6IERldGFpbGVkQ29udGV4dCkge1xuICAgIHRoaXMuY29udGV4dFNlcnZpY2UuaGlkZUNvbnRleHQoY29udGV4dC5pZCkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBAU2VsZigpIGNvbXBvbmVudDogQ29udGV4dExpc3RDb21wb25lbnQsXG4gICAgcHJpdmF0ZSBjb250ZXh0U2VydmljZTogQ29udGV4dFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYXBTZXJ2aWNlOiBNYXBTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maXJtRGlhbG9nU2VydmljZTogQ29uZmlybURpYWxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoOiBBdXRoU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIE92ZXJyaWRlIGlucHV0IGNvbnRleHRzXG4gICAgdGhpcy5jb21wb25lbnQuY29udGV4dHMgPSB7IG91cnM6IFtdIH07XG4gICAgdGhpcy5jb21wb25lbnQuc2hvd0hpZGRlbiA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KFxuICAgICAgJ2NvbnRleHRzLnNob3dIaWRkZW4nXG4gICAgKSBhcyBib29sZWFuO1xuXG4gICAgdGhpcy5jb250ZXh0cyQkID0gdGhpcy5jb250ZXh0U2VydmljZS5jb250ZXh0cyQuc3Vic2NyaWJlKChjb250ZXh0cykgPT5cbiAgICAgIHRoaXMuaGFuZGxlQ29udGV4dHNDaGFuZ2UoY29udGV4dHMpXG4gICAgKTtcblxuICAgIHRoaXMuZGVmYXVsdENvbnRleHRJZCQkID0gdGhpcy5jb250ZXh0U2VydmljZS5kZWZhdWx0Q29udGV4dElkJC5zdWJzY3JpYmUoXG4gICAgICAoaWQpID0+IHtcbiAgICAgICAgdGhpcy5jb21wb25lbnQuZGVmYXVsdENvbnRleHRJZCA9IGlkO1xuICAgICAgfVxuICAgICk7XG4gICAgY29uc3Qgc3RvcmVkQ29udGV4dFVyaSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KFxuICAgICAgJ2Zhdm9yaXRlLmNvbnRleHQudXJpJ1xuICAgICkgYXMgc3RyaW5nO1xuICAgIGlmIChzdG9yZWRDb250ZXh0VXJpICYmICF0aGlzLmF1dGguYXV0aGVudGljYXRlZCkge1xuICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5kZWZhdWx0Q29udGV4dElkJC5uZXh0KHN0b3JlZENvbnRleHRVcmkpO1xuICAgIH1cblxuICAgIC8vIFNlZSBmZWF0dXJlLWxpc3QuY29tcG9uZW50IGZvciBhbiBleHBsYW5hdGlvbiBhYm91dCB0aGUgZGVib3VuY2UgdGltZVxuICAgIHRoaXMuc2VsZWN0ZWRDb250ZXh0JCQgPSB0aGlzLmNvbnRleHRTZXJ2aWNlLmNvbnRleHQkXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNvbnRleHQpID0+ICh0aGlzLmNvbXBvbmVudC5zZWxlY3RlZENvbnRleHQgPSBjb250ZXh0KSk7XG5cbiAgICB0aGlzLmF1dGguYXV0aGVudGljYXRlJC5zdWJzY3JpYmUoKGF1dGhlbnRpY2F0ZSkgPT4ge1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZSkge1xuICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmdldFByb2ZpbEJ5VXNlcigpLnN1YnNjcmliZSgocHJvZmlscykgPT4ge1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50LnVzZXJzID0gcHJvZmlscztcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudC5wZXJtaXNzaW9ucyA9IFtdO1xuICAgICAgICAgIGNvbnN0IHByb2ZpbHNBY2MgPSB0aGlzLmNvbXBvbmVudC51c2Vycy5yZWR1Y2UoKGFjYywgY3VyKSA9PiB7XG4gICAgICAgICAgICBhY2MgPSBhY2MuY29uY2F0KGN1cik7XG4gICAgICAgICAgICBhY2MgPSBjdXIuY2hpbGRzID8gYWNjLmNvbmNhdChjdXIuY2hpbGRzKSA6IGFjYztcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwgW10pO1xuXG4gICAgICAgICAgZm9yIChjb25zdCB1c2VyIG9mIHByb2ZpbHNBY2MpIHtcbiAgICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb246IENvbnRleHRVc2VyUGVybWlzc2lvbiA9IHtcbiAgICAgICAgICAgICAgbmFtZTogdXNlci5uYW1lLFxuICAgICAgICAgICAgICBjaGVja2VkOiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldChcbiAgICAgICAgICAgICAgICAnY29udGV4dHMucGVybWlzc2lvbnMuJyArIHVzZXIubmFtZVxuICAgICAgICAgICAgICApIGFzIGJvb2xlYW5cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbi5jaGVja2VkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHBlcm1pc3Npb24uY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5wZXJtaXNzaW9ucy5wdXNoKHBlcm1pc3Npb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gWydub25lJ107XG4gICAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMuY29tcG9uZW50LnBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICBpZiAocC5jaGVja2VkID09PSB0cnVlIHx8IHAuaW5kZXRlcm1pbmF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKHAubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5sb2FkQ29udGV4dHMoXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50LnNob3dIaWRkZW5cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY29udGV4dHMkJC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2VsZWN0ZWRDb250ZXh0JCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRlZmF1bHRDb250ZXh0SWQkJC51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDb250ZXh0c0NoYW5nZShjb250ZXh0czogQ29udGV4dHNMaXN0KSB7XG4gICAgdGhpcy5jb21wb25lbnQuY29udGV4dHMgPSBjb250ZXh0cztcbiAgfVxufVxuIl19
|