@alauda-fe/common 1.4.6 → 1.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/api/project-api.service.d.ts +2 -0
  2. package/business/resource-select/{internals → exports}/icon/component.d.ts +1 -1
  3. package/business/resource-select/module.d.ts +16 -16
  4. package/business/resource-select/public-api.d.ts +4 -0
  5. package/core/types/k8s/core.d.ts +1 -2
  6. package/core/types/k8s/crd.d.ts +136 -36
  7. package/core/types/k8s/raw.d.ts +1 -0
  8. package/core/types/resource-definitions.d.ts +71 -1
  9. package/core/utils/operators.d.ts +5 -2
  10. package/esm2022/api/project-api.service.mjs +11 -1
  11. package/esm2022/business/resource-select/exports/cluster-list/component.mjs +75 -0
  12. package/esm2022/business/resource-select/{internals → exports}/icon/component.mjs +2 -2
  13. package/esm2022/business/resource-select/exports/namespace-list/component.mjs +477 -0
  14. package/esm2022/business/resource-select/exports/project-list/component.mjs +76 -0
  15. package/esm2022/business/resource-select/module.mjs +40 -39
  16. package/esm2022/business/resource-select/public-api.mjs +5 -1
  17. package/esm2022/core/constants/tokens.mjs +2 -2
  18. package/esm2022/core/types/k8s/core.mjs +1 -1
  19. package/esm2022/core/types/k8s/crd.mjs +10 -1
  20. package/esm2022/core/types/k8s/raw.mjs +2 -1
  21. package/esm2022/core/types/resource-definitions.mjs +36 -1
  22. package/esm2022/core/utils/operators.mjs +8 -2
  23. package/esm2022/grid-layout/components/grid/component.mjs +2 -2
  24. package/esm2022/page-scaffold/navigation/nav-menu/nav-menu.component.mjs +3 -3
  25. package/esm2022/page-scaffold/page-header/account-menu/component/component.mjs +47 -56
  26. package/esm2022/page-scaffold/page-header/account-menu/module.mjs +4 -5
  27. package/esm2022/page-scaffold/page-header/component.mjs +9 -8
  28. package/package.json +1 -1
  29. package/page-scaffold/page-header/account-menu/component/component.d.ts +1 -2
  30. package/page-scaffold/page-header/account-menu/module.d.ts +2 -2
  31. package/page-scaffold/page-header/component.d.ts +1 -1
  32. package/esm2022/business/resource-select/internals/cluster-list/component.mjs +0 -75
  33. package/esm2022/business/resource-select/internals/namespace-list/component.mjs +0 -477
  34. package/esm2022/business/resource-select/internals/project-list/component.mjs +0 -76
  35. /package/business/resource-select/{internals → exports}/cluster-list/component.d.ts +0 -0
  36. /package/business/resource-select/{internals → exports}/namespace-list/component.d.ts +0 -0
  37. /package/business/resource-select/{internals → exports}/project-list/component.d.ts +0 -0
