ng-prime-tools 1.0.30 → 1.0.32

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 (25) hide show
  1. package/README.md +4 -0
  2. package/esm2022/lib/models/button.model.mjs +1 -1
  3. package/esm2022/lib/pt-advanced-prime-table/date-utility.service.mjs +43 -0
  4. package/esm2022/lib/pt-advanced-prime-table/pt-advanced-prime-table.component.mjs +107 -39
  5. package/esm2022/lib/pt-advanced-prime-table/pt-advanced-prime-table.module.mjs +7 -3
  6. package/esm2022/lib/pt-advanced-prime-table/public-api.mjs +2 -1
  7. package/esm2022/lib/pt-button/pt-button.component.mjs +44 -16
  8. package/esm2022/lib/pt-dialog/pt-dialog.component.mjs +164 -129
  9. package/fesm2022/ng-prime-tools.mjs +424 -250
  10. package/fesm2022/ng-prime-tools.mjs.map +1 -1
  11. package/lib/models/button.model.d.ts +1 -0
  12. package/lib/models/button.model.d.ts.map +1 -1
  13. package/lib/pt-advanced-prime-table/date-utility.service.d.ts +8 -0
  14. package/lib/pt-advanced-prime-table/date-utility.service.d.ts.map +1 -0
  15. package/lib/pt-advanced-prime-table/pt-advanced-prime-table.component.d.ts +17 -3
  16. package/lib/pt-advanced-prime-table/pt-advanced-prime-table.component.d.ts.map +1 -1
  17. package/lib/pt-advanced-prime-table/pt-advanced-prime-table.module.d.ts +2 -1
  18. package/lib/pt-advanced-prime-table/pt-advanced-prime-table.module.d.ts.map +1 -1
  19. package/lib/pt-advanced-prime-table/public-api.d.ts +1 -0
  20. package/lib/pt-advanced-prime-table/public-api.d.ts.map +1 -1
  21. package/lib/pt-button/pt-button.component.d.ts +7 -1
  22. package/lib/pt-button/pt-button.component.d.ts.map +1 -1
  23. package/lib/pt-dialog/pt-dialog.component.d.ts +18 -1
  24. package/lib/pt-dialog/pt-dialog.component.d.ts.map +1 -1
  25. package/package.json +1 -1
@@ -1,53 +1,45 @@
1
1
  import { Component, Input, Output, EventEmitter, } from '@angular/core';
2
- import { ConfirmationService, ConfirmEventType, MessageService, } from 'primeng/api';
2
+ import { ConfirmationService, MessageService, } from 'primeng/api';
3
3
  import { SeverityEnum } from '../enums';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "primeng/api";
6
6
  import * as i2 from "@angular/common";
7
- import * as i3 from "primeng/confirmdialog";
8
- // Default Styles for Different Dialog Types
7
+ import * as i3 from "../pt-button/pt-button.component";
8
+ import * as i4 from "primeng/confirmdialog";
9
+ /**
10
+ * Styles per severity:
11
+ * - Only header (text/color) is provided here.
12
+ * - No default "content" text anymore.
13
+ */
9
14
  const DIALOG_STYLES = {
10
15
  [SeverityEnum.WARNING]: {
11
- header: { text: 'Warning', color: '#d98300' },
12
- content: { text: 'This is a warning message!', color: '#d98300' },
13
- confirmButtonConfig: { backgroundColor: '#d98300', fontColor: '#fff' },
14
- cancelButtonConfig: { backgroundColor: '#6c757d', fontColor: '#fff' },
16
+ header: { text: 'Avertissement', color: '#8a4b00' },
15
17
  },
16
18
  [SeverityEnum.SUCCESS]: {
17
- header: { text: 'Success', color: '#28a745' },
18
- content: { text: 'Operation was successful!', color: '#28a745' },
19
- confirmButtonConfig: { backgroundColor: '#28a745', fontColor: '#fff' },
20
- cancelButtonConfig: { backgroundColor: '#6c757d', fontColor: '#fff' },
19
+ header: { text: 'Succès', color: '#166534' },
21
20
  },
22
21
  [SeverityEnum.DANGER]: {
23
- header: { text: 'Error', color: '#dc3545' },
24
- content: { text: 'An error occurred!', color: '#dc3545' },
25
- confirmButtonConfig: { backgroundColor: '#dc3545', fontColor: '#fff' },
26
- cancelButtonConfig: { backgroundColor: '#6c757d', fontColor: '#fff' },
22
+ header: { text: 'Erreur', color: '#7f1d1d' },
27
23
  },
28
24
  [SeverityEnum.INFO]: {
29
- header: { text: 'Information', color: '#007bff' },
30
- content: { text: 'Here is some important information.', color: '#007bff' },
31
- confirmButtonConfig: { backgroundColor: '#007bff', fontColor: '#fff' },
32
- cancelButtonConfig: { backgroundColor: '#6c757d', fontColor: '#fff' },
25
+ header: { text: 'Information', color: '#2563eb' },
33
26
  },
34
27
  };
35
- // Centralized Default Values
28
+ /**
29
+ * Default config:
30
+ * - content is now empty string (no default message).
31
+ */
36
32
  const DEFAULT_DIALOG_CONFIG = {
37
33
  header: { text: 'Confirmation' },
38
34
  visible: false,
39
- width: '400px',
35
+ width: '720px',
40
36
  height: 'auto',
41
- content: 'Do you want to proceed?',
37
+ content: '', // no default message
42
38
  confirmButtonConfig: {
43
- label: 'Confirm',
44
- fontColor: '#fff',
45
- backgroundColor: '#007bff',
39
+ label: 'Confirmer',
46
40
  },
47
41
  cancelButtonConfig: {
48
- label: 'Cancel',
49
- fontColor: '#fff',
50
- backgroundColor: '#6c757d',
42
+ label: 'Annuler',
51
43
  },
52
44
  dialogStyle: SeverityEnum.INFO,
53
45
  };
@@ -60,11 +52,13 @@ export class PTDialogComponent {
60
52
  this.dialogConfig = { ...DEFAULT_DIALOG_CONFIG };
61
53
  this.confirm = new EventEmitter();
62
54
  this.cancel = new EventEmitter();
55
+ this.SeverityEnum = SeverityEnum;
63
56
  }
