@alauda-fe/crd-form 0.0.1

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 (95) hide show
  1. package/esm2022/alauda-fe-crd-form.mjs +5 -0
  2. package/esm2022/lib/abstract/base-array.mjs +117 -0
  3. package/esm2022/lib/crd-form/component.mjs +334 -0
  4. package/esm2022/lib/crd-form/helper.mjs +32 -0
  5. package/esm2022/lib/crd-form.module.mjs +117 -0
  6. package/esm2022/lib/field-controls/expressions/expression-core.mjs +2 -0
  7. package/esm2022/lib/field-controls/expressions/props-expression.mjs +58 -0
  8. package/esm2022/lib/field-controls/form-item.component.mjs +121 -0
  9. package/esm2022/lib/field-controls/index.mjs +8 -0
  10. package/esm2022/lib/field-controls/module.mjs +141 -0
  11. package/esm2022/lib/field-controls/operand-advanced-field-group.component.mjs +80 -0
  12. package/esm2022/lib/field-controls/operand-array-field-group.component.mjs +112 -0
  13. package/esm2022/lib/field-controls/operand-field-group.component.mjs +98 -0
  14. package/esm2022/lib/field-controls/operand-field.component.mjs +870 -0
  15. package/esm2022/lib/field-controls/widgets/array-table/component.mjs +109 -0
  16. package/esm2022/lib/field-controls/widgets/basic-auth-secret/component.mjs +116 -0
  17. package/esm2022/lib/field-controls/widgets/basic-auth-secret/create/component.mjs +211 -0
  18. package/esm2022/lib/field-controls/widgets/basic-auth-secret/type.mjs +2 -0
  19. package/esm2022/lib/field-controls/widgets/index.mjs +8 -0
  20. package/esm2022/lib/field-controls/widgets/k8s-resource-prefix/component.mjs +169 -0
  21. package/esm2022/lib/field-controls/widgets/k8s-resource-prefix/util.mjs +40 -0
  22. package/esm2022/lib/field-controls/widgets/link/component.mjs +68 -0
  23. package/esm2022/lib/field-controls/widgets/resource-requirements/resource-requirements.component.mjs +524 -0
  24. package/esm2022/lib/field-controls/widgets/utils.mjs +73 -0
  25. package/esm2022/lib/field-controls/widgets/yaml-editor/yaml-editor.component.mjs +94 -0
  26. package/esm2022/lib/field-widgets/htpasswd/component.mjs +35 -0
  27. package/esm2022/lib/field-widgets/htpasswd/form.mjs +171 -0
  28. package/esm2022/lib/field-widgets/htpasswd/index.mjs +4 -0
  29. package/esm2022/lib/field-widgets/htpasswd/module.mjs +54 -0
  30. package/esm2022/lib/field-widgets/index.mjs +2 -0
  31. package/esm2022/lib/remote-widgets/constants.mjs +4 -0
  32. package/esm2022/lib/remote-widgets/index.mjs +4 -0
  33. package/esm2022/lib/remote-widgets/remote-widget.service.mjs +42 -0
  34. package/esm2022/lib/remote-widgets/token.mjs +7 -0
  35. package/esm2022/lib/spec-descriptors/capability/capability.component.mjs +139 -0
  36. package/esm2022/lib/spec-descriptors/capability-list/capability-list.component.mjs +189 -0
  37. package/esm2022/lib/spec-descriptors/index.mjs +4 -0
  38. package/esm2022/lib/spec-descriptors/util.mjs +13 -0
  39. package/esm2022/lib/types/index.mjs +73 -0
  40. package/esm2022/lib/utils/capability.mjs +295 -0
  41. package/esm2022/lib/utils/constant.mjs +22 -0
  42. package/esm2022/lib/utils/directives.mjs +19 -0
  43. package/esm2022/lib/utils/helper.mjs +201 -0
  44. package/esm2022/lib/utils/index.mjs +7 -0
  45. package/esm2022/lib/utils/service-model.mjs +12 -0
  46. package/esm2022/lib/utils/util.mjs +310 -0
  47. package/esm2022/public-api.mjs +13 -0
  48. package/index.d.ts +5 -0
  49. package/lib/abstract/base-array.d.ts +31 -0
  50. package/lib/crd-form/component.d.ts +61 -0
  51. package/lib/crd-form/helper.d.ts +7 -0
  52. package/lib/crd-form.module.d.ts +16 -0
  53. package/lib/field-controls/expressions/expression-core.d.ts +6 -0
  54. package/lib/field-controls/expressions/props-expression.d.ts +36 -0
  55. package/lib/field-controls/form-item.component.d.ts +11 -0
  56. package/lib/field-controls/index.d.ts +7 -0
  57. package/lib/field-controls/module.d.ts +23 -0
  58. package/lib/field-controls/operand-advanced-field-group.component.d.ts +16 -0
  59. package/lib/field-controls/operand-array-field-group.component.d.ts +8 -0
  60. package/lib/field-controls/operand-field-group.component.d.ts +24 -0
  61. package/lib/field-controls/operand-field.component.d.ts +110 -0
  62. package/lib/field-controls/widgets/array-table/component.d.ts +8 -0
  63. package/lib/field-controls/widgets/basic-auth-secret/component.d.ts +26 -0
  64. package/lib/field-controls/widgets/basic-auth-secret/create/component.d.ts +45 -0
  65. package/lib/field-controls/widgets/basic-auth-secret/type.d.ts +11 -0
  66. package/lib/field-controls/widgets/index.d.ts +7 -0
  67. package/lib/field-controls/widgets/k8s-resource-prefix/component.d.ts +35 -0
  68. package/lib/field-controls/widgets/k8s-resource-prefix/util.d.ts +3 -0
  69. package/lib/field-controls/widgets/link/component.d.ts +20 -0
  70. package/lib/field-controls/widgets/resource-requirements/resource-requirements.component.d.ts +88 -0
  71. package/lib/field-controls/widgets/utils.d.ts +17 -0
  72. package/lib/field-controls/widgets/yaml-editor/yaml-editor.component.d.ts +36 -0
  73. package/lib/field-widgets/htpasswd/component.d.ts +9 -0
  74. package/lib/field-widgets/htpasswd/form.d.ts +32 -0
  75. package/lib/field-widgets/htpasswd/index.d.ts +3 -0
  76. package/lib/field-widgets/htpasswd/module.d.ts +13 -0
  77. package/lib/field-widgets/index.d.ts +1 -0
  78. package/lib/remote-widgets/constants.d.ts +3 -0
  79. package/lib/remote-widgets/index.d.ts +3 -0
  80. package/lib/remote-widgets/remote-widget.service.d.ts +28 -0
  81. package/lib/remote-widgets/token.d.ts +3 -0
  82. package/lib/spec-descriptors/capability/capability.component.d.ts +20 -0
  83. package/lib/spec-descriptors/capability-list/capability-list.component.d.ts +34 -0
  84. package/lib/spec-descriptors/index.d.ts +3 -0
  85. package/lib/spec-descriptors/util.d.ts +4 -0
  86. package/lib/types/index.d.ts +122 -0
  87. package/lib/utils/capability.d.ts +54 -0
  88. package/lib/utils/constant.d.ts +12 -0
  89. package/lib/utils/directives.d.ts +9 -0
  90. package/lib/utils/helper.d.ts +61 -0
  91. package/lib/utils/index.d.ts +6 -0
  92. package/lib/utils/service-model.d.ts +44 -0
  93. package/lib/utils/util.d.ts +48 -0
  94. package/package.json +30 -0
  95. package/public-api.d.ts +9 -0
