@openziti/ziti-console-lib 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/assets/styles/global.scss +8 -1
  2. package/esm2022/lib/features/card/card.component.mjs +9 -3
  3. package/esm2022/lib/features/card-list/card-list.component.mjs +16 -13
  4. package/esm2022/lib/features/data-table/cells/table-cell-name/table-cell-name.component.mjs +33 -0
  5. package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +11 -7
  6. package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +68 -34
  7. package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +3 -5
  8. package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +69 -37
  9. package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +90 -8
  10. package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +44 -30
  11. package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +2 -1
  12. package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +21 -17
  13. package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +9 -6
  14. package/esm2022/lib/pages/edge-routers/edge-routers-page.component.mjs +9 -11
  15. package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +16 -12
  16. package/esm2022/lib/pages/identities/identities-page.component.mjs +11 -12
  17. package/esm2022/lib/pages/identities/identities-page.service.mjs +24 -42
  18. package/esm2022/lib/pages/services/services-page.component.mjs +10 -16
  19. package/esm2022/lib/pages/services/services-page.service.mjs +22 -12
  20. package/esm2022/lib/shared/list-page-component.class.mjs +1 -1
  21. package/esm2022/lib/shared/list-page-service.class.mjs +20 -2
  22. package/esm2022/lib/version.mjs +2 -2
  23. package/esm2022/lib/ziti-console-lib.module.mjs +6 -3
  24. package/esm2022/public-api.mjs +3 -1
  25. package/fesm2022/openziti-ziti-console-lib.mjs +5541 -5333
  26. package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
  27. package/lib/features/card/card.component.d.ts +3 -1
  28. package/lib/features/card/card.component.d.ts.map +1 -1
  29. package/lib/features/card-list/card-list.component.d.ts +5 -2
  30. package/lib/features/card-list/card-list.component.d.ts.map +1 -1
  31. package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts +19 -0
  32. package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts.map +1 -0
  33. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +3 -4
  34. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +1 -1
  35. package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts +10 -5
  36. package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts.map +1 -1
  37. package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts +1 -4
  38. package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts.map +1 -1
  39. package/lib/features/projectable-forms/identity/identity-form.component.d.ts +9 -3
  40. package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +1 -1
  41. package/lib/features/projectable-forms/projectable-form.class.d.ts +25 -4
  42. package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -1
  43. package/lib/features/projectable-forms/service/service-form.component.d.ts +10 -5
  44. package/lib/features/projectable-forms/service/service-form.component.d.ts.map +1 -1
  45. package/lib/features/projectable-forms/service/service-form.service.d.ts.map +1 -1
  46. package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts +5 -2
  47. package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts.map +1 -1
  48. package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +1 -4
  49. package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +1 -1
  50. package/lib/pages/edge-routers/edge-routers-page.component.d.ts +1 -1
  51. package/lib/pages/edge-routers/edge-routers-page.service.d.ts +3 -1
  52. package/lib/pages/edge-routers/edge-routers-page.service.d.ts.map +1 -1
  53. package/lib/pages/identities/identities-page.component.d.ts.map +1 -1
  54. package/lib/pages/identities/identities-page.service.d.ts +4 -2
  55. package/lib/pages/identities/identities-page.service.d.ts.map +1 -1
  56. package/lib/pages/services/services-page.component.d.ts.map +1 -1
  57. package/lib/pages/services/services-page.service.d.ts +5 -1
  58. package/lib/pages/services/services-page.service.d.ts.map +1 -1
  59. package/lib/shared/list-page-component.class.d.ts.map +1 -1
  60. package/lib/shared/list-page-service.class.d.ts +7 -1
  61. package/lib/shared/list-page-service.class.d.ts.map +1 -1
  62. package/lib/ziti-console-lib.module.d.ts +18 -17
  63. package/lib/ziti-console-lib.module.d.ts.map +1 -1
  64. package/package.json +1 -1
  65. package/public-api.d.ts +2 -0
  66. package/public-api.d.ts.map +1 -1
@@ -15,21 +15,33 @@
15
15
  */
16
16
  import { ExtendableComponent } from "../extendable/extendable.component";
17
17
  import { Component, EventEmitter, Inject, Input, Output, ViewChild } from "@angular/core";
18
- import { defer, isEqual, unset, debounce } from "lodash";
18
+ import { defer, isEqual, unset, debounce, cloneDeep, isEmpty, slice } from "lodash";
19
19
  import { GrowlerModel } from "../messaging/growler.model";
20
20
  import { SHAREDZ_EXTENSION } from "../extendable/extensions-noop.service";
21
+ import { ZITI_DATA_SERVICE } from "../../services/ziti-data.service";
22
+ import { Subscription } from "rxjs";
21
23
  import * as i0 from "@angular/core";
22
24
  import * as i1 from "../messaging/growler.service";
25
+ import * as i2 from "@angular/router";
26
+ import * as i3 from "../../services/ziti-data.service";
23
27
  // @ts-ignore
24
28
  const { context, tags, resources, service, app } = window;
