@colijnit/sharedcomponents 258.1.12 → 258.1.13

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.
@@ -1,12 +1,12 @@
1
1
  import { __awaiter } from "tslib";
2
- import { Component, ElementRef, EventEmitter, HostBinding, Input, Output, ViewChild, ViewEncapsulation } from "@angular/core";
3
- import { jsPDF } from "jspdf";
2
+ import { Component, ElementRef, EventEmitter, HostBinding, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
3
+ import { jsPDF } from 'jspdf';
4
4
  import { IconCacheService } from '../../service/icon-cache.service';
5
- import { DomSanitizer } from "@angular/platform-browser";
6
- import SignaturePad from "signature_pad";
5
+ import { DomSanitizer } from '@angular/platform-browser';
6
+ import SignaturePad from 'signature_pad';
7
7
  import { toJpeg } from 'html-to-image';
8
- import { FileUtils } from "@colijnit/mainapi/build/utils/file-utils";
9
- import { FileType } from "@colijnit/mainapi/build/enum/file-type.enum";
8
+ import { FileUtils } from '@colijnit/mainapi/build/utils/file-utils';
9
+ import { FileType } from '@colijnit/mainapi/build/enum/file-type.enum';
10
10
  import { Icon } from '../../enum/icon.enum';
11
11
  export class CustomPdfDialogComponent {
12
12
  constructor(iconCacheService, _sanitizer) {
@@ -18,22 +18,17 @@ export class CustomPdfDialogComponent {
18
18
  this.additionalFileChangeEvent = new EventEmitter();
19
19
  this.signaturePads = {};
20
20
  this.signatureCanvases = {};
21
+ this.fileBody = '';
22
+ this.fileStyle = '';
21
23
  this.showLoader = false;
24
+ // set to true if you want to skip email for debug purposes
25
+ this.enableLocalPreview = false;
22
26
  }
23
27
  showClass() {
24
28
  return true;
25
29
  }
26
30
  ngOnInit() {
27
- if (this.additionalFileContents) {
28
- const head = document.getElementsByTagName('head')[0];
29
- const styles = this.extractStyleParts(this.additionalFileContents);
30
- this.fileStyle = styles[0];
31
- const style = document.createElement('style');
32
- style.appendChild(document.createTextNode(this.fileStyle));
33
- head.appendChild(style);
34
- const body = this.extractBodyContents(this.additionalFileContents);
35
- this.fileBody = this._sanitizer.bypassSecurityTrustHtml(body[0]);
36
- }
31
+ this._processAdditionalFileContents();
37
32
  }
38
33
  ngAfterViewInit() {
39
34
  ['signatureCanvas', 'signatureCanvas2'].forEach(id => {
@@ -75,75 +70,144 @@ export class CustomPdfDialogComponent {
75
70
  }
76
71
  });
77
72
  }
73
+ _processAdditionalFileContents() {
74
+ var _a;
75
+ if (!this.additionalFileContents)
76
+ return;
77
+ const styles = this.extractStyleParts(this.additionalFileContents);
78
+ this.fileStyle = styles.join('\n').trim();
79
+ if (this.fileStyle) {
80
+ const head = document.getElementsByTagName('head')[0];
81
+ const styleEl = document.createElement('style');
82
+ styleEl.appendChild(document.createTextNode(this.fileStyle));
83
+ head.appendChild(styleEl);
84
+ }
85
+ const bodyParts = this.extractBodyContents(this.additionalFileContents);
86
+ const bodyHtml = ((_a = bodyParts[0]) !== null && _a !== void 0 ? _a : this.removeStyleAndScriptTags(this.additionalFileContents)).trim();
87
+ this.fileBody = this._sanitizer.bypassSecurityTrustHtml(bodyHtml);
88
+ }
78
89
  extractStyleParts(html) {
90
+ var _a;
79
91
  const stylePattern = /<style[^>]*>([\s\S]*?)<\/style>/gi;
80
92
  const matches = [];
81
93
  let match;
82
94
  while ((match = stylePattern.exec(html)) !== null) {
83
- matches.push(match[1].trim());
95
+ matches.push(((_a = match[1]) !== null && _a !== void 0 ? _a : '').trim());
84
96
  }
85
97
  return matches;
86
98
  }
87
99
  removeStyleAndScriptTags(html) {
88
100
  const styleTagPattern = /<style[^>]*>[\s\S]*?<\/style>/gi;
89
101
  const scriptTagPattern = /<script[^>]*>[\s\S]*?<\/script>/gi;
90
- return html.replace(styleTagPattern, '').replace(scriptTagPattern, '');
102
+ return (html || '').replace(styleTagPattern, '').replace(scriptTagPattern, '');
91
103
  }
92
104
  extractBodyContents(html) {
105
+ var _a;
93
106
  html = this.removeStyleAndScriptTags(html);
94
- const stylePattern = /<body[^>]*>([\s\S]*?)<\/body>/gi;
107
+ const bodyPattern = /<body[^>]*>([\s\S]*?)<\/body>/gi;
95
108
  const matches = [];
96
109
  let match;
97
- while ((match = stylePattern.exec(html)) !== null) {
98
- matches.push(match[1].trim());
110
+ while ((match = bodyPattern.exec(html)) !== null) {
111
+ matches.push(((_a = match[1]) !== null && _a !== void 0 ? _a : '').trim());
99
112
  }
100
113
  return matches;
101
114
  }
115
+ _isLocalhost() {
116
+ return ['localhost', '127.0.0.1', '::1'].includes(location.hostname);
117
+ }
102
118
  handleSaveClicked() {
119
+ var _a, _b;
103
120
  return __awaiter(this, void 0, void 0, function* () {
104
121
  this.showLoader = true;
105
122
  const clearButton = document.getElementById('clearButton');
106
- clearButton.hidden = true;
107
- const doc = new jsPDF();
108
- const htmlDocument = document.querySelector("#pdfBody");
109
- const documentSection = htmlDocument.getElementsByTagName('section');
110
- const sectionsCount = documentSection.length;
111
- for (let i = 0; i < sectionsCount; i++) {
112
- const html = documentSection[i];
123
+ if (clearButton)
124
+ clearButton.hidden = true;
125
+ const doc = new jsPDF({ unit: 'mm', format: 'a4' });
126
+ let createdTemp = false;
127
+ let root = ((_a = this.pdfBody) === null || _a === void 0 ? void 0 : _a.nativeElement) ||
128
+ document.querySelector('#pdfBody');
129
+ if (!root) {
130
+ root = document.createElement('div');
131
+ root.id = 'pdfBody';
132
+ root.style.position = 'fixed';
133
+ root.style.left = '-99999px';
134
+ root.style.top = '0';
135
+ root.style.width = '794px';
136
+ root.style.pointerEvents = 'none';
137
+ document.body.appendChild(root);
138
+ createdTemp = true;
139
+ }
140
+ if (this.additionalFileContents && !root.hasChildNodes()) {
141
+ const html = String(this.additionalFileContents);
142
+ if (html.includes('<html')) {
143
+ const parsed = new DOMParser().parseFromString(html, 'text/html');
144
+ root.innerHTML = ((_b = parsed.body) === null || _b === void 0 ? void 0 : _b.innerHTML) || html;
145
+ }
146
+ else {
147
+ root.innerHTML = html;
148
+ }
149
+ }
150
+ const allSections = Array.from(root.querySelectorAll('section'));
151
+ const leafSections = allSections.filter(s => !s.querySelector('section'));
152
+ const nodesToRender = leafSections.length ? leafSections : (allSections.length ? allSections : [root]);
153
+ const pageWidth = doc.internal.pageSize.getWidth();
154
+ const pageHeight = doc.internal.pageSize.getHeight();
155
+ for (let i = 0; i < nodesToRender.length; i++) {
156
+ const el = nodesToRender[i];
113
157
  try {
114
- const dataUrl = yield toJpeg(html, {
115
- quality: 1,
116
- backgroundColor: 'white'
117
- });
118
- const img = new Image();
119
- img.src = dataUrl;
158
+ const dataUrl = yield toJpeg(el, { quality: 1, backgroundColor: 'white' });
120
159
  yield new Promise((resolve) => {
160
+ const img = new Image();
121
161
  img.onload = () => {
122
- const imgWidth = 218;
123
- const imgHeight = (img.height * imgWidth) / img.width;
124
- doc.addImage(dataUrl, 'JPG', -4, 0, imgWidth, imgHeight);
125
- if (i < sectionsCount - 1) {
162
+ const w = img.width;
163
+ const h = img.height;
164
+ const scale = Math.min(pageWidth / w, pageHeight / h);
165
+ const renderW = w * scale;
166
+ const renderH = h * scale;
167
+ doc.addImage(dataUrl, 'JPG', 0, 0, renderW, renderH);
168
+ if (i < nodesToRender.length - 1)
126
169
  doc.addPage();
127
- }
128
170
  resolve();
129
171
  };
172
+ img.src = dataUrl;
130
173
  });
131
174
  }
132
- catch (error) {
133
- console.error('Error generating image:', error);
175
+ catch (err) {
176
+ console.error('Error generating image:', err);
134
177
  }
135
178
  }
136
- const tempFile = doc.output('datauristring');
137
- const file = this.dataURItoBlob(tempFile);
138
- const fileAsCoDocument = yield FileUtils.ReadFileAsNewCoDocument(file);
139
- fileAsCoDocument.fileType = FileUtils.IsImageFile(file) ? FileType.Image : FileType.Document;
140
- fileAsCoDocument.creationDate = new Date();
141
- fileAsCoDocument.modifiedDate = new Date();
142
- fileAsCoDocument.reports = 1;
143
- this.additionalFileChangeEvent.emit(fileAsCoDocument);
144
- this.showLoader = false;
145
- this.closePDFDialog.emit();
146
- clearButton.hidden = false;
179
+ if (createdTemp && root && root.parentNode) {
180
+ root.parentNode.removeChild(root);
181
+ }
182
+ // enableLocalPreview can be enabled to see the output without sending email
183
+ if (this.enableLocalPreview && this._isLocalhost()) {
184
+ const blob = doc.output('blob');
185
+ const url = URL.createObjectURL(blob);
186
+ window.open(url, '_blank');
187
+ this.showLoader = false;
188
+ if (clearButton)
189
+ clearButton.hidden = false;
190
+ return;
191
+ }
192
+ try {
193
+ const tempFile = doc.output('datauristring');
194
+ const file = this.dataURItoBlob(tempFile);
195
+ const fileAsCoDocument = yield FileUtils.ReadFileAsNewCoDocument(file);
196
+ fileAsCoDocument.fileType = FileUtils.IsImageFile(file) ? FileType.Image : FileType.Document;
197
+ fileAsCoDocument.creationDate = new Date();
198
+ fileAsCoDocument.modifiedDate = new Date();
199
+ fileAsCoDocument.reports = 1;
200
+ this.additionalFileChangeEvent.emit(fileAsCoDocument);
201
+ }
202
+ catch (e) {
203
+ console.error('PDF packaging failed:', e);
204
+ }
205
+ finally {
206
+ this.showLoader = false;
207
+ this.closePDFDialog.emit();
208
+ if (clearButton)
209
+ clearButton.hidden = false;
210
+ }
147
211
  });
148
212
  }
149
213
  dataURItoBlob(dataURI) {
@@ -183,7 +247,7 @@ CustomPdfDialogComponent.decorators = [
183
247
  </div>
184
248
 
185
249
  <div #pdfBody id="pdfBody">
186
- <section [innerHTML]="fileBody"></section>
250
+ <div [innerHTML]="fileBody"></div>
187
251
  </div>
188
252
  <ng-template #footerTemplate>
189
253
  <div class="co-dialog-footer-button-wrapper">
@@ -212,4 +276,4 @@ CustomPdfDialogComponent.propDecorators = {
212
276
  closePDFDialog: [{ type: Output }],
213
277
  additionalFileChangeEvent: [{ type: Output }]
214
278
  };
215
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXBkZi1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tLXBkZi9jdXN0b20tcGRmLWRpYWxvZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDNUIsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sWUFBWSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXJDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUVuRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDckUsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBZ0MxQyxNQUFNLE9BQU8sd0JBQXdCO0lBZ0NuQyxZQUNTLGdCQUFrQyxFQUNqQyxVQUF3QjtRQUR6QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2pDLGVBQVUsR0FBVixVQUFVLENBQWM7UUFqQ2xCLFVBQUssR0FBZ0IsSUFBSSxDQUFDO1FBY25DLHVCQUFrQixHQUFXLEVBQUUsQ0FBQztRQUdoQyxtQkFBYyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRzVELDhCQUF5QixHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFDO1FBSXJGLGtCQUFhLEdBQW9DLEVBQUUsQ0FBQztRQUNwRCxzQkFBaUIsR0FBa0MsRUFBRSxDQUFDO1FBSXRELGVBQVUsR0FBWSxLQUFLLENBQUM7SUFNbkMsQ0FBQztJQWhDTSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBZ0NELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMvQixNQUFNLElBQUksR0FBb0IsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sTUFBTSxHQUFhLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLEtBQUssR0FBcUIsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRSxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixNQUFNLElBQUksR0FBYSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xFO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ25ELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEQsSUFBSSxhQUFhLEVBQUU7Z0JBQ2pCLE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBb0IsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNsRixJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQztnQkFFdEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNELFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFFakUsOEhBQThIO1FBQzlILDJDQUEyQztRQUMzQyxNQUFNLFNBQVMsR0FBZ0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUE0QixDQUFDO1FBQ3pFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUNwRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztZQUMzQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFLLE1BQTJCLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtnQkFDbEYsTUFBTSxRQUFRLEdBQXFCLE1BQTBCLENBQUM7Z0JBQzlELElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtvQkFDcEIsUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQzFDO3FCQUFNO29CQUNMLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ3JDO2FBQ0Y7aUJBQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSyxNQUEyQixDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7Z0JBQ3RGLE1BQU0sS0FBSyxHQUFxQixNQUEwQixDQUFDO2dCQUMzRCxNQUFNLFNBQVMsR0FBVyxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUNyQyxNQUFNLE1BQU0sR0FBd0IsU0FBUyxDQUFDLGdCQUFnQixDQUFDLDZCQUE2QixTQUFTLElBQUksQ0FBQyxDQUFDO2dCQUMzRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtvQkFDakIsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQ3ZDO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxJQUFZO1FBQ25DLE1BQU0sWUFBWSxHQUFXLG1DQUFtQyxDQUFDO1FBQ2pFLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUM3QixJQUFJLEtBQTZCLENBQUM7UUFDbEMsT0FBTyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7U0FDL0I7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU0sd0JBQXdCLENBQUMsSUFBWTtRQUMxQyxNQUFNLGVBQWUsR0FBVyxpQ0FBaUMsQ0FBQztRQUNsRSxNQUFNLGdCQUFnQixHQUFXLG1DQUFtQyxDQUFDO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxJQUFZO1FBQ3JDLElBQUksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxZQUFZLEdBQVcsaUNBQWlDLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBQzdCLElBQUksS0FBNkIsQ0FBQztRQUNsQyxPQUFPLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDakQsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUMvQjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFWSxpQkFBaUI7O1lBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLE1BQU0sV0FBVyxHQUFnQixRQUFRLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3hFLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sR0FBRyxHQUFVLElBQUksS0FBSyxFQUFFLENBQUM7WUFDL0IsTUFBTSxZQUFZLEdBQWdCLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckUsTUFBTSxlQUFlLEdBQWtDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRyxNQUFNLGFBQWEsR0FBVyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBRXJELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlDLE1BQU0sSUFBSSxHQUFnQixlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUk7b0JBQ0YsTUFBTSxPQUFPLEdBQVcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFO3dCQUN6QyxPQUFPLEVBQUUsQ0FBQzt3QkFDVixlQUFlLEVBQUUsT0FBTztxQkFDekIsQ0FBQyxDQUFDO29CQUNILE1BQU0sR0FBRyxHQUFxQixJQUFJLEtBQUssRUFBRSxDQUFDO29CQUMxQyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQztvQkFDbEIsTUFBTSxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFO3dCQUNsQyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTs0QkFDaEIsTUFBTSxRQUFRLEdBQVcsR0FBRyxDQUFDOzRCQUM3QixNQUFNLFNBQVMsR0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzs0QkFDOUQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7NEJBQ3pELElBQUksQ0FBQyxHQUFHLGFBQWEsR0FBRyxDQUFDLEVBQUU7Z0NBQ3pCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs2QkFDZjs0QkFDRCxPQUFPLEVBQUUsQ0FBQzt3QkFDWixDQUFDLENBQUM7b0JBQ0osQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7b0JBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDakQ7YUFDRjtZQUNELE1BQU0sUUFBUSxHQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDckQsTUFBTSxJQUFJLEdBQVMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZFLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQzdGLGdCQUFnQixDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNDLGdCQUFnQixDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0IsV0FBVyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDN0IsQ0FBQztLQUFBO0lBRU0sYUFBYSxDQUFDLE9BQU87UUFDMUIsTUFBTSxVQUFVLEdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxNQUFNLEVBQUUsR0FBZ0IsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNELE1BQU0sRUFBRSxHQUFlLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xELEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sV0FBVztRQUNoQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDdkQsWUFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLEtBQUssRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHNCQUFzQixDQUFDLFNBQXVCLEVBQUUsZUFBMkI7UUFDakYsTUFBTSxpQkFBaUIsR0FBVyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLGVBQWUsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4RixlQUFlLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUYsZUFBZSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRSxTQUFTLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDM0MsQ0FBQzs7O1lBek5GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsc0JBQXNCO2dCQUNoQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCVDtnQkFDRCxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTthQUN0Qzs7O1lBdkNPLGdCQUFnQjtZQUNoQixZQUFZOzs7d0JBMENqQixXQUFXLFNBQUMsNEJBQTRCO3NCQUt4QyxTQUFTLFNBQUMsU0FBUztxQ0FHbkIsS0FBSztpQ0FHTCxLQUFLOzZCQUdMLE1BQU07d0NBR04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge2pzUERGfSBmcm9tIFwianNwZGZcIjtcclxuaW1wb3J0IHtJY29uQ2FjaGVTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2ljb24tY2FjaGUuc2VydmljZSc7XHJcbmltcG9ydCB7RG9tU2FuaXRpemVyfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xyXG5pbXBvcnQgU2lnbmF0dXJlUGFkIGZyb20gXCJzaWduYXR1cmVfcGFkXCI7XHJcbmltcG9ydCB7dG9KcGVnfSBmcm9tICdodG1sLXRvLWltYWdlJztcclxuaW1wb3J0IHtDb0RvY3VtZW50fSBmcm9tIFwiQGNvbGlqbml0L21haW5hcGkvYnVpbGQvbW9kZWwvY28tZG9jdW1lbnRcIjtcclxuaW1wb3J0IHtGaWxlVXRpbHN9IGZyb20gXCJAY29saWpuaXQvbWFpbmFwaS9idWlsZC91dGlscy9maWxlLXV0aWxzXCI7XHJcblxyXG5pbXBvcnQge0ZpbGVUeXBlfSBmcm9tIFwiQGNvbGlqbml0L21haW5hcGkvYnVpbGQvZW51bS9maWxlLXR5cGUuZW51bVwiO1xyXG5pbXBvcnQge0ljb259IGZyb20gJy4uLy4uL2VudW0vaWNvbi5lbnVtJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NvLWN1c3RvbS1wZGYtZGlhbG9nJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGNvLWRpYWxvZ1xyXG4gICAgICBbZm9vdGVyVGVtcGxhdGVdPVwiZm9vdGVyVGVtcGxhdGVcIlxyXG4gICAgICBpZD1cImN1c3RvbS1wZGYtZGlhbG9nXCJcclxuICAgICAgKGNsb3NlQ2xpY2spPVwiY2xvc2VQREZEaWFsb2cuZW1pdCgpXCI+XHJcbiAgICAgIDwhLS0gY3JlYXRlIGEgbmljZSBjb250YWluZXIgZm9yIGxvYWRlciBzbyBpdCBpcyBub3QgcmFuZG9tIGluIHRoZSBjb3JuZXIgc29tZXdoZXJlIC0tPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd0xvYWRlclwiIGNsYXNzPVwibG9hZGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxjby1sb2FkZXIgKm5nSWY9XCJzaG93TG9hZGVyXCI+PC9jby1sb2FkZXI+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAjcGRmQm9keSBpZD1cInBkZkJvZHlcIj5cclxuICAgICAgICA8c2VjdGlvbiBbaW5uZXJIVE1MXT1cImZpbGVCb2R5XCI+PC9zZWN0aW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLXRlbXBsYXRlICNmb290ZXJUZW1wbGF0ZT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY28tZGlhbG9nLWZvb3Rlci1idXR0b24td3JhcHBlclwiPlxyXG4gICAgICAgICAgPGNvLWJ1dHRvbiBjbGFzcz1cInNhdmUtYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2ljb25EYXRhXT1cImljb25DYWNoZVNlcnZpY2UuZ2V0SWNvbihpY29ucy5DaGVja0R1b3RvbmUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZVNhdmVDbGlja2VkKClcIj48L2NvLWJ1dHRvbj5cclxuICAgICAgICAgIDxjby1idXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICBbaWNvbkRhdGFdPVwiaWNvbkNhY2hlU2VydmljZS5nZXRJY29uKGljb25zLkNyb3NzU2tpbm55KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbG9zZVBERkRpYWxvZy5lbWl0KClcIj48L2NvLWJ1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvY28tZGlhbG9nPlxyXG4gIGAsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tUGRmRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgaWNvbnM6IHR5cGVvZiBJY29uID0gSWNvbjtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jby1jdXN0b20tcGRmLWRpYWxvZycpXHJcbiAgcHVibGljIHNob3dDbGFzcygpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgQFZpZXdDaGlsZCgncGRmQm9keScpXHJcbiAgcHVibGljIHBkZkJvZHk6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGFkZGl0aW9uYWxGaWxlQ29udGVudHM6IGFueTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYWRkaXRpb25hbEZpbGVOYW1lOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIGNsb3NlUERGRGlhbG9nOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgYWRkaXRpb25hbEZpbGVDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPENvRG9jdW1lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxDb0RvY3VtZW50PigpO1xyXG5cclxuICBwdWJsaWMgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuICBwdWJsaWMgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xyXG4gIHB1YmxpYyBzaWduYXR1cmVQYWRzOiB7IFtrZXk6IHN0cmluZ106IFNpZ25hdHVyZVBhZCB9ID0ge307XHJcbiAgcHVibGljIHNpZ25hdHVyZUNhbnZhc2VzOiB7IFtrZXk6IHN0cmluZ106IEVsZW1lbnRSZWYgfSA9IHt9O1xyXG4gIHB1YmxpYyBmaWxlQm9keTogYW55O1xyXG4gIHB1YmxpYyBmaWxlU3R5bGU6IHN0cmluZztcclxuXHJcbiAgcHVibGljIHNob3dMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgaWNvbkNhY2hlU2VydmljZTogSWNvbkNhY2hlU2VydmljZSxcclxuICAgIHByaXZhdGUgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmFkZGl0aW9uYWxGaWxlQ29udGVudHMpIHtcclxuICAgICAgY29uc3QgaGVhZDogSFRNTEhlYWRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcclxuICAgICAgY29uc3Qgc3R5bGVzOiBzdHJpbmdbXSA9IHRoaXMuZXh0cmFjdFN0eWxlUGFydHModGhpcy5hZGRpdGlvbmFsRmlsZUNvbnRlbnRzKTtcclxuICAgICAgdGhpcy5maWxlU3R5bGUgPSBzdHlsZXNbMF07XHJcbiAgICAgIGNvbnN0IHN0eWxlOiBIVE1MU3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5maWxlU3R5bGUpKTtcclxuICAgICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XHJcbiAgICAgIGNvbnN0IGJvZHk6IHN0cmluZ1tdID0gdGhpcy5leHRyYWN0Qm9keUNvbnRlbnRzKHRoaXMuYWRkaXRpb25hbEZpbGVDb250ZW50cyk7XHJcbiAgICAgIHRoaXMuZmlsZUJvZHkgPSB0aGlzLl9zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoYm9keVswXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBbJ3NpZ25hdHVyZUNhbnZhcycsICdzaWduYXR1cmVDYW52YXMyJ10uZm9yRWFjaChpZCA9PiB7XHJcbiAgICAgIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcbiAgICAgIGlmIChjYW52YXNFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgY2FudmFzUmVmID0gbmV3IEVsZW1lbnRSZWYoY2FudmFzRWxlbWVudCk7XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlUGFkID0gbmV3IFNpZ25hdHVyZVBhZCg8SFRNTENhbnZhc0VsZW1lbnQ+Y2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuc2lnbmF0dXJlQ2FudmFzZXNbaWRdID0gY2FudmFzUmVmO1xyXG4gICAgICAgIHRoaXMuc2lnbmF0dXJlUGFkc1tpZF0gPSBzaWduYXR1cmVQYWQ7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fcmVzaXplU2lnbmF0dXJlQ2FudmFzKHNpZ25hdHVyZVBhZCwgY2FudmFzUmVmKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBjbGVhckJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGVhckJ1dHRvbicpO1xyXG4gICAgY2xlYXJCdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5oYW5kbGVDbGVhcigpKTtcclxuXHJcbiAgICAvLyBEdWUgdG8gYSBidWcgb3Iga25vd24gaXNzdWUgd2l0aCBodG1sLXRvLWltYWdlIHdlIG5lZWQgYSBiaXQgb2YgSlMgdGhlIGZpbGwgaW4gdGhlIGNoZWNrZWQgdmFsdWUgd2hlbiBzZWxlY3RpbmcgYSBjaGVja2JveC5cclxuICAgIC8vIEhhbmRsaW5nIHRoZSBjaGVja2JveGVzIGFuZCByYWRpb2J1dHRvbnNcclxuICAgIGNvbnN0IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB0aGlzLnBkZkJvZHkubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnICYmICh0YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrYm94OiBIVE1MSW5wdXRFbGVtZW50ID0gdGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcclxuICAgICAgICAgIGNoZWNrYm94LnNldEF0dHJpYnV0ZSgnY2hlY2tlZCcsICd0cnVlJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNoZWNrYm94LnJlbW92ZUF0dHJpYnV0ZSgnY2hlY2tlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiAodGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnR5cGUgPT09ICdyYWRpbycpIHtcclxuICAgICAgICBjb25zdCByYWRpbzogSFRNTElucHV0RWxlbWVudCA9IHRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGdyb3VwTmFtZTogc3RyaW5nID0gcmFkaW8ubmFtZTtcclxuICAgICAgICBjb25zdCByYWRpb3M6IE5vZGVMaXN0T2Y8RWxlbWVudD4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChgaW5wdXRbdHlwZT1cInJhZGlvXCJdW25hbWU9XCIke2dyb3VwTmFtZX1cIl1gKTtcclxuICAgICAgICByYWRpb3MuZm9yRWFjaCgocmFkaW8pID0+IHJhZGlvLnJlbW92ZUF0dHJpYnV0ZSgnY2hlY2tlZCcpKTtcclxuICAgICAgICBpZiAocmFkaW8uY2hlY2tlZCkge1xyXG4gICAgICAgICAgcmFkaW8uc2V0QXR0cmlidXRlKCdjaGVja2VkJywgJ3RydWUnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGV4dHJhY3RTdHlsZVBhcnRzKGh0bWw6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IHN0eWxlUGF0dGVybjogUmVnRXhwID0gLzxzdHlsZVtePl0qPihbXFxzXFxTXSo/KTxcXC9zdHlsZT4vZ2k7XHJcbiAgICBjb25zdCBtYXRjaGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xyXG4gICAgd2hpbGUgKChtYXRjaCA9IHN0eWxlUGF0dGVybi5leGVjKGh0bWwpKSAhPT0gbnVsbCkge1xyXG4gICAgICBtYXRjaGVzLnB1c2gobWF0Y2hbMV0udHJpbSgpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtYXRjaGVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZVN0eWxlQW5kU2NyaXB0VGFncyhodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3R5bGVUYWdQYXR0ZXJuOiBSZWdFeHAgPSAvPHN0eWxlW14+XSo+W1xcc1xcU10qPzxcXC9zdHlsZT4vZ2k7XHJcbiAgICBjb25zdCBzY3JpcHRUYWdQYXR0ZXJuOiBSZWdFeHAgPSAvPHNjcmlwdFtePl0qPltcXHNcXFNdKj88XFwvc2NyaXB0Pi9naTtcclxuICAgIHJldHVybiBodG1sLnJlcGxhY2Uoc3R5bGVUYWdQYXR0ZXJuLCAnJykucmVwbGFjZShzY3JpcHRUYWdQYXR0ZXJuLCAnJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXh0cmFjdEJvZHlDb250ZW50cyhodG1sOiBzdHJpbmcpOiBzdHJpbmcgW10ge1xyXG4gICAgaHRtbCA9IHRoaXMucmVtb3ZlU3R5bGVBbmRTY3JpcHRUYWdzKGh0bWwpO1xyXG4gICAgY29uc3Qgc3R5bGVQYXR0ZXJuOiBSZWdFeHAgPSAvPGJvZHlbXj5dKj4oW1xcc1xcU10qPyk8XFwvYm9keT4vZ2k7XHJcbiAgICBjb25zdCBtYXRjaGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xyXG4gICAgd2hpbGUgKChtYXRjaCA9IHN0eWxlUGF0dGVybi5leGVjKGh0bWwpKSAhPT0gbnVsbCkge1xyXG4gICAgICBtYXRjaGVzLnB1c2gobWF0Y2hbMV0udHJpbSgpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtYXRjaGVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGhhbmRsZVNhdmVDbGlja2VkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zaG93TG9hZGVyID0gdHJ1ZTtcclxuICAgIGNvbnN0IGNsZWFyQnV0dG9uOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGVhckJ1dHRvbicpO1xyXG4gICAgY2xlYXJCdXR0b24uaGlkZGVuID0gdHJ1ZTtcclxuICAgIGNvbnN0IGRvYzoganNQREYgPSBuZXcganNQREYoKTtcclxuICAgIGNvbnN0IGh0bWxEb2N1bWVudDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3BkZkJvZHlcIik7XHJcbiAgICBjb25zdCBkb2N1bWVudFNlY3Rpb246IEhUTUxDb2xsZWN0aW9uT2Y8SFRNTEVsZW1lbnQ+ID0gaHRtbERvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzZWN0aW9uJyk7XHJcbiAgICBjb25zdCBzZWN0aW9uc0NvdW50OiBudW1iZXIgPSBkb2N1bWVudFNlY3Rpb24ubGVuZ3RoO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzZWN0aW9uc0NvdW50OyBpKyspIHtcclxuICAgICAgY29uc3QgaHRtbDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudFNlY3Rpb25baV07XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgZGF0YVVybDogc3RyaW5nID0gYXdhaXQgdG9KcGVnKGh0bWwsIHtcclxuICAgICAgICAgIHF1YWxpdHk6IDEsXHJcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZSdcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgICBpbWcuc3JjID0gZGF0YVVybDtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW1nV2lkdGg6IG51bWJlciA9IDIxODtcclxuICAgICAgICAgICAgY29uc3QgaW1nSGVpZ2h0OiBudW1iZXIgPSAoaW1nLmhlaWdodCAqIGltZ1dpZHRoKSAvIGltZy53aWR0aDtcclxuICAgICAgICAgICAgZG9jLmFkZEltYWdlKGRhdGFVcmwsICdKUEcnLCAtNCwgMCwgaW1nV2lkdGgsIGltZ0hlaWdodCk7XHJcbiAgICAgICAgICAgIGlmIChpIDwgc2VjdGlvbnNDb3VudCAtIDEpIHtcclxuICAgICAgICAgICAgICBkb2MuYWRkUGFnZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyBpbWFnZTonLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IHRlbXBGaWxlOiBzdHJpbmcgPSBkb2Mub3V0cHV0KCdkYXRhdXJpc3RyaW5nJyk7XHJcbiAgICBjb25zdCBmaWxlOiBGaWxlID0gdGhpcy5kYXRhVVJJdG9CbG9iKHRlbXBGaWxlKTtcclxuICAgIGNvbnN0IGZpbGVBc0NvRG9jdW1lbnQgPSBhd2FpdCBGaWxlVXRpbHMuUmVhZEZpbGVBc05ld0NvRG9jdW1lbnQoZmlsZSk7XHJcbiAgICBmaWxlQXNDb0RvY3VtZW50LmZpbGVUeXBlID0gRmlsZVV0aWxzLklzSW1hZ2VGaWxlKGZpbGUpID8gRmlsZVR5cGUuSW1hZ2UgOiBGaWxlVHlwZS5Eb2N1bWVudDtcclxuICAgIGZpbGVBc0NvRG9jdW1lbnQuY3JlYXRpb25EYXRlID0gbmV3IERhdGUoKTtcclxuICAgIGZpbGVBc0NvRG9jdW1lbnQubW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcclxuICAgIGZpbGVBc0NvRG9jdW1lbnQucmVwb3J0cyA9IDE7XHJcbiAgICB0aGlzLmFkZGl0aW9uYWxGaWxlQ2hhbmdlRXZlbnQuZW1pdChmaWxlQXNDb0RvY3VtZW50KTtcclxuICAgIHRoaXMuc2hvd0xvYWRlciA9IGZhbHNlO1xyXG4gICAgdGhpcy5jbG9zZVBERkRpYWxvZy5lbWl0KCk7XHJcbiAgICBjbGVhckJ1dHRvbi5oaWRkZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkYXRhVVJJdG9CbG9iKGRhdGFVUkkpOiBGaWxlIHtcclxuICAgIGNvbnN0IGJ5dGVTdHJpbmc6IHN0cmluZyA9IGF0b2IoZGF0YVVSSS5zcGxpdCgnLCcpWzFdKTtcclxuICAgIGNvbnN0IGFiOiBBcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XHJcbiAgICBjb25zdCBpYTogVWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFiKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBieXRlU3RyaW5nLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlhW2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBGaWxlKFthYl0sIHRoaXMuYWRkaXRpb25hbEZpbGVOYW1lICsgJy5wZGYnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVDbGVhcigpOiB2b2lkIHtcclxuICAgIE9iamVjdC52YWx1ZXModGhpcy5zaWduYXR1cmVQYWRzKS5mb3JFYWNoKHNpZ25hdHVyZVBhZCA9PiB7XHJcbiAgICAgIHNpZ25hdHVyZVBhZD8uY2xlYXIoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVzaXplU2lnbmF0dXJlQ2FudmFzKHNpZ25hdHVyZTogU2lnbmF0dXJlUGFkLCBzaWduYXR1cmVDYW52YXM6IEVsZW1lbnRSZWYpOiB2b2lkIHtcclxuICAgIGNvbnN0IGltYWdlQmVmb3JlUmVzaXplOiBzdHJpbmcgPSBzaWduYXR1cmUudG9EYXRhVVJMKCk7XHJcbiAgICBjb25zdCByYXRpbzogbnVtYmVyID0gTWF0aC5tYXgod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSwgMSk7XHJcbiAgICBzaWduYXR1cmVDYW52YXMubmF0aXZlRWxlbWVudC53aWR0aCA9IHNpZ25hdHVyZUNhbnZhcy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICogcmF0aW87XHJcbiAgICBzaWduYXR1cmVDYW52YXMubmF0aXZlRWxlbWVudC5oZWlnaHQgPSBzaWduYXR1cmVDYW52YXMubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgKiByYXRpbztcclxuICAgIHNpZ25hdHVyZUNhbnZhcy5uYXRpdmVFbGVtZW50LmdldENvbnRleHQoXCIyZFwiKS5zY2FsZShyYXRpbywgcmF0aW8pO1xyXG4gICAgc2lnbmF0dXJlLmZyb21EYXRhVVJMKGltYWdlQmVmb3JlUmVzaXplKTtcclxuICB9XHJcbn1cclxuIl19
279
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXBkZi1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tLXBkZi9jdXN0b20tcGRmLWRpYWxvZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25KLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDNUIsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sWUFBWSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXJDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUVuRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDckUsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBK0IxQyxNQUFNLE9BQU8sd0JBQXdCO0lBbUNuQyxZQUNTLGdCQUFrQyxFQUNqQyxVQUF3QjtRQUR6QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2pDLGVBQVUsR0FBVixVQUFVLENBQWM7UUFwQ2xCLFVBQUssR0FBZ0IsSUFBSSxDQUFDO1FBY25DLHVCQUFrQixHQUFXLEVBQUUsQ0FBQztRQUdoQyxtQkFBYyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRzVELDhCQUF5QixHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFD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O1FBQ2pGLE1BQU0saUJBQWlCLEdBQVcsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3hELE1BQU0sS0FBSyxHQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoRSxlQUFlLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDeEYsZUFBZSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFGLGVBQWUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzNDLENBQUM7OztZQTdSRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtnQkFDaEMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3QlQ7Z0JBQ0QsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7YUFDdEM7OztZQXRDTyxnQkFBZ0I7WUFDaEIsWUFBWTs7O3dCQXlDakIsV0FBVyxTQUFDLDRCQUE0QjtzQkFLeEMsU0FBUyxTQUFDLFNBQVM7cUNBR25CLEtBQUs7aUNBR0wsS0FBSzs2QkFHTCxNQUFNO3dDQUdOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtqc1BERn0gZnJvbSAnanNwZGYnO1xyXG5pbXBvcnQge0ljb25DYWNoZVNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2UvaWNvbi1jYWNoZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtEb21TYW5pdGl6ZXJ9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgU2lnbmF0dXJlUGFkIGZyb20gJ3NpZ25hdHVyZV9wYWQnO1xyXG5pbXBvcnQge3RvSnBlZ30gZnJvbSAnaHRtbC10by1pbWFnZSc7XHJcbmltcG9ydCB7Q29Eb2N1bWVudH0gZnJvbSAnQGNvbGlqbml0L21haW5hcGkvYnVpbGQvbW9kZWwvY28tZG9jdW1lbnQnO1xyXG5pbXBvcnQge0ZpbGVVdGlsc30gZnJvbSAnQGNvbGlqbml0L21haW5hcGkvYnVpbGQvdXRpbHMvZmlsZS11dGlscyc7XHJcblxyXG5pbXBvcnQge0ZpbGVUeXBlfSBmcm9tICdAY29saWpuaXQvbWFpbmFwaS9idWlsZC9lbnVtL2ZpbGUtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtJY29ufSBmcm9tICcuLi8uLi9lbnVtL2ljb24uZW51bSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NvLWN1c3RvbS1wZGYtZGlhbG9nJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGNvLWRpYWxvZ1xyXG4gICAgICBbZm9vdGVyVGVtcGxhdGVdPVwiZm9vdGVyVGVtcGxhdGVcIlxyXG4gICAgICBpZD1cImN1c3RvbS1wZGYtZGlhbG9nXCJcclxuICAgICAgKGNsb3NlQ2xpY2spPVwiY2xvc2VQREZEaWFsb2cuZW1pdCgpXCI+XHJcbiAgICAgIDwhLS0gY3JlYXRlIGEgbmljZSBjb250YWluZXIgZm9yIGxvYWRlciBzbyBpdCBpcyBub3QgcmFuZG9tIGluIHRoZSBjb3JuZXIgc29tZXdoZXJlIC0tPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd0xvYWRlclwiIGNsYXNzPVwibG9hZGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxjby1sb2FkZXIgKm5nSWY9XCJzaG93TG9hZGVyXCI+PC9jby1sb2FkZXI+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAjcGRmQm9keSBpZD1cInBkZkJvZHlcIj5cclxuICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiZmlsZUJvZHlcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjZm9vdGVyVGVtcGxhdGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvLWRpYWxvZy1mb290ZXItYnV0dG9uLXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxjby1idXR0b24gY2xhc3M9XCJzYXZlLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtpY29uRGF0YV09XCJpY29uQ2FjaGVTZXJ2aWNlLmdldEljb24oaWNvbnMuQ2hlY2tEdW90b25lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVTYXZlQ2xpY2tlZCgpXCI+PC9jby1idXR0b24+XHJcbiAgICAgICAgICA8Y28tYnV0dG9uIGNsYXNzPVwiY2xvc2UtYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2ljb25EYXRhXT1cImljb25DYWNoZVNlcnZpY2UuZ2V0SWNvbihpY29ucy5Dcm9zc1NraW5ueSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvc2VQREZEaWFsb2cuZW1pdCgpXCI+PC9jby1idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2NvLWRpYWxvZz5cclxuICBgLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuZXhwb3J0IGNsYXNzIEN1c3RvbVBkZkRpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IGljb25zOiB0eXBlb2YgSWNvbiA9IEljb247XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuY28tY3VzdG9tLXBkZi1kaWFsb2cnKVxyXG4gIHB1YmxpYyBzaG93Q2xhc3MoKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3BkZkJvZHknKVxyXG4gIHB1YmxpYyBwZGZCb2R5OiBFbGVtZW50UmVmO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhZGRpdGlvbmFsRmlsZUNvbnRlbnRzOiBhbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGFkZGl0aW9uYWxGaWxlTmFtZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBjbG9zZVBERkRpYWxvZzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIGFkZGl0aW9uYWxGaWxlQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxDb0RvY3VtZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29Eb2N1bWVudD4oKTtcclxuXHJcbiAgcHVibGljIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XHJcbiAgcHVibGljIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcclxuICBwdWJsaWMgc2lnbmF0dXJlUGFkczogeyBba2V5OiBzdHJpbmddOiBTaWduYXR1cmVQYWQgfSA9IHt9O1xyXG4gIHB1YmxpYyBzaWduYXR1cmVDYW52YXNlczogeyBba2V5OiBzdHJpbmddOiBFbGVtZW50UmVmIH0gPSB7fTtcclxuICBwdWJsaWMgZmlsZUJvZHk6IGFueSA9ICcnO1xyXG4gIHB1YmxpYyBmaWxlU3R5bGU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwdWJsaWMgc2hvd0xvYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBzZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBza2lwIGVtYWlsIGZvciBkZWJ1ZyBwdXJwb3Nlc1xyXG4gIHByaXZhdGUgZW5hYmxlTG9jYWxQcmV2aWV3ID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGljb25DYWNoZVNlcnZpY2U6IEljb25DYWNoZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplclxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcm9jZXNzQWRkaXRpb25hbEZpbGVDb250ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgWydzaWduYXR1cmVDYW52YXMnLCAnc2lnbmF0dXJlQ2FudmFzMiddLmZvckVhY2goaWQgPT4ge1xyXG4gICAgICBjb25zdCBjYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG4gICAgICBpZiAoY2FudmFzRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGNhbnZhc1JlZiA9IG5ldyBFbGVtZW50UmVmKGNhbnZhc0VsZW1lbnQpO1xyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZVBhZCA9IG5ldyBTaWduYXR1cmVQYWQoPEhUTUxDYW52YXNFbGVtZW50PmNhbnZhc1JlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICB0aGlzLnNpZ25hdHVyZUNhbnZhc2VzW2lkXSA9IGNhbnZhc1JlZjtcclxuICAgICAgICB0aGlzLnNpZ25hdHVyZVBhZHNbaWRdID0gc2lnbmF0dXJlUGFkO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX3Jlc2l6ZVNpZ25hdHVyZUNhbnZhcyhzaWduYXR1cmVQYWQsIGNhbnZhc1JlZik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgY29uc3QgY2xlYXJCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xlYXJCdXR0b24nKTtcclxuICAgIGNsZWFyQnV0dG9uPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuaGFuZGxlQ2xlYXIoKSk7XHJcblxyXG4gICAgLy8gRHVlIHRvIGEgYnVnIG9yIGtub3duIGlzc3VlIHdpdGggaHRtbC10by1pbWFnZSB3ZSBuZWVkIGEgYml0IG9mIEpTIHRoZSBmaWxsIGluIHRoZSBjaGVja2VkIHZhbHVlIHdoZW4gc2VsZWN0aW5nIGEgY2hlY2tib3guXHJcbiAgICAvLyBIYW5kbGluZyB0aGUgY2hlY2tib3hlcyBhbmQgcmFkaW9idXR0b25zXHJcbiAgICBjb25zdCBjb250YWluZXI6IEhUTUxFbGVtZW50ID0gdGhpcy5wZGZCb2R5Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiAodGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnR5cGUgPT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICBjb25zdCBjaGVja2JveDogSFRNTElucHV0RWxlbWVudCA9IHRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGlmIChjaGVja2JveC5jaGVja2VkKSB7XHJcbiAgICAgICAgICBjaGVja2JveC5zZXRBdHRyaWJ1dGUoJ2NoZWNrZWQnLCAndHJ1ZScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjaGVja2JveC5yZW1vdmVBdHRyaWJ1dGUoJ2NoZWNrZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgKHRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS50eXBlID09PSAncmFkaW8nKSB7XHJcbiAgICAgICAgY29uc3QgcmFkaW86IEhUTUxJbnB1dEVsZW1lbnQgPSB0YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBjb25zdCBncm91cE5hbWU6IHN0cmluZyA9IHJhZGlvLm5hbWU7XHJcbiAgICAgICAgY29uc3QgcmFkaW9zOiBOb2RlTGlzdE9mPEVsZW1lbnQ+ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoYGlucHV0W3R5cGU9XCJyYWRpb1wiXVtuYW1lPVwiJHtncm91cE5hbWV9XCJdYCk7XHJcbiAgICAgICAgcmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiByYWRpby5yZW1vdmVBdHRyaWJ1dGUoJ2NoZWNrZWQnKSk7XHJcbiAgICAgICAgaWYgKHJhZGlvLmNoZWNrZWQpIHtcclxuICAgICAgICAgIHJhZGlvLnNldEF0dHJpYnV0ZSgnY2hlY2tlZCcsICd0cnVlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Byb2Nlc3NBZGRpdGlvbmFsRmlsZUNvbnRlbnRzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmFkZGl0aW9uYWxGaWxlQ29udGVudHMpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzdHlsZXMgPSB0aGlzLmV4dHJhY3RTdHlsZVBhcnRzKHRoaXMuYWRkaXRpb25hbEZpbGVDb250ZW50cyk7XHJcbiAgICB0aGlzLmZpbGVTdHlsZSA9IHN0eWxlcy5qb2luKCdcXG4nKS50cmltKCk7XHJcbiAgICBpZiAodGhpcy5maWxlU3R5bGUpIHtcclxuICAgICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XHJcbiAgICAgIGNvbnN0IHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xyXG4gICAgICBzdHlsZUVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuZmlsZVN0eWxlKSk7XHJcbiAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYm9keVBhcnRzID0gdGhpcy5leHRyYWN0Qm9keUNvbnRlbnRzKHRoaXMuYWRkaXRpb25hbEZpbGVDb250ZW50cyk7XHJcbiAgICBjb25zdCBib2R5SHRtbCA9IChib2R5UGFydHNbMF0gPz8gdGhpcy5yZW1vdmVTdHlsZUFuZFNjcmlwdFRhZ3ModGhpcy5hZGRpdGlvbmFsRmlsZUNvbnRlbnRzKSkudHJpbSgpO1xyXG4gICAgdGhpcy5maWxlQm9keSA9IHRoaXMuX3Nhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChib2R5SHRtbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXh0cmFjdFN0eWxlUGFydHMoaHRtbDogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3Qgc3R5bGVQYXR0ZXJuID0gLzxzdHlsZVtePl0qPihbXFxzXFxTXSo/KTxcXC9zdHlsZT4vZ2k7XHJcbiAgICBjb25zdCBtYXRjaGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xyXG4gICAgd2hpbGUgKChtYXRjaCA9IHN0eWxlUGF0dGVybi5leGVjKGh0bWwpKSAhPT0gbnVsbCkge1xyXG4gICAgICBtYXRjaGVzLnB1c2goKG1hdGNoWzFdID8/ICcnKS50cmltKCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1hdGNoZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlU3R5bGVBbmRTY3JpcHRUYWdzKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdHlsZVRhZ1BhdHRlcm4gPSAvPHN0eWxlW14+XSo+W1xcc1xcU10qPzxcXC9zdHlsZT4vZ2k7XHJcbiAgICBjb25zdCBzY3JpcHRUYWdQYXR0ZXJuID0gLzxzY3JpcHRbXj5dKj5bXFxzXFxTXSo/PFxcL3NjcmlwdD4vZ2k7XHJcbiAgICByZXR1cm4gKGh0bWwgfHwgJycpLnJlcGxhY2Uoc3R5bGVUYWdQYXR0ZXJuLCAnJykucmVwbGFjZShzY3JpcHRUYWdQYXR0ZXJuLCAnJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXh0cmFjdEJvZHlDb250ZW50cyhodG1sOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBodG1sID0gdGhpcy5yZW1vdmVTdHlsZUFuZFNjcmlwdFRhZ3MoaHRtbCk7XHJcbiAgICBjb25zdCBib2R5UGF0dGVybiA9IC88Ym9keVtePl0qPihbXFxzXFxTXSo/KTxcXC9ib2R5Pi9naTtcclxuICAgIGNvbnN0IG1hdGNoZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XHJcbiAgICB3aGlsZSAoKG1hdGNoID0gYm9keVBhdHRlcm4uZXhlYyhodG1sKSkgIT09IG51bGwpIHtcclxuICAgICAgbWF0Y2hlcy5wdXNoKChtYXRjaFsxXSA/PyAnJykudHJpbSgpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtYXRjaGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNMb2NhbGhvc3QoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gWydsb2NhbGhvc3QnLCAnMTI3LjAuMC4xJywgJzo6MSddLmluY2x1ZGVzKGxvY2F0aW9uLmhvc3RuYW1lKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBoYW5kbGVTYXZlQ2xpY2tlZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc2hvd0xvYWRlciA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgY2xlYXJCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xlYXJCdXR0b24nKTtcclxuICAgIGlmIChjbGVhckJ1dHRvbikgY2xlYXJCdXR0b24uaGlkZGVuID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBkb2MgPSBuZXcganNQREYoeyB1bml0OiAnbW0nLCBmb3JtYXQ6ICdhNCcgfSk7XHJcblxyXG4gICAgbGV0IGNyZWF0ZWRUZW1wID0gZmFsc2U7XHJcbiAgICBsZXQgcm9vdDogSFRNTEVsZW1lbnQgfCBudWxsID1cclxuICAgICAgKHRoaXMucGRmQm9keT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkgfHxcclxuICAgICAgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwZGZCb2R5JykgYXMgSFRNTEVsZW1lbnQpO1xyXG5cclxuICAgIGlmICghcm9vdCkge1xyXG4gICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIHJvb3QuaWQgPSAncGRmQm9keSc7XHJcbiAgICAgIHJvb3Quc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICByb290LnN0eWxlLmxlZnQgPSAnLTk5OTk5cHgnO1xyXG4gICAgICByb290LnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgcm9vdC5zdHlsZS53aWR0aCA9ICc3OTRweCc7XHJcbiAgICAgIHJvb3Quc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyb290KTtcclxuICAgICAgY3JlYXRlZFRlbXAgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmFkZGl0aW9uYWxGaWxlQ29udGVudHMgJiYgIXJvb3QuaGFzQ2hpbGROb2RlcygpKSB7XHJcbiAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcodGhpcy5hZGRpdGlvbmFsRmlsZUNvbnRlbnRzKTtcclxuICAgICAgaWYgKGh0bWwuaW5jbHVkZXMoJzxodG1sJykpIHtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcclxuICAgICAgICByb290LmlubmVySFRNTCA9IHBhcnNlZC5ib2R5Py5pbm5lckhUTUwgfHwgaHRtbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByb290LmlubmVySFRNTCA9IGh0bWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhbGxTZWN0aW9ucyA9IEFycmF5LmZyb20ocm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdzZWN0aW9uJykpO1xyXG4gICAgY29uc3QgbGVhZlNlY3Rpb25zID0gYWxsU2VjdGlvbnMuZmlsdGVyKHMgPT4gIXMucXVlcnlTZWxlY3Rvcignc2VjdGlvbicpKTtcclxuICAgIGNvbnN0IG5vZGVzVG9SZW5kZXI6IEhUTUxFbGVtZW50W10gPVxyXG4gICAgICBsZWFmU2VjdGlvbnMubGVuZ3RoID8gbGVhZlNlY3Rpb25zIDogKGFsbFNlY3Rpb25zLmxlbmd0aCA/IGFsbFNlY3Rpb25zIDogW3Jvb3RdKTtcclxuXHJcbiAgICBjb25zdCBwYWdlV2lkdGggPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0V2lkdGgoKTtcclxuICAgIGNvbnN0IHBhZ2VIZWlnaHQgPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlc1RvUmVuZGVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGVsID0gbm9kZXNUb1JlbmRlcltpXTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBkYXRhVXJsID0gYXdhaXQgdG9KcGVnKGVsLCB7IHF1YWxpdHk6IDEsIGJhY2tncm91bmRDb2xvcjogJ3doaXRlJyB9KTtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB3ID0gaW1nLndpZHRoO1xyXG4gICAgICAgICAgICBjb25zdCBoID0gaW1nLmhlaWdodDtcclxuICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbihwYWdlV2lkdGggLyB3LCBwYWdlSGVpZ2h0IC8gaCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlclcgPSB3ICogc2NhbGU7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlckggPSBoICogc2NhbGU7XHJcblxyXG4gICAgICAgICAgICBkb2MuYWRkSW1hZ2UoZGF0YVVybCwgJ0pQRycsIDAsIDAsIHJlbmRlclcsIHJlbmRlckgpO1xyXG4gICAgICAgICAgICBpZiAoaSA8IG5vZGVzVG9SZW5kZXIubGVuZ3RoIC0gMSkgZG9jLmFkZFBhZ2UoKTtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIGltZy5zcmMgPSBkYXRhVXJsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZW5lcmF0aW5nIGltYWdlOicsIGVycik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY3JlYXRlZFRlbXAgJiYgcm9vdCAmJiByb290LnBhcmVudE5vZGUpIHtcclxuICAgICAgcm9vdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVuYWJsZUxvY2FsUHJldmlldyBjYW4gYmUgZW5hYmxlZCB0byBzZWUgdGhlIG91dHB1dCB3aXRob3V0IHNlbmRpbmcgZW1haWxcclxuICAgIGlmICh0aGlzLmVuYWJsZUxvY2FsUHJldmlldyAmJiB0aGlzLl9pc0xvY2FsaG9zdCgpKSB7XHJcbiAgICAgIGNvbnN0IGJsb2IgPSBkb2Mub3V0cHV0KCdibG9iJyk7XHJcbiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgIHdpbmRvdy5vcGVuKHVybCBhcyB1bmtub3duIGFzIHN0cmluZywgJ19ibGFuaycpO1xyXG4gICAgICB0aGlzLnNob3dMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgaWYgKGNsZWFyQnV0dG9uKSBjbGVhckJ1dHRvbi5oaWRkZW4gPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHRlbXBGaWxlID0gZG9jLm91dHB1dCgnZGF0YXVyaXN0cmluZycpO1xyXG4gICAgICBjb25zdCBmaWxlID0gdGhpcy5kYXRhVVJJdG9CbG9iKHRlbXBGaWxlKTtcclxuICAgICAgY29uc3QgZmlsZUFzQ29Eb2N1bWVudCA9IGF3YWl0IEZpbGVVdGlscy5SZWFkRmlsZUFzTmV3Q29Eb2N1bWVudChmaWxlKTtcclxuICAgICAgZmlsZUFzQ29Eb2N1bWVudC5maWxlVHlwZSA9IEZpbGVVdGlscy5Jc0ltYWdlRmlsZShmaWxlKSA/IEZpbGVUeXBlLkltYWdlIDogRmlsZVR5cGUuRG9jdW1lbnQ7XHJcbiAgICAgIGZpbGVBc0NvRG9jdW1lbnQuY3JlYXRpb25EYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgZmlsZUFzQ29Eb2N1bWVudC5tb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICBmaWxlQXNDb0RvY3VtZW50LnJlcG9ydHMgPSAxO1xyXG4gICAgICB0aGlzLmFkZGl0aW9uYWxGaWxlQ2hhbmdlRXZlbnQuZW1pdChmaWxlQXNDb0RvY3VtZW50KTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignUERGIHBhY2thZ2luZyBmYWlsZWQ6JywgZSk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLnNob3dMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jbG9zZVBERkRpYWxvZy5lbWl0KCk7XHJcbiAgICAgIGlmIChjbGVhckJ1dHRvbikgY2xlYXJCdXR0b24uaGlkZGVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGF0YVVSSXRvQmxvYihkYXRhVVJJKTogRmlsZSB7XHJcbiAgICBjb25zdCBieXRlU3RyaW5nOiBzdHJpbmcgPSBhdG9iKGRhdGFVUkkuc3BsaXQoJywnKVsxXSk7XHJcbiAgICBjb25zdCBhYjogQXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xyXG4gICAgY29uc3QgaWE6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhYik7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYnl0ZVN0cmluZy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpYVtpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgRmlsZShbYWJdLCB0aGlzLmFkZGl0aW9uYWxGaWxlTmFtZSArICcucGRmJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlQ2xlYXIoKTogdm9pZCB7XHJcbiAgICBPYmplY3QudmFsdWVzKHRoaXMuc2lnbmF0dXJlUGFkcykuZm9yRWFjaChzaWduYXR1cmVQYWQgPT4ge1xyXG4gICAgICBzaWduYXR1cmVQYWQ/LmNsZWFyKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Jlc2l6ZVNpZ25hdHVyZUNhbnZhcyhzaWduYXR1cmU6IFNpZ25hdHVyZVBhZCwgc2lnbmF0dXJlQ2FudmFzOiBFbGVtZW50UmVmKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbWFnZUJlZm9yZVJlc2l6ZTogc3RyaW5nID0gc2lnbmF0dXJlLnRvRGF0YVVSTCgpO1xyXG4gICAgY29uc3QgcmF0aW86IG51bWJlciA9IE1hdGgubWF4KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEsIDEpO1xyXG4gICAgc2lnbmF0dXJlQ2FudmFzLm5hdGl2ZUVsZW1lbnQud2lkdGggPSBzaWduYXR1cmVDYW52YXMubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAqIHJhdGlvO1xyXG4gICAgc2lnbmF0dXJlQ2FudmFzLm5hdGl2ZUVsZW1lbnQuaGVpZ2h0ID0gc2lnbmF0dXJlQ2FudmFzLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICogcmF0aW87XHJcbiAgICBzaWduYXR1cmVDYW52YXMubmF0aXZlRWxlbWVudC5nZXRDb250ZXh0KFwiMmRcIikuc2NhbGUocmF0aW8sIHJhdGlvKTtcclxuICAgIHNpZ25hdHVyZS5mcm9tRGF0YVVSTChpbWFnZUJlZm9yZVJlc2l6ZSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==