@@ -0,0 +1,524 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { bind, formatCPU, formatMemory, getResourceValue, getResourceViewModel, initGreaterValidator, RESOURCE_MAC_TYPES, resourceUnits, transferResource, TranslateService, } from '@alauda-fe/common';
3
+ import { ChangeDetectionStrategy, Component, Injector, Input, Optional, } from '@angular/core';
4
+ import { ControlContainer, } from '@angular/forms';
5
+ import { merge, omit, isEmpty } from 'lodash-es';
6
+ import { BaseResourceFormGroupComponent } from 'ng-resource-form-util';
7
+ import { getFieldDescription, getFieldDisplayName } from '../../../utils';
8
+ import { OperandFieldComponent } from '../../operand-field.component';
9
+ import { resolveRequirementsRequiredOptions, resolveRequirementsMinOrMaxOptions, } from '../utils';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../../operand-field.component";
12
+ import * as i2 from "@angular/forms";
13
+ import * as i3 from "@alauda-fe/common";
14
+ import * as i4 from "@angular/common";
15
+ import * as i5 from "@alauda/ui";
16
+ const _c0 = a0 => ({ "tw-required-mark": a0 });
17
+ const _c1 = (a0, a1, a2) => [a0, a1, "min", "cpu", a2];
18
+ const _c2 = (a0, a1, a2) => [a0, a1, "max", "cpu", a2];
19
+ const _c3 = (a0, a1) => ({ min: a0, max: a1 });
20
+ const _c4 = (a0, a1, a2) => [a0, a1, "min", "memory", a2];
21
+ const _c5 = (a0, a1, a2) => [a0, a1, "max", "memory", a2];
22
+ const _c6 = (a0, a1, a2) => ({ cpu_max: a0, min: a1, max: a2 });
23
+ const _c7 = (a0, a1, a2) => ({ memory_max: a0, min: a1, max: a2 });
24
+ function ResourceRequirementsComponent_form_0_aui_option_13_Template(rf, ctx) { if (rf & 1) {
25
+ i0.ɵɵelementStart(0, "aui-option", 17);
26
+ i0.ɵɵpipe(1, "translate");
27
+ i0.ɵɵtext(2);
28
+ i0.ɵɵpipe(3, "translate");
29
+ i0.ɵɵelementEnd();
30
+ } if (rf & 2) {
31
+ const unit_r1 = ctx.$implicit;
32
+ i0.ɵɵproperty("value", unit_r1.value)("label", i0.ɵɵpipeBind1(1, 3, unit_r1.label));
33
+ i0.ɵɵadvance(2);
34
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 5, unit_r1.label), " ");
35
+ } }
36
+ function ResourceRequirementsComponent_form_0_acl_errors_mapper_14_Template(rf, ctx) { if (rf & 1) {
37
+ i0.ɵɵelement(0, "acl-errors-mapper", 18);
38
+ i0.ɵɵpipe(1, "pure");
39
+ i0.ɵɵpipe(2, "pure");
40
+ } if (rf & 2) {
41
+ const ctx_r1 = i0.ɵɵnextContext(2);
42
+ i0.ɵɵproperty("errors", ctx_r1.form.get("requests.cpu.value").errors)("errorsMapper", i0.ɵɵpureFunction2(22, _c3, i0.ɵɵpipeBindV(1, 2, i0.ɵɵpureFunction3(14, _c1, ctx_r1.requestCpuMin, ctx_r1.getMinOrMaxErrorsMapper, ctx_r1.translate.locale)), i0.ɵɵpipeBindV(2, 8, i0.ɵɵpureFunction3(18, _c2, ctx_r1.requestCpuMax, ctx_r1.getMinOrMaxErrorsMapper, ctx_r1.translate.locale))));
43
+ } }
44
+ function ResourceRequirementsComponent_form_0_aui_option_23_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "aui-option", 19);
46
+ i0.ɵɵtext(1);
47
+ i0.ɵɵelementEnd();
48
+ } if (rf & 2) {
49
+ const unit_r3 = ctx.$implicit;
50
+ i0.ɵɵproperty("value", unit_r3);
51
+ i0.ɵɵadvance();
52
+ i0.ɵɵtextInterpolate1(" ", unit_r3, " ");
53
+ } }
54
+ function ResourceRequirementsComponent_form_0_acl_errors_mapper_24_Template(rf, ctx) { if (rf & 1) {
55
+ i0.ɵɵelement(0, "acl-errors-mapper", 18);
56
+ i0.ɵɵpipe(1, "pure");
57
+ i0.ɵɵpipe(2, "pure");
58
+ } if (rf & 2) {
59
+ const ctx_r1 = i0.ɵɵnextContext(2);
60
+ i0.ɵɵproperty("errors", ctx_r1.form.get("requests.memory.value").errors)("errorsMapper", i0.ɵɵpureFunction2(22, _c3, i0.ɵɵpipeBindV(1, 2, i0.ɵɵpureFunction3(14, _c4, ctx_r1.requestMemoryMin, ctx_r1.getMinOrMaxErrorsMapper, ctx_r1.translate.locale)), i0.ɵɵpipeBindV(2, 8, i0.ɵɵpureFunction3(18, _c5, ctx_r1.requestMemoryMax, ctx_r1.getMinOrMaxErrorsMapper, ctx_r1.translate.locale))));
61
+ } }
62
+ function ResourceRequirementsComponent_form_0_aui_option_37_Template(rf, ctx) { if (rf & 1) {
63
+ i0.ɵɵelementStart(0, "aui-option", 17);
64
+ i0.ɵɵpipe(1, "translate");
65
+ i0.ɵɵtext(2);
66
+ i0.ɵɵpipe(3, "translate");
67
+ i0.ɵɵelementEnd();
68
+ } if (rf & 2) {
69
+ const unit_r4 = ctx.$implicit;
70
+ i0.ɵɵproperty("value", unit_r4.value)("label", i0.ɵɵpipeBind1(1, 3, unit_r4.label));
71
+ i0.ɵɵadvance(2);
72
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 5, unit_r4.label), " ");
73
+ } }
74
+ function ResourceRequirementsComponent_form_0_acl_errors_mapper_38_Template(rf, ctx) { if (rf & 1) {
75
+ i0.ɵɵelement(0, "acl-errors-mapper", 18);
76
+ i0.ɵɵpipe(1, "translate");
77
+ i0.ɵɵpipe(2, "pure");
78
+ i0.ɵɵpipe(3, "pure");
79
+ } if (rf & 2) {
80
+ const ctx_r1 = i0.ɵɵnextContext(2);
81
+ i0.ɵɵproperty("errors", ctx_r1.form.get("limits.cpu.value").errors)("errorsMapper", i0.ɵɵpureFunction3(24, _c6, i0.ɵɵpipeBind1(1, 2, "request_greater_than_limits_error"), i0.ɵɵpipeBindV(2, 4, i0.ɵɵpureFunction3(16, _c1, ctx_r1.limitCpuMin, ctx_r1.getMinOrMaxErrorsMapper, ctx_r1.translate.locale)), i0.ɵɵpipeBindV(3, 10, i0.ɵɵpureFunction3(20, _c2, ctx_r1.limitCpuMax, ctx_r1.getMinOrMaxErrorsMapper, ctx_r1.translate.locale))));
82
+ } }
83
+ function ResourceRequirementsComponent_form_0_aui_option_47_Template(rf, ctx) { if (rf & 1) {
84
+ i0.ɵɵelementStart(0, "aui-option", 19);
85
+ i0.ɵɵtext(1);
86
+ i0.ɵɵelementEnd();
87
+ } if (rf & 2) {
88
+ const unit_r5 = ctx.$implicit;
89
+ i0.ɵɵproperty("value", unit_r5);
90
+ i0.ɵɵadvance();
91
+ i0.ɵɵtextInterpolate1(" ", unit_r5, " ");
92
+ } }
93
+ function ResourceRequirementsComponent_form_0_acl_errors_mapper_48_Template(rf, ctx) { if (rf & 1) {
94
+ i0.ɵɵelement(0, "acl-errors-mapper", 18);
95
+ i0.ɵɵpipe(1, "translate");
96
+ i0.ɵɵpipe(2, "pure");
97
+ i0.ɵɵpipe(3, "pure");
98
+ } if (rf & 2) {
99
+ const ctx_r1 = i0.ɵɵnextContext(2);
100
+ i0.ɵɵproperty("errors", ctx_r1.form.get("limits.memory.value").errors)("errorsMapper", i0.ɵɵpureFunction3(24, _c7, i0.ɵɵpipeBind1(1, 2, "request_greater_than_limits_error"), i0.ɵɵpipeBindV(2, 4, i0.ɵɵpureFunction3(16, _c4, ctx_r1.limitMemoryMin, ctx_r1.getMinOrMaxErrorsMapper, ctx_r1.translate.locale)), i0.ɵɵpipeBindV(3, 10, i0.ɵɵpureFunction3(20, _c5, ctx_r1.limitMemoryMax, ctx_r1.getMinOrMaxErrorsMapper, ctx_r1.translate.locale))));
101
+ } }
102
+ function ResourceRequirementsComponent_form_0_Template(rf, ctx) { if (rf & 1) {
103
+ i0.ɵɵelementStart(0, "form", 2)(1, "div", 3)(2, "div", 4);
104
+ i0.ɵɵtext(3);
105
+ i0.ɵɵpipe(4, "translate");
106
+ i0.ɵɵelementEnd();
107
+ i0.ɵɵelementStart(5, "div", 5)(6, "div", 6)(7, "div", 7)(8, "aui-input-group")(9, "div", 8);
108
+ i0.ɵɵtext(10, " CPU ");
109
+ i0.ɵɵelementEnd();
110
+ i0.ɵɵelement(11, "input", 9);
111
+ i0.ɵɵelementStart(12, "aui-select", 10);
112
+ i0.ɵɵtemplate(13, ResourceRequirementsComponent_form_0_aui_option_13_Template, 4, 7, "aui-option", 11);
113
+ i0.ɵɵelementEnd()()();
114
+ i0.ɵɵtemplate(14, ResourceRequirementsComponent_form_0_acl_errors_mapper_14_Template, 3, 25, "acl-errors-mapper", 12);
115
+ i0.ɵɵelementEnd();
116
+ i0.ɵɵelementStart(15, "div", 6)(16, "div", 13)(17, "aui-input-group")(18, "div", 8);
117
+ i0.ɵɵtext(19);
118
+ i0.ɵɵpipe(20, "translate");
119
+ i0.ɵɵelementEnd();
120
+ i0.ɵɵelement(21, "input", 9);
121
+ i0.ɵɵelementStart(22, "aui-select", 10);
122
+ i0.ɵɵtemplate(23, ResourceRequirementsComponent_form_0_aui_option_23_Template, 2, 2, "aui-option", 14);
123
+ i0.ɵɵelementEnd()()();
124
+ i0.ɵɵtemplate(24, ResourceRequirementsComponent_form_0_acl_errors_mapper_24_Template, 3, 25, "acl-errors-mapper", 12);
125
+ i0.ɵɵelementEnd()()();
126
+ i0.ɵɵelementStart(25, "div", 3)(26, "div", 4);
127
+ i0.ɵɵtext(27);
128
+ i0.ɵɵpipe(28, "translate");
129
+ i0.ɵɵelementEnd();
130
+ i0.ɵɵelementStart(29, "div", 15)(30, "div", 6)(31, "div", 16)(32, "aui-input-group")(33, "div", 8);
131
+ i0.ɵɵtext(34, " CPU ");
132
+ i0.ɵɵelementEnd();
133
+ i0.ɵɵelement(35, "input", 9);
134
+ i0.ɵɵelementStart(36, "aui-select", 10);
135
+ i0.ɵɵtemplate(37, ResourceRequirementsComponent_form_0_aui_option_37_Template, 4, 7, "aui-option", 11);
136
+ i0.ɵɵelementEnd()()();
137
+ i0.ɵɵtemplate(38, ResourceRequirementsComponent_form_0_acl_errors_mapper_38_Template, 4, 28, "acl-errors-mapper", 12);
138
+ i0.ɵɵelementEnd();
139
+ i0.ɵɵelementStart(39, "div", 6)(40, "div", 13)(41, "aui-input-group")(42, "div", 8);
140
+ i0.ɵɵtext(43);
141
+ i0.ɵɵpipe(44, "translate");
142
+ i0.ɵɵelementEnd();
143
+ i0.ɵɵelement(45, "input", 9);
144
+ i0.ɵɵelementStart(46, "aui-select", 10);
145
+ i0.ɵɵtemplate(47, ResourceRequirementsComponent_form_0_aui_option_47_Template, 2, 2, "aui-option", 14);
146
+ i0.ɵɵelementEnd()()();
147
+ i0.ɵɵtemplate(48, ResourceRequirementsComponent_form_0_acl_errors_mapper_48_Template, 4, 28, "acl-errors-mapper", 12);
148
+ i0.ɵɵelementEnd()()()();
149
+ } if (rf & 2) {
150
+ let tmp_7_0;
151
+ let tmp_13_0;
152
+ let tmp_19_0;
153
+ let tmp_25_0;
154
+ const ctx_r1 = i0.ɵɵnextContext();
155
+ i0.ɵɵproperty("formGroup", ctx_r1.form);
156
+ i0.ɵɵadvance(3);
157
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 24, "resource_requirements_requests"), " ");
158
+ i0.ɵɵadvance(6);
159
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(32, _c0, ctx_r1.requestCpuRequired));
160
+ i0.ɵɵadvance(2);
161
+ i0.ɵɵproperty("required", ctx_r1.requestCpuRequired);
162
+ i0.ɵɵadvance(2);
163
+ i0.ɵɵproperty("ngForOf", ctx_r1.resourceUnits["cpu"]);
164
+ i0.ɵɵadvance();
165
+ i0.ɵɵproperty("ngIf", ((tmp_7_0 = ctx_r1.form.get("requests.cpu.value")) == null ? null : tmp_7_0.dirty) || (ctx_r1.controlContainer == null ? null : ctx_r1.controlContainer.formDirective == null ? null : ctx_r1.controlContainer.formDirective.submitted));
166
+ i0.ɵɵadvance(2);
167
+ i0.ɵɵproperty("formGroupName", "memory");
168
+ i0.ɵɵadvance(2);
169
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(34, _c0, ctx_r1.requestMemoryRequired));
170
+ i0.ɵɵadvance();
171
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(20, 26, "memory"), " ");
172
+ i0.ɵɵadvance(2);
173
+ i0.ɵɵproperty("required", ctx_r1.requestMemoryRequired);
174
+ i0.ɵɵadvance(2);
175
+ i0.ɵɵproperty("ngForOf", ctx_r1.resourceUnits["memory"]);
176
+ i0.ɵɵadvance();
177
+ i0.ɵɵproperty("ngIf", ((tmp_13_0 = ctx_r1.form.get("requests.memory.value")) == null ? null : tmp_13_0.dirty) || (ctx_r1.controlContainer == null ? null : ctx_r1.controlContainer.formDirective == null ? null : ctx_r1.controlContainer.formDirective.submitted));
178
+ i0.ɵɵadvance(3);
179
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(28, 28, "resource_requirements_limits"), " ");
180
+ i0.ɵɵadvance(4);
181
+ i0.ɵɵproperty("formGroupName", "cpu");
182
+ i0.ɵɵadvance(2);
183
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(36, _c0, ctx_r1.limitCpuRequired));
184
+ i0.ɵɵadvance(2);
185
+ i0.ɵɵproperty("required", ctx_r1.limitCpuRequired);
186
+ i0.ɵɵadvance(2);
187
+ i0.ɵɵproperty("ngForOf", ctx_r1.resourceUnits["cpu"]);
188
+ i0.ɵɵadvance();
189
+ i0.ɵɵproperty("ngIf", ((tmp_19_0 = ctx_r1.form.get("limits.cpu.value")) == null ? null : tmp_19_0.dirty) || (ctx_r1.controlContainer == null ? null : ctx_r1.controlContainer.formDirective == null ? null : ctx_r1.controlContainer.formDirective.submitted));
190
+ i0.ɵɵadvance(2);
191
+ i0.ɵɵproperty("formGroupName", "memory");
192
+ i0.ɵɵadvance(2);
193
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(38, _c0, ctx_r1.limitMemoryRequired));
194
+ i0.ɵɵadvance();
195
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(44, 30, "memory"), " ");
196
+ i0.ɵɵadvance(2);
197
+ i0.ɵɵproperty("required", ctx_r1.limitMemoryRequired);
198
+ i0.ɵɵadvance(2);
199
+ i0.ɵɵproperty("ngForOf", ctx_r1.resourceUnits["memory"]);
200
+ i0.ɵɵadvance();
201
+ i0.ɵɵproperty("ngIf", ((tmp_25_0 = ctx_r1.form.get("limits.memory.value")) == null ? null : tmp_25_0.dirty) || (ctx_r1.controlContainer == null ? null : ctx_r1.controlContainer.formDirective == null ? null : ctx_r1.controlContainer.formDirective.submitted));
202
+ } }
203
+ function ResourceRequirementsComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {
204
+ i0.ɵɵelementStart(0, "div", 20)(1, "div", 21)(2, "label", 22);
205
+ i0.ɵɵtext(3);
206
+ i0.ɵɵpipe(4, "translate");
207
+ i0.ɵɵelementEnd();
208
+ i0.ɵɵelement(5, "aui-icon", 23);
209
+ i0.ɵɵpipe(6, "translate");
210
+ i0.ɵɵelementStart(7, "span", 24);
211
+ i0.ɵɵtext(8);
212
+ i0.ɵɵpipe(9, "pure");
213
+ i0.ɵɵpipe(10, "aclFieldNotAvailable");
214
+ i0.ɵɵpipe(11, "pure");
215
+ i0.ɵɵpipe(12, "translate");
216
+ i0.ɵɵelementEnd();
217
+ i0.ɵɵelement(13, "aui-icon", 25);
218
+ i0.ɵɵpipe(14, "translate");
219
+ i0.ɵɵtext(15);
220
+ i0.ɵɵpipe(16, "pure");
221
+ i0.ɵɵpipe(17, "aclFieldNotAvailable");
222
+ i0.ɵɵelementEnd();
223
+ i0.ɵɵelementStart(18, "div", 21)(19, "label", 22);
224
+ i0.ɵɵtext(20);
225
+ i0.ɵɵpipe(21, "translate");
226
+ i0.ɵɵelementEnd();
227
+ i0.ɵɵelement(22, "aui-icon", 23);
228
+ i0.ɵɵpipe(23, "translate");
229
+ i0.ɵɵelementStart(24, "span", 24);
230
+ i0.ɵɵtext(25);
231
+ i0.ɵɵpipe(26, "pure");
232
+ i0.ɵɵpipe(27, "aclFieldNotAvailable");
233
+ i0.ɵɵpipe(28, "pure");
234
+ i0.ɵɵpipe(29, "translate");
235
+ i0.ɵɵelementEnd();
236
+ i0.ɵɵelement(30, "aui-icon", 25);
237
+ i0.ɵɵpipe(31, "translate");
238
+ i0.ɵɵtext(32);
239
+ i0.ɵɵpipe(33, "pure");
240
+ i0.ɵɵpipe(34, "aclFieldNotAvailable");
241
+ i0.ɵɵelementEnd()();
242
+ } if (rf & 2) {
243
+ const ctx_r1 = i0.ɵɵnextContext();
244
+ i0.ɵɵadvance(3);
245
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 12, "resource_requirements_requests"));
246
+ i0.ɵɵadvance(2);
247
+ i0.ɵɵproperty("title", i0.ɵɵpipeBind1(6, 14, "cpu"));
248
+ i0.ɵɵadvance(3);
249
+ i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(10, 19, i0.ɵɵpipeBind2(9, 16, ctx_r1.form.get("requests").get("cpu").value, ctx_r1.getResourceValue)), "", i0.ɵɵpipeBind1(12, 24, i0.ɵɵpipeBind2(11, 21, ctx_r1.form.get("requests").get("cpu.unit").value, ctx_r1.getCpuUnitLabel)), " ");
250
+ i0.ɵɵadvance(5);
251
+ i0.ɵɵproperty("title", i0.ɵɵpipeBind1(14, 26, "memory"));
252
+ i0.ɵɵadvance(2);
253
+ i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(17, 31, i0.ɵɵpipeBind2(16, 28, ctx_r1.form.get("requests").get("memory").value, ctx_r1.getResourceValue)), " ");
254
+ i0.ɵɵadvance(5);
255
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(21, 33, "resource_requirements_limits"));
256
+ i0.ɵɵadvance(2);
257
+ i0.ɵɵproperty("title", i0.ɵɵpipeBind1(23, 35, "cpu"));
258
+ i0.ɵɵadvance(3);
259
+ i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(27, 40, i0.ɵɵpipeBind2(26, 37, ctx_r1.form.get("limits").get("cpu").value, ctx_r1.getResourceValue)), "", i0.ɵɵpipeBind1(29, 45, i0.ɵɵpipeBind2(28, 42, ctx_r1.form.get("limits").get("cpu.unit").value, ctx_r1.getCpuUnitLabel)), " ");
260
+ i0.ɵɵadvance(5);
261
+ i0.ɵɵproperty("title", i0.ɵɵpipeBind1(31, 47, "memory"));
262
+ i0.ɵɵadvance(2);
263
+ i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(34, 52, i0.ɵɵpipeBind2(33, 49, ctx_r1.form.get("limits").get("memory").value, ctx_r1.getResourceValue)), " ");
264
+ } }
265
+ function handleValidationErrors(valueCtrl, errors) {
266
+ // 这里避免覆盖其它 errors
267
+ const combinedErrors = { ...valueCtrl.errors, ...errors };
268
+ valueCtrl.setErrors(combinedErrors);
269
+ return combinedErrors;
270
+ }
271
+ function valueFormat(type, value) {
272
+ return type === 'cpu' ? formatCPU(value) : formatMemory(value);
273
+ }
274
+ function getCurrentValue(group, type) {
275
+ const valueCtrl = group.get('value');
276
+ const value = valueCtrl.value;
277
+ const unit = group.get('unit').value;
278
+ return valueFormat(type, (value || 0) + unit);
279
+ }
280
+ export class ResourceRequirementsComponent extends BaseResourceFormGroupComponent {
281
+ get requiredOptions() {
282
+ return resolveRequirementsRequiredOptions(this.fieldComponent?.field);
283
+ }
284
+ get limitMemoryRequired() {
285
+ return this.requiredOptions.required?.limit?.includes('memory');
286
+ }
287
+ get limitCpuRequired() {
288
+ return this.requiredOptions.required?.limit?.includes('cpu');
289
+ }
290
+ get requestMemoryRequired() {
291
+ return this.requiredOptions.required?.request?.includes('memory');
292
+ }
293
+ get requestCpuRequired() {
294
+ return this.requiredOptions.required?.request?.includes('cpu');
295
+ }
296
+ get minMaxOptions() {
297
+ return resolveRequirementsMinOrMaxOptions(this.fieldComponent?.field);
298
+ }
299
+ get limitMemoryMin() {
300
+ return this.minMaxOptions.min.limits?.memory;
301
+ }
302
+ get limitCpuMin() {
303
+ return this.minMaxOptions.min.limits?.cpu;
304
+ }
305
+ get requestMemoryMin() {
306
+ return this.minMaxOptions.min.requests?.memory;
307
+ }
308
+ get requestCpuMin() {
309
+ return this.minMaxOptions.min.requests?.cpu;
310
+ }
311
+ get limitMemoryMax() {
312
+ return this.minMaxOptions.max.limits?.memory;
313
+ }
314
+ get limitCpuMax() {
315
+ return this.minMaxOptions.max.limits?.cpu;
316
+ }
317
+ get requestMemoryMax() {
318
+ return this.minMaxOptions.max.requests?.memory;
319
+ }
320
+ get requestCpuMax() {
321
+ return this.minMaxOptions.max.requests?.cpu;
322
+ }
323
+ constructor(injector, fieldComponent, controlContainer, translate) {
324
+ super(injector);
325
+ this.fieldComponent = fieldComponent;
326
+ this.controlContainer = controlContainer;
327
+ this.translate = translate;
328
+ this.resourceUnits = resourceUnits;
329
+ this.getFieldDisplayName = getFieldDisplayName;
330
+ this.getFieldDescription = getFieldDescription;
331
+ this.getResourceValue = getResourceValue;
332
+ this.getResourceViewModel = getResourceViewModel;
333
+ }
334
+ ngOnInit() {
335
+ super.ngOnInit();
336
+ const greaterValidatorSubscriptions = [
337
+ initGreaterValidator('cpu', this.form),
338
+ initGreaterValidator('memory', this.form),
339
+ ];
340
+ this.destroy$.subscribe(() => {
341
+ greaterValidatorSubscriptions.forEach(sub => sub.unsubscribe());
342
+ });
343
+ }
344
+ createForm() {
345
+ return this.fb.group({
346
+ limits: this.fb.group({
347
+ cpu: this.fb.group({
348
+ value: '',
349
+ unit: 'c',
350
+ }, {
351
+ validators: [
352
+ this.minValidator(this.limitCpuMin, 'cpu'),
353
+ this.maxValidator(this.limitCpuMax, 'cpu'),
354
+ ],
355
+ }),
356
+ memory: this.fb.group({
357
+ value: '',
358
+ unit: 'Mi',
359
+ }, {
360
+ validators: [
361
+ this.minValidator(this.limitMemoryMin, 'memory'),
362
+ this.maxValidator(this.limitMemoryMax, 'memory'),
363
+ ],
364
+ }),
365
+ }),
366
+ requests: this.fb.group({
367
+ cpu: this.fb.group({
368
+ value: '',
369
+ unit: 'c',
370
+ }, {
371
+ validators: [
372
+ this.minValidator(this.requestCpuMin, 'cpu'),
373
+ this.maxValidator(this.requestCpuMax, 'cpu'),
374
+ ],
375
+ }),
376
+ memory: this.fb.group({
377
+ value: '',
378
+ unit: 'Mi',
379
+ }, {
380
+ validators: [
381
+ this.minValidator(this.requestMemoryMin, 'memory'),
382
+ this.maxValidator(this.requestMemoryMax, 'memory'),
383
+ ],
384
+ }),
385
+ }),
386
+ });
387
+ }
388
+ getDefaultFormModel() {
389
+ return {
390
+ limits: {
391
+ cpu: {
392
+ value: '',
393
+ unit: 'c',
394
+ },
395
+ memory: {
396
+ value: '',
397
+ unit: 'Mi',
398
+ },
399
+ },
400
+ requests: {
401
+ cpu: {
402
+ value: '',
403
+ unit: 'c',
404
+ },
405
+ memory: {
406
+ value: '',
407
+ unit: 'Mi',
408
+ },
409
+ },
410
+ };
411
+ }
412
+ adaptFormModel(formModel) {
413
+ this.formatFormModel(formModel);
414
+ return {
415
+ requests: transferResource(formModel.requests),
416
+ limits: transferResource(formModel.limits),
417
+ };
418
+ }
419
+ minValidator(min, type) {
420
+ return (group) => {
421
+ if (!min) {
422
+ return null;
423
+ }
424
+ const valueCtrl = group.get('value');
425
+ const currentValue = getCurrentValue(group, type);
426
+ const minThreshold = valueFormat(type, min);
427
+ if (currentValue < minThreshold) {
428
+ return handleValidationErrors(valueCtrl, { min: true });
429
+ }
430
+ const errors = omit(valueCtrl.errors, 'min');
431
+ valueCtrl.setErrors(isEmpty(errors) ? null : errors);
432
+ return null;
433
+ };
434
+ }
435
+ maxValidator(max, type) {
436
+ return (group) => {
437
+ if (!max) {
438
+ return null;
439
+ }
440
+ const valueCtrl = group.get('value');
441
+ const currentValue = getCurrentValue(group, type);
442
+ const maxThreshold = valueFormat(type, max);
443
+ if (currentValue > maxThreshold) {
444
+ return handleValidationErrors(valueCtrl, { max: true });
445
+ }
446
+ const errors = omit(valueCtrl.errors, 'max');
447
+ valueCtrl.setErrors(isEmpty(errors) ? null : errors);
448
+ return null;
449
+ };
450
+ }
451
+ formatFormModel(formModel) {
452
+ Object.values(formModel).forEach(modelValue => {
453
+ Object.values(modelValue).forEach(v => {
454
+ v.value = `${v.value}`;
455
+ });
456
+ });
457
+ }
458
+ getCpuUnitLabel(value) {
459
+ return value === 'm'
460
+ ? ''
461
+ : resourceUnits.cpu.find(unit => unit.value === value).label;
462
+ }
463
+ adaptResourceModel(resources) {
464
+ const resourcesModel = {};
465
+ if (resources) {
466
+ Object.keys(resources).forEach(kind => {
467
+ const resourceKind = kind;
468
+ resourcesModel[resourceKind] = Object.keys(resources[resourceKind])
469
+ .filter(key => RESOURCE_MAC_TYPES.includes(key))
470
+ .reduce((item, type) => {
471
+ const resourceType = type;
472
+ item[resourceType] = getResourceViewModel(resources[resourceKind][resourceType], resourceType);
473
+ return item;
474
+ }, {});
475
+ });
476
+ }
477
+ return merge(this.getDefaultFormModel(), resourcesModel);
478
+ }
479
+ getMinOrMaxErrorsMapper(value, kind, type, _locale) {
480
+ const resourceCtrl = getResourceViewModel(value, type);
481
+ return this.translate.get(`warning_${kind}`, {
482
+ value: resourceCtrl.value + this.translate.get(resourceCtrl.unit),
483
+ });
484
+ }
485
+ static { this.ɵfac = function ResourceRequirementsComponent_Factory(t) { return new (t || ResourceRequirementsComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.OperandFieldComponent, 8), i0.ɵɵdirectiveInject(i2.ControlContainer, 8), i0.ɵɵdirectiveInject(i3.TranslateService)); }; }
486
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ResourceRequirementsComponent, selectors: [["acl-crd-resource-requirements"]], inputs: { readOnly: "readOnly", field: "field" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 2, consts: [["readOnlyTemplate", ""], [3, "formGroup", 4, "ngIf", "ngIfElse"], [3, "formGroup"], [1, "resource_requirements"], [1, "input-group-label"], ["formGroupName", "requests", 1, "input-group-wrapper", "tw-items-start"], [1, "tw-flex", "tw-flex-col", "tw-flex-1"], ["formGroupName", "cpu", 1, "input-groups-wrapper", "cpu"], ["auiInputAddonBefore", "", 1, "addon-label", 3, "ngClass"], ["aui-input", "", "type", "number", "auiFormItemControl", "", "formControlName", "value", 3, "required"], ["auiInputAddonAfter", "", "auiFormItemControl", "", "formControlName", "unit"], [3, "value", "label", 4, "ngFor", "ngForOf"], ["class", "tw-text-s tw-text-red", 3, "errors", "errorsMapper", 4, "ngIf"], [1, "input-groups-wrapper", "memory", 3, "formGroupName"], [3, "value", 4, "ngFor", "ngForOf"], ["formGroupName", "limits", 1, "input-group-wrapper", "tw-items-start"], [1, "input-groups-wrapper", "cpu", 3, "formGroupName"], [3, "value", "label"], [1, "tw-text-s", "tw-text-red", 3, "errors", "errorsMapper"], [3, "value"], [1, "resource_requirements-display"], [1, "resource_requirements-display-item"], [1, "resource_requirements-display-item__label"], ["icon", "prod:cpu", "size", "16px", "color", "#6359b4", "margin", "right", 3, "title"], [1, "tw-mr-16"], ["icon", "prod:memory", "size", "16px", "color", "#007cb5", "margin", "right", 3, "title"]], template: function ResourceRequirementsComponent_Template(rf, ctx) { if (rf & 1) {
487
+ i0.ɵɵtemplate(0, ResourceRequirementsComponent_form_0_Template, 49, 40, "form", 1)(1, ResourceRequirementsComponent_ng_template_1_Template, 35, 54, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
488
+ } if (rf & 2) {
489
+ const readOnlyTemplate_r6 = i0.ɵɵreference(2);
490
+ i0.ɵɵproperty("ngIf", !ctx.readOnly)("ngIfElse", readOnlyTemplate_r6);
491
+ } }, dependencies: [i4.NgClass, i4.NgForOf, i4.NgIf, i2.ɵNgNoValidate, i2.DefaultValueAccessor, i2.NumberValueAccessor, i2.NgControlStatus, i2.NgControlStatusGroup, i2.RequiredValidator, i2.FormGroupDirective, i2.FormControlName, i2.FormGroupName, i5.FormItemControlDirective, i5.IconComponent, i5.InputComponent, i5.InputGroupComponent, i5.InputAddonBeforeDirective, i5.InputAddonAfterDirective, i5.SelectComponent, i5.OptionComponent, i3.ErrorsMapperComponent, i3.ValidatorsDirective, i3.TranslatePipe, i3.FieldNotAvailablePipe, i3.PurePipe], styles: ["[_nghost-%COMP%] .resource_requirements[_ngcontent-%COMP%]:not(:last-of-type){margin-bottom:8px}[_nghost-%COMP%] .input-group-wrapper[_ngcontent-%COMP%]{display:flex}[_nghost-%COMP%] .input-group-label[_ngcontent-%COMP%]{line-height:var(--aui-inline-height-m)}[_nghost-%COMP%] aui-input-group[_ngcontent-%COMP%]{flex:1}[_nghost-%COMP%] aui-input-group[_ngcontent-%COMP%] .aui-input-group__addon--after{padding:0}[_nghost-%COMP%] aui-input-group[_ngcontent-%COMP%] .aui-input-group__addon--after aui-select{width:60px}[_nghost-%COMP%] aui-input-group[_ngcontent-%COMP%] .aui-input-group__addon--after aui-select .aui-input-group{width:62px}html:not([lang|=zh]) [_nghost-%COMP%] aui-input-group[_ngcontent-%COMP%] .aui-input-group__addon--after aui-select{width:78px}html:not([lang|=zh]) [_nghost-%COMP%] aui-input-group[_ngcontent-%COMP%] .aui-input-group__addon--after aui-select .aui-input-group{width:80px}[_nghost-%COMP%] aui-input-group[_ngcontent-%COMP%] .aui-input-group__addon--after aui-select .aui-input{border:0;background-color:transparent!important;border-top-right-radius:var(--aui-border-radius-m);border-bottom-right-radius:var(--aui-border-radius-m)}[_nghost-%COMP%] .addon-label[_ngcontent-%COMP%]{white-space:nowrap}[_nghost-%COMP%] .input-groups-wrapper[_ngcontent-%COMP%]{display:flex;flex:1;align-items:center}[_nghost-%COMP%] .input-groups-wrapper[_ngcontent-%COMP%]:first-child{margin-right:8px}[_nghost-%COMP%] .resource_requirements-display-item[_ngcontent-%COMP%]{display:flex;font-size:14px;line-height:20px;color:rgb(var(--aui-color-main-text));align-items:center;margin-top:8px}[_nghost-%COMP%] .resource_requirements-display-item[_ngcontent-%COMP%]:first-child{margin-top:0}[_nghost-%COMP%] .resource_requirements-display-item__label[_ngcontent-%COMP%]{white-space:nowrap;margin-right:8px}[_nghost-%COMP%] .resource_requirements-display-item__value[_ngcontent-%COMP%]{min-width:0;flex:1;white-space:nowrap;display:flex}[_nghost-%COMP%] .resource_requirements-display-item__value__overflow[_ngcontent-%COMP%]{display:block;overflow:hidden;text-overflow:ellipsis}[_nghost-%COMP%] .resource_requirements-display-item__value__wrap[_ngcontent-%COMP%]{white-space:pre-wrap;flex-wrap:wrap}[_nghost-%COMP%] .resource_requirements-display-item__label[_ngcontent-%COMP%], [_nghost-%COMP%] .resource_requirements-display-item__value[_ngcontent-%COMP%]{height:100%;align-items:flex-start}[_nghost-%COMP%] .aui-input-group__addon--before{width:70px}html:not([lang|=zh]) [_nghost-%COMP%] .memory .aui-input-group__addon--before{width:82px}"], changeDetection: 0 }); }
492
+ }
493
+ __decorate([
494
+ bind,
495
+ __metadata("design:type", Function),
496
+ __metadata("design:paramtypes", [String, String]),
497
+ __metadata("design:returntype", void 0)
498
+ ], ResourceRequirementsComponent.prototype, "minValidator", null);
499
+ __decorate([
500
+ bind,
501
+ __metadata("design:type", Function),
502
+ __metadata("design:paramtypes", [String, String]),
503
+ __metadata("design:returntype", void 0)
504
+ ], ResourceRequirementsComponent.prototype, "maxValidator", null);
505
+ __decorate([
506
+ bind,
507
+ __metadata("design:type", Function),
508
+ __metadata("design:paramtypes", [String, String, String, String]),
509
+ __metadata("design:returntype", void 0)
510
+ ], ResourceRequirementsComponent.prototype, "getMinOrMaxErrorsMapper", null);
511
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ResourceRequirementsComponent, [{
512
+ type: Component,
513
+ args: [{ selector: 'acl-crd-resource-requirements', changeDetection: ChangeDetectionStrategy.OnPush, template: "<form\n [formGroup]=\"form\"\n *ngIf=\"!readOnly; else readOnlyTemplate\"\n>\n <div class=\"resource_requirements\">\n <div class=\"input-group-label\">\n {{ 'resource_requirements_requests' | translate }}\n </div>\n <div\n class=\"input-group-wrapper tw-items-start\"\n formGroupName=\"requests\"\n >\n <div class=\"tw-flex tw-flex-col tw-flex-1\">\n <div\n class=\"input-groups-wrapper cpu\"\n formGroupName=\"cpu\"\n >\n <aui-input-group>\n <div\n auiInputAddonBefore\n class=\"addon-label\"\n [ngClass]=\"{\n 'tw-required-mark': requestCpuRequired\n }\"\n >\n CPU\n </div>\n <input\n aui-input\n type=\"number\"\n [required]=\"requestCpuRequired\"\n auiFormItemControl\n formControlName=\"value\"\n />\n <aui-select\n auiInputAddonAfter\n auiFormItemControl\n formControlName=\"unit\"\n >\n <aui-option\n *ngFor=\"let unit of resourceUnits['cpu']\"\n [value]=\"unit.value\"\n [label]=\"unit.label | translate\"\n >\n {{ unit.label | translate }}\n </aui-option>\n </aui-select>\n </aui-input-group>\n </div>\n <acl-errors-mapper\n *ngIf=\"\n form.get('requests.cpu.value')?.dirty ||\n $any(controlContainer?.formDirective)?.submitted\n \"\n [errors]=\"form.get('requests.cpu.value').errors\"\n [errorsMapper]=\"{\n min: requestCpuMin | pure: getMinOrMaxErrorsMapper: 'min': 'cpu': translate.locale,\n max: requestCpuMax | pure: getMinOrMaxErrorsMapper: 'max': 'cpu': translate.locale,\n }\"\n class=\"tw-text-s tw-text-red\"\n >\n </acl-errors-mapper>\n </div>\n\n <div class=\"tw-flex tw-flex-col tw-flex-1\">\n <div\n class=\"input-groups-wrapper memory\"\n [formGroupName]=\"'memory'\"\n >\n <aui-input-group>\n <div\n auiInputAddonBefore\n class=\"addon-label\"\n [ngClass]=\"{\n 'tw-required-mark': requestMemoryRequired\n }\"\n >\n {{ 'memory' | translate }}\n </div>\n <input\n aui-input\n type=\"number\"\n auiFormItemControl\n formControlName=\"value\"\n [required]=\"requestMemoryRequired\"\n />\n <aui-select\n auiInputAddonAfter\n auiFormItemControl\n formControlName=\"unit\"\n >\n <aui-option\n *ngFor=\"let unit of resourceUnits['memory']\"\n [value]=\"unit\"\n >\n {{ unit }}\n </aui-option>\n </aui-select>\n </aui-input-group>\n </div>\n <acl-errors-mapper\n *ngIf=\"\n form.get('requests.memory.value')?.dirty ||\n $any(controlContainer?.formDirective)?.submitted\n \"\n [errors]=\"form.get('requests.memory.value').errors\"\n [errorsMapper]=\"{\n min: requestMemoryMin | pure: getMinOrMaxErrorsMapper: 'min': 'memory': translate.locale,\n max: requestMemoryMax | pure: getMinOrMaxErrorsMapper: 'max': 'memory': translate.locale ,\n }\"\n class=\"tw-text-s tw-text-red\"\n >\n </acl-errors-mapper>\n </div>\n </div>\n </div>\n <div class=\"resource_requirements\">\n <div class=\"input-group-label\">\n {{ 'resource_requirements_limits' | translate }}\n </div>\n <div\n class=\"input-group-wrapper tw-items-start\"\n formGroupName=\"limits\"\n >\n <div class=\"tw-flex tw-flex-col tw-flex-1\">\n <div\n class=\"input-groups-wrapper cpu\"\n [formGroupName]=\"'cpu'\"\n >\n <aui-input-group>\n <div\n auiInputAddonBefore\n class=\"addon-label\"\n [ngClass]=\"{\n 'tw-required-mark': limitCpuRequired\n }\"\n >\n CPU\n </div>\n <input\n aui-input\n type=\"number\"\n auiFormItemControl\n formControlName=\"value\"\n [required]=\"limitCpuRequired\"\n />\n <aui-select\n auiInputAddonAfter\n auiFormItemControl\n formControlName=\"unit\"\n >\n <aui-option\n *ngFor=\"let unit of resourceUnits['cpu']\"\n [value]=\"unit.value\"\n [label]=\"unit.label | translate\"\n >\n {{ unit.label | translate }}\n </aui-option>\n </aui-select>\n </aui-input-group>\n </div>\n <acl-errors-mapper\n *ngIf=\"\n form.get('limits.cpu.value')?.dirty ||\n $any(controlContainer?.formDirective)?.submitted\n \"\n [errors]=\"form.get('limits.cpu.value').errors\"\n [errorsMapper]=\"{\n cpu_max: 'request_greater_than_limits_error' | translate,\n min: limitCpuMin | pure: getMinOrMaxErrorsMapper: 'min': 'cpu': translate.locale,\n max: limitCpuMax | pure: getMinOrMaxErrorsMapper: 'max': 'cpu': translate.locale \n }\"\n class=\"tw-text-s tw-text-red\"\n >\n </acl-errors-mapper>\n </div>\n\n <div class=\"tw-flex tw-flex-col tw-flex-1\">\n <div\n class=\"input-groups-wrapper memory\"\n [formGroupName]=\"'memory'\"\n >\n <aui-input-group>\n <div\n auiInputAddonBefore\n class=\"addon-label\"\n [ngClass]=\"{\n 'tw-required-mark': limitMemoryRequired\n }\"\n >\n {{ 'memory' | translate }}\n </div>\n <input\n aui-input\n type=\"number\"\n auiFormItemControl\n formControlName=\"value\"\n [required]=\"limitMemoryRequired\"\n />\n <aui-select\n auiInputAddonAfter\n auiFormItemControl\n formControlName=\"unit\"\n >\n <aui-option\n *ngFor=\"let unit of resourceUnits['memory']\"\n [value]=\"unit\"\n >\n {{ unit }}\n </aui-option>\n </aui-select>\n </aui-input-group>\n </div>\n <acl-errors-mapper\n *ngIf=\"\n form.get('limits.memory.value')?.dirty ||\n $any(controlContainer?.formDirective)?.submitted\n \"\n [errors]=\"form.get('limits.memory.value').errors\"\n [errorsMapper]=\"{\n memory_max: 'request_greater_than_limits_error' | translate,\n min: limitMemoryMin | pure: getMinOrMaxErrorsMapper: 'min': 'memory': translate.locale,\n max: limitMemoryMax | pure: getMinOrMaxErrorsMapper: 'max': 'memory': translate.locale ,\n }\"\n class=\"tw-text-s tw-text-red\"\n >\n </acl-errors-mapper>\n </div>\n </div>\n </div>\n</form>\n\n<ng-template #readOnlyTemplate>\n <div class=\"resource_requirements-display\">\n <div class=\"resource_requirements-display-item\">\n <label class=\"resource_requirements-display-item__label\">{{\n 'resource_requirements_requests' | translate\n }}</label>\n <aui-icon\n icon=\"prod:cpu\"\n size=\"16px\"\n color=\"#6359b4\"\n margin=\"right\"\n [title]=\"'cpu' | translate\"\n ></aui-icon\n ><span class=\"tw-mr-16\"\n >{{\n form.get('requests').get('cpu').value\n | pure: getResourceValue\n | aclFieldNotAvailable\n }}{{\n form.get('requests').get('cpu.unit').value\n | pure: getCpuUnitLabel\n | translate\n }}\n </span>\n <aui-icon\n icon=\"prod:memory\"\n size=\"16px\"\n color=\"#007cb5\"\n margin=\"right\"\n [title]=\"'memory' | translate\"\n ></aui-icon\n >{{\n form.get('requests').get('memory').value\n | pure: getResourceValue\n | aclFieldNotAvailable\n }}\n </div>\n <div class=\"resource_requirements-display-item\">\n <label class=\"resource_requirements-display-item__label\">{{\n 'resource_requirements_limits' | translate\n }}</label>\n <aui-icon\n icon=\"prod:cpu\"\n size=\"16px\"\n color=\"#6359b4\"\n margin=\"right\"\n [title]=\"'cpu' | translate\"\n ></aui-icon\n ><span class=\"tw-mr-16\"\n >{{\n form.get('limits').get('cpu').value\n | pure: getResourceValue\n | aclFieldNotAvailable\n }}{{\n form.get('limits').get('cpu.unit').value\n | pure: getCpuUnitLabel\n | translate\n }}\n </span>\n <aui-icon\n icon=\"prod:memory\"\n size=\"16px\"\n color=\"#007cb5\"\n margin=\"right\"\n [title]=\"'memory' | translate\"\n ></aui-icon\n >{{\n form.get('limits').get('memory').value\n | pure: getResourceValue\n | aclFieldNotAvailable\n }}\n </div>\n </div>\n</ng-template>\n", styles: [":host .resource_requirements:not(:last-of-type){margin-bottom:8px}:host .input-group-wrapper{display:flex}:host .input-group-label{line-height:var(--aui-inline-height-m)}:host aui-input-group{flex:1}:host aui-input-group ::ng-deep .aui-input-group__addon--after{padding:0}:host aui-input-group ::ng-deep .aui-input-group__addon--after aui-select{width:60px}:host aui-input-group ::ng-deep .aui-input-group__addon--after aui-select .aui-input-group{width:62px}html:not([lang|=zh]) :host aui-input-group ::ng-deep .aui-input-group__addon--after aui-select{width:78px}html:not([lang|=zh]) :host aui-input-group ::ng-deep .aui-input-group__addon--after aui-select .aui-input-group{width:80px}:host aui-input-group ::ng-deep .aui-input-group__addon--after aui-select .aui-input{border:0;background-color:transparent!important;border-top-right-radius:var(--aui-border-radius-m);border-bottom-right-radius:var(--aui-border-radius-m)}:host .addon-label{white-space:nowrap}:host .input-groups-wrapper{display:flex;flex:1;align-items:center}:host .input-groups-wrapper:first-child{margin-right:8px}:host .resource_requirements-display-item{display:flex;font-size:14px;line-height:20px;color:rgb(var(--aui-color-main-text));align-items:center;margin-top:8px}:host .resource_requirements-display-item:first-child{margin-top:0}:host .resource_requirements-display-item__label{white-space:nowrap;margin-right:8px}:host .resource_requirements-display-item__value{min-width:0;flex:1;white-space:nowrap;display:flex}:host .resource_requirements-display-item__value__overflow{display:block;overflow:hidden;text-overflow:ellipsis}:host .resource_requirements-display-item__value__wrap{white-space:pre-wrap;flex-wrap:wrap}:host .resource_requirements-display-item__label,:host .resource_requirements-display-item__value{height:100%;align-items:flex-start}:host ::ng-deep .aui-input-group__addon--before{width:70px}html:not([lang|=zh]) :host ::ng-deep .memory .aui-input-group__addon--before{width:82px}\n"] }]
514
+ }], () => [{ type: i0.Injector }, { type: i1.OperandFieldComponent, decorators: [{
515
+ type: Optional
516
+ }] }, { type: i2.ControlContainer, decorators: [{
517
+ type: Optional
518
+ }] }, { type: i3.TranslateService }], { readOnly: [{
519
+ type: Input
520
+ }], field: [{
521
+ type: Input
522
+ }], minValidator: [], maxValidator: [], getMinOrMaxErrorsMapper: [] }); })();
523
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ResourceRequirementsComponent, { className: "ResourceRequirementsComponent", filePath: "lib/field-controls/widgets/resource-requirements/resource-requirements.component.ts", lineNumber: 82 }); })();
524
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcmVxdWlyZW1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3JkLWZvcm0vc3JjL2xpYi9maWVsZC1jb250cm9scy93aWRnZXRzL3Jlc291cmNlLXJlcXVpcmVtZW50cy9yZXNvdXJjZS1yZXF1aXJlbWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jcmQtZm9ybS9zcmMvbGliL2ZpZWxkLWNvbnRyb2xzL3dpZGdldHMvcmVzb3VyY2UtcmVxdWlyZW1lbnRzL3Jlc291cmNlLXJlcXVpcmVtZW50cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLElBQUksRUFDSixTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUdsQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixLQUFLLEVBRUwsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxnQkFBZ0IsR0FJakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdEUsT0FBTyxFQUNMLGtDQUFrQyxFQUNsQyxrQ0FBa0MsR0FDbkMsTUFB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Q0FBQztJQUdELHVCQUF1QixDQUNyQixLQUFhLEVBQ2IsSUFBbUIsRUFDbkIsSUFBc0IsRUFDdEIsT0FBZTtRQUVmLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLEVBQUU7WUFDM0MsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztTQUNsRSxDQUFDLENBQUM7SUFDTCxDQUFDOzhGQWpTVSw2QkFBNkI7b0VBQTdCLDZCQUE2QjtZQ3VKMUMsQUF4T0Esa0ZBR0Msb0hBcU84Qjs7O1lBdE9YLEFBQWpCLG9DQUFpQixpQ0FBcUI7OztBRDZRL0I7SUFEUCxJQUFJOzs7O2lFQXVCSjtBQUdPO0lBRFAsSUFBSTs7OztpRUF3Qko7QUF5Q0Q7SUFEQyxJQUFJOzs7OzRFQVdKO2lGQWpTVSw2QkFBNkI7Y0FOekMsU0FBUzsyQkFDRSwrQkFBK0IsbUJBR3hCLHVCQUF1QixDQUFDLE1BQU07O3NCQStFNUMsUUFBUTs7c0JBRVIsUUFBUTtvREF2RVgsUUFBUTtrQkFEUCxLQUFLO1lBSU4sS0FBSztrQkFESixLQUFLO1lBb0xFLFlBQVksTUF5QlosWUFBWSxNQWdFcEIsdUJBQXVCO2tGQXZSWiw2QkFBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBiaW5kLFxuICBmb3JtYXRDUFUsXG4gIGZvcm1hdE1lbW9yeSxcbiAgZ2V0UmVzb3VyY2VWYWx1ZSxcbiAgZ2V0UmVzb3VyY2VWaWV3TW9kZWwsXG4gIGluaXRHcmVhdGVyVmFsaWRhdG9yLFxuICBSRVNPVVJDRV9NQUNfVFlQRVMsXG4gIFJlc291cmNlUmVxdWlyZW1lbnRGb3JtTW9kYWwsXG4gIFJlc291cmNlUmVxdWlyZW1lbnRTdHJpY3QsXG4gIHJlc291cmNlVW5pdHMsXG4gIHRyYW5zZmVyUmVzb3VyY2UsXG4gIFRyYW5zbGF0ZVNlcnZpY2UsXG59IGZyb20gJ0BhbGF1ZGEtZmUvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xDb250YWluZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IG1lcmdlLCBvbWl0LCBpc0VtcHR5IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJhc2VSZXNvdXJjZUZvcm1Hcm91cENvbXBvbmVudCB9IGZyb20gJ25nLXJlc291cmNlLWZvcm0tdXRpbCc7XG5cbmltcG9ydCB7IE9wZXJhbmRGaWVsZCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGdldEZpZWxkRGVzY3JpcHRpb24sIGdldEZpZWxkRGlzcGxheU5hbWUgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBPcGVyYW5kRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9vcGVyYW5kLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICByZXNvbHZlUmVxdWlyZW1lbnRzUmVxdWlyZWRPcHRpb25zLFxuICByZXNvbHZlUmVxdWlyZW1lbnRzTWluT3JNYXhPcHRpb25zLFxufSBmcm9tICcuLi91dGlscyc7XG5cbnR5cGUgQXZhaWxhYmxlUmVzb3VyY2VUeXBlID0gKHR5cGVvZiBSRVNPVVJDRV9NQUNfVFlQRVMpW251bWJlcl07XG50eXBlIFJlc291cmNlS2luZCA9IGtleW9mIFJlc291cmNlUmVxdWlyZW1lbnRGb3JtTW9kYWw7XG5cbmludGVyZmFjZSBSZXNvdXJjZUNvbnRyb2wge1xuICB2YWx1ZTogc3RyaW5nO1xuICB1bml0OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVZhbGlkYXRpb25FcnJvcnMoXG4gIHZhbHVlQ3RybDogQWJzdHJhY3RDb250cm9sLFxuICBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMsXG4pOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gIC8vIOi/memHjOmBv+WFjeimhuebluWFtuWugyBlcnJvcnNcbiAgY29uc3QgY29tYmluZWRFcnJvcnMgPSB7IC4uLnZhbHVlQ3RybC5lcnJvcnMsIC4uLmVycm9ycyB9O1xuICB2YWx1ZUN0cmwuc2V0RXJyb3JzKGNvbWJpbmVkRXJyb3JzKTtcbiAgcmV0dXJuIGNvbWJpbmVkRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWx1ZUZvcm1hdCh0eXBlOiAnY3B1JyB8ICdtZW1vcnknLCB2YWx1ZTogc3RyaW5nKSB7XG4gIHJldHVybiB0eXBlID09PSAnY3B1JyA/IGZvcm1hdENQVSh2YWx1ZSkgOiBmb3JtYXRNZW1vcnkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50VmFsdWUoXG4gIGdyb3VwOiBGb3JtR3JvdXA8e1xuICAgIHZhbHVlOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xuICAgIHVuaXQ6IEZvcm1Db250cm9sPHN0cmluZz47XG4gIH0+LFxuICB0eXBlOiAnY3B1JyB8ICdtZW1vcnknLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgdmFsdWVDdHJsID0gZ3JvdXAuZ2V0KCd2YWx1ZScpO1xuICBjb25zdCB2YWx1ZSA9IHZhbHVlQ3RybC52YWx1ZTtcbiAgY29uc3QgdW5pdCA9IGdyb3VwLmdldCgndW5pdCcpLnZhbHVlO1xuICByZXR1cm4gdmFsdWVGb3JtYXQodHlwZSwgKHZhbHVlIHx8IDApICsgdW5pdCk7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FjbC1jcmQtcmVzb3VyY2UtcmVxdWlyZW1lbnRzJyxcbiAgdGVtcGxhdGVVcmw6ICdyZXNvdXJjZS1yZXF1aXJlbWVudHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsncmVzb3VyY2UtcmVxdWlyZW1lbnRzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBSZXNvdXJjZVJlcXVpcmVtZW50c0NvbXBvbmVudFxuICBleHRlbmRzIEJhc2VSZXNvdXJjZUZvcm1Hcm91cENvbXBvbmVudDxcbiAgICBSZXNvdXJjZVJlcXVpcmVtZW50U3RyaWN0LFxuICAgIFJlc291cmNlUmVxdWlyZW1lbnRGb3JtTW9kYWxcbiAgPlxuICBpbXBsZW1lbnRzIE9uSW5pdFxue1xuICBASW5wdXQoKVxuICByZWFkT25seTogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICBmaWVsZDogT3BlcmFuZEZpZWxkO1xuXG4gIGdldCByZXF1aXJlZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVSZXF1aXJlbWVudHNSZXF1aXJlZE9wdGlvbnModGhpcy5maWVsZENvbXBvbmVudD8uZmllbGQpO1xuICB9XG5cbiAgZ2V0IGxpbWl0TWVtb3J5UmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWlyZWRPcHRpb25zLnJlcXVpcmVkPy5saW1pdD8uaW5jbHVkZXMoJ21lbW9yeScpO1xuICB9XG5cbiAgZ2V0IGxpbWl0Q3B1UmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWlyZWRPcHRpb25zLnJlcXVpcmVkPy5saW1pdD8uaW5jbHVkZXMoJ2NwdScpO1xuICB9XG5cbiAgZ2V0IHJlcXVlc3RNZW1vcnlSZXF1aXJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlZE9wdGlvbnMucmVxdWlyZWQ/LnJlcXVlc3Q/LmluY2x1ZGVzKCdtZW1vcnknKTtcbiAgfVxuXG4gIGdldCByZXF1ZXN0Q3B1UmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWlyZWRPcHRpb25zLnJlcXVpcmVkPy5yZXF1ZXN0Py5pbmNsdWRlcygnY3B1Jyk7XG4gIH1cblxuICBnZXQgbWluTWF4T3B0aW9ucygpIHtcbiAgICByZXR1cm4gcmVzb2x2ZVJlcXVpcmVtZW50c01pbk9yTWF4T3B0aW9ucyh0aGlzLmZpZWxkQ29tcG9uZW50Py5maWVsZCk7XG4gIH1cblxuICBnZXQgbGltaXRNZW1vcnlNaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMubWluTWF4T3B0aW9ucy5taW4ubGltaXRzPy5tZW1vcnk7XG4gIH1cblxuICBnZXQgbGltaXRDcHVNaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMubWluTWF4T3B0aW9ucy5taW4ubGltaXRzPy5jcHU7XG4gIH1cblxuICBnZXQgcmVxdWVzdE1lbW9yeU1pbigpIHtcbiAgICByZXR1cm4gdGhpcy5taW5NYXhPcHRpb25zLm1pbi5yZXF1ZXN0cz8ubWVtb3J5O1xuICB9XG5cbiAgZ2V0IHJlcXVlc3RDcHVNaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMubWluTWF4T3B0aW9ucy5taW4ucmVxdWVzdHM/LmNwdTtcbiAgfVxuXG4gIGdldCBsaW1pdE1lbW9yeU1heCgpIHtcbiAgICByZXR1cm4gdGhpcy5taW5NYXhPcHRpb25zLm1heC5saW1pdHM/Lm1lbW9yeTtcbiAgfVxuXG4gIGdldCBsaW1pdENwdU1heCgpIHtcbiAgICByZXR1cm4gdGhpcy5taW5NYXhPcHRpb25zLm1heC5saW1pdHM/LmNwdTtcbiAgfVxuXG4gIGdldCByZXF1ZXN0TWVtb3J5TWF4KCkge1xuICAgIHJldHVybiB0aGlzLm1pbk1heE9wdGlvbnMubWF4LnJlcXVlc3RzPy5tZW1vcnk7XG4gIH1cblxuICBnZXQgcmVxdWVzdENwdU1heCgpIHtcbiAgICByZXR1cm4gdGhpcy5taW5NYXhPcHRpb25zLm1heC5yZXF1ZXN0cz8uY3B1O1xuICB9XG5cbiAgcmVzb3VyY2VVbml0cyA9IHJlc291cmNlVW5pdHM7XG4gIGdldEZpZWxkRGlzcGxheU5hbWUgPSBnZXRGaWVsZERpc3BsYXlOYW1lO1xuICBnZXRGaWVsZERlc2NyaXB0aW9uID0gZ2V0RmllbGREZXNjcmlwdGlvbjtcbiAgZ2V0UmVzb3VyY2VWYWx1ZSA9IGdldFJlc291cmNlVmFsdWU7XG4gIGdldFJlc291cmNlVmlld01vZGVsID0gZ2V0UmVzb3VyY2VWaWV3TW9kZWw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBPcHRpb25hbCgpXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWVsZENvbXBvbmVudDogT3BlcmFuZEZpZWxkQ29tcG9uZW50LFxuICAgIEBPcHRpb25hbCgpXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsXG4gICAgcHVibGljIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICBjb25zdCBncmVhdGVyVmFsaWRhdG9yU3Vic2NyaXB0aW9ucyA9IFtcbiAgICAgIGluaXRHcmVhdGVyVmFsaWRhdG9yKCdjcHUnLCB0aGlzLmZvcm0pLFxuICAgICAgaW5pdEdyZWF0ZXJWYWxpZGF0b3IoJ21lbW9yeScsIHRoaXMuZm9ybSksXG4gICAgXTtcbiAgICB0aGlzLmRlc3Ryb3kkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBncmVhdGVyVmFsaWRhdG9yU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVGb3JtKCkge1xuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGxpbWl0czogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGNwdTogdGhpcy5mYi5ncm91cChcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB1bml0OiAnYycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzOiBbXG4gICAgICAgICAgICAgIHRoaXMubWluVmFsaWRhdG9yKHRoaXMubGltaXRDcHVNaW4sICdjcHUnKSxcbiAgICAgICAgICAgICAgdGhpcy5tYXhWYWxpZGF0b3IodGhpcy5saW1pdENwdU1heCwgJ2NwdScpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICBtZW1vcnk6IHRoaXMuZmIuZ3JvdXAoXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgdW5pdDogJ01pJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtcbiAgICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0b3IodGhpcy5saW1pdE1lbW9yeU1pbiwgJ21lbW9yeScpLFxuICAgICAgICAgICAgICB0aGlzLm1heFZhbGlkYXRvcih0aGlzLmxpbWl0TWVtb3J5TWF4LCAnbWVtb3J5JyksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICAgIHJlcXVlc3RzOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgY3B1OiB0aGlzLmZiLmdyb3VwKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIHVuaXQ6ICdjJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtcbiAgICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0b3IodGhpcy5yZXF1ZXN0Q3B1TWluLCAnY3B1JyksXG4gICAgICAgICAgICAgIHRoaXMubWF4VmFsaWRhdG9yKHRoaXMucmVxdWVzdENwdU1heCwgJ2NwdScpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICBtZW1vcnk6IHRoaXMuZmIuZ3JvdXAoXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgdW5pdDogJ01pJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtcbiAgICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0b3IodGhpcy5yZXF1ZXN0TWVtb3J5TWluLCAnbWVtb3J5JyksXG4gICAgICAgICAgICAgIHRoaXMubWF4VmFsaWRhdG9yKHRoaXMucmVxdWVzdE1lbW9yeU1heCwgJ21lbW9yeScpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBnZXREZWZhdWx0Rm9ybU1vZGVsKCk6IFJlc291cmNlUmVxdWlyZW1lbnRGb3JtTW9kYWwge1xuICAgIHJldHVybiB7XG4gICAgICBsaW1pdHM6IHtcbiAgICAgICAgY3B1OiB7XG4gICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgIHVuaXQ6ICdjJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtb3J5OiB7XG4gICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgIHVuaXQ6ICdNaScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVxdWVzdHM6IHtcbiAgICAgICAgY3B1OiB7XG4gICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgIHVuaXQ6ICdjJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtb3J5OiB7XG4gICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgIHVuaXQ6ICdNaScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBhZGFwdEZvcm1Nb2RlbChcbiAgICBmb3JtTW9kZWw6IFJlc291cmNlUmVxdWlyZW1lbnRGb3JtTW9kYWwsXG4gICk6IFJlc291cmNlUmVxdWlyZW1lbnRTdHJpY3Qge1xuICAgIHRoaXMuZm9ybWF0Rm9ybU1vZGVsKGZvcm1Nb2RlbCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVlc3RzOiB0cmFuc2ZlclJlc291cmNlKGZvcm1Nb2RlbC5yZXF1ZXN0cyksXG4gICAgICBsaW1pdHM6IHRyYW5zZmVyUmVzb3VyY2UoZm9ybU1vZGVsLmxpbWl0cyksXG4gICAgfTtcbiAgfVxuXG4gIEBiaW5kXG4gIHByaXZhdGUgbWluVmFsaWRhdG9yKG1pbjogc3RyaW5nLCB0eXBlOiAnY3B1JyB8ICdtZW1vcnknKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGdyb3VwOiBGb3JtR3JvdXA8e1xuICAgICAgICB2YWx1ZTogRm9ybUNvbnRyb2w8c3RyaW5nPjtcbiAgICAgICAgdW5pdDogRm9ybUNvbnRyb2w8c3RyaW5nPjtcbiAgICAgIH0+LFxuICAgICk6IFZhbGlkYXRpb25FcnJvcnMgPT4ge1xuICAgICAgaWYgKCFtaW4pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlQ3RybCA9IGdyb3VwLmdldCgndmFsdWUnKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGdldEN1cnJlbnRWYWx1ZShncm91cCwgdHlwZSk7XG4gICAgICBjb25zdCBtaW5UaHJlc2hvbGQgPSB2YWx1ZUZvcm1hdCh0eXBlLCBtaW4pO1xuXG4gICAgICBpZiAoY3VycmVudFZhbHVlIDwgbWluVGhyZXNob2xkKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVWYWxpZGF0aW9uRXJyb3JzKHZhbHVlQ3RybCwgeyBtaW46IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvcnMgPSBvbWl0KHZhbHVlQ3RybC5lcnJvcnMsICdtaW4nKTtcbiAgICAgIHZhbHVlQ3RybC5zZXRFcnJvcnMoaXNFbXB0eShlcnJvcnMpID8gbnVsbCA6IGVycm9ycyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgQGJpbmRcbiAgcHJpdmF0ZSBtYXhWYWxpZGF0b3IobWF4OiBzdHJpbmcsIHR5cGU6ICdjcHUnIHwgJ21lbW9yeScpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZ3JvdXA6IEZvcm1Hcm91cDx7XG4gICAgICAgIHZhbHVlOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xuICAgICAgICB1bml0OiBGb3JtQ29udHJvbDxzdHJpbmc+O1xuICAgICAgfT4sXG4gICAgKTogVmFsaWRhdGlvbkVycm9ycyA9PiB7XG4gICAgICBpZiAoIW1heCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWVDdHJsID0gZ3JvdXAuZ2V0KCd2YWx1ZScpO1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gZ2V0Q3VycmVudFZhbHVlKGdyb3VwLCB0eXBlKTtcbiAgICAgIGNvbnN0IG1heFRocmVzaG9sZCA9IHZhbHVlRm9ybWF0KHR5cGUsIG1heCk7XG5cbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPiBtYXhUaHJlc2hvbGQpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVZhbGlkYXRpb25FcnJvcnModmFsdWVDdHJsLCB7IG1heDogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JzID0gb21pdCh2YWx1ZUN0cmwuZXJyb3JzLCAnbWF4Jyk7XG4gICAgICB2YWx1ZUN0cmwuc2V0RXJyb3JzKGlzRW1wdHkoZXJyb3JzKSA/IG51bGwgOiBlcnJvcnMpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIGZvcm1hdEZvcm1Nb2RlbChmb3JtTW9kZWw6IFJlc291cmNlUmVxdWlyZW1lbnRGb3JtTW9kYWwpIHtcbiAgICBPYmplY3QudmFsdWVzKGZvcm1Nb2RlbCkuZm9yRWFjaChtb2RlbFZhbHVlID0+IHtcbiAgICAgIE9iamVjdC52YWx1ZXMobW9kZWxWYWx1ZSkuZm9yRWFjaCh2ID0+IHtcbiAgICAgICAgdi52YWx1ZSA9IGAke3YudmFsdWV9YDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q3B1VW5pdExhYmVsKHZhbHVlOiAnbScgfCAnYycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICdtJ1xuICAgICAgPyAnJ1xuICAgICAgOiByZXNvdXJjZVVuaXRzLmNwdS5maW5kKHVuaXQgPT4gdW5pdC52YWx1ZSA9PT0gdmFsdWUpLmxhYmVsO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWRhcHRSZXNvdXJjZU1vZGVsKFxuICAgIHJlc291cmNlczogUmVzb3VyY2VSZXF1aXJlbWVudFN0cmljdCxcbiAgKTogUmVzb3VyY2VSZXF1aXJlbWVudEZvcm1Nb2RhbCB7XG4gICAgY29uc3QgcmVzb3VyY2VzTW9kZWwgPSB7fSBhcyBSZXNvdXJjZVJlcXVpcmVtZW50Rm9ybU1vZGFsO1xuICAgIGlmIChyZXNvdXJjZXMpIHtcbiAgICAgIE9iamVjdC5rZXlzKHJlc291cmNlcykuZm9yRWFjaChraW5kID0+IHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VLaW5kID0ga2luZCBhcyBSZXNvdXJjZUtpbmQ7XG4gICAgICAgIHJlc291cmNlc01vZGVsW3Jlc291cmNlS2luZF0gPSBPYmplY3Qua2V5cyhyZXNvdXJjZXNbcmVzb3VyY2VLaW5kXSlcbiAgICAgICAgICAuZmlsdGVyKGtleSA9PlxuICAgICAgICAgICAgUkVTT1VSQ0VfTUFDX1RZUEVTLmluY2x1ZGVzKGtleSBhcyBBdmFpbGFibGVSZXNvdXJjZVR5cGUpLFxuICAgICAgICAgIClcbiAgICAgICAgICAucmVkdWNlKChpdGVtLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZVR5cGUgPSB0eXBlIGFzIEF2YWlsYWJsZVJlc291cmNlVHlwZTtcbiAgICAgICAgICAgIGl0ZW1bcmVzb3VyY2VUeXBlXSA9IGdldFJlc291cmNlVmlld01vZGVsKFxuICAgICAgICAgICAgICByZXNvdXJjZXNbcmVzb3VyY2VLaW5kXVtyZXNvdXJjZVR5cGVdLFxuICAgICAgICAgICAgICByZXNvdXJjZVR5cGUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgfSwge30gYXMgUmVjb3JkPEF2YWlsYWJsZVJlc291cmNlVHlwZSwgUmVzb3VyY2VDb250cm9sPik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlKHRoaXMuZ2V0RGVmYXVsdEZvcm1Nb2RlbCgpLCByZXNvdXJjZXNNb2RlbCk7XG4gIH1cblxuICBAYmluZFxuICBnZXRNaW5Pck1heEVycm9yc01hcHBlcihcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIGtpbmQ6ICdtaW4nIHwgJ21heCcsXG4gICAgdHlwZTogJ2NwdScgfCAnbWVtb3J5JyxcbiAgICBfbG9jYWxlOiBzdHJpbmcsXG4gICkge1xuICAgIGNvbnN0IHJlc291cmNlQ3RybCA9IGdldFJlc291cmNlVmlld01vZGVsKHZhbHVlLCB0eXBlKTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuZ2V0KGB3YXJuaW5nXyR7a2luZH1gLCB7XG4gICAgICB2YWx1ZTogcmVzb3VyY2VDdHJsLnZhbHVlICsgdGhpcy50cmFuc2xhdGUuZ2V0KHJlc291cmNlQ3RybC51bml0KSxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGZvcm1cbiAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgKm5nSWY9XCIhcmVhZE9ubHk7IGVsc2UgcmVhZE9ubHlUZW1wbGF0ZVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJyZXNvdXJjZV9yZXF1aXJlbWVudHNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtbGFiZWxcIj5cbiAgICAgIHt7ICdyZXNvdXJjZV9yZXF1aXJlbWVudHNfcmVxdWVzdHMnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJpbnB1dC1ncm91cC13cmFwcGVyIHR3LWl0ZW1zLXN0YXJ0XCJcbiAgICAgIGZvcm1Hcm91cE5hbWU9XCJyZXF1ZXN0c1wiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctZmxleC1jb2wgdHctZmxleC0xXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3Vwcy13cmFwcGVyIGNwdVwiXG4gICAgICAgICAgZm9ybUdyb3VwTmFtZT1cImNwdVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YXVpLWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBhdWlJbnB1dEFkZG9uQmVmb3JlXG4gICAgICAgICAgICAgIGNsYXNzPVwiYWRkb24tbGFiZWxcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ3R3LXJlcXVpcmVkLW1hcmsnOiByZXF1ZXN0Q3B1UmVxdWlyZWRcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIENQVVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgYXVpLWlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWVzdENwdVJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8YXVpLXNlbGVjdFxuICAgICAgICAgICAgICBhdWlJbnB1dEFkZG9uQWZ0ZXJcbiAgICAgICAgICAgICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInVuaXRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8YXVpLW9wdGlvblxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB1bml0IG9mIHJlc291cmNlVW5pdHNbJ2NwdSddXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidW5pdC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cInVuaXQubGFiZWwgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdW5pdC5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2F1aS1vcHRpb24+XG4gICAgICAgICAgICA8L2F1aS1zZWxlY3Q+XG4gICAgICAgICAgPC9hdWktaW5wdXQtZ3JvdXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YWNsLWVycm9ycy1tYXBwZXJcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgZm9ybS5nZXQoJ3JlcXVlc3RzLmNwdS52YWx1ZScpPy5kaXJ0eSB8fFxuICAgICAgICAgICAgJGFueShjb250cm9sQ29udGFpbmVyPy5mb3JtRGlyZWN0aXZlKT8uc3VibWl0dGVkXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbZXJyb3JzXT1cImZvcm0uZ2V0KCdyZXF1ZXN0cy5jcHUudmFsdWUnKS5lcnJvcnNcIlxuICAgICAgICAgIFtlcnJvcnNNYXBwZXJdPVwie1xuICAgICAgICAgICAgbWluOiByZXF1ZXN0Q3B1TWluIHwgcHVyZTogZ2V0TWluT3JNYXhFcnJvcnNNYXBwZXI6ICdtaW4nOiAnY3B1JzogdHJhbnNsYXRlLmxvY2FsZSxcbiAgICAgICAgICAgIG1heDogcmVxdWVzdENwdU1heCB8IHB1cmU6IGdldE1pbk9yTWF4RXJyb3JzTWFwcGVyOiAnbWF4JzogJ2NwdSc6IHRyYW5zbGF0ZS5sb2NhbGUsXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgY2xhc3M9XCJ0dy10ZXh0LXMgdHctdGV4dC1yZWRcIlxuICAgICAgICA+XG4gICAgICAgIDwvYWNsLWVycm9ycy1tYXBwZXI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctZmxleC1jb2wgdHctZmxleC0xXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3Vwcy13cmFwcGVyIG1lbW9yeVwiXG4gICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiJ21lbW9yeSdcIlxuICAgICAgICA+XG4gICAgICAgICAgPGF1aS1pbnB1dC1ncm91cD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgYXVpSW5wdXRBZGRvbkJlZm9yZVxuICAgICAgICAgICAgICBjbGFzcz1cImFkZG9uLWxhYmVsXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICd0dy1yZXF1aXJlZC1tYXJrJzogcmVxdWVzdE1lbW9yeVJlcXVpcmVkXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnbWVtb3J5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgYXVpLWlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWVzdE1lbW9yeVJlcXVpcmVkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8YXVpLXNlbGVjdFxuICAgICAgICAgICAgICBhdWlJbnB1dEFkZG9uQWZ0ZXJcbiAgICAgICAgICAgICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInVuaXRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8YXVpLW9wdGlvblxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB1bml0IG9mIHJlc291cmNlVW5pdHNbJ21lbW9yeSddXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidW5pdFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB1bml0IH19XG4gICAgICAgICAgICAgIDwvYXVpLW9wdGlvbj5cbiAgICAgICAgICAgIDwvYXVpLXNlbGVjdD5cbiAgICAgICAgICA8L2F1aS1pbnB1dC1ncm91cD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICBmb3JtLmdldCgncmVxdWVzdHMubWVtb3J5LnZhbHVlJyk/LmRpcnR5IHx8XG4gICAgICAgICAgICAkYW55KGNvbnRyb2xDb250YWluZXI/LmZvcm1EaXJlY3RpdmUpPy5zdWJtaXR0ZWRcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtlcnJvcnNdPVwiZm9ybS5nZXQoJ3JlcXVlc3RzLm1lbW9yeS52YWx1ZScpLmVycm9yc1wiXG4gICAgICAgICAgW2Vycm9yc01hcHBlcl09XCJ7XG4gICAgICAgICAgICBtaW46IHJlcXVlc3RNZW1vcnlNaW4gfCBwdXJlOiBnZXRNaW5Pck1heEVycm9yc01hcHBlcjogJ21pbic6ICdtZW1vcnknOiB0cmFuc2xhdGUubG9jYWxlLFxuICAgICAgICAgICAgbWF4OiByZXF1ZXN0TWVtb3J5TWF4IHwgcHVyZTogZ2V0TWluT3JNYXhFcnJvcnNNYXBwZXI6ICdtYXgnOiAnbWVtb3J5JzogdHJhbnNsYXRlLmxvY2FsZSAsXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgY2xhc3M9XCJ0dy10ZXh0LXMgdHctdGV4dC1yZWRcIlxuICAgICAgICA+XG4gICAgICAgIDwvYWNsLWVycm9ycy1tYXBwZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJyZXNvdXJjZV9yZXF1aXJlbWVudHNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtbGFiZWxcIj5cbiAgICAgIHt7ICdyZXNvdXJjZV9yZXF1aXJlbWVudHNfbGltaXRzJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaW5wdXQtZ3JvdXAtd3JhcHBlciB0dy1pdGVtcy1zdGFydFwiXG4gICAgICBmb3JtR3JvdXBOYW1lPVwibGltaXRzXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwidHctZmxleCB0dy1mbGV4LWNvbCB0dy1mbGV4LTFcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZ3JvdXBzLXdyYXBwZXIgY3B1XCJcbiAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCInY3B1J1wiXG4gICAgICAgID5cbiAgICAgICAgICA8YXVpLWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBhdWlJbnB1dEFkZG9uQmVmb3JlXG4gICAgICAgICAgICAgIGNsYXNzPVwiYWRkb24tbGFiZWxcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ3R3LXJlcXVpcmVkLW1hcmsnOiBsaW1pdENwdVJlcXVpcmVkXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBDUFVcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGF1aS1pbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImxpbWl0Q3B1UmVxdWlyZWRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxhdWktc2VsZWN0XG4gICAgICAgICAgICAgIGF1aUlucHV0QWRkb25BZnRlclxuICAgICAgICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidW5pdFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxhdWktb3B0aW9uXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHVuaXQgb2YgcmVzb3VyY2VVbml0c1snY3B1J11cIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ1bml0LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwidW5pdC5sYWJlbCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB1bml0LmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvYXVpLW9wdGlvbj5cbiAgICAgICAgICAgIDwvYXVpLXNlbGVjdD5cbiAgICAgICAgICA8L2F1aS1pbnB1dC1ncm91cD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICBmb3JtLmdldCgnbGltaXRzLmNwdS52YWx1ZScpPy5kaXJ0eSB8fFxuICAgICAgICAgICAgJGFueShjb250cm9sQ29udGFpbmVyPy5mb3JtRGlyZWN0aXZlKT8uc3VibWl0dGVkXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbZXJyb3JzXT1cImZvcm0uZ2V0KCdsaW1pdHMuY3B1LnZhbHVlJykuZXJyb3JzXCJcbiAgICAgICAgICBbZXJyb3JzTWFwcGVyXT1cIntcbiAgICAgICAgICAgIGNwdV9tYXg6ICdyZXF1ZXN0X2dyZWF0ZXJfdGhhbl9saW1pdHNfZXJyb3InIHwgdHJhbnNsYXRlLFxuICAgICAgICAgICAgbWluOiBsaW1pdENwdU1pbiB8IHB1cmU6IGdldE1pbk9yTWF4RXJyb3JzTWFwcGVyOiAnbWluJzogJ2NwdSc6IHRyYW5zbGF0ZS5sb2NhbGUsXG4gICAgICAgICAgICBtYXg6IGxpbWl0Q3B1TWF4IHwgcHVyZTogZ2V0TWluT3JNYXhFcnJvcnNNYXBwZXI6ICdtYXgnOiAnY3B1JzogdHJhbnNsYXRlLmxvY2FsZSBcbiAgICAgICAgICB9XCJcbiAgICAgICAgICBjbGFzcz1cInR3LXRleHQtcyB0dy10ZXh0LXJlZFwiXG4gICAgICAgID5cbiAgICAgICAgPC9hY2wtZXJyb3JzLW1hcHBlcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidHctZmxleCB0dy1mbGV4LWNvbCB0dy1mbGV4LTFcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZ3JvdXBzLXdyYXBwZXIgbWVtb3J5XCJcbiAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCInbWVtb3J5J1wiXG4gICAgICAgID5cbiAgICAgICAgICA8YXVpLWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBhdWlJbnB1dEFkZG9uQmVmb3JlXG4gICAgICAgICAgICAgIGNsYXNzPVwiYWRkb24tbGFiZWxcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ3R3LXJlcXVpcmVkLW1hcmsnOiBsaW1pdE1lbW9yeVJlcXVpcmVkXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnbWVtb3J5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgYXVpLWlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwibGltaXRNZW1vcnlSZXF1aXJlZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGF1aS1zZWxlY3RcbiAgICAgICAgICAgICAgYXVpSW5wdXRBZGRvbkFmdGVyXG4gICAgICAgICAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ1bml0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdW5pdCBvZiByZXNvdXJjZVVuaXRzWydtZW1vcnknXVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInVuaXRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdW5pdCB9fVxuICAgICAgICAgICAgICA8L2F1aS1vcHRpb24+XG4gICAgICAgICAgICA8L2F1aS1zZWxlY3Q+XG4gICAgICAgICAgPC9hdWktaW5wdXQtZ3JvdXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YWNsLWVycm9ycy1tYXBwZXJcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgZm9ybS5nZXQoJ2xpbWl0cy5tZW1vcnkudmFsdWUnKT8uZGlydHkgfHxcbiAgICAgICAgICAgICRhbnkoY29udHJvbENvbnRhaW5lcj8uZm9ybURpcmVjdGl2ZSk/LnN1Ym1pdHRlZFxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2Vycm9yc109XCJmb3JtLmdldCgnbGltaXRzLm1lbW9yeS52YWx1ZScpLmVycm9yc1wiXG4gICAgICAgICAgW2Vycm9yc01hcHBlcl09XCJ7XG4gICAgICAgICAgICBtZW1vcnlfbWF4OiAncmVxdWVzdF9ncmVhdGVyX3RoYW5fbGltaXRzX2Vycm9yJyB8IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1pbjogbGltaXRNZW1vcnlNaW4gfCBwdXJlOiBnZXRNaW5Pck1heEVycm9yc01hcHBlcjogJ21pbic6ICdtZW1vcnknOiB0cmFuc2xhdGUubG9jYWxlLFxuICAgICAgICAgICAgbWF4OiBsaW1pdE1lbW9yeU1heCB8IHB1cmU6IGdldE1pbk9yTWF4RXJyb3JzTWFwcGVyOiAnbWF4JzogJ21lbW9yeSc6IHRyYW5zbGF0ZS5sb2NhbGUgLFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIGNsYXNzPVwidHctdGV4dC1zIHR3LXRleHQtcmVkXCJcbiAgICAgICAgPlxuICAgICAgICA8L2FjbC1lcnJvcnMtbWFwcGVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9mb3JtPlxuXG48bmctdGVtcGxhdGUgI3JlYWRPbmx5VGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJyZXNvdXJjZV9yZXF1aXJlbWVudHMtZGlzcGxheVwiPlxuICAgIDxkaXYgY2xhc3M9XCJyZXNvdXJjZV9yZXF1aXJlbWVudHMtZGlzcGxheS1pdGVtXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJyZXNvdXJjZV9yZXF1aXJlbWVudHMtZGlzcGxheS1pdGVtX19sYWJlbFwiPnt7XG4gICAgICAgICdyZXNvdXJjZV9yZXF1aXJlbWVudHNfcmVxdWVzdHMnIHwgdHJhbnNsYXRlXG4gICAgICB9fTwvbGFiZWw+XG4gICAgICA8YXVpLWljb25cbiAgICAgICAgaWNvbj1cInByb2Q6Y3B1XCJcbiAgICAgICAgc2l6ZT1cIjE2cHhcIlxuICAgICAgICBjb2xvcj1cIiM2MzU5YjRcIlxuICAgICAgICBtYXJnaW49XCJyaWdodFwiXG4gICAgICAgIFt0aXRsZV09XCInY3B1JyB8IHRyYW5zbGF0ZVwiXG4gICAgICA+PC9hdWktaWNvblxuICAgICAgPjxzcGFuIGNsYXNzPVwidHctbXItMTZcIlxuICAgICAgICA+e3tcbiAgICAgICAgICBmb3JtLmdldCgncmVxdWVzdHMnKS5nZXQoJ2NwdScpLnZhbHVlXG4gICAgICAgICAgICB8IHB1cmU6IGdldFJlc291cmNlVmFsdWVcbiAgICAgICAgICAgIHwgYWNsRmllbGROb3RBdmFpbGFibGVcbiAgICAgICAgfX17e1xuICAgICAgICAgIGZvcm0uZ2V0KCdyZXF1ZXN0cycpLmdldCgnY3B1LnVuaXQnKS52YWx1ZVxuICAgICAgICAgICAgfCBwdXJlOiBnZXRDcHVVbml0TGFiZWxcbiAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8YXVpLWljb25cbiAgICAgICAgaWNvbj1cInByb2Q6bWVtb3J5XCJcbiAgICAgICAgc2l6ZT1cIjE2cHhcIlxuICAgICAgICBjb2xvcj1cIiMwMDdjYjVcIlxuICAgICAgICBtYXJnaW49XCJyaWdodFwiXG4gICAgICAgIFt0aXRsZV09XCInbWVtb3J5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICA+PC9hdWktaWNvblxuICAgICAgPnt7XG4gICAgICAgIGZvcm0uZ2V0KCdyZXF1ZXN0cycpLmdldCgnbWVtb3J5JykudmFsdWVcbiAgICAgICAgICB8IHB1cmU6IGdldFJlc291cmNlVmFsdWVcbiAgICAgICAgICB8IGFjbEZpZWxkTm90QXZhaWxhYmxlXG4gICAgICB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyZXNvdXJjZV9yZXF1aXJlbWVudHMtZGlzcGxheS1pdGVtXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJyZXNvdXJjZV9yZXF1aXJlbWVudHMtZGlzcGxheS1pdGVtX19sYWJlbFwiPnt7XG4gICAgICAgICdyZXNvdXJjZV9yZXF1aXJlbWVudHNfbGltaXRzJyB8IHRyYW5zbGF0ZVxuICAgICAgfX08L2xhYmVsPlxuICAgICAgPGF1aS1pY29uXG4gICAgICAgIGljb249XCJwcm9kOmNwdVwiXG4gICAgICAgIHNpemU9XCIxNnB4XCJcbiAgICAgICAgY29sb3I9XCIjNjM1OWI0XCJcbiAgICAgICAgbWFyZ2luPVwicmlnaHRcIlxuICAgICAgICBbdGl0bGVdPVwiJ2NwdScgfCB0cmFuc2xhdGVcIlxuICAgICAgPjwvYXVpLWljb25cbiAgICAgID48c3BhbiBjbGFzcz1cInR3LW1yLTE2XCJcbiAgICAgICAgPnt7XG4gICAgICAgICAgZm9ybS5nZXQoJ2xpbWl0cycpLmdldCgnY3B1JykudmFsdWVcbiAgICAgICAgICAgIHwgcHVyZTogZ2V0UmVzb3VyY2VWYWx1ZVxuICAgICAgICAgICAgfCBhY2xGaWVsZE5vdEF2YWlsYWJsZVxuICAgICAgICB9fXt7XG4gICAgICAgICAgZm9ybS5nZXQoJ2xpbWl0cycpLmdldCgnY3B1LnVuaXQnKS52YWx1ZVxuICAgICAgICAgICAgfCBwdXJlOiBnZXRDcHVVbml0TGFiZWxcbiAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8YXVpLWljb25cbiAgICAgICAgaWNvbj1cInByb2Q6bWVtb3J5XCJcbiAgICAgICAgc2l6ZT1cIjE2cHhcIlxuICAgICAgICBjb2xvcj1cIiMwMDdjYjVcIlxuICAgICAgICBtYXJnaW49XCJyaWdodFwiXG4gICAgICAgIFt0aXRsZV09XCInbWVtb3J5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICA+PC9hdWktaWNvblxuICAgICAgPnt7XG4gICAgICAgIGZvcm0uZ2V0KCdsaW1pdHMnKS5nZXQoJ21lbW9yeScpLnZhbHVlXG4gICAgICAgICAgfCBwdXJlOiBnZXRSZXNvdXJjZVZhbHVlXG4gICAgICAgICAgfCBhY2xGaWVsZE5vdEF2YWlsYWJsZVxuICAgICAgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19