@alauda-fe/crd-form 0.0.8 → 1.0.1-alpha.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 (99) hide show
  1. package/README.md +7 -0
  2. package/fesm2022/alauda-fe-crd-form.mjs +3088 -0
  3. package/fesm2022/alauda-fe-crd-form.mjs.map +1 -0
  4. package/package.json +12 -14
  5. package/types/alauda-fe-crd-form.d.ts +934 -0
  6. package/esm2022/alauda-fe-crd-form.mjs +0 -5
  7. package/esm2022/lib/abstract/base-array.mjs +0 -117
  8. package/esm2022/lib/crd-form/component.mjs +0 -325
  9. package/esm2022/lib/crd-form/helper.mjs +0 -32
  10. package/esm2022/lib/crd-form.module.mjs +0 -115
  11. package/esm2022/lib/field-controls/expressions/expression-core.mjs +0 -2
  12. package/esm2022/lib/field-controls/expressions/props-expression.mjs +0 -58
  13. package/esm2022/lib/field-controls/form-item.component.mjs +0 -215
  14. package/esm2022/lib/field-controls/index.mjs +0 -8
  15. package/esm2022/lib/field-controls/module.mjs +0 -143
  16. package/esm2022/lib/field-controls/operand-advanced-field-group.component.mjs +0 -80
  17. package/esm2022/lib/field-controls/operand-array-field-group.component.mjs +0 -112
  18. package/esm2022/lib/field-controls/operand-field-group.component.mjs +0 -88
  19. package/esm2022/lib/field-controls/operand-field.component.mjs +0 -877
  20. package/esm2022/lib/field-controls/widgets/array-table/component.mjs +0 -109
  21. package/esm2022/lib/field-controls/widgets/basic-auth-secret/component.mjs +0 -116
  22. package/esm2022/lib/field-controls/widgets/basic-auth-secret/create/component.mjs +0 -211
  23. package/esm2022/lib/field-controls/widgets/basic-auth-secret/type.mjs +0 -2
  24. package/esm2022/lib/field-controls/widgets/index.mjs +0 -8
  25. package/esm2022/lib/field-controls/widgets/k8s-resource-prefix/component.mjs +0 -169
  26. package/esm2022/lib/field-controls/widgets/k8s-resource-prefix/util.mjs +0 -40
  27. package/esm2022/lib/field-controls/widgets/link/component.mjs +0 -68
  28. package/esm2022/lib/field-controls/widgets/resource-requirements/resource-requirements.component.mjs +0 -521
  29. package/esm2022/lib/field-controls/widgets/utils.mjs +0 -73
  30. package/esm2022/lib/field-controls/widgets/yaml-editor/yaml-editor.component.mjs +0 -94
  31. package/esm2022/lib/field-widgets/htpasswd/component.mjs +0 -40
  32. package/esm2022/lib/field-widgets/htpasswd/form.mjs +0 -240
  33. package/esm2022/lib/field-widgets/htpasswd/index.mjs +0 -4
  34. package/esm2022/lib/field-widgets/htpasswd/module.mjs +0 -54
  35. package/esm2022/lib/field-widgets/htpasswd/utils.mjs +0 -38
  36. package/esm2022/lib/field-widgets/index.mjs +0 -2
  37. package/esm2022/lib/remote-widgets/constants.mjs +0 -4
  38. package/esm2022/lib/remote-widgets/index.mjs +0 -4
  39. package/esm2022/lib/remote-widgets/remote-widget.service.mjs +0 -42
  40. package/esm2022/lib/remote-widgets/token.mjs +0 -7
  41. package/esm2022/lib/spec-descriptors/capability/capability.component.mjs +0 -139
  42. package/esm2022/lib/spec-descriptors/capability-list/capability-list.component.mjs +0 -189
  43. package/esm2022/lib/spec-descriptors/index.mjs +0 -4
  44. package/esm2022/lib/spec-descriptors/util.mjs +0 -13
  45. package/esm2022/lib/types/index.mjs +0 -89
  46. package/esm2022/lib/utils/capability.mjs +0 -306
  47. package/esm2022/lib/utils/constant.mjs +0 -22
  48. package/esm2022/lib/utils/helper.mjs +0 -196
  49. package/esm2022/lib/utils/index.mjs +0 -6
  50. package/esm2022/lib/utils/service-model.mjs +0 -12
  51. package/esm2022/lib/utils/util.mjs +0 -307
  52. package/esm2022/public-api.mjs +0 -13
  53. package/index.d.ts +0 -5
  54. package/lib/abstract/base-array.d.ts +0 -31
  55. package/lib/crd-form/component.d.ts +0 -58
  56. package/lib/crd-form/helper.d.ts +0 -7
  57. package/lib/crd-form.module.d.ts +0 -15
  58. package/lib/field-controls/expressions/expression-core.d.ts +0 -6
  59. package/lib/field-controls/expressions/props-expression.d.ts +0 -36
  60. package/lib/field-controls/form-item.component.d.ts +0 -19
  61. package/lib/field-controls/index.d.ts +0 -7
  62. package/lib/field-controls/module.d.ts +0 -23
  63. package/lib/field-controls/operand-advanced-field-group.component.d.ts +0 -16
  64. package/lib/field-controls/operand-array-field-group.component.d.ts +0 -8
  65. package/lib/field-controls/operand-field-group.component.d.ts +0 -21
  66. package/lib/field-controls/operand-field.component.d.ts +0 -109
  67. package/lib/field-controls/widgets/array-table/component.d.ts +0 -8
  68. package/lib/field-controls/widgets/basic-auth-secret/component.d.ts +0 -26
  69. package/lib/field-controls/widgets/basic-auth-secret/create/component.d.ts +0 -45
  70. package/lib/field-controls/widgets/basic-auth-secret/type.d.ts +0 -11
  71. package/lib/field-controls/widgets/index.d.ts +0 -7
  72. package/lib/field-controls/widgets/k8s-resource-prefix/component.d.ts +0 -35
  73. package/lib/field-controls/widgets/k8s-resource-prefix/util.d.ts +0 -3
  74. package/lib/field-controls/widgets/link/component.d.ts +0 -20
  75. package/lib/field-controls/widgets/resource-requirements/resource-requirements.component.d.ts +0 -85
  76. package/lib/field-controls/widgets/utils.d.ts +0 -17
  77. package/lib/field-controls/widgets/yaml-editor/yaml-editor.component.d.ts +0 -36
  78. package/lib/field-widgets/htpasswd/component.d.ts +0 -9
  79. package/lib/field-widgets/htpasswd/form.d.ts +0 -34
  80. package/lib/field-widgets/htpasswd/index.d.ts +0 -3
  81. package/lib/field-widgets/htpasswd/module.d.ts +0 -13
  82. package/lib/field-widgets/htpasswd/utils.d.ts +0 -15
  83. package/lib/field-widgets/index.d.ts +0 -1
  84. package/lib/remote-widgets/constants.d.ts +0 -3
  85. package/lib/remote-widgets/index.d.ts +0 -3
  86. package/lib/remote-widgets/remote-widget.service.d.ts +0 -28
  87. package/lib/remote-widgets/token.d.ts +0 -3
  88. package/lib/spec-descriptors/capability/capability.component.d.ts +0 -20
  89. package/lib/spec-descriptors/capability-list/capability-list.component.d.ts +0 -34
  90. package/lib/spec-descriptors/index.d.ts +0 -3
  91. package/lib/spec-descriptors/util.d.ts +0 -4
  92. package/lib/types/index.d.ts +0 -136
  93. package/lib/utils/capability.d.ts +0 -62
  94. package/lib/utils/constant.d.ts +0 -12
  95. package/lib/utils/helper.d.ts +0 -58
  96. package/lib/utils/index.d.ts +0 -5
  97. package/lib/utils/service-model.d.ts +0 -44
  98. package/lib/utils/util.d.ts +0 -44
  99. package/public-api.d.ts +0 -9
