@alauda-fe/common 1.4.28-beta.6 → 1.4.28

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 (165) hide show
  1. package/array-form-table/form/component.d.ts +1 -1
  2. package/code/code-editor-configs.d.ts +2 -0
  3. package/code/managed-fields-folder.util.d.ts +35 -0
  4. package/code/public-api.d.ts +4 -0
  5. package/code/resource-yaml-display/component.d.ts +64 -6
  6. package/code/resource-yaml-editor/component.d.ts +95 -0
  7. package/code/yaml-examples.d.ts +8 -0
  8. package/code/yaml-sidebar/component.d.ts +57 -0
  9. package/code/yaml-sidebar/types.d.ts +21 -0
  10. package/core/abstract/base-nested-form-control.d.ts +1 -1
  11. package/core/services/kubernetes-schema.service.d.ts +44 -0
  12. package/core/services/public-api.d.ts +1 -0
  13. package/core/types/openapi.d.ts +37 -0
  14. package/core/types/public-api.d.ts +1 -0
  15. package/esm2022/abnormal-page/abnormal-page.component.mjs +1 -1
  16. package/esm2022/array-form-table/form/component.mjs +1 -1
  17. package/esm2022/array-form-table/key-value-form/component.mjs +1 -1
  18. package/esm2022/array-form-table/key-value-table/component.mjs +1 -1
  19. package/esm2022/array-form-table/string-array-form/component.mjs +1 -1
  20. package/esm2022/async-data/error-page/component.mjs +1 -1
  21. package/esm2022/async-data/page-state/component.mjs +1 -1
  22. package/esm2022/business/notification-disabled-container/component.mjs +1 -1
  23. package/esm2022/business/resource-select/exports/cluster-list/component.mjs +1 -1
  24. package/esm2022/business/resource-select/exports/cluster-selector/component.mjs +1 -1
  25. package/esm2022/business/resource-select/exports/icon/component.mjs +1 -1
  26. package/esm2022/business/resource-select/exports/mesh-group-selector/component.mjs +1 -1
  27. package/esm2022/business/resource-select/exports/namespace-list/component.mjs +1 -1
  28. package/esm2022/business/resource-select/exports/namespace-page/component.mjs +1 -1
  29. package/esm2022/business/resource-select/exports/namespace-selector/component.mjs +1 -1
  30. package/esm2022/business/resource-select/exports/project-list/component.mjs +1 -1
  31. package/esm2022/business/resource-select/exports/project-page/component.mjs +1 -1
  32. package/esm2022/business/resource-select/exports/project-selector/component.mjs +1 -1
  33. package/esm2022/business/resource-select/internals/data-grid/component.mjs +1 -1
  34. package/esm2022/business/resource-select/internals/meshgroup-list/component.mjs +1 -1
  35. package/esm2022/business/resource-select/internals/no-data/component.mjs +1 -1
  36. package/esm2022/business/resource-select/internals/resource-dashboard/component.mjs +1 -1
  37. package/esm2022/business/resource-select/internals/selector-popup/component.mjs +1 -1
  38. package/esm2022/chart/common/axis/axis-label.component.mjs +1 -1
  39. package/esm2022/chart/common/axis/x-axis-ticks.component.mjs +1 -1
  40. package/esm2022/chart/common/axis/x-axis.component.mjs +1 -1
  41. package/esm2022/chart/common/axis/x-plot-lines.component.mjs +1 -1
  42. package/esm2022/chart/common/axis/y-axis-ticks.component.mjs +1 -1
  43. package/esm2022/chart/common/axis/y-axis.component.mjs +1 -1
  44. package/esm2022/chart/common/axis/y-plot-lines.component.mjs +1 -1
  45. package/esm2022/chart/common/chart/chart.component.mjs +1 -1
  46. package/esm2022/chart/common/legend/legend.component.mjs +1 -1
  47. package/esm2022/chart/common/range-area/range-area.component.mjs +1 -1
  48. package/esm2022/chart/common/reference-area/reference-area.component.mjs +1 -1
  49. package/esm2022/chart/common/series/area-series.component.mjs +1 -1
  50. package/esm2022/chart/common/series/bar-path.component.mjs +1 -1
  51. package/esm2022/chart/common/series/bar-series.component.mjs +1 -1
  52. package/esm2022/chart/common/series/line-series.component.mjs +1 -1
  53. package/esm2022/chart/common/tooltip/tooltip.component.mjs +1 -1
  54. package/esm2022/chart/custom-template/dropdown-legend.mjs +1 -1
  55. package/esm2022/code/code-display-dialog/component.mjs +1 -1
  56. package/esm2022/code/code-editor-configs.mjs +12 -2
  57. package/esm2022/code/k8s-yaml-display-dialog/component.mjs +1 -1
  58. package/esm2022/code/managed-fields-folder.util.mjs +147 -0
  59. package/esm2022/code/public-api.mjs +5 -1
  60. package/esm2022/code/resource-yaml-display/component.mjs +257 -43
  61. package/esm2022/code/resource-yaml-editor/component.mjs +392 -0
  62. package/esm2022/code/yaml-examples.mjs +337 -0
  63. package/esm2022/code/yaml-sidebar/component.mjs +482 -0
  64. package/esm2022/code/yaml-sidebar/types.mjs +2 -0
  65. package/esm2022/core/components/tree/node/component.mjs +1 -1
  66. package/esm2022/core/components/tree/tree/component.mjs +1 -1
  67. package/esm2022/core/directives/readonly-field.directive.mjs +1 -1
  68. package/esm2022/core/services/kubernetes-schema.service.mjs +129 -0
  69. package/esm2022/core/services/public-api.mjs +2 -1
  70. package/esm2022/core/services/workspace-helper.service.mjs +4 -3
  71. package/esm2022/core/types/openapi.mjs +2 -0
  72. package/esm2022/core/types/public-api.mjs +2 -1
  73. package/esm2022/custom-columns-setting/component.mjs +1 -1
  74. package/esm2022/disabled-container/disabled-container.component.mjs +1 -1
  75. package/esm2022/editable/editable.component.mjs +1 -1
  76. package/esm2022/editable-text/component.mjs +1 -1
  77. package/esm2022/exec/placeholder/component.mjs +1 -1
  78. package/esm2022/exec/terminal/component.mjs +1 -1
  79. package/esm2022/exec/terminal-group/component.mjs +3 -3
  80. package/esm2022/feature-gate-forbidden/component/component.mjs +1 -1
  81. package/esm2022/form/errors-mapper/errors-mapper-component/component.mjs +1 -1
  82. package/esm2022/form/errors-mapper/errors-mapper.directive.mjs +1 -1
  83. package/esm2022/form/labels-editor/component.mjs +1 -1
  84. package/esm2022/form/taints-editor/component.mjs +1 -1
  85. package/esm2022/form/upload-file/component.mjs +1 -1
  86. package/esm2022/form/validators/strong-password/strong-password-tooltip/component.mjs +1 -1
  87. package/esm2022/graph-canvas/components/graph-actions.component.mjs +1 -1
  88. package/esm2022/graph-canvas/components/graph-canvas.component.mjs +1 -1
  89. package/esm2022/graph-canvas/components/graph-link.component.mjs +1 -1
  90. package/esm2022/graph-canvas/components/graph-links.component.mjs +1 -1
  91. package/esm2022/grid-layout/components/grid/component.mjs +1 -1
  92. package/esm2022/grid-layout/components/grid-items/component.mjs +1 -1
  93. package/esm2022/help-document/component.mjs +1 -1
  94. package/esm2022/k8s-resource-list/footer/component.mjs +1 -1
  95. package/esm2022/k8s-shared/resource-mark/k8s-resource-mark.component.mjs +1 -1
  96. package/esm2022/k8s-shared/update-description-dialog/component.mjs +1 -1
  97. package/esm2022/k8s-shared/update-display-name-dialog/component.mjs +1 -1
  98. package/esm2022/k8s-shared/update-key-value-dialog/component.mjs +1 -1
  99. package/esm2022/lazy-component/lazy-load-component.mjs +1 -1
  100. package/esm2022/license/license-error/component.mjs +1 -1
  101. package/esm2022/list-display/component.mjs +1 -1
  102. package/esm2022/metric-chart/metric-chart.component.mjs +1 -1
  103. package/esm2022/metric-chart/metric-time-pick.mjs +1 -1
  104. package/esm2022/multi-search/action-input/component.mjs +1 -1
  105. package/esm2022/multi-search/form/component.mjs +1 -1
  106. package/esm2022/multi-search/multi-search-tags/component.mjs +1 -1
  107. package/esm2022/mutable/mosaic/mosaic.component.mjs +1 -1
  108. package/esm2022/notification/feedback-notification/component.mjs +1 -1
  109. package/esm2022/overview-banner/overview-banner.component.mjs +1 -1
  110. package/esm2022/page-guard/component/component.mjs +1 -1
  111. package/esm2022/page-scaffold/navigation/breadcrumb/breadcrumb.component.mjs +1 -1
  112. package/esm2022/page-scaffold/navigation/nav-menu/nav-item-li/nav-item-li.component.mjs +1 -1
  113. package/esm2022/page-scaffold/navigation/nav-menu/nav-item-ul/nav-item-ul.component.mjs +1 -1
  114. package/esm2022/page-scaffold/navigation/nav-menu/nav-menu.component.mjs +1 -1
  115. package/esm2022/page-scaffold/page/notices/maintenance.component.mjs +1 -1
  116. package/esm2022/page-scaffold/page/notices/notice.component.mjs +1 -1
  117. package/esm2022/page-scaffold/page/page.component.mjs +1 -1
  118. package/esm2022/page-scaffold/page-header/account-menu/component/component.mjs +1 -1
  119. package/esm2022/page-scaffold/page-header/common-layout/namespace-select/component.mjs +1 -1
  120. package/esm2022/page-scaffold/page-header/common-layout/product-select/component.mjs +1 -1
  121. package/esm2022/page-scaffold/page-header/component.mjs +1 -1
  122. package/esm2022/page-scaffold/page-header/enterprise-support-status/component.mjs +1 -1
  123. package/esm2022/page-scaffold/page-header/header-notify/component/header-notify.component.mjs +1 -1
  124. package/esm2022/page-scaffold/page-header/header-notify/component/notification-list/notification-list.component.mjs +1 -1
  125. package/esm2022/page-scaffold/page-header/help-menu/component/component.mjs +1 -1
  126. package/esm2022/pie-derivative-chart/donut-status/component.mjs +1 -1
  127. package/esm2022/pie-derivative-chart/radial-bar/radial-bar-chart.component.mjs +1 -1
  128. package/esm2022/pod-status/component.mjs +1 -1
  129. package/esm2022/searchable-selector/component.mjs +1 -1
  130. package/esm2022/skeleton/item/component.mjs +1 -1
  131. package/esm2022/skeleton/nav-skeleton/component.mjs +1 -1
  132. package/esm2022/table/component.mjs +1 -1
  133. package/esm2022/view-chart/custom-template/dropdown-legend.mjs +1 -1
  134. package/esm2022/view-chart/legend/legend.component.mjs +1 -1
  135. package/esm2022/view-chart/view-chart.component.mjs +1 -1
  136. package/esm2022/view-zchart/custom-template/dropdown-legend.mjs +1 -1
  137. package/esm2022/view-zchart/legend/legend.component.mjs +1 -1
  138. package/esm2022/view-zchart/view-zchart.component.mjs +1 -1
  139. package/esm2022/widget/card-section/card-section.component.mjs +1 -1
  140. package/esm2022/widget/confirm-delete/confirm-delete.component.mjs +1 -1
  141. package/esm2022/widget/current-time/component.mjs +1 -1
  142. package/esm2022/widget/date-range-picker/component.mjs +1 -1
  143. package/esm2022/widget/field-set/column/component.mjs +2 -2
  144. package/esm2022/widget/field-set/group/component.mjs +1 -1
  145. package/esm2022/widget/field-set/item/component.mjs +1 -1
  146. package/esm2022/widget/foldable-block/component.mjs +1 -1
  147. package/esm2022/widget/foldable-item-in-table/component.mjs +1 -1
  148. package/esm2022/widget/loading-mask/loading-mask.component.mjs +1 -1
  149. package/esm2022/widget/password-input/component.mjs +1 -1
  150. package/esm2022/widget/relative-time/component.mjs +1 -1
  151. package/esm2022/widget/resource-label/component.mjs +1 -1
  152. package/esm2022/widget/resource-multi-select/component.mjs +1 -1
  153. package/esm2022/widget/search-panel/component.mjs +1 -1
  154. package/esm2022/widget/search-panel/search-item/component.mjs +1 -1
  155. package/esm2022/widget/status-icon/status-icon.component.mjs +1 -1
  156. package/esm2022/widget/tags-label/component.mjs +1 -1
  157. package/esm2022/widget/terminating-tag/component.mjs +1 -1
  158. package/esm2022/widget/text-ellipsis/component.mjs +1 -1
  159. package/esm2022/widget/text-with-url/component.mjs +1 -1
  160. package/esm2022/widget/zero-state/zero-state.component.mjs +1 -1
  161. package/esm2022/workload-status-icon/component.mjs +1 -1
  162. package/esm2022/xterm/xterm-terminal/xterm-terminal.component.mjs +1 -1
  163. package/esm2022/xterm/xterm.component.mjs +1 -1
  164. package/package.json +1 -1
  165. package/styles/global.scss +4 -0
@@ -0,0 +1,392 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { CodeEditorModule, MonacoLanguageService, } from '@alauda/code-editor';
3
+ import { CARD_MODULE, CHECKBOX_MODULE, ButtonModule, IconModule, TooltipModule, } from '@alauda/ui';
4
+ import { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common';
5
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, forwardRef, } from '@angular/core';
6
+ import { FormsModule, NG_VALUE_ACCESSOR, } from '@angular/forms';
7
+ import { yamlDefaults } from 'monaco-yaml';
8
+ import { BehaviorSubject, combineLatest, Observable, map, distinctUntilChanged, of, switchMap, shareReplay, takeUntil, Subject, } from 'rxjs';
9
+ import { KubernetesSchemaService } from '../../core/services/kubernetes-schema.service';
10
+ import { YamlUtilService } from '../../core/services/yaml-util.service';
11
+ import { ObservableInput } from '../../core/utils/decorators';
12
+ import { publishRef } from '../../core/utils/operators';
13
+ import { parseAll, stringify } from '../../core/utils/yaml';
14
+ import { TRANSLATE_MODULE } from '../../translate/translate.module';
15
+ import { updateActions, yamlWriteMinimapOptions } from '../code-editor-configs';
16
+ import { foldManagedFields, } from '../managed-fields-folder.util';
17
+ import { ResourceYamlSidebarComponent } from '../yaml-sidebar/component';
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "../../core/services/yaml-util.service";
20
+ import * as i2 from "../../core/services/kubernetes-schema.service";
21
+ import * as i3 from "@alauda/code-editor";
22
+ import * as i4 from "@alauda/ui";
23
+ import * as i5 from "@angular/forms";
24
+ import * as i6 from "../../translate/translate.pipe";
25
+ const _c0 = ["codeEditor"];
26
+ function ResourceYamlEditorComponent_aui_card_0_ng_container_1_Template(rf, ctx) { if (rf & 1) {
27
+ i0.ɵɵelementContainer(0);
28
+ } }
29
+ function ResourceYamlEditorComponent_aui_card_0_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelementStart(0, "aui-card");
31
+ i0.ɵɵtemplate(1, ResourceYamlEditorComponent_aui_card_0_ng_container_1_Template, 1, 0, "ng-container", 3);
32
+ i0.ɵɵelementEnd();
33
+ } if (rf & 2) {
34
+ i0.ɵɵnextContext();
35
+ const content_r1 = i0.ɵɵreference(2);
36
+ i0.ɵɵadvance();
37
+ i0.ɵɵproperty("ngTemplateOutlet", content_r1);
38
+ } }
39
+ function ResourceYamlEditorComponent_ng_template_1_button_6_Template(rf, ctx) { if (rf & 1) {
40
+ const _r4 = i0.ɵɵgetCurrentView();
41
+ i0.ɵɵelementStart(0, "button", 10);
42
+ i0.ɵɵpipe(1, "async");
43
+ i0.ɵɵpipe(2, "async");
44
+ i0.ɵɵpipe(3, "async");
45
+ i0.ɵɵpipe(4, "translate");
46
+ i0.ɵɵlistener("click", function ResourceYamlEditorComponent_ng_template_1_button_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleSidebar()); });
47
+ i0.ɵɵelement(5, "aui-icon", 11);
48
+ i0.ɵɵpipe(6, "async");
49
+ i0.ɵɵelementEnd();
50
+ } if (rf & 2) {
51
+ i0.ɵɵnextContext();
52
+ const codeEditor_r5 = i0.ɵɵreference(4);
53
+ const ctx_r2 = i0.ɵɵnextContext();
54
+ i0.ɵɵproperty("hidden", !!codeEditor_r5.fullscreenDialog)("type", i0.ɵɵpipeBind1(1, 5, ctx_r2.showSidebar$$) ? "primary" : "text")("disabled", !i0.ɵɵpipeBind1(2, 7, ctx_r2.finalSchema$))("auiTooltip", i0.ɵɵpipeBind1(4, 11, i0.ɵɵpipeBind1(3, 9, ctx_r2.showSidebar$$) ? "hide_sidebar" : "view_sidebar"));
55
+ i0.ɵɵadvance(5);
56
+ i0.ɵɵproperty("icon", i0.ɵɵpipeBind1(6, 13, ctx_r2.showSidebar$$) ? "prod:expand_sidebar" : "prod:collapse_sidebar");
57
+ } }
58
+ function ResourceYamlEditorComponent_ng_template_1_div_8_Template(rf, ctx) { if (rf & 1) {
59
+ const _r6 = i0.ɵɵgetCurrentView();
60
+ i0.ɵɵelementStart(0, "div", 12)(1, "acl-resource-yaml-sidebar", 13);
61
+ i0.ɵɵpipe(2, "async");
62
+ i0.ɵɵlistener("close", function ResourceYamlEditorComponent_ng_template_1_div_8_Template_acl_resource_yaml_sidebar_close_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleSidebar()); })("tryYaml", function ResourceYamlEditorComponent_ng_template_1_div_8_Template_acl_resource_yaml_sidebar_tryYaml_1_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onTryYaml($event)); });
63
+ i0.ɵɵelementEnd()();
64
+ } if (rf & 2) {
65
+ const ctx_r2 = i0.ɵɵnextContext(2);
66
+ i0.ɵɵadvance();
67
+ i0.ɵɵproperty("resource", ctx_r2.getCurrentResource())("schema", i0.ɵɵpipeBind1(2, 5, ctx_r2.finalSchema$))("schemaEnable", ctx_r2.schemaEnable)("exampleEnable", ctx_r2.exampleEnable)("extraExamples", ctx_r2.extraExamples);
68
+ } }
69
+ function ResourceYamlEditorComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {
70
+ const _r2 = i0.ɵɵgetCurrentView();
71
+ i0.ɵɵelementStart(0, "div", 4);
72
+ i0.ɵɵpipe(1, "async");
73
+ i0.ɵɵelementStart(2, "div", 5)(3, "aui-code-editor", 6, 1);
74
+ i0.ɵɵtwoWayListener("ngModelChange", function ResourceYamlEditorComponent_ng_template_1_Template_aui_code_editor_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.value, $event) || (ctx_r2.value = $event); return i0.ɵɵresetView($event); });
75
+ i0.ɵɵelementContainerStart(5, 7);
76
+ i0.ɵɵtemplate(6, ResourceYamlEditorComponent_ng_template_1_button_6_Template, 7, 15, "button", 8);
77
+ i0.ɵɵpipe(7, "async");
78
+ i0.ɵɵelementContainerEnd();
79
+ i0.ɵɵelementEnd()();
80
+ i0.ɵɵtemplate(8, ResourceYamlEditorComponent_ng_template_1_div_8_Template, 3, 7, "div", 9);
81
+ i0.ɵɵpipe(9, "async");
82
+ i0.ɵɵpipe(10, "async");
83
+ i0.ɵɵelementEnd();
84
+ } if (rf & 2) {
85
+ const ctx_r2 = i0.ɵɵnextContext();
86
+ i0.ɵɵclassProp("with-sidebar", i0.ɵɵpipeBind1(1, 9, ctx_r2.showSidebar$$));
87
+ i0.ɵɵadvance(3);
88
+ i0.ɵɵproperty("originalValue", ctx_r2.originalValue);
89
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r2.value);
90
+ i0.ɵɵproperty("options", ctx_r2.options)("actionsConfig", ctx_r2.actionsConfig)("modelUri", ctx_r2.modelUri);
91
+ i0.ɵɵadvance(3);
92
+ i0.ɵɵproperty("ngIf", ctx_r2.sidebarEnable && !!i0.ɵɵpipeBind1(7, 11, ctx_r2.resource$));
93
+ i0.ɵɵadvance(2);
94
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(9, 13, ctx_r2.showSidebar$$) && i0.ɵɵpipeBind1(10, 15, ctx_r2.resource$));
95
+ } }
96
+ export class ResourceYamlEditorComponent {
97
+ set originalValue(value) {
98
+ this._originalValue = value || '';
99
+ }
100
+ get originalValue() {
101
+ return this._originalValue;
102
+ }
103
+ constructor(yamlUtil, schemaService, monacoLanguageService) {
104
+ this.yamlUtil = yamlUtil;
105
+ this.schemaService = schemaService;
106
+ this.monacoLanguageService = monacoLanguageService;
107
+ this.destroy$ = new Subject();
108
+ this._value = '';
109
+ this._originalValue = '';
110
+ this.onChange = (_value) => {
111
+ // Placeholder for form control change callback
112
+ };
113
+ this.onTouched = () => {
114
+ // Placeholder for form control touched callback
115
+ };
116
+ this.showSidebar$$ = new BehaviorSubject(true);
117
+ this.showDebugPanel$$ = new BehaviorSubject(true);
118
+ this.monacoEditor = null;
119
+ this.registeredSchemas = new Set();
120
+ this.hasWrapper = true;
121
+ this.showDebugInfo = false;
122
+ this.sidebarEnable = true;
123
+ this.schemaEnable = true;
124
+ this.exampleEnable = true;
125
+ this.autoFoldManagedFields = true;
126
+ this.options = yamlWriteMinimapOptions;
127
+ this.actionsConfig = updateActions;
128
+ this.tryYaml = new EventEmitter();
129
+ this.autoFillNamespace = true;
130
+ this.hasFolded = false;
131
+ /**
132
+ * 自动获取的 schema,当没有手动提供 schema 时使用
133
+ */
134
+ this.autoSchema$ = this.resource$.pipe(switchMap(resource => {
135
+ if (!resource) {
136
+ return of(null);
137
+ }
138
+ const firstResource = (Array.isArray(resource) ? resource[0] : resource);
139
+ if (!firstResource?.apiVersion || !firstResource?.kind) {
140
+ return of(null);
141
+ }
142
+ return this.schemaService.getResourceSchema(firstResource.apiVersion, firstResource.kind);
143
+ }), publishRef());
144
+ /**
145
+ * 最终使用的 schema,优先使用手动提供的,否则使用自动获取的
146
+ */
147
+ this.finalSchema$ = combineLatest([this.schema$, this.autoSchema$]).pipe(map(([manualSchema, autoSchema]) => manualSchema || autoSchema), distinctUntilChanged(), shareReplay(1));
148
+ this.yamlSchemaService =
149
+ this.monacoLanguageService.getLanguageSchemaService(['yaml', 'yamlDefaults'], yamlDefaults);
150
+ // 自动设置 schema
151
+ combineLatest([this.resource$, this.finalSchema$])
152
+ .pipe(takeUntil(this.destroy$))
153
+ .subscribe(([resource, schema]) => {
154
+ if (resource && schema) {
155
+ const firstResource = Array.isArray(resource)
156
+ ? resource[0]
157
+ : resource;
158
+ if (firstResource && !Array.isArray(firstResource)) {
159
+ this.setYamlSchema(firstResource, schema);
160
+ }
161
+ }
162
+ });
163
+ this.autoSchema$.pipe(takeUntil(this.destroy$)).subscribe();
164
+ }
165
+ ngAfterViewInit() {
166
+ // 监听 YAML 内容变化,自动折叠 managedFields
167
+ if (this.autoFoldManagedFields && this.schemaService.definitions) {
168
+ this.selfFoldManagedFields();
169
+ }
170
+ }
171
+ selfFoldManagedFields() {
172
+ if (this.hasFolded) {
173
+ return;
174
+ }
175
+ this.hasFolded = true;
176
+ setTimeout(() => {
177
+ const editor = this.getEditorInstance();
178
+ if (editor) {
179
+ foldManagedFields(editor);
180
+ }
181
+ }, 0);
182
+ }
183
+ get value() {
184
+ return this._value;
185
+ }
186
+ set value(val) {
187
+ this._value = val;
188
+ this.onChange(val);
189
+ this.onTouched();
190
+ }
191
+ // ControlValueAccessor implementation
192
+ writeValue(value) {
193
+ this._value = value || '';
194
+ }
195
+ registerOnChange(fn) {
196
+ this.onChange = fn;
197
+ }
198
+ registerOnTouched(fn) {
199
+ this.onTouched = fn;
200
+ }
201
+ toggleSidebar() {
202
+ this.showSidebar$$.next(!this.showSidebar$$.value);
203
+ }
204
+ toggleDebugInfo() {
205
+ this.showDebugPanel$$.next(!this.showDebugPanel$$.value);
206
+ }
207
+ getCurrentResource() {
208
+ const resource = this.resource;
209
+ if (Array.isArray(resource)) {
210
+ return resource.length > 0 ? resource[0] : null;
211
+ }
212
+ return resource || null;
213
+ }
214
+ getCurrentSchema() {
215
+ return this.schema || null;
216
+ }
217
+ getDebugInfo() {
218
+ const resource = this.getCurrentResource();
219
+ return {
220
+ hasResource: !!resource,
221
+ resourceApiVersion: resource?.apiVersion,
222
+ resourceKind: resource?.kind,
223
+ hasManualSchema: !!this.schema,
224
+ workspaceHelperAvailable: this.schemaService.isWorkspaceHelperAvailable(),
225
+ currentWorkspace: this.schemaService.workspaceHelper?.baseParamsSnapshot,
226
+ };
227
+ }
228
+ onTryYaml(yamlContent) {
229
+ let targetYaml = yamlContent;
230
+ const namespace = this.schemaService.workspaceHelper?.baseParamsSnapshot?.namespace;
231
+ if (this.autoFillNamespace && namespace) {
232
+ targetYaml = parseAll(yamlContent)
233
+ .filter(r => !!r)
234
+ .map((r) => {
235
+ if (!r?.metadata?.namespace) {
236
+ return {
237
+ ...r,
238
+ metadata: {
239
+ ...r.metadata,
240
+ namespace,
241
+ },
242
+ };
243
+ }
244
+ return r;
245
+ })
246
+ .map(r => stringify(r, { sortMapEntries: true }))
247
+ .join('---\r\n');
248
+ }
249
+ this.tryYaml.emit(targetYaml);
250
+ }
251
+ /**
252
+ * 设置 YAML schema 以提供 hover 提示和自动完成
253
+ */
254
+ setYamlSchema(resource, schema) {
255
+ if (!schema) {
256
+ return;
257
+ }
258
+ // 使用 apiVersion + kind 组合作为标识
259
+ const apiVersion = resource?.apiVersion || 'unknown';
260
+ const kind = resource?.kind || 'unknown';
261
+ const schemaKey = `${apiVersion}/${kind}`;
262
+ this.modelUri = `${schemaKey}.yaml`;
263
+ this.selfFoldManagedFields();
264
+ // 检查是否已经注册过相同的 schema,避免重复注册
265
+ if (this.registeredSchemas.has(schemaKey)) {
266
+ return;
267
+ }
268
+ // 获取完整的 definitions 以支持 $ref 引用
269
+ const definitions = this.schemaService.definitions || {};
270
+ // 创建包含完整 definitions 的 schema 对象
271
+ const fullSchema = {
272
+ ...schema,
273
+ definitions,
274
+ };
275
+ // 确保schema被正确注册,并启用自动完成功能
276
+ this.yamlSchemaService.addSchema({
277
+ uri: `k8s://${schemaKey}.schema.json`,
278
+ fileMatch: [this.modelUri],
279
+ schema: fullSchema,
280
+ });
281
+ this.registeredSchemas.add(schemaKey);
282
+ }
283
+ /**
284
+ * 获取 Monaco 编辑器实例
285
+ */
286
+ getEditorInstance() {
287
+ if (!this.monacoEditor && this.codeEditorRef?.editor) {
288
+ this.monacoEditor = this.codeEditorRef.editor;
289
+ }
290
+ return this.monacoEditor;
291
+ }
292
+ /**
293
+ * 手动折叠 managedFields
294
+ */
295
+ foldManagedFields() {
296
+ const editor = this.getEditorInstance();
297
+ if (editor) {
298
+ foldManagedFields(editor);
299
+ }
300
+ }
301
+ ngOnDestroy() {
302
+ this.destroy$.next();
303
+ this.destroy$.complete();
304
+ }
305
+ static { this.ɵfac = function ResourceYamlEditorComponent_Factory(t) { return new (t || ResourceYamlEditorComponent)(i0.ɵɵdirectiveInject(i1.YamlUtilService), i0.ɵɵdirectiveInject(i2.KubernetesSchemaService), i0.ɵɵdirectiveInject(i3.MonacoLanguageService)); }; }
306
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ResourceYamlEditorComponent, selectors: [["acl-resource-yaml-editor"]], viewQuery: function ResourceYamlEditorComponent_Query(rf, ctx) { if (rf & 1) {
307
+ i0.ɵɵviewQuery(_c0, 5);
308
+ } if (rf & 2) {
309
+ let _t;
310
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.codeEditorRef = _t.first);
311
+ } }, inputs: { hasWrapper: "hasWrapper", showDebugInfo: "showDebugInfo", sidebarEnable: "sidebarEnable", schema: "schema", schemaEnable: "schemaEnable", exampleEnable: "exampleEnable", resource: "resource", autoFoldManagedFields: "autoFoldManagedFields", originalValue: "originalValue", options: "options", actionsConfig: "actionsConfig", autoFillNamespace: "autoFillNamespace", extraExamples: "extraExamples" }, outputs: { tryYaml: "tryYaml" }, standalone: true, features: [i0.ɵɵProvidersFeature([
312
+ {
313
+ provide: NG_VALUE_ACCESSOR,
314
+ useExisting: forwardRef(() => ResourceYamlEditorComponent),
315
+ multi: true,
316
+ },
317
+ ]), i0.ɵɵStandaloneFeature], decls: 3, vars: 2, consts: [["content", ""], ["codeEditor", ""], [4, "ngIf", "ngIfElse"], [4, "ngTemplateOutlet"], [1, "yaml-editor-container"], [1, "yaml-editor-section"], ["name", "yaml", 3, "ngModelChange", "originalValue", "ngModel", "options", "actionsConfig", "modelUri"], ["auiCodeEditorToolbarRightSide", ""], ["auiButton", "", "class", "aui-code-editor-toolbar__control-button", "size", "small", 3, "hidden", "type", "disabled", "auiTooltip", "click", 4, "ngIf"], ["class", "yaml-sidebar-section", 4, "ngIf"], ["auiButton", "", "size", "small", 1, "aui-code-editor-toolbar__control-button", 3, "click", "hidden", "type", "disabled", "auiTooltip"], [3, "icon"], [1, "yaml-sidebar-section"], [3, "close", "tryYaml", "resource", "schema", "schemaEnable", "exampleEnable", "extraExamples"]], template: function ResourceYamlEditorComponent_Template(rf, ctx) { if (rf & 1) {
318
+ i0.ɵɵtemplate(0, ResourceYamlEditorComponent_aui_card_0_Template, 2, 1, "aui-card", 2)(1, ResourceYamlEditorComponent_ng_template_1_Template, 11, 17, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
319
+ } if (rf & 2) {
320
+ const content_r1 = i0.ɵɵreference(2);
321
+ i0.ɵɵproperty("ngIf", ctx.hasWrapper)("ngIfElse", content_r1);
322
+ } }, dependencies: [i4.CardComponent, NgIf,
323
+ FormsModule, i5.NgControlStatus, i5.NgModel, ButtonModule,
324
+ CodeEditorModule, i3.CodeEditorComponent, i6.TranslatePipe, AsyncPipe,
325
+ NgTemplateOutlet,
326
+ ResourceYamlSidebarComponent,
327
+ IconModule, i4.IconComponent, TooltipModule, i4.TooltipDirective], styles: ["[_nghost-%COMP%]:not(.dialog-content){display:block;height:calc(100vh - (var(--acl-page-header-height) + 44px) - 147px)}[_nghost-%COMP%]:not(.dialog-content) .aui-code-editor{min-height:100%}[_nghost-%COMP%]:not(.dialog-content) > .aui-card[_ngcontent-%COMP%]{height:100%}[_nghost-%COMP%]:not(.dialog-content) > .aui-card[_ngcontent-%COMP%] .aui-card__content[_ngcontent-%COMP%], [_nghost-%COMP%]:not(.dialog-content) > .aui-card[_ngcontent-%COMP%] aui-code-editor[_ngcontent-%COMP%], [_nghost-%COMP%]:not(.dialog-content) > .aui-card[_ngcontent-%COMP%] .aui-code-editor[_ngcontent-%COMP%]{height:100%;min-height:100%}[_nghost-%COMP%]{display:block}[_nghost-%COMP%] aui-card, [_nghost-%COMP%] .aui-card, [_nghost-%COMP%] .aui-card__content{height:100%}[_nghost-%COMP%] .aui-checkbox{margin-right:0}[_nghost-%COMP%] aui-code-editor[_ngcontent-%COMP%]{height:100%}.yaml-editor-container[_ngcontent-%COMP%]{display:flex;height:100%}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-editor-section[_ngcontent-%COMP%]{flex:1;min-width:0}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-sidebar-section[_ngcontent-%COMP%]{width:400px;flex-shrink:0}.yaml-editor-container[_ngcontent-%COMP%]:not(.with-sidebar) .yaml-editor-section[_ngcontent-%COMP%]{flex:1}.yaml-editor-section[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.yaml-editor-section[_ngcontent-%COMP%] aui-code-editor[_ngcontent-%COMP%]{flex:1;height:100%}.yaml-sidebar-section[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.yaml-sidebar-section[_ngcontent-%COMP%] acl-resource-yaml-sidebar[_ngcontent-%COMP%]{flex:1;height:100%}.yaml-debug-section[_ngcontent-%COMP%]{position:absolute;top:0;right:0;width:350px;height:100%;background:var(--aui-color-bg-container);border-left:1px solid var(--aui-color-border-default);z-index:1000;overflow-y:auto}.debug-panel[_ngcontent-%COMP%]{padding:16px;font-size:12px}.debug-panel[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin:0 0 12px;font-size:14px;color:var(--aui-color-text-primary)}.debug-panel[_ngcontent-%COMP%] .debug-item[_ngcontent-%COMP%]{margin-bottom:16px}.debug-panel[_ngcontent-%COMP%] .debug-item[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--aui-color-text-primary);display:block;margin-bottom:4px}.debug-panel[_ngcontent-%COMP%] .debug-item[_ngcontent-%COMP%] ul[_ngcontent-%COMP%]{margin:0;padding-left:16px}.debug-panel[_ngcontent-%COMP%] .debug-item[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{margin-bottom:2px;color:var(--aui-color-text-secondary)}.debug-panel[_ngcontent-%COMP%] .debug-actions[_ngcontent-%COMP%]{border-top:1px solid var(--aui-color-border-default);padding-top:12px;text-align:right}@media (max-width: 1200px){.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-sidebar-section[_ngcontent-%COMP%]{width:350px}}@media (max-width: 992px){.yaml-editor-container.with-sidebar[_ngcontent-%COMP%]{flex-direction:column}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-editor-section[_ngcontent-%COMP%]{flex:1;min-height:50%}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-sidebar-section[_ngcontent-%COMP%]{width:100%;height:50%;border-top:1px solid var(--aui-color-border, #e0e0e0);border-left:none}}"], changeDetection: 0 }); }
328
+ }
329
+ __decorate([
330
+ ObservableInput(),
331
+ __metadata("design:type", Observable)
332
+ ], ResourceYamlEditorComponent.prototype, "resource$", void 0);
333
+ __decorate([
334
+ ObservableInput(),
335
+ __metadata("design:type", Observable)
336
+ ], ResourceYamlEditorComponent.prototype, "schema$", void 0);
337
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ResourceYamlEditorComponent, [{
338
+ type: Component,
339
+ args: [{ selector: 'acl-resource-yaml-editor', preserveWhitespaces: false, standalone: true, imports: [
340
+ CARD_MODULE,
341
+ NgIf,
342
+ FormsModule,
343
+ CHECKBOX_MODULE,
344
+ ButtonModule,
345
+ CodeEditorModule,
346
+ TRANSLATE_MODULE,
347
+ AsyncPipe,
348
+ NgTemplateOutlet,
349
+ ResourceYamlSidebarComponent,
350
+ IconModule,
351
+ TooltipModule,
352
+ ], providers: [
353
+ {
354
+ provide: NG_VALUE_ACCESSOR,
355
+ useExisting: forwardRef(() => ResourceYamlEditorComponent),
356
+ multi: true,
357
+ },
358
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<aui-card *ngIf=\"hasWrapper; else content\">\n <ng-container *ngTemplateOutlet=\"content\" />\n</aui-card>\n<ng-template #content>\n <div\n class=\"yaml-editor-container\"\n [class.with-sidebar]=\"showSidebar$$ | async\"\n >\n <div class=\"yaml-editor-section\">\n <aui-code-editor\n #codeEditor\n name=\"yaml\"\n [originalValue]=\"originalValue\"\n [(ngModel)]=\"value\"\n [options]=\"options\"\n [actionsConfig]=\"actionsConfig\"\n [modelUri]=\"modelUri\"\n >\n <ng-container auiCodeEditorToolbarRightSide>\n <!-- Schema \u6309\u94AE\uFF1A\u5F53\u542F\u7528\u4FA7\u8FB9\u680F\u65F6\u663E\u793A -->\n <button\n auiButton\n *ngIf=\"sidebarEnable && !!(resource$ | async)\"\n [hidden]=\"!!codeEditor.fullscreenDialog\"\n class=\"aui-code-editor-toolbar__control-button\"\n [type]=\"(showSidebar$$ | async) ? 'primary' : 'text'\"\n [disabled]=\"!(finalSchema$ | async)\"\n size=\"small\"\n (click)=\"toggleSidebar()\"\n [auiTooltip]=\"\n ((showSidebar$$ | async) ? 'hide_sidebar' : 'view_sidebar')\n | translate\n \"\n >\n <aui-icon\n [icon]=\"\n (showSidebar$$ | async)\n ? 'prod:expand_sidebar'\n : 'prod:collapse_sidebar'\n \"\n ></aui-icon>\n </button>\n </ng-container>\n </aui-code-editor>\n </div>\n <div\n class=\"yaml-sidebar-section\"\n *ngIf=\"(showSidebar$$ | async) && (resource$ | async)\"\n >\n <acl-resource-yaml-sidebar\n [resource]=\"getCurrentResource()\"\n [schema]=\"finalSchema$ | async\"\n [schemaEnable]=\"schemaEnable\"\n [exampleEnable]=\"exampleEnable\"\n [extraExamples]=\"extraExamples\"\n (close)=\"toggleSidebar()\"\n (tryYaml)=\"onTryYaml($event)\"\n ></acl-resource-yaml-sidebar>\n </div>\n </div>\n</ng-template>\n", styles: [":host(:not(.dialog-content)){display:block;height:calc(100vh - (var(--acl-page-header-height) + 44px) - 147px)}:host(:not(.dialog-content)) ::ng-deep .aui-code-editor{min-height:100%}:host(:not(.dialog-content))>.aui-card{height:100%}:host(:not(.dialog-content))>.aui-card .aui-card__content,:host(:not(.dialog-content))>.aui-card aui-code-editor,:host(:not(.dialog-content))>.aui-card .aui-code-editor{height:100%;min-height:100%}:host{display:block}:host ::ng-deep aui-card,:host ::ng-deep .aui-card,:host ::ng-deep .aui-card__content{height:100%}:host ::ng-deep .aui-checkbox{margin-right:0}:host aui-code-editor{height:100%}.yaml-editor-container{display:flex;height:100%}.yaml-editor-container.with-sidebar .yaml-editor-section{flex:1;min-width:0}.yaml-editor-container.with-sidebar .yaml-sidebar-section{width:400px;flex-shrink:0}.yaml-editor-container:not(.with-sidebar) .yaml-editor-section{flex:1}.yaml-editor-section{display:flex;flex-direction:column;height:100%}.yaml-editor-section aui-code-editor{flex:1;height:100%}.yaml-sidebar-section{display:flex;flex-direction:column;height:100%}.yaml-sidebar-section acl-resource-yaml-sidebar{flex:1;height:100%}.yaml-debug-section{position:absolute;top:0;right:0;width:350px;height:100%;background:var(--aui-color-bg-container);border-left:1px solid var(--aui-color-border-default);z-index:1000;overflow-y:auto}.debug-panel{padding:16px;font-size:12px}.debug-panel h4{margin:0 0 12px;font-size:14px;color:var(--aui-color-text-primary)}.debug-panel .debug-item{margin-bottom:16px}.debug-panel .debug-item strong{color:var(--aui-color-text-primary);display:block;margin-bottom:4px}.debug-panel .debug-item ul{margin:0;padding-left:16px}.debug-panel .debug-item ul li{margin-bottom:2px;color:var(--aui-color-text-secondary)}.debug-panel .debug-actions{border-top:1px solid var(--aui-color-border-default);padding-top:12px;text-align:right}@media (max-width: 1200px){.yaml-editor-container.with-sidebar .yaml-sidebar-section{width:350px}}@media (max-width: 992px){.yaml-editor-container.with-sidebar{flex-direction:column}.yaml-editor-container.with-sidebar .yaml-editor-section{flex:1;min-height:50%}.yaml-editor-container.with-sidebar .yaml-sidebar-section{width:100%;height:50%;border-top:1px solid var(--aui-color-border, #e0e0e0);border-left:none}}\n"] }]
359
+ }], () => [{ type: i1.YamlUtilService }, { type: i2.KubernetesSchemaService }, { type: i3.MonacoLanguageService }], { codeEditorRef: [{
360
+ type: ViewChild,
361
+ args: ['codeEditor', { static: false }]
362
+ }], hasWrapper: [{
363
+ type: Input
364
+ }], showDebugInfo: [{
365
+ type: Input
366
+ }], sidebarEnable: [{
367
+ type: Input
368
+ }], schema: [{
369
+ type: Input
370
+ }], schemaEnable: [{
371
+ type: Input
372
+ }], exampleEnable: [{
373
+ type: Input
374
+ }], resource: [{
375
+ type: Input
376
+ }], autoFoldManagedFields: [{
377
+ type: Input
378
+ }], originalValue: [{
379
+ type: Input
380
+ }], options: [{
381
+ type: Input
382
+ }], actionsConfig: [{
383
+ type: Input
384
+ }], tryYaml: [{
385
+ type: Output
386
+ }], resource$: [], schema$: [], autoFillNamespace: [{
387
+ type: Input
388
+ }], extraExamples: [{
389
+ type: Input
390
+ }] }); })();
391
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ResourceYamlEditorComponent, { className: "ResourceYamlEditorComponent", filePath: "code/resource-yaml-editor/component.ts", lineNumber: 90 }); })();
392
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvZGUvcmVzb3VyY2UteWFtbC1lZGl0b3IvY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvZGUvcmVzb3VyY2UteWFtbC1lZGl0b3IvdGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixxQkFBcUIsR0FDdEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsV0FBVyxFQUNYLGVBQWUsRUFDZixZQUFZLEVBQ1osVUFBVSxFQUNWLGFBQWEsR0FDZCxNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEdBR1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFdBQVcsRUFDWCxpQkFBaUIsR0FDbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLFVBQVUsRUFDVixHQUFHLEVBQ0gsb0JBQW9CLEVBQ3BCLEVBQUUsRUFDRixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxPQUFPLEdBQ1IsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN4RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFJeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2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WUFJRSxTQUFTLE1BR1QsT0FBTyxNQUdoQixpQkFBaUI7a0JBRGhCLEtBQUs7WUFJTixhQUFhO2tCQURaLEtBQUs7O2tGQWhGSywyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb2RlRWRpdG9yTW9kdWxlLFxuICBMYW5ndWFnZVNjaGVtYVNlcnZpY2UsXG4gIE1vbmFjb0xhbmd1YWdlU2VydmljZSxcbn0gZnJvbSAnQGFsYXVkYS9jb2RlLWVkaXRvcic7XG5pbXBvcnQge1xuICBDQVJEX01PRFVMRSxcbiAgQ0hFQ0tCT1hfTU9EVUxFLFxuICBCdXR0b25Nb2R1bGUsXG4gIEljb25Nb2R1bGUsXG4gIFRvb2x0aXBNb2R1bGUsXG59IGZyb20gJ0BhbGF1ZGEvdWknO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBmb3J3YXJkUmVmLFxuICBPbkRlc3Ryb3ksXG4gIEFmdGVyVmlld0luaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEZvcm1zTW9kdWxlLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgeWFtbERlZmF1bHRzIH0gZnJvbSAnbW9uYWNvLXlhbWwnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBPYnNlcnZhYmxlLFxuICBtYXAsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBvZixcbiAgc3dpdGNoTWFwLFxuICBzaGFyZVJlcGxheSxcbiAgdGFrZVVudGlsLFxuICBTdWJqZWN0LFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgS3ViZXJuZXRlc1NjaGVtYVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL2t1YmVybmV0ZXMtc2NoZW1hLnNlcnZpY2UnO1xuaW1wb3J0IHsgWWFtbFV0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy95YW1sLXV0aWwuc2VydmljZSc7XG5pbXBvcnQgeyBBcnJheWFibGUgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2hlbHBlcnMnO1xuaW1wb3J0IHsgS3ViZXJuZXRlc1Jlc291cmNlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9rOHMvY29yZSc7XG5pbXBvcnQgeyBPcGVuQVBJVjNTY2hlbWFPYmplY3QgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3NjaGVtYSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlSW5wdXQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgcHVibGlzaFJlZiB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHBhcnNlQWxsLCBzdHJpbmdpZnkgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL3lhbWwnO1xuaW1wb3J0IHsgVFJBTlNMQVRFX01PRFVMRSB9IGZyb20gJy4uLy4uL3RyYW5zbGF0ZS90cmFuc2xhdGUubW9kdWxlJztcbmltcG9ydCB7IHVwZGF0ZUFjdGlvbnMsIHlhbWxXcml0ZU1pbmltYXBPcHRpb25zIH0gZnJvbSAnLi4vY29kZS1lZGl0b3ItY29uZmlncyc7XG5pbXBvcnQge1xuICBmb2xkTWFuYWdlZEZpZWxkcyxcbiAgRWRpdG9ySW5zdGFuY2VQcm92aWRlcixcbn0gZnJvbSAnLi4vbWFuYWdlZC1maWVsZHMtZm9sZGVyLnV0aWwnO1xuaW1wb3J0IHsgUmVzb3VyY2VZYW1sU2lkZWJhckNvbXBvbmVudCB9IGZyb20gJy4uL3lhbWwtc2lkZWJhci9jb21wb25lbnQnO1xuaW1wb3J0IHsgWWFtbEV4YW1wbGUgfSBmcm9tICcuLi95YW1sLXNpZGViYXIvdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhY2wtcmVzb3VyY2UteWFtbC1lZGl0b3InLFxuICB0ZW1wbGF0ZVVybDogJ3RlbXBsYXRlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnc3R5bGVzLnNjc3MnXSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDQVJEX01PRFVMRSxcbiAgICBOZ0lmLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIENIRUNLQk9YX01PRFVMRSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgQ29kZUVkaXRvck1vZHVsZSxcbiAgICBUUkFOU0xBVEVfTU9EVUxFLFxuICAgIEFzeW5jUGlwZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIFJlc291cmNlWWFtbFNpZGViYXJDb21wb25lbnQsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJlc291cmNlWWFtbEVkaXRvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VZYW1sRWRpdG9yQ29tcG9uZW50PFQgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+XG4gIGltcGxlbWVudHNcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBPbkRlc3Ryb3ksXG4gICAgRWRpdG9ySW5zdGFuY2VQcm92aWRlcixcbiAgICBBZnRlclZpZXdJbml0XG57XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuICBwcml2YXRlIF9vcmlnaW5hbFZhbHVlID0gJyc7XG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoX3ZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAvLyBQbGFjZWhvbGRlciBmb3IgZm9ybSBjb250cm9sIGNoYW5nZSBjYWxsYmFja1xuICB9O1xuXG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4ge1xuICAgIC8vIFBsYWNlaG9sZGVyIGZvciBmb3JtIGNvbnRyb2wgdG91Y2hlZCBjYWxsYmFja1xuICB9O1xuXG4gIHNob3dTaWRlYmFyJCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICBzaG93RGVidWdQYW5lbCQkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcblxuICBtb2RlbFVyaTogc3RyaW5nO1xuICBwcml2YXRlIHlhbWxTY2hlbWFTZXJ2aWNlOiBMYW5ndWFnZVNjaGVtYVNlcnZpY2U7XG4gIHByaXZhdGUgbW9uYWNvRWRpdG9yOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIHJlZ2lzdGVyZWRTY2hlbWFzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgQFZpZXdDaGlsZCgnY29kZUVkaXRvcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwcml2YXRlIGNvZGVFZGl0b3JSZWY6IGFueTtcblxuICBASW5wdXQoKVxuICBoYXNXcmFwcGVyID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBzaG93RGVidWdJbmZvID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2lkZWJhckVuYWJsZSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgc2NoZW1hOiBPcGVuQVBJVjNTY2hlbWFPYmplY3Q7XG5cbiAgQElucHV0KClcbiAgc2NoZW1hRW5hYmxlID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBleGFtcGxlRW5hYmxlID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICByZXNvdXJjZTogQXJyYXlhYmxlPFQ+O1xuXG4gIEBJbnB1dCgpXG4gIGF1dG9Gb2xkTWFuYWdlZEZpZWxkcyA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgc2V0IG9yaWdpbmFsVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX29yaWdpbmFsVmFsdWUgPSB2YWx1ZSB8fCAnJztcbiAgfVxuXG4gIGdldCBvcmlnaW5hbFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsVmFsdWU7XG4gIH1cblxuICBASW5wdXQoKVxuICBvcHRpb25zID0geWFtbFdyaXRlTWluaW1hcE9wdGlvbnM7XG5cbiAgQElucHV0KClcbiAgYWN0aW9uc0NvbmZpZyA9IHVwZGF0ZUFjdGlvbnM7XG5cbiAgQE91dHB1dCgpXG4gIHRyeVlhbWwgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgcmVhZG9ubHkgcmVzb3VyY2UkITogT2JzZXJ2YWJsZTxBcnJheWFibGU8VD4+O1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICByZWFkb25seSBzY2hlbWEkITogT2JzZXJ2YWJsZTxPcGVuQVBJVjNTY2hlbWFPYmplY3Q+O1xuXG4gIEBJbnB1dCgpXG4gIGF1dG9GaWxsTmFtZXNwYWNlID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBleHRyYUV4YW1wbGVzOiBZYW1sRXhhbXBsZVtdO1xuXG4gIGhhc0ZvbGRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiDoh6rliqjojrflj5bnmoQgc2NoZW1h77yM5b2T5rKh5pyJ5omL5Yqo5o+Q5L6bIHNjaGVtYSDml7bkvb/nlKhcbiAgICovXG4gIGF1dG9TY2hlbWEkID0gdGhpcy5yZXNvdXJjZSQucGlwZShcbiAgICBzd2l0Y2hNYXAocmVzb3VyY2UgPT4ge1xuICAgICAgaWYgKCFyZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0UmVzb3VyY2UgPSAoXG4gICAgICAgIEFycmF5LmlzQXJyYXkocmVzb3VyY2UpID8gcmVzb3VyY2VbMF0gOiByZXNvdXJjZVxuICAgICAgKSBhcyBUO1xuICAgICAgaWYgKCFmaXJzdFJlc291cmNlPy5hcGlWZXJzaW9uIHx8ICFmaXJzdFJlc291cmNlPy5raW5kKSB7XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hU2VydmljZS5nZXRSZXNvdXJjZVNjaGVtYShcbiAgICAgICAgZmlyc3RSZXNvdXJjZS5hcGlWZXJzaW9uLFxuICAgICAgICBmaXJzdFJlc291cmNlLmtpbmQsXG4gICAgICApO1xuICAgIH0pLFxuICAgIHB1Ymxpc2hSZWYoKSxcbiAgKTtcblxuICAvKipcbiAgICog5pyA57uI5L2/55So55qEIHNjaGVtYe+8jOS8mOWFiOS9v+eUqOaJi+WKqOaPkOS+m+eahO+8jOWQpuWImeS9v+eUqOiHquWKqOiOt+WPlueahFxuICAgKi9cbiAgZmluYWxTY2hlbWEkID0gY29tYmluZUxhdGVzdChbdGhpcy5zY2hlbWEkLCB0aGlzLmF1dG9TY2hlbWEkXSkucGlwZShcbiAgICBtYXAoKFttYW51YWxTY2hlbWEsIGF1dG9TY2hlbWFdKSA9PiBtYW51YWxTY2hlbWEgfHwgYXV0b1NjaGVtYSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKSxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgeWFtbFV0aWw6IFlhbWxVdGlsU2VydmljZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2NoZW1hU2VydmljZTogS3ViZXJuZXRlc1NjaGVtYVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtb25hY29MYW5ndWFnZVNlcnZpY2U6IE1vbmFjb0xhbmd1YWdlU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy55YW1sU2NoZW1hU2VydmljZSA9XG4gICAgICB0aGlzLm1vbmFjb0xhbmd1YWdlU2VydmljZS5nZXRMYW5ndWFnZVNjaGVtYVNlcnZpY2UoXG4gICAgICAgIFsneWFtbCcsICd5YW1sRGVmYXVsdHMnXSxcbiAgICAgICAgeWFtbERlZmF1bHRzLFxuICAgICAgKTtcblxuICAgIC8vIOiHquWKqOiuvue9riBzY2hlbWFcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnJlc291cmNlJCwgdGhpcy5maW5hbFNjaGVtYSRdKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoW3Jlc291cmNlLCBzY2hlbWFdKSA9PiB7XG4gICAgICAgIGlmIChyZXNvdXJjZSAmJiBzY2hlbWEpIHtcbiAgICAgICAgICBjb25zdCBmaXJzdFJlc291cmNlID0gQXJyYXkuaXNBcnJheShyZXNvdXJjZSlcbiAgICAgICAgICAgID8gcmVzb3VyY2VbMF1cbiAgICAgICAgICAgIDogcmVzb3VyY2U7XG4gICAgICAgICAgaWYgKGZpcnN0UmVzb3VyY2UgJiYgIUFycmF5LmlzQXJyYXkoZmlyc3RSZXNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0WWFtbFNjaGVtYShmaXJzdFJlc291cmNlIGFzIFQsIHNjaGVtYSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIHRoaXMuYXV0b1NjaGVtYSQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIOebkeWQrCBZQU1MIOWGheWuueWPmOWMlu+8jOiHquWKqOaKmOWPoCBtYW5hZ2VkRmllbGRzXG4gICAgaWYgKHRoaXMuYXV0b0ZvbGRNYW5hZ2VkRmllbGRzICYmIHRoaXMuc2NoZW1hU2VydmljZS5kZWZpbml0aW9ucykge1xuICAgICAgdGhpcy5zZWxmRm9sZE1hbmFnZWRGaWVsZHMoKTtcbiAgICB9XG4gIH1cblxuICBzZWxmRm9sZE1hbmFnZWRGaWVsZHMoKSB7XG4gICAgaWYgKHRoaXMuaGFzRm9sZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFzRm9sZGVkID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9ySW5zdGFuY2UoKTtcbiAgICAgIGlmIChlZGl0b3IpIHtcbiAgICAgICAgZm9sZE1hbmFnZWRGaWVsZHMoZWRpdG9yKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgIHRoaXMub25DaGFuZ2UodmFsKTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50YXRpb25cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZSB8fCAnJztcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgdG9nZ2xlU2lkZWJhcigpIHtcbiAgICB0aGlzLnNob3dTaWRlYmFyJCQubmV4dCghdGhpcy5zaG93U2lkZWJhciQkLnZhbHVlKTtcbiAgfVxuXG4gIHRvZ2dsZURlYnVnSW5mbygpIHtcbiAgICB0aGlzLnNob3dEZWJ1Z1BhbmVsJCQubmV4dCghdGhpcy5zaG93RGVidWdQYW5lbCQkLnZhbHVlKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRSZXNvdXJjZSgpOiBUIHwgbnVsbCB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc291cmNlKSkge1xuICAgICAgcmV0dXJuIHJlc291cmNlLmxlbmd0aCA+IDAgPyByZXNvdXJjZVswXSA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiAocmVzb3VyY2UgYXMgVCkgfHwgbnVsbDtcbiAgfVxuXG4gIGdldEN1cnJlbnRTY2hlbWEoKTogT3BlbkFQSVYzU2NoZW1hT2JqZWN0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hIHx8IG51bGw7XG4gIH1cblxuICBnZXREZWJ1Z0luZm8oKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmdldEN1cnJlbnRSZXNvdXJjZSgpO1xuICAgIHJldHVybiB7XG4gICAgICBoYXNSZXNvdXJjZTogISFyZXNvdXJjZSxcbiAgICAgIHJlc291cmNlQXBpVmVyc2lvbjogcmVzb3VyY2U/LmFwaVZlcnNpb24sXG4gICAgICByZXNvdXJjZUtpbmQ6IHJlc291cmNlPy5raW5kLFxuICAgICAgaGFzTWFudWFsU2NoZW1hOiAhIXRoaXMuc2NoZW1hLFxuICAgICAgd29ya3NwYWNlSGVscGVyQXZhaWxhYmxlOiB0aGlzLnNjaGVtYVNlcnZpY2UuaXNXb3Jrc3BhY2VIZWxwZXJBdmFpbGFibGUoKSxcbiAgICAgIGN1cnJlbnRXb3Jrc3BhY2U6IHRoaXMuc2NoZW1hU2VydmljZS53b3Jrc3BhY2VIZWxwZXI/LmJhc2VQYXJhbXNTbmFwc2hvdCxcbiAgICB9O1xuICB9XG5cbiAgb25UcnlZYW1sKHlhbWxDb250ZW50OiBzdHJpbmcpIHtcbiAgICBsZXQgdGFyZ2V0WWFtbCA9IHlhbWxDb250ZW50O1xuXG4gICAgY29uc3QgbmFtZXNwYWNlID1cbiAgICAgIHRoaXMuc2NoZW1hU2VydmljZS53b3Jrc3BhY2VIZWxwZXI/LmJhc2VQYXJhbXNTbmFwc2hvdD8ubmFtZXNwYWNlO1xuXG4gICAgaWYgKHRoaXMuYXV0b0ZpbGxOYW1lc3BhY2UgJiYgbmFtZXNwYWNlKSB7XG4gICAgICB0YXJnZXRZYW1sID0gcGFyc2VBbGwoeWFtbENvbnRlbnQpXG4gICAgICAgIC5maWx0ZXIociA9PiAhIXIpXG4gICAgICAgIC5tYXAoKHI6IEt1YmVybmV0ZXNSZXNvdXJjZSkgPT4ge1xuICAgICAgICAgIGlmICghcj8ubWV0YWRhdGE/Lm5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ucixcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAuLi5yLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKHIgPT4gc3RyaW5naWZ5KHIsIHsgc29ydE1hcEVudHJpZXM6IHRydWUgfSkpXG4gICAgICAgIC5qb2luKCctLS1cXHJcXG4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeVlhbWwuZW1pdCh0YXJnZXRZYW1sKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva4gWUFNTCBzY2hlbWEg5Lul5o+Q5L6bIGhvdmVyIOaPkOekuuWSjOiHquWKqOWujOaIkFxuICAgKi9cbiAgc2V0WWFtbFNjaGVtYShyZXNvdXJjZTogVCwgc2NoZW1hOiBPcGVuQVBJVjNTY2hlbWFPYmplY3QpIHtcbiAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOS9v+eUqCBhcGlWZXJzaW9uICsga2luZCDnu4TlkIjkvZzkuLrmoIfor4ZcbiAgICBjb25zdCBhcGlWZXJzaW9uID0gcmVzb3VyY2U/LmFwaVZlcnNpb24gfHwgJ3Vua25vd24nO1xuICAgIGNvbnN0IGtpbmQgPSByZXNvdXJjZT8ua2luZCB8fCAndW5rbm93bic7XG4gICAgY29uc3Qgc2NoZW1hS2V5ID0gYCR7YXBpVmVyc2lvbn0vJHtraW5kfWA7XG5cbiAgICB0aGlzLm1vZGVsVXJpID0gYCR7c2NoZW1hS2V5fS55YW1sYDtcblxuICAgIHRoaXMuc2VsZkZvbGRNYW5hZ2VkRmllbGRzKCk7XG5cbiAgICAvLyDmo4Dmn6XmmK/lkKblt7Lnu4/ms6jlhozov4fnm7jlkIznmoQgc2NoZW1h77yM6YG/5YWN6YeN5aSN5rOo5YaMXG4gICAgaWYgKHRoaXMucmVnaXN0ZXJlZFNjaGVtYXMuaGFzKHNjaGVtYUtleSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDojrflj5blrozmlbTnmoQgZGVmaW5pdGlvbnMg5Lul5pSv5oyBICRyZWYg5byV55SoXG4gICAgY29uc3QgZGVmaW5pdGlvbnMgPSB0aGlzLnNjaGVtYVNlcnZpY2UuZGVmaW5pdGlvbnMgfHwge307XG5cbiAgICAvLyDliJvlu7rljIXlkKvlrozmlbQgZGVmaW5pdGlvbnMg55qEIHNjaGVtYSDlr7nosaFcbiAgICBjb25zdCBmdWxsU2NoZW1hID0ge1xuICAgICAgLi4uc2NoZW1hLFxuICAgICAgZGVmaW5pdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIOehruS/nXNjaGVtYeiiq+ato+ehruazqOWGjO+8jOW5tuWQr+eUqOiHquWKqOWujOaIkOWKn+iDvVxuICAgIHRoaXMueWFtbFNjaGVtYVNlcnZpY2UuYWRkU2NoZW1hKHtcbiAgICAgIHVyaTogYGs4czovLyR7c2NoZW1hS2V5fS5zY2hlbWEuanNvbmAsXG4gICAgICBmaWxlTWF0Y2g6IFt0aGlzLm1vZGVsVXJpXSxcbiAgICAgIHNjaGVtYTogZnVsbFNjaGVtYSxcbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJlZFNjaGVtYXMuYWRkKHNjaGVtYUtleSk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIE1vbmFjbyDnvJbovpHlmajlrp7kvotcbiAgICovXG4gIGdldEVkaXRvckluc3RhbmNlKCk6XG4gICAgfCBpbXBvcnQoJ21vbmFjby1lZGl0b3InKS5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yXG4gICAgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubW9uYWNvRWRpdG9yICYmIHRoaXMuY29kZUVkaXRvclJlZj8uZWRpdG9yKSB7XG4gICAgICB0aGlzLm1vbmFjb0VkaXRvciA9IHRoaXMuY29kZUVkaXRvclJlZi5lZGl0b3I7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vbmFjb0VkaXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiYvliqjmipjlj6AgbWFuYWdlZEZpZWxkc1xuICAgKi9cbiAgZm9sZE1hbmFnZWRGaWVsZHMoKTogdm9pZCB7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5nZXRFZGl0b3JJbnN0YW5jZSgpO1xuICAgIGlmIChlZGl0b3IpIHtcbiAgICAgIGZvbGRNYW5hZ2VkRmllbGRzKGVkaXRvcik7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8YXVpLWNhcmQgKm5nSWY9XCJoYXNXcmFwcGVyOyBlbHNlIGNvbnRlbnRcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRcIiAvPlxuPC9hdWktY2FyZD5cbjxuZy10ZW1wbGF0ZSAjY29udGVudD5cbiAgPGRpdlxuICAgIGNsYXNzPVwieWFtbC1lZGl0b3ItY29udGFpbmVyXCJcbiAgICBbY2xhc3Mud2l0aC1zaWRlYmFyXT1cInNob3dTaWRlYmFyJCQgfCBhc3luY1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwieWFtbC1lZGl0b3Itc2VjdGlvblwiPlxuICAgICAgPGF1aS1jb2RlLWVkaXRvclxuICAgICAgICAjY29kZUVkaXRvclxuICAgICAgICBuYW1lPVwieWFtbFwiXG4gICAgICAgIFtvcmlnaW5hbFZhbHVlXT1cIm9yaWdpbmFsVmFsdWVcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcbiAgICAgICAgW29wdGlvbnNdPVwib3B0aW9uc1wiXG4gICAgICAgIFthY3Rpb25zQ29uZmlnXT1cImFjdGlvbnNDb25maWdcIlxuICAgICAgICBbbW9kZWxVcmldPVwibW9kZWxVcmlcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyIGF1aUNvZGVFZGl0b3JUb29sYmFyUmlnaHRTaWRlPlxuICAgICAgICAgIDwhLS0gU2NoZW1hIOaMiemSru+8muW9k+WQr+eUqOS+p+i+ueagj+aXtuaYvuekuiAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBhdWlCdXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwic2lkZWJhckVuYWJsZSAmJiAhIShyZXNvdXJjZSQgfCBhc3luYylcIlxuICAgICAgICAgICAgW2hpZGRlbl09XCIhIWNvZGVFZGl0b3IuZnVsbHNjcmVlbkRpYWxvZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImF1aS1jb2RlLWVkaXRvci10b29sYmFyX19jb250cm9sLWJ1dHRvblwiXG4gICAgICAgICAgICBbdHlwZV09XCIoc2hvd1NpZGViYXIkJCB8IGFzeW5jKSA/ICdwcmltYXJ5JyA6ICd0ZXh0J1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIShmaW5hbFNjaGVtYSQgfCBhc3luYylcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTaWRlYmFyKClcIlxuICAgICAgICAgICAgW2F1aVRvb2x0aXBdPVwiXG4gICAgICAgICAgICAgICgoc2hvd1NpZGViYXIkJCB8IGFzeW5jKSA/ICdoaWRlX3NpZGViYXInIDogJ3ZpZXdfc2lkZWJhcicpXG4gICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGF1aS1pY29uXG4gICAgICAgICAgICAgIFtpY29uXT1cIlxuICAgICAgICAgICAgICAgIChzaG93U2lkZWJhciQkIHwgYXN5bmMpXG4gICAgICAgICAgICAgICAgICA/ICdwcm9kOmV4cGFuZF9zaWRlYmFyJ1xuICAgICAgICAgICAgICAgICAgOiAncHJvZDpjb2xsYXBzZV9zaWRlYmFyJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvYXVpLWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9hdWktY29kZS1lZGl0b3I+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJ5YW1sLXNpZGViYXItc2VjdGlvblwiXG4gICAgICAqbmdJZj1cIihzaG93U2lkZWJhciQkIHwgYXN5bmMpICYmIChyZXNvdXJjZSQgfCBhc3luYylcIlxuICAgID5cbiAgICAgIDxhY2wtcmVzb3VyY2UteWFtbC1zaWRlYmFyXG4gICAgICAgIFtyZXNvdXJjZV09XCJnZXRDdXJyZW50UmVzb3VyY2UoKVwiXG4gICAgICAgIFtzY2hlbWFdPVwiZmluYWxTY2hlbWEkIHwgYXN5bmNcIlxuICAgICAgICBbc2NoZW1hRW5hYmxlXT1cInNjaGVtYUVuYWJsZVwiXG4gICAgICAgIFtleGFtcGxlRW5hYmxlXT1cImV4YW1wbGVFbmFibGVcIlxuICAgICAgICBbZXh0cmFFeGFtcGxlc109XCJleHRyYUV4YW1wbGVzXCJcbiAgICAgICAgKGNsb3NlKT1cInRvZ2dsZVNpZGViYXIoKVwiXG4gICAgICAgICh0cnlZYW1sKT1cIm9uVHJ5WWFtbCgkZXZlbnQpXCJcbiAgICAgID48L2FjbC1yZXNvdXJjZS15YW1sLXNpZGViYXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==