@sd-angular/core 1.3.102 → 1.3.104

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 (31) hide show
  1. package/autocomplete/sd-angular-core-autocomplete.metadata.json +1 -1
  2. package/autocomplete/src/lib/autocomplete.component.d.ts +1 -1
  3. package/bundles/sd-angular-core-autocomplete.umd.js +3 -2
  4. package/bundles/sd-angular-core-autocomplete.umd.js.map +1 -1
  5. package/bundles/sd-angular-core-autocomplete.umd.min.js +1 -1
  6. package/bundles/sd-angular-core-autocomplete.umd.min.js.map +1 -1
  7. package/bundles/sd-angular-core-grid-material.umd.js +400 -198
  8. package/bundles/sd-angular-core-grid-material.umd.js.map +1 -1
  9. package/bundles/sd-angular-core-grid-material.umd.min.js +2 -2
  10. package/bundles/sd-angular-core-grid-material.umd.min.js.map +1 -1
  11. package/bundles/sd-angular-core-select.umd.js +3 -2
  12. package/bundles/sd-angular-core-select.umd.js.map +1 -1
  13. package/bundles/sd-angular-core-select.umd.min.js +1 -1
  14. package/bundles/sd-angular-core-select.umd.min.js.map +1 -1
  15. package/esm2015/autocomplete/src/lib/autocomplete.component.js +4 -3
  16. package/esm2015/grid-material/src/lib/grid-material.component.js +217 -170
  17. package/esm2015/grid-material/src/lib/services/grid-filter/grid-filter.service.js +140 -56
  18. package/esm2015/select/src/lib/select.component.js +4 -3
  19. package/fesm2015/sd-angular-core-autocomplete.js +3 -2
  20. package/fesm2015/sd-angular-core-autocomplete.js.map +1 -1
  21. package/fesm2015/sd-angular-core-grid-material.js +328 -198
  22. package/fesm2015/sd-angular-core-grid-material.js.map +1 -1
  23. package/fesm2015/sd-angular-core-select.js +3 -2
  24. package/fesm2015/sd-angular-core-select.js.map +1 -1
  25. package/grid-material/sd-angular-core-grid-material.metadata.json +1 -1
  26. package/grid-material/src/lib/grid-material.component.d.ts +25 -25
  27. package/grid-material/src/lib/services/grid-filter/grid-filter.service.d.ts +4 -4
  28. package/package.json +1 -1
  29. package/{sd-angular-core-1.3.102.tgz → sd-angular-core-1.3.104.tgz} +0 -0
  30. package/select/sd-angular-core-select.metadata.json +1 -1
  31. package/select/src/lib/select.component.d.ts +1 -1
@@ -1,13 +1,14 @@
1
1
  var _filterConfiguration, _filterValue, _cache, _loadDefaultConfiguration, _loadDefaultValue;
2
2
  import { __classPrivateFieldGet } from "tslib";
