@alauda-fe/network 1.0.0 → 1.0.2

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 (62) hide show
  1. package/esm2022/index.mjs +10 -2
  2. package/esm2022/lib/components/certificate-status/component.mjs +7 -6
  3. package/esm2022/lib/components/fixed-ip/component.mjs +134 -91
  4. package/esm2022/lib/components/loadbalancer-spec-form/component.mjs +57 -57
  5. package/esm2022/lib/components/service-annotations-form/annotations.component.mjs +136 -142
  6. package/esm2022/lib/components/service-annotations-form-item/annotations.component.mjs +24 -25
  7. package/esm2022/lib/components/service-form/component.mjs +34 -33
  8. package/esm2022/lib/components/service-form/fieldset/component.mjs +92 -95
  9. package/esm2022/lib/directives/subnet-validator.directive.mjs +5 -5
  10. package/esm2022/lib/features/network-policy/components/add-peer-rule-handler/component.mjs +69 -0
  11. package/esm2022/lib/features/network-policy/components/ip-block-display/component.mjs +54 -0
  12. package/esm2022/lib/features/network-policy/components/label-selector-display/component.mjs +117 -0
  13. package/esm2022/lib/features/network-policy/components/peer-container/component.mjs +81 -0
  14. package/esm2022/lib/features/network-policy/components/pod-review/component.mjs +250 -0
  15. package/esm2022/lib/features/network-policy/components/rule-table/component.mjs +269 -0
  16. package/esm2022/lib/features/network-policy/form/network-policy/component.mjs +429 -0
  17. package/esm2022/lib/features/network-policy/form/network-policy-ip-block/component.mjs +102 -0
  18. package/esm2022/lib/features/network-policy/form/network-policy-peer/component.mjs +247 -0
  19. package/esm2022/lib/features/network-policy/form/network-policy-ports/component.mjs +161 -0
  20. package/esm2022/lib/features/network-policy/form/network-policy-remote-except-input/component.mjs +128 -0
  21. package/esm2022/lib/features/network-policy/form/network-policy-rule/component.mjs +142 -0
  22. package/esm2022/lib/services/alb-api.service.mjs +26 -6
  23. package/esm2022/lib/services/certificate-api.service.mjs +4 -4
  24. package/esm2022/lib/services/network-util.service.mjs +18 -4
  25. package/esm2022/lib/services/subnet-util.service.mjs +121 -0
  26. package/esm2022/lib/types/alb-exports.mjs +1 -1
  27. package/esm2022/lib/types/k8s-exports.mjs +2 -1
  28. package/esm2022/lib/types/metallb-exports.mjs +2 -0
  29. package/esm2022/lib/types/resource-definition.mjs +28 -2
  30. package/esm2022/lib/utils/alb-exports.mjs +1 -1
  31. package/esm2022/lib/utils/cidr-exports.mjs +3 -3
  32. package/esm2022/lib/utils/common-exports.mjs +22 -0
  33. package/esm2022/lib/utils/service-exports.mjs +1 -1
  34. package/esm2022/lib/utils/validators-exports.mjs +44 -0
  35. package/index.d.ts +9 -1
  36. package/lib/components/fixed-ip/component.d.ts +10 -3
  37. package/lib/components/service-annotations-form/annotations.component.d.ts +6 -6
  38. package/lib/components/service-annotations-form-item/annotations.component.d.ts +1 -1
  39. package/lib/components/service-form/component.d.ts +1 -1
  40. package/lib/features/network-policy/components/add-peer-rule-handler/component.d.ts +8 -0
  41. package/lib/features/network-policy/components/ip-block-display/component.d.ts +7 -0
  42. package/lib/features/network-policy/components/label-selector-display/component.d.ts +13 -0
  43. package/lib/features/network-policy/components/peer-container/component.d.ts +18 -0
  44. package/lib/features/network-policy/components/pod-review/component.d.ts +37 -0
  45. package/lib/features/network-policy/components/rule-table/component.d.ts +21 -0
  46. package/lib/features/network-policy/form/network-policy/component.d.ts +70 -0
  47. package/lib/features/network-policy/form/network-policy-ip-block/component.d.ts +23 -0
  48. package/lib/features/network-policy/form/network-policy-peer/component.d.ts +43 -0
  49. package/lib/features/network-policy/form/network-policy-ports/component.d.ts +17 -0
  50. package/lib/features/network-policy/form/network-policy-remote-except-input/component.d.ts +23 -0
  51. package/lib/features/network-policy/form/network-policy-rule/component.d.ts +28 -0
  52. package/lib/services/alb-api.service.d.ts +4 -2
  53. package/lib/services/network-util.service.d.ts +1 -0
  54. package/lib/services/subnet-util.service.d.ts +25 -0
  55. package/lib/types/alb-exports.d.ts +23 -0
  56. package/lib/types/k8s-exports.d.ts +51 -1
  57. package/lib/types/metallb-exports.d.ts +65 -0
  58. package/lib/types/resource-definition.d.ts +143 -0
  59. package/lib/utils/common-exports.d.ts +5 -0
  60. package/lib/utils/validators-exports.d.ts +16 -0
  61. package/package.json +10 -5
  62. package/styles.css +1 -0
@@ -1,7 +1,6 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
- /* eslint-disable sonarjs/cognitive-complexity */
3
- import { AutocompleteModule, CommonFormControl, FormItemWidth, FormModule, IconModule, InputModule, TagsInputComponent, TooltipModule, } from '@alauda/ui';
4
- import { K8sApiService, K8sUtilService, ObservableInput, publishRef, skipError, matchExpressionsToString, bind, TranslateModule, ErrorsMapperModule, RESOURCE_TYPES, E2eAttributeBindingDirective, TranslateService, } from '@alauda-fe/common';
2
+ import { AutocompleteModule, CommonFormControl, FormItemWidth, FormModule, IconModule, InputModule, TagModule, TagsInputComponent, TooltipModule, } from '@alauda/ui';
3
+ import { K8sApiService, K8sUtilService, ObservableInput, publishRef, skipError, matchExpressionsToString, bind, TRANSLATE_MODULE, RESOURCE_TYPES, E2eAttributeBindingDirective, TranslateService, ERRORS_MAPPER_MODULE, PurePipe, } from '@alauda-fe/common';
5
4
  import { AsyncPipe, NgFor, NgIf } from '@angular/common';
6
5
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewChild, forwardRef, } from '@angular/core';
7
6
  import { toSignal } from '@angular/core/rxjs-interop';
@@ -10,7 +9,7 @@ import { uniq, values } from 'lodash-es';
10
9
  import { Observable, combineLatest, filter, first, fromEvent, map, merge, of, switchMap, forkJoin, startWith, tap, } from 'rxjs';
11
10
  import { NetworkUtilService } from '../../services/network-util.service';
12
11
  import { NETWORK_RESOURCE_TYPES } from '../../types/resource-definition';
13
- import { IPMode, NetworkMode, adaptIpMode, adaptSubnetCidrs, getIpAddressSuggestionsByCidrs, ipAddressEqual, isBelongCidr, isBroadcastAddr, isIpAddressValid, isNetworkAddr, } from '../../utils/cidr-exports';
12
+ import { IPMode, NetworkMode, adaptIpMode, adaptSubnetCidrs, getIpAddressSuggestionsByCidrs, ipAddressEqual, isBelongCidr, isBroadcastAddr, isIpAddressValid, isNetworkAddr, getAddressBuilder, } from '../../utils/cidr-exports';
14
13
  import { ClusterNetworkType, KUBE_OVN_ANNOTATION_PREFIX, } from '../../utils/subnet-exports';
15
14
  import * as i0 from "@angular/core";
16
15
  import * as i1 from "@alauda-fe/common";
@@ -19,64 +18,79 @@ import * as i3 from "@alauda/ui";
19
18
  import * as i4 from "@angular/forms";
20
19
  const _c0 = ["ipAddress"];
21
20
  const _c1 = ["tagsInput"];
21
+ const _c2 = a0 => ({ cidr: a0 });
22
22
  function FixedIpInputComponent_input_4_Template(rf, ctx) { if (rf & 1) {
23
- const _r8 = i0.ɵɵgetCurrentView();
24
- i0.ɵɵelementStart(0, "input", 9, 10);
25
- i0.ɵɵlistener("ngModelChange", function FixedIpInputComponent_input_4_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r7.emitValue($event)); });
23
+ const _r1 = i0.ɵɵgetCurrentView();
24
+ i0.ɵɵelementStart(0, "input", 11, 1);
26
25
  i0.ɵɵpipe(2, "translate");
26
+ i0.ɵɵlistener("ngModelChange", function FixedIpInputComponent_input_4_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.emitValue($event)); });
27
27
  i0.ɵɵelementEnd();
28
28
  } if (rf & 2) {
29
- const ctx_r0 = i0.ɵɵnextContext();
30
- const _r2 = i0.ɵɵreference(7);
31
- i0.ɵɵproperty("ngModel", ctx_r0.model)("placeholder", ctx_r0.placeholder || i0.ɵɵpipeBind1(2, 3, "dhcp_placeholder"))("auiAutocomplete", _r2);
29
+ const ctx_r1 = i0.ɵɵnextContext();
30
+ const suggestions_r3 = i0.ɵɵreference(7);
31
+ i0.ɵɵproperty("ngModel", ctx_r1.model)("placeholder", ctx_r1.placeholder || i0.ɵɵpipeBind1(2, 3, "dhcp_placeholder"))("auiAutocomplete", suggestions_r3);
32
32
  } }
33
33
  function FixedIpInputComponent_aui_tags_input_5_Template(rf, ctx) { if (rf & 1) {
34
- const _r12 = i0.ɵɵgetCurrentView();
35
- i0.ɵɵelementStart(0, "aui-tags-input", 11, 12);
36
- i0.ɵɵlistener("ngModelChange", function FixedIpInputComponent_aui_tags_input_5_Template_aui_tags_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r11 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r11.emitValue(ctx_r11.uniq($event))); });
34
+ const _r4 = i0.ɵɵgetCurrentView();
35
+ i0.ɵɵelementStart(0, "aui-tags-input", 12, 2);
37
36
  i0.ɵɵpipe(3, "translate");
37
+ i0.ɵɵlistener("ngModelChange", function FixedIpInputComponent_aui_tags_input_5_Template_aui_tags_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.emitValue(ctx_r1.uniq($event))); });
38
38
  i0.ɵɵelementEnd();
39
39
  } if (rf & 2) {
40
40
  const ctx_r1 = i0.ɵɵnextContext();
41
- const _r2 = i0.ɵɵreference(7);
42
- i0.ɵɵproperty("ngModel", ctx_r1.model)("placeholder", ctx_r1.placeholder || i0.ɵɵpipeBind1(3, 4, "dhcp_placeholder"))("auiAutocomplete", _r2)("inputAsyncValidator", ctx_r1.validate);
41
+ const suggestions_r3 = i0.ɵɵreference(7);
42
+ i0.ɵɵproperty("ngModel", ctx_r1.model)("placeholder", ctx_r1.placeholder || i0.ɵɵpipeBind1(3, 4, "dhcp_placeholder"))("auiAutocomplete", suggestions_r3)("inputAsyncValidator", ctx_r1.validate);
43
+ } }
44
+ function FixedIpInputComponent_aui_suggestion_8_aui_tag_2_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "aui-tag", 15);
46
+ i0.ɵɵtext(1);
47
+ i0.ɵɵpipe(2, "translate");
48
+ i0.ɵɵelementEnd();
49
+ } if (rf & 2) {
50
+ i0.ɵɵproperty("border", true)("size", "mini");
51
+ i0.ɵɵadvance();
52
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 3, "network.reserved_ip"), " ");
43
53
  } }
44
54
  function FixedIpInputComponent_aui_suggestion_8_Template(rf, ctx) { if (rf & 1) {
45
55
  i0.ɵɵelementStart(0, "aui-suggestion", 13);
46
56
  i0.ɵɵtext(1);
57
+ i0.ɵɵtemplate(2, FixedIpInputComponent_aui_suggestion_8_aui_tag_2_Template, 3, 5, "aui-tag", 14);
58
+ i0.ɵɵpipe(3, "pure");
47
59
  i0.ɵɵelementEnd();
48
60
  } if (rf & 2) {
49
- const ipAddressSuggestion_r13 = ctx.$implicit;
50
- i0.ɵɵproperty("value", ipAddressSuggestion_r13);
51
- i0.ɵɵadvance(1);
52
- i0.ɵɵtextInterpolate1(" ", ipAddressSuggestion_r13, " ");
61
+ const ipAddressSuggestion_r5 = ctx.$implicit;
62
+ const ctx_r1 = i0.ɵɵnextContext();
63
+ i0.ɵɵproperty("value", ipAddressSuggestion_r5);
64
+ i0.ɵɵadvance();
65
+ i0.ɵɵtextInterpolate1(" ", ipAddressSuggestion_r5, " ");
66
+ i0.ɵɵadvance();
67
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind3(3, 3, ipAddressSuggestion_r5, ctx_r1.isReservedIp, ctx_r1.$subnetInfo().excludeIps));
53
68
  } }
54
69
  function FixedIpInputComponent_ng_container_14_aui_icon_1_Template(rf, ctx) { if (rf & 1) {
55
- i0.ɵɵelement(0, "aui-icon", 16);
70
+ i0.ɵɵelement(0, "aui-icon", 18);
56
71
  } if (rf & 2) {
57
- const ctx_r14 = i0.ɵɵnextContext(2);
58
- i0.ɵɵproperty("auiTooltip", ctx_r14.addonTip);
72
+ const ctx_r1 = i0.ɵɵnextContext(2);
73
+ i0.ɵɵproperty("auiTooltip", ctx_r1.addonTip);
59
74
  } }
60
75
  function FixedIpInputComponent_ng_container_14_Template(rf, ctx) { if (rf & 1) {
61
- i0.ɵɵelementContainerStart(0, 14);
62
- i0.ɵɵtemplate(1, FixedIpInputComponent_ng_container_14_aui_icon_1_Template, 1, 1, "aui-icon", 15);
76
+ i0.ɵɵelementContainerStart(0, 16);
77
+ i0.ɵɵtemplate(1, FixedIpInputComponent_ng_container_14_aui_icon_1_Template, 1, 1, "aui-icon", 17);
63
78
  i0.ɵɵelementContainerEnd();
64
79
  } if (rf & 2) {
65
- const ctx_r4 = i0.ɵɵnextContext();
66
- i0.ɵɵadvance(1);
67
- i0.ɵɵproperty("ngIf", ctx_r4.addonTip);
80
+ const ctx_r1 = i0.ɵɵnextContext();
81
+ i0.ɵɵadvance();
82
+ i0.ɵɵproperty("ngIf", ctx_r1.addonTip);
68
83
  } }
