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.
Files changed (155) hide show
  1. package/README.md +2 -2
  2. package/fesm2022/ng-configcat-publicapi-ui.mjs +4240 -3534
  3. package/fesm2022/ng-configcat-publicapi-ui.mjs.map +1 -1
  4. package/index.d.ts +476 -3
  5. package/package.json +11 -10
  6. package/src/css/button.scss +83 -0
  7. package/src/css/controls.scss +390 -0
  8. package/src/css/dialog.scss +63 -0
  9. package/src/css/icon.scss +7 -0
  10. package/src/css/slider.scss +82 -0
  11. package/src/css/snackbar.scss +16 -0
  12. package/src/css/table.scss +142 -0
  13. package/src/css/theme.scss +47 -0
  14. package/src/css/tooltip.scss +12 -0
  15. package/src/css/variables.scss +324 -0
  16. package/src/css/vars/auth.scss +24 -0
  17. package/src/css/vars/banner.scss +116 -0
  18. package/src/css/vars/box.scss +48 -0
  19. package/src/css/vars/config-overview.scss +27 -0
  20. package/src/css/vars/flag.scss +146 -0
  21. package/src/css/vars/header.scss +24 -0
  22. package/src/css/vars/icon.scss +33 -0
  23. package/src/css/vars/logo.scss +19 -0
  24. package/src/css/vars/notification.scss +38 -0
  25. package/src/css/vars/overview.scss +51 -0
  26. package/src/css/vars/prism.scss +44 -0
  27. package/src/css/vars/sidenav.scss +42 -0
  28. package/src/css/vars/theme.scss +78 -0
  29. package/src/public-api.scss +208 -0
  30. package/esm2022/lib/_directives/index.mjs +0 -2
  31. package/esm2022/lib/_directives/input-display-normalizer.directive.mjs +0 -38
  32. package/esm2022/lib/_models/deleteSettingModel.mjs +0 -2
  33. package/esm2022/lib/_models/flag-state.mjs +0 -2
  34. package/esm2022/lib/_models/index.mjs +0 -4
  35. package/esm2022/lib/_models/setting-value-formgroup.mjs +0 -2
  36. package/esm2022/lib/_models/settingValuesModel.mjs +0 -2
  37. package/esm2022/lib/_models/updateSettingValuesModel.mjs +0 -2
  38. package/esm2022/lib/_models/user-comparator.mjs +0 -100
  39. package/esm2022/lib/_services/app-data-adapter.mjs +0 -18
  40. package/esm2022/lib/_services/comparison-value-list-helper.mjs +0 -72
  41. package/esm2022/lib/_services/date-helper.mjs +0 -56
  42. package/esm2022/lib/_services/form-generator.mjs +0 -359
  43. package/esm2022/lib/_services/form-helper.mjs +0 -163
  44. package/esm2022/lib/_services/index.mjs +0 -3
  45. package/esm2022/lib/_services/messaging.service.mjs +0 -26
  46. package/esm2022/lib/_services/platform-helper.mjs +0 -7
  47. package/esm2022/lib/_services/public-api.service.mjs +0 -77
  48. package/esm2022/lib/_services/setting-list-form-helper.mjs +0 -171
  49. package/esm2022/lib/_services/tracking.directive.mjs +0 -16
  50. package/esm2022/lib/ace-editor/ace-editor.component.mjs +0 -137
  51. package/esm2022/lib/authorization/authorization.component.mjs +0 -62
  52. package/esm2022/lib/base/base-select.component.mjs +0 -27
  53. package/esm2022/lib/base/base.component.mjs +0 -48
  54. package/esm2022/lib/bootstrap.mjs +0 -11
  55. package/esm2022/lib/configuration.mjs +0 -14
  56. package/esm2022/lib/dialogs/confirmation-dialog/confirmation-dialog.mjs +0 -28
  57. package/esm2022/lib/dialogs/delete-setting-dialog/delete-setting-dialog.component.mjs +0 -27
  58. package/esm2022/lib/dialogs/expand-dialog/expand-dialog.component.mjs +0 -80
  59. package/esm2022/lib/dialogs/info-dialog/info-dialog.mjs +0 -29
  60. package/esm2022/lib/dialogs/reason-dialog/reason-dialog.component.mjs +0 -36
  61. package/esm2022/lib/dialogs/reroute-dialog/reroute-dialog.mjs +0 -28
  62. package/esm2022/lib/dialogs/save-snackbar/save-snackbar.component.mjs +0 -14
  63. package/esm2022/lib/ng-configcat-publicapi-ui.module.mjs +0 -288
  64. package/esm2022/lib/selects/config-select/config-select.component.mjs +0 -60
  65. package/esm2022/lib/selects/environment-select/environment-select.component.mjs +0 -47
  66. package/esm2022/lib/selects/product-select/product-select.component.mjs +0 -40
  67. package/esm2022/lib/selects/setting-select/setting-select.component.mjs +0 -47
  68. package/esm2022/lib/setting-item/setting-item.component.mjs +0 -118
  69. package/esm2022/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.mjs +0 -81
  70. package/esm2022/lib/setting-list/setting/rollout-rules/rollout-rules.component.mjs +0 -293
  71. package/esm2022/lib/setting-list/setting/setting.component.mjs +0 -136
  72. package/esm2022/lib/setting-list/setting/value/value.component.mjs +0 -37
  73. package/esm2022/lib/setting-list/setting-list.component.mjs +0 -194
  74. package/esm2022/lib/v2/feature-flag/date-time-picker/date-time-picker.component.mjs +0 -123
  75. package/esm2022/lib/v2/feature-flag/dependees-dialog/dependees-dialog.component.mjs +0 -30
  76. package/esm2022/lib/v2/feature-flag/evaluation-formula/evaluation-formula.component.mjs +0 -220
  77. package/esm2022/lib/v2/feature-flag/evaluation-formula/feature-flag-value/feature-flag-value.component.mjs +0 -61
  78. package/esm2022/lib/v2/feature-flag/evaluation-formula/popout-text-editor-dialog/popout-text-editor-dialog.component.mjs +0 -72
  79. package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/condition-chip/condition-chip.component.mjs +0 -25
  80. package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/conditions.component.mjs +0 -105
  81. package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.mjs +0 -75
  82. package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.mjs +0 -48
  83. package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.mjs +0 -113
  84. 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
  85. package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.mjs +0 -444
  86. package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.mjs +0 -84
  87. package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/targeting-rule.component.mjs +0 -129
  88. package/esm2022/lib/v2/feature-flag/feature-flag.component.mjs +0 -190
  89. package/esm2022/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.mjs +0 -65
  90. package/esm2022/lib/v2/feature-flag-item.component.mjs +0 -330
  91. package/esm2022/ng-configcat-publicapi-ui.mjs +0 -5
  92. package/esm2022/public-api.mjs +0 -15
  93. package/lib/_directives/index.d.ts +0 -1
  94. package/lib/_directives/input-display-normalizer.directive.d.ts +0 -13
  95. package/lib/_models/deleteSettingModel.d.ts +0 -6
  96. package/lib/_models/flag-state.d.ts +0 -20
  97. package/lib/_models/index.d.ts +0 -3
  98. package/lib/_models/setting-value-formgroup.d.ts +0 -69
  99. package/lib/_models/settingValuesModel.d.ts +0 -11
  100. package/lib/_models/updateSettingValuesModel.d.ts +0 -7
  101. package/lib/_models/user-comparator.d.ts +0 -84
  102. package/lib/_services/app-data-adapter.d.ts +0 -7
  103. package/lib/_services/comparison-value-list-helper.d.ts +0 -17
  104. package/lib/_services/date-helper.d.ts +0 -6
  105. package/lib/_services/form-generator.d.ts +0 -59
  106. package/lib/_services/form-helper.d.ts +0 -21
  107. package/lib/_services/index.d.ts +0 -2
  108. package/lib/_services/messaging.service.d.ts +0 -12
  109. package/lib/_services/platform-helper.d.ts +0 -3
  110. package/lib/_services/public-api.service.d.ts +0 -21
  111. package/lib/_services/setting-list-form-helper.d.ts +0 -19
  112. package/lib/_services/tracking.directive.d.ts +0 -6
  113. package/lib/ace-editor/ace-editor.component.d.ts +0 -32
  114. package/lib/authorization/authorization.component.d.ts +0 -21
  115. package/lib/base/base-select.component.d.ts +0 -10
  116. package/lib/base/base.component.d.ts +0 -18
  117. package/lib/bootstrap.d.ts +0 -13
  118. package/lib/configuration.d.ts +0 -9
  119. package/lib/dialogs/confirmation-dialog/confirmation-dialog.d.ts +0 -19
  120. package/lib/dialogs/delete-setting-dialog/delete-setting-dialog.component.d.ts +0 -17
  121. package/lib/dialogs/expand-dialog/expand-dialog.component.d.ts +0 -25
  122. package/lib/dialogs/info-dialog/info-dialog.d.ts +0 -17
  123. package/lib/dialogs/reason-dialog/reason-dialog.component.d.ts +0 -15
  124. package/lib/dialogs/reroute-dialog/reroute-dialog.d.ts +0 -20
  125. package/lib/dialogs/save-snackbar/save-snackbar.component.d.ts +0 -8
  126. package/lib/ng-configcat-publicapi-ui.module.d.ts +0 -75
  127. package/lib/selects/config-select/config-select.component.d.ts +0 -17
  128. package/lib/selects/environment-select/environment-select.component.d.ts +0 -17
  129. package/lib/selects/product-select/product-select.component.d.ts +0 -14
  130. package/lib/selects/setting-select/setting-select.component.d.ts +0 -17
  131. package/lib/setting-item/setting-item.component.d.ts +0 -37
  132. package/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.d.ts +0 -27
  133. package/lib/setting-list/setting/rollout-rules/rollout-rules.component.d.ts +0 -61
  134. package/lib/setting-list/setting/setting.component.d.ts +0 -43
  135. package/lib/setting-list/setting/value/value.component.d.ts +0 -20
  136. package/lib/setting-list/setting-list.component.d.ts +0 -53
  137. package/lib/v2/feature-flag/date-time-picker/date-time-picker.component.d.ts +0 -25
  138. package/lib/v2/feature-flag/dependees-dialog/dependees-dialog.component.d.ts +0 -27
  139. package/lib/v2/feature-flag/evaluation-formula/evaluation-formula.component.d.ts +0 -41
  140. package/lib/v2/feature-flag/evaluation-formula/feature-flag-value/feature-flag-value.component.d.ts +0 -18
  141. package/lib/v2/feature-flag/evaluation-formula/popout-text-editor-dialog/popout-text-editor-dialog.component.d.ts +0 -30
  142. package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/condition-chip/condition-chip.component.d.ts +0 -10
  143. package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/conditions.component.d.ts +0 -27
  144. package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.d.ts +0 -36
  145. package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.d.ts +0 -21
  146. package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.d.ts +0 -79
  147. 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
  148. package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.d.ts +0 -94
  149. package/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.d.ts +0 -31
  150. package/lib/v2/feature-flag/evaluation-formula/targeting-rule/targeting-rule.component.d.ts +0 -33
  151. package/lib/v2/feature-flag/feature-flag.component.d.ts +0 -49
  152. package/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.d.ts +0 -28
  153. package/lib/v2/feature-flag-item.component.d.ts +0 -66
  154. package/public-api.d.ts +0 -11
  155. 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=