@@ -0,0 +1,477 @@
1
+ import { HttpClient } from '@angular/common/http';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, TemplateRef, } from '@angular/core';
3
+ import { memoize, partition, uniq } from 'lodash-es';
4
+ import { ReplaySubject, combineLatest, forkJoin, of, catchError, finalize, map, startWith, switchMap, takeUntil, tap, } from 'rxjs';
5
+ import { API_GATEWAY, K8sUtilService, publishRef, getDomainAnnotation, DISPLAY_NAME, } from '../../../../core/public-api';
6
+ import { CommonLayoutContextService } from '../../../../page-scaffold/public-api';
7
+ import { ResourceListBase } from '../../base-list';
8
+ import { ResourceSelectContextService } from '../../context.service';
9
+ import { getDisplayArch, getWorkspaceParams } from '../../utils';
10
+ import { K8sApiService } from './../../../../api/public-api';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "../../../../page-scaffold/public-api";
13
+ import * as i2 from "./../../../../api/public-api";
14
+ import * as i3 from "@angular/common/http";
15
+ import * as i4 from "../../context.service";
16
+ import * as i5 from "../../../../core/public-api";
17
+ const _c0 = ["*"];
18
+ const _c1 = () => [];
19
+ const _c2 = (a0, a1) => ({ name: a0, displayName: a1 });
20
+ function NamespaceListComponent_aui_option_6_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelementStart(0, "aui-option", 7);
22
+ i0.ɵɵpipe(1, "aclUnionDisplayName");
23
+ i0.ɵɵtext(2);
24
+ i0.ɵɵpipe(3, "aclUnionDisplayName");
25
+ i0.ɵɵelementEnd();
26
+ } if (rf & 2) {
27
+ const project_r2 = ctx.$implicit;
28
+ i0.ɵɵproperty("value", project_r2)("label", i0.ɵɵpipeBind1(1, 3, project_r2));
29
+ i0.ɵɵadvance(2);
30
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 5, project_r2), " ");
31
+ } }
32
+ function NamespaceListComponent_aui_form_item_10_aui_option_5_ng_container_4_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelementContainerStart(0);
34
+ i0.ɵɵtext(1);
35
+ i0.ɵɵelementContainerEnd();
36
+ } if (rf & 2) {
37
+ const mesh_r5 = i0.ɵɵnextContext().$implicit;
38
+ i0.ɵɵadvance();
39
+ i0.ɵɵtextInterpolate1(" (Istio ", mesh_r5.spec.istioVersion, ") ");
40
+ } }
41
+ function NamespaceListComponent_aui_form_item_10_aui_option_5_Template(rf, ctx) { if (rf & 1) {
42
+ i0.ɵɵelementStart(0, "aui-option", 7);
43
+ i0.ɵɵpipe(1, "aclName");
44
+ i0.ɵɵtext(2);
45
+ i0.ɵɵpipe(3, "aclName");
46
+ i0.ɵɵtemplate(4, NamespaceListComponent_aui_form_item_10_aui_option_5_ng_container_4_Template, 2, 1, "ng-container", 5);
47
+ i0.ɵɵelementEnd();
48
+ } if (rf & 2) {
49
+ const mesh_r5 = ctx.$implicit;
50
+ i0.ɵɵproperty("value", mesh_r5)("label", i0.ɵɵpipeBind1(1, 4, mesh_r5) + ((mesh_r5.spec == null ? null : mesh_r5.spec.istioVersion) ? " (Istio " + mesh_r5.spec.istioVersion + ")" : ""));
51
+ i0.ɵɵadvance(2);
52
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 6, mesh_r5), " ");
53
+ i0.ɵɵadvance(2);
54
+ i0.ɵɵproperty("ngIf", mesh_r5.spec == null ? null : mesh_r5.spec.istioVersion);
55
+ } }
56
+ function NamespaceListComponent_aui_form_item_10_Template(rf, ctx) { if (rf & 1) {
57
+ const _r3 = i0.ɵɵgetCurrentView();
58
+ i0.ɵɵelementStart(0, "aui-form-item")(1, "label", 2);
59
+ i0.ɵɵtext(2);
60
+ i0.ɵɵpipe(3, "translate");
61
+ i0.ɵɵelementEnd();
62
+ i0.ɵɵelementStart(4, "aui-select", 11);
63
+ i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_aui_form_item_10_Template_aui_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r3.selectedServiceMesh, $event) || (ctx_r3.selectedServiceMesh = $event); return i0.ɵɵresetView($event); });
64
+ i0.ɵɵlistener("valueChange", function NamespaceListComponent_aui_form_item_10_Template_aui_select_valueChange_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.selectServiceMesh($event)); });
65
+ i0.ɵɵtemplate(5, NamespaceListComponent_aui_form_item_10_aui_option_5_Template, 5, 8, "aui-option", 4);
66
+ i0.ɵɵelementStart(6, "aui-option-placeholder");
67
+ i0.ɵɵtext(7);
68
+ i0.ɵɵpipe(8, "translate");
69
+ i0.ɵɵelementEnd()()();
70
+ } if (rf & 2) {
71
+ const ctx_r3 = i0.ɵɵnextContext();
72
+ i0.ɵɵadvance(2);
73
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 6, "service_mesh"));
74
+ i0.ɵɵadvance(2);
75
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r3.selectedServiceMesh);
76
+ i0.ɵɵproperty("trackFn", ctx_r3.serviceMeshTrackFn)("loading", !ctx_r3.projects.length && ctx_r3.projectsLoading);
77
+ i0.ɵɵadvance();
78
+ i0.ɵɵproperty("ngForOf", ctx_r3.projectServiceMeshes);
79
+ i0.ɵɵadvance(2);
80
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 8, "no_data"), " ");
81
+ } }
82
+ function NamespaceListComponent_ng_container_20_aui_option_1_ng_container_6_Template(rf, ctx) { if (rf & 1) {
83
+ i0.ɵɵelementContainer(0);
84
+ } }
85
+ function NamespaceListComponent_ng_container_20_aui_option_1_Template(rf, ctx) { if (rf & 1) {
86
+ i0.ɵɵelementStart(0, "aui-option", 13);
87
+ i0.ɵɵpipe(1, "pure");
88
+ i0.ɵɵpipe(2, "async");
89
+ i0.ɵɵpipe(3, "translate");
90
+ i0.ɵɵpipe(4, "pure");
91
+ i0.ɵɵpipe(5, "async");
92
+ i0.ɵɵtemplate(6, NamespaceListComponent_ng_container_20_aui_option_1_ng_container_6_Template, 1, 0, "ng-container", 14);
93
+ i0.ɵɵelementEnd();
94
+ } if (rf & 2) {
95
+ const cluster_r6 = ctx.declare;
96
+ const clusterName_r7 = i0.ɵɵnextContext().$implicit;
97
+ const ctx_r3 = i0.ɵɵnextContext();
98
+ const clusterLabel_r8 = i0.ɵɵreference(25);
99
+ i0.ɵɵproperty("value", clusterName_r7)("label", clusterLabel_r8)("labelContext", cluster_r6)("disabled", i0.ɵɵpipeBind1(2, 11, i0.ɵɵpipeBind2(1, 8, clusterName_r7, ctx_r3.checkClusterError$)))("auiTooltip", i0.ɵɵpipeBind1(3, 13, "current_cluster_status_abnormal"))("auiTooltipDisabled", !i0.ɵɵpipeBind1(5, 18, i0.ɵɵpipeBind2(4, 15, clusterName_r7, ctx_r3.checkClusterError$)));
100
+ i0.ɵɵadvance(6);
101
+ i0.ɵɵproperty("ngTemplateOutlet", clusterLabel_r8)("ngTemplateOutletContext", cluster_r6);
102
+ } }
103
+ function NamespaceListComponent_ng_container_20_Template(rf, ctx) { if (rf & 1) {
104
+ i0.ɵɵelementContainerStart(0);
105
+ i0.ɵɵtemplate(1, NamespaceListComponent_ng_container_20_aui_option_1_Template, 7, 20, "aui-option", 12);
106
+ i0.ɵɵpipe(2, "pure");
107
+ i0.ɵɵpipe(3, "async");
108
+ i0.ɵɵelementContainerEnd();
109
+ } if (rf & 2) {
110
+ const clusterName_r7 = ctx.$implicit;
111
+ const ctx_r3 = i0.ɵɵnextContext();
112
+ i0.ɵɵadvance();
113
+ i0.ɵɵproperty("declare", i0.ɵɵpureFunction2(6, _c2, clusterName_r7, i0.ɵɵpipeBind1(3, 4, i0.ɵɵpipeBind2(2, 1, clusterName_r7, ctx_r3.getClusterDisplayName$))));
114
+ } }
115
+ function NamespaceListComponent_ng_template_24_ng_container_1_Template(rf, ctx) { if (rf & 1) {
116
+ i0.ɵɵelementContainerStart(0);
117
+ i0.ɵɵtext(1);
118
+ i0.ɵɵelementContainerEnd();
119
+ } if (rf & 2) {
120
+ const displayName_r9 = i0.ɵɵnextContext().displayName;
121
+ i0.ɵɵadvance();
122
+ i0.ɵɵtextInterpolate1("(", displayName_r9, ")");
123
+ } }
124
+ function NamespaceListComponent_ng_template_24_Template(rf, ctx) { if (rf & 1) {
125
+ i0.ɵɵtext(0);
126
+ i0.ɵɵtemplate(1, NamespaceListComponent_ng_template_24_ng_container_1_Template, 2, 1, "ng-container", 5);
127
+ } if (rf & 2) {
128
+ const name_r10 = ctx.name;
129
+ const displayName_r9 = ctx.displayName;
130
+ i0.ɵɵtextInterpolate1(" ", name_r10, " ");
131
+ i0.ɵɵadvance();
132
+ i0.ɵɵproperty("ngIf", displayName_r9);
133
+ } }
134
+ export class NamespaceListComponent extends ResourceListBase {
135
+ constructor(commonLayoutService, k8sService, http, contextService, cdr, k8sUtil) {
136
+ super(cdr, k8sUtil, contextService);
137
+ this.commonLayoutService = commonLayoutService;
138
+ this.k8sService = k8sService;
139
+ this.http = http;
140
+ this.displayServiceMesh = false;
141
+ this.clusterChange = new EventEmitter();
142
+ this.projectChange = new EventEmitter();
143
+ this.projects = [];
144
+ this.clusters = [];
145
+ this.projectsLoading = true;
146
+ this.serviceMeshes = [];
147
+ this.projectServiceMeshes = [];
148
+ this.type = 'namespace';
149
+ this.displayedData = [];
150
+ this.namespaceClusterMap = {};
151
+ this.gridStateMap = {};
152
+ this.load$$ = new ReplaySubject(1);
153
+ this.serviceMeshes$ = this.k8sService
154
+ .getGlobalResourceList({
155
+ definition: {
156
+ apiGroup: 'asm.alauda.io',
157
+ apiVersion: 'v1alpha1',
158
+ type: 'servicemeshgroups',
159
+ },
160
+ namespaced: true,
161
+ })
162
+ .pipe(map(res => res.items));
163
+ this.clusters$ = this.http
164
+ .get(`${API_GATEWAY}/auth/v1/clusters?availableClusters=false`)
165
+ .pipe(map(res => res?.items), catchError(() => of([])), publishRef());
166
+ this.getClusterDisplayName$ = memoize((cluster) => this.clusters$.pipe(map(clusters => this.k8sUtil.getDisplayName(clusters.find(i => this.k8sUtil.getName(i) === cluster)))));
167
+ this.checkClusterError$ = memoize((cluster) => this.clusters$.pipe(map(clusters => this.checkClusterError(clusters, cluster))));
168
+ this.namespaces$ = combineLatest([
169
+ this.load$$,
170
+ this.reload$$.pipe(startWith(null)),
171
+ ]).pipe(switchMap(([{ project, cluster }]) => {
172
+ if (!project || !cluster) {
173
+ return of([]);
174
+ }
175
+ const clusters = cluster === '__all' ? this.clusters : [cluster];
176
+ return clusters.length
177
+ ? forkJoin(clusters.map(cluster => this.commonLayoutService
178
+ .getClusterNamespaces(project.metadata.name, cluster)
179
+ .pipe(catchError(() => of([]))))).pipe(tap(lists => {
180
+ this.namespaceClusterMap = lists.reduce((acc, cur, i) => ({
181
+ ...acc,
182
+ ...cur.reduce((subAcc, subCurr) => ({
183
+ ...subAcc,
184
+ [subCurr.metadata.uid]: clusters[i],
185
+ }), {}),
186
+ }), {});
187
+ }), map((lists) => lists.flat()))
188
+ : of([]);
189
+ }), takeUntil(this.destroy$$), publishRef());
190
+ this.projectFilterFn = (keyword = '', option) => {
191
+ const k = keyword.toLowerCase();
192
+ return (option.value.metadata.name.includes(k) ||
193
+ getDomainAnnotation(DISPLAY_NAME, option.value)
194
+ ?.toLowerCase()
195
+ ?.includes(k));
196
+ };
197
+ this.clusterFilterFn = (keyword = '', option) => {
198
+ const k = keyword.toLowerCase();
199
+ if (option.value === '__all') {
200
+ return option.label.toLowerCase().includes(k);
201
+ }
202
+ const { name, displayName } = option.labelContext;
203
+ return name.includes(k) || displayName?.toLowerCase()?.includes(k);
204
+ };
205
+ this.serviceMeshFilterFn = (keyword = '', option) => {
206
+ const k = keyword.toLowerCase();
207
+ const version = option.value.spec?.istioVersion
208
+ ? `Istio ${option.value.spec.istioVersion}`
209
+ : '';
210
+ return (option.value.metadata.name.includes(k) ||
211
+ version.toLowerCase()?.includes(k));
212
+ };
213
+ this.projectTrackFn = (project) => project?.metadata.name;
214
+ this.serviceMeshTrackFn = (mesh) => mesh?.metadata.name;
215
+ this.mapResource = (list, { isMultiArch, clusters, }) => list.map(item => {
216
+ const cluster = this.namespaceClusterMap[item.metadata.uid];
217
+ const itemDisabled = this.disableFn ? this.disableFn(item) : null;
218
+ const cachedItem = this.displayedData.find(ns => ns.__origin.metadata.uid === item.metadata.uid);
219
+ const servicemesh = this.serviceMeshes.find(item => item.spec.clusters.includes(cachedItem?.cluster || cluster));
220
+ return {
221
+ name: this.k8sUtil.getName(item),
222
+ displayName: this.k8sUtil.getDisplayName(item),
223
+ cluster: cachedItem?.cluster || cluster,
224
+ clusterDisplayName: cachedItem?.clusterDisplayName ||
225
+ this.k8sUtil.getDisplayName(clusters.find(c => c.metadata.name === cluster)),
226
+ clusterArch: cachedItem?.clusterArch || isMultiArch
227
+ ? this.getClusterArch(clusters.find(c => c.metadata.name === cluster))
228
+ : null,
229
+ serviceMeshName: servicemesh ? this.k8sUtil.getName(servicemesh) : '',
230
+ serviceMeshClusters: servicemesh ? servicemesh.spec.clusters : [],
231
+ serviceMeshIstioVersion: servicemesh
232
+ ? servicemesh.spec.istioVersion
233
+ : '',
234
+ admin: cachedItem?.admin || '-',
235
+ timestamp: this.k8sUtil.getCreationTimestamp(item),
236
+ state: {
237
+ disabled: this.gridStateMap[cluster]?.disabled ||
238
+ itemDisabled?.disabled ||
239
+ this.checkClusterError(clusters, cachedItem?.cluster || cluster) ||
240
+ false,
241
+ tooltip: this.gridStateMap[cluster]?.disabled
242
+ ? this.gridStateMap[cluster]?.tooltip || ''
243
+ : itemDisabled?.tooltip,
244
+ },
245
+ __origin: item,
246
+ };
247
+ });
248
+ }
249
+ ngOnInit() {
250
+ // From cache
251
+ this.projects = this.contextService.cachedProjectResources;
252
+ this.serviceMeshes = this.contextService.cachedServiceMeshGroupResources;
253
+ if (this.projects.length) {
254
+ this.initProject(this.projects);
255
+ }
256
+ // Get latest data in the background
257
+ forkJoin([
258
+ this.commonLayoutService
259
+ .getProjects()
260
+ .pipe(catchError(() => of([]))),
261
+ this.displayServiceMesh
262
+ ? this.serviceMeshes$
263
+ : of([]),
264
+ ])
265
+ .pipe(finalize(() => {
266
+ this.projectsLoading = false;
267
+ this.cdr.markForCheck();
268
+ }), takeUntil(this.destroy$$))
269
+ .subscribe(([projects, serviceMeshes]) => {
270
+ if (this.displayServiceMesh) {
271
+ this.serviceMeshes = serviceMeshes;
272
+ this.contextService.cachedServiceMeshGroupResources = serviceMeshes;
273
+ }
274
+ this.projects = projects;
275
+ if (!this.contextService.cachedProjectResources?.length) {
276
+ this.initProject(projects);
277
+ }
278
+ this.contextService.cachedProjectResources = this.projects;
279
+ });
280
+ combineLatest([this.clusters$, this.namespaces$]).subscribe(([clusters, data]) => {
281
+ const isMultiArch = uniq(clusters.map(c => this.k8sUtil.getLabel(c, 'arch'))).length > 1;
282
+ this.displayedData = this.mapResource(data, {
283
+ clusters,
284
+ isMultiArch,
285
+ }).filter(ns => this.context === 'page' || !ns.state?.disabled);
286
+ this.setSelectedNamespace(this.displayedData);
287
+ if (this.selectedUid) {
288
+ this.displayedData = this.getSortedNamespace(this.displayedData, this.value.name);
289
+ }
290
+ this.loading = false;
291
+ this.forceLoading = false;
292
+ this.storeNamespaces();
293
+ this.cdr.markForCheck();
294
+ });
295
+ }
296
+ getSortedNamespace(rawData, namespace) {
297
+ if (!namespace) {
298
+ return rawData;
299
+ }
300
+ const [selected, others] = partition(this.displayedData, item => item.name === namespace);
301
+ return [...selected, ...others];
302
+ }
303
+ storeNamespaces() {
304
+ if (!this.selectedProject) {
305
+ return;
306
+ }
307
+ if (this.selectedCluster === '__all') {
308
+ for (const cluster of this.clusters) {
309
+ this.contextService.storeNamespaces(this.selectedProject.metadata.name, cluster, this.displayedData.filter(item => item.cluster === cluster));
310
+ }
311
+ }
312
+ this.contextService.storeNamespaces(this.selectedProject.metadata.name, this.selectedCluster, this.displayedData);
313
+ }
314
+ initProject(projects) {
315
+ this.selectProject((projects || []).length
316
+ ? projects.find(item => item.metadata.name === this.value?.project) ||
317
+ projects[0]
318
+ : null, true);
319
+ this.load.emit({
320
+ project: projects.length,
321
+ cluster: uniq(projects.reduce((acc, cur) => [...acc, ...(cur.spec.clusters || []).map(c => c.name)], [])).length,
322
+ });
323
+ }
324
+ selectServiceMesh(serviceMesh) {
325
+ this.selectedServiceMesh = serviceMesh;
326
+ this.clusters = (this.selectedProject.spec.clusters || [])
327
+ .map(c => c.name)
328
+ .filter(cluster => this.serviceMeshes
329
+ .find(mesh => this.k8sUtil.getName(mesh) === this.k8sUtil.getName(serviceMesh))
330
+ .spec.clusters.includes(cluster));
331
+ this.selectCluster('__all');
332
+ }
333
+ selectProject(project, initial = false) {
334
+ this.projectChange.emit(project?.metadata.name);
335
+ this.selectedProject = project;
336
+ this.clusters = project
337
+ ? (project.spec.clusters || []).map(c => c.name)
338
+ : [];
339
+ if (this.displayServiceMesh) {
340
+ this.projectServiceMeshes = this.serviceMeshes.filter(mesh => mesh.spec.clusters.some(cluster => this.clusters.includes(cluster)));
341
+ if (this.projectServiceMeshes?.length) {
342
+ let meshName = this.value?.servicemesh;
343
+ if (!meshName) {
344
+ this.auth.getAccountInfo().subscribe(({ email }) => {
345
+ meshName = getWorkspaceParams(email)?.servicemesh;
346
+ });
347
+ }
348
+ const selectedServiceMesh = this.projectServiceMeshes.find(mesh => this.k8sUtil.getName(mesh) === meshName) || this.projectServiceMeshes[0];
349
+ this.selectServiceMesh(selectedServiceMesh);
350
+ }
351
+ else {
352
+ this.selectedServiceMesh = null;
353
+ this.clusters = [];
354
+ }
355
+ }
356
+ this.selectCluster('__all', initial);
357
+ }
358
+ selectCluster(clusterName, initial = false) {
359
+ this.selectedCluster = clusterName;
360
+ const displayedData = this.contextService.getCachedNamespaces(this.selectedProject?.metadata.name, this.selectedCluster) || [];
361
+ this.displayedData = this.getSortedNamespace(displayedData, initial ? this.value?.name : null);
362
+ this.setSelectedNamespace(this.displayedData);
363
+ this.clusterChange.emit(this.selectedCluster === '__all' ? null : clusterName);
364
+ this.loading = true;
365
+ this.load$$.next({
366
+ project: this.selectedProject,
367
+ cluster: clusterName,
368
+ });
369
+ }
370
+ setSelectedNamespace(data) {
371
+ const selectedNamespace = this.value
372
+ ? data.find(item => item.name === this.value.name &&
373
+ this.value.cluster === item.cluster)
374
+ : null;
375
+ this.selectedUid = selectedNamespace
376
+ ? selectedNamespace.__origin.metadata.uid
377
+ : null;
378
+ }
379
+ getClusterArch(cluster) {
380
+ return getDisplayArch(this.k8sUtil.getLabel(cluster, 'arch'));
381
+ }
382
+ checkClusterError(clusters, cluster) {
383
+ return (clusters
384
+ .find(i => this.k8sUtil.getName(i) === cluster)
385
+ ?.status.conditions.find(c => c.type === 'NodeNotReady')?.status !==
386
+ 'False');
387
+ }
388
+ static { this.ɵfac = function NamespaceListComponent_Factory(t) { return new (t || NamespaceListComponent)(i0.ɵɵdirectiveInject(i1.CommonLayoutContextService), i0.ɵɵdirectiveInject(i2.K8sApiService), i0.ɵɵdirectiveInject(i3.HttpClient), i0.ɵɵdirectiveInject(i4.ResourceSelectContextService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i5.K8sUtilService)); }; }
389
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NamespaceListComponent, selectors: [["acl-namespace-list"]], inputs: { actionTemplateRef: "actionTemplateRef", disableFn: "disableFn", value: "value", displayServiceMesh: "displayServiceMesh" }, outputs: { clusterChange: "clusterChange", projectChange: "projectChange" }, features: [i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 29, vars: 38, consts: [["clusterLabel", ""], [1, "filter"], ["auiFormItemLabel", ""], ["auiFormItemControl", "", "name", "project", 3, "ngModelChange", "valueChange", "ngClass", "ngModel", "filterFn", "trackFn", "loading"], [3, "value", "label", 4, "ngFor", "ngForOf"], [4, "ngIf"], ["auiFormItemControl", "", "name", "cluster", 3, "ngModelChange", "valueChange", "ngClass", "filterFn", "loading", "ngModel"], [3, "value", "label"], [4, "ngFor", "ngForOf"], [3, "selectItem", "reload", "data", "fields", "context", "actionTemplateRef", "selectedUid", "loading"], ["aclResourceGridHeader", ""], ["auiFormItemControl", "", "name", "serviceMeshProject", 1, "lang-not-zh:!tw-w-[230px]", 3, "ngModelChange", "valueChange", "ngModel", "trackFn", "loading"], [3, "value", "label", "labelContext", "disabled", "auiTooltip", "auiTooltipDisabled", 4, "declare"], [3, "value", "label", "labelContext", "disabled", "auiTooltip", "auiTooltipDisabled"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"]], template: function NamespaceListComponent_Template(rf, ctx) { if (rf & 1) {
390
+ const _r1 = i0.ɵɵgetCurrentView();
391
+ i0.ɵɵprojectionDef();
392
+ i0.ɵɵelementStart(0, "div", 1)(1, "aui-form-item")(2, "label", 2);
393
+ i0.ɵɵtext(3);
394
+ i0.ɵɵpipe(4, "translate");
395
+ i0.ɵɵelementEnd();
396
+ i0.ɵɵelementStart(5, "aui-select", 3);
397
+ i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_Template_aui_select_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedProject, $event) || (ctx.selectedProject = $event); return i0.ɵɵresetView($event); });
398
+ i0.ɵɵlistener("valueChange", function NamespaceListComponent_Template_aui_select_valueChange_5_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.selectProject($event)); });
399
+ i0.ɵɵtemplate(6, NamespaceListComponent_aui_option_6_Template, 4, 7, "aui-option", 4);
400
+ i0.ɵɵelementStart(7, "aui-option-placeholder");
401
+ i0.ɵɵtext(8);
402
+ i0.ɵɵpipe(9, "translate");
403
+ i0.ɵɵelementEnd()()();
404
+ i0.ɵɵtemplate(10, NamespaceListComponent_aui_form_item_10_Template, 9, 10, "aui-form-item", 5);
405
+ i0.ɵɵelementStart(11, "aui-form-item")(12, "label", 2);
406
+ i0.ɵɵtext(13);
407
+ i0.ɵɵpipe(14, "translate");
408
+ i0.ɵɵelementEnd();
409
+ i0.ɵɵelementStart(15, "aui-select", 6);
410
+ i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_Template_aui_select_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedCluster, $event) || (ctx.selectedCluster = $event); return i0.ɵɵresetView($event); });
411
+ i0.ɵɵlistener("valueChange", function NamespaceListComponent_Template_aui_select_valueChange_15_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.selectCluster($event)); });
412
+ i0.ɵɵelementStart(16, "aui-option", 7);
413
+ i0.ɵɵpipe(17, "translate");
414
+ i0.ɵɵtext(18);
415
+ i0.ɵɵpipe(19, "translate");
416
+ i0.ɵɵelementEnd();
417
+ i0.ɵɵtemplate(20, NamespaceListComponent_ng_container_20_Template, 4, 9, "ng-container", 8);
418
+ i0.ɵɵelementStart(21, "aui-option-placeholder");
419
+ i0.ɵɵtext(22);
420
+ i0.ɵɵpipe(23, "translate");
421
+ i0.ɵɵelementEnd();
422
+ i0.ɵɵtemplate(24, NamespaceListComponent_ng_template_24_Template, 2, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
423
+ i0.ɵɵelementEnd()()();
424
+ i0.ɵɵelementStart(26, "acl-resource-data-grid", 9);
425
+ i0.ɵɵlistener("selectItem", function NamespaceListComponent_Template_acl_resource_data_grid_selectItem_26_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSelect($event)); })("reload", function NamespaceListComponent_Template_acl_resource_data_grid_reload_26_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.reload()); });
426
+ i0.ɵɵelementContainerStart(27, 10);
427
+ i0.ɵɵprojection(28);
428
+ i0.ɵɵelementContainerEnd();
429
+ i0.ɵɵelementEnd();
430
+ } if (rf & 2) {
431
+ i0.ɵɵadvance(3);
432
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 25, "project"));
433
+ i0.ɵɵadvance(2);
434
+ i0.ɵɵproperty("ngClass", ctx.displayServiceMesh ? "lang-not-zh:!tw-w-[230px]" : "");
435
+ i0.ɵɵtwoWayProperty("ngModel", ctx.selectedProject);
436
+ i0.ɵɵproperty("filterFn", ctx.projectFilterFn)("trackFn", ctx.projectTrackFn)("loading", !ctx.projects.length && ctx.projectsLoading);
437
+ i0.ɵɵadvance();
438
+ i0.ɵɵproperty("ngForOf", ctx.projects);
439
+ i0.ɵɵadvance(2);
440
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(9, 27, "no_data"), " ");
441
+ i0.ɵɵadvance(2);
442
+ i0.ɵɵproperty("ngIf", ctx.displayServiceMesh);
443
+ i0.ɵɵadvance(3);
444
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 29, "cluster"));
445
+ i0.ɵɵadvance(2);
446
+ i0.ɵɵproperty("ngClass", ctx.displayServiceMesh ? "lang-not-zh:!tw-w-[230px]" : "")("filterFn", ctx.clusterFilterFn)("loading", !ctx.projects.length && ctx.projectsLoading);
447
+ i0.ɵɵtwoWayProperty("ngModel", ctx.selectedCluster);
448
+ i0.ɵɵadvance();
449
+ i0.ɵɵproperty("value", "__all")("label", i0.ɵɵpipeBind1(17, 31, "all"));
450
+ i0.ɵɵadvance(2);
451
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(19, 33, "all"), " ");
452
+ i0.ɵɵadvance(2);
453
+ i0.ɵɵproperty("ngForOf", ctx.clusters);
454
+ i0.ɵɵadvance(2);
455
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(23, 35, "no_data"), " ");
456
+ i0.ɵɵadvance(4);
457
+ i0.ɵɵproperty("data", ctx.displayedData || i0.ɵɵpureFunction0(37, _c1))("fields", ctx.fields)("context", ctx.context)("actionTemplateRef", ctx.actionTemplateRef)("selectedUid", ctx.selectedUid)("loading", ctx.forceLoading || !(ctx.displayedData == null ? null : ctx.displayedData.length) && ctx.loading);
458
+ } }, styles: ["[_nghost-%COMP%]{display:flex;flex:1;flex-direction:column}.filter[_ngcontent-%COMP%]{display:flex;padding:20px;margin-bottom:20px;box-shadow:0 0 4px rgba(var(--aui-color-n-1),.16);background-color:rgb(var(--aui-color-n-10));border-radius:4px}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%]{margin-right:20px}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-form-item{margin-bottom:0}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-form-item__label-wrapper{width:auto!important}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-input{color:rgb(var(--aui-color-n-2))}.filter[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{font-weight:500}.filter[_ngcontent-%COMP%] aui-select[_ngcontent-%COMP%]{width:260px}"], changeDetection: 0 }); }
459
+ }
460
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NamespaceListComponent, [{
461
+ type: Component,
462
+ args: [{ selector: 'acl-namespace-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"filter\">\n <aui-form-item>\n <label auiFormItemLabel>{{ 'project' | translate }}</label>\n <aui-select\n [ngClass]=\"displayServiceMesh ? 'lang-not-zh:!tw-w-[230px]' : ''\"\n auiFormItemControl\n name=\"project\"\n [(ngModel)]=\"selectedProject\"\n [filterFn]=\"projectFilterFn\"\n [trackFn]=\"projectTrackFn\"\n (valueChange)=\"selectProject($event)\"\n [loading]=\"!projects.length && projectsLoading\"\n >\n <aui-option\n *ngFor=\"let project of projects\"\n [value]=\"project\"\n [label]=\"project | aclUnionDisplayName\"\n >\n {{ project | aclUnionDisplayName }}\n </aui-option>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n </aui-select>\n </aui-form-item>\n <!-- ASM \u9009\u62E9\u7F51\u683C\u8FC7\u6EE4\u96C6\u7FA4\u9009\u9879 -->\n <aui-form-item *ngIf=\"displayServiceMesh\">\n <label auiFormItemLabel>{{ 'service_mesh' | translate }}</label>\n <aui-select\n class=\"lang-not-zh:!tw-w-[230px]\"\n auiFormItemControl\n name=\"serviceMeshProject\"\n [(ngModel)]=\"selectedServiceMesh\"\n [trackFn]=\"serviceMeshTrackFn\"\n (valueChange)=\"selectServiceMesh($event)\"\n [loading]=\"!projects.length && projectsLoading\"\n >\n <aui-option\n *ngFor=\"let mesh of projectServiceMeshes\"\n [value]=\"mesh\"\n [label]=\"\n (mesh | aclName) +\n (mesh.spec?.istioVersion\n ? ' (Istio ' + mesh.spec.istioVersion + ')'\n : '')\n \"\n >\n {{ mesh | aclName }}\n <ng-container *ngIf=\"mesh.spec?.istioVersion\">\n (Istio {{ mesh.spec.istioVersion }})\n </ng-container>\n </aui-option>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n </aui-select>\n </aui-form-item>\n <aui-form-item>\n <label auiFormItemLabel>{{ 'cluster' | translate }}</label>\n <aui-select\n [ngClass]=\"displayServiceMesh ? 'lang-not-zh:!tw-w-[230px]' : ''\"\n auiFormItemControl\n name=\"cluster\"\n [filterFn]=\"clusterFilterFn\"\n [loading]=\"!projects.length && projectsLoading\"\n [(ngModel)]=\"selectedCluster\"\n (valueChange)=\"selectCluster($event)\"\n >\n <aui-option\n [value]=\"'__all'\"\n [label]=\"'all' | translate\"\n >\n {{ 'all' | translate }}\n </aui-option>\n <ng-container *ngFor=\"let clusterName of clusters\">\n <aui-option\n *declare=\"{\n name: clusterName,\n displayName: clusterName | pure: getClusterDisplayName$ | async,\n } as cluster\"\n [value]=\"clusterName\"\n [label]=\"clusterLabel\"\n [labelContext]=\"cluster\"\n [disabled]=\"clusterName | pure: checkClusterError$ | async\"\n [auiTooltip]=\"'current_cluster_status_abnormal' | translate\"\n [auiTooltipDisabled]=\"\n !(clusterName | pure: checkClusterError$ | async)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"clusterLabel; context: cluster\"\n ></ng-container>\n </aui-option>\n </ng-container>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n <ng-template\n #clusterLabel\n let-name=\"name\"\n let-displayName=\"displayName\"\n >\n {{ name }}\n <ng-container *ngIf=\"displayName\">({{ displayName }})</ng-container>\n </ng-template>\n </aui-select>\n </aui-form-item>\n</div>\n<acl-resource-data-grid\n [data]=\"displayedData || []\"\n [fields]=\"fields\"\n [context]=\"context\"\n (selectItem)=\"onSelect($event)\"\n [actionTemplateRef]=\"actionTemplateRef\"\n [selectedUid]=\"selectedUid\"\n [loading]=\"forceLoading || (!displayedData?.length && loading)\"\n (reload)=\"reload()\"\n>\n <ng-container aclResourceGridHeader>\n <ng-content></ng-content>\n </ng-container>\n</acl-resource-data-grid>\n", styles: [":host{display:flex;flex:1;flex-direction:column}.filter{display:flex;padding:20px;margin-bottom:20px;box-shadow:0 0 4px rgba(var(--aui-color-n-1),.16);background-color:rgb(var(--aui-color-n-10));border-radius:4px}.filter aui-form-item{margin-right:20px}.filter aui-form-item ::ng-deep .aui-form-item{margin-bottom:0}.filter aui-form-item ::ng-deep .aui-form-item__label-wrapper{width:auto!important}.filter aui-form-item ::ng-deep .aui-input{color:rgb(var(--aui-color-n-2))}.filter label{font-weight:500}.filter aui-select{width:260px}\n"] }]
463
+ }], () => [{ type: i1.CommonLayoutContextService }, { type: i2.K8sApiService }, { type: i3.HttpClient }, { type: i4.ResourceSelectContextService }, { type: i0.ChangeDetectorRef }, { type: i5.K8sUtilService }], { actionTemplateRef: [{
464
+ type: Input
465
+ }], disableFn: [{
466
+ type: Input
467
+ }], value: [{
468
+ type: Input
469
+ }], displayServiceMesh: [{
470
+ type: Input
471
+ }], clusterChange: [{
472
+ type: Output
473
+ }], projectChange: [{
474
+ type: Output
475
+ }] }); })();
476
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(NamespaceListComponent, { className: "NamespaceListComponent", filePath: "business/resource-select/exports/namespace-list/component.ts", lineNumber: 60 }); })();
477
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2J1c2luZXNzL3Jlc291cmNlLXNlbGVjdC9leHBvcnRzL25hbWVzcGFjZS1saXN0L2NvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9idXNpbmVzcy9yZXNvdXJjZS1zZWxlY3QvZXhwb3J0cy9uYW1lc3BhY2UtbGlzdC90ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixRQUFRLEVBQ1IsRUFBRSxFQUNGLFVBQVUsRUFDVixRQUFRLEVBQ1IsR0FBRyxFQUNILFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFDTCxXQUFXLEVBRVgsY0FBYyxFQUVkLFVBQVUsRUFJVixtQkFBbUIsRUFDbkIsWUFBWSxHQUNiLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFB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QUFLO1lBSU4sS0FBSztrQkFESixLQUFLO1lBSU4sa0JBQWtCO2tCQURqQixLQUFLO1lBSU4sYUFBYTtrQkFEWixNQUFNO1lBSVAsYUFBYTtrQkFEWixNQUFNOztrRkFuQkksc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0RmlsdGVyT3B0aW9uIH0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG1lbW9pemUsIHBhcnRpdGlvbiwgdW5pcSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQge1xuICBSZXBsYXlTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBmb3JrSm9pbixcbiAgb2YsXG4gIGNhdGNoRXJyb3IsXG4gIGZpbmFsaXplLFxuICBtYXAsXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIEFQSV9HQVRFV0FZLFxuICBDbHVzdGVyLFxuICBLOHNVdGlsU2VydmljZSxcbiAgUHJvamVjdCxcbiAgcHVibGlzaFJlZixcbiAgU2VydmljZU1lc2hHcm91cCxcbiAgS3ViZXJuZXRlc1Jlc291cmNlLFxuICBLdWJlcm5ldGVzUmVzb3VyY2VMaXN0LFxuICBnZXREb21haW5Bbm5vdGF0aW9uLFxuICBESVNQTEFZX05BTUUsXG59IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBDb21tb25MYXlvdXRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3BhZ2Utc2NhZmZvbGQvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBSZXNvdXJjZUxpc3RCYXNlIH0gZnJvbSAnLi4vLi4vYmFzZS1saXN0JztcbmltcG9ydCB7IFJlc291cmNlU2VsZWN0Q29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0RGlzcGxheUFyY2gsIGdldFdvcmtzcGFjZVBhcmFtcyB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IHsgSzhzQXBpU2VydmljZSB9IGZyb20gJy4vLi4vLi4vLi4vLi4vYXBpL3B1YmxpYy1hcGknO1xuaW1wb3J0IHtcbiAgQ2x1c3RlckFyY2gsXG4gIERpc2FibGVGbixcbiAgTmFtZXNwYWNlRGF0YUl0ZW0sXG4gIFNlbGVjdGVkTmFtZXNwYWNlVmFsdWUsXG59IGZyb20gJy4vLi4vLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhY2wtbmFtZXNwYWNlLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVtcGxhdGUuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0eWxlLnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5hbWVzcGFjZUxpc3RDb21wb25lbnRcbiAgZXh0ZW5kcyBSZXNvdXJjZUxpc3RCYXNlXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3lcbntcbiAgQElucHV0KClcbiAgYWN0aW9uVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KClcbiAgZGlzYWJsZUZuOiBEaXNhYmxlRm47XG5cbiAgQElucHV0KClcbiAgdmFsdWU6IFNlbGVjdGVkTmFtZXNwYWNlVmFsdWU7XG5cbiAgQElucHV0KClcbiAgZGlzcGxheVNlcnZpY2VNZXNoID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpXG4gIGNsdXN0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAT3V0cHV0KClcbiAgcHJvamVjdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHByb2plY3RzOiBQcm9qZWN0W10gPSBbXTtcblxuICBzZWxlY3RlZFByb2plY3Q6IFByb2plY3Q7XG4gIHNlbGVjdGVkQ2x1c3Rlcjogc3RyaW5nO1xuICBjbHVzdGVyczogc3RyaW5nW10gPSBbXTtcbiAgcHJvamVjdHNMb2FkaW5nID0gdHJ1ZTtcblxuICBzZXJ2aWNlTWVzaGVzOiBTZXJ2aWNlTWVzaEdyb3VwW10gPSBbXTtcbiAgcHJvamVjdFNlcnZpY2VNZXNoZXM6IFNlcnZpY2VNZXNoR3JvdXBbXSA9IFtdO1xuICBzZWxlY3RlZFNlcnZpY2VNZXNoOiBTZXJ2aWNlTWVzaEdyb3VwO1xuXG4gIHR5cGUgPSAnbmFtZXNwYWNlJztcblxuICBkaXNwbGF5ZWREYXRhOiBOYW1lc3BhY2VEYXRhSXRlbVtdID0gW107XG5cbiAgbmFtZXNwYWNlQ2x1c3Rlck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGdyaWRTdGF0ZU1hcDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTxEaXNhYmxlRm4+PiA9IHt9O1xuXG4gIHNlbGVjdGVkVWlkOiBzdHJpbmc7XG5cbiAgbG9hZCQkID0gbmV3IFJlcGxheVN1YmplY3Q8eyBwcm9qZWN0OiBQcm9qZWN0OyBjbHVzdGVyOiBzdHJpbmcgfT4oMSk7XG5cbiAgc2VydmljZU1lc2hlcyQgPSB0aGlzLms4c1NlcnZpY2VcbiAgICAuZ2V0R2xvYmFsUmVzb3VyY2VMaXN0PFNlcnZpY2VNZXNoR3JvdXA+KHtcbiAgICAgIGRlZmluaXRpb246IHtcbiAgICAgICAgYXBpR3JvdXA6ICdhc20uYWxhdWRhLmlvJyxcbiAgICAgICAgYXBpVmVyc2lvbjogJ3YxYWxwaGExJyxcbiAgICAgICAgdHlwZTogJ3NlcnZpY2VtZXNoZ3JvdXBzJyxcbiAgICAgIH0sXG4gICAgICBuYW1lc3BhY2VkOiB0cnVlLFxuICAgIH0pXG4gICAgLnBpcGUobWFwKHJlcyA9PiByZXMuaXRlbXMpKTtcblxuICBjbHVzdGVycyQgPSB0aGlzLmh0dHBcbiAgICAuZ2V0PFxuICAgICAgS3ViZXJuZXRlc1Jlc291cmNlTGlzdDxDbHVzdGVyPlxuICAgID4oYCR7QVBJX0dBVEVXQVl9L2F1dGgvdjEvY2x1c3RlcnM/YXZhaWxhYmxlQ2x1c3RlcnM9ZmFsc2VgKVxuICAgIC5waXBlKFxuICAgICAgbWFwKHJlcyA9PiByZXM/Lml0ZW1zKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgQ2x1c3RlcltdKSksXG4gICAgICBwdWJsaXNoUmVmKCksXG4gICAgKTtcblxuICBnZXRDbHVzdGVyRGlzcGxheU5hbWUkID0gbWVtb2l6ZSgoY2x1c3Rlcjogc3RyaW5nKSA9PlxuICAgIHRoaXMuY2x1c3RlcnMkLnBpcGUoXG4gICAgICBtYXAoY2x1c3RlcnMgPT5cbiAgICAgICAgdGhpcy5rOHNVdGlsLmdldERpc3BsYXlOYW1lKFxuICAgICAgICAgIGNsdXN0ZXJzLmZpbmQoaSA9PiB0aGlzLms4c1V0aWwuZ2V0TmFtZShpKSA9PT0gY2x1c3RlciksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgY2hlY2tDbHVzdGVyRXJyb3IkID0gbWVtb2l6ZSgoY2x1c3Rlcjogc3RyaW5nKSA9PlxuICAgIHRoaXMuY2x1c3RlcnMkLnBpcGUoXG4gICAgICBtYXAoY2x1c3RlcnMgPT4gdGhpcy5jaGVja0NsdXN0ZXJFcnJvcihjbHVzdGVycywgY2x1c3RlcikpLFxuICAgICksXG4gICk7XG5cbiAgbmFtZXNwYWNlcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmxvYWQkJCxcbiAgICB0aGlzLnJlbG9hZCQkLnBpcGUoc3RhcnRXaXRoKG51bGwgYXMgdm9pZCkpLFxuICBdKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoW3sgcHJvamVjdCwgY2x1c3RlciB9XSkgPT4ge1xuICAgICAgaWYgKCFwcm9qZWN0IHx8ICFjbHVzdGVyKSB7XG4gICAgICAgIHJldHVybiBvZihbXSBhcyBLdWJlcm5ldGVzUmVzb3VyY2VbXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbHVzdGVycyA9IGNsdXN0ZXIgPT09ICdfX2FsbCcgPyB0aGlzLmNsdXN0ZXJzIDogW2NsdXN0ZXJdO1xuICAgICAgcmV0dXJuIGNsdXN0ZXJzLmxlbmd0aFxuICAgICAgICA/IGZvcmtKb2luKFxuICAgICAgICAgICAgY2x1c3RlcnMubWFwKGNsdXN0ZXIgPT5cbiAgICAgICAgICAgICAgdGhpcy5jb21tb25MYXlvdXRTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldENsdXN0ZXJOYW1lc3BhY2VzKHByb2plY3QubWV0YWRhdGEubmFtZSwgY2x1c3RlcilcbiAgICAgICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKFtdKSkpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLnBpcGUoXG4gICAgICAgICAgICB0YXAobGlzdHMgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm5hbWVzcGFjZUNsdXN0ZXJNYXAgPSBsaXN0cy5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGFjYywgY3VyLCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgICAgICAgICAgLi4uY3VyLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgKHN1YkFjYywgc3ViQ3VycikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5zdWJBY2MsXG4gICAgICAgICAgICAgICAgICAgICAgW3N1YkN1cnIubWV0YWRhdGEudWlkXTogY2x1c3RlcnNbaV0sXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcCgobGlzdHM6IEt1YmVybmV0ZXNSZXNvdXJjZVtdW10pID0+IGxpc3RzLmZsYXQoKSksXG4gICAgICAgICAgKVxuICAgICAgICA6IG9mKFtdIGFzIEt1YmVybmV0ZXNSZXNvdXJjZVtdKTtcbiAgICB9KSxcbiAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCQpLFxuICAgIHB1Ymxpc2hSZWYoKSxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1vbkxheW91dFNlcnZpY2U6IENvbW1vbkxheW91dENvbnRleHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgazhzU2VydmljZTogSzhzQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQsXG4gICAgY29udGV4dFNlcnZpY2U6IFJlc291cmNlU2VsZWN0Q29udGV4dFNlcnZpY2UsXG4gICAgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBrOHNVdGlsOiBLOHNVdGlsU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoY2RyLCBrOHNVdGlsLCBjb250ZXh0U2VydmljZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBGcm9tIGNhY2hlXG4gICAgdGhpcy5wcm9qZWN0cyA9IHRoaXMuY29udGV4dFNlcnZpY2UuY2FjaGVkUHJvamVjdFJlc291cmNlcztcbiAgICB0aGlzLnNlcnZpY2VNZXNoZXMgPSB0aGlzLmNvbnRleHRTZXJ2aWNlLmNhY2hlZFNlcnZpY2VNZXNoR3JvdXBSZXNvdXJjZXM7XG4gICAgaWYgKHRoaXMucHJvamVjdHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmluaXRQcm9qZWN0KHRoaXMucHJvamVjdHMpO1xuICAgIH1cblxuICAgIC8vIEdldCBsYXRlc3QgZGF0YSBpbiB0aGUgYmFja2dyb3VuZFxuICAgIGZvcmtKb2luKFtcbiAgICAgIHRoaXMuY29tbW9uTGF5b3V0U2VydmljZVxuICAgICAgICAuZ2V0UHJvamVjdHMoKVxuICAgICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKFtdIGFzIFByb2plY3RbXSkpKSxcbiAgICAgIHRoaXMuZGlzcGxheVNlcnZpY2VNZXNoXG4gICAgICAgID8gdGhpcy5zZXJ2aWNlTWVzaGVzJFxuICAgICAgICA6IG9mKFtdIGFzIFNlcnZpY2VNZXNoR3JvdXBbXSksXG4gICAgXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9qZWN0c0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkJCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbcHJvamVjdHMsIHNlcnZpY2VNZXNoZXNdKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXlTZXJ2aWNlTWVzaCkge1xuICAgICAgICAgIHRoaXMuc2VydmljZU1lc2hlcyA9IHNlcnZpY2VNZXNoZXM7XG4gICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5jYWNoZWRTZXJ2aWNlTWVzaEdyb3VwUmVzb3VyY2VzID0gc2VydmljZU1lc2hlcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2plY3RzID0gcHJvamVjdHM7XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0U2VydmljZS5jYWNoZWRQcm9qZWN0UmVzb3VyY2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmluaXRQcm9qZWN0KHByb2plY3RzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmNhY2hlZFByb2plY3RSZXNvdXJjZXMgPSB0aGlzLnByb2plY3RzO1xuICAgICAgfSk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmNsdXN0ZXJzJCwgdGhpcy5uYW1lc3BhY2VzJF0pLnN1YnNjcmliZShcbiAgICAgIChbY2x1c3RlcnMsIGRhdGFdKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzTXVsdGlBcmNoID1cbiAgICAgICAgICB1bmlxKGNsdXN0ZXJzLm1hcChjID0+IHRoaXMuazhzVXRpbC5nZXRMYWJlbChjLCAnYXJjaCcpKSkubGVuZ3RoID4gMTtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhID0gdGhpcy5tYXBSZXNvdXJjZShkYXRhLCB7XG4gICAgICAgICAgY2x1c3RlcnMsXG4gICAgICAgICAgaXNNdWx0aUFyY2gsXG4gICAgICAgIH0pLmZpbHRlcihucyA9PiB0aGlzLmNvbnRleHQgPT09ICdwYWdlJyB8fCAhbnMuc3RhdGU/LmRpc2FibGVkKTtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZE5hbWVzcGFjZSh0aGlzLmRpc3BsYXllZERhdGEpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFVpZCkge1xuICAgICAgICAgIHRoaXMuZGlzcGxheWVkRGF0YSA9IHRoaXMuZ2V0U29ydGVkTmFtZXNwYWNlKFxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhLFxuICAgICAgICAgICAgdGhpcy52YWx1ZS5uYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9yY2VMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RvcmVOYW1lc3BhY2VzKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgZ2V0U29ydGVkTmFtZXNwYWNlKHJhd0RhdGE6IE5hbWVzcGFjZURhdGFJdGVtW10sIG5hbWVzcGFjZT86IHN0cmluZykge1xuICAgIGlmICghbmFtZXNwYWNlKSB7XG4gICAgICByZXR1cm4gcmF3RGF0YTtcbiAgICB9XG4gICAgY29uc3QgW3NlbGVjdGVkLCBvdGhlcnNdID0gcGFydGl0aW9uKFxuICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhLFxuICAgICAgaXRlbSA9PiBpdGVtLm5hbWUgPT09IG5hbWVzcGFjZSxcbiAgICApO1xuICAgIHJldHVybiBbLi4uc2VsZWN0ZWQsIC4uLm90aGVyc107XG4gIH1cblxuICBzdG9yZU5hbWVzcGFjZXMoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUHJvamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZENsdXN0ZXIgPT09ICdfX2FsbCcpIHtcbiAgICAgIGZvciAoY29uc3QgY2x1c3RlciBvZiB0aGlzLmNsdXN0ZXJzKSB7XG4gICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2Uuc3RvcmVOYW1lc3BhY2VzKFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQcm9qZWN0Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICB0aGlzLmRpc3BsYXllZERhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS5jbHVzdGVyID09PSBjbHVzdGVyKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jb250ZXh0U2VydmljZS5zdG9yZU5hbWVzcGFjZXMoXG4gICAgICB0aGlzLnNlbGVjdGVkUHJvamVjdC5tZXRhZGF0YS5uYW1lLFxuICAgICAgdGhpcy5zZWxlY3RlZENsdXN0ZXIsXG4gICAgICB0aGlzLmRpc3BsYXllZERhdGEsXG4gICAgKTtcbiAgfVxuXG4gIHByb2plY3RGaWx0ZXJGbiA9IChrZXl3b3JkID0gJycsIG9wdGlvbjogU2VsZWN0RmlsdGVyT3B0aW9uPFByb2plY3Q+KSA9PiB7XG4gICAgY29uc3QgayA9IGtleXdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKFxuICAgICAgb3B0aW9uLnZhbHVlLm1ldGFkYXRhLm5hbWUuaW5jbHVkZXMoaykgfHxcbiAgICAgIGdldERvbWFpbkFubm90YXRpb24oRElTUExBWV9OQU1FLCBvcHRpb24udmFsdWUpXG4gICAgICAgID8udG9Mb3dlckNhc2UoKVxuICAgICAgICA/LmluY2x1ZGVzKGspXG4gICAgKTtcbiAgfTtcblxuICBjbHVzdGVyRmlsdGVyRm4gPSAoa2V5d29yZCA9ICcnLCBvcHRpb246IFNlbGVjdEZpbHRlck9wdGlvbjxzdHJpbmc+KSA9PiB7XG4gICAgY29uc3QgayA9IGtleXdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3B0aW9uLnZhbHVlID09PSAnX19hbGwnKSB7XG4gICAgICByZXR1cm4gKG9wdGlvbi5sYWJlbCBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoayk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBuYW1lLCBkaXNwbGF5TmFtZSB9ID0gb3B0aW9uLmxhYmVsQ29udGV4dCBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gICAgcmV0dXJuIG5hbWUuaW5jbHVkZXMoaykgfHwgZGlzcGxheU5hbWU/LnRvTG93ZXJDYXNlKCk/LmluY2x1ZGVzKGspO1xuICB9O1xuXG4gIHNlcnZpY2VNZXNoRmlsdGVyRm4gPSAoXG4gICAga2V5d29yZCA9ICcnLFxuICAgIG9wdGlvbjogU2VsZWN0RmlsdGVyT3B0aW9uPFNlcnZpY2VNZXNoR3JvdXA+LFxuICApID0+IHtcbiAgICBjb25zdCBrID0ga2V5d29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHZlcnNpb24gPSBvcHRpb24udmFsdWUuc3BlYz8uaXN0aW9WZXJzaW9uXG4gICAgICA/IGBJc3RpbyAke29wdGlvbi52YWx1ZS5zcGVjLmlzdGlvVmVyc2lvbn1gXG4gICAgICA6ICcnO1xuICAgIHJldHVybiAoXG4gICAgICBvcHRpb24udmFsdWUubWV0YWRhdGEubmFtZS5pbmNsdWRlcyhrKSB8fFxuICAgICAgdmVyc2lvbi50b0xvd2VyQ2FzZSgpPy5pbmNsdWRlcyhrKVxuICAgICk7XG4gIH07XG5cbiAgcHJvamVjdFRyYWNrRm4gPSAocHJvamVjdDogUHJvamVjdCkgPT4gcHJvamVjdD8ubWV0YWRhdGEubmFtZTtcblxuICBzZXJ2aWNlTWVzaFRyYWNrRm4gPSAobWVzaDogU2VydmljZU1lc2hHcm91cCkgPT4gbWVzaD8ubWV0YWRhdGEubmFtZTtcblxuICBwcml2YXRlIGluaXRQcm9qZWN0KHByb2plY3RzOiBQcm9qZWN0W10pIHtcbiAgICB0aGlzLnNlbGVjdFByb2plY3QoXG4gICAgICAocHJvamVjdHMgfHwgW10pLmxlbmd0aFxuICAgICAgICA/IHByb2plY3RzLmZpbmQoaXRlbSA9PiBpdGVtLm1ldGFkYXRhLm5hbWUgPT09IHRoaXMudmFsdWU/LnByb2plY3QpIHx8XG4gICAgICAgICAgICBwcm9qZWN0c1swXVxuICAgICAgICA6IG51bGwsXG4gICAgICB0cnVlLFxuICAgICk7XG4gICAgdGhpcy5sb2FkLmVtaXQoe1xuICAgICAgcHJvamVjdDogcHJvamVjdHMubGVuZ3RoLFxuICAgICAgY2x1c3RlcjogdW5pcShcbiAgICAgICAgcHJvamVjdHMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGN1cikgPT4gWy4uLmFjYywgLi4uKGN1ci5zcGVjLmNsdXN0ZXJzIHx8IFtdKS5tYXAoYyA9PiBjLm5hbWUpXSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKSxcbiAgICAgICkubGVuZ3RoLFxuICAgIH0pO1xuICB9XG5cbiAgc2VsZWN0U2VydmljZU1lc2goc2VydmljZU1lc2g6IFNlcnZpY2VNZXNoR3JvdXApIHtcbiAgICB0aGlzLnNlbGVjdGVkU2VydmljZU1lc2ggPSBzZXJ2aWNlTWVzaDtcbiAgICB0aGlzLmNsdXN0ZXJzID0gKHRoaXMuc2VsZWN0ZWRQcm9qZWN0LnNwZWMuY2x1c3RlcnMgfHwgW10pXG4gICAgICAubWFwKGMgPT4gYy5uYW1lKVxuICAgICAgLmZpbHRlcihjbHVzdGVyID0+XG4gICAgICAgIHRoaXMuc2VydmljZU1lc2hlc1xuICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgbWVzaCA9PlxuICAgICAgICAgICAgICB0aGlzLms4c1V0aWwuZ2V0TmFtZShtZXNoKSA9PT0gdGhpcy5rOHNVdGlsLmdldE5hbWUoc2VydmljZU1lc2gpLFxuICAgICAgICAgIClcbiAgICAgICAgICAuc3BlYy5jbHVzdGVycy5pbmNsdWRlcyhjbHVzdGVyKSxcbiAgICAgICk7XG4gICAgdGhpcy5zZWxlY3RDbHVzdGVyKCdfX2FsbCcpO1xuICB9XG5cbiAgc2VsZWN0UHJvamVjdChwcm9qZWN0OiBQcm9qZWN0LCBpbml0aWFsID0gZmFsc2UpIHtcbiAgICB0aGlzLnByb2plY3RDaGFuZ2UuZW1pdChwcm9qZWN0Py5tZXRhZGF0YS5uYW1lKTtcbiAgICB0aGlzLnNlbGVjdGVkUHJvamVjdCA9IHByb2plY3Q7XG4gICAgdGhpcy5jbHVzdGVycyA9IHByb2plY3RcbiAgICAgID8gKHByb2plY3Quc3BlYy5jbHVzdGVycyB8fCBbXSkubWFwKGMgPT4gYy5uYW1lKVxuICAgICAgOiBbXTtcbiAgICBpZiAodGhpcy5kaXNwbGF5U2VydmljZU1lc2gpIHtcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2VNZXNoZXMgPSB0aGlzLnNlcnZpY2VNZXNoZXMuZmlsdGVyKG1lc2ggPT5cbiAgICAgICAgbWVzaC5zcGVjLmNsdXN0ZXJzLnNvbWUoY2x1c3RlciA9PiB0aGlzLmNsdXN0ZXJzLmluY2x1ZGVzKGNsdXN0ZXIpKSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5wcm9qZWN0U2VydmljZU1lc2hlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGxldCBtZXNoTmFtZSA9IHRoaXMudmFsdWU/LnNlcnZpY2VtZXNoO1xuXG4gICAgICAgIGlmICghbWVzaE5hbWUpIHtcbiAgICAgICAgICB0aGlzLmF1dGguZ2V0QWNjb3VudEluZm8oKS5zdWJzY3JpYmUoKHsgZW1haWwgfSkgPT4ge1xuICAgICAgICAgICAgbWVzaE5hbWUgPSBnZXRXb3Jrc3BhY2VQYXJhbXMoZW1haWwpPy5zZXJ2aWNlbWVzaDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU2VydmljZU1lc2ggPVxuICAgICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2VNZXNoZXMuZmluZChcbiAgICAgICAgICAgIG1lc2ggPT4gdGhpcy5rOHNVdGlsLmdldE5hbWUobWVzaCkgPT09IG1lc2hOYW1lLFxuICAgICAgICAgICkgfHwgdGhpcy5wcm9qZWN0U2VydmljZU1lc2hlc1swXTtcbiAgICAgICAgdGhpcy5zZWxlY3RTZXJ2aWNlTWVzaChzZWxlY3RlZFNlcnZpY2VNZXNoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlTWVzaCA9IG51bGw7XG4gICAgICAgIHRoaXMuY2x1c3RlcnMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZWxlY3RDbHVzdGVyKCdfX2FsbCcsIGluaXRpYWwpO1xuICB9XG5cbiAgc2VsZWN0Q2x1c3RlcihjbHVzdGVyTmFtZTogc3RyaW5nLCBpbml0aWFsID0gZmFsc2UpIHtcbiAgICB0aGlzLnNlbGVjdGVkQ2x1c3RlciA9IGNsdXN0ZXJOYW1lO1xuICAgIGNvbnN0IGRpc3BsYXllZERhdGEgPVxuICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5nZXRDYWNoZWROYW1lc3BhY2VzKFxuICAgICAgICB0aGlzLnNlbGVjdGVkUHJvamVjdD8ubWV0YWRhdGEubmFtZSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZENsdXN0ZXIsXG4gICAgICApIHx8IFtdO1xuICAgIHRoaXMuZGlzcGxheWVkRGF0YSA9IHRoaXMuZ2V0U29ydGVkTmFtZXNwYWNlKFxuICAgICAgZGlzcGxheWVkRGF0YSxcbiAgICAgIGluaXRpYWwgPyB0aGlzLnZhbHVlPy5uYW1lIDogbnVsbCxcbiAgICApO1xuICAgIHRoaXMuc2V0U2VsZWN0ZWROYW1lc3BhY2UodGhpcy5kaXNwbGF5ZWREYXRhKTtcblxuICAgIHRoaXMuY2x1c3RlckNoYW5nZS5lbWl0KFxuICAgICAgdGhpcy5zZWxlY3RlZENsdXN0ZXIgPT09ICdfX2FsbCcgPyBudWxsIDogY2x1c3Rlck5hbWUsXG4gICAgKTtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMubG9hZCQkLm5leHQoe1xuICAgICAgcHJvamVjdDogdGhpcy5zZWxlY3RlZFByb2plY3QsXG4gICAgICBjbHVzdGVyOiBjbHVzdGVyTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U2VsZWN0ZWROYW1lc3BhY2UoZGF0YTogTmFtZXNwYWNlRGF0YUl0ZW1bXSkge1xuICAgIGNvbnN0IHNlbGVjdGVkTmFtZXNwYWNlID0gdGhpcy52YWx1ZVxuICAgICAgPyBkYXRhLmZpbmQoXG4gICAgICAgICAgaXRlbSA9PlxuICAgICAgICAgICAgaXRlbS5uYW1lID09PSB0aGlzLnZhbHVlLm5hbWUgJiZcbiAgICAgICAgICAgIHRoaXMudmFsdWUuY2x1c3RlciA9PT0gaXRlbS5jbHVzdGVyLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZFVpZCA9IHNlbGVjdGVkTmFtZXNwYWNlXG4gICAgICA/IHNlbGVjdGVkTmFtZXNwYWNlLl9fb3JpZ2luLm1ldGFkYXRhLnVpZFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgbWFwUmVzb3VyY2UgPSAoXG4gICAgbGlzdDogS3ViZXJuZXRlc1Jlc291cmNlW10sXG4gICAge1xuICAgICAgaXNNdWx0aUFyY2gsXG4gICAgICBjbHVzdGVycyxcbiAgICB9OiB7XG4gICAgICBpc011bHRpQXJjaDogYm9vbGVhbjtcbiAgICAgIGNsdXN0ZXJzOiBDbHVzdGVyW107XG4gICAgfSxcbiAgKTogTmFtZXNwYWNlRGF0YUl0ZW1bXSA9PlxuICAgIGxpc3QubWFwKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgY2x1c3RlciA9IHRoaXMubmFtZXNwYWNlQ2x1c3Rlck1hcFtpdGVtLm1ldGFkYXRhLnVpZF07XG4gICAgICBjb25zdCBpdGVtRGlzYWJsZWQgPSB0aGlzLmRpc2FibGVGbiA/IHRoaXMuZGlzYWJsZUZuKGl0ZW0pIDogbnVsbDtcbiAgICAgIGNvbnN0IGNhY2hlZEl0ZW0gPSB0aGlzLmRpc3BsYXllZERhdGEuZmluZChcbiAgICAgICAgbnMgPT4gbnMuX19vcmlnaW4ubWV0YWRhdGEudWlkID09PSBpdGVtLm1ldGFkYXRhLnVpZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXJ2aWNlbWVzaCA9IHRoaXMuc2VydmljZU1lc2hlcy5maW5kKGl0ZW0gPT5cbiAgICAgICAgaXRlbS5zcGVjLmNsdXN0ZXJzLmluY2x1ZGVzKGNhY2hlZEl0ZW0/LmNsdXN0ZXIgfHwgY2x1c3RlciksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogdGhpcy5rOHNVdGlsLmdldE5hbWUoaXRlbSksXG4gICAgICAgIGRpc3BsYXlOYW1lOiB0aGlzLms4c1V0aWwuZ2V0RGlzcGxheU5hbWUoaXRlbSksXG4gICAgICAgIGNsdXN0ZXI6IGNhY2hlZEl0ZW0/LmNsdXN0ZXIgfHwgY2x1c3RlcixcbiAgICAgICAgY2x1c3RlckRpc3BsYXlOYW1lOlxuICAgICAgICAgIGNhY2hlZEl0ZW0/LmNsdXN0ZXJEaXNwbGF5TmFtZSB8fFxuICAgICAgICAgIHRoaXMuazhzVXRpbC5nZXREaXNwbGF5TmFtZShcbiAgICAgICAgICAgIGNsdXN0ZXJzLmZpbmQoYyA9PiBjLm1ldGFkYXRhLm5hbWUgPT09IGNsdXN0ZXIpLFxuICAgICAgICAgICksXG4gICAgICAgIGNsdXN0ZXJBcmNoOlxuICAgICAgICAgIGNhY2hlZEl0ZW0/LmNsdXN0ZXJBcmNoIHx8IGlzTXVsdGlBcmNoXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q2x1c3RlckFyY2goXG4gICAgICAgICAgICAgICAgY2x1c3RlcnMuZmluZChjID0+IGMubWV0YWRhdGEubmFtZSA9PT0gY2x1c3RlciksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgc2VydmljZU1lc2hOYW1lOiBzZXJ2aWNlbWVzaCA/IHRoaXMuazhzVXRpbC5nZXROYW1lKHNlcnZpY2VtZXNoKSA6ICcnLFxuICAgICAgICBzZXJ2aWNlTWVzaENsdXN0ZXJzOiBzZXJ2aWNlbWVzaCA/IHNlcnZpY2VtZXNoLnNwZWMuY2x1c3RlcnMgOiBbXSxcbiAgICAgICAgc2VydmljZU1lc2hJc3Rpb1ZlcnNpb246IHNlcnZpY2VtZXNoXG4gICAgICAgICAgPyBzZXJ2aWNlbWVzaC5zcGVjLmlzdGlvVmVyc2lvblxuICAgICAgICAgIDogJycsXG4gICAgICAgIGFkbWluOiBjYWNoZWRJdGVtPy5hZG1pbiB8fCAnLScsXG4gICAgICAgIHRpbWVzdGFtcDogdGhpcy5rOHNVdGlsLmdldENyZWF0aW9uVGltZXN0YW1wKGl0ZW0pLFxuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIGRpc2FibGVkOlxuICAgICAgICAgICAgdGhpcy5ncmlkU3RhdGVNYXBbY2x1c3Rlcl0/LmRpc2FibGVkIHx8XG4gICAgICAgICAgICBpdGVtRGlzYWJsZWQ/LmRpc2FibGVkIHx8XG4gICAgICAgICAgICB0aGlzLmNoZWNrQ2x1c3RlckVycm9yKGNsdXN0ZXJzLCBjYWNoZWRJdGVtPy5jbHVzdGVyIHx8IGNsdXN0ZXIpIHx8XG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICB0b29sdGlwOiB0aGlzLmdyaWRTdGF0ZU1hcFtjbHVzdGVyXT8uZGlzYWJsZWRcbiAgICAgICAgICAgID8gdGhpcy5ncmlkU3RhdGVNYXBbY2x1c3Rlcl0/LnRvb2x0aXAgfHwgJydcbiAgICAgICAgICAgIDogaXRlbURpc2FibGVkPy50b29sdGlwLFxuICAgICAgICB9LFxuICAgICAgICBfX29yaWdpbjogaXRlbSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgcHJpdmF0ZSBnZXRDbHVzdGVyQXJjaChjbHVzdGVyOiBDbHVzdGVyKSB7XG4gICAgcmV0dXJuIGdldERpc3BsYXlBcmNoKFxuICAgICAgdGhpcy5rOHNVdGlsLmdldExhYmVsKGNsdXN0ZXIsICdhcmNoJyksXG4gICAgKSBhcyBDbHVzdGVyQXJjaDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tDbHVzdGVyRXJyb3IoY2x1c3RlcnM6IENsdXN0ZXJbXSwgY2x1c3Rlcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNsdXN0ZXJzXG4gICAgICAgIC5maW5kKGkgPT4gdGhpcy5rOHNVdGlsLmdldE5hbWUoaSkgPT09IGNsdXN0ZXIpXG4gICAgICAgID8uc3RhdHVzLmNvbmRpdGlvbnMuZmluZChjID0+IGMudHlwZSA9PT0gJ05vZGVOb3RSZWFkeScpPy5zdGF0dXMgIT09XG4gICAgICAnRmFsc2UnXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZpbHRlclwiPlxuICA8YXVpLWZvcm0taXRlbT5cbiAgICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyAncHJvamVjdCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgIDxhdWktc2VsZWN0XG4gICAgICBbbmdDbGFzc109XCJkaXNwbGF5U2VydmljZU1lc2ggPyAnbGFuZy1ub3Qtemg6IXR3LXctWzIzMHB4XScgOiAnJ1wiXG4gICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgIG5hbWU9XCJwcm9qZWN0XCJcbiAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRQcm9qZWN0XCJcbiAgICAgIFtmaWx0ZXJGbl09XCJwcm9qZWN0RmlsdGVyRm5cIlxuICAgICAgW3RyYWNrRm5dPVwicHJvamVjdFRyYWNrRm5cIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cInNlbGVjdFByb2plY3QoJGV2ZW50KVwiXG4gICAgICBbbG9hZGluZ109XCIhcHJvamVjdHMubGVuZ3RoICYmIHByb2plY3RzTG9hZGluZ1wiXG4gICAgPlxuICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgKm5nRm9yPVwibGV0IHByb2plY3Qgb2YgcHJvamVjdHNcIlxuICAgICAgICBbdmFsdWVdPVwicHJvamVjdFwiXG4gICAgICAgIFtsYWJlbF09XCJwcm9qZWN0IHwgYWNsVW5pb25EaXNwbGF5TmFtZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHByb2plY3QgfCBhY2xVbmlvbkRpc3BsYXlOYW1lIH19XG4gICAgICA8L2F1aS1vcHRpb24+XG4gICAgICA8YXVpLW9wdGlvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAge3sgJ25vX2RhdGEnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2F1aS1vcHRpb24tcGxhY2Vob2xkZXI+XG4gICAgPC9hdWktc2VsZWN0PlxuICA8L2F1aS1mb3JtLWl0ZW0+XG4gIDwhLS0gQVNNIOmAieaLqee9keagvOi/h+a7pOmbhue+pOmAiemhuSAtLT5cbiAgPGF1aS1mb3JtLWl0ZW0gKm5nSWY9XCJkaXNwbGF5U2VydmljZU1lc2hcIj5cbiAgICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyAnc2VydmljZV9tZXNoJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgPGF1aS1zZWxlY3RcbiAgICAgIGNsYXNzPVwibGFuZy1ub3Qtemg6IXR3LXctWzIzMHB4XVwiXG4gICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgIG5hbWU9XCJzZXJ2aWNlTWVzaFByb2plY3RcIlxuICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFNlcnZpY2VNZXNoXCJcbiAgICAgIFt0cmFja0ZuXT1cInNlcnZpY2VNZXNoVHJhY2tGblwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwic2VsZWN0U2VydmljZU1lc2goJGV2ZW50KVwiXG4gICAgICBbbG9hZGluZ109XCIhcHJvamVjdHMubGVuZ3RoICYmIHByb2plY3RzTG9hZGluZ1wiXG4gICAgPlxuICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgKm5nRm9yPVwibGV0IG1lc2ggb2YgcHJvamVjdFNlcnZpY2VNZXNoZXNcIlxuICAgICAgICBbdmFsdWVdPVwibWVzaFwiXG4gICAgICAgIFtsYWJlbF09XCJcbiAgICAgICAgICAobWVzaCB8IGFjbE5hbWUpICtcbiAgICAgICAgICAobWVzaC5zcGVjPy5pc3Rpb1ZlcnNpb25cbiAgICAgICAgICAgID8gJyAoSXN0aW8gJyArIG1lc2guc3BlYy5pc3Rpb1ZlcnNpb24gKyAnKSdcbiAgICAgICAgICAgIDogJycpXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIHt7IG1lc2ggfCBhY2xOYW1lIH19XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNoLnNwZWM/LmlzdGlvVmVyc2lvblwiPlxuICAgICAgICAgIChJc3RpbyB7eyBtZXNoLnNwZWMuaXN0aW9WZXJzaW9uIH19KVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvYXVpLW9wdGlvbj5cbiAgICAgIDxhdWktb3B0aW9uLXBsYWNlaG9sZGVyPlxuICAgICAgICB7eyAnbm9fZGF0YScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYXVpLW9wdGlvbi1wbGFjZWhvbGRlcj5cbiAgICA8L2F1aS1zZWxlY3Q+XG4gIDwvYXVpLWZvcm0taXRlbT5cbiAgPGF1aS1mb3JtLWl0ZW0+XG4gICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ2NsdXN0ZXInIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICA8YXVpLXNlbGVjdFxuICAgICAgW25nQ2xhc3NdPVwiZGlzcGxheVNlcnZpY2VNZXNoID8gJ2xhbmctbm90LXpoOiF0dy13LVsyMzBweF0nIDogJydcIlxuICAgICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgICBuYW1lPVwiY2x1c3RlclwiXG4gICAgICBbZmlsdGVyRm5dPVwiY2x1c3RlckZpbHRlckZuXCJcbiAgICAgIFtsb2FkaW5nXT1cIiFwcm9qZWN0cy5sZW5ndGggJiYgcHJvamVjdHNMb2FkaW5nXCJcbiAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDbHVzdGVyXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJzZWxlY3RDbHVzdGVyKCRldmVudClcIlxuICAgID5cbiAgICAgIDxhdWktb3B0aW9uXG4gICAgICAgIFt2YWx1ZV09XCInX19hbGwnXCJcbiAgICAgICAgW2xhYmVsXT1cIidhbGwnIHwgdHJhbnNsYXRlXCJcbiAgICAgID5cbiAgICAgICAge3sgJ2FsbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYXVpLW9wdGlvbj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNsdXN0ZXJOYW1lIG9mIGNsdXN0ZXJzXCI+XG4gICAgICAgIDxhdWktb3B0aW9uXG4gICAgICAgICAgKmRlY2xhcmU9XCJ7XG4gICAgICAgICAgICBuYW1lOiBjbHVzdGVyTmFtZSxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBjbHVzdGVyTmFtZSB8IHB1cmU6IGdldENsdXN0ZXJEaXNwbGF5TmFtZSQgfCBhc3luYyxcbiAgICAgICAgICB9IGFzIGNsdXN0ZXJcIlxuICAgICAgICAgIFt2YWx1ZV09XCJjbHVzdGVyTmFtZVwiXG4gICAgICAgICAgW2xhYmVsXT1cImNsdXN0ZXJMYWJlbFwiXG4gICAgICAgICAgW2xhYmVsQ29udGV4dF09XCJjbHVzdGVyXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiY2x1c3Rlck5hbWUgfCBwdXJlOiBjaGVja0NsdXN0ZXJFcnJvciQgfCBhc3luY1wiXG4gICAgICAgICAgW2F1aVRvb2x0aXBdPVwiJ2N1cnJlbnRfY2x1c3Rlcl9zdGF0dXNfYWJub3JtYWwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYXVpVG9vbHRpcERpc2FibGVkXT1cIlxuICAgICAgICAgICAgIShjbHVzdGVyTmFtZSB8IHB1cmU6IGNoZWNrQ2x1c3RlckVycm9yJCB8IGFzeW5jKVxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNsdXN0ZXJMYWJlbDsgY29udGV4dDogY2x1c3RlclwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2F1aS1vcHRpb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxhdWktb3B0aW9uLXBsYWNlaG9sZGVyPlxuICAgICAgICB7eyAnbm9fZGF0YScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYXVpLW9wdGlvbi1wbGFjZWhvbGRlcj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAjY2x1c3RlckxhYmVsXG4gICAgICAgIGxldC1uYW1lPVwibmFtZVwiXG4gICAgICAgIGxldC1kaXNwbGF5TmFtZT1cImRpc3BsYXlOYW1lXCJcbiAgICAgID5cbiAgICAgICAge3sgbmFtZSB9fVxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheU5hbWVcIj4oe3sgZGlzcGxheU5hbWUgfX0pPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvYXVpLXNlbGVjdD5cbiAgPC9hdWktZm9ybS1pdGVtPlxuPC9kaXY+XG48YWNsLXJlc291cmNlLWRhdGEtZ3JpZFxuICBbZGF0YV09XCJkaXNwbGF5ZWREYXRhIHx8IFtdXCJcbiAgW2ZpZWxkc109XCJmaWVsZHNcIlxuICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgKHNlbGVjdEl0ZW0pPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gIFthY3Rpb25UZW1wbGF0ZVJlZl09XCJhY3Rpb25UZW1wbGF0ZVJlZlwiXG4gIFtzZWxlY3RlZFVpZF09XCJzZWxlY3RlZFVpZFwiXG4gIFtsb2FkaW5nXT1cImZvcmNlTG9hZGluZyB8fCAoIWRpc3BsYXllZERhdGE/Lmxlbmd0aCAmJiBsb2FkaW5nKVwiXG4gIChyZWxvYWQpPVwicmVsb2FkKClcIlxuPlxuICA8bmctY29udGFpbmVyIGFjbFJlc291cmNlR3JpZEhlYWRlcj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9hY2wtcmVzb3VyY2UtZGF0YS1ncmlkPlxuIl19