29
+ export class Entity {
30
+ }
25
31
  class ProjectableForm extends ExtendableComponent {
26
- constructor(growlerService, extService) {
32
+ constructor(growlerService, extService, zitiService, router, route) {
27
33
  super();
28
34
  this.growlerService = growlerService;
29
35
  this.extService = extService;
36
+ this.zitiService = zitiService;
37
+ this.router = router;
38
+ this.route = route;
39
+ this.isModal = false;
30
40
  this.dataChange = new EventEmitter();
31
41
  this.errors = {};
32
- this.entityType = 'identity';
42
+ this.entityType = 'identities';
43
+ this.entityClass = Entity;
44
+ this.isLoading = false;
33
45
  this.moreActions = [];
34
46
  this.tagElements = [];
35
47
  this.tagData = [];
@@ -38,6 +50,13 @@ class ProjectableForm extends ExtendableComponent {
38
50
  this._dataChange = false;
39
51
  this.apiOptions = [{ id: 'cli', label: 'Copy as CLI' }, { id: 'curl', label: 'Copy as CURL' }];
40
52
  this.checkDataChangeDebounced = debounce(this.checkDataChange, 100, { maxWait: 100 });
53
+ this.subscription = new Subscription();
54
+ this.subscription.add(this.route?.params?.subscribe(params => {
55
+ const id = params['id'];
56
+ if (!isEmpty(id)) {
57
+ this.entityId = id;
58
+ }
59
+ }));
41
60
  }
42
61
  ngAfterViewInit() {
43
62
  super.ngAfterViewInit();
@@ -47,6 +66,24 @@ class ProjectableForm extends ExtendableComponent {
47
66
  this.moreActions = [...this.moreActions, ...this.extService.moreActions];
48
67
  }
49
68
  }
69
+ ngOnInit() {
70
+ if (this.entityId) {
71
+ if (this.entityId === 'create') {
72
+ this.formData = new this.entityClass();
73
+ this.initData = cloneDeep(this.formData);
74
+ this.entityUpdated();
75
+ return;
76
+ }
77
+ this.isLoading = true;
78
+ this.zitiService.getSubdata(this.entityType, this.entityId, '').then((entity) => {
79
+ this.formData = entity?.data;
80
+ this.initData = cloneDeep(this.formData);
81
+ this.entityUpdated();
82
+ }).finally(() => {
83
+ this.isLoading = false;
84
+ });
85
+ }
86
+ }
50
87
  showMoreChanged(showMore) {
51
88
  if (!showMore || this.hideTags) {
52
89
  return;
@@ -122,18 +159,30 @@ class ProjectableForm extends ExtendableComponent {
122
159
  getTagValues() {
123
160
  return tags.val();
124
161
  }
125
- closeModal(refresh = true, ignoreChanges = false, data, event) {
162
+ closeForm(refresh = true, ignoreChanges = false, data, event) {
126
163
  if (!ignoreChanges && this._dataChange) {
127
164
  const confirmed = confirm('You have unsaved changes. Do you want to leave this page and discard your changes or stay on this page?');
128
165
  if (!confirmed) {
129
166
  return;
130
167
  }
131
168
  }
169
+ if (this.isModal) {
170
+ this.closeModal(refresh, ignoreChanges);
171
+ }
172
+ else {
173
+ this.returnToListPage();
174
+ }
175
+ }
176
+ closeModal(refresh = true, ignoreChanges = false, data, event) {
132
177
  this.close.emit({ refresh: refresh });
133
178
  if (event) {
134
179
  event.stopPropagation();
135
180
  }
136
181
  }
182
+ returnToListPage() {
183
+ const baseUrl = this.getBaseURLPath();
184
+ this.router?.navigateByUrl(`${baseUrl}`);
185
+ }
137
186
  ngDoCheck() {
138
187
  this.checkDataChangeDebounced();
139
188
  }
@@ -171,8 +220,34 @@ class ProjectableForm extends ExtendableComponent {
171
220
  rolesVar = `[${rolesVar}]`;
172
221
  return rolesVar;
173
222
  }
174
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProjectableForm, deps: [{ token: i1.GrowlerService }, { token: SHAREDZ_EXTENSION }], target: i0.ɵɵFactoryTarget.Component }); }
175
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProjectableForm, selector: "ng-component", inputs: { formData: "formData" }, outputs: { close: "close", dataChange: "dataChange" }, viewQueries: [{ propertyName: "nameFieldInput", first: true, predicate: ["nameFieldInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true, styles: [""] }); }
223
+ canDeactivate() {
224
+ if (this._dataChange) {
225
+ return confirm('You have unsaved changes. Do you want to leave this page and discard your changes or stay on this page?');
226
+ }
227
+ return true;
228
+ }
229
+ entityUpdated() {
230
+ //no-op
231
+ }
232
+ getRoleAttributes(type) {
233
+ return this.zitiService.get(type, {}, []).then((results) => {
234
+ return results.data;
235
+ });
236
+ }
237
+ getBaseURLPath() {
238
+ let path = '';
239
+ const urlSegments = window.location.pathname.split('/');
240
+ const baseSegments = slice(urlSegments, 0, urlSegments.length - 1);
241
+ baseSegments.forEach(segment => {
242
+ if (isEmpty(segment)) {
243
+ return;
244
+ }
245
+ path += `/${segment}`;
246
+ });
247
+ return path;
248
+ }
249
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProjectableForm, deps: [{ token: i1.GrowlerService }, { token: SHAREDZ_EXTENSION }, { token: ZITI_DATA_SERVICE }, { token: i2.Router }, { token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
250
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProjectableForm, selector: "ng-component", inputs: { isModal: "isModal", entityId: "entityId", formData: "formData" }, outputs: { close: "close", dataChange: "dataChange" }, viewQueries: [{ propertyName: "nameFieldInput", first: true, predicate: ["nameFieldInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true, styles: [""] }); }
176
251
  }
177
252
  export { ProjectableForm };
178
253
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProjectableForm, decorators: [{
@@ -181,7 +256,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
181
256
  }], ctorParameters: function () { return [{ type: i1.GrowlerService }, { type: undefined, decorators: [{
182
257
  type: Inject,
183
258
  args: [SHAREDZ_EXTENSION]
184
- }] }]; }, propDecorators: { formData: [{
259
+ }] }, { type: i3.ZitiDataService, decorators: [{
260
+ type: Inject,
261
+ args: [ZITI_DATA_SERVICE]
262
+ }] }, { type: i2.Router }, { type: i2.ActivatedRoute }]; }, propDecorators: { isModal: [{
263
+ type: Input
264
+ }], entityId: [{
265
+ type: Input
266
+ }], formData: [{
185
267
  type: Input
186
268
  }], close: [{
187
269
  type: Output
@@ -191,4 +273,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
191
273
  type: ViewChild,
192
274
  args: ['nameFieldInput']
193
275
  }] } });
194
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdGFibGUtZm9ybS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy9wcm9qZWN0YWJsZS1mb3Jtcy9wcm9qZWN0YWJsZS1mb3JtLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztFQWNFO0FBRUYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFDLFNBQVMsRUFBdUIsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVySCxPQUFPLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUV4RCxPQUFPLEVBQW1CLGlCQUFpQixFQUFDLE1BQU0sdUNBQXVDLENBQUM7OztBQUUxRixhQUFhO0FBQ2IsTUFBTSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUMsR0FBRyxNQUFNLENBQUM7QUFFeEQsTUFJc0IsZUFBZ0IsU0FBUSxtQkFBbUI7SUFzQjdELFlBQ2MsY0FBOEIsRUFDSCxVQUE0QjtRQUVqRSxLQUFLLEVBQUUsQ0FBQztRQUhFLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUNILGVBQVUsR0FBVixVQUFVLENBQWtCO1FBckIzRCxlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFNM0QsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUNkLGVBQVUsR0FBRyxVQUFVLENBQUM7UUFFbEMsZ0JBQVcsR0FBVSxFQUFFLENBQUM7UUFDeEIsZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFDdEIs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QUFLO2dCQUNhLEtBQUs7c0JBQXZCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDc0IsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICAgIENvcHlyaWdodCBOZXRGb3VuZHJ5IEluYy5cblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQge0V4dGVuZGFibGVDb21wb25lbnR9IGZyb20gXCIuLi9leHRlbmRhYmxlL2V4dGVuZGFibGUuY29tcG9uZW50XCI7XG5pbXBvcnQge0NvbXBvbmVudCwgRG9DaGVjaywgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5pbXBvcnQge2RlZmVyLCBpc0VxdWFsLCB1bnNldCwgZGVib3VuY2V9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7R3Jvd2xlck1vZGVsfSBmcm9tIFwiLi4vbWVzc2FnaW5nL2dyb3dsZXIubW9kZWxcIjtcbmltcG9ydCB7R3Jvd2xlclNlcnZpY2V9IGZyb20gXCIuLi9tZXNzYWdpbmcvZ3Jvd2xlci5zZXJ2aWNlXCI7XG5pbXBvcnQge0V4dGVuc2lvblNlcnZpY2UsIFNIQVJFRFpfRVhURU5TSU9OfSBmcm9tIFwiLi4vZXh0ZW5kYWJsZS9leHRlbnNpb25zLW5vb3Auc2VydmljZVwiO1xuXG4vLyBAdHMtaWdub3JlXG5jb25zdCB7Y29udGV4dCwgdGFncywgcmVzb3VyY2VzLCBzZXJ2aWNlLCBhcHB9ID0gd2luZG93O1xuXG5AQ29tcG9uZW50KHtcbiAgICB0ZW1wbGF0ZTogJycsXG4gICAgc3R5bGVVcmxzOiBbJy4vcHJvamVjdGFibGUtZm9ybS5jbGFzcy5zY3NzJ11cbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUHJvamVjdGFibGVGb3JtIGV4dGVuZHMgRXh0ZW5kYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2sge1xuICAgIEBJbnB1dCgpIGFic3RyYWN0IGZvcm1EYXRhOiBhbnk7XG4gICAgQE91dHB1dCgpIGFic3RyYWN0IGNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgICBAT3V0cHV0KCkgZGF0YUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAVmlld0NoaWxkKCduYW1lRmllbGRJbnB1dCcpIG5hbWVGaWVsZElucHV0OiBFbGVtZW50UmVmO1xuXG4gICAgYWJzdHJhY3QgY2xlYXIoKTogdm9pZDtcbiAgICBhYnN0cmFjdCBzYXZlKCk6IHZvaWQ7XG5cbiAgICBwdWJsaWMgZXJyb3JzOiBhbnkgPSB7fTtcbiAgICBwcm90ZWN0ZWQgZW50aXR5VHlwZSA9ICdpZGVudGl0eSc7XG5cbiAgICBtb3JlQWN0aW9uczogYW55W10gPSBbXTtcbiAgICB0YWdFbGVtZW50czogYW55ID0gW107XG4gICAgdGFnRGF0YTogYW55ID0gW107XG4gICAgaGlkZVRhZ3MgPSBmYWxzZTtcbiAgICBpbml0RGF0YTogYW55ID0ge307XG4gICAgX2RhdGFDaGFuZ2UgPSBmYWxzZTtcbiAgICBhcGlPcHRpb25zID0gW3tpZDogJ2NsaScsIGxhYmVsOiAnQ29weSBhcyBDTEknfSwge2lkOiAnY3VybCcsIGxhYmVsOiAnQ29weSBhcyBDVVJMJ31dO1xuXG4gICAgY2hlY2tEYXRhQ2hhbmdlRGVib3VuY2VkID0gZGVib3VuY2UodGhpcy5jaGVja0RhdGFDaGFuZ2UsIDEwMCwge21heFdhaXQ6IDEwMH0pO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgZ3Jvd2xlclNlcnZpY2U6IEdyb3dsZXJTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KFNIQVJFRFpfRVhURU5TSU9OKSBwcm90ZWN0ZWQgZXh0U2VydmljZTogRXh0ZW5zaW9uU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgIHRoaXMuZXJyb3JzID0ge307XG4gICAgICAgIHRoaXMubmFtZUZpZWxkSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICBpZiAodGhpcy5leHRTZXJ2aWNlPy5tb3JlQWN0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5tb3JlQWN0aW9ucyA9IFsuLi50aGlzLm1vcmVBY3Rpb25zLCAuLi50aGlzLmV4dFNlcnZpY2UubW9yZUFjdGlvbnNdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd01vcmVDaGFuZ2VkKHNob3dNb3JlKSB7XG4gICAgICAgIGlmICghc2hvd01vcmUgfHwgdGhpcy5oaWRlVGFncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXRUYWdzKClcbiAgICB9XG5cbiAgICBsb2FkVGFncygpIHtcbiAgICAgICAgdGhpcy5oaWRlVGFncyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGlkZVRhZ3NcIik9PVwieWVzXCI7XG4gICAgICAgIGlmICh0aGlzLmhpZGVUYWdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2VydmljZS5jYWxsKFwidGFnc1wiLCB7fSwgdGhpcy50YWdzTG9hZGVkLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIHRhZ3NMb2FkZWQocmVzdWx0cykge1xuICAgICAgICB0YWdzLmRhdGEgPSByZXN1bHRzO1xuICAgICAgICBjb250ZXh0LnNldCh0YWdzLm5hbWUsIHRhZ3MuZGF0YSk7XG4gICAgICAgIHRhZ3MudGFnRGF0YSA9IFtdO1xuICAgICAgICB0YWdzLmRhdGEuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICAgICAgICBsZXQgaHRtbDtcbiAgICAgICAgICAgIGlmICh0YWcub2JqZWN0cz09XCJhbGxcIiB8fCB0YWcub2JqZWN0cy5pbmRleE9mKHRoaXMuZW50aXR5VHlwZSk+PTApIHtcbiAgICAgICAgICAgICAgICB0YWdzLnRhZ0RhdGFbdGFncy50YWdEYXRhLmxlbmd0aF0gPSB0YWc7XG4gICAgICAgICAgICAgICAgaHRtbCA9IHRoaXMuZ2V0VGFnQ29udGVudCh0YWcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ0VsID0ge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGFnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBodG1sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudGFnRWxlbWVudHMucHVzaCh0YWdFbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVzZXRUYWdzKCkge1xuICAgICAgICB1bnNldCh0YWdzLCAnbWFwJyk7XG4gICAgICAgIGlmICh0aGlzLmhpZGVUYWdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgdGFncy5yZXNldCh0aGlzLmZvcm1EYXRhKTtcbiAgICAgICAgICAgIHRhZ3MuZXZlbnRzKCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgZ2V0VGFnQ29udGVudCh0YWcpIHtcbiAgICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgICAgaWYgKHRhZy52YWx1ZT09XCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaHRtbCArPSAnPGlucHV0IGlkPVwiVGFnXycrdGFnLmlkKydcIiB0eXBlPVwidGV4dFwiIGRhdGEtdGFnPVwiJyt0YWcuaWQrJ1wiIG1heGxlbmd0aD1cIjUwMFwiIHBsYWNlaG9sZGVyPVwiJyt0YWcuZGVzY3JpcHRpb24rJ1wiIC8+JztcbiAgICAgICAgfSBlbHNlIGlmICh0YWcudmFsdWU9PVwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBodG1sICs9ICc8aW5wdXQgaWQ9XCJUYWdfJyt0YWcuaWQrJ1wiIHR5cGU9XCJjaGVja2JveFwiIGRhdGEtdGFnPVwiJyt0YWcuaWQrJ1wiIC8+JztcbiAgICAgICAgfSBlbHNlIGlmICh0YWcudmFsdWU9PVwibWFwXCIpIHtcbiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgaWQ9XCJUYWdfJyt0YWcuaWQrJ19NYXBcIiBkYXRhLW1hcD1cIicrdGFnLmlkKydcIiBjbGFzcz1cIm1hcFwiPjwvZGl2Pic7XG4gICAgICAgICAgICBodG1sICs9ICc8aW5wdXQgaWQ9XCJUYWdfJyt0YWcuaWQrJ1wiIHR5cGU9XCJ0ZXh0XCIgZGF0YS10YWc9XCInK3RhZy5pZCsnXCIgbWF4bGVuZ3RoPVwiNTAwXCIgcGxhY2Vob2xkZXI9XCInK3RhZy5kZXNjcmlwdGlvbisnXCIgLz4nO1xuICAgICAgICB9IGVsc2UgaWYgKHRhZy52YWx1ZT09XCJhdmF0YXJcIikge1xuICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImZvcm1Sb3dcIj4nO1xuICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBpZD1cIlRhZ18nK3RhZy5pZCsnXCIgZGF0YS1pZD1cIicrdGFnLmlkKydcIiBkYXRhLXJlc291cmNlPVwiYXZhdGFyXCIgY2xhc3M9XCJyZXNvdXJjZSBpY29uIHByb2ZpbGVcIiB0aXRsZT1cIicrdGFnLmRlc2NyaXB0aW9uKydcIiBzdHlsZT1cImJhY2tncm91bmQtaW1hZ2U6IHVybCgnK3RhZy5kZWZhdWx0KycpXCI+PC9kaXY+PGRpdiBpZD1cIlRhZ19SZXNvdXJjZXNfJyt0YWcuaWQrJ1wiIGNsYXNzPVwicmVzb3VyY2VzXCIgZGF0YS1pZD1cIicrdGFnLmlkKydcIiBkYXRhLXJlc291cmNlcz1cImF2YXRhclwiPjwvZGl2Pic7XG4gICAgICAgICAgICBodG1sICs9ICc8aW5wdXQgaWQ9XCJUYWdfJyt0YWcuaWQrJ19IaWRlclwiIGRhdGEtdGFnPVwiJyt0YWcuaWQrJ1wiIHR5cGU9XCJoaWRkZW5cIi8+JztcbiAgICAgICAgICAgIHJlc291cmNlcy5nZXQodGFnLmlkKTtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTGlzdGVuZXIoXCJyZXNvdXJjZXMtXCIrdGFnLmlkLCB0YWdzLmxvYWRlZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFnLnZhbHVlPT1cImljb25cIikge1xuICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImZvcm1Sb3dcIj4nO1xuICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBpZD1cIlRhZ18nK3RhZy5pZCsnXCIgZGF0YS1pZD1cIicrdGFnLmlkKydcIiBkYXRhLXJlc291cmNlPVwiaWNvblwiIGNsYXNzPVwicmVzb3VyY2UgaWNvblwiIHRpdGxlPVwiJyt0YWcuZGVzY3JpcHRpb24rJ1wiIHN0eWxlPVwiYmFja2dyb3VuZC1pbWFnZTogdXJsKCcrdGFnLmRlZmF1bHQrJylcIj48L2Rpdj48ZGl2IGlkPVwiVGFnX1Jlc291cmNlc18nK3RhZy5pZCsnXCIgY2xhc3M9XCJyZXNvdXJjZXNcIiBkYXRhLWlkPVwiJyt0YWcuaWQrJ1wiIGRhdGEtcmVzb3VyY2VzPVwiaWNvblwiPjwvZGl2Pic7XG4gICAgICAgICAgICBodG1sICs9ICc8aW5wdXQgaWQ9XCJUYWdfJyt0YWcuaWQrJ19IaWRlclwiIGRhdGEtdGFnPVwiJyt0YWcuaWQrJ1wiIHR5cGU9XCJoaWRkZW5cIi8+JztcbiAgICAgICAgICAgIHJlc291cmNlcy5nZXQodGFnLmlkKTtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTGlzdGVuZXIoXCJyZXNvdXJjZXMtXCIrdGFnLmlkLCB0YWdzLmxvYWRlZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFnLnZhbHVlPT1cImFycmF5XCIpIHtcbiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgaWQ9XCJUYWdfJyt0YWcuaWQrJ19TZWxlY3RlZFwiPjwvZGl2Pic7XG4gICAgICAgICAgICBodG1sICs9ICc8aW5wdXQgaWQ9XCJUYWdfJyt0YWcuaWQrJ1wiIHR5cGU9XCJ0ZXh0XCIgZGF0YS10YWc9XCInK3RhZy5pZCsnXCIgZGF0YS1hcnJheT1cIicrdGFnLmlkKydcIiBtYXhsZW5ndGg9XCI1MDBcIiBwbGFjZWhvbGRlcj1cIicrdGFnLmRlc2NyaXB0aW9uKydcIiAvPic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuXG4gICAgZ2V0VGFnVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGFncy52YWwoKTtcbiAgICB9XG5cbiAgICBjbG9zZU1vZGFsKHJlZnJlc2ggPSB0cnVlLCBpZ25vcmVDaGFuZ2VzID0gZmFsc2UsIGRhdGE/LCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpZ25vcmVDaGFuZ2VzICYmIHRoaXMuX2RhdGFDaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGNvbmZpcm0oJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcy4gRG8geW91IHdhbnQgdG8gbGVhdmUgdGhpcyBwYWdlIGFuZCBkaXNjYXJkIHlvdXIgY2hhbmdlcyBvciBzdGF5IG9uIHRoaXMgcGFnZT8nKTtcbiAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvc2UuZW1pdCh7cmVmcmVzaDogcmVmcmVzaH0pO1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdEb0NoZWNrKCkge1xuICAgICAgICB0aGlzLmNoZWNrRGF0YUNoYW5nZURlYm91bmNlZCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja0RhdGFDaGFuZ2UoKSB7XG4gICAgICAgIGNvbnN0IGRhdGFDaGFuZ2UgPSAhaXNFcXVhbCh0aGlzLmluaXREYXRhLCB0aGlzLmZvcm1EYXRhKTtcbiAgICAgICAgaWYgKGRhdGFDaGFuZ2UgIT09IHRoaXMuX2RhdGFDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5nZS5lbWl0KGRhdGFDaGFuZ2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RhdGFDaGFuZ2UgPSBkYXRhQ2hhbmdlO1xuICAgICAgICBhcHAuaXNEaXJ0eSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNvcHlUb0NsaXBib2FyZCh2YWwpIHtcbiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodmFsKTtcbiAgICAgICAgY29uc3QgZ3Jvd2xlckRhdGEgPSBuZXcgR3Jvd2xlck1vZGVsKFxuICAgICAgICAgICAgJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgJ1N1Y2Nlc3MnLFxuICAgICAgICAgICAgYFRleHQgQ29waWVkYCxcbiAgICAgICAgICAgIGBBUEkgY2FsbCBVUkwgY29waWVkIHRvIGNsaXBib2FyZGAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZ3Jvd2xlclNlcnZpY2Uuc2hvdyhncm93bGVyRGF0YSk7XG4gICAgfVxuXG4gICAgZ2V0Um9sZXNDTElWYXJpYWJsZShzZWxlY3RlZFJvbGVzKSB7XG4gICAgICAgIGxldCByb2xlc1ZhciA9ICcnO1xuICAgICAgICBzZWxlY3RlZFJvbGVzLmZvckVhY2goKHJvbGUsIGluZGV4KT0+IHtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICByb2xlc1ZhciArPSAnLCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb2xlc1ZhciArPSByb2xlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJvbGVzVmFyO1xuICAgIH1cblxuICAgIGdldFJvbGVzQ1VSTFZhcmlhYmxlKHNlbGVjdGVkUm9sZXMpIHtcbiAgICAgICAgbGV0IHJvbGVzVmFyID0gJyc7XG4gICAgICAgIHNlbGVjdGVkUm9sZXMuZm9yRWFjaCgocm9sZSwgaW5kZXgpPT4ge1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIHJvbGVzVmFyICs9ICcsICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb2xlc1ZhciArPSBgXCIke3JvbGV9XCJgO1xuICAgICAgICB9KTtcbiAgICAgICAgcm9sZXNWYXIgPSBgWyR7cm9sZXNWYXJ9XWA7XG4gICAgICAgIHJldHVybiByb2xlc1ZhcjtcbiAgICB9XG59XG4iXX0=
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdGFibGUtZm9ybS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy9wcm9qZWN0YWJsZS1mb3Jtcy9wcm9qZWN0YWJsZS1mb3JtLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztFQWNFO0FBRUYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUNILFNBQVMsRUFHVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDbEYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRXhELE9BQU8sRUFBbUIsaUJBQWlCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUUxRixPQUFPLEVBQUMsaUJBQWlCLEVBQWtCLE1BQU0sa0NBQWtDLENBQUM7QUFFcEYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFFbEMsYUFBYTtBQUNiLE1BQU0sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFDLEdBQUcsTUFBTSxDQUFDO0FBRXhELE1BQU0sT0FBTyxNQUFNO0NBRWxCO0FBRUQsTUFJc0IsZUFBZ0IsU0FBUSxtQkFBbUI7SUEyQjdELFlBQ2MsY0FBOEIsRUFDSCxVQUE0QixFQUM1QixXQUE0QixFQUN2RCxNQUFlLEVBQ2YsS0FBc0I7UUFFaEMsS0FBSyxFQUFFLENBQUM7UUFORSxtQkFBYyxHQUFkLGNBQWMsQ0FB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QUNQLENBQUM7SUFFTSxjQUFjO1FBQ2pCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4RCxNQUFNLFlBQVksR0FBYSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdFLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ2xCLE9BQU87YUFDVjtZQUNELElBQUksSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQzsrR0ExUGlCLGVBQWUsZ0RBNkJyQixpQkFBaUIsYUFDakIsaUJBQWlCO21HQTlCWCxlQUFlLGdVQUh2QixFQUFFOztTQUdNLGVBQWU7NEZBQWYsZUFBZTtrQkFKcEMsU0FBUzsrQkFDSSxFQUFFOzswQkFnQ1AsTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUN4QixNQUFNOzJCQUFDLGlCQUFpQjs4RkE3QnBCLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNZLFFBQVE7c0JBQXpCLEtBQUs7Z0JBQ2EsS0FBSztzQkFBdkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNzQixjQUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gICAgQ29weXJpZ2h0IE5ldEZvdW5kcnkgSW5jLlxuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCB7RXh0ZW5kYWJsZUNvbXBvbmVudH0gZnJvbSBcIi4uL2V4dGVuZGFibGUvZXh0ZW5kYWJsZS5jb21wb25lbnRcIjtcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIERvQ2hlY2ssXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5pbXBvcnQge2RlZmVyLCBpc0VxdWFsLCB1bnNldCwgZGVib3VuY2UsIGNsb25lRGVlcCwgaXNFbXB0eSwgc2xpY2V9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7R3Jvd2xlck1vZGVsfSBmcm9tIFwiLi4vbWVzc2FnaW5nL2dyb3dsZXIubW9kZWxcIjtcbmltcG9ydCB7R3Jvd2xlclNlcnZpY2V9IGZyb20gXCIuLi9tZXNzYWdpbmcvZ3Jvd2xlci5zZXJ2aWNlXCI7XG5pbXBvcnQge0V4dGVuc2lvblNlcnZpY2UsIFNIQVJFRFpfRVhURU5TSU9OfSBmcm9tIFwiLi4vZXh0ZW5kYWJsZS9leHRlbnNpb25zLW5vb3Auc2VydmljZVwiO1xuaW1wb3J0IHtJZGVudGl0eX0gZnJvbSBcIi4uLy4uL21vZGVscy9pZGVudGl0eVwiO1xuaW1wb3J0IHtaSVRJX0RBVEFfU0VSVklDRSwgWml0aURhdGFTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXMveml0aS1kYXRhLnNlcnZpY2VcIjtcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFJvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XG5cbi8vIEB0cy1pZ25vcmVcbmNvbnN0IHtjb250ZXh0LCB0YWdzLCByZXNvdXJjZXMsIHNlcnZpY2UsIGFwcH0gPSB3aW5kb3c7XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHkge1xuICAgIG5hbWU6ICcnXG59XG5cbkBDb21wb25lbnQoe1xuICAgIHRlbXBsYXRlOiAnJyxcbiAgICBzdHlsZVVybHM6IFsnLi9wcm9qZWN0YWJsZS1mb3JtLmNsYXNzLnNjc3MnXVxufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQcm9qZWN0YWJsZUZvcm0gZXh0ZW5kcyBFeHRlbmRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgRG9DaGVjaywgT25Jbml0IHtcbiAgICBASW5wdXQoKSBpc01vZGFsID0gZmFsc2U7XG4gICAgQElucHV0KCkgZW50aXR5SWQ6IFN0cmluZztcbiAgICBASW5wdXQoKSBhYnN0cmFjdCBmb3JtRGF0YTogYW55O1xuICAgIEBPdXRwdXQoKSBhYnN0cmFjdCBjbG9zZTogRXZlbnRFbWl0dGVyPGFueT47XG4gICAgQE91dHB1dCgpIGRhdGFDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQFZpZXdDaGlsZCgnbmFtZUZpZWxkSW5wdXQnKSBuYW1lRmllbGRJbnB1dDogRWxlbWVudFJlZjtcblxuICAgIGFic3RyYWN0IGNsZWFyKCk6IHZvaWQ7XG4gICAgYWJzdHJhY3Qgc2F2ZSgpOiB2b2lkO1xuXG4gICAgcHVibGljIGVycm9yczogYW55ID0ge307XG4gICAgcHJvdGVjdGVkIGVudGl0eVR5cGUgPSAnaWRlbnRpdGllcyc7XG4gICAgcHJvdGVjdGVkIGVudGl0eUNsYXNzOiBhbnkgPSBFbnRpdHk7XG4gICAgcHJvdGVjdGVkIGlzTG9hZGluZyA9IGZhbHNlO1xuICAgIG1vcmVBY3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIHRhZ0VsZW1lbnRzOiBhbnkgPSBbXTtcbiAgICB0YWdEYXRhOiBhbnkgPSBbXTtcbiAgICBoaWRlVGFncyA9IGZhbHNlO1xuICAgIGluaXREYXRhOiBhbnkgPSB7fTtcbiAgICBfZGF0YUNoYW5nZSA9IGZhbHNlO1xuICAgIGFwaU9wdGlvbnMgPSBbe2lkOiAnY2xpJywgbGFiZWw6ICdDb3B5IGFzIENMSSd9LCB7aWQ6ICdjdXJsJywgbGFiZWw6ICdDb3B5IGFzIENVUkwnfV07XG5cbiAgICBjaGVja0RhdGFDaGFuZ2VEZWJvdW5jZWQgPSBkZWJvdW5jZSh0aGlzLmNoZWNrRGF0YUNoYW5nZSwgMTAwLCB7bWF4V2FpdDogMTAwfSk7XG5cbiAgICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIGdyb3dsZXJTZXJ2aWNlOiBHcm93bGVyU2VydmljZSxcbiAgICAgICAgQEluamVjdChTSEFSRURaX0VYVEVOU0lPTikgcHJvdGVjdGVkIGV4dFNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoWklUSV9EQVRBX1NFUlZJQ0UpIHByb3RlY3RlZCB6aXRpU2VydmljZTogWml0aURhdGFTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcm91dGVyPzogUm91dGVyLFxuICAgICAgICBwcm90ZWN0ZWQgcm91dGU/OiBBY3RpdmF0ZWRSb3V0ZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICB0aGlzLnJvdXRlPy5wYXJhbXM/LnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gcGFyYW1zWydpZCddO1xuICAgICAgICAgICAgICAgIGlmICghaXNFbXB0eShpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnRpdHlJZCA9IGlkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSB7fTtcbiAgICAgICAgdGhpcy5uYW1lRmllbGRJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGlmICh0aGlzLmV4dFNlcnZpY2U/Lm1vcmVBY3Rpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm1vcmVBY3Rpb25zID0gWy4uLnRoaXMubW9yZUFjdGlvbnMsIC4uLnRoaXMuZXh0U2VydmljZS5tb3JlQWN0aW9uc107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZW50aXR5SWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVudGl0eUlkID09PSAnY3JlYXRlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybURhdGEgPSBuZXcgdGhpcy5lbnRpdHlDbGFzcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdERhdGEgPSBjbG9uZURlZXAodGhpcy5mb3JtRGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbnRpdHlVcGRhdGVkKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy56aXRpU2VydmljZS5nZXRTdWJkYXRhKHRoaXMuZW50aXR5VHlwZSwgdGhpcy5lbnRpdHlJZCwgJycpLnRoZW4oKGVudGl0eTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtRGF0YSA9IGVudGl0eT8uZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXREYXRhID0gY2xvbmVEZWVwKHRoaXMuZm9ybURhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW50aXR5VXBkYXRlZCgpO1xuICAgICAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd01vcmVDaGFuZ2VkKHNob3dNb3JlKSB7XG4gICAgICAgIGlmICghc2hvd01vcmUgfHwgdGhpcy5oaWRlVGFncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXRUYWdzKClcbiAgICB9XG5cbiAgICBsb2FkVGFncygpIHtcbiAgICAgICAgdGhpcy5oaWRlVGFncyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGlkZVRhZ3NcIik9PVwieWVzXCI7XG4gICAgICAgIGlmICh0aGlzLmhpZGVUYWdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2VydmljZS5jYWxsKFwidGFnc1wiLCB7fSwgdGhpcy50YWdzTG9hZGVkLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIHRhZ3NMb2FkZWQocmVzdWx0cykge1xuICAgICAgICB0YWdzLmRhdGEgPSByZXN1bHRzO1xuICAgICAgICBjb250ZXh0LnNldCh0YWdzLm5hbWUsIHRhZ3MuZGF0YSk7XG4gICAgICAgIHRhZ3MudGFnRGF0YSA9IFtdO1xuICAgICAgICB0YWdzLmRhdGEuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICAgICAgICBsZXQgaHRtbDtcbiAgICAgICAgICAgIGlmICh0YWcub2JqZWN0cz09XCJhbGxcIiB8fCB0YWcub2JqZWN0cy5pbmRleE9mKHRoaXMuZW50aXR5VHlwZSk+PTApIHtcbiAgICAgICAgICAgICAgICB0YWdzLnRhZ0RhdGFbdGFncy50YWdEYXRhLmxlbmd0aF0gPSB0YWc7XG4gICAgICAgICAgICAgICAgaHRtbCA9IHRoaXMuZ2V0VGFnQ29udGVudCh0YWcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ0VsID0ge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGFnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBodG1sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudGFnRWxlbWVudHMucHVzaCh0YWdFbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVzZXRUYWdzKCkge1xuICAgICAgICB1bnNldCh0YWdzLCAnbWFwJyk7XG4gICAgICAgIGlmICh0aGlzLmhpZGVUYWdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgdGFncy5yZXNldCh0aGlzLmZvcm1EYXRhKTtcbiAgICAgICAgICAgIHRhZ3MuZXZlbnRzKCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgZ2V0VGFnQ29udGVudCh0YWcpIHtcbiAgICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgICAgaWYgKHRhZy52YWx1ZT09XCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaHRtbCArPSAnPGlucHV0IGlkPVwiVGFnXycrdGFnLmlkKydcIiB0eXBlPVwidGV4dFwiIGRhdGEtdGFnPVwiJyt0YWcuaWQrJ1wiIG1heGxlbmd0aD1cIjUwMFwiIHBsYWNlaG9sZGVyPVwiJyt0YWcuZGVzY3JpcHRpb24rJ1wiIC8+JztcbiAgICAgICAgfSBlbHNlIGlmICh0YWcudmFsdWU9PVwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBodG1sICs9ICc8aW5wdXQgaWQ9XCJUYWdfJyt0YWcuaWQrJ1wiIHR5cGU9XCJjaGVja2JveFwiIGRhdGEtdGFnPVwiJyt0YWcuaWQrJ1wiIC8+JztcbiAgICAgICAgfSBlbHNlIGlmICh0YWcudmFsdWU9PVwibWFwXCIpIHtcbiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgaWQ9XCJUYWdfJyt0YWcuaWQrJ19NYXBcIiBkYXRhLW1hcD1cIicrdGFnLmlkKydcIiBjbGFzcz1cIm1hcFwiPjwvZGl2Pic7XG4gICAgICAgICAgICBodG1sICs9ICc8aW5wdXQgaWQ9XCJUYWdfJyt0YWcuaWQrJ1wiIHR5cGU9XCJ0ZXh0XCIgZGF0YS10YWc9XCInK3RhZy5pZCsnXCIgbWF4bGVuZ3RoPVwiNTAwXCIgcGxhY2Vob2xkZXI9XCInK3RhZy5kZXNjcmlwdGlvbisnXCIgLz4nO1xuICAgICAgICB9IGVsc2UgaWYgKHRhZy52YWx1ZT09XCJhdmF0YXJcIikge1xuICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImZvcm1Sb3dcIj4nO1xuICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBpZD1cIlRhZ18nK3RhZy5pZCsnXCIgZGF0YS1pZD1cIicrdGFnLmlkKydcIiBkYXRhLXJlc291cmNlPVwiYXZhdGFyXCIgY2xhc3M9XCJyZXNvdXJjZSBpY29uIHByb2ZpbGVcIiB0aXRsZT1cIicrdGFnLmRlc2NyaXB0aW9uKydcIiBzdHlsZT1cImJhY2tncm91bmQtaW1hZ2U6IHVybCgnK3RhZy5kZWZhdWx0KycpXCI+PC9kaXY+PGRpdiBpZD1cIlRhZ19SZXNvdXJjZXNfJyt0YWcuaWQrJ1wiIGNsYXNzPVwicmVzb3VyY2VzXCIgZGF0YS1pZD1cIicrdGFnLmlkKydcIiBkYXRhLXJlc291cmNlcz1cImF2YXRhclwiPjwvZGl2Pic7XG4gICAgICAgICAgICBodG1sICs9ICc8aW5wdXQgaWQ9XCJUYWdfJyt0YWcuaWQrJ19IaWRlclwiIGRhdGEtdGFnPVwiJyt0YWcuaWQrJ1wiIHR5cGU9XCJoaWRkZW5cIi8+JztcbiAgICAgICAgICAgIHJlc291cmNlcy5nZXQodGFnLmlkKTtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTGlzdGVuZXIoXCJyZXNvdXJjZXMtXCIrdGFnLmlkLCB0YWdzLmxvYWRlZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFnLnZhbHVlPT1cImljb25cIikge1xuICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImZvcm1Sb3dcIj4nO1xuICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBpZD1cIlRhZ18nK3RhZy5pZCsnXCIgZGF0YS1pZD1cIicrdGFnLmlkKydcIiBkYXRhLXJlc291cmNlPVwiaWNvblwiIGNsYXNzPVwicmVzb3VyY2UgaWNvblwiIHRpdGxlPVwiJyt0YWcuZGVzY3JpcHRpb24rJ1wiIHN0eWxlPVwiYmFja2dyb3VuZC1pbWFnZTogdXJsKCcrdGFnLmRlZmF1bHQrJylcIj48L2Rpdj48ZGl2IGlkPVwiVGFnX1Jlc291cmNlc18nK3RhZy5pZCsnXCIgY2xhc3M9XCJyZXNvdXJjZXNcIiBkYXRhLWlkPVwiJyt0YWcuaWQrJ1wiIGRhdGEtcmVzb3VyY2VzPVwiaWNvblwiPjwvZGl2Pic7XG4gICAgICAgICAgICBodG1sICs9ICc8aW5wdXQgaWQ9XCJUYWdfJyt0YWcuaWQrJ19IaWRlclwiIGRhdGEtdGFnPVwiJyt0YWcuaWQrJ1wiIHR5cGU9XCJoaWRkZW5cIi8+JztcbiAgICAgICAgICAgIHJlc291cmNlcy5nZXQodGFnLmlkKTtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTGlzdGVuZXIoXCJyZXNvdXJjZXMtXCIrdGFnLmlkLCB0YWdzLmxvYWRlZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFnLnZhbHVlPT1cImFycmF5XCIpIHtcbiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgaWQ9XCJUYWdfJyt0YWcuaWQrJ19TZWxlY3RlZFwiPjwvZGl2Pic7XG4gICAgICAgICAgICBodG1sICs9ICc8aW5wdXQgaWQ9XCJUYWdfJyt0YWcuaWQrJ1wiIHR5cGU9XCJ0ZXh0XCIgZGF0YS10YWc9XCInK3RhZy5pZCsnXCIgZGF0YS1hcnJheT1cIicrdGFnLmlkKydcIiBtYXhsZW5ndGg9XCI1MDBcIiBwbGFjZWhvbGRlcj1cIicrdGFnLmRlc2NyaXB0aW9uKydcIiAvPic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuXG4gICAgZ2V0VGFnVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGFncy52YWwoKTtcbiAgICB9XG5cbiAgICBjbG9zZUZvcm0ocmVmcmVzaCA9IHRydWUsIGlnbm9yZUNoYW5nZXMgPSBmYWxzZSwgZGF0YT8sIGV2ZW50Pykge1xuICAgICAgICBpZiAoIWlnbm9yZUNoYW5nZXMgJiYgdGhpcy5fZGF0YUNoYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gY29uZmlybSgnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBEbyB5b3Ugd2FudCB0byBsZWF2ZSB0aGlzIHBhZ2UgYW5kIGRpc2NhcmQgeW91ciBjaGFuZ2VzIG9yIHN0YXkgb24gdGhpcyBwYWdlPycpO1xuICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNNb2RhbCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZU1vZGFsKHJlZnJlc2gsIGlnbm9yZUNoYW5nZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXR1cm5Ub0xpc3RQYWdlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9zZU1vZGFsKHJlZnJlc2ggPSB0cnVlLCBpZ25vcmVDaGFuZ2VzID0gZmFsc2UsIGRhdGE/LCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbG9zZS5lbWl0KHtyZWZyZXNoOiByZWZyZXNofSk7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm5Ub0xpc3RQYWdlKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5nZXRCYXNlVVJMUGF0aCgpO1xuICAgICAgICB0aGlzLnJvdXRlcj8ubmF2aWdhdGVCeVVybChgJHtiYXNlVXJsfWApO1xuICAgIH1cblxuICAgIG5nRG9DaGVjaygpIHtcbiAgICAgICAgdGhpcy5jaGVja0RhdGFDaGFuZ2VEZWJvdW5jZWQoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tEYXRhQ2hhbmdlKCkge1xuICAgICAgICBjb25zdCBkYXRhQ2hhbmdlID0gIWlzRXF1YWwodGhpcy5pbml0RGF0YSwgdGhpcy5mb3JtRGF0YSk7XG4gICAgICAgIGlmIChkYXRhQ2hhbmdlICE9PSB0aGlzLl9kYXRhQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFDaGFuZ2UuZW1pdChkYXRhQ2hhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhQ2hhbmdlID0gZGF0YUNoYW5nZTtcbiAgICAgICAgYXBwLmlzRGlydHkgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjb3B5VG9DbGlwYm9hcmQodmFsKSB7XG4gICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHZhbCk7XG4gICAgICAgIGNvbnN0IGdyb3dsZXJEYXRhID0gbmV3IEdyb3dsZXJNb2RlbChcbiAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgICAgICAgICAgICdTdWNjZXNzJyxcbiAgICAgICAgICAgIGBUZXh0IENvcGllZGAsXG4gICAgICAgICAgICBgQVBJIGNhbGwgVVJMIGNvcGllZCB0byBjbGlwYm9hcmRgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmdyb3dsZXJTZXJ2aWNlLnNob3coZ3Jvd2xlckRhdGEpO1xuICAgIH1cblxuICAgIGdldFJvbGVzQ0xJVmFyaWFibGUoc2VsZWN0ZWRSb2xlcykge1xuICAgICAgICBsZXQgcm9sZXNWYXIgPSAnJztcbiAgICAgICAgc2VsZWN0ZWRSb2xlcy5mb3JFYWNoKChyb2xlLCBpbmRleCk9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgcm9sZXNWYXIgKz0gJywnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm9sZXNWYXIgKz0gcm9sZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByb2xlc1ZhcjtcbiAgICB9XG5cbiAgICBnZXRSb2xlc0NVUkxWYXJpYWJsZShzZWxlY3RlZFJvbGVzKSB7XG4gICAgICAgIGxldCByb2xlc1ZhciA9ICcnO1xuICAgICAgICBzZWxlY3RlZFJvbGVzLmZvckVhY2goKHJvbGUsIGluZGV4KT0+IHtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICByb2xlc1ZhciArPSAnLCAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm9sZXNWYXIgKz0gYFwiJHtyb2xlfVwiYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJvbGVzVmFyID0gYFske3JvbGVzVmFyfV1gO1xuICAgICAgICByZXR1cm4gcm9sZXNWYXI7XG4gICAgfVxuXG4gICAgY2FuRGVhY3RpdmF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGFDaGFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maXJtKCdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMuIERvIHlvdSB3YW50IHRvIGxlYXZlIHRoaXMgcGFnZSBhbmQgZGlzY2FyZCB5b3VyIGNoYW5nZXMgb3Igc3RheSBvbiB0aGlzIHBhZ2U/Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGVudGl0eVVwZGF0ZWQoKSB7XG4gICAgICAgIC8vbm8tb3BcbiAgICB9XG5cbiAgICBnZXRSb2xlQXR0cmlidXRlcyh0eXBlOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueml0aVNlcnZpY2UuZ2V0KHR5cGUsIHt9LCBbXSkudGhlbigocmVzdWx0cykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMuZGF0YTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEJhc2VVUkxQYXRoKCkge1xuICAgICAgICBsZXQgcGF0aCA9ICcnO1xuICAgICAgICBjb25zdCB1cmxTZWdtZW50cyA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgnLycpO1xuICAgICAgICBjb25zdCBiYXNlU2VnbWVudHM6IHN0cmluZ1tdID0gc2xpY2UodXJsU2VnbWVudHMsIDAsIHVybFNlZ21lbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgICBiYXNlU2VnbWVudHMuZm9yRWFjaChzZWdtZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChpc0VtcHR5KHNlZ21lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0aCArPSBgLyR7c2VnbWVudH1gO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxufVxuIl19