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,293 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { Validators } from '@angular/forms';
3
- import { moveItemInArray } from '@angular/cdk/drag-drop';
4
- import { valid } from 'semver';
5
- import { ExpandDialogComponent } from '../../../dialogs/expand-dialog/expand-dialog.component';
6
- import { SettingType, RolloutRuleComparator, SegmentComparator } from 'ng-configcat-publicapi';
7
- import { FormHelper } from '../../../_services/form-helper';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/material/dialog";
10
- import * as i2 from "../../../_services/setting-list-form-helper";
11
- import * as i3 from "@angular/common";
12
- import * as i4 from "@angular/forms";
13
- import * as i5 from "@angular/material/core";
14
- import * as i6 from "@angular/material/input";
15
- import * as i7 from "@angular/material/icon";
16
- import * as i8 from "@angular/material/tooltip";
17
- import * as i9 from "@angular/material/chips";
18
- import * as i10 from "@angular/material/autocomplete";
19
- import * as i11 from "@angular/cdk/drag-drop";
20
- import * as i12 from "../value/value.component";
21
- import * as i13 from "../../../_directives/input-display-normalizer.directive";
22
- export class RolloutRulesComponent {
23
- constructor(dialog, settingListFormHelper) {
24
- this.dialog = dialog;
25
- this.settingListFormHelper = settingListFormHelper;
26
- this.readOnly = false;
27
- this.SettingType = SettingType;
28
- this.defaultComparisonAttributes = ['Identifier', 'Email', 'Country'];
29
- this.rolloutRuleComparators = [
30
- { value: RolloutRuleComparator.IsOneOf, label: 'IS ONE OF (cleartext)' },
31
- { value: RolloutRuleComparator.IsNotOneOf, label: 'IS NOT ONE OF (cleartext)' },
32
- { value: RolloutRuleComparator.Contains, label: 'CONTAINS (cleartext)' },
33
- { value: RolloutRuleComparator.DoesNotContain, label: 'DOES NOT CONTAIN (cleartext)' },
34
- { value: RolloutRuleComparator.SemVerIsOneOf, label: 'IS ONE OF (SemVer)' },
35
- { value: RolloutRuleComparator.SemVerIsNotOneOf, label: 'IS NOT ONE OF (SemVer)' },
36
- { value: RolloutRuleComparator.SemVerLess, label: '< (SemVer)' },
37
- { value: RolloutRuleComparator.SemVerLessOrEquals, label: '<= (SemVer)' },
38
- { value: RolloutRuleComparator.SemVerGreater, label: '> (SemVer)' },
39
- { value: RolloutRuleComparator.SemVerGreaterOrEquals, label: '>= (SemVer)' },
40
- { value: RolloutRuleComparator.NumberEquals, label: '= (Number)' },
41
- { value: RolloutRuleComparator.NumberDoesNotEqual, label: '!= (Number)' },
42
- { value: RolloutRuleComparator.NumberLess, label: '< (Number)' },
43
- { value: RolloutRuleComparator.NumberLessOrEquals, label: '<= (Number)' },
44
- { value: RolloutRuleComparator.NumberGreater, label: '> (Number)' },
45
- { value: RolloutRuleComparator.NumberGreaterOrEquals, label: '>= (Number)' },
46
- { value: RolloutRuleComparator.SensitiveIsOneOf, label: 'IS ONE OF (hashed)' },
47
- { value: RolloutRuleComparator.SensitiveIsNotOneOf, label: 'IS NOT ONE OF (hashed)' },
48
- ];
49
- this.segmentComparators = [
50
- { value: SegmentComparator.IsIn, label: 'IS IN SEGMENT' },
51
- { value: SegmentComparator.IsNotIn, label: 'IS NOT IN SEGMENT' },
52
- ];
53
- }
54
- setting() {
55
- return this.formGroup.get('setting')?.value;
56
- }
57
- rolloutRules() {
58
- return this.formGroup.get('rolloutRules');
59
- }
60
- comparisonAttributes() {
61
- return this.formGroup.root.get('comparisonAttributes')?.value;
62
- }
63
- removeRule(index) {
64
- this.rolloutRules().removeAt(index);
65
- this.rolloutRules().markAsDirty();
66
- }
67
- onDrop(event) {
68
- const rolloutRules = this.rolloutRules().controls;
69
- moveItemInArray(rolloutRules, event.previousIndex, event.currentIndex);
70
- this.formGroup.markAsDirty();
71
- }
72
- attributeChanged(event, comparisonAttribute) {
73
- if (this.defaultComparisonAttributes.indexOf(event.value) !== -1) {
74
- if (comparisonAttribute.value !== event.value) {
75
- comparisonAttribute.setValue(event.value);
76
- this.formGroup.markAsDirty();
77
- }
78
- }
79
- else {
80
- if (comparisonAttribute.value !== '') {
81
- comparisonAttribute.setValue('');
82
- this.formGroup.markAsDirty();
83
- }
84
- }
85
- }
86
- getPlaceHolder(rolloutRule) {
87
- if (!rolloutRule.controls.comparisonAttribute.value) {
88
- return '';
89
- }
90
- switch (rolloutRule.controls.comparator.value) {
91
- case RolloutRuleComparator.IsOneOf:
92
- case RolloutRuleComparator.IsNotOneOf:
93
- case RolloutRuleComparator.SensitiveIsOneOf:
94
- case RolloutRuleComparator.SensitiveIsNotOneOf:
95
- switch (rolloutRule.controls.comparisonAttribute.value.toLowerCase()) {
96
- case 'identifier':
97
- return 'e.g: user_id1, user_id2, user_id3';
98
- case 'email':
99
- return 'e.g: jane@example.com, john@example.com';
100
- case 'country':
101
- return 'e.g: France, Brazil';
102
- default:
103
- return 'e.g: value1, value2, value3';
104
- }
105
- case RolloutRuleComparator.Contains:
106
- case RolloutRuleComparator.DoesNotContain:
107
- switch (rolloutRule.controls.comparisonAttribute.value.toLowerCase()) {
108
- case 'identifier':
109
- return 'part-of-id';
110
- case 'email':
111
- return 'e.g: @example.com';
112
- case 'country':
113
- return 'e.g: United';
114
- default:
115
- return 'e.g: any-part-of-your-value-string';
116
- }
117
- case RolloutRuleComparator.SemVerIsOneOf:
118
- case RolloutRuleComparator.SemVerIsNotOneOf:
119
- return 'e.g: 1.0.0, 2.0.1';
120
- case RolloutRuleComparator.SemVerLessOrEquals:
121
- case RolloutRuleComparator.SemVerLess:
122
- case RolloutRuleComparator.SemVerGreater:
123
- case RolloutRuleComparator.SemVerGreaterOrEquals:
124
- return 'e.g: 1.0.0';
125
- case RolloutRuleComparator.NumberEquals:
126
- case RolloutRuleComparator.NumberDoesNotEqual:
127
- case RolloutRuleComparator.NumberLess:
128
- case RolloutRuleComparator.NumberLessOrEquals:
129
- case RolloutRuleComparator.NumberGreater:
130
- case RolloutRuleComparator.NumberGreaterOrEquals:
131
- return 'e.g: 42';
132
- }
133
- return '';
134
- }
135
- getComparisonValueType(rolloutRule) {
136
- return this.settingListFormHelper.getComparisonValueType(rolloutRule.controls.comparator.value);
137
- }
138
- getInfoClass(rolloutRule) {
139
- if (!rolloutRule.controls.comparisonAttribute.value) {
140
- return 'info';
141
- }
142
- switch (rolloutRule.controls.comparator.value) {
143
- case RolloutRuleComparator.IsOneOf:
144
- case RolloutRuleComparator.IsNotOneOf:
145
- case RolloutRuleComparator.Contains:
146
- case RolloutRuleComparator.DoesNotContain:
147
- return 'warn';
148
- default:
149
- return 'info';
150
- }
151
- }
152
- getInfoTooltip(rolloutRule) {
153
- if (!rolloutRule.controls.comparisonAttribute.value) {
154
- return 'Learn more about comparators';
155
- }
156
- switch (rolloutRule.controls.comparator.value) {
157
- case RolloutRuleComparator.IsOneOf:
158
- case RolloutRuleComparator.IsNotOneOf:
159
- case RolloutRuleComparator.Contains:
160
- case RolloutRuleComparator.DoesNotContain:
161
- return 'Consider using sensitive text comparators. Click to learn more.';
162
- default:
163
- return 'Click to learn more about comparators';
164
- }
165
- }
166
- comparatorChanged(rolloutRule) {
167
- let validators = [];
168
- switch (rolloutRule.controls.comparator.value) {
169
- case RolloutRuleComparator.IsOneOf:
170
- case RolloutRuleComparator.IsNotOneOf:
171
- case RolloutRuleComparator.SensitiveIsOneOf:
172
- case RolloutRuleComparator.SensitiveIsNotOneOf:
173
- case RolloutRuleComparator.Contains:
174
- case RolloutRuleComparator.DoesNotContain:
175
- validators = [Validators.required, Validators.maxLength(65535)];
176
- break;
177
- case RolloutRuleComparator.SemVerIsOneOf:
178
- case RolloutRuleComparator.SemVerIsNotOneOf:
179
- validators = [Validators.required, this.validateSemVerList];
180
- break;
181
- case RolloutRuleComparator.SemVerLessOrEquals:
182
- case RolloutRuleComparator.SemVerLess:
183
- case RolloutRuleComparator.SemVerGreater:
184
- case RolloutRuleComparator.SemVerGreaterOrEquals:
185
- validators = [Validators.required, this.validateSemVer];
186
- break;
187
- case RolloutRuleComparator.NumberEquals:
188
- case RolloutRuleComparator.NumberDoesNotEqual:
189
- case RolloutRuleComparator.NumberLess:
190
- case RolloutRuleComparator.NumberLessOrEquals:
191
- case RolloutRuleComparator.NumberGreater:
192
- case RolloutRuleComparator.NumberGreaterOrEquals:
193
- validators = [Validators.required, Validators.min(-1.79769313486232E+308), Validators.max(1.79769313486232E+308)];
194
- break;
195
- }
196
- rolloutRule.controls.comparisonValue.setValidators(validators);
197
- if (this.getComparisonValueType(rolloutRule) === "number") {
198
- const oldValue = rolloutRule.controls.comparisonValue.value;
199
- rolloutRule.controls.comparisonValue.setValue(FormHelper.normalizeNumberStoredAsString(rolloutRule.controls.comparisonValue.value));
200
- if (oldValue !== rolloutRule.controls.comparisonValue.value) {
201
- rolloutRule.controls.comparisonValue.markAsTouched();
202
- }
203
- }
204
- rolloutRule.controls.comparisonValue.updateValueAndValidity();
205
- }
206
- isListType(rolloutRule) {
207
- switch (rolloutRule.controls.comparator.value) {
208
- case RolloutRuleComparator.IsOneOf:
209
- case RolloutRuleComparator.IsNotOneOf:
210
- case RolloutRuleComparator.SensitiveIsOneOf:
211
- case RolloutRuleComparator.SensitiveIsNotOneOf:
212
- case RolloutRuleComparator.SemVerIsOneOf:
213
- case RolloutRuleComparator.SemVerIsNotOneOf:
214
- return true;
215
- default:
216
- return false;
217
- }
218
- }
219
- validateSemVer(c) {
220
- if (valid(c.value) === null) {
221
- return {
222
- validateSemVer: {
223
- valid: false
224
- }
225
- };
226
- }
227
- return null;
228
- }
229
- validateSemVerList(c) {
230
- if (!c.value) {
231
- return {
232
- validateSemVerList: {
233
- valid: false
234
- }
235
- };
236
- }
237
- const semvers = c.value.split(',').map((s) => s.trim());
238
- if (semvers.find((s) => s && s !== '' && valid(s) === null)) {
239
- return {
240
- validateSemVerList: {
241
- valid: false
242
- }
243
- };
244
- }
245
- return null;
246
- }
247
- popOut(rolloutRule) {
248
- this.dialog.open(ExpandDialogComponent, {
249
- width: '640px',
250
- data: {
251
- control: rolloutRule.controls.comparisonValue,
252
- multiline: this.isListType(rolloutRule)
253
- }
254
- });
255
- }
256
- trackByIndex(index) {
257
- return index;
258
- }
259
- getRolloutRuleValueFormControl(rolloutRule) {
260
- return rolloutRule.controls.value;
261
- }
262
- getRolloutRuleComparisonValueFormControl(rolloutRule) {
263
- return rolloutRule.controls.comparisonValue;
264
- }
265
- getRolloutRuleComparisonAttributeFormControl(rolloutRule) {
266
- return rolloutRule.controls.comparisonAttribute;
267
- }
268
- getRolloutRuleTypeFormControl(rolloutRule) {
269
- return rolloutRule.controls.type;
270
- }
271
- getRolloutRuleComparatorFormControl(rolloutRule) {
272
- return rolloutRule.controls.comparator;
273
- }
274
- getRolloutRuleSegmentComparatorFormControl(rolloutRule) {
275
- return rolloutRule.controls.segmentComparator;
276
- }
277
- getRolloutRuleSegmentIdFormControl(rolloutRule) {
278
- return rolloutRule.controls.segmentId;
279
- }
280
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RolloutRulesComponent, deps: [{ token: i1.MatDialog }, { token: i2.SettingListFormHelper }], target: i0.ɵɵFactoryTarget.Component }); }
281
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RolloutRulesComponent, selector: "configcat-rollout-rules", inputs: { formGroup: "formGroup", readOnly: "readOnly", segments: "segments" }, ngImport: i0, template: "<div [formGroup]=\"formGroup\">\n <div cdkDropList (cdkDropListDropped)=\"onDrop($event)\" [cdkDropListDisabled]=\"readOnly\"\n [cdkDropListData]=\"rolloutRules().controls\">\n <div *ngFor=\"let rolloutRule of rolloutRules().controls; trackBy: trackByIndex; let i = index\" cdkDrag>\n <div class=\"targeting-row\">\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 0\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user's</a>\n </div>\n\n <select class=\"custom-select attribute-select\" matTooltip=\"Comparison attribute\"\n matTooltipPosition=\"above\"\n (change)=\"attributeChanged($event.target, getRolloutRuleComparisonAttributeFormControl(rolloutRule))\"\n [disabled]=\"readOnly\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === getRolloutRuleComparisonAttributeFormControl(rolloutRule).value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) === -1\">\n Custom\n </option>\n </select>\n\n\n <span class=\"attribute-span\" matTooltip=\"Custom user attribute\" matTooltipPosition=\"above\"\n [hidden]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) !== -1\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid\">*</span>\n <input\n [ngClass]=\"{'invalid': getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid}\"\n type=\"text\" matInput [matAutocomplete]=\"auto\"\n [formControl]=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule)\" class=\"attribute\"\n placeholder=\"e.g. Eye color\">\n </span>\n\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let option of comparisonAttributes()\" [value]=\"option\">\n {{option}}\n </mat-option>\n </mat-autocomplete>\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select\" [formControl]=\"getRolloutRuleComparatorFormControl(rolloutRule)\"\n matTooltip=\"Comparator\" matTooltipPosition=\"above\"\n (change)=\"comparatorChanged(rolloutRule)\">\n <optgroup label=\"CONFIDENTIAL TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(16, 18)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(0, 4)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"SEMANTIC VERSION\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(4, 10)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"NUMBER\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(10, 16)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n </select>\n <div [class]=\"getInfoClass(rolloutRule)\" [matTooltip]=\"getInfoTooltip(rolloutRule)\">\n <a href=\"https://configcat.com/docs/advanced/targeting/#comparator\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n <mat-icon>info</mat-icon>\n </a>\n </div>\n </div>\n\n <div class=\"comparison-value\">\n <span class=\"error\"\n *ngIf=\"getRolloutRuleComparisonValueFormControl(rolloutRule).invalid\">*</span>\n\n <input [ngClass]=\"{'invalid': getRolloutRuleComparisonValueFormControl(rolloutRule).invalid}\"\n [formControl]=\"getRolloutRuleComparisonValueFormControl(rolloutRule)\"\n [type]=\"getComparisonValueType(rolloutRule)\" [placeholder]=\"getPlaceHolder(rolloutRule)\"\n matTooltip=\"Comparison value\" matTooltipPosition=\"above\" inputDisplayNormalizer>\n <div class=\"expand\" matTooltip=\"Pop-out Editor\" matTooltipPosition=\"above\"\n (click)=\"popOut(rolloutRule)\" *ngIf=\"getComparisonValueType(rolloutRule)==='text'\">\n <mat-icon>height</mat-icon>\n </div>\n </div>\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 1\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user</a>\n </div>\n\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select segment-comparator\"\n [formControl]=\"getRolloutRuleSegmentComparatorFormControl(rolloutRule)\"\n matTooltip=\"Segment comparator\" matTooltipPosition=\"above\">\n <option *ngFor=\"let comparator of segmentComparators\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </select>\n </div>\n\n <div class=\"select-wrapper\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleSegmentIdFormControl(rolloutRule).invalid\">*</span>\n <select class=\"custom-select segment-select\"\n [formControl]=\"getRolloutRuleSegmentIdFormControl(rolloutRule)\" matTooltip=\"Segment\"\n matTooltipPosition=\"above\"\n [ngClass]=\"{'invalid': getRolloutRuleSegmentIdFormControl(rolloutRule).invalid}\">\n <option *ngFor=\"let segment of segments\" [ngValue]=\"segment.segmentId\">\n {{segment.name}}\n </option>\n </select>\n </div>\n\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n\n <div class=\"value flex\">\n <div class=\"serve\" *ngIf=\"setting().settingType !== SettingType.Boolean\">\n <mat-chip-set>\n <mat-chip class=\"chip\">Serve:</mat-chip>\n </mat-chip-set>\n </div>\n\n <configcat-value class=\"served-value\"\n [valueFormControl]=\"getRolloutRuleValueFormControl(rolloutRule)\" [setting]=\"setting()\">\n </configcat-value>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [".cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}.targeting-row{border:1px solid #d5d5d5;background-color:#fff;margin:1em;display:flex;position:relative;padding:.5em 0}.targeting-row:hover{background-color:#dbedff}.targeting-row .select-wrapper{position:relative}.targeting-row .info{position:absolute;cursor:pointer;top:-8px;left:166px;border-radius:50%;background-color:#fff;height:18px;width:18px}.targeting-row .info a{color:#0068f0;opacity:.5}.targeting-row .info a:hover{opacity:1}.targeting-row .info mat-icon{font-size:18px;height:18px;width:18px}.targeting-row .warn{position:absolute;cursor:pointer;top:-8px;left:166px;height:18px;width:18px;border-radius:50%;background-color:#fff}.targeting-row .warn a{color:#fdc67f}.targeting-row .warn a:hover{color:#ff9200}.targeting-row .warn mat-icon{font-size:18px;height:18px;width:18px}.custom-select{margin-left:.5em;width:170px;background-color:#fff;border:1px solid #e5e5e5;height:30px;min-height:30px;line-height:30px;min-width:170px;font-size:.8em;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.custom-select:focus{outline-color:#e5e5e5;outline-offset:-1px}.fields{justify-content:left;max-width:1060px;flex-grow:100}.fields .if{display:flex;align-items:center}.fields .if>*{margin:0 .5em}.fields .if .spacing{margin-right:41px}.fields .if .user-link{width:40px}.fields .if .chip{font-size:12px;background-color:#67b1fc3d}.fields .attribute-span{margin-left:.5em;display:flex;align-items:center}.fields .attribute-span[hidden]{display:none}.fields .attribute{width:170px;background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;flex-grow:100;min-width:170px;padding:0 30px 0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300;font-size:13.3px}.fields .invalid{border:1px solid #ff5252}.fields .attribute-error{color:#ff5252;margin:0 5px}.fields .delete{position:absolute;cursor:pointer;top:-9px;right:-10px;z-index:999;border-radius:50%;background-color:#fff;height:20px;width:20px;color:#ed5251}.fields .delete mat-icon{font-size:20px;height:20px;width:20px;opacity:.5}.fields .delete:hover mat-icon{opacity:1}.fields .drag-handle{position:absolute;cursor:-webkit-grab;cursor:-moz-grab;left:-20px;top:14px}.fields .drag-handle mat-icon{font-size:20px}.fields .attribute-select{min-width:100px;width:100px;margin-left:0}.fields .segment-comparator,.fields .segment-select{margin-left:0;margin-right:.5em}.fields .segment-more mat-icon{position:relative;top:3px;cursor:pointer;font-size:16px;height:16px;width:16px;color:#797979;margin-top:3px}.fields .comparison-value{flex-grow:100;min-width:150px;display:flex;align-items:center;margin-left:.5em;margin-right:.5em}.fields .comparison-value .error{color:#ff5252;margin:0 5px}.fields .comparison-value input{background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;min-width:150px;flex-grow:100;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .comparison-value input[type=text]{padding-right:30px}.fields .comparison-value input:focus{outline-color:#e5e5e5;outline-offset:-1px}.fields .comparison-value .invalid{border:1px solid #ff5252}.fields .comparison-value .expand{position:relative;height:24px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.fields .comparison-value .expand mat-icon{transform:rotate(45deg)}.value{margin-left:auto;flex-wrap:nowrap}.value .serve{margin:0 2px 0 5px}.value .serve .chip{font-size:12px;background-color:#67b1fc3d}.value .served-value{margin:3px 0}.flex{display:flex;flex-wrap:wrap;align-items:center}@media (max-width: 1200px){.targeting-row{flex-wrap:wrap}.targeting-row .fields{max-width:500px}}@media (max-width: 920px){.value .served-value{margin:3px 7px 3px 0}.targeting-row .fields .drag-handle{left:-18px}}@media (max-width: 410px){.value .served-value{margin:7px 7px 3px 4px}}@media (max-width: 510px){.fields .comparison-value .error{display:none}}@media (max-width: 650px){.targeting-row{flex-direction:column}.targeting-row .help{left:161px}.targeting-row .fields{flex-direction:column;align-items:stretch}.targeting-row .fields .custom-select{margin:7px 7px 0}.targeting-row .fields .comparison-value{margin:7px}.targeting-row .fields .comparison-value input{margin:0 4px 0 0}.targeting-row .fields .attribute-span{margin:7px 7px 0}.targeting-row .fields .if{font-size:12px}.targeting-row .fields .if .spacing{margin-right:3px}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i9.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "component", type: i10.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i11.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i11.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i11.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i12.ValueComponent, selector: "configcat-value", inputs: ["valueFormControl", "setting"] }, { kind: "directive", type: i13.InputDisplayNormalizerDirective, selector: "input[inputDisplayNormalizer]" }] }); }
282
- }
283
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RolloutRulesComponent, decorators: [{
284
- type: Component,
285
- args: [{ selector: 'configcat-rollout-rules', template: "<div [formGroup]=\"formGroup\">\n <div cdkDropList (cdkDropListDropped)=\"onDrop($event)\" [cdkDropListDisabled]=\"readOnly\"\n [cdkDropListData]=\"rolloutRules().controls\">\n <div *ngFor=\"let rolloutRule of rolloutRules().controls; trackBy: trackByIndex; let i = index\" cdkDrag>\n <div class=\"targeting-row\">\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 0\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user's</a>\n </div>\n\n <select class=\"custom-select attribute-select\" matTooltip=\"Comparison attribute\"\n matTooltipPosition=\"above\"\n (change)=\"attributeChanged($event.target, getRolloutRuleComparisonAttributeFormControl(rolloutRule))\"\n [disabled]=\"readOnly\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === getRolloutRuleComparisonAttributeFormControl(rolloutRule).value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) === -1\">\n Custom\n </option>\n </select>\n\n\n <span class=\"attribute-span\" matTooltip=\"Custom user attribute\" matTooltipPosition=\"above\"\n [hidden]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) !== -1\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid\">*</span>\n <input\n [ngClass]=\"{'invalid': getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid}\"\n type=\"text\" matInput [matAutocomplete]=\"auto\"\n [formControl]=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule)\" class=\"attribute\"\n placeholder=\"e.g. Eye color\">\n </span>\n\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let option of comparisonAttributes()\" [value]=\"option\">\n {{option}}\n </mat-option>\n </mat-autocomplete>\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select\" [formControl]=\"getRolloutRuleComparatorFormControl(rolloutRule)\"\n matTooltip=\"Comparator\" matTooltipPosition=\"above\"\n (change)=\"comparatorChanged(rolloutRule)\">\n <optgroup label=\"CONFIDENTIAL TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(16, 18)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(0, 4)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"SEMANTIC VERSION\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(4, 10)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"NUMBER\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(10, 16)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n </select>\n <div [class]=\"getInfoClass(rolloutRule)\" [matTooltip]=\"getInfoTooltip(rolloutRule)\">\n <a href=\"https://configcat.com/docs/advanced/targeting/#comparator\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n <mat-icon>info</mat-icon>\n </a>\n </div>\n </div>\n\n <div class=\"comparison-value\">\n <span class=\"error\"\n *ngIf=\"getRolloutRuleComparisonValueFormControl(rolloutRule).invalid\">*</span>\n\n <input [ngClass]=\"{'invalid': getRolloutRuleComparisonValueFormControl(rolloutRule).invalid}\"\n [formControl]=\"getRolloutRuleComparisonValueFormControl(rolloutRule)\"\n [type]=\"getComparisonValueType(rolloutRule)\" [placeholder]=\"getPlaceHolder(rolloutRule)\"\n matTooltip=\"Comparison value\" matTooltipPosition=\"above\" inputDisplayNormalizer>\n <div class=\"expand\" matTooltip=\"Pop-out Editor\" matTooltipPosition=\"above\"\n (click)=\"popOut(rolloutRule)\" *ngIf=\"getComparisonValueType(rolloutRule)==='text'\">\n <mat-icon>height</mat-icon>\n </div>\n </div>\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 1\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user</a>\n </div>\n\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select segment-comparator\"\n [formControl]=\"getRolloutRuleSegmentComparatorFormControl(rolloutRule)\"\n matTooltip=\"Segment comparator\" matTooltipPosition=\"above\">\n <option *ngFor=\"let comparator of segmentComparators\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </select>\n </div>\n\n <div class=\"select-wrapper\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleSegmentIdFormControl(rolloutRule).invalid\">*</span>\n <select class=\"custom-select segment-select\"\n [formControl]=\"getRolloutRuleSegmentIdFormControl(rolloutRule)\" matTooltip=\"Segment\"\n matTooltipPosition=\"above\"\n [ngClass]=\"{'invalid': getRolloutRuleSegmentIdFormControl(rolloutRule).invalid}\">\n <option *ngFor=\"let segment of segments\" [ngValue]=\"segment.segmentId\">\n {{segment.name}}\n </option>\n </select>\n </div>\n\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n\n <div class=\"value flex\">\n <div class=\"serve\" *ngIf=\"setting().settingType !== SettingType.Boolean\">\n <mat-chip-set>\n <mat-chip class=\"chip\">Serve:</mat-chip>\n </mat-chip-set>\n </div>\n\n <configcat-value class=\"served-value\"\n [valueFormControl]=\"getRolloutRuleValueFormControl(rolloutRule)\" [setting]=\"setting()\">\n </configcat-value>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [".cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}.targeting-row{border:1px solid #d5d5d5;background-color:#fff;margin:1em;display:flex;position:relative;padding:.5em 0}.targeting-row:hover{background-color:#dbedff}.targeting-row .select-wrapper{position:relative}.targeting-row .info{position:absolute;cursor:pointer;top:-8px;left:166px;border-radius:50%;background-color:#fff;height:18px;width:18px}.targeting-row .info a{color:#0068f0;opacity:.5}.targeting-row .info a:hover{opacity:1}.targeting-row .info mat-icon{font-size:18px;height:18px;width:18px}.targeting-row .warn{position:absolute;cursor:pointer;top:-8px;left:166px;height:18px;width:18px;border-radius:50%;background-color:#fff}.targeting-row .warn a{color:#fdc67f}.targeting-row .warn a:hover{color:#ff9200}.targeting-row .warn mat-icon{font-size:18px;height:18px;width:18px}.custom-select{margin-left:.5em;width:170px;background-color:#fff;border:1px solid #e5e5e5;height:30px;min-height:30px;line-height:30px;min-width:170px;font-size:.8em;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.custom-select:focus{outline-color:#e5e5e5;outline-offset:-1px}.fields{justify-content:left;max-width:1060px;flex-grow:100}.fields .if{display:flex;align-items:center}.fields .if>*{margin:0 .5em}.fields .if .spacing{margin-right:41px}.fields .if .user-link{width:40px}.fields .if .chip{font-size:12px;background-color:#67b1fc3d}.fields .attribute-span{margin-left:.5em;display:flex;align-items:center}.fields .attribute-span[hidden]{display:none}.fields .attribute{width:170px;background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;flex-grow:100;min-width:170px;padding:0 30px 0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300;font-size:13.3px}.fields .invalid{border:1px solid #ff5252}.fields .attribute-error{color:#ff5252;margin:0 5px}.fields .delete{position:absolute;cursor:pointer;top:-9px;right:-10px;z-index:999;border-radius:50%;background-color:#fff;height:20px;width:20px;color:#ed5251}.fields .delete mat-icon{font-size:20px;height:20px;width:20px;opacity:.5}.fields .delete:hover mat-icon{opacity:1}.fields .drag-handle{position:absolute;cursor:-webkit-grab;cursor:-moz-grab;left:-20px;top:14px}.fields .drag-handle mat-icon{font-size:20px}.fields .attribute-select{min-width:100px;width:100px;margin-left:0}.fields .segment-comparator,.fields .segment-select{margin-left:0;margin-right:.5em}.fields .segment-more mat-icon{position:relative;top:3px;cursor:pointer;font-size:16px;height:16px;width:16px;color:#797979;margin-top:3px}.fields .comparison-value{flex-grow:100;min-width:150px;display:flex;align-items:center;margin-left:.5em;margin-right:.5em}.fields .comparison-value .error{color:#ff5252;margin:0 5px}.fields .comparison-value input{background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;min-width:150px;flex-grow:100;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .comparison-value input[type=text]{padding-right:30px}.fields .comparison-value input:focus{outline-color:#e5e5e5;outline-offset:-1px}.fields .comparison-value .invalid{border:1px solid #ff5252}.fields .comparison-value .expand{position:relative;height:24px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.fields .comparison-value .expand mat-icon{transform:rotate(45deg)}.value{margin-left:auto;flex-wrap:nowrap}.value .serve{margin:0 2px 0 5px}.value .serve .chip{font-size:12px;background-color:#67b1fc3d}.value .served-value{margin:3px 0}.flex{display:flex;flex-wrap:wrap;align-items:center}@media (max-width: 1200px){.targeting-row{flex-wrap:wrap}.targeting-row .fields{max-width:500px}}@media (max-width: 920px){.value .served-value{margin:3px 7px 3px 0}.targeting-row .fields .drag-handle{left:-18px}}@media (max-width: 410px){.value .served-value{margin:7px 7px 3px 4px}}@media (max-width: 510px){.fields .comparison-value .error{display:none}}@media (max-width: 650px){.targeting-row{flex-direction:column}.targeting-row .help{left:161px}.targeting-row .fields{flex-direction:column;align-items:stretch}.targeting-row .fields .custom-select{margin:7px 7px 0}.targeting-row .fields .comparison-value{margin:7px}.targeting-row .fields .comparison-value input{margin:0 4px 0 0}.targeting-row .fields .attribute-span{margin:7px 7px 0}.targeting-row .fields .if{font-size:12px}.targeting-row .fields .if .spacing{margin-right:3px}}\n"] }]
286
- }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.SettingListFormHelper }], propDecorators: { formGroup: [{
287
- type: Input
288
- }], readOnly: [{
289
- type: Input
290
- }], segments: [{
291
- type: Input
292
- }] } });
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbG91dC1ydWxlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvc2V0dGluZy1saXN0L3NldHRpbmcvcm9sbG91dC1ydWxlcy9yb2xsb3V0LXJ1bGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWxpc3Qvc2V0dGluZy9yb2xsb3V0LXJ1bGVzL3JvbGxvdXQtcnVsZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUEwRCxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUUvRixPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFvQixpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBTzVELE1BQU0sT0FBTyxxQkFBcUI7SUF1Q2hDLFlBQ1UsTUFBaUIsRUFDakIscUJBQTRDO1FBRDVDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQXRDN0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUcxQixnQkFBVyxHQUFHLFdBQVcsQ0FBQztRQUUxQixnQ0FBMkIsR0FBRyxDQUFDLFlBQVks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LENBQUM7K0dBNVNVLHFCQUFxQjttR0FBckIscUJBQXFCLCtJQ2ZsQywwdVRBbUtNOzs0RkRwSk8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLHlCQUF5QjtrSEFNMUIsU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtQXJyYXksIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IHZhbGlkIH0gZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IEV4cGFuZERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2RpYWxvZ3MvZXhwYW5kLWRpYWxvZy9leHBhbmQtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgU2V0dGluZ1R5cGUsIFJvbGxvdXRSdWxlQ29tcGFyYXRvciwgU2VnbWVudExpc3RNb2RlbCwgU2VnbWVudENvbXBhcmF0b3IgfSBmcm9tICduZy1jb25maWdjYXQtcHVibGljYXBpJztcbmltcG9ydCB7IFNldHRpbmdMaXN0Rm9ybUhlbHBlciB9IGZyb20gJy4uLy4uLy4uL19zZXJ2aWNlcy9zZXR0aW5nLWxpc3QtZm9ybS1oZWxwZXInO1xuaW1wb3J0IHsgRm9ybUhlbHBlciB9IGZyb20gJy4uLy4uLy4uL19zZXJ2aWNlcy9mb3JtLWhlbHBlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvbmZpZ2NhdC1yb2xsb3V0LXJ1bGVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JvbGxvdXQtcnVsZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yb2xsb3V0LXJ1bGVzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUm9sbG91dFJ1bGVzQ29tcG9uZW50IHtcblxuICBASW5wdXQoKSBmb3JtR3JvdXAhOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBASW5wdXQoKSByZWFkT25seSA9IGZhbHNlO1xuICBASW5wdXQoKSBzZWdtZW50cyE6IFNlZ21lbnRMaXN0TW9kZWxbXTtcblxuICBTZXR0aW5nVHlwZSA9IFNldHRpbmdUeXBlO1xuXG4gIGRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcyA9IFsnSWRlbnRpZmllcicsICdFbWFpbCcsICdDb3VudHJ5J107XG5cbiAgcm9sbG91dFJ1bGVDb21wYXJhdG9ycyA9IFtcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZiwgbGFiZWw6ICdJUyBPTkUgT0YgKGNsZWFydGV4dCknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2YsIGxhYmVsOiAnSVMgTk9UIE9ORSBPRiAoY2xlYXJ0ZXh0KScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuQ29udGFpbnMsIGxhYmVsOiAnQ09OVEFJTlMgKGNsZWFydGV4dCknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLkRvZXNOb3RDb250YWluLCBsYWJlbDogJ0RPRVMgTk9UIENPTlRBSU4gKGNsZWFydGV4dCknIH0sXG5cbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNPbmVPZiwgbGFiZWw6ICdJUyBPTkUgT0YgKFNlbVZlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzTm90T25lT2YsIGxhYmVsOiAnSVMgTk9UIE9ORSBPRiAoU2VtVmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzcywgbGFiZWw6ICc8IChTZW1WZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJMZXNzT3JFcXVhbHMsIGxhYmVsOiAnPD0gKFNlbVZlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXIsIGxhYmVsOiAnPiAoU2VtVmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlck9yRXF1YWxzLCBsYWJlbDogJz49IChTZW1WZXIpJyB9LFxuXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckVxdWFscywgbGFiZWw6ICc9IChOdW1iZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJEb2VzTm90RXF1YWwsIGxhYmVsOiAnIT0gKE51bWJlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckxlc3MsIGxhYmVsOiAnPCAoTnVtYmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzc09yRXF1YWxzLCBsYWJlbDogJzw9IChOdW1iZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyLCBsYWJlbDogJz4gKE51bWJlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXJPckVxdWFscywgbGFiZWw6ICc+PSAoTnVtYmVyKScgfSxcblxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc09uZU9mLCBsYWJlbDogJ0lTIE9ORSBPRiAoaGFzaGVkKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNOb3RPbmVPZiwgbGFiZWw6ICdJUyBOT1QgT05FIE9GIChoYXNoZWQpJyB9LFxuICBdO1xuXG4gIHNlZ21lbnRDb21wYXJhdG9ycyA9IFtcbiAgICB7IHZhbHVlOiBTZWdtZW50Q29tcGFyYXRvci5Jc0luLCBsYWJlbDogJ0lTIElOIFNFR01FTlQnIH0sXG4gICAgeyB2YWx1ZTogU2VnbWVudENvbXBhcmF0b3IuSXNOb3RJbiwgbGFiZWw6ICdJUyBOT1QgSU4gU0VHTUVOVCcgfSxcbiAgXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgc2V0dGluZ0xpc3RGb3JtSGVscGVyOiBTZXR0aW5nTGlzdEZvcm1IZWxwZXIpIHsgfVxuXG4gIHNldHRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldCgnc2V0dGluZycpPy52YWx1ZTtcbiAgfVxuXG4gIHJvbGxvdXRSdWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0KCdyb2xsb3V0UnVsZXMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICB9XG5cbiAgY29tcGFyaXNvbkF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLnJvb3QuZ2V0KCdjb21wYXJpc29uQXR0cmlidXRlcycpPy52YWx1ZTtcbiAgfVxuXG4gIHJlbW92ZVJ1bGUoaW5kZXg6IGFueSkge1xuICAgIHRoaXMucm9sbG91dFJ1bGVzKCkucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMucm9sbG91dFJ1bGVzKCkubWFya0FzRGlydHkoKTtcbiAgfVxuXG4gIG9uRHJvcChldmVudDogYW55KSB7XG4gICAgY29uc3Qgcm9sbG91dFJ1bGVzID0gdGhpcy5yb2xsb3V0UnVsZXMoKS5jb250cm9scztcbiAgICBtb3ZlSXRlbUluQXJyYXkocm9sbG91dFJ1bGVzLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkKGV2ZW50OiBhbnksIGNvbXBhcmlzb25BdHRyaWJ1dGU6IFVudHlwZWRGb3JtQ29udHJvbCkge1xuICAgIGlmICh0aGlzLmRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcy5pbmRleE9mKGV2ZW50LnZhbHVlKSAhPT0gLTEpIHtcbiAgICAgIGlmIChjb21wYXJpc29uQXR0cmlidXRlLnZhbHVlICE9PSBldmVudC52YWx1ZSkge1xuICAgICAgICBjb21wYXJpc29uQXR0cmlidXRlLnNldFZhbHVlKGV2ZW50LnZhbHVlKTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAubWFya0FzRGlydHkoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUgIT09ICcnKSB7XG4gICAgICAgIGNvbXBhcmlzb25BdHRyaWJ1dGUuc2V0VmFsdWUoJycpO1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFBsYWNlSG9sZGVyKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICBpZiAoIXJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpIHtcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc05vdE9uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzTm90T25lT2Y6XG4gICAgICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAnaWRlbnRpZmllcic6XG4gICAgICAgICAgICByZXR1cm4gJ2UuZzogdXNlcl9pZDEsIHVzZXJfaWQyLCB1c2VyX2lkMyc7XG4gICAgICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IGphbmVAZXhhbXBsZS5jb20sIGpvaG5AZXhhbXBsZS5jb20nO1xuICAgICAgICAgIGNhc2UgJ2NvdW50cnknOlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IEZyYW5jZSwgQnJhemlsJztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IHZhbHVlMSwgdmFsdWUyLCB2YWx1ZTMnO1xuICAgICAgICB9XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Db250YWluczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkRvZXNOb3RDb250YWluOlxuICAgICAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ2lkZW50aWZpZXInOlxuICAgICAgICAgICAgcmV0dXJuICdwYXJ0LW9mLWlkJztcbiAgICAgICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgICAgICByZXR1cm4gJ2UuZzogQGV4YW1wbGUuY29tJztcbiAgICAgICAgICBjYXNlICdjb3VudHJ5JzpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiBVbml0ZWQnO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gJ2UuZzogYW55LXBhcnQtb2YteW91ci12YWx1ZS1zdHJpbmcnO1xuICAgICAgICB9XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZjpcbiAgICAgICAgcmV0dXJuICdlLmc6IDEuMC4wLCAyLjAuMSc7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJMZXNzT3JFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJMZXNzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlcjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXJPckVxdWFsczpcbiAgICAgICAgcmV0dXJuICdlLmc6IDEuMC4wJztcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckVxdWFsczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckRvZXNOb3RFcXVhbDpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckxlc3M6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzT3JFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlck9yRXF1YWxzOlxuICAgICAgICByZXR1cm4gJ2UuZzogNDInO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldENvbXBhcmlzb25WYWx1ZVR5cGUocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdMaXN0Rm9ybUhlbHBlci5nZXRDb21wYXJpc29uVmFsdWVUeXBlKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpO1xuICB9XG5cbiAgZ2V0SW5mb0NsYXNzKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICBpZiAoIXJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUpIHtcbiAgICAgIHJldHVybiAnaW5mbyc7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKSB7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkNvbnRhaW5zOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW46XG4gICAgICAgIHJldHVybiAnd2Fybic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2luZm8nO1xuICAgIH1cbiAgfVxuXG4gIGdldEluZm9Ub29sdGlwKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICBpZiAoIXJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUpIHtcbiAgICAgIHJldHVybiAnTGVhcm4gbW9yZSBhYm91dCBjb21wYXJhdG9ycyc7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKSB7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkNvbnRhaW5zOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW46XG4gICAgICAgIHJldHVybiAnQ29uc2lkZXIgdXNpbmcgc2Vuc2l0aXZlIHRleHQgY29tcGFyYXRvcnMuIENsaWNrIHRvIGxlYXJuIG1vcmUuJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnQ2xpY2sgdG8gbGVhcm4gbW9yZSBhYm91dCBjb21wYXJhdG9ycyc7XG4gICAgfVxuICB9XG5cbiAgY29tcGFyYXRvckNoYW5nZWQocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIGxldCB2YWxpZGF0b3JzOiBhbnlbXSA9IFtdO1xuXG4gICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKSB7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc05vdE9uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuQ29udGFpbnM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbjpcbiAgICAgICAgdmFsaWRhdG9ycyA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCg2NTUzNSldO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc05vdE9uZU9mOlxuICAgICAgICB2YWxpZGF0b3JzID0gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMudmFsaWRhdGVTZW1WZXJMaXN0XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJMZXNzT3JFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJMZXNzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlcjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXJPckVxdWFsczpcbiAgICAgICAgdmFsaWRhdG9ycyA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLnZhbGlkYXRlU2VtVmVyXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJEb2VzTm90RXF1YWw6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzc09yRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlcjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXJPckVxdWFsczpcbiAgICAgICAgdmFsaWRhdG9ycyA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigtMS43OTc2OTMxMzQ4NjIzMkUrMzA4KSwgVmFsaWRhdG9ycy5tYXgoMS43OTc2OTMxMzQ4NjIzMkUrMzA4KV07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgIGlmICh0aGlzLmdldENvbXBhcmlzb25WYWx1ZVR5cGUocm9sbG91dFJ1bGUpID09PSBcIm51bWJlclwiKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS52YWx1ZTtcbiAgICAgIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5zZXRWYWx1ZShGb3JtSGVscGVyLm5vcm1hbGl6ZU51bWJlclN0b3JlZEFzU3RyaW5nKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS52YWx1ZSkpO1xuICAgICAgaWYgKG9sZFZhbHVlICE9PSByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUudmFsdWUpIHtcbiAgICAgICAgcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIGlzTGlzdFR5cGUocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc05vdE9uZU9mOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVNlbVZlcihjOiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcblxuICAgIGlmICh2YWxpZChjLnZhbHVlKSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWRhdGVTZW1WZXI6IHtcbiAgICAgICAgICB2YWxpZDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhbGlkYXRlU2VtVmVyTGlzdChjOiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcbiAgICBpZiAoIWMudmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkYXRlU2VtVmVyTGlzdDoge1xuICAgICAgICAgIHZhbGlkOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlbXZlcnMgPSBjLnZhbHVlLnNwbGl0KCcsJykubWFwKChzOiBhbnkpID0+IHMudHJpbSgpKTtcbiAgICBpZiAoc2VtdmVycy5maW5kKChzOiBhbnkpID0+IHMgJiYgcyAhPT0gJycgJiYgdmFsaWQocykgPT09IG51bGwpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZGF0ZVNlbVZlckxpc3Q6IHtcbiAgICAgICAgICB2YWxpZDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHBvcE91dChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgdGhpcy5kaWFsb2cub3BlbihFeHBhbmREaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjQwcHgnLFxuICAgICAgZGF0YToge1xuICAgICAgICBjb250cm9sOiByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUsXG4gICAgICAgIG11bHRpbGluZTogdGhpcy5pc0xpc3RUeXBlKHJvbGxvdXRSdWxlKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVWYWx1ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMudmFsdWUgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZSBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIH1cblxuICBnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVUeXBlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHJldHVybiByb2xsb3V0UnVsZS5jb250cm9scy50eXBlIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlQ29tcGFyYXRvckZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvciBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIH1cblxuICBnZXRSb2xsb3V0UnVsZVNlZ21lbnRDb21wYXJhdG9yRm9ybUNvbnRyb2wocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHJldHVybiByb2xsb3V0UnVsZS5jb250cm9scy5zZWdtZW50Q29tcGFyYXRvciBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIH1cblxuICBnZXRSb2xsb3V0UnVsZVNlZ21lbnRJZEZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMuc2VnbWVudElkIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcbiAgfVxufVxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxuICAgIDxkaXYgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkRyb3AoJGV2ZW50KVwiIFtjZGtEcm9wTGlzdERpc2FibGVkXT1cInJlYWRPbmx5XCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJyb2xsb3V0UnVsZXMoKS5jb250cm9sc1wiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb2xsb3V0UnVsZSBvZiByb2xsb3V0UnVsZXMoKS5jb250cm9sczsgdHJhY2tCeTogdHJhY2tCeUluZGV4OyBsZXQgaSA9IGluZGV4XCIgY2RrRHJhZz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YXJnZXRpbmctcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkcyBmbGV4XCIgKm5nSWY9XCJnZXRSb2xsb3V0UnVsZVR5cGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWUgPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyYWctaGFuZGxlXCIgY2RrRHJhZ0hhbmRsZSBtYXRUb29sdGlwPVwiRHJhZyBoZXJlIHRvIHJlb3JkZXJcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFyZWFkT25seVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLXNldCBbY2xhc3Muc3BhY2luZ109XCJpID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwiY2hpcFwiPnt7IGkgPT09IDAgPyAnSUYnIDogJ0VMU0UgSUYnIH19PC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtc2V0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vY29uZmlnY2F0LmNvbS9kb2NzL2FkdmFuY2VkL3VzZXItb2JqZWN0XCIgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+dXNlcidzPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiY3VzdG9tLXNlbGVjdCBhdHRyaWJ1dGUtc2VsZWN0XCIgbWF0VG9vbHRpcD1cIkNvbXBhcmlzb24gYXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiYXR0cmlidXRlQ2hhbmdlZCgkZXZlbnQudGFyZ2V0LCBnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZWFkT25seVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyaXNvbkF0dHJpYnV0ZSBvZiBkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJjb21wYXJpc29uQXR0cmlidXRlID09PSBnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBhcmlzb25BdHRyaWJ1dGV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWUpID09PSAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdHRyaWJ1dGUtc3BhblwiIG1hdFRvb2x0aXA9XCJDdXN0b20gdXNlciBhdHRyaWJ1dGVcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcy5pbmRleE9mKGdldFJvbGxvdXRSdWxlQ29tcGFyaXNvbkF0dHJpYnV0ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKS52YWx1ZSkgIT09IC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0dHJpYnV0ZS1lcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkuaW52YWxpZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQnOiBnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkuaW52YWxpZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCIgY2xhc3M9XCJhdHRyaWJ1dGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBFeWUgY29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGNvbXBhcmlzb25BdHRyaWJ1dGVzKClcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb259fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiY3VzdG9tLXNlbGVjdFwiIFtmb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZUNvbXBhcmF0b3JGb3JtQ29udHJvbChyb2xsb3V0UnVsZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDb21wYXJhdG9yXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY29tcGFyYXRvckNoYW5nZWQocm9sbG91dFJ1bGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwIGxhYmVsPVwiQ09ORklERU5USUFMIFRFWFRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyYXRvciBvZiByb2xsb3V0UnVsZUNvbXBhcmF0b3JzLnNsaWNlKDE2LCAxOClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJURVhUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygcm9sbG91dFJ1bGVDb21wYXJhdG9ycy5zbGljZSgwLCA0KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJjb21wYXJhdG9yLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBhcmF0b3IubGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIlNFTUFOVElDIFZFUlNJT05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyYXRvciBvZiByb2xsb3V0UnVsZUNvbXBhcmF0b3JzLnNsaWNlKDQsIDEwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJjb21wYXJhdG9yLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBhcmF0b3IubGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIk5VTUJFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb21wYXJhdG9yIG9mIHJvbGxvdXRSdWxlQ29tcGFyYXRvcnMuc2xpY2UoMTAsIDE2KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJjb21wYXJhdG9yLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBhcmF0b3IubGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJnZXRJbmZvQ2xhc3Mocm9sbG91dFJ1bGUpXCIgW21hdFRvb2x0aXBdPVwiZ2V0SW5mb1Rvb2x0aXAocm9sbG91dFJ1bGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vY29uZmlnY2F0LmNvbS9kb2NzL2FkdmFuY2VkL3RhcmdldGluZy8jY29tcGFyYXRvclwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGFyaXNvbi12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25WYWx1ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKS5pbnZhbGlkXCI+Kjwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtuZ0NsYXNzXT1cInsnaW52YWxpZCc6IGdldFJvbGxvdXRSdWxlQ29tcGFyaXNvblZhbHVlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImdldENvbXBhcmlzb25WYWx1ZVR5cGUocm9sbG91dFJ1bGUpXCIgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlSG9sZGVyKHJvbGxvdXRSdWxlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkNvbXBhcmlzb24gdmFsdWVcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIGlucHV0RGlzcGxheU5vcm1hbGl6ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhwYW5kXCIgbWF0VG9vbHRpcD1cIlBvcC1vdXQgRWRpdG9yXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwb3BPdXQocm9sbG91dFJ1bGUpXCIgKm5nSWY9XCJnZXRDb21wYXJpc29uVmFsdWVUeXBlKHJvbGxvdXRSdWxlKT09PSd0ZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5oZWlnaHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWxldGVcIiBtYXRUb29sdGlwPVwiUmVtb3ZlIHRhcmdldGluZyBydWxlXCIgKm5nSWY9XCIhcmVhZE9ubHlcIiAoY2xpY2spPVwicmVtb3ZlUnVsZShpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkcyBmbGV4XCIgKm5nSWY9XCJnZXRSb2xsb3V0UnVsZVR5cGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWUgPT09IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyYWctaGFuZGxlXCIgY2RrRHJhZ0hhbmRsZSBtYXRUb29sdGlwPVwiRHJhZyBoZXJlIHRvIHJlb3JkZXJcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFyZWFkT25seVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLXNldCBbY2xhc3Muc3BhY2luZ109XCJpID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwiY2hpcFwiPnt7IGkgPT09IDAgPyAnSUYnIDogJ0VMU0UgSUYnIH19PC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtc2V0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vY29uZmlnY2F0LmNvbS9kb2NzL2FkdmFuY2VkL3VzZXItb2JqZWN0XCIgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+dXNlcjwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJjdXN0b20tc2VsZWN0IHNlZ21lbnQtY29tcGFyYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldFJvbGxvdXRSdWxlU2VnbWVudENvbXBhcmF0b3JGb3JtQ29udHJvbChyb2xsb3V0UnVsZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJTZWdtZW50IGNvbXBhcmF0b3JcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygc2VnbWVudENvbXBhcmF0b3JzXCIgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBhcmF0b3IubGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdHRyaWJ1dGUtZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Um9sbG91dFJ1bGVTZWdtZW50SWRGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkuaW52YWxpZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiY3VzdG9tLXNlbGVjdCBzZWdtZW50LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldFJvbGxvdXRSdWxlU2VnbWVudElkRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCIgbWF0VG9vbHRpcD1cIlNlZ21lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQnOiBnZXRSb2xsb3V0UnVsZVNlZ21lbnRJZEZvcm1Db250cm9sKHJvbGxvdXRSdWxlKS5pbnZhbGlkfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHNlZ21lbnQgb2Ygc2VnbWVudHNcIiBbbmdWYWx1ZV09XCJzZWdtZW50LnNlZ21lbnRJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NlZ21lbnQubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVsZXRlXCIgbWF0VG9vbHRpcD1cIlJlbW92ZSB0YXJnZXRpbmcgcnVsZVwiICpuZ0lmPVwiIXJlYWRPbmx5XCIgKGNsaWNrKT1cInJlbW92ZVJ1bGUoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZlXCIgKm5nSWY9XCJzZXR0aW5nKCkuc2V0dGluZ1R5cGUgIT09IFNldHRpbmdUeXBlLkJvb2xlYW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1zZXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwiY2hpcFwiPlNlcnZlOjwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLXNldD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ2NhdC12YWx1ZSBjbGFzcz1cInNlcnZlZC12YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVGb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZVZhbHVlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCIgW3NldHRpbmddPVwic2V0dGluZygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY29uZmlnY2F0LXZhbHVlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19