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.
- package/README.md +24 -0
- package/esm2022/imm-element-ui.mjs +5 -0
- package/esm2022/lib/am/am.component.mjs +502 -0
- package/esm2022/lib/crumb-action/crumb-action.component.mjs +127 -0
- package/esm2022/lib/form/form/form.component.mjs +217 -0
- package/esm2022/lib/form/form-field/field-control.mjs +19 -0
- package/esm2022/lib/form/form-field/field-utils.mjs +227 -0
- package/esm2022/lib/form/form-field/form-field.mjs +129 -0
- package/esm2022/lib/form/form-field/form-type.mjs +123 -0
- package/esm2022/lib/form/form-field/label.directive.mjs +62 -0
- package/esm2022/lib/form/form-type/autocomplete.type.mjs +200 -0
- package/esm2022/lib/form/form-type/codemirror.type.mjs +167 -0
- package/esm2022/lib/form/form-type/datepicker.type.mjs +212 -0
- package/esm2022/lib/form/form-type/image.type.mjs +225 -0
- package/esm2022/lib/form/form-type/inputnumber.type.mjs +144 -0
- package/esm2022/lib/form/form-type/inputtext.type.mjs +69 -0
- package/esm2022/lib/form/form-type/multiselect.type.mjs +219 -0
- package/esm2022/lib/form/form-type/radio.type.mjs +167 -0
- package/esm2022/lib/form/form-type/select.type.mjs +196 -0
- package/esm2022/lib/form/form-type/textarea.type.mjs +75 -0
- package/esm2022/lib/form/form-type/treeselect.type.mjs +174 -0
- package/esm2022/lib/form/form-type/upload.type.mjs +228 -0
- package/esm2022/lib/grid/actions/actions.component.mjs +30 -0
- package/esm2022/lib/grid/cell-edit/cell-edit-autoComplete.component.mjs +89 -0
- package/esm2022/lib/grid/cell-edit/cell-edit-datePicker.compoent.mjs +182 -0
- package/esm2022/lib/grid/cell-edit/cell-edit-inputNumber.component.mjs +107 -0
- package/esm2022/lib/grid/cell-edit/cell-edit-inputText.compoent.mjs +46 -0
- package/esm2022/lib/grid/cell-edit/cell-edit-select.component.mjs +148 -0
- package/esm2022/lib/grid/cell-edit/index.mjs +7 -0
- package/esm2022/lib/grid/cell-render/async-renderer.mjs +29 -0
- package/esm2022/lib/grid/cell-render/link-render.mjs +42 -0
- package/esm2022/lib/grid/grid/grid.component.mjs +373 -0
- package/esm2022/lib/grid/grid-utils.mjs +103 -0
- package/esm2022/lib/grid/mock-data.mjs +14 -0
- package/esm2022/lib/grid/pager/pager.component.mjs +19 -0
- package/esm2022/lib/head/head.component.mjs +43 -0
- package/esm2022/lib/import/import.component.mjs +68 -0
- package/esm2022/lib/log/log.component.mjs +37 -0
- package/esm2022/lib/page-form/page-form.component.mjs +167 -0
- package/esm2022/lib/page-form/page-form.interface.mjs +2 -0
- package/esm2022/lib/page-grid-list/page-grid-list.component.mjs +60 -0
- package/esm2022/lib/row-selector/row-selector.component.mjs +58 -0
- package/esm2022/lib/search/mock-data.mjs +40 -0
- package/esm2022/lib/search/pop-date/pop-date.component.mjs +106 -0
- package/esm2022/lib/search/pop-list/pop-list.component.mjs +32 -0
- package/esm2022/lib/search/pop-panel/pop-panel.component.mjs +44 -0
- package/esm2022/lib/search/pop-select/pop-select.component.mjs +45 -0
- package/esm2022/lib/search/pop-self/pop-self.component.mjs +132 -0
- package/esm2022/lib/search/pop-tree/pop-tree.component.mjs +50 -0
- package/esm2022/lib/search/search/search.component.mjs +138 -0
- package/esm2022/lib/search/search-tip/search-tip.component.mjs +54 -0
- package/esm2022/lib/search/search-utils.mjs +165 -0
- package/esm2022/lib/search/text-panel/text-panel.component.mjs +41 -0
- package/esm2022/lib/service/action.service.mjs +115 -0
- package/esm2022/lib/service/i18n.service.mjs +79 -0
- package/esm2022/lib/service/themeConfig.service.mjs +82 -0
- package/esm2022/lib/service/userHistory.service.mjs +106 -0
- package/esm2022/lib/share/utils.mjs +150 -0
- package/esm2022/lib/steps/steps.component.mjs +31 -0
- package/esm2022/lib/theme-config/theme-config-panel.compoent.mjs +141 -0
- package/esm2022/lib/theme-config/theme-config.compoent.mjs +45 -0
- package/esm2022/public-api.mjs +26 -0
- package/fesm2022/imm-element-ui.mjs +6382 -0
- package/fesm2022/imm-element-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/am/am.component.d.ts +191 -0
- package/lib/crumb-action/crumb-action.component.d.ts +40 -0
- package/lib/form/form/form.component.d.ts +53 -0
- package/lib/form/form-field/field-control.d.ts +13 -0
- package/lib/form/form-field/field-utils.d.ts +12 -0
- package/lib/form/form-field/form-field.d.ts +86 -0
- package/lib/form/form-field/form-type.d.ts +22 -0
- package/lib/form/form-field/label.directive.d.ts +14 -0
- package/lib/form/form-type/autocomplete.type.d.ts +77 -0
- package/lib/form/form-type/codemirror.type.d.ts +31 -0
- package/lib/form/form-type/datepicker.type.d.ts +83 -0
- package/lib/form/form-type/image.type.d.ts +49 -0
- package/lib/form/form-type/inputnumber.type.d.ts +49 -0
- package/lib/form/form-type/inputtext.type.d.ts +17 -0
- package/lib/form/form-type/multiselect.type.d.ts +85 -0
- package/lib/form/form-type/radio.type.d.ts +31 -0
- package/lib/form/form-type/select.type.d.ts +73 -0
- package/lib/form/form-type/textarea.type.d.ts +19 -0
- package/lib/form/form-type/treeselect.type.d.ts +62 -0
- package/lib/form/form-type/upload.type.d.ts +51 -0
- package/lib/grid/actions/actions.component.d.ts +14 -0
- package/lib/grid/cell-edit/cell-edit-autoComplete.component.d.ts +18 -0
- package/lib/grid/cell-edit/cell-edit-datePicker.compoent.d.ts +16 -0
- package/lib/grid/cell-edit/cell-edit-inputNumber.component.d.ts +15 -0
- package/lib/grid/cell-edit/cell-edit-inputText.compoent.d.ts +16 -0
- package/lib/grid/cell-edit/cell-edit-select.component.d.ts +12 -0
- package/lib/grid/cell-edit/index.d.ts +6 -0
- package/lib/grid/cell-render/async-renderer.d.ts +10 -0
- package/lib/grid/cell-render/link-render.d.ts +14 -0
- package/lib/grid/grid/grid.component.d.ts +272 -0
- package/lib/grid/grid-utils.d.ts +751 -0
- package/lib/grid/mock-data.d.ts +12 -0
- package/lib/grid/pager/pager.component.d.ts +15 -0
- package/lib/head/head.component.d.ts +17 -0
- package/lib/import/import.component.d.ts +22 -0
- package/lib/log/log.component.d.ts +14 -0
- package/lib/page-form/page-form.component.d.ts +46 -0
- package/lib/page-form/page-form.interface.d.ts +27 -0
- package/lib/page-grid-list/page-grid-list.component.d.ts +18 -0
- package/lib/row-selector/row-selector.component.d.ts +21 -0
- package/lib/search/mock-data.d.ts +20 -0
- package/lib/search/pop-date/pop-date.component.d.ts +26 -0
- package/lib/search/pop-list/pop-list.component.d.ts +12 -0
- package/lib/search/pop-panel/pop-panel.component.d.ts +15 -0
- package/lib/search/pop-select/pop-select.component.d.ts +13 -0
- package/lib/search/pop-self/pop-self.component.d.ts +31 -0
- package/lib/search/pop-tree/pop-tree.component.d.ts +22 -0
- package/lib/search/search/search.component.d.ts +60 -0
- package/lib/search/search-tip/search-tip.component.d.ts +22 -0
- package/lib/search/search-utils.d.ts +10 -0
- package/lib/search/text-panel/text-panel.component.d.ts +21 -0
- package/lib/service/action.service.d.ts +54 -0
- package/lib/service/i18n.service.d.ts +93 -0
- package/lib/service/themeConfig.service.d.ts +24 -0
- package/lib/service/userHistory.service.d.ts +26 -0
- package/lib/share/utils.d.ts +16 -0
- package/lib/steps/steps.component.d.ts +16 -0
- package/lib/theme-config/theme-config-panel.compoent.d.ts +78 -0
- package/lib/theme-config/theme-config.compoent.d.ts +6 -0
- package/package.json +28 -0
- package/public-api.d.ts +20 -0
- package/src/lib/crumb-action/crumb-action.component.scss +51 -0
- package/src/lib/form/form/form.component.scss +0 -0
- package/src/lib/grid/actions/actions.component.scss +0 -0
- package/src/lib/grid/grid/grid.component.scss +0 -0
- package/src/lib/grid/pager/pager.component.scss +13 -0
- package/src/lib/head/head.component.scss +3 -0
- package/src/lib/import/import.component.scss +10 -0
- package/src/lib/log/log.component.scss +21 -0
- package/src/lib/page-form/page-form.component.scss +14 -0
- package/src/lib/page-grid-list/page-grid-list.component.scss +14 -0
- package/src/lib/row-selector/row-selector.component.scss +1 -0
- package/src/lib/search/dynamic-search/dynamic-search.component.scss +70 -0
- package/src/lib/search/pop-date/pop-date.component.scss +47 -0
- package/src/lib/search/pop-list/pop-list.component.scss +23 -0
- package/src/lib/search/pop-panel/pop-panel.component.scss +49 -0
- package/src/lib/search/pop-select/pop-select.component.scss +29 -0
- package/src/lib/search/pop-self/pop-self.component.scss +60 -0
- package/src/lib/search/pop-tree/pop-tree.component.scss +34 -0
- package/src/lib/search/search/search.component.scss +70 -0
- package/src/lib/search/search-tip/search-tip.component.scss +47 -0
- package/src/lib/search/text-panel/text-panel.component.scss +16 -0
- package/src/lib/steps/steps.component.scss +52 -0
- 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==
|