3
- import { Injectable } from '@angular/core';
4
- import hash from 'object-hash';
5
- import { SdSettingService } from '@sd-angular/core/setting';
3
+ import { Injectable } from "@angular/core";
4
+ import hash from "object-hash";
5
+ import { SdSettingService } from "@sd-angular/core/setting";
6
+ import { map } from "rxjs/operators";
6
7
  export class SdGridFilterService {
7
8
  constructor(settingService) {
8
9
  this.settingService = settingService;
9
- _filterConfiguration.set(this, 'GRID-FILTER-CONFIGURATION');
10
- _filterValue.set(this, 'GRID-FILTER-VALUE');
10
+ _filterConfiguration.set(this, "GRID-FILTER-CONFIGURATION");
11
+ _filterValue.set(this, "GRID-FILTER-VALUE");
11
12
  _cache.set(this, {});
12
13
  this.register = (key, args) => {
13
14
  let cacheSession = false;
@@ -15,37 +16,106 @@ export class SdGridFilterService {
15
16
  const { columns, externalFilters } = args;
16
17
  key = hash({
17
18
  columns,
18
- externalFilters
19
+ externalFilters,
19
20
  });
20
21
  cacheSession = true; // Nếu không có key thì chỉ lưu theo session
21
22
  }
22
23
  if (!__classPrivateFieldGet(this, _cache)[key]) {
24
+ const t1 = this.settingService.create({
25
+ prefix: __classPrivateFieldGet(this, _filterConfiguration),
26
+ key,
27
+ }, {
28
+ type: cacheSession ? "session" : undefined,
29
+ });
30
+ const defaultConfiguration = __classPrivateFieldGet(this, _loadDefaultConfiguration).call(this, args, t1.get());
31
+ const t2 = this.settingService.create({
32
+ prefix: __classPrivateFieldGet(this, _filterValue),
33
+ key,
34
+ }, {
35
+ type: cacheSession ? "session" : undefined,
36
+ });
37
+ const defaultValue = __classPrivateFieldGet(this, _loadDefaultValue).call(this, args, t2.get());
23
38
  const filterConfiguration = this.settingService.create({
24
39
  prefix: __classPrivateFieldGet(this, _filterConfiguration),
25
- key
40
+ key,
26
41
  }, {
27
- default: __classPrivateFieldGet(this, _loadDefaultConfiguration).call(this, args),
28
- type: cacheSession ? 'session' : undefined
42
+ default: defaultConfiguration,
43
+ type: cacheSession ? "session" : undefined,
29
44
  });
30
45
  const filterValue = this.settingService.create({
31
46
  prefix: __classPrivateFieldGet(this, _filterValue),
32
- key
47
+ key,
33
48
  }, {
34
- default: __classPrivateFieldGet(this, _loadDefaultValue).call(this, args),
35
- type: cacheSession ? 'session' : undefined
49
+ default: defaultValue,
50
+ type: cacheSession ? "session" : undefined,
36
51
  });
52
+ const configurationGet = (configuration) => {
53
+ var _a, _b, _c;
54
+ const { columns, externalFilters, filterDefs } = args;
55
+ const inlineColumn = {};
56
+ const inlineExternal = {};
57
+ const inlineFilterDef = {};
58
+ // Filter column
59
+ for (const item of columns || []) {
60
+ inlineColumn[item.field] = (_a = configuration === null || configuration === void 0 ? void 0 : configuration.inlineColumn) === null || _a === void 0 ? void 0 : _a[item.field];
61
+ }
62
+ // Filter external
63
+ for (const item of externalFilters || []) {
64
+ inlineExternal[item.field] = (_b = configuration === null || configuration === void 0 ? void 0 : configuration.inlineExternal) === null || _b === void 0 ? void 0 : _b[item.field];
65
+ }
66
+ // Filter def
67
+ for (const item of filterDefs || []) {
68
+ inlineFilterDef[item.sdMaterialFilterDef] = (_c = configuration === null || configuration === void 0 ? void 0 : configuration.inlineFilterDef) === null || _c === void 0 ? void 0 : _c[item.sdMaterialFilterDef];
69
+ }
70
+ return {
71
+ // Filter column
72
+ inlineColumn,
73
+ // Filter external
74
+ inlineExternal,
75
+ // Filter def
76
+ inlineFilterDef,
77
+ };
78
+ };
79
+ const valueGet = (value) => {
80
+ var _a, _b, _c, _d, _e, _f, _g;
81
+ const columnFilter = {};
82
+ const externalFilter = {};
83
+ const filterDef = {};
84
+ const { columns, externalFilters, filterDefs } = args;
85
+ // Filter column
86
+ for (const item of columns || []) {
87
+ columnFilter[item.field] = (_a = value === null || value === void 0 ? void 0 : value.columnFilter) === null || _a === void 0 ? void 0 : _a[item.field];
88
+ }
89
+ // Filter external
90
+ for (const item of externalFilters || []) {
91
+ if (item.type === "daterange") {
92
+ externalFilter[item.field] = {
93
+ from: (_c = (_b = value === null || value === void 0 ? void 0 : value.externalFilter) === null || _b === void 0 ? void 0 : _b[item.field]) === null || _c === void 0 ? void 0 : _c.from,
94
+ to: (_e = (_d = value === null || value === void 0 ? void 0 : value.externalFilter) === null || _d === void 0 ? void 0 : _d[item.field]) === null || _e === void 0 ? void 0 : _e.to,
95
+ };
96
+ }
97
+ else {
98
+ externalFilter[item.field] = (_f = value === null || value === void 0 ? void 0 : value.externalFilter) === null || _f === void 0 ? void 0 : _f[item.field];
99
+ }
100
+ }
101
+ // Filter def
102
+ for (const item of filterDefs || []) {
103
+ filterDef[item.sdMaterialFilterDef] = (_g = value === null || value === void 0 ? void 0 : value.filterDef) === null || _g === void 0 ? void 0 : _g[item.sdMaterialFilterDef];
104
+ }
105
+ return {
106
+ // Filter column
107
+ columnFilter,
108
+ // Filter external
109
+ externalFilter,
110
+ // Filter def
111
+ filterDef,
112
+ };
113
+ };
37
114
  __classPrivateFieldGet(this, _cache)[key] = {
38
115
  configuration: {
39
116
  get: () => {
40
117
  const configuration = filterConfiguration.get();
41
- return {
42
- // Filter column
43
- inlineColumn: (configuration === null || configuration === void 0 ? void 0 : configuration.inlineColumn) || {},
44
- // Filter external
45
- inlineExternal: (configuration === null || configuration === void 0 ? void 0 : configuration.inlineExternal) || {},
46
- // Filter def
47
- inlineFilterDef: (configuration === null || configuration === void 0 ? void 0 : configuration.inlineFilterDef) || {},
48
- };
118
+ return configurationGet(configuration);
49
119
  },
50
120
  set: (configuration) => {
51
121
  const keys = Object.keys(configuration || {});
@@ -53,11 +123,17 @@ export class SdGridFilterService {
53
123
  const { inlineColumn, inlineExternal, inlineFilterDef } = current;
54
124
  const updatedConfiguration = {
55
125
  // Filter column
56
- inlineColumn: keys.includes('inlineColumn') ? ((configuration === null || configuration === void 0 ? void 0 : configuration.inlineColumn) || {}) : inlineColumn,
126
+ inlineColumn: keys.includes("inlineColumn")
127
+ ? (configuration === null || configuration === void 0 ? void 0 : configuration.inlineColumn) || {}
128
+ : inlineColumn,
57
129
  // Filter external
58
- inlineExternal: keys.includes('inlineExternal') ? ((configuration === null || configuration === void 0 ? void 0 : configuration.inlineExternal) || {}) : inlineExternal,
130
+ inlineExternal: keys.includes("inlineExternal")
131
+ ? (configuration === null || configuration === void 0 ? void 0 : configuration.inlineExternal) || {}
132
+ : inlineExternal,
59
133
  // Filter def
60
- inlineFilterDef: keys.includes('inlineFilterDef') ? ((configuration === null || configuration === void 0 ? void 0 : configuration.inlineFilterDef) || {}) : inlineFilterDef,
134
+ inlineFilterDef: keys.includes("inlineFilterDef")
135
+ ? (configuration === null || configuration === void 0 ? void 0 : configuration.inlineFilterDef) || {}
136
+ : inlineFilterDef,
61
137
  };
62
138
  filterConfiguration.set(updatedConfiguration);
63
139
  return updatedConfiguration;
@@ -65,19 +141,12 @@ export class SdGridFilterService {
65
141
  remove: () => {
66
142
  filterConfiguration.remove();
67
143
  },
68
- observer: filterConfiguration.observer
144
+ observer: filterConfiguration.observer.pipe(map(configurationGet)),
69
145
  },
70
146
  value: {
71
147
  get: () => {
72
148
  const configuration = filterValue.get();
73
- return {
74
- // Filter column
75
- columnFilter: (configuration === null || configuration === void 0 ? void 0 : configuration.columnFilter) || {},
76
- // Filter external
77
- externalFilter: (configuration === null || configuration === void 0 ? void 0 : configuration.externalFilter) || {},
78
- // Filter def
79
- filterDef: (configuration === null || configuration === void 0 ? void 0 : configuration.filterDef) || {}
80
- };
149
+ return valueGet(configuration);
81
150
  },
82
151
  set: (configuration) => {
83
152
  const keys = Object.keys(configuration || {});
@@ -85,11 +154,17 @@ export class SdGridFilterService {
85
154
  const { columnFilter, externalFilter, filterDef } = current;
86
155
  const updatedConfiguration = {
87
156
  // Filter column
88
- columnFilter: keys.includes('columnFilter') ? ((configuration === null || configuration === void 0 ? void 0 : configuration.columnFilter) || {}) : columnFilter,
157
+ columnFilter: keys.includes("columnFilter")
158
+ ? (configuration === null || configuration === void 0 ? void 0 : configuration.columnFilter) || {}
159
+ : columnFilter,
89
160
  // Filter external
90
- externalFilter: keys.includes('externalFilter') ? ((configuration === null || configuration === void 0 ? void 0 : configuration.externalFilter) || {}) : externalFilter,
161
+ externalFilter: keys.includes("externalFilter")
162
+ ? (configuration === null || configuration === void 0 ? void 0 : configuration.externalFilter) || {}
163
+ : externalFilter,
91
164
  // Filter def
92
- filterDef: keys.includes('filterDef') ? ((configuration === null || configuration === void 0 ? void 0 : configuration.filterDef) || {}) : filterDef,
165
+ filterDef: keys.includes("filterDef")
166
+ ? (configuration === null || configuration === void 0 ? void 0 : configuration.filterDef) || {}
167
+ : filterDef,
93
168
  };
94
169
  filterValue.set(updatedConfiguration);
95
170
  return updatedConfiguration;
@@ -97,62 +172,71 @@ export class SdGridFilterService {
97
172
  remove: () => {
98
173
  filterValue.remove();
99
174
  },
100
- observer: filterValue.observer
101
- }
175
+ observer: filterValue.observer.pipe(map(valueGet)),
176
+ },
102
177
  };
103
178
  }
104
179
  return __classPrivateFieldGet(this, _cache)[key];
105
180
  };
106
- _loadDefaultConfiguration.set(this, (args) => {
107
- var _a, _b, _c, _d;
181
+ _loadDefaultConfiguration.set(this, (args, configuration) => {
182
+ var _a, _b, _c, _d, _e, _f, _g;
108
183
  const { columns, externalFilters, filterDefs } = args;
109
184
  const inlineColumn = {};
110
185
  const inlineExternal = {};
111
186
  const inlineFilterDef = {};
112
187
  // Filter column
113
- for (const item of (columns || [])) {
114
- inlineColumn[item.field] = (_a = inlineColumn[item.field]) !== null && _a !== void 0 ? _a : (_b = item === null || item === void 0 ? void 0 : item.filter) === null || _b === void 0 ? void 0 : _b.defaultShowing;
188
+ for (const item of columns || []) {
189
+ inlineColumn[item.field] = (_b = (_a = configuration === null || configuration === void 0 ? void 0 : configuration.inlineColumn) === null || _a === void 0 ? void 0 : _a[item.field]) !== null && _b !== void 0 ? _b : (_c = item === null || item === void 0 ? void 0 : item.filter) === null || _c === void 0 ? void 0 : _c.defaultShowing;
115
190
  }
116
191
  // Filter external
117
- for (const item of (externalFilters || [])) {
118
- inlineExternal[item.field] = (_c = inlineExternal[item.field]) !== null && _c !== void 0 ? _c : item === null || item === void 0 ? void 0 : item.defaultShowing;
192
+ for (const item of externalFilters || []) {
193
+ inlineExternal[item.field] = (_e = (_d = configuration === null || configuration === void 0 ? void 0 : configuration.inlineExternal) === null || _d === void 0 ? void 0 : _d[item.field]) !== null && _e !== void 0 ? _e : item === null || item === void 0 ? void 0 : item.defaultShowing;
119
194
  }
120
195
  // Filter def
121
- for (const item of (filterDefs || [])) {
122
- inlineFilterDef[item.sdMaterialFilterDef] = (_d = inlineFilterDef[item.sdMaterialFilterDef]) !== null && _d !== void 0 ? _d : item === null || item === void 0 ? void 0 : item.defaultShowing;
196
+ for (const item of filterDefs || []) {
197
+ inlineFilterDef[item.sdMaterialFilterDef] = (_g = (_f = configuration === null || configuration === void 0 ? void 0 : configuration.inlineFilterDef) === null || _f === void 0 ? void 0 : _f[item.sdMaterialFilterDef]) !== null && _g !== void 0 ? _g : item === null || item === void 0 ? void 0 : item.defaultShowing;
123
198
  }
124
199
  return {
200
+ // Filter column
125
201
  inlineColumn,
202
+ // Filter external
126
203
  inlineExternal,
204
+ // Filter def
127
205
  inlineFilterDef,
128
206
  };
129
207
  });
130
- _loadDefaultValue.set(this, (args) => {
131
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
132
- const { columns, externalFilters, filterDefs } = args;
208
+ _loadDefaultValue.set(this, (args, value) => {
209
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
133
210
  const columnFilter = {};
134
211
  const externalFilter = {};
135
212
  const filterDef = {};
213
+ const { columns, externalFilters, filterDefs } = args;
136
214
  // Filter column
137
- for (const item of (columns || [])) {
138
- columnFilter[item.field] = (_a = columnFilter[item.field]) !== null && _a !== void 0 ? _a : (_b = item === null || item === void 0 ? void 0 : item.filter) === null || _b === void 0 ? void 0 : _b.default;
215
+ for (const item of columns || []) {
216
+ columnFilter[item.field] = (_b = (_a = value === null || value === void 0 ? void 0 : value.columnFilter) === null || _a === void 0 ? void 0 : _a[item.field]) !== null && _b !== void 0 ? _b : (_c = item === null || item === void 0 ? void 0 : item.filter) === null || _c === void 0 ? void 0 : _c.default;
139
217
  }
140
218
  // Filter external
141
- for (const item of (externalFilters || [])) {
142
- if (item.type === 'daterange') {
219
+ for (const item of externalFilters || []) {
220
+ if (item.type === "daterange") {
143
221
  externalFilter[item.field] = {
144
- from: (_f = (_d = (_c = externalFilter[item.field]) === null || _c === void 0 ? void 0 : _c.from) !== null && _d !== void 0 ? _d : (_e = item.default) === null || _e === void 0 ? void 0 : _e.from) !== null && _f !== void 0 ? _f : undefined,
145
- to: (_k = (_h = (_g = externalFilter[item.field]) === null || _g === void 0 ? void 0 : _g.to) !== null && _h !== void 0 ? _h : (_j = item.default) === null || _j === void 0 ? void 0 : _j.to) !== null && _k !== void 0 ? _k : undefined
222
+ from: (_f = (_e = (_d = value === null || value === void 0 ? void 0 : value.externalFilter) === null || _d === void 0 ? void 0 : _d[item.field]) === null || _e === void 0 ? void 0 : _e.from) !== null && _f !== void 0 ? _f : (_g = item.default) === null || _g === void 0 ? void 0 : _g.from,
223
+ to: (_k = (_j = (_h = value === null || value === void 0 ? void 0 : value.externalFilter) === null || _h === void 0 ? void 0 : _h[item.field]) === null || _j === void 0 ? void 0 : _j.to) !== null && _k !== void 0 ? _k : (_l = item.default) === null || _l === void 0 ? void 0 : _l.to,
146
224
  };
147
225
  }
148
226
  else {
149
- externalFilter[item.field] = (_l = externalFilter[item.field]) !== null && _l !== void 0 ? _l : item.default;
227
+ externalFilter[item.field] = (_o = (_m = value === null || value === void 0 ? void 0 : value.externalFilter) === null || _m === void 0 ? void 0 : _m[item.field]) !== null && _o !== void 0 ? _o : item === null || item === void 0 ? void 0 : item.default;
150
228
  }
151
229
  }
152
230
  // Filter def
231
+ for (const item of filterDefs || []) {
232
+ filterDef[item.sdMaterialFilterDef] = (_q = (_p = value === null || value === void 0 ? void 0 : value.filterDef) === null || _p === void 0 ? void 0 : _p[item.sdMaterialFilterDef]) !== null && _q !== void 0 ? _q : undefined;
233
+ }
153
234
  return {
235
+ // Filter column
154
236
  columnFilter,
237
+ // Filter external
155
238
  externalFilter,
239
+ // Filter def
156
240
  filterDef,
157
241
  };
158
242
  });
@@ -165,4 +249,4 @@ SdGridFilterService.decorators = [
165
249
  SdGridFilterService.ctorParameters = () => [
166
250
  { type: SdSettingService }
167
251
  ];
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJDOi9Vc2Vycy9uZ2hpYXR0MTVfb25lbW91bnQvRG9jdW1lbnRzL2xpYi1jb3JlLXVpL3Byb2plY3RzL3NkLWNvcmUvZ3JpZC1tYXRlcmlhbC8iLCJzb3VyY2VzIjpbInNyYy9saWIvc2VydmljZXMvZ3JpZC1maWx0ZXIvZ3JpZC1maWx0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBTzVELE1BQU0sT0FBTyxtQkFBbUI7SUFJOUIsWUFBb0IsY0FBZ0M7UUFBaEMsbUJBQWMsR0FBZCxjQUFjLENBQWtCO1FBSHBELCtCQUF1QiwyQkFBMkIsRUFBQztRQUNuRCx1QkFBZSxtQkFBbUIsRUFBQztRQUNuQyxpQkFBdUQsRUFBRSxFQUFDO1FBRzFELGFBQVEsR0FBRyxDQUFDLEdBQVcsRUFBRSxJQUl4QixFQUFFLEVBQUU7WUFDSCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDUixNQUFNLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDMUMsR0FBRyxHQUFHLElBQUksQ0FBQztvQkFDVCxPQUFPO29CQUNQLGVBQWU7aUJBQ2hCLENBQUMsQ0FBQztnQkFDSCxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsNENBQTRDO2FBQ2xFO1lBQ0QsSUFBSSxDQUFDLHFDQUFZLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFvQztvQkFDeEYsTUFBTSxvREFBMkI7b0JBQ2pDLEdBQUc7aUJBQ0osRUFBRTtvQkFDRCxPQUFPLEVB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LENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQywwQ0FBRSxFQUFFLHlDQUFJLElBQUksQ0FBQyxPQUFPLDBDQUFFLEVBQUUsbUNBQUksU0FBUztxQkFDcEUsQ0FBQztpQkFDSDtxQkFBTTtvQkFDTCxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG1DQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7aUJBQ3pFO2FBQ0Y7WUFDRCxhQUFhO1lBQ2IsT0FBTztnQkFDTCxZQUFZO2dCQUNaLGNBQWM7Z0JBQ2QsU0FBUzthQUNWLENBQUE7UUFDSCxDQUFDLEVBQUE7SUE5SkQsQ0FBQzs7OztZQU5GLFVBQVU7OztZQU5GLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IGhhc2ggZnJvbSAnb2JqZWN0LWhhc2gnO1xyXG5pbXBvcnQgeyBTZFNldHRpbmdTZXJ2aWNlIH0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS9zZXR0aW5nJztcclxuaW1wb3J0IHsgU2RHcmlkTWF0ZXJpYWxFeHRlcm5hbEZpbHRlciwgU2RHcmlkTWF0ZXJpYWxGaWx0ZXJDb25maWd1cmF0aW9uLCBTZEdyaWRNYXRlcmlhbEZpbHRlclJlZ2lzdGVyLCBTZEdyaWRNYXRlcmlhbEZpbHRlclZhbHVlIH0gZnJvbSAnLi9ncmlkLWZpbHRlci5tb2RlbCc7XHJcbmltcG9ydCAqIGFzIHV1aWQgZnJvbSAndXVpZCc7XHJcbmltcG9ydCB7IFNkR3JpZE1hdGVyaWFsQ29sdW1uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dyaWQtY29sdW1uLm1vZGVsJztcclxuaW1wb3J0IHsgU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc2QtbWF0ZXJpYWwtZmlsdGVyLWRlZi5kaXJlY3RpdmUnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgU2RHcmlkRmlsdGVyU2VydmljZSB7XHJcbiAgI2ZpbHRlckNvbmZpZ3VyYXRpb24gPSAnR1JJRC1GSUxURVItQ09ORklHVVJBVElPTic7XHJcbiAgI2ZpbHRlclZhbHVlID0gJ0dSSUQtRklMVEVSLVZBTFVFJztcclxuICAjY2FjaGU6IFJlY29yZDxzdHJpbmcsIFNkR3JpZE1hdGVyaWFsRmlsdGVyUmVnaXN0ZXI+ID0ge307XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXR0aW5nU2VydmljZTogU2RTZXR0aW5nU2VydmljZSkge1xyXG4gIH1cclxuICByZWdpc3RlciA9IChrZXk6IHN0cmluZywgYXJnczoge1xyXG4gICAgY29sdW1uczogU2RHcmlkTWF0ZXJpYWxDb2x1bW5bXSxcclxuICAgIGV4dGVybmFsRmlsdGVyczogU2RHcmlkTWF0ZXJpYWxFeHRlcm5hbEZpbHRlcltdLFxyXG4gICAgZmlsdGVyRGVmczogU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZVtdXHJcbiAgfSkgPT4ge1xyXG4gICAgbGV0IGNhY2hlU2Vzc2lvbiA9IGZhbHNlO1xyXG4gICAgaWYgKCFrZXkpIHtcclxuICAgICAgY29uc3QgeyBjb2x1bW5zLCBleHRlcm5hbEZpbHRlcnMgfSA9IGFyZ3M7XHJcbiAgICAgIGtleSA9IGhhc2goe1xyXG4gICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgZXh0ZXJuYWxGaWx0ZXJzXHJcbiAgICAgIH0pO1xyXG4gICAgICBjYWNoZVNlc3Npb24gPSB0cnVlOyAvLyBO4bq/dSBraMO0bmcgY8OzIGtleSB0aMOsIGNo4buJIGzGsHUgdGhlbyBzZXNzaW9uXHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuI2NhY2hlW2tleV0pIHtcclxuICAgICAgY29uc3QgZmlsdGVyQ29uZmlndXJhdGlvbiA9IHRoaXMuc2V0dGluZ1NlcnZpY2UuY3JlYXRlPFNkR3JpZE1hdGVyaWFsRmlsdGVyQ29uZmlndXJhdGlvbj4oe1xyXG4gICAgICAgIHByZWZpeDogdGhpcy4jZmlsdGVyQ29uZmlndXJhdGlvbixcclxuICAgICAgICBrZXlcclxuICAgICAgfSwge1xyXG4gICAgICAgIGRlZmF1bHQ6IHRoaXMuI2xvYWREZWZhdWx0Q29uZmlndXJhdGlvbihhcmdzKSxcclxuICAgICAgICB0eXBlOiBjYWNoZVNlc3Npb24gPyAnc2Vzc2lvbicgOiB1bmRlZmluZWRcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdGhpcy5zZXR0aW5nU2VydmljZS5jcmVhdGU8U2RHcmlkTWF0ZXJpYWxGaWx0ZXJWYWx1ZT4oe1xyXG4gICAgICAgIHByZWZpeDogdGhpcy4jZmlsdGVyVmFsdWUsXHJcbiAgICAgICAga2V5XHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkZWZhdWx0OiB0aGlzLiNsb2FkRGVmYXVsdFZhbHVlKGFyZ3MpLFxyXG4gICAgICAgIHR5cGU6IGNhY2hlU2Vzc2lvbiA/ICdzZXNzaW9uJyA6IHVuZGVmaW5lZFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy4jY2FjaGVba2V5XSA9IHtcclxuICAgICAgICBjb25maWd1cmF0aW9uOiB7XHJcbiAgICAgICAgICBnZXQ6ICgpOiBTZEdyaWRNYXRlcmlhbEZpbHRlckNvbmZpZ3VyYXRpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gZmlsdGVyQ29uZmlndXJhdGlvbi5nZXQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAvLyBGaWx0ZXIgY29sdW1uXHJcbiAgICAgICAgICAgICAgaW5saW5lQ29sdW1uOiBjb25maWd1cmF0aW9uPy5pbmxpbmVDb2x1bW4gfHwge30sXHJcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIGV4dGVybmFsXHJcbiAgICAgICAgICAgICAgaW5saW5lRXh0ZXJuYWw6IGNvbmZpZ3VyYXRpb24/LmlubGluZUV4dGVybmFsIHx8IHt9LFxyXG4gICAgICAgICAgICAgIC8vIEZpbHRlciBkZWZcclxuICAgICAgICAgICAgICBpbmxpbmVGaWx0ZXJEZWY6IGNvbmZpZ3VyYXRpb24/LmlubGluZUZpbHRlckRlZiB8fCB7fSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzZXQ6IChjb25maWd1cmF0aW9uOiBQYXJ0aWFsPFNkR3JpZE1hdGVyaWFsRmlsdGVyQ29uZmlndXJhdGlvbj4pOiBTZEdyaWRNYXRlcmlhbEZpbHRlckNvbmZpZ3VyYXRpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY29uZmlndXJhdGlvbiB8fCB7fSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBmaWx0ZXJDb25maWd1cmF0aW9uLmdldCgpO1xyXG4gICAgICAgICAgICBjb25zdCB7IGlubGluZUNvbHVtbiwgaW5saW5lRXh0ZXJuYWwsIGlubGluZUZpbHRlckRlZiB9ID0gY3VycmVudDtcclxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZENvbmZpZ3VyYXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIGNvbHVtblxyXG4gICAgICAgICAgICAgIGlubGluZUNvbHVtbjoga2V5cy5pbmNsdWRlcygnaW5saW5lQ29sdW1uJykgPyAoY29uZmlndXJhdGlvbj8uaW5saW5lQ29sdW1uIHx8IHt9KSA6IGlubGluZUNvbHVtbixcclxuICAgICAgICAgICAgICAvLyBGaWx0ZXIgZXh0ZXJuYWxcclxuICAgICAgICAgICAgICBpbmxpbmVFeHRlcm5hbDoga2V5cy5pbmNsdWRlcygnaW5saW5lRXh0ZXJuYWwnKSA/IChjb25maWd1cmF0aW9uPy5pbmxpbmVFeHRlcm5hbCB8fCB7fSkgOiBpbmxpbmVFeHRlcm5hbCxcclxuICAgICAgICAgICAgICAvLyBGaWx0ZXIgZGVmXHJcbiAgICAgICAgICAgICAgaW5saW5lRmlsdGVyRGVmOiBrZXlzLmluY2x1ZGVzKCdpbmxpbmVGaWx0ZXJEZWYnKSA/IChjb25maWd1cmF0aW9uPy5pbmxpbmVGaWx0ZXJEZWYgfHwge30pIDogaW5saW5lRmlsdGVyRGVmLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBmaWx0ZXJDb25maWd1cmF0aW9uLnNldCh1cGRhdGVkQ29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVkQ29uZmlndXJhdGlvbjtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICByZW1vdmU6ICgpID0+IHtcclxuICAgICAgICAgICAgZmlsdGVyQ29uZmlndXJhdGlvbi5yZW1vdmUoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvYnNlcnZlcjogZmlsdGVyQ29uZmlndXJhdGlvbi5vYnNlcnZlclxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgIGdldDogKCk6IFNkR3JpZE1hdGVyaWFsRmlsdGVyVmFsdWUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gZmlsdGVyVmFsdWUuZ2V0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIGNvbHVtblxyXG4gICAgICAgICAgICAgIGNvbHVtbkZpbHRlcjogY29uZmlndXJhdGlvbj8uY29sdW1uRmlsdGVyIHx8IHt9LFxyXG4gICAgICAgICAgICAgIC8vIEZpbHRlciBleHRlcm5hbFxyXG4gICAgICAgICAgICAgIGV4dGVybmFsRmlsdGVyOiBjb25maWd1cmF0aW9uPy5leHRlcm5hbEZpbHRlciB8fCB7fSxcclxuICAgICAgICAgICAgICAvLyBGaWx0ZXIgZGVmXHJcbiAgICAgICAgICAgICAgZmlsdGVyRGVmOiBjb25maWd1cmF0aW9uPy5maWx0ZXJEZWYgfHwge31cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzZXQ6IChjb25maWd1cmF0aW9uOiBQYXJ0aWFsPFNkR3JpZE1hdGVyaWFsRmlsdGVyVmFsdWU+KTogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJWYWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb25maWd1cmF0aW9uIHx8IHt9KTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGZpbHRlclZhbHVlLmdldCgpO1xyXG4gICAgICAgICAgICBjb25zdCB7IGNvbHVtbkZpbHRlciwgZXh0ZXJuYWxGaWx0ZXIsIGZpbHRlckRlZiB9ID0gY3VycmVudDtcclxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZENvbmZpZ3VyYXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIGNvbHVtblxyXG4gICAgICAgICAgICAgIGNvbHVtbkZpbHRlcjoga2V5cy5pbmNsdWRlcygnY29sdW1uRmlsdGVyJykgPyAoY29uZmlndXJhdGlvbj8uY29sdW1uRmlsdGVyIHx8IHt9KSA6IGNvbHVtbkZpbHRlcixcclxuICAgICAgICAgICAgICAvLyBGaWx0ZXIgZXh0ZXJuYWxcclxuICAgICAgICAgICAgICBleHRlcm5hbEZpbHRlcjoga2V5cy5pbmNsdWRlcygnZXh0ZXJuYWxGaWx0ZXInKSA/IChjb25maWd1cmF0aW9uPy5leHRlcm5hbEZpbHRlciB8fCB7fSkgOiBleHRlcm5hbEZpbHRlcixcclxuICAgICAgICAgICAgICAvLyBGaWx0ZXIgZGVmXHJcbiAgICAgICAgICAgICAgZmlsdGVyRGVmOiBrZXlzLmluY2x1ZGVzKCdmaWx0ZXJEZWYnKSA/IChjb25maWd1cmF0aW9uPy5maWx0ZXJEZWYgfHwge30pIDogZmlsdGVyRGVmLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBmaWx0ZXJWYWx1ZS5zZXQodXBkYXRlZENvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlZENvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcmVtb3ZlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZpbHRlclZhbHVlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9ic2VydmVyOiBmaWx0ZXJWYWx1ZS5vYnNlcnZlclxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlW2tleV07XHJcbiAgfVxyXG5cclxuICAjbG9hZERlZmF1bHRDb25maWd1cmF0aW9uID0gKGFyZ3M6IHtcclxuICAgIGNvbHVtbnM6IFNkR3JpZE1hdGVyaWFsQ29sdW1uW10sXHJcbiAgICBleHRlcm5hbEZpbHRlcnM6IFNkR3JpZE1hdGVyaWFsRXh0ZXJuYWxGaWx0ZXJbXSxcclxuICAgIGZpbHRlckRlZnM6IFNkTWF0ZXJpYWxGaWx0ZXJEZWZEaXJlY3RpdmVbXVxyXG4gIH0pOiBTZEdyaWRNYXRlcmlhbEZpbHRlckNvbmZpZ3VyYXRpb24gPT4ge1xyXG4gICAgY29uc3QgeyBjb2x1bW5zLCBleHRlcm5hbEZpbHRlcnMsIGZpbHRlckRlZnMgfSA9IGFyZ3M7XHJcbiAgICBjb25zdCBpbmxpbmVDb2x1bW46IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XHJcbiAgICBjb25zdCBpbmxpbmVFeHRlcm5hbDogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcclxuICAgIGNvbnN0IGlubGluZUZpbHRlckRlZjogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcclxuICAgIC8vIEZpbHRlciBjb2x1bW5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiAoY29sdW1ucyB8fCBbXSkpIHtcclxuICAgICAgaW5saW5lQ29sdW1uW2l0ZW0uZmllbGRdID0gaW5saW5lQ29sdW1uW2l0ZW0uZmllbGRdID8/IGl0ZW0/LmZpbHRlcj8uZGVmYXVsdFNob3dpbmc7XHJcbiAgICB9XHJcbiAgICAvLyBGaWx0ZXIgZXh0ZXJuYWxcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiAoZXh0ZXJuYWxGaWx0ZXJzIHx8IFtdKSkge1xyXG4gICAgICBpbmxpbmVFeHRlcm5hbFtpdGVtLmZpZWxkXSA9IGlubGluZUV4dGVybmFsW2l0ZW0uZmllbGRdID8/IGl0ZW0/LmRlZmF1bHRTaG93aW5nO1xyXG4gICAgfVxyXG4gICAgLy8gRmlsdGVyIGRlZlxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIChmaWx0ZXJEZWZzIHx8IFtdKSkge1xyXG4gICAgICBpbmxpbmVGaWx0ZXJEZWZbaXRlbS5zZE1hdGVyaWFsRmlsdGVyRGVmXSA9IGlubGluZUZpbHRlckRlZltpdGVtLnNkTWF0ZXJpYWxGaWx0ZXJEZWZdID8/IGl0ZW0/LmRlZmF1bHRTaG93aW5nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaW5saW5lQ29sdW1uLFxyXG4gICAgICBpbmxpbmVFeHRlcm5hbCxcclxuICAgICAgaW5saW5lRmlsdGVyRGVmLFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgI2xvYWREZWZhdWx0VmFsdWUgPSAoYXJnczoge1xyXG4gICAgY29sdW1uczogU2RHcmlkTWF0ZXJpYWxDb2x1bW5bXSxcclxuICAgIGV4dGVybmFsRmlsdGVyczogU2RHcmlkTWF0ZXJpYWxFeHRlcm5hbEZpbHRlcltdLFxyXG4gICAgZmlsdGVyRGVmczogU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZVtdXHJcbiAgfSk6IFNkR3JpZE1hdGVyaWFsRmlsdGVyVmFsdWUgPT4ge1xyXG4gICAgY29uc3QgeyBjb2x1bW5zLCBleHRlcm5hbEZpbHRlcnMsIGZpbHRlckRlZnMgfSA9IGFyZ3M7XHJcbiAgICBjb25zdCBjb2x1bW5GaWx0ZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuICAgIGNvbnN0IGV4dGVybmFsRmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICBjb25zdCBmaWx0ZXJEZWY6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuICAgIC8vIEZpbHRlciBjb2x1bW5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiAoY29sdW1ucyB8fCBbXSkpIHtcclxuICAgICAgY29sdW1uRmlsdGVyW2l0ZW0uZmllbGRdID0gY29sdW1uRmlsdGVyW2l0ZW0uZmllbGRdID8/IGl0ZW0/LmZpbHRlcj8uZGVmYXVsdDtcclxuICAgIH1cclxuICAgIC8vIEZpbHRlciBleHRlcm5hbFxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIChleHRlcm5hbEZpbHRlcnMgfHwgW10pKSB7XHJcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdkYXRlcmFuZ2UnKSB7XHJcbiAgICAgICAgZXh0ZXJuYWxGaWx0ZXJbaXRlbS5maWVsZF0gPSB7XHJcbiAgICAgICAgICBmcm9tOiBleHRlcm5hbEZpbHRlcltpdGVtLmZpZWxkXT8uZnJvbSA/PyBpdGVtLmRlZmF1bHQ/LmZyb20gPz8gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgdG86IGV4dGVybmFsRmlsdGVyW2l0ZW0uZmllbGRdPy50byA/PyBpdGVtLmRlZmF1bHQ/LnRvID8/IHVuZGVmaW5lZFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZXh0ZXJuYWxGaWx0ZXJbaXRlbS5maWVsZF0gPSBleHRlcm5hbEZpbHRlcltpdGVtLmZpZWxkXSA/PyBpdGVtLmRlZmF1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEZpbHRlciBkZWZcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNvbHVtbkZpbHRlcixcclxuICAgICAgZXh0ZXJuYWxGaWx0ZXIsXHJcbiAgICAgIGZpbHRlckRlZixcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJDOi9Vc2Vycy9uZ2hpYXR0MTVfb25lbW91bnQvRG9jdW1lbnRzL2xpYi1jb3JlLXVpL3Byb2plY3RzL3NkLWNvcmUvZ3JpZC1tYXRlcmlhbC8iLCJzb3VyY2VzIjpbInNyYy9saWIvc2VydmljZXMvZ3JpZC1maWx0ZXIvZ3JpZC1maWx0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBUzVELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdyQyxNQUFNLE9BQU8sbUJBQW1CO0lBSTlCLFlBQW9CLGNBQWdDO1FBQWhDLG1CQUFjLEdBQWQsY0FBYyxDQUFrQjtRQUhwRCwrQkFBdUIsMkJBQTJCLEVBQUM7UUFDbkQsdUJBQWUsbUJBQW1CLEVBQUM7UUFDbkMsaUJBQXVELEVBQUUsRUFBQztRQUUxRCxhQUFRLEdBQUcsQ0FDVCxHQUFXLEVBQ1gsSUFJQyxFQUNELEVBQUU7WUFDRixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDUixNQUFNLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDMUMsR0FBRyxHQUFHLElBQUksQ0FBQztvQkFDVCxPQUFPO29CQUNQLGVBQWU7aUJBQ2hCLENBQUMsQ0FBQztnQkFDSCxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsNENBQTRDO2FBQ2xFO1lBQ0QsSUFBSSxDQUFDLHFDQUFZLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FDbkM7b0JBQ0UsTUFBTSxvREFB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WTtnQkFDWixrQkFBa0I7Z0JBQ2xCLGNBQWM7Z0JBQ2QsYUFBYTtnQkFDYixTQUFTO2FBQ1YsQ0FBQztRQUNKLENBQUMsRUFBQztJQXpScUQsQ0FBQzs7OztZQUx6RCxVQUFVOzs7WUFYRixnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IGhhc2ggZnJvbSBcIm9iamVjdC1oYXNoXCI7XHJcbmltcG9ydCB7IFNkU2V0dGluZ1NlcnZpY2UgfSBmcm9tIFwiQHNkLWFuZ3VsYXIvY29yZS9zZXR0aW5nXCI7XHJcbmltcG9ydCB7XHJcbiAgU2RHcmlkTWF0ZXJpYWxFeHRlcm5hbEZpbHRlcixcclxuICBTZEdyaWRNYXRlcmlhbEZpbHRlckNvbmZpZ3VyYXRpb24sXHJcbiAgU2RHcmlkTWF0ZXJpYWxGaWx0ZXJSZWdpc3RlcixcclxuICBTZEdyaWRNYXRlcmlhbEZpbHRlclZhbHVlLFxyXG59IGZyb20gXCIuL2dyaWQtZmlsdGVyLm1vZGVsXCI7XHJcbmltcG9ydCB7IFNkR3JpZE1hdGVyaWFsQ29sdW1uIH0gZnJvbSBcIi4uLy4uL21vZGVscy9ncmlkLWNvbHVtbi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBTZE1hdGVyaWFsRmlsdGVyRGVmRGlyZWN0aXZlIH0gZnJvbSBcIi4uLy4uL2RpcmVjdGl2ZXMvc2QtbWF0ZXJpYWwtZmlsdGVyLWRlZi5kaXJlY3RpdmVcIjtcclxuaW1wb3J0IHsgbWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTZEdyaWRGaWx0ZXJTZXJ2aWNlIHtcclxuICAjZmlsdGVyQ29uZmlndXJhdGlvbiA9IFwiR1JJRC1GSUxURVItQ09ORklHVVJBVElPTlwiO1xyXG4gICNmaWx0ZXJWYWx1ZSA9IFwiR1JJRC1GSUxURVItVkFMVUVcIjtcclxuICAjY2FjaGU6IFJlY29yZDxzdHJpbmcsIFNkR3JpZE1hdGVyaWFsRmlsdGVyUmVnaXN0ZXI+ID0ge307XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXR0aW5nU2VydmljZTogU2RTZXR0aW5nU2VydmljZSkge31cclxuICByZWdpc3RlciA9IChcclxuICAgIGtleTogc3RyaW5nLFxyXG4gICAgYXJnczoge1xyXG4gICAgICBjb2x1bW5zOiBTZEdyaWRNYXRlcmlhbENvbHVtbltdO1xyXG4gICAgICBleHRlcm5hbEZpbHRlcnM6IFNkR3JpZE1hdGVyaWFsRXh0ZXJuYWxGaWx0ZXJbXTtcclxuICAgICAgZmlsdGVyRGVmczogU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZVtdO1xyXG4gICAgfVxyXG4gICkgPT4ge1xyXG4gICAgbGV0IGNhY2hlU2Vzc2lvbiA9IGZhbHNlO1xyXG4gICAgaWYgKCFrZXkpIHtcclxuICAgICAgY29uc3QgeyBjb2x1bW5zLCBleHRlcm5hbEZpbHRlcnMgfSA9IGFyZ3M7XHJcbiAgICAgIGtleSA9IGhhc2goe1xyXG4gICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgZXh0ZXJuYWxGaWx0ZXJzLFxyXG4gICAgICB9KTtcclxuICAgICAgY2FjaGVTZXNzaW9uID0gdHJ1ZTsgLy8gTuG6v3Uga2jDtG5nIGPDsyBrZXkgdGjDrCBjaOG7iSBsxrB1IHRoZW8gc2Vzc2lvblxyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLiNjYWNoZVtrZXldKSB7XHJcbiAgICAgIGNvbnN0IHQxID0gdGhpcy5zZXR0aW5nU2VydmljZS5jcmVhdGU8U2RHcmlkTWF0ZXJpYWxGaWx0ZXJDb25maWd1cmF0aW9uPihcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcmVmaXg6IHRoaXMuI2ZpbHRlckNvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgICBrZXksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0eXBlOiBjYWNoZVNlc3Npb24gPyBcInNlc3Npb25cIiA6IHVuZGVmaW5lZCxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRDb25maWd1cmF0aW9uID0gdGhpcy4jbG9hZERlZmF1bHRDb25maWd1cmF0aW9uKFxyXG4gICAgICAgIGFyZ3MsXHJcbiAgICAgICAgdDEuZ2V0KClcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgdDIgPSB0aGlzLnNldHRpbmdTZXJ2aWNlLmNyZWF0ZTxTZEdyaWRNYXRlcmlhbEZpbHRlclZhbHVlPihcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcmVmaXg6IHRoaXMuI2ZpbHRlclZhbHVlLFxyXG4gICAgICAgICAga2V5LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdHlwZTogY2FjaGVTZXNzaW9uID8gXCJzZXNzaW9uXCIgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLiNsb2FkRGVmYXVsdFZhbHVlKGFyZ3MsIHQyLmdldCgpKTtcclxuICAgICAgY29uc3QgZmlsdGVyQ29uZmlndXJhdGlvbiA9XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nU2VydmljZS5jcmVhdGU8U2RHcmlkTWF0ZXJpYWxGaWx0ZXJDb25maWd1cmF0aW9uPihcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgcHJlZml4OiB0aGlzLiNmaWx0ZXJDb25maWd1cmF0aW9uLFxyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkZWZhdWx0OiBkZWZhdWx0Q29uZmlndXJhdGlvbixcclxuICAgICAgICAgICAgdHlwZTogY2FjaGVTZXNzaW9uID8gXCJzZXNzaW9uXCIgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB0aGlzLnNldHRpbmdTZXJ2aWNlLmNyZWF0ZTxTZEdyaWRNYXRlcmlhbEZpbHRlclZhbHVlPihcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcmVmaXg6IHRoaXMuI2ZpbHRlclZhbHVlLFxyXG4gICAgICAgICAga2V5LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGVmYXVsdDogZGVmYXVsdFZhbHVlLFxyXG4gICAgICAgICAgdHlwZTogY2FjaGVTZXNzaW9uID8gXCJzZXNzaW9uXCIgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBjb25maWd1cmF0aW9uR2V0ID0gKFxyXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IFNkR3JpZE1hdGVyaWFsRmlsdGVyQ29uZmlndXJhdGlvblxyXG4gICAgICApID0+IHtcclxuICAgICAgICBjb25zdCB7IGNvbHVtbnMsIGV4dGVybmFsRmlsdGVycywgZmlsdGVyRGVmcyB9ID0gYXJncztcclxuICAgICAgICBjb25zdCBpbmxpbmVDb2x1bW46IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XHJcbiAgICAgICAgY29uc3QgaW5saW5lRXh0ZXJuYWw6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XHJcbiAgICAgICAgY29uc3QgaW5saW5lRmlsdGVyRGVmOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG4gICAgICAgIC8vIEZpbHRlciBjb2x1bW5cclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29sdW1ucyB8fCBbXSkge1xyXG4gICAgICAgICAgaW5saW5lQ29sdW1uW2l0ZW0uZmllbGRdID0gY29uZmlndXJhdGlvbj8uaW5saW5lQ29sdW1uPy5baXRlbS5maWVsZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEZpbHRlciBleHRlcm5hbFxyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBleHRlcm5hbEZpbHRlcnMgfHwgW10pIHtcclxuICAgICAgICAgIGlubGluZUV4dGVybmFsW2l0ZW0uZmllbGRdID1cclxuICAgICAgICAgICAgY29uZmlndXJhdGlvbj8uaW5saW5lRXh0ZXJuYWw/LltpdGVtLmZpZWxkXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRmlsdGVyIGRlZlxyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBmaWx0ZXJEZWZzIHx8IFtdKSB7XHJcbiAgICAgICAgICBpbmxpbmVGaWx0ZXJEZWZbaXRlbS5zZE1hdGVyaWFsRmlsdGVyRGVmXSA9XHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24/LmlubGluZUZpbHRlckRlZj8uW2l0ZW0uc2RNYXRlcmlhbEZpbHRlckRlZl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAvLyBGaWx0ZXIgY29sdW1uXHJcbiAgICAgICAgICBpbmxpbmVDb2x1bW4sXHJcbiAgICAgICAgICAvLyBGaWx0ZXIgZXh0ZXJuYWxcclxuICAgICAgICAgIGlubGluZUV4dGVybmFsLFxyXG4gICAgICAgICAgLy8gRmlsdGVyIGRlZlxyXG4gICAgICAgICAgaW5saW5lRmlsdGVyRGVmLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCB2YWx1ZUdldCA9ICh2YWx1ZTogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJWYWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbkZpbHRlcjogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgICAgIGNvbnN0IGV4dGVybmFsRmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICAgICAgY29uc3QgZmlsdGVyRGVmOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICAgICAgY29uc3QgeyBjb2x1bW5zLCBleHRlcm5hbEZpbHRlcnMsIGZpbHRlckRlZnMgfSA9IGFyZ3M7XHJcbiAgICAgICAgLy8gRmlsdGVyIGNvbHVtblxyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb2x1bW5zIHx8IFtdKSB7XHJcbiAgICAgICAgICBjb2x1bW5GaWx0ZXJbaXRlbS5maWVsZF0gPSB2YWx1ZT8uY29sdW1uRmlsdGVyPy5baXRlbS5maWVsZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEZpbHRlciBleHRlcm5hbFxyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBleHRlcm5hbEZpbHRlcnMgfHwgW10pIHtcclxuICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT09IFwiZGF0ZXJhbmdlXCIpIHtcclxuICAgICAgICAgICAgZXh0ZXJuYWxGaWx0ZXJbaXRlbS5maWVsZF0gPSB7XHJcbiAgICAgICAgICAgICAgZnJvbTogdmFsdWU/LmV4dGVybmFsRmlsdGVyPy5baXRlbS5maWVsZF0/LmZyb20sXHJcbiAgICAgICAgICAgICAgdG86IHZhbHVlPy5leHRlcm5hbEZpbHRlcj8uW2l0ZW0uZmllbGRdPy50byxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGV4dGVybmFsRmlsdGVyW2l0ZW0uZmllbGRdID0gdmFsdWU/LmV4dGVybmFsRmlsdGVyPy5baXRlbS5maWVsZF07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEZpbHRlciBkZWZcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZmlsdGVyRGVmcyB8fCBbXSkge1xyXG4gICAgICAgICAgZmlsdGVyRGVmW2l0ZW0uc2RNYXRlcmlhbEZpbHRlckRlZl0gPVxyXG4gICAgICAgICAgICB2YWx1ZT8uZmlsdGVyRGVmPy5baXRlbS5zZE1hdGVyaWFsRmlsdGVyRGVmXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC8vIEZpbHRlciBjb2x1bW5cclxuICAgICAgICAgIGNvbHVtbkZpbHRlcixcclxuICAgICAgICAgIC8vIEZpbHRlciBleHRlcm5hbFxyXG4gICAgICAgICAgZXh0ZXJuYWxGaWx0ZXIsXHJcbiAgICAgICAgICAvLyBGaWx0ZXIgZGVmXHJcbiAgICAgICAgICBmaWx0ZXJEZWYsXHJcbiAgICAgICAgfTtcclxuICAgICAgfTtcclxuICAgICAgdGhpcy4jY2FjaGVba2V5XSA9IHtcclxuICAgICAgICBjb25maWd1cmF0aW9uOiB7XHJcbiAgICAgICAgICBnZXQ6ICgpOiBTZEdyaWRNYXRlcmlhbEZpbHRlckNvbmZpZ3VyYXRpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gZmlsdGVyQ29uZmlndXJhdGlvbi5nZXQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25HZXQoY29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc2V0OiAoXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IFBhcnRpYWw8U2RHcmlkTWF0ZXJpYWxGaWx0ZXJDb25maWd1cmF0aW9uPlxyXG4gICAgICAgICAgKTogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJDb25maWd1cmF0aW9uID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbmZpZ3VyYXRpb24gfHwge30pO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gZmlsdGVyQ29uZmlndXJhdGlvbi5nZXQoKTtcclxuICAgICAgICAgICAgY29uc3QgeyBpbmxpbmVDb2x1bW4sIGlubGluZUV4dGVybmFsLCBpbmxpbmVGaWx0ZXJEZWYgfSA9IGN1cnJlbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRDb25maWd1cmF0aW9uID0ge1xyXG4gICAgICAgICAgICAgIC8vIEZpbHRlciBjb2x1bW5cclxuICAgICAgICAgICAgICBpbmxpbmVDb2x1bW46IGtleXMuaW5jbHVkZXMoXCJpbmxpbmVDb2x1bW5cIilcclxuICAgICAgICAgICAgICAgID8gY29uZmlndXJhdGlvbj8uaW5saW5lQ29sdW1uIHx8IHt9XHJcbiAgICAgICAgICAgICAgICA6IGlubGluZUNvbHVtbixcclxuICAgICAgICAgICAgICAvLyBGaWx0ZXIgZXh0ZXJuYWxcclxuICAgICAgICAgICAgICBpbmxpbmVFeHRlcm5hbDoga2V5cy5pbmNsdWRlcyhcImlubGluZUV4dGVybmFsXCIpXHJcbiAgICAgICAgICAgICAgICA/IGNvbmZpZ3VyYXRpb24/LmlubGluZUV4dGVybmFsIHx8IHt9XHJcbiAgICAgICAgICAgICAgICA6IGlubGluZUV4dGVybmFsLFxyXG4gICAgICAgICAgICAgIC8vIEZpbHRlciBkZWZcclxuICAgICAgICAgICAgICBpbmxpbmVGaWx0ZXJEZWY6IGtleXMuaW5jbHVkZXMoXCJpbmxpbmVGaWx0ZXJEZWZcIilcclxuICAgICAgICAgICAgICAgID8gY29uZmlndXJhdGlvbj8uaW5saW5lRmlsdGVyRGVmIHx8IHt9XHJcbiAgICAgICAgICAgICAgICA6IGlubGluZUZpbHRlckRlZixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgZmlsdGVyQ29uZmlndXJhdGlvbi5zZXQodXBkYXRlZENvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlZENvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcmVtb3ZlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZpbHRlckNvbmZpZ3VyYXRpb24ucmVtb3ZlKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb2JzZXJ2ZXI6IGZpbHRlckNvbmZpZ3VyYXRpb24ub2JzZXJ2ZXIucGlwZShtYXAoY29uZmlndXJhdGlvbkdldCkpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgIGdldDogKCk6IFNkR3JpZE1hdGVyaWFsRmlsdGVyVmFsdWUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gZmlsdGVyVmFsdWUuZ2V0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZUdldChjb25maWd1cmF0aW9uKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzZXQ6IChcclxuICAgICAgICAgICAgY29uZmlndXJhdGlvbjogUGFydGlhbDxTZEdyaWRNYXRlcmlhbEZpbHRlclZhbHVlPlxyXG4gICAgICAgICAgKTogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJWYWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb25maWd1cmF0aW9uIHx8IHt9KTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGZpbHRlclZhbHVlLmdldCgpO1xyXG4gICAgICAgICAgICBjb25zdCB7IGNvbHVtbkZpbHRlciwgZXh0ZXJuYWxGaWx0ZXIsIGZpbHRlckRlZiB9ID0gY3VycmVudDtcclxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZENvbmZpZ3VyYXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIGNvbHVtblxyXG4gICAgICAgICAgICAgIGNvbHVtbkZpbHRlcjoga2V5cy5pbmNsdWRlcyhcImNvbHVtbkZpbHRlclwiKVxyXG4gICAgICAgICAgICAgICAgPyBjb25maWd1cmF0aW9uPy5jb2x1bW5GaWx0ZXIgfHwge31cclxuICAgICAgICAgICAgICAgIDogY29sdW1uRmlsdGVyLFxyXG4gICAgICAgICAgICAgIC8vIEZpbHRlciBleHRlcm5hbFxyXG4gICAgICAgICAgICAgIGV4dGVybmFsRmlsdGVyOiBrZXlzLmluY2x1ZGVzKFwiZXh0ZXJuYWxGaWx0ZXJcIilcclxuICAgICAgICAgICAgICAgID8gY29uZmlndXJhdGlvbj8uZXh0ZXJuYWxGaWx0ZXIgfHwge31cclxuICAgICAgICAgICAgICAgIDogZXh0ZXJuYWxGaWx0ZXIsXHJcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIGRlZlxyXG4gICAgICAgICAgICAgIGZpbHRlckRlZjoga2V5cy5pbmNsdWRlcyhcImZpbHRlckRlZlwiKVxyXG4gICAgICAgICAgICAgICAgPyBjb25maWd1cmF0aW9uPy5maWx0ZXJEZWYgfHwge31cclxuICAgICAgICAgICAgICAgIDogZmlsdGVyRGVmLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBmaWx0ZXJWYWx1ZS5zZXQodXBkYXRlZENvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlZENvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcmVtb3ZlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZpbHRlclZhbHVlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9ic2VydmVyOiBmaWx0ZXJWYWx1ZS5vYnNlcnZlci5waXBlKG1hcCh2YWx1ZUdldCkpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy4jY2FjaGVba2V5XTtcclxuICB9O1xyXG5cclxuICAjbG9hZERlZmF1bHRDb25maWd1cmF0aW9uID0gKFxyXG4gICAgYXJnczoge1xyXG4gICAgICBjb2x1bW5zOiBTZEdyaWRNYXRlcmlhbENvbHVtbltdO1xyXG4gICAgICBleHRlcm5hbEZpbHRlcnM6IFNkR3JpZE1hdGVyaWFsRXh0ZXJuYWxGaWx0ZXJbXTtcclxuICAgICAgZmlsdGVyRGVmczogU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZVtdO1xyXG4gICAgfSxcclxuICAgIGNvbmZpZ3VyYXRpb246IFNkR3JpZE1hdGVyaWFsRmlsdGVyQ29uZmlndXJhdGlvblxyXG4gICk6IFNkR3JpZE1hdGVyaWFsRmlsdGVyQ29uZmlndXJhdGlvbiA9PiB7XHJcbiAgICBjb25zdCB7IGNvbHVtbnMsIGV4dGVybmFsRmlsdGVycywgZmlsdGVyRGVmcyB9ID0gYXJncztcclxuICAgIGNvbnN0IGlubGluZUNvbHVtbjogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcclxuICAgIGNvbnN0IGlubGluZUV4dGVybmFsOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG4gICAgY29uc3QgaW5saW5lRmlsdGVyRGVmOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG4gICAgLy8gRmlsdGVyIGNvbHVtblxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbHVtbnMgfHwgW10pIHtcclxuICAgICAgaW5saW5lQ29sdW1uW2l0ZW0uZmllbGRdID1cclxuICAgICAgICBjb25maWd1cmF0aW9uPy5pbmxpbmVDb2x1bW4/LltpdGVtLmZpZWxkXSA/P1xyXG4gICAgICAgIGl0ZW0/LmZpbHRlcj8uZGVmYXVsdFNob3dpbmc7XHJcbiAgICB9XHJcbiAgICAvLyBGaWx0ZXIgZXh0ZXJuYWxcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBleHRlcm5hbEZpbHRlcnMgfHwgW10pIHtcclxuICAgICAgaW5saW5lRXh0ZXJuYWxbaXRlbS5maWVsZF0gPVxyXG4gICAgICAgIGNvbmZpZ3VyYXRpb24/LmlubGluZUV4dGVybmFsPy5baXRlbS5maWVsZF0gPz8gaXRlbT8uZGVmYXVsdFNob3dpbmc7XHJcbiAgICB9XHJcbiAgICAvLyBGaWx0ZXIgZGVmXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZmlsdGVyRGVmcyB8fCBbXSkge1xyXG4gICAgICBpbmxpbmVGaWx0ZXJEZWZbaXRlbS5zZE1hdGVyaWFsRmlsdGVyRGVmXSA9XHJcbiAgICAgICAgY29uZmlndXJhdGlvbj8uaW5saW5lRmlsdGVyRGVmPy5baXRlbS5zZE1hdGVyaWFsRmlsdGVyRGVmXSA/P1xyXG4gICAgICAgIGl0ZW0/LmRlZmF1bHRTaG93aW5nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLy8gRmlsdGVyIGNvbHVtblxyXG4gICAgICBpbmxpbmVDb2x1bW4sXHJcbiAgICAgIC8vIEZpbHRlciBleHRlcm5hbFxyXG4gICAgICBpbmxpbmVFeHRlcm5hbCxcclxuICAgICAgLy8gRmlsdGVyIGRlZlxyXG4gICAgICBpbmxpbmVGaWx0ZXJEZWYsXHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gICNsb2FkRGVmYXVsdFZhbHVlID0gKFxyXG4gICAgYXJnczoge1xyXG4gICAgICBjb2x1bW5zOiBTZEdyaWRNYXRlcmlhbENvbHVtbltdO1xyXG4gICAgICBleHRlcm5hbEZpbHRlcnM6IFNkR3JpZE1hdGVyaWFsRXh0ZXJuYWxGaWx0ZXJbXTtcclxuICAgICAgZmlsdGVyRGVmczogU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZVtdO1xyXG4gICAgfSxcclxuICAgIHZhbHVlOiBTZEdyaWRNYXRlcmlhbEZpbHRlclZhbHVlXHJcbiAgKTogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJWYWx1ZSA9PiB7XHJcbiAgICBjb25zdCBjb2x1bW5GaWx0ZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuICAgIGNvbnN0IGV4dGVybmFsRmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICBjb25zdCBmaWx0ZXJEZWY6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuICAgIGNvbnN0IHsgY29sdW1ucywgZXh0ZXJuYWxGaWx0ZXJzLCBmaWx0ZXJEZWZzIH0gPSBhcmdzO1xyXG4gICAgLy8gRmlsdGVyIGNvbHVtblxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbHVtbnMgfHwgW10pIHtcclxuICAgICAgY29sdW1uRmlsdGVyW2l0ZW0uZmllbGRdID1cclxuICAgICAgICB2YWx1ZT8uY29sdW1uRmlsdGVyPy5baXRlbS5maWVsZF0gPz8gaXRlbT8uZmlsdGVyPy5kZWZhdWx0O1xyXG4gICAgfVxyXG4gICAgLy8gRmlsdGVyIGV4dGVybmFsXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXh0ZXJuYWxGaWx0ZXJzIHx8IFtdKSB7XHJcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09IFwiZGF0ZXJhbmdlXCIpIHtcclxuICAgICAgICBleHRlcm5hbEZpbHRlcltpdGVtLmZpZWxkXSA9IHtcclxuICAgICAgICAgIGZyb206IHZhbHVlPy5leHRlcm5hbEZpbHRlcj8uW2l0ZW0uZmllbGRdPy5mcm9tID8/IGl0ZW0uZGVmYXVsdD8uZnJvbSxcclxuICAgICAgICAgIHRvOiB2YWx1ZT8uZXh0ZXJuYWxGaWx0ZXI/LltpdGVtLmZpZWxkXT8udG8gPz8gaXRlbS5kZWZhdWx0Py50byxcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGV4dGVybmFsRmlsdGVyW2l0ZW0uZmllbGRdID1cclxuICAgICAgICAgIHZhbHVlPy5leHRlcm5hbEZpbHRlcj8uW2l0ZW0uZmllbGRdID8/IGl0ZW0/LmRlZmF1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEZpbHRlciBkZWZcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBmaWx0ZXJEZWZzIHx8IFtdKSB7XHJcbiAgICAgIGZpbHRlckRlZltpdGVtLnNkTWF0ZXJpYWxGaWx0ZXJEZWZdID1cclxuICAgICAgICB2YWx1ZT8uZmlsdGVyRGVmPy5baXRlbS5zZE1hdGVyaWFsRmlsdGVyRGVmXSA/PyB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAvLyBGaWx0ZXIgY29sdW1uXHJcbiAgICAgIGNvbHVtbkZpbHRlcixcclxuICAgICAgLy8gRmlsdGVyIGV4dGVybmFsXHJcbiAgICAgIGV4dGVybmFsRmlsdGVyLFxyXG4gICAgICAvLyBGaWx0ZXIgZGVmXHJcbiAgICAgIGZpbHRlckRlZixcclxuICAgIH07XHJcbiAgfTtcclxufVxyXG4iXX0=