@@ -1,521 +0,0 @@
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 { OperandFieldComponent } from '../../operand-field.component';
8
- import { resolveRequirementsRequiredOptions, resolveRequirementsMinOrMaxOptions, } from '../utils';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "../../operand-field.component";
11
- import * as i2 from "@angular/forms";
12
- import * as i3 from "@alauda-fe/common";
13
- import * as i4 from "@angular/common";
14
- import * as i5 from "@alauda/ui";
15
- const _c0 = a0 => ({ "tw-required-mark": a0 });
16
- const _c1 = (a0, a1, a2) => [a0, a1, "min", "cpu", a2];
17
- const _c2 = (a0, a1, a2) => [a0, a1, "max", "cpu", a2];
18
- const _c3 = (a0, a1) => ({ min: a0, max: a1 });
19
- const _c4 = (a0, a1, a2) => [a0, a1, "min", "memory", a2];
20
- const _c5 = (a0, a1, a2) => [a0, a1, "max", "memory", a2];
21
- const _c6 = (a0, a1, a2) => ({ cpu_max: a0, min: a1, max: a2 });
22
- const _c7 = (a0, a1, a2) => ({ memory_max: a0, min: a1, max: a2 });
23
- function ResourceRequirementsComponent_form_0_aui_option_13_Template(rf, ctx) { if (rf & 1) {
24
- i0.ɵɵelementStart(0, "aui-option", 17);
25
- i0.ɵɵpipe(1, "translate");
26
- i0.ɵɵtext(2);
27
- i0.ɵɵpipe(3, "translate");
28
- i0.ɵɵelementEnd();
29
- } if (rf & 2) {
30
- const unit_r1 = ctx.$implicit;
31
- i0.ɵɵproperty("value", unit_r1.value)("label", i0.ɵɵpipeBind1(1, 3, unit_r1.label));
32
- i0.ɵɵadvance(2);
33
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 5, unit_r1.label), " ");
34
- } }
35
- function ResourceRequirementsComponent_form_0_acl_errors_mapper_14_Template(rf, ctx) { if (rf & 1) {
36
- i0.ɵɵelement(0, "acl-errors-mapper", 18);
37
- i0.ɵɵpipe(1, "pure");
38
- i0.ɵɵpipe(2, "pure");
39
- } if (rf & 2) {
40
- const ctx_r1 = i0.ɵɵnextContext(2);
41
- 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))));
42
- } }
43
- function ResourceRequirementsComponent_form_0_aui_option_23_Template(rf, ctx) { if (rf & 1) {
44
- i0.ɵɵelementStart(0, "aui-option", 19);
45
- i0.ɵɵtext(1);
46
- i0.ɵɵelementEnd();
47
- } if (rf & 2) {
48
- const unit_r3 = ctx.$implicit;
49
- i0.ɵɵproperty("value", unit_r3);
50
- i0.ɵɵadvance();
51
- i0.ɵɵtextInterpolate1(" ", unit_r3, " ");
52
- } }
53
- function ResourceRequirementsComponent_form_0_acl_errors_mapper_24_Template(rf, ctx) { if (rf & 1) {
54
- i0.ɵɵelement(0, "acl-errors-mapper", 18);
55
- i0.ɵɵpipe(1, "pure");
56
- i0.ɵɵpipe(2, "pure");
57
- } if (rf & 2) {
58
- const ctx_r1 = i0.ɵɵnextContext(2);
59
- 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))));
60
- } }
61
- function ResourceRequirementsComponent_form_0_aui_option_37_Template(rf, ctx) { if (rf & 1) {
62
- i0.ɵɵelementStart(0, "aui-option", 17);
63
- i0.ɵɵpipe(1, "translate");
64
- i0.ɵɵtext(2);
65
- i0.ɵɵpipe(3, "translate");
66
- i0.ɵɵelementEnd();
67
- } if (rf & 2) {
68
- const unit_r4 = ctx.$implicit;
69
- i0.ɵɵproperty("value", unit_r4.value)("label", i0.ɵɵpipeBind1(1, 3, unit_r4.label));
70
- i0.ɵɵadvance(2);
71
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 5, unit_r4.label), " ");
72
- } }
73
- function ResourceRequirementsComponent_form_0_acl_errors_mapper_38_Template(rf, ctx) { if (rf & 1) {
74
- i0.ɵɵelement(0, "acl-errors-mapper", 18);
75
- i0.ɵɵpipe(1, "translate");
76
- i0.ɵɵpipe(2, "pure");
77
- i0.ɵɵpipe(3, "pure");
78
- } if (rf & 2) {
79
- const ctx_r1 = i0.ɵɵnextContext(2);
80
- 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))));
81
- } }
82
- function ResourceRequirementsComponent_form_0_aui_option_47_Template(rf, ctx) { if (rf & 1) {
83
- i0.ɵɵelementStart(0, "aui-option", 19);
84
- i0.ɵɵtext(1);
85
- i0.ɵɵelementEnd();
86
- } if (rf & 2) {
87
- const unit_r5 = ctx.$implicit;
88
- i0.ɵɵproperty("value", unit_r5);
89
- i0.ɵɵadvance();
90
- i0.ɵɵtextInterpolate1(" ", unit_r5, " ");
91
- } }
92
- function ResourceRequirementsComponent_form_0_acl_errors_mapper_48_Template(rf, ctx) { if (rf & 1) {
93
- i0.ɵɵelement(0, "acl-errors-mapper", 18);
94
- i0.ɵɵpipe(1, "translate");
95
- i0.ɵɵpipe(2, "pure");
96
- i0.ɵɵpipe(3, "pure");
97
- } if (rf & 2) {
98
- const ctx_r1 = i0.ɵɵnextContext(2);
99
- 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))));
100
- } }
101
- function ResourceRequirementsComponent_form_0_Template(rf, ctx) { if (rf & 1) {
102
- i0.ɵɵelementStart(0, "form", 2)(1, "div", 3)(2, "div", 4);
103
- i0.ɵɵtext(3);
104
- i0.ɵɵpipe(4, "translate");
105
- i0.ɵɵelementEnd();
106
- i0.ɵɵelementStart(5, "div", 5)(6, "div", 6)(7, "div", 7)(8, "aui-input-group")(9, "div", 8);
107
- i0.ɵɵtext(10, " CPU ");
108
- i0.ɵɵelementEnd();
109
- i0.ɵɵelement(11, "input", 9);
110
- i0.ɵɵelementStart(12, "aui-select", 10);
111
- i0.ɵɵtemplate(13, ResourceRequirementsComponent_form_0_aui_option_13_Template, 4, 7, "aui-option", 11);
112
- i0.ɵɵelementEnd()()();
113
- i0.ɵɵtemplate(14, ResourceRequirementsComponent_form_0_acl_errors_mapper_14_Template, 3, 25, "acl-errors-mapper", 12);
114
- i0.ɵɵelementEnd();
115
- i0.ɵɵelementStart(15, "div", 6)(16, "div", 13)(17, "aui-input-group")(18, "div", 8);
116
- i0.ɵɵtext(19);
117
- i0.ɵɵpipe(20, "translate");
118
- i0.ɵɵelementEnd();
119
- i0.ɵɵelement(21, "input", 9);
120
- i0.ɵɵelementStart(22, "aui-select", 10);
121
- i0.ɵɵtemplate(23, ResourceRequirementsComponent_form_0_aui_option_23_Template, 2, 2, "aui-option", 14);
122
- i0.ɵɵelementEnd()()();
123
- i0.ɵɵtemplate(24, ResourceRequirementsComponent_form_0_acl_errors_mapper_24_Template, 3, 25, "acl-errors-mapper", 12);
124
- i0.ɵɵelementEnd()()();
125
- i0.ɵɵelementStart(25, "div", 3)(26, "div", 4);
126
- i0.ɵɵtext(27);
127
- i0.ɵɵpipe(28, "translate");
128
- i0.ɵɵelementEnd();
129
- i0.ɵɵelementStart(29, "div", 15)(30, "div", 6)(31, "div", 16)(32, "aui-input-group")(33, "div", 8);
130
- i0.ɵɵtext(34, " CPU ");
131
- i0.ɵɵelementEnd();
132
- i0.ɵɵelement(35, "input", 9);
133
- i0.ɵɵelementStart(36, "aui-select", 10);
134
- i0.ɵɵtemplate(37, ResourceRequirementsComponent_form_0_aui_option_37_Template, 4, 7, "aui-option", 11);
135
- i0.ɵɵelementEnd()()();
136
- i0.ɵɵtemplate(38, ResourceRequirementsComponent_form_0_acl_errors_mapper_38_Template, 4, 28, "acl-errors-mapper", 12);
137
- i0.ɵɵelementEnd();
138
- i0.ɵɵelementStart(39, "div", 6)(40, "div", 13)(41, "aui-input-group")(42, "div", 8);
139
- i0.ɵɵtext(43);
140
- i0.ɵɵpipe(44, "translate");
141
- i0.ɵɵelementEnd();
142
- i0.ɵɵelement(45, "input", 9);
143
- i0.ɵɵelementStart(46, "aui-select", 10);
144
- i0.ɵɵtemplate(47, ResourceRequirementsComponent_form_0_aui_option_47_Template, 2, 2, "aui-option", 14);
145
- i0.ɵɵelementEnd()()();
146
- i0.ɵɵtemplate(48, ResourceRequirementsComponent_form_0_acl_errors_mapper_48_Template, 4, 28, "acl-errors-mapper", 12);
147
- i0.ɵɵelementEnd()()()();
148
- } if (rf & 2) {
149
- let tmp_7_0;
150
- let tmp_13_0;
151
- let tmp_19_0;
152
- let tmp_25_0;
153
- const ctx_r1 = i0.ɵɵnextContext();
154
- i0.ɵɵproperty("formGroup", ctx_r1.form);
155
- i0.ɵɵadvance(3);
156
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 24, "resource_requirements_requests"), " ");
157
- i0.ɵɵadvance(6);
158
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(32, _c0, ctx_r1.requestCpuRequired));
159
- i0.ɵɵadvance(2);
160
- i0.ɵɵproperty("required", ctx_r1.requestCpuRequired);
161
- i0.ɵɵadvance(2);
162
- i0.ɵɵproperty("ngForOf", ctx_r1.resourceUnits["cpu"]);
163
- i0.ɵɵadvance();
164
- 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));
165
- i0.ɵɵadvance(2);
166
- i0.ɵɵproperty("formGroupName", "memory");
167
- i0.ɵɵadvance(2);
168
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(34, _c0, ctx_r1.requestMemoryRequired));
169
- i0.ɵɵadvance();
170
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(20, 26, "memory"), " ");
171
- i0.ɵɵadvance(2);
172
- i0.ɵɵproperty("required", ctx_r1.requestMemoryRequired);
173
- i0.ɵɵadvance(2);
174
- i0.ɵɵproperty("ngForOf", ctx_r1.resourceUnits["memory"]);
175
- i0.ɵɵadvance();
176
- 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));
177
- i0.ɵɵadvance(3);
178
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(28, 28, "resource_requirements_limits"), " ");
179
- i0.ɵɵadvance(4);
180
- i0.ɵɵproperty("formGroupName", "cpu");
181
- i0.ɵɵadvance(2);
182
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(36, _c0, ctx_r1.limitCpuRequired));
183
- i0.ɵɵadvance(2);
184
- i0.ɵɵproperty("required", ctx_r1.limitCpuRequired);
185
- i0.ɵɵadvance(2);
186
- i0.ɵɵproperty("ngForOf", ctx_r1.resourceUnits["cpu"]);
187
- i0.ɵɵadvance();
188
- 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));
189
- i0.ɵɵadvance(2);
190
- i0.ɵɵproperty("formGroupName", "memory");
191
- i0.ɵɵadvance(2);
192
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(38, _c0, ctx_r1.limitMemoryRequired));
193
- i0.ɵɵadvance();
194
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(44, 30, "memory"), " ");
195
- i0.ɵɵadvance(2);
196
- i0.ɵɵproperty("required", ctx_r1.limitMemoryRequired);
197
- i0.ɵɵadvance(2);
198
- i0.ɵɵproperty("ngForOf", ctx_r1.resourceUnits["memory"]);
199
- i0.ɵɵadvance();
200
- 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));
201
- } }
202
- function ResourceRequirementsComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {
203
- i0.ɵɵelementStart(0, "div", 20)(1, "div", 21)(2, "label", 22);
204
- i0.ɵɵtext(3);
205
- i0.ɵɵpipe(4, "translate");
206
- i0.ɵɵelementEnd();
207
- i0.ɵɵelement(5, "aui-icon", 23);
208
- i0.ɵɵpipe(6, "translate");
209
- i0.ɵɵelementStart(7, "span", 24);
210
- i0.ɵɵtext(8);
211
- i0.ɵɵpipe(9, "pure");
212
- i0.ɵɵpipe(10, "aclFieldNotAvailable");
213
- i0.ɵɵpipe(11, "pure");
214
- i0.ɵɵpipe(12, "translate");
215
- i0.ɵɵelementEnd();
216
- i0.ɵɵelement(13, "aui-icon", 25);
217
- i0.ɵɵpipe(14, "translate");
218
- i0.ɵɵtext(15);
219
- i0.ɵɵpipe(16, "pure");
220
- i0.ɵɵpipe(17, "aclFieldNotAvailable");
221
- i0.ɵɵelementEnd();
222
- i0.ɵɵelementStart(18, "div", 21)(19, "label", 22);
223
- i0.ɵɵtext(20);
224
- i0.ɵɵpipe(21, "translate");
225
- i0.ɵɵelementEnd();
226
- i0.ɵɵelement(22, "aui-icon", 23);
227
- i0.ɵɵpipe(23, "translate");
228
- i0.ɵɵelementStart(24, "span", 24);
229
- i0.ɵɵtext(25);
230
- i0.ɵɵpipe(26, "pure");
231
- i0.ɵɵpipe(27, "aclFieldNotAvailable");
232
- i0.ɵɵpipe(28, "pure");
233
- i0.ɵɵpipe(29, "translate");
234
- i0.ɵɵelementEnd();
235
- i0.ɵɵelement(30, "aui-icon", 25);
236
- i0.ɵɵpipe(31, "translate");
237
- i0.ɵɵtext(32);
238
- i0.ɵɵpipe(33, "pure");
239
- i0.ɵɵpipe(34, "aclFieldNotAvailable");
240
- i0.ɵɵelementEnd()();
241
- } if (rf & 2) {
242
- const ctx_r1 = i0.ɵɵnextContext();
243
- i0.ɵɵadvance(3);
244
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 12, "resource_requirements_requests"));
245
- i0.ɵɵadvance(2);
246
- i0.ɵɵproperty("title", i0.ɵɵpipeBind1(6, 14, "cpu"));
247
- i0.ɵɵadvance(3);
248
- 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)), " ");
249
- i0.ɵɵadvance(5);
250
- i0.ɵɵproperty("title", i0.ɵɵpipeBind1(14, 26, "memory"));
251
- i0.ɵɵadvance(2);
252
- i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(17, 31, i0.ɵɵpipeBind2(16, 28, ctx_r1.form.get("requests").get("memory").value, ctx_r1.getResourceValue)), " ");
253
- i0.ɵɵadvance(5);
254
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(21, 33, "resource_requirements_limits"));
255
- i0.ɵɵadvance(2);
256
- i0.ɵɵproperty("title", i0.ɵɵpipeBind1(23, 35, "cpu"));
257
- i0.ɵɵadvance(3);
258
- 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)), " ");
259
- i0.ɵɵadvance(5);
260
- i0.ɵɵproperty("title", i0.ɵɵpipeBind1(31, 47, "memory"));
261
- i0.ɵɵadvance(2);
262
- i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(34, 52, i0.ɵɵpipeBind2(33, 49, ctx_r1.form.get("limits").get("memory").value, ctx_r1.getResourceValue)), " ");
263
- } }
264
- function handleValidationErrors(valueCtrl, errors) {
265
- // 这里避免覆盖其它 errors
266
- const combinedErrors = { ...valueCtrl.errors, ...errors };
267
- valueCtrl.setErrors(combinedErrors);
268
- return combinedErrors;
269
- }
270
- function valueFormat(type, value) {
271
- return type === 'cpu' ? formatCPU(value) : formatMemory(value);
272
- }
273
- function getCurrentValue(group, type) {
274
- const valueCtrl = group.get('value');
275
- const value = valueCtrl.value;
276
- const unit = group.get('unit').value;
277
- return valueFormat(type, (value || 0) + unit);
278
- }
279
- export class ResourceRequirementsComponent extends BaseResourceFormGroupComponent {
280
- get requiredOptions() {
281
- return resolveRequirementsRequiredOptions(this.fieldComponent?.field);
282
- }
283
- get limitMemoryRequired() {
284
- return this.requiredOptions.required?.limit?.includes('memory');
285
- }
286
- get limitCpuRequired() {
287
- return this.requiredOptions.required?.limit?.includes('cpu');
288
- }
289
- get requestMemoryRequired() {
290
- return this.requiredOptions.required?.request?.includes('memory');
291
- }
292
- get requestCpuRequired() {
293
- return this.requiredOptions.required?.request?.includes('cpu');
294
- }
295
- get minMaxOptions() {
296
- return resolveRequirementsMinOrMaxOptions(this.fieldComponent?.field);
297
- }
298
- get limitMemoryMin() {
299
- return this.minMaxOptions.min.limits?.memory;
300
- }
301
- get limitCpuMin() {
302
- return this.minMaxOptions.min.limits?.cpu;
303
- }
304
- get requestMemoryMin() {
305
- return this.minMaxOptions.min.requests?.memory;
306
- }
307
- get requestCpuMin() {
308
- return this.minMaxOptions.min.requests?.cpu;
309
- }
310
- get limitMemoryMax() {
311
- return this.minMaxOptions.max.limits?.memory;
312
- }
313
- get limitCpuMax() {
314
- return this.minMaxOptions.max.limits?.cpu;
315
- }
316
- get requestMemoryMax() {
317
- return this.minMaxOptions.max.requests?.memory;
318
- }
319
- get requestCpuMax() {
320
- return this.minMaxOptions.max.requests?.cpu;
321
- }
322
- constructor(injector, fieldComponent, controlContainer, translate) {
323
- super(injector);
324
- this.fieldComponent = fieldComponent;
325
- this.controlContainer = controlContainer;
326
- this.translate = translate;
327
- this.resourceUnits = resourceUnits;
328
- this.getResourceValue = getResourceValue;
329
- this.getResourceViewModel = getResourceViewModel;
330
- }
331
- ngOnInit() {
332
- super.ngOnInit();
333
- const greaterValidatorSubscriptions = [
334
- initGreaterValidator('cpu', this.form),
335
- initGreaterValidator('memory', this.form),
336
- ];
337
- this.destroy$.subscribe(() => {
338
- greaterValidatorSubscriptions.forEach(sub => sub.unsubscribe());
339
- });
340
- }
341
- createForm() {
342
- return this.fb.group({
343
- limits: this.fb.group({
344
- cpu: this.fb.group({
345
- value: '',
346
- unit: 'c',
347
- }, {
348
- validators: [
349
- this.minValidator(this.limitCpuMin, 'cpu'),
350
- this.maxValidator(this.limitCpuMax, 'cpu'),
351
- ],
352
- }),
353
- memory: this.fb.group({
354
- value: '',
355
- unit: 'Mi',
356
- }, {
357
- validators: [
358
- this.minValidator(this.limitMemoryMin, 'memory'),
359
- this.maxValidator(this.limitMemoryMax, 'memory'),
360
- ],
361
- }),
362
- }),
363
- requests: this.fb.group({
364
- cpu: this.fb.group({
365
- value: '',
366
- unit: 'c',
367
- }, {
368
- validators: [
369
- this.minValidator(this.requestCpuMin, 'cpu'),
370
- this.maxValidator(this.requestCpuMax, 'cpu'),
371
- ],
372
- }),
373
- memory: this.fb.group({
374
- value: '',
375
- unit: 'Mi',
376
- }, {
377
- validators: [
378
- this.minValidator(this.requestMemoryMin, 'memory'),
379
- this.maxValidator(this.requestMemoryMax, 'memory'),
380
- ],
381
- }),
382
- }),
383
- });
384
- }
385
- getDefaultFormModel() {
386
- return {
387
- limits: {
388
- cpu: {
389
- value: '',
390
- unit: 'c',
391
- },
392
- memory: {
393
- value: '',
394
- unit: 'Mi',
395
- },
396
- },
397
- requests: {
398
- cpu: {
399
- value: '',
400
- unit: 'c',
401
- },
402
- memory: {
403
- value: '',
404
- unit: 'Mi',
405
- },
406
- },
407
- };
408
- }
409
- adaptFormModel(formModel) {
410
- this.formatFormModel(formModel);
411
- return {
412
- requests: transferResource(formModel.requests),
413
- limits: transferResource(formModel.limits),
414
- };
415
- }
416
- minValidator(min, type) {
417
- return (group) => {
418
- if (!min) {
419
- return null;
420
- }
421
- const valueCtrl = group.get('value');
422
- const currentValue = getCurrentValue(group, type);
423
- const minThreshold = valueFormat(type, min);
424
- if (currentValue < minThreshold) {
425
- return handleValidationErrors(valueCtrl, { min: true });
426
- }
427
- const errors = omit(valueCtrl.errors, 'min');
428
- valueCtrl.setErrors(isEmpty(errors) ? null : errors);
429
- return null;
430
- };
431
- }
432
- maxValidator(max, type) {
433
- return (group) => {
434
- if (!max) {
435
- return null;
436
- }
437
- const valueCtrl = group.get('value');
438
- const currentValue = getCurrentValue(group, type);
439
- const maxThreshold = valueFormat(type, max);
440
- if (currentValue > maxThreshold) {
441
- return handleValidationErrors(valueCtrl, { max: true });
442
- }
443
- const errors = omit(valueCtrl.errors, 'max');
444
- valueCtrl.setErrors(isEmpty(errors) ? null : errors);
445
- return null;
446
- };
447
- }
448
- formatFormModel(formModel) {
449
- Object.values(formModel).forEach(modelValue => {
450
- Object.values(modelValue).forEach(v => {
451
- v.value = `${v.value}`;
452
- });
453
- });
454
- }
455
- getCpuUnitLabel(value) {
456
- return value === 'm'
457
- ? ''
458
- : resourceUnits.cpu.find(unit => unit.value === value).label;
459
- }
460
- adaptResourceModel(resources) {
461
- const resourcesModel = {};
462
- if (resources) {
463
- Object.keys(resources).forEach(kind => {
464
- const resourceKind = kind;
465
- resourcesModel[resourceKind] = Object.keys(resources[resourceKind])
466
- .filter(key => RESOURCE_MAC_TYPES.includes(key))
467
- .reduce((item, type) => {
468
- const resourceType = type;
469
- item[resourceType] = getResourceViewModel(resources[resourceKind][resourceType], resourceType);
470
- return item;
471
- }, {});
472
- });
473
- }
474
- return merge(this.getDefaultFormModel(), resourcesModel);
475
- }
476
- getMinOrMaxErrorsMapper(value, kind, type, _locale) {
477
- const resourceCtrl = getResourceViewModel(value, type);
478
- return this.translate.get(`warning_${kind}`, {
479
- value: resourceCtrl.value + this.translate.get(resourceCtrl.unit),
480
- });
481
- }
482
- 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)); }; }
483
- 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) {
484
- 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);
485
- } if (rf & 2) {
486
- const readOnlyTemplate_r6 = i0.ɵɵreference(2);
487
- i0.ɵɵproperty("ngIf", !ctx.readOnly)("ngIfElse", readOnlyTemplate_r6);
488
- } }, 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 }); }
489
- }
490
- __decorate([
491
- bind,
492
- __metadata("design:type", Function),
493
- __metadata("design:paramtypes", [String, String]),
494
- __metadata("design:returntype", void 0)
495
- ], ResourceRequirementsComponent.prototype, "minValidator", null);
496
- __decorate([
497
- bind,
498
- __metadata("design:type", Function),
499
- __metadata("design:paramtypes", [String, String]),
500
- __metadata("design:returntype", void 0)
501
- ], ResourceRequirementsComponent.prototype, "maxValidator", null);
502
- __decorate([
503
- bind,
504
- __metadata("design:type", Function),
505
- __metadata("design:paramtypes", [String, String, String, String]),
506
- __metadata("design:returntype", void 0)
507
- ], ResourceRequirementsComponent.prototype, "getMinOrMaxErrorsMapper", null);
508
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ResourceRequirementsComponent, [{
509
- type: Component,
510
- 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:\n requestCpuMin\n | pure\n : getMinOrMaxErrorsMapper\n : 'min'\n : 'cpu'\n : translate.locale,\n max:\n requestCpuMax\n | pure\n : getMinOrMaxErrorsMapper\n : 'max'\n : 'cpu'\n : 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:\n requestMemoryMin\n | pure\n : getMinOrMaxErrorsMapper\n : 'min'\n : 'memory'\n : translate.locale,\n max:\n requestMemoryMax\n | pure\n : getMinOrMaxErrorsMapper\n : 'max'\n : 'memory'\n : 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:\n limitCpuMin\n | pure\n : getMinOrMaxErrorsMapper\n : 'min'\n : 'cpu'\n : translate.locale,\n max:\n limitCpuMax\n | pure\n : getMinOrMaxErrorsMapper\n : 'max'\n : 'cpu'\n : 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:\n limitMemoryMin\n | pure\n : getMinOrMaxErrorsMapper\n : 'min'\n : 'memory'\n : translate.locale,\n max:\n limitMemoryMax\n | pure\n : getMinOrMaxErrorsMapper\n : 'max'\n : 'memory'\n : 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"] }]
511
- }], () => [{ type: i0.Injector }, { type: i1.OperandFieldComponent, decorators: [{
512
- type: Optional
513
- }] }, { type: i2.ControlContainer, decorators: [{
514
- type: Optional
515
- }] }, { type: i3.TranslateService }], { readOnly: [{
516
- type: Input
517
- }], field: [{
518
- type: Input
519
- }], minValidator: [], maxValidator: [], getMinOrMaxErrorsMapper: [] }); })();
520
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ResourceRequirementsComponent, { className: "ResourceRequirementsComponent", filePath: "lib/field-controls/widgets/resource-requirements/resource-requirements.component.ts", lineNumber: 81 }); })();
521
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcmVxdWlyZW1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3JkLWZvcm0vc3JjL2xpYi9maWVsZC1jb250cm9scy93aWRnZXRzL3Jlc291cmNlLXJlcXVpcmVtZW50cy9yZXNvdXJjZS1yZXF1aXJlbWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jcmQtZm9ybS9zcmMvbGliL2ZpZWxkLWNvbnRyb2xzL3dpZGdldHMvcmVzb3VyY2UtcmVxdWlyZW1lbnRzL3Jlc291cmNlLXJlcXVpcmVtZW50cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLElBQUksRUFDSixTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUdsQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixLQUFLLEVBRUwsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxnQkFBZ0IsR0FJakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHdkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdEUsT0FBTyxFQUNMLGtDQUFrQyxFQUNsQyxrQ0FBa0MsR0FDbkMsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7SUNFSixzQ0FJQzs7SUFDQyxZQUNGOztJQUFBLGlCQUFhOzs7SUFIWCxBQURBLHFDQUFvQiw4Q0FDWTtJQUVoQyxlQUNGO0lBREUsb0VBQ0Y7OztJQUlOLHdDQXdCb0I7Ozs7O0lBbEJsQixBQURBLHFFQUFnRCxpVEFnQjlDOzs7SUFpQ0Usc0NBR0M7SUFDQyxZQUNGO0lBQUEsaUJBQWE7OztJQUhYLCtCQUFjO0lBRWQsY0FDRjtJQURFLHdDQUNGOzs7SUFJTix3Q0F3Qm9COzs7OztJQWxCbEIsQUFEQSx3RUFBbUQsdVRBZ0JqRDs7O0lBMENFLHNDQUlDOztJQUNDLFlBQ0Y7O0lBQUEsaUJBQWE7OztJQUhYLEFBREEscUNBQW9CLDhDQUNZO0lBRWhDLGVBQ0Y7SUFERSxvRUFDRjs7O0lBSU4sd0NBeUJvQjs7Ozs7O0lBbkJsQixBQURBLG1FQUE4Qyx5V0FpQjVDOzs7SUFpQ0Usc0NBR0M7SUFDQyxZQUNGO0lBQUEsaUJBQWE7OztJQUhYLCtCQUFjO0lBRWQsY0FDRjtJQURFLHdDQUNGOzs7SUFJTix3Q0F5Qm9COzs7Ozs7SUFuQmxCLEFBREEsc0VBQWlELCtXQWlCL0M7OztJQTFRUixBQURGLEFBSkYsK0JBR0MsYUFDb0MsYUFDRjtJQUM3QixZQUNGOztJQUFBLGlCQUFNO0lBV0UsQUFERixBQUpGLEFBREYsQUFKRiw4QkFHQyxhQUM0QyxhQUl4QyxzQkFDa0IsYUFPZDtJQUNDLHNCQUNGO0lBQUEsaUJBQU07SUFDTiw0QkFNRTtJQUNGLHVDQUlDO0lBQ0Msc0dBSUM7SUFLUCxBQURFLEFBREUsaUJBQWEsRUFDRyxFQUNkO0lBQ04scUhBdUJDO0lBRUgsaUJBQU07SUFRQSxBQURGLEFBSkYsQUFERiwrQkFBMkMsZUFJeEMsdUJBQ2tCLGNBT2Q7SUFDQyxhQUNGOztJQUFBLGlCQUFNO0lBQ04sNEJBTUU7SUFDRix1Q0FJQztJQUNDLHNHQUdDO0lBS1AsQUFERSxBQURFLGlCQUFhLEVBQ0csRUFDZDtJQUNOLHFIQXVCQztJQUlQLEFBREUsQUFERSxpQkFBTSxFQUNGLEVBQ0Y7SUFFSixBQURGLCtCQUFtQyxjQUNGO0lBQzdCLGFBQ0Y7O0lBQUEsaUJBQU07SUFXRSxBQURGLEFBSkYsQUFERixBQUpGLGdDQUdDLGNBQzRDLGVBSXhDLHVCQUNrQixjQU9kO0lBQ0Msc0JBQ0Y7SUFBQSxpQkFBTTtJQUNOLDRCQU1FO0lBQ0YsdUNBSUM7SUFDQyxzR0FJQztJQUtQLEFBREUsQUFERSxpQkFBYSxFQUNHLEVBQ2Q7SUFDTixxSEF3QkM7SUFFSCxpQkFBTTtJQVFBLEFBREYsQUFKRixBQURGLCtCQUEyQyxlQUl4Qyx1QkFDa0IsY0FPZDtJQUNDLGFBQ0Y7O0lBQUEsaUJBQU07SUFDTiw0QkFNRTtJQUNGLHVDQUlDO0lBQ0Msc0dBR0M7SUFLUCxBQURFLEFBREUsaUJBQWEsRUFDRyxFQUNkO0lBQ04scUhBd0JDO0lBS1QsQUFERSxBQURFLEFBREUsaUJBQU0sRUFDRixFQUNGLEVBQ0Q7Ozs7Ozs7SUFyUkwsdUNBQWtCO0lBS2QsZUFDRjtJQURFLHdGQUNGO0lBY1UsZUFFRTtJQUZGLGdGQUVFO0lBT0YsZUFBK0I7SUFBL0Isb0RBQStCO0lBVVosZUFBdUI7SUFBdkIscURBQXVCO0lBVTdDLGNBSVg7SUFKVyw4UEFJWDtJQXlCVSxlQUEwQjtJQUExQix3Q0FBMEI7SUFNdEIsZUFFRTtJQUZGLG1GQUVFO0lBRUYsY0FDRjtJQURFLGlFQUNGO0lBTUUsZUFBa0M7SUFBbEMsdURBQWtDO0lBUWYsZUFBMEI7SUFBMUIsd0RBQTBCO0lBU2hELGNBSVg7SUFKVyxtUUFJWDtJQXlCTSxlQUNGO0lBREUsdUZBQ0Y7SUFRTSxlQUF1QjtJQUF2QixxQ0FBdUI7SUFNbkIsZUFFRTtJQUZGLDhFQUVFO0lBU0YsZUFBNkI7SUFBN0Isa0RBQTZCO0lBUVYsZUFBdUI7SUFBdkIscURBQXVCO0lBVTdDLGNBSVg7SUFKVyw4UEFJWDtJQTBCVSxlQUEwQjtJQUExQix3Q0FBMEI7SUFNdEIsZUFFRTtJQUZGLGlGQUVFO0lBRUYsY0FDRjtJQURFLGlFQUNGO0lBTUUsZUFBZ0M7SUFBaEMscURBQWdDO0lBUWIsZUFBMEI7SUFBMUIsd0RBQTBCO0lBU2hELGNBSVg7SUFKVyxpUUFJWDs7O0lBNkJNLEFBREYsQUFERiwrQkFBMkMsY0FDTyxnQkFDVztJQUFBLFlBRXZEOztJQUFBLGlCQUFRO0lBQ1YsK0JBT0M7O0lBQUEsZ0NBQ0U7SUFBQSxZQVNIOzs7OztJQUFBLGlCQUFPO0lBQ1AsZ0NBT0M7O0lBQUEsYUFLSDs7O0lBQUEsaUJBQU07SUFFSixBQURGLGdDQUFnRCxpQkFDVztJQUFBLGFBRXZEOztJQUFBLGlCQUFRO0lBQ1YsZ0NBT0M7O0lBQUEsaUNBQ0U7SUFBQSxhQVNIOzs7OztJQUFBLGlCQUFPO0lBQ1AsZ0NBT0M7O0lBQUEsYUFLSDs7O0lBQ0YsQUFERSxpQkFBTSxFQUNGOzs7SUFyRXVELGVBRXZEO0lBRnVELDZFQUV2RDtJQU1BLGVBQTJCO0lBQTNCLG9EQUEyQjtJQUcxQixlQVNIO0lBVEcsbVJBU0g7SUFNRSxlQUE4QjtJQUE5Qix3REFBOEI7SUFFL0IsZUFLSDtJQUxHLHdKQUtIO0lBRTJELGVBRXZEO0lBRnVELDRFQUV2RDtJQU1BLGVBQTJCO0lBQTNCLHFEQUEyQjtJQUcxQixlQVNIO0lBVEcsZ1JBU0g7SUFNRSxlQUE4QjtJQUE5Qix3REFBOEI7SUFFL0IsZUFLSDtJQUxHLHNKQUtIOztBRGhUSixTQUFTLHNCQUFzQixDQUM3QixTQUEwQixFQUMxQixNQUF3QjtJQUV4QixrQkFBa0I7SUFDbEIsTUFBTSxjQUFjLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUMxRCxTQUFTLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFzQixFQUFFLEtBQWE7SUFDeEQsT0FBTyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLEtBR0UsRUFDRixJQUFzQjtJQUV0QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckMsT0FBTyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFRRCxNQUFNLE9BQU8sNkJBQ1gsU0FBUSw4QkFHUDtJQVNELElBQUksZUFBZTtRQUNqQixPQUFPLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxJQUFJLHFCQUFxQjtRQUN2QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7SUFDNUMsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7SUFDNUMsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO0lBQzlDLENBQUM7SUFNRCxZQUNFLFFBQWtCLEVBRUQsY0FBcUMsRUFFdEMsZ0JBQWtDLEVBQ2xDLFNBQTJCO1FBRTNDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUxDLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUV0QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBVjdDLGtCQUFhLEdBQUcsYUFBYSxDQUFDO1FBQzlCLHFCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3BDLHlCQUFvQixHQUFHLG9CQUFvQixDQUFDO0lBVzVDLENBQUM7SUFFUSxRQUFRO1FBQ2YsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sNkJBQTZCLEdBQUc7WUFDcEMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdEMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDMUMsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUMzQiw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3BCLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FDaEI7b0JBQ0UsS0FBSyxFQUFFLEVBQUU7b0JBQ1QsSUFBSSxFQUFFLEdBQUc7aUJBQ1YsRUFDRDtvQkFDRSxVQUFVLEVBQUU7d0JBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQzt3QkFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQztxQkFDM0M7aUJBQ0YsQ0FDRjtnQkFDRCxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQ25CO29CQUNFLEtBQUssRUFBRSxFQUFFO29CQUNULElBQUksRUFBRSxJQUFJO2lCQUNYLEVBQ0Q7b0JBQ0UsVUFBVSxFQUFFO3dCQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUM7d0JBQ2hELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUM7cUJBQ2pEO2lCQUNGLENBQ0Y7YUFDRixDQUFDO1lBQ0YsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQ2hCO29CQUNFLEtBQUssRUFBRSxFQUFFO29CQUNULElBQUksRUFBRSxHQUFHO2lCQUNWLEVBQ0Q7b0JBQ0UsVUFBVSxFQUFFO3dCQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUM7d0JBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUM7cUJBQzdDO2lCQUNGLENBQ0Y7Z0JBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUNuQjtvQkFDRSxLQUFLLEVBQUUsRUFBRTtvQkFDVCxJQUFJLEVBQUUsSUFBSTtpQkFDWCxFQUNEO29CQUNFLFVBQVUsRUFBRTt3QkFDVixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUM7d0JBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQztxQkFDbkQ7aUJBQ0YsQ0FDRjthQUNGLENBQUM7U0FDSCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVEsbUJBQW1CO1FBQzFCLE9BQU87WUFDTCxNQUFNLEVBQUU7Z0JBQ04sR0FBRyxFQUFFO29CQUNILEtBQUssRUFBRSxFQUFFO29CQUNULElBQUksRUFBRSxHQUFHO2lCQUNWO2dCQUNELE1BQU0sRUFBRTtvQkFDTixLQUFLLEVBQUUsRUFBRTtvQkFDVCxJQUFJLEVBQUUsSUFBSTtpQkFDWDthQUNGO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLEdBQUcsRUFBRTtvQkFDSCxLQUFLLEVBQUUsRUFBRTtvQkFDVCxJQUFJLEVBQUUsR0FBRztpQkFDVjtnQkFDRCxNQUFNLEVBQUU7b0JBQ04sS0FBSyxFQUFFLEVBQUU7b0JBQ1QsSUFBSSxFQUFFLElBQUk7aUJBQ1g7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRVEsY0FBYyxDQUNyQixTQUF1QztRQUV2QyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLE9BQU87WUFDTCxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUM5QyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUdPLFlBQVksQ0FBQyxHQUFXLEVBQUUsSUFBc0I7UUFDdEQsT0FBTyxDQUNMLEtBR0UsRUFDZ0IsRUFBRTtZQUNwQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQyxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xELE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFNUMsSUFBSSxZQUFZLEdBQUcsWUFBWSxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sc0JBQXNCLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzdDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUdPLFlBQVksQ0FBQyxHQUFXLEVBQUUsSUFBc0I7UUFDdEQsT0FBTyxDQUNMLEtBR0UsRUFDZ0IsRUFBRTtZQUNwQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQyxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xELE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFNUMsSUFBSSxZQUFZLEdBQUcsWUFBWSxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sc0JBQXNCLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzdDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWUsQ0FBQyxTQUF1QztRQUNyRCxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM1QyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFnQjtRQUM5QixPQUFPLEtBQUssS0FBSyxHQUFHO1lBQ2xCLENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDakUsQ0FBQztJQUVRLGtCQUFrQixDQUN6QixTQUFvQztRQUVwQyxNQUFNLGNBQWMsR0FBRyxFQUFrQyxDQUFDO1FBQzFELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBb0IsQ0FBQztnQkFDMUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUNoRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDWixrQkFBa0IsQ0FBQyxRQUFRLENBQUMsR0FBNEIsQ0FBQyxDQUMxRDtxQkFDQSxNQUFNLENBQ0wsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7b0JBQ2IsTUFBTSxZQUFZLEdBQUcsSUFBNkIsQ0FBQztvQkFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLG9CQUFvQixDQUN2QyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQ3JDLFlBQVksQ0FDYixDQUFDO29CQUNGLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUMsRUFDRCxFQUFvRCxDQUNyRCxDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUdELHVCQUF1QixDQUNyQixLQUFhLEVBQ2IsSUFBbUIsRUFDbkIsSUFBc0IsRUFDdEIsT0FBZTtRQUVmLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLEVBQUU7WUFDM0MsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztTQUNsRSxDQUFDLENBQUM7SUFDTCxDQUFDOzhGQWxTVSw2QkFBNkI7b0VBQTdCLDZCQUE2QjtZQ3dNMUMsQUF4UkEsa0ZBR0Msb0hBcVI4Qjs7O1lBdFJYLEFBQWpCLG9DQUFpQixpQ0FBcUI7OztBRDBRL0I7SUFEUCxJQUFJOzs7O2lFQXVCSjtBQUdPO0lBRFAsSUFBSTs7OztpRUF3Qko7QUE0Q0Q7SUFEQyxJQUFJOzs7OzRFQVdKO2lGQWxTVSw2QkFBNkI7Y0FOekMsU0FBUzsyQkFDRSwrQkFBK0IsbUJBR3hCLHVCQUF1QixDQUFDLE1BQU07O3NCQTZFNUMsUUFBUTs7c0JBRVIsUUFBUTtvREFyRVgsUUFBUTtrQkFEUCxLQUFLO1lBSU4sS0FBSztrQkFESixLQUFLO1lBa0xFLFlBQVksTUF5QlosWUFBWSxNQW1FcEIsdUJBQXVCO2tGQXhSWiw2QkFBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBiaW5kLFxuICBmb3JtYXRDUFUsXG4gIGZvcm1hdE1lbW9yeSxcbiAgZ2V0UmVzb3VyY2VWYWx1ZSxcbiAgZ2V0UmVzb3VyY2VWaWV3TW9kZWwsXG4gIGluaXRHcmVhdGVyVmFsaWRhdG9yLFxuICBSRVNPVVJDRV9NQUNfVFlQRVMsXG4gIFJlc291cmNlUmVxdWlyZW1lbnRGb3JtTW9kYWwsXG4gIFJlc291cmNlUmVxdWlyZW1lbnRTdHJpY3QsXG4gIHJlc291cmNlVW5pdHMsXG4gIHRyYW5zZmVyUmVzb3VyY2UsXG4gIFRyYW5zbGF0ZVNlcnZpY2UsXG59IGZyb20gJ0BhbGF1ZGEtZmUvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xDb250YWluZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IG1lcmdlLCBvbWl0LCBpc0VtcHR5IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJhc2VSZXNvdXJjZUZvcm1Hcm91cENvbXBvbmVudCB9IGZyb20gJ25nLXJlc291cmNlLWZvcm0tdXRpbCc7XG5cbmltcG9ydCB7IE9wZXJhbmRGaWVsZCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IE9wZXJhbmRGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL29wZXJhbmQtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIHJlc29sdmVSZXF1aXJlbWVudHNSZXF1aXJlZE9wdGlvbnMsXG4gIHJlc29sdmVSZXF1aXJlbWVudHNNaW5Pck1heE9wdGlvbnMsXG59IGZyb20gJy4uL3V0aWxzJztcblxudHlwZSBBdmFpbGFibGVSZXNvdXJjZVR5cGUgPSAodHlwZW9mIFJFU09VUkNFX01BQ19UWVBFUylbbnVtYmVyXTtcbnR5cGUgUmVzb3VyY2VLaW5kID0ga2V5b2YgUmVzb3VyY2VSZXF1aXJlbWVudEZvcm1Nb2RhbDtcblxuaW50ZXJmYWNlIFJlc291cmNlQ29udHJvbCB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHVuaXQ6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaGFuZGxlVmFsaWRhdGlvbkVycm9ycyhcbiAgdmFsdWVDdHJsOiBBYnN0cmFjdENvbnRyb2wsXG4gIGVycm9yczogVmFsaWRhdGlvbkVycm9ycyxcbik6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgLy8g6L+Z6YeM6YG/5YWN6KaG55uW5YW25a6DIGVycm9yc1xuICBjb25zdCBjb21iaW5lZEVycm9ycyA9IHsgLi4udmFsdWVDdHJsLmVycm9ycywgLi4uZXJyb3JzIH07XG4gIHZhbHVlQ3RybC5zZXRFcnJvcnMoY29tYmluZWRFcnJvcnMpO1xuICByZXR1cm4gY29tYmluZWRFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbHVlRm9ybWF0KHR5cGU6ICdjcHUnIHwgJ21lbW9yeScsIHZhbHVlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICdjcHUnID8gZm9ybWF0Q1BVKHZhbHVlKSA6IGZvcm1hdE1lbW9yeSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRWYWx1ZShcbiAgZ3JvdXA6IEZvcm1Hcm91cDx7XG4gICAgdmFsdWU6IEZvcm1Db250cm9sPHN0cmluZz47XG4gICAgdW5pdDogRm9ybUNvbnRyb2w8c3RyaW5nPjtcbiAgfT4sXG4gIHR5cGU6ICdjcHUnIHwgJ21lbW9yeScsXG4pOiBudW1iZXIge1xuICBjb25zdCB2YWx1ZUN0cmwgPSBncm91cC5nZXQoJ3ZhbHVlJyk7XG4gIGNvbnN0IHZhbHVlID0gdmFsdWVDdHJsLnZhbHVlO1xuICBjb25zdCB1bml0ID0gZ3JvdXAuZ2V0KCd1bml0JykudmFsdWU7XG4gIHJldHVybiB2YWx1ZUZvcm1hdCh0eXBlLCAodmFsdWUgfHwgMCkgKyB1bml0KTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWNsLWNyZC1yZXNvdXJjZS1yZXF1aXJlbWVudHMnLFxuICB0ZW1wbGF0ZVVybDogJ3Jlc291cmNlLXJlcXVpcmVtZW50cy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydyZXNvdXJjZS1yZXF1aXJlbWVudHMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJlc291cmNlUmVxdWlyZW1lbnRzQ29tcG9uZW50XG4gIGV4dGVuZHMgQmFzZVJlc291cmNlRm9ybUdyb3VwQ29tcG9uZW50PFxuICAgIFJlc291cmNlUmVxdWlyZW1lbnRTdHJpY3QsXG4gICAgUmVzb3VyY2VSZXF1aXJlbWVudEZvcm1Nb2RhbFxuICA+XG4gIGltcGxlbWVudHMgT25Jbml0XG57XG4gIEBJbnB1dCgpXG4gIHJlYWRPbmx5OiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIGZpZWxkOiBPcGVyYW5kRmllbGQ7XG5cbiAgZ2V0IHJlcXVpcmVkT3B0aW9ucygpIHtcbiAgICByZXR1cm4gcmVzb2x2ZVJlcXVpcmVtZW50c1JlcXVpcmVkT3B0aW9ucyh0aGlzLmZpZWxkQ29tcG9uZW50Py5maWVsZCk7XG4gIH1cblxuICBnZXQgbGltaXRNZW1vcnlSZXF1aXJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlZE9wdGlvbnMucmVxdWlyZWQ/LmxpbWl0Py5pbmNsdWRlcygnbWVtb3J5Jyk7XG4gIH1cblxuICBnZXQgbGltaXRDcHVSZXF1aXJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlZE9wdGlvbnMucmVxdWlyZWQ/LmxpbWl0Py5pbmNsdWRlcygnY3B1Jyk7XG4gIH1cblxuICBnZXQgcmVxdWVzdE1lbW9yeVJlcXVpcmVkKCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVpcmVkT3B0aW9ucy5yZXF1aXJlZD8ucmVxdWVzdD8uaW5jbHVkZXMoJ21lbW9yeScpO1xuICB9XG5cbiAgZ2V0IHJlcXVlc3RDcHVSZXF1aXJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlZE9wdGlvbnMucmVxdWlyZWQ/LnJlcXVlc3Q/LmluY2x1ZGVzKCdjcHUnKTtcbiAgfVxuXG4gIGdldCBtaW5NYXhPcHRpb25zKCkge1xuICAgIHJldHVybiByZXNvbHZlUmVxdWlyZW1lbnRzTWluT3JNYXhPcHRpb25zKHRoaXMuZmllbGRDb21wb25lbnQ/LmZpZWxkKTtcbiAgfVxuXG4gIGdldCBsaW1pdE1lbW9yeU1pbigpIHtcbiAgICByZXR1cm4gdGhpcy5taW5NYXhPcHRpb25zLm1pbi5saW1pdHM/Lm1lbW9yeTtcbiAgfVxuXG4gIGdldCBsaW1pdENwdU1pbigpIHtcbiAgICByZXR1cm4gdGhpcy5taW5NYXhPcHRpb25zLm1pbi5saW1pdHM/LmNwdTtcbiAgfVxuXG4gIGdldCByZXF1ZXN0TWVtb3J5TWluKCkge1xuICAgIHJldHVybiB0aGlzLm1pbk1heE9wdGlvbnMubWluLnJlcXVlc3RzPy5tZW1vcnk7XG4gIH1cblxuICBnZXQgcmVxdWVzdENwdU1pbigpIHtcbiAgICByZXR1cm4gdGhpcy5taW5NYXhPcHRpb25zLm1pbi5yZXF1ZXN0cz8uY3B1O1xuICB9XG5cbiAgZ2V0IGxpbWl0TWVtb3J5TWF4KCkge1xuICAgIHJldHVybiB0aGlzLm1pbk1heE9wdGlvbnMubWF4LmxpbWl0cz8ubWVtb3J5O1xuICB9XG5cbiAgZ2V0IGxpbWl0Q3B1TWF4KCkge1xuICAgIHJldHVybiB0aGlzLm1pbk1heE9wdGlvbnMubWF4LmxpbWl0cz8uY3B1O1xuICB9XG5cbiAgZ2V0IHJlcXVlc3RNZW1vcnlNYXgoKSB7XG4gICAgcmV0dXJuIHRoaXMubWluTWF4T3B0aW9ucy5tYXgucmVxdWVzdHM/Lm1lbW9yeTtcbiAgfVxuXG4gIGdldCByZXF1ZXN0Q3B1TWF4KCkge1xuICAgIHJldHVybiB0aGlzLm1pbk1heE9wdGlvbnMubWF4LnJlcXVlc3RzPy5jcHU7XG4gIH1cblxuICByZXNvdXJjZVVuaXRzID0gcmVzb3VyY2VVbml0cztcbiAgZ2V0UmVzb3VyY2VWYWx1ZSA9IGdldFJlc291cmNlVmFsdWU7XG4gIGdldFJlc291cmNlVmlld01vZGVsID0gZ2V0UmVzb3VyY2VWaWV3TW9kZWw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBPcHRpb25hbCgpXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWVsZENvbXBvbmVudDogT3BlcmFuZEZpZWxkQ29tcG9uZW50LFxuICAgIEBPcHRpb25hbCgpXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsXG4gICAgcHVibGljIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICBjb25zdCBncmVhdGVyVmFsaWRhdG9yU3Vic2NyaXB0aW9ucyA9IFtcbiAgICAgIGluaXRHcmVhdGVyVmFsaWRhdG9yKCdjcHUnLCB0aGlzLmZvcm0pLFxuICAgICAgaW5pdEdyZWF0ZXJWYWxpZGF0b3IoJ21lbW9yeScsIHRoaXMuZm9ybSksXG4gICAgXTtcbiAgICB0aGlzLmRlc3Ryb3kkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBncmVhdGVyVmFsaWRhdG9yU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVGb3JtKCkge1xuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGxpbWl0czogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGNwdTogdGhpcy5mYi5ncm91cChcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB1bml0OiAnYycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzOiBbXG4gICAgICAgICAgICAgIHRoaXMubWluVmFsaWRhdG9yKHRoaXMubGltaXRDcHVNaW4sICdjcHUnKSxcbiAgICAgICAgICAgICAgdGhpcy5tYXhWYWxpZGF0b3IodGhpcy5saW1pdENwdU1heCwgJ2NwdScpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICBtZW1vcnk6IHRoaXMuZmIuZ3JvdXAoXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgdW5pdDogJ01pJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtcbiAgICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0b3IodGhpcy5saW1pdE1lbW9yeU1pbiwgJ21lbW9yeScpLFxuICAgICAgICAgICAgICB0aGlzLm1heFZhbGlkYXRvcih0aGlzLmxpbWl0TWVtb3J5TWF4LCAnbWVtb3J5JyksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICAgIHJlcXVlc3RzOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgY3B1OiB0aGlzLmZiLmdyb3VwKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIHVuaXQ6ICdjJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtcbiAgICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0b3IodGhpcy5yZXF1ZXN0Q3B1TWluLCAnY3B1JyksXG4gICAgICAgICAgICAgIHRoaXMubWF4VmFsaWRhdG9yKHRoaXMucmVxdWVzdENwdU1heCwgJ2NwdScpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICBtZW1vcnk6IHRoaXMuZmIuZ3JvdXAoXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgdW5pdDogJ01pJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtcbiAgICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0b3IodGhpcy5yZXF1ZXN0TWVtb3J5TWluLCAnbWVtb3J5JyksXG4gICAgICAgICAgICAgIHRoaXMubWF4VmFsaWRhdG9yKHRoaXMucmVxdWVzdE1lbW9yeU1heCwgJ21lbW9yeScpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBnZXREZWZhdWx0Rm9ybU1vZGVsKCk6IFJlc291cmNlUmVxdWlyZW1lbnRGb3JtTW9kYWwge1xuICAgIHJldHVybiB7XG4gICAgICBsaW1pdHM6IHtcbiAgICAgICAgY3B1OiB7XG4gICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgIHVuaXQ6ICdjJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtb3J5OiB7XG4gICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgIHVuaXQ6ICdNaScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVxdWVzdHM6IHtcbiAgICAgICAgY3B1OiB7XG4gICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgIHVuaXQ6ICdjJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtb3J5OiB7XG4gICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgIHVuaXQ6ICdNaScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBhZGFwdEZvcm1Nb2RlbChcbiAgICBmb3JtTW9kZWw6IFJlc291cmNlUmVxdWlyZW1lbnRGb3JtTW9kYWwsXG4gICk6IFJlc291cmNlUmVxdWlyZW1lbnRTdHJpY3Qge1xuICAgIHRoaXMuZm9ybWF0Rm9ybU1vZGVsKGZvcm1Nb2RlbCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVlc3RzOiB0cmFuc2ZlclJlc291cmNlKGZvcm1Nb2RlbC5yZXF1ZXN0cyksXG4gICAgICBsaW1pdHM6IHRyYW5zZmVyUmVzb3VyY2UoZm9ybU1vZGVsLmxpbWl0cyksXG4gICAgfTtcbiAgfVxuXG4gIEBiaW5kXG4gIHByaXZhdGUgbWluVmFsaWRhdG9yKG1pbjogc3RyaW5nLCB0eXBlOiAnY3B1JyB8ICdtZW1vcnknKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGdyb3VwOiBGb3JtR3JvdXA8e1xuICAgICAgICB2YWx1ZTogRm9ybUNvbnRyb2w8c3RyaW5nPjtcbiAgICAgICAgdW5pdDogRm9ybUNvbnRyb2w8c3RyaW5nPjtcbiAgICAgIH0+LFxuICAgICk6IFZhbGlkYXRpb25FcnJvcnMgPT4ge1xuICAgICAgaWYgKCFtaW4pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlQ3RybCA9IGdyb3VwLmdldCgndmFsdWUnKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGdldEN1cnJlbnRWYWx1ZShncm91cCwgdHlwZSk7XG4gICAgICBjb25zdCBtaW5UaHJlc2hvbGQgPSB2YWx1ZUZvcm1hdCh0eXBlLCBtaW4pO1xuXG4gICAgICBpZiAoY3VycmVudFZhbHVlIDwgbWluVGhyZXNob2xkKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVWYWxpZGF0aW9uRXJyb3JzKHZhbHVlQ3RybCwgeyBtaW46IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvcnMgPSBvbWl0KHZhbHVlQ3RybC5lcnJvcnMsICdtaW4nKTtcbiAgICAgIHZhbHVlQ3RybC5zZXRFcnJvcnMoaXNFbXB0eShlcnJvcnMpID8gbnVsbCA6IGVycm9ycyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgQGJpbmRcbiAgcHJpdmF0ZSBtYXhWYWxpZGF0b3IobWF4OiBzdHJpbmcsIHR5cGU6ICdjcHUnIHwgJ21lbW9yeScpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZ3JvdXA6IEZvcm1Hcm91cDx7XG4gICAgICAgIHZhbHVlOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xuICAgICAgICB1bml0OiBGb3JtQ29udHJvbDxzdHJpbmc+O1xuICAgICAgfT4sXG4gICAgKTogVmFsaWRhdGlvbkVycm9ycyA9PiB7XG4gICAgICBpZiAoIW1heCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWVDdHJsID0gZ3JvdXAuZ2V0KCd2YWx1ZScpO1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gZ2V0Q3VycmVudFZhbHVlKGdyb3VwLCB0eXBlKTtcbiAgICAgIGNvbnN0IG1heFRocmVzaG9sZCA9IHZhbHVlRm9ybWF0KHR5cGUsIG1heCk7XG5cbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPiBtYXhUaHJlc2hvbGQpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVZhbGlkYXRpb25FcnJvcnModmFsdWVDdHJsLCB7IG1heDogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JzID0gb21pdCh2YWx1ZUN0cmwuZXJyb3JzLCAnbWF4Jyk7XG4gICAgICB2YWx1ZUN0cmwuc2V0RXJyb3JzKGlzRW1wdHkoZXJyb3JzKSA/IG51bGwgOiBlcnJvcnMpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIGZvcm1hdEZvcm1Nb2RlbChmb3JtTW9kZWw6IFJlc291cmNlUmVxdWlyZW1lbnRGb3JtTW9kYWwpIHtcbiAgICBPYmplY3QudmFsdWVzKGZvcm1Nb2RlbCkuZm9yRWFjaChtb2RlbFZhbHVlID0+IHtcbiAgICAgIE9iamVjdC52YWx1ZXMobW9kZWxWYWx1ZSkuZm9yRWFjaCh2ID0+IHtcbiAgICAgICAgdi52YWx1ZSA9IGAke3YudmFsdWV9YDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q3B1VW5pdExhYmVsKHZhbHVlOiAnbScgfCAnYycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICdtJ1xuICAgICAgPyAnJ1xuICAgICAgOiByZXNvdXJjZVVuaXRzLmNwdS5maW5kKHVuaXQgPT4gdW5pdC52YWx1ZSA9PT0gdmFsdWUpLmxhYmVsO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWRhcHRSZXNvdXJjZU1vZGVsKFxuICAgIHJlc291cmNlczogUmVzb3VyY2VSZXF1aXJlbWVudFN0cmljdCxcbiAgKTogUmVzb3VyY2VSZXF1aXJlbWVudEZvcm1Nb2RhbCB7XG4gICAgY29uc3QgcmVzb3VyY2VzTW9kZWwgPSB7fSBhcyBSZXNvdXJjZVJlcXVpcmVtZW50Rm9ybU1vZGFsO1xuICAgIGlmIChyZXNvdXJjZXMpIHtcbiAgICAgIE9iamVjdC5rZXlzKHJlc291cmNlcykuZm9yRWFjaChraW5kID0+IHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VLaW5kID0ga2luZCBhcyBSZXNvdXJjZUtpbmQ7XG4gICAgICAgIHJlc291cmNlc01vZGVsW3Jlc291cmNlS2luZF0gPSBPYmplY3Qua2V5cyhyZXNvdXJjZXNbcmVzb3VyY2VLaW5kXSlcbiAgICAgICAgICAuZmlsdGVyKGtleSA9PlxuICAgICAgICAgICAgUkVTT1VSQ0VfTUFDX1RZUEVTLmluY2x1ZGVzKGtleSBhcyBBdmFpbGFibGVSZXNvdXJjZVR5cGUpLFxuICAgICAgICAgIClcbiAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgKGl0ZW0sIHR5cGUpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VUeXBlID0gdHlwZSBhcyBBdmFpbGFibGVSZXNvdXJjZVR5cGU7XG4gICAgICAgICAgICAgIGl0ZW1bcmVzb3VyY2VUeXBlXSA9IGdldFJlc291cmNlVmlld01vZGVsKFxuICAgICAgICAgICAgICAgIHJlc291cmNlc1tyZXNvdXJjZUtpbmRdW3Jlc291cmNlVHlwZV0sXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VUeXBlLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7fSBhcyBSZWNvcmQ8QXZhaWxhYmxlUmVzb3VyY2VUeXBlLCBSZXNvdXJjZUNvbnRyb2w+LFxuICAgICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlKHRoaXMuZ2V0RGVmYXVsdEZvcm1Nb2RlbCgpLCByZXNvdXJjZXNNb2RlbCk7XG4gIH1cblxuICBAYmluZFxuICBnZXRNaW5Pck1heEVycm9yc01hcHBlcihcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIGtpbmQ6ICdtaW4nIHwgJ21heCcsXG4gICAgdHlwZTogJ2NwdScgfCAnbWVtb3J5JyxcbiAgICBfbG9jYWxlOiBzdHJpbmcsXG4gICkge1xuICAgIGNvbnN0IHJlc291cmNlQ3RybCA9IGdldFJlc291cmNlVmlld01vZGVsKHZhbHVlLCB0eXBlKTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuZ2V0KGB3YXJuaW5nXyR7a2luZH1gLCB7XG4gICAgICB2YWx1ZTogcmVzb3VyY2VDdHJsLnZhbHVlICsgdGhpcy50cmFuc2xhdGUuZ2V0KHJlc291cmNlQ3RybC51bml0KSxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGZvcm1cbiAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgKm5nSWY9XCIhcmVhZE9ubHk7IGVsc2UgcmVhZE9ubHlUZW1wbGF0ZVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJyZXNvdXJjZV9yZXF1aXJlbWVudHNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtbGFiZWxcIj5cbiAgICAgIHt7ICdyZXNvdXJjZV9yZXF1aXJlbWVudHNfcmVxdWVzdHMnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJpbnB1dC1ncm91cC13cmFwcGVyIHR3LWl0ZW1zLXN0YXJ0XCJcbiAgICAgIGZvcm1Hcm91cE5hbWU9XCJyZXF1ZXN0c1wiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctZmxleC1jb2wgdHctZmxleC0xXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3Vwcy13cmFwcGVyIGNwdVwiXG4gICAgICAgICAgZm9ybUdyb3VwTmFtZT1cImNwdVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YXVpLWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBhdWlJbnB1dEFkZG9uQmVmb3JlXG4gICAgICAgICAgICAgIGNsYXNzPVwiYWRkb24tbGFiZWxcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ3R3LXJlcXVpcmVkLW1hcmsnOiByZXF1ZXN0Q3B1UmVxdWlyZWQsXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBDUFVcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGF1aS1pbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVlc3RDcHVSZXF1aXJlZFwiXG4gICAgICAgICAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGF1aS1zZWxlY3RcbiAgICAgICAgICAgICAgYXVpSW5wdXRBZGRvbkFmdGVyXG4gICAgICAgICAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ1bml0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdW5pdCBvZiByZXNvdXJjZVVuaXRzWydjcHUnXVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInVuaXQudmFsdWVcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJ1bml0LmxhYmVsIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHVuaXQubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9hdWktb3B0aW9uPlxuICAgICAgICAgICAgPC9hdWktc2VsZWN0PlxuICAgICAgICAgIDwvYXVpLWlucHV0LWdyb3VwPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGFjbC1lcnJvcnMtbWFwcGVyXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIGZvcm0uZ2V0KCdyZXF1ZXN0cy5jcHUudmFsdWUnKT8uZGlydHkgfHxcbiAgICAgICAgICAgICRhbnkoY29udHJvbENvbnRhaW5lcj8uZm9ybURpcmVjdGl2ZSk/LnN1Ym1pdHRlZFxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2Vycm9yc109XCJmb3JtLmdldCgncmVxdWVzdHMuY3B1LnZhbHVlJykuZXJyb3JzXCJcbiAgICAgICAgICBbZXJyb3JzTWFwcGVyXT1cIntcbiAgICAgICAgICAgIG1pbjpcbiAgICAgICAgICAgICAgcmVxdWVzdENwdU1pblxuICAgICAgICAgICAgICB8IHB1cmVcbiAgICAgICAgICAgICAgICA6IGdldE1pbk9yTWF4RXJyb3JzTWFwcGVyXG4gICAgICAgICAgICAgICAgOiAnbWluJ1xuICAgICAgICAgICAgICAgIDogJ2NwdSdcbiAgICAgICAgICAgICAgICA6IHRyYW5zbGF0ZS5sb2NhbGUsXG4gICAgICAgICAgICBtYXg6XG4gICAgICAgICAgICAgIHJlcXVlc3RDcHVNYXhcbiAgICAgICAgICAgICAgfCBwdXJlXG4gICAgICAgICAgICAgICAgOiBnZXRNaW5Pck1heEVycm9yc01hcHBlclxuICAgICAgICAgICAgICAgIDogJ21heCdcbiAgICAgICAgICAgICAgICA6ICdjcHUnXG4gICAgICAgICAgICAgICAgOiB0cmFuc2xhdGUubG9jYWxlLFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIGNsYXNzPVwidHctdGV4dC1zIHR3LXRleHQtcmVkXCJcbiAgICAgICAgPlxuICAgICAgICA8L2FjbC1lcnJvcnMtbWFwcGVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWZsZXgtY29sIHR3LWZsZXgtMVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnB1dC1ncm91cHMtd3JhcHBlciBtZW1vcnlcIlxuICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cIidtZW1vcnknXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxhdWktaW5wdXQtZ3JvdXA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGF1aUlucHV0QWRkb25CZWZvcmVcbiAgICAgICAgICAgICAgY2xhc3M9XCJhZGRvbi1sYWJlbFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAndHctcmVxdWlyZWQtbWFyayc6IHJlcXVlc3RNZW1vcnlSZXF1aXJlZCxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICdtZW1vcnknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBhdWktaW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1ZXN0TWVtb3J5UmVxdWlyZWRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxhdWktc2VsZWN0XG4gICAgICAgICAgICAgIGF1aUlucHV0QWRkb25BZnRlclxuICAgICAgICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidW5pdFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxhdWktb3B0aW9uXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHVuaXQgb2YgcmVzb3VyY2VVbml0c1snbWVtb3J5J11cIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ1bml0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHVuaXQgfX1cbiAgICAgICAgICAgICAgPC9hdWktb3B0aW9uPlxuICAgICAgICAgICAgPC9hdWktc2VsZWN0PlxuICAgICAgICAgIDwvYXVpLWlucHV0LWdyb3VwPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGFjbC1lcnJvcnMtbWFwcGVyXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIGZvcm0uZ2V0KCdyZXF1ZXN0cy5tZW1vcnkudmFsdWUnKT8uZGlydHkgfHxcbiAgICAgICAgICAgICRhbnkoY29udHJvbENvbnRhaW5lcj8uZm9ybURpcmVjdGl2ZSk/LnN1Ym1pdHRlZFxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2Vycm9yc109XCJmb3JtLmdldCgncmVxdWVzdHMubWVtb3J5LnZhbHVlJykuZXJyb3JzXCJcbiAgICAgICAgICBbZXJyb3JzTWFwcGVyXT1cIntcbiAgICAgICAgICAgIG1pbjpcbiAgICAgICAgICAgICAgcmVxdWVzdE1lbW9yeU1pblxuICAgICAgICAgICAgICB8IHB1cmVcbiAgICAgICAgICAgICAgICA6IGdldE1pbk9yTWF4RXJyb3JzTWFwcGVyXG4gICAgICAgICAgICAgICAgOiAnbWluJ1xuICAgICAgICAgICAgICAgIDogJ21lbW9yeSdcbiAgICAgICAgICAgICAgICA6IHRyYW5zbGF0ZS5sb2NhbGUsXG4gICAgICAgICAgICBtYXg6XG4gICAgICAgICAgICAgIHJlcXVlc3RNZW1vcnlNYXhcbiAgICAgICAgICAgICAgfCBwdXJlXG4gICAgICAgICAgICAgICAgOiBnZXRNaW5Pck1heEVycm9yc01hcHBlclxuICAgICAgICAgICAgICAgIDogJ21heCdcbiAgICAgICAgICAgICAgICA6ICdtZW1vcnknXG4gICAgICAgICAgICAgICAgOiB0cmFuc2xhdGUubG9jYWxlLFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIGNsYXNzPVwidHctdGV4dC1zIHR3LXRleHQtcmVkXCJcbiAgICAgICAgPlxuICAgICAgICA8L2FjbC1lcnJvcnMtbWFwcGVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicmVzb3VyY2VfcmVxdWlyZW1lbnRzXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWxhYmVsXCI+XG4gICAgICB7eyAncmVzb3VyY2VfcmVxdWlyZW1lbnRzX2xpbWl0cycgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImlucHV0LWdyb3VwLXdyYXBwZXIgdHctaXRlbXMtc3RhcnRcIlxuICAgICAgZm9ybUdyb3VwTmFtZT1cImxpbWl0c1wiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctZmxleC1jb2wgdHctZmxleC0xXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3Vwcy13cmFwcGVyIGNwdVwiXG4gICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiJ2NwdSdcIlxuICAgICAgICA+XG4gICAgICAgICAgPGF1aS1pbnB1dC1ncm91cD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgYXVpSW5wdXRBZGRvbkJlZm9yZVxuICAgICAgICAgICAgICBjbGFzcz1cImFkZG9uLWxhYmVsXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICd0dy1yZXF1aXJlZC1tYXJrJzogbGltaXRDcHVSZXF1aXJlZCxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIENQVVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgYXVpLWlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwibGltaXRDcHVSZXF1aXJlZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGF1aS1zZWxlY3RcbiAgICAgICAgICAgICAgYXVpSW5wdXRBZGRvbkFmdGVyXG4gICAgICAgICAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ1bml0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdW5pdCBvZiByZXNvdXJjZVVuaXRzWydjcHUnXVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInVuaXQudmFsdWVcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJ1bml0LmxhYmVsIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHVuaXQubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9hdWktb3B0aW9uPlxuICAgICAgICAgICAgPC9hdWktc2VsZWN0PlxuICAgICAgICAgIDwvYXVpLWlucHV0LWdyb3VwPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGFjbC1lcnJvcnMtbWFwcGVyXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIGZvcm0uZ2V0KCdsaW1pdHMuY3B1LnZhbHVlJyk/LmRpcnR5IHx8XG4gICAgICAgICAgICAkYW55KGNvbnRyb2xDb250YWluZXI/LmZvcm1EaXJlY3RpdmUpPy5zdWJtaXR0ZWRcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtlcnJvcnNdPVwiZm9ybS5nZXQoJ2xpbWl0cy5jcHUudmFsdWUnKS5lcnJvcnNcIlxuICAgICAgICAgIFtlcnJvcnNNYXBwZXJdPVwie1xuICAgICAgICAgICAgY3B1X21heDogJ3JlcXVlc3RfZ3JlYXRlcl90aGFuX2xpbWl0c19lcnJvcicgfCB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtaW46XG4gICAgICAgICAgICAgIGxpbWl0Q3B1TWluXG4gICAgICAgICAgICAgIHwgcHVyZVxuICAgICAgICAgICAgICAgIDogZ2V0TWluT3JNYXhFcnJvcnNNYXBwZXJcbiAgICAgICAgICAgICAgICA6ICdtaW4nXG4gICAgICAgICAgICAgICAgOiAnY3B1J1xuICAgICAgICAgICAgICAgIDogdHJhbnNsYXRlLmxvY2FsZSxcbiAgICAgICAgICAgIG1heDpcbiAgICAgICAgICAgICAgbGltaXRDcHVNYXhcbiAgICAgICAgICAgICAgfCBwdXJlXG4gICAgICAgICAgICAgICAgOiBnZXRNaW5Pck1heEVycm9yc01hcHBlclxuICAgICAgICAgICAgICAgIDogJ21heCdcbiAgICAgICAgICAgICAgICA6ICdjcHUnXG4gICAgICAgICAgICAgICAgOiB0cmFuc2xhdGUubG9jYWxlLFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIGNsYXNzPVwidHctdGV4dC1zIHR3LXRleHQtcmVkXCJcbiAgICAgICAgPlxuICAgICAgICA8L2FjbC1lcnJvcnMtbWFwcGVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWZsZXgtY29sIHR3LWZsZXgtMVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnB1dC1ncm91cHMtd3JhcHBlciBtZW1vcnlcIlxuICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cIidtZW1vcnknXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxhdWktaW5wdXQtZ3JvdXA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGF1aUlucHV0QWRkb25CZWZvcmVcbiAgICAgICAgICAgICAgY2xhc3M9XCJhZGRvbi1sYWJlbFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAndHctcmVxdWlyZWQtbWFyayc6IGxpbWl0TWVtb3J5UmVxdWlyZWQsXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnbWVtb3J5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgYXVpLWlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwibGltaXRNZW1vcnlSZXF1aXJlZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGF1aS1zZWxlY3RcbiAgICAgICAgICAgICAgYXVpSW5wdXRBZGRvbkFmdGVyXG4gICAgICAgICAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ1bml0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdW5pdCBvZiByZXNvdXJjZVVuaXRzWydtZW1vcnknXVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInVuaXRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdW5pdCB9fVxuICAgICAgICAgICAgICA8L2F1aS1vcHRpb24+XG4gICAgICAgICAgICA8L2F1aS1zZWxlY3Q+XG4gICAgICAgICAgPC9hdWktaW5wdXQtZ3JvdXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YWNsLWVycm9ycy1tYXBwZXJcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgZm9ybS5nZXQoJ2xpbWl0cy5tZW1vcnkudmFsdWUnKT8uZGlydHkgfHxcbiAgICAgICAgICAgICRhbnkoY29udHJvbENvbnRhaW5lcj8uZm9ybURpcmVjdGl2ZSk/LnN1Ym1pdHRlZFxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2Vycm9yc109XCJmb3JtLmdldCgnbGltaXRzLm1lbW9yeS52YWx1ZScpLmVycm9yc1wiXG4gICAgICAgICAgW2Vycm9yc01hcHBlcl09XCJ7XG4gICAgICAgICAgICBtZW1vcnlfbWF4OiAncmVxdWVzdF9ncmVhdGVyX3RoYW5fbGltaXRzX2Vycm9yJyB8IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1pbjpcbiAgICAgICAgICAgICAgbGltaXRNZW1vcnlNaW5cbiAgICAgICAgICAgICAgfCBwdXJlXG4gICAgICAgICAgICAgICAgOiBnZXRNaW5Pck1heEVycm9yc01hcHBlclxuICAgICAgICAgICAgICAgIDogJ21pbidcbiAgICAgICAgICAgICAgICA6ICdtZW1vcnknXG4gICAgICAgICAgICAgICAgOiB0cmFuc2xhdGUubG9jYWxlLFxuICAgICAgICAgICAgbWF4OlxuICAgICAgICAgICAgICBsaW1pdE1lbW9yeU1heFxuICAgICAgICAgICAgICB8IHB1cmVcbiAgICAgICAgICAgICAgICA6IGdldE1pbk9yTWF4RXJyb3JzTWFwcGVyXG4gICAgICAgICAgICAgICAgOiAnbWF4J1xuICAgICAgICAgICAgICAgIDogJ21lbW9yeSdcbiAgICAgICAgICAgICAgICA6IHRyYW5zbGF0ZS5sb2NhbGUsXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgY2xhc3M9XCJ0dy10ZXh0LXMgdHctdGV4dC1yZWRcIlxuICAgICAgICA+XG4gICAgICAgIDwvYWNsLWVycm9ycy1tYXBwZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Zvcm0+XG5cbjxuZy10ZW1wbGF0ZSAjcmVhZE9ubHlUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cInJlc291cmNlX3JlcXVpcmVtZW50cy1kaXNwbGF5XCI+XG4gICAgPGRpdiBjbGFzcz1cInJlc291cmNlX3JlcXVpcmVtZW50cy1kaXNwbGF5LWl0ZW1cIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInJlc291cmNlX3JlcXVpcmVtZW50cy1kaXNwbGF5LWl0ZW1fX2xhYmVsXCI+e3tcbiAgICAgICAgJ3Jlc291cmNlX3JlcXVpcmVtZW50c19yZXF1ZXN0cycgfCB0cmFuc2xhdGVcbiAgICAgIH19PC9sYWJlbD5cbiAgICAgIDxhdWktaWNvblxuICAgICAgICBpY29uPVwicHJvZDpjcHVcIlxuICAgICAgICBzaXplPVwiMTZweFwiXG4gICAgICAgIGNvbG9yPVwiIzYzNTliNFwiXG4gICAgICAgIG1hcmdpbj1cInJpZ2h0XCJcbiAgICAgICAgW3RpdGxlXT1cIidjcHUnIHwgdHJhbnNsYXRlXCJcbiAgICAgID48L2F1aS1pY29uXG4gICAgICA+PHNwYW4gY2xhc3M9XCJ0dy1tci0xNlwiXG4gICAgICAgID57e1xuICAgICAgICAgIGZvcm0uZ2V0KCdyZXF1ZXN0cycpLmdldCgnY3B1JykudmFsdWVcbiAgICAgICAgICAgIHwgcHVyZTogZ2V0UmVzb3VyY2VWYWx1ZVxuICAgICAgICAgICAgfCBhY2xGaWVsZE5vdEF2YWlsYWJsZVxuICAgICAgICB9fXt7XG4gICAgICAgICAgZm9ybS5nZXQoJ3JlcXVlc3RzJykuZ2V0KCdjcHUudW5pdCcpLnZhbHVlXG4gICAgICAgICAgICB8IHB1cmU6IGdldENwdVVuaXRMYWJlbFxuICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxhdWktaWNvblxuICAgICAgICBpY29uPVwicHJvZDptZW1vcnlcIlxuICAgICAgICBzaXplPVwiMTZweFwiXG4gICAgICAgIGNvbG9yPVwiIzAwN2NiNVwiXG4gICAgICAgIG1hcmdpbj1cInJpZ2h0XCJcbiAgICAgICAgW3RpdGxlXT1cIidtZW1vcnknIHwgdHJhbnNsYXRlXCJcbiAgICAgID48L2F1aS1pY29uXG4gICAgICA+e3tcbiAgICAgICAgZm9ybS5nZXQoJ3JlcXVlc3RzJykuZ2V0KCdtZW1vcnknKS52YWx1ZVxuICAgICAgICAgIHwgcHVyZTogZ2V0UmVzb3VyY2VWYWx1ZVxuICAgICAgICAgIHwgYWNsRmllbGROb3RBdmFpbGFibGVcbiAgICAgIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInJlc291cmNlX3JlcXVpcmVtZW50cy1kaXNwbGF5LWl0ZW1cIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInJlc291cmNlX3JlcXVpcmVtZW50cy1kaXNwbGF5LWl0ZW1fX2xhYmVsXCI+e3tcbiAgICAgICAgJ3Jlc291cmNlX3JlcXVpcmVtZW50c19saW1pdHMnIHwgdHJhbnNsYXRlXG4gICAgICB9fTwvbGFiZWw+XG4gICAgICA8YXVpLWljb25cbiAgICAgICAgaWNvbj1cInByb2Q6Y3B1XCJcbiAgICAgICAgc2l6ZT1cIjE2cHhcIlxuICAgICAgICBjb2xvcj1cIiM2MzU5YjRcIlxuICAgICAgICBtYXJnaW49XCJyaWdodFwiXG4gICAgICAgIFt0aXRsZV09XCInY3B1JyB8IHRyYW5zbGF0ZVwiXG4gICAgICA+PC9hdWktaWNvblxuICAgICAgPjxzcGFuIGNsYXNzPVwidHctbXItMTZcIlxuICAgICAgICA+e3tcbiAgICAgICAgICBmb3JtLmdldCgnbGltaXRzJykuZ2V0KCdjcHUnKS52YWx1ZVxuICAgICAgICAgICAgfCBwdXJlOiBnZXRSZXNvdXJjZVZhbHVlXG4gICAgICAgICAgICB8IGFjbEZpZWxkTm90QXZhaWxhYmxlXG4gICAgICAgIH19e3tcbiAgICAgICAgICBmb3JtLmdldCgnbGltaXRzJykuZ2V0KCdjcHUudW5pdCcpLnZhbHVlXG4gICAgICAgICAgICB8IHB1cmU6IGdldENwdVVuaXRMYWJlbFxuICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxhdWktaWNvblxuICAgICAgICBpY29uPVwicHJvZDptZW1vcnlcIlxuICAgICAgICBzaXplPVwiMTZweFwiXG4gICAgICAgIGNvbG9yPVwiIzAwN2NiNVwiXG4gICAgICAgIG1hcmdpbj1cInJpZ2h0XCJcbiAgICAgICAgW3RpdGxlXT1cIidtZW1vcnknIHwgdHJhbnNsYXRlXCJcbiAgICAgID48L2F1aS1pY29uXG4gICAgICA+e3tcbiAgICAgICAgZm9ybS5nZXQoJ2xpbWl0cycpLmdldCgnbWVtb3J5JykudmFsdWVcbiAgICAgICAgICB8IHB1cmU6IGdldFJlc291cmNlVmFsdWVcbiAgICAgICAgICB8IGFjbEZpZWxkTm90QXZhaWxhYmxlXG4gICAgICB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=