69
- const _c2 = function (a0) { return { cidr: a0 }; };
70
84
  function FixedIpInputComponent_div_18_Template(rf, ctx) { if (rf & 1) {
71
- i0.ɵɵelementStart(0, "div", 17);
85
+ i0.ɵɵelementStart(0, "div", 19);
72
86
  i0.ɵɵtext(1);
73
- i0.ɵɵpipe(2, "translate");
74
- i0.ɵɵpipe(3, "async");
87
+ i0.ɵɵpipe(2, "async");
88
+ i0.ɵɵpipe(3, "translate");
75
89
  i0.ɵɵelementEnd();
76
90
  } if (rf & 2) {
77
- const ctx_r5 = i0.ɵɵnextContext();
78
- i0.ɵɵadvance(1);
79
- i0.ɵɵtextInterpolate1(" ", ctx_r5.hint || i0.ɵɵpipeBind2(2, 1, "fix_ip_should_belong_tip", i0.ɵɵpureFunction1(6, _c2, i0.ɵɵpipeBind1(3, 4, ctx_r5.cidr$))), " ");
91
+ const ctx_r1 = i0.ɵɵnextContext();
92
+ i0.ɵɵadvance();
93
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.hint || i0.ɵɵpipeBind2(3, 3, "network.fix_ip_should_belong_tip", i0.ɵɵpureFunction1(6, _c2, i0.ɵɵpipeBind1(2, 1, ctx_r1.cidr$))), " ");
80
94
  } }
81
95
  export class FixedIpInputComponent extends CommonFormControl {
82
96
  get isCalico() {
@@ -115,6 +129,7 @@ export class FixedIpInputComponent extends CommonFormControl {
115
129
  subnets: [subnet],
116
130
  subnet,
117
131
  gateway: subnet.spec?.gateway,
132
+ excludeIps: subnet.spec?.excludeIps,
118
133
  })
119
134
  : this.isCalico
120
135
  ? this.k8sApi
@@ -127,18 +142,20 @@ export class FixedIpInputComponent extends CommonFormControl {
127
142
  subnets,
128
143
  subnet: null,
129
144
  gateway: '',
145
+ excludeIps: [],
130
146
  })))
131
147
  : of({
132
148
  cluster,
133
149
  subnets: [],
134
150
  subnet: null,
135
151
  gateway: '',
152
+ excludeIps: [],
136
153
  })));
137
154
  this.subnetInfo$ = combineLatest([
138
155
  this.networkMode$,
139
156
  this.namespaceResource$.pipe(filter(Boolean)),
140
157
  this.subnetDetails$,
141
- ]).pipe(map(([networkMode, namespace, { cluster, subnets, subnet, gateway }]) => {
158
+ ]).pipe(map(([networkMode, namespace, { cluster, subnets, subnet, gateway, excludeIps },]) => {
142
159
  return {
143
160
  cluster,
144
161
  subnetCidrs: this.isCalico
@@ -148,14 +165,19 @@ export class FixedIpInputComponent extends CommonFormControl {
148
165
  type: 'cidr',
149
166
  baseDomain: KUBE_OVN_ANNOTATION_PREFIX,
150
167
  })
151
- : subnet.spec?.cidrBlock ?? '', this.$networkMode(), this.enableFixIpV6ForDual),
168
+ : (subnet.spec?.cidrBlock ?? ''), this.$networkMode(), this.enableFixIpV6ForDual),
152
169
  subnetName: subnet == null
153
- ? this.k8sUtil.getAnnotation(namespace, {
154
- type: 'logical_switch',
155
- baseDomain: KUBE_OVN_ANNOTATION_PREFIX,
156
- })
170
+ ? this.isCalico
171
+ ? this.networkUtilService
172
+ .getCalicoSubnetNames(namespace, this.$networkMode())
173
+ .join(',')
174
+ : this.k8sUtil.getAnnotation(namespace, {
175
+ type: 'logical_switch',
176
+ baseDomain: KUBE_OVN_ANNOTATION_PREFIX,
177
+ })
157
178
  : this.k8sUtil.getName(subnet),
158
179
  gateway,
180
+ excludeIps: excludeIps || [],
159
181
  };
160
182
  }), switchMap(subnetInfo => {
161
183
  if (this.networkType === ClusterNetworkType.KUBE_OVN &&
@@ -173,6 +195,7 @@ export class FixedIpInputComponent extends CommonFormControl {
173
195
  .map(item => item.spec?.gateway)
174
196
  .filter(Boolean)
175
197
  .join(','),
198
+ excludeIps: uniq(subnetList.flatMap(item => item.spec?.excludeIps)),
176
199
  }
177
200
  : subnetInfo));
178
201
  }
@@ -195,10 +218,11 @@ export class FixedIpInputComponent extends CommonFormControl {
195
218
  subnetCidrs: adaptSubnetCidrs(subnet.spec.cidrBlock, this.$networkMode(), this.enableFixIpV6ForDual),
196
219
  subnetName: this.k8sUtil.getName(subnet),
197
220
  gateway: subnet.spec.gateway,
221
+ excludeIps: subnet.spec.excludeIps,
198
222
  })));
199
223
  }), publishRef());
200
224
  this.$subnetInfo = toSignal(this.subnetInfo$);
201
- this.cidr$ = this.subnetInfo$.pipe(map(subnetInfo => subnetInfo?.subnetCidrs.join('、')));
225
+ this.cidr$ = this.subnetInfo$.pipe(map(subnetInfo => uniq(subnetInfo?.subnetCidrs).join('、')));
202
226
  this.innerErrorsMapper$ = combineLatest([
203
227
  this.cidr$,
204
228
  this.translate.locale$,
@@ -229,30 +253,28 @@ export class FixedIpInputComponent extends CommonFormControl {
229
253
  this.cluster$,
230
254
  this.subnetInfo$,
231
255
  this.model$.pipe(first()),
232
- ]).pipe(switchMap(([cluster, { subnetName, gateway }, ip]) => this.isCalico
233
- ? of([])
234
- : this.k8sApi
235
- .getResourceList({
236
- type: NETWORK_RESOURCE_TYPES.SUBNET_KUBE_OVN_IP,
237
- cluster,
238
- queryParams: {
239
- labelSelector: matchExpressionsToString([
240
- {
241
- key: `${KUBE_OVN_ANNOTATION_PREFIX}/subnet`,
242
- operator: 'in',
243
- values: subnetName.split(','),
244
- },
245
- ]),
246
- },
247
- })
248
- .pipe(map(res => res.items), skipError([]), map(subnetIps => subnetIps.reduce((usedIps, { spec: { ipAddress } }) => {
249
- ipAddress.split(',').forEach(item => {
250
- if (ip !== item) {
251
- usedIps.push(item);
252
- }
253
- });
254
- return usedIps;
255
- }, gateway.split(','))))), publishRef());
256
+ ]).pipe(switchMap(([cluster, { subnetName, gateway }, ip]) => this.k8sApi
257
+ .getResourceList({
258
+ type: NETWORK_RESOURCE_TYPES.SUBNET_KUBE_OVN_IP,
259
+ cluster,
260
+ queryParams: {
261
+ labelSelector: matchExpressionsToString([
262
+ {
263
+ key: `${KUBE_OVN_ANNOTATION_PREFIX}/subnet`,
264
+ operator: 'in',
265
+ values: subnetName.split(','),
266
+ },
267
+ ]),
268
+ },
269
+ })
270
+ .pipe(map(res => res.items), skipError([]), map(subnetIps => subnetIps.reduce((usedIps, { spec: { ipAddress } }) => {
271
+ ipAddress.split(',').forEach(item => {
272
+ if (ip !== item) {
273
+ usedIps.push(item);
274
+ }
275
+ });
276
+ return usedIps;
277
+ }, gateway.split(','))))), publishRef());
256
278
  this.$usedIps = toSignal(this.usedIps$);
257
279
  this.ipAddressSuggestions$ = combineLatest([
258
280
  this.subnetInfo$,
@@ -267,6 +289,19 @@ export class FixedIpInputComponent extends CommonFormControl {
267
289
  ...(Array.isArray(addedIps) ? addedIps : [addedIps].filter(Boolean)),
268
290
  ], inputValue, this.isCalico)), startWith([]), skipError([]), publishRef());
269
291
  }
292
+ isReservedIp(ip, excludeIps) {
293
+ const Builder = getAddressBuilder(this.adaptIpMode(ip));
294
+ return excludeIps.some(excludeIp => {
295
+ if (excludeIp.includes('..')) {
296
+ const [start, end] = excludeIp?.split('..');
297
+ const _startAddress = new Builder(start).bigInteger();
298
+ const _endAddress = new Builder(end).bigInteger();
299
+ const _ip = new Builder(ip).bigInteger();
300
+ return (_startAddress.compareTo(_ip) <= 0 && _ip.compareTo(_endAddress) <= 0);
301
+ }
302
+ return excludeIp === ip;
303
+ });
304
+ }
270
305
  registerOnValidatorChange(fn) {
271
306
  this.onValidatorChange = fn;
272
307
  }
@@ -278,7 +313,7 @@ export class FixedIpInputComponent extends CommonFormControl {
278
313
  }
279
314
  setErrors(errors) {
280
315
  const combinedErrors = this.multiple
281
- ? { ...this.ipAddress?.control.errors, ...errors } // 可能存在传入的 errors
316
+ ? { ...this.errors, ...errors } // 可能存在传入的 errors
282
317
  : errors;
283
318
  const validationErrors = values(combinedErrors).length
284
319
  ? combinedErrors
@@ -355,51 +390,50 @@ export class FixedIpInputComponent extends CommonFormControl {
355
390
  useExisting: forwardRef(() => FixedIpInputComponent),
356
391
  multi: true,
357
392
  },
358
- ]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 20, vars: 24, consts: [[3, "width"], ["auiFormItemLabel", ""], ["aui-input", "", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "ngModelChange", 4, "ngIf"], ["class", "flex-1", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "inputAsyncValidator", "ngModelChange", 4, "ngIf"], ["suggestions", ""], [3, "value", 4, "ngFor", "ngForOf"], ["auiFormItemAddon", "", 4, "ngIf"], ["auiFormItemError", "", 3, "errors", "errorsMapper"], ["auiFormItemHint", "", 4, "ngIf"], ["aui-input", "", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "ngModelChange"], ["ipAddress", "ngModel"], ["auiFormItemControl", "", 1, "flex-1", 3, "ngModel", "placeholder", "auiAutocomplete", "inputAsyncValidator", "ngModelChange"], ["tagsInput", "", "ipAddress", "ngModel"], [3, "value"], ["auiFormItemAddon", ""], ["icon", "question_circle", "class", "icon--help", "auiTooltipPosition", "end", 3, "auiTooltip", 4, "ngIf"], ["icon", "question_circle", "auiTooltipPosition", "end", 1, "icon--help", 3, "auiTooltip"], ["auiFormItemHint", ""]], template: function FixedIpInputComponent_Template(rf, ctx) { if (rf & 1) {
359
- i0.ɵɵelementStart(0, "aui-form-item", 0)(1, "label", 1);
393
+ ]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 20, vars: 24, consts: [["suggestions", ""], ["ipAddress", "ngModel"], ["tagsInput", "", "ipAddress", "ngModel"], [3, "width"], ["auiFormItemLabel", ""], ["aui-input", "", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "ngModelChange", 4, "ngIf"], ["class", "flex-1", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "inputAsyncValidator", "ngModelChange", 4, "ngIf"], [3, "value", 4, "ngFor", "ngForOf"], ["auiFormItemAddon", "", 4, "ngIf"], ["auiFormItemError", "", 3, "errors", "errorsMapper"], ["auiFormItemHint", "", 4, "ngIf"], ["aui-input", "", "auiFormItemControl", "", 3, "ngModelChange", "ngModel", "placeholder", "auiAutocomplete"], ["auiFormItemControl", "", 1, "flex-1", 3, "ngModelChange", "ngModel", "placeholder", "auiAutocomplete", "inputAsyncValidator"], [3, "value"], ["type", "info", 3, "border", "size", 4, "ngIf"], ["type", "info", 3, "border", "size"], ["auiFormItemAddon", ""], ["icon", "question_circle", "class", "icon--help", "auiTooltipPosition", "end", 3, "auiTooltip", 4, "ngIf"], ["icon", "question_circle", "auiTooltipPosition", "end", 1, "icon--help", 3, "auiTooltip"], ["auiFormItemHint", ""]], template: function FixedIpInputComponent_Template(rf, ctx) { if (rf & 1) {
394
+ i0.ɵɵelementStart(0, "aui-form-item", 3)(1, "label", 4);
360
395
  i0.ɵɵtext(2);
361
396
  i0.ɵɵpipe(3, "translate");
362
397
  i0.ɵɵelementEnd();
363
- i0.ɵɵtemplate(4, FixedIpInputComponent_input_4_Template, 3, 5, "input", 2);
364
- i0.ɵɵtemplate(5, FixedIpInputComponent_aui_tags_input_5_Template, 4, 6, "aui-tags-input", 3);
365
- i0.ɵɵelementStart(6, "aui-autocomplete", null, 4);
366
- i0.ɵɵtemplate(8, FixedIpInputComponent_aui_suggestion_8_Template, 2, 2, "aui-suggestion", 5);
398
+ i0.ɵɵtemplate(4, FixedIpInputComponent_input_4_Template, 3, 5, "input", 5)(5, FixedIpInputComponent_aui_tags_input_5_Template, 4, 6, "aui-tags-input", 6);
399
+ i0.ɵɵelementStart(6, "aui-autocomplete", null, 0);
400
+ i0.ɵɵtemplate(8, FixedIpInputComponent_aui_suggestion_8_Template, 4, 7, "aui-suggestion", 7);
367
401
  i0.ɵɵpipe(9, "async");
368
402
  i0.ɵɵelementStart(10, "aui-autocomplete-placeholder");
369
403
  i0.ɵɵtext(11);
370
- i0.ɵɵpipe(12, "translate");
371
- i0.ɵɵpipe(13, "async");
404
+ i0.ɵɵpipe(12, "async");
405
+ i0.ɵɵpipe(13, "translate");
372
406
  i0.ɵɵelementEnd()();
373
- i0.ɵɵtemplate(14, FixedIpInputComponent_ng_container_14_Template, 2, 1, "ng-container", 6);
374
- i0.ɵɵelement(15, "acl-errors-mapper", 7);
407
+ i0.ɵɵtemplate(14, FixedIpInputComponent_ng_container_14_Template, 2, 1, "ng-container", 8);
408
+ i0.ɵɵelement(15, "acl-errors-mapper", 9);
375
409
  i0.ɵɵpipe(16, "async");
376
410
  i0.ɵɵpipe(17, "async");
377
- i0.ɵɵtemplate(18, FixedIpInputComponent_div_18_Template, 4, 8, "div", 8);
411
+ i0.ɵɵtemplate(18, FixedIpInputComponent_div_18_Template, 4, 8, "div", 10);
378
412
  i0.ɵɵpipe(19, "async");
379
413
  i0.ɵɵelementEnd();
380
414
  } if (rf & 2) {
381
415
  i0.ɵɵproperty("width", ctx.formItemWidth);
382
416
  i0.ɵɵadvance(2);
383
- i0.ɵɵtextInterpolate(ctx.label || i0.ɵɵpipeBind1(3, 10, "ip_address"));
417
+ i0.ɵɵtextInterpolate(ctx.label || i0.ɵɵpipeBind1(3, 10, "network.ip_address"));
384
418
  i0.ɵɵadvance(2);
385
419
  i0.ɵɵproperty("ngIf", !ctx.multiple);
386
- i0.ɵɵadvance(1);
420
+ i0.ɵɵadvance();
387
421
  i0.ɵɵproperty("ngIf", ctx.multiple);
388
422
  i0.ɵɵadvance(3);
389
423
  i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(9, 12, ctx.ipAddressSuggestions$));
390
424
  i0.ɵɵadvance(3);
391
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(12, 14, i0.ɵɵpipeBind1(13, 16, ctx.ipAddressSuggestions$) ? "no_available_suggestion" : "loading"), " ");
425
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(13, 16, i0.ɵɵpipeBind1(12, 14, ctx.ipAddressSuggestions$) ? "network.no_available_suggestion" : "loading"), " ");
392
426
  i0.ɵɵadvance(3);
393
427
  i0.ɵɵproperty("ngIf", ctx.addonTip != null);
394
- i0.ɵɵadvance(1);
428
+ i0.ɵɵadvance();
395
429
  i0.ɵɵproperty("errors", (ctx.ipAddress == null ? null : ctx.ipAddress.errors == null ? null : ctx.ipAddress.errors.input_data_error) || (ctx.ipAddress == null ? null : ctx.ipAddress.errors) || i0.ɵɵpipeBind1(16, 18, ctx.inputErrors$))("errorsMapper", i0.ɵɵpipeBind1(17, 20, ctx.combinedErrorsMapper$));
396
430
  i0.ɵɵadvance(3);
397
431
  i0.ɵɵproperty("ngIf", ctx.hint !== null && (ctx.hint || i0.ɵɵpipeBind1(19, 22, ctx.cidr$)));
398
432
  } }, dependencies: [AutocompleteModule, i3.AutoCompleteDirective, i3.CustomAutoCompleteDirective, i3.AutocompleteComponent, i3.SuggestionComponent, i3.AutocompletePlaceholderComponent, AsyncPipe,
399
- E2eAttributeBindingDirective,
400
- ErrorsMapperModule, i1.ErrorsMapperComponent, FormModule, i3.FormItemComponent, i3.FormItemAddonDirective, i3.FormItemErrorDirective, i3.FormItemHintDirective, i3.FormItemLabelDirective, i3.FormItemControlDirective, NgIf,
433
+ PurePipe,
434
+ E2eAttributeBindingDirective, i1.ErrorsMapperComponent, FormModule, i3.FormItemComponent, i3.FormItemAddonDirective, i3.FormItemErrorDirective, i3.FormItemHintDirective, i3.FormItemLabelDirective, i3.FormItemControlDirective, NgIf,
401
435
  NgFor,
402
- InputModule, i3.InputComponent, i3.TagsInputComponent, IconModule, i3.IconComponent, TooltipModule, i3.TooltipDirective, FormsModule, i4.DefaultValueAccessor, i4.NgControlStatus, i4.NgModel, TranslateModule, i1.TranslatePipe], styles: ["[_nghost-%COMP%]:not(:last-child) aui-form-item[_ngcontent-%COMP%] .aui-form-item{margin-bottom:16px}"], changeDetection: 0 }); }
436
+ InputModule, i3.InputComponent, i3.TagsInputComponent, IconModule, i3.IconComponent, TooltipModule, i3.TooltipDirective, FormsModule, i4.DefaultValueAccessor, i4.NgControlStatus, i4.NgModel, TagModule, i3.TagComponent, i1.TranslatePipe], styles: ["[_nghost-%COMP%]:not(:last-child) aui-form-item[_ngcontent-%COMP%] .aui-form-item{margin-bottom:16px}"], changeDetection: 0 }); }
403
437
  }
