ng-configcat-publicapi-ui 4.2.2 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/fesm2022/ng-configcat-publicapi-ui.mjs +4240 -3534
- package/fesm2022/ng-configcat-publicapi-ui.mjs.map +1 -1
- package/index.d.ts +476 -3
- package/package.json +11 -10
- package/src/css/button.scss +83 -0
- package/src/css/controls.scss +390 -0
- package/src/css/dialog.scss +63 -0
- package/src/css/icon.scss +7 -0
- package/src/css/slider.scss +82 -0
- package/src/css/snackbar.scss +16 -0
- package/src/css/table.scss +142 -0
- package/src/css/theme.scss +47 -0
- package/src/css/tooltip.scss +12 -0
- package/src/css/variables.scss +324 -0
- package/src/css/vars/auth.scss +24 -0
- package/src/css/vars/banner.scss +116 -0
- package/src/css/vars/box.scss +48 -0
- package/src/css/vars/config-overview.scss +27 -0
- package/src/css/vars/flag.scss +146 -0
- package/src/css/vars/header.scss +24 -0
- package/src/css/vars/icon.scss +33 -0
- package/src/css/vars/logo.scss +19 -0
- package/src/css/vars/notification.scss +38 -0
- package/src/css/vars/overview.scss +51 -0
- package/src/css/vars/prism.scss +44 -0
- package/src/css/vars/sidenav.scss +42 -0
- package/src/css/vars/theme.scss +78 -0
- package/src/public-api.scss +208 -0
- package/esm2022/lib/_directives/index.mjs +0 -2
- package/esm2022/lib/_directives/input-display-normalizer.directive.mjs +0 -38
- package/esm2022/lib/_models/deleteSettingModel.mjs +0 -2
- package/esm2022/lib/_models/flag-state.mjs +0 -2
- package/esm2022/lib/_models/index.mjs +0 -4
- package/esm2022/lib/_models/setting-value-formgroup.mjs +0 -2
- package/esm2022/lib/_models/settingValuesModel.mjs +0 -2
- package/esm2022/lib/_models/updateSettingValuesModel.mjs +0 -2
- package/esm2022/lib/_models/user-comparator.mjs +0 -100
- package/esm2022/lib/_services/app-data-adapter.mjs +0 -18
- package/esm2022/lib/_services/comparison-value-list-helper.mjs +0 -72
- package/esm2022/lib/_services/date-helper.mjs +0 -56
- package/esm2022/lib/_services/form-generator.mjs +0 -359
- package/esm2022/lib/_services/form-helper.mjs +0 -163
- package/esm2022/lib/_services/index.mjs +0 -3
- package/esm2022/lib/_services/messaging.service.mjs +0 -26
- package/esm2022/lib/_services/platform-helper.mjs +0 -7
- package/esm2022/lib/_services/public-api.service.mjs +0 -77
- package/esm2022/lib/_services/setting-list-form-helper.mjs +0 -171
- package/esm2022/lib/_services/tracking.directive.mjs +0 -16
- package/esm2022/lib/ace-editor/ace-editor.component.mjs +0 -137
- package/esm2022/lib/authorization/authorization.component.mjs +0 -62
- package/esm2022/lib/base/base-select.component.mjs +0 -27
- package/esm2022/lib/base/base.component.mjs +0 -48
- package/esm2022/lib/bootstrap.mjs +0 -11
- package/esm2022/lib/configuration.mjs +0 -14
- package/esm2022/lib/dialogs/confirmation-dialog/confirmation-dialog.mjs +0 -28
- package/esm2022/lib/dialogs/delete-setting-dialog/delete-setting-dialog.component.mjs +0 -27
- package/esm2022/lib/dialogs/expand-dialog/expand-dialog.component.mjs +0 -80
- package/esm2022/lib/dialogs/info-dialog/info-dialog.mjs +0 -29
- package/esm2022/lib/dialogs/reason-dialog/reason-dialog.component.mjs +0 -36
- package/esm2022/lib/dialogs/reroute-dialog/reroute-dialog.mjs +0 -28
- package/esm2022/lib/dialogs/save-snackbar/save-snackbar.component.mjs +0 -14
- package/esm2022/lib/ng-configcat-publicapi-ui.module.mjs +0 -288
- package/esm2022/lib/selects/config-select/config-select.component.mjs +0 -60
- package/esm2022/lib/selects/environment-select/environment-select.component.mjs +0 -47
- package/esm2022/lib/selects/product-select/product-select.component.mjs +0 -40
- package/esm2022/lib/selects/setting-select/setting-select.component.mjs +0 -47
- package/esm2022/lib/setting-item/setting-item.component.mjs +0 -118
- package/esm2022/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.mjs +0 -81
- package/esm2022/lib/setting-list/setting/rollout-rules/rollout-rules.component.mjs +0 -293
- package/esm2022/lib/setting-list/setting/setting.component.mjs +0 -136
- package/esm2022/lib/setting-list/setting/value/value.component.mjs +0 -37
- package/esm2022/lib/setting-list/setting-list.component.mjs +0 -194
- package/esm2022/lib/v2/feature-flag/date-time-picker/date-time-picker.component.mjs +0 -123
- package/esm2022/lib/v2/feature-flag/dependees-dialog/dependees-dialog.component.mjs +0 -30
- package/esm2022/lib/v2/feature-flag/evaluation-formula/evaluation-formula.component.mjs +0 -220
- package/esm2022/lib/v2/feature-flag/evaluation-formula/feature-flag-value/feature-flag-value.component.mjs +0 -61
- package/esm2022/lib/v2/feature-flag/evaluation-formula/popout-text-editor-dialog/popout-text-editor-dialog.component.mjs +0 -72
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/condition-chip/condition-chip.component.mjs +0 -25
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/conditions.component.mjs +0 -105
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.mjs +0 -75
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.mjs +0 -48
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.mjs +0 -113
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/popout-list-editor-dialog/popout-list-editor-dialog.component.mjs +0 -251
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.mjs +0 -444
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.mjs +0 -84
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/targeting-rule.component.mjs +0 -129
- package/esm2022/lib/v2/feature-flag/feature-flag.component.mjs +0 -190
- package/esm2022/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.mjs +0 -65
- package/esm2022/lib/v2/feature-flag-item.component.mjs +0 -330
- package/esm2022/ng-configcat-publicapi-ui.mjs +0 -5
- package/esm2022/public-api.mjs +0 -15
- package/lib/_directives/index.d.ts +0 -1
- package/lib/_directives/input-display-normalizer.directive.d.ts +0 -13
- package/lib/_models/deleteSettingModel.d.ts +0 -6
- package/lib/_models/flag-state.d.ts +0 -20
- package/lib/_models/index.d.ts +0 -3
- package/lib/_models/setting-value-formgroup.d.ts +0 -69
- package/lib/_models/settingValuesModel.d.ts +0 -11
- package/lib/_models/updateSettingValuesModel.d.ts +0 -7
- package/lib/_models/user-comparator.d.ts +0 -84
- package/lib/_services/app-data-adapter.d.ts +0 -7
- package/lib/_services/comparison-value-list-helper.d.ts +0 -17
- package/lib/_services/date-helper.d.ts +0 -6
- package/lib/_services/form-generator.d.ts +0 -59
- package/lib/_services/form-helper.d.ts +0 -21
- package/lib/_services/index.d.ts +0 -2
- package/lib/_services/messaging.service.d.ts +0 -12
- package/lib/_services/platform-helper.d.ts +0 -3
- package/lib/_services/public-api.service.d.ts +0 -21
- package/lib/_services/setting-list-form-helper.d.ts +0 -19
- package/lib/_services/tracking.directive.d.ts +0 -6
- package/lib/ace-editor/ace-editor.component.d.ts +0 -32
- package/lib/authorization/authorization.component.d.ts +0 -21
- package/lib/base/base-select.component.d.ts +0 -10
- package/lib/base/base.component.d.ts +0 -18
- package/lib/bootstrap.d.ts +0 -13
- package/lib/configuration.d.ts +0 -9
- package/lib/dialogs/confirmation-dialog/confirmation-dialog.d.ts +0 -19
- package/lib/dialogs/delete-setting-dialog/delete-setting-dialog.component.d.ts +0 -17
- package/lib/dialogs/expand-dialog/expand-dialog.component.d.ts +0 -25
- package/lib/dialogs/info-dialog/info-dialog.d.ts +0 -17
- package/lib/dialogs/reason-dialog/reason-dialog.component.d.ts +0 -15
- package/lib/dialogs/reroute-dialog/reroute-dialog.d.ts +0 -20
- package/lib/dialogs/save-snackbar/save-snackbar.component.d.ts +0 -8
- package/lib/ng-configcat-publicapi-ui.module.d.ts +0 -75
- package/lib/selects/config-select/config-select.component.d.ts +0 -17
- package/lib/selects/environment-select/environment-select.component.d.ts +0 -17
- package/lib/selects/product-select/product-select.component.d.ts +0 -14
- package/lib/selects/setting-select/setting-select.component.d.ts +0 -17
- package/lib/setting-item/setting-item.component.d.ts +0 -37
- package/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.d.ts +0 -27
- package/lib/setting-list/setting/rollout-rules/rollout-rules.component.d.ts +0 -61
- package/lib/setting-list/setting/setting.component.d.ts +0 -43
- package/lib/setting-list/setting/value/value.component.d.ts +0 -20
- package/lib/setting-list/setting-list.component.d.ts +0 -53
- package/lib/v2/feature-flag/date-time-picker/date-time-picker.component.d.ts +0 -25
- package/lib/v2/feature-flag/dependees-dialog/dependees-dialog.component.d.ts +0 -27
- package/lib/v2/feature-flag/evaluation-formula/evaluation-formula.component.d.ts +0 -41
- package/lib/v2/feature-flag/evaluation-formula/feature-flag-value/feature-flag-value.component.d.ts +0 -18
- package/lib/v2/feature-flag/evaluation-formula/popout-text-editor-dialog/popout-text-editor-dialog.component.d.ts +0 -30
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/condition-chip/condition-chip.component.d.ts +0 -10
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/conditions.component.d.ts +0 -27
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.d.ts +0 -36
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.d.ts +0 -21
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.d.ts +0 -79
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/popout-list-editor-dialog/popout-list-editor-dialog.component.d.ts +0 -63
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.d.ts +0 -94
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.d.ts +0 -31
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/targeting-rule.component.d.ts +0 -33
- package/lib/v2/feature-flag/feature-flag.component.d.ts +0 -49
- package/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.d.ts +0 -28
- package/lib/v2/feature-flag-item.component.d.ts +0 -66
- package/public-api.d.ts +0 -11
- package/public-api.scss +0 -350
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
import { Injectable } from "@angular/core";
|
|
2
|
-
import { FormArray, FormControl, FormGroup, Validators } from "@angular/forms";
|
|
3
|
-
import { UserComparator, UserComparatorType, SettingType, PrerequisiteComparator } from "../bootstrap";
|
|
4
|
-
import { valid } from 'semver';
|
|
5
|
-
import { percentageRegex, wholeNumberRegex } from "../_services/form-helper";
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class FormGenerator {
|
|
8
|
-
generateSettingValuesFormGroup(model, readOnly, settings, featureFlagLimitations) {
|
|
9
|
-
return new FormGroup({
|
|
10
|
-
defaultValue: this.generateValueFormGroup(model.defaultValue, model.setting.settingType, readOnly, featureFlagLimitations),
|
|
11
|
-
percentageEvaluationAttribute: this.generatePercentageEvaluationAttributeFormControl(model.percentageEvaluationAttribute, readOnly),
|
|
12
|
-
targetingRules: new FormArray(model.targetingRules.map(ft => this.generateTargetingRuleFormGroup(ft, model.setting.settingType, readOnly, settings, featureFlagLimitations)))
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
generatePercentageEvaluationAttributeFormControl(percentageEvaluationAttribute, readOnly) {
|
|
16
|
-
return new FormControl({ value: percentageEvaluationAttribute, disabled: readOnly }, { validators: [this.validateEmptyString, Validators.maxLength(1000)] });
|
|
17
|
-
}
|
|
18
|
-
generateTargetingRuleFormGroup(model, settingType, readOnly, settings, featureFlagLimitations) {
|
|
19
|
-
const conditions = new FormArray(model.conditions.map(tr => this.generateConditionFormGroup(tr, readOnly, settings, featureFlagLimitations)));
|
|
20
|
-
if (model.percentageOptions?.length > 0) {
|
|
21
|
-
return new FormGroup({
|
|
22
|
-
conditions,
|
|
23
|
-
percentageOptions: new FormArray(model.percentageOptions.map(pr => this.generatePercentageOptionFormGroup(pr, settingType, readOnly, featureFlagLimitations)), [this.validatePercentageSum])
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
else if (model.value) {
|
|
27
|
-
return new FormGroup({
|
|
28
|
-
conditions,
|
|
29
|
-
value: this.generateValueFormGroup(model.value, settingType, readOnly, featureFlagLimitations)
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
throw Error("Invalid model");
|
|
33
|
-
}
|
|
34
|
-
generateTargetingRuleWithEmptyPercentageOptions(settingType, readOnly, settings, featureFlagLimitations) {
|
|
35
|
-
return this.generateTargetingRuleFormGroup({
|
|
36
|
-
conditions: [],
|
|
37
|
-
percentageOptions: this.getEmptyPercentageOptions(settingType)
|
|
38
|
-
}, settingType, readOnly, settings, featureFlagLimitations);
|
|
39
|
-
}
|
|
40
|
-
getEmptyPercentageOptions(settingType) {
|
|
41
|
-
switch (settingType) {
|
|
42
|
-
case SettingType.Boolean:
|
|
43
|
-
return [
|
|
44
|
-
{ percentage: 50, value: { boolValue: true } },
|
|
45
|
-
{ percentage: 50, value: { boolValue: false } }
|
|
46
|
-
];
|
|
47
|
-
case SettingType.String:
|
|
48
|
-
case SettingType.Int:
|
|
49
|
-
case SettingType.Double:
|
|
50
|
-
return [
|
|
51
|
-
{ percentage: 50, value: {} },
|
|
52
|
-
{ percentage: 50, value: {} },
|
|
53
|
-
];
|
|
54
|
-
default:
|
|
55
|
-
throw new Error('Invalid SettingType');
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
generatePercentageOptionFormGroup(model, settingType, readOnly, featureFlagLimitations) {
|
|
59
|
-
return new FormGroup({
|
|
60
|
-
percentage: new FormControl({ value: model.percentage, disabled: readOnly }, { nonNullable: true, validators: [this.validateNumberNan, Validators.required, Validators.min(0), Validators.max(100), Validators.pattern(percentageRegex)] }),
|
|
61
|
-
value: this.generateValueFormGroup(model.value, settingType, readOnly || settingType === SettingType.Boolean, featureFlagLimitations),
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
generateConditionFormGroup(model, readOnly, settings, featureFlagLimitations) {
|
|
65
|
-
if (model.userCondition) {
|
|
66
|
-
return new FormGroup({
|
|
67
|
-
userCondition: this.generateUserConditionFormGroup(model.userCondition, readOnly, featureFlagLimitations)
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
else if (model.segmentCondition) {
|
|
71
|
-
return new FormGroup({
|
|
72
|
-
segmentCondition: this.generateSegmentConditionFormGroup(model.segmentCondition, readOnly)
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
else if (model.prerequisiteFlagCondition) {
|
|
76
|
-
return new FormGroup({
|
|
77
|
-
prerequisiteFlagCondition: this.generatePrerequisiteFlagConditionFormGroup(model.prerequisiteFlagCondition, readOnly, settings, featureFlagLimitations)
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
throw new Error('');
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
generateUserConditionFormGroup(value, readOnly, featureFlagLimitations) {
|
|
85
|
-
return new FormGroup({
|
|
86
|
-
comparisonAttribute: new FormControl({ value: value.comparisonAttribute, disabled: readOnly }, { nonNullable: true, validators: [Validators.required, Validators.maxLength(1000)] }),
|
|
87
|
-
comparator: new FormControl({ value: value.comparator, disabled: readOnly }, { nonNullable: true, validators: [Validators.required] }),
|
|
88
|
-
comparisonValue: this.generateComparisonValueFormGroup(value.comparisonValue, value.comparator, readOnly, featureFlagLimitations)
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
generateSegmentConditionFormGroup(value, readOnly) {
|
|
92
|
-
return new FormGroup({
|
|
93
|
-
segmentId: new FormControl({ value: value.segmentId, disabled: readOnly }, { nonNullable: true, validators: [Validators.required] }),
|
|
94
|
-
comparator: new FormControl({ value: value.comparator, disabled: readOnly }, { nonNullable: true, validators: [Validators.required] }),
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
generatePrerequisiteFlagConditionFormGroup(value, readOnly, settings, featureFlagLimitations) {
|
|
98
|
-
const setting = settings.filter(s => s.settingId == value.prerequisiteSettingId)[0];
|
|
99
|
-
if (!setting) {
|
|
100
|
-
throw new Error('Could not find prerequisite setting');
|
|
101
|
-
}
|
|
102
|
-
if (setting.settingType === SettingType.Boolean) {
|
|
103
|
-
// In case of a boolean prerequisite setting, we are enforcing a 'True' prerequisiteComparisonValue
|
|
104
|
-
// so we can simplify the UI with a simple 'Is true' or 'Is false' select.
|
|
105
|
-
// 'Is true' = PrerequisiteComparator.Equals TRUE
|
|
106
|
-
// 'Is false' = PrerequisiteComparator.DoesNotEqual TRUE
|
|
107
|
-
let comparator = value.comparator;
|
|
108
|
-
if (!value.prerequisiteComparisonValue) {
|
|
109
|
-
// If the prerequisiteComparisonValue is false somehow (e.g. Public Management API), we should negate the comparator.
|
|
110
|
-
comparator = comparator === PrerequisiteComparator.Equals ? PrerequisiteComparator.DoesNotEqual : PrerequisiteComparator.Equals;
|
|
111
|
-
}
|
|
112
|
-
return new FormGroup({
|
|
113
|
-
prerequisiteSettingId: new FormControl({ value: value.prerequisiteSettingId, disabled: readOnly }, { nonNullable: true, validators: [Validators.required] }),
|
|
114
|
-
comparator: new FormControl({ value: comparator, disabled: readOnly }, { nonNullable: true, validators: [Validators.required] }),
|
|
115
|
-
prerequisiteComparisonValue: this.generateValueFormGroup({ boolValue: true }, setting.settingType, readOnly, featureFlagLimitations)
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
return new FormGroup({
|
|
120
|
-
prerequisiteSettingId: new FormControl({ value: value.prerequisiteSettingId, disabled: readOnly }, { nonNullable: true, validators: [Validators.required] }),
|
|
121
|
-
comparator: new FormControl({ value: value.comparator, disabled: readOnly }, { nonNullable: true, validators: [Validators.required] }),
|
|
122
|
-
prerequisiteComparisonValue: this.generateValueFormGroup(value.prerequisiteComparisonValue, setting.settingType, readOnly, featureFlagLimitations)
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
generateEmptyPrerequisiteFlagConditionFormGroup(featureFlagLimitations) {
|
|
127
|
-
return new FormGroup({
|
|
128
|
-
prerequisiteSettingId: new FormControl(null, { nonNullable: true, validators: [Validators.required] }),
|
|
129
|
-
comparator: new FormControl(PrerequisiteComparator.Equals, { nonNullable: true, validators: [Validators.required] }),
|
|
130
|
-
prerequisiteComparisonValue: this.generateValueFormGroup({ boolValue: true }, SettingType.Boolean, false, featureFlagLimitations)
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
getNextIndex(formArray) {
|
|
134
|
-
if (formArray.controls.length === 0) {
|
|
135
|
-
return 0;
|
|
136
|
-
}
|
|
137
|
-
return Math.max(...formArray.controls.map(c => c.controls.index.value)) + 1;
|
|
138
|
-
}
|
|
139
|
-
generateComparisonValueListFormGroup(listValue, readOnly, validators, index) {
|
|
140
|
-
return new FormGroup({
|
|
141
|
-
value: new FormControl({ value: listValue.value, disabled: readOnly }, { nonNullable: true, validators }),
|
|
142
|
-
hint: new FormControl({ value: listValue.hint, disabled: readOnly }, [Validators.maxLength(1500)]),
|
|
143
|
-
// The index column is generated on the first generation by default or by the getNextIndex() if a value is added to the listvalue. It is required so we can delete the rows on the poput editor.
|
|
144
|
-
index: new FormControl({ value: index, disabled: true })
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
generateComparisonValueFormGroup(value, comparator, readOnly, featureFlagLimitations) {
|
|
148
|
-
switch (this.getComparisonValueType(comparator)) {
|
|
149
|
-
case UserComparatorType.String:
|
|
150
|
-
return new FormGroup({
|
|
151
|
-
stringValue: new FormControl({ value: value.stringValue, disabled: readOnly }, { nonNullable: true, validators: this.getComparisonValueStringValidators(featureFlagLimitations) })
|
|
152
|
-
});
|
|
153
|
-
case UserComparatorType.StringList:
|
|
154
|
-
return new FormGroup({
|
|
155
|
-
listValue: this.generateComparisonValueListValueArray(value.listValue, readOnly, featureFlagLimitations, this.getComparisonValueStringListItemValidators(featureFlagLimitations))
|
|
156
|
-
});
|
|
157
|
-
case UserComparatorType.Number:
|
|
158
|
-
return new FormGroup({
|
|
159
|
-
doubleValue: new FormControl({ value: value.doubleValue, disabled: readOnly },
|
|
160
|
-
// eslint-disable-next-line @typescript-eslint/no-loss-of-precision
|
|
161
|
-
{ nonNullable: true, validators: [this.validateNumberNan, Validators.required, Validators.min(-1.79769313486232E+308), Validators.max(1.79769313486232E+308)] })
|
|
162
|
-
});
|
|
163
|
-
case UserComparatorType.Semver:
|
|
164
|
-
return new FormGroup({
|
|
165
|
-
stringValue: new FormControl({ value: value.stringValue, disabled: readOnly }, { nonNullable: true, validators: this.getComparisonValueSemverValidators(featureFlagLimitations) })
|
|
166
|
-
});
|
|
167
|
-
case UserComparatorType.SemverList:
|
|
168
|
-
return new FormGroup({
|
|
169
|
-
listValue: this.generateComparisonValueListValueArray(value.listValue, readOnly, featureFlagLimitations, this.getComparisonValueSemverListItemValidators(featureFlagLimitations))
|
|
170
|
-
});
|
|
171
|
-
case UserComparatorType.DateTime:
|
|
172
|
-
return new FormGroup({
|
|
173
|
-
doubleValue: new FormControl({ value: value.doubleValue, disabled: readOnly }, { nonNullable: true, validators: [Validators.required] })
|
|
174
|
-
});
|
|
175
|
-
default: throw new Error('Invalid comparator');
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
generateComparisonValueListValueArray(listValue, readOnly, featureFlagLimitations, itemValidators) {
|
|
179
|
-
return new FormArray((listValue ?? []).map((lv, index) => { return this.generateComparisonValueListFormGroup(lv, readOnly, itemValidators, index); }), [Validators.required, Validators.minLength(1), Validators.maxLength(featureFlagLimitations.maxComparisonValueListLength)]);
|
|
180
|
-
}
|
|
181
|
-
getComparisonValueStringValidators(featureFlagLimitations) {
|
|
182
|
-
return [Validators.required, Validators.maxLength(featureFlagLimitations.maxComparisonValueLength)];
|
|
183
|
-
}
|
|
184
|
-
getComparisonValueStringListItemValidators(featureFlagLimitations) {
|
|
185
|
-
return [Validators.required, Validators.maxLength(featureFlagLimitations.maxComparisonValueListItemLength)];
|
|
186
|
-
}
|
|
187
|
-
getComparisonValueSemverValidators(featureFlagLimitations) {
|
|
188
|
-
return [Validators.required, Validators.maxLength(featureFlagLimitations.maxComparisonValueLength), this.validateSemVer];
|
|
189
|
-
}
|
|
190
|
-
getComparisonValueSemverListItemValidators(featureFlagLimitations) {
|
|
191
|
-
return [Validators.required, Validators.maxLength(featureFlagLimitations.maxComparisonValueListItemLength), this.validateSemVer];
|
|
192
|
-
}
|
|
193
|
-
generateDefaultValue(settingType) {
|
|
194
|
-
switch (settingType) {
|
|
195
|
-
case SettingType.Boolean:
|
|
196
|
-
return { boolValue: false };
|
|
197
|
-
case SettingType.String:
|
|
198
|
-
case SettingType.Int:
|
|
199
|
-
case SettingType.Double:
|
|
200
|
-
return {};
|
|
201
|
-
default:
|
|
202
|
-
throw new Error('Invalid SettingType');
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
generateDefaultValueFormGroup(settingType, readOnly, featureFlagLimitations) {
|
|
206
|
-
return this.generateValueFormGroup(this.generateDefaultValue(settingType), settingType, readOnly, featureFlagLimitations);
|
|
207
|
-
}
|
|
208
|
-
generateValueFormGroup(value, settingType, readOnly, featureFlagLimitations) {
|
|
209
|
-
switch (settingType) {
|
|
210
|
-
case SettingType.Boolean:
|
|
211
|
-
return new FormGroup({
|
|
212
|
-
boolValue: new FormControl({ value: value.boolValue, disabled: readOnly }, { nonNullable: true, validators: this.getValidatorsForSettingType(settingType, featureFlagLimitations) })
|
|
213
|
-
});
|
|
214
|
-
case SettingType.String:
|
|
215
|
-
return new FormGroup({
|
|
216
|
-
stringValue: new FormControl({ value: value.stringValue, disabled: readOnly }, { nonNullable: true, validators: this.getValidatorsForSettingType(settingType, featureFlagLimitations) })
|
|
217
|
-
});
|
|
218
|
-
case SettingType.Int:
|
|
219
|
-
return new FormGroup({
|
|
220
|
-
intValue: new FormControl({ value: value.intValue, disabled: readOnly }, { nonNullable: true, validators: this.getValidatorsForSettingType(settingType, featureFlagLimitations) })
|
|
221
|
-
});
|
|
222
|
-
case SettingType.Double:
|
|
223
|
-
return new FormGroup({
|
|
224
|
-
doubleValue: new FormControl({ value: value.doubleValue, disabled: readOnly }, { nonNullable: true, validators: this.getValidatorsForSettingType(settingType, featureFlagLimitations) })
|
|
225
|
-
});
|
|
226
|
-
default:
|
|
227
|
-
throw new Error('Invalid SettingType');
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
getComparisonValueType(comparator) {
|
|
231
|
-
switch (comparator) {
|
|
232
|
-
case UserComparator.SensitiveTextEquals:
|
|
233
|
-
case UserComparator.SensitiveTextDoesNotEqual:
|
|
234
|
-
case UserComparator.TextEquals:
|
|
235
|
-
case UserComparator.TextDoesNotEqual:
|
|
236
|
-
return UserComparatorType.String;
|
|
237
|
-
case UserComparator.SensitiveIsOneOf:
|
|
238
|
-
case UserComparator.SensitiveIsNotOneOf:
|
|
239
|
-
case UserComparator.SensitiveTextStartsWithAnyOf:
|
|
240
|
-
case UserComparator.SensitiveTextEndsWithAnyOf:
|
|
241
|
-
case UserComparator.SensitiveTextNotStartsWithAnyOf:
|
|
242
|
-
case UserComparator.SensitiveTextNotEndsWithAnyOf:
|
|
243
|
-
case UserComparator.SensitiveArrayContainsAnyOf:
|
|
244
|
-
case UserComparator.SensitiveArrayDoesNotContainAnyOf:
|
|
245
|
-
case UserComparator.IsOneOf:
|
|
246
|
-
case UserComparator.IsNotOneOf:
|
|
247
|
-
case UserComparator.TextStartsWithAnyOf:
|
|
248
|
-
case UserComparator.TextEndsWithAnyOf:
|
|
249
|
-
case UserComparator.TextNotStartsWithAnyOf:
|
|
250
|
-
case UserComparator.TextNotEndsWithAnyOf:
|
|
251
|
-
case UserComparator.ArrayContainsAnyOf:
|
|
252
|
-
case UserComparator.ArrayDoesNotContainAnyOf:
|
|
253
|
-
case UserComparator.ContainsAnyOf:
|
|
254
|
-
case UserComparator.DoesNotContainAnyOf:
|
|
255
|
-
return UserComparatorType.StringList;
|
|
256
|
-
case UserComparator.NumberEquals:
|
|
257
|
-
case UserComparator.NumberDoesNotEqual:
|
|
258
|
-
case UserComparator.NumberLess:
|
|
259
|
-
case UserComparator.NumberLessOrEquals:
|
|
260
|
-
case UserComparator.NumberGreater:
|
|
261
|
-
case UserComparator.NumberGreaterOrEquals:
|
|
262
|
-
return UserComparatorType.Number;
|
|
263
|
-
case UserComparator.SemVerIsOneOf:
|
|
264
|
-
case UserComparator.SemVerIsNotOneOf:
|
|
265
|
-
return UserComparatorType.SemverList;
|
|
266
|
-
case UserComparator.SemVerGreater:
|
|
267
|
-
case UserComparator.SemVerGreaterOrEquals:
|
|
268
|
-
case UserComparator.SemVerLess:
|
|
269
|
-
case UserComparator.SemVerLessOrEquals:
|
|
270
|
-
return UserComparatorType.Semver;
|
|
271
|
-
case UserComparator.DateTimeBefore:
|
|
272
|
-
case UserComparator.DateTimeAfter:
|
|
273
|
-
return UserComparatorType.DateTime;
|
|
274
|
-
default:
|
|
275
|
-
throw new Error('Invalid comparator');
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
getValidatorsForSettingType(settingType, featureFlagLimitations) {
|
|
279
|
-
switch (settingType) {
|
|
280
|
-
case SettingType.Int:
|
|
281
|
-
return [this.validateNumberNan, Validators.required,
|
|
282
|
-
Validators.min(-2147483648), Validators.max(2147483647), Validators.pattern(wholeNumberRegex)];
|
|
283
|
-
case SettingType.Double:
|
|
284
|
-
// eslint-disable-next-line @typescript-eslint/no-loss-of-precision
|
|
285
|
-
return [this.validateNumberNan, Validators.required, Validators.min(-1.79769313486232E+308), Validators.max(1.79769313486232E+308)];
|
|
286
|
-
case SettingType.String:
|
|
287
|
-
return [Validators.required, Validators.maxLength(featureFlagLimitations.maxStringFlagValueLength ?? 100000)];
|
|
288
|
-
case SettingType.Boolean:
|
|
289
|
-
return [Validators.required];
|
|
290
|
-
default:
|
|
291
|
-
return [];
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
validateNumberNan(c) {
|
|
295
|
-
if (c.value === null || isNaN(c.value)) {
|
|
296
|
-
return {
|
|
297
|
-
validateNumberNan: {
|
|
298
|
-
valid: false
|
|
299
|
-
}
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
return null;
|
|
303
|
-
}
|
|
304
|
-
validateSemVer(c) {
|
|
305
|
-
if (valid(c.value) === null) {
|
|
306
|
-
return {
|
|
307
|
-
validateSemVer: {
|
|
308
|
-
valid: false
|
|
309
|
-
}
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
return null;
|
|
313
|
-
}
|
|
314
|
-
validateEmptyString(c) {
|
|
315
|
-
if (c.value === '') {
|
|
316
|
-
return {
|
|
317
|
-
required: true
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
return null;
|
|
321
|
-
}
|
|
322
|
-
validatePercentageSum(c) {
|
|
323
|
-
if (c?.controls.map(i => i.controls.percentage.value).reduce((a, b) => { return a + b; }, 0) !== 100) {
|
|
324
|
-
return {
|
|
325
|
-
validatePercentageSum: {
|
|
326
|
-
valid: false
|
|
327
|
-
}
|
|
328
|
-
};
|
|
329
|
-
}
|
|
330
|
-
return null;
|
|
331
|
-
}
|
|
332
|
-
isPercentageOnlyTargetingRule(formGroup) {
|
|
333
|
-
return !formGroup.controls.value
|
|
334
|
-
&& !formGroup.controls.conditions.length
|
|
335
|
-
&& !!formGroup.controls.percentageOptions?.length;
|
|
336
|
-
}
|
|
337
|
-
addComparisonValueListValueItems(userComparator, listValueFormArray, comparisonValueList, featureFlagLimitations) {
|
|
338
|
-
const validators = this.getComparisonValueType(userComparator) === UserComparatorType.SemverList
|
|
339
|
-
? this.getComparisonValueSemverListItemValidators(featureFlagLimitations)
|
|
340
|
-
: this.getComparisonValueStringListItemValidators(featureFlagLimitations);
|
|
341
|
-
const maxIndex = this.getNextIndex(listValueFormArray);
|
|
342
|
-
comparisonValueList.forEach((comparisonValueListItem, index) => {
|
|
343
|
-
const formGroup = this.generateComparisonValueListFormGroup(comparisonValueListItem, false, validators, maxIndex + index);
|
|
344
|
-
formGroup.updateValueAndValidity();
|
|
345
|
-
formGroup.markAsDirty();
|
|
346
|
-
formGroup.markAllAsTouched();
|
|
347
|
-
listValueFormArray.push(formGroup, { emitEvent: false });
|
|
348
|
-
});
|
|
349
|
-
listValueFormArray.updateValueAndValidity();
|
|
350
|
-
listValueFormArray.markAsTouched();
|
|
351
|
-
listValueFormArray.markAsDirty();
|
|
352
|
-
}
|
|
353
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormGenerator, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
354
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormGenerator }); }
|
|
355
|
-
}
|
|
356
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormGenerator, decorators: [{
|
|
357
|
-
type: Injectable
|
|
358
|
-
}] });
|
|
359
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvX3NlcnZpY2VzL2Zvcm0tZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFDSCxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQVcvQyxzQkFBc0IsRUFFekIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBRzdFLE1BQU0sT0FBTyxhQUFhO0lBQ2YsOEJBQThCLENBQUMsS0FBeUIsRUFBRSxRQUFpQixFQUFFLFFBQWdDLEVBQUUsc0JBQStDO1FBQ2pLLE9BQU8sSUFBSSxTQUFTLENBQXlCO1lBQ3pDLFlBQVksRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsc0JBQXNCLENBQUM7WUFDMUgsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxRQUFRLENBQUM7WUFDbkksY0FBYyxFQUFFLElBQUksU0FBUyxDQUN6QixLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsUUFB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QyxDQUFDO1FBRXZELG1CQUFtQixDQUFDLE9BQU8sQ0FDdkIsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsb0NBQW9DLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDMUgsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDbkMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hCLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzdCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVQLGtCQUFrQixDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDNUMsa0JBQWtCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckMsQ0FBQzsrR0ExWlEsYUFBYTttSEFBYixhQUFhOzs0RkFBYixhQUFhO2tCQUR6QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge1xuICAgIFVzZXJDb21wYXJhdG9yLCBVc2VyQ29tcGFyYXRvclR5cGUsIFNldHRpbmdUeXBlLFxuICAgIElDb21wYXJpc29uVmFsdWVNb2RlbCwgSUNvbXBhcmlzb25WYWx1ZUxpc3RNb2RlbCxcbiAgICBJRmVhdHVyZUZsYWdMaW1pdGF0aW9ucyxcbiAgICBDb21wYXJpc29uVmFsdWVGb3JtLCBDb21wYXJpc29uVmFsdWVMaXN0Rm9ybSxcbiAgICBDb25kaXRpb25Gb3JtLFxuICAgIFByZXJlcXVpc2l0ZUZsYWdDb25kaXRpb25Gb3JtLFxuICAgIElQcmVyZXF1aXNpdGVTZXR0aW5nLFxuICAgIFBlcmNlbnRhZ2VPcHRpb25Gb3JtLFxuICAgIFNlZ21lbnRDb25kaXRpb25Gb3JtLFxuICAgIFRhcmdldGluZ1J1bGVGb3JtLFxuICAgIFVwZGF0ZVNldHRpbmdWYWx1ZUZvcm0sIFVzZXJDb25kaXRpb25Gb3JtLCBWYWx1ZUZvcm0sXG4gICAgUHJlcmVxdWlzaXRlQ29tcGFyYXRvciwgSUNvbmRpdGlvbk1vZGVsLCBJUHJlcmVxdWlzaXRlRmxhZ0NvbmRpdGlvbk1vZGVsLCBJU2VnbWVudENvbmRpdGlvbk1vZGVsLCBJVXNlckNvbmRpdGlvbk1vZGVsLFxuICAgIElWYWx1ZU1vZGVsLCBJVGFyZ2V0aW5nUnVsZU1vZGVsLCBJUGVyY2VudGFnZU9wdGlvbk1vZGVsLCBJU2V0dGluZ1ZhbHVlTW9kZWxcbn0gZnJvbSBcIi4uL2Jvb3RzdHJhcFwiO1xuaW1wb3J0IHsgdmFsaWQgfSBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgcGVyY2VudGFnZVJlZ2V4LCB3aG9sZU51bWJlclJlZ2V4IH0gZnJvbSBcIi4uL19zZXJ2aWNlcy9mb3JtLWhlbHBlclwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRm9ybUdlbmVyYXRvciB7XG4gICAgcHVibGljIGdlbmVyYXRlU2V0dGluZ1ZhbHVlc0Zvcm1Hcm91cChtb2RlbDogSVNldHRpbmdWYWx1ZU1vZGVsLCByZWFkT25seTogYm9vbGVhbiwgc2V0dGluZ3M6IElQcmVyZXF1aXNpdGVTZXR0aW5nW10sIGZlYXR1cmVGbGFnTGltaXRhdGlvbnM6IElGZWF0dXJlRmxhZ0xpbWl0YXRpb25zKTogRm9ybUdyb3VwPFVwZGF0ZVNldHRpbmdWYWx1ZUZvcm0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtR3JvdXA8VXBkYXRlU2V0dGluZ1ZhbHVlRm9ybT4oe1xuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLmdlbmVyYXRlVmFsdWVGb3JtR3JvdXAobW9kZWwuZGVmYXVsdFZhbHVlLCBtb2RlbC5zZXR0aW5nLnNldHRpbmdUeXBlLCByZWFkT25seSwgZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyksXG4gICAgICAgICAgICBwZXJjZW50YWdlRXZhbHVhdGlvbkF0dHJpYnV0ZTogdGhpcy5nZW5lcmF0ZVBlcmNlbnRhZ2VFdmFsdWF0aW9uQXR0cmlidXRlRm9ybUNvbnRyb2wobW9kZWwucGVyY2VudGFnZUV2YWx1YXRpb25BdHRyaWJ1dGUsIHJlYWRPbmx5KSxcbiAgICAgICAgICAgIHRhcmdldGluZ1J1bGVzOiBuZXcgRm9ybUFycmF5PEZvcm1Hcm91cDxUYXJnZXRpbmdSdWxlRm9ybT4+KFxuICAgICAgICAgICAgICAgIG1vZGVsLnRhcmdldGluZ1J1bGVzLm1hcChmdCA9PiB0aGlzLmdlbmVyYXRlVGFyZ2V0aW5nUnVsZUZvcm1Hcm91cChmdCwgbW9kZWwuc2V0dGluZy5zZXR0aW5nVHlwZSwgcmVhZE9ubHksIHNldHRpbmdzLCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlUGVyY2VudGFnZUV2YWx1YXRpb25BdHRyaWJ1dGVGb3JtQ29udHJvbChwZXJjZW50YWdlRXZhbHVhdGlvbkF0dHJpYnV0ZTogc3RyaW5nLCByZWFkT25seTogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHBlcmNlbnRhZ2VFdmFsdWF0aW9uQXR0cmlidXRlLCBkaXNhYmxlZDogcmVhZE9ubHkgfSwgeyB2YWxpZGF0b3JzOiBbdGhpcy52YWxpZGF0ZUVtcHR5U3RyaW5nLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDAwKV0gfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVUYXJnZXRpbmdSdWxlRm9ybUdyb3VwKG1vZGVsOiBJVGFyZ2V0aW5nUnVsZU1vZGVsLCBzZXR0aW5nVHlwZTogU2V0dGluZ1R5cGUsIHJlYWRPbmx5OiBib29sZWFuLCBzZXR0aW5nczogSVByZXJlcXVpc2l0ZVNldHRpbmdbXSwgZmVhdHVyZUZsYWdMaW1pdGF0aW9uczogSUZlYXR1cmVGbGFnTGltaXRhdGlvbnMpOiBGb3JtR3JvdXA8VGFyZ2V0aW5nUnVsZUZvcm0+IHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9ucyA9IG5ldyBGb3JtQXJyYXk8Rm9ybUdyb3VwPENvbmRpdGlvbkZvcm0+PihcbiAgICAgICAgICAgIG1vZGVsLmNvbmRpdGlvbnMubWFwKHRyID0+IHRoaXMuZ2VuZXJhdGVDb25kaXRpb25Gb3JtR3JvdXAodHIsIHJlYWRPbmx5LCBzZXR0aW5ncywgZmVhdHVyZUZsYWdMaW1pdGF0aW9ucykpXG4gICAgICAgIClcblxuICAgICAgICBpZiAobW9kZWwucGVyY2VudGFnZU9wdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwPFRhcmdldGluZ1J1bGVGb3JtPih7XG4gICAgICAgICAgICAgICAgY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBwZXJjZW50YWdlT3B0aW9uczogbmV3IEZvcm1BcnJheTxGb3JtR3JvdXA8UGVyY2VudGFnZU9wdGlvbkZvcm0+PihcbiAgICAgICAgICAgICAgICAgICAgbW9kZWwucGVyY2VudGFnZU9wdGlvbnMubWFwKHByID0+IHRoaXMuZ2VuZXJhdGVQZXJjZW50YWdlT3B0aW9uRm9ybUdyb3VwKHByLCBzZXR0aW5nVHlwZSwgcmVhZE9ubHksIGZlYXR1cmVGbGFnTGltaXRhdGlvbnMpKSxcbiAgICAgICAgICAgICAgICAgICAgW3RoaXMudmFsaWRhdGVQZXJjZW50YWdlU3VtXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cDxUYXJnZXRpbmdSdWxlRm9ybT4oe1xuICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2VuZXJhdGVWYWx1ZUZvcm1Hcm91cChtb2RlbC52YWx1ZSwgc2V0dGluZ1R5cGUsIHJlYWRPbmx5LCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBFcnJvcihcIkludmFsaWQgbW9kZWxcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlVGFyZ2V0aW5nUnVsZVdpdGhFbXB0eVBlcmNlbnRhZ2VPcHRpb25zKHNldHRpbmdUeXBlOiBTZXR0aW5nVHlwZSwgcmVhZE9ubHk6IGJvb2xlYW4sIHNldHRpbmdzOiBJUHJlcmVxdWlzaXRlU2V0dGluZ1tdLCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zOiBJRmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk6IEZvcm1Hcm91cDxUYXJnZXRpbmdSdWxlRm9ybT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVRhcmdldGluZ1J1bGVGb3JtR3JvdXAoe1xuICAgICAgICAgICAgY29uZGl0aW9uczogW10sXG4gICAgICAgICAgICBwZXJjZW50YWdlT3B0aW9uczogdGhpcy5nZXRFbXB0eVBlcmNlbnRhZ2VPcHRpb25zKHNldHRpbmdUeXBlKVxuICAgICAgICB9LCBzZXR0aW5nVHlwZSwgcmVhZE9ubHksIHNldHRpbmdzLCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW1wdHlQZXJjZW50YWdlT3B0aW9ucyhzZXR0aW5nVHlwZTogU2V0dGluZ1R5cGUpOiBJUGVyY2VudGFnZU9wdGlvbk1vZGVsW10ge1xuICAgICAgICBzd2l0Y2ggKHNldHRpbmdUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNldHRpbmdUeXBlLkJvb2xlYW46XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgeyBwZXJjZW50YWdlOiA1MCwgdmFsdWU6IHsgYm9vbFZhbHVlOiB0cnVlIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgeyBwZXJjZW50YWdlOiA1MCwgdmFsdWU6IHsgYm9vbFZhbHVlOiBmYWxzZSB9IH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgY2FzZSBTZXR0aW5nVHlwZS5TdHJpbmc6XG4gICAgICAgICAgICBjYXNlIFNldHRpbmdUeXBlLkludDpcbiAgICAgICAgICAgIGNhc2UgU2V0dGluZ1R5cGUuRG91YmxlOlxuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHsgcGVyY2VudGFnZTogNTAsIHZhbHVlOiB7fSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHBlcmNlbnRhZ2U6IDUwLCB2YWx1ZToge30gfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgU2V0dGluZ1R5cGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZVBlcmNlbnRhZ2VPcHRpb25Gb3JtR3JvdXAobW9kZWw6IElQZXJjZW50YWdlT3B0aW9uTW9kZWwsIHNldHRpbmdUeXBlOiBTZXR0aW5nVHlwZSwgcmVhZE9ubHk6IGJvb2xlYW4sIGZlYXR1cmVGbGFnTGltaXRhdGlvbnM6IElGZWF0dXJlRmxhZ0xpbWl0YXRpb25zKTogRm9ybUdyb3VwPFBlcmNlbnRhZ2VPcHRpb25Gb3JtPiB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwPFBlcmNlbnRhZ2VPcHRpb25Gb3JtPih7XG4gICAgICAgICAgICBwZXJjZW50YWdlOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogbW9kZWwucGVyY2VudGFnZSwgZGlzYWJsZWQ6IHJlYWRPbmx5IH0sIHsgbm9uTnVsbGFibGU6IHRydWUsIHZhbGlkYXRvcnM6IFt0aGlzLnZhbGlkYXRlTnVtYmVyTmFuLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwKSwgVmFsaWRhdG9ycy5tYXgoMTAwKSwgVmFsaWRhdG9ycy5wYXR0ZXJuKHBlcmNlbnRhZ2VSZWdleCldIH0pLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2VuZXJhdGVWYWx1ZUZvcm1Hcm91cChtb2RlbC52YWx1ZSwgc2V0dGluZ1R5cGUsIHJlYWRPbmx5IHx8IHNldHRpbmdUeXBlID09PSBTZXR0aW5nVHlwZS5Cb29sZWFuLCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zKSxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVDb25kaXRpb25Gb3JtR3JvdXAobW9kZWw6IElDb25kaXRpb25Nb2RlbCwgcmVhZE9ubHk6IGJvb2xlYW4sIHNldHRpbmdzOiBJUHJlcmVxdWlzaXRlU2V0dGluZ1tdLCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zOiBJRmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk6IEZvcm1Hcm91cDxDb25kaXRpb25Gb3JtPiB7XG4gICAgICAgIGlmIChtb2RlbC51c2VyQ29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cDxDb25kaXRpb25Gb3JtPih7XG4gICAgICAgICAgICAgICAgdXNlckNvbmRpdGlvbjogdGhpcy5nZW5lcmF0ZVVzZXJDb25kaXRpb25Gb3JtR3JvdXAobW9kZWwudXNlckNvbmRpdGlvbiwgcmVhZE9ubHksIGZlYXR1cmVGbGFnTGltaXRhdGlvbnMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5zZWdtZW50Q29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cDxDb25kaXRpb25Gb3JtPih7XG4gICAgICAgICAgICAgICAgc2VnbWVudENvbmRpdGlvbjogdGhpcy5nZW5lcmF0ZVNlZ21lbnRDb25kaXRpb25Gb3JtR3JvdXAobW9kZWwuc2VnbWVudENvbmRpdGlvbiwgcmVhZE9ubHkpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5wcmVyZXF1aXNpdGVGbGFnQ29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cDxDb25kaXRpb25Gb3JtPih7XG4gICAgICAgICAgICAgICAgcHJlcmVxdWlzaXRlRmxhZ0NvbmRpdGlvbjogdGhpcy5nZW5lcmF0ZVByZXJlcXVpc2l0ZUZsYWdDb25kaXRpb25Gb3JtR3JvdXAobW9kZWwucHJlcmVxdWlzaXRlRmxhZ0NvbmRpdGlvbiwgcmVhZE9ubHksIHNldHRpbmdzLCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJycpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVVc2VyQ29uZGl0aW9uRm9ybUdyb3VwKHZhbHVlOiBJVXNlckNvbmRpdGlvbk1vZGVsLCByZWFkT25seTogYm9vbGVhbiwgZmVhdHVyZUZsYWdMaW1pdGF0aW9uczogSUZlYXR1cmVGbGFnTGltaXRhdGlvbnMpOiBGb3JtR3JvdXA8VXNlckNvbmRpdGlvbkZvcm0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtR3JvdXA8VXNlckNvbmRpdGlvbkZvcm0+KHtcbiAgICAgICAgICAgIGNvbXBhcmlzb25BdHRyaWJ1dGU6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiB2YWx1ZS5jb21wYXJpc29uQXR0cmlidXRlLCBkaXNhYmxlZDogcmVhZE9ubHkgfSwgeyBub25OdWxsYWJsZTogdHJ1ZSwgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMDApXSB9KSxcbiAgICAgICAgICAgIGNvbXBhcmF0b3I6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiB2YWx1ZS5jb21wYXJhdG9yLCBkaXNhYmxlZDogcmVhZE9ubHkgfSwgeyBub25OdWxsYWJsZTogdHJ1ZSwgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdIH0pLFxuICAgICAgICAgICAgY29tcGFyaXNvblZhbHVlOiB0aGlzLmdlbmVyYXRlQ29tcGFyaXNvblZhbHVlRm9ybUdyb3VwKHZhbHVlLmNvbXBhcmlzb25WYWx1ZSwgdmFsdWUuY29tcGFyYXRvciwgcmVhZE9ubHksIGZlYXR1cmVGbGFnTGltaXRhdGlvbnMpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZVNlZ21lbnRDb25kaXRpb25Gb3JtR3JvdXAodmFsdWU6IElTZWdtZW50Q29uZGl0aW9uTW9kZWwsIHJlYWRPbmx5OiBib29sZWFuKTogRm9ybUdyb3VwPFNlZ21lbnRDb25kaXRpb25Gb3JtPiB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwPFNlZ21lbnRDb25kaXRpb25Gb3JtPih7XG4gICAgICAgICAgICBzZWdtZW50SWQ6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiB2YWx1ZS5zZWdtZW50SWQsIGRpc2FibGVkOiByZWFkT25seSB9LCB7IG5vbk51bGxhYmxlOiB0cnVlLCB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0gfSksXG4gICAgICAgICAgICBjb21wYXJhdG9yOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogdmFsdWUuY29tcGFyYXRvciwgZGlzYWJsZWQ6IHJlYWRPbmx5IH0sIHsgbm9uTnVsbGFibGU6IHRydWUsIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlUHJlcmVxdWlzaXRlRmxhZ0NvbmRpdGlvbkZvcm1Hcm91cCh2YWx1ZTogSVByZXJlcXVpc2l0ZUZsYWdDb25kaXRpb25Nb2RlbCwgcmVhZE9ubHk6IGJvb2xlYW4sIHNldHRpbmdzOiBJUHJlcmVxdWlzaXRlU2V0dGluZ1tdLCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zOiBJRmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk6IEZvcm1Hcm91cDxQcmVyZXF1aXNpdGVGbGFnQ29uZGl0aW9uRm9ybT4ge1xuICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3MuZmlsdGVyKHMgPT4gcy5zZXR0aW5nSWQgPT0gdmFsdWUucHJlcmVxdWlzaXRlU2V0dGluZ0lkKVswXTtcbiAgICAgICAgaWYgKCFzZXR0aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHByZXJlcXVpc2l0ZSBzZXR0aW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmcuc2V0dGluZ1R5cGUgPT09IFNldHRpbmdUeXBlLkJvb2xlYW4pIHtcbiAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYSBib29sZWFuIHByZXJlcXVpc2l0ZSBzZXR0aW5nLCB3ZSBhcmUgZW5mb3JjaW5nIGEgJ1RydWUnIHByZXJlcXVpc2l0ZUNvbXBhcmlzb25WYWx1ZSBcbiAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBzaW1wbGlmeSB0aGUgVUkgd2l0aCBhIHNpbXBsZSAnSXMgdHJ1ZScgb3IgJ0lzIGZhbHNlJyBzZWxlY3QuXG4gICAgICAgICAgICAvLyAnSXMgdHJ1ZScgPSBQcmVyZXF1aXNpdGVDb21wYXJhdG9yLkVxdWFscyBUUlVFXG4gICAgICAgICAgICAvLyAnSXMgZmFsc2UnID0gUHJlcmVxdWlzaXRlQ29tcGFyYXRvci5Eb2VzTm90RXF1YWwgVFJVRVxuICAgICAgICAgICAgbGV0IGNvbXBhcmF0b3IgPSB2YWx1ZS5jb21wYXJhdG9yO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZS5wcmVyZXF1aXNpdGVDb21wYXJpc29uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJlcmVxdWlzaXRlQ29tcGFyaXNvblZhbHVlIGlzIGZhbHNlIHNvbWVob3cgKGUuZy4gUHVibGljIE1hbmFnZW1lbnQgQVBJKSwgd2Ugc2hvdWxkIG5lZ2F0ZSB0aGUgY29tcGFyYXRvci5cbiAgICAgICAgICAgICAgICBjb21wYXJhdG9yID0gY29tcGFyYXRvciA9PT0gUHJlcmVxdWlzaXRlQ29tcGFyYXRvci5FcXVhbHMgPyBQcmVyZXF1aXNpdGVDb21wYXJhdG9yLkRvZXNOb3RFcXVhbCA6IFByZXJlcXVpc2l0ZUNvbXBhcmF0b3IuRXF1YWxzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtR3JvdXA8UHJlcmVxdWlzaXRlRmxhZ0NvbmRpdGlvbkZvcm0+KHtcbiAgICAgICAgICAgICAgICBwcmVyZXF1aXNpdGVTZXR0aW5nSWQ6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiB2YWx1ZS5wcmVyZXF1aXNpdGVTZXR0aW5nSWQsIGRpc2FibGVkOiByZWFkT25seSB9LCB7IG5vbk51bGxhYmxlOiB0cnVlLCB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0gfSksXG4gICAgICAgICAgICAgICAgY29tcGFyYXRvcjogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGNvbXBhcmF0b3IsIGRpc2FibGVkOiByZWFkT25seSB9LCB7IG5vbk51bGxhYmxlOiB0cnVlLCB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0gfSksXG4gICAgICAgICAgICAgICAgcHJlcmVxdWlzaXRlQ29tcGFyaXNvblZhbHVlOiB0aGlzLmdlbmVyYXRlVmFsdWVGb3JtR3JvdXAoeyBib29sVmFsdWU6IHRydWUgfSwgc2V0dGluZy5zZXR0aW5nVHlwZSwgcmVhZE9ubHksIGZlYXR1cmVGbGFnTGltaXRhdGlvbnMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwPFByZXJlcXVpc2l0ZUZsYWdDb25kaXRpb25Gb3JtPih7XG4gICAgICAgICAgICAgICAgcHJlcmVxdWlzaXRlU2V0dGluZ0lkOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogdmFsdWUucHJlcmVxdWlzaXRlU2V0dGluZ0lkLCBkaXNhYmxlZDogcmVhZE9ubHkgfSwgeyBub25OdWxsYWJsZTogdHJ1ZSwgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdIH0pLFxuICAgICAgICAgICAgICAgIGNvbXBhcmF0b3I6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiB2YWx1ZS5jb21wYXJhdG9yLCBkaXNhYmxlZDogcmVhZE9ubHkgfSwgeyBub25OdWxsYWJsZTogdHJ1ZSwgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdIH0pLFxuICAgICAgICAgICAgICAgIHByZXJlcXVpc2l0ZUNvbXBhcmlzb25WYWx1ZTogdGhpcy5nZW5lcmF0ZVZhbHVlRm9ybUdyb3VwKHZhbHVlLnByZXJlcXVpc2l0ZUNvbXBhcmlzb25WYWx1ZSwgc2V0dGluZy5zZXR0aW5nVHlwZSwgcmVhZE9ubHksIGZlYXR1cmVGbGFnTGltaXRhdGlvbnMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZUVtcHR5UHJlcmVxdWlzaXRlRmxhZ0NvbmRpdGlvbkZvcm1Hcm91cChmZWF0dXJlRmxhZ0xpbWl0YXRpb25zOiBJRmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk6IEZvcm1Hcm91cDxQcmVyZXF1aXNpdGVGbGFnQ29uZGl0aW9uRm9ybT4ge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cDxQcmVyZXF1aXNpdGVGbGFnQ29uZGl0aW9uRm9ybT4oe1xuICAgICAgICAgICAgcHJlcmVxdWlzaXRlU2V0dGluZ0lkOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgeyBub25OdWxsYWJsZTogdHJ1ZSwgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdIH0pLFxuICAgICAgICAgICAgY29tcGFyYXRvcjogbmV3IEZvcm1Db250cm9sKFByZXJlcXVpc2l0ZUNvbXBhcmF0b3IuRXF1YWxzLCB7IG5vbk51bGxhYmxlOiB0cnVlLCB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0gfSksXG4gICAgICAgICAgICBwcmVyZXF1aXNpdGVDb21wYXJpc29uVmFsdWU6IHRoaXMuZ2VuZXJhdGVWYWx1ZUZvcm1Hcm91cCh7IGJvb2xWYWx1ZTogdHJ1ZSB9LCBTZXR0aW5nVHlwZS5Cb29sZWFuLCBmYWxzZSwgZmVhdHVyZUZsYWdMaW1pdGF0aW9ucylcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5leHRJbmRleChmb3JtQXJyYXk6IEZvcm1BcnJheTxGb3JtR3JvdXA8Q29tcGFyaXNvblZhbHVlTGlzdEZvcm0+Pikge1xuICAgICAgICBpZiAoZm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KC4uLmZvcm1BcnJheS5jb250cm9scy5tYXAoYyA9PiBjLmNvbnRyb2xzLmluZGV4LnZhbHVlKSkgKyAxO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZUNvbXBhcmlzb25WYWx1ZUxpc3RGb3JtR3JvdXAobGlzdFZhbHVlOiBJQ29tcGFyaXNvblZhbHVlTGlzdE1vZGVsLCByZWFkT25seTogYm9vbGVhbiwgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cDxDb21wYXJpc29uVmFsdWVMaXN0Rm9ybT4oe1xuICAgICAgICAgICAgdmFsdWU6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiBsaXN0VmFsdWUudmFsdWUsIGRpc2FibGVkOiByZWFkT25seSB9LCB7IG5vbk51bGxhYmxlOiB0cnVlLCB2YWxpZGF0b3JzIH0pLFxuICAgICAgICAgICAgaGludDogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGxpc3RWYWx1ZS5oaW50LCBkaXNhYmxlZDogcmVhZE9ubHkgfSwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDE1MDApXSksXG4gICAgICAgICAgICAvLyBUaGUgaW5kZXggY29sdW1uIGlzIGdlbmVyYXRlZCBvbiB0aGUgZmlyc3QgZ2VuZXJhdGlvbiBieSBkZWZhdWx0IG9yIGJ5IHRoZSBnZXROZXh0SW5kZXgoKSBpZiBhIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBsaXN0dmFsdWUuIEl0IGlzIHJlcXVpcmVkIHNvIHdlIGNhbiBkZWxldGUgdGhlIHJvd3Mgb24gdGhlIHBvcHV0IGVkaXRvci5cbiAgICAgICAgICAgIGluZGV4OiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogaW5kZXgsIGRpc2FibGVkOiB0cnVlIH0pXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZUNvbXBhcmlzb25WYWx1ZUZvcm1Hcm91cCh2YWx1ZTogSUNvbXBhcmlzb25WYWx1ZU1vZGVsLCBjb21wYXJhdG9yOiBVc2VyQ29tcGFyYXRvciwgcmVhZE9ubHk6IGJvb2xlYW4sIGZlYXR1cmVGbGFnTGltaXRhdGlvbnM6IElGZWF0dXJlRmxhZ0xpbWl0YXRpb25zKTogRm9ybUdyb3VwPENvbXBhcmlzb25WYWx1ZUZvcm0+IHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmdldENvbXBhcmlzb25WYWx1ZVR5cGUoY29tcGFyYXRvcikpIHtcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3JUeXBlLlN0cmluZzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cDxDb21wYXJpc29uVmFsdWVGb3JtPih7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogdmFsdWUuc3RyaW5nVmFsdWUsIGRpc2FibGVkOiByZWFkT25seSB9LCB7IG5vbk51bGxhYmxlOiB0cnVlLCB2YWxpZGF0b3JzOiB0aGlzLmdldENvbXBhcmlzb25WYWx1ZVN0cmluZ1ZhbGlkYXRvcnMoZmVhdHVyZUZsYWdMaW1pdGF0aW9ucykgfSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3JUeXBlLlN0cmluZ0xpc3Q6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtR3JvdXA8Q29tcGFyaXNvblZhbHVlRm9ybT4oe1xuICAgICAgICAgICAgICAgICAgICBsaXN0VmFsdWU6IHRoaXMuZ2VuZXJhdGVDb21wYXJpc29uVmFsdWVMaXN0VmFsdWVBcnJheSh2YWx1ZS5saXN0VmFsdWUsIHJlYWRPbmx5LCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zLCB0aGlzLmdldENvbXBhcmlzb25WYWx1ZVN0cmluZ0xpc3RJdGVtVmFsaWRhdG9ycyhmZWF0dXJlRmxhZ0xpbWl0YXRpb25zKSlcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvclR5cGUuTnVtYmVyOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwPENvbXBhcmlzb25WYWx1ZUZvcm0+KHtcbiAgICAgICAgICAgICAgICAgICAgZG91YmxlVmFsdWU6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiB2YWx1ZS5kb3VibGVWYWx1ZSwgZGlzYWJsZWQ6IHJlYWRPbmx5IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWxvc3Mtb2YtcHJlY2lzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG5vbk51bGxhYmxlOiB0cnVlLCB2YWxpZGF0b3JzOiBbdGhpcy52YWxpZGF0ZU51bWJlck5hbiwgVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oLTEuNzk3NjkzMTM0ODYyMzJFKzMwOCksIFZhbGlkYXRvcnMubWF4KDEuNzk3NjkzMTM0ODYyMzJFKzMwOCldIH0pXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3JUeXBlLlNlbXZlcjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cDxDb21wYXJpc29uVmFsdWVGb3JtPih7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogdmFsdWUuc3RyaW5nVmFsdWUsIGRpc2FibGVkOiByZWFkT25seSB9LCB7IG5vbk51bGxhYmxlOiB0cnVlLCB2YWxpZGF0b3JzOiB0aGlzLmdldENvbXBhcmlzb25WYWx1ZVNlbXZlclZhbGlkYXRvcnMoZmVhdHVyZUZsYWdMaW1pdGF0aW9ucykgfSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3JUeXBlLlNlbXZlckxpc3Q6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtR3JvdXA8Q29tcGFyaXNvblZhbHVlRm9ybT4oe1xuICAgICAgICAgICAgICAgICAgICBsaXN0VmFsdWU6IHRoaXMuZ2VuZXJhdGVDb21wYXJpc29uVmFsdWVMaXN0VmFsdWVBcnJheSh2YWx1ZS5saXN0VmFsdWUsIHJlYWRPbmx5LCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zLCB0aGlzLmdldENvbXBhcmlzb25WYWx1ZVNlbXZlckxpc3RJdGVtVmFsaWRhdG9ycyhmZWF0dXJlRmxhZ0xpbWl0YXRpb25zKSlcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvclR5cGUuRGF0ZVRpbWU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtR3JvdXA8Q29tcGFyaXNvblZhbHVlRm9ybT4oe1xuICAgICAgICAgICAgICAgICAgICBkb3VibGVWYWx1ZTogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHZhbHVlLmRvdWJsZVZhbHVlLCBkaXNhYmxlZDogcmVhZE9ubHkgfSwgeyBub25OdWxsYWJsZTogdHJ1ZSwgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdIH0pXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb21wYXJhdG9yJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVDb21wYXJpc29uVmFsdWVMaXN0VmFsdWVBcnJheShsaXN0VmFsdWU6IElDb21wYXJpc29uVmFsdWVMaXN0TW9kZWxbXSwgcmVhZE9ubHk6IGJvb2xlYW4sIGZlYXR1cmVGbGFnTGltaXRhdGlvbnM6IElGZWF0dXJlRmxhZ0xpbWl0YXRpb25zLCBpdGVtVmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSkge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1BcnJheTxGb3JtR3JvdXA8Q29tcGFyaXNvblZhbHVlTGlzdEZvcm0+PihcbiAgICAgICAgICAgIChsaXN0VmFsdWUgPz8gW10pLm1hcCgobHYsIGluZGV4KSA9PiB7IHJldHVybiB0aGlzLmdlbmVyYXRlQ29tcGFyaXNvblZhbHVlTGlzdEZvcm1Hcm91cChsdiwgcmVhZE9ubHksIGl0ZW1WYWxpZGF0b3JzLCBpbmRleCk7IH0pLFxuICAgICAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEpLCBWYWxpZGF0b3JzLm1heExlbmd0aChmZWF0dXJlRmxhZ0xpbWl0YXRpb25zLm1heENvbXBhcmlzb25WYWx1ZUxpc3RMZW5ndGgpXVxuICAgICAgICApXG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBhcmlzb25WYWx1ZVN0cmluZ1ZhbGlkYXRvcnMoZmVhdHVyZUZsYWdMaW1pdGF0aW9uczogSUZlYXR1cmVGbGFnTGltaXRhdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aChmZWF0dXJlRmxhZ0xpbWl0YXRpb25zLm1heENvbXBhcmlzb25WYWx1ZUxlbmd0aCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wYXJpc29uVmFsdWVTdHJpbmdMaXN0SXRlbVZhbGlkYXRvcnMoZmVhdHVyZUZsYWdMaW1pdGF0aW9uczogSUZlYXR1cmVGbGFnTGltaXRhdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aChmZWF0dXJlRmxhZ0xpbWl0YXRpb25zLm1heENvbXBhcmlzb25WYWx1ZUxpc3RJdGVtTGVuZ3RoKV07XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBhcmlzb25WYWx1ZVNlbXZlclZhbGlkYXRvcnMoZmVhdHVyZUZsYWdMaW1pdGF0aW9uczogSUZlYXR1cmVGbGFnTGltaXRhdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aChmZWF0dXJlRmxhZ0xpbWl0YXRpb25zLm1heENvbXBhcmlzb25WYWx1ZUxlbmd0aCksIHRoaXMudmFsaWRhdGVTZW1WZXJdXG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBhcmlzb25WYWx1ZVNlbXZlckxpc3RJdGVtVmFsaWRhdG9ycyhmZWF0dXJlRmxhZ0xpbWl0YXRpb25zOiBJRmVhdHVyZUZsYWdMaW1pdGF0aW9ucykge1xuICAgICAgICByZXR1cm4gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKGZlYXR1cmVGbGFnTGltaXRhdGlvbnMubWF4Q29tcGFyaXNvblZhbHVlTGlzdEl0ZW1MZW5ndGgpLCB0aGlzLnZhbGlkYXRlU2VtVmVyXVxuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZURlZmF1bHRWYWx1ZShzZXR0aW5nVHlwZTogU2V0dGluZ1R5cGUpOiBJVmFsdWVNb2RlbCB7XG4gICAgICAgIHN3aXRjaCAoc2V0dGluZ1R5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2V0dGluZ1R5cGUuQm9vbGVhbjpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBib29sVmFsdWU6IGZhbHNlIH07XG4gICAgICAgICAgICBjYXNlIFNldHRpbmdUeXBlLlN0cmluZzpcbiAgICAgICAgICAgIGNhc2UgU2V0dGluZ1R5cGUuSW50OlxuICAgICAgICAgICAgY2FzZSBTZXR0aW5nVHlwZS5Eb3VibGU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgU2V0dGluZ1R5cGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZURlZmF1bHRWYWx1ZUZvcm1Hcm91cChzZXR0aW5nVHlwZTogU2V0dGluZ1R5cGUsIHJlYWRPbmx5OiBib29sZWFuLCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zOiBJRmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk6IEZvcm1Hcm91cDxWYWx1ZUZvcm0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVWYWx1ZUZvcm1Hcm91cCh0aGlzLmdlbmVyYXRlRGVmYXVsdFZhbHVlKHNldHRpbmdUeXBlKSwgc2V0dGluZ1R5cGUsIHJlYWRPbmx5LCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVWYWx1ZUZvcm1Hcm91cCh2YWx1ZTogSVZhbHVlTW9kZWwsIHNldHRpbmdUeXBlOiBTZXR0aW5nVHlwZSwgcmVhZE9ubHk6IGJvb2xlYW4sIGZlYXR1cmVGbGFnTGltaXRhdGlvbnM6IElGZWF0dXJlRmxhZ0xpbWl0YXRpb25zKTogRm9ybUdyb3VwPFZhbHVlRm9ybT4ge1xuICAgICAgICBzd2l0Y2ggKHNldHRpbmdUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNldHRpbmdUeXBlLkJvb2xlYW46XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtR3JvdXA8VmFsdWVGb3JtPih7XG4gICAgICAgICAgICAgICAgICAgIGJvb2xWYWx1ZTogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHZhbHVlLmJvb2xWYWx1ZSwgZGlzYWJsZWQ6IHJlYWRPbmx5IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG5vbk51bGxhYmxlOiB0cnVlLCB2YWxpZGF0b3JzOiB0aGlzLmdldFZhbGlkYXRvcnNGb3JTZXR0aW5nVHlwZShzZXR0aW5nVHlwZSwgZmVhdHVyZUZsYWdMaW1pdGF0aW9ucykgfSlcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2FzZSBTZXR0aW5nVHlwZS5TdHJpbmc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtR3JvdXA8VmFsdWVGb3JtPih7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogdmFsdWUuc3RyaW5nVmFsdWUsIGRpc2FibGVkOiByZWFkT25seSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBub25OdWxsYWJsZTogdHJ1ZSwgdmFsaWRhdG9yczogdGhpcy5nZXRWYWxpZGF0b3JzRm9yU2V0dGluZ1R5cGUoc2V0dGluZ1R5cGUsIGZlYXR1cmVGbGFnTGltaXRhdGlvbnMpIH0pXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNhc2UgU2V0dGluZ1R5cGUuSW50OlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwPFZhbHVlRm9ybT4oe1xuICAgICAgICAgICAgICAgICAgICBpbnRWYWx1ZTogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHZhbHVlLmludFZhbHVlLCBkaXNhYmxlZDogcmVhZE9ubHkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbm9uTnVsbGFibGU6IHRydWUsIHZhbGlkYXRvcnM6IHRoaXMuZ2V0VmFsaWRhdG9yc0ZvclNldHRpbmdUeXBlKHNldHRpbmdUeXBlLCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zKSB9KVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjYXNlIFNldHRpbmdUeXBlLkRvdWJsZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cDxWYWx1ZUZvcm0+KHtcbiAgICAgICAgICAgICAgICAgICAgZG91YmxlVmFsdWU6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiB2YWx1ZS5kb3VibGVWYWx1ZSwgZGlzYWJsZWQ6IHJlYWRPbmx5IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG5vbk51bGxhYmxlOiB0cnVlLCB2YWxpZGF0b3JzOiB0aGlzLmdldFZhbGlkYXRvcnNGb3JTZXR0aW5nVHlwZShzZXR0aW5nVHlwZSwgZmVhdHVyZUZsYWdMaW1pdGF0aW9ucykgfSlcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgU2V0dGluZ1R5cGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wYXJpc29uVmFsdWVUeXBlKGNvbXBhcmF0b3I6IFVzZXJDb21wYXJhdG9yKTogVXNlckNvbXBhcmF0b3JUeXBlIHtcbiAgICAgICAgc3dpdGNoIChjb21wYXJhdG9yKSB7XG5cbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dEVxdWFsczpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dERvZXNOb3RFcXVhbDpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dEVxdWFsczpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dERvZXNOb3RFcXVhbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gVXNlckNvbXBhcmF0b3JUeXBlLlN0cmluZztcblxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVJc09uZU9mOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVJc05vdE9uZU9mOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVUZXh0U3RhcnRzV2l0aEFueU9mOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVUZXh0RW5kc1dpdGhBbnlPZjpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dE5vdFN0YXJ0c1dpdGhBbnlPZjpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dE5vdEVuZHNXaXRoQW55T2Y6XG4gICAgICAgICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLlNlbnNpdGl2ZUFycmF5Q29udGFpbnNBbnlPZjpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlQXJyYXlEb2VzTm90Q29udGFpbkFueU9mOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5Jc09uZU9mOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5Jc05vdE9uZU9mOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5UZXh0U3RhcnRzV2l0aEFueU9mOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5UZXh0RW5kc1dpdGhBbnlPZjpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dE5vdFN0YXJ0c1dpdGhBbnlPZjpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dE5vdEVuZHNXaXRoQW55T2Y6XG4gICAgICAgICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLkFycmF5Q29udGFpbnNBbnlPZjpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuQXJyYXlEb2VzTm90Q29udGFpbkFueU9mOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5Db250YWluc0FueU9mOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbkFueU9mOlxuICAgICAgICAgICAgICAgIHJldHVybiBVc2VyQ29tcGFyYXRvclR5cGUuU3RyaW5nTGlzdDtcblxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5OdW1iZXJFcXVhbHM6XG4gICAgICAgICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLk51bWJlckRvZXNOb3RFcXVhbDpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuTnVtYmVyTGVzczpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuTnVtYmVyTGVzc09yRXF1YWxzOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyT3JFcXVhbHM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVzZXJDb21wYXJhdG9yVHlwZS5OdW1iZXI7XG5cbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuU2VtVmVySXNPbmVPZjpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZjpcbiAgICAgICAgICAgICAgICByZXR1cm4gVXNlckNvbXBhcmF0b3JUeXBlLlNlbXZlckxpc3Q7XG5cbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlcjpcbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlck9yRXF1YWxzOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5TZW1WZXJMZXNzOlxuICAgICAgICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5TZW1WZXJMZXNzT3JFcXVhbHM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVzZXJDb21wYXJhdG9yVHlwZS5TZW12ZXI7XG5cbiAgICAgICAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuRGF0ZVRpbWVCZWZvcmU6XG4gICAgICAgICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLkRhdGVUaW1lQWZ0ZXI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVzZXJDb21wYXJhdG9yVHlwZS5EYXRlVGltZTtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29tcGFyYXRvcicpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBnZXRWYWxpZGF0b3JzRm9yU2V0dGluZ1R5cGUoc2V0dGluZ1R5cGU6IFNldHRpbmdUeXBlLCBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zOiBJRmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk6IFZhbGlkYXRvckZuW10ge1xuICAgICAgICBzd2l0Y2ggKHNldHRpbmdUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNldHRpbmdUeXBlLkludDpcbiAgICAgICAgICAgICAgICByZXR1cm4gW3RoaXMudmFsaWRhdGVOdW1iZXJOYW4sIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5taW4oLTIxNDc0ODM2NDgpLCBWYWxpZGF0b3JzLm1heCgyMTQ3NDgzNjQ3KSwgVmFsaWRhdG9ycy5wYXR0ZXJuKHdob2xlTnVtYmVyUmVnZXgpXTtcbiAgICAgICAgICAgIGNhc2UgU2V0dGluZ1R5cGUuRG91YmxlOlxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbG9zcy1vZi1wcmVjaXNpb25cbiAgICAgICAgICAgICAgICByZXR1cm4gW3RoaXMudmFsaWRhdGVOdW1iZXJOYW4sIFZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKC0xLjc5NzY5MzEzNDg2MjMyRSszMDgpLCBWYWxpZGF0b3JzLm1heCgxLjc5NzY5MzEzNDg2MjMyRSszMDgpXTtcbiAgICAgICAgICAgIGNhc2UgU2V0dGluZ1R5cGUuU3RyaW5nOlxuICAgICAgICAgICAgICAgIHJldHVybiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoZmVhdHVyZUZsYWdMaW1pdGF0aW9ucy5tYXhTdHJpbmdGbGFnVmFsdWVMZW5ndGggPz8gMTAwMDAwKV07XG4gICAgICAgICAgICBjYXNlIFNldHRpbmdUeXBlLkJvb2xlYW46XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtWYWxpZGF0b3JzLnJlcXVpcmVkXTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVOdW1iZXJOYW4oYzogRm9ybUNvbnRyb2w8bnVtYmVyPikge1xuICAgICAgICBpZiAoYy52YWx1ZSA9PT0gbnVsbCB8fCBpc05hTihjLnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZU51bWJlck5hbjoge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhbGlkYXRlU2VtVmVyKGM6IEZvcm1Db250cm9sPHN0cmluZz4pIHtcbiAgICAgICAgaWYgKHZhbGlkKGMudmFsdWUpID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlU2VtVmVyOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVFbXB0eVN0cmluZyhjOiBGb3JtQ29udHJvbDxzdHJpbmc+KSB7XG4gICAgICAgIGlmIChjLnZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZVBlcmNlbnRhZ2VTdW0oYzogRm9ybUFycmF5PEZvcm1Hcm91cDxQZXJjZW50YWdlT3B0aW9uRm9ybT4+KSB7XG4gICAgICAgIGlmIChjPy5jb250cm9scy5tYXAoaSA9PiBpLmNvbnRyb2xzLnBlcmNlbnRhZ2UudmFsdWUpLnJlZHVjZSgoYSwgYikgPT4geyByZXR1cm4gYSArIGIgfSwgMCkgIT09IDEwMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZVBlcmNlbnRhZ2VTdW06IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpc1BlcmNlbnRhZ2VPbmx5VGFyZ2V0aW5nUnVsZShmb3JtR3JvdXA6IEZvcm1Hcm91cDxUYXJnZXRpbmdSdWxlRm9ybT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICFmb3JtR3JvdXAuY29udHJvbHMudmFsdWVcbiAgICAgICAgICAgICYmICFmb3JtR3JvdXAuY29udHJvbHMuY29uZGl0aW9ucy5sZW5ndGhcbiAgICAgICAgICAgICYmICEhZm9ybUdyb3VwLmNvbnRyb2xzLnBlcmNlbnRhZ2VPcHRpb25zPy5sZW5ndGg7XG4gICAgfVxuXG4gICAgYWRkQ29tcGFyaXNvblZhbHVlTGlzdFZhbHVlSXRlbXMoXG4gICAgICAgIHVzZXJDb21wYXJhdG9yOiBVc2VyQ29tcGFyYXRvcixcbiAgICAgICAgbGlzdFZhbHVlRm9ybUFycmF5OiBGb3JtQXJyYXk8Rm9ybUdyb3VwPENvbXBhcmlzb25WYWx1ZUxpc3RGb3JtPj4sXG4gICAgICAgIGNvbXBhcmlzb25WYWx1ZUxpc3Q6IElDb21wYXJpc29uVmFsdWVMaXN0TW9kZWxbXSxcbiAgICAgICAgZmVhdHVyZUZsYWdMaW1pdGF0aW9uczogSUZlYXR1cmVGbGFnTGltaXRhdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9XG4gICAgICAgICAgICB0aGlzLmdldENvbXBhcmlzb25WYWx1ZVR5cGUodXNlckNvbXBhcmF0b3IpID09PSBVc2VyQ29tcGFyYXRvclR5cGUuU2VtdmVyTGlzdFxuICAgICAgICAgICAgICAgID8gdGhpcy5nZXRDb21wYXJpc29uVmFsdWVTZW12ZXJMaXN0SXRlbVZhbGlkYXRvcnMoZmVhdHVyZUZsYWdMaW1pdGF0aW9ucylcbiAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0Q29tcGFyaXNvblZhbHVlU3RyaW5nTGlzdEl0ZW1WYWxpZGF0b3JzKGZlYXR1cmVGbGFnTGltaXRhdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IG1heEluZGV4ID0gdGhpcy5nZXROZXh0SW5kZXgobGlzdFZhbHVlRm9ybUFycmF5KTtcblxuICAgICAgICBjb21wYXJpc29uVmFsdWVMaXN0LmZvckVhY2goXG4gICAgICAgICAgICAoY29tcGFyaXNvblZhbHVlTGlzdEl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5nZW5lcmF0ZUNvbXBhcmlzb25WYWx1ZUxpc3RGb3JtR3JvdXAoY29tcGFyaXNvblZhbHVlTGlzdEl0ZW0sIGZhbHNlLCB2YWxpZGF0b3JzLCBtYXhJbmRleCArIGluZGV4KTtcbiAgICAgICAgICAgICAgICBmb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgICAgIGZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgICAgICAgIGZvcm1Hcm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICAgICAgbGlzdFZhbHVlRm9ybUFycmF5LnB1c2goZm9ybUdyb3VwLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBsaXN0VmFsdWVGb3JtQXJyYXkudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICBsaXN0VmFsdWVGb3JtQXJyYXkubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICBsaXN0VmFsdWVGb3JtQXJyYXkubWFya0FzRGlydHkoKTtcbiAgICB9XG59XG4iXX0=
|