@firestitch/report 18.8.1 → 18.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/components/component-text/component-text.component.d.ts +47 -2
- package/app/reports/components/component-text/value-embed.plugin.d.ts +67 -0
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +34 -9
- package/app/reports/components/report-component/report-component.component.d.ts +10 -1
- package/app/reports/data/report.data.d.ts +2 -1
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +8 -0
- package/app/reports/enums/report-value-formula.enum.d.ts +6 -0
- package/app/reports/export/report-export-collector.service.d.ts +22 -0
- package/app/reports/export/report-export.service.d.ts +3 -1
- package/app/reports/export/report-pdf.service.d.ts +18 -2
- package/app/reports/export/report-pptx.service.d.ts +15 -2
- package/app/reports/export/report-text-layout.service.d.ts +35 -0
- package/app/reports/format.d.ts +2 -0
- package/app/reports/interfaces/report.interface.d.ts +21 -2
- package/app/reports/layout.d.ts +2 -0
- package/app/reports/services/report-filter-state.service.d.ts +1 -1
- package/app/reports/text.d.ts +50 -0
- package/app/reports/values.d.ts +17 -0
- package/esm2022/app/reports/components/component-text/component-text.component.mjs +213 -16
- package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +484 -0
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +260 -34
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +65 -19
- package/esm2022/app/reports/data/report.data.mjs +19 -1
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +134 -23
- package/esm2022/app/reports/enums/report-value-formula.enum.mjs +14 -0
- package/esm2022/app/reports/export/report-export-collector.service.mjs +147 -43
- package/esm2022/app/reports/export/report-export.service.mjs +57 -19
- package/esm2022/app/reports/export/report-pdf.service.mjs +304 -65
- package/esm2022/app/reports/export/report-pptx.service.mjs +276 -58
- package/esm2022/app/reports/export/report-text-layout.service.mjs +241 -0
- package/esm2022/app/reports/format.mjs +12 -9
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/layout.mjs +11 -1
- package/esm2022/app/reports/services/report-filter-state.service.mjs +19 -10
- package/esm2022/app/reports/text.mjs +293 -85
- package/esm2022/app/reports/values.mjs +183 -0
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +4 -1
- package/esm2022/app/reports/views/report/report.component.mjs +4 -1
- package/esm2022/public_api.mjs +2 -1
- package/fesm2022/{firestitch-report-echarts-CFnbJx44.mjs → firestitch-report-echarts-DBMOHmBF.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-CFnbJx44.mjs.map → firestitch-report-echarts-DBMOHmBF.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-CSylkyko.mjs → firestitch-report-firestitch-report-CqbXT1gh.mjs} +3270 -947
- package/fesm2022/firestitch-report-firestitch-report-CqbXT1gh.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/fesm2022/firestitch-report-firestitch-report-CSylkyko.mjs.map +0 -1
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
2
|
import { ReportKpiTrend } from '../enums/report-kpi-trend.enum';
|
|
3
3
|
import { resolveReportTimezone } from '../format';
|
|
4
4
|
import { kpiCardView, kpiSparklineGeometry, } from '../kpi-card';
|
|
5
5
|
import { DEFAULT_COMPONENT_PADDING } from '../layout';
|
|
6
|
-
import { DEFAULT_TEXT_COLOR, DEFAULT_TEXT_SIZE,
|
|
6
|
+
import { DEFAULT_TEXT_COLOR, DEFAULT_TEXT_SIZE, TEXT_TABLE_BORDER_COLOR, TEXT_TABLE_BORDER_WIDTH, TEXT_TABLE_CELL_PADDING, TEXT_TABLE_MARGIN, textBlocks, } from '../text';
|
|
7
7
|
import { REPORT_KPI_CHANGE_COLORS, REPORT_KPI_SPARKLINE_COLOR, REPORT_KPI_TRACK_COLOR, REPORT_MUTED_TEXT_COLOR, } from '../theme/palette';
|
|
8
|
+
import { isDrawn } from '../values';
|
|
8
9
|
import { renderChartImage } from './offscreen-chart';
|
|
9
|
-
import { coverLines, emptyLabel, exportCell, exportNoteLines, exportTitle, exportWindowsLine, kpiCardHasExtras, kpiExportHeight, kpiExportParts, listColumns, listHeadings, listTotalsRow, moreRowsNotice, scaledKpiHeights, } from './report-export-collector.service';
|
|
10
|
+
import { HEADER_FOOTER_NAME, coverLines, emptyLabel, exportCell, exportNoteLines, exportTitle, exportWindowsLine, kpiCardHasExtras, kpiExportHeight, kpiExportParts, listColumns, listHeadings, listTotalsRow, moreRowsNotice, scaledKpiHeights, textOverflow, } from './report-export-collector.service';
|
|
11
|
+
import { ReportTextLayoutService } from './report-text-layout.service';
|
|
10
12
|
import * as i0 from "@angular/core";
|
|
11
13
|
// Inches → points (the PDF unit).
|
|
12
14
|
const PT = 72;
|
|
@@ -65,6 +67,9 @@ const TEXT_LINE_HEIGHT = 1.25;
|
|
|
65
67
|
// How far a list item's text sits from the block's edge, points; the marker
|
|
66
68
|
// hangs in that space.
|
|
67
69
|
const LIST_INDENT = 16;
|
|
70
|
+
// What the export's overflow gate says the PDF does with a text block that does
|
|
71
|
+
// not fit its box.
|
|
72
|
+
const PDF_OVERFLOW_NOTE = 'The PDF cuts it off at the bottom of its box.';
|
|
68
73
|
// Builds the PDF client-side with jspdf. The report's unit is inches and PDFs
|
|
69
74
|
// are points at exactly 72/inch, so each report page becomes one PDF page of
|
|
70
75
|
// the exact physical size and components land at their precise positions.
|
|
@@ -77,8 +82,15 @@ const LIST_INDENT = 16;
|
|
|
77
82
|
// fit continue on pages of their own after the report page, under the same
|
|
78
83
|
// header/footer and with the same column widths, up to PDF_LIST_ROWS; a
|
|
79
84
|
// longer result ends in a row pointing to the component's CSV export.
|
|
85
|
+
//
|
|
86
|
+
// A text block's tables are drawn by autoTable too, from the line its words
|
|
87
|
+
// reach, in the column widths the canvas gives them (ReportTextLayoutService).
|
|
88
|
+
// A text block is cut at the bottom of its box, as the canvas clips it, and
|
|
89
|
+
// build() hands the file back unsaved with the blocks it cut, so the export
|
|
90
|
+
// can ask about them before it saves.
|
|
80
91
|
export class ReportPdfService {
|
|
81
|
-
|
|
92
|
+
_textLayout = inject(ReportTextLayoutService);
|
|
93
|
+
async build(collected) {
|
|
82
94
|
const context = await this._context(collected);
|
|
83
95
|
this._titlePage(context.doc, collected, context.pageW, context.pageH);
|
|
84
96
|
// The physical page number {{page.number}} prints: report pages and
|
|
@@ -91,10 +103,16 @@ export class ReportPdfService {
|
|
|
91
103
|
// Each continuation appends its pages at the end of the document, so
|
|
92
104
|
// two lists that overflowed on one page follow it back to back.
|
|
93
105
|
for (const overflow of overflows) {
|
|
94
|
-
pageNumber = this._renderContinuation(context, collectedPage.page, index, pageNumber, overflow);
|
|
106
|
+
pageNumber = await this._renderContinuation(context, collectedPage.page, index, pageNumber, overflow);
|
|
95
107
|
}
|
|
96
108
|
}
|
|
97
|
-
|
|
109
|
+
return {
|
|
110
|
+
overflows: [...context.textOverflows.values()],
|
|
111
|
+
overflowNote: PDF_OVERFLOW_NOTE,
|
|
112
|
+
save: () => {
|
|
113
|
+
context.doc.save(`${this._slug(collected.report.name)}.pdf`);
|
|
114
|
+
},
|
|
115
|
+
};
|
|
98
116
|
}
|
|
99
117
|
async _context(collected) {
|
|
100
118
|
const report = collected.report;
|
|
@@ -113,31 +131,47 @@ export class ReportPdfService {
|
|
|
113
131
|
pageW,
|
|
114
132
|
pageH,
|
|
115
133
|
orientation,
|
|
134
|
+
masterValues: this._pdfValues(collected.masterValues),
|
|
135
|
+
textOverflows: new Map(),
|
|
116
136
|
};
|
|
117
137
|
}
|
|
118
138
|
// One report page: the header and footer first, under the page's own
|
|
119
139
|
// components. A list that outgrows its box leaves its remaining rows in
|
|
120
|
-
// overflows.
|
|
140
|
+
// overflows. The page's text fills its value tokens with the page's values.
|
|
121
141
|
async _renderPage(context, collectedPage, index, pageNumber, overflows) {
|
|
122
142
|
const { doc, report } = context;
|
|
123
143
|
const tokens = this._tokens(report, collectedPage.page, index, pageNumber);
|
|
144
|
+
const pageTokens = { ...tokens, values: this._pdfValues(collectedPage.values) };
|
|
124
145
|
doc.addPage([context.pageW, context.pageH], context.orientation);
|
|
125
|
-
this._renderMaster(context, collectedPage.page, tokens);
|
|
146
|
+
await this._renderMaster(context, collectedPage.page, tokens);
|
|
126
147
|
for (const item of collectedPage.components) {
|
|
127
|
-
if (item.component.type
|
|
128
|
-
this._renderText(doc, item.component, tokens);
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
148
|
+
if (item.component.type !== 'text') {
|
|
131
149
|
await this._renderComponent(context, item, overflows);
|
|
132
150
|
}
|
|
151
|
+
else if (await this._renderText(context, item.component, pageTokens)) {
|
|
152
|
+
this._recordOverflow(context, item.component, tokens.pageName, pageTokens);
|
|
153
|
+
}
|
|
133
154
|
}
|
|
134
155
|
}
|
|
135
|
-
|
|
156
|
+
// The header and footer, their value tokens filled with the master's values
|
|
157
|
+
// whichever page they sit on: a report page or a continuation page.
|
|
158
|
+
async _renderMaster(context, page, tokens) {
|
|
136
159
|
if (page.masterHidden) {
|
|
137
160
|
return;
|
|
138
161
|
}
|
|
139
|
-
|
|
140
|
-
|
|
162
|
+
const masterTokens = { ...tokens, values: context.masterValues };
|
|
163
|
+
for (const component of (context.report.master?.components ?? []).filter(isDrawn)) {
|
|
164
|
+
if (await this._renderText(context, component, masterTokens)) {
|
|
165
|
+
this._recordOverflow(context, component, HEADER_FOOTER_NAME, masterTokens);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Lists a text block that was cut, under the page the export's overflow gate
|
|
170
|
+
// names it by. A block cut again on a later page (a header or footer) keeps
|
|
171
|
+
// the first entry.
|
|
172
|
+
_recordOverflow(context, component, page, tokens) {
|
|
173
|
+
if (!context.textOverflows.has(component.id)) {
|
|
174
|
+
context.textOverflows.set(component.id, textOverflow(component, page, tokens));
|
|
141
175
|
}
|
|
142
176
|
}
|
|
143
177
|
_titlePage(doc, collected, pageW, pageH) {
|
|
@@ -150,54 +184,232 @@ export class ReportPdfService {
|
|
|
150
184
|
doc.setTextColor('#52606d');
|
|
151
185
|
doc.text(coverLines(collected).map((line) => this._pdfText(line)), 40, pageH * 0.35 + 26);
|
|
152
186
|
}
|
|
153
|
-
// A text block, laid out by hand: jsPDF draws strings, not rich text, so
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
//
|
|
157
|
-
|
|
187
|
+
// A text block, laid out by hand: jsPDF draws strings, not rich text, so the
|
|
188
|
+
// words between its tables are drawn line by line (_drawParagraphs) and each
|
|
189
|
+
// table by autoTable from the line the words above it reach
|
|
190
|
+
// (_drawTextTable). Only a block with a table is measured, for the edges
|
|
191
|
+
// and column widths the canvas gives its tables. Whatever runs past
|
|
192
|
+
// the block's height is left off — the canvas clips the block there too.
|
|
193
|
+
// Returns whether anything was.
|
|
194
|
+
async _renderText(context, component, tokens) {
|
|
195
|
+
const box = this._textBox(component);
|
|
196
|
+
const blocks = textBlocks(component.config?.html ?? '', tokens);
|
|
197
|
+
const layout = blocks.some((block) => block.kind === 'table')
|
|
198
|
+
? await this._textLayout.measure(component, tokens)
|
|
199
|
+
: null;
|
|
200
|
+
let cursorY = box.top;
|
|
201
|
+
let tableIndex = 0;
|
|
202
|
+
// The cursor sits on a table's bottom margin, nothing drawn since: the
|
|
203
|
+
// next table's top margin is the same space, as two block margins that
|
|
204
|
+
// meet collapse into one on the canvas.
|
|
205
|
+
let onMargin = false;
|
|
206
|
+
for (const block of blocks) {
|
|
207
|
+
const drawn = block.kind === 'text'
|
|
208
|
+
? this._drawParagraphs(context.doc, block.paragraphs, box, cursorY)
|
|
209
|
+
: this._drawTextTable(context, block.table, layout?.tables[tableIndex++] ?? null, box, onMargin ? cursorY : cursorY + TEXT_TABLE_MARGIN);
|
|
210
|
+
if (drawn.cut) {
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
cursorY = drawn.cursorY;
|
|
214
|
+
onMargin = block.kind === 'table' || (onMargin && !block.paragraphs.length);
|
|
215
|
+
}
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
// Where a text block's words go: inside its padding, each edge 1/8" unless
|
|
219
|
+
// set.
|
|
220
|
+
_textBox(component) {
|
|
158
221
|
const padding = component.config?.padding;
|
|
159
222
|
const inset = (value) => (value ?? DEFAULT_COMPONENT_PADDING) * PT;
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
223
|
+
return {
|
|
224
|
+
left: component.x * PT + inset(padding?.left),
|
|
225
|
+
top: component.y * PT + inset(padding?.top),
|
|
226
|
+
width: component.w * PT - inset(padding?.left) - inset(padding?.right),
|
|
227
|
+
bottom: (component.y + component.h) * PT - inset(padding?.bottom),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// Paragraphs drawn line by line from cursorY down: each one's runs are broken
|
|
231
|
+
// into words, wrapped to the box's width and drawn word by word in their own
|
|
232
|
+
// font, size and color, a list item's marker hung in its indent. The first
|
|
233
|
+
// line that would run past the box's bottom ends the drawing, cut.
|
|
234
|
+
_drawParagraphs(doc, paragraphs, box, cursorY) {
|
|
235
|
+
let y = cursorY;
|
|
165
236
|
let listNumber = 0;
|
|
166
|
-
for (const paragraph of
|
|
237
|
+
for (const paragraph of paragraphs) {
|
|
167
238
|
listNumber = paragraph.bullet === 'number' ? listNumber + 1 : 0;
|
|
168
239
|
const indent = paragraph.bullet ? LIST_INDENT : 0;
|
|
169
|
-
const lines = this._wrap(doc, paragraph, width - indent);
|
|
170
|
-
lines.
|
|
171
|
-
const size =
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
cursorY = Infinity;
|
|
175
|
-
return;
|
|
240
|
+
const lines = this._wrap(doc, paragraph, box.width - indent);
|
|
241
|
+
for (const [lineIndex, line] of lines.entries()) {
|
|
242
|
+
const size = this._lineSize(paragraph, line);
|
|
243
|
+
if (y + size * TEXT_LINE_HEIGHT > box.bottom + 0.5) {
|
|
244
|
+
return { cursorY: y, cut: true };
|
|
176
245
|
}
|
|
177
|
-
const baseline = cursorY + size;
|
|
178
|
-
const lineWidth = line.reduce((sum, word) => sum + word.width, 0);
|
|
179
|
-
let x = left + indent + this._alignOffset(paragraph.align, width - indent, lineWidth);
|
|
180
246
|
if (lineIndex === 0 && paragraph.bullet) {
|
|
181
247
|
this._font(doc, line[0]?.run ?? { text: '' }, size);
|
|
182
|
-
doc.text(paragraph.bullet === 'number' ? `${listNumber}.` : '•', left,
|
|
183
|
-
}
|
|
184
|
-
for (const word of line) {
|
|
185
|
-
this._drawWord(doc, word, x, baseline);
|
|
186
|
-
x += word.width;
|
|
248
|
+
doc.text(paragraph.bullet === 'number' ? `${listNumber}.` : '•', box.left, y + size);
|
|
187
249
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
if (cursorY === Infinity) {
|
|
191
|
-
break;
|
|
250
|
+
this._drawLine(doc, line, paragraph.align, box.left + indent, box.width - indent, y + size);
|
|
251
|
+
y += size * TEXT_LINE_HEIGHT;
|
|
192
252
|
}
|
|
193
253
|
// An empty paragraph is still a line.
|
|
194
254
|
if (!lines.length) {
|
|
195
|
-
|
|
255
|
+
y += DEFAULT_TEXT_SIZE * TEXT_LINE_HEIGHT;
|
|
196
256
|
}
|
|
197
257
|
}
|
|
258
|
+
return { cursorY: y, cut: false };
|
|
259
|
+
}
|
|
260
|
+
// How far _drawParagraphs takes its cursor down drawing the paragraphs whole
|
|
261
|
+
// at a width.
|
|
262
|
+
_paragraphsHeight(doc, paragraphs, width) {
|
|
263
|
+
return paragraphs.reduce((height, paragraph) => {
|
|
264
|
+
const lines = this._wrap(doc, paragraph, width - (paragraph.bullet ? LIST_INDENT : 0));
|
|
265
|
+
return height + (lines.length
|
|
266
|
+
? lines.reduce((sum, line) => sum + this._lineSize(paragraph, line) * TEXT_LINE_HEIGHT, 0)
|
|
267
|
+
: DEFAULT_TEXT_SIZE * TEXT_LINE_HEIGHT);
|
|
268
|
+
}, 0);
|
|
269
|
+
}
|
|
270
|
+
// A line's font size: its largest word's, and never under its paragraph's
|
|
271
|
+
// first run's.
|
|
272
|
+
_lineSize(paragraph, line) {
|
|
273
|
+
return Math.max(...line.map((word) => word.size), paragraph.runs[0]?.fontSize ?? DEFAULT_TEXT_SIZE);
|
|
274
|
+
}
|
|
275
|
+
// One wrapped line on its baseline, aligned within the width from left.
|
|
276
|
+
_drawLine(doc, line, align, left, width, baseline) {
|
|
277
|
+
const lineWidth = line.reduce((sum, word) => sum + word.width, 0);
|
|
278
|
+
let x = left + this._alignOffset(align, width, lineWidth);
|
|
279
|
+
for (const word of line) {
|
|
280
|
+
this._drawWord(doc, word, x, baseline);
|
|
281
|
+
x += word.width;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// A table in a text block, drawn by autoTable from top (_renderText puts it
|
|
285
|
+
// TEXT_TABLE_MARGIN under the line the words above it reach), in the one
|
|
286
|
+
// look every renderer draws (TEXT_TABLE_* in text.ts). Its left edge, width
|
|
287
|
+
// and column widths are the canvas's (layout), else the box's width split
|
|
288
|
+
// evenly. A row is as tall as its cells' words wrapped as _drawParagraphs
|
|
289
|
+
// wraps them, and the words are drawn into each cell once autoTable has
|
|
290
|
+
// drawn its grid lines and fill (_drawTextCell), so they keep their runs'
|
|
291
|
+
// fonts and colors. Only the rows the box holds are drawn, and a table that
|
|
292
|
+
// loses any is cut. The cursor it leaves is TEXT_TABLE_MARGIN under it.
|
|
293
|
+
_drawTextTable(context, table, layout, box, top) {
|
|
294
|
+
if (top >= box.bottom) {
|
|
295
|
+
return { cursorY: top, cut: true };
|
|
296
|
+
}
|
|
297
|
+
const left = box.left + (layout?.left ?? 0) * PT;
|
|
298
|
+
const width = layout ? layout.width * PT : box.width;
|
|
299
|
+
const columnWidths = layout?.columnWidths.length === table.columns
|
|
300
|
+
? layout.columnWidths.map((columnWidth) => columnWidth * PT)
|
|
301
|
+
: Array.from({ length: table.columns }, () => width / table.columns);
|
|
302
|
+
const body = table.rows.map((row) => row.cells.map((cell) => this._textCellInput(context.doc, cell, columnWidths)));
|
|
303
|
+
const options = this._textTableOptions(context, columnWidths, left, top, width, box.bottom);
|
|
304
|
+
const fit = this._textTableFit(context, { ...options, body });
|
|
305
|
+
if (fit) {
|
|
306
|
+
this._drawTable(context, { ...options, body: this._keptRows(body, fit) });
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
cursorY: fit ? context.doc.lastAutoTable.finalY + TEXT_TABLE_MARGIN : top,
|
|
310
|
+
cut: fit < table.rows.length,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
// A text table's cell as autoTable takes it: its spans and fill and, when it
|
|
314
|
+
// is one row tall, the height its words need at the width it spans. A cell
|
|
315
|
+
// that spans rows shares theirs.
|
|
316
|
+
_textCellInput(doc, cell, columnWidths) {
|
|
317
|
+
const padding = TEXT_TABLE_CELL_PADDING;
|
|
318
|
+
const width = columnWidths
|
|
319
|
+
.slice(cell.column, cell.column + cell.colSpan)
|
|
320
|
+
.reduce((sum, columnWidth) => sum + columnWidth, 0) - 2 * padding.horizontal;
|
|
321
|
+
return {
|
|
322
|
+
content: '',
|
|
323
|
+
colSpan: cell.colSpan,
|
|
324
|
+
rowSpan: cell.rowSpan,
|
|
325
|
+
textCell: cell,
|
|
326
|
+
styles: {
|
|
327
|
+
...(cell.fill ? { fillColor: cell.fill } : {}),
|
|
328
|
+
...(cell.rowSpan === 1
|
|
329
|
+
? { minCellHeight: this._paragraphsHeight(doc, cell.paragraphs, width) + 2 * padding.vertical }
|
|
330
|
+
: {}),
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
// The autoTable options a text table's dry run and its draw share. Every
|
|
335
|
+
// column is listed and fixed at its width: autoTable would otherwise count
|
|
336
|
+
// the columns of the first row, which may be narrower than the grid. A row
|
|
337
|
+
// is never split at the box's bottom: it fits whole or moves past it. bottom
|
|
338
|
+
// is the box's.
|
|
339
|
+
_textTableOptions(context, columnWidths, left, top, width, bottom) {
|
|
340
|
+
const padding = TEXT_TABLE_CELL_PADDING;
|
|
341
|
+
return {
|
|
342
|
+
theme: 'plain',
|
|
343
|
+
columns: columnWidths.map((_, index) => ({ dataKey: index })),
|
|
344
|
+
startY: top,
|
|
345
|
+
margin: { left, right: context.pageW - left - width, bottom: context.pageH - bottom },
|
|
346
|
+
tableWidth: width,
|
|
347
|
+
columnStyles: Object.fromEntries(columnWidths.map((cellWidth, index) => [index, { cellWidth }])),
|
|
348
|
+
rowPageBreak: 'avoid',
|
|
349
|
+
styles: {
|
|
350
|
+
font: 'helvetica',
|
|
351
|
+
fontStyle: 'normal',
|
|
352
|
+
fontSize: DEFAULT_TEXT_SIZE,
|
|
353
|
+
cellPadding: {
|
|
354
|
+
top: padding.vertical, right: padding.horizontal, bottom: padding.vertical, left: padding.horizontal,
|
|
355
|
+
},
|
|
356
|
+
lineColor: TEXT_TABLE_BORDER_COLOR,
|
|
357
|
+
lineWidth: TEXT_TABLE_BORDER_WIDTH,
|
|
358
|
+
valign: 'middle',
|
|
359
|
+
textColor: DEFAULT_TEXT_COLOR,
|
|
360
|
+
},
|
|
361
|
+
didDrawCell: (hook) => this._drawTextCell(hook),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
// How many of a text table's rows its box holds: the rows autoTable draws
|
|
365
|
+
// whole on the first page when it lays the table out on a scratch document
|
|
366
|
+
// of the same page size, as _measure does for a list. A row taller than a
|
|
367
|
+
// page is split across pages rather than moved, so it does not count.
|
|
368
|
+
_textTableFit(context, options) {
|
|
369
|
+
const scratch = this._scratchDocument(context);
|
|
370
|
+
let fit = 0;
|
|
371
|
+
context.autoTable(scratch, {
|
|
372
|
+
...options,
|
|
373
|
+
didDrawCell: (hook) => {
|
|
374
|
+
if (scratch.getCurrentPageInfo().pageNumber === 1 && !hook.row.spansMultiplePages) {
|
|
375
|
+
fit = Math.max(fit, hook.row.index + 1);
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
});
|
|
379
|
+
return fit;
|
|
380
|
+
}
|
|
381
|
+
// The first `fit` rows, a cell that spans down past the last of them cut
|
|
382
|
+
// there.
|
|
383
|
+
_keptRows(body, fit) {
|
|
384
|
+
return body.slice(0, fit).map((row) => row.map((input) => {
|
|
385
|
+
const rowSpan = Math.min(input.rowSpan, fit - input.textCell.row);
|
|
386
|
+
return rowSpan === input.rowSpan ? input : { ...input, rowSpan };
|
|
387
|
+
}));
|
|
388
|
+
}
|
|
389
|
+
// A text table cell's words, drawn once autoTable has drawn the cell: inside
|
|
390
|
+
// its padding, wrapped to its width and placed by its vertical alignment, the
|
|
391
|
+
// middle unless set. Lines past the cell are left off.
|
|
392
|
+
_drawTextCell(hook) {
|
|
393
|
+
const cell = hook.cell.raw?.textCell;
|
|
394
|
+
if (!cell) {
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
const { x, y, width, height } = hook.cell;
|
|
398
|
+
const box = {
|
|
399
|
+
left: x + hook.cell.padding('left'),
|
|
400
|
+
top: y + hook.cell.padding('top'),
|
|
401
|
+
width: width - hook.cell.padding('horizontal'),
|
|
402
|
+
bottom: y + height - hook.cell.padding('bottom'),
|
|
403
|
+
};
|
|
404
|
+
const spare = Math.max(0, box.bottom - box.top - this._paragraphsHeight(hook.doc, cell.paragraphs, box.width));
|
|
405
|
+
const offset = cell.valign === 'top' ? 0 : (cell.valign === 'bottom' ? spare : spare / 2);
|
|
406
|
+
this._drawParagraphs(hook.doc, cell.paragraphs, box, box.top + offset);
|
|
198
407
|
}
|
|
199
408
|
// Break a paragraph's runs into lines of measured words that fit the width.
|
|
200
|
-
// A word keeps its trailing space so spacing survives run boundaries.
|
|
409
|
+
// A word keeps its trailing space so spacing survives run boundaries. A
|
|
410
|
+
// no-break space is part of its word, never a break between two: a number
|
|
411
|
+
// grouped with one (fr-CA's thousands, or a narrow space _pdfText turned
|
|
412
|
+
// into one) stays on one line.
|
|
201
413
|
_wrap(doc, paragraph, width) {
|
|
202
414
|
const lines = [];
|
|
203
415
|
let line = [];
|
|
@@ -205,7 +417,7 @@ export class ReportPdfService {
|
|
|
205
417
|
for (const run of paragraph.runs) {
|
|
206
418
|
const size = run.fontSize ?? DEFAULT_TEXT_SIZE;
|
|
207
419
|
this._font(doc, run, size);
|
|
208
|
-
for (const text of run.text.match(
|
|
420
|
+
for (const text of run.text.match(/(?:[^\s]|\u00a0)+[^\S\u00a0]*|[^\S\u00a0]+/g) ?? []) {
|
|
209
421
|
const wordWidth = doc.getTextWidth(text);
|
|
210
422
|
if (line.length && lineWidth + wordWidth - this._trailingSpace(doc, text) > width) {
|
|
211
423
|
lines.push(line);
|
|
@@ -477,11 +689,7 @@ export class ReportPdfService {
|
|
|
477
689
|
// body row fits under the head (or the head itself did not fit): autoTable
|
|
478
690
|
// moved to a new page before drawing. The real document is untouched.
|
|
479
691
|
_measure(context, head, cells, numeric, foot, x, y, w, bottom) {
|
|
480
|
-
const scratch =
|
|
481
|
-
unit: 'pt',
|
|
482
|
-
format: [context.pageW, context.pageH],
|
|
483
|
-
orientation: context.orientation,
|
|
484
|
-
});
|
|
692
|
+
const scratch = this._scratchDocument(context);
|
|
485
693
|
let fit = 0;
|
|
486
694
|
context.autoTable(scratch, {
|
|
487
695
|
...this._tableOptions(context, head, numeric, cells, x, y, w, bottom, undefined, foot),
|
|
@@ -505,10 +713,20 @@ export class ReportPdfService {
|
|
|
505
713
|
}
|
|
506
714
|
return { fit, columnStyles };
|
|
507
715
|
}
|
|
508
|
-
//
|
|
509
|
-
//
|
|
510
|
-
|
|
511
|
-
|
|
716
|
+
// A blank document of the export's page size, for laying a table out to see
|
|
717
|
+
// what fits before the real one is drawn on.
|
|
718
|
+
_scratchDocument(context) {
|
|
719
|
+
return new context.jsPDF({
|
|
720
|
+
unit: 'pt',
|
|
721
|
+
format: [context.pageW, context.pageH],
|
|
722
|
+
orientation: context.orientation,
|
|
723
|
+
});
|
|
724
|
+
}
|
|
725
|
+
// Draws an on-page table (a list's, or a text block's), then removes any
|
|
726
|
+
// page the draw added. That should never happen: the measured fit, the
|
|
727
|
+
// identical column widths and a single-line notice keep the table inside its
|
|
728
|
+
// box. The check exists so a stray page can never catch the report page's
|
|
729
|
+
// remaining components.
|
|
512
730
|
_drawTable(context, options) {
|
|
513
731
|
const { doc } = context;
|
|
514
732
|
const page = doc.getCurrentPageInfo().pageNumber;
|
|
@@ -523,16 +741,17 @@ export class ReportPdfService {
|
|
|
523
741
|
// the report page, each with the page's header and footer, the table's
|
|
524
742
|
// title and its head again. The table sits CONTINUATION_GAP inside the
|
|
525
743
|
// bands. Returns the physical page counter after these pages.
|
|
526
|
-
_renderContinuation(context, page, index, pageNumber, overflow) {
|
|
527
|
-
const { doc
|
|
528
|
-
const bands = page.masterHidden ? NO_BANDS : report.config?.headerFooter ?? NO_BANDS;
|
|
744
|
+
async _renderContinuation(context, page, index, pageNumber, overflow) {
|
|
745
|
+
const { doc } = context;
|
|
746
|
+
const bands = page.masterHidden ? NO_BANDS : context.report.config?.headerFooter ?? NO_BANDS;
|
|
529
747
|
const top = this._continuationMargin(bands.headerHeight);
|
|
530
748
|
const bottom = this._continuationMargin(bands.footerHeight);
|
|
531
749
|
const { x, w } = overflow;
|
|
532
750
|
const body = overflow.omitted > 0
|
|
533
751
|
? [...overflow.rows, this._noticeRow(moreRowsNotice(overflow.omitted), overflow.head.length, false)]
|
|
534
752
|
: overflow.rows;
|
|
535
|
-
|
|
753
|
+
// The document's pages the table draws on, in order.
|
|
754
|
+
const pages = [];
|
|
536
755
|
doc.addPage([context.pageW, context.pageH], context.orientation);
|
|
537
756
|
context.autoTable(doc, {
|
|
538
757
|
...this._tableOptions(context, overflow.head, overflow.numeric, body, x, top + TITLE_H, w, bottom, overflow.columnStyles, overflow.foot),
|
|
@@ -540,12 +759,24 @@ export class ReportPdfService {
|
|
|
540
759
|
showHead: 'everyPage',
|
|
541
760
|
// Fires on every page the table draws on, the first included.
|
|
542
761
|
willDrawPage: () => {
|
|
543
|
-
|
|
544
|
-
this._renderMaster(context, page, this._tokens(report, page, index, counter));
|
|
762
|
+
pages.push(doc.getCurrentPageInfo().pageNumber);
|
|
545
763
|
this._componentTitle(doc, this._continuedTitle(overflow.component, overflow.search), x, top, w);
|
|
546
764
|
},
|
|
547
765
|
});
|
|
548
|
-
|
|
766
|
+
await this._renderContinuationMasters(context, page, index, pageNumber, pages);
|
|
767
|
+
return pageNumber + pages.length;
|
|
768
|
+
}
|
|
769
|
+
// The header and footer of each continuation page, numbered on from
|
|
770
|
+
// pageNumber. They go on once the table is drawn, since a text block with a
|
|
771
|
+
// table is measured before it is drawn, which autoTable's page hook cannot
|
|
772
|
+
// wait for; they sit in the bands, clear of the table.
|
|
773
|
+
async _renderContinuationMasters(context, page, index, pageNumber, pages) {
|
|
774
|
+
const { doc, report } = context;
|
|
775
|
+
for (const [offset, documentPage] of pages.entries()) {
|
|
776
|
+
doc.setPage(documentPage);
|
|
777
|
+
await this._renderMaster(context, page, this._tokens(report, page, index, pageNumber + offset + 1));
|
|
778
|
+
}
|
|
779
|
+
doc.setPage(doc.getNumberOfPages());
|
|
549
780
|
}
|
|
550
781
|
// The margin a continuation table keeps from one edge: inside the band when
|
|
551
782
|
// the page has one.
|
|
@@ -727,6 +958,14 @@ export class ReportPdfService {
|
|
|
727
958
|
.replace(/\u25B2\s?/g, '+')
|
|
728
959
|
.replace(/\u25BC\s?/g, '-');
|
|
729
960
|
}
|
|
961
|
+
// A layer's values with each number as jsPDF can draw it (_pdfText), so a
|
|
962
|
+
// value grouped with narrow spaces reads, and wraps, like any other number.
|
|
963
|
+
_pdfValues(values) {
|
|
964
|
+
return Object.fromEntries(Object.entries(values).map(([key, value]) => [
|
|
965
|
+
key,
|
|
966
|
+
value.text === undefined ? value : { ...value, text: this._pdfText(value.text) },
|
|
967
|
+
]));
|
|
968
|
+
}
|
|
730
969
|
_slug(name) {
|
|
731
970
|
return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'report';
|
|
732
971
|
}
|
|
@@ -736,4 +975,4 @@ export class ReportPdfService {
|
|
|
736
975
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportPdfService, decorators: [{
|
|
737
976
|
type: Injectable
|
|
738
977
|
}] });
|
|
739
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBVWxELE9BQU8sRUFDMkMsV0FBVyxFQUFFLG9CQUFvQixHQUNsRixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEQsT0FBTyxFQUNMLGtCQUFrQixFQUFFLGlCQUFpQixFQUE0QyxjQUFjLEdBQ2hHLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFDTCx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsR0FDdEcsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQ2lFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUN4RyxlQUFlLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUMvRyxZQUFZLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsR0FDOUQsTUFBTSxtQ0FBbUMsQ0FBQzs7QUFHM0Msa0NBQWtDO0FBQ2xDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVkLHdDQUF3QztBQUN4QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFFbkIsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUscURBQXFEO0FB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LEtBQUssQ0FBQyxRQUFRO1lBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLFdBQVcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEYsTUFBTSxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFNUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLEtBQUssY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUM1QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUU3QyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7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RSxzQkFBc0I7SUFDZCxRQUFRLENBQUMsSUFBWTtRQUMzQixPQUFPLElBQUk7YUFDUixPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQzthQUM1QixPQUFPLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDO2FBQy9CLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO2FBQ3ZCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDO2FBQzFCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxJQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUM7SUFDNUYsQ0FBQzt3R0FwMEJVLGdCQUFnQjs0R0FBaEIsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBSZXBvcnRLcGlUcmVuZCB9IGZyb20gJy4uL2VudW1zL3JlcG9ydC1rcGktdHJlbmQuZW51bSc7XG5pbXBvcnQgeyByZXNvbHZlUmVwb3J0VGltZXpvbmUgfSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgS3BpQ29uZmlnLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0SGVhZGVyRm9vdGVyLFxuICBSZXBvcnRQYWdlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgS3BpQ2FyZERlbHRhLCBLcGlDYXJkVGFyZ2V0LCBLcGlTcGFya2xpbmVQb2ludCwga3BpQ2FyZFZpZXcsIGtwaVNwYXJrbGluZUdlb21ldHJ5LFxufSBmcm9tICcuLi9rcGktY2FyZCc7XG5pbXBvcnQgeyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HIH0gZnJvbSAnLi4vbGF5b3V0JztcbmltcG9ydCB7XG4gIERFRkFVTFRfVEVYVF9DT0xPUiwgREVGQVVMVF9URVhUX1NJWkUsIFRleHRQYXJhZ3JhcGgsIFRleHRSdW4sIFRleHRUb2tlbkNvbnRleHQsIHRleHRQYXJhZ3JhcGhzLFxufSBmcm9tICcuLi90ZXh0JztcbmltcG9ydCB7XG4gIFJFUE9SVF9LUElfQ0hBTkdFX0NPTE9SUywgUkVQT1JUX0tQSV9TUEFSS0xJTkVfQ09MT1IsIFJFUE9SVF9LUElfVFJBQ0tfQ09MT1IsIFJFUE9SVF9NVVRFRF9URVhUX0NPTE9SLFxufSBmcm9tICcuLi90aGVtZS9wYWxldHRlJztcbmltcG9ydCB7IHJlbmRlckNoYXJ0SW1hZ2UgfSBmcm9tICcuL29mZnNjcmVlbi1jaGFydCc7XG5pbXBvcnQge1xuICBDb2xsZWN0ZWRDb21wb25lbnQsIENvbGxlY3RlZFBhZ2UsIENvbGxlY3RlZFJlcG9ydCwgS3BpRXhwb3J0SGVpZ2h0cywgY292ZXJMaW5lcywgZW1wdHlMYWJlbCwgZXhwb3J0Q2VsbCxcbiAgZXhwb3J0Tm90ZUxpbmVzLCBleHBvcnRUaXRsZSwgZXhwb3J0V2luZG93c0xpbmUsIGtwaUNhcmRIYXNFeHRyYXMsIGtwaUV4cG9ydEhlaWdodCwga3BpRXhwb3J0UGFydHMsIGxpc3RDb2x1bW5zLFxuICBsaXN0SGVhZGluZ3MsIGxpc3RUb3RhbHNSb3csIG1vcmVSb3dzTm90aWNlLCBzY2FsZWRLcGlIZWlnaHRzLFxufSBmcm9tICcuL3JlcG9ydC1leHBvcnQtY29sbGVjdG9yLnNlcnZpY2UnO1xuXG5cbi8vIEluY2hlcyDihpIgcG9pbnRzICh0aGUgUERGIHVuaXQpLlxuY29uc3QgUFQgPSA3MjtcblxuLy8gQ29tcG9uZW50IHRpdGxlIHN0cmlwIGhlaWdodCwgcG9pbnRzLlxuY29uc3QgVElUTEVfSCA9IDE4O1xuXG4vLyBUaGUgc21hbGwgcHJpbnQgYSBjb21wb25lbnQgbWF5IGNhcnJ5LCBwb2ludHM6IHRoZSBkYXlzIGl0IHJlYWRzIHVuZGVyIGl0c1xuLy8gdGl0bGUgKGEgc3VidGl0bGUgbGluZSksIGl0cyBub3RlcyBhdCB0aGUgZm9vdCBvZiBpdHMgYm94IChhIGxpbmUgZWFjaCksIGFuZFxuLy8gdGhlIGxpbmVzIG9mIGEgS1BJIGNhcmQgdW5kZXIgaXRzIHZhbHVlLiBBIGNoYXJ0J3Mgb3IgYSBsaXN0J3Mgbm90ZXMgZ2l2ZVxuLy8gd2F5IGJlZm9yZSBpdHMgYm9keSB3b3VsZCBzaHJpbmsgdW5kZXIgTUlOX0JPRFlfSC5cbmNvbnN0IFNNQUxMX1NJWkUgPSA3LjU7XG5jb25zdCBTVUJUSVRMRV9IID0gMTE7XG5jb25zdCBOT1RFX0xJTkVfSCA9IDEwO1xuY29uc3QgTUlOX0JPRFlfSCA9IDQwO1xuY29uc3QgTVVURURfQ09MT1IgPSBgIyR7UkVQT1JUX01VVEVEX1RFWFRfQ09MT1J9YDtcblxuLy8gQSBLUEkgY2FyZCdzIHBhcnRzLCB0b3AgdG8gYm90dG9tLCBwb2ludHMgKGtwaUV4cG9ydFBhcnRzIHNoZWRzIHRoZVxuLy8gc3BhcmtsaW5lLCB0aGVuIHRoZSB0YXJnZXQsIHRoZW4gdGhlIG5vdGVzIG9uIGEgc2hvcnQgdGlsZSkuIFRoZSB2YWx1ZSdzXG4vLyBiYXNlbGluZSBzaXRzIEtQSV9WQUxVRV9CQVNFTElORSB1bmRlciBpdHMgdG9wLlxuY29uc3QgS1BJX0hFSUdIVFM6IEtwaUV4cG9ydEhlaWdodHMgPSB7XG4gIHZhbHVlOiAzMCxcbiAgbGFiZWw6IDEzLFxuICBkZWx0YTogMTMsXG4gIHdpbmRvdzogTk9URV9MSU5FX0gsXG4gIHRhcmdldDogTk9URV9MSU5FX0ggKyA2LFxuICBzcGFya2xpbmU6IDI4LFxuICBub3RlOiBOT1RFX0xJTkVfSCxcbn07XG5jb25zdCBLUElfVkFMVUVfQkFTRUxJTkUgPSAyMztcbmNvbnN0IEtQSV9ERUxUQV9TSVpFID0gOTtcbi8vIFRoZSBkZWx0YSdzIHRyaWFuZ2xlOiBpdHMgc2lkZSwgYW5kIHRoZSBnYXAgYmVmb3JlIHRoZSBjaGFuZ2UuXG5jb25zdCBLUElfQVJST1cgPSA2O1xuY29uc3QgS1BJX0FSUk9XX0dBUCA9IDM7XG4vLyBUaGUgdGFyZ2V0J3MgcHJvZ3Jlc3MgYmFyLCBhbmQgdGhlIHRyYWNrIGl0IGZpbGxzLlxuY29uc3QgS1BJX0JBUl9XID0gMTIwO1xuY29uc3QgS1BJX0JBUl9IID0gMztcbmNvbnN0IEtQSV9UUkFDS19DT0xPUiA9IGAjJHtSRVBPUlRfS1BJX1RSQUNLX0NPTE9SfWA7XG4vLyBUaGUgc3BhcmtsaW5lJ3Mgd2lkZXN0IGJveCwgaXRzIHRvcCBhbmQgYm90dG9tIGluc2V0LCBhbmQgaXRzIGRvdHMnIHJhZGl1cy5cbmNvbnN0IEtQSV9TUEFSS0xJTkVfVyA9IDE0MDtcbmNvbnN0IEtQSV9TUEFSS0xJTkVfSU5TRVQgPSAzO1xuY29uc3QgS1BJX0RPVF9SID0gMS41O1xuXG4vLyBSb3dzIGZldGNoZWQgZm9yIGEgbGlzdCdzIFBERiB0YWJsZS4gQSB0YWJsZSB0aGF0IG91dGdyb3dzIGl0cyBib3hcbi8vIGNvbnRpbnVlcyBvbnRvIHBhZ2VzIG9mIGl0cyBvd24sIHNvIHRoaXMgaXMgaG93IGZhciBpdCBtYXkgcnVuOiBhYm91dCAxMi0xNVxuLy8gY29udGludWF0aW9uIHBhZ2VzIG9uIGEgbGV0dGVyIHBhZ2UsIGFuZCBhIHRlbnRoIG9mIHRoZSBzZXJ2ZXIncyA1MDAwLXJvd1xuLy8gY2VpbGluZy4gQSBsb25nZXIgcmVzdWx0IGVuZHMgaW4gYSBtb3JlUm93c05vdGljZSgpIHJvdy5cbmV4cG9ydCBjb25zdCBQREZfTElTVF9ST1dTID0gNTAwO1xuXG4vLyBIb3cgZmFyIGEgY29udGludWF0aW9uIHRhYmxlIHNpdHMgaW5zaWRlIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kcyxcbi8vIHBvaW50cy4gQSBwYWdlIHdpdGggbm8gYmFuZCAob3Igd2l0aCB0aGUgbWFzdGVyIGhpZGRlbikga2VlcHNcbi8vIE5PX0JBTkRfTUFSR0lOIGZyb20gdGhhdCBlZGdlIGluc3RlYWQuXG5jb25zdCBDT05USU5VQVRJT05fR0FQID0gMC4yNSAqIFBUO1xuY29uc3QgTk9fQkFORF9NQVJHSU4gPSAwLjUgKiBQVDtcbmNvbnN0IE5PX0JBTkRTOiBSZXBvcnRIZWFkZXJGb290ZXIgPSB7IGhlYWRlckhlaWdodDogMCwgZm9vdGVySGVpZ2h0OiAwIH07XG5cbi8vIFRoZSBsYXN0IHJvdyBvZiBhIGxpc3QgYm94IHdob3NlIHJvd3MgY2Fycnkgb24gcGFzdCBpdC5cbmNvbnN0IENPTlRJTlVFRF9OT1RJQ0UgPSAnQ29udGludWVkIG9uIHRoZSBmb2xsb3dpbmcgcGFnZXMnO1xuXG4vLyBBIHRleHQgbGluZSdzIGhlaWdodCBhcyBhIG11bHRpcGxlIG9mIGl0cyBsYXJnZXN0IGZvbnQgc2l6ZSDigJQgdGhlIGNhbnZhc1xuLy8gc3R5bGVzaGVldCdzIGxpbmUtaGVpZ2h0LCBzbyBhIGJsb2NrIHdyYXBzIGFuZCBzdGFja3MgdGhlIHNhbWUgd2F5LlxuY29uc3QgVEVYVF9MSU5FX0hFSUdIVCA9IDEuMjU7XG5cbi8vIEhvdyBmYXIgYSBsaXN0IGl0ZW0ncyB0ZXh0IHNpdHMgZnJvbSB0aGUgYmxvY2sncyBlZGdlLCBwb2ludHM7IHRoZSBtYXJrZXJcbi8vIGhhbmdzIGluIHRoYXQgc3BhY2UuXG5jb25zdCBMSVNUX0lOREVOVCA9IDE2O1xuXG4vLyBXaGF0IGV2ZXJ5IGRyYXdpbmcgc3RlcCBvZiBvbmUgZXhwb3J0IHNoYXJlcywgYnVpbHQgb25jZSBpbiBleHBvcnQoKS5cbi8vIFNpemVzIGFyZSBwb2ludHMuXG5pbnRlcmZhY2UgUGRmRXhwb3J0Q29udGV4dCB7XG4gIGRvYzogYW55O1xuICBhdXRvVGFibGU6IGFueTtcbiAganNQREY6IGFueTtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIGZvcm1hdENvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQ7XG4gIHBhZ2VXOiBudW1iZXI7XG4gIHBhZ2VIOiBudW1iZXI7XG4gIG9yaWVudGF0aW9uOiAnbGFuZHNjYXBlJyB8ICdwb3J0cmFpdCc7XG59XG5cbi8vIEZpeGVkIGNvbHVtbiB3aWR0aHMsIGJ5IGNvbHVtbiBpbmRleCwgaW4gcG9pbnRzLCBhbmQgdGhlIHJpZ2h0IGFsaWdubWVudCBvZlxuLy8gYSBjb2x1bW4gb2YgZm9ybWF0dGVkIG51bWJlcnMuXG50eXBlIFBkZkNvbHVtblN0eWxlcyA9IFJlY29yZDxudW1iZXIsIHsgY2VsbFdpZHRoOiBudW1iZXI7IGhhbGlnbj86ICdyaWdodCcgfT47XG5cbi8vIEEgdGFibGUgYm9keSBjZWxsOiBwbGFpbiB0ZXh0LCBvciBhIG5vdGljZSByb3cncyBvbmUgY2VsbCBzcGFubmluZyBldmVyeVxuLy8gY29sdW1uLlxudHlwZSBQZGZUYWJsZUNlbGwgPSBzdHJpbmcgfCB7IGNvbnRlbnQ6IHN0cmluZzsgY29sU3BhbjogbnVtYmVyOyBzdHlsZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG5cbi8vIFRoZSByb3dzIG9mIGEgbGlzdCB0aGF0IGRpZCBub3QgZml0IGl0cyBib3gsIGNhcnJpZWQgb250byBjb250aW51YXRpb25cbi8vIHBhZ2VzIGFmdGVyIGl0cyByZXBvcnQgcGFnZS4geCBhbmQgdyBhcmUgdGhlIGJveCdzLCBpbiBwb2ludHMsIGFuZCB0aGVcbi8vIGNvbHVtbiB3aWR0aHMgYW5kIGFsaWdubWVudHMgYXJlIHRoZSBvbmVzIHRoZSBvbi1wYWdlIHRhYmxlIHdhcyBkcmF3biB3aXRoLFxuLy8gc28gdGhlIHRhYmxlIHJlYWRzIGFzIG9uZSBhY3Jvc3MgcGFnZXMuXG5pbnRlcmZhY2UgUGRmVGFibGVPdmVyZmxvdyB7XG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICAvLyBUaGUgdGV4dCB0aGUgbGlzdCB3YXMgc2VhcmNoZWQgYnksIGZvciB0aGUgY29udGludWF0aW9uIHRpdGxlLlxuICBzZWFyY2g/OiBzdHJpbmc7XG4gIGhlYWQ6IHN0cmluZ1tdO1xuICBudW1lcmljOiBib29sZWFuW107XG4gIHJvd3M6IHN0cmluZ1tdW107XG4gIG9taXR0ZWQ6IG51bWJlcjtcbiAgLy8gVGhlIGxpc3QncyB0b3RhbHMgcm93LCB3aGljaCBjbG9zZXMgdGhlIGxhc3QgY29udGludWF0aW9uIHBhZ2UuXG4gIGZvb3Q6IHN0cmluZ1tdIHwgbnVsbDtcbiAgeDogbnVtYmVyO1xuICB3OiBudW1iZXI7XG4gIGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzO1xufVxuXG4vLyBCdWlsZHMgdGhlIFBERiBjbGllbnQtc2lkZSB3aXRoIGpzcGRmLiBUaGUgcmVwb3J0J3MgdW5pdCBpcyBpbmNoZXMgYW5kIFBERnNcbi8vIGFyZSBwb2ludHMgYXQgZXhhY3RseSA3Mi9pbmNoLCBzbyBlYWNoIHJlcG9ydCBwYWdlIGJlY29tZXMgb25lIFBERiBwYWdlIG9mXG4vLyB0aGUgZXhhY3QgcGh5c2ljYWwgc2l6ZSBhbmQgY29tcG9uZW50cyBsYW5kIGF0IHRoZWlyIHByZWNpc2UgcG9zaXRpb25zLlxuLy8gQ2hhcnRzIGFyZSByZW5kZXJlZCB0aHJvdWdoIGFuIG9mZnNjcmVlbiBFQ2hhcnRzIGluc3RhbmNlIGF0IDPDlyBwaXhlbFxuLy8gcmF0aW8g4oCUIHBpeGVsLWlkZW50aWNhbCB0byB0aGUgc2NyZWVuLCBjcmlzcCBhdCBwcmludCBzaXplIOKAlCBhbmQgdGFibGVzIGFyZVxuLy8gZHJhd24gd2l0aCBqc3BkZi1hdXRvdGFibGUuIEJvdGggbGlicmFyaWVzIGxvYWQgbGF6aWx5IGludG8gdGhlaXIgb3duIGNodW5rcy5cbi8vXG4vLyBBIGxpc3QgdGFibGUgaXMgZml0dGVkIHRvIGl0cyBib3ggYnkgbGF5aW5nIGl0IG91dCBmaXJzdCwgbmV2ZXIgYnkgYVxuLy8gcm93LWhlaWdodCBlc3RpbWF0ZSwgc28gaXQgY2Fubm90IHNwaWxsIHBhc3QgdGhlIGJveC4gVGhlIHJvd3MgdGhhdCBkbyBub3Rcbi8vIGZpdCBjb250aW51ZSBvbiBwYWdlcyBvZiB0aGVpciBvd24gYWZ0ZXIgdGhlIHJlcG9ydCBwYWdlLCB1bmRlciB0aGUgc2FtZVxuLy8gaGVhZGVyL2Zvb3RlciBhbmQgd2l0aCB0aGUgc2FtZSBjb2x1bW4gd2lkdGhzLCB1cCB0byBQREZfTElTVF9ST1dTOyBhXG4vLyBsb25nZXIgcmVzdWx0IGVuZHMgaW4gYSByb3cgcG9pbnRpbmcgdG8gdGhlIGNvbXBvbmVudCdzIENTViBleHBvcnQuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0UGRmU2VydmljZSB7XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydChjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLl9jb250ZXh0KGNvbGxlY3RlZCk7XG5cbiAgICB0aGlzLl90aXRsZVBhZ2UoY29udGV4dC5kb2MsIGNvbGxlY3RlZCwgY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSCk7XG5cbiAgICAvLyBUaGUgcGh5c2ljYWwgcGFnZSBudW1iZXIge3twYWdlLm51bWJlcn19IHByaW50czogcmVwb3J0IHBhZ2VzIGFuZFxuICAgIC8vIHRoZWlyIGNvbnRpbnVhdGlvbiBwYWdlcyBhbGlrZSwgdGhlIHRpdGxlIHBhZ2Ugbm90IGNvdW50ZWQuXG4gICAgbGV0IHBhZ2VOdW1iZXIgPSAwO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGNvbGxlY3RlZFBhZ2VdIG9mIGNvbGxlY3RlZC5wYWdlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdID0gW107XG4gICAgICBwYWdlTnVtYmVyICs9IDE7XG5cbiAgICAgIGF3YWl0IHRoaXMuX3JlbmRlclBhZ2UoY29udGV4dCwgY29sbGVjdGVkUGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIsIG92ZXJmbG93cyk7XG5cbiAgICAgIC8vIEVhY2ggY29udGludWF0aW9uIGFwcGVuZHMgaXRzIHBhZ2VzIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LCBzb1xuICAgICAgLy8gdHdvIGxpc3RzIHRoYXQgb3ZlcmZsb3dlZCBvbiBvbmUgcGFnZSBmb2xsb3cgaXQgYmFjayB0byBiYWNrLlxuICAgICAgZm9yIChjb25zdCBvdmVyZmxvdyBvZiBvdmVyZmxvd3MpIHtcbiAgICAgICAgcGFnZU51bWJlciA9IHRoaXMuX3JlbmRlckNvbnRpbnVhdGlvbihjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyLCBvdmVyZmxvdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29udGV4dC5kb2Muc2F2ZShgJHt0aGlzLl9zbHVnKGNvbGxlY3RlZC5yZXBvcnQubmFtZSl9LnBkZmApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfY29udGV4dChjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IFByb21pc2U8UGRmRXhwb3J0Q29udGV4dD4ge1xuICAgIGNvbnN0IHJlcG9ydCA9IGNvbGxlY3RlZC5yZXBvcnQ7XG4gICAgY29uc3QgeyBqc1BERiB9ID0gYXdhaXQgaW1wb3J0KCdqc3BkZicpO1xuICAgIGNvbnN0IGF1dG9UYWJsZSA9IChhd2FpdCBpbXBvcnQoJ2pzcGRmLWF1dG90YWJsZScpKS5kZWZhdWx0O1xuXG4gICAgY29uc3QgcGFnZVcgPSByZXBvcnQucGFnZVdpZHRoICogUFQ7XG4gICAgY29uc3QgcGFnZUggPSByZXBvcnQucGFnZUhlaWdodCAqIFBUO1xuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gcGFnZVcgPj0gcGFnZUggPyAnbGFuZHNjYXBlJyA6ICdwb3J0cmFpdCc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9jOiBuZXcganNQREYoeyBvcmllbnRhdGlvbiwgdW5pdDogJ3B0JywgZm9ybWF0OiBbcGFnZVcsIHBhZ2VIXSB9KSxcbiAgICAgIGF1dG9UYWJsZSxcbiAgICAgIGpzUERGLFxuICAgICAgcmVwb3J0LFxuICAgICAgdGltZXpvbmU6IHJlc29sdmVSZXBvcnRUaW1lem9uZShyZXBvcnQpLFxuICAgICAgZm9ybWF0Q29udGV4dDogY29sbGVjdGVkLmZvcm1hdENvbnRleHQsXG4gICAgICBwYWdlVyxcbiAgICAgIHBhZ2VILFxuICAgICAgb3JpZW50YXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIC8vIE9uZSByZXBvcnQgcGFnZTogdGhlIGhlYWRlciBhbmQgZm9vdGVyIGZpcnN0LCB1bmRlciB0aGUgcGFnZSdzIG93blxuICAvLyBjb21wb25lbnRzLiBBIGxpc3QgdGhhdCBvdXRncm93cyBpdHMgYm94IGxlYXZlcyBpdHMgcmVtYWluaW5nIHJvd3MgaW5cbiAgLy8gb3ZlcmZsb3dzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJQYWdlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29sbGVjdGVkUGFnZTogQ29sbGVjdGVkUGFnZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MsIHJlcG9ydCB9ID0gY29udGV4dDtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLl90b2tlbnMocmVwb3J0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyKTtcblxuICAgIGRvYy5hZGRQYWdlKFtjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIXSwgY29udGV4dC5vcmllbnRhdGlvbik7XG4gICAgdGhpcy5fcmVuZGVyTWFzdGVyKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgdG9rZW5zKTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb2xsZWN0ZWRQYWdlLmNvbXBvbmVudHMpIHtcbiAgICAgIGlmIChpdGVtLmNvbXBvbmVudC50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyVGV4dChkb2MsIGl0ZW0uY29tcG9uZW50LCB0b2tlbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyQ29tcG9uZW50KGNvbnRleHQsIGl0ZW0sIG92ZXJmbG93cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyTWFzdGVyKGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIHBhZ2U6IFJlcG9ydFBhZ2UsIHRva2VuczogVGV4dFRva2VuQ29udGV4dCk6IHZvaWQge1xuICAgIGlmIChwYWdlLm1hc3RlckhpZGRlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbnRleHQucmVwb3J0Lm1hc3Rlcj8uY29tcG9uZW50cyA/PyBbXSkge1xuICAgICAgdGhpcy5fcmVuZGVyVGV4dChjb250ZXh0LmRvYywgY29tcG9uZW50LCB0b2tlbnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3RpdGxlUGFnZShkb2M6IGFueSwgY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQsIHBhZ2VXOiBudW1iZXIsIHBhZ2VIOiBudW1iZXIpOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMjgpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dChjb2xsZWN0ZWQucmVwb3J0Lm5hbWUsIDQwLCBwYWdlSCAqIDAuMzUpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMTEpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyM1MjYwNmQnKTtcblxuICAgIGRvYy50ZXh0KGNvdmVyTGluZXMoY29sbGVjdGVkKS5tYXAoKGxpbmUpID0+IHRoaXMuX3BkZlRleHQobGluZSkpLCA0MCwgcGFnZUggKiAwLjM1ICsgMjYpO1xuICB9XG5cbiAgLy8gQSB0ZXh0IGJsb2NrLCBsYWlkIG91dCBieSBoYW5kOiBqc1BERiBkcmF3cyBzdHJpbmdzLCBub3QgcmljaCB0ZXh0LCBzbyBlYWNoXG4gIC8vIHBhcmFncmFwaCdzIHJ1bnMgYXJlIGJyb2tlbiBpbnRvIHdvcmRzLCB3cmFwcGVkIHRvIHRoZSBibG9jaydzIHdpZHRoIGFuZFxuICAvLyBkcmF3biB3b3JkIGJ5IHdvcmQgaW4gdGhlaXIgb3duIGZvbnQsIHNpemUgYW5kIGNvbG9yLiBMaW5lcyBwYXN0IHRoZVxuICAvLyBibG9jaydzIGhlaWdodCBhcmUgZHJvcHBlZCDigJQgdGhlIGNhbnZhcyBjbGlwcyB0aGUgYmxvY2sgdGhlcmUgdG9vLlxuICBwcml2YXRlIF9yZW5kZXJUZXh0KGRvYzogYW55LCBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogdm9pZCB7XG4gICAgY29uc3QgcGFkZGluZyA9IGNvbXBvbmVudC5jb25maWc/LnBhZGRpbmc7XG4gICAgY29uc3QgaW5zZXQgPSAodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gKHZhbHVlID8/IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkcpICogUFQ7XG5cbiAgICBjb25zdCBsZWZ0ID0gY29tcG9uZW50LnggKiBQVCArIGluc2V0KHBhZGRpbmc/LmxlZnQpO1xuICAgIGNvbnN0IHRvcCA9IGNvbXBvbmVudC55ICogUFQgKyBpbnNldChwYWRkaW5nPy50b3ApO1xuICAgIGNvbnN0IHdpZHRoID0gY29tcG9uZW50LncgKiBQVCAtIGluc2V0KHBhZGRpbmc/LmxlZnQpIC0gaW5zZXQocGFkZGluZz8ucmlnaHQpO1xuICAgIGNvbnN0IGJvdHRvbSA9IChjb21wb25lbnQueSArIGNvbXBvbmVudC5oKSAqIFBUIC0gaW5zZXQocGFkZGluZz8uYm90dG9tKTtcblxuICAgIGxldCBjdXJzb3JZID0gdG9wO1xuICAgIGxldCBsaXN0TnVtYmVyID0gMDtcblxuICAgIGZvciAoY29uc3QgcGFyYWdyYXBoIG9mIHRleHRQYXJhZ3JhcGhzKGNvbXBvbmVudC5jb25maWc/Lmh0bWwgPz8gJycsIHRva2VucykpIHtcbiAgICAgIGxpc3ROdW1iZXIgPSBwYXJhZ3JhcGguYnVsbGV0ID09PSAnbnVtYmVyJyA/IGxpc3ROdW1iZXIgKyAxIDogMDtcbiAgICAgIGNvbnN0IGluZGVudCA9IHBhcmFncmFwaC5idWxsZXQgPyBMSVNUX0lOREVOVCA6IDA7XG4gICAgICBjb25zdCBsaW5lcyA9IHRoaXMuX3dyYXAoZG9jLCBwYXJhZ3JhcGgsIHdpZHRoIC0gaW5kZW50KTtcblxuICAgICAgbGluZXMuZm9yRWFjaCgobGluZSwgbGluZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNpemUgPSBNYXRoLm1heCguLi5saW5lLm1hcCgod29yZCkgPT4gd29yZC5zaXplKSwgcGFyYWdyYXBoLnJ1bnNbMF0/LmZvbnRTaXplID8/IERFRkFVTFRfVEVYVF9TSVpFKTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IHNpemUgKiBURVhUX0xJTkVfSEVJR0hUO1xuICAgICAgICBpZiAoY3Vyc29yWSArIGxpbmVIZWlnaHQgPiBib3R0b20gKyAwLjUpIHtcbiAgICAgICAgICBjdXJzb3JZID0gSW5maW5pdHk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlbGluZSA9IGN1cnNvclkgKyBzaXplO1xuICAgICAgICBjb25zdCBsaW5lV2lkdGggPSBsaW5lLnJlZHVjZSgoc3VtLCB3b3JkKSA9PiBzdW0gKyB3b3JkLndpZHRoLCAwKTtcbiAgICAgICAgbGV0IHggPSBsZWZ0ICsgaW5kZW50ICsgdGhpcy5fYWxpZ25PZmZzZXQocGFyYWdyYXBoLmFsaWduLCB3aWR0aCAtIGluZGVudCwgbGluZVdpZHRoKTtcblxuICAgICAgICBpZiAobGluZUluZGV4ID09PSAwICYmIHBhcmFncmFwaC5idWxsZXQpIHtcbiAgICAgICAgICB0aGlzLl9mb250KGRvYywgbGluZVswXT8ucnVuID8/IHsgdGV4dDogJycgfSwgc2l6ZSk7XG4gICAgICAgICAgZG9jLnRleHQocGFyYWdyYXBoLmJ1bGxldCA9PT0gJ251bWJlcicgPyBgJHtsaXN0TnVtYmVyfS5gIDogJ+KAoicsIGxlZnQsIGJhc2VsaW5lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiBsaW5lKSB7XG4gICAgICAgICAgdGhpcy5fZHJhd1dvcmQoZG9jLCB3b3JkLCB4LCBiYXNlbGluZSk7XG4gICAgICAgICAgeCArPSB3b3JkLndpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgY3Vyc29yWSArPSBsaW5lSGVpZ2h0O1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChjdXJzb3JZID09PSBJbmZpbml0eSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gQW4gZW1wdHkgcGFyYWdyYXBoIGlzIHN0aWxsIGEgbGluZS5cbiAgICAgIGlmICghbGluZXMubGVuZ3RoKSB7XG4gICAgICAgIGN1cnNvclkgKz0gREVGQVVMVF9URVhUX1NJWkUgKiBURVhUX0xJTkVfSEVJR0hUO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEJyZWFrIGEgcGFyYWdyYXBoJ3MgcnVucyBpbnRvIGxpbmVzIG9mIG1lYXN1cmVkIHdvcmRzIHRoYXQgZml0IHRoZSB3aWR0aC5cbiAgLy8gQSB3b3JkIGtlZXBzIGl0cyB0cmFpbGluZyBzcGFjZSBzbyBzcGFjaW5nIHN1cnZpdmVzIHJ1biBib3VuZGFyaWVzLlxuICBwcml2YXRlIF93cmFwKGRvYzogYW55LCBwYXJhZ3JhcGg6IFRleHRQYXJhZ3JhcGgsIHdpZHRoOiBudW1iZXIpOiB7IHJ1bjogVGV4dFJ1bjsgdGV4dDogc3RyaW5nOyBzaXplOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfVtdW10ge1xuICAgIGNvbnN0IGxpbmVzOiB7IHJ1bjogVGV4dFJ1bjsgdGV4dDogc3RyaW5nOyBzaXplOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfVtdW10gPSBbXTtcbiAgICBsZXQgbGluZTogeyBydW46IFRleHRSdW47IHRleHQ6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGxldCBsaW5lV2lkdGggPSAwO1xuXG4gICAgZm9yIChjb25zdCBydW4gb2YgcGFyYWdyYXBoLnJ1bnMpIHtcbiAgICAgIGNvbnN0IHNpemUgPSBydW4uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkU7XG4gICAgICB0aGlzLl9mb250KGRvYywgcnVuLCBzaXplKTtcblxuICAgICAgZm9yIChjb25zdCB0ZXh0IG9mIHJ1bi50ZXh0Lm1hdGNoKC9cXFMrXFxzKnxcXHMrL2cpID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IHdvcmRXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodGV4dCk7XG5cbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoICYmIGxpbmVXaWR0aCArIHdvcmRXaWR0aCAtIHRoaXMuX3RyYWlsaW5nU3BhY2UoZG9jLCB0ZXh0KSA+IHdpZHRoKSB7XG4gICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgbGluZVdpZHRoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmUucHVzaCh7IHJ1biwgdGV4dCwgc2l6ZSwgd2lkdGg6IHdvcmRXaWR0aCB9KTtcbiAgICAgICAgbGluZVdpZHRoICs9IHdvcmRXaWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5sZW5ndGgpIHtcbiAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBfZHJhd1dvcmQoZG9jOiBhbnksIHdvcmQ6IHsgcnVuOiBUZXh0UnVuOyB0ZXh0OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9LCB4OiBudW1iZXIsIGJhc2VsaW5lOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBydW4gPSB3b3JkLnJ1bjtcblxuICAgIGlmIChydW4uaGlnaGxpZ2h0KSB7XG4gICAgICBkb2Muc2V0RmlsbENvbG9yKHJ1bi5oaWdobGlnaHQpO1xuICAgICAgZG9jLnJlY3QoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjksIHdvcmQud2lkdGgsIHdvcmQuc2l6ZSAqIDEuMTUsICdGJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZm9udChkb2MsIHJ1biwgd29yZC5zaXplKTtcbiAgICBkb2MudGV4dCh3b3JkLnRleHQsIHgsIGJhc2VsaW5lKTtcblxuICAgIGNvbnN0IGNvbG9yID0gcnVuLmNvbG9yID8/IERFRkFVTFRfVEVYVF9DT0xPUjtcbiAgICBjb25zdCBpbmtXaWR0aCA9IHdvcmQud2lkdGggLSB0aGlzLl90cmFpbGluZ1NwYWNlKGRvYywgd29yZC50ZXh0KTtcbiAgICBpZiAocnVuLnVuZGVybGluZSkge1xuICAgICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgICBkb2Muc2V0TGluZVdpZHRoKHdvcmQuc2l6ZSAvIDE2KTtcbiAgICAgIGRvYy5saW5lKHgsIGJhc2VsaW5lICsgd29yZC5zaXplICogMC4xMiwgeCArIGlua1dpZHRoLCBiYXNlbGluZSArIHdvcmQuc2l6ZSAqIDAuMTIpO1xuICAgIH1cbiAgICBpZiAocnVuLnN0cmlrZSkge1xuICAgICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgICBkb2Muc2V0TGluZVdpZHRoKHdvcmQuc2l6ZSAvIDE2KTtcbiAgICAgIGRvYy5saW5lKHgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC4zLCB4ICsgaW5rV2lkdGgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC4zKTtcbiAgICB9XG5cbiAgICBpZiAocnVuLmxpbmspIHtcbiAgICAgIGRvYy5saW5rKHgsIGJhc2VsaW5lIC0gd29yZC5zaXplLCBpbmtXaWR0aCwgd29yZC5zaXplICogMS4yLCB7IHVybDogcnVuLmxpbmsgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8ganNQREYncyBzdGFuZGFyZCBmb250cyBhcmUgSGVsdmV0aWNhLCBUaW1lcyBhbmQgQ291cmllcjsgYSBibG9jaydzIGZhY2UgaXNcbiAgLy8gbWFwcGVkIG9udG8gd2hpY2hldmVyIG9mIHRoZSB0aHJlZSBpdCByZXNlbWJsZXMuXG4gIHByaXZhdGUgX2ZvbnQoZG9jOiBhbnksIHJ1bjogVGV4dFJ1biwgc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZmFjZSA9IChydW4uZm9udEZhY2UgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZmFtaWx5ID0gL2NvdXJpZXJ8bW9uby8udGVzdChmYWNlKVxuICAgICAgPyAnY291cmllcidcbiAgICAgIDogKC90aW1lc3xnZW9yZ2lhfHNlcmlmLy50ZXN0KGZhY2UpICYmICFmYWNlLmluY2x1ZGVzKCdzYW5zJykgPyAndGltZXMnIDogJ2hlbHZldGljYScpO1xuICAgIGNvbnN0IHN0eWxlID0gcnVuLmJvbGQgJiYgcnVuLml0YWxpY1xuICAgICAgPyAnYm9sZGl0YWxpYydcbiAgICAgIDogKHJ1bi5ib2xkID8gJ2JvbGQnIDogKHJ1bi5pdGFsaWMgPyAnaXRhbGljJyA6ICdub3JtYWwnKSk7XG5cbiAgICBkb2Muc2V0Rm9udChmYW1pbHksIHN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoc2l6ZSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihydW4uY29sb3IgPz8gREVGQVVMVF9URVhUX0NPTE9SKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyYWlsaW5nU3BhY2UoZG9jOiBhbnksIHRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgdHJhaWxpbmcgPSB0ZXh0Lmxlbmd0aCAtIHRleHQudHJpbUVuZCgpLmxlbmd0aDtcblxuICAgIHJldHVybiB0cmFpbGluZyA/IGRvYy5nZXRUZXh0V2lkdGgoJyAnKSAqIHRyYWlsaW5nIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgX2FsaWduT2Zmc2V0KGFsaWduOiBUZXh0UGFyYWdyYXBoWydhbGlnbiddLCB3aWR0aDogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsICh3aWR0aCAtIGxpbmVXaWR0aCkgLyAyKTtcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHdpZHRoIC0gbGluZVdpZHRoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdoYXQgYSB0ZXh0IGJsb2NrJ3MgdG9rZW5zIGZpbGwgd2l0aCBvbiB0aGlzIHBhZ2UuIFRoZSBudW1iZXIgaXMgdGhlXG4gIC8vIHBoeXNpY2FsIHBhZ2UgYW1vbmcgdGhlIHJlcG9ydCdzIHBhZ2VzLCBjb250aW51YXRpb24gcGFnZXMgaW5jbHVkZWQg4oCUIHRoZVxuICAvLyB0aXRsZSBwYWdlIGlzIG5vdCBhIHJlcG9ydCBwYWdlLiBUaGUgbmFtZSBzdGF5cyB0aGUgcmVwb3J0IHBhZ2Uncywgc28gYVxuICAvLyBjb250aW51YXRpb24gcGFnZSBpcyBuYW1lZCBmb3IgdGhlIHBhZ2UgaXRzIHRhYmxlIHN0YXJ0ZWQgb24uXG4gIHByaXZhdGUgX3Rva2VucyhyZXBvcnQ6IFJlcG9ydCwgcGFnZTogUmVwb3J0UGFnZSwgaW5kZXg6IG51bWJlciwgcGFnZU51bWJlcjogbnVtYmVyKTogVGV4dFRva2VuQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICBwYWdlTmFtZTogcGFnZS5uYW1lIHx8IGBQYWdlICR7aW5kZXggKyAxfWAsXG4gICAgICByZXBvcnROYW1lOiByZXBvcnQubmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyQ29tcG9uZW50KFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50LFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBjb21wb25lbnQgPSBpdGVtLmNvbXBvbmVudDtcbiAgICAvLyBHZW9tZXRyeSBpcyBzdG9yZWQgaW4gaW5jaGVzOyB0aGUgUERGIGRyYXdzIGluIHBvaW50cy5cbiAgICBjb25zdCB4ID0gY29tcG9uZW50LnggKiBQVDtcbiAgICBjb25zdCB5ID0gY29tcG9uZW50LnkgKiBQVDtcbiAgICBjb25zdCB3ID0gY29tcG9uZW50LncgKiBQVDtcbiAgICBjb25zdCBoID0gY29tcG9uZW50LmggKiBQVDtcblxuICAgIGNvbnN0IHRpdGxlID0gZXhwb3J0VGl0bGUoY29tcG9uZW50LCBpdGVtLnNlYXJjaCk7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICB0aGlzLl9jb21wb25lbnRUaXRsZShkb2MsIHRpdGxlLCB4LCB5LCB3KTtcbiAgICB9XG5cbiAgICAvLyBBIGNoYXJ0IG9yIGxpc3QgdGhhdCBjb21wYXJlcyBvciBoYXMgYSB0aW1lZnJhbWUgbmFtZXMgaXRzIGRheXMgdW5kZXJcbiAgICAvLyB0aGUgdGl0bGUsIGFuZCBpdHMgbm90ZXMgc2l0IGF0IHRoZSBmb290IG9mIGl0cyBib3g7IGEgS1BJIGNhcmQgZHJhd3NcbiAgICAvLyBib3RoIGl0c2VsZi4gTmVpdGhlciB0YWtlcyByb29tIGZyb20gYSBjb21wb25lbnQgd2l0aG91dCB0aG9zZSBrZXlzLlxuICAgIGNvbnN0IGxvY2FsZSA9IGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGU7XG4gICAgY29uc3Qgc3VidGl0bGUgPSB0aGlzLl9wZGZUZXh0KGV4cG9ydFdpbmRvd3NMaW5lKGl0ZW0sIGNvbnRleHQudGltZXpvbmUsIGxvY2FsZSkpO1xuICAgIGNvbnN0IG5vdGVzID0gY29tcG9uZW50LnR5cGUgPT09ICdrcGknID8gW10gOiBleHBvcnROb3RlTGluZXMoaXRlbSwgY29udGV4dC50aW1lem9uZSwgbG9jYWxlKTtcbiAgICBjb25zdCB0b3AgPSB5ICsgVElUTEVfSCArIChzdWJ0aXRsZSA/IFNVQlRJVExFX0ggOiAwKTtcbiAgICBjb25zdCByb29tID0gTWF0aC5tYXgoMjAsIHkgKyBoIC0gdG9wKTtcbiAgICBjb25zdCBrZXB0ID0gbm90ZXMuc2xpY2UoMCwgTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigocm9vbSAtIE1JTl9CT0RZX0gpIC8gTk9URV9MSU5FX0gpKSk7XG5cbiAgICBpZiAoc3VidGl0bGUpIHtcbiAgICAgIHRoaXMuX3NtYWxsTGluZShkb2MsIHN1YnRpdGxlLCB4LCB5ICsgVElUTEVfSCwgdywgJ2xlZnQnLCAnbm9ybWFsJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keVkgPSB0b3A7XG4gICAgY29uc3QgYm9keUggPSBNYXRoLm1heCgyMCwgcm9vbSAtIGtlcHQubGVuZ3RoICogTk9URV9MSU5FX0gpO1xuXG4gICAga2VwdC5mb3JFYWNoKChsaW5lLCBpbmRleCkgPT4ge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dChsaW5lKSwgeCwgYm9keVkgKyBib2R5SCArIGluZGV4ICogTk9URV9MSU5FX0gsIHcsICdsZWZ0JywgJ2l0YWxpYycpO1xuICAgIH0pO1xuXG4gICAgaWYgKCFpdGVtLmRhdGEgfHwgIWl0ZW0uZGF0YS5yb3dzPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2JveE5vdGUoZG9jLCBlbXB0eUxhYmVsKGl0ZW0pLCB4LCBib2R5WSwgdywgYm9keUgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb21wb25lbnQudHlwZSkge1xuICAgICAgY2FzZSAnY2hhcnQnOiB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgcmVuZGVyQ2hhcnRJbWFnZShjb21wb25lbnQsIGl0ZW0uZGF0YSwgdywgYm9keUgsIGNvbnRleHQuZm9ybWF0Q29udGV4dCk7XG4gICAgICAgIGRvYy5hZGRJbWFnZShpbWFnZSwgJ1BORycsIHgsIGJvZHlZLCB3LCBib2R5SCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgIHRoaXMuX3JlbmRlclRhYmxlKGNvbnRleHQsIGl0ZW0sIHgsIGJvZHlZLCB3LCBib2R5SCwgb3ZlcmZsb3dzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdrcGknOlxuICAgICAgICB0aGlzLl9yZW5kZXJLcGkoY29udGV4dCwgaXRlbSwgeCwgYm9keVksIHcsIGJvZHlIKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gT25lIGxpbmUgb2Ygc21hbGwgZ3JleSBwcmludCwgY3V0IHRvIHRoZSB3aWR0aCB3aXRoIGFuIGVsbGlwc2lzOiBhXG4gIC8vIHN1YnRpdGxlLCBhIG5vdGUgb3IgYSBsaW5lIG9mIGEgS1BJIGNhcmQuIHkgaXMgdGhlIGxpbmUncyB0b3A7IHRoZSBsaW5lIGlzXG4gIC8vIE5PVEVfTElORV9IIHRhbGwsIHRpbWVzIHRoZSBzY2FsZSBhIHNob3J0IEtQSSB0aWxlIHNocmlua3MgaXRzIGxpbmVzIGJ5LlxuICBwcml2YXRlIF9zbWFsbExpbmUoXG4gICAgZG9jOiBhbnksXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsXG4gICAgYWxpZ246ICdsZWZ0JyB8ICdjZW50ZXInLFxuICAgIHN0eWxlOiAnbm9ybWFsJyB8ICdpdGFsaWMnLFxuICAgIHNjYWxlID0gMSxcbiAgKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsIHN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoU01BTExfU0laRSAqIHNjYWxlKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKE1VVEVEX0NPTE9SKTtcbiAgICBkb2MudGV4dCh0aGlzLl9maXQoZG9jLCB0ZXh0LCB3KSwgYWxpZ24gPT09ICdjZW50ZXInID8geCArIHcgLyAyIDogeCwgeSArIFNNQUxMX1NJWkUgKiBzY2FsZSwgeyBhbGlnbiB9KTtcbiAgfVxuXG4gIC8vIFRoZSB0ZXh0LCBlbGxpcHNpemVkIHRvIHRoZSB3aWR0aCBpbiB0aGUgZG9jJ3MgY3VycmVudCBmb250LlxuICBwcml2YXRlIF9maXQoZG9jOiBhbnksIHRleHQ6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGRvYy5nZXRUZXh0V2lkdGgodGV4dCkgPD0gd2lkdGgpIHtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIGxldCBjdXQgPSB0ZXh0O1xuICAgIHdoaWxlIChjdXQubGVuZ3RoID4gMSAmJiBkb2MuZ2V0VGV4dFdpZHRoKGAke2N1dH3igKZgKSA+IHdpZHRoKSB7XG4gICAgICBjdXQgPSBjdXQuc2xpY2UoMCwgLTEpO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtjdXQudHJpbUVuZCgpfeKApmA7XG4gIH1cblxuICAvLyBUaGUgYm9sZCBzdHJpcCBvdmVyIGEgY29tcG9uZW50LCBhbmQgb3ZlciBlYWNoIG9mIGl0cyBjb250aW51YXRpb24gcGFnZXMuXG4gIHByaXZhdGUgX2NvbXBvbmVudFRpdGxlKGRvYzogYW55LCB0aXRsZTogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dCh0aXRsZSwgeCwgeSArIDEwLCB7IG1heFdpZHRoOiB3IH0pO1xuICB9XG5cbiAgLy8gQW4gaXRhbGljIGdyZXkgbGluZSBjZW50ZXJlZCBpbiBhIGNvbXBvbmVudCdzIGJvZHksIGZvciBhIGJvZHkgdGhhdCBob2xkc1xuICAvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiBpdHMgY29udGVudC5cbiAgcHJpdmF0ZSBfYm94Tm90ZShkb2M6IGFueSwgdGV4dDogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2l0YWxpYycpO1xuICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKE1VVEVEX0NPTE9SKTtcbiAgICBkb2MudGV4dCh0ZXh0LCB4ICsgdyAvIDIsIHkgKyBoIC8gMiwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gIH1cblxuICAvLyBBIGxpc3QncyBvbi1wYWdlIHRhYmxlLiBBbGwgb2YgaXRzIGZldGNoZWQgcm93cyBhcmUgbGFpZCBvdXQgb25jZSB0byBsZWFyblxuICAvLyBob3cgbWFueSB0aGUgYm94IGhvbGRzOyB3aGVuIHRoZXkgZG8gbm90IGFsbCBmaXQsIHRoZSBib3gncyBsYXN0IHJvdyBzYXlzXG4gIC8vIHRoZSB0YWJsZSBjb250aW51ZXMgYW5kIHRoZSByZXN0IGdvIHRvIG92ZXJmbG93cyBmb3IgY29udGludWF0aW9uIHBhZ2VzLlxuICAvLyBBIGJveCB0b28gc2hvcnQgZm9yIGV2ZW4gdGhlIGhlYWQgY2FycmllcyB0aGUgbm90aWNlIGFzIGEgbGluZSBpbnN0ZWFkLlxuICAvLyBBIHRvdGFscyByb3cgY2xvc2VzIHRoZSB0YWJsZSBvbmNlOiBpbiB0aGUgYm94IHdoZW4gZXZlcnkgcm93IGZpdHMgaXQsXG4gIC8vIGVsc2UgYWZ0ZXIgdGhlIGxhc3QgY29udGludWF0aW9uIHJvdy4gUG9pbnRzIHRocm91Z2hvdXQuXG4gIHByaXZhdGUgX3JlbmRlclRhYmxlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50LFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcixcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb21wb25lbnQsIHNlYXJjaCwgaGlkZGVuQ29sdW1ucyB9ID0gaXRlbTtcbiAgICBjb25zdCBkYXRhID0gaXRlbS5kYXRhIGFzIENvbXBvbmVudERhdGE7XG4gICAgY29uc3QgaGVhZCA9IGxpc3RIZWFkaW5ncyhjb21wb25lbnQsIGRhdGEsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUsIGhpZGRlbkNvbHVtbnMpXG4gICAgICAubWFwKChoZWFkaW5nKSA9PiB0aGlzLl9wZGZUZXh0KGhlYWRpbmcpKTtcbiAgICBjb25zdCB7IGNlbGxzLCBudW1lcmljLCBmb290IH0gPSB0aGlzLl90YWJsZUNlbGxzKGNvbnRleHQsIGNvbXBvbmVudCwgZGF0YSwgaGlkZGVuQ29sdW1ucyk7XG4gICAgY29uc3Qgb21pdHRlZCA9IE1hdGgubWF4KDAsIChkYXRhLnBhZ2luZz8udG90YWwgPz8gY2VsbHMubGVuZ3RoKSAtIGNlbGxzLmxlbmd0aCk7XG4gICAgY29uc3QgYm90dG9tID0gY29udGV4dC5wYWdlSCAtICh5ICsgaCk7XG4gICAgY29uc3QgeyBmaXQsIGNvbHVtblN0eWxlcyB9ID0gdGhpcy5fbWVhc3VyZShjb250ZXh0LCBoZWFkLCBjZWxscywgbnVtZXJpYywgZm9vdCwgeCwgeSwgdywgYm90dG9tKTtcblxuICAgIGlmIChmaXQgPT09IGNlbGxzLmxlbmd0aCAmJiBvbWl0dGVkID09PSAwKSB7XG4gICAgICB0aGlzLl9kcmF3VGFibGUoXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCBjb2x1bW5TdHlsZXMsIGZvb3QpLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBub3RpY2UgdGFrZXMgdGhlIHBsYWNlIG9mIHRoZSBsYXN0IHJvdyB0aGF0IGZpdCwgc28gdGhhdCByb3cgbW92ZXNcbiAgICAvLyB0byB0aGUgY29udGludWF0aW9uLiBvbWl0dGVkID4gMCBtZWFucyBhIGZ1bGwgUERGX0xJU1RfUk9XUyBmZXRjaCwgd2hpY2hcbiAgICAvLyBuZXZlciBmaXRzIG9uZSBib3gsIHNvIHRoZSBDU1Ygbm90aWNlIGFsd2F5cyBsYW5kcyBvbiBhIGNvbnRpbnVhdGlvblxuICAgIC8vIHBhZ2UuXG4gICAgY29uc3Qga2VwdCA9IE1hdGgubWF4KDAsIGZpdCAtIDEpO1xuICAgIG92ZXJmbG93cy5wdXNoKHsgY29tcG9uZW50LCBzZWFyY2gsIGhlYWQsIG51bWVyaWMsIHJvd3M6IGNlbGxzLnNsaWNlKGtlcHQpLCBvbWl0dGVkLCBmb290LCB4LCB3LCBjb2x1bW5TdHlsZXMgfSk7XG5cbiAgICBpZiAoZml0ID49IDEpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBbLi4uY2VsbHMuc2xpY2UoMCwga2VwdCksIHRoaXMuX25vdGljZVJvdyhDT05USU5VRURfTk9USUNFLCBoZWFkLmxlbmd0aCwgdHJ1ZSldO1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKGNvbnRleHQsIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBib2R5LCB4LCB5LCB3LCBib3R0b20sIGNvbHVtblN0eWxlcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ib3hOb3RlKGNvbnRleHQuZG9jLCBDT05USU5VRURfTk9USUNFLCB4LCB5LCB3LCBoKTtcbiAgICB9XG4gIH1cblxuICAvLyBFYWNoIGZldGNoZWQgcm93IGFzIHRoZSBzdHJpbmdzIGl0cyB0YWJsZSBjZWxscyBwcmludCwgaW4gdGhlIHJlcG9ydCdzXG4gIC8vIHpvbmUsIGxvY2FsZSBhbmQgY3VycmVuY3ksIHdoaWNoIGNvbHVtbnMgaG9sZCBmb3JtYXR0ZWQgbnVtYmVycywgYW5kIHRoZVxuICAvLyB0b3RhbHMgcm93IChudWxsIHdpdGhvdXQgb25lKS4gVGhlIGNvbHVtbnMgdGhlIHZpZXdlciBoaWQgYXJlIGxlZnQgb3V0LlxuICBwcml2YXRlIF90YWJsZUNlbGxzKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgICBoaWRkZW5Db2x1bW5zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgKTogeyBjZWxsczogc3RyaW5nW11bXTsgbnVtZXJpYzogYm9vbGVhbltdOyBmb290OiBzdHJpbmdbXSB8IG51bGwgfSB7XG4gICAgY29uc3QgY29sdW1ucyA9IGxpc3RDb2x1bW5zKGNvbXBvbmVudCwgZGF0YSwgY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZSwgaGlkZGVuQ29sdW1ucyk7XG4gICAgY29uc3QgY2VsbHMgPSBkYXRhLnJvd3MubWFwKChyb3cpID0+IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHRoaXMuX3BkZlRleHQoXG4gICAgICBleHBvcnRDZWxsKHJvd1tjb2x1bW4uY29sdW1uXSwgY29sdW1uLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdENvbnRleHQsIHJvdyksXG4gICAgKSkpO1xuICAgIGNvbnN0IGZvb3QgPSBsaXN0VG90YWxzUm93KGRhdGEsIGNvbHVtbnMsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0Q29udGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2VsbHMsXG4gICAgICBudW1lcmljOiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubnVtZXJpYyksXG4gICAgICBmb290OiBmb290ID8gZm9vdC5tYXAoKGNlbGwpID0+IHRoaXMuX3BkZlRleHQoY2VsbCkpIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhlIGF1dG9UYWJsZSBvcHRpb25zIGV2ZXJ5IGxpc3QgdGFibGUgc2hhcmVzOiB0aGUgZHJ5IHJ1biwgdGhlIG9uLXBhZ2VcbiAgLy8gZHJhdyBhbmQgdGhlIGNvbnRpbnVhdGlvbiBwYWdlcywgc28gdGhlIHRocmVlIGxheSBhIHRhYmxlIG91dCBhbGlrZS4gVGhlXG4gIC8vIGZvbnQgaXMgbmFtZWQgcmF0aGVyIHRoYW4gaW5oZXJpdGVkLCBzaW5jZSB0aGUgZG9jIGNhcnJpZXMgd2hhdGV2ZXIgdGhlXG4gIC8vIGxhc3QgdGV4dCBkcmF3biBsZWZ0IHNldC4gYm90dG9tIGlzIHRoZSBtYXJnaW4gdW5kZXIgdGhlIHRhYmxlLCBwb2ludHMuXG4gIC8vXG4gIC8vIEEgY29sdW1uIG9mIGZvcm1hdHRlZCBudW1iZXJzIGlzIHJpZ2h0LWFsaWduZWQsIGl0cyBoZWFkaW5nIGFuZCB0b3RhbFxuICAvLyB0b286IHRoZSBib2R5IHRocm91Z2ggY29sdW1uU3R5bGVzLCB3aGljaCBhdXRvVGFibGUgYXBwbGllcyB0byBib2R5IGNlbGxzXG4gIC8vIG9ubHksIGFuZCB0aGUgaGVhZGluZyBhbmQgdG90YWwgdGhyb3VnaCB0aGUgZGlkUGFyc2VDZWxsIGhvb2ssIG9uIGV2ZXJ5XG4gIC8vIHBhZ2UgdGhlIGhlYWRpbmcgcmVwZWF0cy4gQSB0b3RhbHMgcm93IChmb290KSBwcmludHMgb25jZSwgdW5kZXIgdGhlXG4gIC8vIHRhYmxlJ3MgbGFzdCByb3csIGJvbGQgb24gdGhlIGJvcmRlciBncmF5LlxuICBwcml2YXRlIF90YWJsZU9wdGlvbnMoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBoZWFkOiBzdHJpbmdbXSxcbiAgICBudW1lcmljOiBib29sZWFuW10sXG4gICAgYm9keTogUGRmVGFibGVDZWxsW11bXSxcbiAgICB4OiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCB3OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLFxuICAgIGNvbHVtblN0eWxlcz86IFBkZkNvbHVtblN0eWxlcyxcbiAgICBmb290Pzogc3RyaW5nW10gfCBudWxsLFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgICBoZWFkOiBbaGVhZF0sXG4gICAgICBib2R5LFxuICAgICAgc3RhcnRZLFxuICAgICAgbWFyZ2luOiB7IGxlZnQ6IHgsIHJpZ2h0OiBjb250ZXh0LnBhZ2VXIC0geCAtIHcsIGJvdHRvbSB9LFxuICAgICAgdGFibGVXaWR0aDogdyxcbiAgICAgIHJvd1BhZ2VCcmVhazogJ2F2b2lkJyxcbiAgICAgIHN0eWxlczogeyBmb250OiAnaGVsdmV0aWNhJywgZm9udFN0eWxlOiAnbm9ybWFsJywgZm9udFNpemU6IDgsIGNlbGxQYWRkaW5nOiAzLCB0ZXh0Q29sb3I6ICcjMWYyOTMzJyB9LFxuICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6ICcjNGU3OWE3JywgdGV4dENvbG9yOiAnI2ZmZmZmZicsIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICBhbHRlcm5hdGVSb3dTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2Y1ZjdmYScgfSxcbiAgICAgIC4uLihjb2x1bW5TdHlsZXMgPyB7IGNvbHVtblN0eWxlcyB9IDoge30pLFxuICAgICAgLi4uKGZvb3RcbiAgICAgICAgPyB7XG4gICAgICAgICAgZm9vdDogW2Zvb3RdLFxuICAgICAgICAgIHNob3dGb290OiAnbGFzdFBhZ2UnLFxuICAgICAgICAgIGZvb3RTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2U0ZTdlYicsIHRleHRDb2xvcjogJyMxZjI5MzMnLCBmb250U3R5bGU6ICdib2xkJyB9LFxuICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgICAgZGlkUGFyc2VDZWxsOiAoaG9vazogYW55KSA9PiB7XG4gICAgICAgIGlmICgoaG9vay5zZWN0aW9uID09PSAnaGVhZCcgfHwgaG9vay5zZWN0aW9uID09PSAnZm9vdCcpICYmIG51bWVyaWNbaG9vay5jb2x1bW4uaW5kZXhdKSB7XG4gICAgICAgICAgaG9vay5jZWxsLnN0eWxlcy5oYWxpZ24gPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBBIG5vdGljZSBhcyBhIHRhYmxlIHJvdzogb25lIGl0YWxpYyBncmV5IGNlbGwgc3Bhbm5pbmcgZXZlcnkgY29sdW1uLiBBXG4gIC8vIHNpbmdsZS1saW5lIG5vdGljZSBpcyBlbGxpcHNpemVkIGF0IHRoZSBib3gncyB3aWR0aCBhbmQga2VlcHMgdGhlIGRhdGFcbiAgLy8gY2VsbHMnIGZvbnQgc2l6ZSBhbmQgcGFkZGluZywgc28gaXQgaXMgbmV2ZXIgdGFsbGVyIHRoYW4gdGhlIGRhdGEgcm93XG4gIC8vIHdob3NlIHBsYWNlIGl0IHRha2VzLlxuICBwcml2YXRlIF9ub3RpY2VSb3codGV4dDogc3RyaW5nLCBzcGFuOiBudW1iZXIsIHNpbmdsZUxpbmU6IGJvb2xlYW4pOiBQZGZUYWJsZUNlbGxbXSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICBjb250ZW50OiB0ZXh0LFxuICAgICAgY29sU3Bhbjogc3BhbixcbiAgICAgIC8vIExlZnQtYWxpZ25lZCB3aGF0ZXZlciB0aGUgZmlyc3QgY29sdW1uIGlzOiBhIHNwYW5uZWQgY2VsbCBvdGhlcndpc2VcbiAgICAgIC8vIHRha2VzIGNvbHVtblN0eWxlc1swXSwgcmlnaHQtYWxpZ25lZCB3aGVuIHRoYXQgY29sdW1uIGlzIG51bWVyaWMuXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgZm9udFN0eWxlOiAnaXRhbGljJyxcbiAgICAgICAgdGV4dENvbG9yOiBNVVRFRF9DT0xPUixcbiAgICAgICAgaGFsaWduOiAnbGVmdCcsXG4gICAgICAgIC4uLihzaW5nbGVMaW5lID8geyBvdmVyZmxvdzogJ2VsbGlwc2l6ZScgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfV07XG4gIH1cblxuICAvLyBMYXlzIGV2ZXJ5IGZldGNoZWQgcm93IG91dCBvbmNlIG9uIGEgc2NyYXRjaCBkb2N1bWVudCBvZiB0aGUgc2FtZSBwYWdlXG4gIC8vIHNpemUsIHdpdGggdGhlIG9wdGlvbnMgdGhlIHJlYWwgZHJhdyB1c2VzLCBhbmQgcmVhZHMgYmFjayBob3cgbWFueSBib2R5XG4gIC8vIHJvd3MgdGhlIGJveCdzIHBhZ2UgaG9sZHMgKGZpdCkgYW5kIHRoZSBjb2x1bW4gd2lkdGhzIGF1dG9UYWJsZSBjaG9zZSxcbiAgLy8gd2l0aCBlYWNoIG51bWVyaWMgY29sdW1uJ3MgcmlnaHQgYWxpZ25tZW50IG1lcmdlZCBpbiwgc28gdGhlIG9uLXBhZ2VcbiAgLy8gdGFibGUgYW5kIGl0cyBjb250aW51YXRpb24gcGFnZXMgY2FycnkgYm90aC4gVGhlIHRvdGFscyByb3cgaXMgbGFpZCBvdXRcbiAgLy8gdG9vLCBzbyB0aGUgd2lkdGhzIGhvbGQgaXQsIGFuZCBhIHRhYmxlIHdob3NlIHJvd3MgZml0IHRoZSBib3ggYnV0IHdob3NlXG4gIC8vIHRvdGFscyByb3cgZG9lcyBub3QgbW92ZXMgaXRzIGxhc3Qgcm93IG9uLiBmaXQgMCBtZWFucyBub3QgZXZlbiBvbmVcbiAgLy8gYm9keSByb3cgZml0cyB1bmRlciB0aGUgaGVhZCAob3IgdGhlIGhlYWQgaXRzZWxmIGRpZCBub3QgZml0KTogYXV0b1RhYmxlXG4gIC8vIG1vdmVkIHRvIGEgbmV3IHBhZ2UgYmVmb3JlIGRyYXdpbmcuIFRoZSByZWFsIGRvY3VtZW50IGlzIHVudG91Y2hlZC5cbiAgcHJpdmF0ZSBfbWVhc3VyZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGhlYWQ6IHN0cmluZ1tdLFxuICAgIGNlbGxzOiBzdHJpbmdbXVtdLFxuICAgIG51bWVyaWM6IGJvb2xlYW5bXSxcbiAgICBmb290OiBzdHJpbmdbXSB8IG51bGwsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgYm90dG9tOiBudW1iZXIsXG4gICk6IHsgZml0OiBudW1iZXI7IGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzIH0ge1xuICAgIGNvbnN0IHNjcmF0Y2ggPSBuZXcgY29udGV4dC5qc1BERih7XG4gICAgICB1bml0OiAncHQnLFxuICAgICAgZm9ybWF0OiBbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sXG4gICAgICBvcmllbnRhdGlvbjogY29udGV4dC5vcmllbnRhdGlvbixcbiAgICB9KTtcbiAgICBsZXQgZml0ID0gMDtcblxuICAgIGNvbnRleHQuYXV0b1RhYmxlKHNjcmF0Y2gsIHtcbiAgICAgIC4uLnRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCB1bmRlZmluZWQsIGZvb3QpLFxuICAgICAgZGlkRHJhd0NlbGw6IChob29rOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGhvb2suc2VjdGlvbiA9PT0gJ2JvZHknICYmIHNjcmF0Y2guZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlciA9PT0gMSkge1xuICAgICAgICAgIGZpdCA9IE1hdGgubWF4KGZpdCwgaG9vay5yb3cuaW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbHVtbnM6IHsgd2lkdGg6IG51bWJlciB9W10gPSBzY3JhdGNoLmxhc3RBdXRvVGFibGUuY29sdW1ucztcbiAgICBjb25zdCBjb2x1bW5TdHlsZXM6IFBkZkNvbHVtblN0eWxlcyA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgY29sdW1uU3R5bGVzW2luZGV4XSA9IG51bWVyaWNbaW5kZXhdXG4gICAgICAgID8geyBjZWxsV2lkdGg6IGNvbHVtbi53aWR0aCwgaGFsaWduOiAncmlnaHQnIH1cbiAgICAgICAgOiB7IGNlbGxXaWR0aDogY29sdW1uLndpZHRoIH07XG4gICAgfSk7XG5cbiAgICAvLyBBIHJvdyB0YWxsZXIgdGhhbiBhIHdob2xlIHBhZ2UgaXMgc3BsaXQgcmF0aGVyIHRoYW4gbW92ZWQsIHNvIGEgbGFzdFxuICAgIC8vIHJvdyB0aGF0IHN0YXJ0ZWQgb24gdGhlIGZpcnN0IHBhZ2UgY2FuIHN0aWxsIGhhdmUgcnVuIHBhc3QgaXQuXG4gICAgaWYgKGZpdCA9PT0gY2VsbHMubGVuZ3RoICYmIHNjcmF0Y2guZ2V0TnVtYmVyT2ZQYWdlcygpID4gMSkge1xuICAgICAgZml0IC09IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZml0LCBjb2x1bW5TdHlsZXMgfTtcbiAgfVxuXG4gIC8vIERyYXdzIGFuIG9uLXBhZ2UgdGFibGUsIHRoZW4gcmVtb3ZlcyBhbnkgcGFnZSB0aGUgZHJhdyBhZGRlZC4gVGhhdCBzaG91bGRcbiAgLy8gbmV2ZXIgaGFwcGVuOiB0aGUgbWVhc3VyZWQgZml0LCB0aGUgaWRlbnRpY2FsIGNvbHVtbiB3aWR0aHMgYW5kIGFcbiAgLy8gc2luZ2xlLWxpbmUgbm90aWNlIGtlZXAgdGhlIHRhYmxlIGluc2lkZSBpdHMgYm94LiBUaGUgY2hlY2sgZXhpc3RzIHNvIGFcbiAgLy8gc3RyYXkgcGFnZSBjYW4gbmV2ZXIgY2F0Y2ggdGhlIHJlcG9ydCBwYWdlJ3MgcmVtYWluaW5nIGNvbXBvbmVudHMuXG4gIHByaXZhdGUgX2RyYXdUYWJsZShjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHBhZ2UgPSBkb2MuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICBjb25zdCBwYWdlcyA9IGRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG5cbiAgICBjb250ZXh0LmF1dG9UYWJsZShkb2MsIG9wdGlvbnMpO1xuXG4gICAgd2hpbGUgKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkgPiBwYWdlcykge1xuICAgICAgZG9jLmRlbGV0ZVBhZ2UoZG9jLmdldE51bWJlck9mUGFnZXMoKSk7XG4gICAgfVxuXG4gICAgZG9jLnNldFBhZ2UocGFnZSk7XG4gIH1cblxuICAvLyBUaGUgcm93cyBvZiBvbmUgbGlzdCB0aGF0IGRpZCBub3QgZml0IGl0cyBib3gsIG9uIHBhZ2VzIGFwcGVuZGVkIGFmdGVyXG4gIC8vIHRoZSByZXBvcnQgcGFnZSwgZWFjaCB3aXRoIHRoZSBwYWdlJ3MgaGVhZGVyIGFuZCBmb290ZXIsIHRoZSB0YWJsZSdzXG4gIC8vIHRpdGxlIGFuZCBpdHMgaGVhZCBhZ2Fpbi4gVGhlIHRhYmxlIHNpdHMgQ09OVElOVUFUSU9OX0dBUCBpbnNpZGUgdGhlXG4gIC8vIGJhbmRzLiBSZXR1cm5zIHRoZSBwaHlzaWNhbCBwYWdlIGNvdW50ZXIgYWZ0ZXIgdGhlc2UgcGFnZXMuXG4gIHByaXZhdGUgX3JlbmRlckNvbnRpbnVhdGlvbihcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHBhZ2U6IFJlcG9ydFBhZ2UsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXG4gICAgb3ZlcmZsb3c6IFBkZlRhYmxlT3ZlcmZsb3csXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgeyBkb2MsIHJlcG9ydCB9ID0gY29udGV4dDtcbiAgICBjb25zdCBiYW5kcyA9IHBhZ2UubWFzdGVySGlkZGVuID8gTk9fQkFORFMgOiByZXBvcnQuY29uZmlnPy5oZWFkZXJGb290ZXIgPz8gTk9fQkFORFM7XG4gICAgY29uc3QgdG9wID0gdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmhlYWRlckhlaWdodCk7XG4gICAgY29uc3QgYm90dG9tID0gdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmZvb3RlckhlaWdodCk7XG4gICAgY29uc3QgeyB4LCB3IH0gPSBvdmVyZmxvdztcbiAgICBjb25zdCBib2R5OiBQZGZUYWJsZUNlbGxbXVtdID0gb3ZlcmZsb3cub21pdHRlZCA+IDBcbiAgICAgID8gWy4uLm92ZXJmbG93LnJvd3MsIHRoaXMuX25vdGljZVJvdyhtb3JlUm93c05vdGljZShvdmVyZmxvdy5vbWl0dGVkKSwgb3ZlcmZsb3cuaGVhZC5sZW5ndGgsIGZhbHNlKV1cbiAgICAgIDogb3ZlcmZsb3cucm93cztcbiAgICBsZXQgY291bnRlciA9IHBhZ2VOdW1iZXI7XG5cbiAgICBkb2MuYWRkUGFnZShbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sIGNvbnRleHQub3JpZW50YXRpb24pO1xuICAgIGNvbnRleHQuYXV0b1RhYmxlKGRvYywge1xuICAgICAgLi4udGhpcy5fdGFibGVPcHRpb25zKFxuICAgICAgICBjb250ZXh0LCBvdmVyZmxvdy5oZWFkLCBvdmVyZmxvdy5udW1lcmljLCBib2R5LCB4LCB0b3AgKyBUSVRMRV9ILCB3LCBib3R0b20sIG92ZXJmbG93LmNvbHVtblN0eWxlcyxcbiAgICAgICAgb3ZlcmZsb3cuZm9vdCxcbiAgICAgICksXG4gICAgICBtYXJnaW46IHsgdG9wOiB0b3AgKyBUSVRMRV9ILCBib3R0b20sIGxlZnQ6IHgsIHJpZ2h0OiBjb250ZXh0LnBhZ2VXIC0geCAtIHcgfSxcbiAgICAgIHNob3dIZWFkOiAnZXZlcnlQYWdlJyxcbiAgICAgIC8vIEZpcmVzIG9uIGV2ZXJ5IHBhZ2UgdGhlIHRhYmxlIGRyYXdzIG9uLCB0aGUgZmlyc3QgaW5jbHVkZWQuXG4gICAgICB3aWxsRHJhd1BhZ2U6ICgpID0+IHtcbiAgICAgICAgY291bnRlciArPSAxO1xuICAgICAgICB0aGlzLl9yZW5kZXJNYXN0ZXIoY29udGV4dCwgcGFnZSwgdGhpcy5fdG9rZW5zKHJlcG9ydCwgcGFnZSwgaW5kZXgsIGNvdW50ZXIpKTtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VGl0bGUoZG9jLCB0aGlzLl9jb250aW51ZWRUaXRsZShvdmVyZmxvdy5jb21wb25lbnQsIG92ZXJmbG93LnNlYXJjaCksIHgsIHRvcCwgdyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH1cblxuICAvLyBUaGUgbWFyZ2luIGEgY29udGludWF0aW9uIHRhYmxlIGtlZXBzIGZyb20gb25lIGVkZ2U6IGluc2lkZSB0aGUgYmFuZCB3aGVuXG4gIC8vIHRoZSBwYWdlIGhhcyBvbmUuXG4gIHByaXZhdGUgX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBiYW5kID8gYmFuZCAqIFBUICsgQ09OVElOVUFUSU9OX0dBUCA6IE5PX0JBTkRfTUFSR0lOO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29udGludWVkVGl0bGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNlYXJjaD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdGl0bGUgPSBleHBvcnRUaXRsZShjb21wb25lbnQsIHNlYXJjaCk7XG5cbiAgICByZXR1cm4gdGl0bGUgPyBgJHt0aXRsZX0gKGNvbnRpbnVlZClgIDogJ0NvbnRpbnVlZCc7XG4gIH1cblxuICAvLyBBIEtQSSB0aWxlOiB0aGUgY2FyZCB0aGUgc2NyZWVuIGRyYXdzIChrcGktY2FyZC50cyBkZWNpZGVzIGV2ZXJ5IGxpbmUpLFxuICAvLyBzdGFja2VkIGFuZCBjZW50ZXJlZCBpbiB0aGUgYm9keS4gQSBjYXJkIHdpdGggb25seSBpdHMgdmFsdWUgYW5kIGxhYmVsXG4gIC8vIGtlZXBzIHRoZSB0aWxlJ3MgbG9uZy1zdGFuZGluZyBsYXlvdXQuXG4gIHByaXZhdGUgX3JlbmRlcktwaShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbmZpZyA9IGl0ZW0uY29tcG9uZW50LmNvbmZpZyBhcyBLcGlDb25maWc7XG4gICAgY29uc3QgdmlldyA9IGtwaUNhcmRWaWV3KGNvbmZpZywgaXRlbS5kYXRhLCB7IGZvcm1hdDogY29udGV4dC5mb3JtYXRDb250ZXh0LCB0aW1lem9uZTogY29udGV4dC50aW1lem9uZSB9KTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3BkZlRleHQodmlldy52YWx1ZSk7XG4gICAgY29uc3Qgbm90ZXMgPSBleHBvcnROb3RlTGluZXMoaXRlbSwgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZSk7XG5cbiAgICBpZiAoIWtwaUNhcmRIYXNFeHRyYXModmlldywgbm90ZXMpKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSgyNik7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgICBkb2MudGV4dCh2YWx1ZSwgeCArIHcgLyAyLCB5ICsgaCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuXG4gICAgICBpZiAodmlldy5sYWJlbCkge1xuICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgICBkb2MudGV4dCh2aWV3LmxhYmVsLCB4ICsgdyAvIDIsIHkgKyBoIC8gMiArIDE2LCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgdGlsZSB0b28gc2hvcnQgZm9yIHRoZSBjYXJkJ3MgbGluZXMgc2hyaW5rcyB0aGVtIGFsbCBhbGlrZS5cbiAgICBjb25zdCBwYXJ0cyA9IGtwaUV4cG9ydFBhcnRzKHZpZXcsIG5vdGVzLCBoLCBLUElfSEVJR0hUUyk7XG4gICAgY29uc3QgaGVpZ2h0cyA9IHNjYWxlZEtwaUhlaWdodHMoS1BJX0hFSUdIVFMsIHBhcnRzLnNjYWxlKTtcbiAgICBsZXQgdG9wID0geSArIE1hdGgubWF4KDAsIChoIC0ga3BpRXhwb3J0SGVpZ2h0KHZpZXcsIHBhcnRzLCBoZWlnaHRzKSkgLyAyKTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyNiAqIHBhcnRzLnNjYWxlKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodmFsdWUsIHggKyB3IC8gMiwgdG9wICsgS1BJX1ZBTFVFX0JBU0VMSU5FICogcGFydHMuc2NhbGUsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgIHRvcCArPSBoZWlnaHRzLnZhbHVlO1xuXG4gICAgaWYgKHZpZXcubGFiZWwpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSAqIHBhcnRzLnNjYWxlKTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgZG9jLnRleHQodGhpcy5fZml0KGRvYywgdGhpcy5fcGRmVGV4dCh2aWV3LmxhYmVsKSwgdyksIHggKyB3IC8gMiwgdG9wICsgOSAqIHBhcnRzLnNjYWxlLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgICAgIHRvcCArPSBoZWlnaHRzLmxhYmVsO1xuICAgIH1cblxuICAgIGlmIChwYXJ0cy5kZWx0YSAmJiB2aWV3LmRlbHRhKSB7XG4gICAgICB0aGlzLl9rcGlEZWx0YShkb2MsIHZpZXcuZGVsdGEsIHgsIHRvcCwgdywgcGFydHMuc2NhbGUpO1xuICAgICAgdG9wICs9IGhlaWdodHMuZGVsdGE7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLndpbmRvdykge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dCh2aWV3LndpbmRvdyksIHgsIHRvcCwgdywgJ2NlbnRlcicsICdub3JtYWwnLCBwYXJ0cy5zY2FsZSk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy53aW5kb3c7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLnRhcmdldCAmJiB2aWV3LnRhcmdldCkge1xuICAgICAgdGhpcy5fa3BpVGFyZ2V0KGRvYywgdmlldy50YXJnZXQsIHgsIHRvcCwgdyk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy50YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLnNwYXJrbGluZSAmJiB2aWV3LnNwYXJrbGluZSkge1xuICAgICAgdGhpcy5fa3BpU3BhcmtsaW5lKGRvYywgdmlldy5zcGFya2xpbmUudmFsdWVzLCB2aWV3LnNwYXJrbGluZS5wYXJ0aWFsLCB4LCB0b3AsIHcpO1xuICAgICAgdG9wICs9IGhlaWdodHMuc3BhcmtsaW5lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBwYXJ0cy5ub3Rlcykge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dChsaW5lKSwgeCwgdG9wLCB3LCAnY2VudGVyJywgJ2l0YWxpYycpO1xuICAgICAgdG9wICs9IGhlaWdodHMubm90ZTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgZGVsdGEgcm93LCBjZW50ZXJlZCBhcyBvbmUgZ3JvdXA6IGEgdHJpYW5nbGUgcG9pbnRpbmcgdGhlIHdheSB0aGVcbiAgLy8gdmFsdWUgbW92ZWQgKG5vbmUgd2hlbiB0aGUgc2hvd24gY2hhbmdlIHJvdW5kcyB0byB6ZXJvKSBhbmQgdGhlIGNoYW5nZSBpblxuICAvLyB0aGUgY29sb3Igb2Ygd2hhdCBpdCBtZWFucywgdGhlbiB3aGF0IGl0IGlzIGNvbXBhcmVkIHdpdGggaW4gZ3JleS5cbiAgcHJpdmF0ZSBfa3BpRGVsdGEoZG9jOiBhbnksIGRlbHRhOiBLcGlDYXJkRGVsdGEsIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlciwgc2NhbGUgPSAxKTogdm9pZCB7XG4gICAgY29uc3QgY29sb3IgPSBgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW2RlbHRhLnRvbmVdfWA7XG4gICAgY29uc3QgY2hhbmdlID0gdGhpcy5fcGRmVGV4dChkZWx0YS50ZXh0KTtcbiAgICBjb25zdCBzaXplID0gS1BJX0RFTFRBX1NJWkUgKiBzY2FsZTtcbiAgICBjb25zdCBzaWRlID0gS1BJX0FSUk9XICogc2NhbGU7XG4gICAgY29uc3QgYXJyb3cgPSBkZWx0YS50cmVuZCA9PT0gUmVwb3J0S3BpVHJlbmQuRmxhdCA/IDAgOiBzaWRlICsgS1BJX0FSUk9XX0dBUCAqIHNjYWxlO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKHNpemUpO1xuICAgIGNvbnN0IGNoYW5nZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aChjaGFuZ2UpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICBjb25zdCBjb21wYXJlZCA9IGRlbHRhLmNvbXBhcmVkXG4gICAgICA/IHRoaXMuX2ZpdChkb2MsIGAgJHt0aGlzLl9wZGZUZXh0KGRlbHRhLmNvbXBhcmVkKX1gLCBNYXRoLm1heCgwLCB3IC0gYXJyb3cgLSBjaGFuZ2VXaWR0aCkpXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHdpZHRoID0gYXJyb3cgKyBjaGFuZ2VXaWR0aCArIChjb21wYXJlZCA/IGRvYy5nZXRUZXh0V2lkdGgoY29tcGFyZWQpIDogMCk7XG4gICAgY29uc3QgYmFzZWxpbmUgPSB0b3AgKyBzaXplO1xuICAgIGxldCBsZWZ0ID0geCArIE1hdGgubWF4KDAsICh3IC0gd2lkdGgpIC8gMik7XG5cbiAgICBpZiAoYXJyb3cpIHtcbiAgICAgIGNvbnN0IHVwID0gZGVsdGEudHJlbmQgPT09IFJlcG9ydEtwaVRyZW5kLlVwO1xuICAgICAgY29uc3QgdGlwID0gdXAgPyBiYXNlbGluZSAtIHNpZGUgOiBiYXNlbGluZTtcbiAgICAgIGNvbnN0IGJhc2UgPSB1cCA/IGJhc2VsaW5lIDogYmFzZWxpbmUgLSBzaWRlO1xuXG4gICAgICBkb2Muc2V0RmlsbENvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy50cmlhbmdsZShsZWZ0LCBiYXNlLCBsZWZ0ICsgc2lkZSwgYmFzZSwgbGVmdCArIHNpZGUgLyAyLCB0aXAsICdGJyk7XG4gICAgICBsZWZ0ICs9IGFycm93O1xuICAgIH1cblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoY29sb3IpO1xuICAgIGRvYy50ZXh0KGNoYW5nZSwgbGVmdCwgYmFzZWxpbmUpO1xuXG4gICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgICBkb2MudGV4dChjb21wYXJlZCwgbGVmdCArIGNoYW5nZVdpZHRoLCBiYXNlbGluZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHRhcmdldCBsaW5lICgnR29hbDogJDEsMDAwIMK3IDU2JSBvZiB0YXJnZXQnKSBhbmQsIHdoZW4gdGhlIHNlcnZlciBzZW50XG4gIC8vIHRoZSBwcm9ncmVzcywgYSBiYXIgZmlsbGVkIHRoYXQgZmFyOiBncmVlbiBvbmNlIHRoZSB0YXJnZXQgaXMgbWV0LlxuICBwcml2YXRlIF9rcGlUYXJnZXQoZG9jOiBhbnksIHRhcmdldDogS3BpQ2FyZFRhcmdldCwgeDogbnVtYmVyLCB0b3A6IG51bWJlciwgdzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9IHRhcmdldC5wcm9ncmVzcyA/IGAke3RhcmdldC50ZXh0fSDCtyAke3RhcmdldC5wcm9ncmVzc31gIDogdGFyZ2V0LnRleHQ7XG5cbiAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KHRleHQpLCB4LCB0b3AsIHcsICdjZW50ZXInLCAnbm9ybWFsJyk7XG5cbiAgICBpZiAodGFyZ2V0LmZpbGwgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBiYXJXID0gTWF0aC5taW4odyAqIDAuNiwgS1BJX0JBUl9XKTtcbiAgICBjb25zdCBiYXJYID0geCArICh3IC0gYmFyVykgLyAyO1xuICAgIGNvbnN0IGJhclkgPSB0b3AgKyBOT1RFX0xJTkVfSCArIDE7XG5cbiAgICBkb2Muc2V0RmlsbENvbG9yKEtQSV9UUkFDS19DT0xPUik7XG4gICAgZG9jLnJlY3QoYmFyWCwgYmFyWSwgYmFyVywgS1BJX0JBUl9ILCAnRicpO1xuXG4gICAgaWYgKHRhcmdldC5maWxsID4gMCkge1xuICAgICAgZG9jLnNldEZpbGxDb2xvcihgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW3RhcmdldC50b25lXX1gKTtcbiAgICAgIGRvYy5yZWN0KGJhclgsIGJhclksIGJhclcgKiB0YXJnZXQuZmlsbCwgS1BJX0JBUl9ILCAnRicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBzcGFya2xpbmUgaW4gYSBib3ggdW5kZXIgdGhlIGNhcmQncyBsaW5lcywgYXMgdGhlIHNjcmVlbiBkcmF3cyBpdFxuICAvLyAoa3BpU3BhcmtsaW5lR2VvbWV0cnksIGEgMC0xMDAgYm94KTogYSB2ZWN0b3IgbGluZSBwZXIgcnVuIG9mIHZhbHVlcywgYVxuICAvLyBkb3QgZm9yIGEgbG9uZSB2YWx1ZSwgYW5kIHRoZSBsYXN0IHBvaW50J3MgbWFya2VyLCBob2xsb3cgd2hpbGUgaXRzIHBlcmlvZFxuICAvLyBpcyBwYXJ0aWFsLlxuICBwcml2YXRlIF9rcGlTcGFya2xpbmUoXG4gICAgZG9jOiBhbnksXG4gICAgdmFsdWVzOiAobnVtYmVyIHwgbnVsbClbXSxcbiAgICBwYXJ0aWFsOiBib29sZWFuLFxuICAgIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBrcGlTcGFya2xpbmVHZW9tZXRyeSh2YWx1ZXMsIHBhcnRpYWwpO1xuICAgIGNvbnN0IGJveFcgPSBNYXRoLm1pbih3ICogMC43LCBLUElfU1BBUktMSU5FX1cpO1xuICAgIGNvbnN0IGJveEggPSBLUElfSEVJR0hUUy5zcGFya2xpbmUgLSAyICogS1BJX1NQQVJLTElORV9JTlNFVDtcbiAgICBjb25zdCBsZWZ0ID0geCArICh3IC0gYm94VykgLyAyO1xuICAgIGNvbnN0IGF0ID0gKHBvaW50OiBLcGlTcGFya2xpbmVQb2ludCkgPT4gKHtcbiAgICAgIHg6IGxlZnQgKyBwb2ludC54ICogYm94VyAvIDEwMCxcbiAgICAgIHk6IHRvcCArIEtQSV9TUEFSS0xJTkVfSU5TRVQgKyBwb2ludC55ICogYm94SCAvIDEwMCxcbiAgICB9KTtcbiAgICBjb25zdCBjb2xvciA9IGAjJHtSRVBPUlRfS1BJX1NQQVJLTElORV9DT0xPUn1gO1xuXG4gICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgZG9jLnNldEZpbGxDb2xvcihjb2xvcik7XG4gICAgZG9jLnNldExpbmVXaWR0aCgxKTtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBnZW9tZXRyeS5saW5lcykge1xuICAgICAgY29uc3QgcG9pbnRzID0gbGluZS5zcGxpdCgnICcpLm1hcCgocGFpcikgPT4ge1xuICAgICAgICBjb25zdCBbcHgsIHB5XSA9IHBhaXIuc3BsaXQoJywnKS5tYXAoTnVtYmVyKTtcblxuICAgICAgICByZXR1cm4gYXQoeyB4OiBweCwgeTogcHkgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0ZXBzID0gcG9pbnRzLnNsaWNlKDEpLm1hcCgocG9pbnQsIGluZGV4KSA9PiBbcG9pbnQueCAtIHBvaW50c1tpbmRleF0ueCwgcG9pbnQueSAtIHBvaW50c1tpbmRleF0ueV0pO1xuXG4gICAgICBkb2MubGluZXMoc3RlcHMsIHBvaW50c1swXS54LCBwb2ludHNbMF0ueSwgWzEsIDFdLCAnUycsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRvdCBvZiBnZW9tZXRyeS5kb3RzKSB7XG4gICAgICBjb25zdCBwb2ludCA9IGF0KGRvdCk7XG4gICAgICBkb2MuY2lyY2xlKHBvaW50LngsIHBvaW50LnksIEtQSV9ET1RfUiwgJ0YnKTtcbiAgICB9XG5cbiAgICBpZiAoZ2VvbWV0cnkubGFzdCkge1xuICAgICAgY29uc3QgcG9pbnQgPSBhdChnZW9tZXRyeS5sYXN0KTtcblxuICAgICAgaWYgKGdlb21ldHJ5Lmxhc3QuaG9sbG93KSB7XG4gICAgICAgIGRvYy5zZXRGaWxsQ29sb3IoJyNmZmZmZmYnKTtcbiAgICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGRCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQSBmb3JtYXR0ZWQgdmFsdWUgYXMganNQREYgY2FuIGRyYXcgaXQuIEl0cyBzdGFuZGFyZCBmb250cyB3cml0ZSB0ZXh0IGluXG4gIC8vIFdpbkFuc2ksIHdoaWNoIGhhcyB0aGUgbm8tYnJlYWsgc3BhY2UgKFUrMDBBMCwgZnItQ0EncyBkaWdpdCBncm91cGluZykgYnV0XG4gIC8vIG5vdCB0aGUgbmFycm93IG9uZSAoVSsyMDJGLCB3aGljaCBvdGhlciBsb2NhbGVzIGdyb3VwIGFuZCBzcGFjZSB3aXRoKSwgdGhlXG4gIC8vIHRoaW4gYW5kIGhhaXIgc3BhY2VzIChVKzIwMDksIFUrMjAwQSwgd2hpY2ggSW50bCBwdXRzIGFyb3VuZCBhIGRhdGVcbiAgLy8gcmFuZ2UncyBkYXNoOiAnU2VwIDEg4oCTIDMwLCAyMDI2JyksIHRoZSBtaW51cyBzaWduIChVKzIyMTIsIHNvbWUgbG9jYWxlcydcbiAgLy8gbmVnYXRpdmUgc2lnbikgb3IgYSByYW5rIGNoYW5nZSdzIHRyaWFuZ2xlczogZWFjaCB3b3VsZCBwcmludCBhcyBzdHJheVxuICAvLyBnbHlwaHMuIFRoZSBuYXJyb3cgc3BhY2UgYmVjb21lcyBhIG5vLWJyZWFrIHNwYWNlLCBzbyBhIG51bWJlciBzdGlsbCBuZXZlclxuICAvLyB3cmFwcyBhY3Jvc3MgYSBsaW5lOyB0aGUgdGhpbiBhbmQgaGFpciBzcGFjZXMgYSBwbGFpbiBzcGFjZTsgdGhlIG1pbnVzXG4gIC8vIHNpZ24gYSBoeXBoZW47IGFuZCBhIHJhbmsncyByaXNlIGEgcGx1cyBzaWduIGFuZCBpdHMgZmFsbCBhIGh5cGhlblxuICAvLyAoJ+KWsiAyJyByZWFkcyAnKzInKS5cbiAgcHJpdmF0ZSBfcGRmVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXh0XG4gICAgICAucmVwbGFjZSgvXFx1MjAyRi9nLCAnXFx1MDBBMCcpXG4gICAgICAucmVwbGFjZSgvW1xcdTIwMDlcXHUyMDBBXS9nLCAnICcpXG4gICAgICAucmVwbGFjZSgvXFx1MjIxMi9nLCAnLScpXG4gICAgICAucmVwbGFjZSgvXFx1MjVCMlxccz8vZywgJysnKVxuICAgICAgLnJlcGxhY2UoL1xcdTI1QkNcXHM/L2csICctJyk7XG4gIH1cblxuICBwcml2YXRlIF9zbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi0rfC0rJC9nLCAnJykgfHwgJ3JlcG9ydCc7XG4gIH1cbn1cbiJdfQ==
|
|
978
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVVsRCxPQUFPLEVBQzJDLFdBQVcsRUFBRSxvQkFBb0IsR0FDbEYsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RELE9BQU8sRUFDTCxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFDaEgsaUJBQWlCLEVBQWlGLFVBQVUsR0FDN0csTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUNMLHdCQUF3QixFQUFFLDBCQUEwQixFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixHQUN0RyxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUM0RCxrQkFBa0IsRUFDbkYsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFDckcsZUFBZSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQzNHLFlBQVksR0FDYixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBbUIsTUFBTSw4QkFBOEIsQ0FBQzs7QUFHeEYsa0NBQWtDO0FBQ2xDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVkLHdDQUF3QztBQUN4QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFFbkIsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUscURBQXFEO0FBQ3JELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUN2QixNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDdEIsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUN0QixNQUFNLFdBQVcsR0FBRyxJQUFJLHVCQUF1QixFQUFFLENBQUM7QUFFbEQsc0VBQXNFO0FBQ3RFLDJFQUEyRTtBQUMzRSxrREFBa0Q7QUFDbEQsTUFBTSxXQUFXLEdBQXFCO0lBQ3BDLEtBQUssRUFBRSxFQUFFO0lBQ1QsS0FBSyxFQUFFLEVBQUU7SUFDVCxLQUFLLEVBQUUsRUFBRTtJQUNULE1BQU0sRUFBRSxXQUFXO0lBQ25CLE1BQU0sRUFBRSxXQUFXLEdBQUcsQ0FBQztJQUN2QixTQUFTLEVBQUUsRUFBRTtJQUNiLElBQUksRUFBRSxXQUFXO0NBQ2xCLENBQUM7QUFDRixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDekIsaUVBQWlFO0FBQ2pFLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQztBQUNwQixNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDeEIscURBQXFEO0FBQ3JELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztBQUN0QixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDcEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO0FBQ3JELDhFQUE4RTtBQUM5RSxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFDNUIsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDO0FBRXRCLHFFQUFxRTtBQUNyRSw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLDJEQUEyRDtBQUMzRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDO0FBRWpDLHdFQUF3RTtBQUN4RSxnRUFBZ0U7QUFDaEUseUNBQXlDO0FBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNuQyxNQUFNLGNBQWMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sUUFBUSxHQUF1QixFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBRTFFLDBEQUEwRDtBQUMxRCxNQUFNLGdCQUFnQixHQUFHLGtDQUFrQyxDQUFDO0FBRTVELDJFQUEyRTtBQUMzRSxzRUFBc0U7QUFDdEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFFOUIsNEVBQTRFO0FBQzVFLHVCQUF1QjtBQUN2QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFFdkIsZ0ZBQWdGO0FBQ2hGLG1CQUFtQjtBQUNuQixNQUFNLGlCQUFpQixHQUFHLCtDQUErQyxDQUFDO0FBc0YxRSw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSx3RUFBd0U7QUFDeEUsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRixFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLDZFQUE2RTtBQUM3RSwyRUFBMkU7QUFDM0Usd0VBQXdFO0FBQ3hFLHNFQUFzRTtBQUN0RSxFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLHNDQUFzQztBQUV0QyxNQUFNLE9BQU8sZ0JBQWdCO0lBRVYsV0FBVyxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBRXhELEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBMEI7UUFDM0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRS9DLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEUsb0VBQW9FO1FBQ3BFLDhEQUE4RDtRQUM5RCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFbkIsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUMvRCxNQUFNLFNBQVMsR0FBdUIsRUFBRSxDQUFDO1lBQ3pDLFVBQVUsSUFBSSxDQUFDLENBQUM7WUFFaEIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUU3RSxxRUFBcUU7WUFDckUsZ0VBQWdFO1lBQ2hFLEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3hHLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTztZQUNMLFNBQVMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5QyxZQUFZLEVBQUUsaUJBQWlCO1lBQy9CLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9ELENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBMEI7UUFDL0MsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUNoQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRTVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBRTlELE9BQU87WUFDTCxHQUFHLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuRSxTQUFTO1lBQ1QsS0FBSztZQUNMLE1BQU07WUFDTixRQUFRLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLGFBQWEsRUFBRSxTQUFTLENBQUMsYUFBYTtZQUN0QyxLQUFLO1lBQ0wsS0FBSztZQUNMLFdBQVc7WUFDWCxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO1lBQ3JELGFBQWEsRUFBRSxJQUFJLEdBQUcsRUFBRTtTQUN6QixDQUFDO0lBQ0osQ0FBQztJQUVELHFFQUFxRTtJQUNyRSx3RUFBd0U7SUFDeEUsNEVBQTRFO0lBQ3BFLEtBQUssQ0FBQyxXQUFXLENBQ3ZCLE9BQXlCLEVBQ3pCLGFBQTRCLEVBQzVCLEtBQWEsRUFDYixVQUFrQixFQUNsQixTQUE2QjtRQUU3QixNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzRSxNQUFNLFVBQVUsR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBRWhGLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakUsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTlELEtBQUssTUFBTSxJQUFJLElBQUksYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzVDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDeEQsQ0FBQztpQkFBTSxJQUFJLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN2RSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDN0UsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLG9FQUFvRTtJQUM1RCxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQXlCLEVBQUUsSUFBZ0IsRUFBRSxNQUF3QjtRQUMvRixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVqRSxLQUFLLE1BQU0sU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2xGLElBQUksTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzdFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSw0RUFBNEU7SUFDNUUsbUJBQW1CO0lBQ1gsZUFBZSxDQUNyQixPQUF5QixFQUN6QixTQUEwQixFQUMxQixJQUFZLEVBQ1osTUFBd0I7UUFFeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzdDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRixDQUFDO0lBQ0gsQ0FBQztJQUVPLFVBQVUsQ0FBQyxHQUFRLEVBQUUsU0FBMEIsRUFBRSxLQUFhLEVBQUUsS0FBYTtRQUNuRixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUIsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRWxELEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU1QixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSw0REFBNEQ7SUFDNUQseUVBQXlFO0lBQ3pFLG9FQUFvRTtJQUNwRSx5RUFBeUU7SUFDekUsZ0NBQWdDO0lBQ3hCLEtBQUssQ0FBQyxXQUFXLENBQ3ZCLE9BQXlCLEVBQ3pCLFNBQTBCLEVBQzFCLE1BQXdCO1FBRXhCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQztZQUMzRCxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDO1lBQ25ELENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDVCxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ3RCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQix1RUFBdUU7UUFDdkUsdUVBQXVFO1FBQ3ZFLHdDQUF3QztRQUN4QyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFckIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU07Z0JBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDO2dCQUNuRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FDbkIsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxHQUFHLEVBQy9ELFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsaUJBQWlCLENBQ2pELENBQUM7WUFFSixJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDZCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUN4QixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsT0FBTztJQUNDLFFBQVEsQ0FBQyxTQUEwQjtRQUN6QyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQXlCLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLHlCQUF5QixDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXZGLE9BQU87WUFDTCxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7WUFDN0MsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO1lBQzNDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO1lBQ3RFLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQztTQUNsRSxDQUFDO0lBQ0osQ0FBQztJQUVELDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsMkVBQTJFO0lBQzNFLG1FQUFtRTtJQUMzRCxlQUFlLENBQUMsR0FBUSxFQUFFLFVBQTJCLEVBQUUsR0FBZSxFQUFFLE9BQWU7UUFDN0YsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2hCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUVuQixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLFVBQVUsR0FBRyxTQUFTLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBRTdELEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO29CQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ25DLENBQUM7Z0JBRUQsSUFBSSxTQUFTLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDcEQsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUN2RixDQUFDO2dCQUVELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDNUYsQ0FBQyxJQUFJLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztZQUMvQixDQUFDO1lBRUQsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xCLENBQUMsSUFBSSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLGNBQWM7SUFDTixpQkFBaUIsQ0FBQyxHQUFRLEVBQUUsVUFBMkIsRUFBRSxLQUFhO1FBQzVFLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXZGLE9BQU8sTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQzNCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLGdCQUFnQixFQUFFLENBQUMsQ0FBQztnQkFDMUYsQ0FBQyxDQUFDLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDNUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxlQUFlO0lBQ1AsU0FBUyxDQUFDLFNBQXdCLEVBQUUsSUFBZTtRQUN6RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLElBQUksaUJBQWlCLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBRUQsd0VBQXdFO0lBQ2hFLFNBQVMsQ0FDZixHQUFRLEVBQ1IsSUFBZSxFQUNmLEtBQTZCLEVBQzdCLElBQVksRUFBRSxLQUFhLEVBQUUsUUFBZ0I7UUFFN0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFMUQsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSx3RUFBd0U7SUFDeEUsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDaEUsY0FBYyxDQUNwQixPQUF5QixFQUN6QixLQUFnQixFQUNoQixNQUE4QixFQUM5QixHQUFlLEVBQ2YsR0FBVztRQUVYLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN0QixPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDckMsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ3JELE1BQU0sWUFBWSxHQUFHLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxPQUFPO1lBQ2hFLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUM1RCxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFOUQsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRUQsT0FBTztZQUNMLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRztZQUN6RSxHQUFHLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTTtTQUM3QixDQUFDO0lBQ0osQ0FBQztJQUVELDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDM0UsaUNBQWlDO0lBQ3pCLGNBQWMsQ0FBQyxHQUFRLEVBQUUsSUFBbUIsRUFBRSxZQUFzQjtRQUMxRSxNQUFNLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQztRQUN4QyxNQUFNLEtBQUssR0FBRyxZQUFZO2FBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUM5QyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBRS9FLE9BQU87WUFDTCxPQUFPLEVBQUUsRUFBRTtZQUNYLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsUUFBUSxFQUFFLElBQUk7WUFDZCxNQUFNLEVBQUU7Z0JBQ04sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDO29CQUNwQixDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFO29CQUMvRixDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ1I7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSxnQkFBZ0I7SUFDUixpQkFBaUIsQ0FDdkIsT0FBeUIsRUFDekIsWUFBc0IsRUFDdEIsSUFBWSxFQUFFLEdBQVcsRUFBRSxLQUFhLEVBQUUsTUFBYztRQUV4RCxNQUFNLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQztRQUV4QyxPQUFPO1lBQ0wsS0FBSyxFQUFFLE9BQU87WUFDZCxPQUFPLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM3RCxNQUFNLEVBQUUsR0FBRztZQUNYLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsS0FBSyxHQUFHLE1BQU0sRUFBRTtZQUNyRixVQUFVLEVBQUUsS0FBSztZQUNqQixZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEcsWUFBWSxFQUFFLE9BQU87WUFDckIsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxXQUFXO2dCQUNqQixTQUFTLEVBQUUsUUFBUTtnQkFDbkIsUUFBUSxFQUFFLGlCQUFpQjtnQkFDM0IsV0FBVyxFQUFFO29CQUNYLEdBQUcsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVTtpQkFDckc7Z0JBQ0QsU0FBUyxFQUFFLHVCQUF1QjtnQkFDbEMsU0FBUyxFQUFFLHVCQUF1QjtnQkFDbEMsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLFNBQVMsRUFBRSxrQkFBa0I7YUFDOUI7WUFDRCxXQUFXLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1NBQ3JELENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsc0VBQXNFO0lBQzlELGFBQWEsQ0FBQyxPQUF5QixFQUFFLE9BQWdDO1FBQy9FLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFFWixPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtZQUN6QixHQUFHLE9BQU87WUFDVixXQUFXLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUNsRixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLFNBQVM7SUFDRCxTQUFTLENBQUMsSUFBMEIsRUFBRSxHQUFXO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWxFLE9BQU8sT0FBTyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELDZFQUE2RTtJQUM3RSw4RUFBOEU7SUFDOUUsdURBQXVEO0lBQy9DLGFBQWEsQ0FBQyxJQUFTO1FBQzdCLE1BQU0sSUFBSSxHQUE4QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7UUFDaEUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUMxQyxNQUFNLEdBQUcsR0FBZTtZQUN0QixJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUNuQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNqQyxLQUFLLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUM5QyxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7U0FDakQsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9HLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTFGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsK0JBQStCO0lBQ3ZCLEtBQUssQ0FBQyxHQUFRLEVBQUUsU0FBd0IsRUFBRSxLQUFhO1FBQzdELE1BQU0sS0FBSyxHQUFnQixFQUFFLENBQUM7UUFDOUIsSUFBSSxJQUFJLEdBQWMsRUFBRSxDQUFDO1FBQ3pCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUVsQixLQUFLLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsUUFBUSxJQUFJLGlCQUFpQixDQUFDO1lBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUUzQixLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ3ZGLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRXpDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDO29CQUNsRixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqQixJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNWLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hCLENBQUM7Z0JBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRCxTQUFTLElBQUksU0FBUyxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sU0FBUyxDQUFDLEdBQVEsRUFBRSxJQUFhLEVBQUUsQ0FBUyxFQUFFLFFBQWdCO1FBQ3BFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFFckIsSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEIsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVqQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxJQUFJLGtCQUFrQixDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xFLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xCLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2pDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFDRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNmLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2pDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFFRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNiLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRixDQUFDO0lBQ0gsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSxtREFBbUQ7SUFDM0MsS0FBSyxDQUFDLEdBQVEsRUFBRSxHQUFZLEVBQUUsSUFBWTtRQUNoRCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdEMsQ0FBQyxDQUFDLFNBQVM7WUFDWCxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU07WUFDbEMsQ0FBQyxDQUFDLFlBQVk7WUFDZCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRTdELEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNCLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLGtCQUFrQixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVPLGNBQWMsQ0FBQyxHQUFRLEVBQUUsSUFBWTtRQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFFckQsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUE2QixFQUFFLEtBQWEsRUFBRSxTQUFpQjtRQUNsRixRQUFRLEtBQUssRUFBRSxDQUFDO1lBQ2QsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUMsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQ3hDO2dCQUNFLE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsNEVBQTRFO0lBQzVFLDBFQUEwRTtJQUMxRSxnRUFBZ0U7SUFDeEQsT0FBTyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWEsRUFBRSxVQUFrQjtRQUNqRixPQUFPO1lBQ0wsVUFBVTtZQUNWLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsS0FBSyxHQUFHLENBQUMsRUFBRTtZQUMxQyxVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUk7U0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQzVCLE9BQXlCLEVBQ3pCLElBQXdCLEVBQ3hCLFNBQTZCO1FBRTdCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNqQyx5REFBeUQ7UUFDekQsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFM0IsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCx3RUFBd0U7UUFDeEUsd0VBQXdFO1FBQ3hFLHVFQUF1RTtRQUN2RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEYsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlGLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN2QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4RixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNsQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQztRQUU3RCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFekQsT0FBTztRQUNULENBQUM7UUFFRCxRQUFRLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QixLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ2IsTUFBTSxLQUFLLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDNUYsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMvQyxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssTUFBTTtnQkFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNO1lBQ1IsS0FBSyxLQUFLO2dCQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbkQsTUFBTTtRQUNWLENBQUM7SUFDSCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDbkUsVUFBVSxDQUNoQixHQUFRLEVBQ1IsSUFBWSxFQUNaLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUMvQixLQUF3QixFQUN4QixLQUEwQixFQUMxQixLQUFLLEdBQUcsQ0FBQztRQUVULEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLEdBQUcsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxHQUFHLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDM0csQ0FBQztJQUVELCtEQUErRDtJQUN2RCxJQUFJLENBQUMsR0FBUSxFQUFFLElBQVksRUFBRSxLQUFhO1FBQ2hELElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNwQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDZixPQUFPLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQzdELEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUM7SUFDN0IsQ0FBQztJQUVELDRFQUE0RTtJQUNwRSxlQUFlLENBQUMsR0FBUSxFQUFFLEtBQWEsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7UUFDOUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSxvQ0FBb0M7SUFDNUIsUUFBUSxDQUFDLEdBQVEsRUFBRSxJQUFZLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztRQUNqRixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNuQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLEdBQUcsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSwyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSwyREFBMkQ7SUFDbkQsWUFBWSxDQUNsQixPQUF5QixFQUN6QixJQUF3QixFQUN4QixDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQzFDLFNBQTZCO1FBRTdCLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUksQ0FBQztRQUNsRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBcUIsQ0FBQztRQUN4QyxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUM7YUFDcEYsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMzRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakYsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsRyxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUMsTUFBTSxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsVUFBVSxDQUNiLE9BQU8sRUFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUN2RixDQUFDO1lBRUYsT0FBTztRQUNULENBQUM7UUFFRCx5RUFBeUU7UUFDekUsMkVBQTJFO1FBQzNFLHVFQUF1RTtRQUN2RSxRQUFRO1FBQ1IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFakgsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDN0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDNUcsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFRCx5RUFBeUU7SUFDekUsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUNsRSxXQUFXLENBQ2pCLE9BQXlCLEVBQ3pCLFNBQTBCLEVBQzFCLElBQW1CLEVBQ25CLGFBQWdDO1FBRWhDLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzFGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUN4RSxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUNyRixDQUFDLENBQUMsQ0FBQztRQUNKLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRW5GLE9BQU87WUFDTCxLQUFLO1lBQ0wsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDaEQsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQzVELENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsMEVBQTBFO0lBQzFFLEVBQUU7SUFDRix3RUFBd0U7SUFDeEUsNEVBQTRFO0lBQzVFLDBFQUEwRTtJQUMxRSx1RUFBdUU7SUFDdkUsNkNBQTZDO0lBQ3JDLGFBQWEsQ0FDbkIsT0FBeUIsRUFDekIsSUFBYyxFQUNkLE9BQWtCLEVBQ2xCLElBQXNCLEVBQ3RCLENBQVMsRUFBRSxNQUFjLEVBQUUsQ0FBUyxFQUFFLE1BQWMsRUFDcEQsWUFBOEIsRUFDOUIsSUFBc0I7UUFFdEIsT0FBTztZQUNMLEtBQUssRUFBRSxNQUFNO1lBQ2IsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ1osSUFBSTtZQUNKLE1BQU07WUFDTixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFO1lBQ3pELFVBQVUsRUFBRSxDQUFDO1lBQ2IsWUFBWSxFQUFFLE9BQU87WUFDckIsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO1lBQ3JHLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFO1lBQzdFLGtCQUFrQixFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtZQUM1QyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekMsR0FBRyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFDO29CQUNBLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztvQkFDWixRQUFRLEVBQUUsVUFBVTtvQkFDcEIsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7aUJBQzlFO2dCQUNELENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxZQUFZLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdkYsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztnQkFDcEMsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsd0VBQXdFO0lBQ3hFLHdCQUF3QjtJQUNoQixVQUFVLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxVQUFtQjtRQUNoRSxPQUFPLENBQUM7Z0JBQ04sT0FBTyxFQUFFLElBQUk7Z0JBQ2IsT0FBTyxFQUFFLElBQUk7Z0JBQ2Isc0VBQXNFO2dCQUN0RSxvRUFBb0U7Z0JBQ3BFLE1BQU0sRUFBRTtvQkFDTixTQUFTLEVBQUUsUUFBUTtvQkFDbkIsU0FBUyxFQUFFLFdBQVc7b0JBQ3RCLE1BQU0sRUFBRSxNQUFNO29CQUNkLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ2pEO2FBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ3pFLHVFQUF1RTtJQUN2RSwwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLHNFQUFzRTtJQUN0RSwyRUFBMkU7SUFDM0Usc0VBQXNFO0lBQzlELFFBQVEsQ0FDZCxPQUF5QixFQUN6QixJQUFjLEVBQ2QsS0FBaUIsRUFDakIsT0FBa0IsRUFDbEIsSUFBcUIsRUFDckIsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsTUFBYztRQUUvQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRVosT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDekIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQztZQUN0RixXQUFXLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzdFLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLE9BQU8sR0FBd0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7UUFDbkUsTUFBTSxZQUFZLEdBQW9CLEVBQUUsQ0FBQztRQUN6QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUNsQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO2dCQUM5QyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO1FBRUgsdUVBQXVFO1FBQ3ZFLGlFQUFpRTtRQUNqRSxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNELEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDWCxDQUFDO1FBRUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLDZDQUE2QztJQUNyQyxnQkFBZ0IsQ0FBQyxPQUF5QjtRQUNoRCxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN2QixJQUFJLEVBQUUsSUFBSTtZQUNWLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN0QyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7U0FDakMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSx1RUFBdUU7SUFDdkUsNkVBQTZFO0lBQzdFLDBFQUEwRTtJQUMxRSx3QkFBd0I7SUFDaEIsVUFBVSxDQUFDLE9BQXlCLEVBQUUsT0FBZ0M7UUFDNUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUN4QixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFaEMsT0FBTyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUN0QyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSx1RUFBdUU7SUFDdkUsdUVBQXVFO0lBQ3ZFLDhEQUE4RDtJQUN0RCxLQUFLLENBQUMsbUJBQW1CLENBQy9CLE9BQXlCLEVBQ3pCLElBQWdCLEVBQ2hCLEtBQWEsRUFDYixVQUFrQixFQUNsQixRQUEwQjtRQUUxQixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxJQUFJLFFBQVEsQ0FBQztRQUM3RixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUQsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdBQXFCLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BHLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ2xCLHFEQUFxRDtRQUNyRCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFFM0IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNyQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQ25CLE9BQU8sRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLFlBQVksRUFDbEcsUUFBUSxDQUFDLElBQUksQ0FDZDtZQUNELE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDN0UsUUFBUSxFQUFFLFdBQVc7WUFDckIsOERBQThEO1lBQzlELFlBQVksRUFBRSxHQUFHLEVBQUU7Z0JBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRS9FLE9BQU8sVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSw0RUFBNEU7SUFDNUUsMkVBQTJFO0lBQzNFLHVEQUF1RDtJQUMvQyxLQUFLLENBQUMsMEJBQTBCLENBQ3RDLE9BQXlCLEVBQ3pCLElBQWdCLEVBQ2hCLEtBQWEsRUFDYixVQUFrQixFQUNsQixLQUFlO1FBRWYsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFaEMsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3JELEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDMUIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEcsQ0FBQztRQUVELEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLG9CQUFvQjtJQUNaLG1CQUFtQixDQUFDLElBQVk7UUFDdEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztJQUM5RCxDQUFDO0lBRU8sZUFBZSxDQUFDLFNBQTBCLEVBQUUsTUFBZTtRQUNqRSxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTdDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7SUFDdEQsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUseUNBQXlDO0lBQ2pDLFVBQVUsQ0FDaEIsT0FBeUIsRUFDekIsSUFBd0IsRUFDeEIsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztRQUUxQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBbUIsQ0FBQztRQUNsRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDM0csTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFcEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QixHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBRTNELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNuQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixHQUFHLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM5QixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUVELE9BQU87UUFDVCxDQUFDO1FBRUQsZ0VBQWdFO1FBQ2hFLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMxRCxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNELElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTNFLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEYsR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFFckIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNuQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsR0FBRyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM5QixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzlHLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hELEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RixHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN4QixDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0MsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDeEIsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRixHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUMzQixDQUFDO1FBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsNEVBQTRFO0lBQzVFLHFFQUFxRTtJQUM3RCxTQUFTLENBQUMsR0FBUSxFQUFFLEtBQW1CLEVBQUUsQ0FBUyxFQUFFLEdBQVcsRUFBRSxDQUFTLEVBQUUsS0FBSyxHQUFHLENBQUM7UUFDM0YsTUFBTSxLQUFLLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLElBQUksR0FBRyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssS0FBSyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBRXJGLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUTtZQUM3QixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLE1BQU0sS0FBSyxHQUFHLEtBQUssR0FBRyxXQUFXLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTVDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxLQUFLLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDNUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFFN0MsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksSUFBSSxLQUFLLENBQUM7UUFDaEIsQ0FBQztRQUVELEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNuQyxHQUFHLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksR0FBRyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFRCw2RUFBNkU7SUFDN0UscUVBQXFFO0lBQzdELFVBQVUsQ0FBQyxHQUFRLEVBQUUsTUFBcUIsRUFBRSxDQUFTLEVBQUUsR0FBVyxFQUFFLENBQVM7UUFDbkYsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxNQUFNLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUVuRixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUV6RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDekIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxNQUFNLElBQUksR0FBRyxHQUFHLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUVuQyxHQUFHLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTNDLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksd0JBQXdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5RCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELENBQUM7SUFDSCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSw2RUFBNkU7SUFDN0UsY0FBYztJQUNOLGFBQWEsQ0FDbkIsR0FBUSxFQUNSLE1BQXlCLEVBQ3pCLE9BQWdCLEVBQ2hCLENBQVMsRUFBRSxHQUFXLEVBQUUsQ0FBUztRQUVqQyxNQUFNLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixDQUFDO1FBQzdELE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLENBQUMsRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsR0FBRztZQUM5QixDQUFDLEVBQUUsR0FBRyxHQUFHLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUc7U0FDcEQsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSwwQkFBMEIsRUFBRSxDQUFDO1FBRS9DLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBCLEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQzFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRTdDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU1RyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWhDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDekIsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDNUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hELENBQUM7aUJBQU0sQ0FBQztnQkFDTixHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSw2RUFBNkU7SUFDN0Usc0VBQXNFO0lBQ3RFLDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDekUsNkVBQTZFO0lBQzdFLHlFQUF5RTtJQUN6RSxxRUFBcUU7SUFDckUsc0JBQXNCO0lBQ2QsUUFBUSxDQUFDLElBQVk7UUFDM0IsT0FBTyxJQUFJO2FBQ1IsT0FBTyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7YUFDNUIsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQzthQUMvQixPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQzthQUN2QixPQUFPLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQzthQUMxQixPQUFPLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsNEVBQTRFO0lBQ3BFLFVBQVUsQ0FBQyxNQUFpQztRQUNsRCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckUsR0FBRztZQUNILEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1NBQ2pGLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLEtBQUssQ0FBQyxJQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUM7SUFDNUYsQ0FBQzt3R0F6bUNVLGdCQUFnQjs0R0FBaEIsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlcG9ydEtwaVRyZW5kIH0gZnJvbSAnLi4vZW51bXMvcmVwb3J0LWtwaS10cmVuZC5lbnVtJztcbmltcG9ydCB7IHJlc29sdmVSZXBvcnRUaW1lem9uZSB9IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBLcGlDb25maWcsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBSZXBvcnRIZWFkZXJGb290ZXIsXG4gIFJlcG9ydFBhZ2UsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBLcGlDYXJkRGVsdGEsIEtwaUNhcmRUYXJnZXQsIEtwaVNwYXJrbGluZVBvaW50LCBrcGlDYXJkVmlldywga3BpU3BhcmtsaW5lR2VvbWV0cnksXG59IGZyb20gJy4uL2twaS1jYXJkJztcbmltcG9ydCB7IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkcgfSBmcm9tICcuLi9sYXlvdXQnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9URVhUX0NPTE9SLCBERUZBVUxUX1RFWFRfU0laRSwgVEVYVF9UQUJMRV9CT1JERVJfQ09MT1IsIFRFWFRfVEFCTEVfQk9SREVSX1dJRFRILCBURVhUX1RBQkxFX0NFTExfUEFERElORyxcbiAgVEVYVF9UQUJMRV9NQVJHSU4sIFRleHRQYXJhZ3JhcGgsIFRleHRSdW4sIFRleHRUYWJsZSwgVGV4dFRhYmxlQ2VsbCwgVGV4dFRva2VuQ29udGV4dCwgVGV4dFZhbHVlLCB0ZXh0QmxvY2tzLFxufSBmcm9tICcuLi90ZXh0JztcbmltcG9ydCB7XG4gIFJFUE9SVF9LUElfQ0hBTkdFX0NPTE9SUywgUkVQT1JUX0tQSV9TUEFSS0xJTkVfQ09MT1IsIFJFUE9SVF9LUElfVFJBQ0tfQ09MT1IsIFJFUE9SVF9NVVRFRF9URVhUX0NPTE9SLFxufSBmcm9tICcuLi90aGVtZS9wYWxldHRlJztcbmltcG9ydCB7IGlzRHJhd24gfSBmcm9tICcuLi92YWx1ZXMnO1xuaW1wb3J0IHsgcmVuZGVyQ2hhcnRJbWFnZSB9IGZyb20gJy4vb2Zmc2NyZWVuLWNoYXJ0JztcbmltcG9ydCB7XG4gIEJ1aWx0RXhwb3J0LCBDb2xsZWN0ZWRDb21wb25lbnQsIENvbGxlY3RlZFBhZ2UsIENvbGxlY3RlZFJlcG9ydCwgSEVBREVSX0ZPT1RFUl9OQU1FLCBLcGlFeHBvcnRIZWlnaHRzLCBUZXh0T3ZlcmZsb3csXG4gIGNvdmVyTGluZXMsIGVtcHR5TGFiZWwsIGV4cG9ydENlbGwsIGV4cG9ydE5vdGVMaW5lcywgZXhwb3J0VGl0bGUsIGV4cG9ydFdpbmRvd3NMaW5lLCBrcGlDYXJkSGFzRXh0cmFzLFxuICBrcGlFeHBvcnRIZWlnaHQsIGtwaUV4cG9ydFBhcnRzLCBsaXN0Q29sdW1ucywgbGlzdEhlYWRpbmdzLCBsaXN0VG90YWxzUm93LCBtb3JlUm93c05vdGljZSwgc2NhbGVkS3BpSGVpZ2h0cyxcbiAgdGV4dE92ZXJmbG93LFxufSBmcm9tICcuL3JlcG9ydC1leHBvcnQtY29sbGVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0VGV4dExheW91dFNlcnZpY2UsIFRleHRUYWJsZUxheW91dCB9IGZyb20gJy4vcmVwb3J0LXRleHQtbGF5b3V0LnNlcnZpY2UnO1xuXG5cbi8vIEluY2hlcyDihpIgcG9pbnRzICh0aGUgUERGIHVuaXQpLlxuY29uc3QgUFQgPSA3MjtcblxuLy8gQ29tcG9uZW50IHRpdGxlIHN0cmlwIGhlaWdodCwgcG9pbnRzLlxuY29uc3QgVElUTEVfSCA9IDE4O1xuXG4vLyBUaGUgc21hbGwgcHJpbnQgYSBjb21wb25lbnQgbWF5IGNhcnJ5LCBwb2ludHM6IHRoZSBkYXlzIGl0IHJlYWRzIHVuZGVyIGl0c1xuLy8gdGl0bGUgKGEgc3VidGl0bGUgbGluZSksIGl0cyBub3RlcyBhdCB0aGUgZm9vdCBvZiBpdHMgYm94IChhIGxpbmUgZWFjaCksIGFuZFxuLy8gdGhlIGxpbmVzIG9mIGEgS1BJIGNhcmQgdW5kZXIgaXRzIHZhbHVlLiBBIGNoYXJ0J3Mgb3IgYSBsaXN0J3Mgbm90ZXMgZ2l2ZVxuLy8gd2F5IGJlZm9yZSBpdHMgYm9keSB3b3VsZCBzaHJpbmsgdW5kZXIgTUlOX0JPRFlfSC5cbmNvbnN0IFNNQUxMX1NJWkUgPSA3LjU7XG5jb25zdCBTVUJUSVRMRV9IID0gMTE7XG5jb25zdCBOT1RFX0xJTkVfSCA9IDEwO1xuY29uc3QgTUlOX0JPRFlfSCA9IDQwO1xuY29uc3QgTVVURURfQ09MT1IgPSBgIyR7UkVQT1JUX01VVEVEX1RFWFRfQ09MT1J9YDtcblxuLy8gQSBLUEkgY2FyZCdzIHBhcnRzLCB0b3AgdG8gYm90dG9tLCBwb2ludHMgKGtwaUV4cG9ydFBhcnRzIHNoZWRzIHRoZVxuLy8gc3BhcmtsaW5lLCB0aGVuIHRoZSB0YXJnZXQsIHRoZW4gdGhlIG5vdGVzIG9uIGEgc2hvcnQgdGlsZSkuIFRoZSB2YWx1ZSdzXG4vLyBiYXNlbGluZSBzaXRzIEtQSV9WQUxVRV9CQVNFTElORSB1bmRlciBpdHMgdG9wLlxuY29uc3QgS1BJX0hFSUdIVFM6IEtwaUV4cG9ydEhlaWdodHMgPSB7XG4gIHZhbHVlOiAzMCxcbiAgbGFiZWw6IDEzLFxuICBkZWx0YTogMTMsXG4gIHdpbmRvdzogTk9URV9MSU5FX0gsXG4gIHRhcmdldDogTk9URV9MSU5FX0ggKyA2LFxuICBzcGFya2xpbmU6IDI4LFxuICBub3RlOiBOT1RFX0xJTkVfSCxcbn07XG5jb25zdCBLUElfVkFMVUVfQkFTRUxJTkUgPSAyMztcbmNvbnN0IEtQSV9ERUxUQV9TSVpFID0gOTtcbi8vIFRoZSBkZWx0YSdzIHRyaWFuZ2xlOiBpdHMgc2lkZSwgYW5kIHRoZSBnYXAgYmVmb3JlIHRoZSBjaGFuZ2UuXG5jb25zdCBLUElfQVJST1cgPSA2O1xuY29uc3QgS1BJX0FSUk9XX0dBUCA9IDM7XG4vLyBUaGUgdGFyZ2V0J3MgcHJvZ3Jlc3MgYmFyLCBhbmQgdGhlIHRyYWNrIGl0IGZpbGxzLlxuY29uc3QgS1BJX0JBUl9XID0gMTIwO1xuY29uc3QgS1BJX0JBUl9IID0gMztcbmNvbnN0IEtQSV9UUkFDS19DT0xPUiA9IGAjJHtSRVBPUlRfS1BJX1RSQUNLX0NPTE9SfWA7XG4vLyBUaGUgc3BhcmtsaW5lJ3Mgd2lkZXN0IGJveCwgaXRzIHRvcCBhbmQgYm90dG9tIGluc2V0LCBhbmQgaXRzIGRvdHMnIHJhZGl1cy5cbmNvbnN0IEtQSV9TUEFSS0xJTkVfVyA9IDE0MDtcbmNvbnN0IEtQSV9TUEFSS0xJTkVfSU5TRVQgPSAzO1xuY29uc3QgS1BJX0RPVF9SID0gMS41O1xuXG4vLyBSb3dzIGZldGNoZWQgZm9yIGEgbGlzdCdzIFBERiB0YWJsZS4gQSB0YWJsZSB0aGF0IG91dGdyb3dzIGl0cyBib3hcbi8vIGNvbnRpbnVlcyBvbnRvIHBhZ2VzIG9mIGl0cyBvd24sIHNvIHRoaXMgaXMgaG93IGZhciBpdCBtYXkgcnVuOiBhYm91dCAxMi0xNVxuLy8gY29udGludWF0aW9uIHBhZ2VzIG9uIGEgbGV0dGVyIHBhZ2UsIGFuZCBhIHRlbnRoIG9mIHRoZSBzZXJ2ZXIncyA1MDAwLXJvd1xuLy8gY2VpbGluZy4gQSBsb25nZXIgcmVzdWx0IGVuZHMgaW4gYSBtb3JlUm93c05vdGljZSgpIHJvdy5cbmV4cG9ydCBjb25zdCBQREZfTElTVF9ST1dTID0gNTAwO1xuXG4vLyBIb3cgZmFyIGEgY29udGludWF0aW9uIHRhYmxlIHNpdHMgaW5zaWRlIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kcyxcbi8vIHBvaW50cy4gQSBwYWdlIHdpdGggbm8gYmFuZCAob3Igd2l0aCB0aGUgbWFzdGVyIGhpZGRlbikga2VlcHNcbi8vIE5PX0JBTkRfTUFSR0lOIGZyb20gdGhhdCBlZGdlIGluc3RlYWQuXG5jb25zdCBDT05USU5VQVRJT05fR0FQID0gMC4yNSAqIFBUO1xuY29uc3QgTk9fQkFORF9NQVJHSU4gPSAwLjUgKiBQVDtcbmNvbnN0IE5PX0JBTkRTOiBSZXBvcnRIZWFkZXJGb290ZXIgPSB7IGhlYWRlckhlaWdodDogMCwgZm9vdGVySGVpZ2h0OiAwIH07XG5cbi8vIFRoZSBsYXN0IHJvdyBvZiBhIGxpc3QgYm94IHdob3NlIHJvd3MgY2Fycnkgb24gcGFzdCBpdC5cbmNvbnN0IENPTlRJTlVFRF9OT1RJQ0UgPSAnQ29udGludWVkIG9uIHRoZSBmb2xsb3dpbmcgcGFnZXMnO1xuXG4vLyBBIHRleHQgbGluZSdzIGhlaWdodCBhcyBhIG11bHRpcGxlIG9mIGl0cyBsYXJnZXN0IGZvbnQgc2l6ZSDigJQgdGhlIGNhbnZhc1xuLy8gc3R5bGVzaGVldCdzIGxpbmUtaGVpZ2h0LCBzbyBhIGJsb2NrIHdyYXBzIGFuZCBzdGFja3MgdGhlIHNhbWUgd2F5LlxuY29uc3QgVEVYVF9MSU5FX0hFSUdIVCA9IDEuMjU7XG5cbi8vIEhvdyBmYXIgYSBsaXN0IGl0ZW0ncyB0ZXh0IHNpdHMgZnJvbSB0aGUgYmxvY2sncyBlZGdlLCBwb2ludHM7IHRoZSBtYXJrZXJcbi8vIGhhbmdzIGluIHRoYXQgc3BhY2UuXG5jb25zdCBMSVNUX0lOREVOVCA9IDE2O1xuXG4vLyBXaGF0IHRoZSBleHBvcnQncyBvdmVyZmxvdyBnYXRlIHNheXMgdGhlIFBERiBkb2VzIHdpdGggYSB0ZXh0IGJsb2NrIHRoYXQgZG9lc1xuLy8gbm90IGZpdCBpdHMgYm94LlxuY29uc3QgUERGX09WRVJGTE9XX05PVEUgPSAnVGhlIFBERiBjdXRzIGl0IG9mZiBhdCB0aGUgYm90dG9tIG9mIGl0cyBib3guJztcblxuLy8gV2hhdCBldmVyeSBkcmF3aW5nIHN0ZXAgb2Ygb25lIGV4cG9ydCBzaGFyZXMsIGJ1aWx0IG9uY2UgaW4gYnVpbGQoKS5cbi8vIFNpemVzIGFyZSBwb2ludHMuXG5pbnRlcmZhY2UgUGRmRXhwb3J0Q29udGV4dCB7XG4gIGRvYzogYW55O1xuICBhdXRvVGFibGU6IGFueTtcbiAganNQREY6IGFueTtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIGZvcm1hdENvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQ7XG4gIHBhZ2VXOiBudW1iZXI7XG4gIHBhZ2VIOiBudW1iZXI7XG4gIG9yaWVudGF0aW9uOiAnbGFuZHNjYXBlJyB8ICdwb3J0cmFpdCc7XG4gIC8vIFdoYXQgdGhlIGhlYWRlciBhbmQgZm9vdGVyJ3MgdmFsdWUgdG9rZW5zIGZpbGwgd2l0aCwgdGhlIHNhbWUgb24gZXZlcnlcbiAgLy8gcGFnZSwgY29udGludWF0aW9uIHBhZ2VzIGluY2x1ZGVkIChfcGRmVmFsdWVzKS5cbiAgbWFzdGVyVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBUZXh0VmFsdWU+O1xuICAvLyBUaGUgdGV4dCBibG9ja3MgY3V0IG9mZiBhdCB0aGUgYm90dG9tIG9mIHRoZWlyIGJveCwgYnkgY29tcG9uZW50IGlkLCBzbyBhXG4gIC8vIGhlYWRlciBvciBmb290ZXIgYmxvY2sgY3V0IG9uIGV2ZXJ5IHBhZ2UgaXMgbGlzdGVkIG9uY2UuXG4gIHRleHRPdmVyZmxvd3M6IE1hcDxudW1iZXIsIFRleHRPdmVyZmxvdz47XG59XG5cbi8vIEEgd29yZCBvZiBhIHdyYXBwZWQgbGluZSAoX3dyYXApOiBpdHMgcnVuLCBpdHMgdGV4dCB3aXRoIGFueSB0cmFpbGluZyBzcGFjZSxcbi8vIGl0cyBmb250IHNpemUgYW5kIGl0cyB3aWR0aCwgcG9pbnRzLlxuaW50ZXJmYWNlIFBkZldvcmQge1xuICBydW46IFRleHRSdW47XG4gIHRleHQ6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xufVxuXG4vLyBXaGVyZSBhIHRleHQgYmxvY2sncyB3b3JkcyBhcmUgZHJhd24sIHBvaW50czogdGhlIGxlZnQgZWRnZSBhbmQgd2lkdGggdGhleVxuLy8gd3JhcCB0bywgdGhlIHRvcCBvZiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBib3R0b20gbm8gbGluZSBtYXkgcnVuIHBhc3QuIEFcbi8vIHRleHQgdGFibGUncyBjZWxsIGRyYXdzIGl0cyB3b3JkcyB0aGUgc2FtZSB3YXksIGluc2lkZSBpdHMgcGFkZGluZy5cbmludGVyZmFjZSBQZGZUZXh0Qm94IHtcbiAgbGVmdDogbnVtYmVyO1xuICB0b3A6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgYm90dG9tOiBudW1iZXI7XG59XG5cbi8vIFdoZXJlIHRoZSBuZXh0IHBhcnQgb2YgYSB0ZXh0IGJsb2NrIHN0YXJ0cywgYW5kIHdoZXRoZXIgdGhlIHBhcnQganVzdCBkcmF3blxuLy8gd2FzIGN1dCBvZmYgYXQgdGhlIGJvdHRvbSBvZiBpdHMgYm94LlxuaW50ZXJmYWNlIFBkZlRleHRDdXJzb3Ige1xuICBjdXJzb3JZOiBudW1iZXI7XG4gIGN1dDogYm9vbGVhbjtcbn1cblxuLy8gQSB0ZXh0IHRhYmxlJ3MgY2VsbCBhcyBhdXRvVGFibGUgdGFrZXMgaXQuIEl0IHByaW50cyBubyB0ZXh0IG9mIGl0cyBvd246IHRoZVxuLy8gY2VsbCdzIHdvcmRzICh0ZXh0Q2VsbCkgYXJlIGRyYXduIGludG8gaXQgb25jZSBpdHMgZ3JpZCBsaW5lcyBhbmQgZmlsbCBhcmVcbi8vIChfZHJhd1RleHRDZWxsKS5cbmludGVyZmFjZSBQZGZUZXh0Q2VsbElucHV0IHtcbiAgY29udGVudDogc3RyaW5nO1xuICBjb2xTcGFuOiBudW1iZXI7XG4gIHJvd1NwYW46IG51bWJlcjtcbiAgdGV4dENlbGw6IFRleHRUYWJsZUNlbGw7XG4gIHN0eWxlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vIEZpeGVkIGNvbHVtbiB3aWR0aHMsIGJ5IGNvbHVtbiBpbmRleCwgaW4gcG9pbnRzLCBhbmQgdGhlIHJpZ2h0IGFsaWdubWVudCBvZlxuLy8gYSBjb2x1bW4gb2YgZm9ybWF0dGVkIG51bWJlcnMuXG50eXBlIFBkZkNvbHVtblN0eWxlcyA9IFJlY29yZDxudW1iZXIsIHsgY2VsbFdpZHRoOiBudW1iZXI7IGhhbGlnbj86ICdyaWdodCcgfT47XG5cbi8vIEEgdGFibGUgYm9keSBjZWxsOiBwbGFpbiB0ZXh0LCBvciBhIG5vdGljZSByb3cncyBvbmUgY2VsbCBzcGFubmluZyBldmVyeVxuLy8gY29sdW1uLlxudHlwZSBQZGZUYWJsZUNlbGwgPSBzdHJpbmcgfCB7IGNvbnRlbnQ6IHN0cmluZzsgY29sU3BhbjogbnVtYmVyOyBzdHlsZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG5cbi8vIFRoZSByb3dzIG9mIGEgbGlzdCB0aGF0IGRpZCBub3QgZml0IGl0cyBib3gsIGNhcnJpZWQgb250byBjb250aW51YXRpb25cbi8vIHBhZ2VzIGFmdGVyIGl0cyByZXBvcnQgcGFnZS4geCBhbmQgdyBhcmUgdGhlIGJveCdzLCBpbiBwb2ludHMsIGFuZCB0aGVcbi8vIGNvbHVtbiB3aWR0aHMgYW5kIGFsaWdubWVudHMgYXJlIHRoZSBvbmVzIHRoZSBvbi1wYWdlIHRhYmxlIHdhcyBkcmF3biB3aXRoLFxuLy8gc28gdGhlIHRhYmxlIHJlYWRzIGFzIG9uZSBhY3Jvc3MgcGFnZXMuXG5pbnRlcmZhY2UgUGRmVGFibGVPdmVyZmxvdyB7XG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICAvLyBUaGUgdGV4dCB0aGUgbGlzdCB3YXMgc2VhcmNoZWQgYnksIGZvciB0aGUgY29udGludWF0aW9uIHRpdGxlLlxuICBzZWFyY2g/OiBzdHJpbmc7XG4gIGhlYWQ6IHN0cmluZ1tdO1xuICBudW1lcmljOiBib29sZWFuW107XG4gIHJvd3M6IHN0cmluZ1tdW107XG4gIG9taXR0ZWQ6IG51bWJlcjtcbiAgLy8gVGhlIGxpc3QncyB0b3RhbHMgcm93LCB3aGljaCBjbG9zZXMgdGhlIGxhc3QgY29udGludWF0aW9uIHBhZ2UuXG4gIGZvb3Q6IHN0cmluZ1tdIHwgbnVsbDtcbiAgeDogbnVtYmVyO1xuICB3OiBudW1iZXI7XG4gIGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzO1xufVxuXG4vLyBCdWlsZHMgdGhlIFBERiBjbGllbnQtc2lkZSB3aXRoIGpzcGRmLiBUaGUgcmVwb3J0J3MgdW5pdCBpcyBpbmNoZXMgYW5kIFBERnNcbi8vIGFyZSBwb2ludHMgYXQgZXhhY3RseSA3Mi9pbmNoLCBzbyBlYWNoIHJlcG9ydCBwYWdlIGJlY29tZXMgb25lIFBERiBwYWdlIG9mXG4vLyB0aGUgZXhhY3QgcGh5c2ljYWwgc2l6ZSBhbmQgY29tcG9uZW50cyBsYW5kIGF0IHRoZWlyIHByZWNpc2UgcG9zaXRpb25zLlxuLy8gQ2hhcnRzIGFyZSByZW5kZXJlZCB0aHJvdWdoIGFuIG9mZnNjcmVlbiBFQ2hhcnRzIGluc3RhbmNlIGF0IDPDlyBwaXhlbFxuLy8gcmF0aW8g4oCUIHBpeGVsLWlkZW50aWNhbCB0byB0aGUgc2NyZWVuLCBjcmlzcCBhdCBwcmludCBzaXplIOKAlCBhbmQgdGFibGVzIGFyZVxuLy8gZHJhd24gd2l0aCBqc3BkZi1hdXRvdGFibGUuIEJvdGggbGlicmFyaWVzIGxvYWQgbGF6aWx5IGludG8gdGhlaXIgb3duIGNodW5rcy5cbi8vXG4vLyBBIGxpc3QgdGFibGUgaXMgZml0dGVkIHRvIGl0cyBib3ggYnkgbGF5aW5nIGl0IG91dCBmaXJzdCwgbmV2ZXIgYnkgYVxuLy8gcm93LWhlaWdodCBlc3RpbWF0ZSwgc28gaXQgY2Fubm90IHNwaWxsIHBhc3QgdGhlIGJveC4gVGhlIHJvd3MgdGhhdCBkbyBub3Rcbi8vIGZpdCBjb250aW51ZSBvbiBwYWdlcyBvZiB0aGVpciBvd24gYWZ0ZXIgdGhlIHJlcG9ydCBwYWdlLCB1bmRlciB0aGUgc2FtZVxuLy8gaGVhZGVyL2Zvb3RlciBhbmQgd2l0aCB0aGUgc2FtZSBjb2x1bW4gd2lkdGhzLCB1cCB0byBQREZfTElTVF9ST1dTOyBhXG4vLyBsb25nZXIgcmVzdWx0IGVuZHMgaW4gYSByb3cgcG9pbnRpbmcgdG8gdGhlIGNvbXBvbmVudCdzIENTViBleHBvcnQuXG4vL1xuLy8gQSB0ZXh0IGJsb2NrJ3MgdGFibGVzIGFyZSBkcmF3biBieSBhdXRvVGFibGUgdG9vLCBmcm9tIHRoZSBsaW5lIGl0cyB3b3Jkc1xuLy8gcmVhY2gsIGluIHRoZSBjb2x1bW4gd2lkdGhzIHRoZSBjYW52YXMgZ2l2ZXMgdGhlbSAoUmVwb3J0VGV4dExheW91dFNlcnZpY2UpLlxuLy8gQSB0ZXh0IGJsb2NrIGlzIGN1dCBhdCB0aGUgYm90dG9tIG9mIGl0cyBib3gsIGFzIHRoZSBjYW52YXMgY2xpcHMgaXQsIGFuZFxuLy8gYnVpbGQoKSBoYW5kcyB0aGUgZmlsZSBiYWNrIHVuc2F2ZWQgd2l0aCB0aGUgYmxvY2tzIGl0IGN1dCwgc28gdGhlIGV4cG9ydFxuLy8gY2FuIGFzayBhYm91dCB0aGVtIGJlZm9yZSBpdCBzYXZlcy5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRQZGZTZXJ2aWNlIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF90ZXh0TGF5b3V0ID0gaW5qZWN0KFJlcG9ydFRleHRMYXlvdXRTZXJ2aWNlKTtcblxuICBwdWJsaWMgYXN5bmMgYnVpbGQoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpOiBQcm9taXNlPEJ1aWx0RXhwb3J0PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuX2NvbnRleHQoY29sbGVjdGVkKTtcblxuICAgIHRoaXMuX3RpdGxlUGFnZShjb250ZXh0LmRvYywgY29sbGVjdGVkLCBjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIKTtcblxuICAgIC8vIFRoZSBwaHlzaWNhbCBwYWdlIG51bWJlciB7e3BhZ2UubnVtYmVyfX0gcHJpbnRzOiByZXBvcnQgcGFnZXMgYW5kXG4gICAgLy8gdGhlaXIgY29udGludWF0aW9uIHBhZ2VzIGFsaWtlLCB0aGUgdGl0bGUgcGFnZSBub3QgY291bnRlZC5cbiAgICBsZXQgcGFnZU51bWJlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY29sbGVjdGVkUGFnZV0gb2YgY29sbGVjdGVkLnBhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10gPSBbXTtcbiAgICAgIHBhZ2VOdW1iZXIgKz0gMTtcblxuICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyUGFnZShjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLCBpbmRleCwgcGFnZU51bWJlciwgb3ZlcmZsb3dzKTtcblxuICAgICAgLy8gRWFjaCBjb250aW51YXRpb24gYXBwZW5kcyBpdHMgcGFnZXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIHNvXG4gICAgICAvLyB0d28gbGlzdHMgdGhhdCBvdmVyZmxvd2VkIG9uIG9uZSBwYWdlIGZvbGxvdyBpdCBiYWNrIHRvIGJhY2suXG4gICAgICBmb3IgKGNvbnN0IG92ZXJmbG93IG9mIG92ZXJmbG93cykge1xuICAgICAgICBwYWdlTnVtYmVyID0gYXdhaXQgdGhpcy5fcmVuZGVyQ29udGludWF0aW9uKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIsIG92ZXJmbG93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3ZlcmZsb3dzOiBbLi4uY29udGV4dC50ZXh0T3ZlcmZsb3dzLnZhbHVlcygpXSxcbiAgICAgIG92ZXJmbG93Tm90ZTogUERGX09WRVJGTE9XX05PVEUsXG4gICAgICBzYXZlOiAoKSA9PiB7XG4gICAgICAgIGNvbnRleHQuZG9jLnNhdmUoYCR7dGhpcy5fc2x1Zyhjb2xsZWN0ZWQucmVwb3J0Lm5hbWUpfS5wZGZgKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2NvbnRleHQoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpOiBQcm9taXNlPFBkZkV4cG9ydENvbnRleHQ+IHtcbiAgICBjb25zdCByZXBvcnQgPSBjb2xsZWN0ZWQucmVwb3J0O1xuICAgIGNvbnN0IHsganNQREYgfSA9IGF3YWl0IGltcG9ydCgnanNwZGYnKTtcbiAgICBjb25zdCBhdXRvVGFibGUgPSAoYXdhaXQgaW1wb3J0KCdqc3BkZi1hdXRvdGFibGUnKSkuZGVmYXVsdDtcblxuICAgIGNvbnN0IHBhZ2VXID0gcmVwb3J0LnBhZ2VXaWR0aCAqIFBUO1xuICAgIGNvbnN0IHBhZ2VIID0gcmVwb3J0LnBhZ2VIZWlnaHQgKiBQVDtcbiAgICBjb25zdCBvcmllbnRhdGlvbiA9IHBhZ2VXID49IHBhZ2VIID8gJ2xhbmRzY2FwZScgOiAncG9ydHJhaXQnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRvYzogbmV3IGpzUERGKHsgb3JpZW50YXRpb24sIHVuaXQ6ICdwdCcsIGZvcm1hdDogW3BhZ2VXLCBwYWdlSF0gfSksXG4gICAgICBhdXRvVGFibGUsXG4gICAgICBqc1BERixcbiAgICAgIHJlcG9ydCxcbiAgICAgIHRpbWV6b25lOiByZXNvbHZlUmVwb3J0VGltZXpvbmUocmVwb3J0KSxcbiAgICAgIGZvcm1hdENvbnRleHQ6IGNvbGxlY3RlZC5mb3JtYXRDb250ZXh0LFxuICAgICAgcGFnZVcsXG4gICAgICBwYWdlSCxcbiAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgbWFzdGVyVmFsdWVzOiB0aGlzLl9wZGZWYWx1ZXMoY29sbGVjdGVkLm1hc3RlclZhbHVlcyksXG4gICAgICB0ZXh0T3ZlcmZsb3dzOiBuZXcgTWFwKCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIE9uZSByZXBvcnQgcGFnZTogdGhlIGhlYWRlciBhbmQgZm9vdGVyIGZpcnN0LCB1bmRlciB0aGUgcGFnZSdzIG93blxuICAvLyBjb21wb25lbnRzLiBBIGxpc3QgdGhhdCBvdXRncm93cyBpdHMgYm94IGxlYXZlcyBpdHMgcmVtYWluaW5nIHJvd3MgaW5cbiAgLy8gb3ZlcmZsb3dzLiBUaGUgcGFnZSdzIHRleHQgZmlsbHMgaXRzIHZhbHVlIHRva2VucyB3aXRoIHRoZSBwYWdlJ3MgdmFsdWVzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJQYWdlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29sbGVjdGVkUGFnZTogQ29sbGVjdGVkUGFnZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MsIHJlcG9ydCB9ID0gY29udGV4dDtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLl90b2tlbnMocmVwb3J0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyKTtcbiAgICBjb25zdCBwYWdlVG9rZW5zID0geyAuLi50b2tlbnMsIHZhbHVlczogdGhpcy5fcGRmVmFsdWVzKGNvbGxlY3RlZFBhZ2UudmFsdWVzKSB9O1xuXG4gICAgZG9jLmFkZFBhZ2UoW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLCBjb250ZXh0Lm9yaWVudGF0aW9uKTtcbiAgICBhd2FpdCB0aGlzLl9yZW5kZXJNYXN0ZXIoY29udGV4dCwgY29sbGVjdGVkUGFnZS5wYWdlLCB0b2tlbnMpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbGxlY3RlZFBhZ2UuY29tcG9uZW50cykge1xuICAgICAgaWYgKGl0ZW0uY29tcG9uZW50LnR5cGUgIT09ICd0ZXh0Jykge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZW5kZXJDb21wb25lbnQoY29udGV4dCwgaXRlbSwgb3ZlcmZsb3dzKTtcbiAgICAgIH0gZWxzZSBpZiAoYXdhaXQgdGhpcy5fcmVuZGVyVGV4dChjb250ZXh0LCBpdGVtLmNvbXBvbmVudCwgcGFnZVRva2VucykpIHtcbiAgICAgICAgdGhpcy5fcmVjb3JkT3ZlcmZsb3coY29udGV4dCwgaXRlbS5jb21wb25lbnQsIHRva2Vucy5wYWdlTmFtZSwgcGFnZVRva2Vucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGhlYWRlciBhbmQgZm9vdGVyLCB0aGVpciB2YWx1ZSB0b2tlbnMgZmlsbGVkIHdpdGggdGhlIG1hc3RlcidzIHZhbHVlc1xuICAvLyB3aGljaGV2ZXIgcGFnZSB0aGV5IHNpdCBvbjogYSByZXBvcnQgcGFnZSBvciBhIGNvbnRpbnVhdGlvbiBwYWdlLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJNYXN0ZXIoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgcGFnZTogUmVwb3J0UGFnZSwgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHBhZ2UubWFzdGVySGlkZGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWFzdGVyVG9rZW5zID0geyAuLi50b2tlbnMsIHZhbHVlczogY29udGV4dC5tYXN0ZXJWYWx1ZXMgfTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIChjb250ZXh0LnJlcG9ydC5tYXN0ZXI/LmNvbXBvbmVudHMgPz8gW10pLmZpbHRlcihpc0RyYXduKSkge1xuICAgICAgaWYgKGF3YWl0IHRoaXMuX3JlbmRlclRleHQoY29udGV4dCwgY29tcG9uZW50LCBtYXN0ZXJUb2tlbnMpKSB7XG4gICAgICAgIHRoaXMuX3JlY29yZE92ZXJmbG93KGNvbnRleHQsIGNvbXBvbmVudCwgSEVBREVSX0ZPT1RFUl9OQU1FLCBtYXN0ZXJUb2tlbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIExpc3RzIGEgdGV4dCBibG9jayB0aGF0IHdhcyBjdXQsIHVuZGVyIHRoZSBwYWdlIHRoZSBleHBvcnQncyBvdmVyZmxvdyBnYXRlXG4gIC8vIG5hbWVzIGl0IGJ5LiBBIGJsb2NrIGN1dCBhZ2FpbiBvbiBhIGxhdGVyIHBhZ2UgKGEgaGVhZGVyIG9yIGZvb3Rlcikga2VlcHNcbiAgLy8gdGhlIGZpcnN0IGVudHJ5LlxuICBwcml2YXRlIF9yZWNvcmRPdmVyZmxvdyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIHBhZ2U6IHN0cmluZyxcbiAgICB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQsXG4gICk6IHZvaWQge1xuICAgIGlmICghY29udGV4dC50ZXh0T3ZlcmZsb3dzLmhhcyhjb21wb25lbnQuaWQpKSB7XG4gICAgICBjb250ZXh0LnRleHRPdmVyZmxvd3Muc2V0KGNvbXBvbmVudC5pZCwgdGV4dE92ZXJmbG93KGNvbXBvbmVudCwgcGFnZSwgdG9rZW5zKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdGl0bGVQYWdlKGRvYzogYW55LCBjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCwgcGFnZVc6IG51bWJlciwgcGFnZUg6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyOCk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KGNvbGxlY3RlZC5yZXBvcnQubmFtZSwgNDAsIHBhZ2VIICogMC4zNSk7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgxMSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzUyNjA2ZCcpO1xuXG4gICAgZG9jLnRleHQoY292ZXJMaW5lcyhjb2xsZWN0ZWQpLm1hcCgobGluZSkgPT4gdGhpcy5fcGRmVGV4dChsaW5lKSksIDQwLCBwYWdlSCAqIDAuMzUgKyAyNik7XG4gIH1cblxuICAvLyBBIHRleHQgYmxvY2ssIGxhaWQgb3V0IGJ5IGhhbmQ6IGpzUERGIGRyYXdzIHN0cmluZ3MsIG5vdCByaWNoIHRleHQsIHNvIHRoZVxuICAvLyB3b3JkcyBiZXR3ZWVuIGl0cyB0YWJsZXMgYXJlIGRyYXduIGxpbmUgYnkgbGluZSAoX2RyYXdQYXJhZ3JhcGhzKSBhbmQgZWFjaFxuICAvLyB0YWJsZSBieSBhdXRvVGFibGUgZnJvbSB0aGUgbGluZSB0aGUgd29yZHMgYWJvdmUgaXQgcmVhY2hcbiAgLy8gKF9kcmF3VGV4dFRhYmxlKS4gT25seSBhIGJsb2NrIHdpdGggYSB0YWJsZSBpcyBtZWFzdXJlZCwgZm9yIHRoZSBlZGdlc1xuICAvLyBhbmQgY29sdW1uIHdpZHRocyB0aGUgY2FudmFzIGdpdmVzIGl0cyB0YWJsZXMuIFdoYXRldmVyIHJ1bnMgcGFzdFxuICAvLyB0aGUgYmxvY2sncyBoZWlnaHQgaXMgbGVmdCBvZmYg4oCUIHRoZSBjYW52YXMgY2xpcHMgdGhlIGJsb2NrIHRoZXJlIHRvby5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIGFueXRoaW5nIHdhcy5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyVGV4dChcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIHRva2VuczogVGV4dFRva2VuQ29udGV4dCxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYm94ID0gdGhpcy5fdGV4dEJveChjb21wb25lbnQpO1xuICAgIGNvbnN0IGJsb2NrcyA9IHRleHRCbG9ja3MoY29tcG9uZW50LmNvbmZpZz8uaHRtbCA/PyAnJywgdG9rZW5zKTtcbiAgICBjb25zdCBsYXlvdXQgPSBibG9ja3Muc29tZSgoYmxvY2spID0+IGJsb2NrLmtpbmQgPT09ICd0YWJsZScpXG4gICAgICA/IGF3YWl0IHRoaXMuX3RleHRMYXlvdXQubWVhc3VyZShjb21wb25lbnQsIHRva2VucylcbiAgICAgIDogbnVsbDtcbiAgICBsZXQgY3Vyc29yWSA9IGJveC50b3A7XG4gICAgbGV0IHRhYmxlSW5kZXggPSAwO1xuICAgIC8vIFRoZSBjdXJzb3Igc2l0cyBvbiBhIHRhYmxlJ3MgYm90dG9tIG1hcmdpbiwgbm90aGluZyBkcmF3biBzaW5jZTogdGhlXG4gICAgLy8gbmV4dCB0YWJsZSdzIHRvcCBtYXJnaW4gaXMgdGhlIHNhbWUgc3BhY2UsIGFzIHR3byBibG9jayBtYXJnaW5zIHRoYXRcbiAgICAvLyBtZWV0IGNvbGxhcHNlIGludG8gb25lIG9uIHRoZSBjYW52YXMuXG4gICAgbGV0IG9uTWFyZ2luID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIGJsb2Nrcykge1xuICAgICAgY29uc3QgZHJhd24gPSBibG9jay5raW5kID09PSAndGV4dCdcbiAgICAgICAgPyB0aGlzLl9kcmF3UGFyYWdyYXBocyhjb250ZXh0LmRvYywgYmxvY2sucGFyYWdyYXBocywgYm94LCBjdXJzb3JZKVxuICAgICAgICA6IHRoaXMuX2RyYXdUZXh0VGFibGUoXG4gICAgICAgICAgY29udGV4dCwgYmxvY2sudGFibGUsIGxheW91dD8udGFibGVzW3RhYmxlSW5kZXgrK10gPz8gbnVsbCwgYm94LFxuICAgICAgICAgIG9uTWFyZ2luID8gY3Vyc29yWSA6IGN1cnNvclkgKyBURVhUX1RBQkxFX01BUkdJTixcbiAgICAgICAgKTtcblxuICAgICAgaWYgKGRyYXduLmN1dCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY3Vyc29yWSA9IGRyYXduLmN1cnNvclk7XG4gICAgICBvbk1hcmdpbiA9IGJsb2NrLmtpbmQgPT09ICd0YWJsZScgfHwgKG9uTWFyZ2luICYmICFibG9jay5wYXJhZ3JhcGhzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gV2hlcmUgYSB0ZXh0IGJsb2NrJ3Mgd29yZHMgZ286IGluc2lkZSBpdHMgcGFkZGluZywgZWFjaCBlZGdlIDEvOFwiIHVubGVzc1xuICAvLyBzZXQuXG4gIHByaXZhdGUgX3RleHRCb3goY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBQZGZUZXh0Qm94IHtcbiAgICBjb25zdCBwYWRkaW5nID0gY29tcG9uZW50LmNvbmZpZz8ucGFkZGluZztcbiAgICBjb25zdCBpbnNldCA9ICh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiAodmFsdWUgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORykgKiBQVDtcblxuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiBjb21wb25lbnQueCAqIFBUICsgaW5zZXQocGFkZGluZz8ubGVmdCksXG4gICAgICB0b3A6IGNvbXBvbmVudC55ICogUFQgKyBpbnNldChwYWRkaW5nPy50b3ApLFxuICAgICAgd2lkdGg6IGNvbXBvbmVudC53ICogUFQgLSBpbnNldChwYWRkaW5nPy5sZWZ0KSAtIGluc2V0KHBhZGRpbmc/LnJpZ2h0KSxcbiAgICAgIGJvdHRvbTogKGNvbXBvbmVudC55ICsgY29tcG9uZW50LmgpICogUFQgLSBpbnNldChwYWRkaW5nPy5ib3R0b20pLFxuICAgIH07XG4gIH1cblxuICAvLyBQYXJhZ3JhcGhzIGRyYXduIGxpbmUgYnkgbGluZSBmcm9tIGN1cnNvclkgZG93bjogZWFjaCBvbmUncyBydW5zIGFyZSBicm9rZW5cbiAgLy8gaW50byB3b3Jkcywgd3JhcHBlZCB0byB0aGUgYm94J3Mgd2lkdGggYW5kIGRyYXduIHdvcmQgYnkgd29yZCBpbiB0aGVpciBvd25cbiAgLy8gZm9udCwgc2l6ZSBhbmQgY29sb3IsIGEgbGlzdCBpdGVtJ3MgbWFya2VyIGh1bmcgaW4gaXRzIGluZGVudC4gVGhlIGZpcnN0XG4gIC8vIGxpbmUgdGhhdCB3b3VsZCBydW4gcGFzdCB0aGUgYm94J3MgYm90dG9tIGVuZHMgdGhlIGRyYXdpbmcsIGN1dC5cbiAgcHJpdmF0ZSBfZHJhd1BhcmFncmFwaHMoZG9jOiBhbnksIHBhcmFncmFwaHM6IFRleHRQYXJhZ3JhcGhbXSwgYm94OiBQZGZUZXh0Qm94LCBjdXJzb3JZOiBudW1iZXIpOiBQZGZUZXh0Q3Vyc29yIHtcbiAgICBsZXQgeSA9IGN1cnNvclk7XG4gICAgbGV0IGxpc3ROdW1iZXIgPSAwO1xuXG4gICAgZm9yIChjb25zdCBwYXJhZ3JhcGggb2YgcGFyYWdyYXBocykge1xuICAgICAgbGlzdE51bWJlciA9IHBhcmFncmFwaC5idWxsZXQgPT09ICdudW1iZXInID8gbGlzdE51bWJlciArIDEgOiAwO1xuICAgICAgY29uc3QgaW5kZW50ID0gcGFyYWdyYXBoLmJ1bGxldCA/IExJU1RfSU5ERU5UIDogMDtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fd3JhcChkb2MsIHBhcmFncmFwaCwgYm94LndpZHRoIC0gaW5kZW50KTtcblxuICAgICAgZm9yIChjb25zdCBbbGluZUluZGV4LCBsaW5lXSBvZiBsaW5lcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuX2xpbmVTaXplKHBhcmFncmFwaCwgbGluZSk7XG4gICAgICAgIGlmICh5ICsgc2l6ZSAqIFRFWFRfTElORV9IRUlHSFQgPiBib3guYm90dG9tICsgMC41KSB7XG4gICAgICAgICAgcmV0dXJuIHsgY3Vyc29yWTogeSwgY3V0OiB0cnVlIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZUluZGV4ID09PSAwICYmIHBhcmFncmFwaC5idWxsZXQpIHtcbiAgICAgICAgICB0aGlzLl9mb250KGRvYywgbGluZVswXT8ucnVuID8/IHsgdGV4dDogJycgfSwgc2l6ZSk7XG4gICAgICAgICAgZG9jLnRleHQocGFyYWdyYXBoLmJ1bGxldCA9PT0gJ251bWJlcicgPyBgJHtsaXN0TnVtYmVyfS5gIDogJ+KAoicsIGJveC5sZWZ0LCB5ICsgc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kcmF3TGluZShkb2MsIGxpbmUsIHBhcmFncmFwaC5hbGlnbiwgYm94LmxlZnQgKyBpbmRlbnQsIGJveC53aWR0aCAtIGluZGVudCwgeSArIHNpemUpO1xuICAgICAgICB5ICs9IHNpemUgKiBURVhUX0xJTkVfSEVJR0hUO1xuICAgICAgfVxuXG4gICAgICAvLyBBbiBlbXB0eSBwYXJhZ3JhcGggaXMgc3RpbGwgYSBsaW5lLlxuICAgICAgaWYgKCFsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgeSArPSBERUZBVUxUX1RFWFRfU0laRSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY3Vyc29yWTogeSwgY3V0OiBmYWxzZSB9O1xuICB9XG5cbiAgLy8gSG93IGZhciBfZHJhd1BhcmFncmFwaHMgdGFrZXMgaXRzIGN1cnNvciBkb3duIGRyYXdpbmcgdGhlIHBhcmFncmFwaHMgd2hvbGVcbiAgLy8gYXQgYSB3aWR0aC5cbiAgcHJpdmF0ZSBfcGFyYWdyYXBoc0hlaWdodChkb2M6IGFueSwgcGFyYWdyYXBoczogVGV4dFBhcmFncmFwaFtdLCB3aWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcGFyYWdyYXBocy5yZWR1Y2UoKGhlaWdodCwgcGFyYWdyYXBoKSA9PiB7XG4gICAgICBjb25zdCBsaW5lcyA9IHRoaXMuX3dyYXAoZG9jLCBwYXJhZ3JhcGgsIHdpZHRoIC0gKHBhcmFncmFwaC5idWxsZXQgPyBMSVNUX0lOREVOVCA6IDApKTtcblxuICAgICAgcmV0dXJuIGhlaWdodCArIChsaW5lcy5sZW5ndGhcbiAgICAgICAgPyBsaW5lcy5yZWR1Y2UoKHN1bSwgbGluZSkgPT4gc3VtICsgdGhpcy5fbGluZVNpemUocGFyYWdyYXBoLCBsaW5lKSAqIFRFWFRfTElORV9IRUlHSFQsIDApXG4gICAgICAgIDogREVGQVVMVF9URVhUX1NJWkUgKiBURVhUX0xJTkVfSEVJR0hUKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIEEgbGluZSdzIGZvbnQgc2l6ZTogaXRzIGxhcmdlc3Qgd29yZCdzLCBhbmQgbmV2ZXIgdW5kZXIgaXRzIHBhcmFncmFwaCdzXG4gIC8vIGZpcnN0IHJ1bidzLlxuICBwcml2YXRlIF9saW5lU2l6ZShwYXJhZ3JhcGg6IFRleHRQYXJhZ3JhcGgsIGxpbmU6IFBkZldvcmRbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLmxpbmUubWFwKCh3b3JkKSA9PiB3b3JkLnNpemUpLCBwYXJhZ3JhcGgucnVuc1swXT8uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkUpO1xuICB9XG5cbiAgLy8gT25lIHdyYXBwZWQgbGluZSBvbiBpdHMgYmFzZWxpbmUsIGFsaWduZWQgd2l0aGluIHRoZSB3aWR0aCBmcm9tIGxlZnQuXG4gIHByaXZhdGUgX2RyYXdMaW5lKFxuICAgIGRvYzogYW55LFxuICAgIGxpbmU6IFBkZldvcmRbXSxcbiAgICBhbGlnbjogVGV4dFBhcmFncmFwaFsnYWxpZ24nXSxcbiAgICBsZWZ0OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGJhc2VsaW5lOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGxpbmVXaWR0aCA9IGxpbmUucmVkdWNlKChzdW0sIHdvcmQpID0+IHN1bSArIHdvcmQud2lkdGgsIDApO1xuICAgIGxldCB4ID0gbGVmdCArIHRoaXMuX2FsaWduT2Zmc2V0KGFsaWduLCB3aWR0aCwgbGluZVdpZHRoKTtcblxuICAgIGZvciAoY29uc3Qgd29yZCBvZiBsaW5lKSB7XG4gICAgICB0aGlzLl9kcmF3V29yZChkb2MsIHdvcmQsIHgsIGJhc2VsaW5lKTtcbiAgICAgIHggKz0gd29yZC53aWR0aDtcbiAgICB9XG4gIH1cblxuICAvLyBBIHRhYmxlIGluIGEgdGV4dCBibG9jaywgZHJhd24gYnkgYXV0b1RhYmxlIGZyb20gdG9wIChfcmVuZGVyVGV4dCBwdXRzIGl0XG4gIC8vIFRFWFRfVEFCTEVfTUFSR0lOIHVuZGVyIHRoZSBsaW5lIHRoZSB3b3JkcyBhYm92ZSBpdCByZWFjaCksIGluIHRoZSBvbmVcbiAgLy8gbG9vayBldmVyeSByZW5kZXJlciBkcmF3cyAoVEVYVF9UQUJMRV8qIGluIHRleHQudHMpLiBJdHMgbGVmdCBlZGdlLCB3aWR0aFxuICAvLyBhbmQgY29sdW1uIHdpZHRocyBhcmUgdGhlIGNhbnZhcydzIChsYXlvdXQpLCBlbHNlIHRoZSBib3gncyB3aWR0aCBzcGxpdFxuICAvLyBldmVubHkuIEEgcm93IGlzIGFzIHRhbGwgYXMgaXRzIGNlbGxzJyB3b3JkcyB3cmFwcGVkIGFzIF9kcmF3UGFyYWdyYXBoc1xuICAvLyB3cmFwcyB0aGVtLCBhbmQgdGhlIHdvcmRzIGFyZSBkcmF3biBpbnRvIGVhY2ggY2VsbCBvbmNlIGF1dG9UYWJsZSBoYXNcbiAgLy8gZHJhd24gaXRzIGdyaWQgbGluZXMgYW5kIGZpbGwgKF9kcmF3VGV4dENlbGwpLCBzbyB0aGV5IGtlZXAgdGhlaXIgcnVucydcbiAgLy8gZm9udHMgYW5kIGNvbG9ycy4gT25seSB0aGUgcm93cyB0aGUgYm94IGhvbGRzIGFyZSBkcmF3biwgYW5kIGEgdGFibGUgdGhhdFxuICAvLyBsb3NlcyBhbnkgaXMgY3V0LiBUaGUgY3Vyc29yIGl0IGxlYXZlcyBpcyBURVhUX1RBQkxFX01BUkdJTiB1bmRlciBpdC5cbiAgcHJpdmF0ZSBfZHJhd1RleHRUYWJsZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHRhYmxlOiBUZXh0VGFibGUsXG4gICAgbGF5b3V0OiBUZXh0VGFibGVMYXlvdXQgfCBudWxsLFxuICAgIGJveDogUGRmVGV4dEJveCxcbiAgICB0b3A6IG51bWJlcixcbiAgKTogUGRmVGV4dEN1cnNvciB7XG4gICAgaWYgKHRvcCA+PSBib3guYm90dG9tKSB7XG4gICAgICByZXR1cm4geyBjdXJzb3JZOiB0b3AsIGN1dDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxlZnQgPSBib3gubGVmdCArIChsYXlvdXQ/LmxlZnQgPz8gMCkgKiBQVDtcbiAgICBjb25zdCB3aWR0aCA9IGxheW91dCA/IGxheW91dC53aWR0aCAqIFBUIDogYm94LndpZHRoO1xuICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IGxheW91dD8uY29sdW1uV2lkdGhzLmxlbmd0aCA9PT0gdGFibGUuY29sdW1uc1xuICAgICAgPyBsYXlvdXQuY29sdW1uV2lkdGhzLm1hcCgoY29sdW1uV2lkdGgpID0+IGNvbHVtbldpZHRoICogUFQpXG4gICAgICA6IEFycmF5LmZyb20oeyBsZW5ndGg6IHRhYmxlLmNvbHVtbnMgfSwgKCkgPT4gd2lkdGggLyB0YWJsZS5jb2x1bW5zKTtcbiAgICBjb25zdCBib2R5ID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93LmNlbGxzLm1hcCgoY2VsbCkgPT4gdGhpcy5fdGV4dENlbGxJbnB1dChjb250ZXh0LmRvYywgY2VsbCwgY29sdW1uV2lkdGhzKSkpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl90ZXh0VGFibGVPcHRpb25zKGNvbnRleHQsIGNvbHVtbldpZHRocywgbGVmdCwgdG9wLCB3aWR0aCwgYm94LmJvdHRvbSk7XG4gICAgY29uc3QgZml0ID0gdGhpcy5fdGV4dFRhYmxlRml0KGNvbnRleHQsIHsgLi4ub3B0aW9ucywgYm9keSB9KTtcblxuICAgIGlmIChmaXQpIHtcbiAgICAgIHRoaXMuX2RyYXdUYWJsZShjb250ZXh0LCB7IC4uLm9wdGlvbnMsIGJvZHk6IHRoaXMuX2tlcHRSb3dzKGJvZHksIGZpdCkgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnNvclk6IGZpdCA/IGNvbnRleHQuZG9jLmxhc3RBdXRvVGFibGUuZmluYWxZICsgVEVYVF9UQUJMRV9NQVJHSU4gOiB0b3AsXG4gICAgICBjdXQ6IGZpdCA8IHRhYmxlLnJvd3MubGVuZ3RoLFxuICAgIH07XG4gIH1cblxuICAvLyBBIHRleHQgdGFibGUncyBjZWxsIGFzIGF1dG9UYWJsZSB0YWtlcyBpdDogaXRzIHNwYW5zIGFuZCBmaWxsIGFuZCwgd2hlbiBpdFxuICAvLyBpcyBvbmUgcm93IHRhbGwsIHRoZSBoZWlnaHQgaXRzIHdvcmRzIG5lZWQgYXQgdGhlIHdpZHRoIGl0IHNwYW5zLiBBIGNlbGxcbiAgLy8gdGhhdCBzcGFucyByb3dzIHNoYXJlcyB0aGVpcnMuXG4gIHByaXZhdGUgX3RleHRDZWxsSW5wdXQoZG9jOiBhbnksIGNlbGw6IFRleHRUYWJsZUNlbGwsIGNvbHVtbldpZHRoczogbnVtYmVyW10pOiBQZGZUZXh0Q2VsbElucHV0IHtcbiAgICBjb25zdCBwYWRkaW5nID0gVEVYVF9UQUJMRV9DRUxMX1BBRERJTkc7XG4gICAgY29uc3Qgd2lkdGggPSBjb2x1bW5XaWR0aHNcbiAgICAgIC5zbGljZShjZWxsLmNvbHVtbiwgY2VsbC5jb2x1bW4gKyBjZWxsLmNvbFNwYW4pXG4gICAgICAucmVkdWNlKChzdW0sIGNvbHVtbldpZHRoKSA9PiBzdW0gKyBjb2x1bW5XaWR0aCwgMCkgLSAyICogcGFkZGluZy5ob3Jpem9udGFsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6ICcnLFxuICAgICAgY29sU3BhbjogY2VsbC5jb2xTcGFuLFxuICAgICAgcm93U3BhbjogY2VsbC5yb3dTcGFuLFxuICAgICAgdGV4dENlbGw6IGNlbGwsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgLi4uKGNlbGwuZmlsbCA/IHsgZmlsbENvbG9yOiBjZWxsLmZpbGwgfSA6IHt9KSxcbiAgICAgICAgLi4uKGNlbGwucm93U3BhbiA9PT0gMVxuICAgICAgICAgID8geyBtaW5DZWxsSGVpZ2h0OiB0aGlzLl9wYXJhZ3JhcGhzSGVpZ2h0KGRvYywgY2VsbC5wYXJhZ3JhcGhzLCB3aWR0aCkgKyAyICogcGFkZGluZy52ZXJ0aWNhbCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgYXV0b1RhYmxlIG9wdGlvbnMgYSB0ZXh0IHRhYmxlJ3MgZHJ5IHJ1biBhbmQgaXRzIGRyYXcgc2hhcmUuIEV2ZXJ5XG4gIC8vIGNvbHVtbiBpcyBsaXN0ZWQgYW5kIGZpeGVkIGF0IGl0cyB3aWR0aDogYXV0b1RhYmxlIHdvdWxkIG90aGVyd2lzZSBjb3VudFxuICAvLyB0aGUgY29sdW1ucyBvZiB0aGUgZmlyc3Qgcm93LCB3aGljaCBtYXkgYmUgbmFycm93ZXIgdGhhbiB0aGUgZ3JpZC4gQSByb3dcbiAgLy8gaXMgbmV2ZXIgc3BsaXQgYXQgdGhlIGJveCdzIGJvdHRvbTogaXQgZml0cyB3aG9sZSBvciBtb3ZlcyBwYXN0IGl0LiBib3R0b21cbiAgLy8gaXMgdGhlIGJveCdzLlxuICBwcml2YXRlIF90ZXh0VGFibGVPcHRpb25zKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29sdW1uV2lkdGhzOiBudW1iZXJbXSxcbiAgICBsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBib3R0b206IG51bWJlcixcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBURVhUX1RBQkxFX0NFTExfUEFERElORztcblxuICAgIHJldHVybiB7XG4gICAgICB0aGVtZTogJ3BsYWluJyxcbiAgICAgIGNvbHVtbnM6IGNvbHVtbldpZHRocy5tYXAoKF8sIGluZGV4KSA9PiAoeyBkYXRhS2V5OiBpbmRleCB9KSksXG4gICAgICBzdGFydFk6IHRvcCxcbiAgICAgIG1hcmdpbjogeyBsZWZ0LCByaWdodDogY29udGV4dC5wYWdlVyAtIGxlZnQgLSB3aWR0aCwgYm90dG9tOiBjb250ZXh0LnBhZ2VIIC0gYm90dG9tIH0sXG4gICAgICB0YWJsZVdpZHRoOiB3aWR0aCxcbiAgICAgIGNvbHVtblN0eWxlczogT2JqZWN0LmZyb21FbnRyaWVzKGNvbHVtbldpZHRocy5tYXAoKGNlbGxXaWR0aCwgaW5kZXgpID0+IFtpbmRleCwgeyBjZWxsV2lkdGggfV0pKSxcbiAgICAgIHJvd1BhZ2VCcmVhazogJ2F2b2lkJyxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBmb250OiAnaGVsdmV0aWNhJyxcbiAgICAgICAgZm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgZm9udFNpemU6IERFRkFVTFRfVEVYVF9TSVpFLFxuICAgICAgICBjZWxsUGFkZGluZzoge1xuICAgICAgICAgIHRvcDogcGFkZGluZy52ZXJ0aWNhbCwgcmlnaHQ6IHBhZGRpbmcuaG9yaXpvbnRhbCwgYm90dG9tOiBwYWRkaW5nLnZlcnRpY2FsLCBsZWZ0OiBwYWRkaW5nLmhvcml6b250YWwsXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmVDb2xvcjogVEVYVF9UQUJMRV9CT1JERVJfQ09MT1IsXG4gICAgICAgIGxpbmVXaWR0aDogVEVYVF9UQUJMRV9CT1JERVJfV0lEVEgsXG4gICAgICAgIHZhbGlnbjogJ21pZGRsZScsXG4gICAgICAgIHRleHRDb2xvcjogREVGQVVMVF9URVhUX0NPTE9SLFxuICAgICAgfSxcbiAgICAgIGRpZERyYXdDZWxsOiAoaG9vazogYW55KSA9PiB0aGlzLl9kcmF3VGV4dENlbGwoaG9vayksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEhvdyBtYW55IG9mIGEgdGV4dCB0YWJsZSdzIHJvd3MgaXRzIGJveCBob2xkczogdGhlIHJvd3MgYXV0b1RhYmxlIGRyYXdzXG4gIC8vIHdob2xlIG9uIHRoZSBmaXJzdCBwYWdlIHdoZW4gaXQgbGF5cyB0aGUgdGFibGUgb3V0IG9uIGEgc2NyYXRjaCBkb2N1bWVudFxuICAvLyBvZiB0aGUgc2FtZSBwYWdlIHNpemUsIGFzIF9tZWFzdXJlIGRvZXMgZm9yIGEgbGlzdC4gQSByb3cgdGFsbGVyIHRoYW4gYVxuICAvLyBwYWdlIGlzIHNwbGl0IGFjcm9zcyBwYWdlcyByYXRoZXIgdGhhbiBtb3ZlZCwgc28gaXQgZG9lcyBub3QgY291bnQuXG4gIHByaXZhdGUgX3RleHRUYWJsZUZpdChjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG51bWJlciB7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuX3NjcmF0Y2hEb2N1bWVudChjb250ZXh0KTtcbiAgICBsZXQgZml0ID0gMDtcblxuICAgIGNvbnRleHQuYXV0b1RhYmxlKHNjcmF0Y2gsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkaWREcmF3Q2VsbDogKGhvb2s6IGFueSkgPT4ge1xuICAgICAgICBpZiAoc2NyYXRjaC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyID09PSAxICYmICFob29rLnJvdy5zcGFuc011bHRpcGxlUGFnZXMpIHtcbiAgICAgICAgICBmaXQgPSBNYXRoLm1heChmaXQsIGhvb2sucm93LmluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZml0O1xuICB9XG5cbiAgLy8gVGhlIGZpcnN0IGBmaXRgIHJvd3MsIGEgY2VsbCB0aGF0IHNwYW5zIGRvd24gcGFzdCB0aGUgbGFzdCBvZiB0aGVtIGN1dFxuICAvLyB0aGVyZS5cbiAgcHJpdmF0ZSBfa2VwdFJvd3MoYm9keTogUGRmVGV4dENlbGxJbnB1dFtdW10sIGZpdDogbnVtYmVyKTogUGRmVGV4dENlbGxJbnB1dFtdW10ge1xuICAgIHJldHVybiBib2R5LnNsaWNlKDAsIGZpdCkubWFwKChyb3cpID0+IHJvdy5tYXAoKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCByb3dTcGFuID0gTWF0aC5taW4oaW5wdXQucm93U3BhbiwgZml0IC0gaW5wdXQudGV4dENlbGwucm93KTtcblxuICAgICAgcmV0dXJuIHJvd1NwYW4gPT09IGlucHV0LnJvd1NwYW4gPyBpbnB1dCA6IHsgLi4uaW5wdXQsIHJvd1NwYW4gfTtcbiAgICB9KSk7XG4gIH1cblxuICAvLyBBIHRleHQgdGFibGUgY2VsbCdzIHdvcmRzLCBkcmF3biBvbmNlIGF1dG9UYWJsZSBoYXMgZHJhd24gdGhlIGNlbGw6IGluc2lkZVxuICAvLyBpdHMgcGFkZGluZywgd3JhcHBlZCB0byBpdHMgd2lkdGggYW5kIHBsYWNlZCBieSBpdHMgdmVydGljYWwgYWxpZ25tZW50LCB0aGVcbiAgLy8gbWlkZGxlIHVubGVzcyBzZXQuIExpbmVzIHBhc3QgdGhlIGNlbGwgYXJlIGxlZnQgb2ZmLlxuICBwcml2YXRlIF9kcmF3VGV4dENlbGwoaG9vazogYW55KTogdm9pZCB7XG4gICAgY29uc3QgY2VsbDogVGV4dFRhYmxlQ2VsbCB8IHVuZGVmaW5lZCA9IGhvb2suY2VsbC5yYXc/LnRleHRDZWxsO1xuICAgIGlmICghY2VsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gaG9vay5jZWxsO1xuICAgIGNvbnN0IGJveDogUGRmVGV4dEJveCA9IHtcbiAgICAgIGxlZnQ6IHggKyBob29rLmNlbGwucGFkZGluZygnbGVmdCcpLFxuICAgICAgdG9wOiB5ICsgaG9vay5jZWxsLnBhZGRpbmcoJ3RvcCcpLFxuICAgICAgd2lkdGg6IHdpZHRoIC0gaG9vay5jZWxsLnBhZGRpbmcoJ2hvcml6b250YWwnKSxcbiAgICAgIGJvdHRvbTogeSArIGhlaWdodCAtIGhvb2suY2VsbC5wYWRkaW5nKCdib3R0b20nKSxcbiAgICB9O1xuICAgIGNvbnN0IHNwYXJlID0gTWF0aC5tYXgoMCwgYm94LmJvdHRvbSAtIGJveC50b3AgLSB0aGlzLl9wYXJhZ3JhcGhzSGVpZ2h0KGhvb2suZG9jLCBjZWxsLnBhcmFncmFwaHMsIGJveC53aWR0aCkpO1xuICAgIGNvbnN0IG9mZnNldCA9IGNlbGwudmFsaWduID09PSAndG9wJyA/IDAgOiAoY2VsbC52YWxpZ24gPT09ICdib3R0b20nID8gc3BhcmUgOiBzcGFyZSAvIDIpO1xuXG4gICAgdGhpcy5fZHJhd1BhcmFncmFwaHMoaG9vay5kb2MsIGNlbGwucGFyYWdyYXBocywgYm94LCBib3gudG9wICsgb2Zmc2V0KTtcbiAgfVxuXG4gIC8vIEJyZWFrIGEgcGFyYWdyYXBoJ3MgcnVucyBpbnRvIGxpbmVzIG9mIG1lYXN1cmVkIHdvcmRzIHRoYXQgZml0IHRoZSB3aWR0aC5cbiAgLy8gQSB3b3JkIGtlZXBzIGl0cyB0cmFpbGluZyBzcGFjZSBzbyBzcGFjaW5nIHN1cnZpdmVzIHJ1biBib3VuZGFyaWVzLiBBXG4gIC8vIG5vLWJyZWFrIHNwYWNlIGlzIHBhcnQgb2YgaXRzIHdvcmQsIG5ldmVyIGEgYnJlYWsgYmV0d2VlbiB0d286IGEgbnVtYmVyXG4gIC8vIGdyb3VwZWQgd2l0aCBvbmUgKGZyLUNBJ3MgdGhvdXNhbmRzLCBvciBhIG5hcnJvdyBzcGFjZSBfcGRmVGV4dCB0dXJuZWRcbiAgLy8gaW50byBvbmUpIHN0YXlzIG9uIG9uZSBsaW5lLlxuICBwcml2YXRlIF93cmFwKGRvYzogYW55LCBwYXJhZ3JhcGg6IFRleHRQYXJhZ3JhcGgsIHdpZHRoOiBudW1iZXIpOiBQZGZXb3JkW11bXSB7XG4gICAgY29uc3QgbGluZXM6IFBkZldvcmRbXVtdID0gW107XG4gICAgbGV0IGxpbmU6IFBkZldvcmRbXSA9IFtdO1xuICAgIGxldCBsaW5lV2lkdGggPSAwO1xuXG4gICAgZm9yIChjb25zdCBydW4gb2YgcGFyYWdyYXBoLnJ1bnMpIHtcbiAgICAgIGNvbnN0IHNpemUgPSBydW4uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkU7XG4gICAgICB0aGlzLl9mb250KGRvYywgcnVuLCBzaXplKTtcblxuICAgICAgZm9yIChjb25zdCB0ZXh0IG9mIHJ1bi50ZXh0Lm1hdGNoKC8oPzpbXlxcc118XFx1MDBhMCkrW15cXFNcXHUwMGEwXSp8W15cXFNcXHUwMGEwXSsvZykgPz8gW10pIHtcbiAgICAgICAgY29uc3Qgd29yZFdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh0ZXh0KTtcblxuICAgICAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZVdpZHRoICsgd29yZFdpZHRoIC0gdGhpcy5fdHJhaWxpbmdTcGFjZShkb2MsIHRleHQpID4gd2lkdGgpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICBsaW5lV2lkdGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZS5wdXNoKHsgcnVuLCB0ZXh0LCBzaXplLCB3aWR0aDogd29yZFdpZHRoIH0pO1xuICAgICAgICBsaW5lV2lkdGggKz0gd29yZFdpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lLmxlbmd0aCkge1xuICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3V29yZChkb2M6IGFueSwgd29yZDogUGRmV29yZCwgeDogbnVtYmVyLCBiYXNlbGluZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcnVuID0gd29yZC5ydW47XG5cbiAgICBpZiAocnVuLmhpZ2hsaWdodCkge1xuICAgICAgZG9jLnNldEZpbGxDb2xvcihydW4uaGlnaGxpZ2h0KTtcbiAgICAgIGRvYy5yZWN0KHgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC45LCB3b3JkLndpZHRoLCB3b3JkLnNpemUgKiAxLjE1LCAnRicpO1xuICAgIH1cblxuICAgIHRoaXMuX2ZvbnQoZG9jLCBydW4sIHdvcmQuc2l6ZSk7XG4gICAgZG9jLnRleHQod29yZC50ZXh0LCB4LCBiYXNlbGluZSk7XG5cbiAgICBjb25zdCBjb2xvciA9IHJ1bi5jb2xvciA/PyBERUZBVUxUX1RFWFRfQ09MT1I7XG4gICAgY29uc3QgaW5rV2lkdGggPSB3b3JkLndpZHRoIC0gdGhpcy5fdHJhaWxpbmdTcGFjZShkb2MsIHdvcmQudGV4dCk7XG4gICAgaWYgKHJ1bi51bmRlcmxpbmUpIHtcbiAgICAgIGRvYy5zZXREcmF3Q29sb3IoY29sb3IpO1xuICAgICAgZG9jLnNldExpbmVXaWR0aCh3b3JkLnNpemUgLyAxNik7XG4gICAgICBkb2MubGluZSh4LCBiYXNlbGluZSArIHdvcmQuc2l6ZSAqIDAuMTIsIHggKyBpbmtXaWR0aCwgYmFzZWxpbmUgKyB3b3JkLnNpemUgKiAwLjEyKTtcbiAgICB9XG4gICAgaWYgKHJ1bi5zdHJpa2UpIHtcbiAgICAgIGRvYy5zZXREcmF3Q29sb3IoY29sb3IpO1xuICAgICAgZG9jLnNldExpbmVXaWR0aCh3b3JkLnNpemUgLyAxNik7XG4gICAgICBkb2MubGluZSh4LCBiYXNlbGluZSAtIHdvcmQuc2l6ZSAqIDAuMywgeCArIGlua1dpZHRoLCBiYXNlbGluZSAtIHdvcmQuc2l6ZSAqIDAuMyk7XG4gICAgfVxuXG4gICAgaWYgKHJ1bi5saW5rKSB7XG4gICAgICBkb2MubGluayh4LCBiYXNlbGluZSAtIHdvcmQuc2l6ZSwgaW5rV2lkdGgsIHdvcmQuc2l6ZSAqIDEuMiwgeyB1cmw6IHJ1bi5saW5rIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGpzUERGJ3Mgc3RhbmRhcmQgZm9udHMgYXJlIEhlbHZldGljYSwgVGltZXMgYW5kIENvdXJpZXI7IGEgYmxvY2sncyBmYWNlIGlzXG4gIC8vIG1hcHBlZCBvbnRvIHdoaWNoZXZlciBvZiB0aGUgdGhyZWUgaXQgcmVzZW1ibGVzLlxuICBwcml2YXRlIF9mb250KGRvYzogYW55LCBydW46IFRleHRSdW4sIHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZhY2UgPSAocnVuLmZvbnRGYWNlID8/ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGZhbWlseSA9IC9jb3VyaWVyfG1vbm8vLnRlc3QoZmFjZSlcbiAgICAgID8gJ2NvdXJpZXInXG4gICAgICA6ICgvdGltZXN8Z2VvcmdpYXxzZXJpZi8udGVzdChmYWNlKSAmJiAhZmFjZS5pbmNsdWRlcygnc2FucycpID8gJ3RpbWVzJyA6ICdoZWx2ZXRpY2EnKTtcbiAgICBjb25zdCBzdHlsZSA9IHJ1bi5ib2xkICYmIHJ1bi5pdGFsaWNcbiAgICAgID8gJ2JvbGRpdGFsaWMnXG4gICAgICA6IChydW4uYm9sZCA/ICdib2xkJyA6IChydW4uaXRhbGljID8gJ2l0YWxpYycgOiAnbm9ybWFsJykpO1xuXG4gICAgZG9jLnNldEZvbnQoZmFtaWx5LCBzdHlsZSk7XG4gICAgZG9jLnNldEZvbnRTaXplKHNpemUpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IocnVuLmNvbG9yID8/IERFRkFVTFRfVEVYVF9DT0xPUik7XG4gIH1cblxuICBwcml2YXRlIF90cmFpbGluZ1NwYWNlKGRvYzogYW55LCB0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHRyYWlsaW5nID0gdGV4dC5sZW5ndGggLSB0ZXh0LnRyaW1FbmQoKS5sZW5ndGg7XG5cbiAgICByZXR1cm4gdHJhaWxpbmcgPyBkb2MuZ2V0VGV4dFdpZHRoKCcgJykgKiB0cmFpbGluZyA6IDA7XG4gIH1cblxuICBwcml2YXRlIF9hbGlnbk9mZnNldChhbGlnbjogVGV4dFBhcmFncmFwaFsnYWxpZ24nXSwgd2lkdGg6IG51bWJlciwgbGluZVdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCAod2lkdGggLSBsaW5lV2lkdGgpIC8gMik7XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCB3aWR0aCAtIGxpbmVXaWR0aCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICAvLyBXaGF0IGEgdGV4dCBibG9jaydzIHRva2VucyBmaWxsIHdpdGggb24gdGhpcyBwYWdlLiBUaGUgbnVtYmVyIGlzIHRoZVxuICAvLyBwaHlzaWNhbCBwYWdlIGFtb25nIHRoZSByZXBvcnQncyBwYWdlcywgY29udGludWF0aW9uIHBhZ2VzIGluY2x1ZGVkIOKAlCB0aGVcbiAgLy8gdGl0bGUgcGFnZSBpcyBub3QgYSByZXBvcnQgcGFnZS4gVGhlIG5hbWUgc3RheXMgdGhlIHJlcG9ydCBwYWdlJ3MsIHNvIGFcbiAgLy8gY29udGludWF0aW9uIHBhZ2UgaXMgbmFtZWQgZm9yIHRoZSBwYWdlIGl0cyB0YWJsZSBzdGFydGVkIG9uLlxuICBwcml2YXRlIF90b2tlbnMocmVwb3J0OiBSZXBvcnQsIHBhZ2U6IFJlcG9ydFBhZ2UsIGluZGV4OiBudW1iZXIsIHBhZ2VOdW1iZXI6IG51bWJlcik6IFRleHRUb2tlbkNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlTnVtYmVyLFxuICAgICAgcGFnZU5hbWU6IHBhZ2UubmFtZSB8fCBgUGFnZSAke2luZGV4ICsgMX1gLFxuICAgICAgcmVwb3J0TmFtZTogcmVwb3J0Lm5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlckNvbXBvbmVudChcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgY29tcG9uZW50ID0gaXRlbS5jb21wb25lbnQ7XG4gICAgLy8gR2VvbWV0cnkgaXMgc3RvcmVkIGluIGluY2hlczsgdGhlIFBERiBkcmF3cyBpbiBwb2ludHMuXG4gICAgY29uc3QgeCA9IGNvbXBvbmVudC54ICogUFQ7XG4gICAgY29uc3QgeSA9IGNvbXBvbmVudC55ICogUFQ7XG4gICAgY29uc3QgdyA9IGNvbXBvbmVudC53ICogUFQ7XG4gICAgY29uc3QgaCA9IGNvbXBvbmVudC5oICogUFQ7XG5cbiAgICBjb25zdCB0aXRsZSA9IGV4cG9ydFRpdGxlKGNvbXBvbmVudCwgaXRlbS5zZWFyY2gpO1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgdGhpcy5fY29tcG9uZW50VGl0bGUoZG9jLCB0aXRsZSwgeCwgeSwgdyk7XG4gICAgfVxuXG4gICAgLy8gQSBjaGFydCBvciBsaXN0IHRoYXQgY29tcGFyZXMgb3IgaGFzIGEgdGltZWZyYW1lIG5hbWVzIGl0cyBkYXlzIHVuZGVyXG4gICAgLy8gdGhlIHRpdGxlLCBhbmQgaXRzIG5vdGVzIHNpdCBhdCB0aGUgZm9vdCBvZiBpdHMgYm94OyBhIEtQSSBjYXJkIGRyYXdzXG4gICAgLy8gYm90aCBpdHNlbGYuIE5laXRoZXIgdGFrZXMgcm9vbSBmcm9tIGEgY29tcG9uZW50IHdpdGhvdXQgdGhvc2Uga2V5cy5cbiAgICBjb25zdCBsb2NhbGUgPSBjb250ZXh0LmZvcm1hdENvbnRleHQubG9jYWxlO1xuICAgIGNvbnN0IHN1YnRpdGxlID0gdGhpcy5fcGRmVGV4dChleHBvcnRXaW5kb3dzTGluZShpdGVtLCBjb250ZXh0LnRpbWV6b25lLCBsb2NhbGUpKTtcbiAgICBjb25zdCBub3RlcyA9IGNvbXBvbmVudC50eXBlID09PSAna3BpJyA/IFtdIDogZXhwb3J0Tm90ZUxpbmVzKGl0ZW0sIGNvbnRleHQudGltZXpvbmUsIGxvY2FsZSk7XG4gICAgY29uc3QgdG9wID0geSArIFRJVExFX0ggKyAoc3VidGl0bGUgPyBTVUJUSVRMRV9IIDogMCk7XG4gICAgY29uc3Qgcm9vbSA9IE1hdGgubWF4KDIwLCB5ICsgaCAtIHRvcCk7XG4gICAgY29uc3Qga2VwdCA9IG5vdGVzLnNsaWNlKDAsIE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKHJvb20gLSBNSU5fQk9EWV9IKSAvIE5PVEVfTElORV9IKSkpO1xuXG4gICAgaWYgKHN1YnRpdGxlKSB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCBzdWJ0aXRsZSwgeCwgeSArIFRJVExFX0gsIHcsICdsZWZ0JywgJ25vcm1hbCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHlZID0gdG9wO1xuICAgIGNvbnN0IGJvZHlIID0gTWF0aC5tYXgoMjAsIHJvb20gLSBrZXB0Lmxlbmd0aCAqIE5PVEVfTElORV9IKTtcblxuICAgIGtlcHQuZm9yRWFjaCgobGluZSwgaW5kZXgpID0+IHtcbiAgICAgIHRoaXMuX3NtYWxsTGluZShkb2MsIHRoaXMuX3BkZlRleHQobGluZSksIHgsIGJvZHlZICsgYm9keUggKyBpbmRleCAqIE5PVEVfTElORV9ILCB3LCAnbGVmdCcsICdpdGFsaWMnKTtcbiAgICB9KTtcblxuICAgIGlmICghaXRlbS5kYXRhIHx8ICFpdGVtLmRhdGEucm93cz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9ib3hOb3RlKGRvYywgZW1wdHlMYWJlbChpdGVtKSwgeCwgYm9keVksIHcsIGJvZHlIKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29tcG9uZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ2NoYXJ0Jzoge1xuICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHJlbmRlckNoYXJ0SW1hZ2UoY29tcG9uZW50LCBpdGVtLmRhdGEsIHcsIGJvZHlILCBjb250ZXh0LmZvcm1hdENvbnRleHQpO1xuICAgICAgICBkb2MuYWRkSW1hZ2UoaW1hZ2UsICdQTkcnLCB4LCBib2R5WSwgdywgYm9keUgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgICB0aGlzLl9yZW5kZXJUYWJsZShjb250ZXh0LCBpdGVtLCB4LCBib2R5WSwgdywgYm9keUgsIG92ZXJmbG93cyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAna3BpJzpcbiAgICAgICAgdGhpcy5fcmVuZGVyS3BpKGNvbnRleHQsIGl0ZW0sIHgsIGJvZHlZLCB3LCBib2R5SCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIE9uZSBsaW5lIG9mIHNtYWxsIGdyZXkgcHJpbnQsIGN1dCB0byB0aGUgd2lkdGggd2l0aCBhbiBlbGxpcHNpczogYVxuICAvLyBzdWJ0aXRsZSwgYSBub3RlIG9yIGEgbGluZSBvZiBhIEtQSSBjYXJkLiB5IGlzIHRoZSBsaW5lJ3MgdG9wOyB0aGUgbGluZSBpc1xuICAvLyBOT1RFX0xJTkVfSCB0YWxsLCB0aW1lcyB0aGUgc2NhbGUgYSBzaG9ydCBLUEkgdGlsZSBzaHJpbmtzIGl0cyBsaW5lcyBieS5cbiAgcHJpdmF0ZSBfc21hbGxMaW5lKFxuICAgIGRvYzogYW55LFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLFxuICAgIGFsaWduOiAnbGVmdCcgfCAnY2VudGVyJyxcbiAgICBzdHlsZTogJ25vcm1hbCcgfCAnaXRhbGljJyxcbiAgICBzY2FsZSA9IDEsXG4gICk6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCBzdHlsZSk7XG4gICAgZG9jLnNldEZvbnRTaXplKFNNQUxMX1NJWkUgKiBzY2FsZSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgZG9jLnRleHQodGhpcy5fZml0KGRvYywgdGV4dCwgdyksIGFsaWduID09PSAnY2VudGVyJyA/IHggKyB3IC8gMiA6IHgsIHkgKyBTTUFMTF9TSVpFICogc2NhbGUsIHsgYWxpZ24gfSk7XG4gIH1cblxuICAvLyBUaGUgdGV4dCwgZWxsaXBzaXplZCB0byB0aGUgd2lkdGggaW4gdGhlIGRvYydzIGN1cnJlbnQgZm9udC5cbiAgcHJpdmF0ZSBfZml0KGRvYzogYW55LCB0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChkb2MuZ2V0VGV4dFdpZHRoKHRleHQpIDw9IHdpZHRoKSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBsZXQgY3V0ID0gdGV4dDtcbiAgICB3aGlsZSAoY3V0Lmxlbmd0aCA+IDEgJiYgZG9jLmdldFRleHRXaWR0aChgJHtjdXR94oCmYCkgPiB3aWR0aCkge1xuICAgICAgY3V0ID0gY3V0LnNsaWNlKDAsIC0xKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y3V0LnRyaW1FbmQoKX3igKZgO1xuICB9XG5cbiAgLy8gVGhlIGJvbGQgc3RyaXAgb3ZlciBhIGNvbXBvbmVudCwgYW5kIG92ZXIgZWFjaCBvZiBpdHMgY29udGludWF0aW9uIHBhZ2VzLlxuICBwcml2YXRlIF9jb21wb25lbnRUaXRsZShkb2M6IGFueSwgdGl0bGU6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodGl0bGUsIHgsIHkgKyAxMCwgeyBtYXhXaWR0aDogdyB9KTtcbiAgfVxuXG4gIC8vIEFuIGl0YWxpYyBncmV5IGxpbmUgY2VudGVyZWQgaW4gYSBjb21wb25lbnQncyBib2R5LCBmb3IgYSBib2R5IHRoYXQgaG9sZHNcbiAgLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gaXRzIGNvbnRlbnQuXG4gIHByaXZhdGUgX2JveE5vdGUoZG9jOiBhbnksIHRleHQ6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdpdGFsaWMnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgZG9jLnRleHQodGV4dCwgeCArIHcgLyAyLCB5ICsgaCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICB9XG5cbiAgLy8gQSBsaXN0J3Mgb24tcGFnZSB0YWJsZS4gQWxsIG9mIGl0cyBmZXRjaGVkIHJvd3MgYXJlIGxhaWQgb3V0IG9uY2UgdG8gbGVhcm5cbiAgLy8gaG93IG1hbnkgdGhlIGJveCBob2xkczsgd2hlbiB0aGV5IGRvIG5vdCBhbGwgZml0LCB0aGUgYm94J3MgbGFzdCByb3cgc2F5c1xuICAvLyB0aGUgdGFibGUgY29udGludWVzIGFuZCB0aGUgcmVzdCBnbyB0byBvdmVyZmxvd3MgZm9yIGNvbnRpbnVhdGlvbiBwYWdlcy5cbiAgLy8gQSBib3ggdG9vIHNob3J0IGZvciBldmVuIHRoZSBoZWFkIGNhcnJpZXMgdGhlIG5vdGljZSBhcyBhIGxpbmUgaW5zdGVhZC5cbiAgLy8gQSB0b3RhbHMgcm93IGNsb3NlcyB0aGUgdGFibGUgb25jZTogaW4gdGhlIGJveCB3aGVuIGV2ZXJ5IHJvdyBmaXRzIGl0LFxuICAvLyBlbHNlIGFmdGVyIHRoZSBsYXN0IGNvbnRpbnVhdGlvbiByb3cuIFBvaW50cyB0aHJvdWdob3V0LlxuICBwcml2YXRlIF9yZW5kZXJUYWJsZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gICAgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29tcG9uZW50LCBzZWFyY2gsIGhpZGRlbkNvbHVtbnMgfSA9IGl0ZW07XG4gICAgY29uc3QgZGF0YSA9IGl0ZW0uZGF0YSBhcyBDb21wb25lbnREYXRhO1xuICAgIGNvbnN0IGhlYWQgPSBsaXN0SGVhZGluZ3MoY29tcG9uZW50LCBkYXRhLCBjb250ZXh0LmZvcm1hdENvbnRleHQubG9jYWxlLCBoaWRkZW5Db2x1bW5zKVxuICAgICAgLm1hcCgoaGVhZGluZykgPT4gdGhpcy5fcGRmVGV4dChoZWFkaW5nKSk7XG4gICAgY29uc3QgeyBjZWxscywgbnVtZXJpYywgZm9vdCB9ID0gdGhpcy5fdGFibGVDZWxscyhjb250ZXh0LCBjb21wb25lbnQsIGRhdGEsIGhpZGRlbkNvbHVtbnMpO1xuICAgIGNvbnN0IG9taXR0ZWQgPSBNYXRoLm1heCgwLCAoZGF0YS5wYWdpbmc/LnRvdGFsID8/IGNlbGxzLmxlbmd0aCkgLSBjZWxscy5sZW5ndGgpO1xuICAgIGNvbnN0IGJvdHRvbSA9IGNvbnRleHQucGFnZUggLSAoeSArIGgpO1xuICAgIGNvbnN0IHsgZml0LCBjb2x1bW5TdHlsZXMgfSA9IHRoaXMuX21lYXN1cmUoY29udGV4dCwgaGVhZCwgY2VsbHMsIG51bWVyaWMsIGZvb3QsIHgsIHksIHcsIGJvdHRvbSk7XG5cbiAgICBpZiAoZml0ID09PSBjZWxscy5sZW5ndGggJiYgb21pdHRlZCA9PT0gMCkge1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB0aGlzLl90YWJsZU9wdGlvbnMoY29udGV4dCwgaGVhZCwgbnVtZXJpYywgY2VsbHMsIHgsIHksIHcsIGJvdHRvbSwgY29sdW1uU3R5bGVzLCBmb290KSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgbm90aWNlIHRha2VzIHRoZSBwbGFjZSBvZiB0aGUgbGFzdCByb3cgdGhhdCBmaXQsIHNvIHRoYXQgcm93IG1vdmVzXG4gICAgLy8gdG8gdGhlIGNvbnRpbnVhdGlvbi4gb21pdHRlZCA+IDAgbWVhbnMgYSBmdWxsIFBERl9MSVNUX1JPV1MgZmV0Y2gsIHdoaWNoXG4gICAgLy8gbmV2ZXIgZml0cyBvbmUgYm94LCBzbyB0aGUgQ1NWIG5vdGljZSBhbHdheXMgbGFuZHMgb24gYSBjb250aW51YXRpb25cbiAgICAvLyBwYWdlLlxuICAgIGNvbnN0IGtlcHQgPSBNYXRoLm1heCgwLCBmaXQgLSAxKTtcbiAgICBvdmVyZmxvd3MucHVzaCh7IGNvbXBvbmVudCwgc2VhcmNoLCBoZWFkLCBudW1lcmljLCByb3dzOiBjZWxscy5zbGljZShrZXB0KSwgb21pdHRlZCwgZm9vdCwgeCwgdywgY29sdW1uU3R5bGVzIH0pO1xuXG4gICAgaWYgKGZpdCA+PSAxKSB7XG4gICAgICBjb25zdCBib2R5ID0gWy4uLmNlbGxzLnNsaWNlKDAsIGtlcHQpLCB0aGlzLl9ub3RpY2VSb3coQ09OVElOVUVEX05PVElDRSwgaGVhZC5sZW5ndGgsIHRydWUpXTtcbiAgICAgIHRoaXMuX2RyYXdUYWJsZShjb250ZXh0LCB0aGlzLl90YWJsZU9wdGlvbnMoY29udGV4dCwgaGVhZCwgbnVtZXJpYywgYm9keSwgeCwgeSwgdywgYm90dG9tLCBjb2x1bW5TdHlsZXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYm94Tm90ZShjb250ZXh0LmRvYywgQ09OVElOVUVEX05PVElDRSwgeCwgeSwgdywgaCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRWFjaCBmZXRjaGVkIHJvdyBhcyB0aGUgc3RyaW5ncyBpdHMgdGFibGUgY2VsbHMgcHJpbnQsIGluIHRoZSByZXBvcnQnc1xuICAvLyB6b25lLCBsb2NhbGUgYW5kIGN1cnJlbmN5LCB3aGljaCBjb2x1bW5zIGhvbGQgZm9ybWF0dGVkIG51bWJlcnMsIGFuZCB0aGVcbiAgLy8gdG90YWxzIHJvdyAobnVsbCB3aXRob3V0IG9uZSkuIFRoZSBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkIGFyZSBsZWZ0IG91dC5cbiAgcHJpdmF0ZSBfdGFibGVDZWxscyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIGRhdGE6IENvbXBvbmVudERhdGEsXG4gICAgaGlkZGVuQ29sdW1uczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICk6IHsgY2VsbHM6IHN0cmluZ1tdW107IG51bWVyaWM6IGJvb2xlYW5bXTsgZm9vdDogc3RyaW5nW10gfCBudWxsIH0ge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBsaXN0Q29sdW1ucyhjb21wb25lbnQsIGRhdGEsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUsIGhpZGRlbkNvbHVtbnMpO1xuICAgIGNvbnN0IGNlbGxzID0gZGF0YS5yb3dzLm1hcCgocm93KSA9PiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB0aGlzLl9wZGZUZXh0KFxuICAgICAgZXhwb3J0Q2VsbChyb3dbY29sdW1uLmNvbHVtbl0sIGNvbHVtbiwgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXRDb250ZXh0LCByb3cpLFxuICAgICkpKTtcbiAgICBjb25zdCBmb290ID0gbGlzdFRvdGFsc1JvdyhkYXRhLCBjb2x1bW5zLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdENvbnRleHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNlbGxzLFxuICAgICAgbnVtZXJpYzogY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm51bWVyaWMpLFxuICAgICAgZm9vdDogZm9vdCA/IGZvb3QubWFwKChjZWxsKSA9PiB0aGlzLl9wZGZUZXh0KGNlbGwpKSA6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRoZSBhdXRvVGFibGUgb3B0aW9ucyBldmVyeSBsaXN0IHRhYmxlIHNoYXJlczogdGhlIGRyeSBydW4sIHRoZSBvbi1wYWdlXG4gIC8vIGRyYXcgYW5kIHRoZSBjb250aW51YXRpb24gcGFnZXMsIHNvIHRoZSB0aHJlZSBsYXkgYSB0YWJsZSBvdXQgYWxpa2UuIFRoZVxuICAvLyBmb250IGlzIG5hbWVkIHJhdGhlciB0aGFuIGluaGVyaXRlZCwgc2luY2UgdGhlIGRvYyBjYXJyaWVzIHdoYXRldmVyIHRoZVxuICAvLyBsYXN0IHRleHQgZHJhd24gbGVmdCBzZXQuIGJvdHRvbSBpcyB0aGUgbWFyZ2luIHVuZGVyIHRoZSB0YWJsZSwgcG9pbnRzLlxuICAvL1xuICAvLyBBIGNvbHVtbiBvZiBmb3JtYXR0ZWQgbnVtYmVycyBpcyByaWdodC1hbGlnbmVkLCBpdHMgaGVhZGluZyBhbmQgdG90YWxcbiAgLy8gdG9vOiB0aGUgYm9keSB0aHJvdWdoIGNvbHVtblN0eWxlcywgd2hpY2ggYXV0b1RhYmxlIGFwcGxpZXMgdG8gYm9keSBjZWxsc1xuICAvLyBvbmx5LCBhbmQgdGhlIGhlYWRpbmcgYW5kIHRvdGFsIHRocm91Z2ggdGhlIGRpZFBhcnNlQ2VsbCBob29rLCBvbiBldmVyeVxuICAvLyBwYWdlIHRoZSBoZWFkaW5nIHJlcGVhdHMuIEEgdG90YWxzIHJvdyAoZm9vdCkgcHJpbnRzIG9uY2UsIHVuZGVyIHRoZVxuICAvLyB0YWJsZSdzIGxhc3Qgcm93LCBib2xkIG9uIHRoZSBib3JkZXIgZ3JheS5cbiAgcHJpdmF0ZSBfdGFibGVPcHRpb25zKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaGVhZDogc3RyaW5nW10sXG4gICAgbnVtZXJpYzogYm9vbGVhbltdLFxuICAgIGJvZHk6IFBkZlRhYmxlQ2VsbFtdW10sXG4gICAgeDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgdzogbnVtYmVyLCBib3R0b206IG51bWJlcixcbiAgICBjb2x1bW5TdHlsZXM/OiBQZGZDb2x1bW5TdHlsZXMsXG4gICAgZm9vdD86IHN0cmluZ1tdIHwgbnVsbCxcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7XG4gICAgICB0aGVtZTogJ2dyaWQnLFxuICAgICAgaGVhZDogW2hlYWRdLFxuICAgICAgYm9keSxcbiAgICAgIHN0YXJ0WSxcbiAgICAgIG1hcmdpbjogeyBsZWZ0OiB4LCByaWdodDogY29udGV4dC5wYWdlVyAtIHggLSB3LCBib3R0b20gfSxcbiAgICAgIHRhYmxlV2lkdGg6IHcsXG4gICAgICByb3dQYWdlQnJlYWs6ICdhdm9pZCcsXG4gICAgICBzdHlsZXM6IHsgZm9udDogJ2hlbHZldGljYScsIGZvbnRTdHlsZTogJ25vcm1hbCcsIGZvbnRTaXplOiA4LCBjZWxsUGFkZGluZzogMywgdGV4dENvbG9yOiAnIzFmMjkzMycgfSxcbiAgICAgIGhlYWRTdHlsZXM6IHsgZmlsbENvbG9yOiAnIzRlNzlhNycsIHRleHRDb2xvcjogJyNmZmZmZmYnLCBmb250U3R5bGU6ICdib2xkJyB9LFxuICAgICAgYWx0ZXJuYXRlUm93U3R5bGVzOiB7IGZpbGxDb2xvcjogJyNmNWY3ZmEnIH0sXG4gICAgICAuLi4oY29sdW1uU3R5bGVzID8geyBjb2x1bW5TdHlsZXMgfSA6IHt9KSxcbiAgICAgIC4uLihmb290XG4gICAgICAgID8ge1xuICAgICAgICAgIGZvb3Q6IFtmb290XSxcbiAgICAgICAgICBzaG93Rm9vdDogJ2xhc3RQYWdlJyxcbiAgICAgICAgICBmb290U3R5bGVzOiB7IGZpbGxDb2xvcjogJyNlNGU3ZWInLCB0ZXh0Q29sb3I6ICcjMWYyOTMzJywgZm9udFN0eWxlOiAnYm9sZCcgfSxcbiAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIGRpZFBhcnNlQ2VsbDogKGhvb2s6IGFueSkgPT4ge1xuICAgICAgICBpZiAoKGhvb2suc2VjdGlvbiA9PT0gJ2hlYWQnIHx8IGhvb2suc2VjdGlvbiA9PT0gJ2Zvb3QnKSAmJiBudW1lcmljW2hvb2suY29sdW1uLmluZGV4XSkge1xuICAgICAgICAgIGhvb2suY2VsbC5zdHlsZXMuaGFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQSBub3RpY2UgYXMgYSB0YWJsZSByb3c6IG9uZSBpdGFsaWMgZ3JleSBjZWxsIHNwYW5uaW5nIGV2ZXJ5IGNvbHVtbi4gQVxuICAvLyBzaW5nbGUtbGluZSBub3RpY2UgaXMgZWxsaXBzaXplZCBhdCB0aGUgYm94J3Mgd2lkdGggYW5kIGtlZXBzIHRoZSBkYXRhXG4gIC8vIGNlbGxzJyBmb250IHNpemUgYW5kIHBhZGRpbmcsIHNvIGl0IGlzIG5ldmVyIHRhbGxlciB0aGFuIHRoZSBkYXRhIHJvd1xuICAvLyB3aG9zZSBwbGFjZSBpdCB0YWtlcy5cbiAgcHJpdmF0ZSBfbm90aWNlUm93KHRleHQ6IHN0cmluZywgc3BhbjogbnVtYmVyLCBzaW5nbGVMaW5lOiBib29sZWFuKTogUGRmVGFibGVDZWxsW10ge1xuICAgIHJldHVybiBbe1xuICAgICAgY29udGVudDogdGV4dCxcbiAgICAgIGNvbFNwYW46IHNwYW4sXG4gICAgICAvLyBMZWZ0LWFsaWduZWQgd2hhdGV2ZXIgdGhlIGZpcnN0IGNvbHVtbiBpczogYSBzcGFubmVkIGNlbGwgb3RoZXJ3aXNlXG4gICAgICAvLyB0YWtlcyBjb2x1bW5TdHlsZXNbMF0sIHJpZ2h0LWFsaWduZWQgd2hlbiB0aGF0IGNvbHVtbiBpcyBudW1lcmljLlxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIGZvbnRTdHlsZTogJ2l0YWxpYycsXG4gICAgICAgIHRleHRDb2xvcjogTVVURURfQ09MT1IsXG4gICAgICAgIGhhbGlnbjogJ2xlZnQnLFxuICAgICAgICAuLi4oc2luZ2xlTGluZSA/IHsgb3ZlcmZsb3c6ICdlbGxpcHNpemUnIH0gOiB7fSksXG4gICAgICB9LFxuICAgIH1dO1xuICB9XG5cbiAgLy8gTGF5cyBldmVyeSBmZXRjaGVkIHJvdyBvdXQgb25jZSBvbiBhIHNjcmF0Y2ggZG9jdW1lbnQgb2YgdGhlIHNhbWUgcGFnZVxuICAvLyBzaXplLCB3aXRoIHRoZSBvcHRpb25zIHRoZSByZWFsIGRyYXcgdXNlcywgYW5kIHJlYWRzIGJhY2sgaG93IG1hbnkgYm9keVxuICAvLyByb3dzIHRoZSBib3gncyBwYWdlIGhvbGRzIChmaXQpIGFuZCB0aGUgY29sdW1uIHdpZHRocyBhdXRvVGFibGUgY2hvc2UsXG4gIC8vIHdpdGggZWFjaCBudW1lcmljIGNvbHVtbidzIHJpZ2h0IGFsaWdubWVudCBtZXJnZWQgaW4sIHNvIHRoZSBvbi1wYWdlXG4gIC8vIHRhYmxlIGFuZCBpdHMgY29udGludWF0aW9uIHBhZ2VzIGNhcnJ5IGJvdGguIFRoZSB0b3RhbHMgcm93IGlzIGxhaWQgb3V0XG4gIC8vIHRvbywgc28gdGhlIHdpZHRocyBob2xkIGl0LCBhbmQgYSB0YWJsZSB3aG9zZSByb3dzIGZpdCB0aGUgYm94IGJ1dCB3aG9zZVxuICAvLyB0b3RhbHMgcm93IGRvZXMgbm90IG1vdmVzIGl0cyBsYXN0IHJvdyBvbi4gZml0IDAgbWVhbnMgbm90IGV2ZW4gb25lXG4gIC8vIGJvZHkgcm93IGZpdHMgdW5kZXIgdGhlIGhlYWQgKG9yIHRoZSBoZWFkIGl0c2VsZiBkaWQgbm90IGZpdCk6IGF1dG9UYWJsZVxuICAvLyBtb3ZlZCB0byBhIG5ldyBwYWdlIGJlZm9yZSBkcmF3aW5nLiBUaGUgcmVhbCBkb2N1bWVudCBpcyB1bnRvdWNoZWQuXG4gIHByaXZhdGUgX21lYXN1cmUoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBoZWFkOiBzdHJpbmdbXSxcbiAgICBjZWxsczogc3RyaW5nW11bXSxcbiAgICBudW1lcmljOiBib29sZWFuW10sXG4gICAgZm9vdDogc3RyaW5nW10gfCBudWxsLFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLFxuICApOiB7IGZpdDogbnVtYmVyOyBjb2x1bW5TdHlsZXM6IFBkZkNvbHVtblN0eWxlcyB9IHtcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5fc2NyYXRjaERvY3VtZW50KGNvbnRleHQpO1xuICAgIGxldCBmaXQgPSAwO1xuXG4gICAgY29udGV4dC5hdXRvVGFibGUoc2NyYXRjaCwge1xuICAgICAgLi4udGhpcy5fdGFibGVPcHRpb25zKGNvbnRleHQsIGhlYWQsIG51bWVyaWMsIGNlbGxzLCB4LCB5LCB3LCBib3R0b20sIHVuZGVmaW5lZCwgZm9vdCksXG4gICAgICBkaWREcmF3Q2VsbDogKGhvb2s6IGFueSkgPT4ge1xuICAgICAgICBpZiAoaG9vay5zZWN0aW9uID09PSAnYm9keScgJiYgc2NyYXRjaC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgZml0ID0gTWF0aC5tYXgoZml0LCBob29rLnJvdy5pbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgY29sdW1uczogeyB3aWR0aDogbnVtYmVyIH1bXSA9IHNjcmF0Y2gubGFzdEF1dG9UYWJsZS5jb2x1bW5zO1xuICAgIGNvbnN0IGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzID0ge307XG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICBjb2x1bW5TdHlsZXNbaW5kZXhdID0gbnVtZXJpY1tpbmRleF1cbiAgICAgICAgPyB7IGNlbGxXaWR0aDogY29sdW1uLndpZHRoLCBoYWxpZ246ICdyaWdodCcgfVxuICAgICAgICA6IHsgY2VsbFdpZHRoOiBjb2x1bW4ud2lkdGggfTtcbiAgICB9KTtcblxuICAgIC8vIEEgcm93IHRhbGxlciB0aGFuIGEgd2hvbGUgcGFnZSBpcyBzcGxpdCByYXRoZXIgdGhhbiBtb3ZlZCwgc28gYSBsYXN0XG4gICAgLy8gcm93IHRoYXQgc3RhcnRlZCBvbiB0aGUgZmlyc3QgcGFnZSBjYW4gc3RpbGwgaGF2ZSBydW4gcGFzdCBpdC5cbiAgICBpZiAoZml0ID09PSBjZWxscy5sZW5ndGggJiYgc2NyYXRjaC5nZXROdW1iZXJPZlBhZ2VzKCkgPiAxKSB7XG4gICAgICBmaXQgLT0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBmaXQsIGNvbHVtblN0eWxlcyB9O1xuICB9XG5cbiAgLy8gQSBibGFuayBkb2N1bWVudCBvZiB0aGUgZXhwb3J0J3MgcGFnZSBzaXplLCBmb3IgbGF5aW5nIGEgdGFibGUgb3V0IHRvIHNlZVxuICAvLyB3aGF0IGZpdHMgYmVmb3JlIHRoZSByZWFsIG9uZSBpcyBkcmF3biBvbi5cbiAgcHJpdmF0ZSBfc2NyYXRjaERvY3VtZW50KGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQpOiBhbnkge1xuICAgIHJldHVybiBuZXcgY29udGV4dC5qc1BERih7XG4gICAgICB1bml0OiAncHQnLFxuICAgICAgZm9ybWF0OiBbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sXG4gICAgICBvcmllbnRhdGlvbjogY29udGV4dC5vcmllbnRhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8vIERyYXdzIGFuIG9uLXBhZ2UgdGFibGUgKGEgbGlzdCdzLCBvciBhIHRleHQgYmxvY2sncyksIHRoZW4gcmVtb3ZlcyBhbnlcbiAgLy8gcGFnZSB0aGUgZHJhdyBhZGRlZC4gVGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuOiB0aGUgbWVhc3VyZWQgZml0LCB0aGVcbiAgLy8gaWRlbnRpY2FsIGNvbHVtbiB3aWR0aHMgYW5kIGEgc2luZ2xlLWxpbmUgbm90aWNlIGtlZXAgdGhlIHRhYmxlIGluc2lkZSBpdHNcbiAgLy8gYm94LiBUaGUgY2hlY2sgZXhpc3RzIHNvIGEgc3RyYXkgcGFnZSBjYW4gbmV2ZXIgY2F0Y2ggdGhlIHJlcG9ydCBwYWdlJ3NcbiAgLy8gcmVtYWluaW5nIGNvbXBvbmVudHMuXG4gIHByaXZhdGUgX2RyYXdUYWJsZShjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHBhZ2UgPSBkb2MuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICBjb25zdCBwYWdlcyA9IGRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG5cbiAgICBjb250ZXh0LmF1dG9UYWJsZShkb2MsIG9wdGlvbnMpO1xuXG4gICAgd2hpbGUgKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkgPiBwYWdlcykge1xuICAgICAgZG9jLmRlbGV0ZVBhZ2UoZG9jLmdldE51bWJlck9mUGFnZXMoKSk7XG4gICAgfVxuXG4gICAgZG9jLnNldFBhZ2UocGFnZSk7XG4gIH1cblxuICAvLyBUaGUgcm93cyBvZiBvbmUgbGlzdCB0aGF0IGRpZCBub3QgZml0IGl0cyBib3gsIG9uIHBhZ2VzIGFwcGVuZGVkIGFmdGVyXG4gIC8vIHRoZSByZXBvcnQgcGFnZSwgZWFjaCB3aXRoIHRoZSBwYWdlJ3MgaGVhZGVyIGFuZCBmb290ZXIsIHRoZSB0YWJsZSdzXG4gIC8vIHRpdGxlIGFuZCBpdHMgaGVhZCBhZ2Fpbi4gVGhlIHRhYmxlIHNpdHMgQ09OVElOVUFUSU9OX0dBUCBpbnNpZGUgdGhlXG4gIC8vIGJhbmRzLiBSZXR1cm5zIHRoZSBwaHlzaWNhbCBwYWdlIGNvdW50ZXIgYWZ0ZXIgdGhlc2UgcGFnZXMuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlckNvbnRpbnVhdGlvbihcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHBhZ2U6IFJlcG9ydFBhZ2UsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXG4gICAgb3ZlcmZsb3c6IFBkZlRhYmxlT3ZlcmZsb3csXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgYmFuZHMgPSBwYWdlLm1hc3RlckhpZGRlbiA/IE5PX0JBTkRTIDogY29udGV4dC5yZXBvcnQuY29uZmlnPy5oZWFkZXJGb290ZXIgPz8gTk9fQkFORFM7XG4gICAgY29uc3QgdG9wID0gdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmhlYWRlckhlaWdodCk7XG4gICAgY29uc3QgYm90dG9tID0gdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmZvb3RlckhlaWdodCk7XG4gICAgY29uc3QgeyB4LCB3IH0gPSBvdmVyZmxvdztcbiAgICBjb25zdCBib2R5OiBQZGZUYWJsZUNlbGxbXVtdID0gb3ZlcmZsb3cub21pdHRlZCA+IDBcbiAgICAgID8gWy4uLm92ZXJmbG93LnJvd3MsIHRoaXMuX25vdGljZVJvdyhtb3JlUm93c05vdGljZShvdmVyZmxvdy5vbWl0dGVkKSwgb3ZlcmZsb3cuaGVhZC5sZW5ndGgsIGZhbHNlKV1cbiAgICAgIDogb3ZlcmZsb3cucm93cztcbiAgICAvLyBUaGUgZG9jdW1lbnQncyBwYWdlcyB0aGUgdGFibGUgZHJhd3Mgb24sIGluIG9yZGVyLlxuICAgIGNvbnN0IHBhZ2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgZG9jLmFkZFBhZ2UoW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLCBjb250ZXh0Lm9yaWVudGF0aW9uKTtcbiAgICBjb250ZXh0LmF1dG9UYWJsZShkb2MsIHtcbiAgICAgIC4uLnRoaXMuX3RhYmxlT3B0aW9ucyhcbiAgICAgICAgY29udGV4dCwgb3ZlcmZsb3cuaGVhZCwgb3ZlcmZsb3cubnVtZXJpYywgYm9keSwgeCwgdG9wICsgVElUTEVfSCwgdywgYm90dG9tLCBvdmVyZmxvdy5jb2x1bW5TdHlsZXMsXG4gICAgICAgIG92ZXJmbG93LmZvb3QsXG4gICAgICApLFxuICAgICAgbWFyZ2luOiB7IHRvcDogdG9wICsgVElUTEVfSCwgYm90dG9tLCBsZWZ0OiB4LCByaWdodDogY29udGV4dC5wYWdlVyAtIHggLSB3IH0sXG4gICAgICBzaG93SGVhZDogJ2V2ZXJ5UGFnZScsXG4gICAgICAvLyBGaXJlcyBvbiBldmVyeSBwYWdlIHRoZSB0YWJsZSBkcmF3cyBvbiwgdGhlIGZpcnN0IGluY2x1ZGVkLlxuICAgICAgd2lsbERyYXdQYWdlOiAoKSA9PiB7XG4gICAgICAgIHBhZ2VzLnB1c2goZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXIpO1xuICAgICAgICB0aGlzLl9jb21wb25lbnRUaXRsZShkb2MsIHRoaXMuX2NvbnRpbnVlZFRpdGxlKG92ZXJmbG93LmNvbXBvbmVudCwgb3ZlcmZsb3cuc2VhcmNoKSwgeCwgdG9wLCB3KTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLl9yZW5kZXJDb250aW51YXRpb25NYXN0ZXJzKGNvbnRleHQsIHBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyLCBwYWdlcyk7XG5cbiAgICByZXR1cm4gcGFnZU51bWJlciArIHBhZ2VzLmxlbmd0aDtcbiAgfVxuXG4gIC8vIFRoZSBoZWFkZXIgYW5kIGZvb3RlciBvZiBlYWNoIGNvbnRpbnVhdGlvbiBwYWdlLCBudW1iZXJlZCBvbiBmcm9tXG4gIC8vIHBhZ2VOdW1iZXIuIFRoZXkgZ28gb24gb25jZSB0aGUgdGFibGUgaXMgZHJhd24sIHNpbmNlIGEgdGV4dCBibG9jayB3aXRoIGFcbiAgLy8gdGFibGUgaXMgbWVhc3VyZWQgYmVmb3JlIGl0IGlzIGRyYXduLCB3aGljaCBhdXRvVGFibGUncyBwYWdlIGhvb2sgY2Fubm90XG4gIC8vIHdhaXQgZm9yOyB0aGV5IHNpdCBpbiB0aGUgYmFuZHMsIGNsZWFyIG9mIHRoZSB0YWJsZS5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyQ29udGludWF0aW9uTWFzdGVycyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHBhZ2U6IFJlcG9ydFBhZ2UsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXG4gICAgcGFnZXM6IG51bWJlcltdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGRvYywgcmVwb3J0IH0gPSBjb250ZXh0O1xuXG4gICAgZm9yIChjb25zdCBbb2Zmc2V0LCBkb2N1bWVudFBhZ2VdIG9mIHBhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgZG9jLnNldFBhZ2UoZG9jdW1lbnRQYWdlKTtcbiAgICAgIGF3YWl0IHRoaXMuX3JlbmRlck1hc3Rlcihjb250ZXh0LCBwYWdlLCB0aGlzLl90b2tlbnMocmVwb3J0LCBwYWdlLCBpbmRleCwgcGFnZU51bWJlciArIG9mZnNldCArIDEpKTtcbiAgICB9XG5cbiAgICBkb2Muc2V0UGFnZShkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpKTtcbiAgfVxuXG4gIC8vIFRoZSBtYXJnaW4gYSBjb250aW51YXRpb24gdGFibGUga2VlcHMgZnJvbSBvbmUgZWRnZTogaW5zaWRlIHRoZSBiYW5kIHdoZW5cbiAgLy8gdGhlIHBhZ2UgaGFzIG9uZS5cbiAgcHJpdmF0ZSBfY29udGludWF0aW9uTWFyZ2luKGJhbmQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGJhbmQgPyBiYW5kICogUFQgKyBDT05USU5VQVRJT05fR0FQIDogTk9fQkFORF9NQVJHSU47XG4gIH1cblxuICBwcml2YXRlIF9jb250aW51ZWRUaXRsZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgc2VhcmNoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aXRsZSA9IGV4cG9ydFRpdGxlKGNvbXBvbmVudCwgc2VhcmNoKTtcblxuICAgIHJldHVybiB0aXRsZSA/IGAke3RpdGxlfSAoY29udGludWVkKWAgOiAnQ29udGludWVkJztcbiAgfVxuXG4gIC8vIEEgS1BJIHRpbGU6IHRoZSBjYXJkIHRoZSBzY3JlZW4gZHJhd3MgKGtwaS1jYXJkLnRzIGRlY2lkZXMgZXZlcnkgbGluZSksXG4gIC8vIHN0YWNrZWQgYW5kIGNlbnRlcmVkIGluIHRoZSBib2R5LiBBIGNhcmQgd2l0aCBvbmx5IGl0cyB2YWx1ZSBhbmQgbGFiZWxcbiAgLy8ga2VlcHMgdGhlIHRpbGUncyBsb25nLXN0YW5kaW5nIGxheW91dC5cbiAgcHJpdmF0ZSBfcmVuZGVyS3BpKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50LFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgY29uZmlnID0gaXRlbS5jb21wb25lbnQuY29uZmlnIGFzIEtwaUNvbmZpZztcbiAgICBjb25zdCB2aWV3ID0ga3BpQ2FyZFZpZXcoY29uZmlnLCBpdGVtLmRhdGEsIHsgZm9ybWF0OiBjb250ZXh0LmZvcm1hdENvbnRleHQsIHRpbWV6b25lOiBjb250ZXh0LnRpbWV6b25lIH0pO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fcGRmVGV4dCh2aWV3LnZhbHVlKTtcbiAgICBjb25zdCBub3RlcyA9IGV4cG9ydE5vdGVMaW5lcyhpdGVtLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdENvbnRleHQubG9jYWxlKTtcblxuICAgIGlmICgha3BpQ2FyZEhhc0V4dHJhcyh2aWV3LCBub3RlcykpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgICAgZG9jLnNldEZvbnRTaXplKDI2KTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICAgIGRvYy50ZXh0KHZhbHVlLCB4ICsgdyAvIDIsIHkgKyBoIC8gMiwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG5cbiAgICAgIGlmICh2aWV3LmxhYmVsKSB7XG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICAgICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgICAgIGRvYy50ZXh0KHZpZXcubGFiZWwsIHggKyB3IC8gMiwgeSArIGggLyAyICsgMTYsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSB0aWxlIHRvbyBzaG9ydCBmb3IgdGhlIGNhcmQncyBsaW5lcyBzaHJpbmtzIHRoZW0gYWxsIGFsaWtlLlxuICAgIGNvbnN0IHBhcnRzID0ga3BpRXhwb3J0UGFydHModmlldywgbm90ZXMsIGgsIEtQSV9IRUlHSFRTKTtcbiAgICBjb25zdCBoZWlnaHRzID0gc2NhbGVkS3BpSGVpZ2h0cyhLUElfSEVJR0hUUywgcGFydHMuc2NhbGUpO1xuICAgIGxldCB0b3AgPSB5ICsgTWF0aC5tYXgoMCwgKGggLSBrcGlFeHBvcnRIZWlnaHQodmlldywgcGFydHMsIGhlaWdodHMpKSAvIDIpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDI2ICogcGFydHMuc2NhbGUpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dCh2YWx1ZSwgeCArIHcgLyAyLCB0b3AgKyBLUElfVkFMVUVfQkFTRUxJTkUgKiBwYXJ0cy5zY2FsZSwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gICAgdG9wICs9IGhlaWdodHMudmFsdWU7XG5cbiAgICBpZiAodmlldy5sYWJlbCkge1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSg5ICogcGFydHMuc2NhbGUpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgICBkb2MudGV4dCh0aGlzLl9maXQoZG9jLCB0aGlzLl9wZGZUZXh0KHZpZXcubGFiZWwpLCB3KSwgeCArIHcgLyAyLCB0b3AgKyA5ICogcGFydHMuc2NhbGUsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgICAgdG9wICs9IGhlaWdodHMubGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmRlbHRhICYmIHZpZXcuZGVsdGEpIHtcbiAgICAgIHRoaXMuX2twaURlbHRhKGRvYywgdmlldy5kZWx0YSwgeCwgdG9wLCB3LCBwYXJ0cy5zY2FsZSk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy5kZWx0YTtcbiAgICB9XG5cbiAgICBpZiAocGFydHMud2luZG93KSB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KHZpZXcud2luZG93KSwgeCwgdG9wLCB3LCAnY2VudGVyJywgJ25vcm1hbCcsIHBhcnRzLnNjYWxlKTtcbiAgICAgIHRvcCArPSBoZWlnaHRzLndpbmRvdztcbiAgICB9XG5cbiAgICBpZiAocGFydHMudGFyZ2V0ICYmIHZpZXcudGFyZ2V0KSB7XG4gICAgICB0aGlzLl9rcGlUYXJnZXQoZG9jLCB2aWV3LnRhcmdldCwgeCwgdG9wLCB3KTtcbiAgICAgIHRvcCArPSBoZWlnaHRzLnRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAocGFydHMuc3BhcmtsaW5lICYmIHZpZXcuc3BhcmtsaW5lKSB7XG4gICAgICB0aGlzLl9rcGlTcGFya2xpbmUoZG9jLCB2aWV3LnNwYXJrbGluZS52YWx1ZXMsIHZpZXcuc3BhcmtsaW5lLnBhcnRpYWwsIHgsIHRvcCwgdyk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy5zcGFya2xpbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHBhcnRzLm5vdGVzKSB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KGxpbmUpLCB4LCB0b3AsIHcsICdjZW50ZXInLCAnaXRhbGljJyk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy5ub3RlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBkZWx0YSByb3csIGNlbnRlcmVkIGFzIG9uZSBncm91cDogYSB0cmlhbmdsZSBwb2ludGluZyB0aGUgd2F5IHRoZVxuICAvLyB2YWx1ZSBtb3ZlZCAobm9uZSB3aGVuIHRoZSBzaG93biBjaGFuZ2Ugcm91bmRzIHRvIHplcm8pIGFuZCB0aGUgY2hhbmdlIGluXG4gIC8vIHRoZSBjb2xvciBvZiB3aGF0IGl0IG1lYW5zLCB0aGVuIHdoYXQgaXQgaXMgY29tcGFyZWQgd2l0aCBpbiBncmV5LlxuICBwcml2YXRlIF9rcGlEZWx0YShkb2M6IGFueSwgZGVsdGE6IEtwaUNhcmREZWx0YSwgeDogbnVtYmVyLCB0b3A6IG51bWJlciwgdzogbnVtYmVyLCBzY2FsZSA9IDEpOiB2b2lkIHtcbiAgICBjb25zdCBjb2xvciA9IGAjJHtSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlNbZGVsdGEudG9uZV19YDtcbiAgICBjb25zdCBjaGFuZ2UgPSB0aGlzLl9wZGZUZXh0KGRlbHRhLnRleHQpO1xuICAgIGNvbnN0IHNpemUgPSBLUElfREVMVEFfU0laRSAqIHNjYWxlO1xuICAgIGNvbnN0IHNpZGUgPSBLUElfQVJST1cgKiBzY2FsZTtcbiAgICBjb25zdCBhcnJvdyA9IGRlbHRhLnRyZW5kID09PSBSZXBvcnRLcGlUcmVuZC5GbGF0ID8gMCA6IHNpZGUgKyBLUElfQVJST1dfR0FQICogc2NhbGU7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoc2l6ZSk7XG4gICAgY29uc3QgY2hhbmdlV2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKGNoYW5nZSk7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgIGNvbnN0IGNvbXBhcmVkID0gZGVsdGEuY29tcGFyZWRcbiAgICAgID8gdGhpcy5fZml0KGRvYywgYCAke3RoaXMuX3BkZlRleHQoZGVsdGEuY29tcGFyZWQpfWAsIE1hdGgubWF4KDAsIHcgLSBhcnJvdyAtIGNoYW5nZVdpZHRoKSlcbiAgICAgIDogJyc7XG4gICAgY29uc3Qgd2lkdGggPSBhcnJvdyArIGNoYW5nZVdpZHRoICsgKGNvbXBhcmVkID8gZG9jLmdldFRleHRXaWR0aChjb21wYXJlZCkgOiAwKTtcbiAgICBjb25zdCBiYXNlbGluZSA9IHRvcCArIHNpemU7XG4gICAgbGV0IGxlZnQgPSB4ICsgTWF0aC5tYXgoMCwgKHcgLSB3aWR0aCkgLyAyKTtcblxuICAgIGlmIChhcnJvdykge1xuICAgICAgY29uc3QgdXAgPSBkZWx0YS50cmVuZCA9PT0gUmVwb3J0S3BpVHJlbmQuVXA7XG4gICAgICBjb25zdCB0aXAgPSB1cCA/IGJhc2VsaW5lIC0gc2lkZSA6IGJhc2VsaW5lO1xuICAgICAgY29uc3QgYmFzZSA9IHVwID8gYmFzZWxpbmUgOiBiYXNlbGluZSAtIHNpZGU7XG5cbiAgICAgIGRvYy5zZXRGaWxsQ29sb3IoY29sb3IpO1xuICAgICAgZG9jLnRyaWFuZ2xlKGxlZnQsIGJhc2UsIGxlZnQgKyBzaWRlLCBiYXNlLCBsZWZ0ICsgc2lkZSAvIDIsIHRpcCwgJ0YnKTtcbiAgICAgIGxlZnQgKz0gYXJyb3c7XG4gICAgfVxuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldFRleHRDb2xvcihjb2xvcik7XG4gICAgZG9jLnRleHQoY2hhbmdlLCBsZWZ0LCBiYXNlbGluZSk7XG5cbiAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKE1VVEVEX0NPTE9SKTtcbiAgICAgIGRvYy50ZXh0KGNvbXBhcmVkLCBsZWZ0ICsgY2hhbmdlV2lkdGgsIGJhc2VsaW5lKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgdGFyZ2V0IGxpbmUgKCdHb2FsOiAkMSwwMDAgwrcgNTYlIG9mIHRhcmdldCcpIGFuZCwgd2hlbiB0aGUgc2VydmVyIHNlbnRcbiAgLy8gdGhlIHByb2dyZXNzLCBhIGJhciBmaWxsZWQgdGhhdCBmYXI6IGdyZWVuIG9uY2UgdGhlIHRhcmdldCBpcyBtZXQuXG4gIHByaXZhdGUgX2twaVRhcmdldChkb2M6IGFueSwgdGFyZ2V0OiBLcGlDYXJkVGFyZ2V0LCB4OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXh0ID0gdGFyZ2V0LnByb2dyZXNzID8gYCR7dGFyZ2V0LnRleHR9IMK3ICR7dGFyZ2V0LnByb2dyZXNzfWAgOiB0YXJnZXQudGV4dDtcblxuICAgIHRoaXMuX3NtYWxsTGluZShkb2MsIHRoaXMuX3BkZlRleHQodGV4dCksIHgsIHRvcCwgdywgJ2NlbnRlcicsICdub3JtYWwnKTtcblxuICAgIGlmICh0YXJnZXQuZmlsbCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJhclcgPSBNYXRoLm1pbih3ICogMC42LCBLUElfQkFSX1cpO1xuICAgIGNvbnN0IGJhclggPSB4ICsgKHcgLSBiYXJXKSAvIDI7XG4gICAgY29uc3QgYmFyWSA9IHRvcCArIE5PVEVfTElORV9IICsgMTtcblxuICAgIGRvYy5zZXRGaWxsQ29sb3IoS1BJX1RSQUNLX0NPTE9SKTtcbiAgICBkb2MucmVjdChiYXJYLCBiYXJZLCBiYXJXLCBLUElfQkFSX0gsICdGJyk7XG5cbiAgICBpZiAodGFyZ2V0LmZpbGwgPiAwKSB7XG4gICAgICBkb2Muc2V0RmlsbENvbG9yKGAjJHtSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlNbdGFyZ2V0LnRvbmVdfWApO1xuICAgICAgZG9jLnJlY3QoYmFyWCwgYmFyWSwgYmFyVyAqIHRhcmdldC5maWxsLCBLUElfQkFSX0gsICdGJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHNwYXJrbGluZSBpbiBhIGJveCB1bmRlciB0aGUgY2FyZCdzIGxpbmVzLCBhcyB0aGUgc2NyZWVuIGRyYXdzIGl0XG4gIC8vIChrcGlTcGFya2xpbmVHZW9tZXRyeSwgYSAwLTEwMCBib3gpOiBhIHZlY3RvciBsaW5lIHBlciBydW4gb2YgdmFsdWVzLCBhXG4gIC8vIGRvdCBmb3IgYSBsb25lIHZhbHVlLCBhbmQgdGhlIGxhc3QgcG9pbnQncyBtYXJrZXIsIGhvbGxvdyB3aGlsZSBpdHMgcGVyaW9kXG4gIC8vIGlzIHBhcnRpYWwuXG4gIHByaXZhdGUgX2twaVNwYXJrbGluZShcbiAgICBkb2M6IGFueSxcbiAgICB2YWx1ZXM6IChudW1iZXIgfCBudWxsKVtdLFxuICAgIHBhcnRpYWw6IGJvb2xlYW4sXG4gICAgeDogbnVtYmVyLCB0b3A6IG51bWJlciwgdzogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IGtwaVNwYXJrbGluZUdlb21ldHJ5KHZhbHVlcywgcGFydGlhbCk7XG4gICAgY29uc3QgYm94VyA9IE1hdGgubWluKHcgKiAwLjcsIEtQSV9TUEFSS0xJTkVfVyk7XG4gICAgY29uc3QgYm94SCA9IEtQSV9IRUlHSFRTLnNwYXJrbGluZSAtIDIgKiBLUElfU1BBUktMSU5FX0lOU0VUO1xuICAgIGNvbnN0IGxlZnQgPSB4ICsgKHcgLSBib3hXKSAvIDI7XG4gICAgY29uc3QgYXQgPSAocG9pbnQ6IEtwaVNwYXJrbGluZVBvaW50KSA9PiAoe1xuICAgICAgeDogbGVmdCArIHBvaW50LnggKiBib3hXIC8gMTAwLFxuICAgICAgeTogdG9wICsgS1BJX1NQQVJLTElORV9JTlNFVCArIHBvaW50LnkgKiBib3hIIC8gMTAwLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbG9yID0gYCMke1JFUE9SVF9LUElfU1BBUktMSU5FX0NPTE9SfWA7XG5cbiAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICBkb2Muc2V0RmlsbENvbG9yKGNvbG9yKTtcbiAgICBkb2Muc2V0TGluZVdpZHRoKDEpO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGdlb21ldHJ5LmxpbmVzKSB7XG4gICAgICBjb25zdCBwb2ludHMgPSBsaW5lLnNwbGl0KCcgJykubWFwKChwYWlyKSA9PiB7XG4gICAgICAgIGNvbnN0IFtweCwgcHldID0gcGFpci5zcGxpdCgnLCcpLm1hcChOdW1iZXIpO1xuXG4gICAgICAgIHJldHVybiBhdCh7IHg6IHB4LCB5OiBweSB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3RlcHMgPSBwb2ludHMuc2xpY2UoMSkubWFwKChwb2ludCwgaW5kZXgpID0+IFtwb2ludC54IC0gcG9pbnRzW2luZGV4XS54LCBwb2ludC55IC0gcG9pbnRzW2luZGV4XS55XSk7XG5cbiAgICAgIGRvYy5saW5lcyhzdGVwcywgcG9pbnRzWzBdLngsIHBvaW50c1swXS55LCBbMSwgMV0sICdTJywgZmFsc2UpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZG90IG9mIGdlb21ldHJ5LmRvdHMpIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gYXQoZG90KTtcbiAgICAgIGRvYy5jaXJjbGUocG9pbnQueCwgcG9pbnQueSwgS1BJX0RPVF9SLCAnRicpO1xuICAgIH1cblxuICAgIGlmIChnZW9tZXRyeS5sYXN0KSB7XG4gICAgICBjb25zdCBwb2ludCA9IGF0KGdlb21ldHJ5Lmxhc3QpO1xuXG4gICAgICBpZiAoZ2VvbWV0cnkubGFzdC5ob2xsb3cpIHtcbiAgICAgICAgZG9jLnNldEZpbGxDb2xvcignI2ZmZmZmZicpO1xuICAgICAgICBkb2MuY2lyY2xlKHBvaW50LngsIHBvaW50LnksIEtQSV9ET1RfUiwgJ0ZEJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2MuY2lyY2xlKHBvaW50LngsIHBvaW50LnksIEtQSV9ET1RfUiwgJ0YnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBIGZvcm1hdHRlZCB2YWx1ZSBhcyBqc1BERiBjYW4gZHJhdyBpdC4gSXRzIHN0YW5kYXJkIGZvbnRzIHdyaXRlIHRleHQgaW5cbiAgLy8gV2luQW5zaSwgd2hpY2ggaGFzIHRoZSBuby1icmVhayBzcGFjZSAoVSswMEEwLCBmci1DQSdzIGRpZ2l0IGdyb3VwaW5nKSBidXRcbiAgLy8gbm90IHRoZSBuYXJyb3cgb25lIChVKzIwMkYsIHdoaWNoIG90aGVyIGxvY2FsZXMgZ3JvdXAgYW5kIHNwYWNlIHdpdGgpLCB0aGVcbiAgLy8gdGhpbiBhbmQgaGFpciBzcGFjZXMgKFUrMjAwOSwgVSsyMDBBLCB3aGljaCBJbnRsIHB1dHMgYXJvdW5kIGEgZGF0ZVxuICAvLyByYW5nZSdzIGRhc2g6ICdTZXAgMSDigJMgMzAsIDIwMjYnKSwgdGhlIG1pbnVzIHNpZ24gKFUrMjIxMiwgc29tZSBsb2NhbGVzJ1xuICAvLyBuZWdhdGl2ZSBzaWduKSBvciBhIHJhbmsgY2hhbmdlJ3MgdHJpYW5nbGVzOiBlYWNoIHdvdWxkIHByaW50IGFzIHN0cmF5XG4gIC8vIGdseXBocy4gVGhlIG5hcnJvdyBzcGFjZSBiZWNvbWVzIGEgbm8tYnJlYWsgc3BhY2UsIHNvIGEgbnVtYmVyIHN0aWxsIG5ldmVyXG4gIC8vIHdyYXBzIGFjcm9zcyBhIGxpbmU7IHRoZSB0aGluIGFuZCBoYWlyIHNwYWNlcyBhIHBsYWluIHNwYWNlOyB0aGUgbWludXNcbiAgLy8gc2lnbiBhIGh5cGhlbjsgYW5kIGEgcmFuaydzIHJpc2UgYSBwbHVzIHNpZ24gYW5kIGl0cyBmYWxsIGEgaHlwaGVuXG4gIC8vICgn4payIDInIHJlYWRzICcrMicpLlxuICBwcml2YXRlIF9wZGZUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRleHRcbiAgICAgIC5yZXBsYWNlKC9cXHUyMDJGL2csICdcXHUwMEEwJylcbiAgICAgIC5yZXBsYWNlKC9bXFx1MjAwOVxcdTIwMEFdL2csICcgJylcbiAgICAgIC5yZXBsYWNlKC9cXHUyMjEyL2csICctJylcbiAgICAgIC5yZXBsYWNlKC9cXHUyNUIyXFxzPy9nLCAnKycpXG4gICAgICAucmVwbGFjZSgvXFx1MjVCQ1xccz8vZywgJy0nKTtcbiAgfVxuXG4gIC8vIEEgbGF5ZXIncyB2YWx1ZXMgd2l0aCBlYWNoIG51bWJlciBhcyBqc1BERiBjYW4gZHJhdyBpdCAoX3BkZlRleHQpLCBzbyBhXG4gIC8vIHZhbHVlIGdyb3VwZWQgd2l0aCBuYXJyb3cgc3BhY2VzIHJlYWRzLCBhbmQgd3JhcHMsIGxpa2UgYW55IG90aGVyIG51bWJlci5cbiAgcHJpdmF0ZSBfcGRmVmFsdWVzKHZhbHVlczogUmVjb3JkPHN0cmluZywgVGV4dFZhbHVlPik6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT4ge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModmFsdWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgdmFsdWUudGV4dCA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7IC4uLnZhbHVlLCB0ZXh0OiB0aGlzLl9wZGZUZXh0KHZhbHVlLnRleHQpIH0sXG4gICAgXSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2x1ZyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tK3wtKyQvZywgJycpIHx8ICdyZXBvcnQnO1xuICB9XG59XG4iXX0=
|