404
438
  __decorate([
405
439
  ObservableInput(),
@@ -429,13 +463,19 @@ __decorate([
429
463
  ObservableInput(),
430
464
  __metadata("design:type", Observable)
431
465
  ], FixedIpInputComponent.prototype, "errorsMapper$", void 0);
466
+ __decorate([
467
+ bind,
468
+ __metadata("design:type", Function),
469
+ __metadata("design:paramtypes", [String, Array]),
470
+ __metadata("design:returntype", void 0)
471
+ ], FixedIpInputComponent.prototype, "isReservedIp", null);
432
472
  __decorate([
433
473
  bind,
434
474
  __metadata("design:type", Function),
435
475
  __metadata("design:paramtypes", [AbstractControl]),
436
476
  __metadata("design:returntype", void 0)
437
477
  ], FixedIpInputComponent.prototype, "validate", null);
438
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FixedIpInputComponent, [{
478
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FixedIpInputComponent, [{
439
479
  type: Component,
440
480
  args: [{ standalone: true, selector: 'acl-fixed-ip-input', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
441
481
  {
@@ -451,8 +491,9 @@ __decorate([
451
491
  ], imports: [
452
492
  AutocompleteModule,
453
493
  AsyncPipe,
494
+ PurePipe,
454
495
  E2eAttributeBindingDirective,
455
- ErrorsMapperModule,
496
+ ERRORS_MAPPER_MODULE,
456
497
  FormModule,
457
498
  NgIf,
458
499
  NgFor,
@@ -460,9 +501,10 @@ __decorate([
460
501
  IconModule,
461
502
  TooltipModule,
462
503
  FormsModule,
463
- TranslateModule,
464
- ], template: "<aui-form-item [width]=\"formItemWidth\">\n <label auiFormItemLabel>{{ label || ('ip_address' | translate) }}</label>\n <input\n *ngIf=\"!multiple\"\n aui-input\n auiFormItemControl\n [ngModel]=\"model\"\n (ngModelChange)=\"emitValue($event)\"\n #ipAddress=\"ngModel\"\n [placeholder]=\"placeholder || ('dhcp_placeholder' | translate)\"\n [auiAutocomplete]=\"suggestions\"\n />\n <aui-tags-input\n *ngIf=\"multiple\"\n class=\"flex-1\"\n auiFormItemControl\n #tagsInput\n [ngModel]=\"model\"\n (ngModelChange)=\"emitValue(uniq($event))\"\n #ipAddress=\"ngModel\"\n [placeholder]=\"placeholder || ('dhcp_placeholder' | translate)\"\n [auiAutocomplete]=\"suggestions\"\n [inputAsyncValidator]=\"validate\"\n ></aui-tags-input>\n <aui-autocomplete #suggestions>\n <aui-suggestion\n *ngFor=\"let ipAddressSuggestion of ipAddressSuggestions$ | async\"\n [value]=\"ipAddressSuggestion\"\n >\n {{ ipAddressSuggestion }}\n </aui-suggestion>\n <aui-autocomplete-placeholder>\n {{\n ((ipAddressSuggestions$ | async)\n ? 'no_available_suggestion'\n : 'loading'\n ) | translate\n }}\n </aui-autocomplete-placeholder>\n </aui-autocomplete>\n <ng-container\n *ngIf=\"addonTip != null\"\n auiFormItemAddon\n >\n <aui-icon\n *ngIf=\"addonTip\"\n icon=\"question_circle\"\n class=\"icon--help\"\n [auiTooltip]=\"addonTip\"\n auiTooltipPosition=\"end\"\n ></aui-icon>\n </ng-container>\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"\n ipAddress?.errors?.input_data_error ||\n ipAddress?.errors ||\n (inputErrors$ | async)\n \"\n [errorsMapper]=\"combinedErrorsMapper$ | async\"\n ></acl-errors-mapper>\n <div\n auiFormItemHint\n *ngIf=\"hint !== null && (hint || (cidr$ | async))\"\n >\n {{\n hint ||\n ('fix_ip_should_belong_tip' | translate: { cidr: (cidr$ | async) })\n }}\n </div>\n</aui-form-item>\n", styles: [":host:not(:last-child) aui-form-item ::ng-deep .aui-form-item{margin-bottom:16px}\n"] }]
465
- }], function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.K8sUtilService }, { type: i1.K8sApiService }, { type: i2.NetworkUtilService }, { type: i1.TranslateService }]; }, { cluster: [{
504
+ TagModule,
505
+ TRANSLATE_MODULE,
506
+ ], template: "<aui-form-item [width]=\"formItemWidth\">\n <label auiFormItemLabel>{{\n label || ('network.ip_address' | translate)\n }}</label>\n <input\n *ngIf=\"!multiple\"\n aui-input\n auiFormItemControl\n [ngModel]=\"model\"\n (ngModelChange)=\"emitValue($event)\"\n #ipAddress=\"ngModel\"\n [placeholder]=\"placeholder || ('dhcp_placeholder' | translate)\"\n [auiAutocomplete]=\"suggestions\"\n />\n <aui-tags-input\n *ngIf=\"multiple\"\n class=\"flex-1\"\n auiFormItemControl\n #tagsInput\n [ngModel]=\"model\"\n (ngModelChange)=\"emitValue(uniq($event))\"\n #ipAddress=\"ngModel\"\n [placeholder]=\"placeholder || ('dhcp_placeholder' | translate)\"\n [auiAutocomplete]=\"suggestions\"\n [inputAsyncValidator]=\"validate\"\n ></aui-tags-input>\n <aui-autocomplete #suggestions>\n <aui-suggestion\n *ngFor=\"let ipAddressSuggestion of ipAddressSuggestions$ | async\"\n [value]=\"ipAddressSuggestion\"\n >\n {{ ipAddressSuggestion }}\n <aui-tag\n *ngIf=\"ipAddressSuggestion | pure: isReservedIp: $subnetInfo().excludeIps\"\n [border]=\"true\"\n [size]=\"'mini'\"\n type=\"info\"\n >\n {{ 'network.reserved_ip' | translate }}\n </aui-tag>\n </aui-suggestion>\n <aui-autocomplete-placeholder>\n {{\n ((ipAddressSuggestions$ | async)\n ? 'network.no_available_suggestion'\n : 'loading'\n ) | translate\n }}\n </aui-autocomplete-placeholder>\n </aui-autocomplete>\n <ng-container\n *ngIf=\"addonTip != null\"\n auiFormItemAddon\n >\n <aui-icon\n *ngIf=\"addonTip\"\n icon=\"question_circle\"\n class=\"icon--help\"\n [auiTooltip]=\"addonTip\"\n auiTooltipPosition=\"end\"\n ></aui-icon>\n </ng-container>\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"\n ipAddress?.errors?.input_data_error ||\n ipAddress?.errors ||\n (inputErrors$ | async)\n \"\n [errorsMapper]=\"combinedErrorsMapper$ | async\"\n ></acl-errors-mapper>\n <div\n auiFormItemHint\n *ngIf=\"hint !== null && (hint || (cidr$ | async))\"\n >\n {{\n hint ||\n ('network.fix_ip_should_belong_tip'\n | translate: { cidr: (cidr$ | async) })\n }}\n </div>\n</aui-form-item>\n", styles: [":host:not(:last-child) aui-form-item ::ng-deep .aui-form-item{margin-bottom:16px}\n"] }]
507
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.K8sUtilService }, { type: i1.K8sApiService }, { type: i2.NetworkUtilService }, { type: i1.TranslateService }], { cluster: [{
466
508
  type: Input,
467
509
  args: [{ required: true }]
468
510
  }], cluster$: [], namespace: [{
@@ -499,5 +541,6 @@ __decorate([
499
541
  type: Input
500
542
  }], errors$: [], errorsMapper: [{
501
543
  type: Input
502
- }], errorsMapper$: [], validate: [] }); })();
503
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9maXhlZC1pcC9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL25ldHdvcmsvc3JjL2xpYi9jb21wb25lbnRzL2ZpeGVkLWlwL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLGlEQUFpRDtBQUNqRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGFBQWEsR0FDZCxNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQ0wsYUFBYSxFQUNiLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFNBQVMsRUFDVCx3QkFBd0IsRUFFeEIsSUFBSSxFQUNKLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLDRCQUE0QixFQUM1QixnQkFBZ0IsR0FFakIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFDTCxlQUFlLEVBRWYsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsT0FBTyxHQUVSLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxF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RSxRQUFRLEVBQUUsSUFBSSxFQUFFO1lBSXpCLFlBQVksTUFHWixNQUFNO2tCQURMLEtBQUs7WUFJTixPQUFPLE1BR1AsS0FBSztrQkFESixLQUFLO1lBSU4sV0FBVztrQkFEVixLQUFLO1lBSU4sSUFBSTtrQkFESCxLQUFLO1lBSU4sUUFBUTtrQkFEUCxLQUFLO1lBSU4sUUFBUTtrQkFEUCxLQUFLO1lBSU4sU0FBUztrQkFEUixTQUFTO21CQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFJekMsU0FBUztrQkFEUixTQUFTO21CQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFJekMsYUFBYTtrQkFEWixLQUFLO1lBSU4sVUFBVSxNQUlWLFlBQVk7a0JBRFgsS0FBSztZQUtOLG9CQUFvQjtrQkFEbkIsS0FBSztZQUdHLE1BQU07a0JBQWQsS0FBSztZQUVOLE9BQU8sTUFFRSxZQUFZO2tCQUFwQixLQUFLO1lBRU4sYUFBYSxNQWlUYixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eSAqL1xuaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlTW9kdWxlLFxuICBDb21tb25Gb3JtQ29udHJvbCxcbiAgRm9ybUl0ZW1XaWR0aCxcbiAgRm9ybU1vZHVsZSxcbiAgSWNvbk1vZHVsZSxcbiAgSW5wdXRNb2R1bGUsXG4gIFRhZ3NJbnB1dENvbXBvbmVudCxcbiAgVG9vbHRpcE1vZHVsZSxcbn0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQge1xuICBLOHNBcGlTZXJ2aWNlLFxuICBLOHNVdGlsU2VydmljZSxcbiAgT2JzZXJ2YWJsZUlucHV0LFxuICBwdWJsaXNoUmVmLFxuICBza2lwRXJyb3IsXG4gIG1hdGNoRXhwcmVzc2lvbnNUb1N0cmluZyxcbiAgTmFtZXNwYWNlLFxuICBiaW5kLFxuICBUcmFuc2xhdGVNb2R1bGUsXG4gIEVycm9yc01hcHBlck1vZHVsZSxcbiAgUkVTT1VSQ0VfVFlQRVMsXG4gIEUyZUF0dHJpYnV0ZUJpbmRpbmdEaXJlY3RpdmUsXG4gIFRyYW5zbGF0ZVNlcnZpY2UsXG4gIFN0cmluZ01hcCxcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQXN5bmNWYWxpZGF0b3IsXG4gIEZvcm1zTW9kdWxlLFxuICBOR19BU1lOQ19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgTmdNb2RlbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdW5pcSwgdmFsdWVzIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZpbHRlcixcbiAgZmlyc3QsXG4gIGZyb21FdmVudCxcbiAgbWFwLFxuICBtZXJnZSxcbiAgb2YsXG4gIHN3aXRjaE1hcCxcbiAgZm9ya0pvaW4sXG4gIHN0YXJ0V2l0aCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgTmV0d29ya1V0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmV0d29yay11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VibmV0LCBTdWJuZXRJcCB9IGZyb20gJy4uLy4uL3R5cGVzL2s4cy1leHBvcnRzJztcbmltcG9ydCB7IE5FVFdPUktfUkVTT1VSQ0VfVFlQRVMgfSBmcm9tICcuLi8uLi90eXBlcy9yZXNvdXJjZS1kZWZpbml0aW9uJztcbmltcG9ydCB7XG4gIElQTW9kZSxcbiAgTmV0d29ya01vZGUsXG4gIGFkYXB0SXBNb2RlLFxuICBhZGFwdFN1Ym5ldENpZHJzLFxuICBnZXRJcEFkZHJlc3NTdWdnZXN0aW9uc0J5Q2lkcnMsXG4gIGlwQWRkcmVzc0VxdWFsLFxuICBpc0JlbG9uZ0NpZHIsXG4gIGlzQnJvYWRjYXN0QWRkcixcbiAgaXNJcEFkZHJlc3NWYWxpZCxcbiAgaXNOZXR3b3JrQWRkcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvY2lkci1leHBvcnRzJztcbmltcG9ydCB7XG4gIENsdXN0ZXJOZXR3b3JrVHlwZSxcbiAgS1VCRV9PVk5fQU5OT1RBVElPTl9QUkVGSVgsXG59IGZyb20gJy4uLy4uL3V0aWxzL3N1Ym5ldC1leHBvcnRzJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnYWNsLWZpeGVkLWlwLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICd0ZW1wbGF0ZS5odG1sJyxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Q6bm90KDpsYXN0LWNoaWxkKSBhdWktZm9ybS1pdGVtIDo6bmctZGVlcCAuYXVpLWZvcm0taXRlbSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRml4ZWRJcElucHV0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZpeGVkSXBJbnB1dENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBFMmVBdHRyaWJ1dGVCaW5kaW5nRGlyZWN0aXZlLFxuICAgIEVycm9yc01hcHBlck1vZHVsZSxcbiAgICBGb3JtTW9kdWxlLFxuICAgIE5nSWYsXG4gICAgTmdGb3IsXG4gICAgSW5wdXRNb2R1bGUsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRml4ZWRJcElucHV0Q29tcG9uZW50XG4gIGV4dGVuZHMgQ29tbW9uRm9ybUNvbnRyb2w8c3RyaW5nIHwgc3RyaW5nW10+XG4gIGltcGxlbWVudHMgQXN5bmNWYWxpZGF0b3JcbntcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgY2x1c3Rlcjogc3RyaW5nO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBjbHVzdGVyJCE6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBuYW1lc3BhY2U6IHN0cmluZztcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgbmFtZXNwYWNlJCE6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBuZXR3b3JrVHlwZTogQ2x1c3Rlck5ldHdvcmtUeXBlO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBuZXR3b3JrVHlwZSQhOiBPYnNlcnZhYmxlPENsdXN0ZXJOZXR3b3JrVHlwZT47XG5cbiAgQElucHV0KClcbiAgc3VibmV0OiBTdWJuZXQ7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHN1Ym5ldCQhOiBPYnNlcnZhYmxlPFN1Ym5ldD47XG5cbiAgQElucHV0KClcbiAgbGFiZWw6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGhpbnQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBhZGRvblRpcDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIG11bHRpcGxlOiBib29sZWFuO1xuXG4gIEBWaWV3Q2hpbGQoJ2lwQWRkcmVzcycsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpcEFkZHJlc3M6IE5nTW9kZWw7XG5cbiAgQFZpZXdDaGlsZCgndGFnc0lucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhZ3NJbnB1dDogVGFnc0lucHV0Q29tcG9uZW50O1xuXG4gIEBJbnB1dCgpXG4gIGZvcm1JdGVtV2lkdGg6IEZvcm1JdGVtV2lkdGggPSBGb3JtSXRlbVdpZHRoLk1lZGl1bTtcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgdGFnc0lucHV0JCE6IE9ic2VydmFibGU8VGFnc0lucHV0Q29tcG9uZW50PjtcblxuICAvLyDomZrmi5/mnLrmm7TmlrDml7bmjpLpmaTmjonoh6rouqtcbiAgQElucHV0KClcbiAgc2tpcE9jY3VwaWVkID0gZmFsc2U7XG5cbiAgLy8g55uu5YmN5Y+M5qCI5Zu65a6aIElQIOWPquaUr+aMgSBJUHY0XG4gIEBJbnB1dCgpXG4gIGVuYWJsZUZpeElwVjZGb3JEdWFsID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzO1xuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgZXJyb3JzJCE6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycz47XG5cbiAgQElucHV0KCkgZXJyb3JzTWFwcGVyOiBTdHJpbmdNYXA7XG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBlcnJvcnNNYXBwZXIkITogT2JzZXJ2YWJsZTxTdHJpbmdNYXA+O1xuXG4gIHVuaXEgPSB1bmlxO1xuICBvblZhbGlkYXRvckNoYW5nZTogKCkgPT4gdm9pZDtcblxuICBnZXQgaXNDYWxpY28oKSB7XG4gICAgcmV0dXJuIHRoaXMubmV0d29ya1R5cGUgPT09IENsdXN0ZXJOZXR3b3JrVHlwZS5DQUxJQ087XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG5hbWVzcGFjZVJlc291cmNlJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY2x1c3RlciQsXG4gICAgdGhpcy5uYW1lc3BhY2UkLFxuICBdKS5waXBlKFxuICAgIGZpbHRlcigoW2NsdXN0ZXIsIG5hbWVzcGFjZV0pID0+ICEhY2x1c3RlciAmJiAhIW5hbWVzcGFjZSksXG4gICAgc3dpdGNoTWFwKChbY2x1c3RlciwgbmFtZXNwYWNlXSkgPT5cbiAgICAgIHRoaXMuazhzQXBpLmdldFJlc291cmNlPE5hbWVzcGFjZT4oe1xuICAgICAgICB0eXBlOiBSRVNPVVJDRV9UWVBFUy5OQU1FU1BBQ0UsXG4gICAgICAgIGNsdXN0ZXIsXG4gICAgICAgIG5hbWU6IG5hbWVzcGFjZSxcbiAgICAgIH0pLFxuICAgICksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya01vZGUkID0gdGhpcy5jbHVzdGVyJC5waXBlKFxuICAgIHN3aXRjaE1hcChjbHVzdGVyID0+IHRoaXMubmV0d29ya1V0aWxTZXJ2aWNlLmdldE5ldHdvcmtNb2RlJChjbHVzdGVyKSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgJG5ldHdvcmtNb2RlID0gdG9TaWduYWwodGhpcy5uZXR3b3JrTW9kZSQpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VibmV0RGV0YWlscyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmNsdXN0ZXIkLFxuICAgIHRoaXMubmV0d29ya1R5cGUkLFxuICAgIHRoaXMuc3VibmV0JCxcbiAgXSkucGlwZShcbiAgICBmaWx0ZXIoKFtjbHVzdGVyLCBuZXR3b3JrVHlwZV0pID0+ICEhY2x1c3RlciAmJiAhIW5ldHdvcmtUeXBlKSxcbiAgICBzd2l0Y2hNYXAoKFtjbHVzdGVyLCBfbmV0d29ya1R5cGUsIHN1Ym5ldF0pID0+XG4gICAgICBzdWJuZXRcbiAgICAgICAgPyBvZih7XG4gICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgc3VibmV0czogW3N1Ym5ldF0sXG4gICAgICAgICAgICBzdWJuZXQsXG4gICAgICAgICAgICBnYXRld2F5OiBzdWJuZXQuc3BlYz8uZ2F0ZXdheSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHRoaXMuaXNDYWxpY29cbiAgICAgICAgPyB0aGlzLms4c0FwaVxuICAgICAgICAgICAgLmdldFJlc291cmNlTGlzdDxTdWJuZXQ+KHtcbiAgICAgICAgICAgICAgdHlwZTogTkVUV09SS19SRVNPVVJDRV9UWVBFUy5TVUJORVRfS1VCRV9PVk4sXG4gICAgICAgICAgICAgIGNsdXN0ZXIsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIG1hcChyZXMgPT4gcmVzLml0ZW1zKSxcbiAgICAgICAgICAgICAgc2tpcEVycm9yKFtdIGFzIFN1Ym5ldFtdKSxcbiAgICAgICAgICAgICAgbWFwKHN1Ym5ldHMgPT4gKHtcbiAgICAgICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgICAgIHN1Ym5ldHMsXG4gICAgICAgICAgICAgICAgc3VibmV0OiBudWxsIGFzIFN1Ym5ldCxcbiAgICAgICAgICAgICAgICBnYXRld2F5OiAnJyxcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgKVxuICAgICAgICA6IG9mKHtcbiAgICAgICAgICAgIGNsdXN0ZXIsXG4gICAgICAgICAgICBzdWJuZXRzOiBbXSBhcyBTdWJuZXRbXSxcbiAgICAgICAgICAgIHN1Ym5ldDogbnVsbCBhcyBTdWJuZXQsXG4gICAgICAgICAgICBnYXRld2F5OiAnJyxcbiAgICAgICAgICB9KSxcbiAgICApLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VibmV0SW5mbyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLm5ldHdvcmtNb2RlJCxcbiAgICB0aGlzLm5hbWVzcGFjZVJlc291cmNlJC5waXBlKGZpbHRlcihCb29sZWFuKSksXG4gICAgdGhpcy5zdWJuZXREZXRhaWxzJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtuZXR3b3JrTW9kZSwgbmFtZXNwYWNlLCB7IGNsdXN0ZXIsIHN1Ym5ldHMsIHN1Ym5ldCwgZ2F0ZXdheSB9XSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2x1c3RlcixcbiAgICAgICAgc3VibmV0Q2lkcnM6IHRoaXMuaXNDYWxpY29cbiAgICAgICAgICA/IHRoaXMubmV0d29ya1V0aWxTZXJ2aWNlLmdldENhbGljb0NpZHJzKFxuICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHN1Ym5ldHMsXG4gICAgICAgICAgICAgIG5ldHdvcmtNb2RlLFxuICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogYWRhcHRTdWJuZXRDaWRycyhcbiAgICAgICAgICAgICAgc3VibmV0ID09IG51bGxcbiAgICAgICAgICAgICAgICA/IHRoaXMuazhzVXRpbC5nZXRBbm5vdGF0aW9uKG5hbWVzcGFjZSwge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2lkcicsXG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW46IEtVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IHN1Ym5ldC5zcGVjPy5jaWRyQmxvY2sgPz8gJycsXG4gICAgICAgICAgICAgIHRoaXMuJG5ldHdvcmtNb2RlKCksXG4gICAgICAgICAgICAgIHRoaXMuZW5hYmxlRml4SXBWNkZvckR1YWwsXG4gICAgICAgICAgICApLFxuICAgICAgICBzdWJuZXROYW1lOlxuICAgICAgICAgIHN1Ym5ldCA9PSBudWxsXG4gICAgICAgICAgICA/IHRoaXMuazhzVXRpbC5nZXRBbm5vdGF0aW9uKG5hbWVzcGFjZSwge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdsb2dpY2FsX3N3aXRjaCcsXG4gICAgICAgICAgICAgICAgYmFzZURvbWFpbjogS1VCRV9PVk5fQU5OT1RBVElPTl9QUkVGSVgsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IHRoaXMuazhzVXRpbC5nZXROYW1lKHN1Ym5ldCksXG4gICAgICAgIGdhdGV3YXksXG4gICAgICB9O1xuICAgIH0pLFxuICAgIHN3aXRjaE1hcChzdWJuZXRJbmZvID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5uZXR3b3JrVHlwZSA9PT0gQ2x1c3Rlck5ldHdvcmtUeXBlLktVQkVfT1ZOICYmXG4gICAgICAgICFzdWJuZXRJbmZvLmdhdGV3YXlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4oXG4gICAgICAgICAgc3VibmV0SW5mby5zdWJuZXROYW1lLnNwbGl0KCcsJykubWFwKHN1Ym5ldE5hbWUgPT5cbiAgICAgICAgICAgIHRoaXMuazhzQXBpXG4gICAgICAgICAgICAgIC5nZXRSZXNvdXJjZTxTdWJuZXQ+KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTixcbiAgICAgICAgICAgICAgICBjbHVzdGVyOiBzdWJuZXRJbmZvLmNsdXN0ZXIsXG4gICAgICAgICAgICAgICAgbmFtZTogc3VibmV0TmFtZSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLnBpcGUoc2tpcEVycm9yKG51bGwgYXMgU3VibmV0KSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIG1hcChsaXN0ID0+IGxpc3QuZmlsdGVyKEJvb2xlYW4pKSxcbiAgICAgICAgICBtYXAoc3VibmV0TGlzdCA9PlxuICAgICAgICAgICAgc3VibmV0TGlzdC5sZW5ndGhcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAuLi5zdWJuZXRJbmZvLFxuICAgICAgICAgICAgICAgICAgZ2F0ZXdheTogc3VibmV0TGlzdFxuICAgICAgICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4gaXRlbS5zcGVjPy5nYXRld2F5KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsJyksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHN1Ym5ldEluZm8sXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZihzdWJuZXRJbmZvKTtcbiAgICB9KSxcbiAgICBzd2l0Y2hNYXAoc3VibmV0SW5mbyA9PiB7XG4gICAgICBpZiAoc3VibmV0SW5mby5zdWJuZXRDaWRycy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG9mKHN1Ym5ldEluZm8pO1xuICAgICAgfVxuXG4gICAgICAvLyBmYWxsYmFjayB0byBkZWZhdWx0IHN1Ym5ldFxuICAgICAgcmV0dXJuIHRoaXMuazhzQXBpXG4gICAgICAgIC5nZXRSZXNvdXJjZTxTdWJuZXQ+KHtcbiAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTixcbiAgICAgICAgICBjbHVzdGVyOiBzdWJuZXRJbmZvLmNsdXN0ZXIsXG4gICAgICAgICAgbmFtZTogdGhpcy5pc0NhbGljb1xuICAgICAgICAgICAgPyBgZGVmYXVsdC1pcCR7XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV0d29ya01vZGUoKSA9PT0gJ2R1YWwnID8gJ3Y0JyA6IHRoaXMuJG5ldHdvcmtNb2RlKClcbiAgICAgICAgICAgICAgfS1pcHBvb2xgXG4gICAgICAgICAgICA6ICdvdm4tZGVmYXVsdCcsXG4gICAgICAgIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcChzdWJuZXQgPT4gKHtcbiAgICAgICAgICAgIC4uLnN1Ym5ldEluZm8sXG4gICAgICAgICAgICBzdWJuZXRDaWRyczogYWRhcHRTdWJuZXRDaWRycyhcbiAgICAgICAgICAgICAgc3VibmV0LnNwZWMuY2lkckJsb2NrLFxuICAgICAgICAgICAgICB0aGlzLiRuZXR3b3JrTW9kZSgpLFxuICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN1Ym5ldE5hbWU6IHRoaXMuazhzVXRpbC5nZXROYW1lKHN1Ym5ldCksXG4gICAgICAgICAgICBnYXRld2F5OiBzdWJuZXQuc3BlYy5nYXRld2F5LFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgKTtcbiAgICB9KSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSAkc3VibmV0SW5mbyA9IHRvU2lnbmFsKHRoaXMuc3VibmV0SW5mbyQpO1xuXG4gIGNpZHIkID0gdGhpcy5zdWJuZXRJbmZvJC5waXBlKFxuICAgIG1hcChzdWJuZXRJbmZvID0+IHN1Ym5ldEluZm8/LnN1Ym5ldENpZHJzLmpvaW4oJ+OAgScpKSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlubmVyRXJyb3JzTWFwcGVyJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY2lkciQsXG4gICAgdGhpcy50cmFuc2xhdGUubG9jYWxlJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtjaWRyXSkgPT4gKHtcbiAgICAgIHBhdHRlcm46IHRoaXMudHJhbnNsYXRlLmdldCgnZml4ZWRfaXBfcGF0dGVybl90aXBzJywge1xuICAgICAgICBpcE1vZGU6IFsnZHVhbCcsICd2NCddLmluY2x1ZGVzKHRoaXMuJG5ldHdvcmtNb2RlKCkpID8gJ0lQdjQnIDogJ0lQdjYnLFxuICAgICAgfSksXG4gICAgICBvY2N1cGllZDogdGhpcy50cmFuc2xhdGUuZ2V0KCdmaXhlZF9pcF9vY2N1cGllZF90aXBzJywge1xuICAgICAgICBjaWRyLFxuICAgICAgfSksXG4gICAgICBvdXRfb2ZfcmFuZ2U6IHRoaXMudHJhbnNsYXRlLmdldCgnZml4ZWRfaXBfb3V0X29mX3JhbmdlX3RpcHMnLCB7XG4gICAgICAgIGNpZHIsXG4gICAgICB9KSxcbiAgICB9KSksXG4gICk7XG5cbiAgY29tYmluZWRFcnJvcnNNYXBwZXIkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbm5lckVycm9yc01hcHBlciQsXG4gICAgdGhpcy5lcnJvcnNNYXBwZXIkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lubmVyRXJyb3JzTWFwcGVyLCBlcnJvcnNNYXBwZXJdKSA9PiAoe1xuICAgICAgLi4uaW5uZXJFcnJvcnNNYXBwZXIsXG4gICAgICAuLi5lcnJvcnNNYXBwZXIsXG4gICAgfSkpLFxuICApO1xuXG4gIGlucHV0RXJyb3JzJCA9IHRoaXMuZXJyb3JzJC5waXBlKFxuICAgIHRhcChlcnJvcnMgPT4ge1xuICAgICAgdGhpcy5zZXRFcnJvcnMoZXJyb3JzKTtcbiAgICAgIHRoaXMuaXBBZGRyZXNzPy5jb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlPy4oKTtcbiAgICB9KSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHVzZWRJcHMkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5jbHVzdGVyJCxcbiAgICB0aGlzLnN1Ym5ldEluZm8kLFxuICAgIHRoaXMubW9kZWwkLnBpcGUoZmlyc3QoKSksXG4gIF0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbY2x1c3RlciwgeyBzdWJuZXROYW1lLCBnYXRld2F5IH0sIGlwXSkgPT5cbiAgICAgIHRoaXMuaXNDYWxpY29cbiAgICAgICAgPyBvZihbXSBhcyBzdHJpbmdbXSlcbiAgICAgICAgOiB0aGlzLms4c0FwaVxuICAgICAgICAgICAgLmdldFJlc291cmNlTGlzdDxTdWJuZXRJcD4oe1xuICAgICAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTl9JUCxcbiAgICAgICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBsYWJlbFNlbGVjdG9yOiBtYXRjaEV4cHJlc3Npb25zVG9TdHJpbmcoW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGAke0tVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYfS9zdWJuZXRgLFxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogJ2luJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBzdWJuZXROYW1lLnNwbGl0KCcsJyksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBtYXAocmVzID0+IHJlcy5pdGVtcyksXG4gICAgICAgICAgICAgIHNraXBFcnJvcihbXSBhcyBTdWJuZXRJcFtdKSxcbiAgICAgICAgICAgICAgbWFwKHN1Ym5ldElwcyA9PlxuICAgICAgICAgICAgICAgIHN1Ym5ldElwcy5yZWR1Y2U8c3RyaW5nW10+KFxuICAgICAgICAgICAgICAgICAgKHVzZWRJcHMsIHsgc3BlYzogeyBpcEFkZHJlc3MgfSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlwQWRkcmVzcy5zcGxpdCgnLCcpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGlwICE9PSBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VkSXBzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZWRJcHM7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZ2F0ZXdheS5zcGxpdCgnLCcpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgJHVzZWRJcHMgPSB0b1NpZ25hbCh0aGlzLnVzZWRJcHMkKTtcblxuICBpcEFkZHJlc3NTdWdnZXN0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLnN1Ym5ldEluZm8kLFxuICAgIHRoaXMudXNlZElwcyQsXG4gICAgdGhpcy5uZXR3b3JrTW9kZSQsXG4gICAgdGhpcy5tb2RlbCQsXG4gICAgdGhpcy50YWdzSW5wdXQkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAodGFnc0lucHV0ID0+XG4gICAgICAgIHRhZ3NJbnB1dFxuICAgICAgICAgID8gbWVyZ2UoXG4gICAgICAgICAgICAgIGZyb21FdmVudCh0YWdzSW5wdXQuaW5wdXRSZWYubmF0aXZlRWxlbWVudCwgJ2lucHV0JykucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoZXYgPT4gKGV2LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHRhZ3NJbnB1dC5pbnB1dENvbnRyb2wudmFsdWVDaGFuZ2VzIGFzIE9ic2VydmFibGU8c3RyaW5nPixcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6ICh0aGlzLm1vZGVsJCBhcyBPYnNlcnZhYmxlPHN0cmluZz4pLFxuICAgICAgKSxcbiAgICApLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3sgc3VibmV0Q2lkcnMgfSwgdXNlZElwcywgbmV0d29ya01vZGUsIGFkZGVkSXBzLCBpbnB1dFZhbHVlXSkgPT5cbiAgICAgIGdldElwQWRkcmVzc1N1Z2dlc3Rpb25zQnlDaWRycyhcbiAgICAgICAgc3VibmV0Q2lkcnMsXG4gICAgICAgIG5ldHdvcmtNb2RlLFxuICAgICAgICBbXG4gICAgICAgICAgLi4udXNlZElwcyxcbiAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShhZGRlZElwcykgPyBhZGRlZElwcyA6IFthZGRlZElwc10uZmlsdGVyKEJvb2xlYW4pKSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5wdXRWYWx1ZSxcbiAgICAgICAgdGhpcy5pc0NhbGljbyxcbiAgICAgICksXG4gICAgKSxcbiAgICBzdGFydFdpdGgoW10gYXMgc3RyaW5nW10pLFxuICAgIHNraXBFcnJvcihbXSBhcyBzdHJpbmdbXSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgazhzVXRpbDogSzhzVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNBcGk6IEs4c0FwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrVXRpbFNlcnZpY2U6IE5ldHdvcmtVdGlsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoY2RyKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICBAYmluZFxuICB2YWxpZGF0ZShjdHJsOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICBjb25zdCBpcEFkZHJlc3M6IHN0cmluZyB8IHN0cmluZ1tdID0gY3RybC52YWx1ZTtcbiAgICByZXR1cm4gaXBBZGRyZXNzICYmICFBcnJheS5pc0FycmF5KGlwQWRkcmVzcylcbiAgICAgID8gdGhpcy51c2VkSXBzJC5waXBlKFxuICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgbWFwKCgpID0+IHRoaXMuc2V0RXJyb3JzKHRoaXMudmFsaWRhdGVGaXhlZElwKGlwQWRkcmVzcykpKSxcbiAgICAgICAgKVxuICAgICAgOiBvZih0aGlzLnNldEVycm9ycyhudWxsKSk7XG4gIH1cblxuICBwcml2YXRlIHNldEVycm9ycyhlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICBjb25zdCBjb21iaW5lZEVycm9ycyA9IHRoaXMubXVsdGlwbGVcbiAgICAgID8geyAuLi50aGlzLmlwQWRkcmVzcz8uY29udHJvbC5lcnJvcnMsIC4uLmVycm9ycyB9IC8vIOWPr+iDveWtmOWcqOS8oOWFpeeahCBlcnJvcnNcbiAgICAgIDogZXJyb3JzO1xuICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWx1ZXMoY29tYmluZWRFcnJvcnMpLmxlbmd0aFxuICAgICAgPyBjb21iaW5lZEVycm9yc1xuICAgICAgOiBudWxsO1xuICAgIHRoaXMuaXBBZGRyZXNzPy5jb250cm9sLnNldEVycm9ycyh2YWxpZGF0aW9uRXJyb3JzKTtcbiAgICByZXR1cm4gdmFsaWRhdGlvbkVycm9ycztcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVGaXhlZElwKGlwQWRkcmVzczogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBzdWJuZXRDaWRycywgZ2F0ZXdheSB9ID0gdGhpcy4kc3VibmV0SW5mbygpO1xuXG4gICAgY29uc3QgaXBNb2RlID0gdGhpcy5hZGFwdElwTW9kZShpcEFkZHJlc3MpO1xuICAgIGNvbnN0IGlzSXBWNCA9IGlwTW9kZSA9PT0gSVBNb2RlLklQVjQ7XG5cbiAgICBjb25zdCBqdWRnZUNpZHJzID0gc3VibmV0Q2lkcnMuZmlsdGVyKGNpZHIgPT4ge1xuICAgICAgY29uc3QgaXNJcFY2ID0gY2lkci5pbmNsdWRlcygnOicpO1xuICAgICAgcmV0dXJuIGlzSXBWNCA/ICFpc0lwVjYgOiBpc0lwVjY7XG4gICAgfSk7XG5cbiAgICBpZiAoc3VibmV0Q2lkcnMubGVuZ3RoICYmICFqdWRnZUNpZHJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0dGVybjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gaW52YWxpZCBpcCBwYXR0ZXJuLCBub3QgYnJvYWRjYXN0IGlwLCBub3QgbmV0d29yayBpcFxuICAgIGlmIChcbiAgICAgICFpc0lwQWRkcmVzc1ZhbGlkKGlwQWRkcmVzcywgaXBNb2RlKSB8fFxuICAgICAganVkZ2VDaWRycy5zb21lKFxuICAgICAgICBjYWxpY29DaWRyID0+XG4gICAgICAgICAgaXNCcm9hZGNhc3RBZGRyKGlwQWRkcmVzcywgY2FsaWNvQ2lkciwgaXBNb2RlKSB8fFxuICAgICAgICAgIGlzTmV0d29ya0FkZHIoaXBBZGRyZXNzLCBjYWxpY29DaWRyLCBpcE1vZGUpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0dGVybjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHY0R2F0ZXdheTogc3RyaW5nO1xuICAgIGxldCB2NkdhdGV3YXk6IHN0cmluZztcblxuICAgIGlmIChnYXRld2F5KSB7XG4gICAgICBjb25zdCBnYXRld2F5UGFydHMgPSBnYXRld2F5LnNwbGl0KCcsJyk7XG4gICAgICB2NEdhdGV3YXkgPSBnYXRld2F5UGFydHNbMF07XG4gICAgICB2NkdhdGV3YXkgPSBnYXRld2F5UGFydHNbMV07XG4gICAgfVxuXG4gICAgY29uc3QgaXBHYXRld2F5ID0gaXNJcFY0ID8gdjRHYXRld2F5IDogdjZHYXRld2F5O1xuXG4gICAgaWYgKFxuICAgICAgLy8gaHR0cHM6Ly9qaXJhLmFsYXVkYS5jbi9icm93c2UvQUNQLTEyMTM2P2ZvY3VzZWRDb21tZW50SWQ9MjE1NDYwJnBhZ2U9Y29tLmF0bGFzc2lhbi5qaXJhLnBsdWdpbi5zeXN0ZW0uaXNzdWV0YWJwYW5lbHMlM0Fjb21tZW50LXRhYnBhbmVsI2NvbW1lbnQtMjE1NDYwXG4gICAgICAoaXBHYXRld2F5ICYmIGlwQWRkcmVzc0VxdWFsKGlwR2F0ZXdheSwgaXBBZGRyZXNzLCBpcE1vZGUpKSB8fFxuICAgICAgKCF0aGlzLnNraXBPY2N1cGllZCAmJlxuICAgICAgICB0aGlzLiR1c2VkSXBzKCkuc29tZSh1c2VkSXAgPT5cbiAgICAgICAgICBpcEFkZHJlc3NFcXVhbCh1c2VkSXAsIGlwQWRkcmVzcywgaXBNb2RlKSxcbiAgICAgICAgKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9jY3VwaWVkOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBqdWRnZUNpZHJzLmxlbmd0aCAmJlxuICAgICAgIWp1ZGdlQ2lkcnMuc29tZShjaWRyID0+IGNpZHIgJiYgaXNCZWxvbmdDaWRyKGNpZHIsIGlwQWRkcmVzcywgaXBNb2RlKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG91dF9vZl9yYW5nZTogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGFwdElwTW9kZShpcEFkZHJlc3M6IHN0cmluZykge1xuICAgIHJldHVybiBhZGFwdElwTW9kZShcbiAgICAgIGlwQWRkcmVzcyxcbiAgICAgICF0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsICYmIHRoaXMuJG5ldHdvcmtNb2RlKCkgPT09IE5ldHdvcmtNb2RlLkRVQUxcbiAgICAgICAgPyBOZXR3b3JrTW9kZS5JUFY0XG4gICAgICAgIDogdGhpcy4kbmV0d29ya01vZGUoKSxcbiAgICApO1xuICB9XG59XG4iLCI8YXVpLWZvcm0taXRlbSBbd2lkdGhdPVwiZm9ybUl0ZW1XaWR0aFwiPlxuICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyBsYWJlbCB8fCAoJ2lwX2FkZHJlc3MnIHwgdHJhbnNsYXRlKSB9fTwvbGFiZWw+XG4gIDxpbnB1dFxuICAgICpuZ0lmPVwiIW11bHRpcGxlXCJcbiAgICBhdWktaW5wdXRcbiAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICBbbmdNb2RlbF09XCJtb2RlbFwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwiZW1pdFZhbHVlKCRldmVudClcIlxuICAgICNpcEFkZHJlc3M9XCJuZ01vZGVsXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfHwgKCdkaGNwX3BsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZSlcIlxuICAgIFthdWlBdXRvY29tcGxldGVdPVwic3VnZ2VzdGlvbnNcIlxuICAvPlxuICA8YXVpLXRhZ3MtaW5wdXRcbiAgICAqbmdJZj1cIm11bHRpcGxlXCJcbiAgICBjbGFzcz1cImZsZXgtMVwiXG4gICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgI3RhZ3NJbnB1dFxuICAgIFtuZ01vZGVsXT1cIm1vZGVsXCJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJlbWl0VmFsdWUodW5pcSgkZXZlbnQpKVwiXG4gICAgI2lwQWRkcmVzcz1cIm5nTW9kZWxcIlxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciB8fCAoJ2RoY3BfcGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlKVwiXG4gICAgW2F1aUF1dG9jb21wbGV0ZV09XCJzdWdnZXN0aW9uc1wiXG4gICAgW2lucHV0QXN5bmNWYWxpZGF0b3JdPVwidmFsaWRhdGVcIlxuICA+PC9hdWktdGFncy1pbnB1dD5cbiAgPGF1aS1hdXRvY29tcGxldGUgI3N1Z2dlc3Rpb25zPlxuICAgIDxhdWktc3VnZ2VzdGlvblxuICAgICAgKm5nRm9yPVwibGV0IGlwQWRkcmVzc1N1Z2dlc3Rpb24gb2YgaXBBZGRyZXNzU3VnZ2VzdGlvbnMkIHwgYXN5bmNcIlxuICAgICAgW3ZhbHVlXT1cImlwQWRkcmVzc1N1Z2dlc3Rpb25cIlxuICAgID5cbiAgICAgIHt7IGlwQWRkcmVzc1N1Z2dlc3Rpb24gfX1cbiAgICA8L2F1aS1zdWdnZXN0aW9uPlxuICAgIDxhdWktYXV0b2NvbXBsZXRlLXBsYWNlaG9sZGVyPlxuICAgICAge3tcbiAgICAgICAgKChpcEFkZHJlc3NTdWdnZXN0aW9ucyQgfCBhc3luYylcbiAgICAgICAgICA/ICdub19hdmFpbGFibGVfc3VnZ2VzdGlvbidcbiAgICAgICAgICA6ICdsb2FkaW5nJ1xuICAgICAgICApIHwgdHJhbnNsYXRlXG4gICAgICB9fVxuICAgIDwvYXVpLWF1dG9jb21wbGV0ZS1wbGFjZWhvbGRlcj5cbiAgPC9hdWktYXV0b2NvbXBsZXRlPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJhZGRvblRpcCAhPSBudWxsXCJcbiAgICBhdWlGb3JtSXRlbUFkZG9uXG4gID5cbiAgICA8YXVpLWljb25cbiAgICAgICpuZ0lmPVwiYWRkb25UaXBcIlxuICAgICAgaWNvbj1cInF1ZXN0aW9uX2NpcmNsZVwiXG4gICAgICBjbGFzcz1cImljb24tLWhlbHBcIlxuICAgICAgW2F1aVRvb2x0aXBdPVwiYWRkb25UaXBcIlxuICAgICAgYXVpVG9vbHRpcFBvc2l0aW9uPVwiZW5kXCJcbiAgICA+PC9hdWktaWNvbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgIGF1aUZvcm1JdGVtRXJyb3JcbiAgICBbZXJyb3JzXT1cIlxuICAgICAgaXBBZGRyZXNzPy5lcnJvcnM/LmlucHV0X2RhdGFfZXJyb3IgfHxcbiAgICAgIGlwQWRkcmVzcz8uZXJyb3JzIHx8XG4gICAgICAoaW5wdXRFcnJvcnMkIHwgYXN5bmMpXG4gICAgXCJcbiAgICBbZXJyb3JzTWFwcGVyXT1cImNvbWJpbmVkRXJyb3JzTWFwcGVyJCB8IGFzeW5jXCJcbiAgPjwvYWNsLWVycm9ycy1tYXBwZXI+XG4gIDxkaXZcbiAgICBhdWlGb3JtSXRlbUhpbnRcbiAgICAqbmdJZj1cImhpbnQgIT09IG51bGwgJiYgKGhpbnQgfHwgKGNpZHIkIHwgYXN5bmMpKVwiXG4gID5cbiAgICB7e1xuICAgICAgaGludCB8fFxuICAgICAgICAoJ2ZpeF9pcF9zaG91bGRfYmVsb25nX3RpcCcgfCB0cmFuc2xhdGU6IHsgY2lkcjogKGNpZHIkIHwgYXN5bmMpIH0pXG4gICAgfX1cbiAgPC9kaXY+XG48L2F1aS1mb3JtLWl0ZW0+XG4iXX0=
544
+ }], errorsMapper$: [], isReservedIp: [], validate: [] }); })();
545
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FixedIpInputComponent, { className: "FixedIpInputComponent", filePath: "lib/components/fixed-ip/component.ts", lineNumber: 126 }); })();
546
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9maXhlZC1pcC9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL25ldHdvcmsvc3JjL2xpYi9jb21wb25lbnRzL2ZpeGVkLWlwL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLGFBQWEsR0FDZCxNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQ0wsYUFBYSxFQUNiLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFNBQVMsRUFDVCx3QkFBd0IsRUFFeEIsSUFBSSxFQUNKLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUVoQixvQkFBb0IsRUFDcEIsUUFBUSxHQUNULE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULEtBQUssRUFDTCxTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsZUFBZSxFQUVmLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLE9BQU8sR0FFUixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FB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b2R1bGUsXG4gIENvbW1vbkZvcm1Db250cm9sLFxuICBGb3JtSXRlbVdpZHRoLFxuICBGb3JtTW9kdWxlLFxuICBJY29uTW9kdWxlLFxuICBJbnB1dE1vZHVsZSxcbiAgVGFnTW9kdWxlLFxuICBUYWdzSW5wdXRDb21wb25lbnQsXG4gIFRvb2x0aXBNb2R1bGUsXG59IGZyb20gJ0BhbGF1ZGEvdWknO1xuaW1wb3J0IHtcbiAgSzhzQXBpU2VydmljZSxcbiAgSzhzVXRpbFNlcnZpY2UsXG4gIE9ic2VydmFibGVJbnB1dCxcbiAgcHVibGlzaFJlZixcbiAgc2tpcEVycm9yLFxuICBtYXRjaEV4cHJlc3Npb25zVG9TdHJpbmcsXG4gIE5hbWVzcGFjZSxcbiAgYmluZCxcbiAgVFJBTlNMQVRFX01PRFVMRSxcbiAgUkVTT1VSQ0VfVFlQRVMsXG4gIEUyZUF0dHJpYnV0ZUJpbmRpbmdEaXJlY3RpdmUsXG4gIFRyYW5zbGF0ZVNlcnZpY2UsXG4gIFN0cmluZ01hcCxcbiAgRVJST1JTX01BUFBFUl9NT0RVTEUsXG4gIFB1cmVQaXBlLFxufSBmcm9tICdAYWxhdWRhLWZlL2NvbW1vbic7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nRm9yLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgVmlld0NoaWxkLFxuICBmb3J3YXJkUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBBc3luY1ZhbGlkYXRvcixcbiAgRm9ybXNNb2R1bGUsXG4gIE5HX0FTWU5DX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ01vZGVsLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB1bmlxLCB2YWx1ZXMgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSxcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgZnJvbUV2ZW50LFxuICBtYXAsXG4gIG1lcmdlLFxuICBvZixcbiAgc3dpdGNoTWFwLFxuICBmb3JrSm9pbixcbiAgc3RhcnRXaXRoLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBOZXR3b3JrVXRpbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9uZXR3b3JrLXV0aWwuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJuZXQsIFN1Ym5ldElwIH0gZnJvbSAnLi4vLi4vdHlwZXMvazhzLWV4cG9ydHMnO1xuaW1wb3J0IHsgTkVUV09SS19SRVNPVVJDRV9UWVBFUyB9IGZyb20gJy4uLy4uL3R5cGVzL3Jlc291cmNlLWRlZmluaXRpb24nO1xuaW1wb3J0IHtcbiAgSVBNb2RlLFxuICBOZXR3b3JrTW9kZSxcbiAgYWRhcHRJcE1vZGUsXG4gIGFkYXB0U3VibmV0Q2lkcnMsXG4gIGdldElwQWRkcmVzc1N1Z2dlc3Rpb25zQnlDaWRycyxcbiAgaXBBZGRyZXNzRXF1YWwsXG4gIGlzQmVsb25nQ2lkcixcbiAgaXNCcm9hZGNhc3RBZGRyLFxuICBpc0lwQWRkcmVzc1ZhbGlkLFxuICBpc05ldHdvcmtBZGRyLFxuICBnZXRBZGRyZXNzQnVpbGRlcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvY2lkci1leHBvcnRzJztcbmltcG9ydCB7XG4gIENsdXN0ZXJOZXR3b3JrVHlwZSxcbiAgS1VCRV9PVk5fQU5OT1RBVElPTl9QUkVGSVgsXG59IGZyb20gJy4uLy4uL3V0aWxzL3N1Ym5ldC1leHBvcnRzJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnYWNsLWZpeGVkLWlwLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICd0ZW1wbGF0ZS5odG1sJyxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Q6bm90KDpsYXN0LWNoaWxkKSBhdWktZm9ybS1pdGVtIDo6bmctZGVlcCAuYXVpLWZvcm0taXRlbSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRml4ZWRJcElucHV0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZpeGVkSXBJbnB1dENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBQdXJlUGlwZSxcbiAgICBFMmVBdHRyaWJ1dGVCaW5kaW5nRGlyZWN0aXZlLFxuICAgIEVSUk9SU19NQVBQRVJfTU9EVUxFLFxuICAgIEZvcm1Nb2R1bGUsXG4gICAgTmdJZixcbiAgICBOZ0ZvcixcbiAgICBJbnB1dE1vZHVsZSxcbiAgICBJY29uTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgVGFnTW9kdWxlLFxuICAgIFRSQU5TTEFURV9NT0RVTEUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZpeGVkSXBJbnB1dENvbXBvbmVudFxuICBleHRlbmRzIENvbW1vbkZvcm1Db250cm9sPHN0cmluZyB8IHN0cmluZ1tdPlxuICBpbXBsZW1lbnRzIEFzeW5jVmFsaWRhdG9yXG57XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIGNsdXN0ZXI6IHN0cmluZztcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgY2x1c3RlciQhOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIG5hbWVzcGFjZSQhOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgbmV0d29ya1R5cGU6IENsdXN0ZXJOZXR3b3JrVHlwZTtcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgbmV0d29ya1R5cGUkITogT2JzZXJ2YWJsZTxDbHVzdGVyTmV0d29ya1R5cGU+O1xuXG4gIEBJbnB1dCgpXG4gIHN1Ym5ldDogU3VibmV0O1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBzdWJuZXQkITogT2JzZXJ2YWJsZTxTdWJuZXQ+O1xuXG4gIEBJbnB1dCgpXG4gIGxhYmVsOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcGxhY2Vob2xkZXI6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBoaW50OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgYWRkb25UaXA6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBtdWx0aXBsZTogYm9vbGVhbjtcblxuICBAVmlld0NoaWxkKCdpcEFkZHJlc3MnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaXBBZGRyZXNzOiBOZ01vZGVsO1xuXG4gIEBWaWV3Q2hpbGQoJ3RhZ3NJbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICB0YWdzSW5wdXQ6IFRhZ3NJbnB1dENvbXBvbmVudDtcblxuICBASW5wdXQoKVxuICBmb3JtSXRlbVdpZHRoOiBGb3JtSXRlbVdpZHRoID0gRm9ybUl0ZW1XaWR0aC5NZWRpdW07XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHRhZ3NJbnB1dCQhOiBPYnNlcnZhYmxlPFRhZ3NJbnB1dENvbXBvbmVudD47XG5cbiAgLy8g6Jma5ouf5py65pu05paw5pe25o6S6Zmk5o6J6Ieq6LqrXG4gIEBJbnB1dCgpXG4gIHNraXBPY2N1cGllZCA9IGZhbHNlO1xuXG4gIC8vIOebruWJjeWPjOagiOWbuuWumiBJUCDlj6rmlK/mjIEgSVB2NFxuICBASW5wdXQoKVxuICBlbmFibGVGaXhJcFY2Rm9yRHVhbCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGVycm9yczogVmFsaWRhdGlvbkVycm9ycztcbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIGVycm9ycyQhOiBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnM+O1xuXG4gIEBJbnB1dCgpIGVycm9yc01hcHBlcjogU3RyaW5nTWFwO1xuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgZXJyb3JzTWFwcGVyJCE6IE9ic2VydmFibGU8U3RyaW5nTWFwPjtcblxuICB1bmlxID0gdW5pcTtcbiAgb25WYWxpZGF0b3JDaGFuZ2U6ICgpID0+IHZvaWQ7XG5cbiAgZ2V0IGlzQ2FsaWNvKCkge1xuICAgIHJldHVybiB0aGlzLm5ldHdvcmtUeXBlID09PSBDbHVzdGVyTmV0d29ya1R5cGUuQ0FMSUNPO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lc3BhY2VSZXNvdXJjZSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmNsdXN0ZXIkLFxuICAgIHRoaXMubmFtZXNwYWNlJCxcbiAgXSkucGlwZShcbiAgICBmaWx0ZXIoKFtjbHVzdGVyLCBuYW1lc3BhY2VdKSA9PiAhIWNsdXN0ZXIgJiYgISFuYW1lc3BhY2UpLFxuICAgIHN3aXRjaE1hcCgoW2NsdXN0ZXIsIG5hbWVzcGFjZV0pID0+XG4gICAgICB0aGlzLms4c0FwaS5nZXRSZXNvdXJjZTxOYW1lc3BhY2U+KHtcbiAgICAgICAgdHlwZTogUkVTT1VSQ0VfVFlQRVMuTkFNRVNQQUNFLFxuICAgICAgICBjbHVzdGVyLFxuICAgICAgICBuYW1lOiBuYW1lc3BhY2UsXG4gICAgICB9KSxcbiAgICApLFxuICAgIHB1Ymxpc2hSZWYoKSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG5ldHdvcmtNb2RlJCA9IHRoaXMuY2x1c3RlciQucGlwZShcbiAgICBzd2l0Y2hNYXAoY2x1c3RlciA9PiB0aGlzLm5ldHdvcmtVdGlsU2VydmljZS5nZXROZXR3b3JrTW9kZSQoY2x1c3RlcikpLFxuICAgIHB1Ymxpc2hSZWYoKSxcbiAgKTtcblxuICByZWFkb25seSAkbmV0d29ya01vZGUgPSB0b1NpZ25hbCh0aGlzLm5ldHdvcmtNb2RlJCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdWJuZXREZXRhaWxzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY2x1c3RlciQsXG4gICAgdGhpcy5uZXR3b3JrVHlwZSQsXG4gICAgdGhpcy5zdWJuZXQkLFxuICBdKS5waXBlKFxuICAgIGZpbHRlcigoW2NsdXN0ZXIsIG5ldHdvcmtUeXBlXSkgPT4gISFjbHVzdGVyICYmICEhbmV0d29ya1R5cGUpLFxuICAgIHN3aXRjaE1hcCgoW2NsdXN0ZXIsIF9uZXR3b3JrVHlwZSwgc3VibmV0XSkgPT5cbiAgICAgIHN1Ym5ldFxuICAgICAgICA/IG9mKHtcbiAgICAgICAgICAgIGNsdXN0ZXIsXG4gICAgICAgICAgICBzdWJuZXRzOiBbc3VibmV0XSxcbiAgICAgICAgICAgIHN1Ym5ldCxcbiAgICAgICAgICAgIGdhdGV3YXk6IHN1Ym5ldC5zcGVjPy5nYXRld2F5LFxuICAgICAgICAgICAgZXhjbHVkZUlwczogc3VibmV0LnNwZWM/LmV4Y2x1ZGVJcHMsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiB0aGlzLmlzQ2FsaWNvXG4gICAgICAgICAgPyB0aGlzLms4c0FwaVxuICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VMaXN0PFN1Ym5ldD4oe1xuICAgICAgICAgICAgICAgIHR5cGU6IE5FVFdPUktfUkVTT1VSQ0VfVFlQRVMuU1VCTkVUX0tVQkVfT1ZOLFxuICAgICAgICAgICAgICAgIGNsdXN0ZXIsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChyZXMgPT4gcmVzLml0ZW1zKSxcbiAgICAgICAgICAgICAgICBza2lwRXJyb3IoW10gYXMgU3VibmV0W10pLFxuICAgICAgICAgICAgICAgIG1hcChzdWJuZXRzID0+ICh7XG4gICAgICAgICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgICAgICAgc3VibmV0cyxcbiAgICAgICAgICAgICAgICAgIHN1Ym5ldDogbnVsbCBhcyBTdWJuZXQsXG4gICAgICAgICAgICAgICAgICBnYXRld2F5OiAnJyxcbiAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVJcHM6IFtdLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIDogb2Yoe1xuICAgICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgICBzdWJuZXRzOiBbXSBhcyBTdWJuZXRbXSxcbiAgICAgICAgICAgICAgc3VibmV0OiBudWxsIGFzIFN1Ym5ldCxcbiAgICAgICAgICAgICAgZ2F0ZXdheTogJycsXG4gICAgICAgICAgICAgIGV4Y2x1ZGVJcHM6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgfSksXG4gICAgKSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN1Ym5ldEluZm8kID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5uZXR3b3JrTW9kZSQsXG4gICAgdGhpcy5uYW1lc3BhY2VSZXNvdXJjZSQucGlwZShmaWx0ZXIoQm9vbGVhbikpLFxuICAgIHRoaXMuc3VibmV0RGV0YWlscyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKFxuICAgICAgKFtcbiAgICAgICAgbmV0d29ya01vZGUsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgeyBjbHVzdGVyLCBzdWJuZXRzLCBzdWJuZXQsIGdhdGV3YXksIGV4Y2x1ZGVJcHMgfSxcbiAgICAgIF0pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgIHN1Ym5ldENpZHJzOiB0aGlzLmlzQ2FsaWNvXG4gICAgICAgICAgICA/IHRoaXMubmV0d29ya1V0aWxTZXJ2aWNlLmdldENhbGljb0NpZHJzKFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICBzdWJuZXRzLFxuICAgICAgICAgICAgICAgIG5ldHdvcmtNb2RlLFxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlRml4SXBWNkZvckR1YWwsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogYWRhcHRTdWJuZXRDaWRycyhcbiAgICAgICAgICAgICAgICBzdWJuZXQgPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgPyB0aGlzLms4c1V0aWwuZ2V0QW5ub3RhdGlvbihuYW1lc3BhY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2lkcicsXG4gICAgICAgICAgICAgICAgICAgICAgYmFzZURvbWFpbjogS1VCRV9PVk5fQU5OT1RBVElPTl9QUkVGSVgsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICA6IChzdWJuZXQuc3BlYz8uY2lkckJsb2NrID8/ICcnKSxcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXR3b3JrTW9kZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlRml4SXBWNkZvckR1YWwsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgc3VibmV0TmFtZTpcbiAgICAgICAgICAgIHN1Ym5ldCA9PSBudWxsXG4gICAgICAgICAgICAgID8gdGhpcy5pc0NhbGljb1xuICAgICAgICAgICAgICAgID8gdGhpcy5uZXR3b3JrVXRpbFNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldENhbGljb1N1Ym5ldE5hbWVzKG5hbWVzcGFjZSwgdGhpcy4kbmV0d29ya01vZGUoKSlcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywnKVxuICAgICAgICAgICAgICAgIDogdGhpcy5rOHNVdGlsLmdldEFubm90YXRpb24obmFtZXNwYWNlLCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsb2dpY2FsX3N3aXRjaCcsXG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW46IEtVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgOiB0aGlzLms4c1V0aWwuZ2V0TmFtZShzdWJuZXQpLFxuICAgICAgICAgIGdhdGV3YXksXG4gICAgICAgICAgZXhjbHVkZUlwczogZXhjbHVkZUlwcyB8fCAoW10gYXMgc3RyaW5nW10pLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICApLFxuICAgIHN3aXRjaE1hcChzdWJuZXRJbmZvID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5uZXR3b3JrVHlwZSA9PT0gQ2x1c3Rlck5ldHdvcmtUeXBlLktVQkVfT1ZOICYmXG4gICAgICAgICFzdWJuZXRJbmZvLmdhdGV3YXlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4oXG4gICAgICAgICAgc3VibmV0SW5mby5zdWJuZXROYW1lLnNwbGl0KCcsJykubWFwKHN1Ym5ldE5hbWUgPT5cbiAgICAgICAgICAgIHRoaXMuazhzQXBpXG4gICAgICAgICAgICAgIC5nZXRSZXNvdXJjZTxTdWJuZXQ+KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTixcbiAgICAgICAgICAgICAgICBjbHVzdGVyOiBzdWJuZXRJbmZvLmNsdXN0ZXIsXG4gICAgICAgICAgICAgICAgbmFtZTogc3VibmV0TmFtZSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLnBpcGUoc2tpcEVycm9yKG51bGwgYXMgU3VibmV0KSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIG1hcChsaXN0ID0+IGxpc3QuZmlsdGVyKEJvb2xlYW4pKSxcbiAgICAgICAgICBtYXAoc3VibmV0TGlzdCA9PlxuICAgICAgICAgICAgc3VibmV0TGlzdC5sZW5ndGhcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAuLi5zdWJuZXRJbmZvLFxuICAgICAgICAgICAgICAgICAgZ2F0ZXdheTogc3VibmV0TGlzdFxuICAgICAgICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4gaXRlbS5zcGVjPy5nYXRld2F5KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsJyksXG4gICAgICAgICAgICAgICAgICBleGNsdWRlSXBzOiB1bmlxKFxuICAgICAgICAgICAgICAgICAgICBzdWJuZXRMaXN0LmZsYXRNYXAoaXRlbSA9PiBpdGVtLnNwZWM/LmV4Y2x1ZGVJcHMpLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogc3VibmV0SW5mbyxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9mKHN1Ym5ldEluZm8pO1xuICAgIH0pLFxuICAgIHN3aXRjaE1hcChzdWJuZXRJbmZvID0+IHtcbiAgICAgIGlmIChzdWJuZXRJbmZvLnN1Ym5ldENpZHJzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gb2Yoc3VibmV0SW5mbyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGZhbGxiYWNrIHRvIGRlZmF1bHQgc3VibmV0XG4gICAgICByZXR1cm4gdGhpcy5rOHNBcGlcbiAgICAgICAgLmdldFJlc291cmNlPFN1Ym5ldD4oe1xuICAgICAgICAgIHR5cGU6IE5FVFdPUktfUkVTT1VSQ0VfVFlQRVMuU1VCTkVUX0tVQkVfT1ZOLFxuICAgICAgICAgIGNsdXN0ZXI6IHN1Ym5ldEluZm8uY2x1c3RlcixcbiAgICAgICAgICBuYW1lOiB0aGlzLmlzQ2FsaWNvXG4gICAgICAgICAgICA/IGBkZWZhdWx0LWlwJHtcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXR3b3JrTW9kZSgpID09PSAnZHVhbCcgPyAndjQnIDogdGhpcy4kbmV0d29ya01vZGUoKVxuICAgICAgICAgICAgICB9LWlwcG9vbGBcbiAgICAgICAgICAgIDogJ292bi1kZWZhdWx0JyxcbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKHN1Ym5ldCA9PiAoe1xuICAgICAgICAgICAgLi4uc3VibmV0SW5mbyxcbiAgICAgICAgICAgIHN1Ym5ldENpZHJzOiBhZGFwdFN1Ym5ldENpZHJzKFxuICAgICAgICAgICAgICBzdWJuZXQuc3BlYy5jaWRyQmxvY2ssXG4gICAgICAgICAgICAgIHRoaXMuJG5ldHdvcmtNb2RlKCksXG4gICAgICAgICAgICAgIHRoaXMuZW5hYmxlRml4SXBWNkZvckR1YWwsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3VibmV0TmFtZTogdGhpcy5rOHNVdGlsLmdldE5hbWUoc3VibmV0KSxcbiAgICAgICAgICAgIGdhdGV3YXk6IHN1Ym5ldC5zcGVjLmdhdGV3YXksXG4gICAgICAgICAgICBleGNsdWRlSXBzOiBzdWJuZXQuc3BlYy5leGNsdWRlSXBzLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgKTtcbiAgICB9KSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgcmVhZG9ubHkgJHN1Ym5ldEluZm8gPSB0b1NpZ25hbCh0aGlzLnN1Ym5ldEluZm8kKTtcblxuICBjaWRyJCA9IHRoaXMuc3VibmV0SW5mbyQucGlwZShcbiAgICBtYXAoc3VibmV0SW5mbyA9PiB1bmlxKHN1Ym5ldEluZm8/LnN1Ym5ldENpZHJzKS5qb2luKCfjgIEnKSksXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbm5lckVycm9yc01hcHBlciQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmNpZHIkLFxuICAgIHRoaXMudHJhbnNsYXRlLmxvY2FsZSQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbY2lkcl0pID0+ICh7XG4gICAgICBwYXR0ZXJuOiB0aGlzLnRyYW5zbGF0ZS5nZXQoJ2ZpeGVkX2lwX3BhdHRlcm5fdGlwcycsIHtcbiAgICAgICAgaXBNb2RlOiBbJ2R1YWwnLCAndjQnXS5pbmNsdWRlcyh0aGlzLiRuZXR3b3JrTW9kZSgpKSA/ICdJUHY0JyA6ICdJUHY2JyxcbiAgICAgIH0pLFxuICAgICAgb2NjdXBpZWQ6IHRoaXMudHJhbnNsYXRlLmdldCgnZml4ZWRfaXBfb2NjdXBpZWRfdGlwcycsIHtcbiAgICAgICAgY2lkcixcbiAgICAgIH0pLFxuICAgICAgb3V0X29mX3JhbmdlOiB0aGlzLnRyYW5zbGF0ZS5nZXQoJ2ZpeGVkX2lwX291dF9vZl9yYW5nZV90aXBzJywge1xuICAgICAgICBjaWRyLFxuICAgICAgfSksXG4gICAgfSkpLFxuICApO1xuXG4gIGNvbWJpbmVkRXJyb3JzTWFwcGVyJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW5uZXJFcnJvcnNNYXBwZXIkLFxuICAgIHRoaXMuZXJyb3JzTWFwcGVyJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbm5lckVycm9yc01hcHBlciwgZXJyb3JzTWFwcGVyXSkgPT4gKHtcbiAgICAgIC4uLmlubmVyRXJyb3JzTWFwcGVyLFxuICAgICAgLi4uZXJyb3JzTWFwcGVyLFxuICAgIH0pKSxcbiAgKTtcblxuICBpbnB1dEVycm9ycyQgPSB0aGlzLmVycm9ycyQucGlwZShcbiAgICB0YXAoZXJyb3JzID0+IHtcbiAgICAgIHRoaXMuc2V0RXJyb3JzKGVycm9ycyk7XG4gICAgICB0aGlzLmlwQWRkcmVzcz8uY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZT8uKCk7XG4gICAgfSksXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB1c2VkSXBzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY2x1c3RlciQsXG4gICAgdGhpcy5zdWJuZXRJbmZvJCxcbiAgICB0aGlzLm1vZGVsJC5waXBlKGZpcnN0KCkpLFxuICBdKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoW2NsdXN0ZXIsIHsgc3VibmV0TmFtZSwgZ2F0ZXdheSB9LCBpcF0pID0+XG4gICAgICB0aGlzLms4c0FwaVxuICAgICAgICAuZ2V0UmVzb3VyY2VMaXN0PFN1Ym5ldElwPih7XG4gICAgICAgICAgdHlwZTogTkVUV09SS19SRVNPVVJDRV9UWVBFUy5TVUJORVRfS1VCRV9PVk5fSVAsXG4gICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAgICAgbGFiZWxTZWxlY3RvcjogbWF0Y2hFeHByZXNzaW9uc1RvU3RyaW5nKFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogYCR7S1VCRV9PVk5fQU5OT1RBVElPTl9QUkVGSVh9L3N1Ym5ldGAsXG4gICAgICAgICAgICAgICAgb3BlcmF0b3I6ICdpbicsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiBzdWJuZXROYW1lLnNwbGl0KCcsJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAocmVzID0+IHJlcy5pdGVtcyksXG4gICAgICAgICAgc2tpcEVycm9yKFtdIGFzIFN1Ym5ldElwW10pLFxuICAgICAgICAgIG1hcChzdWJuZXRJcHMgPT5cbiAgICAgICAgICAgIHN1Ym5ldElwcy5yZWR1Y2U8c3RyaW5nW10+KCh1c2VkSXBzLCB7IHNwZWM6IHsgaXBBZGRyZXNzIH0gfSkgPT4ge1xuICAgICAgICAgICAgICBpcEFkZHJlc3Muc3BsaXQoJywnKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpcCAhPT0gaXRlbSkge1xuICAgICAgICAgICAgICAgICAgdXNlZElwcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB1c2VkSXBzO1xuICAgICAgICAgICAgfSwgZ2F0ZXdheS5zcGxpdCgnLCcpKSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgJHVzZWRJcHMgPSB0b1NpZ25hbCh0aGlzLnVzZWRJcHMkKTtcblxuICBpcEFkZHJlc3NTdWdnZXN0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLnN1Ym5ldEluZm8kLFxuICAgIHRoaXMudXNlZElwcyQsXG4gICAgdGhpcy5uZXR3b3JrTW9kZSQsXG4gICAgdGhpcy5tb2RlbCQsXG4gICAgdGhpcy50YWdzSW5wdXQkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAodGFnc0lucHV0ID0+XG4gICAgICAgIHRhZ3NJbnB1dFxuICAgICAgICAgID8gbWVyZ2UoXG4gICAgICAgICAgICAgIGZyb21FdmVudCh0YWdzSW5wdXQuaW5wdXRSZWYubmF0aXZlRWxlbWVudCwgJ2lucHV0JykucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoZXYgPT4gKGV2LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHRhZ3NJbnB1dC5pbnB1dENvbnRyb2wudmFsdWVDaGFuZ2VzIGFzIE9ic2VydmFibGU8c3RyaW5nPixcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6ICh0aGlzLm1vZGVsJCBhcyBPYnNlcnZhYmxlPHN0cmluZz4pLFxuICAgICAgKSxcbiAgICApLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3sgc3VibmV0Q2lkcnMgfSwgdXNlZElwcywgbmV0d29ya01vZGUsIGFkZGVkSXBzLCBpbnB1dFZhbHVlXSkgPT5cbiAgICAgIGdldElwQWRkcmVzc1N1Z2dlc3Rpb25zQnlDaWRycyhcbiAgICAgICAgc3VibmV0Q2lkcnMsXG4gICAgICAgIG5ldHdvcmtNb2RlLFxuICAgICAgICBbXG4gICAgICAgICAgLi4udXNlZElwcyxcbiAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShhZGRlZElwcykgPyBhZGRlZElwcyA6IFthZGRlZElwc10uZmlsdGVyKEJvb2xlYW4pKSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5wdXRWYWx1ZSxcbiAgICAgICAgdGhpcy5pc0NhbGljbyxcbiAgICAgICksXG4gICAgKSxcbiAgICBzdGFydFdpdGgoW10gYXMgc3RyaW5nW10pLFxuICAgIHNraXBFcnJvcihbXSBhcyBzdHJpbmdbXSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgazhzVXRpbDogSzhzVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNBcGk6IEs4c0FwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrVXRpbFNlcnZpY2U6IE5ldHdvcmtVdGlsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoY2RyKTtcbiAgfVxuXG4gIEBiaW5kXG4gIGlzUmVzZXJ2ZWRJcChpcDogc3RyaW5nLCBleGNsdWRlSXBzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IEJ1aWxkZXIgPSBnZXRBZGRyZXNzQnVpbGRlcih0aGlzLmFkYXB0SXBNb2RlKGlwKSk7XG4gICAgcmV0dXJuIGV4Y2x1ZGVJcHMuc29tZShleGNsdWRlSXAgPT4ge1xuICAgICAgaWYgKGV4Y2x1ZGVJcC5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSBleGNsdWRlSXA/LnNwbGl0KCcuLicpO1xuICAgICAgICBjb25zdCBfc3RhcnRBZGRyZXNzID0gbmV3IEJ1aWxkZXIoc3RhcnQpLmJpZ0ludGVnZXIoKTtcbiAgICAgICAgY29uc3QgX2VuZEFkZHJlc3MgPSBuZXcgQnVpbGRlcihlbmQpLmJpZ0ludGVnZXIoKTtcbiAgICAgICAgY29uc3QgX2lwID0gbmV3IEJ1aWxkZXIoaXApLmJpZ0ludGVnZXIoKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBfc3RhcnRBZGRyZXNzLmNvbXBhcmVUbyhfaXApIDw9IDAgJiYgX2lwLmNvbXBhcmVUbyhfZW5kQWRkcmVzcykgPD0gMFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV4Y2x1ZGVJcCA9PT0gaXA7XG4gICAgfSk7XG4gIH1cblxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSA9IGZuO1xuICB9XG5cbiAgQGJpbmRcbiAgdmFsaWRhdGUoY3RybDogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgY29uc3QgaXBBZGRyZXNzOiBzdHJpbmcgfCBzdHJpbmdbXSA9IGN0cmwudmFsdWU7XG4gICAgcmV0dXJuIGlwQWRkcmVzcyAmJiAhQXJyYXkuaXNBcnJheShpcEFkZHJlc3MpXG4gICAgICA/IHRoaXMudXNlZElwcyQucGlwZShcbiAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgIG1hcCgoKSA9PiB0aGlzLnNldEVycm9ycyh0aGlzLnZhbGlkYXRlRml4ZWRJcChpcEFkZHJlc3MpKSksXG4gICAgICAgIClcbiAgICAgIDogb2YodGhpcy5zZXRFcnJvcnMobnVsbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFcnJvcnMoZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzKSB7XG4gICAgY29uc3QgY29tYmluZWRFcnJvcnMgPSB0aGlzLm11bHRpcGxlXG4gICAgICA/IHsgLi4udGhpcy5lcnJvcnMsIC4uLmVycm9ycyB9IC8vIOWPr+iDveWtmOWcqOS8oOWFpeeahCBlcnJvcnNcbiAgICAgIDogZXJyb3JzO1xuICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWx1ZXMoY29tYmluZWRFcnJvcnMpLmxlbmd0aFxuICAgICAgPyBjb21iaW5lZEVycm9yc1xuICAgICAgOiBudWxsO1xuICAgIHRoaXMuaXBBZGRyZXNzPy5jb250cm9sLnNldEVycm9ycyh2YWxpZGF0aW9uRXJyb3JzKTtcbiAgICByZXR1cm4gdmFsaWRhdGlvbkVycm9ycztcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVGaXhlZElwKGlwQWRkcmVzczogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBzdWJuZXRDaWRycywgZ2F0ZXdheSB9ID0gdGhpcy4kc3VibmV0SW5mbygpO1xuXG4gICAgY29uc3QgaXBNb2RlID0gdGhpcy5hZGFwdElwTW9kZShpcEFkZHJlc3MpO1xuICAgIGNvbnN0IGlzSXBWNCA9IGlwTW9kZSA9PT0gSVBNb2RlLklQVjQ7XG5cbiAgICBjb25zdCBqdWRnZUNpZHJzID0gc3VibmV0Q2lkcnMuZmlsdGVyKGNpZHIgPT4ge1xuICAgICAgY29uc3QgaXNJcFY2ID0gY2lkci5pbmNsdWRlcygnOicpO1xuICAgICAgcmV0dXJuIGlzSXBWNCA/ICFpc0lwVjYgOiBpc0lwVjY7XG4gICAgfSk7XG5cbiAgICBpZiAoc3VibmV0Q2lkcnMubGVuZ3RoICYmICFqdWRnZUNpZHJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0dGVybjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gaW52YWxpZCBpcCBwYXR0ZXJuLCBub3QgYnJvYWRjYXN0IGlwLCBub3QgbmV0d29yayBpcFxuICAgIGlmIChcbiAgICAgICFpc0lwQWRkcmVzc1ZhbGlkKGlwQWRkcmVzcywgaXBNb2RlKSB8fFxuICAgICAganVkZ2VDaWRycy5zb21lKFxuICAgICAgICBjYWxpY29DaWRyID0+XG4gICAgICAgICAgaXNCcm9hZGNhc3RBZGRyKGlwQWRkcmVzcywgY2FsaWNvQ2lkciwgaXBNb2RlKSB8fFxuICAgICAgICAgIGlzTmV0d29ya0FkZHIoaXBBZGRyZXNzLCBjYWxpY29DaWRyLCBpcE1vZGUpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0dGVybjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHY0R2F0ZXdheTogc3RyaW5nO1xuICAgIGxldCB2NkdhdGV3YXk6IHN0cmluZztcblxuICAgIGlmIChnYXRld2F5KSB7XG4gICAgICBjb25zdCBnYXRld2F5UGFydHMgPSBnYXRld2F5LnNwbGl0KCcsJyk7XG4gICAgICB2NEdhdGV3YXkgPSBnYXRld2F5UGFydHNbMF07XG4gICAgICB2NkdhdGV3YXkgPSBnYXRld2F5UGFydHNbMV07XG4gICAgfVxuXG4gICAgY29uc3QgaXBHYXRld2F5ID0gaXNJcFY0ID8gdjRHYXRld2F5IDogdjZHYXRld2F5O1xuXG4gICAgaWYgKFxuICAgICAgLy8gaHR0cHM6Ly9qaXJhLmFsYXVkYS5jbi9icm93c2UvQUNQLTEyMTM2P2ZvY3VzZWRDb21tZW50SWQ9MjE1NDYwJnBhZ2U9Y29tLmF0bGFzc2lhbi5qaXJhLnBsdWdpbi5zeXN0ZW0uaXNzdWV0YWJwYW5lbHMlM0Fjb21tZW50LXRhYnBhbmVsI2NvbW1lbnQtMjE1NDYwXG4gICAgICAoaXBHYXRld2F5ICYmIGlwQWRkcmVzc0VxdWFsKGlwR2F0ZXdheSwgaXBBZGRyZXNzLCBpcE1vZGUpKSB8fFxuICAgICAgKCF0aGlzLnNraXBPY2N1cGllZCAmJlxuICAgICAgICB0aGlzLiR1c2VkSXBzKCkuc29tZSh1c2VkSXAgPT5cbiAgICAgICAgICBpcEFkZHJlc3NFcXVhbCh1c2VkSXAsIGlwQWRkcmVzcywgaXBNb2RlKSxcbiAgICAgICAgKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9jY3VwaWVkOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBqdWRnZUNpZHJzLmxlbmd0aCAmJlxuICAgICAgIWp1ZGdlQ2lkcnMuc29tZShjaWRyID0+IGNpZHIgJiYgaXNCZWxvbmdDaWRyKGNpZHIsIGlwQWRkcmVzcywgaXBNb2RlKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG91dF9vZl9yYW5nZTogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGFwdElwTW9kZShpcEFkZHJlc3M6IHN0cmluZykge1xuICAgIHJldHVybiBhZGFwdElwTW9kZShcbiAgICAgIGlwQWRkcmVzcyxcbiAgICAgICF0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsICYmIHRoaXMuJG5ldHdvcmtNb2RlKCkgPT09IE5ldHdvcmtNb2RlLkRVQUxcbiAgICAgICAgPyBOZXR3b3JrTW9kZS5JUFY0XG4gICAgICAgIDogdGhpcy4kbmV0d29ya01vZGUoKSxcbiAgICApO1xuICB9XG59XG4iLCI8YXVpLWZvcm0taXRlbSBbd2lkdGhdPVwiZm9ybUl0ZW1XaWR0aFwiPlxuICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57e1xuICAgIGxhYmVsIHx8ICgnbmV0d29yay5pcF9hZGRyZXNzJyB8IHRyYW5zbGF0ZSlcbiAgfX08L2xhYmVsPlxuICA8aW5wdXRcbiAgICAqbmdJZj1cIiFtdWx0aXBsZVwiXG4gICAgYXVpLWlucHV0XG4gICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgW25nTW9kZWxdPVwibW9kZWxcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cImVtaXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAjaXBBZGRyZXNzPVwibmdNb2RlbFwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyIHx8ICgnZGhjcF9wbGFjZWhvbGRlcicgfCB0cmFuc2xhdGUpXCJcbiAgICBbYXVpQXV0b2NvbXBsZXRlXT1cInN1Z2dlc3Rpb25zXCJcbiAgLz5cbiAgPGF1aS10YWdzLWlucHV0XG4gICAgKm5nSWY9XCJtdWx0aXBsZVwiXG4gICAgY2xhc3M9XCJmbGV4LTFcIlxuICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICN0YWdzSW5wdXRcbiAgICBbbmdNb2RlbF09XCJtb2RlbFwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwiZW1pdFZhbHVlKHVuaXEoJGV2ZW50KSlcIlxuICAgICNpcEFkZHJlc3M9XCJuZ01vZGVsXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfHwgKCdkaGNwX3BsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZSlcIlxuICAgIFthdWlBdXRvY29tcGxldGVdPVwic3VnZ2VzdGlvbnNcIlxuICAgIFtpbnB1dEFzeW5jVmFsaWRhdG9yXT1cInZhbGlkYXRlXCJcbiAgPjwvYXVpLXRhZ3MtaW5wdXQ+XG4gIDxhdWktYXV0b2NvbXBsZXRlICNzdWdnZXN0aW9ucz5cbiAgICA8YXVpLXN1Z2dlc3Rpb25cbiAgICAgICpuZ0Zvcj1cImxldCBpcEFkZHJlc3NTdWdnZXN0aW9uIG9mIGlwQWRkcmVzc1N1Z2dlc3Rpb25zJCB8IGFzeW5jXCJcbiAgICAgIFt2YWx1ZV09XCJpcEFkZHJlc3NTdWdnZXN0aW9uXCJcbiAgICA+XG4gICAgICB7eyBpcEFkZHJlc3NTdWdnZXN0aW9uIH19XG4gICAgICA8YXVpLXRhZ1xuICAgICAgICAqbmdJZj1cImlwQWRkcmVzc1N1Z2dlc3Rpb24gfCBwdXJlOiBpc1Jlc2VydmVkSXA6ICRzdWJuZXRJbmZvKCkuZXhjbHVkZUlwc1wiXG4gICAgICAgIFtib3JkZXJdPVwidHJ1ZVwiXG4gICAgICAgIFtzaXplXT1cIidtaW5pJ1wiXG4gICAgICAgIHR5cGU9XCJpbmZvXCJcbiAgICAgID5cbiAgICAgICAge3sgJ25ldHdvcmsucmVzZXJ2ZWRfaXAnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2F1aS10YWc+XG4gICAgPC9hdWktc3VnZ2VzdGlvbj5cbiAgICA8YXVpLWF1dG9jb21wbGV0ZS1wbGFjZWhvbGRlcj5cbiAgICAgIHt7XG4gICAgICAgICgoaXBBZGRyZXNzU3VnZ2VzdGlvbnMkIHwgYXN5bmMpXG4gICAgICAgICAgPyAnbmV0d29yay5ub19hdmFpbGFibGVfc3VnZ2VzdGlvbidcbiAgICAgICAgICA6ICdsb2FkaW5nJ1xuICAgICAgICApIHwgdHJhbnNsYXRlXG4gICAgICB9fVxuICAgIDwvYXVpLWF1dG9jb21wbGV0ZS1wbGFjZWhvbGRlcj5cbiAgPC9hdWktYXV0b2NvbXBsZXRlPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJhZGRvblRpcCAhPSBudWxsXCJcbiAgICBhdWlGb3JtSXRlbUFkZG9uXG4gID5cbiAgICA8YXVpLWljb25cbiAgICAgICpuZ0lmPVwiYWRkb25UaXBcIlxuICAgICAgaWNvbj1cInF1ZXN0aW9uX2NpcmNsZVwiXG4gICAgICBjbGFzcz1cImljb24tLWhlbHBcIlxuICAgICAgW2F1aVRvb2x0aXBdPVwiYWRkb25UaXBcIlxuICAgICAgYXVpVG9vbHRpcFBvc2l0aW9uPVwiZW5kXCJcbiAgICA+PC9hdWktaWNvbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgIGF1aUZvcm1JdGVtRXJyb3JcbiAgICBbZXJyb3JzXT1cIlxuICAgICAgaXBBZGRyZXNzPy5lcnJvcnM/LmlucHV0X2RhdGFfZXJyb3IgfHxcbiAgICAgIGlwQWRkcmVzcz8uZXJyb3JzIHx8XG4gICAgICAoaW5wdXRFcnJvcnMkIHwgYXN5bmMpXG4gICAgXCJcbiAgICBbZXJyb3JzTWFwcGVyXT1cImNvbWJpbmVkRXJyb3JzTWFwcGVyJCB8IGFzeW5jXCJcbiAgPjwvYWNsLWVycm9ycy1tYXBwZXI+XG4gIDxkaXZcbiAgICBhdWlGb3JtSXRlbUhpbnRcbiAgICAqbmdJZj1cImhpbnQgIT09IG51bGwgJiYgKGhpbnQgfHwgKGNpZHIkIHwgYXN5bmMpKVwiXG4gID5cbiAgICB7e1xuICAgICAgaGludCB8fFxuICAgICAgICAoJ25ldHdvcmsuZml4X2lwX3Nob3VsZF9iZWxvbmdfdGlwJ1xuICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IGNpZHI6IChjaWRyJCB8IGFzeW5jKSB9KVxuICAgIH19XG4gIDwvZGl2PlxuPC9hdWktZm9ybS1pdGVtPlxuIl19