64
57
  ngOnChanges(changes) {
65
58
  if (changes['dialogConfig']) {
66
- if (changes['dialogConfig'].currentValue?.dialogStyle !==
67
- changes['dialogConfig'].previousValue?.dialogStyle) {
59
+ const current = changes['dialogConfig'].currentValue;
60
+ if (changes['dialogConfig'].previousValue?.dialogStyle !==
61
+ current?.dialogStyle) {
68
62
  this.applyDialogStyle();
69
63
  }
70
64
  if (this.dialogConfig.visible) {
@@ -72,80 +66,124 @@ export class PTDialogComponent {
72
66
  }
73
67
  }
74
68
  }
69
+ /**
70
+ * Merge defaults + current config + severity style.
71
+ * We are careful NOT to spread header (it can be string or object).
72
+ */
75
73
  applyDialogStyle() {
76
74
  const dialogStyle = this.dialogConfig.dialogStyle || SeverityEnum.INFO;
77
75
  const styleConfig = DIALOG_STYLES[dialogStyle] || {};
76
+ const current = this.dialogConfig;
77
+ // Decide which header to use without spreading non-object types
78
+ const mergedHeader = current.header !== undefined
79
+ ? current.header
80
+ : styleConfig.header !== undefined
81
+ ? styleConfig.header
82
+ : DEFAULT_DIALOG_CONFIG.header;
78
83
  this.dialogConfig = {
79
84
  ...DEFAULT_DIALOG_CONFIG,
85
+ ...current,
80
86
  ...styleConfig,
87
+ header: mergedHeader,
81
88
  confirmButtonConfig: {
82
89
  ...DEFAULT_DIALOG_CONFIG.confirmButtonConfig,
83
- ...styleConfig.confirmButtonConfig,
90
+ ...current.confirmButtonConfig,
84
91
  },
85
92
  cancelButtonConfig: {
86
93
  ...DEFAULT_DIALOG_CONFIG.cancelButtonConfig,
87
- ...styleConfig.cancelButtonConfig,
94
+ ...current.cancelButtonConfig,
88
95
  },
96
+ visible: current.visible,
97
+ };
98
+ }
99
+ getSeverityClass() {
100
+ const style = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO;
101
+ switch (style) {
102
+ case SeverityEnum.DANGER:
103
+ return 'pt-dialog-danger';
104
+ case SeverityEnum.WARNING:
105
+ return 'pt-dialog-warning';
106
+ case SeverityEnum.SUCCESS:
107
+ return 'pt-dialog-success';
108
+ case SeverityEnum.INFO:
109
+ default:
110
+ return 'pt-dialog-info';
111
+ }
112
+ }
113
+ /** SUCCESS & INFO share same behaviour, only color differs */
114
+ getSeverityColors() {
115
+ const style = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO;
116
+ switch (style) {
117
+ case SeverityEnum.DANGER:
118
+ return { header: '#b91c1c', message: '#4b5563' };
119
+ case SeverityEnum.WARNING:
120
+ return { header: '#b45309', message: '#92400e' };
121
+ case SeverityEnum.SUCCESS:
122
+ return { header: '#15803d', message: '#166534' };
123
+ case SeverityEnum.INFO:
124
+ default:
125
+ return { header: '#2563eb', message: '#2563eb' };
126
+ }
127
+ }
128
+ // ───────────── Button models for pt-button ─────────────
129
+ get confirmButtonModel() {
130
+ const style = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO;
131
+ const confirmSeverity = style === SeverityEnum.DANGER
132
+ ? SeverityEnum.DANGER
133
+ : style === SeverityEnum.WARNING
134
+ ? SeverityEnum.WARNING
135
+ : style === SeverityEnum.SUCCESS
136
+ ? SeverityEnum.SUCCESS
137
+ : SeverityEnum.INFO;
138
+ return {
139
+ label: this.dialogConfig.confirmButtonConfig?.label ?? 'Confirmer',
140
+ icon: this.dialogConfig.confirmButtonConfig?.icon ?? 'pi pi-check',
141
+ iconPos: 'left',
142
+ type: 'button',
143
+ outlined: true,
144
+ severity: confirmSeverity,
145
+ styleClass: (this.dialogConfig.confirmButtonConfig?.styleClass || '') +
146
+ ' pt-dialog-confirm-btn',
147
+ width: 'auto',
148
+ };
149
+ }
150
+ get cancelButtonModel() {
151
+ return {
152
+ label: this.dialogConfig.cancelButtonConfig?.label ?? 'Annuler',
153
+ icon: this.dialogConfig.cancelButtonConfig?.icon ?? 'pi pi-times',
154
+ iconPos: 'left',
155
+ type: 'button',
156
+ outlined: true,
157
+ severity: SeverityEnum.INFO,
158
+ styleClass: (this.dialogConfig.cancelButtonConfig?.styleClass || '') +
159
+ ' pt-dialog-cancel-btn',
160
+ width: 'auto',
89
161
  };
90
162
  }
91
163
  showDialog() {
92
164
  this.confirmationService.confirm({
93
- header: this.getDialogHeaderText(),
165
+ header: '',
166
+ // message is not really used visually, but kept here
94
167
  message: this.getDialogContentText(),
95
- acceptLabel: this.dialogConfig.confirmButtonConfig?.label || 'Confirm',
96
- rejectLabel: this.dialogConfig.cancelButtonConfig?.label || 'Cancel',
97
- acceptButtonStyleClass: this.getButtonStyle(this.dialogConfig.confirmButtonConfig, true),
98
- rejectButtonStyleClass: this.getButtonStyle(this.dialogConfig.cancelButtonConfig, false),
99
- acceptIcon: this.dialogConfig.confirmButtonConfig?.icon || 'pi pi-check',
100
- rejectIcon: this.dialogConfig.cancelButtonConfig?.icon || 'pi pi-times',
101
- accept: () => {
102
- this.confirm.emit();
103
- if (this.dialogConfig.toastOnConfirm) {
104
- }
105
- },
106
- reject: (type) => {
107
- this.cancel.emit();
108
- if (type === ConfirmEventType.REJECT &&
109
- this.dialogConfig.toastOnCancel) {
110
- }
111
- },
168
+ accept: () => this.confirm.emit(),
169
+ reject: (_type) => this.cancel.emit(),
112
170
  });
113
- // Use renderer to apply dynamic styles
114
171
  setTimeout(() => {
115
- const dialogElement = this.el.nativeElement.querySelector('.p-dialog');
172
+ const dialogElement = document.querySelector('.p-confirm-dialog');
116
173
  if (dialogElement) {
117
- this.renderer.setStyle(dialogElement, 'width', this.dialogConfig.width || '400px');
174
+ this.renderer.addClass(dialogElement, 'pt-dialog-overlay');
175
+ this.renderer.removeClass(dialogElement, 'pt-dialog-danger');
176
+ this.renderer.removeClass(dialogElement, 'pt-dialog-warning');
177
+ this.renderer.removeClass(dialogElement, 'pt-dialog-success');
178
+ this.renderer.removeClass(dialogElement, 'pt-dialog-info');
179
+ const severityClass = this.getSeverityClass();
180
+ this.renderer.addClass(dialogElement, severityClass);
181
+ this.renderer.setStyle(dialogElement, 'width', this.dialogConfig.width || '720px');
118
182
  this.renderer.setStyle(dialogElement, 'height', this.dialogConfig.height || 'auto');
119
183
  }
120
184
  }, 0);
121
185
  }
122
- getButtonStyle(buttonConfig, isConfirm = false) {
123
- let styleClass = buttonConfig?.styleClass ?? 'p-button-sm';
124
- // ✅ Apply width dynamically if provided, otherwise default to 100%
125
- const buttonWidth = buttonConfig?.width ?? '100%';
126
- // ✅ Set default severity: SUCCESS for confirm, SECONDARY for cancel
127
- const defaultSeverity = isConfirm ? SeverityEnum.DANGER : SeverityEnum.INFO;
128
- const severity = buttonConfig?.severity ?? defaultSeverity;
129
- // ✅ Apply severity-based styles only if no custom background color is set
130
- if (!buttonConfig?.backgroundColor) {
131
- switch (severity) {
132
- case SeverityEnum.WARNING:
133
- styleClass += ' p-button-warning';
134
- break;
135
- case SeverityEnum.DANGER:
136
- styleClass += ' p-button-danger';
137
- break;
138
- case SeverityEnum.SUCCESS:
139
- styleClass += ' p-button-success';
140
- break;
141
- case SeverityEnum.INFO:
142
- default:
143
- styleClass += ' p-button-secondary';
144
- break;
145
- }
146
- }
147
- return `${styleClass.trim()} width-${buttonWidth.replace('%', '')}`;
148
- }
186
+ // ── header / icon / content helpers ───────────────────────────────
149
187
  getDialogHeaderText() {
150
188
  const header = this.dialogConfig.header;
151
189
  const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO;
@@ -158,88 +196,85 @@ export class PTDialogComponent {
158
196
  styleHeader !== null &&
159
197
  'text' in styleHeader
160
198
  ? styleHeader.text
161
- : 'Confirmation'; // ✅ Default value
199
+ : 'Confirmation';
162
200
  }
163
201
  getDialogHeaderStyle() {
164
202
  const header = this.dialogConfig.header;
165
- const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO;
166
- const styleHeader = DIALOG_STYLES[dialogStyle]?.header;
167
- return typeof header === 'object' && header !== null
168
- ? {
169
- color: header.color ||
170
- (typeof styleHeader === 'object' ? styleHeader?.color : '#333'),
171
- fontSize: header.fontSize || '25px',
172
- }
173
- : {
174
- color: typeof styleHeader === 'object' ? styleHeader?.color : '#333',
175
- fontSize: '25px',
176
- };
203
+ const { header: color } = this.getSeverityColors();
204
+ const fontSize = typeof header === 'object' && header !== null && header.fontSize
205
+ ? header.fontSize
206
+ : '20px';
207
+ return {
208
+ color,
209
+ fontSize,
210
+ fontWeight: 700,
211
+ };
177
212
  }
178
213
  getDialogIconClass() {
179
214
  const header = this.dialogConfig.header;
180
- const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO; // ✅ Ensure dialogStyle is always defined
181
- const styleHeader = DIALOG_STYLES[dialogStyle]?.header; // ✅ Store the style header separately
182
- // ✅ Ensure header.icon exists and is an object before accessing .code
215
+ const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO;
216
+ const styleHeader = DIALOG_STYLES[dialogStyle]?.header;
183
217
  const icon = typeof header === 'object' && header !== null && 'icon' in header
184
218
  ? header.icon
185
219
  : typeof styleHeader === 'object' && 'icon' in styleHeader
186
220
  ? styleHeader.icon
187
221
  : undefined;
188
- // ✅ If `icon` is an object, extract `.code`, otherwise return as string or default value
189
222
  return typeof icon === 'string'
190
223
  ? icon
191
224
  : icon?.code || 'pi pi-exclamation-circle';
192
225
  }
193
226
  getDialogIconStyle() {
194
227
  const header = this.dialogConfig.header;
195
- const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO;
196
- const styleHeader = DIALOG_STYLES[dialogStyle]?.header;
228
+ const { header: defaultColor } = this.getSeverityColors();
197
229
  const icon = typeof header === 'object' && header !== null && 'icon' in header
198
230
  ? header.icon
199
231
  : undefined;
200
232
  return {
201
- color: icon?.color ||
202
- (typeof styleHeader === 'object' ? styleHeader?.color : '#f39c12'),
203
- fontSize: icon?.fontSize || '1.5rem',
204
- backgroundColor: icon?.backgroundColor || 'transparent',
205
- borderRadius: icon?.shape === 'circular' ? '50%' : '4px',
206
- padding: '5px',
233
+ color: icon?.color || defaultColor,
234
+ fontSize: icon?.fontSize || '2.2rem',
207
235
  };
208
236
  }
237
+ /**
238
+ * No default text anymore.
239
+ * - If dialogConfig.content is a string, we return it.
240
+ * - If it is an object with text, we use that.
241
+ * - Otherwise we return '' (empty) so the body is blank.
242
+ */
209
243
  getDialogContentText() {
210
244
  const content = this.dialogConfig.content;
211
- const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO;
212
- const styleContent = DIALOG_STYLES[dialogStyle]?.content;
213
- return typeof content === 'string'
214
- ? content
215
- : content?.text ||
216
- (typeof styleContent === 'object'
217
- ? styleContent?.text
218
- : 'Are you sure?');
245
+ if (typeof content === 'string') {
246
+ return content;
247
+ }
248
+ if (content && typeof content === 'object' && 'text' in content) {
249
+ return content.text ?? '';
250
+ }
251
+ return '';
219
252
  }
220
253
  getDialogContentStyle() {
221
254
  const content = this.dialogConfig.content;
222
- const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO;
223
- const styleContent = DIALOG_STYLES[dialogStyle]?.content;
224
- return typeof content === 'object' && content !== null
225
- ? {
226
- color: content.color ||
227
- (typeof styleContent === 'object' ? styleContent?.color : '#333'),
228
- fontSize: content.fontSize || '20px',
229
- textAlign: content.position || 'left',
255
+ const { message } = this.getSeverityColors();
256
+ let fontSize = '18px';
257
+ let textAlign;
258
+ if (typeof content === 'object' && content !== null) {
259
+ if (content.fontSize) {
260
+ fontSize = content.fontSize;
230
261
  }
231
- : {
232
- color: typeof styleContent === 'object' ? styleContent?.color : '#333',
233
- fontSize: '20px',
234
- textAlign: 'left',
235
- };
262
+ if (content.position) {
263
+ textAlign = content.position;
264
+ }
265
+ }
266
+ return {
267
+ color: message,
268
+ fontSize,
269
+ ...(textAlign ? { textAlign } : {}),
270
+ };
236
271
  }
237
272
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTDialogComponent, deps: [{ token: i1.ConfirmationService }, { token: i1.MessageService }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
238
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTDialogComponent, selector: "pt-dialog", inputs: { dialogConfig: "dialogConfig" }, outputs: { confirm: "confirm", cancel: "cancel" }, providers: [ConfirmationService, MessageService], usesOnChanges: true, ngImport: i0, template: "<div class=\"pt-dialog\">\n <p-confirmDialog>\n <!-- Header with Icon and Title aligned horizontally -->\n <ng-template pTemplate=\"header\">\n <div class=\"popup-header bordered-section\">\n <i [class]=\"getDialogIconClass()\" [ngStyle]=\"getDialogIconStyle()\"></i>\n <span class=\"popup-title\" [ngStyle]=\"getDialogHeaderStyle()\">\n {{ getDialogHeaderText() }}\n </span>\n </div>\n </ng-template>\n\n <!-- Message Content with Divider -->\n <ng-template pTemplate=\"message\" let-message>\n <div\n class=\"popup-content bordered-section\"\n [ngStyle]=\"getDialogContentStyle()\"\n >\n <p>{{ getDialogContentText() }}</p>\n </div>\n </ng-template>\n </p-confirmDialog>\n</div>\n", styles: ["::ng-deep .pt-dialog .p-dialog .p-dialog-header{padding-bottom:0}::ng-deep .pt-dialog .p-dialog .p-dialog-content{padding:0}::ng-deep .pt-dialog .full-width-button{width:100%;display:block;text-align:center}::ng-deep .pt-dialog .p-dialog-footer{display:flex;justify-content:center;gap:10px;width:100%;padding:10px}::ng-deep .pt-dialog .p-confirm-dialog-accept,::ng-deep .pt-dialog .p-confirm-dialog-reject{flex:1;max-width:50%;text-align:center;display:flex;justify-content:center;align-items:center;height:40px}::ng-deep .pt-dialog .p-confirm-dialog-accept i,::ng-deep .pt-dialog .p-confirm-dialog-reject i{margin-right:5px}::ng-deep .pt-dialog .p-confirm-dialog-accept .p-button-label,::ng-deep .pt-dialog .p-confirm-dialog-reject .p-button-label{font-weight:700;flex-grow:1;text-align:center}.pt-dialog .popup-header{display:flex;align-items:center;gap:10px;font-size:1.2rem;font-weight:700;padding-bottom:10px;width:100%}.pt-dialog .popup-title{color:#333;font-size:1.2rem}.pt-dialog .bordered-section{width:100%;border-bottom:1px solid rgba(0,0,0,.2);padding-bottom:10px;margin-bottom:10px}.pt-dialog .popup-content{display:flex;justify-content:center;text-align:center;padding:15px;width:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i3.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }] }); }
273
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTDialogComponent, selector: "pt-dialog", inputs: { dialogConfig: "dialogConfig" }, outputs: { confirm: "confirm", cancel: "cancel" }, providers: [ConfirmationService, MessageService], usesOnChanges: true, ngImport: i0, template: "<div class=\"pt-dialog\">\n <p-confirmDialog #cd>\n <ng-template pTemplate=\"header\"></ng-template>\n\n <ng-template pTemplate=\"message\">\n <div class=\"pt-dialog-card\">\n <div class=\"pt-dialog-card-top\">\n <div class=\"pt-dialog-icon-wrapper\">\n <i\n class=\"pt-dialog-icon\"\n [class]=\"getDialogIconClass()\"\n [ngStyle]=\"getDialogIconStyle()\"\n ></i>\n </div>\n\n <div class=\"pt-dialog-text-wrapper\">\n <div class=\"pt-dialog-title\" [ngStyle]=\"getDialogHeaderStyle()\">\n {{ getDialogHeaderText() }}\n </div>\n\n <div class=\"pt-dialog-message\" [ngStyle]=\"getDialogContentStyle()\">\n {{ getDialogContentText() }}\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"pt-dialog-footer-buttons\">\n <pt-button\n *ngIf=\"dialogConfig.cancelButtonConfig\"\n [buttonConfig]=\"cancelButtonModel\"\n (click)=\"cd.reject()\"\n ></pt-button>\n\n <pt-button\n *ngIf=\"dialogConfig.confirmButtonConfig\"\n [buttonConfig]=\"confirmButtonModel\"\n (click)=\"cd.accept()\"\n ></pt-button>\n </div>\n </ng-template>\n </p-confirmDialog>\n</div>\n", styles: ["::ng-deep .p-confirm-dialog.pt-dialog-overlay{border-radius:18px;overflow:hidden;box-shadow:0 20px 45px #0f172a59}::ng-deep .p-confirm-dialog.pt-dialog-overlay .p-dialog-header{display:none!important;padding:0!important;border:0!important}::ng-deep .p-confirm-dialog.pt-dialog-overlay .p-dialog-content{padding:0;background:transparent;border-top-left-radius:18px;border-top-right-radius:18px}.pt-dialog-card{border-radius:18px 18px 0 0;overflow:hidden}.pt-dialog-card-top{padding:28px 40px;display:flex;align-items:flex-start}::ng-deep .p-confirm-dialog.pt-dialog-danger .pt-dialog-card{background-color:#fde4e4}::ng-deep .p-confirm-dialog.pt-dialog-warning .pt-dialog-card{background-color:#fff4d1}::ng-deep .p-confirm-dialog.pt-dialog-success .pt-dialog-card{background-color:#dcfce7}::ng-deep .p-confirm-dialog.pt-dialog-info .pt-dialog-card{background-color:#e0f2fe}.pt-dialog-icon-wrapper{width:60px;height:60px;border-radius:50%;display:flex;align-items:center;justify-content:center;margin-right:18px;box-sizing:border-box}.pt-dialog-icon{font-size:30px;line-height:1;color:#b91c1c}.pt-dialog-text-wrapper{flex:1}.pt-dialog-title{font-size:22px;font-weight:700;margin-bottom:8px;color:#b91c1c}.pt-dialog-message{font-size:18px;line-height:1.5;color:#4b5563}::ng-deep .p-confirm-dialog.pt-dialog-overlay .p-dialog-footer{background:#fff;border-top:1px solid rgba(148,163,184,.25);padding:16px 32px 22px}.pt-dialog-footer-buttons{display:flex;justify-content:center;gap:16px}::ng-deep .p-confirm-dialog .p-dialog-footer .p-button{border-radius:9999px;padding:.75rem 1.8rem;font-weight:600}::ng-deep .p-confirm-dialog .p-dialog-footer .p-button i.pi{margin-right:.5rem}::ng-deep .p-confirm-dialog.pt-dialog-danger .p-dialog-footer .p-button{background:#fff!important;border-color:#dc2626!important;color:#dc2626!important}::ng-deep .p-confirm-dialog.pt-dialog-warning .p-dialog-footer .p-button{background:#fff!important;border-color:#d97706!important;color:#b45309!important}::ng-deep .p-confirm-dialog.pt-dialog-success .p-dialog-footer .p-button{background:#fff!important;border-color:#16a34a!important;color:#15803d!important}::ng-deep .p-confirm-dialog.pt-dialog-info .p-dialog-footer .p-button{background:#fff!important;border-color:#2563eb!important;color:#2563eb!important}::ng-deep .p-confirm-dialog.pt-dialog-info .p-dialog-footer .p-button:hover{background:#eff6ff!important}::ng-deep .p-confirm-dialog.pt-dialog-overlay .p-dialog-content{padding:0;background:transparent;border-top-left-radius:18px;border-top-right-radius:18px;display:block}.pt-dialog-card{border-radius:18px 18px 0 0;overflow:hidden;width:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i3.PTButtonComponent, selector: "pt-button", inputs: ["buttonConfig"] }, { kind: "component", type: i4.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }] }); }
239
274
  }
240
275
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTDialogComponent, decorators: [{
241
276
  type: Component,
242
- args: [{ selector: 'pt-dialog', providers: [ConfirmationService, MessageService], template: "<div class=\"pt-dialog\">\n <p-confirmDialog>\n <!-- Header with Icon and Title aligned horizontally -->\n <ng-template pTemplate=\"header\">\n <div class=\"popup-header bordered-section\">\n <i [class]=\"getDialogIconClass()\" [ngStyle]=\"getDialogIconStyle()\"></i>\n <span class=\"popup-title\" [ngStyle]=\"getDialogHeaderStyle()\">\n {{ getDialogHeaderText() }}\n </span>\n </div>\n </ng-template>\n\n <!-- Message Content with Divider -->\n <ng-template pTemplate=\"message\" let-message>\n <div\n class=\"popup-content bordered-section\"\n [ngStyle]=\"getDialogContentStyle()\"\n >\n <p>{{ getDialogContentText() }}</p>\n </div>\n </ng-template>\n </p-confirmDialog>\n</div>\n", styles: ["::ng-deep .pt-dialog .p-dialog .p-dialog-header{padding-bottom:0}::ng-deep .pt-dialog .p-dialog .p-dialog-content{padding:0}::ng-deep .pt-dialog .full-width-button{width:100%;display:block;text-align:center}::ng-deep .pt-dialog .p-dialog-footer{display:flex;justify-content:center;gap:10px;width:100%;padding:10px}::ng-deep .pt-dialog .p-confirm-dialog-accept,::ng-deep .pt-dialog .p-confirm-dialog-reject{flex:1;max-width:50%;text-align:center;display:flex;justify-content:center;align-items:center;height:40px}::ng-deep .pt-dialog .p-confirm-dialog-accept i,::ng-deep .pt-dialog .p-confirm-dialog-reject i{margin-right:5px}::ng-deep .pt-dialog .p-confirm-dialog-accept .p-button-label,::ng-deep .pt-dialog .p-confirm-dialog-reject .p-button-label{font-weight:700;flex-grow:1;text-align:center}.pt-dialog .popup-header{display:flex;align-items:center;gap:10px;font-size:1.2rem;font-weight:700;padding-bottom:10px;width:100%}.pt-dialog .popup-title{color:#333;font-size:1.2rem}.pt-dialog .bordered-section{width:100%;border-bottom:1px solid rgba(0,0,0,.2);padding-bottom:10px;margin-bottom:10px}.pt-dialog .popup-content{display:flex;justify-content:center;text-align:center;padding:15px;width:100%}\n"] }]
277
+ args: [{ selector: 'pt-dialog', providers: [ConfirmationService, MessageService], template: "<div class=\"pt-dialog\">\n <p-confirmDialog #cd>\n <ng-template pTemplate=\"header\"></ng-template>\n\n <ng-template pTemplate=\"message\">\n <div class=\"pt-dialog-card\">\n <div class=\"pt-dialog-card-top\">\n <div class=\"pt-dialog-icon-wrapper\">\n <i\n class=\"pt-dialog-icon\"\n [class]=\"getDialogIconClass()\"\n [ngStyle]=\"getDialogIconStyle()\"\n ></i>\n </div>\n\n <div class=\"pt-dialog-text-wrapper\">\n <div class=\"pt-dialog-title\" [ngStyle]=\"getDialogHeaderStyle()\">\n {{ getDialogHeaderText() }}\n </div>\n\n <div class=\"pt-dialog-message\" [ngStyle]=\"getDialogContentStyle()\">\n {{ getDialogContentText() }}\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"pt-dialog-footer-buttons\">\n <pt-button\n *ngIf=\"dialogConfig.cancelButtonConfig\"\n [buttonConfig]=\"cancelButtonModel\"\n (click)=\"cd.reject()\"\n ></pt-button>\n\n <pt-button\n *ngIf=\"dialogConfig.confirmButtonConfig\"\n [buttonConfig]=\"confirmButtonModel\"\n (click)=\"cd.accept()\"\n ></pt-button>\n </div>\n </ng-template>\n </p-confirmDialog>\n</div>\n", styles: ["::ng-deep .p-confirm-dialog.pt-dialog-overlay{border-radius:18px;overflow:hidden;box-shadow:0 20px 45px #0f172a59}::ng-deep .p-confirm-dialog.pt-dialog-overlay .p-dialog-header{display:none!important;padding:0!important;border:0!important}::ng-deep .p-confirm-dialog.pt-dialog-overlay .p-dialog-content{padding:0;background:transparent;border-top-left-radius:18px;border-top-right-radius:18px}.pt-dialog-card{border-radius:18px 18px 0 0;overflow:hidden}.pt-dialog-card-top{padding:28px 40px;display:flex;align-items:flex-start}::ng-deep .p-confirm-dialog.pt-dialog-danger .pt-dialog-card{background-color:#fde4e4}::ng-deep .p-confirm-dialog.pt-dialog-warning .pt-dialog-card{background-color:#fff4d1}::ng-deep .p-confirm-dialog.pt-dialog-success .pt-dialog-card{background-color:#dcfce7}::ng-deep .p-confirm-dialog.pt-dialog-info .pt-dialog-card{background-color:#e0f2fe}.pt-dialog-icon-wrapper{width:60px;height:60px;border-radius:50%;display:flex;align-items:center;justify-content:center;margin-right:18px;box-sizing:border-box}.pt-dialog-icon{font-size:30px;line-height:1;color:#b91c1c}.pt-dialog-text-wrapper{flex:1}.pt-dialog-title{font-size:22px;font-weight:700;margin-bottom:8px;color:#b91c1c}.pt-dialog-message{font-size:18px;line-height:1.5;color:#4b5563}::ng-deep .p-confirm-dialog.pt-dialog-overlay .p-dialog-footer{background:#fff;border-top:1px solid rgba(148,163,184,.25);padding:16px 32px 22px}.pt-dialog-footer-buttons{display:flex;justify-content:center;gap:16px}::ng-deep .p-confirm-dialog .p-dialog-footer .p-button{border-radius:9999px;padding:.75rem 1.8rem;font-weight:600}::ng-deep .p-confirm-dialog .p-dialog-footer .p-button i.pi{margin-right:.5rem}::ng-deep .p-confirm-dialog.pt-dialog-danger .p-dialog-footer .p-button{background:#fff!important;border-color:#dc2626!important;color:#dc2626!important}::ng-deep .p-confirm-dialog.pt-dialog-warning .p-dialog-footer .p-button{background:#fff!important;border-color:#d97706!important;color:#b45309!important}::ng-deep .p-confirm-dialog.pt-dialog-success .p-dialog-footer .p-button{background:#fff!important;border-color:#16a34a!important;color:#15803d!important}::ng-deep .p-confirm-dialog.pt-dialog-info .p-dialog-footer .p-button{background:#fff!important;border-color:#2563eb!important;color:#2563eb!important}::ng-deep .p-confirm-dialog.pt-dialog-info .p-dialog-footer .p-button:hover{background:#eff6ff!important}::ng-deep .p-confirm-dialog.pt-dialog-overlay .p-dialog-content{padding:0;background:transparent;border-top-left-radius:18px;border-top-right-radius:18px;display:block}.pt-dialog-card{border-radius:18px 18px 0 0;overflow:hidden;width:100%}\n"] }]
243
278
  }], ctorParameters: () => [{ type: i1.ConfirmationService }, { type: i1.MessageService }, { type: i0.Renderer2 }, { type: i0.ElementRef }], propDecorators: { dialogConfig: [{
244
279
  type: Input
245
280
  }], confirm: [{
@@ -247,4 +282,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
247
282
  }], cancel: [{
248
283
  type: Output
249
284
  }] } });
250
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXByaW1lLXRvb2xzL3NyYy9saWIvcHQtZGlhbG9nL3B0LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWRpYWxvZy9wdC1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FLYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGdCQUFnQixFQUNoQixjQUFjLEdBQ2YsTUFBTSxhQUFhLENBQUM7QUFJckIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7QUFFeEMsNENBQTRDO0FBQzVDLE1BQU0sYUFBYSxHQUFnRDtJQUNqRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN0QixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDN0MsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLDRCQUE0QixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDakUsbUJBQW1CLEVBQUUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7UUFDdEUsa0JBQWtCLEVBQUUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7S0FDdEU7SUFDRCxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN0QixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDN0MsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLDJC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LFlBQVksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDbkUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksTUFBTTtnQkFDcEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksTUFBTTthQUN0QztZQUNILENBQUMsQ0FBQztnQkFDRSxLQUFLLEVBQ0gsT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNO2dCQUNqRSxRQUFRLEVBQUUsTUFBTTtnQkFDaEIsU0FBUyxFQUFFLE1BQU07YUFDbEIsQ0FBQztJQUNSLENBQUM7K0dBM09VLGlCQUFpQjttR0FBakIsaUJBQWlCLGlJQUZqQixDQUFDLG1CQUFtQixFQUFFLGNBQWMsQ0FBQywrQ0N4RWxELDR3QkF1QkE7OzRGRG1EYSxpQkFBaUI7a0JBTjdCLFNBQVM7K0JBQ0UsV0FBVyxhQUdWLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO3NLQUd2QyxZQUFZO3NCQUFwQixLQUFLO2dCQUNJLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFJlbmRlcmVyMixcbiAgRWxlbWVudFJlZixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25DaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbmZpcm1hdGlvblNlcnZpY2UsXG4gIENvbmZpcm1FdmVudFR5cGUsXG4gIE1lc3NhZ2VTZXJ2aWNlLFxufSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBEaWFsb2dDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvZGlhbG9nLWNvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBCdXR0b25Nb2RlbCB9IGZyb20gJy4uL21vZGVscy9idXR0b24ubW9kZWwnO1xuaW1wb3J0IHsgSWNvblN0eWxlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IFNldmVyaXR5RW51bSB9IGZyb20gJy4uL2VudW1zJztcblxuLy8gRGVmYXVsdCBTdHlsZXMgZm9yIERpZmZlcmVudCBEaWFsb2cgVHlwZXNcbmNvbnN0IERJQUxPR19TVFlMRVM6IFJlY29yZDxTZXZlcml0eUVudW0sIFBhcnRpYWw8RGlhbG9nQ29uZmlnPj4gPSB7XG4gIFtTZXZlcml0eUVudW0uV0FSTklOR106IHtcbiAgICBoZWFkZXI6IHsgdGV4dDogJ1dhcm5pbmcnLCBjb2xvcjogJyNkOTgzMDAnIH0sXG4gICAgY29udGVudDogeyB0ZXh0OiAnVGhpcyBpcyBhIHdhcm5pbmcgbWVzc2FnZSEnLCBjb2xvcjogJyNkOTgzMDAnIH0sXG4gICAgY29uZmlybUJ1dHRvbkNvbmZpZzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjZDk4MzAwJywgZm9udENvbG9yOiAnI2ZmZicgfSxcbiAgICBjYW5jZWxCdXR0b25Db25maWc6IHsgYmFja2dyb3VuZENvbG9yOiAnIzZjNzU3ZCcsIGZvbnRDb2xvcjogJyNmZmYnIH0sXG4gIH0sXG4gIFtTZXZlcml0eUVudW0uU1VDQ0VTU106IHtcbiAgICBoZWFkZXI6IHsgdGV4dDogJ1N1Y2Nlc3MnLCBjb2xvcjogJyMyOGE3NDUnIH0sXG4gICAgY29udGVudDogeyB0ZXh0OiAnT3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIScsIGNvbG9yOiAnIzI4YTc0NScgfSxcbiAgICBjb25maXJtQnV0dG9uQ29uZmlnOiB7IGJhY2tncm91bmRDb2xvcjogJyMyOGE3NDUnLCBmb250Q29sb3I6ICcjZmZmJyB9LFxuICAgIGNhbmNlbEJ1dHRvbkNvbmZpZzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjNmM3NTdkJywgZm9udENvbG9yOiAnI2ZmZicgfSxcbiAgfSxcbiAgW1NldmVyaXR5RW51bS5EQU5HRVJdOiB7XG4gICAgaGVhZGVyOiB7IHRleHQ6ICdFcnJvcicsIGNvbG9yOiAnI2RjMzU0NScgfSxcbiAgICBjb250ZW50OiB7IHRleHQ6ICdBbiBlcnJvciBvY2N1cnJlZCEnLCBjb2xvcjogJyNkYzM1NDUnIH0sXG4gICAgY29uZmlybUJ1dHRvbkNvbmZpZzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjZGMzNTQ1JywgZm9udENvbG9yOiAnI2ZmZicgfSxcbiAgICBjYW5jZWxCdXR0b25Db25maWc6IHsgYmFja2dyb3VuZENvbG9yOiAnIzZjNzU3ZCcsIGZvbnRDb2xvcjogJyNmZmYnIH0sXG4gIH0sXG4gIFtTZXZlcml0eUVudW0uSU5GT106IHtcbiAgICBoZWFkZXI6IHsgdGV4dDogJ0luZm9ybWF0aW9uJywgY29sb3I6ICcjMDA3YmZmJyB9LFxuICAgIGNvbnRlbnQ6IHsgdGV4dDogJ0hlcmUgaXMgc29tZSBpbXBvcnRhbnQgaW5mb3JtYXRpb24uJywgY29sb3I6ICcjMDA3YmZmJyB9LFxuICAgIGNvbmZpcm1CdXR0b25Db25maWc6IHsgYmFja2dyb3VuZENvbG9yOiAnIzAwN2JmZicsIGZvbnRDb2xvcjogJyNmZmYnIH0sXG4gICAgY2FuY2VsQnV0dG9uQ29uZmlnOiB7IGJhY2tncm91bmRDb2xvcjogJyM2Yzc1N2QnLCBmb250Q29sb3I6ICcjZmZmJyB9LFxuICB9LFxufTtcblxuLy8gQ2VudHJhbGl6ZWQgRGVmYXVsdCBWYWx1ZXNcbmNvbnN0IERFRkFVTFRfRElBTE9HX0NPTkZJRzogRGlhbG9nQ29uZmlnID0ge1xuICBoZWFkZXI6IHsgdGV4dDogJ0NvbmZpcm1hdGlvbicgfSxcbiAgdmlzaWJsZTogZmFsc2UsXG4gIHdpZHRoOiAnNDAwcHgnLFxuICBoZWlnaHQ6ICdhdXRvJyxcbiAgY29udGVudDogJ0RvIHlvdSB3YW50IHRvIHByb2NlZWQ/JyxcbiAgY29uZmlybUJ1dHRvbkNvbmZpZzoge1xuICAgIGxhYmVsOiAnQ29uZmlybScsXG4gICAgZm9udENvbG9yOiAnI2ZmZicsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnIzAwN2JmZicsXG4gIH0sXG4gIGNhbmNlbEJ1dHRvbkNvbmZpZzoge1xuICAgIGxhYmVsOiAnQ2FuY2VsJyxcbiAgICBmb250Q29sb3I6ICcjZmZmJyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjNmM3NTdkJyxcbiAgfSxcbiAgZGlhbG9nU3R5bGU6IFNldmVyaXR5RW51bS5JTkZPLFxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHQtZGlhbG9nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3B0LWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3B0LWRpYWxvZy5jb21wb25lbnQuY3NzJ10sXG4gIHByb3ZpZGVyczogW0NvbmZpcm1hdGlvblNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgUFREaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkaWFsb2dDb25maWc6IERpYWxvZ0NvbmZpZyA9IHsgLi4uREVGQVVMVF9ESUFMT0dfQ09ORklHIH07XG4gIEBPdXRwdXQoKSBjb25maXJtOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBjYW5jZWw6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZGlhbG9nQ29uZmlnJ10pIHtcbiAgICAgIGlmIChcbiAgICAgICAgY2hhbmdlc1snZGlhbG9nQ29uZmlnJ10uY3VycmVudFZhbHVlPy5kaWFsb2dTdHlsZSAhPT1cbiAgICAgICAgY2hhbmdlc1snZGlhbG9nQ29uZmlnJ10ucHJldmlvdXNWYWx1ZT8uZGlhbG9nU3R5bGVcbiAgICAgICkge1xuICAgICAgICB0aGlzLmFwcGx5RGlhbG9nU3R5bGUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGlhbG9nQ29uZmlnLnZpc2libGUpIHtcbiAgICAgICAgdGhpcy5zaG93RGlhbG9nKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseURpYWxvZ1N0eWxlKCk6IHZvaWQge1xuICAgIGNvbnN0IGRpYWxvZ1N0eWxlID0gdGhpcy5kaWFsb2dDb25maWcuZGlhbG9nU3R5bGUgfHwgU2V2ZXJpdHlFbnVtLklORk87XG4gICAgY29uc3Qgc3R5bGVDb25maWcgPSBESUFMT0dfU1RZTEVTW2RpYWxvZ1N0eWxlXSB8fCB7fTtcblxuICAgIHRoaXMuZGlhbG9nQ29uZmlnID0ge1xuICAgICAgLi4uREVGQVVMVF9ESUFMT0dfQ09ORklHLFxuICAgICAgLi4uc3R5bGVDb25maWcsXG4gICAgICBjb25maXJtQnV0dG9uQ29uZmlnOiB7XG4gICAgICAgIC4uLkRFRkFVTFRfRElBTE9HX0NPTkZJRy5jb25maXJtQnV0dG9uQ29uZmlnLFxuICAgICAgICAuLi5zdHlsZUNvbmZpZy5jb25maXJtQnV0dG9uQ29uZmlnLFxuICAgICAgfSxcbiAgICAgIGNhbmNlbEJ1dHRvbkNvbmZpZzoge1xuICAgICAgICAuLi5ERUZBVUxUX0RJQUxPR19DT05GSUcuY2FuY2VsQnV0dG9uQ29uZmlnLFxuICAgICAgICAuLi5zdHlsZUNvbmZpZy5jYW5jZWxCdXR0b25Db25maWcsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzaG93RGlhbG9nKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIGhlYWRlcjogdGhpcy5nZXREaWFsb2dIZWFkZXJUZXh0KCksXG4gICAgICBtZXNzYWdlOiB0aGlzLmdldERpYWxvZ0NvbnRlbnRUZXh0KCksXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5kaWFsb2dDb25maWcuY29uZmlybUJ1dHRvbkNvbmZpZz8ubGFiZWwgfHwgJ0NvbmZpcm0nLFxuICAgICAgcmVqZWN0TGFiZWw6IHRoaXMuZGlhbG9nQ29uZmlnLmNhbmNlbEJ1dHRvbkNvbmZpZz8ubGFiZWwgfHwgJ0NhbmNlbCcsXG4gICAgICBhY2NlcHRCdXR0b25TdHlsZUNsYXNzOiB0aGlzLmdldEJ1dHRvblN0eWxlKFxuICAgICAgICB0aGlzLmRpYWxvZ0NvbmZpZy5jb25maXJtQnV0dG9uQ29uZmlnLFxuICAgICAgICB0cnVlXG4gICAgICApLFxuICAgICAgcmVqZWN0QnV0dG9uU3R5bGVDbGFzczogdGhpcy5nZXRCdXR0b25TdHlsZShcbiAgICAgICAgdGhpcy5kaWFsb2dDb25maWcuY2FuY2VsQnV0dG9uQ29uZmlnLFxuICAgICAgICBmYWxzZVxuICAgICAgKSxcbiAgICAgIGFjY2VwdEljb246IHRoaXMuZGlhbG9nQ29uZmlnLmNvbmZpcm1CdXR0b25Db25maWc/Lmljb24gfHwgJ3BpIHBpLWNoZWNrJyxcbiAgICAgIHJlamVjdEljb246IHRoaXMuZGlhbG9nQ29uZmlnLmNhbmNlbEJ1dHRvbkNvbmZpZz8uaWNvbiB8fCAncGkgcGktdGltZXMnLFxuICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29uZmlybS5lbWl0KCk7XG4gICAgICAgIGlmICh0aGlzLmRpYWxvZ0NvbmZpZy50b2FzdE9uQ29uZmlybSkge1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVqZWN0OiAodHlwZTogQ29uZmlybUV2ZW50VHlwZSkgPT4ge1xuICAgICAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlID09PSBDb25maXJtRXZlbnRUeXBlLlJFSkVDVCAmJlxuICAgICAgICAgIHRoaXMuZGlhbG9nQ29uZmlnLnRvYXN0T25DYW5jZWxcbiAgICAgICAgKSB7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBVc2UgcmVuZGVyZXIgdG8gYXBwbHkgZHluYW1pYyBzdHlsZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ0VsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGlhbG9nJyk7XG4gICAgICBpZiAoZGlhbG9nRWxlbWVudCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIGRpYWxvZ0VsZW1lbnQsXG4gICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICB0aGlzLmRpYWxvZ0NvbmZpZy53aWR0aCB8fCAnNDAwcHgnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgZGlhbG9nRWxlbWVudCxcbiAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICB0aGlzLmRpYWxvZ0NvbmZpZy5oZWlnaHQgfHwgJ2F1dG8nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGdldEJ1dHRvblN0eWxlKFxuICAgIGJ1dHRvbkNvbmZpZz86IEJ1dHRvbk1vZGVsLFxuICAgIGlzQ29uZmlybTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHN0eWxlQ2xhc3MgPSBidXR0b25Db25maWc/LnN0eWxlQ2xhc3MgPz8gJ3AtYnV0dG9uLXNtJztcblxuICAgIC8vIOKchSBBcHBseSB3aWR0aCBkeW5hbWljYWxseSBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gMTAwJVxuICAgIGNvbnN0IGJ1dHRvbldpZHRoID0gYnV0dG9uQ29uZmlnPy53aWR0aCA/PyAnMTAwJSc7XG5cbiAgICAvLyDinIUgU2V0IGRlZmF1bHQgc2V2ZXJpdHk6IFNVQ0NFU1MgZm9yIGNvbmZpcm0sIFNFQ09OREFSWSBmb3IgY2FuY2VsXG4gICAgY29uc3QgZGVmYXVsdFNldmVyaXR5ID0gaXNDb25maXJtID8gU2V2ZXJpdHlFbnVtLkRBTkdFUiA6IFNldmVyaXR5RW51bS5JTkZPO1xuICAgIGNvbnN0IHNldmVyaXR5ID0gYnV0dG9uQ29uZmlnPy5zZXZlcml0eSA/PyBkZWZhdWx0U2V2ZXJpdHk7XG5cbiAgICAvLyDinIUgQXBwbHkgc2V2ZXJpdHktYmFzZWQgc3R5bGVzIG9ubHkgaWYgbm8gY3VzdG9tIGJhY2tncm91bmQgY29sb3IgaXMgc2V0XG4gICAgaWYgKCFidXR0b25Db25maWc/LmJhY2tncm91bmRDb2xvcikge1xuICAgICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIFNldmVyaXR5RW51bS5XQVJOSU5HOlxuICAgICAgICAgIHN0eWxlQ2xhc3MgKz0gJyBwLWJ1dHRvbi13YXJuaW5nJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTZXZlcml0eUVudW0uREFOR0VSOlxuICAgICAgICAgIHN0eWxlQ2xhc3MgKz0gJyBwLWJ1dHRvbi1kYW5nZXInO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNldmVyaXR5RW51bS5TVUNDRVNTOlxuICAgICAgICAgIHN0eWxlQ2xhc3MgKz0gJyBwLWJ1dHRvbi1zdWNjZXNzJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTZXZlcml0eUVudW0uSU5GTzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBzdHlsZUNsYXNzICs9ICcgcC1idXR0b24tc2Vjb25kYXJ5JztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYCR7c3R5bGVDbGFzcy50cmltKCl9IHdpZHRoLSR7YnV0dG9uV2lkdGgucmVwbGFjZSgnJScsICcnKX1gO1xuICB9XG5cbiAgZ2V0RGlhbG9nSGVhZGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZGlhbG9nQ29uZmlnLmhlYWRlcjtcbiAgICBjb25zdCBkaWFsb2dTdHlsZSA9IHRoaXMuZGlhbG9nQ29uZmlnLmRpYWxvZ1N0eWxlID8/IFNldmVyaXR5RW51bS5JTkZPO1xuICAgIGNvbnN0IHN0eWxlSGVhZGVyID0gRElBTE9HX1NUWUxFU1tkaWFsb2dTdHlsZV0/LmhlYWRlcjtcblxuICAgIHJldHVybiB0eXBlb2YgaGVhZGVyID09PSAnb2JqZWN0JyAmJiBoZWFkZXIgIT09IG51bGwgJiYgJ3RleHQnIGluIGhlYWRlclxuICAgICAgPyBoZWFkZXIudGV4dFxuICAgICAgOiB0eXBlb2YgaGVhZGVyID09PSAnc3RyaW5nJ1xuICAgICAgPyBoZWFkZXJcbiAgICAgIDogdHlwZW9mIHN0eWxlSGVhZGVyID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBzdHlsZUhlYWRlciAhPT0gbnVsbCAmJlxuICAgICAgICAndGV4dCcgaW4gc3R5bGVIZWFkZXJcbiAgICAgID8gc3R5bGVIZWFkZXIudGV4dFxuICAgICAgOiAnQ29uZmlybWF0aW9uJzsgLy8g4pyFIERlZmF1bHQgdmFsdWVcbiAgfVxuXG4gIGdldERpYWxvZ0hlYWRlclN0eWxlKCk6IGFueSB7XG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5kaWFsb2dDb25maWcuaGVhZGVyO1xuICAgIGNvbnN0IGRpYWxvZ1N0eWxlID0gdGhpcy5kaWFsb2dDb25maWcuZGlhbG9nU3R5bGUgPz8gU2V2ZXJpdHlFbnVtLklORk87XG4gICAgY29uc3Qgc3R5bGVIZWFkZXIgPSBESUFMT0dfU1RZTEVTW2RpYWxvZ1N0eWxlXT8uaGVhZGVyO1xuXG4gICAgcmV0dXJuIHR5cGVvZiBoZWFkZXIgPT09ICdvYmplY3QnICYmIGhlYWRlciAhPT0gbnVsbFxuICAgICAgPyB7XG4gICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICBoZWFkZXIuY29sb3IgfHxcbiAgICAgICAgICAgICh0eXBlb2Ygc3R5bGVIZWFkZXIgPT09ICdvYmplY3QnID8gc3R5bGVIZWFkZXI/LmNvbG9yIDogJyMzMzMnKSxcbiAgICAgICAgICBmb250U2l6ZTogaGVhZGVyLmZvbnRTaXplIHx8ICcyNXB4JyxcbiAgICAgICAgfVxuICAgICAgOiB7XG4gICAgICAgICAgY29sb3I6IHR5cGVvZiBzdHlsZUhlYWRlciA9PT0gJ29iamVjdCcgPyBzdHlsZUhlYWRlcj8uY29sb3IgOiAnIzMzMycsXG4gICAgICAgICAgZm9udFNpemU6ICcyNXB4JyxcbiAgICAgICAgfTtcbiAgfVxuXG4gIGdldERpYWxvZ0ljb25DbGFzcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZGlhbG9nQ29uZmlnLmhlYWRlcjtcbiAgICBjb25zdCBkaWFsb2dTdHlsZSA9IHRoaXMuZGlhbG9nQ29uZmlnLmRpYWxvZ1N0eWxlID8/IFNldmVyaXR5RW51bS5JTkZPOyAvLyDinIUgRW5zdXJlIGRpYWxvZ1N0eWxlIGlzIGFsd2F5cyBkZWZpbmVkXG4gICAgY29uc3Qgc3R5bGVIZWFkZXIgPSBESUFMT0dfU1RZTEVTW2RpYWxvZ1N0eWxlXT8uaGVhZGVyOyAvLyDinIUgU3RvcmUgdGhlIHN0eWxlIGhlYWRlciBzZXBhcmF0ZWx5XG5cbiAgICAvLyDinIUgRW5zdXJlIGhlYWRlci5pY29uIGV4aXN0cyBhbmQgaXMgYW4gb2JqZWN0IGJlZm9yZSBhY2Nlc3NpbmcgLmNvZGVcbiAgICBjb25zdCBpY29uID1cbiAgICAgIHR5cGVvZiBoZWFkZXIgPT09ICdvYmplY3QnICYmIGhlYWRlciAhPT0gbnVsbCAmJiAnaWNvbicgaW4gaGVhZGVyXG4gICAgICAgID8gaGVhZGVyLmljb25cbiAgICAgICAgOiB0eXBlb2Ygc3R5bGVIZWFkZXIgPT09ICdvYmplY3QnICYmICdpY29uJyBpbiBzdHlsZUhlYWRlclxuICAgICAgICA/IHN0eWxlSGVhZGVyLmljb25cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyDinIUgSWYgYGljb25gIGlzIGFuIG9iamVjdCwgZXh0cmFjdCBgLmNvZGVgLCBvdGhlcndpc2UgcmV0dXJuIGFzIHN0cmluZyBvciBkZWZhdWx0IHZhbHVlXG4gICAgcmV0dXJuIHR5cGVvZiBpY29uID09PSAnc3RyaW5nJ1xuICAgICAgPyBpY29uXG4gICAgICA6IChpY29uIGFzIEljb25TdHlsZSk/LmNvZGUgfHwgJ3BpIHBpLWV4Y2xhbWF0aW9uLWNpcmNsZSc7XG4gIH1cblxuICBnZXREaWFsb2dJY29uU3R5bGUoKTogYW55IHtcbiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmRpYWxvZ0NvbmZpZy5oZWFkZXI7XG4gICAgY29uc3QgZGlhbG9nU3R5bGUgPSB0aGlzLmRpYWxvZ0NvbmZpZy5kaWFsb2dTdHlsZSA/PyBTZXZlcml0eUVudW0uSU5GTztcbiAgICBjb25zdCBzdHlsZUhlYWRlciA9IERJQUxPR19TVFlMRVNbZGlhbG9nU3R5bGVdPy5oZWFkZXI7XG5cbiAgICBjb25zdCBpY29uOiBJY29uU3R5bGUgfCB1bmRlZmluZWQgPVxuICAgICAgdHlwZW9mIGhlYWRlciA9PT0gJ29iamVjdCcgJiYgaGVhZGVyICE9PSBudWxsICYmICdpY29uJyBpbiBoZWFkZXJcbiAgICAgICAgPyAoaGVhZGVyLmljb24gYXMgSWNvblN0eWxlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjpcbiAgICAgICAgaWNvbj8uY29sb3IgfHxcbiAgICAgICAgKHR5cGVvZiBzdHlsZUhlYWRlciA9PT0gJ29iamVjdCcgPyBzdHlsZUhlYWRlcj8uY29sb3IgOiAnI2YzOWMxMicpLFxuICAgICAgZm9udFNpemU6IGljb24/LmZvbnRTaXplIHx8ICcxLjVyZW0nLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBpY29uPy5iYWNrZ3JvdW5kQ29sb3IgfHwgJ3RyYW5zcGFyZW50JyxcbiAgICAgIGJvcmRlclJhZGl1czogaWNvbj8uc2hhcGUgPT09ICdjaXJjdWxhcicgPyAnNTAlJyA6ICc0cHgnLFxuICAgICAgcGFkZGluZzogJzVweCcsXG4gICAgfTtcbiAgfVxuXG4gIGdldERpYWxvZ0NvbnRlbnRUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZGlhbG9nQ29uZmlnLmNvbnRlbnQ7XG4gICAgY29uc3QgZGlhbG9nU3R5bGUgPSB0aGlzLmRpYWxvZ0NvbmZpZy5kaWFsb2dTdHlsZSA/PyBTZXZlcml0eUVudW0uSU5GTztcbiAgICBjb25zdCBzdHlsZUNvbnRlbnQgPSBESUFMT0dfU1RZTEVTW2RpYWxvZ1N0eWxlXT8uY29udGVudDtcblxuICAgIHJldHVybiB0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZydcbiAgICAgID8gY29udGVudFxuICAgICAgOiBjb250ZW50Py50ZXh0IHx8XG4gICAgICAgICAgKHR5cGVvZiBzdHlsZUNvbnRlbnQgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IHN0eWxlQ29udGVudD8udGV4dFxuICAgICAgICAgICAgOiAnQXJlIHlvdSBzdXJlPycpO1xuICB9XG5cbiAgZ2V0RGlhbG9nQ29udGVudFN0eWxlKCk6IGFueSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZGlhbG9nQ29uZmlnLmNvbnRlbnQ7XG4gICAgY29uc3QgZGlhbG9nU3R5bGUgPSB0aGlzLmRpYWxvZ0NvbmZpZy5kaWFsb2dTdHlsZSA/PyBTZXZlcml0eUVudW0uSU5GTztcbiAgICBjb25zdCBzdHlsZUNvbnRlbnQgPSBESUFMT0dfU1RZTEVTW2RpYWxvZ1N0eWxlXT8uY29udGVudDtcblxuICAgIHJldHVybiB0eXBlb2YgY29udGVudCA9PT0gJ29iamVjdCcgJiYgY29udGVudCAhPT0gbnVsbFxuICAgICAgPyB7XG4gICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICBjb250ZW50LmNvbG9yIHx8XG4gICAgICAgICAgICAodHlwZW9mIHN0eWxlQ29udGVudCA9PT0gJ29iamVjdCcgPyBzdHlsZUNvbnRlbnQ/LmNvbG9yIDogJyMzMzMnKSxcbiAgICAgICAgICBmb250U2l6ZTogY29udGVudC5mb250U2l6ZSB8fCAnMjBweCcsXG4gICAgICAgICAgdGV4dEFsaWduOiBjb250ZW50LnBvc2l0aW9uIHx8ICdsZWZ0JyxcbiAgICAgICAgfVxuICAgICAgOiB7XG4gICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICB0eXBlb2Ygc3R5bGVDb250ZW50ID09PSAnb2JqZWN0JyA/IHN0eWxlQ29udGVudD8uY29sb3IgOiAnIzMzMycsXG4gICAgICAgICAgZm9udFNpemU6ICcyMHB4JyxcbiAgICAgICAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICAgICAgfTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInB0LWRpYWxvZ1wiPlxuICA8cC1jb25maXJtRGlhbG9nPlxuICAgIDwhLS0gSGVhZGVyIHdpdGggSWNvbiBhbmQgVGl0bGUgYWxpZ25lZCBob3Jpem9udGFsbHkgLS0+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWhlYWRlciBib3JkZXJlZC1zZWN0aW9uXCI+XG4gICAgICAgIDxpIFtjbGFzc109XCJnZXREaWFsb2dJY29uQ2xhc3MoKVwiIFtuZ1N0eWxlXT1cImdldERpYWxvZ0ljb25TdHlsZSgpXCI+PC9pPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBvcHVwLXRpdGxlXCIgW25nU3R5bGVdPVwiZ2V0RGlhbG9nSGVhZGVyU3R5bGUoKVwiPlxuICAgICAgICAgIHt7IGdldERpYWxvZ0hlYWRlclRleHQoKSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBNZXNzYWdlIENvbnRlbnQgd2l0aCBEaXZpZGVyIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJtZXNzYWdlXCIgbGV0LW1lc3NhZ2U+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicG9wdXAtY29udGVudCBib3JkZXJlZC1zZWN0aW9uXCJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0RGlhbG9nQ29udGVudFN0eWxlKClcIlxuICAgICAgPlxuICAgICAgICA8cD57eyBnZXREaWFsb2dDb250ZW50VGV4dCgpIH19PC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9wLWNvbmZpcm1EaWFsb2c+XG48L2Rpdj5cbiJdfQ==
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXByaW1lLXRvb2xzL3NyYy9saWIvcHQtZGlhbG9nL3B0LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWRpYWxvZy9wdC1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FLYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBRW5CLGNBQWMsR0FDZixNQUFNLGFBQWEsQ0FBQztBQUlyQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7Ozs7QUFFeEM7Ozs7R0FJRztBQUNILE1BQU0sYUFBYSxHQUFnRDtJQUNqRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN0QixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7S0FDcEQ7SUFDRCxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN0QixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7S0FDN0M7SUFDRCxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNyQixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7S0FDN0M7SUFDRCxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNuQixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7S0FDbEQ7Q0FDRixDQUFDO0FBRUY7OztHQUdHO0FB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LENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDcEMsQ0FBQztJQUNKLENBQUM7K0dBOVJVLGlCQUFpQjttR0FBakIsaUJBQWlCLGlJQUZqQixDQUFDLG1CQUFtQixFQUFFLGNBQWMsQ0FBQywrQ0MvRGxELDgzQ0E2Q0E7OzRGRG9CYSxpQkFBaUI7a0JBTjdCLFNBQVM7K0JBQ0UsV0FBVyxhQUdWLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO3NLQUd2QyxZQUFZO3NCQUFwQixLQUFLO2dCQUNJLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFJlbmRlcmVyMixcbiAgRWxlbWVudFJlZixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25DaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbmZpcm1hdGlvblNlcnZpY2UsXG4gIENvbmZpcm1FdmVudFR5cGUsXG4gIE1lc3NhZ2VTZXJ2aWNlLFxufSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBEaWFsb2dDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvZGlhbG9nLWNvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBCdXR0b25Nb2RlbCB9IGZyb20gJy4uL21vZGVscy9idXR0b24ubW9kZWwnO1xuaW1wb3J0IHsgSWNvblN0eWxlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IFNldmVyaXR5RW51bSB9IGZyb20gJy4uL2VudW1zJztcblxuLyoqXG4gKiBTdHlsZXMgcGVyIHNldmVyaXR5OlxuICogIC0gT25seSBoZWFkZXIgKHRleHQvY29sb3IpIGlzIHByb3ZpZGVkIGhlcmUuXG4gKiAgLSBObyBkZWZhdWx0IFwiY29udGVudFwiIHRleHQgYW55bW9yZS5cbiAqL1xuY29uc3QgRElBTE9HX1NUWUxFUzogUmVjb3JkPFNldmVyaXR5RW51bSwgUGFydGlhbDxEaWFsb2dDb25maWc+PiA9IHtcbiAgW1NldmVyaXR5RW51bS5XQVJOSU5HXToge1xuICAgIGhlYWRlcjogeyB0ZXh0OiAnQXZlcnRpc3NlbWVudCcsIGNvbG9yOiAnIzhhNGIwMCcgfSxcbiAgfSxcbiAgW1NldmVyaXR5RW51bS5TVUNDRVNTXToge1xuICAgIGhlYWRlcjogeyB0ZXh0OiAnU3VjY8OocycsIGNvbG9yOiAnIzE2NjUzNCcgfSxcbiAgfSxcbiAgW1NldmVyaXR5RW51bS5EQU5HRVJdOiB7XG4gICAgaGVhZGVyOiB7IHRleHQ6ICdFcnJldXInLCBjb2xvcjogJyM3ZjFkMWQnIH0sXG4gIH0sXG4gIFtTZXZlcml0eUVudW0uSU5GT106IHtcbiAgICBoZWFkZXI6IHsgdGV4dDogJ0luZm9ybWF0aW9uJywgY29sb3I6ICcjMjU2M2ViJyB9LFxuICB9LFxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbmZpZzpcbiAqICAtIGNvbnRlbnQgaXMgbm93IGVtcHR5IHN0cmluZyAobm8gZGVmYXVsdCBtZXNzYWdlKS5cbiAqL1xuY29uc3QgREVGQVVMVF9ESUFMT0dfQ09ORklHOiBEaWFsb2dDb25maWcgPSB7XG4gIGhlYWRlcjogeyB0ZXh0OiAnQ29uZmlybWF0aW9uJyB9LFxuICB2aXNpYmxlOiBmYWxzZSxcbiAgd2lkdGg6ICc3MjBweCcsXG4gIGhlaWdodDogJ2F1dG8nLFxuICBjb250ZW50OiAnJywgLy8gbm8gZGVmYXVsdCBtZXNzYWdlXG4gIGNvbmZpcm1CdXR0b25Db25maWc6IHtcbiAgICBsYWJlbDogJ0NvbmZpcm1lcicsXG4gIH0sXG4gIGNhbmNlbEJ1dHRvbkNvbmZpZzoge1xuICAgIGxhYmVsOiAnQW5udWxlcicsXG4gIH0sXG4gIGRpYWxvZ1N0eWxlOiBTZXZlcml0eUVudW0uSU5GTyxcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3B0LWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9wdC1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wdC1kaWFsb2cuY29tcG9uZW50LmNzcyddLFxuICBwcm92aWRlcnM6IFtDb25maXJtYXRpb25TZXJ2aWNlLCBNZXNzYWdlU2VydmljZV0sXG59KVxuZXhwb3J0IGNsYXNzIFBURGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZGlhbG9nQ29uZmlnOiBEaWFsb2dDb25maWcgPSB7IC4uLkRFRkFVTFRfRElBTE9HX0NPTkZJRyB9O1xuICBAT3V0cHV0KCkgY29uZmlybSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBTZXZlcml0eUVudW0gPSBTZXZlcml0eUVudW07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmXG4gICkge31cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RpYWxvZ0NvbmZpZyddKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gY2hhbmdlc1snZGlhbG9nQ29uZmlnJ10uY3VycmVudFZhbHVlIGFzIERpYWxvZ0NvbmZpZztcblxuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzWydkaWFsb2dDb25maWcnXS5wcmV2aW91c1ZhbHVlPy5kaWFsb2dTdHlsZSAhPT1cbiAgICAgICAgY3VycmVudD8uZGlhbG9nU3R5bGVcbiAgICAgICkge1xuICAgICAgICB0aGlzLmFwcGx5RGlhbG9nU3R5bGUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGlhbG9nQ29uZmlnLnZpc2libGUpIHtcbiAgICAgICAgdGhpcy5zaG93RGlhbG9nKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIGRlZmF1bHRzICsgY3VycmVudCBjb25maWcgKyBzZXZlcml0eSBzdHlsZS5cbiAgICogV2UgYXJlIGNhcmVmdWwgTk9UIHRvIHNwcmVhZCBoZWFkZXIgKGl0IGNhbiBiZSBzdHJpbmcgb3Igb2JqZWN0KS5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlEaWFsb2dTdHlsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dTdHlsZSA9IHRoaXMuZGlhbG9nQ29uZmlnLmRpYWxvZ1N0eWxlIHx8IFNldmVyaXR5RW51bS5JTkZPO1xuICAgIGNvbnN0IHN0eWxlQ29uZmlnID0gRElBTE9HX1NUWUxFU1tkaWFsb2dTdHlsZV0gfHwge307XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZGlhbG9nQ29uZmlnO1xuXG4gICAgLy8gRGVjaWRlIHdoaWNoIGhlYWRlciB0byB1c2Ugd2l0aG91dCBzcHJlYWRpbmcgbm9uLW9iamVjdCB0eXBlc1xuICAgIGNvbnN0IG1lcmdlZEhlYWRlciA9XG4gICAgICBjdXJyZW50LmhlYWRlciAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gY3VycmVudC5oZWFkZXJcbiAgICAgICAgOiBzdHlsZUNvbmZpZy5oZWFkZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHN0eWxlQ29uZmlnLmhlYWRlclxuICAgICAgICA6IERFRkFVTFRfRElBTE9HX0NPTkZJRy5oZWFkZXI7XG5cbiAgICB0aGlzLmRpYWxvZ0NvbmZpZyA9IHtcbiAgICAgIC4uLkRFRkFVTFRfRElBTE9HX0NPTkZJRyxcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAuLi5zdHlsZUNvbmZpZyxcbiAgICAgIGhlYWRlcjogbWVyZ2VkSGVhZGVyLFxuICAgICAgY29uZmlybUJ1dHRvbkNvbmZpZzoge1xuICAgICAgICAuLi5ERUZBVUxUX0RJQUxPR19DT05GSUcuY29uZmlybUJ1dHRvbkNvbmZpZyxcbiAgICAgICAgLi4uY3VycmVudC5jb25maXJtQnV0dG9uQ29uZmlnLFxuICAgICAgfSxcbiAgICAgIGNhbmNlbEJ1dHRvbkNvbmZpZzoge1xuICAgICAgICAuLi5ERUZBVUxUX0RJQUxPR19DT05GSUcuY2FuY2VsQnV0dG9uQ29uZmlnLFxuICAgICAgICAuLi5jdXJyZW50LmNhbmNlbEJ1dHRvbkNvbmZpZyxcbiAgICAgIH0sXG4gICAgICB2aXNpYmxlOiBjdXJyZW50LnZpc2libGUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2V2ZXJpdHlDbGFzcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5kaWFsb2dDb25maWcuZGlhbG9nU3R5bGUgPz8gU2V2ZXJpdHlFbnVtLklORk87XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSBTZXZlcml0eUVudW0uREFOR0VSOlxuICAgICAgICByZXR1cm4gJ3B0LWRpYWxvZy1kYW5nZXInO1xuICAgICAgY2FzZSBTZXZlcml0eUVudW0uV0FSTklORzpcbiAgICAgICAgcmV0dXJuICdwdC1kaWFsb2ctd2FybmluZyc7XG4gICAgICBjYXNlIFNldmVyaXR5RW51bS5TVUNDRVNTOlxuICAgICAgICByZXR1cm4gJ3B0LWRpYWxvZy1zdWNjZXNzJztcbiAgICAgIGNhc2UgU2V2ZXJpdHlFbnVtLklORk86XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ3B0LWRpYWxvZy1pbmZvJztcbiAgICB9XG4gIH1cblxuICAvKiogU1VDQ0VTUyAmIElORk8gc2hhcmUgc2FtZSBiZWhhdmlvdXIsIG9ubHkgY29sb3IgZGlmZmVycyAqL1xuICBwcml2YXRlIGdldFNldmVyaXR5Q29sb3JzKCk6IHsgaGVhZGVyOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9IHtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZGlhbG9nQ29uZmlnLmRpYWxvZ1N0eWxlID8/IFNldmVyaXR5RW51bS5JTkZPO1xuXG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSBTZXZlcml0eUVudW0uREFOR0VSOlxuICAgICAgICByZXR1cm4geyBoZWFkZXI6ICcjYjkxYzFjJywgbWVzc2FnZTogJyM0YjU1NjMnIH07XG4gICAgICBjYXNlIFNldmVyaXR5RW51bS5XQVJOSU5HOlxuICAgICAgICByZXR1cm4geyBoZWFkZXI6ICcjYjQ1MzA5JywgbWVzc2FnZTogJyM5MjQwMGUnIH07XG4gICAgICBjYXNlIFNldmVyaXR5RW51bS5TVUNDRVNTOlxuICAgICAgICByZXR1cm4geyBoZWFkZXI6ICcjMTU4MDNkJywgbWVzc2FnZTogJyMxNjY1MzQnIH07XG4gICAgICBjYXNlIFNldmVyaXR5RW51bS5JTkZPOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHsgaGVhZGVyOiAnIzI1NjNlYicsIG1lc3NhZ2U6ICcjMjU2M2ViJyB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBCdXR0b24gbW9kZWxzIGZvciBwdC1idXR0b24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IGNvbmZpcm1CdXR0b25Nb2RlbCgpOiBCdXR0b25Nb2RlbCB7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLmRpYWxvZ0NvbmZpZy5kaWFsb2dTdHlsZSA/PyBTZXZlcml0eUVudW0uSU5GTztcblxuICAgIGNvbnN0IGNvbmZpcm1TZXZlcml0eSA9XG4gICAgICBzdHlsZSA9PT0gU2V2ZXJpdHlFbnVtLkRBTkdFUlxuICAgICAgICA/IFNldmVyaXR5RW51bS5EQU5HRVJcbiAgICAgICAgOiBzdHlsZSA9PT0gU2V2ZXJpdHlFbnVtLldBUk5JTkdcbiAgICAgICAgPyBTZXZlcml0eUVudW0uV0FSTklOR1xuICAgICAgICA6IHN0eWxlID09PSBTZXZlcml0eUVudW0uU1VDQ0VTU1xuICAgICAgICA/IFNldmVyaXR5RW51bS5TVUNDRVNTXG4gICAgICAgIDogU2V2ZXJpdHlFbnVtLklORk87XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IHRoaXMuZGlhbG9nQ29uZmlnLmNvbmZpcm1CdXR0b25Db25maWc/LmxhYmVsID8/ICdDb25maXJtZXInLFxuICAgICAgaWNvbjogdGhpcy5kaWFsb2dDb25maWcuY29uZmlybUJ1dHRvbkNvbmZpZz8uaWNvbiA/PyAncGkgcGktY2hlY2snLFxuICAgICAgaWNvblBvczogJ2xlZnQnLFxuICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICBvdXRsaW5lZDogdHJ1ZSxcbiAgICAgIHNldmVyaXR5OiBjb25maXJtU2V2ZXJpdHksXG4gICAgICBzdHlsZUNsYXNzOlxuICAgICAgICAodGhpcy5kaWFsb2dDb25maWcuY29uZmlybUJ1dHRvbkNvbmZpZz8uc3R5bGVDbGFzcyB8fCAnJykgK1xuICAgICAgICAnIHB0LWRpYWxvZy1jb25maXJtLWJ0bicsXG4gICAgICB3aWR0aDogJ2F1dG8nLFxuICAgIH07XG4gIH1cblxuICBnZXQgY2FuY2VsQnV0dG9uTW9kZWwoKTogQnV0dG9uTW9kZWwge1xuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogdGhpcy5kaWFsb2dDb25maWcuY2FuY2VsQnV0dG9uQ29uZmlnPy5sYWJlbCA/PyAnQW5udWxlcicsXG4gICAgICBpY29uOiB0aGlzLmRpYWxvZ0NvbmZpZy5jYW5jZWxCdXR0b25Db25maWc/Lmljb24gPz8gJ3BpIHBpLXRpbWVzJyxcbiAgICAgIGljb25Qb3M6ICdsZWZ0JyxcbiAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgb3V0bGluZWQ6IHRydWUsXG4gICAgICBzZXZlcml0eTogU2V2ZXJpdHlFbnVtLklORk8sXG4gICAgICBzdHlsZUNsYXNzOlxuICAgICAgICAodGhpcy5kaWFsb2dDb25maWcuY2FuY2VsQnV0dG9uQ29uZmlnPy5zdHlsZUNsYXNzIHx8ICcnKSArXG4gICAgICAgICcgcHQtZGlhbG9nLWNhbmNlbC1idG4nLFxuICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICB9O1xuICB9XG5cbiAgc2hvd0RpYWxvZygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICBoZWFkZXI6ICcnLFxuICAgICAgLy8gbWVzc2FnZSBpcyBub3QgcmVhbGx5IHVzZWQgdmlzdWFsbHksIGJ1dCBrZXB0IGhlcmVcbiAgICAgIG1lc3NhZ2U6IHRoaXMuZ2V0RGlhbG9nQ29udGVudFRleHQoKSxcbiAgICAgIGFjY2VwdDogKCkgPT4gdGhpcy5jb25maXJtLmVtaXQoKSxcbiAgICAgIHJlamVjdDogKF90eXBlOiBDb25maXJtRXZlbnRUeXBlKSA9PiB0aGlzLmNhbmNlbC5lbWl0KCksXG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ0VsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnLnAtY29uZmlybS1kaWFsb2cnXG4gICAgICApIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAgICAgaWYgKGRpYWxvZ0VsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhkaWFsb2dFbGVtZW50LCAncHQtZGlhbG9nLW92ZXJsYXknKTtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGRpYWxvZ0VsZW1lbnQsICdwdC1kaWFsb2ctZGFuZ2VyJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZGlhbG9nRWxlbWVudCwgJ3B0LWRpYWxvZy13YXJuaW5nJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZGlhbG9nRWxlbWVudCwgJ3B0LWRpYWxvZy1zdWNjZXNzJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZGlhbG9nRWxlbWVudCwgJ3B0LWRpYWxvZy1pbmZvJyk7XG5cbiAgICAgICAgY29uc3Qgc2V2ZXJpdHlDbGFzcyA9IHRoaXMuZ2V0U2V2ZXJpdHlDbGFzcygpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGRpYWxvZ0VsZW1lbnQsIHNldmVyaXR5Q2xhc3MpO1xuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgZGlhbG9nRWxlbWVudCxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIHRoaXMuZGlhbG9nQ29uZmlnLndpZHRoIHx8ICc3MjBweCdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICBkaWFsb2dFbGVtZW50LFxuICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgIHRoaXMuZGlhbG9nQ29uZmlnLmhlaWdodCB8fCAnYXV0bydcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBoZWFkZXIgLyBpY29uIC8gY29udGVudCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldERpYWxvZ0hlYWRlclRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmRpYWxvZ0NvbmZpZy5oZWFkZXI7XG4gICAgY29uc3QgZGlhbG9nU3R5bGUgPSB0aGlzLmRpYWxvZ0NvbmZpZy5kaWFsb2dTdHlsZSA/PyBTZXZlcml0eUVudW0uSU5GTztcbiAgICBjb25zdCBzdHlsZUhlYWRlciA9IERJQUxPR19TVFlMRVNbZGlhbG9nU3R5bGVdPy5oZWFkZXI7XG5cbiAgICByZXR1cm4gdHlwZW9mIGhlYWRlciA9PT0gJ29iamVjdCcgJiYgaGVhZGVyICE9PSBudWxsICYmICd0ZXh0JyBpbiBoZWFkZXJcbiAgICAgID8gaGVhZGVyLnRleHRcbiAgICAgIDogdHlwZW9mIGhlYWRlciA9PT0gJ3N0cmluZydcbiAgICAgID8gaGVhZGVyXG4gICAgICA6IHR5cGVvZiBzdHlsZUhlYWRlciA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgc3R5bGVIZWFkZXIgIT09IG51bGwgJiZcbiAgICAgICAgJ3RleHQnIGluIHN0eWxlSGVhZGVyXG4gICAgICA/IHN0eWxlSGVhZGVyLnRleHRcbiAgICAgIDogJ0NvbmZpcm1hdGlvbic7XG4gIH1cblxuICBnZXREaWFsb2dIZWFkZXJTdHlsZSgpOiBhbnkge1xuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZGlhbG9nQ29uZmlnLmhlYWRlcjtcbiAgICBjb25zdCB7IGhlYWRlcjogY29sb3IgfSA9IHRoaXMuZ2V0U2V2ZXJpdHlDb2xvcnMoKTtcblxuICAgIGNvbnN0IGZvbnRTaXplID1cbiAgICAgIHR5cGVvZiBoZWFkZXIgPT09ICdvYmplY3QnICYmIGhlYWRlciAhPT0gbnVsbCAmJiBoZWFkZXIuZm9udFNpemVcbiAgICAgICAgPyBoZWFkZXIuZm9udFNpemVcbiAgICAgICAgOiAnMjBweCc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sb3IsXG4gICAgICBmb250U2l6ZSxcbiAgICAgIGZvbnRXZWlnaHQ6IDcwMCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGlhbG9nSWNvbkNsYXNzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5kaWFsb2dDb25maWcuaGVhZGVyO1xuICAgIGNvbnN0IGRpYWxvZ1N0eWxlID0gdGhpcy5kaWFsb2dDb25maWcuZGlhbG9nU3R5bGUgPz8gU2V2ZXJpdHlFbnVtLklORk87XG4gICAgY29uc3Qgc3R5bGVIZWFkZXIgPSBESUFMT0dfU1RZTEVTW2RpYWxvZ1N0eWxlXT8uaGVhZGVyO1xuXG4gICAgY29uc3QgaWNvbiA9XG4gICAgICB0eXBlb2YgaGVhZGVyID09PSAnb2JqZWN0JyAmJiBoZWFkZXIgIT09IG51bGwgJiYgJ2ljb24nIGluIGhlYWRlclxuICAgICAgICA/IGhlYWRlci5pY29uXG4gICAgICAgIDogdHlwZW9mIHN0eWxlSGVhZGVyID09PSAnb2JqZWN0JyAmJiAnaWNvbicgaW4gc3R5bGVIZWFkZXJcbiAgICAgICAgPyBzdHlsZUhlYWRlci5pY29uXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHR5cGVvZiBpY29uID09PSAnc3RyaW5nJ1xuICAgICAgPyBpY29uXG4gICAgICA6IChpY29uIGFzIEljb25TdHlsZSk/LmNvZGUgfHwgJ3BpIHBpLWV4Y2xhbWF0aW9uLWNpcmNsZSc7XG4gIH1cblxuICBnZXREaWFsb2dJY29uU3R5bGUoKTogYW55IHtcbiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmRpYWxvZ0NvbmZpZy5oZWFkZXI7XG4gICAgY29uc3QgeyBoZWFkZXI6IGRlZmF1bHRDb2xvciB9ID0gdGhpcy5nZXRTZXZlcml0eUNvbG9ycygpO1xuXG4gICAgY29uc3QgaWNvbjogSWNvblN0eWxlIHwgdW5kZWZpbmVkID1cbiAgICAgIHR5cGVvZiBoZWFkZXIgPT09ICdvYmplY3QnICYmIGhlYWRlciAhPT0gbnVsbCAmJiAnaWNvbicgaW4gaGVhZGVyXG4gICAgICAgID8gKGhlYWRlci5pY29uIGFzIEljb25TdHlsZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IGljb24/LmNvbG9yIHx8IGRlZmF1bHRDb2xvcixcbiAgICAgIGZvbnRTaXplOiBpY29uPy5mb250U2l6ZSB8fCAnMi4ycmVtJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE5vIGRlZmF1bHQgdGV4dCBhbnltb3JlLlxuICAgKiAtIElmIGRpYWxvZ0NvbmZpZy5jb250ZW50IGlzIGEgc3RyaW5nLCB3ZSByZXR1cm4gaXQuXG4gICAqIC0gSWYgaXQgaXMgYW4gb2JqZWN0IHdpdGggdGV4dCwgd2UgdXNlIHRoYXQuXG4gICAqIC0gT3RoZXJ3aXNlIHdlIHJldHVybiAnJyAoZW1wdHkpIHNvIHRoZSBib2R5IGlzIGJsYW5rLlxuICAgKi9cbiAgZ2V0RGlhbG9nQ29udGVudFRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5kaWFsb2dDb25maWcuY29udGVudDtcblxuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cblxuICAgIGlmIChjb250ZW50ICYmIHR5cGVvZiBjb250ZW50ID09PSAnb2JqZWN0JyAmJiAndGV4dCcgaW4gY29udGVudCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQudGV4dCA/PyAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBnZXREaWFsb2dDb250ZW50U3R5bGUoKTogYW55IHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5kaWFsb2dDb25maWcuY29udGVudDtcbiAgICBjb25zdCB7IG1lc3NhZ2UgfSA9IHRoaXMuZ2V0U2V2ZXJpdHlDb2xvcnMoKTtcblxuICAgIGxldCBmb250U2l6ZSA9ICcxOHB4JztcbiAgICBsZXQgdGV4dEFsaWduOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdvYmplY3QnICYmIGNvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgIGlmIChjb250ZW50LmZvbnRTaXplKSB7XG4gICAgICAgIGZvbnRTaXplID0gY29udGVudC5mb250U2l6ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZW50LnBvc2l0aW9uKSB7XG4gICAgICAgIHRleHRBbGlnbiA9IGNvbnRlbnQucG9zaXRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbG9yOiBtZXNzYWdlLFxuICAgICAgZm9udFNpemUsXG4gICAgICAuLi4odGV4dEFsaWduID8geyB0ZXh0QWxpZ24gfSA6IHt9KSxcbiAgICB9O1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicHQtZGlhbG9nXCI+XG4gIDxwLWNvbmZpcm1EaWFsb2cgI2NkPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj48L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm1lc3NhZ2VcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwdC1kaWFsb2ctY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHQtZGlhbG9nLWNhcmQtdG9wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInB0LWRpYWxvZy1pY29uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwicHQtZGlhbG9nLWljb25cIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0RGlhbG9nSWNvbkNsYXNzKClcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXREaWFsb2dJY29uU3R5bGUoKVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInB0LWRpYWxvZy10ZXh0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC1kaWFsb2ctdGl0bGVcIiBbbmdTdHlsZV09XCJnZXREaWFsb2dIZWFkZXJTdHlsZSgpXCI+XG4gICAgICAgICAgICAgIHt7IGdldERpYWxvZ0hlYWRlclRleHQoKSB9fVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC1kaWFsb2ctbWVzc2FnZVwiIFtuZ1N0eWxlXT1cImdldERpYWxvZ0NvbnRlbnRTdHlsZSgpXCI+XG4gICAgICAgICAgICAgIHt7IGdldERpYWxvZ0NvbnRlbnRUZXh0KCkgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicHQtZGlhbG9nLWZvb3Rlci1idXR0b25zXCI+XG4gICAgICAgIDxwdC1idXR0b25cbiAgICAgICAgICAqbmdJZj1cImRpYWxvZ0NvbmZpZy5jYW5jZWxCdXR0b25Db25maWdcIlxuICAgICAgICAgIFtidXR0b25Db25maWddPVwiY2FuY2VsQnV0dG9uTW9kZWxcIlxuICAgICAgICAgIChjbGljayk9XCJjZC5yZWplY3QoKVwiXG4gICAgICAgID48L3B0LWJ1dHRvbj5cblxuICAgICAgICA8cHQtYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJkaWFsb2dDb25maWcuY29uZmlybUJ1dHRvbkNvbmZpZ1wiXG4gICAgICAgICAgW2J1dHRvbkNvbmZpZ109XCJjb25maXJtQnV0dG9uTW9kZWxcIlxuICAgICAgICAgIChjbGljayk9XCJjZC5hY2NlcHQoKVwiXG4gICAgICAgID48L3B0LWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvcC1jb25maXJtRGlhbG9nPlxuPC9kaXY+XG4iXX0=