imm-element-ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +24 -0
  2. package/esm2022/imm-element-ui.mjs +5 -0
  3. package/esm2022/lib/am/am.component.mjs +502 -0
  4. package/esm2022/lib/crumb-action/crumb-action.component.mjs +127 -0
  5. package/esm2022/lib/form/form/form.component.mjs +217 -0
  6. package/esm2022/lib/form/form-field/field-control.mjs +19 -0
  7. package/esm2022/lib/form/form-field/field-utils.mjs +227 -0
  8. package/esm2022/lib/form/form-field/form-field.mjs +129 -0
  9. package/esm2022/lib/form/form-field/form-type.mjs +123 -0
  10. package/esm2022/lib/form/form-field/label.directive.mjs +62 -0
  11. package/esm2022/lib/form/form-type/autocomplete.type.mjs +200 -0
  12. package/esm2022/lib/form/form-type/codemirror.type.mjs +167 -0
  13. package/esm2022/lib/form/form-type/datepicker.type.mjs +212 -0
  14. package/esm2022/lib/form/form-type/image.type.mjs +225 -0
  15. package/esm2022/lib/form/form-type/inputnumber.type.mjs +144 -0
  16. package/esm2022/lib/form/form-type/inputtext.type.mjs +69 -0
  17. package/esm2022/lib/form/form-type/multiselect.type.mjs +219 -0
  18. package/esm2022/lib/form/form-type/radio.type.mjs +167 -0
  19. package/esm2022/lib/form/form-type/select.type.mjs +196 -0
  20. package/esm2022/lib/form/form-type/textarea.type.mjs +75 -0
  21. package/esm2022/lib/form/form-type/treeselect.type.mjs +174 -0
  22. package/esm2022/lib/form/form-type/upload.type.mjs +228 -0
  23. package/esm2022/lib/grid/actions/actions.component.mjs +30 -0
  24. package/esm2022/lib/grid/cell-edit/cell-edit-autoComplete.component.mjs +89 -0
  25. package/esm2022/lib/grid/cell-edit/cell-edit-datePicker.compoent.mjs +182 -0
  26. package/esm2022/lib/grid/cell-edit/cell-edit-inputNumber.component.mjs +107 -0
  27. package/esm2022/lib/grid/cell-edit/cell-edit-inputText.compoent.mjs +46 -0
  28. package/esm2022/lib/grid/cell-edit/cell-edit-select.component.mjs +148 -0
  29. package/esm2022/lib/grid/cell-edit/index.mjs +7 -0
  30. package/esm2022/lib/grid/cell-render/async-renderer.mjs +29 -0
  31. package/esm2022/lib/grid/cell-render/link-render.mjs +42 -0
  32. package/esm2022/lib/grid/grid/grid.component.mjs +373 -0
  33. package/esm2022/lib/grid/grid-utils.mjs +103 -0
  34. package/esm2022/lib/grid/mock-data.mjs +14 -0
  35. package/esm2022/lib/grid/pager/pager.component.mjs +19 -0
  36. package/esm2022/lib/head/head.component.mjs +43 -0
  37. package/esm2022/lib/import/import.component.mjs +68 -0
  38. package/esm2022/lib/log/log.component.mjs +37 -0
  39. package/esm2022/lib/page-form/page-form.component.mjs +167 -0
  40. package/esm2022/lib/page-form/page-form.interface.mjs +2 -0
  41. package/esm2022/lib/page-grid-list/page-grid-list.component.mjs +60 -0
  42. package/esm2022/lib/row-selector/row-selector.component.mjs +58 -0
  43. package/esm2022/lib/search/mock-data.mjs +40 -0
  44. package/esm2022/lib/search/pop-date/pop-date.component.mjs +106 -0
  45. package/esm2022/lib/search/pop-list/pop-list.component.mjs +32 -0
  46. package/esm2022/lib/search/pop-panel/pop-panel.component.mjs +44 -0
  47. package/esm2022/lib/search/pop-select/pop-select.component.mjs +45 -0
  48. package/esm2022/lib/search/pop-self/pop-self.component.mjs +132 -0
  49. package/esm2022/lib/search/pop-tree/pop-tree.component.mjs +50 -0
  50. package/esm2022/lib/search/search/search.component.mjs +138 -0
  51. package/esm2022/lib/search/search-tip/search-tip.component.mjs +54 -0
  52. package/esm2022/lib/search/search-utils.mjs +165 -0
  53. package/esm2022/lib/search/text-panel/text-panel.component.mjs +41 -0
  54. package/esm2022/lib/service/action.service.mjs +115 -0
  55. package/esm2022/lib/service/i18n.service.mjs +79 -0
  56. package/esm2022/lib/service/themeConfig.service.mjs +82 -0
  57. package/esm2022/lib/service/userHistory.service.mjs +106 -0
  58. package/esm2022/lib/share/utils.mjs +150 -0
  59. package/esm2022/lib/steps/steps.component.mjs +31 -0
  60. package/esm2022/lib/theme-config/theme-config-panel.compoent.mjs +141 -0
  61. package/esm2022/lib/theme-config/theme-config.compoent.mjs +45 -0
  62. package/esm2022/public-api.mjs +26 -0
  63. package/fesm2022/imm-element-ui.mjs +6382 -0
  64. package/fesm2022/imm-element-ui.mjs.map +1 -0
  65. package/index.d.ts +5 -0
  66. package/lib/am/am.component.d.ts +191 -0
  67. package/lib/crumb-action/crumb-action.component.d.ts +40 -0
  68. package/lib/form/form/form.component.d.ts +53 -0
  69. package/lib/form/form-field/field-control.d.ts +13 -0
  70. package/lib/form/form-field/field-utils.d.ts +12 -0
  71. package/lib/form/form-field/form-field.d.ts +86 -0
  72. package/lib/form/form-field/form-type.d.ts +22 -0
  73. package/lib/form/form-field/label.directive.d.ts +14 -0
  74. package/lib/form/form-type/autocomplete.type.d.ts +77 -0
  75. package/lib/form/form-type/codemirror.type.d.ts +31 -0
  76. package/lib/form/form-type/datepicker.type.d.ts +83 -0
  77. package/lib/form/form-type/image.type.d.ts +49 -0
  78. package/lib/form/form-type/inputnumber.type.d.ts +49 -0
  79. package/lib/form/form-type/inputtext.type.d.ts +17 -0
  80. package/lib/form/form-type/multiselect.type.d.ts +85 -0
  81. package/lib/form/form-type/radio.type.d.ts +31 -0
  82. package/lib/form/form-type/select.type.d.ts +73 -0
  83. package/lib/form/form-type/textarea.type.d.ts +19 -0
  84. package/lib/form/form-type/treeselect.type.d.ts +62 -0
  85. package/lib/form/form-type/upload.type.d.ts +51 -0
  86. package/lib/grid/actions/actions.component.d.ts +14 -0
  87. package/lib/grid/cell-edit/cell-edit-autoComplete.component.d.ts +18 -0
  88. package/lib/grid/cell-edit/cell-edit-datePicker.compoent.d.ts +16 -0
  89. package/lib/grid/cell-edit/cell-edit-inputNumber.component.d.ts +15 -0
  90. package/lib/grid/cell-edit/cell-edit-inputText.compoent.d.ts +16 -0
  91. package/lib/grid/cell-edit/cell-edit-select.component.d.ts +12 -0
  92. package/lib/grid/cell-edit/index.d.ts +6 -0
  93. package/lib/grid/cell-render/async-renderer.d.ts +10 -0
  94. package/lib/grid/cell-render/link-render.d.ts +14 -0
  95. package/lib/grid/grid/grid.component.d.ts +272 -0
  96. package/lib/grid/grid-utils.d.ts +751 -0
  97. package/lib/grid/mock-data.d.ts +12 -0
  98. package/lib/grid/pager/pager.component.d.ts +15 -0
  99. package/lib/head/head.component.d.ts +17 -0
  100. package/lib/import/import.component.d.ts +22 -0
  101. package/lib/log/log.component.d.ts +14 -0
  102. package/lib/page-form/page-form.component.d.ts +46 -0
  103. package/lib/page-form/page-form.interface.d.ts +27 -0
  104. package/lib/page-grid-list/page-grid-list.component.d.ts +18 -0
  105. package/lib/row-selector/row-selector.component.d.ts +21 -0
  106. package/lib/search/mock-data.d.ts +20 -0
  107. package/lib/search/pop-date/pop-date.component.d.ts +26 -0
  108. package/lib/search/pop-list/pop-list.component.d.ts +12 -0
  109. package/lib/search/pop-panel/pop-panel.component.d.ts +15 -0
  110. package/lib/search/pop-select/pop-select.component.d.ts +13 -0
  111. package/lib/search/pop-self/pop-self.component.d.ts +31 -0
  112. package/lib/search/pop-tree/pop-tree.component.d.ts +22 -0
  113. package/lib/search/search/search.component.d.ts +60 -0
  114. package/lib/search/search-tip/search-tip.component.d.ts +22 -0
  115. package/lib/search/search-utils.d.ts +10 -0
  116. package/lib/search/text-panel/text-panel.component.d.ts +21 -0
  117. package/lib/service/action.service.d.ts +54 -0
  118. package/lib/service/i18n.service.d.ts +93 -0
  119. package/lib/service/themeConfig.service.d.ts +24 -0
  120. package/lib/service/userHistory.service.d.ts +26 -0
  121. package/lib/share/utils.d.ts +16 -0
  122. package/lib/steps/steps.component.d.ts +16 -0
  123. package/lib/theme-config/theme-config-panel.compoent.d.ts +78 -0
  124. package/lib/theme-config/theme-config.compoent.d.ts +6 -0
  125. package/package.json +28 -0
  126. package/public-api.d.ts +20 -0
  127. package/src/lib/crumb-action/crumb-action.component.scss +51 -0
  128. package/src/lib/form/form/form.component.scss +0 -0
  129. package/src/lib/grid/actions/actions.component.scss +0 -0
  130. package/src/lib/grid/grid/grid.component.scss +0 -0
  131. package/src/lib/grid/pager/pager.component.scss +13 -0
  132. package/src/lib/head/head.component.scss +3 -0
  133. package/src/lib/import/import.component.scss +10 -0
  134. package/src/lib/log/log.component.scss +21 -0
  135. package/src/lib/page-form/page-form.component.scss +14 -0
  136. package/src/lib/page-grid-list/page-grid-list.component.scss +14 -0
  137. package/src/lib/row-selector/row-selector.component.scss +1 -0
  138. package/src/lib/search/dynamic-search/dynamic-search.component.scss +70 -0
  139. package/src/lib/search/pop-date/pop-date.component.scss +47 -0
  140. package/src/lib/search/pop-list/pop-list.component.scss +23 -0
  141. package/src/lib/search/pop-panel/pop-panel.component.scss +49 -0
  142. package/src/lib/search/pop-select/pop-select.component.scss +29 -0
  143. package/src/lib/search/pop-self/pop-self.component.scss +60 -0
  144. package/src/lib/search/pop-tree/pop-tree.component.scss +34 -0
  145. package/src/lib/search/search/search.component.scss +70 -0
  146. package/src/lib/search/search-tip/search-tip.component.scss +47 -0
  147. package/src/lib/search/text-panel/text-panel.component.scss +16 -0
  148. package/src/lib/steps/steps.component.scss +52 -0
  149. package/src/lib/styles/styles.scss +232 -0
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # ImmUi
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.2.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project imm-ui` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project imm-ui`.
8
+ > Note: Don't forget to add `--project imm-ui` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build imm-ui` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build imm-ui`, go to the dist folder `cd dist/imm-ui` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test imm-ui` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1tLWVsZW1lbnQtdWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9pbW0tdWkvc3JjL2ltbS1lbGVtZW50LXVpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
@@ -0,0 +1,502 @@
1
+ import { Component, inject, signal } from '@angular/core';
2
+ import { HttpClient } from '@angular/common/http';
3
+ import { finalize, map } from 'rxjs/operators';
4
+ import * as FileSaver from 'file-saver';
5
+ import { MessageService } from 'primeng/api';
6
+ import { ActivatedRoute, Router } from '@angular/router';
7
+ import * as i0 from "@angular/core";
8
+ const apiPath = "";
9
+ export class AmComponent {
10
+ constructor() {
11
+ //是否提交日志
12
+ this.isLog = false;
13
+ //主数据id
14
+ this.id = 0;
15
+ //主表模型
16
+ this.modelName = '';
17
+ //ID参数
18
+ this.param = {};
19
+ this.fid = '';
20
+ //导入
21
+ this.importPrm = {};
22
+ //搜素
23
+ this.searchOptions = {};
24
+ //form
25
+ this.formOptions = {};
26
+ //创建或者更新
27
+ this.upsertPrm = { updData: {}, addData: {}, subsert: [], log: {} };
28
+ //处理
29
+ this.dealPrm = {};
30
+ //map更新
31
+ this.writePrm = {};
32
+ //删除
33
+ this.removePrm = {};
34
+ //获取一条数据
35
+ this.getPrm = { data: {} };
36
+ //查询条件
37
+ this.filter = {};
38
+ //查询列表数据
39
+ this.searchPrm = {};
40
+ this.exportPrm = {};
41
+ this.tamplate = {};
42
+ // 表示是否正在加载用户数据的Signal,初始值为 false
43
+ this.isLoading = signal(false);
44
+ this.http = inject(HttpClient);
45
+ this.messageService = inject(MessageService);
46
+ this.route = inject(ActivatedRoute);
47
+ this.router = inject(Router);
48
+ }
49
+ rfd(prm) {
50
+ return this.http.post(apiPath + "RFD", prm)
51
+ .pipe(map((response) => {
52
+ return response;
53
+ }), finalize(() => {
54
+ // 无论请求成功与否,都将加载中状态设置为 false
55
+ this.isLoading.set(false);
56
+ }));
57
+ }
58
+ webget(param) {
59
+ return this.http.post(apiPath + "webget", param)
60
+ .pipe(map((response) => {
61
+ return response;
62
+ }), finalize(() => {
63
+ // 无论请求成功与否,都将加载中状态设置为 false
64
+ this.isLoading.set(false);
65
+ }));
66
+ }
67
+ websave(param) {
68
+ return this.http.post(apiPath + "websave", param)
69
+ .pipe(map((response) => {
70
+ return response;
71
+ }), finalize(() => {
72
+ // 无论请求成功与否,都将加载中状态设置为 false
73
+ this.isLoading.set(false);
74
+ }));
75
+ }
76
+ webdel(param) {
77
+ return this.http.post(apiPath + "webdel", param)
78
+ .pipe(map((response) => {
79
+ return response;
80
+ }), finalize(() => {
81
+ // 无论请求成功与否,都将加载中状态设置为 false
82
+ this.isLoading.set(false);
83
+ }));
84
+ }
85
+ upsert(prm, cb) {
86
+ if (prm) {
87
+ this.web_upsert(prm).subscribe(res => {
88
+ cb && cb(res);
89
+ this.resetPrm('upsert');
90
+ });
91
+ }
92
+ else {
93
+ // const pm: Upsert = this.upserts()
94
+ // console.log('1====',pm)
95
+ this.web_upsert(this.upsertPrm).subscribe(res => {
96
+ cb && cb(res);
97
+ this.resetPrm('upsert');
98
+ });
99
+ }
100
+ }
101
+ //全部创建或更新,根据ID判断
102
+ web_upsert(param) {
103
+ this.isLoading.set(true);
104
+ if (!param.modelName) {
105
+ param = { modelName: this.modelName, ...param };
106
+ }
107
+ let addData = param.addData;
108
+ if (Object.keys(addData).length == 0) {
109
+ delete param.addData;
110
+ }
111
+ let updData = param.updData;
112
+ if (Object.keys(updData).length == 0) {
113
+ delete param.updData;
114
+ }
115
+ else {
116
+ param.updData['id'] = this.id;
117
+ param.log.pid = this.id;
118
+ }
119
+ if (!param?.addData && !param.updData) {
120
+ param = { updData: { id: this.id }, ...param };
121
+ }
122
+ console.log('this.isLog----', this.isLog);
123
+ if (!this.isLog) {
124
+ delete param.log;
125
+ }
126
+ else {
127
+ let lg = '';
128
+ param.subsert?.forEach(v => {
129
+ v.logtmp?.forEach((v, k) => {
130
+ if (v.id === 0) {
131
+ lg += '新建: -> ' + v.newValue + ';';
132
+ }
133
+ else {
134
+ lg += '[' + v.id + '-' + v.label + '] ' + (v.oldValue || '') + ' -> ' + (v.newValue || '') + ';';
135
+ }
136
+ });
137
+ });
138
+ param = { ...param, log: { ...param.log, subContent: lg } };
139
+ }
140
+ console.log('param====', param);
141
+ return this.http.post(apiPath + "upsert", param)
142
+ .pipe(map((response) => {
143
+ if (param.log) {
144
+ delete param.log;
145
+ }
146
+ return response;
147
+ }), finalize(() => {
148
+ // 无论请求成功与否,都将加载中状态设置为 false
149
+ this.isLoading.set(false);
150
+ }));
151
+ }
152
+ //自处理逻辑
153
+ deal(prm) {
154
+ if (prm) {
155
+ this.web_deal(prm).subscribe();
156
+ }
157
+ else {
158
+ this.web_deal(this.dealPrm).subscribe();
159
+ }
160
+ }
161
+ web_deal(param) {
162
+ this.isLoading.set(true);
163
+ return this.http.post(apiPath + "deal", param)
164
+ .pipe(map((response) => {
165
+ this.dealPrm = { data: response, ...this.dealPrm };
166
+ return response;
167
+ }), finalize(() => {
168
+ // 无论请求成功与否,都将加载中状态设置为 false
169
+ this.isLoading.set(false);
170
+ }));
171
+ }
172
+ //传入map,根据ID,更新map数据
173
+ write(prm) {
174
+ if (prm) {
175
+ this.web_write(prm).subscribe();
176
+ }
177
+ else {
178
+ this.web_write(this.writePrm).subscribe();
179
+ }
180
+ }
181
+ web_write(param) {
182
+ this.isLoading.set(true);
183
+ if (!param.modelName) {
184
+ param = { modelName: this.modelName, ...param };
185
+ }
186
+ return this.http.post(apiPath + "write", param)
187
+ .pipe(map((response) => {
188
+ if (param.log) {
189
+ delete param.log;
190
+ }
191
+ return response;
192
+ }), finalize(() => {
193
+ // 无论请求成功与否,都将加载中状态设置为 false
194
+ this.isLoading.set(false);
195
+ }));
196
+ }
197
+ //根据ID删除
198
+ remove(prm) {
199
+ if (prm) {
200
+ this.web_remove(prm).subscribe();
201
+ }
202
+ else {
203
+ this.web_remove(this.removePrm).subscribe();
204
+ }
205
+ }
206
+ web_remove(param) {
207
+ this.isLoading.set(true);
208
+ return this.http.post(apiPath + "remove", param)
209
+ .pipe(map((response) => {
210
+ if (param.log) {
211
+ delete param.log;
212
+ }
213
+ return response;
214
+ }), finalize(() => {
215
+ // 无论请求成功与否,都将加载中状态设置为 false
216
+ this.isLoading.set(false);
217
+ }));
218
+ }
219
+ //根据ID获取一条数据
220
+ get(prm) {
221
+ if (prm) {
222
+ this.web_get(prm).subscribe();
223
+ }
224
+ else {
225
+ this.web_get(this.getPrm).subscribe();
226
+ }
227
+ }
228
+ web_get(param) {
229
+ if (!param.hasOwnProperty('modelName')) {
230
+ param.modelName = this.modelName;
231
+ }
232
+ this.isLoading.set(true);
233
+ return this.http.post(apiPath + "get", param)
234
+ .pipe(map((response) => {
235
+ this.getPrm.data = response;
236
+ if (response.id === 0 && param.hasOwnProperty('foreignKey')) {
237
+ this.upsertPrm.addData[param.foreignKey] = param[param.foreignKey];
238
+ }
239
+ this.id = response?.id;
240
+ return response;
241
+ }), finalize(() => {
242
+ // 无论请求成功与否,都将加载中状态设置为 false
243
+ this.isLoading.set(false);
244
+ }));
245
+ }
246
+ //获取多条数据,根据传入的条件自动组织sql
247
+ search(prm) {
248
+ if (prm) {
249
+ this.web_search(prm).subscribe();
250
+ }
251
+ else {
252
+ this.web_search(this.searchPrm).subscribe();
253
+ }
254
+ }
255
+ web_search(param) {
256
+ this.isLoading.set(true);
257
+ return this.http.post(apiPath + "search", param)
258
+ .pipe(map((response) => {
259
+ this.searchPrm = { ...response };
260
+ console.log('upsey-----', this.upsertPrm);
261
+ return response;
262
+ }), finalize(() => {
263
+ // 无论请求成功与否,都将加载中状态设置为 false
264
+ this.isLoading.set(false);
265
+ }));
266
+ }
267
+ searchmap(prm) {
268
+ if (prm) {
269
+ this.web_search(prm).subscribe();
270
+ }
271
+ else {
272
+ this.web_search(this.searchPrm).subscribe();
273
+ }
274
+ }
275
+ web_searchmap(param) {
276
+ this.isLoading.set(true);
277
+ return this.http.post(apiPath + "search", param)
278
+ .pipe(map((response) => {
279
+ this.searchPrm = { ...response };
280
+ console.log('upsey-----', this.upsertPrm);
281
+ return response;
282
+ }), finalize(() => {
283
+ // 无论请求成功与否,都将加载中状态设置为 false
284
+ this.isLoading.set(false);
285
+ }));
286
+ }
287
+ //获取多条数据,根据传入的条件自动组织sql
288
+ searchCount(prm) {
289
+ if (prm) {
290
+ this.web_searchCount(prm).subscribe();
291
+ }
292
+ else {
293
+ this.web_searchCount(this.searchPrm).subscribe();
294
+ }
295
+ }
296
+ web_searchCount(param) {
297
+ this.isLoading.set(true);
298
+ return this.http.post(apiPath + "searchCount", param)
299
+ .pipe(map((response) => {
300
+ this.searchPrm = { ...response };
301
+ return response;
302
+ }), finalize(() => {
303
+ // 无论请求成功与否,都将加载中状态设置为 false
304
+ this.isLoading.set(false);
305
+ }));
306
+ }
307
+ //excel导入
308
+ // import(param: ImportExcel):Observable<any> {
309
+ // this.isLoading.set(true);
310
+ // return this.http.post("am/remove",param,httpOptions)
311
+ // .pipe(
312
+ // map((response: any) =>{
313
+ // this.message.set(response);
314
+ // this.isSuccess.set(true);
315
+ // return response;
316
+ // }),
317
+ // catchError((error) => {
318
+ // // 若请求出错,设置请求成功状态为 false,并将错误重新抛出
319
+ // this.isSuccess.set(false);
320
+ // this.message.set(error);
321
+ // return throwError(() => error);
322
+ // }),
323
+ // finalize(() => {
324
+ // // 无论请求成功与否,都将加载中状态设置为 false
325
+ // this.isLoading.set(false);
326
+ // })
327
+ // );
328
+ // }
329
+ ////excel 导出
330
+ export(prm) {
331
+ if (prm) {
332
+ this.web_export(prm).subscribe();
333
+ }
334
+ else {
335
+ this.web_export(this.exportPrm).subscribe();
336
+ }
337
+ }
338
+ web_export(param) {
339
+ if (!param.modelName) {
340
+ param = { modelName: this.modelName, ...param };
341
+ }
342
+ this.isLoading.set(true);
343
+ return this.http.post(apiPath + "export", param, { responseType: 'blob' })
344
+ .pipe(map((response) => {
345
+ const data = new Blob([response], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=UTF-8' });
346
+ const fileName = param.modelName + '.xlsx';
347
+ FileSaver.saveAs(data, fileName);
348
+ return response;
349
+ }), finalize(() => {
350
+ // 无论请求成功与否,都将加载中状态设置为 false
351
+ this.isLoading.set(false);
352
+ }));
353
+ }
354
+ //人工处理导入
355
+ dealExport(prm) {
356
+ if (prm) {
357
+ this.web_deal_export(prm).subscribe();
358
+ }
359
+ else {
360
+ this.web_deal_export(this.exportPrm).subscribe();
361
+ }
362
+ }
363
+ web_deal_export(param) {
364
+ if (!param.modelName) {
365
+ param = { modelName: this.modelName, ...param };
366
+ }
367
+ this.isLoading.set(true);
368
+ return this.http.post(apiPath + "dealExport", param, { responseType: 'blob' })
369
+ .pipe(map((response) => {
370
+ const data = new Blob([response], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=UTF-8' });
371
+ const fileName = param.modelName + '.xlsx';
372
+ FileSaver.saveAs(data, fileName);
373
+ return response;
374
+ }), finalize(() => {
375
+ // 无论请求成功与否,都将加载中状态设置为 false
376
+ this.isLoading.set(false);
377
+ }));
378
+ }
379
+ //下载导入的模板
380
+ downloadTemplate(prm) {
381
+ if (prm) {
382
+ this.web_downloadTemplate(prm).subscribe();
383
+ }
384
+ else {
385
+ this.web_downloadTemplate(this.tamplate).subscribe();
386
+ }
387
+ }
388
+ web_downloadTemplate(param) {
389
+ this.isLoading.set(true);
390
+ return this.http.post(apiPath + "download", param, { responseType: 'blob' })
391
+ .pipe(map((response) => {
392
+ const data = new Blob([response], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=UTF-8' });
393
+ const fileName = param.modelName + '模板.xlsx';
394
+ FileSaver.saveAs(data, fileName);
395
+ return response;
396
+ }), finalize(() => {
397
+ // 无论请求成功与否,都将加载中状态设置为 false
398
+ this.isLoading.set(false);
399
+ }));
400
+ }
401
+ //删除图片
402
+ imageDelete(fid) {
403
+ if (fid) {
404
+ this.web_imageDelete(fid).subscribe();
405
+ }
406
+ else if (this.fid.length > 0) {
407
+ this.web_imageDelete(this.fid).subscribe();
408
+ }
409
+ }
410
+ web_imageDelete(fid) {
411
+ this.isLoading.set(true);
412
+ return this.http.post(apiPath + "imageDelete", fid)
413
+ .pipe(map((response) => {
414
+ this.messageService.add({ severity: 'success', summary: 'Success', detail: response });
415
+ return response;
416
+ }), finalize(() => {
417
+ // 无论请求成功与否,都将加载中状态设置为 false
418
+ this.isLoading.set(false);
419
+ }));
420
+ }
421
+ //删除图片
422
+ filerDelete(fid) {
423
+ if (fid) {
424
+ this.web_filerDelete(fid).subscribe();
425
+ }
426
+ else if (this.fid.length > 0) {
427
+ this.web_filerDelete(this.fid).subscribe();
428
+ }
429
+ }
430
+ web_filerDelete(fid) {
431
+ this.isLoading.set(true);
432
+ return this.http.post(apiPath + "imageDelete", fid)
433
+ .pipe(map((response) => {
434
+ this.messageService.add({ severity: 'success', summary: 'Success', detail: response });
435
+ return response;
436
+ }), finalize(() => {
437
+ // 无论请求成功与否,都将加载中状态设置为 false
438
+ this.isLoading.set(false);
439
+ }));
440
+ }
441
+ //刷新token
442
+ refreshToken(param) {
443
+ return this.http.post(apiPath + "refreshToken", param)
444
+ .pipe(map((response) => {
445
+ this.dealPrm = { data: response, ...this.dealPrm };
446
+ return response;
447
+ }), finalize(() => {
448
+ // 无论请求成功与否,都将加载中状态设置为 false
449
+ this.isLoading.set(false);
450
+ }));
451
+ }
452
+ //创建表
453
+ createTable(prm) {
454
+ if (prm) {
455
+ this.web_createTable(prm).subscribe();
456
+ }
457
+ else {
458
+ this.web_createTable(this.param).subscribe();
459
+ }
460
+ }
461
+ web_createTable(param) {
462
+ this.isLoading.set(true);
463
+ return this.http.post(apiPath + "createTable", param)
464
+ .pipe(map((response) => {
465
+ // this.messageService.add({severity: 'success',summary: 'Success',detail: response})
466
+ return response;
467
+ }), finalize(() => {
468
+ // 无论请求成功与否,都将加载中状态设置为 false
469
+ this.isLoading.set(false);
470
+ }));
471
+ }
472
+ // 暂无确定是否重置其他公共变量
473
+ resetPrm(search) {
474
+ switch (search) {
475
+ case 'upsert':
476
+ this.upsertPrm.addData = {};
477
+ this.upsertPrm.updData = {};
478
+ this.upsertPrm.log = {};
479
+ this.upsertPrm.subsert?.forEach(v => {
480
+ v.logtmp = new Map();
481
+ v.maptmp = new Map();
482
+ v.subData = [];
483
+ });
484
+ break;
485
+ default:
486
+ '';
487
+ }
488
+ }
489
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AmComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
490
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AmComponent, isStandalone: true, selector: "app-am", providers: [MessageService], ngImport: i0, template: '', isInline: true }); }
491
+ }
492
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AmComponent, decorators: [{
493
+ type: Component,
494
+ args: [{
495
+ selector: 'app-am',
496
+ standalone: true,
497
+ imports: [],
498
+ template: '',
499
+ providers: [MessageService]
500
+ }]
501
+ }], ctorParameters: () => [] });
502
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW1tLXVpL3NyYy9saWIvYW0vYW0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvQyxPQUFPLEtBQUssU0FBUyxNQUFNLFlBQVksQ0FBQztBQUd4QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBb0l6RCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7QUFRbEIsTUFBTSxPQUFPLFdBQVc7SUFzQ3RCO1FBckNBLFFBQVE7UUFDUixVQUFLLEdBQVksS0FBSyxDQUFDO1FBQ3ZCLE9BQU87UUFDUCxPQUFFLEdBQVMsQ0FBQyxDQUFBO1FBQ1osTUFBTTtRQUNOLGNBQVMsR0FBUyxFQUFFLENBQUE7UUFDcEIsTUFBTTtRQUNOLFVBQUssR0FBUSxFQUFFLENBQUE7UUFDZixRQUFHLEdBQVMsRUFBRSxDQUFBO1FBQ2QsSUFBSTtRQUNKLGNBQVMsR0FBYyxFQUFFLENBQUM7UUFDMUIsSUFBSTtRQUNKLGtCQUFhLEdBQWdCLEVBQUUsQ0FBQztRQUNoQyxNQUFNO1FBQ04sZ0JBQVcsR0FBYyxFQUFFLENBQUM7UUFDNUIsUUFBUTtRQUNSLGNBQVMsR0FBUyxFQUFDLE9BQU8sRUFBQyxFQUFFLEVBQUMsT0FBTyxFQUFDLEVBQUUsRUFBQyxPQUFPLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsQ0FBQztRQUM1RCxJQUFJ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QUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUNELGlCQUFpQjtJQUNqQixRQUFRLENBQUMsTUFBYztRQUNyQixRQUFPLE1BQU0sRUFBQyxDQUFDO1lBQ2IsS0FBSyxRQUFRO2dCQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUE7Z0JBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDbEMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNyQixDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ3JCLENBQUMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFBO2dCQUNoQixDQUFDLENBQUMsQ0FBQztnQkFDSCxNQUFNO1lBQ1I7Z0JBQ0UsRUFBRSxDQUFBO1FBQ04sQ0FBQztJQUNILENBQUM7K0dBMWdCVSxXQUFXO21HQUFYLFdBQVcscURBRlosQ0FBQyxjQUFjLENBQUMsMEJBRGhCLEVBQUU7OzRGQUdELFdBQVc7a0JBUHZCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsRUFBRTtvQkFDWCxRQUFRLEVBQUUsRUFBRTtvQkFDWixTQUFTLEVBQUMsQ0FBQyxjQUFjLENBQUM7aUJBQzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LGluamVjdCxzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgZmluYWxpemUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XHJcbmltcG9ydCB7IEZvcm1PcHRpb25zIH0gZnJvbSAnLi4vZm9ybS9mb3JtL2Zvcm0uY29tcG9uZW50J1xyXG5pbXBvcnQgeyBTZWFyY2hPcHRpb25zIH0gZnJvbSAnLi4vc2VhcmNoL3NlYXJjaC9zZWFyY2guY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7VG9hc3R9IGZyb20gJ3ByaW1lbmcvdG9hc3QnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuZXhwb3J0IGludGVyZmFjZSBQYXJhbXtcclxuICBpZD86bnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNlTWVzc2FnZSB7XHJcbiAgaWQ/OiBudW1iZXI7XHJcbiAgcGlkPzpudW1iZXI7ICAvLyDooajkuK1pZFxyXG4gIGZ1bmM/OnN0cmluZztcclxuICBvcGVyYXRvcj86c3RyaW5nO1xyXG4gIGNvbnRlbnQ/OnN0cmluZzsgIC8vIOS4u+ihqOWPmOabtOaJgOacieWtl+auteaLvOaOpeS4gOWdl1xyXG4gIHN1YkNvbnRlbnQ/OnN0cmluZzsgLy8g5a2Q6KGo5Y+Y5pu05ou85o6l5LiA6LW3XHJcbiAgY3JlYXRlZEF0PzpzdHJpbmc7XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBJbXBvcnRFeGNlbHtcclxuICBtb2RlbE5hbWU/OiBzdHJpbmc7XHJcbiAgb3JnSWQ/OiBudW1iZXI7XHJcbiAgb3JnTmFtZT86c3RyaW5nO1xyXG4gIG9yZ0lkRmVpbGQ/OiBzdHJpbmc7XHJcbiAgb3JnTmFtZUZlaWxkPzpzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVXBzZXJ0IHtcclxuICBtb2RlbE5hbWU/OiBzdHJpbmc7XHJcbiAgYWRkRGF0YT86IFJlY29yZDxzdHJpbmcsYW55PjtcclxuICB1cGREYXRhPzogUmVjb3JkPHN0cmluZyxhbnk+O1xyXG4gIHN1YnNlcnQ/OiBTdWJVcHNlcnRbXTtcclxuICBsb2dNb2RlbD86IHN0cmluZztcclxuICBsb2c/OiBUcmFjZU1lc3NhZ2U7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3ViVXBzZXJ0IHtcclxuICBzdWJNb2RlbE5hbWU/OiBzdHJpbmc7XHJcbiAgZms/OnN0cmluZztcclxuICBzdWJEYXRhPzogUmVjb3JkPHN0cmluZyxhbnk+W11cclxuICBtYXB0bXA/OiBNYXA8bnVtYmVyLGFueT47XHJcbiAgbG9ndG1wPzogTWFwPHN0cmluZyxhbnk+XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBEZWFse1xyXG4gIG1vZGVsTmFtZT86IHN0cmluZztcclxuICBkYXRhPzphbnk7XHJcbn1cclxuLy8g5pu05paw54m55a6a5a2X5q61XHJcbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGV7XHJcbiAgbW9kZWxOYW1lPzpzdHJpbmc7XHJcbiAgZGF0YT86UmVjb3JkPHN0cmluZyxhbnk+O1xyXG4gIGxvZ01vZGVsPzpzdHJpbmc7XHJcbiAgbG9nPzpUcmFjZU1lc3NhZ2U7XHJcbiAgdHJhbnNhY3Rpb24/OiBib29sZWFuO1xyXG59XHJcbi8vIOWIoOmZpOaOpeWPo+WjsOaYjlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZXtcclxuICBtb2RlbE5hbWU/OnN0cmluZztcclxuICBpZHM/Om51bWJlcltdO1xyXG4gIGRhdGE/OmFueTtcclxuICBsb2dNb2RlbD86c3RyaW5nO1xyXG4gIGxvZz86VHJhY2VNZXNzYWdlO1xyXG4gIHRyYW5zYWN0aW9uPzogYm9vbGVhbjtcclxufVxyXG4vLyDojrflj5bljZXmnaHmlbDmja7or6bmg4VcclxuZXhwb3J0IGludGVyZmFjZSBHZXR7XHJcbiAgbW9kZWxOYW1lPzpzdHJpbmc7XHJcbiAgdXNlckNvZGU/OiBzdHJpbmc7XHJcbiAgb3JnRmllbGQ/OiBzdHJpbmc7XHJcbiAgaWQ/Om51bWJlcjtcclxuICBwcmVsb2Fkcz86c3RyaW5nW107IC8vIOiBlOihqOafpeivouihqOWQjeensO+8jOmcgOWvueW6lOWQjuerr3N0cnVjdFxyXG4gIGZpdGVyUHJlbG9hZHM/OlByZWxvYWRbXTsgLy8g5Y+q6IO95Yqg5LiA5bGCIOexu+S8vCAnbW9kdWxlID0nIG1vZHVsZVxyXG4gIGdldExvZz86Ym9vbGVhbjsgLy/ojrflj5bml6Xlv5dcclxuICBkYXRhPzphbnk7IC8v5ZCO56uv6L+U5Zue55qEcmVzcG9uc2VcclxuICBjb2x1bW5GaWx0ZXJzPzogQ29sdW1uRmlsdGVyW107IC8v6L+H5ruk55qE5YiXXHJcbiAgZm9yZWlnbktleT86c3RyaW5nICAvL+ebtOaOpeaPkuWFpeWtkOihqOmcgOimgeS8oOmAkuWklumUruWtl+auteS7peWPiuWklumUruWAvFxyXG4gIFtwcm9wTmFtZTogc3RyaW5nXTphbnlcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFByZWxvYWR7XHJcbiAgZmVpbGROYW1lPzogc3RyaW5nO1xyXG4gIGZpdGVycz86Q29sdW1uRmlsdGVyW107XHJcbiAgc29ydHM/OlNvcnRbXTtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbkZpbHRlciB7XHJcbiAgY29sdW1uRmllbGQ/OnN0cmluZztcclxuICB0eXBlPzpzdHJpbmc7XHJcbiAgZml0ZXI/OiBhbnk7XHJcbiAgZnJvbT86c3RyaW5nIHwgbnVtYmVyO1xyXG4gIHRvPzpzdHJpbmcgfCBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU29ydHtcclxuICBmaWVsZD86c3RyaW5nO1xyXG4gIGlzQXNjPzpib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaHtcclxuICBtb2RlbE5hbWU/OiBzdHJpbmc7XHJcbiAgdXNlckNvZGU/OiBzdHJpbmc7XHJcbiAgb3JnRmllbGQ/OiBzdHJpbmc7XHJcbiAgY291bnQ/OmJvb2xlYW47IC8v5piv5ZCm6L+U5ZuedG90YWxOdW0gXHJcbiAgcHJlbG9hZHM/OnN0cmluZ1tdO1xyXG4gIGZpdGVyUHJlbG9hZHM/OlByZWxvYWRbXTtcclxuICBtb2RlbD86YW55OyBcclxuICBkYXRhPzphbnk7XHJcbiAgY29sdW1uRmlsdGVycz86IENvbHVtbkZpbHRlcltdOyAvL+i/h+a7pOeahOWIl1xyXG4gIHNvcnRzPzogU29ydFtdO1xyXG4gIGdyb3Vwcz86IHN0cmluZ1tdO1xyXG4gIHJlYWQ/OnN0cmluZ1tdOyAgLy9yZWFkIOaMh+WumuafpeivoueJueWumuWtl+autVxyXG4gIGZ1bmNzPzpSZWNvcmQ8c3RyaW5nLHN0cmluZz47IC8v6YCP6KeG6KGo5ZCO5pyf6KaB55SoXHJcbiAgb2Zmc2V0PzpudW1iZXI7IFxyXG4gIGxpbWl0PzpudW1iZXI7XHJcbiAgdG90YWxOdW0/Om51bWJlcjtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuSW5mbyB7XHJcbiAgdG9rZW4/OnN0cmluZ1xyXG4gIGV4cGlyZWQ/OiBudW1iZXJcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIGFtV2Vie1xyXG4gIGlkPzogbnVtYmVyO1xyXG4gIGNvZGU/OiBzdHJpbmc7XHJcbiAgdHlwZT86IHN0cmluZztcclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIGFwcElkPzogbnVtYmVyO1xyXG4gIGNvbnRlbnQ/OiBzdHJpbmc7XHJcbiAgY3JlYXRlZEF0Pzogc3RyaW5nO1xyXG4gIHVwZGF0ZWRBdD86c3RyaW5nO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgUmZkIHtcclxuICBtb2RlbE5hbWU/OiBzdHJpbmc7XHJcbiAgbGFiZWxGaWVsZD86IHN0cmluZztcclxuICB2YWx1ZUZpZWxkPzogc3RyaW5nO1xyXG4gIHdoZXJlRmllbGQ/OiBzdHJpbmc7XHJcbiAgdHlwZT86IHN0cmluZztcclxuICBmaXRlcj86IGFueTtcclxuICBkYXRhPzogYW55O1xyXG59XHJcbmNvbnN0IGFwaVBhdGggPSBcIlwiXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWFtJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtdLFxyXG4gIHRlbXBsYXRlOiAnJyxcclxuICBwcm92aWRlcnM6W01lc3NhZ2VTZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW1Db21wb25lbnQge1xyXG4gIC8v5piv5ZCm5o+Q5Lqk5pel5b+XXHJcbiAgaXNMb2c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvL+S4u+aVsOaNrmlkXHJcbiAgaWQ6IG51bWJlcj0wXHJcbiAgLy/kuLvooajmqKHlnotcclxuICBtb2RlbE5hbWU6IHN0cmluZz0nJ1xyXG4gIC8vSUTlj4LmlbBcclxuICBwYXJhbTogUGFyYW09e31cclxuICBmaWQ6IHN0cmluZz0nJ1xyXG4gIC8v5a+85YWlXHJcbiAgaW1wb3J0UHJtOiBJbXBvcnRFeGNlbD17fTtcclxuICAvL+aQnOe0oFxyXG4gIHNlYXJjaE9wdGlvbnM6IFNlYXJjaE9wdGlvbnM9e307XHJcbiAgLy9mb3JtXHJcbiAgZm9ybU9wdGlvbnM6IEZvcm1PcHRpb25zPXt9O1xyXG4gIC8v5Yib5bu65oiW6ICF5pu05pawXHJcbiAgdXBzZXJ0UHJtOiBVcHNlcnQ9e3VwZERhdGE6e30sYWRkRGF0YTp7fSxzdWJzZXJ0OltdLGxvZzp7fX07XHJcbiAgLy/lpITnkIZcclxuICBkZWFsUHJtOiBEZWFsPXt9O1xyXG4gIC8vbWFw5pu05pawXHJcbiAgd3JpdGVQcm06IFdyaXRlPXt9O1xyXG4gIC8v5Yig6ZmkXHJcbiAgcmVtb3ZlUHJtOiBSZW1vdmU9e307XHJcbiAgLy/ojrflj5bkuIDmnaHmlbDmja5cclxuICBnZXRQcm06IEdldD17ZGF0YTp7fX07XHJcbiAgLy/mn6Xor6LmnaHku7ZcclxuICBmaWx0ZXI6IENvbHVtbkZpbHRlcj17fTtcclxuICAvL+afpeivouWIl+ihqOaVsOaNrlxyXG4gIHNlYXJjaFBybTogU2VhcmNoPXt9O1xyXG4gIGV4cG9ydFBybTogU2VhcmNoPXt9O1xyXG4gIHRhbXBsYXRlOiBEZWFsPXt9XHJcbiAgLy8g6KGo56S65piv5ZCm5q2j5Zyo5Yqg6L2955So5oi35pWw5o2u55qEU2lnbmFs77yM5Yid5aeL5YC85Li6IGZhbHNlXHJcbiAgaXNMb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcclxuICBodHRwOiBIdHRwQ2xpZW50ID0gaW5qZWN0KEh0dHBDbGllbnQpXHJcbiAgbWVzc2FnZVNlcnZpY2UgOk1lc3NhZ2VTZXJ2aWNlID0gaW5qZWN0KE1lc3NhZ2VTZXJ2aWNlKVxyXG4gIHJvdXRlIDpBY3RpdmF0ZWRSb3V0ZSA9aW5qZWN0KEFjdGl2YXRlZFJvdXRlKVxyXG4gIHJvdXRlciA9IGluamVjdChSb3V0ZXIpXHJcbiAgY29uc3RydWN0b3IoKSB7fVxyXG5cclxuICByZmQocHJtOiBSZmQpOk9ic2VydmFibGU8YW55PntcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGlQYXRoK1wiUkZEXCIscHJtLClcclxuICAgIC5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+e1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAvLyDml6Dorrror7fmsYLmiJDlip/kuI7lkKbvvIzpg73lsIbliqDovb3kuK3nirbmgIHorr7nva7kuLogZmFsc2VcclxuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgd2ViZ2V0KHBhcmFtOmFtV2ViKTpPYnNlcnZhYmxlPGFueT57XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpUGF0aCtcIndlYmdldFwiLHBhcmFtLClcclxuICAgIC5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+e1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAvLyDml6Dorrror7fmsYLmiJDlip/kuI7lkKbvvIzpg73lsIbliqDovb3kuK3nirbmgIHorr7nva7kuLogZmFsc2VcclxuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHdlYnNhdmUocGFyYW06YW1XZWIpOk9ic2VydmFibGU8YW55PntcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGlQYXRoK1wid2Vic2F2ZVwiLHBhcmFtLClcclxuICAgIC5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+e1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAvLyDml6Dorrror7fmsYLmiJDlip/kuI7lkKbvvIzpg73lsIbliqDovb3kuK3nirbmgIHorr7nva7kuLogZmFsc2VcclxuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHdlYmRlbChwYXJhbTphbVdlYik6T2JzZXJ2YWJsZTxhbnk+e1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaVBhdGgrXCJ3ZWJkZWxcIixwYXJhbSwpXHJcbiAgICAucGlwZShcclxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PntcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgLy8g5peg6K666K+35rGC5oiQ5Yqf5LiO5ZCm77yM6YO95bCG5Yqg6L295Lit54q25oCB6K6+572u5Li6IGZhbHNlXHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICB1cHNlcnQocHJtPzphbnksY2I/OkZ1bmN0aW9uKXtcclxuICAgIGlmKHBybSl7XHJcbiAgICAgIHRoaXMud2ViX3Vwc2VydChwcm0pLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIGNiICYmIGNiKHJlcylcclxuXHRcdCAgICB0aGlzLnJlc2V0UHJtKCd1cHNlcnQnKVxyXG4gICAgICB9KTtcclxuICAgIH1lbHNle1xyXG4gICAgICAvLyBjb25zdCBwbTogVXBzZXJ0ID0gdGhpcy51cHNlcnRzKClcclxuICAgICAgLy8gY29uc29sZS5sb2coJzE9PT09JyxwbSlcclxuICAgICAgdGhpcy53ZWJfdXBzZXJ0KHRoaXMudXBzZXJ0UHJtKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICBjYiAmJiBjYihyZXMpXHJcblx0XHQgICAgdGhpcy5yZXNldFBybSgndXBzZXJ0JylcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8v5YWo6YOo5Yib5bu65oiW5pu05paw77yM5qC55o2uSUTliKTmlq1cclxuICB3ZWJfdXBzZXJ0KHBhcmFtOlVwc2VydCk6T2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcclxuICAgIGlmKCFwYXJhbS5tb2RlbE5hbWUpe1xyXG4gICAgICBwYXJhbSA9IHttb2RlbE5hbWU6IHRoaXMubW9kZWxOYW1lLC4uLnBhcmFtfVxyXG4gICAgfVxyXG4gICAgbGV0IGFkZERhdGE6IGFueSA9IHBhcmFtLmFkZERhdGFcclxuICAgIGlmKE9iamVjdC5rZXlzKGFkZERhdGEpLmxlbmd0aD09MCl7XHJcbiAgICAgIGRlbGV0ZSBwYXJhbS5hZGREYXRhXHJcbiAgICB9XHJcbiAgICBsZXQgdXBkRGF0YTogYW55ID1wYXJhbS51cGREYXRhXHJcbiAgICBpZihPYmplY3Qua2V5cyh1cGREYXRhKS5sZW5ndGg9PTApe1xyXG4gICAgICBkZWxldGUgcGFyYW0udXBkRGF0YVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcGFyYW0udXBkRGF0YSFbJ2lkJ10gPSB0aGlzLmlkXHJcbiAgICAgIHBhcmFtLmxvZyEucGlkID0gdGhpcy5pZFxyXG4gICAgfVxyXG4gICAgaWYoIXBhcmFtPy5hZGREYXRhICYmICFwYXJhbS51cGREYXRhKXtcclxuICAgICAgcGFyYW0gPSB7dXBkRGF0YTp7aWQ6dGhpcy5pZH0sLi4ucGFyYW19XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygndGhpcy5pc0xvZy0tLS0nLHRoaXMuaXNMb2cpXHJcbiAgICBpZighdGhpcy5pc0xvZyl7XHJcbiAgICAgIGRlbGV0ZSBwYXJhbS5sb2dcclxuICAgIH1lbHNle1xyXG4gICAgICBsZXQgbGc6c3RyaW5nPScnXHJcbiAgICAgIHBhcmFtLnN1YnNlcnQ/LmZvckVhY2godj0+e1xyXG4gICAgICAgIHYubG9ndG1wPy5mb3JFYWNoKCh2LGspPT57XHJcbiAgICAgICAgICBpZih2LmlkPT09MCl7XHJcbiAgICAgICAgICAgIGxnICs9J+aWsOW7uu+8miAtPiAnK3YubmV3VmFsdWUrJzsnXHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgbGcgKz0gJ1snK3YuaWQrJy0nK3YubGFiZWwrJ10gJyArICh2Lm9sZFZhbHVlIHx8ICcnKSArJyAtPiAnKyh2Lm5ld1ZhbHVlIHx8ICcnKSsnOydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgICBwYXJhbT17Li4ucGFyYW0sbG9nOnsuLi5wYXJhbS5sb2csc3ViQ29udGVudDpsZ319XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygncGFyYW09PT09JyxwYXJhbSlcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGlQYXRoK1widXBzZXJ0XCIscGFyYW0sKVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT57XHJcbiAgICAgICAgaWYgKHBhcmFtLmxvZyl7XHJcbiAgICAgICAgICBkZWxldGUgcGFyYW0ubG9nO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgLy8g5peg6K666K+35rGC5oiQ5Yqf5LiO5ZCm77yM6YO95bCG5Yqg6L295Lit54q25oCB6K6+572u5Li6IGZhbHNlXHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIC8v6Ieq5aSE55CG6YC76L6RXHJcbiAgZGVhbChwcm0/OkRlYWwpe1xyXG4gICAgaWYgKHBybSkge1xyXG4gICAgICB0aGlzLndlYl9kZWFsKHBybSkuc3Vic2NyaWJlKCk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy53ZWJfZGVhbCh0aGlzLmRlYWxQcm0pLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICB3ZWJfZGVhbChwYXJhbTpEZWFsKTpPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaVBhdGgrXCJkZWFsXCIscGFyYW0pXHJcbiAgICAucGlwZShcclxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PntcclxuICAgICAgICB0aGlzLmRlYWxQcm09e2RhdGE6IHJlc3BvbnNlLC4uLnRoaXMuZGVhbFBybX1cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgLy8g5peg6K666K+35rGC5oiQ5Yqf5LiO5ZCm77yM6YO95bCG5Yqg6L295Lit54q25oCB6K6+572u5Li6IGZhbHNlXHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4vL+S8oOWFpW1hcO+8jOagueaNrklE77yM5pu05pawbWFw5pWw5o2uXHJcbiAgd3JpdGUocHJtPzpXcml0ZSkge1xyXG4gICAgaWYocHJtKXtcclxuICAgICAgdGhpcy53ZWJfd3JpdGUocHJtKS5zdWJzY3JpYmUoKTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLndlYl93cml0ZSh0aGlzLndyaXRlUHJtKS5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgd2ViX3dyaXRlKHBhcmFtOldyaXRlKTpPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xyXG4gICAgaWYoIXBhcmFtLm1vZGVsTmFtZSl7XHJcbiAgICAgIHBhcmFtID0ge21vZGVsTmFtZTogdGhpcy5tb2RlbE5hbWUsLi4ucGFyYW19XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpUGF0aCtcIndyaXRlXCIscGFyYW0pXHJcbiAgICAucGlwZShcclxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PntcclxuICAgICAgICBpZiAocGFyYW0ubG9nKXtcclxuICAgICAgICAgIGRlbGV0ZSBwYXJhbS5sb2c7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAvLyDml6Dorrror7fmsYLmiJDlip/kuI7lkKbvvIzpg73lsIbliqDovb3kuK3nirbmgIHorr7nva7kuLogZmFsc2VcclxuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbi8v5qC55o2uSUTliKDpmaRcclxuICByZW1vdmUocHJtPzpSZW1vdmUpe1xyXG4gICAgaWYocHJtKXtcclxuICAgICAgdGhpcy53ZWJfcmVtb3ZlKHBybSkuc3Vic2NyaWJlKCk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy53ZWJfcmVtb3ZlKHRoaXMucmVtb3ZlUHJtKS5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgd2ViX3JlbW92ZShwYXJhbTpSZW1vdmUpOk9ic2VydmFibGU8YW55PiB7XHJcbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpUGF0aCtcInJlbW92ZVwiLHBhcmFtLClcclxuICAgIC5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+e1xyXG4gICAgICAgIGlmIChwYXJhbS5sb2cpe1xyXG4gICAgICAgICAgZGVsZXRlIHBhcmFtLmxvZztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgIC8vIOaXoOiuuuivt+axguaIkOWKn+S4juWQpu+8jOmDveWwhuWKoOi9veS4reeKtuaAgeiuvue9ruS4uiBmYWxzZVxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuLy/moLnmja5JROiOt+WPluS4gOadoeaVsOaNrlxyXG4gIGdldChwcm0/OkdldCl7XHJcbiAgICBpZihwcm0pe1xyXG4gICAgICB0aGlzLndlYl9nZXQocHJtKS5zdWJzY3JpYmUoKTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLndlYl9nZXQodGhpcy5nZXRQcm0pLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICB3ZWJfZ2V0KHBhcmFtOkdldCk6T2JzZXJ2YWJsZTxhbnk+e1xyXG4gICAgaWYoIXBhcmFtLmhhc093blByb3BlcnR5KCdtb2RlbE5hbWUnKSl7XHJcbiAgICAgIHBhcmFtLm1vZGVsTmFtZT10aGlzLm1vZGVsTmFtZTtcclxuICAgIH0gXHJcbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpUGF0aCtcImdldFwiLHBhcmFtKVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT57XHJcbiAgICAgICAgdGhpcy5nZXRQcm0uZGF0YSA9IHJlc3BvbnNlXHJcbiAgICAgICAgaWYocmVzcG9uc2UuaWQgPT09IDAgJiYgcGFyYW0uaGFzT3duUHJvcGVydHkoJ2ZvcmVpZ25LZXknKSl7XHJcbiAgICAgICAgICB0aGlzLnVwc2VydFBybS5hZGREYXRhIVtwYXJhbS5mb3JlaWduS2V5IV0gPSBwYXJhbVtwYXJhbS5mb3JlaWduS2V5IV1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pZD1yZXNwb25zZT8uaWRcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgLy8g5peg6K666K+35rGC5oiQ5Yqf5LiO5ZCm77yM6YO95bCG5Yqg6L295Lit54q25oCB6K6+572u5Li6IGZhbHNlXHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4vL+iOt+WPluWkmuadoeaVsOaNru+8jOagueaNruS8oOWFpeeahOadoeS7tuiHquWKqOe7hOe7h3NxbFxyXG4gIHNlYXJjaChwcm0/OlNlYXJjaCl7XHJcbiAgICBpZihwcm0pe1xyXG4gICAgICB0aGlzLndlYl9zZWFyY2gocHJtKS5zdWJzY3JpYmUoKTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLndlYl9zZWFyY2godGhpcy5zZWFyY2hQcm0pLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICB3ZWJfc2VhcmNoKHBhcmFtOlNlYXJjaCk6T2JzZXJ2YWJsZTxhbnk+e1xyXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaVBhdGgrXCJzZWFyY2hcIixwYXJhbSlcclxuICAgIC5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+e1xyXG4gICAgICAgIHRoaXMuc2VhcmNoUHJtID17Li4ucmVzcG9uc2V9XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3Vwc2V5LS0tLS0nLHRoaXMudXBzZXJ0UHJtKVxyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAvLyDml6Dorrror7fmsYLmiJDlip/kuI7lkKbvvIzpg73lsIbliqDovb3kuK3nirbmgIHorr7nva7kuLogZmFsc2VcclxuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgc2VhcmNobWFwKHBybT86U2VhcmNoKXtcclxuICAgIGlmKHBybSl7XHJcbiAgICAgIHRoaXMud2ViX3NlYXJjaChwcm0pLnN1YnNjcmliZSgpO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMud2ViX3NlYXJjaCh0aGlzLnNlYXJjaFBybSkuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHdlYl9zZWFyY2htYXAocGFyYW06U2VhcmNoKTpPYnNlcnZhYmxlPGFueT57XHJcbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpUGF0aCtcInNlYXJjaFwiLHBhcmFtKVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT57XHJcbiAgICAgICAgdGhpcy5zZWFyY2hQcm0gPXsuLi5yZXNwb25zZX1cclxuICAgICAgICBjb25zb2xlLmxvZygndXBzZXktLS0tLScsdGhpcy51cHNlcnRQcm0pXHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgIC8vIOaXoOiuuuivt+axguaIkOWKn+S4juWQpu+8jOmDveWwhuWKoOi9veS4reeKtuaAgeiuvue9ruS4uiBmYWxzZVxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICAvL+iOt+WPluWkmuadoeaVsOaNru+8jOagueaNruS8oOWFpeeahOadoeS7tuiHquWKqOe7hOe7h3NxbFxyXG4gIHNlYXJjaENvdW50KHBybT86U2VhcmNoKXtcclxuICAgIGlmKHBybSl7XHJcbiAgICAgIHRoaXMud2ViX3NlYXJjaENvdW50KHBybSkuc3Vic2NyaWJlKCk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy53ZWJfc2VhcmNoQ291bnQodGhpcy5zZWFyY2hQcm0pLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICB3ZWJfc2VhcmNoQ291bnQocGFyYW06U2VhcmNoKTpPYnNlcnZhYmxlPGFueT57XHJcbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpUGF0aCtcInNlYXJjaENvdW50XCIscGFyYW0pXHJcbiAgICAucGlwZShcclxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PntcclxuICAgICAgICB0aGlzLnNlYXJjaFBybSA9ey4uLnJlc3BvbnNlfVxyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAvLyDml6Dorrror7fmsYLmiJDlip/kuI7lkKbvvIzpg73lsIbliqDovb3kuK3nirbmgIHorr7nva7kuLogZmFsc2VcclxuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAvL2V4Y2Vs5a+85YWlXHJcbiAgLy8gaW1wb3J0KHBhcmFtOiBJbXBvcnRFeGNlbCk6T2JzZXJ2YWJsZTxhbnk+IHtcclxuICAvLyAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcclxuICAvLyAgIHJldHVybiB0aGlzLmh0dHAucG9zdChcImFtL3JlbW92ZVwiLHBhcmFtLGh0dHBPcHRpb25zKVxyXG4gIC8vICAgLnBpcGUoXHJcbiAgLy8gICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT57XHJcbiAgLy8gICAgICAgdGhpcy5tZXNzYWdlLnNldChyZXNwb25zZSk7XHJcbiAgLy8gICAgICAgdGhpcy5pc1N1Y2Nlc3Muc2V0KHRydWUpO1xyXG4gIC8vICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAvLyAgICAgfSksXHJcbiAgLy8gICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgLy8gICAgICAgLy8g6Iul6K+35rGC5Ye66ZSZ77yM6K6+572u6K+35rGC5oiQ5Yqf54q25oCB5Li6IGZhbHNl77yM5bm25bCG6ZSZ6K+v6YeN5paw5oqb5Ye6XHJcbiAgLy8gICAgICAgdGhpcy5pc1N1Y2Nlc3Muc2V0KGZhbHNlKTtcclxuICAvLyAgICAgICB0aGlzLm1lc3NhZ2Uuc2V0KGVycm9yKTtcclxuICAvLyAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XHJcbiAgLy8gICAgIH0pLFxyXG4gIC8vICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgLy8gICAgICAgLy8g5peg6K666K+35rGC5oiQ5Yqf5LiO5ZCm77yM6YO95bCG5Yqg6L295Lit54q25oCB6K6+572u5Li6IGZhbHNlXHJcbiAgLy8gICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAvLyAgICAgfSlcclxuICAvLyAgICk7XHJcbiAgLy8gfVxyXG4gIC8vLy9leGNlbCDlr7zlh7pcclxuICBleHBvcnQocHJtPzpTZWFyY2gpe1xyXG4gICAgaWYocHJtKXtcclxuICAgICAgdGhpcy53ZWJfZXhwb3J0KHBybSkuc3Vic2NyaWJlKCk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy53ZWJfZXhwb3J0KHRoaXMuZXhwb3J0UHJtKS5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgd2ViX2V4cG9ydChwYXJhbTogU2VhcmNoKTpPYnNlcnZhYmxlPGFueT57XHJcbiAgICBpZighcGFyYW0ubW9kZWxOYW1lKXtcclxuICAgICAgcGFyYW0gPSB7bW9kZWxOYW1lOiB0aGlzLm1vZGVsTmFtZSwuLi5wYXJhbX1cclxuICAgIH1cclxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGlQYXRoK1wiZXhwb3J0XCIscGFyYW0seyByZXNwb25zZVR5cGU6ICdibG9iJyB9KVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT57XHJcbiAgICAgICAgY29uc3QgZGF0YTogQmxvYiA9IG5ldyBCbG9iKFtyZXNwb25zZV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0OyBjaGFyc2V0PVVURi04JyB9KTtcclxuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhcmFtLm1vZGVsTmFtZSsnLnhsc3gnO1xyXG4gICAgICAgIEZpbGVTYXZlci5zYXZlQXMoZGF0YSwgZmlsZU5hbWUpO1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAvLyDml6Dorrror7fmsYLmiJDlip/kuI7lkKbvvIzpg73lsIbliqDovb3kuK3nirbmgIHorr7nva7kuLogZmFsc2VcclxuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgLy/kurrlt6XlpITnkIblr7zlhaVcclxuICBkZWFsRXhwb3J0KHBybT86U2VhcmNoKXtcclxuICAgIGlmKHBybSl7XHJcbiAgICAgIHRoaXMud2ViX2RlYWxfZXhwb3J0KHBybSkuc3Vic2NyaWJlKCk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy53ZWJfZGVhbF9leHBvcnQodGhpcy5leHBvcnRQcm0pLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICB3ZWJfZGVhbF9leHBvcnQocGFyYW06IFNlYXJjaCk6T2JzZXJ2YWJsZTxhbnk+e1xyXG4gICAgaWYoIXBhcmFtLm1vZGVsTmFtZSl7XHJcbiAgICAgIHBhcmFtID0ge21vZGVsTmFtZTogdGhpcy5tb2RlbE5hbWUsLi4ucGFyYW19XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpUGF0aCtcImRlYWxFeHBvcnRcIixwYXJhbSx7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pXHJcbiAgICAucGlwZShcclxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PntcclxuICAgICAgICBjb25zdCBkYXRhOiBCbG9iID0gbmV3IEJsb2IoW3Jlc3BvbnNlXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7IGNoYXJzZXQ9VVRGLTgnIH0pO1xyXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGFyYW0ubW9kZWxOYW1lKycueGxzeCc7XHJcbiAgICAgICAgRmlsZVNhdmVyLnNhdmVBcyhkYXRhLCBmaWxlTmFtZSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgIC8vIOaXoOiuuuivt+axguaIkOWKn+S4juWQpu+8jOmDveWwhuWKoOi9veS4reeKtuaAgeiuvue9ruS4uiBmYWxzZVxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICAvL+S4i+i9veWvvOWFpeeahOaooeadv1xyXG4gIGRvd25sb2FkVGVtcGxhdGUocHJtPzpEZWFsKXtcclxuICAgIGlmKHBybSl7XHJcbiAgICAgIHRoaXMud2ViX2Rvd25sb2FkVGVtcGxhdGUocHJtKS5zdWJzY3JpYmUoKTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLndlYl9kb3dubG9hZFRlbXBsYXRlKHRoaXMudGFtcGxhdGUpLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICB3ZWJfZG93bmxvYWRUZW1wbGF0ZShwYXJhbTogRGVhbCk6T2JzZXJ2YWJsZTxhbnk+e1xyXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaVBhdGgrXCJkb3dubG9hZFwiLHBhcmFtLHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSlcclxuICAgIC5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+e1xyXG4gICAgICAgIGNvbnN0IGRhdGE6IEJsb2IgPSBuZXcgQmxvYihbcmVzcG9uc2VdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldDsgY2hhcnNldD1VVEYtOCcgfSk7XHJcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBwYXJhbS5tb2RlbE5hbWUrJ+aooeadvy54bHN4JztcclxuICAgICAgICBGaWxlU2F2ZXIuc2F2ZUFzKGRhdGEsIGZpbGVOYW1lKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgLy8g5peg6K666K+35rGC5oiQ5Yqf5LiO5ZCm77yM6YO95bCG5Yqg6L295Lit54q25oCB6K6+572u5Li6IGZhbHNlXHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIC8v5Yig6Zmk5Zu+54mHXHJcbiAgaW1hZ2VEZWxldGUoZmlkPzpzdHJpbmcpe1xyXG4gICAgaWYoZmlkKXtcclxuICAgICAgdGhpcy53ZWJfaW1hZ2VEZWxldGUoZmlkKS5zdWJzY3JpYmUoKTtcclxuICAgIH1lbHNlIGlmICh0aGlzLmZpZC5sZW5ndGg+MCl7XHJcbiAgICAgIHRoaXMud2ViX2ltYWdlRGVsZXRlKHRoaXMuZmlkKS5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgd2ViX2ltYWdlRGVsZXRlKGZpZDpzdHJpbmcpOk9ic2VydmFibGU8YW55PntcclxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGlQYXRoK1wiaW1hZ2VEZWxldGVcIixmaWQpXHJcbiAgICAucGlwZShcclxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PntcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7c2V2ZXJpdHk6ICdzdWNjZXNzJyxzdW1tYXJ5OiAnU3VjY2VzcycsZGV0YWlsOiByZXNwb25zZX0pXHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgIC8vIOaXoOiuuuivt+axguaIkOWKn+S4juWQpu+8jOmDveWwhuWKoOi9veS4reeKtuaAgeiuvue9ruS4uiBmYWxzZVxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICAgIC8v5Yig6Zmk5Zu+54mHXHJcbiAgZmlsZXJEZWxldGUoZmlkPzpzdHJpbmcpe1xyXG4gICAgICBpZihmaWQpe1xyXG4gICAgICAgIHRoaXMud2ViX2ZpbGVyRGVsZXRlKGZpZCkuc3Vic2NyaWJlKCk7XHJcbiAgICAgIH1lbHNlIGlmICh0aGlzLmZpZC5sZW5ndGg+MCl7XHJcbiAgICAgICAgdGhpcy53ZWJfZmlsZXJEZWxldGUodGhpcy5maWQpLnN1YnNjcmliZSgpO1xyXG4gICAgICB9XHJcbiAgfVxyXG4gIHdlYl9maWxlckRlbGV0ZShmaWQ6c3RyaW5nKTpPYnNlcnZhYmxlPGFueT57XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaVBhdGgrXCJpbWFnZURlbGV0ZVwiLGZpZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PntcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtzZXZlcml0eTogJ3N1Y2Nlc3MnLHN1bW1hcnk6ICdTdWNjZXNzJyxkZXRhaWw6IHJlc3BvbnNlfSlcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgICAvLyDml6Dorrror7fmsYLmiJDlip/kuI7lkKbvvIzpg73lsIbliqDovb3kuK3nirbmgIHorr7nva7kuLogZmFsc2VcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAvL+WIt+aWsHRva2VuXHJcbiAgcmVmcmVzaFRva2VuKHBhcmFtOlRva2VuSW5mbyk6T2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGlQYXRoK1wicmVmcmVzaFRva2VuXCIscGFyYW0pXHJcbiAgICAucGlwZShcclxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PntcclxuICAgICAgICB0aGlzLmRlYWxQcm09e2RhdGE6IHJlc3BvbnNlLC4uLnRoaXMuZGVhbFBybX1cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgLy8g5peg6K666K+35rGC5oiQ5Yqf5LiO5ZCm77yM6YO95bCG5Yqg6L295Lit54q25oCB6K6+572u5Li6IGZhbHNlXHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIC8v5Yib5bu66KGoXHJcbiAgY3JlYXRlVGFibGUocHJtPzpQYXJhbSl7XHJcbiAgICBpZihwcm0pe1xyXG4gICAgICB0aGlzLndlYl9jcmVhdGVUYWJsZShwcm0pLnN1YnNjcmliZSgpO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMud2ViX2NyZWF0ZVRhYmxlKHRoaXMucGFyYW0pLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICB3ZWJfY3JlYXRlVGFibGUocGFyYW06UGFyYW0pOk9ic2VydmFibGU8YW55PiB7XHJcbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpUGF0aCtcImNyZWF0ZVRhYmxlXCIscGFyYW0pXHJcbiAgICAucGlwZShcclxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PntcclxuICAgICAgICAvLyB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7c2V2ZXJpdHk6ICdzdWNjZXNzJyxzdW1tYXJ5OiAnU3VjY2VzcycsZGV0YWlsOiByZXNwb25zZX0pXHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgIC8vIOaXoOiuuuivt+axguaIkOWKn+S4juWQpu+8jOmDveWwhuWKoOi9veS4reeKtuaAgeiuvue9ruS4uiBmYWxzZVxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICAvLyDmmoLml6Dnoa7lrprmmK/lkKbph43nva7lhbbku5blhazlhbHlj5jph49cclxuICByZXNldFBybShzZWFyY2g/OnN0cmluZyl7XHJcbiAgICBzd2l0Y2goc2VhcmNoKXtcclxuICAgICAgY2FzZSAndXBzZXJ0JzpcclxuICAgICAgICB0aGlzLnVwc2VydFBybS5hZGREYXRhID0ge307XHJcbiAgICAgICAgdGhpcy51cHNlcnRQcm0udXBkRGF0YSA9IHt9O1xyXG4gICAgICAgIHRoaXMudXBzZXJ0UHJtLmxvZyA9IHt9XHJcbiAgICAgICAgdGhpcy51cHNlcnRQcm0uc3Vic2VydD8uZm9yRWFjaCh2ID0+IHtcclxuICAgICAgICAgIHYubG9ndG1wID0gbmV3IE1hcCgpO1xyXG4gICAgICAgICAgdi5tYXB0bXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgICB2LnN1YkRhdGEgPSBbXVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OiBcclxuICAgICAgICAnJyAgXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==