@appius-fr/apx 2.7.1 → 2.8.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/dist/APX.dev.mjs CHANGED
@@ -191,74 +191,74 @@ __webpack_require__.r(__webpack_exports__);
191
191
 
192
192
  var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
193
193
  // Module
194
- ___CSS_LOADER_EXPORT___.push([module.id, `/* APX Scrollable Table: scrollable tbody with fixed thead/tfoot and aligned columns (CSS Grid + subgrid)
195
- Use !important so page styles (e.g. display: table) do not override the grid layout. */
196
-
197
- /* --apx-scrollable-template-columns: set by JS (measured widths + gutter); fallback = equal columns + gutter */
198
- /* --apx-scrollable-gutter-width: space for vertical scrollbar so it does not overlap the last column (set to 0 to allow overlap) */
199
- /* --apx-scrollable-body-height: when class apx-scrollable-table--body-height is set, tbody row uses fixed height instead of max-height */
200
- .apx-scrollable-table {
201
- display: grid !important;
202
- grid-template-columns: var(--apx-scrollable-template-columns, repeat(var(--apx-scrollable-cols, 3), minmax(0, 1fr)) minmax(var(--apx-scrollable-gutter-width, 17px), var(--apx-scrollable-gutter-width, 17px)));
203
- grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;
204
- width: 100%;
205
- table-layout: unset !important;
206
- }
207
-
208
- .apx-scrollable-table--body-height {
209
- --apx-scrollable-body-row-size: var(--apx-scrollable-body-max-height, 200px);
210
- }
211
-
212
- /* Table with no tfoot: thead + tbody only */
213
- .apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {
214
- grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));
215
- }
216
-
217
- /* Table with no thead: tbody + tfoot only */
218
- .apx-scrollable-table.apx-scrollable-table--no-thead {
219
- grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;
220
- }
221
-
222
- /* Table with neither thead nor tfoot: tbody only */
223
- .apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {
224
- grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));
225
- }
226
-
227
- /* --apx-scrollable-*-template-rows: set by JS (measured heights) or override in CSS / via options */
228
- .apx-scrollable-table > thead,
229
- .apx-scrollable-table > tbody,
230
- .apx-scrollable-table > tfoot {
231
- display: grid !important;
232
- grid-template-columns: subgrid;
233
- grid-column: 1 / -1;
234
- min-height: 0;
235
- }
236
-
237
- .apx-scrollable-table > thead {
238
- grid-template-rows: var(--apx-scrollable-thead-template-rows, repeat(var(--apx-scrollable-thead-rows, 1), auto));
239
- }
240
-
241
- .apx-scrollable-table > tbody {
242
- grid-template-rows: var(--apx-scrollable-tbody-template-rows, repeat(var(--apx-scrollable-tbody-rows, 1), auto));
243
- overflow: auto;
244
- }
245
-
246
- .apx-scrollable-table > tfoot {
247
- grid-template-rows: var(--apx-scrollable-tfoot-template-rows, repeat(var(--apx-scrollable-tfoot-rows, 1), auto));
248
- }
249
-
250
- .apx-scrollable-table > thead > tr,
251
- .apx-scrollable-table > tbody > tr,
252
- .apx-scrollable-table > tfoot > tr {
253
- display: contents !important;
254
- }
255
-
256
- .apx-scrollable-table th,
257
- .apx-scrollable-table td {
258
- min-width: 0;
259
- box-sizing: border-box;
260
- }
261
- `, "",{"version":3,"sources":["webpack://./modules/scrollableTable/css/scrollableTable.css"],"names":[],"mappings":"AAAA;yFACyF;;AAEzF,+GAA+G;AAC/G,mIAAmI;AACnI,yIAAyI;AACzI;IACI,wBAAwB;IACxB,+MAA+M;IAC/M,4HAA4H;IAC5H,WAAW;IACX,8BAA8B;AAClC;;AAEA;IACI,4EAA4E;AAChF;;AAEA,4CAA4C;AAC5C;IACI,uHAAuH;AAC3H;;AAEA,4CAA4C;AAC5C;IACI,uHAAuH;AAC3H;;AAEA,mDAAmD;AACnD;IACI,kHAAkH;AACtH;;AAEA,oGAAoG;AACpG;;;IAGI,wBAAwB;IACxB,8BAA8B;IAC9B,mBAAmB;IACnB,aAAa;AACjB;;AAEA;IACI,gHAAgH;AACpH;;AAEA;IACI,gHAAgH;IAChH,cAAc;AAClB;;AAEA;IACI,gHAAgH;AACpH;;AAEA;;;IAGI,4BAA4B;AAChC;;AAEA;;IAEI,YAAY;IACZ,sBAAsB;AAC1B","sourcesContent":["/* APX Scrollable Table: scrollable tbody with fixed thead/tfoot and aligned columns (CSS Grid + subgrid)\r\n Use !important so page styles (e.g. display: table) do not override the grid layout. */\r\n\r\n/* --apx-scrollable-template-columns: set by JS (measured widths + gutter); fallback = equal columns + gutter */\r\n/* --apx-scrollable-gutter-width: space for vertical scrollbar so it does not overlap the last column (set to 0 to allow overlap) */\r\n/* --apx-scrollable-body-height: when class apx-scrollable-table--body-height is set, tbody row uses fixed height instead of max-height */\r\n.apx-scrollable-table {\r\n display: grid !important;\r\n grid-template-columns: var(--apx-scrollable-template-columns, repeat(var(--apx-scrollable-cols, 3), minmax(0, 1fr)) minmax(var(--apx-scrollable-gutter-width, 17px), var(--apx-scrollable-gutter-width, 17px)));\r\n grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;\r\n width: 100%;\r\n table-layout: unset !important;\r\n}\r\n\r\n.apx-scrollable-table--body-height {\r\n --apx-scrollable-body-row-size: var(--apx-scrollable-body-max-height, 200px);\r\n}\r\n\r\n/* Table with no tfoot: thead + tbody only */\r\n.apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {\r\n grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));\r\n}\r\n\r\n/* Table with no thead: tbody + tfoot only */\r\n.apx-scrollable-table.apx-scrollable-table--no-thead {\r\n grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;\r\n}\r\n\r\n/* Table with neither thead nor tfoot: tbody only */\r\n.apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {\r\n grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));\r\n}\r\n\r\n/* --apx-scrollable-*-template-rows: set by JS (measured heights) or override in CSS / via options */\r\n.apx-scrollable-table > thead,\r\n.apx-scrollable-table > tbody,\r\n.apx-scrollable-table > tfoot {\r\n display: grid !important;\r\n grid-template-columns: subgrid;\r\n grid-column: 1 / -1;\r\n min-height: 0;\r\n}\r\n\r\n.apx-scrollable-table > thead {\r\n grid-template-rows: var(--apx-scrollable-thead-template-rows, repeat(var(--apx-scrollable-thead-rows, 1), auto));\r\n}\r\n\r\n.apx-scrollable-table > tbody {\r\n grid-template-rows: var(--apx-scrollable-tbody-template-rows, repeat(var(--apx-scrollable-tbody-rows, 1), auto));\r\n overflow: auto;\r\n}\r\n\r\n.apx-scrollable-table > tfoot {\r\n grid-template-rows: var(--apx-scrollable-tfoot-template-rows, repeat(var(--apx-scrollable-tfoot-rows, 1), auto));\r\n}\r\n\r\n.apx-scrollable-table > thead > tr,\r\n.apx-scrollable-table > tbody > tr,\r\n.apx-scrollable-table > tfoot > tr {\r\n display: contents !important;\r\n}\r\n\r\n.apx-scrollable-table th,\r\n.apx-scrollable-table td {\r\n min-width: 0;\r\n box-sizing: border-box;\r\n}\r\n"],"sourceRoot":""}]);
194
+ ___CSS_LOADER_EXPORT___.push([module.id, `/* APX Scrollable Table: scrollable tbody with fixed thead/tfoot and aligned columns (CSS Grid + subgrid)
195
+ Use !important so page styles (e.g. display: table) do not override the grid layout. */
196
+
197
+ /* --apx-scrollable-template-columns: set by JS (measured widths + gutter); fallback = equal columns + gutter */
198
+ /* --apx-scrollable-gutter-width: space for vertical scrollbar so it does not overlap the last column (set to 0 to allow overlap) */
199
+ /* --apx-scrollable-body-height: when class apx-scrollable-table--body-height is set, tbody row uses fixed height instead of max-height */
200
+ .apx-scrollable-table {
201
+ display: grid !important;
202
+ grid-template-columns: var(--apx-scrollable-template-columns, repeat(var(--apx-scrollable-cols, 3), minmax(0, 1fr)) minmax(var(--apx-scrollable-gutter-width, 17px), var(--apx-scrollable-gutter-width, 17px)));
203
+ grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;
204
+ width: 100%;
205
+ table-layout: unset !important;
206
+ }
207
+
208
+ .apx-scrollable-table--body-height {
209
+ --apx-scrollable-body-row-size: var(--apx-scrollable-body-max-height, 200px);
210
+ }
211
+
212
+ /* Table with no tfoot: thead + tbody only */
213
+ .apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {
214
+ grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));
215
+ }
216
+
217
+ /* Table with no thead: tbody + tfoot only */
218
+ .apx-scrollable-table.apx-scrollable-table--no-thead {
219
+ grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;
220
+ }
221
+
222
+ /* Table with neither thead nor tfoot: tbody only */
223
+ .apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {
224
+ grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));
225
+ }
226
+
227
+ /* --apx-scrollable-*-template-rows: set by JS (measured heights) or override in CSS / via options */
228
+ .apx-scrollable-table > thead,
229
+ .apx-scrollable-table > tbody,
230
+ .apx-scrollable-table > tfoot {
231
+ display: grid !important;
232
+ grid-template-columns: subgrid;
233
+ grid-column: 1 / -1;
234
+ min-height: 0;
235
+ }
236
+
237
+ .apx-scrollable-table > thead {
238
+ grid-template-rows: var(--apx-scrollable-thead-template-rows, repeat(var(--apx-scrollable-thead-rows, 1), auto));
239
+ }
240
+
241
+ .apx-scrollable-table > tbody {
242
+ grid-template-rows: var(--apx-scrollable-tbody-template-rows, repeat(var(--apx-scrollable-tbody-rows, 1), auto));
243
+ overflow: auto;
244
+ }
245
+
246
+ .apx-scrollable-table > tfoot {
247
+ grid-template-rows: var(--apx-scrollable-tfoot-template-rows, repeat(var(--apx-scrollable-tfoot-rows, 1), auto));
248
+ }
249
+
250
+ .apx-scrollable-table > thead > tr,
251
+ .apx-scrollable-table > tbody > tr,
252
+ .apx-scrollable-table > tfoot > tr {
253
+ display: contents !important;
254
+ }
255
+
256
+ .apx-scrollable-table th,
257
+ .apx-scrollable-table td {
258
+ min-width: 0;
259
+ box-sizing: border-box;
260
+ }
261
+ `, "",{"version":3,"sources":["webpack://./modules/scrollableTable/css/scrollableTable.css"],"names":[],"mappings":"AAAA;yFACyF;;AAEzF,+GAA+G;AAC/G,mIAAmI;AACnI,yIAAyI;AACzI;IACI,wBAAwB;IACxB,+MAA+M;IAC/M,4HAA4H;IAC5H,WAAW;IACX,8BAA8B;AAClC;;AAEA;IACI,4EAA4E;AAChF;;AAEA,4CAA4C;AAC5C;IACI,uHAAuH;AAC3H;;AAEA,4CAA4C;AAC5C;IACI,uHAAuH;AAC3H;;AAEA,mDAAmD;AACnD;IACI,kHAAkH;AACtH;;AAEA,oGAAoG;AACpG;;;IAGI,wBAAwB;IACxB,8BAA8B;IAC9B,mBAAmB;IACnB,aAAa;AACjB;;AAEA;IACI,gHAAgH;AACpH;;AAEA;IACI,gHAAgH;IAChH,cAAc;AAClB;;AAEA;IACI,gHAAgH;AACpH;;AAEA;;;IAGI,4BAA4B;AAChC;;AAEA;;IAEI,YAAY;IACZ,sBAAsB;AAC1B","sourcesContent":["/* APX Scrollable Table: scrollable tbody with fixed thead/tfoot and aligned columns (CSS Grid + subgrid)\n Use !important so page styles (e.g. display: table) do not override the grid layout. */\n\n/* --apx-scrollable-template-columns: set by JS (measured widths + gutter); fallback = equal columns + gutter */\n/* --apx-scrollable-gutter-width: space for vertical scrollbar so it does not overlap the last column (set to 0 to allow overlap) */\n/* --apx-scrollable-body-height: when class apx-scrollable-table--body-height is set, tbody row uses fixed height instead of max-height */\n.apx-scrollable-table {\n display: grid !important;\n grid-template-columns: var(--apx-scrollable-template-columns, repeat(var(--apx-scrollable-cols, 3), minmax(0, 1fr)) minmax(var(--apx-scrollable-gutter-width, 17px), var(--apx-scrollable-gutter-width, 17px)));\n grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;\n width: 100%;\n table-layout: unset !important;\n}\n\n.apx-scrollable-table--body-height {\n --apx-scrollable-body-row-size: var(--apx-scrollable-body-max-height, 200px);\n}\n\n/* Table with no tfoot: thead + tbody only */\n.apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {\n grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));\n}\n\n/* Table with no thead: tbody + tfoot only */\n.apx-scrollable-table.apx-scrollable-table--no-thead {\n grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;\n}\n\n/* Table with neither thead nor tfoot: tbody only */\n.apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {\n grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));\n}\n\n/* --apx-scrollable-*-template-rows: set by JS (measured heights) or override in CSS / via options */\n.apx-scrollable-table > thead,\n.apx-scrollable-table > tbody,\n.apx-scrollable-table > tfoot {\n display: grid !important;\n grid-template-columns: subgrid;\n grid-column: 1 / -1;\n min-height: 0;\n}\n\n.apx-scrollable-table > thead {\n grid-template-rows: var(--apx-scrollable-thead-template-rows, repeat(var(--apx-scrollable-thead-rows, 1), auto));\n}\n\n.apx-scrollable-table > tbody {\n grid-template-rows: var(--apx-scrollable-tbody-template-rows, repeat(var(--apx-scrollable-tbody-rows, 1), auto));\n overflow: auto;\n}\n\n.apx-scrollable-table > tfoot {\n grid-template-rows: var(--apx-scrollable-tfoot-template-rows, repeat(var(--apx-scrollable-tfoot-rows, 1), auto));\n}\n\n.apx-scrollable-table > thead > tr,\n.apx-scrollable-table > tbody > tr,\n.apx-scrollable-table > tfoot > tr {\n display: contents !important;\n}\n\n.apx-scrollable-table th,\n.apx-scrollable-table td {\n min-width: 0;\n box-sizing: border-box;\n}\n"],"sourceRoot":""}]);
262
262
  // Exports
263
263
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
264
264
 
@@ -1252,35 +1252,6 @@ module.exports = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%
1252
1252
 
1253
1253
  module.exports = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 8L24 24M24 8L8 24%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E";
1254
1254
 
1255
- /***/ }),
1256
-
1257
- /***/ "./modules/common.mjs":
1258
- /*!****************************!*\
1259
- !*** ./modules/common.mjs ***!
1260
- \****************************/
1261
- /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
1262
-
1263
- __webpack_require__.r(__webpack_exports__);
1264
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1265
- /* harmony export */ loadCss: () => (/* binding */ loadCss)
1266
- /* harmony export */ });
1267
- // Function to load the CSS from a given URL
1268
- function loadCss(url) {
1269
- return fetch(url)
1270
- .then(response => response.text())
1271
- .then(css => {
1272
- const styleSheet = document.createElement("style");
1273
- styleSheet.type = "text/css";
1274
- styleSheet.textContent = css; // Use textContent instead of innerText
1275
- document.head.appendChild(styleSheet);
1276
- })
1277
- .catch(error => {
1278
- console.error("Failed to load CSS:", error);
1279
- });
1280
- }
1281
-
1282
-
1283
-
1284
1255
  /***/ }),
1285
1256
 
1286
1257
  /***/ "./modules/dialog/dialog.mjs":
@@ -1782,583 +1753,601 @@ __webpack_require__.r(__webpack_exports__);
1782
1753
  /* harmony export */ "default": () => (/* binding */ augmentWithScrollableTable)
1783
1754
  /* harmony export */ });
1784
1755
  /* harmony import */ var _css_scrollableTable_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./css/scrollableTable.css */ "./modules/scrollableTable/css/scrollableTable.css");
1785
-
1786
-
1787
- const DATA_KEY = '_apxScrollableTable';
1788
- const CLASS_TABLE = 'apx-scrollable-table';
1789
-
1790
- const DEFAULT_MAX_HEIGHT = '200px';
1791
-
1792
- const THROTTLE_MS = 16;
1793
-
1794
- /** @type {Set<HTMLTableElement>} */
1795
- const dynamicTables = new Set();
1796
- /** @type {Map<Element, Set<HTMLTableElement>>} */
1797
- const scrollSourceToTables = new Map();
1798
- /** @type {Map<Element, Set<HTMLTableElement>>} */
1799
- const resizeSourceToTables = new Map();
1800
- /** @type {boolean} */
1801
- let resizeWindowAttached = false;
1802
- /** @type {ResizeObserver|null} */
1803
- let resizeObserver = null;
1804
- /** @type {number} */
1805
- let throttleLast = 0;
1806
- /** @type {number|null} */
1807
- let throttleRaf = null;
1808
-
1809
- /**
1810
- * Sum of colspans for one row (direct th/td children of tr).
1811
- * @param {HTMLTableRowElement} tr
1812
- * @returns {number}
1813
- */
1814
- function getRowColumnCount(tr) {
1815
- let cols = 0;
1816
- tr.querySelectorAll(':scope > th, :scope > td').forEach((cell) => {
1817
- cols += parseInt(cell.getAttribute('colspan'), 10) || 1;
1818
- });
1819
- return cols;
1820
- }
1821
-
1822
- /**
1823
- * Get maximum column count in a section (max sum of colspans across all rows).
1824
- * @param {HTMLTableSectionElement} section - thead, tbody, or tfoot
1825
- * @returns {number}
1826
- */
1827
- function getColumnCountFromSection(section) {
1828
- if (!section) return 0;
1829
- const rows = section.querySelectorAll(':scope > tr');
1830
- let maxCols = 0;
1831
- rows.forEach((tr) => {
1832
- const sum = getRowColumnCount(tr);
1833
- if (sum > maxCols) maxCols = sum;
1834
- });
1835
- return maxCols;
1836
- }
1837
-
1838
- /**
1839
- * Get total column count for the table (max across thead, tbody, tfoot).
1840
- * @param {HTMLTableElement} table
1841
- * @returns {number}
1842
- */
1843
- function getTableColumnCount(table) {
1844
- const thead = table.querySelector('thead');
1845
- const tbody = table.querySelector('tbody');
1846
- const tfoot = table.querySelector('tfoot');
1847
- const countThead = thead ? getColumnCountFromSection(thead) : 0;
1848
- const countTbody = tbody ? getColumnCountFromSection(tbody) : 0;
1849
- const countTfoot = tfoot ? getColumnCountFromSection(tfoot) : 0;
1850
- return Math.max(countThead, countTbody, countTfoot, 1);
1851
- }
1852
-
1853
- /**
1854
- * Measure current column widths from the table in its natural layout (before applying scrollable class).
1855
- * Prefers a row where each cell has colspan 1 so we get one width per column; otherwise splits cell widths by colspan.
1856
- * @param {HTMLTableElement} table - table not yet with scrollable class
1857
- * @param {number} numCols
1858
- * @returns {number[]} pixel widths per column
1859
- */
1860
- function measureColumnWidths(table, numCols) {
1861
- const thead = table.querySelector('thead');
1862
- const tbody = table.querySelector('tbody');
1863
- const sections = [thead, tbody].filter(Boolean);
1864
- /** @type {HTMLTableRowElement|null} */
1865
- let bestRow = null;
1866
- for (const section of sections) {
1867
- const rows = section.querySelectorAll(':scope > tr');
1868
- for (const tr of rows) {
1869
- const cells = tr.querySelectorAll(':scope > th, :scope > td');
1870
- if (getRowColumnCount(tr) !== numCols) continue;
1871
- const allSingle = Array.from(cells).every((c) => (parseInt(c.getAttribute('colspan'), 10) || 1) === 1);
1872
- if (allSingle && cells.length === numCols) {
1873
- bestRow = tr;
1874
- break;
1875
- }
1876
- if (!bestRow) bestRow = tr;
1877
- }
1878
- if (bestRow && Array.from(bestRow.querySelectorAll(':scope > th, :scope > td')).every((c) => (parseInt(c.getAttribute('colspan'), 10) || 1) === 1))
1879
- break;
1880
- }
1881
- if (!bestRow) return [];
1882
-
1883
- const widths = new Array(numCols).fill(0);
1884
- const cells = bestRow.querySelectorAll(':scope > th, :scope > td');
1885
- let col = 0;
1886
- for (const cell of cells) {
1887
- const span = Math.min(parseInt(cell.getAttribute('colspan'), 10) || 1, numCols - col);
1888
- if (span <= 0) break;
1889
- const w = cell.getBoundingClientRect().width;
1890
- const perCol = w / span;
1891
- for (let i = 0; i < span; i++) widths[col + i] = perCol;
1892
- col += span;
1893
- }
1894
- if (col === 0) return [];
1895
- const fallback = widths.some((w) => w > 0) ? Math.max(80, ...widths.filter((w) => w > 0)) / 2 : 80;
1896
- for (let i = 0; i < numCols; i++) if (widths[i] <= 0) widths[i] = fallback;
1897
- return widths.slice(0, numCols);
1898
- }
1899
-
1900
- /**
1901
- * Count direct tr children in a section.
1902
- * @param {HTMLTableSectionElement} section
1903
- * @returns {number}
1904
- */
1905
- function getRowCount(section) {
1906
- if (!section) return 0;
1907
- return section.querySelectorAll(':scope > tr').length;
1908
- }
1909
-
1910
- /**
1911
- * Build a 2D grid of occupied slots for a section (for rowspan/colspan placement).
1912
- * Place each cell in DOM order; return a list of { cell, row, col, colspan, rowspan }.
1913
- * @param {HTMLTableSectionElement} section
1914
- * @param {number} numRows
1915
- * @param {number} numCols
1916
- * @returns {{ cell: HTMLTableCellElement, row: number, col: number, colspan: number, rowspan: number }[]}
1917
- */
1918
- function computeCellPlacements(section, numRows, numCols) {
1919
- if (!section || numRows === 0 || numCols === 0) return [];
1920
- const occupied = Array.from({ length: numRows }, () => Array(numCols).fill(false));
1921
- const placements = [];
1922
- const rows = section.querySelectorAll(':scope > tr');
1923
-
1924
- for (let r = 0; r < rows.length; r++) {
1925
- const tr = rows[r];
1926
- const cells = tr.querySelectorAll(':scope > th, :scope > td');
1927
- for (const cell of cells) {
1928
- const colspan = Math.min(parseInt(cell.getAttribute('colspan'), 10) || 1, numCols);
1929
- const rowspan = Math.min(parseInt(cell.getAttribute('rowspan'), 10) || 1, numRows - r);
1930
- let col = 0;
1931
- while (col < numCols) {
1932
- let free = true;
1933
- for (let rr = r; rr < r + rowspan && free; rr++) {
1934
- for (let cc = col; cc < col + colspan && free; cc++) {
1935
- if (occupied[rr]?.[cc]) free = false;
1936
- }
1937
- }
1938
- if (free) break;
1939
- col++;
1940
- }
1941
- if (col + colspan > numCols) continue;
1942
- for (let rr = r; rr < r + rowspan; rr++) {
1943
- for (let cc = col; cc < col + colspan; cc++) {
1944
- if (occupied[rr]) occupied[rr][cc] = true;
1945
- }
1946
- }
1947
- placements.push({ cell, row: r, col, colspan, rowspan });
1948
- }
1949
- }
1950
- return placements;
1951
- }
1952
-
1953
- /**
1954
- * Apply grid placement styles to a list of placements (1-based line numbers for CSS Grid).
1955
- */
1956
- function applyPlacements(placements) {
1957
- placements.forEach(({ cell, row, col, colspan, rowspan }) => {
1958
- cell.style.gridRow = `${row + 1} / span ${rowspan}`;
1959
- cell.style.gridColumn = `${col + 1} / span ${colspan}`;
1960
- });
1961
- }
1962
-
1963
- /**
1964
- * Clear grid placement styles from all th/td in a table (for refresh).
1965
- * @param {HTMLTableElement} table
1966
- */
1967
- function clearPlacements(table) {
1968
- table.querySelectorAll('th, td').forEach((cell) => {
1969
- cell.style.gridRow = '';
1970
- cell.style.gridColumn = '';
1971
- });
1972
- }
1973
-
1974
- /**
1975
- * Normalize height/maxHeight option to a CSS length string.
1976
- * @param {number|string} value
1977
- * @returns {string}
1978
- */
1979
- function normalizeHeight(value) {
1980
- if (value == null) return DEFAULT_MAX_HEIGHT;
1981
- if (typeof value === 'number') return `${value}px`;
1982
- return String(value);
1983
- }
1984
-
1985
- /**
1986
- * Resolve current body height from options: either bodyHeightDynamic.get(table) or static height/maxHeight.
1987
- * @param {Object} options - scrollableTable options (may include bodyHeightDynamic, height, maxHeight)
1988
- * @param {HTMLTableElement} table
1989
- * @returns {{ bodySize: string, useFixedHeight: boolean }}
1990
- */
1991
- function resolveBodyHeight(options, table) {
1992
- const dyn = options.bodyHeightDynamic;
1993
- if (dyn && typeof dyn.get === 'function') {
1994
- const value = dyn.get(table);
1995
- const bodySize = normalizeHeight(value);
1996
- const useFixedHeight = dyn.useAs === 'height';
1997
- return { bodySize, useFixedHeight };
1998
- }
1999
- const useFixedHeight = options.height != null;
2000
- const raw = useFixedHeight ? options.height : options.maxHeight;
2001
- const bodySize = normalizeHeight(raw);
2002
- return { bodySize, useFixedHeight };
2003
- }
2004
-
2005
- /**
2006
- * Update only the tbody height CSS variable and class (used on scroll/resize for dynamic height).
2007
- * @param {HTMLTableElement} table
2008
- * @param {Object} options - full scrollableTable options (with ref.options when called from throttle)
2009
- */
2010
- function updateTableBodyHeight(table, options) {
2011
- const { bodySize, useFixedHeight } = resolveBodyHeight(options, table);
2012
- table.style.setProperty('--apx-scrollable-body-max-height', bodySize);
2013
- table.classList.toggle('apx-scrollable-table--body-height', useFixedHeight);
2014
- }
2015
-
2016
- /**
2017
- * Run lazy cleanup then updateTableBodyHeight for all tables still in dynamicTables. (Called by throttled entry point or RAF.)
2018
- */
2019
- function flushDynamicHeightUpdate() {
2020
- const toRemove = [];
2021
- dynamicTables.forEach((table) => {
2022
- if (!table.isConnected) toRemove.push(table);
2023
- });
2024
- toRemove.forEach((table) => removeTableFromDynamicSources(table));
2025
- dynamicTables.forEach((table) => {
2026
- const ref = table[DATA_KEY];
2027
- if (ref?.options) updateTableBodyHeight(table, ref.options);
2028
- });
2029
- }
2030
-
2031
- /**
2032
- * Throttled entry: run flushDynamicHeightUpdate now or schedule with RAF.
2033
- */
2034
- function runDynamicHeightUpdate() {
2035
- const now = Date.now();
2036
- if (now - throttleLast < THROTTLE_MS) {
2037
- if (!throttleRaf) {
2038
- throttleRaf = requestAnimationFrame(() => {
2039
- throttleRaf = null;
2040
- throttleLast = Date.now();
2041
- flushDynamicHeightUpdate();
2042
- });
2043
- }
2044
- return;
2045
- }
2046
- throttleLast = now;
2047
- flushDynamicHeightUpdate();
2048
- }
2049
-
2050
- /**
2051
- * Resolve updateOn into scroll targets (Element[]) and resize: { window: boolean, elements: Element[] }.
2052
- * @param {Object} options - options.bodyHeightDynamic.updateOn
2053
- * @returns {{ scrollTargets: Element[], resizeWindow: boolean, resizeElements: Element[] }}
2054
- */
2055
- function resolveUpdateOn(options) {
2056
- const u = options?.bodyHeightDynamic?.updateOn;
2057
- const scrollOn = u?.scrollOn;
2058
- const resizeOn = u?.resizeOn;
2059
- const scrollTargets = [];
2060
- if (scrollOn != null && Array.isArray(scrollOn) && scrollOn.length > 0) {
2061
- scrollOn.forEach((x) => {
2062
- if (x === 'document') scrollTargets.push(document.documentElement);
2063
- else if (x && typeof x.addEventListener === 'function') scrollTargets.push(x);
2064
- });
2065
- } else if (u?.scroll === true) {
2066
- scrollTargets.push(document.documentElement);
2067
- scrollTargets.push(typeof window !== 'undefined' ? window : document.documentElement);
2068
- }
2069
- let resizeWindow = false;
2070
- const resizeElements = [];
2071
- if (resizeOn != null && Array.isArray(resizeOn) && resizeOn.length > 0) {
2072
- resizeOn.forEach((x) => {
2073
- if (x === 'window') resizeWindow = true;
2074
- else if (x && typeof x.addEventListener === 'function') resizeElements.push(x);
2075
- });
2076
- } else if (u?.resize !== false) {
2077
- resizeWindow = true;
2078
- resizeElements.push(document.documentElement);
2079
- }
2080
- return { scrollTargets, resizeWindow, resizeElements };
2081
- }
2082
-
2083
- /**
2084
- * Remove table from dynamicTables and from all scroll/resize Maps; detach listeners if Set becomes empty.
2085
- * @param {HTMLTableElement} table
2086
- */
2087
- function removeTableFromDynamicSources(table) {
2088
- dynamicTables.delete(table);
2089
- scrollSourceToTables.forEach((set, el) => {
2090
- set.delete(table);
2091
- if (set.size === 0) {
2092
- scrollSourceToTables.delete(el);
2093
- el.removeEventListener('scroll', onScrollThrottled);
2094
- }
2095
- });
2096
- resizeSourceToTables.forEach((set, el) => {
2097
- set.delete(table);
2098
- if (set.size === 0) {
2099
- resizeSourceToTables.delete(el);
2100
- if (resizeObserver) resizeObserver.unobserve(el);
2101
- }
2102
- });
2103
- if (resizeWindowAttached && dynamicTables.size === 0) {
2104
- window.removeEventListener('resize', onResizeThrottled);
2105
- resizeWindowAttached = false;
2106
- }
2107
- }
2108
-
2109
- function onScrollThrottled() {
2110
- runDynamicHeightUpdate();
2111
- }
2112
-
2113
- function onResizeThrottled() {
2114
- runDynamicHeightUpdate();
2115
- }
2116
-
2117
- /**
2118
- * Register a table with bodyHeightDynamic: add to Set and attach scroll/resize listeners per updateOn.
2119
- * @param {HTMLTableElement} table
2120
- * @param {Object} options - full options (ref.options)
2121
- */
2122
- function registerDynamicTable(table, options) {
2123
- const { scrollTargets, resizeWindow, resizeElements } = resolveUpdateOn(options);
2124
- dynamicTables.add(table);
2125
- scrollTargets.forEach((el) => {
2126
- let set = scrollSourceToTables.get(el);
2127
- if (!set) {
2128
- set = new Set();
2129
- scrollSourceToTables.set(el, set);
2130
- el.addEventListener('scroll', onScrollThrottled, { passive: true });
2131
- }
2132
- set.add(table);
2133
- });
2134
- if (resizeWindow) {
2135
- if (!resizeWindowAttached) {
2136
- resizeWindowAttached = true;
2137
- window.addEventListener('resize', onResizeThrottled, { passive: true });
2138
- }
2139
- }
2140
- resizeElements.forEach((el) => {
2141
- let set = resizeSourceToTables.get(el);
2142
- if (!set) {
2143
- set = new Set();
2144
- resizeSourceToTables.set(el, set);
2145
- if (!resizeObserver) resizeObserver = new ResizeObserver(onResizeThrottled);
2146
- resizeObserver.observe(el);
2147
- }
2148
- set.add(table);
2149
- });
2150
- }
2151
-
2152
- /**
2153
- * Build grid-template-columns from measured widths and optional overrides per column.
2154
- * @param {number} numCols
2155
- * @param {number[]} columnWidths
2156
- * @param {Object<number, string>|(string|null)[]} columnOverrides - map column index CSS value (e.g. '2fr'), or array; null/empty = use measured
2157
- * @returns {string}
2158
- */
2159
- function buildTemplateColumns(numCols, columnWidths, columnOverrides) {
2160
- if (!columnWidths || columnWidths.length !== numCols) return '';
2161
- const get = (i) =>
2162
- Array.isArray(columnOverrides) ? columnOverrides[i] : columnOverrides[i];
2163
- const parts = [];
2164
- for (let i = 0; i < numCols; i++) {
2165
- const ov = get(i);
2166
- if (ov != null && typeof ov === 'string' && ov.trim() !== '') {
2167
- parts.push(ov.trim());
2168
- } else {
2169
- parts.push(`${Math.round(columnWidths[i])}fr`);
2170
- }
2171
- }
2172
- return parts.join(' ');
2173
- }
2174
-
2175
- /**
2176
- * Build grid-template-rows from measured heights and optional overrides per row.
2177
- * @param {number} numRows
2178
- * @param {number[]} rowHeights
2179
- * @param {Object<number, string>|(string|null)[]} rowOverrides - map row index → CSS value (e.g. '48px', '2fr'), or array; null/empty = use measured
2180
- * @returns {string}
2181
- */
2182
- function buildTemplateRows(numRows, rowHeights, rowOverrides) {
2183
- if (!rowHeights || rowHeights.length < numRows) return '';
2184
- const get = (i) =>
2185
- Array.isArray(rowOverrides) ? rowOverrides[i] : rowOverrides?.[i];
2186
- const parts = [];
2187
- for (let i = 0; i < numRows; i++) {
2188
- const ov = get(i);
2189
- if (ov != null && typeof ov === 'string' && ov.trim() !== '') {
2190
- parts.push(ov.trim());
2191
- } else {
2192
- parts.push(`${Math.round(rowHeights[i] ?? 0)}px`);
2193
- }
2194
- }
2195
- return parts.join(' ');
2196
- }
2197
-
2198
- /**
2199
- * Measure each tr height in a section (table must not yet have scrollable class).
2200
- * @param {HTMLTableSectionElement|null} section
2201
- * @returns {number[]}
2202
- */
2203
- function measureRowHeights(section) {
2204
- if (!section) return [];
2205
- const rows = section.querySelectorAll(':scope > tr');
2206
- return Array.from(rows).map((tr) => tr.getBoundingClientRect().height);
2207
- }
2208
-
2209
- /**
2210
- * Apply scrollable table layout to a single table.
2211
- * @param {HTMLTableElement} table
2212
- * @param {Object} options - scrollableTable options
2213
- * @param {number|string} [options.maxHeight] - Max height of tbody (default '200px'). Ignored when height or bodyHeightDynamic is set.
2214
- * @param {number|string} [options.height] - Fixed height of tbody. Ignored when bodyHeightDynamic is set.
2215
- * @param {{ get: (function(HTMLTableElement): number|string), useAs: 'height'|'maxHeight', updateOn?: { scroll?: boolean, resize?: boolean, scrollOn?: ('document'|Element)[], resizeOn?: ('window'|Element)[] } }} [options.bodyHeightDynamic] - When set, body size is computed by get(table) and re-applied when scroll/resize sources fire. updateOn: scrollOn/resizeOn list elements (sentinels 'document'/'window'); or use scroll (default false) / resize (default true) booleans.
2216
- * @param {string} [options.gridTemplateColumns]
2217
- * @param {{ thead?: string, tbody?: string, tfoot?: string }} [options.gridTemplateRows]
2218
- * @param {{ thead?: Object<number, string>|(string|null)[], tbody?: Object<number, string>|(string|null)[], tfoot?: Object<number, string>|(string|null)[] }} [options.rowOverrides]
2219
- * @param {Object<number, string>|(string|null)[]} [options.columnOverrides]
2220
- * @param {{ columnWidths?: number[], rowHeights?: { thead?: number[], tbody?: number[], tfoot?: number[] } } | undefined} ref - existing ref when refreshing
2221
- */
2222
- function applyScrollableTable(table, options, ref) {
2223
- const thead = table.querySelector('thead');
2224
- const tbody = table.querySelector('tbody');
2225
- const tfoot = table.querySelector('tfoot');
2226
-
2227
- const numCols = getTableColumnCount(table);
2228
- if (numCols === 0) return;
2229
-
2230
- const alreadyScrollable = table.classList.contains(CLASS_TABLE);
2231
- const customTemplate = typeof options.gridTemplateColumns === 'string' && options.gridTemplateColumns.trim().length > 0;
2232
- const columnWidths = customTemplate
2233
- ? null
2234
- : (ref?.columnWidths ?? (alreadyScrollable ? null : measureColumnWidths(table, numCols)));
2235
-
2236
- const theadRows = getRowCount(thead);
2237
- const tbodyRows = getRowCount(tbody);
2238
- const tfootRows = getRowCount(tfoot);
2239
-
2240
- const rowHeights =
2241
- ref?.rowHeights ??
2242
- (alreadyScrollable
2243
- ? null
2244
- : {
2245
- thead: measureRowHeights(thead),
2246
- tbody: measureRowHeights(tbody),
2247
- tfoot: measureRowHeights(tfoot)
2248
- });
2249
-
2250
- table.style.setProperty('--apx-scrollable-cols', String(numCols));
2251
- table.style.setProperty('--apx-scrollable-thead-rows', String(Math.max(1, theadRows)));
2252
- table.style.setProperty('--apx-scrollable-tbody-rows', String(Math.max(1, tbodyRows)));
2253
- table.style.setProperty('--apx-scrollable-tfoot-rows', String(Math.max(1, tfootRows)));
2254
- const { bodySize, useFixedHeight } = resolveBodyHeight(options, table);
2255
- table.style.setProperty('--apx-scrollable-body-max-height', bodySize);
2256
- table.classList.toggle('apx-scrollable-table--body-height', useFixedHeight);
2257
-
2258
- table.classList.add(CLASS_TABLE);
2259
- table.classList.toggle('apx-scrollable-table--has-tfoot', !!(tfoot && tfootRows > 0));
2260
- table.classList.toggle('apx-scrollable-table--no-thead', !(thead && theadRows > 0));
2261
-
2262
- // Force reflow so the grid layout is established before setting measured template-columns.
2263
- // Without this, the browser batches class + template into one pass and the tbody overflows horizontally.
2264
- table.offsetHeight; // eslint-disable-line no-unused-expressions
2265
-
2266
- const gutterSuffix = ' minmax(var(--apx-scrollable-gutter-width, 17px), var(--apx-scrollable-gutter-width, 17px))';
2267
- if (customTemplate) {
2268
- table.style.setProperty('--apx-scrollable-template-columns', options.gridTemplateColumns.trim() + gutterSuffix);
2269
- } else if (columnWidths && columnWidths.length === numCols) {
2270
- const template =
2271
- options.columnOverrides != null
2272
- ? buildTemplateColumns(numCols, columnWidths, options.columnOverrides)
2273
- : columnWidths.map((w) => `${Math.round(w)}fr`).join(' ');
2274
- table.style.setProperty('--apx-scrollable-template-columns', template + gutterSuffix);
2275
- } else {
2276
- table.style.removeProperty('--apx-scrollable-template-columns');
2277
- }
2278
-
2279
- clearPlacements(table);
2280
-
2281
- const sections = [
2282
- { section: thead, rows: Math.max(1, theadRows), heights: rowHeights?.thead, key: 'thead' },
2283
- { section: tbody, rows: Math.max(1, tbodyRows), heights: rowHeights?.tbody, key: 'tbody' },
2284
- { section: tfoot, rows: Math.max(1, tfootRows), heights: rowHeights?.tfoot, key: 'tfoot' }
2285
- ];
2286
- const customRows = options.gridTemplateRows && typeof options.gridTemplateRows === 'object' ? options.gridTemplateRows : null;
2287
- const rowOverrides = options.rowOverrides && typeof options.rowOverrides === 'object' ? options.rowOverrides : null;
2288
- sections.forEach(({ section, rows, heights, key }) => {
2289
- if (!section) return;
2290
- const varName = `--apx-scrollable-${key}-template-rows`;
2291
- const custom = customRows?.[key];
2292
- const overrides = rowOverrides?.[key];
2293
- if (typeof custom === 'string' && custom.trim().length > 0) {
2294
- section.style.setProperty(varName, custom.trim());
2295
- } else if (heights && heights.length >= rows) {
2296
- const template =
2297
- overrides != null
2298
- ? buildTemplateRows(rows, heights.slice(0, rows), overrides)
2299
- : heights
2300
- .slice(0, rows)
2301
- .map((h) => `${Math.round(h)}px`)
2302
- .join(' ');
2303
- section.style.setProperty(varName, template);
2304
- } else {
2305
- section.style.removeProperty(varName);
2306
- }
2307
- const placements = computeCellPlacements(section, rows, numCols);
2308
- applyPlacements(placements);
2309
- });
2310
-
2311
- return { columnWidths, rowHeights };
2312
- }
2313
-
2314
- /**
2315
- * Augments the APX object with scrollableTable(options | 'refresh').
2316
- * Makes the tbody of a table scrollable while keeping thead/tfoot fixed and columns aligned (CSS Grid + subgrid).
2317
- *
2318
- * @param {Object} apx - The APX object to augment.
2319
- * @example
2320
- * APX('table.data-grid').scrollableTable({ maxHeight: 300 });
2321
- * APX('table.data-grid').scrollableTable('refresh');
2322
- */
2323
- function augmentWithScrollableTable(apx) {
2324
- apx.scrollableTable = function (optionsOrAction) {
2325
- const isRefresh = optionsOrAction === 'refresh';
2326
- const options = isRefresh ? null : (optionsOrAction && typeof optionsOrAction === 'object' ? optionsOrAction : {});
2327
-
2328
- apx.elements.forEach((element) => {
2329
- if (element.tagName !== 'TABLE') return;
2330
- const table = /** @type {HTMLTableElement} */ (element);
2331
-
2332
- const ref = table[DATA_KEY];
2333
- if (ref) {
2334
- if (isRefresh) {
2335
- applyScrollableTable(table, ref.options, ref);
2336
- } else if (options && Object.keys(options).length > 0) {
2337
- ref.options = { ...ref.options, ...options };
2338
- const result = applyScrollableTable(table, ref.options, ref);
2339
- if (result?.columnWidths) ref.columnWidths = result.columnWidths;
2340
- if (result?.rowHeights) ref.rowHeights = result.rowHeights;
2341
- }
2342
- const currentOptions = ref.options;
2343
- if (currentOptions?.bodyHeightDynamic) registerDynamicTable(table, currentOptions);
2344
- else removeTableFromDynamicSources(table);
2345
- return;
2346
- }
2347
- if (isRefresh) return;
2348
-
2349
- console.log('[APX scrollableTable] create', table);
2350
- const result = applyScrollableTable(table, options, undefined);
2351
- table[DATA_KEY] = {
2352
- options: { ...options },
2353
- columnWidths: result?.columnWidths || undefined,
2354
- rowHeights: result?.rowHeights || undefined
2355
- };
2356
- if (options?.bodyHeightDynamic) registerDynamicTable(table, options);
2357
- });
2358
-
2359
- return apx;
2360
- };
2361
- }
1756
+ /* harmony import */ var _tools_getScrollbarSize_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/getScrollbarSize.mjs */ "./modules/tools/getScrollbarSize.mjs");
1757
+
1758
+
1759
+
1760
+ const DATA_KEY = '_apxScrollableTable';
1761
+ const CLASS_TABLE = 'apx-scrollable-table';
1762
+
1763
+ const DEFAULT_MAX_HEIGHT = '200px';
1764
+ const DEFAULT_GUTTER_PX = 17;
1765
+
1766
+ const THROTTLE_MS = 16;
1767
+
1768
+ /** @type {Set<HTMLTableElement>} */
1769
+ const dynamicTables = new Set();
1770
+ /** @type {Map<Element, Set<HTMLTableElement>>} */
1771
+ const scrollSourceToTables = new Map();
1772
+ /** @type {Map<Element, Set<HTMLTableElement>>} */
1773
+ const resizeSourceToTables = new Map();
1774
+ /** @type {boolean} */
1775
+ let resizeWindowAttached = false;
1776
+ /** @type {ResizeObserver|null} */
1777
+ let resizeObserver = null;
1778
+ /** @type {number} */
1779
+ let throttleLast = 0;
1780
+ /** @type {number|null} */
1781
+ let throttleRaf = null;
1782
+
1783
+ /**
1784
+ * Sum of colspans for one row (direct th/td children of tr).
1785
+ * @param {HTMLTableRowElement} tr
1786
+ * @returns {number}
1787
+ */
1788
+ function getRowColumnCount(tr) {
1789
+ let cols = 0;
1790
+ tr.querySelectorAll(':scope > th, :scope > td').forEach((cell) => {
1791
+ cols += parseInt(cell.getAttribute('colspan'), 10) || 1;
1792
+ });
1793
+ return cols;
1794
+ }
1795
+
1796
+ /**
1797
+ * Get maximum column count in a section (max sum of colspans across all rows).
1798
+ * @param {HTMLTableSectionElement} section - thead, tbody, or tfoot
1799
+ * @returns {number}
1800
+ */
1801
+ function getColumnCountFromSection(section) {
1802
+ if (!section) return 0;
1803
+ const rows = section.querySelectorAll(':scope > tr');
1804
+ let maxCols = 0;
1805
+ rows.forEach((tr) => {
1806
+ const sum = getRowColumnCount(tr);
1807
+ if (sum > maxCols) maxCols = sum;
1808
+ });
1809
+ return maxCols;
1810
+ }
1811
+
1812
+ /**
1813
+ * Get total column count for the table (max across thead, tbody, tfoot).
1814
+ * @param {HTMLTableElement} table
1815
+ * @returns {number}
1816
+ */
1817
+ function getTableColumnCount(table) {
1818
+ const thead = table.querySelector('thead');
1819
+ const tbody = table.querySelector('tbody');
1820
+ const tfoot = table.querySelector('tfoot');
1821
+ const countThead = thead ? getColumnCountFromSection(thead) : 0;
1822
+ const countTbody = tbody ? getColumnCountFromSection(tbody) : 0;
1823
+ const countTfoot = tfoot ? getColumnCountFromSection(tfoot) : 0;
1824
+ return Math.max(countThead, countTbody, countTfoot, 1);
1825
+ }
1826
+
1827
+ /**
1828
+ * Measure current column widths from the table in its natural layout (before applying scrollable class).
1829
+ * Prefers a row where each cell has colspan 1 so we get one width per column; otherwise splits cell widths by colspan.
1830
+ * @param {HTMLTableElement} table - table not yet with scrollable class
1831
+ * @param {number} numCols
1832
+ * @returns {number[]} pixel widths per column
1833
+ */
1834
+ function measureColumnWidths(table, numCols) {
1835
+ const thead = table.querySelector('thead');
1836
+ const tbody = table.querySelector('tbody');
1837
+ const sections = [thead, tbody].filter(Boolean);
1838
+ /** @type {HTMLTableRowElement|null} */
1839
+ let bestRow = null;
1840
+ for (const section of sections) {
1841
+ const rows = section.querySelectorAll(':scope > tr');
1842
+ for (const tr of rows) {
1843
+ const cells = tr.querySelectorAll(':scope > th, :scope > td');
1844
+ if (getRowColumnCount(tr) !== numCols) continue;
1845
+ const allSingle = Array.from(cells).every((c) => (parseInt(c.getAttribute('colspan'), 10) || 1) === 1);
1846
+ if (allSingle && cells.length === numCols) {
1847
+ bestRow = tr;
1848
+ break;
1849
+ }
1850
+ if (!bestRow) bestRow = tr;
1851
+ }
1852
+ if (bestRow && Array.from(bestRow.querySelectorAll(':scope > th, :scope > td')).every((c) => (parseInt(c.getAttribute('colspan'), 10) || 1) === 1))
1853
+ break;
1854
+ }
1855
+ if (!bestRow) return [];
1856
+
1857
+ const widths = new Array(numCols).fill(0);
1858
+ const cells = bestRow.querySelectorAll(':scope > th, :scope > td');
1859
+ let col = 0;
1860
+ for (const cell of cells) {
1861
+ const span = Math.min(parseInt(cell.getAttribute('colspan'), 10) || 1, numCols - col);
1862
+ if (span <= 0) break;
1863
+ const w = cell.getBoundingClientRect().width;
1864
+ const perCol = w / span;
1865
+ for (let i = 0; i < span; i++) widths[col + i] = perCol;
1866
+ col += span;
1867
+ }
1868
+ if (col === 0) return [];
1869
+ const fallback = widths.some((w) => w > 0) ? Math.max(80, ...widths.filter((w) => w > 0)) / 2 : 80;
1870
+ for (let i = 0; i < numCols; i++) if (widths[i] <= 0) widths[i] = fallback;
1871
+ return widths.slice(0, numCols);
1872
+ }
1873
+
1874
+ /**
1875
+ * Count direct tr children in a section.
1876
+ * @param {HTMLTableSectionElement} section
1877
+ * @returns {number}
1878
+ */
1879
+ function getRowCount(section) {
1880
+ if (!section) return 0;
1881
+ return section.querySelectorAll(':scope > tr').length;
1882
+ }
1883
+
1884
+ /**
1885
+ * Build a 2D grid of occupied slots for a section (for rowspan/colspan placement).
1886
+ * Place each cell in DOM order; return a list of { cell, row, col, colspan, rowspan }.
1887
+ * @param {HTMLTableSectionElement} section
1888
+ * @param {number} numRows
1889
+ * @param {number} numCols
1890
+ * @returns {{ cell: HTMLTableCellElement, row: number, col: number, colspan: number, rowspan: number }[]}
1891
+ */
1892
+ function computeCellPlacements(section, numRows, numCols) {
1893
+ if (!section || numRows === 0 || numCols === 0) return [];
1894
+ const occupied = Array.from({ length: numRows }, () => Array(numCols).fill(false));
1895
+ const placements = [];
1896
+ const rows = section.querySelectorAll(':scope > tr');
1897
+
1898
+ for (let r = 0; r < rows.length; r++) {
1899
+ const tr = rows[r];
1900
+ const cells = tr.querySelectorAll(':scope > th, :scope > td');
1901
+ for (const cell of cells) {
1902
+ const colspan = Math.min(parseInt(cell.getAttribute('colspan'), 10) || 1, numCols);
1903
+ const rowspan = Math.min(parseInt(cell.getAttribute('rowspan'), 10) || 1, numRows - r);
1904
+ let col = 0;
1905
+ while (col < numCols) {
1906
+ let free = true;
1907
+ for (let rr = r; rr < r + rowspan && free; rr++) {
1908
+ for (let cc = col; cc < col + colspan && free; cc++) {
1909
+ if (occupied[rr]?.[cc]) free = false;
1910
+ }
1911
+ }
1912
+ if (free) break;
1913
+ col++;
1914
+ }
1915
+ if (col + colspan > numCols) continue;
1916
+ for (let rr = r; rr < r + rowspan; rr++) {
1917
+ for (let cc = col; cc < col + colspan; cc++) {
1918
+ if (occupied[rr]) occupied[rr][cc] = true;
1919
+ }
1920
+ }
1921
+ placements.push({ cell, row: r, col, colspan, rowspan });
1922
+ }
1923
+ }
1924
+ return placements;
1925
+ }
1926
+
1927
+ /**
1928
+ * Apply grid placement styles to a list of placements (1-based line numbers for CSS Grid).
1929
+ */
1930
+ function applyPlacements(placements) {
1931
+ placements.forEach(({ cell, row, col, colspan, rowspan }) => {
1932
+ cell.style.gridRow = `${row + 1} / span ${rowspan}`;
1933
+ cell.style.gridColumn = `${col + 1} / span ${colspan}`;
1934
+ });
1935
+ }
1936
+
1937
+ /**
1938
+ * Clear grid placement styles from all th/td in a table (for refresh).
1939
+ * @param {HTMLTableElement} table
1940
+ */
1941
+ function clearPlacements(table) {
1942
+ table.querySelectorAll('th, td').forEach((cell) => {
1943
+ cell.style.gridRow = '';
1944
+ cell.style.gridColumn = '';
1945
+ });
1946
+ }
1947
+
1948
+ /**
1949
+ * Normalize height/maxHeight option to a CSS length string.
1950
+ * @param {number|string} value
1951
+ * @returns {string}
1952
+ */
1953
+ function normalizeHeight(value) {
1954
+ if (value == null) return DEFAULT_MAX_HEIGHT;
1955
+ if (typeof value === 'number') return `${value}px`;
1956
+ return String(value);
1957
+ }
1958
+
1959
+ /**
1960
+ * Resolve current body height from options: either bodyHeightDynamic.get(table) or static height/maxHeight.
1961
+ * @param {Object} options - scrollableTable options (may include bodyHeightDynamic, height, maxHeight)
1962
+ * @param {HTMLTableElement} table
1963
+ * @returns {{ bodySize: string, useFixedHeight: boolean }}
1964
+ */
1965
+ function resolveBodyHeight(options, table) {
1966
+ const dyn = options.bodyHeightDynamic;
1967
+ if (dyn && typeof dyn.get === 'function') {
1968
+ const value = dyn.get(table);
1969
+ const bodySize = normalizeHeight(value);
1970
+ const useFixedHeight = dyn.useAs === 'height';
1971
+ return { bodySize, useFixedHeight };
1972
+ }
1973
+ const useFixedHeight = options.height != null;
1974
+ const raw = useFixedHeight ? options.height : options.maxHeight;
1975
+ const bodySize = normalizeHeight(raw);
1976
+ return { bodySize, useFixedHeight };
1977
+ }
1978
+
1979
+ /**
1980
+ * Update only the tbody height CSS variable and class (used on scroll/resize for dynamic height).
1981
+ * @param {HTMLTableElement} table
1982
+ * @param {Object} options - full scrollableTable options (with ref.options when called from throttle)
1983
+ */
1984
+ function updateTableBodyHeight(table, options) {
1985
+ const { bodySize, useFixedHeight } = resolveBodyHeight(options, table);
1986
+ table.style.setProperty('--apx-scrollable-body-max-height', bodySize);
1987
+ table.classList.toggle('apx-scrollable-table--body-height', useFixedHeight);
1988
+ }
1989
+
1990
+ /**
1991
+ * Run lazy cleanup then updateTableBodyHeight for all tables still in dynamicTables. (Called by throttled entry point or RAF.)
1992
+ */
1993
+ function flushDynamicHeightUpdate() {
1994
+ const toRemove = [];
1995
+ dynamicTables.forEach((table) => {
1996
+ if (!table.isConnected) toRemove.push(table);
1997
+ });
1998
+ toRemove.forEach((table) => removeTableFromDynamicSources(table));
1999
+ dynamicTables.forEach((table) => {
2000
+ const ref = table[DATA_KEY];
2001
+ if (ref?.options) updateTableBodyHeight(table, ref.options);
2002
+ });
2003
+ }
2004
+
2005
+ /**
2006
+ * Throttled entry: run flushDynamicHeightUpdate now or schedule with RAF.
2007
+ */
2008
+ function runDynamicHeightUpdate() {
2009
+ const now = Date.now();
2010
+ if (now - throttleLast < THROTTLE_MS) {
2011
+ if (!throttleRaf) {
2012
+ throttleRaf = requestAnimationFrame(() => {
2013
+ throttleRaf = null;
2014
+ throttleLast = Date.now();
2015
+ flushDynamicHeightUpdate();
2016
+ });
2017
+ }
2018
+ return;
2019
+ }
2020
+ throttleLast = now;
2021
+ flushDynamicHeightUpdate();
2022
+ }
2023
+
2024
+ /**
2025
+ * Resolve updateOn into scroll targets (Element[]) and resize: { window: boolean, elements: Element[] }.
2026
+ * @param {Object} options - options.bodyHeightDynamic.updateOn
2027
+ * @returns {{ scrollTargets: Element[], resizeWindow: boolean, resizeElements: Element[] }}
2028
+ */
2029
+ function resolveUpdateOn(options) {
2030
+ const u = options?.bodyHeightDynamic?.updateOn;
2031
+ const scrollOn = u?.scrollOn;
2032
+ const resizeOn = u?.resizeOn;
2033
+ const scrollTargets = [];
2034
+ if (scrollOn != null && Array.isArray(scrollOn) && scrollOn.length > 0) {
2035
+ scrollOn.forEach((x) => {
2036
+ if (x === 'document') scrollTargets.push(document.documentElement);
2037
+ else if (x && typeof x.addEventListener === 'function') scrollTargets.push(x);
2038
+ });
2039
+ } else if (u?.scroll === true) {
2040
+ scrollTargets.push(document.documentElement);
2041
+ scrollTargets.push(typeof window !== 'undefined' ? window : document.documentElement);
2042
+ }
2043
+ let resizeWindow = false;
2044
+ const resizeElements = [];
2045
+ if (resizeOn != null && Array.isArray(resizeOn) && resizeOn.length > 0) {
2046
+ resizeOn.forEach((x) => {
2047
+ if (x === 'window') resizeWindow = true;
2048
+ else if (x && typeof x.addEventListener === 'function') resizeElements.push(x);
2049
+ });
2050
+ } else if (u?.resize !== false) {
2051
+ resizeWindow = true;
2052
+ resizeElements.push(document.documentElement);
2053
+ }
2054
+ return { scrollTargets, resizeWindow, resizeElements };
2055
+ }
2056
+
2057
+ /**
2058
+ * Remove table from dynamicTables and from all scroll/resize Maps; detach listeners if Set becomes empty.
2059
+ * @param {HTMLTableElement} table
2060
+ */
2061
+ function removeTableFromDynamicSources(table) {
2062
+ dynamicTables.delete(table);
2063
+ scrollSourceToTables.forEach((set, el) => {
2064
+ set.delete(table);
2065
+ if (set.size === 0) {
2066
+ scrollSourceToTables.delete(el);
2067
+ el.removeEventListener('scroll', onScrollThrottled);
2068
+ }
2069
+ });
2070
+ resizeSourceToTables.forEach((set, el) => {
2071
+ set.delete(table);
2072
+ if (set.size === 0) {
2073
+ resizeSourceToTables.delete(el);
2074
+ if (resizeObserver) resizeObserver.unobserve(el);
2075
+ }
2076
+ });
2077
+ if (resizeWindowAttached && dynamicTables.size === 0) {
2078
+ window.removeEventListener('resize', onResizeThrottled);
2079
+ resizeWindowAttached = false;
2080
+ }
2081
+ }
2082
+
2083
+ function onScrollThrottled() {
2084
+ runDynamicHeightUpdate();
2085
+ }
2086
+
2087
+ function onResizeThrottled() {
2088
+ runDynamicHeightUpdate();
2089
+ }
2090
+
2091
+ /**
2092
+ * Register a table with bodyHeightDynamic: add to Set and attach scroll/resize listeners per updateOn.
2093
+ * @param {HTMLTableElement} table
2094
+ * @param {Object} options - full options (ref.options)
2095
+ */
2096
+ function registerDynamicTable(table, options) {
2097
+ const { scrollTargets, resizeWindow, resizeElements } = resolveUpdateOn(options);
2098
+ dynamicTables.add(table);
2099
+ scrollTargets.forEach((el) => {
2100
+ let set = scrollSourceToTables.get(el);
2101
+ if (!set) {
2102
+ set = new Set();
2103
+ scrollSourceToTables.set(el, set);
2104
+ el.addEventListener('scroll', onScrollThrottled, { passive: true });
2105
+ }
2106
+ set.add(table);
2107
+ });
2108
+ if (resizeWindow) {
2109
+ if (!resizeWindowAttached) {
2110
+ resizeWindowAttached = true;
2111
+ window.addEventListener('resize', onResizeThrottled, { passive: true });
2112
+ }
2113
+ }
2114
+ resizeElements.forEach((el) => {
2115
+ let set = resizeSourceToTables.get(el);
2116
+ if (!set) {
2117
+ set = new Set();
2118
+ resizeSourceToTables.set(el, set);
2119
+ if (!resizeObserver) resizeObserver = new ResizeObserver(onResizeThrottled);
2120
+ resizeObserver.observe(el);
2121
+ }
2122
+ set.add(table);
2123
+ });
2124
+ }
2125
+
2126
+ /**
2127
+ * Build grid-template-columns from measured widths and optional overrides per column.
2128
+ * @param {number} numCols
2129
+ * @param {number[]} columnWidths
2130
+ * @param {Object<number, string>|(string|null)[]} columnOverrides - map column index → CSS value (e.g. '2fr'), or array; null/empty = use measured
2131
+ * @param {string} [unit='fr'] - CSS unit for measured widths ('fr' or 'px')
2132
+ * @returns {string}
2133
+ */
2134
+ function buildTemplateColumns(numCols, columnWidths, columnOverrides, unit = 'fr') {
2135
+ if (!columnWidths || columnWidths.length !== numCols) return '';
2136
+ const get = (i) =>
2137
+ Array.isArray(columnOverrides) ? columnOverrides[i] : columnOverrides[i];
2138
+ const parts = [];
2139
+ for (let i = 0; i < numCols; i++) {
2140
+ const ov = get(i);
2141
+ if (ov != null && typeof ov === 'string' && ov.trim() !== '') {
2142
+ parts.push(ov.trim());
2143
+ } else {
2144
+ parts.push(`${Math.round(columnWidths[i])}${unit}`);
2145
+ }
2146
+ }
2147
+ return parts.join(' ');
2148
+ }
2149
+
2150
+ /**
2151
+ * Build grid-template-rows from measured heights and optional overrides per row.
2152
+ * @param {number} numRows
2153
+ * @param {number[]} rowHeights
2154
+ * @param {Object<number, string>|(string|null)[]} rowOverrides - map row index → CSS value (e.g. '48px', '2fr'), or array; null/empty = use measured
2155
+ * @param {string} [unit='px'] - CSS unit for measured heights ('px' or 'fr')
2156
+ * @returns {string}
2157
+ */
2158
+ function buildTemplateRows(numRows, rowHeights, rowOverrides, unit = 'px') {
2159
+ if (!rowHeights || rowHeights.length < numRows) return '';
2160
+ const get = (i) =>
2161
+ Array.isArray(rowOverrides) ? rowOverrides[i] : rowOverrides?.[i];
2162
+ const parts = [];
2163
+ for (let i = 0; i < numRows; i++) {
2164
+ const ov = get(i);
2165
+ if (ov != null && typeof ov === 'string' && ov.trim() !== '') {
2166
+ parts.push(ov.trim());
2167
+ } else {
2168
+ parts.push(`${Math.round(rowHeights[i] ?? 0)}${unit}`);
2169
+ }
2170
+ }
2171
+ return parts.join(' ');
2172
+ }
2173
+
2174
+ /**
2175
+ * Measure each tr height in a section (table must not yet have scrollable class).
2176
+ * @param {HTMLTableSectionElement|null} section
2177
+ * @returns {number[]}
2178
+ */
2179
+ function measureRowHeights(section) {
2180
+ if (!section) return [];
2181
+ const rows = section.querySelectorAll(':scope > tr');
2182
+ return Array.from(rows).map((tr) => tr.getBoundingClientRect().height);
2183
+ }
2184
+
2185
+ /**
2186
+ * Apply scrollable table layout to a single table.
2187
+ * @param {HTMLTableElement} table
2188
+ * @param {Object} options - scrollableTable options
2189
+ * @param {number|string} [options.maxHeight] - Max height of tbody (default '200px'). Ignored when height or bodyHeightDynamic is set.
2190
+ * @param {number|string} [options.height] - Fixed height of tbody. Ignored when bodyHeightDynamic is set.
2191
+ * @param {{ get: (function(HTMLTableElement): number|string), useAs: 'height'|'maxHeight', updateOn?: { scroll?: boolean, resize?: boolean, scrollOn?: ('document'|Element)[], resizeOn?: ('window'|Element)[] } }} [options.bodyHeightDynamic] - When set, body size is computed by get(table) and re-applied when scroll/resize sources fire. updateOn: scrollOn/resizeOn list elements (sentinels 'document'/'window'); or use scroll (default false) / resize (default true) booleans.
2192
+ * @param {string} [options.gridTemplateColumns]
2193
+ * @param {{ thead?: string, tbody?: string, tfoot?: string }} [options.gridTemplateRows]
2194
+ * @param {{ thead?: Object<number, string>|(string|null)[], tbody?: Object<number, string>|(string|null)[], tfoot?: Object<number, string>|(string|null)[] }} [options.rowOverrides]
2195
+ * @param {Object<number, string>|(string|null)[]} [options.columnOverrides]
2196
+ * @param {{ cols?: string, rows?: string }} [options.defaultSizingUnit] - CSS unit for measured widths/heights. cols defaults to 'fr', rows defaults to 'px'.
2197
+ * @param {{ columnWidths?: number[], rowHeights?: { thead?: number[], tbody?: number[], tfoot?: number[] } } | undefined} ref - existing ref when refreshing
2198
+ */
2199
+ function applyScrollableTable(table, options, ref) {
2200
+ const thead = table.querySelector('thead');
2201
+ const tbody = table.querySelector('tbody');
2202
+ const tfoot = table.querySelector('tfoot');
2203
+
2204
+ const numCols = getTableColumnCount(table);
2205
+ if (numCols === 0) return;
2206
+
2207
+ const alreadyScrollable = table.classList.contains(CLASS_TABLE);
2208
+ const customTemplate = typeof options.gridTemplateColumns === 'string' && options.gridTemplateColumns.trim().length > 0;
2209
+ const columnWidths = customTemplate
2210
+ ? null
2211
+ : (ref?.columnWidths ?? (alreadyScrollable ? null : measureColumnWidths(table, numCols)));
2212
+
2213
+ const theadRows = getRowCount(thead);
2214
+ const tbodyRows = getRowCount(tbody);
2215
+ const tfootRows = getRowCount(tfoot);
2216
+
2217
+ const rowHeights =
2218
+ ref?.rowHeights ??
2219
+ (alreadyScrollable
2220
+ ? null
2221
+ : {
2222
+ thead: measureRowHeights(thead),
2223
+ tbody: measureRowHeights(tbody),
2224
+ tfoot: measureRowHeights(tfoot)
2225
+ });
2226
+
2227
+ table.style.setProperty('--apx-scrollable-cols', String(numCols));
2228
+ table.style.setProperty('--apx-scrollable-thead-rows', String(Math.max(1, theadRows)));
2229
+ table.style.setProperty('--apx-scrollable-tbody-rows', String(Math.max(1, tbodyRows)));
2230
+ table.style.setProperty('--apx-scrollable-tfoot-rows', String(Math.max(1, tfootRows)));
2231
+ const { bodySize, useFixedHeight } = resolveBodyHeight(options, table);
2232
+ table.style.setProperty('--apx-scrollable-body-max-height', bodySize);
2233
+ table.classList.toggle('apx-scrollable-table--body-height', useFixedHeight);
2234
+
2235
+ table.classList.add(CLASS_TABLE);
2236
+ table.classList.toggle('apx-scrollable-table--has-tfoot', !!(tfoot && tfootRows > 0));
2237
+ table.classList.toggle('apx-scrollable-table--no-thead', !(thead && theadRows > 0));
2238
+
2239
+ // Force reflow so the grid layout is established before setting measured template-columns.
2240
+ // Without this, the browser batches class + template into one pass and the tbody overflows horizontally.
2241
+ table.offsetHeight; // eslint-disable-line no-unused-expressions
2242
+
2243
+ const colUnit = options.defaultSizingUnit?.cols || 'fr';
2244
+ const rowUnit = options.defaultSizingUnit?.rows || 'px';
2245
+
2246
+ let gutterFallbackPx = DEFAULT_GUTTER_PX;
2247
+ try {
2248
+ const measured = (0,_tools_getScrollbarSize_mjs__WEBPACK_IMPORTED_MODULE_1__.getScrollbarSize)('vertical');
2249
+ if (typeof measured === 'number' && Number.isFinite(measured) && measured >= 0) {
2250
+ gutterFallbackPx = measured;
2251
+ }
2252
+ } catch (_) {
2253
+ /* use DEFAULT_GUTTER_PX */
2254
+ }
2255
+ const gutterSuffix = ` minmax(var(--apx-scrollable-gutter-width, ${gutterFallbackPx}px), var(--apx-scrollable-gutter-width, ${gutterFallbackPx}px))`;
2256
+ if (customTemplate) {
2257
+ table.style.setProperty('--apx-scrollable-template-columns', options.gridTemplateColumns.trim() + gutterSuffix);
2258
+ } else if (columnWidths && columnWidths.length === numCols) {
2259
+ const template =
2260
+ options.columnOverrides != null
2261
+ ? buildTemplateColumns(numCols, columnWidths, options.columnOverrides, colUnit)
2262
+ : columnWidths.map((w) => `${Math.round(w)}${colUnit}`).join(' ');
2263
+ table.style.setProperty('--apx-scrollable-template-columns', template + gutterSuffix);
2264
+ } else {
2265
+ table.style.removeProperty('--apx-scrollable-template-columns');
2266
+ }
2267
+
2268
+ clearPlacements(table);
2269
+
2270
+ const sections = [
2271
+ { section: thead, rows: Math.max(1, theadRows), heights: rowHeights?.thead, key: 'thead' },
2272
+ { section: tbody, rows: Math.max(1, tbodyRows), heights: rowHeights?.tbody, key: 'tbody' },
2273
+ { section: tfoot, rows: Math.max(1, tfootRows), heights: rowHeights?.tfoot, key: 'tfoot' }
2274
+ ];
2275
+ const customRows = options.gridTemplateRows && typeof options.gridTemplateRows === 'object' ? options.gridTemplateRows : null;
2276
+ const rowOverrides = options.rowOverrides && typeof options.rowOverrides === 'object' ? options.rowOverrides : null;
2277
+ sections.forEach(({ section, rows, heights, key }) => {
2278
+ if (!section) return;
2279
+ const varName = `--apx-scrollable-${key}-template-rows`;
2280
+ const custom = customRows?.[key];
2281
+ const overrides = rowOverrides?.[key];
2282
+ if (typeof custom === 'string' && custom.trim().length > 0) {
2283
+ section.style.setProperty(varName, custom.trim());
2284
+ } else if (heights && heights.length >= rows) {
2285
+ const template =
2286
+ overrides != null
2287
+ ? buildTemplateRows(rows, heights.slice(0, rows), overrides, rowUnit)
2288
+ : heights
2289
+ .slice(0, rows)
2290
+ .map((h) => `${Math.round(h)}${rowUnit}`)
2291
+ .join(' ');
2292
+ section.style.setProperty(varName, template);
2293
+ } else {
2294
+ section.style.removeProperty(varName);
2295
+ }
2296
+ const placements = computeCellPlacements(section, rows, numCols);
2297
+ applyPlacements(placements);
2298
+ });
2299
+
2300
+ return { columnWidths, rowHeights };
2301
+ }
2302
+
2303
+ /**
2304
+ * Augments the APX object with scrollableTable(options | 'refresh').
2305
+ * Makes the tbody of a table scrollable while keeping thead/tfoot fixed and columns aligned (CSS Grid + subgrid).
2306
+ *
2307
+ * @param {Object} apx - The APX object to augment.
2308
+ * @example
2309
+ * APX('table.data-grid').scrollableTable({ maxHeight: 300 });
2310
+ * APX('table.data-grid').scrollableTable('refresh');
2311
+ */
2312
+ function augmentWithScrollableTable(apx) {
2313
+ apx.scrollableTable = function (optionsOrAction) {
2314
+ const isRefresh = optionsOrAction === 'refresh';
2315
+ const options = isRefresh ? null : (optionsOrAction && typeof optionsOrAction === 'object' ? optionsOrAction : {});
2316
+
2317
+ apx.elements.forEach((element) => {
2318
+ if (element.tagName !== 'TABLE') return;
2319
+ const table = /** @type {HTMLTableElement} */ (element);
2320
+
2321
+ const ref = table[DATA_KEY];
2322
+ if (ref) {
2323
+ if (isRefresh) {
2324
+ applyScrollableTable(table, ref.options, ref);
2325
+ } else if (options && Object.keys(options).length > 0) {
2326
+ ref.options = { ...ref.options, ...options };
2327
+ const result = applyScrollableTable(table, ref.options, ref);
2328
+ if (result?.columnWidths) ref.columnWidths = result.columnWidths;
2329
+ if (result?.rowHeights) ref.rowHeights = result.rowHeights;
2330
+ }
2331
+ const currentOptions = ref.options;
2332
+ if (currentOptions?.bodyHeightDynamic) registerDynamicTable(table, currentOptions);
2333
+ else removeTableFromDynamicSources(table);
2334
+ return;
2335
+ }
2336
+ if (isRefresh) return;
2337
+
2338
+ console.log('[APX scrollableTable] create', table);
2339
+ const result = applyScrollableTable(table, options, undefined);
2340
+ table[DATA_KEY] = {
2341
+ options: { ...options },
2342
+ columnWidths: result?.columnWidths || undefined,
2343
+ rowHeights: result?.rowHeights || undefined
2344
+ };
2345
+ if (options?.bodyHeightDynamic) registerDynamicTable(table, options);
2346
+ });
2347
+
2348
+ return apx;
2349
+ };
2350
+ }
2362
2351
 
2363
2352
 
2364
2353
  /***/ }),
@@ -3588,24 +3577,34 @@ Object.assign(toast, {
3588
3577
  __webpack_require__.r(__webpack_exports__);
3589
3578
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3590
3579
  /* harmony export */ augmentWithPack: () => (/* reexport safe */ _form_packer_augment_apx_mjs__WEBPACK_IMPORTED_MODULE_0__["default"]),
3580
+ /* harmony export */ getScrollbarSize: () => (/* reexport safe */ _getScrollbarSize_mjs__WEBPACK_IMPORTED_MODULE_2__.getScrollbarSize),
3581
+ /* harmony export */ loadCss: () => (/* reexport safe */ _loadCss_mjs__WEBPACK_IMPORTED_MODULE_3__.loadCss),
3591
3582
  /* harmony export */ packFormToJSON: () => (/* reexport safe */ _form_packer_packToJson_mjs__WEBPACK_IMPORTED_MODULE_1__.packFormToJSON),
3592
3583
  /* harmony export */ tools: () => (/* binding */ tools)
3593
3584
  /* harmony export */ });
3594
3585
  /* harmony import */ var _form_packer_augment_apx_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./form-packer/augment-apx.mjs */ "./modules/tools/form-packer/augment-apx.mjs");
3595
3586
  /* harmony import */ var _form_packer_packToJson_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./form-packer/packToJson.mjs */ "./modules/tools/form-packer/packToJson.mjs");
3587
+ /* harmony import */ var _getScrollbarSize_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getScrollbarSize.mjs */ "./modules/tools/getScrollbarSize.mjs");
3588
+ /* harmony import */ var _loadCss_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./loadCss.mjs */ "./modules/tools/loadCss.mjs");
3596
3589
  // Import des fonctions et modules des sous-modules
3597
3590
 
3598
3591
 
3599
3592
 
3593
+
3594
+
3600
3595
  // Export de la fonction d'augmentation
3601
3596
 
3602
3597
 
3603
3598
  // Export des fonctions utilitaires
3604
3599
 
3605
3600
 
3601
+
3602
+
3606
3603
  // Export d'un objet tools pour faciliter l'utilisation
3607
3604
  const tools = {
3608
- packFormToJSON: _form_packer_packToJson_mjs__WEBPACK_IMPORTED_MODULE_1__.packFormToJSON
3605
+ packFormToJSON: _form_packer_packToJson_mjs__WEBPACK_IMPORTED_MODULE_1__.packFormToJSON,
3606
+ getScrollbarSize: _getScrollbarSize_mjs__WEBPACK_IMPORTED_MODULE_2__.getScrollbarSize,
3607
+ loadCss: _loadCss_mjs__WEBPACK_IMPORTED_MODULE_3__.loadCss
3609
3608
  };
3610
3609
 
3611
3610
 
@@ -4263,6 +4262,104 @@ const isPlainObject = (obj) => {
4263
4262
  };
4264
4263
 
4265
4264
 
4265
+ /***/ }),
4266
+
4267
+ /***/ "./modules/tools/getScrollbarSize.mjs":
4268
+ /*!********************************************!*\
4269
+ !*** ./modules/tools/getScrollbarSize.mjs ***!
4270
+ \********************************************/
4271
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
4272
+
4273
+ __webpack_require__.r(__webpack_exports__);
4274
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4275
+ /* harmony export */ getScrollbarSize: () => (/* binding */ getScrollbarSize)
4276
+ /* harmony export */ });
4277
+ function getScrollbarSize(orientation = "vertical") {
4278
+ if (!getScrollbarSize._cache) {
4279
+ const outer = document.createElement("div");
4280
+ Object.assign(outer.style, {
4281
+ position: "absolute",
4282
+ top: "-9999px",
4283
+ left: "-9999px",
4284
+ width: "100px",
4285
+ height: "100px",
4286
+ overflow: "scroll",
4287
+ });
4288
+
4289
+ document.body.appendChild(outer);
4290
+
4291
+ getScrollbarSize._cache = {
4292
+ vertical: outer.offsetWidth - outer.clientWidth,
4293
+ horizontal: outer.offsetHeight - outer.clientHeight,
4294
+ };
4295
+
4296
+ outer.remove();
4297
+ }
4298
+
4299
+ return getScrollbarSize._cache[orientation] ?? 0;
4300
+ }
4301
+
4302
+
4303
+ /***/ }),
4304
+
4305
+ /***/ "./modules/tools/loadCss.mjs":
4306
+ /*!***********************************!*\
4307
+ !*** ./modules/tools/loadCss.mjs ***!
4308
+ \***********************************/
4309
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
4310
+
4311
+ __webpack_require__.r(__webpack_exports__);
4312
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4313
+ /* harmony export */ loadCss: () => (/* binding */ loadCss)
4314
+ /* harmony export */ });
4315
+ const loadCssCache = new Map();
4316
+
4317
+ /**
4318
+ * Loads CSS from a URL and injects it into the document.
4319
+ * Idempotent: same URL returns the same Promise; duplicate loads are avoided.
4320
+ * @param {string} url - URL of the CSS file to load
4321
+ * @param {{ id?: string, media?: string, before?: Node }} [options] - Optional: id and media for the style element, before for insertion point
4322
+ * @returns {Promise<HTMLStyleElement>} Resolves with the injected style element; rejects on fetch failure or non-ok response
4323
+ */
4324
+ function loadCss(url, options = {}) {
4325
+ const cached = loadCssCache.get(url);
4326
+ if (cached) {
4327
+ return cached;
4328
+ }
4329
+
4330
+ const promise = fetch(url)
4331
+ .then((response) => {
4332
+ if (!response.ok) {
4333
+ throw new Error(`Failed to load CSS: ${response.status} ${response.statusText}`);
4334
+ }
4335
+ return response.text();
4336
+ })
4337
+ .then((css) => {
4338
+ const styleSheet = document.createElement("style");
4339
+ if (options.id) styleSheet.id = options.id;
4340
+ if (options.media) styleSheet.media = options.media;
4341
+ styleSheet.textContent = css;
4342
+
4343
+ const insertBefore = options.before;
4344
+ if (insertBefore && insertBefore.parentNode) {
4345
+ insertBefore.parentNode.insertBefore(styleSheet, insertBefore);
4346
+ } else {
4347
+ document.head.appendChild(styleSheet);
4348
+ }
4349
+
4350
+ return styleSheet;
4351
+ })
4352
+ .catch((error) => {
4353
+ loadCssCache.delete(url);
4354
+ console.error("Failed to load CSS:", error);
4355
+ throw error;
4356
+ });
4357
+
4358
+ loadCssCache.set(url, promise);
4359
+ return promise;
4360
+ }
4361
+
4362
+
4266
4363
  /***/ }),
4267
4364
 
4268
4365
  /***/ "./modules/tristate/tristate.mjs":
@@ -4689,9 +4786,7 @@ __webpack_require__.r(__webpack_exports__);
4689
4786
  /* harmony import */ var _modules_scrollableTable_scrollableTable_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/scrollableTable/scrollableTable.mjs */ "./modules/scrollableTable/scrollableTable.mjs");
4690
4787
  /* harmony import */ var _modules_dialog_dialog_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/dialog/dialog.mjs */ "./modules/dialog/dialog.mjs");
4691
4788
  /* harmony import */ var _modules_toast_toast_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/toast/toast.mjs */ "./modules/toast/toast.mjs");
4692
- /* harmony import */ var _modules_common_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/common.mjs */ "./modules/common.mjs");
4693
- /* harmony import */ var _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/tools/exports.mjs */ "./modules/tools/exports.mjs");
4694
-
4789
+ /* harmony import */ var _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/tools/exports.mjs */ "./modules/tools/exports.mjs");
4695
4790
 
4696
4791
 
4697
4792
 
@@ -4799,14 +4894,14 @@ const APX = function (input, context = document) {
4799
4894
  (0,_modules_listen_listen_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])(apx);
4800
4895
  (0,_modules_tristate_tristate_mjs__WEBPACK_IMPORTED_MODULE_1__["default"])(apx);
4801
4896
  (0,_modules_scrollableTable_scrollableTable_mjs__WEBPACK_IMPORTED_MODULE_2__["default"])(apx);
4802
- (0,_modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_6__.augmentWithPack)(apx);
4897
+ (0,_modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_5__.augmentWithPack)(apx);
4803
4898
  return apx;
4804
4899
  };
4805
4900
 
4806
- APX.loadCss = _modules_common_mjs__WEBPACK_IMPORTED_MODULE_5__.loadCss;
4901
+ APX.loadCss = _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_5__.loadCss;
4807
4902
  APX.dialog = _modules_dialog_dialog_mjs__WEBPACK_IMPORTED_MODULE_3__["default"];
4808
4903
  APX.toast = _modules_toast_toast_mjs__WEBPACK_IMPORTED_MODULE_4__["default"];
4809
- APX.tools = _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_6__.tools;
4904
+ APX.tools = _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_5__.tools;
4810
4905
  APX.isAPXObject = function (obj) {
4811
4906
  return obj && obj._isAPXObject === true;
4812
4907
  }
@@ -4820,4 +4915,4 @@ APX.is_numeric = (n) => {
4820
4915
  var __webpack_exports__default = __webpack_exports__["default"];
4821
4916
  export { __webpack_exports__default as default };
4822
4917
 
4823
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQVBYLmRldi5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ2dIO0FBQ2pCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyw0RkFBcUM7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLE9BQU8sdUdBQXVHLE1BQU0sVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsVUFBVSxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsT0FBTyxNQUFNLFVBQVUsWUFBWSxXQUFXLE9BQU8sWUFBWSxTQUFTLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxhQUFhLE9BQU8sUUFBUSxZQUFZLGFBQWEsV0FBVyxPQUFPLFlBQVksTUFBTSxZQUFZLGFBQWEsV0FBVyxVQUFVLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFVBQVUsWUFBWSxPQUFPLFlBQVksTUFBTSxVQUFVLFlBQVksYUFBYSxXQUFXLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLHNCQUFzQix1QkFBdUIsTUFBTSxLQUFLLFVBQVUsWUFBWSx5QkFBeUIsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLHdCQUF3QixhQUFhLE9BQU8sWUFBWSxNQUFNLFVBQVUsWUFBWSxXQUFXLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSwrREFBK0Qsc0JBQXNCLHdCQUF3QixzQkFBc0IsZ0JBQWdCLGVBQWUsb0JBQW9CLHFCQUFxQix1QkFBdUIsNkNBQTZDLHdEQUF3RCw2QkFBNkIsa0NBQWtDLHNCQUFzQixxQkFBcUIsb0JBQW9CLHlCQUF5Qix1QkFBdUIscUJBQXFCLDJCQUEyQixvREFBb0QseURBQXlELEtBQUssNEJBQTRCLHFCQUFxQixLQUFLLDJCQUEyQixvQkFBb0IscUJBQXFCLHdCQUF3QiwwQkFBMEIsNERBQTRELEtBQUssNkRBQTZELG9CQUFvQixpRUFBaUUsS0FBSyxtT0FBbU8sb0JBQW9CLHNCQUFzQiw0QkFBNEIsK0JBQStCLDJCQUEyQix5REFBeUQsd0JBQXdCLCtCQUErQixzQ0FBc0MsS0FBSyw2TkFBNk4sOEJBQThCLG1EQUFtRCxLQUFLLDJFQUEyRSwyQkFBMkIsa0NBQWtDLHVCQUF1QixxQkFBcUIsMkJBQTJCLDJCQUEyQix3QkFBd0Isd0JBQXdCLGtDQUFrQyxpREFBaUQsS0FBSyxtREFBbUQsa0NBQWtDLG9DQUFvQyxrREFBa0QsS0FBSyxzQ0FBc0Msc0JBQXNCLGtCQUFrQix1QkFBdUIsMENBQTBDLGtFQUFrRSxzQkFBc0IsZ0NBQWdDLDRCQUE0QixzQkFBc0Isb0JBQW9CLEtBQUssK0NBQStDLG9CQUFvQixvQkFBb0IscUJBQXFCLGtDQUFrQyxzQ0FBc0MsMkJBQTJCLHNEQUFzRCxLQUFLLG9DQUFvQyxhQUFhLDBCQUEwQixlQUFlLDRCQUE0QixLQUFLLGlDQUFpQyxxQkFBcUIsdUNBQXVDLDhDQUE4QywwREFBMEQsa0NBQWtDLG1DQUFtQyxLQUFLLDJDQUEyQyw4Q0FBOEMsMkRBQTJELEtBQUssdUZBQXVGLG9CQUFvQiwyQkFBMkIsaUJBQWlCLGdCQUFnQixvQkFBb0Isb0JBQW9CLDZDQUE2QyxpQ0FBaUMsS0FBSyxtQkFBbUI7QUFDM3FLO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6SnZDO0FBQ2dIO0FBQ2pCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyw0RkFBcUM7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEU7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxrSEFBa0gsUUFBUSxhQUFhLGFBQWEsYUFBYSxNQUFNLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLFlBQVksTUFBTSxZQUFZLE9BQU8sWUFBWSxNQUFNLFlBQVksT0FBTyxZQUFZLE1BQU0sWUFBWSxPQUFPLFlBQVksUUFBUSxZQUFZLGFBQWEsYUFBYSxXQUFXLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsT0FBTyxLQUFLLFlBQVksT0FBTyxPQUFPLFlBQVksT0FBTyxNQUFNLFVBQVUsWUFBWSxxVEFBcVQscVZBQXFWLGlDQUFpQyx3TkFBd04scUlBQXFJLG9CQUFvQix1Q0FBdUMsS0FBSyw0Q0FBNEMscUZBQXFGLEtBQUssc0hBQXNILGdJQUFnSSxLQUFLLCtHQUErRyxnSUFBZ0ksS0FBSyw0SkFBNEosMkhBQTJILEtBQUssb05BQW9OLGlDQUFpQyx1Q0FBdUMsNEJBQTRCLHNCQUFzQixLQUFLLHVDQUF1Qyx5SEFBeUgsS0FBSyx1Q0FBdUMseUhBQXlILHVCQUF1QixLQUFLLHVDQUF1Qyx5SEFBeUgsS0FBSywwSEFBMEgscUNBQXFDLEtBQUssK0RBQStELHFCQUFxQiwrQkFBK0IsS0FBSyx1QkFBdUI7QUFDbnJIO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxRXZDO0FBQ2dIO0FBQ2pCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyw0RkFBcUM7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsYUFBYSxjQUFjO0FBQ2hFLG9DQUFvQyxZQUFZLGNBQWM7QUFDOUQsa0NBQWtDLGFBQWEsV0FBVztBQUMxRCxpQ0FBaUMsWUFBWSxXQUFXO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwrQ0FBK0M7QUFDbEUsc0JBQXNCLGtEQUFrRDtBQUN4RSxzQkFBc0Isa0RBQWtEO0FBQ3hFLHFCQUFxQixpREFBaUQ7QUFDdEU7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkLGlCQUFpQjtBQUNqQjtBQUNBLDBCQUEwQixxQkFBcUI7QUFDL0MsNkJBQTZCO0FBQzdCLGVBQWUsb0JBQW9CLFlBQVk7QUFDL0MscUJBQXFCLGtCQUFrQjtBQUN2QyxrQkFBa0I7QUFDbEI7QUFDQSwwQkFBMEI7QUFDMUIsMEJBQTBCLG1DQUFtQztBQUM3RDtBQUNBO0FBQ0EscUJBQXFCLGdCQUFnQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QywrQ0FBK0M7QUFDL0MsK0NBQStDO0FBQy9DLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLCtDQUErQztBQUM3RixpREFBaUQsa0RBQWtEO0FBQ25HLGlEQUFpRCxrREFBa0Q7QUFDbkcsZ0RBQWdELGlEQUFpRDtBQUNqRyxtQ0FBbUM7QUFDbkMsbUNBQW1DLG1DQUFtQztBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0Isa0NBQWtDO0FBQ2xDO0FBQ0EsNkRBQTZEO0FBQzdELGdFQUFnRTtBQUNoRTtBQUNBO0FBQ0Esb0JBQW9CLFlBQVk7QUFDaEMsNENBQTRDLFlBQVk7QUFDeEQsbUJBQW1CLFlBQVk7QUFDL0IsMENBQTBDLFlBQVk7QUFDdEQ7QUFDQTtBQUNBLE9BQU8sOEZBQThGLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sNENBQTRDLDZDQUE2Qyw2Q0FBNkMsOENBQThDLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sb0NBQW9DLHFDQUFxQyxxQ0FBcUMsc0NBQXNDLDBCQUEwQixNQUFNLFlBQVkscUJBQXFCLHFCQUFxQixhQUFhLHFDQUFxQyx5QkFBeUIsMkNBQTJDLG1DQUFtQyx1QkFBdUIsTUFBTSxzQkFBc0IscUNBQXFDLE1BQU0sVUFBVSxnQ0FBZ0MsT0FBTyxZQUFZLE1BQU0sWUFBWSxXQUFXLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxNQUFNLEtBQUssVUFBVSxZQUFZLE1BQU0sS0FBSyxVQUFVLFlBQVksTUFBTSxZQUFZLE1BQU0sVUFBVSxVQUFVLFlBQVksTUFBTSxLQUFLLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxNQUFNLHdCQUF3Qix5QkFBeUIseUJBQXlCLHlCQUF5QixhQUFhLE1BQU0sWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUsWUFBWSxNQUFNLEtBQUssVUFBVSxZQUFZLE1BQU0sb0NBQW9DLHFDQUFxQyxxQ0FBcUMscUNBQXFDLHVCQUF1QixxQ0FBcUMsTUFBTSxVQUFVLFVBQVUsVUFBVSxNQUFNLFlBQVkseUJBQXlCLHlCQUF5QixhQUFhLHlCQUF5QiwwQkFBMEIsV0FBVyxrQ0FBa0MsbUNBQW1DLG1DQUFtQyw2RUFBNkUsd0JBQXdCLHNCQUFzQiwrQkFBK0IsdUNBQXVDLGlEQUFpRCw2QkFBNkIsS0FBSyw2Q0FBNkMsYUFBYSxjQUFjLHdCQUF3Qix3Q0FBd0MsWUFBWSxjQUFjLDBCQUEwQixzQ0FBc0MsYUFBYSxXQUFXLHdCQUF3QixxQ0FBcUMsWUFBWSxXQUFXLDBCQUEwQixvQkFBb0IscURBQXFELHFEQUFxRCxvREFBb0Qsb0RBQW9ELHdFQUF3RSwrREFBK0Qsb0JBQW9CLHlCQUF5Qiw2QkFBNkIsMkJBQTJCLDZEQUE2RCxLQUFLLDJCQUEyQiwrQ0FBK0MsMkNBQTJDLDBCQUEwQixrREFBa0QsOENBQThDLDBCQUEwQixrREFBa0QsOENBQThDLHlCQUF5QixpREFBaUQsNkNBQTZDLDhCQUE4QixvQkFBb0IsMkJBQTJCLDJCQUEyQixrQkFBa0IsWUFBWSxxQkFBcUIsYUFBYSxvQ0FBb0MsOEJBQThCLHFCQUFxQix3QkFBd0IsaUNBQWlDLG9CQUFvQixtQkFBbUIsb0JBQW9CLFlBQVksVUFBVSx5QkFBeUIsa0JBQWtCLHlCQUF5QixzQkFBc0IsK0JBQStCLEtBQUssOEJBQThCLGFBQWEsOEJBQThCLG1DQUFtQyxzQkFBc0IsK0JBQStCLHFCQUFxQix5QkFBeUIsZ0JBQWdCLG1CQUFtQixLQUFLLDRGQUE0RiwyQkFBMkIsZ0JBQWdCLGlCQUFpQixzREFBc0Qsc0JBQXNCLDRCQUE0Qiw2QkFBNkIsdUJBQXVCLCtCQUErQiwwQkFBMEIsS0FBSywrQkFBK0IsZUFBZSxxRkFBcUYsS0FBSyxrQ0FBa0Msa0JBQWtCLHFGQUFxRixLQUFLLCtCQUErQix5RkFBeUYsZ0JBQWdCLHFCQUFxQix5QkFBeUIsS0FBSyw4QkFBOEIscUJBQXFCLG9CQUFvQix3QkFBd0Isc0NBQXNDLHdDQUF3QyxLQUFLLGdEQUFnRCxvQ0FBb0MsbURBQW1ELGtDQUFrQyxtREFBbUQsb0NBQW9DLGtEQUFrRCxrQ0FBa0MsOEhBQThILDJCQUEyQiwwREFBMEQsMkRBQTJELGdCQUFnQiw2QkFBNkIsNEJBQTRCLGdDQUFnQyx5QkFBeUIsNEJBQTRCLDhDQUE4QywyQkFBMkIsbUJBQW1CLGtCQUFrQix3QkFBd0IsdUJBQXVCLHNCQUFzQix1Q0FBdUMsdUJBQXVCLEtBQUssMERBQTBELGVBQWUseUNBQXlDLEtBQUssNkRBQTZELGtCQUFrQix3Q0FBd0MsS0FBSyxrREFBa0QsK0NBQStDLHVDQUF1QyxxREFBcUQsa0RBQWtELG1DQUFtQyxxREFBcUQsa0RBQWtELHNDQUFzQyxvREFBb0QsaURBQWlELG9DQUFvQyx1Q0FBdUMsYUFBYSx1Q0FBdUMsbUNBQW1DLHVCQUF1QixvQ0FBb0Msb0JBQW9CLHFCQUFxQix1QkFBdUIsS0FBSyw4SUFBOEksa0VBQWtFLHNDQUFzQyxxRUFBcUUsd0tBQXdLLG1FQUFtRSxvRUFBb0Usc0VBQXNFLGdEQUFnRCxZQUFZLDZCQUE2QixnREFBZ0QsWUFBWSwyQkFBMkIsdUJBQXVCLFlBQVksMkJBQTJCLDhDQUE4QyxZQUFZLDZCQUE2QiwrQkFBK0I7QUFDN2xSO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hKdkM7QUFDZ0g7QUFDakI7QUFDTztBQUN0Ryw0Q0FBNEMsaTdCQUF1YztBQUNuZiw0Q0FBNEMsaWpCQUF1UTtBQUNuVCw0Q0FBNEMseW5CQUEyUztBQUN2Viw0Q0FBNEMsaW9CQUErUztBQUMzViw4QkFBOEIsbUZBQTJCLENBQUMsNEZBQXFDO0FBQy9GLHlDQUF5QyxzRkFBK0I7QUFDeEUseUNBQXlDLHNGQUErQjtBQUN4RSx5Q0FBeUMsc0ZBQStCO0FBQ3hFLHlDQUF5QyxzRkFBK0I7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixtQ0FBbUM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixtQ0FBbUM7QUFDakUsc0JBQXNCLG1DQUFtQztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCLG1DQUFtQztBQUNqRSxzQkFBc0IsbUNBQW1DO0FBQ3pEOztBQUVBO0FBQ0EsOEJBQThCLG1DQUFtQztBQUNqRSxzQkFBc0IsbUNBQW1DO0FBQ3pELENBQUMsT0FBTyxvR0FBb0csWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssVUFBVSxZQUFZLFdBQVcsVUFBVSxZQUFZLE1BQU0sWUFBWSxPQUFPLFVBQVUsTUFBTSxLQUFLLFVBQVUsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssWUFBWSxhQUFhLE1BQU0sS0FBSyxZQUFZLGFBQWEsTUFBTSxLQUFLLFlBQVksYUFBYSxPQUFPLE1BQU0sVUFBVSxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSx5Q0FBeUMsNEJBQTRCLDZCQUE2Qix5QkFBeUIsc0JBQXNCLHlCQUF5QixxQkFBcUIsc0JBQXNCLCtCQUErQixvQ0FBb0Msd0JBQXdCLDZDQUE2Qyw0Q0FBNEMseUNBQXlDLEdBQUcsMkJBQTJCLHNZQUFzWSxHQUFHLHdFQUF3RSxrQkFBa0IseUJBQXlCLGVBQWUscUJBQXFCLDJCQUEyQixHQUFHLDhSQUE4UixvQkFBb0IsR0FBRyxvRUFBb0Usa0JBQWtCLHlCQUF5QixlQUFlLHFCQUFxQiwyQkFBMkIsMERBQTBELDZCQUE2QixHQUFHLG1FQUFtRSx1REFBdUQscUNBQXFDLG9DQUFvQyxtQ0FBbUMsK0JBQStCLDZCQUE2Qiw0QkFBNEIsMkJBQTJCLHVCQUF1QixvUEFBb1AsNE9BQTRPLEdBQUcsMkVBQTJFLDBEQUEwRCw2QkFBNkIsR0FBRyx5QkFBeUIsNkJBQTZCLDBEQUEwRCxHQUFHLHlCQUF5Qiw2QkFBNkIsMERBQTBELEdBQUcsaUVBQWlFLGtCQUFrQix5QkFBeUIsZUFBZSxxQkFBcUIsdURBQXVELHFDQUFxQyxvQ0FBb0MsbUNBQW1DLCtCQUErQiw2QkFBNkIsNEJBQTRCLDJCQUEyQix1QkFBdUIsMkJBQTJCLEdBQUcsa0NBQWtDLG9SQUFvUiw0UUFBNFEsR0FBRyxrQ0FBa0Msd1JBQXdSLGdSQUFnUixHQUFHLG1CQUFtQjtBQUNwNUs7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQzs7Ozs7Ozs7Ozs7QUMzRzFCOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHFCQUFxQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixzRkFBc0YscUJBQXFCO0FBQzNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixpREFBaUQscUJBQXFCO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixzREFBc0QscUJBQXFCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUNwRmE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQ3pCYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELGNBQWM7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQ2ZBO0FBQ0Esb0lBQW9JO0FBQ3BJO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGQSxNQUFxRztBQUNyRyxNQUEyRjtBQUMzRixNQUFrRztBQUNsRyxNQUFxSDtBQUNySCxNQUE4RztBQUM5RyxNQUE4RztBQUM5RyxNQUEwRztBQUMxRztBQUNBOztBQUVBOztBQUVBLDRCQUE0QixxR0FBbUI7QUFDL0Msd0JBQXdCLGtIQUFhOztBQUVyQyx1QkFBdUIsdUdBQWE7QUFDcEM7QUFDQSxpQkFBaUIsK0ZBQU07QUFDdkIsNkJBQTZCLHNHQUFrQjs7QUFFL0MsYUFBYSwwR0FBRyxDQUFDLHVGQUFPOzs7O0FBSW9EO0FBQzVFLE9BQU8saUVBQWUsdUZBQU8sSUFBSSx1RkFBTyxVQUFVLHVGQUFPLG1CQUFtQixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pCN0UsTUFBcUc7QUFDckcsTUFBMkY7QUFDM0YsTUFBa0c7QUFDbEcsTUFBcUg7QUFDckgsTUFBOEc7QUFDOUcsTUFBOEc7QUFDOUcsTUFBbUg7QUFDbkg7QUFDQTs7QUFFQTs7QUFFQSw0QkFBNEIscUdBQW1CO0FBQy9DLHdCQUF3QixrSEFBYTs7QUFFckMsdUJBQXVCLHVHQUFhO0FBQ3BDO0FBQ0EsaUJBQWlCLCtGQUFNO0FBQ3ZCLDZCQUE2QixzR0FBa0I7O0FBRS9DLGFBQWEsMEdBQUcsQ0FBQyxnR0FBTzs7OztBQUk2RDtBQUNyRixPQUFPLGlFQUFlLGdHQUFPLElBQUksZ0dBQU8sVUFBVSxnR0FBTyxtQkFBbUIsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6QjdFLE1BQXFHO0FBQ3JHLE1BQTJGO0FBQzNGLE1BQWtHO0FBQ2xHLE1BQXFIO0FBQ3JILE1BQThHO0FBQzlHLE1BQThHO0FBQzlHLE1BQXlHO0FBQ3pHO0FBQ0E7O0FBRUE7O0FBRUEsNEJBQTRCLHFHQUFtQjtBQUMvQyx3QkFBd0Isa0hBQWE7O0FBRXJDLHVCQUF1Qix1R0FBYTtBQUNwQztBQUNBLGlCQUFpQiwrRkFBTTtBQUN2Qiw2QkFBNkIsc0dBQWtCOztBQUUvQyxhQUFhLDBHQUFHLENBQUMsc0ZBQU87Ozs7QUFJbUQ7QUFDM0UsT0FBTyxpRUFBZSxzRkFBTyxJQUFJLHNGQUFPLFVBQVUsc0ZBQU8sbUJBQW1CLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekI3RSxNQUFxRztBQUNyRyxNQUEyRjtBQUMzRixNQUFrRztBQUNsRyxNQUFxSDtBQUNySCxNQUE4RztBQUM5RyxNQUE4RztBQUM5RyxNQUE0RztBQUM1RztBQUNBOztBQUVBOztBQUVBLDRCQUE0QixxR0FBbUI7QUFDL0Msd0JBQXdCLGtIQUFhOztBQUVyQyx1QkFBdUIsdUdBQWE7QUFDcEM7QUFDQSxpQkFBaUIsK0ZBQU07QUFDdkIsNkJBQTZCLHNHQUFrQjs7QUFFL0MsYUFBYSwwR0FBRyxDQUFDLHlGQUFPOzs7O0FBSXNEO0FBQzlFLE9BQU8saUVBQWUseUZBQU8sSUFBSSx5RkFBTyxVQUFVLHlGQUFPLG1CQUFtQixFQUFDOzs7Ozs7Ozs7OztBQzFCaEU7O0FBRWI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHdCQUF3QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiw2QkFBNkI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUNuRmE7O0FBRWI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FDakNhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUNUYTs7QUFFYjtBQUNBO0FBQ0EsY0FBYyxLQUF3QyxHQUFHLHNCQUFpQixHQUFHLENBQUk7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQ1RhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsaUZBQWlGO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FDNURhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDZEE7QUFDMEI7QUFDMEI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksOEdBQThHLElBQUk7QUFDOUg7QUFDQTtBQUNBLHdCQUF3Qix1REFBbUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLG1FQUFtRSxNQUFNO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsdUZBQXVGLElBQUk7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSx1RkFBdUYsSUFBSTtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGlDQUFpQztBQUN0RCxzQkFBc0IsaUNBQWlDO0FBQ3ZELHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdFQUFnRTtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsK0JBQStCLEdBQUc7QUFDeEUsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0EsNkNBQTZDO0FBQzdDLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSwrQkFBK0IsSUFBSTtBQUNuRztBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEMsMEJBQTBCLHdCQUF3QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQsY0FBYztBQUNkO0FBQ0Esa0dBQWtHO0FBQ2xHLGNBQWM7QUFDZDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxvQkFBb0I7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFlLFlBQVksRUFBQzs7Ozs7Ozs7Ozs7Ozs7O0FDclM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsNkJBQWUsb0NBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFVBQVU7QUFDakMseUJBQXlCLFFBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGlDQUFpQztBQUN4RSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQyxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFdBQVc7QUFDbkM7QUFDQSxtRkFBbUY7QUFDbkY7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCLGFBQWEsbUNBQW1DO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7QUFDaEUsd0JBQXdCLFdBQVcsR0FBRyxXQUFXLEdBQUcsUUFBUTtBQUM1RCxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuS21DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQztBQUNBLFdBQVcscUNBQXFDO0FBQ2hEO0FBQ0EsV0FBVyxxQ0FBcUM7QUFDaEQ7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQSxXQUFXLHFCQUFxQjtBQUNoQztBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFdBQVcsYUFBYTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcscUJBQXFCO0FBQ2hDLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHlCQUF5QjtBQUNwQyxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0IsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0VBQStFO0FBQy9FLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsUUFBUTtBQUNuQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMEJBQTBCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsVUFBVTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixhQUFhO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHlCQUF5QjtBQUNwQyxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxtQkFBbUIsa0NBQWtDO0FBQ3RGLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsZUFBZSx3RkFBd0Y7QUFDdkc7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGlCQUFpQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMEJBQTBCO0FBQzNELHVDQUF1Qyw0QkFBNEI7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsa0JBQWtCO0FBQy9DLG1DQUFtQyxvQkFBb0I7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLHFDQUFxQztBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsa0NBQWtDO0FBQzVELGdDQUFnQyxTQUFTLFNBQVMsUUFBUTtBQUMxRCxtQ0FBbUMsU0FBUyxTQUFTLFFBQVE7QUFDN0QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsZUFBZTtBQUMxQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLE1BQU07QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLGtCQUFrQjtBQUM3QixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBLFlBQVksMkJBQTJCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRSxzQ0FBc0M7QUFDeEcsV0FBVyxRQUFRO0FBQ25CLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFLFdBQVcsa0JBQWtCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBLFlBQVksOENBQThDO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxlQUFlO0FBQzlFO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FLGVBQWU7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsV0FBVyx3Q0FBd0MsdUVBQXVFO0FBQzFILGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsYUFBYTtBQUNqQztBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsMEJBQTBCLDRCQUE0QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsV0FBVyx3Q0FBd0MseUVBQXlFO0FBQzVILGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsYUFBYTtBQUNqQztBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsMEJBQTBCLCtCQUErQjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsOEJBQThCO0FBQ3pDLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLFFBQVE7QUFDbkIsV0FBVyxlQUFlO0FBQzFCLFdBQVcsZUFBZTtBQUMxQixhQUFhLDRGQUE0Riw0R0FBNEcsdU1BQXVNO0FBQzVaLFdBQVcsUUFBUTtBQUNuQixhQUFhLGtEQUFrRDtBQUMvRCxhQUFhLGtKQUFrSjtBQUMvSixXQUFXLHdDQUF3QztBQUNuRCxhQUFhLHdDQUF3Qyx5REFBeUQsYUFBYTtBQUMzSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksMkJBQTJCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsY0FBYztBQUMzRDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLHdGQUF3RjtBQUNsRyxVQUFVLHdGQUF3RjtBQUNsRyxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDZCQUE2QjtBQUNyRDtBQUNBLDRDQUE0QyxJQUFJO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsY0FBYztBQUN2RDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLDRDQUE0QyxnQkFBZ0I7QUFDNUQ7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBLHlIQUF5SDtBQUN6SDtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsa0JBQWtCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsWUFBWTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hrQkE7QUFDQTtBQUN5QjtBQUN6QjtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsZ0NBQWdDO0FBQzlDLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsZ0VBQWdFO0FBQzlFLGNBQWMsUUFBUTtBQUN0QixjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsYUFBYSx1QkFBdUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsVUFBVTtBQUN4QixjQUFjLG9CQUFvQjtBQUNsQyxjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLDRCQUE0QjtBQUMxQyxjQUFjLFFBQVE7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsU0FBUyw0Q0FBNEMsNERBQTRELHdDQUF3QztBQUN2SztBQUNBO0FBQ0E7QUFDQSxjQUFjLGtFQUFrRTtBQUNoRjtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsY0FBYyxhQUFhO0FBQzNCLGNBQWMscUNBQXFDO0FBQ25ELGNBQWMsUUFBUTtBQUN0QixjQUFjLFNBQVM7QUFDdkIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMseUNBQXlDO0FBQ3ZELGNBQWMscUVBQXFFO0FBQ25GLGNBQWMsUUFBUTtBQUN0QixjQUFjLFVBQVU7QUFDeEIsY0FBYyxvQkFBb0I7QUFDbEMsY0FBYyxTQUFTLG1FQUFtRSwrQ0FBK0MsZ0NBQWdDO0FBQ3pLO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixjQUFjLFFBQVE7QUFDdEIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsa0NBQWtDO0FBQ2hELGNBQWMsMENBQTBDO0FBQ3hELGNBQWMscUJBQXFCO0FBQ25DLGNBQWMsMkRBQTJEO0FBQ3pFLGNBQWMscURBQXFEO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsYUFBYTtBQUN4QixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2RUFBNkUsSUFBSTtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxJQUFJO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUywwQ0FBMEMsWUFBWTtBQUMxRSxXQUFXLFNBQVMsMENBQTBDLFlBQVk7QUFDMUUsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQW9EO0FBQ3BFO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixXQUFXLEdBQUcsVUFBVSxHQUFHLFNBQVMsR0FBRyxXQUFXLEdBQUcsWUFBWTtBQUNwRjtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLEtBQUs7QUFDdkM7QUFDQTtBQUNBLHNEQUFzRCxXQUFXO0FBQ2pFLHNEQUFzRCxXQUFXO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsOEJBQThCO0FBQ2pFLDZCQUE2QixVQUFVO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsV0FBVztBQUN2QztBQUNBLHdEQUF3RCxhQUFhO0FBQ3JFO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQix1QkFBdUI7QUFDdkM7QUFDQSxtQkFBbUIsYUFBYTtBQUNoQyx3QkFBd0IsbUNBQW1DO0FBQzNELG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQSxtQkFBbUIsdUJBQXVCO0FBQzFDO0FBQ0EsbUJBQW1CLFlBQVk7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHNCQUFzQjtBQUN0QztBQUNBLHdCQUF3QixnQ0FBZ0M7QUFDeEQ7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDRCQUE0QjtBQUM1Qyx3QkFBd0IsaUJBQWlCLGdCQUFnQjtBQUN6RDtBQUNBLGtCQUFrQixZQUFZO0FBQzlCLHNCQUFzQjtBQUN0QjtBQUNBLGdCQUFnQixjQUFjO0FBQzlCO0FBQ0EsMENBQTBDLEtBQUs7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0UsYUFBYTtBQUM3RTtBQUNBO0FBQ0EsMkNBQTJDLFdBQVcsR0FBRyx1Q0FBdUM7QUFDaEc7QUFDQSx3REFBd0Qsa0JBQWtCO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBGQUEwRixZQUFZO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsZ0JBQWdCO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhFQUE4RSxJQUFJO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRSxJQUFJO0FBQy9FO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RSxJQUFJO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBLDRFQUE0RSxJQUFJO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlFQUF5RSxlQUFlO0FBQ3hGLHlFQUF5RSxlQUFlO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RSxlQUFlO0FBQzVGLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsc0RBQXNELGdDQUFnQztBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsSUFBSTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0UsYUFBYTtBQUNiO0FBQ0E7QUFDQSxtQkFBbUIsVUFBVTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsdURBQXVELHdCQUF3QjtBQUMvRTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwR0FBMEcsRUFBRTtBQUM1RyxvREFBb0QsWUFBWTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0Esc0NBQXNDLDhCQUE4Qix1Q0FBdUM7QUFDM0csdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQSx1RUFBdUUsTUFBTSxXQUFXLGNBQWM7QUFDdEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixnQ0FBZ0M7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsNEJBQTRCO0FBQ2xEO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxnQ0FBZ0M7QUFDdkY7QUFDQSxtRUFBbUUsc0JBQXNCLHFCQUFxQjtBQUM5RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixtQkFBbUIsWUFBWSwwQkFBMEI7QUFDbkYsNkJBQTZCLG1CQUFtQixZQUFZLDZCQUE2QjtBQUN6Riw2QkFBNkIsbUJBQW1CLFlBQVksNkJBQTZCO0FBQ3pGLDRCQUE0QixtQkFBbUIsWUFBWSw0QkFBNEI7QUFDdkY7QUFDQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixjQUFjO0FBQzlCO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFVBQVU7QUFDekIsZUFBZSxhQUFhO0FBQzVCLGVBQWUsU0FBUztBQUN4QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRSxZQUFZO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELFNBQVM7QUFDN0Q7QUFDQTtBQUNBLDZCQUE2QixnQkFBZ0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGdCQUFnQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNIQUFzSCxFQUFFO0FBQ3hIO0FBQ0EsaUVBQWlFLElBQUk7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsbUJBQW1CO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsVUFBVTtBQUN6QixlQUFlLGFBQWE7QUFDNUIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLG9CQUFvQjtBQUNqRCw0QkFBNEIsbUJBQW1CO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsc0NBQXNDO0FBQ2pGLHlDQUF5QyxVQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxvQkFBb0I7QUFDNUQseUNBQXlDLFVBQVU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLHNDQUFzQztBQUNoRix3Q0FBd0MsU0FBUztBQUNqRDtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsbUJBQW1CO0FBQzVELHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRSxJQUFJO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDZCQUE2QjtBQUM1QyxlQUFlLHVCQUF1QjtBQUN0QyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MscUJBQXFCLEdBQUc7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0Msc0JBQXNCLEdBQUc7QUFDM0QsS0FBSztBQUNMLGVBQWUsOEJBQThCO0FBQzdDLGNBQWM7QUFDZCxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsaUVBQWUsS0FBSyxFQUFDO0FBQzhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN3FDbkQ7QUFDNEQ7QUFDRTtBQUM5RDtBQUNBO0FBQzJCO0FBQzNCO0FBQ0E7QUFDMEI7QUFDMUI7QUFDQTtBQUNPO0FBQ1Asb0JBQW9CLHVFQUFjO0FBQ2xDO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2ZrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsNkJBQWUsb0NBQVU7QUFDekI7QUFDQTtBQUNBLGVBQWUsUUFBUSxvREFBb0QsOEJBQThCO0FBQ3pHLGlCQUFpQixRQUFRO0FBQ3pCLGdCQUFnQixPQUFPO0FBQ3ZCO0FBQ0E7QUFDQSw2Q0FBNkMsOEJBQThCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsK0RBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUMvQkE7QUFDQTtBQUNBLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsYUFBYSxRQUFRO0FBQ3JCLFlBQVksV0FBVztBQUN2QjtBQUNPLDBDQUEwQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsS0FBSyxHQUFHLFVBQVU7QUFDbkQ7QUFDQTtBQUNBLDBCQUEwQixLQUFLLEdBQUcsV0FBVztBQUM3QztBQUNBO0FBQ0EsMEJBQTBCLEtBQUs7QUFDL0I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekIsa0JBQWtCLFNBQVM7QUFDM0Isa0JBQWtCLFNBQVM7QUFDM0Isa0JBQWtCLFNBQVM7QUFDM0Isa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxtQ0FBbUMsa0JBQWtCLHdDQUF3QztBQUM3Riw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTO0FBQ3hCLGVBQWUsU0FBUztBQUN4QixlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLFlBQVk7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFlBQVksR0FBRyxVQUFVO0FBQ3hFLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxZQUFZLEdBQUcsV0FBVztBQUMzRCxjQUFjO0FBQ2QsaUNBQWlDLFlBQVk7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0JBQXNCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQSxnRUFBZ0U7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsVUFBVTtBQUNyRDtBQUNBLCtDQUErQyxVQUFVLHdDQUF3Qyw2QkFBNkI7QUFDOUgsb0NBQW9DLEtBQUssdURBQXVELFVBQVU7QUFDMUc7QUFDQSwrQ0FBK0MsVUFBVTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsVUFBVTtBQUN6QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsbUJBQW1CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsa0JBQWtCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsR0FBRztBQUNsQixlQUFlLGFBQWE7QUFDNUIsZUFBZSxhQUFhO0FBQzVCLGVBQWUsU0FBUztBQUN4QixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEdBQUc7QUFDbEIsZUFBZSxhQUFhO0FBQzVCLGVBQWUsYUFBYTtBQUM1QixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEdBQUc7QUFDbEIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsR0FBRztBQUNsQixlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxHQUFHO0FBQ2xCLGVBQWUsUUFBUTtBQUN2QixlQUFlLGFBQWE7QUFDNUIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLE9BQU87QUFDdEIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIsR0FBRztBQUNwQjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLElBQUkscUJBQXFCLFlBQVksd0JBQXdCLHlCQUF5QixTQUFTLGlDQUFpQztBQUNoSztBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsSUFBSSxxQkFBcUIsWUFBWSx3QkFBd0IseUJBQXlCLFNBQVMsaUNBQWlDO0FBQ2hLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixJQUFJLHFCQUFxQixZQUFZLHdCQUF3Qiw2QkFBNkIsU0FBUyxxQ0FBcUM7QUFDcEs7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsSUFBSSxxQkFBcUIsWUFBWSx3QkFBd0IsNkJBQTZCLFNBQVMscUNBQXFDO0FBQ2hLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGFBQWE7QUFDOUI7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGdDQUFnQztBQUN4RDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isa0JBQWtCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLDRCQUE0QixrRUFBa0U7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPLDJDQUEyQyxHQUFHO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsNEJBQTRCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0EsaUNBQWlDLHlCQUF5QjtBQUMxRDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQywwREFBMEQ7QUFDM0Ysa0JBQWtCO0FBQ2xCO0FBQ0EsaUNBQWlDLG1DQUFtQztBQUNwRTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiw0QkFBNEI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQzlrQjRCOztBQUU1QjtBQUNBO0FBQ0EsV0FBVyxvQkFBb0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBZSxvQ0FBVTtBQUN6Qix5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0RUFBNEU7QUFDNUUsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsNEJBQTRCO0FBQzdELGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsNkNBQTZDO0FBQzdDLDhDQUE4QztBQUM5QyxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsdUVBQXVFO0FBQ3ZFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDLHlEQUF5RDtBQUN6RCw2Q0FBNkM7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3Qyw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsZ0VBQWdFLGlDQUFpQztBQUNqRztBQUNBO0FBQ0EsbUVBQW1FLDJDQUEyQztBQUM5RztBQUNBO0FBQ0EsNERBQTRELGlDQUFpQztBQUM3RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7U0NwU0E7U0FDQTs7U0FFQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTs7U0FFQTtTQUNBOztTQUVBO1NBQ0E7U0FDQTs7U0FFQTtTQUNBOzs7OztVQ3pCQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0EsaUNBQWlDLFdBQVc7VUFDNUM7VUFDQTs7Ozs7VUNQQTtVQUNBO1VBQ0E7VUFDQTtVQUNBLHlDQUF5Qyx3Q0FBd0M7VUFDakY7VUFDQTtVQUNBOzs7OztVQ1BBOzs7OztVQ0FBO1VBQ0E7VUFDQTtVQUNBLHVEQUF1RCxpQkFBaUI7VUFDeEU7VUFDQSxnREFBZ0QsYUFBYTtVQUM3RDs7Ozs7VUNOQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7O1VBRUE7O1VBRUE7O1VBRUE7O1VBRUE7O1VBRUE7O1VBRUE7Ozs7O1VDckJBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBNEQ7QUFDTTtBQUNxQjtBQUN0QztBQUNIO0FBQ0M7QUFDc0I7O0FBRXJFO0FBQ0E7QUFDQSxXQUFXLCtFQUErRTtBQUMxRixhQUFhLFFBQVE7QUFDckIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxzRUFBaUI7QUFDckIsSUFBSSwwRUFBbUI7QUFDdkIsSUFBSSx3RkFBMEI7QUFDOUIsSUFBSSwyRUFBZTtBQUNuQjtBQUNBOztBQUVBLGNBQWMsd0RBQU87QUFDckIsYUFBYSxrRUFBTTtBQUNuQixZQUFZLGdFQUFLO0FBQ2pCLFlBQVksNkRBQUs7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlFQUFlLEdBQUcsRSIsInNvdXJjZXMiOlsid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9hc3QvY3NzL3RvYXN0LmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9odG1sL2RpYWxvZy5odG1sIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3M/YTU2NyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL2Nzcy9zY3JvbGxhYmxlVGFibGUuY3NzPzkyZmQiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L2Nzcy90b2FzdC5jc3M/OGE0OCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcz9hMDk0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2NvbW1vbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9kaWFsb2cubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL3Njcm9sbGFibGVUYWJsZS5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L3RvYXN0Lm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZXhwb3J0cy5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Rvb2xzL2Zvcm0tcGFja2VyL2F1Z21lbnQtYXB4Lm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZm9ybS1wYWNrZXIvcGFja1RvSnNvbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RyaXN0YXRlL3RyaXN0YXRlLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9qc29ucCBjaHVuayBsb2FkaW5nIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9ub25jZSIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL0FQWC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIERpYWxvZyBzdHlsaW5nICovXHJcbi5BUFgtZGlhbG9nIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB6LWluZGV4OiAxMDAyO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHRvcDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNCk7XHJcbiAgICAvKiBEaW1tZWQgYmFja2dyb3VuZCBmb3IgZm9jdXMgb24gZGlhbG9nICovXHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZmVmZTtcclxuICAgIHBhZGRpbmc6IDQwcHg7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICB3aWR0aDogYXV0bztcclxuICAgIG1pbi13aWR0aDogMzAwcHg7XHJcbiAgICBtYXgtd2lkdGg6IDgwJTtcclxuICAgIG1hcmdpbjogYXV0bztcclxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMjBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbn1cclxuXHJcbmgyLkFQWC1kaWFsb2ctdGl0bGV7XHJcbiAgICBtYXJnaW4tdG9wOjA7XHJcbn1cclxuXHJcbi5BUFgtY2xvc2UtZGlhbG9nIHtcclxuICAgIGNvbG9yOiAjYWFhO1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgZm9udC1zaXplOiAyNHB4O1xyXG4gICAgbWFyZ2luLXRvcDogLTEwcHg7XHJcbiAgICAvKiBBZGp1c3QgcG9zaXRpb25pbmcgKi9cclxuICAgIG1hcmdpbi1yaWdodDogLTEwcHg7XHJcbn1cclxuXHJcbi5BUFgtY2xvc2UtZGlhbG9nOmhvdmVyLFxyXG4uQVBYLWNsb3NlLWRpYWxvZzpmb2N1cyB7XHJcbiAgICBjb2xvcjogIzMzMztcclxuICAgIC8qIERhcmtlciBjb2xvciBvbiBob3Zlci9mb2N1cyAqL1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4vKiBJbnB1dCBmaWVsZHMgc3R5bGluZyAqL1xyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJ0ZXh0XCJdLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJudW1iZXJcIl0sXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGVcIl0sXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgcGFkZGluZzogMTBweDtcclxuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjNzO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJ0ZXh0XCJdOmZvY3VzLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJudW1iZXJcIl06Zm9jdXMsXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGVcIl06Zm9jdXMsXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdOmZvY3VzIHtcclxuICAgIGJvcmRlci1jb2xvcjogIzJDM0U1MDtcclxuICAgIC8qIERlZXAgQmx1ZSBDb2xvciAqL1xyXG4gICAgb3V0bGluZTogbm9uZTtcclxufVxyXG5cclxuLyogQnV0dG9uIGluIHRoZSBkaWFsb2cgKi9cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b24ge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzJDM0U1MDtcclxuICAgIGNvbG9yOiAjRUNGMEYxO1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcclxuICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzNDQ5NUU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7XHJcbiAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZ2FwOiAxMHB4O1xyXG4gICAgbWFyZ2luLXRvcDoxZW07XHJcbiAgICAvKiBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xyXG59XHJcblxyXG4vKiBMb2FkaW5nIGluZGljYXRvciAqL1xyXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvciB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgaGVpZ2h0OiAxMDBweDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvcjo6YmVmb3JlIHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgd2lkdGg6IDQwcHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBib3JkZXI6IDRweCBzb2xpZCAjZjNmM2YzO1xyXG4gICAgYm9yZGVyLXRvcDogNHB4IHNvbGlkICMyQzNFNTA7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICBhbmltYXRpb246IEFQWC1kaWFsb2ctc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgQVBYLWRpYWxvZy1zcGluIHtcclxuICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cclxuICAgIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XHJcbn1cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkIHtcclxuICAgIG9wYWNpdHk6IDAuNTtcclxuICAgIGN1cnNvcjogbm90LWFsbG93ZWQgIWltcG9ydGFudDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogR3JheWVkIG91dCBjb2xvciAqL1xyXG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTtcclxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBLZWVwIGdyYXkgb24gaG92ZXIgKi9cclxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4vKiBBZGQgYSBzdWJ0bGUgc3RyaWtldGhyb3VnaCBlZmZlY3QgKi9cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOjphZnRlciB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMik7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZyk7XHJcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL21vZHVsZXMvZGlhbG9nL2Nzcy9kaWFsb2cuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLG1CQUFtQjtBQUNuQjtJQUNJLGFBQWE7SUFDYixlQUFlO0lBQ2YsYUFBYTtJQUNiLE9BQU87SUFDUCxNQUFNO0lBQ04sV0FBVztJQUNYLFlBQVk7SUFDWixjQUFjO0lBQ2Qsb0NBQW9DO0lBQ3BDLDBDQUEwQztBQUM5Qzs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixhQUFhO0lBQ2IsWUFBWTtJQUNaLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsMkNBQTJDO0lBQzNDLGdEQUFnRDtBQUNwRDs7QUFFQTtJQUNJLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtBQUN2Qjs7QUFFQTs7SUFFSSxXQUFXO0lBQ1gsZ0NBQWdDO0lBQ2hDLGVBQWU7QUFDbkI7O0FBRUEseUJBQXlCO0FBQ3pCOzs7O0lBSUksV0FBVztJQUNYLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixnREFBZ0Q7SUFDaEQsZUFBZTtJQUNmLHNCQUFzQjtJQUN0Qiw2QkFBNkI7QUFDakM7O0FBRUE7Ozs7SUFJSSxxQkFBcUI7SUFDckIsb0JBQW9CO0lBQ3BCLGFBQWE7QUFDakI7O0FBRUEseUJBQXlCO0FBQ3pCO0lBQ0ksa0JBQWtCO0lBQ2xCLHlCQUF5QjtJQUN6QixjQUFjO0lBQ2QsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGVBQWU7SUFDZix5QkFBeUI7SUFDekIsd0NBQXdDO0FBQzVDOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLDJCQUEyQjtJQUMzQix5Q0FBeUM7QUFDN0M7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsU0FBUztJQUNULGNBQWM7SUFDZCw0QkFBNEI7QUFDaEM7O0FBRUEsc0JBQXNCO0FBQ3RCO0lBQ0ksYUFBYTtJQUNiLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLFdBQVc7QUFDZjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxXQUFXO0lBQ1gsWUFBWTtJQUNaLHlCQUF5QjtJQUN6Qiw2QkFBNkI7SUFDN0Isa0JBQWtCO0lBQ2xCLDZDQUE2QztBQUNqRDs7QUFFQTtJQUNJLEtBQUssdUJBQXVCLEVBQUU7SUFDOUIsT0FBTyx5QkFBeUIsRUFBRTtBQUN0QztBQUNBO0lBQ0ksWUFBWTtJQUNaLDhCQUE4QjtJQUM5QixvQ0FBb0MsRUFBRSxxQkFBcUI7SUFDM0QsMkJBQTJCO0lBQzNCLHlCQUF5QjtJQUN6QiwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxvQ0FBb0MsRUFBRSx1QkFBdUI7SUFDN0QsMEJBQTBCO0FBQzlCOztBQUVBLHNDQUFzQztBQUN0QztJQUNJLFdBQVc7SUFDWCxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLG9DQUFvQztJQUNwQyx3QkFBd0I7QUFDNUJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyogRGlhbG9nIHN0eWxpbmcgKi9cXHJcXG4uQVBYLWRpYWxvZyB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gICAgei1pbmRleDogMTAwMjtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgdG9wOiAwO1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgaGVpZ2h0OiAxMDAlO1xcclxcbiAgICBvdmVyZmxvdzogYXV0bztcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQpO1xcclxcbiAgICAvKiBEaW1tZWQgYmFja2dyb3VuZCBmb3IgZm9jdXMgb24gZGlhbG9nICovXFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlO1xcclxcbiAgICBwYWRkaW5nOiA0MHB4O1xcclxcbiAgICBib3JkZXI6IG5vbmU7XFxyXFxuICAgIHdpZHRoOiBhdXRvO1xcclxcbiAgICBtaW4td2lkdGg6IDMwMHB4O1xcclxcbiAgICBtYXgtd2lkdGg6IDgwJTtcXHJcXG4gICAgbWFyZ2luOiBhdXRvO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XFxyXFxuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMjBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG59XFxyXFxuXFxyXFxuaDIuQVBYLWRpYWxvZy10aXRsZXtcXHJcXG4gICAgbWFyZ2luLXRvcDowO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWNsb3NlLWRpYWxvZyB7XFxyXFxuICAgIGNvbG9yOiAjYWFhO1xcclxcbiAgICBmbG9hdDogcmlnaHQ7XFxyXFxuICAgIGZvbnQtc2l6ZTogMjRweDtcXHJcXG4gICAgbWFyZ2luLXRvcDogLTEwcHg7XFxyXFxuICAgIC8qIEFkanVzdCBwb3NpdGlvbmluZyAqL1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWNsb3NlLWRpYWxvZzpob3ZlcixcXHJcXG4uQVBYLWNsb3NlLWRpYWxvZzpmb2N1cyB7XFxyXFxuICAgIGNvbG9yOiAjMzMzO1xcclxcbiAgICAvKiBEYXJrZXIgY29sb3Igb24gaG92ZXIvZm9jdXMgKi9cXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBJbnB1dCBmaWVsZHMgc3R5bGluZyAqL1xcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwibnVtYmVyXFxcIl0sXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRlXFxcIl0sXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRldGltZS1sb2NhbFxcXCJdIHtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHg7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7XFxyXFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjNzO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcInRleHRcXFwiXTpmb2N1cyxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcIm51bWJlclxcXCJdOmZvY3VzLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZVxcXCJdOmZvY3VzLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZXRpbWUtbG9jYWxcXFwiXTpmb2N1cyB7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogIzJDM0U1MDtcXHJcXG4gICAgLyogRGVlcCBCbHVlIENvbG9yICovXFxyXFxuICAgIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi8qIEJ1dHRvbiBpbiB0aGUgZGlhbG9nICovXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b24ge1xcclxcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMyQzNFNTA7XFxyXFxuICAgIGNvbG9yOiAjRUNGMEYxO1xcclxcbiAgICBib3JkZXI6IG5vbmU7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcXHJcXG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b246aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzQ0OTVFO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7XFxyXFxuICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIHtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZ2FwOiAxMHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOjFlbTtcXHJcXG4gICAgLyogc3BhY2luZyBiZXR3ZWVuIGJ1dHRvbnMgKi9cXHJcXG59XFxyXFxuXFxyXFxuLyogTG9hZGluZyBpbmRpY2F0b3IgKi9cXHJcXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvciB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgICBoZWlnaHQ6IDEwMHB4O1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3I6OmJlZm9yZSB7XFxyXFxuICAgIGNvbnRlbnQ6ICcnO1xcclxcbiAgICB3aWR0aDogNDBweDtcXHJcXG4gICAgaGVpZ2h0OiA0MHB4O1xcclxcbiAgICBib3JkZXI6IDRweCBzb2xpZCAjZjNmM2YzO1xcclxcbiAgICBib3JkZXItdG9wOiA0cHggc29saWQgIzJDM0U1MDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xcclxcbiAgICBhbmltYXRpb246IEFQWC1kaWFsb2ctc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7XFxyXFxufVxcclxcblxcclxcbkBrZXlmcmFtZXMgQVBYLWRpYWxvZy1zcGluIHtcXHJcXG4gICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxcclxcbiAgICAxMDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxcclxcbn1cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQge1xcclxcbiAgICBvcGFjaXR5OiAwLjU7XFxyXFxuICAgIGN1cnNvcjogbm90LWFsbG93ZWQgIWltcG9ydGFudDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBHcmF5ZWQgb3V0IGNvbG9yICovXFxyXFxuICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcXHJcXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTtcXHJcXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogS2VlcCBncmF5IG9uIGhvdmVyICovXFxyXFxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBBZGQgYSBzdWJ0bGUgc3RyaWtldGhyb3VnaCBlZmZlY3QgKi9cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6OmFmdGVyIHtcXHJcXG4gICAgY29udGVudDogJyc7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgdG9wOiA1MCU7XFxyXFxuICAgIGxlZnQ6IDA7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICBoZWlnaHQ6IDFweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZyk7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyogQVBYIFNjcm9sbGFibGUgVGFibGU6IHNjcm9sbGFibGUgdGJvZHkgd2l0aCBmaXhlZCB0aGVhZC90Zm9vdCBhbmQgYWxpZ25lZCBjb2x1bW5zIChDU1MgR3JpZCArIHN1YmdyaWQpXHJcbiAgIFVzZSAhaW1wb3J0YW50IHNvIHBhZ2Ugc3R5bGVzIChlLmcuIGRpc3BsYXk6IHRhYmxlKSBkbyBub3Qgb3ZlcnJpZGUgdGhlIGdyaWQgbGF5b3V0LiAqL1xyXG5cclxuLyogLS1hcHgtc2Nyb2xsYWJsZS10ZW1wbGF0ZS1jb2x1bW5zOiBzZXQgYnkgSlMgKG1lYXN1cmVkIHdpZHRocyArIGd1dHRlcik7IGZhbGxiYWNrID0gZXF1YWwgY29sdW1ucyArIGd1dHRlciAqL1xyXG4vKiAtLWFweC1zY3JvbGxhYmxlLWd1dHRlci13aWR0aDogc3BhY2UgZm9yIHZlcnRpY2FsIHNjcm9sbGJhciBzbyBpdCBkb2VzIG5vdCBvdmVybGFwIHRoZSBsYXN0IGNvbHVtbiAoc2V0IHRvIDAgdG8gYWxsb3cgb3ZlcmxhcCkgKi9cclxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LWhlaWdodDogd2hlbiBjbGFzcyBhcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQgaXMgc2V0LCB0Ym9keSByb3cgdXNlcyBmaXhlZCBoZWlnaHQgaW5zdGVhZCBvZiBtYXgtaGVpZ2h0ICovXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB7XHJcbiAgICBkaXNwbGF5OiBncmlkICFpbXBvcnRhbnQ7XHJcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnMsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1jb2xzLCAzKSwgbWlubWF4KDAsIDFmcikpIG1pbm1heCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpLCB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpKSk7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gdmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1yb3ctc2l6ZSwgZml0LWNvbnRlbnQodmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1tYXgtaGVpZ2h0LCAyMDBweCkpKSBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICB0YWJsZS1sYXlvdXQ6IHVuc2V0ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQge1xyXG4gICAgLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KTtcclxufVxyXG5cclxuLyogVGFibGUgd2l0aCBubyB0Zm9vdDogdGhlYWQgKyB0Ym9keSBvbmx5ICovXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZTpub3QoLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QpIHtcclxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpO1xyXG59XHJcblxyXG4vKiBUYWJsZSB3aXRoIG5vIHRoZWFkOiB0Ym9keSArIHRmb290IG9ubHkgKi9cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1uby10aGVhZCB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemUsIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSkgYXV0bztcclxufVxyXG5cclxuLyogVGFibGUgd2l0aCBuZWl0aGVyIHRoZWFkIG5vciB0Zm9vdDogdGJvZHkgb25seSAqL1xyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkOm5vdCguYXB4LXNjcm9sbGFibGUtdGFibGUtLWhhcy10Zm9vdCkge1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpO1xyXG59XHJcblxyXG4vKiAtLWFweC1zY3JvbGxhYmxlLSotdGVtcGxhdGUtcm93czogc2V0IGJ5IEpTIChtZWFzdXJlZCBoZWlnaHRzKSBvciBvdmVycmlkZSBpbiBDU1MgLyB2aWEgb3B0aW9ucyAqL1xyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0aGVhZCxcclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHksXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290IHtcclxuICAgIGRpc3BsYXk6IGdyaWQgIWltcG9ydGFudDtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogc3ViZ3JpZDtcclxuICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7XHJcbiAgICBtaW4taGVpZ2h0OiAwO1xyXG59XHJcblxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0aGVhZCB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzLCAxKSwgYXV0bykpO1xyXG59XHJcblxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Ym9keSB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRib2R5LXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10Ym9keS1yb3dzLCAxKSwgYXV0bykpO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290IHtcclxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGZvb3QtdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MsIDEpLCBhdXRvKSk7XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRoZWFkID4gdHIsXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRib2R5ID4gdHIsXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290ID4gdHIge1xyXG4gICAgZGlzcGxheTogY29udGVudHMgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHRoLFxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgdGQge1xyXG4gICAgbWluLXdpZHRoOiAwO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxufVxyXG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL2Nzcy9zY3JvbGxhYmxlVGFibGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO3lGQUN5Rjs7QUFFekYsK0dBQStHO0FBQy9HLG1JQUFtSTtBQUNuSSx5SUFBeUk7QUFDekk7SUFDSSx3QkFBd0I7SUFDeEIsK01BQStNO0lBQy9NLDRIQUE0SDtJQUM1SCxXQUFXO0lBQ1gsOEJBQThCO0FBQ2xDOztBQUVBO0lBQ0ksNEVBQTRFO0FBQ2hGOztBQUVBLDRDQUE0QztBQUM1QztJQUNJLHVIQUF1SDtBQUMzSDs7QUFFQSw0Q0FBNEM7QUFDNUM7SUFDSSx1SEFBdUg7QUFDM0g7O0FBRUEsbURBQW1EO0FBQ25EO0lBQ0ksa0hBQWtIO0FBQ3RIOztBQUVBLG9HQUFvRztBQUNwRzs7O0lBR0ksd0JBQXdCO0lBQ3hCLDhCQUE4QjtJQUM5QixtQkFBbUI7SUFDbkIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGdIQUFnSDtBQUNwSDs7QUFFQTtJQUNJLGdIQUFnSDtJQUNoSCxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksZ0hBQWdIO0FBQ3BIOztBQUVBOzs7SUFHSSw0QkFBNEI7QUFDaEM7O0FBRUE7O0lBRUksWUFBWTtJQUNaLHNCQUFzQjtBQUMxQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBBUFggU2Nyb2xsYWJsZSBUYWJsZTogc2Nyb2xsYWJsZSB0Ym9keSB3aXRoIGZpeGVkIHRoZWFkL3Rmb290IGFuZCBhbGlnbmVkIGNvbHVtbnMgKENTUyBHcmlkICsgc3ViZ3JpZClcXHJcXG4gICBVc2UgIWltcG9ydGFudCBzbyBwYWdlIHN0eWxlcyAoZS5nLiBkaXNwbGF5OiB0YWJsZSkgZG8gbm90IG92ZXJyaWRlIHRoZSBncmlkIGxheW91dC4gKi9cXHJcXG5cXHJcXG4vKiAtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnM6IHNldCBieSBKUyAobWVhc3VyZWQgd2lkdGhzICsgZ3V0dGVyKTsgZmFsbGJhY2sgPSBlcXVhbCBjb2x1bW5zICsgZ3V0dGVyICovXFxyXFxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGg6IHNwYWNlIGZvciB2ZXJ0aWNhbCBzY3JvbGxiYXIgc28gaXQgZG9lcyBub3Qgb3ZlcmxhcCB0aGUgbGFzdCBjb2x1bW4gKHNldCB0byAwIHRvIGFsbG93IG92ZXJsYXApICovXFxyXFxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LWhlaWdodDogd2hlbiBjbGFzcyBhcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQgaXMgc2V0LCB0Ym9keSByb3cgdXNlcyBmaXhlZCBoZWlnaHQgaW5zdGVhZCBvZiBtYXgtaGVpZ2h0ICovXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHtcXHJcXG4gICAgZGlzcGxheTogZ3JpZCAhaW1wb3J0YW50O1xcclxcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnMsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1jb2xzLCAzKSwgbWlubWF4KDAsIDFmcikpIG1pbm1heCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpLCB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpKSk7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpIGF1dG87XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICB0YWJsZS1sYXlvdXQ6IHVuc2V0ICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQge1xcclxcbiAgICAtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemU6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBUYWJsZSB3aXRoIG5vIHRmb290OiB0aGVhZCArIHRib2R5IG9ubHkgKi9cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGU6bm90KC5hcHgtc2Nyb2xsYWJsZS10YWJsZS0taGFzLXRmb290KSB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBUYWJsZSB3aXRoIG5vIHRoZWFkOiB0Ym9keSArIHRmb290IG9ubHkgKi9cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkIHtcXHJcXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpIGF1dG87XFxyXFxufVxcclxcblxcclxcbi8qIFRhYmxlIHdpdGggbmVpdGhlciB0aGVhZCBub3IgdGZvb3Q6IHRib2R5IG9ubHkgKi9cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkOm5vdCguYXB4LXNjcm9sbGFibGUtdGFibGUtLWhhcy10Zm9vdCkge1xcclxcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemUsIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSk7XFxyXFxufVxcclxcblxcclxcbi8qIC0tYXB4LXNjcm9sbGFibGUtKi10ZW1wbGF0ZS1yb3dzOiBzZXQgYnkgSlMgKG1lYXN1cmVkIGhlaWdodHMpIG9yIG92ZXJyaWRlIGluIENTUyAvIHZpYSBvcHRpb25zICovXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQsXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHksXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGZvb3Qge1xcclxcbiAgICBkaXNwbGF5OiBncmlkICFpbXBvcnRhbnQ7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogc3ViZ3JpZDtcXHJcXG4gICAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcXHJcXG4gICAgbWluLWhlaWdodDogMDtcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQge1xcclxcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzLCAxKSwgYXV0bykpO1xcclxcbn1cXHJcXG5cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Ym9keSB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGJvZHktdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRib2R5LXJvd3MsIDEpLCBhdXRvKSk7XFxyXFxuICAgIG92ZXJmbG93OiBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGZvb3QtdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MsIDEpLCBhdXRvKSk7XFxyXFxufVxcclxcblxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRoZWFkID4gdHIsXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHkgPiB0cixcXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCA+IHRyIHtcXHJcXG4gICAgZGlzcGxheTogY29udGVudHMgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHRoLFxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0ZCB7XFxyXFxuICAgIG1pbi13aWR0aDogMDtcXHJcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuQVBYLXRvYXN0LWNvbnRhaW5lciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGdhcDogdmFyKC0tYXB4LXRvYXN0LWdhcCwgOHB4KTtcclxuICAgIHotaW5kZXg6IHZhcigtLWFweC10b2FzdC16LWluZGV4LCAxMTAwMCk7XHJcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxufVxyXG5cclxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxyXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tYm90dG9tLWxlZnQgeyBsZWZ0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9XHJcbi5BUFgtdG9hc3QtY29udGFpbmVyLS10b3AtcmlnaHQgeyByaWdodDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1lbmQ7IH1cclxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxyXG5cclxuLkFQWC10b2FzdCB7XHJcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcclxuICAgIG1heC13aWR0aDogdmFyKC0tYXB4LXRvYXN0LW1heC13aWR0aCwgNDIwcHgpO1xyXG4gICAgZm9udC1zaXplOiB2YXIoLS1hcHgtdG9hc3QtZm9udC1zaXplLCAxNHB4KTtcclxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XHJcbiAgICBib3gtc2hhZG93OiB2YXIoLS1hcHgtdG9hc3Qtc2hhZG93LCAwIDZweCAyNHB4IHJnYmEoMCwwLDAsMC4yKSk7XHJcbiAgICBwYWRkaW5nOiB2YXIoLS1hcHgtdG9hc3QtcGFkZGluZywgMTBweCA0MnB4IDEwcHggMTRweCk7XHJcbiAgICBjb2xvcjogIzExMTtcclxuICAgIGJhY2tncm91bmQ6ICNlZWU7XHJcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgZWFzZSwgdHJhbnNmb3JtIDE4MG1zIGVhc2U7XHJcbn1cclxuXHJcbi5BUFgtdG9hc3QtLWluZm8geyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1mZywgIzA1MmM2NSk7IH1cclxuLkFQWC10b2FzdC0tc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWJnLCAjMTk4NzU0KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWZnLCAjZmZmZmZmKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XHJcbi5BUFgtdG9hc3QtLWRhbmdlciB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1kYW5nZXItYmcsICNkYzM1NDUpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1mZywgI2ZmZmZmZik7IH1cclxuXHJcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxyXG5cclxuLkFQWC10b2FzdF9fY2xvc2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA1MCU7IHJpZ2h0OiAxMHB4O1xyXG4gICAgd2lkdGg6IDI0cHg7IGhlaWdodDogMjRweDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogY3VycmVudENvbG9yO1xyXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjsgYXBwZWFyYW5jZTogbm9uZTsgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xyXG4gICAgb3BhY2l0eTogLjc1OyB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XHJcbn1cclxuLkFQWC10b2FzdF9fY2xvc2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOmZvY3VzIHsgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEoMCwwLDAsLjIpOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xyXG4gICAgY29udGVudDogJ8OXJztcclxuICAgIGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE7IHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLyogUHJvZ3Jlc3MgYmFyIChvdXRzaWRlIGNvbnRlbnQsIGZsdXNoIHRvIHRvYXN0IGVkZ2VzKSAqL1xyXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCk7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xyXG4gICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xyXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgMCAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20ge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcclxufVxyXG4vKiBUcmFjayBjb250YWlucyB0aGUgYmFyOyBubyBtYXJnaW4gKHBhdXNlIGJ1dHRvbiBpcyBvbiB0aGUgY29ybmVyLCBvdmVybGFwcGluZykgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xyXG4gICAgZmxleDogMTtcclxuICAgIG1pbi13aWR0aDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XHJcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XHJcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoMTAyLCA3NywgMywgMC41KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4vKiBQYXVzZS9SZXN1bWUgYnV0dG9uOiByb3VuZCwgY2VudGVyIGV4YWN0bHkgb24gdG9hc3QgY29ybmVyICh0b3AtbGVmdCBvciBib3R0b20tbGVmdCkgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcclxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xyXG4gICAgbGVmdDogMDtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZDogI2VlZTtcclxuICAgIGNvbG9yOiBjdXJyZW50Q29sb3I7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgb3BhY2l0eTogMC45NTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS10b3AgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCA1MCUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxyXG4uQVBYLXRvYXN0LS1zdWNjZXNzIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtYmcsICMxOTg3NTQpOyBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBib3JkZXItY29sb3I6IHJnYmEoMTAyLCA3NywgMywgMC42KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlOmhvdmVyIHsgb3BhY2l0eTogMTsgfVxyXG4uQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC40KTsgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IH1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgaGVpZ2h0OiAxMHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuLyogRXh0cmEgdG9wL2JvdHRvbSBwYWRkaW5nIHdoZW4gcHJvZ3Jlc3MgYmFyIGlzIHByZXNlbnQgKGRlZmF1bHQgY29udGVudCBwYWRkaW5nIDEwcHggKyBiYXIgaGVpZ2h0KSAqL1xyXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20geyBwYWRkaW5nLWJvdHRvbTogY2FsYygxMHB4ICsgdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KSk7IH1cclxuLyogUmVzZXJ2ZSBzcGFjZSBmb3Igc3RhY2tpbmcgd2hlbiBwYXVzZSBidXR0b24gaXMgcHJlc2VudCAoYnV0dG9uIGV4dGVuZHMgb3V0c2lkZSB0b2FzdCBjb3JuZXIpICovXHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tYm90dG9tOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcblxyXG4vKiBBbmltYXRpb25zICovXHJcbi5BUFgtdG9hc3QtLWVudGVyIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cclxuLkFQWC10b2FzdC0tZW50ZXIuQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cclxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxyXG4uQVBYLXRvYXN0LS1leGl0LkFQWC10b2FzdC0tZXhpdC1hY3RpdmUgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxyXG5cclxuXHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtJQUNmLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsOEJBQThCO0lBQzlCLHdDQUF3QztJQUN4QyxvQkFBb0I7QUFDeEI7O0FBRUEscUNBQXFDLFdBQVcsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUU7QUFDdkYsb0NBQW9DLFVBQVUsRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUU7QUFDdkYsa0NBQWtDLFdBQVcsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUU7QUFDakYsaUNBQWlDLFVBQVUsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUU7O0FBRWpGO0lBQ0ksNENBQTRDO0lBQzVDLDRDQUE0QztJQUM1QywyQ0FBMkM7SUFDM0MsMkNBQTJDO0lBQzNDLCtEQUErRDtJQUMvRCxzREFBc0Q7SUFDdEQsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLG9EQUFvRDtBQUN4RDs7QUFFQSxtQkFBbUIsNkNBQTZDLEVBQUUsd0NBQXdDLEVBQUU7QUFDNUcsc0JBQXNCLGdEQUFnRCxFQUFFLDJDQUEyQyxFQUFFO0FBQ3JILHNCQUFzQixnREFBZ0QsRUFBRSwyQ0FBMkMsRUFBRTtBQUNySCxxQkFBcUIsK0NBQStDLEVBQUUsMENBQTBDLEVBQUU7O0FBRWxILHNCQUFzQixpQkFBaUIsRUFBRTs7QUFFekM7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUSxFQUFFLFdBQVc7SUFDckIsV0FBVyxFQUFFLFlBQVk7SUFDekIsMkJBQTJCO0lBQzNCLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLHVCQUF1QjtJQUNsRSx1QkFBdUIsRUFBRSxtQkFBbUI7SUFDNUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQ3BELGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSx3QkFBd0I7SUFDM0QsWUFBWSxFQUFFLDhCQUE4QjtBQUNoRDtBQUNBLDBCQUEwQixVQUFVLEVBQUU7QUFDdEMsMEJBQTBCLGlDQUFpQyxFQUFFLG1CQUFtQixFQUFFO0FBQ2xGO0lBQ0ksWUFBWTtJQUNaLGVBQWUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCO0FBQ3ZEOztBQUVBLHlEQUF5RDtBQUN6RDtJQUNJLGtCQUFrQjtJQUNsQixPQUFPO0lBQ1AsUUFBUTtJQUNSLDZDQUE2QztJQUM3QyxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLGlCQUFpQjtBQUNyQjtBQUNBO0lBQ0ksTUFBTTtJQUNOLDRFQUE0RTtBQUNoRjtBQUNBO0lBQ0ksU0FBUztJQUNULDRFQUE0RTtBQUNoRjtBQUNBLG1GQUFtRjtBQUNuRjtJQUNJLE9BQU87SUFDUCxZQUFZO0lBQ1osZ0JBQWdCO0FBQ3BCO0FBQ0E7SUFDSSxZQUFZO0lBQ1osV0FBVztJQUNYLGVBQWU7SUFDZiw2QkFBNkI7SUFDN0IsK0JBQStCO0FBQ25DO0FBQ0EsNENBQTRDLGlDQUFpQyxFQUFFO0FBQy9FLCtDQUErQywrQkFBK0IsRUFBRTtBQUNoRiwrQ0FBK0MsaUNBQWlDLEVBQUU7QUFDbEYsOENBQThDLCtCQUErQixFQUFFO0FBQy9FLHlGQUF5RjtBQUN6RjtJQUNJLGtCQUFrQjtJQUNsQixpREFBaUQ7SUFDakQsa0RBQWtEO0lBQ2xELE9BQU87SUFDUCxvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHFDQUFxQztJQUNyQyxrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFNBQVM7SUFDVCxlQUFlO0lBQ2YsY0FBYztJQUNkLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsY0FBYztBQUNsQjtBQUNBO0lBQ0ksTUFBTTtJQUNOLGdDQUFnQztBQUNwQztBQUNBO0lBQ0ksU0FBUztJQUNULCtCQUErQjtBQUNuQztBQUNBLDhDQUE4Qyw2Q0FBNkMsRUFBRSxvQ0FBb0MsRUFBRTtBQUNuSSxpREFBaUQsZ0RBQWdELEVBQUUsZ0NBQWdDLEVBQUU7QUFDckksaURBQWlELGdEQUFnRCxFQUFFLG1DQUFtQyxFQUFFO0FBQ3hJLGdEQUFnRCwrQ0FBK0MsRUFBRSxpQ0FBaUMsRUFBRTtBQUNwSSxtQ0FBbUMsVUFBVSxFQUFFO0FBQy9DLG1DQUFtQyxpQ0FBaUMsRUFBRSxvQkFBb0IsRUFBRTtBQUM1RjtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osY0FBYztBQUNsQjtBQUNBLHNHQUFzRztBQUN0RywrQkFBK0IsK0RBQStELEVBQUU7QUFDaEcsa0NBQWtDLGtFQUFrRSxFQUFFO0FBQ3RHLGtHQUFrRztBQUNsRyw2REFBNkQsZ0VBQWdFLEVBQUU7QUFDL0gsZ0VBQWdFLG1FQUFtRSxFQUFFOztBQUVySSxlQUFlO0FBQ2Ysb0JBQW9CLFVBQVUsRUFBRSwwQkFBMEIsRUFBRTtBQUM1RCw0Q0FBNEMsVUFBVSxFQUFFLHdCQUF3QixFQUFFO0FBQ2xGLG1CQUFtQixVQUFVLEVBQUUsd0JBQXdCLEVBQUU7QUFDekQsMENBQTBDLFVBQVUsRUFBRSwwQkFBMEIsRUFBRVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuQVBYLXRvYXN0LWNvbnRhaW5lciB7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gICAgZ2FwOiB2YXIoLS1hcHgtdG9hc3QtZ2FwLCA4cHgpO1xcclxcbiAgICB6LWluZGV4OiB2YXIoLS1hcHgtdG9hc3Qtei1pbmRleCwgMTEwMDApO1xcclxcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxcclxcbi5BUFgtdG9hc3QtY29udGFpbmVyLS1ib3R0b20tbGVmdCB7IGxlZnQ6IDEycHg7IGJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH1cXHJcXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tdG9wLXJpZ2h0IHsgcmlnaHQ6IDEycHg7IHRvcDogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxcclxcblxcclxcbi5BUFgtdG9hc3Qge1xcclxcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcXHJcXG4gICAgbWF4LXdpZHRoOiB2YXIoLS1hcHgtdG9hc3QtbWF4LXdpZHRoLCA0MjBweCk7XFxyXFxuICAgIGZvbnQtc2l6ZTogdmFyKC0tYXB4LXRvYXN0LWZvbnQtc2l6ZSwgMTRweCk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XFxyXFxuICAgIGJveC1zaGFkb3c6IHZhcigtLWFweC10b2FzdC1zaGFkb3csIDAgNnB4IDI0cHggcmdiYSgwLDAsMCwwLjIpKTtcXHJcXG4gICAgcGFkZGluZzogdmFyKC0tYXB4LXRvYXN0LXBhZGRpbmcsIDEwcHggNDJweCAxMHB4IDE0cHgpO1xcclxcbiAgICBjb2xvcjogIzExMTtcXHJcXG4gICAgYmFja2dyb3VuZDogI2VlZTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBlYXNlLCB0cmFuc2Zvcm0gMTgwbXMgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC0taW5mbyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1pbmZvLWJnLCAjMGRjYWYwKTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1pbmZvLWZnLCAjMDUyYzY1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1mZywgI2ZmZmZmZik7IH1cXHJcXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XFxyXFxuLkFQWC10b2FzdC0tZGFuZ2VyIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1iZywgI2RjMzU0NSk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWZnLCAjZmZmZmZmKTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0b3A6IDUwJTsgcmlnaHQ6IDEwcHg7XFxyXFxuICAgIHdpZHRoOiAyNHB4OyBoZWlnaHQ6IDI0cHg7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IGN1cnJlbnRDb2xvcjtcXHJcXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyOyBhcHBlYXJhbmNlOiBub25lOyAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxyXFxuICAgIG9wYWNpdHk6IC43NTsgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbn1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpob3ZlciB7IG9wYWNpdHk6IDE7IH1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTsgb3V0bGluZS1vZmZzZXQ6IDJweDsgfVxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xcclxcbiAgICBjb250ZW50OiAnw5cnO1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi8qIFByb2dyZXNzIGJhciAob3V0c2lkZSBjb250ZW50LCBmbHVzaCB0byB0b2FzdCBlZGdlcykgKi9cXHJcXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KTtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXHJcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxyXFxuICAgIGZsZXgtc2hyaW5rOiAwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcclxcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KSB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIDAgMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSB7XFxyXFxuICAgIGJvdHRvbTogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcXHJcXG59XFxyXFxuLyogVHJhY2sgY29udGFpbnMgdGhlIGJhcjsgbm8gbWFyZ2luIChwYXVzZSBidXR0b24gaXMgb24gdGhlIGNvcm5lciwgb3ZlcmxhcHBpbmcpICovXFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xcclxcbiAgICBmbGV4OiAxO1xcclxcbiAgICBtaW4td2lkdGg6IDA7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7XFxyXFxuICAgIGhlaWdodDogMTAwJTtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIG1heC13aWR0aDogMTAwJTtcXHJcXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XFxyXFxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XFxyXFxuLkFQWC10b2FzdC0tc3VjY2VzcyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDEwMiwgNzcsIDMsIDAuNSk7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxcclxcbi8qIFBhdXNlL1Jlc3VtZSBidXR0b246IHJvdW5kLCBjZW50ZXIgZXhhY3RseSBvbiB0b2FzdCBjb3JuZXIgKHRvcC1sZWZ0IG9yIGJvdHRvbS1sZWZ0KSAqL1xcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB3aWR0aDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xcclxcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiAjZWVlO1xcclxcbiAgICBjb2xvcjogY3VycmVudENvbG9yO1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICAgIHBhZGRpbmc6IDA7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgICBsaW5lLWhlaWdodDogMTtcXHJcXG4gICAgb3BhY2l0eTogMC45NTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbiAgICBmbGV4LXNocmluazogMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xcclxcbiAgICBib3R0b206IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjMpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWJnLCAjZmZjMTA3KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDEwMiwgNzcsIDMsIDAuNik7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6Zm9jdXMgeyBvdXRsaW5lOiAycHggc29saWQgcmdiYSgwLDAsMCwuNCk7IG91dGxpbmUtb2Zmc2V0OiAtMnB4OyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcXHJcXG4gICAgd2lkdGg6IDEwcHg7XFxyXFxuICAgIGhlaWdodDogMTBweDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcbi8qIEV4dHJhIHRvcC9ib3R0b20gcGFkZGluZyB3aGVuIHByb2dyZXNzIGJhciBpcyBwcmVzZW50IChkZWZhdWx0IGNvbnRlbnQgcGFkZGluZyAxMHB4ICsgYmFyIGhlaWdodCkgKi9cXHJcXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbSB7IHBhZGRpbmctYm90dG9tOiBjYWxjKDEwcHggKyB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpKTsgfVxcclxcbi8qIFJlc2VydmUgc3BhY2UgZm9yIHN0YWNraW5nIHdoZW4gcGF1c2UgYnV0dG9uIGlzIHByZXNlbnQgKGJ1dHRvbiBleHRlbmRzIG91dHNpZGUgdG9hc3QgY29ybmVyKSAqL1xcclxcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbS5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZSB7IG1hcmdpbi1ib3R0b206IGNhbGModmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpIC8gMik7IH1cXHJcXG5cXHJcXG4vKiBBbmltYXRpb25zICovXFxyXFxuLkFQWC10b2FzdC0tZW50ZXIgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxcclxcbi5BUFgtdG9hc3QtLWVudGVyLkFQWC10b2FzdC0tZW50ZXItYWN0aXZlIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XFxyXFxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxcclxcbi5BUFgtdG9hc3QtLWV4aXQuQVBYLXRvYXN0LS1leGl0LWFjdGl2ZSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpOyB9XFxyXFxuXFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ21hc2sgaWQ9JTI3ZnJhbWUtY3V0b3V0JTI3JTNFJTNDcmVjdCB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgZmlsbD0lMjclMjNmZmYlMjcvJTNFJTNDcmVjdCB4PSUyNzMlMjcgeT0lMjczJTI3IHdpZHRoPSUyNzI2JTI3IGhlaWdodD0lMjcyNiUyNyByeD0lMjc0JTI3IHJ5PSUyNzQlMjcgZmlsbD0lMjclMjMwMDAlMjcvJTNFJTNDL21hc2slM0UlM0NyZWN0IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyBmaWxsPSUyNyUyM2NjY2NjYyUyNyBtYXNrPSUyN3VybCUyOCUyM2ZyYW1lLWN1dG91dCUyOSUyNy8lM0UlM0Mvc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgdmlld0JveD0lMjcwIDAgMzIgMzIlMjclM0UlM0NwYXRoIGQ9JTI3TTggMTZoMTYlMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgd2lkdGg9JTI3MzIlMjcgaGVpZ2h0PSUyNzMyJTI3IHZpZXdCb3g9JTI3MCAwIDMyIDMyJTI3JTNFJTNDcGF0aCBkPSUyN002IDE3TDEyIDIzTDI2IDklMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcgc3Ryb2tlLWxpbmVqb2luPSUyN3JvdW5kJTI3LyUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ3BhdGggZD0lMjdNOCA4TDI0IDI0TTI0IDhMOCAyNCUyNyBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlPSUyNyUyM2ZmZiUyNyBzdHJva2Utd2lkdGg9JTI3MyUyNyBzdHJva2UtbGluZWNhcD0lMjdyb3VuZCUyNyBzdHJva2UtbGluZWpvaW49JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8zX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmFweC10cmlzdGF0ZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWluLXdpZHRoOjEzcHg7XG4gICAgbWluLWhlaWdodDoxM3B4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmFkaXVzOjNweDtcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAtLWFweC10cmlzdGF0ZS1jaGVja2VkLWNvbG9yOiAjMDY1NGJhO1xuICAgIC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3I6ICNmMDA7XG59XG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xufVxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi8qIFdoZW4gLS1taXhlZCBpcyB1c2VkIChlLmcuIHBhcmVudCArIHN1Yi1jaGVja2JveGVzKSwgZGFzaCBzaG93cyBvbmx5IHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkICovXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjphZnRlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjphZnRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLXRpY2stY29sb3IpO1xuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICAtd2Via2l0LW1hc2stc2l6ZTogMTAwJSAxMDAlO1xuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcbiAgICBtYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIG1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICBtYXNrLW1vZGU6IGFscGhhO1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xuICAgIG1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX199KTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG59XG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3IpO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQ6OmFmdGVyLFxuLmFweC10cmlzdGF0ZS5jcm9zc2VkOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0OiAwO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yKTtcbiAgICAtd2Via2l0LW1hc2stcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgLXdlYmtpdC1tYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICAtd2Via2l0LW1hc2stbW9kZTogYWxwaGE7XG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBtYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgbWFzay1zaXplOiAxMDAlIDEwMCU7XG4gICAgbWFzay1tb2RlOiBhbHBoYTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlciB7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19ffSk7XG4gICAgbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fX30pO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX199KTtcbiAgICBtYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zX19ffSk7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLDZCQUE2QjtJQUM3QixpQkFBaUI7SUFDakIsc0NBQXNDO0lBQ3RDLHFDQUFxQztJQUNyQyxrQ0FBa0M7QUFDdEM7QUFDQTtJQUNJLHlEQUE2WDtBQUNqWTtBQUNBO0lBQ0ksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLG9CQUFvQjtBQUN4QjtBQUNBLGlHQUFpRztBQUNqRzs7SUFFSSxhQUFhO0FBQ2pCO0FBQ0E7SUFDSSxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLDJEQUEyTztJQUMzTyxtREFBbU87QUFDdk87QUFDQTtJQUNJLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7O0FBRUE7O0lBRUksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLDJEQUEyUTtJQUMzUSxtREFBbVE7QUFDdlE7O0FBRUE7SUFDSSwyREFBK1E7SUFDL1EsbURBQXVRO0FBQzNRXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5hcHgtdHJpc3RhdGUge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1pbi13aWR0aDoxM3B4O1xcbiAgICBtaW4taGVpZ2h0OjEzcHg7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6M3B4O1xcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcjogIzA2NTRiYTtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY3Jvc3NlZC1jb2xvcjogI2YwMDtcXG59XFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NtYXNrIGlkPSdmcmFtZS1jdXRvdXQnJTNFJTNDcmVjdCB3aWR0aD0nMzInIGhlaWdodD0nMzInIGZpbGw9JyUyM2ZmZicvJTNFJTNDcmVjdCB4PSczJyB5PSczJyB3aWR0aD0nMjYnIGhlaWdodD0nMjYnIHJ4PSc0JyByeT0nNCcgZmlsbD0nJTIzMDAwJy8lM0UlM0MvbWFzayUzRSUzQ3JlY3Qgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyBmaWxsPSclMjNjY2NjY2MnIG1hc2s9J3VybCglMjNmcmFtZS1jdXRvdXQpJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGU6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLyogV2hlbiAtLW1peGVkIGlzIHVzZWQgKGUuZy4gcGFyZW50ICsgc3ViLWNoZWNrYm94ZXMpLCBkYXNoIHNob3dzIG9ubHkgd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQgKi9cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS1pbmRldGVybWluYXRlLWRhc2g6bm90KC5hcHgtdHJpc3RhdGUtLW1peGVkKTo6YWZ0ZXIge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YmVmb3JlIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YWZ0ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDE2aDE2JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG4gICAgbWFzay1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyB2aWV3Qm94PScwIDAgMzIgMzInJTNFJTNDcGF0aCBkPSdNOCAxNmgxNicgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XFxufVxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZCB7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS1jcm9zc2VkLWNvbG9yKTtcXG59XFxuXFxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlcixcXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY2hlY2tlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxuICAgIG1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTggOEwyNCAyNE0yNCA4TDggMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzZmZmJyBzdHJva2Utd2lkdGg9JzMnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRVxcXCIpO1xcbiAgICBtYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDhMMjQgMjRNMjQgOEw4IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHVybCA9IFN0cmluZyh1cmwuX19lc01vZHVsZSA/IHVybC5kZWZhdWx0IDogdXJsKTtcblxuICAvLyBJZiB1cmwgaXMgYWxyZWFkeSB3cmFwcGVkIGluIHF1b3RlcywgcmVtb3ZlIHRoZW1cbiAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gdXJsLnNsaWNlKDEsIC0xKTtcbiAgfVxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfVxuXG4gIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgLy8gU2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLTMvI3VybHNcbiAgaWYgKC9bXCInKCkgXFx0XFxuXXwoJTIwKS8udGVzdCh1cmwpIHx8IG9wdGlvbnMubmVlZFF1b3Rlcykge1xuICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQodXJsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKSwgXCJcXFwiXCIpO1xuICB9XG4gIHJldHVybiB1cmw7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiLy8gTW9kdWxlXG52YXIgY29kZSA9IFwiPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZ1xcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctY29udGVudFxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiQVBYLWNsb3NlLWRpYWxvZ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDxoMiBjbGFzcz1cXFwiQVBYLWRpYWxvZy10aXRsZVxcXCI+PC9oMj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lclxcXCI+PC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbjwvZGl2PlwiO1xuLy8gRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2RlOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdG9hc3QuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90b2FzdC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdHJpc3RhdGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90cmlzdGF0ZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8vIEZ1bmN0aW9uIHRvIGxvYWQgdGhlIENTUyBmcm9tIGEgZ2l2ZW4gVVJMXHJcbmZ1bmN0aW9uIGxvYWRDc3ModXJsKSB7XHJcbiAgICByZXR1cm4gZmV0Y2godXJsKVxyXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcclxuICAgICAgICAudGhlbihjc3MgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZVNoZWV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xyXG4gICAgICAgICAgICBzdHlsZVNoZWV0LnR5cGUgPSBcInRleHQvY3NzXCI7XHJcbiAgICAgICAgICAgIHN0eWxlU2hlZXQudGV4dENvbnRlbnQgPSBjc3M7ICAvLyBVc2UgdGV4dENvbnRlbnQgaW5zdGVhZCBvZiBpbm5lclRleHRcclxuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZVNoZWV0KTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCBDU1M6XCIsIGVycm9yKTtcclxuICAgICAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IHtcclxuICAgIGxvYWRDc3NcclxufSIsIi8vIEltcG9ydGluZyB0aGUgQ1NTIGFuZCBIVE1MIHRlbXBsYXRlc1xyXG5pbXBvcnQgJy4vY3NzL2RpYWxvZy5jc3MnO1xyXG5pbXBvcnQgZGlhbG9nVGVtcGxhdGUgZnJvbSAnLi9odG1sL2RpYWxvZy5odG1sP3Jhdyc7XHJcblxyXG5jb25zdCBjcmVhdGVEaWFsb2cgPSAob3B0aW9ucykgPT4ge1xyXG4gICAgY29uc3QgZGlhbG9nRGVmYXVsdHMgPSB7XHJcbiAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgIGNvbnRlbnQ6ICcnLFxyXG4gICAgICAgIGNvbnRlbnRVUkk6ICcnLFxyXG4gICAgICAgIGJ1dHRvbnM6IFtdLFxyXG4gICAgICAgIHNpemU6ICdtZWRpdW0nLFxyXG4gICAgICAgIHNob3dMb2FkaW5nSW5kaWNhdG9yOiBmYWxzZSxcclxuICAgICAgICBjb250ZW50TWV0aG9kOiAnR0VUJyxcclxuICAgICAgICBjb250ZW50RGF0YTogbnVsbCxcclxuICAgICAgICBjb250ZW50SGVhZGVyczogdW5kZWZpbmVkXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHsgdGl0bGUsIGNvbnRlbnQsIGNvbnRlbnRVUkksIGJ1dHRvbnMsIHNpemUsIHNob3dMb2FkaW5nSW5kaWNhdG9yLCBjb250ZW50TWV0aG9kLCBjb250ZW50RGF0YSwgY29udGVudEhlYWRlcnMgfSA9IHsgLi4uZGlhbG9nRGVmYXVsdHMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB3cmFwcGVyLmlubmVySFRNTCA9IGRpYWxvZ1RlbXBsYXRlLnRyaW0oKTtcclxuICAgIGNvbnN0IGRpYWxvZ0VsZW1lbnQgPSB3cmFwcGVyLmZpcnN0Q2hpbGQ7XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIGV2ZW50IG1hbmFnZW1lbnRcclxuICAgIGNvbnN0IGxpZmVjeWNsZVJlc29sdmVycyA9IHt9O1xyXG4gICAgY29uc3QgbGlmZWN5Y2xlRXZlbnRzID0ge307XHJcblxyXG4gICAgLy8gRGVmaW5lIGxpZmVjeWNsZSBwcm9taXNlcyBhcyBwcm9wZXJ0aWVzXHJcbiAgICBbJ29wZW5pbmcnLCAnb3BlbmVkJywgJ2Nsb3NpbmcnLCAnY2xvc2VkJywgJ2NvbnRlbnRMb2FkaW5nJywgJ2NvbnRlbnRMb2FkZWQnXS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgIGxpZmVjeWNsZUV2ZW50c1tldmVudF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgIGlmIChsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdKSB7XHJcbiAgICAgICAgICAgIGxpZmVjeWNsZVJlc29sdmVyc1tldmVudF0oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIHJlc29sdmVyIGZvdW5kIGZvciBsaWZlY3ljbGUgZXZlbnQ6ICR7ZXZlbnR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2cgPSB7XHJcbiAgICAgICAgZWxlbWVudDogZGlhbG9nRWxlbWVudCxcclxuICAgICAgICBidXR0b25zOiB7fSxcclxuICAgICAgICBpc0Nsb3NlZDogZmFsc2UsXHJcbiAgICAgICAgbGlmZWN5Y2xlOiBsaWZlY3ljbGVFdmVudHMsIC8vIExpZmVjeWNsZSBwcm9taXNlcyBkaXJlY3RseSBleHBvc2VkIGhlcmVcclxuICAgICAgICBkaXNhYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW5hYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9wZW46IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmluZycpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5vcGVuaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIElmIGxvYWRpbmcgaW5kaWNhdG9yIGlzIGVuYWJsZWQgYW5kIHdlJ3JlIGZldGNoaW5nIGNvbnRlbnQsIHNob3cgZGlhbG9nIGZpcnN0XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0xvYWRpbmdJbmRpY2F0b3IgJiYgY29udGVudFVSSSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBkaWFsb2cgdG8gdGhlIERPTSBhbmQgZGlzcGxheSBpdCBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBsb2FkaW5nIGluZGljYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWR5bmFtaWMtY29udGVudFwiKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3JcIj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExvYWQgY29udGVudCBhZnRlciBkaWFsb2cgaXMgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZldGNoQW5kSW5zZXJ0Q29udGVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiBsb2FkIGNvbnRlbnQgZmlyc3QsIHRoZW4gc2hvdyBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaEFuZEluc2VydENvbnRlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZGlhbG9nIHRvIHRoZSBET00gYW5kIGRpc3BsYXkgaXRcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmVkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLm9wZW5lZDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9wZW5pbmcgZGlhbG9nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zaW5nJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNsb3Npbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbmQgcmVtb3ZlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgY2xvc2VEaWFsb2dBbmRDbGVhbnVwKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY2xvc2VkO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGRpYWxvZyBjbG9zaW5nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjbG9zZURpYWxvZ0FuZENsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGRpYWxvZy5pc0Nsb3NlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBkaWFsb2cuaXNDbG9zZWQgPSB0cnVlO1xyXG4gICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRpYWxvZ0VsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzZXREaWFsb2dTaXplID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnQgPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1jb250ZW50XCIpO1xyXG4gICAgICAgIGNvbnN0IHNpemVzID0ge1xyXG4gICAgICAgICAgICBzbWFsbDogeyB3aWR0aDogJzMwMHB4JywgaGVpZ2h0OiAnMjAwcHgnIH0sXHJcbiAgICAgICAgICAgIG1lZGl1bTogeyB3aWR0aDogJzUwMHB4JywgaGVpZ2h0OiAnNDAwcHgnIH0sXHJcbiAgICAgICAgICAgIGxhcmdlOiB7IHdpZHRoOiAnODAwcHgnLCBoZWlnaHQ6ICc2MDBweCcgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChzaXplID09PSAnYXV0bycpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gc2l6ZXNbc2l6ZV0gfHwgKHR5cGVvZiBzaXplID09PSAnb2JqZWN0JyAmJiBzaXplKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRTaXplKSB7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbnRlbnQuc3R5bGUubWluV2lkdGggPSBzZWxlY3RlZFNpemUud2lkdGggfHwgJzUwMHB4JztcclxuICAgICAgICAgICAgZGlhbG9nQ29udGVudC5zdHlsZS5taW5IZWlnaHQgPSBzZWxlY3RlZFNpemUuaGVpZ2h0IHx8ICc0MDBweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhZGRCdXR0b25zID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXJcIik7XHJcblxyXG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoeyBrZXksIGxhYmVsLCBvcmRlciA9IDAsIGFsaWduID0gJ2ZsZXgtZW5kJywgY2xvc2VPbkNsaWNrID0gdHJ1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24nKTtcclxuICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gbGFiZWw7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5vcmRlciA9IG9yZGVyO1xyXG4gICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWtleScsIGtleSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYnV0dG9uIGNvbnRleHQgd2l0aCBkaXNhYmxlL2VuYWJsZSBtZXRob2RzXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRleHQgPSB7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlbmFibGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBidXR0b25cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbG9zZU9uQ2xpY2spIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBhcyBhIG9uZS10aW1lIFByb21pc2VcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENsaWNrUmVzb2x2ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsaWNrUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RDbGlja1Jlc29sdmVkICYmICFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2xpY2tSZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGlhbG9nLCBidXR0b246IGJ1dHRvbkNvbnRleHQgfSk7IC8vIFBhc3MgYm90aCBkaWFsb2cgYW5kIGJ1dHRvbiBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTsgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcHJvbWlzZSBmb3IgY2hhaW5pbmcgd2l0aCBgLnRoZW5gXHJcbiAgICAgICAgICAgICAgICBkaWFsb2cuYnV0dG9uc1trZXldID0gZmlyc3RDbGlja1Byb21pc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYXMgYSByZXBlYXRlZCBldmVudCBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlcnMgPSBbXTsgLy8gU3RvcmUgaGFuZGxlcnMgZm9yIGAudGhlbigpYFxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWNrUHJvbWlzZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGVuOiAoY2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChjYWxsYmFjayk7IC8vIEFkZCB0byBoYW5kbGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGlja1Byb21pc2U7IC8vIEFsbG93IGNoYWluaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcih7IGRpYWxvZywgYnV0dG9uOiBidXR0b25Db250ZXh0IH0pKTsgLy8gUGFzcyBib3RoIGRpYWxvZyBhbmQgYnV0dG9uIGNvbnRleHRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGRpYWxvZy5idXR0b25zW2tleV0gPSBjbGlja1Byb21pc2U7IC8vIEFzc2lnbiB0aGUgXCJmYWtlXCIgcHJvbWlzZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gYWxpZ247XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGZldGNoQW5kSW5zZXJ0Q29udGVudCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ3dhaXQnO1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb250ZW50ID0gZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY29udGVudExvYWRpbmcnKTtcclxuICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5jb250ZW50TG9hZGluZztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudFVSSVxyXG4gICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaENvbnRlbnQoY29udGVudFVSSSlcclxuICAgICAgICAgICAgICAgIDogY29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGR5bmFtaWNDb250ZW50LmlubmVySFRNTCA9IGNvbnRlbnRIdG1sO1xyXG5cclxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjb250ZW50TG9hZGVkJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY29udGVudExvYWRlZDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNvbnRlbnQ6JywgZXJyb3IpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gb3JpZ2luYWxDdXJzb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBmZXRjaENvbnRlbnQgPSBhc3luYyAodXJpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKGNvbnRlbnRNZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgIC8vIEFsd2F5cyBhbGxvdyBjdXN0b20gaGVhZGVyczsgd2Ugb25seSBhZGQgQ29udGVudC1UeXBlIHdoZW4gd2UgY2FuIGluZmVyIGl0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHsgLi4uKGNvbnRlbnRIZWFkZXJzIHx8IHt9KSB9O1xyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29tZSgoaykgPT4gay50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJ1aWxkIFJlcXVlc3RJbml0IGRlcGVuZGluZyBvbiBtZXRob2QgYW5kIGNvbnRlbnREYXRhIHR5cGUuXHJcbiAgICAgICAgICogV2UgYXZvaWQgc2V0dGluZyBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhIGFuZCByYXcgc3RyaW5nL0Jsb2IgcGF5bG9hZHMsXHJcbiAgICAgICAgICogdW5sZXNzIHRoZSBjYWxsZXIgZXhwbGljaXRseSBwcm92aWRlZCBpdCB2aWEgY29udGVudEhlYWRlcnMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaW5pdCA9IHsgbWV0aG9kIH07XHJcblxyXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdQT1NUJykge1xyXG4gICAgICAgICAgICBsZXQgYm9keSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRm9ybURhdGEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGNvbnRlbnREYXRhIGluc3RhbmNlb2YgRm9ybURhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGVudERhdGEgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQmxvYiA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZW50RGF0YSBpbnN0YW5jZW9mIEJsb2I7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIGNvbnRlbnREYXRhID09PSAnc3RyaW5nJztcclxuICAgICAgICAgICAgY29uc3QgaXNQbGFpbk9iamVjdCA9IGNvbnRlbnREYXRhICYmIHR5cGVvZiBjb250ZW50RGF0YSA9PT0gJ29iamVjdCcgJiYgIWlzRm9ybURhdGEgJiYgIWlzVVJMU2VhcmNoUGFyYW1zICYmICFpc0Jsb2I7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNGb3JtRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNldCBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhOyBicm93c2VyIHdpbGwgc2V0IHRoZSBib3VuZGFyeVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVVJMU2VhcmNoUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gY29udGVudERhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KGNvbnRlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFR5cGUpIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nIHx8IGlzQmxvYikge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudC1UeXBlIGxlZnQgdG8gY2FsbGVyIGlmIG5lZWRlZFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnREYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB0cnkgc2VuZCBhcy1pc1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBib2R5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmksIGluaXQpO1xyXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbnRlbnQ6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGRpYWxvZ1xyXG4gICAgc2V0RGlhbG9nU2l6ZSgpO1xyXG4gICAgYWRkQnV0dG9ucygpO1xyXG5cclxuICAgIC8vIFNldCB0aXRsZSBhbmQgY2xvc2UgYnV0dG9uIGhhbmRsZXJcclxuICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLXRpdGxlXCIpLnRleHRDb250ZW50ID0gdGl0bGU7XHJcbiAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtY2xvc2UtZGlhbG9nJykub25jbGljayA9IGRpYWxvZy5jbG9zZTtcclxuXHJcbiAgICByZXR1cm4gZGlhbG9nO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRGlhbG9nO1xyXG4iLCJsZXQgY291bnRlciA9IDA7XHJcbmNvbnN0IGRvQ2FsbGJhY2tzID0ge307XHJcbmNvbnN0IHRpbWVvdXRzID0ge307XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbGVtZW50cyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGRvIG1ldGhvZCB0byBhZGQgY2FsbGJhY2sgZnVuY3Rpb25zLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gVGhlIGFweCBvYmplY3QgdG8gYXVnbWVudCB3aXRoIHRoZSBsaXN0ZW4gZnVuY3Rpb24uXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIGF1Z21lbnRlZCBhcHggb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgbGV0IGVsZW1lbnRzID0gYXB4LmVsZW1lbnRzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkbyBtZXRob2QgdG8gYWRkIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yIChlLmcuICdjbGljaycsICdrZXlkb3duJywgZXRjLikuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSAtIFRoZSBDU1Mgc2VsZWN0b3IgdG8gdXNlIGZvciBldmVudCBkZWxlZ2F0aW9uIChvcHRpb25hbCkuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGEgZG8gbWV0aG9kIHRvIGFkZCBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICogICBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQhJywgZXZlbnQudGFyZ2V0KTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBhcHgubGlzdGVuID0gZnVuY3Rpb24gKGV2ZW50VHlwZXMsIHNlY29uZEFyZ3VtZW50LCB0aGlyZEFyZ3VtZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdG9yO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBzZWxlY3RvciBvciBvcHRpb25zXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzZWNvbmRBcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWNvbmRBcmd1bWVudDtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXJkQXJndW1lbnQgfHwge307XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHNlY29uZEFyZ3VtZW50IHx8IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgdGltZW91dER1cmF0aW9uID0gb3B0aW9ucy50aW1lb3V0IHx8IDA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50VHlwZXMpKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZXMgPSBbZXZlbnRUeXBlc107IC8vIEVuc3VyZSBldmVudFR5cGVzIGlzIGFuIGFycmF5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGV2ZW50VHlwZXMuZm9yRWFjaCgoZXZlbnRUeXBlKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgZG9DYWxsYmFja3Mgb2JqZWN0IGZvciB0aGUgY3VycmVudCBldmVudCBsaXN0ZW5lci5cclxuICAgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9DYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cclxuICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH0gLSBSZXR1cm5zIHRoZSBjdXJyZW50IG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxscy5cclxuICAgICAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgKiAgIGNvbnNvbGUubG9nKCdCdXR0b24gY2xpY2tlZCEnLCBldmVudC50YXJnZXQpO1xyXG4gICAgICAgICAgICAgKiB9KS5kbygoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICogICBjb25zb2xlLmxvZygnQW5vdGhlciBjYWxsYmFjayBmdW5jdGlvbiEnKTtcclxuICAgICAgICAgICAgICogfSk7XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBkbzogZnVuY3Rpb24gKGRvQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICghZG9DYWxsYmFja3NbdW5pcXVlSWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkb0NhbGxiYWNrc1t1bmlxdWVJZF0ucHVzaChkb0NhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxsc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFudWFsbHkgdHJpZ2dlcnMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUgb24gYWxsIGVsZW1lbnRzIG9yIGNyZWF0ZXMgYSBuZXcgZXZlbnQgaWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gdHJpZ2dlci4gVGhpcyBjYW4gYmUgYW4gZXZlbnQgdHlwZSBzdHJpbmcgKGxpa2UgJ2NsaWNrJykgb3IgYW4gYWN0dWFsIEV2ZW50IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXB4LnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICBsZXQgZXZlbnRUeXBlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50O1xyXG4gICAgICAgICAgICBldmVudCA9IG5ldyBFdmVudChldmVudCwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xyXG4gICAgICAgICAgICBldmVudFR5cGUgPSBldmVudC50eXBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZXZlbnQgdHlwZSBwcm92aWRlZCB0byBhcHgudHJpZ2dlci4gSXQgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgRXZlbnQgb2JqZWN0LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOyAgLy8gVGhpcyB3aWxsIGFsbG93IHRoZSBldmVudCB0byBidWJibGUgdXAgbmF0dXJhbGx5LlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgZXZlbnQgZGVsZWdhdGlvbiBtYW51YWxseSBieSBleGVjdXRpbmcgY2FsbGJhY2tzIGlmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3JcclxuICAgICAgICBPYmplY3Qua2V5cyhkb0NhbGxiYWNrcykuZm9yRWFjaCgodW5pcXVlSWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tEZXRhaWxzID0gZG9DYWxsYmFja3NbdW5pcXVlSWRdO1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tEZXRhaWxzICYmIGNhbGxiYWNrRGV0YWlscy5ldmVudFR5cGUgPT09IGV2ZW50VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IHRhcmdldCBtYXRjaGVzIHRoZSBzZWxlY3RvciB1c2VkIGR1cmluZyBsaXN0ZW5lciByZWdpc3RyYXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IGNhbGxiYWNrRGV0YWlscztcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0b3IgfHwgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrcyhldmVudCwgdW5pcXVlSWQsIDAsIHNlbGVjdG9yLCBldmVudC50YXJnZXQpOyAgLy8gSW1tZWRpYXRlIGV4ZWN1dGlvbiwgbm8gdGltZW91dFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59O1xyXG5cclxuXHJcbmZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yID0gJycsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRFbGVtZW50ID0gc2VsZWN0b3IgPyBjbG9zZXN0KGV2ZW50LnRhcmdldCwgc2VsZWN0b3IpIDogZWxlbWVudDtcclxuICAgIGlmICghbWF0Y2hlZEVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIHRpbWVvdXQgZm9yIHRoaXMgdW5pcXVlSWQgdG8gcHJldmVudCB1bmludGVuZGVkIGJlaGF2aW9yXHJcbiAgICBjbGVhclRpbWVvdXQodGltZW91dHNbdW5pcXVlSWRdKTtcclxuXHJcbiAgICAvLyBGdW5jdGlvbiB0byBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBvZiBjYWxsYmFja3NcclxuICAgIGZ1bmN0aW9uIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCkge1xyXG4gICAgICAgIGlmIChkb0NhbGxiYWNrc1t1bmlxdWVJZF0pIHtcclxuICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdLnJlZHVjZSgocHJldlByb21pc2UsIGRvQ2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2UHJvbWlzZS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZG9DYWxsYmFjay5iaW5kKG1hdGNoZWRFbGVtZW50KShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goKCkgPT4ge30pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aW1lb3V0RHVyYXRpb24gaXMgemVybyB0byBkZWNpZGUgd2hldGhlciB0byBkZWxheSB0aGUgY2FsbGJhY2sgZXhlY3V0aW9uIG9yIG5vdFxyXG4gICAgaWYgKHRpbWVvdXREdXJhdGlvbiA9PT0gMCkge1xyXG4gICAgICAgIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRpbWVvdXRzW3VuaXF1ZUlkXSA9IHNldFRpbWVvdXQoaGFuZGxlQ2FsbGJhY2tFeGVjdXRpb24sIHRpbWVvdXREdXJhdGlvbik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZVVuaXF1ZUlkKCkge1xyXG4gICAgY29uc3QgcmFuZG9tUGFydCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTsgLy8gTW9yZSByYW5kb21uZXNzXHJcbiAgICBjb25zdCB1bmlxdWVJZCA9IGAke0RhdGUubm93KCl9XyR7cmFuZG9tUGFydH1fJHtjb3VudGVyfWA7XHJcbiAgICBjb3VudGVyID0gKGNvdW50ZXIgKyAxKSAlIDEwMDA7IC8vIFJlc2V0IGNvdW50ZXIgdG8gYXZvaWQgb3ZlcmZsb3dcclxuXHJcbiAgICByZXR1cm4gdW5pcXVlSWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb3Nlc3QoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcbiIsImltcG9ydCAnLi9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcyc7XHJcblxyXG5jb25zdCBEQVRBX0tFWSA9ICdfYXB4U2Nyb2xsYWJsZVRhYmxlJztcclxuY29uc3QgQ0xBU1NfVEFCTEUgPSAnYXB4LXNjcm9sbGFibGUtdGFibGUnO1xyXG5cclxuY29uc3QgREVGQVVMVF9NQVhfSEVJR0hUID0gJzIwMHB4JztcclxuXHJcbmNvbnN0IFRIUk9UVExFX01TID0gMTY7XHJcblxyXG4vKiogQHR5cGUge1NldDxIVE1MVGFibGVFbGVtZW50Pn0gKi9cclxuY29uc3QgZHluYW1pY1RhYmxlcyA9IG5ldyBTZXQoKTtcclxuLyoqIEB0eXBlIHtNYXA8RWxlbWVudCwgU2V0PEhUTUxUYWJsZUVsZW1lbnQ+Pn0gKi9cclxuY29uc3Qgc2Nyb2xsU291cmNlVG9UYWJsZXMgPSBuZXcgTWFwKCk7XHJcbi8qKiBAdHlwZSB7TWFwPEVsZW1lbnQsIFNldDxIVE1MVGFibGVFbGVtZW50Pj59ICovXHJcbmNvbnN0IHJlc2l6ZVNvdXJjZVRvVGFibGVzID0gbmV3IE1hcCgpO1xyXG4vKiogQHR5cGUge2Jvb2xlYW59ICovXHJcbmxldCByZXNpemVXaW5kb3dBdHRhY2hlZCA9IGZhbHNlO1xyXG4vKiogQHR5cGUge1Jlc2l6ZU9ic2VydmVyfG51bGx9ICovXHJcbmxldCByZXNpemVPYnNlcnZlciA9IG51bGw7XHJcbi8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG5sZXQgdGhyb3R0bGVMYXN0ID0gMDtcclxuLyoqIEB0eXBlIHtudW1iZXJ8bnVsbH0gKi9cclxubGV0IHRocm90dGxlUmFmID0gbnVsbDtcclxuXHJcbi8qKlxyXG4gKiBTdW0gb2YgY29sc3BhbnMgZm9yIG9uZSByb3cgKGRpcmVjdCB0aC90ZCBjaGlsZHJlbiBvZiB0cikuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlUm93RWxlbWVudH0gdHJcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIGdldFJvd0NvbHVtbkNvdW50KHRyKSB7XHJcbiAgICBsZXQgY29scyA9IDA7XHJcbiAgICB0ci5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0aCwgOnNjb3BlID4gdGQnKS5mb3JFYWNoKChjZWxsKSA9PiB7XHJcbiAgICAgICAgY29scyArPSBwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpLCAxMCkgfHwgMTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNvbHM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgbWF4aW11bSBjb2x1bW4gY291bnQgaW4gYSBzZWN0aW9uIChtYXggc3VtIG9mIGNvbHNwYW5zIGFjcm9zcyBhbGwgcm93cykuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnR9IHNlY3Rpb24gLSB0aGVhZCwgdGJvZHksIG9yIHRmb290XHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDb2x1bW5Db3VudEZyb21TZWN0aW9uKHNlY3Rpb24pIHtcclxuICAgIGlmICghc2VjdGlvbikgcmV0dXJuIDA7XHJcbiAgICBjb25zdCByb3dzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpO1xyXG4gICAgbGV0IG1heENvbHMgPSAwO1xyXG4gICAgcm93cy5mb3JFYWNoKCh0cikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN1bSA9IGdldFJvd0NvbHVtbkNvdW50KHRyKTtcclxuICAgICAgICBpZiAoc3VtID4gbWF4Q29scykgbWF4Q29scyA9IHN1bTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG1heENvbHM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdG90YWwgY29sdW1uIGNvdW50IGZvciB0aGUgdGFibGUgKG1heCBhY3Jvc3MgdGhlYWQsIHRib2R5LCB0Zm9vdCkuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIGdldFRhYmxlQ29sdW1uQ291bnQodGFibGUpIHtcclxuICAgIGNvbnN0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuICAgIGNvbnN0IHRmb290ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGZvb3QnKTtcclxuICAgIGNvbnN0IGNvdW50VGhlYWQgPSB0aGVhZCA/IGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24odGhlYWQpIDogMDtcclxuICAgIGNvbnN0IGNvdW50VGJvZHkgPSB0Ym9keSA/IGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24odGJvZHkpIDogMDtcclxuICAgIGNvbnN0IGNvdW50VGZvb3QgPSB0Zm9vdCA/IGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24odGZvb3QpIDogMDtcclxuICAgIHJldHVybiBNYXRoLm1heChjb3VudFRoZWFkLCBjb3VudFRib2R5LCBjb3VudFRmb290LCAxKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE1lYXN1cmUgY3VycmVudCBjb2x1bW4gd2lkdGhzIGZyb20gdGhlIHRhYmxlIGluIGl0cyBuYXR1cmFsIGxheW91dCAoYmVmb3JlIGFwcGx5aW5nIHNjcm9sbGFibGUgY2xhc3MpLlxyXG4gKiBQcmVmZXJzIGEgcm93IHdoZXJlIGVhY2ggY2VsbCBoYXMgY29sc3BhbiAxIHNvIHdlIGdldCBvbmUgd2lkdGggcGVyIGNvbHVtbjsgb3RoZXJ3aXNlIHNwbGl0cyBjZWxsIHdpZHRocyBieSBjb2xzcGFuLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlIC0gdGFibGUgbm90IHlldCB3aXRoIHNjcm9sbGFibGUgY2xhc3NcclxuICogQHBhcmFtIHtudW1iZXJ9IG51bUNvbHNcclxuICogQHJldHVybnMge251bWJlcltdfSBwaXhlbCB3aWR0aHMgcGVyIGNvbHVtblxyXG4gKi9cclxuZnVuY3Rpb24gbWVhc3VyZUNvbHVtbldpZHRocyh0YWJsZSwgbnVtQ29scykge1xyXG4gICAgY29uc3QgdGhlYWQgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpO1xyXG4gICAgY29uc3QgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBbdGhlYWQsIHRib2R5XS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICAvKiogQHR5cGUge0hUTUxUYWJsZVJvd0VsZW1lbnR8bnVsbH0gKi9cclxuICAgIGxldCBiZXN0Um93ID0gbnVsbDtcclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHJvd3MgPSBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRyJyk7XHJcbiAgICAgICAgZm9yIChjb25zdCB0ciBvZiByb3dzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gdHIucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJyk7XHJcbiAgICAgICAgICAgIGlmIChnZXRSb3dDb2x1bW5Db3VudCh0cikgIT09IG51bUNvbHMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBhbGxTaW5nbGUgPSBBcnJheS5mcm9tKGNlbGxzKS5ldmVyeSgoYykgPT4gKHBhcnNlSW50KGMuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJyksIDEwKSB8fCAxKSA9PT0gMSk7XHJcbiAgICAgICAgICAgIGlmIChhbGxTaW5nbGUgJiYgY2VsbHMubGVuZ3RoID09PSBudW1Db2xzKSB7XHJcbiAgICAgICAgICAgICAgICBiZXN0Um93ID0gdHI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWJlc3RSb3cpIGJlc3RSb3cgPSB0cjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJlc3RSb3cgJiYgQXJyYXkuZnJvbShiZXN0Um93LnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRoLCA6c2NvcGUgPiB0ZCcpKS5ldmVyeSgoYykgPT4gKHBhcnNlSW50KGMuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJyksIDEwKSB8fCAxKSA9PT0gMSkpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgaWYgKCFiZXN0Um93KSByZXR1cm4gW107XHJcblxyXG4gICAgY29uc3Qgd2lkdGhzID0gbmV3IEFycmF5KG51bUNvbHMpLmZpbGwoMCk7XHJcbiAgICBjb25zdCBjZWxscyA9IGJlc3RSb3cucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJyk7XHJcbiAgICBsZXQgY29sID0gMDtcclxuICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgIGNvbnN0IHNwYW4gPSBNYXRoLm1pbihwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpLCAxMCkgfHwgMSwgbnVtQ29scyAtIGNvbCk7XHJcbiAgICAgICAgaWYgKHNwYW4gPD0gMCkgYnJlYWs7XHJcbiAgICAgICAgY29uc3QgdyA9IGNlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XHJcbiAgICAgICAgY29uc3QgcGVyQ29sID0gdyAvIHNwYW47XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFuOyBpKyspIHdpZHRoc1tjb2wgKyBpXSA9IHBlckNvbDtcclxuICAgICAgICBjb2wgKz0gc3BhbjtcclxuICAgIH1cclxuICAgIGlmIChjb2wgPT09IDApIHJldHVybiBbXTtcclxuICAgIGNvbnN0IGZhbGxiYWNrID0gd2lkdGhzLnNvbWUoKHcpID0+IHcgPiAwKSA/IE1hdGgubWF4KDgwLCAuLi53aWR0aHMuZmlsdGVyKCh3KSA9PiB3ID4gMCkpIC8gMiA6IDgwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db2xzOyBpKyspIGlmICh3aWR0aHNbaV0gPD0gMCkgd2lkdGhzW2ldID0gZmFsbGJhY2s7XHJcbiAgICByZXR1cm4gd2lkdGhzLnNsaWNlKDAsIG51bUNvbHMpO1xyXG59XHJcblxyXG4vKipcclxuICogQ291bnQgZGlyZWN0IHRyIGNoaWxkcmVuIGluIGEgc2VjdGlvbi5cclxuICogQHBhcmFtIHtIVE1MVGFibGVTZWN0aW9uRWxlbWVudH0gc2VjdGlvblxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Um93Q291bnQoc2VjdGlvbikge1xyXG4gICAgaWYgKCFzZWN0aW9uKSByZXR1cm4gMDtcclxuICAgIHJldHVybiBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRyJykubGVuZ3RoO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGQgYSAyRCBncmlkIG9mIG9jY3VwaWVkIHNsb3RzIGZvciBhIHNlY3Rpb24gKGZvciByb3dzcGFuL2NvbHNwYW4gcGxhY2VtZW50KS5cclxuICogUGxhY2UgZWFjaCBjZWxsIGluIERPTSBvcmRlcjsgcmV0dXJuIGEgbGlzdCBvZiB7IGNlbGwsIHJvdywgY29sLCBjb2xzcGFuLCByb3dzcGFuIH0uXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnR9IHNlY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IG51bVJvd3NcclxuICogQHBhcmFtIHtudW1iZXJ9IG51bUNvbHNcclxuICogQHJldHVybnMge3sgY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlciwgY29sc3BhbjogbnVtYmVyLCByb3dzcGFuOiBudW1iZXIgfVtdfVxyXG4gKi9cclxuZnVuY3Rpb24gY29tcHV0ZUNlbGxQbGFjZW1lbnRzKHNlY3Rpb24sIG51bVJvd3MsIG51bUNvbHMpIHtcclxuICAgIGlmICghc2VjdGlvbiB8fCBudW1Sb3dzID09PSAwIHx8IG51bUNvbHMgPT09IDApIHJldHVybiBbXTtcclxuICAgIGNvbnN0IG9jY3VwaWVkID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtUm93cyB9LCAoKSA9PiBBcnJheShudW1Db2xzKS5maWxsKGZhbHNlKSk7XHJcbiAgICBjb25zdCBwbGFjZW1lbnRzID0gW107XHJcbiAgICBjb25zdCByb3dzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpO1xyXG5cclxuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcm93cy5sZW5ndGg7IHIrKykge1xyXG4gICAgICAgIGNvbnN0IHRyID0gcm93c1tyXTtcclxuICAgICAgICBjb25zdCBjZWxscyA9IHRyLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRoLCA6c2NvcGUgPiB0ZCcpO1xyXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICBjb25zdCBjb2xzcGFuID0gTWF0aC5taW4ocGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nKSwgMTApIHx8IDEsIG51bUNvbHMpO1xyXG4gICAgICAgICAgICBjb25zdCByb3dzcGFuID0gTWF0aC5taW4ocGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoJ3Jvd3NwYW4nKSwgMTApIHx8IDEsIG51bVJvd3MgLSByKTtcclxuICAgICAgICAgICAgbGV0IGNvbCA9IDA7XHJcbiAgICAgICAgICAgIHdoaWxlIChjb2wgPCBudW1Db2xzKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZnJlZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByciA9IHI7IHJyIDwgciArIHJvd3NwYW4gJiYgZnJlZTsgcnIrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNjID0gY29sOyBjYyA8IGNvbCArIGNvbHNwYW4gJiYgZnJlZTsgY2MrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2NjdXBpZWRbcnJdPy5bY2NdKSBmcmVlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZyZWUpIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY29sKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvbCArIGNvbHNwYW4gPiBudW1Db2xzKSBjb250aW51ZTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcnIgPSByOyByciA8IHIgKyByb3dzcGFuOyBycisrKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjYyA9IGNvbDsgY2MgPCBjb2wgKyBjb2xzcGFuOyBjYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9jY3VwaWVkW3JyXSkgb2NjdXBpZWRbcnJdW2NjXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGxhY2VtZW50cy5wdXNoKHsgY2VsbCwgcm93OiByLCBjb2wsIGNvbHNwYW4sIHJvd3NwYW4gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBsYWNlbWVudHM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBseSBncmlkIHBsYWNlbWVudCBzdHlsZXMgdG8gYSBsaXN0IG9mIHBsYWNlbWVudHMgKDEtYmFzZWQgbGluZSBudW1iZXJzIGZvciBDU1MgR3JpZCkuXHJcbiAqL1xyXG5mdW5jdGlvbiBhcHBseVBsYWNlbWVudHMocGxhY2VtZW50cykge1xyXG4gICAgcGxhY2VtZW50cy5mb3JFYWNoKCh7IGNlbGwsIHJvdywgY29sLCBjb2xzcGFuLCByb3dzcGFuIH0pID0+IHtcclxuICAgICAgICBjZWxsLnN0eWxlLmdyaWRSb3cgPSBgJHtyb3cgKyAxfSAvIHNwYW4gJHtyb3dzcGFufWA7XHJcbiAgICAgICAgY2VsbC5zdHlsZS5ncmlkQ29sdW1uID0gYCR7Y29sICsgMX0gLyBzcGFuICR7Y29sc3Bhbn1gO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbGVhciBncmlkIHBsYWNlbWVudCBzdHlsZXMgZnJvbSBhbGwgdGgvdGQgaW4gYSB0YWJsZSAoZm9yIHJlZnJlc2gpLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXHJcbiAqL1xyXG5mdW5jdGlvbiBjbGVhclBsYWNlbWVudHModGFibGUpIHtcclxuICAgIHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoLCB0ZCcpLmZvckVhY2goKGNlbGwpID0+IHtcclxuICAgICAgICBjZWxsLnN0eWxlLmdyaWRSb3cgPSAnJztcclxuICAgICAgICBjZWxsLnN0eWxlLmdyaWRDb2x1bW4gPSAnJztcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogTm9ybWFsaXplIGhlaWdodC9tYXhIZWlnaHQgb3B0aW9uIHRvIGEgQ1NTIGxlbmd0aCBzdHJpbmcuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWVcclxuICogQHJldHVybnMge3N0cmluZ31cclxuICovXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZUhlaWdodCh2YWx1ZSkge1xyXG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBERUZBVUxUX01BWF9IRUlHSFQ7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIGAke3ZhbHVlfXB4YDtcclxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzb2x2ZSBjdXJyZW50IGJvZHkgaGVpZ2h0IGZyb20gb3B0aW9uczogZWl0aGVyIGJvZHlIZWlnaHREeW5hbWljLmdldCh0YWJsZSkgb3Igc3RhdGljIGhlaWdodC9tYXhIZWlnaHQuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnMgKG1heSBpbmNsdWRlIGJvZHlIZWlnaHREeW5hbWljLCBoZWlnaHQsIG1heEhlaWdodClcclxuICogQHBhcmFtIHtIVE1MVGFibGVFbGVtZW50fSB0YWJsZVxyXG4gKiBAcmV0dXJucyB7eyBib2R5U2l6ZTogc3RyaW5nLCB1c2VGaXhlZEhlaWdodDogYm9vbGVhbiB9fVxyXG4gKi9cclxuZnVuY3Rpb24gcmVzb2x2ZUJvZHlIZWlnaHQob3B0aW9ucywgdGFibGUpIHtcclxuICAgIGNvbnN0IGR5biA9IG9wdGlvbnMuYm9keUhlaWdodER5bmFtaWM7XHJcbiAgICBpZiAoZHluICYmIHR5cGVvZiBkeW4uZ2V0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkeW4uZ2V0KHRhYmxlKTtcclxuICAgICAgICBjb25zdCBib2R5U2l6ZSA9IG5vcm1hbGl6ZUhlaWdodCh2YWx1ZSk7XHJcbiAgICAgICAgY29uc3QgdXNlRml4ZWRIZWlnaHQgPSBkeW4udXNlQXMgPT09ICdoZWlnaHQnO1xyXG4gICAgICAgIHJldHVybiB7IGJvZHlTaXplLCB1c2VGaXhlZEhlaWdodCB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgdXNlRml4ZWRIZWlnaHQgPSBvcHRpb25zLmhlaWdodCAhPSBudWxsO1xyXG4gICAgY29uc3QgcmF3ID0gdXNlRml4ZWRIZWlnaHQgPyBvcHRpb25zLmhlaWdodCA6IG9wdGlvbnMubWF4SGVpZ2h0O1xyXG4gICAgY29uc3QgYm9keVNpemUgPSBub3JtYWxpemVIZWlnaHQocmF3KTtcclxuICAgIHJldHVybiB7IGJvZHlTaXplLCB1c2VGaXhlZEhlaWdodCB9O1xyXG59XHJcblxyXG4vKipcclxuICogVXBkYXRlIG9ubHkgdGhlIHRib2R5IGhlaWdodCBDU1MgdmFyaWFibGUgYW5kIGNsYXNzICh1c2VkIG9uIHNjcm9sbC9yZXNpemUgZm9yIGR5bmFtaWMgaGVpZ2h0KS5cclxuICogQHBhcmFtIHtIVE1MVGFibGVFbGVtZW50fSB0YWJsZVxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGZ1bGwgc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnMgKHdpdGggcmVmLm9wdGlvbnMgd2hlbiBjYWxsZWQgZnJvbSB0aHJvdHRsZSlcclxuICovXHJcbmZ1bmN0aW9uIHVwZGF0ZVRhYmxlQm9keUhlaWdodCh0YWJsZSwgb3B0aW9ucykge1xyXG4gICAgY29uc3QgeyBib2R5U2l6ZSwgdXNlRml4ZWRIZWlnaHQgfSA9IHJlc29sdmVCb2R5SGVpZ2h0KG9wdGlvbnMsIHRhYmxlKTtcclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCcsIGJvZHlTaXplKTtcclxuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1ib2R5LWhlaWdodCcsIHVzZUZpeGVkSGVpZ2h0KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJ1biBsYXp5IGNsZWFudXAgdGhlbiB1cGRhdGVUYWJsZUJvZHlIZWlnaHQgZm9yIGFsbCB0YWJsZXMgc3RpbGwgaW4gZHluYW1pY1RhYmxlcy4gKENhbGxlZCBieSB0aHJvdHRsZWQgZW50cnkgcG9pbnQgb3IgUkFGLilcclxuICovXHJcbmZ1bmN0aW9uIGZsdXNoRHluYW1pY0hlaWdodFVwZGF0ZSgpIHtcclxuICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XHJcbiAgICBkeW5hbWljVGFibGVzLmZvckVhY2goKHRhYmxlKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0YWJsZS5pc0Nvbm5lY3RlZCkgdG9SZW1vdmUucHVzaCh0YWJsZSk7XHJcbiAgICB9KTtcclxuICAgIHRvUmVtb3ZlLmZvckVhY2goKHRhYmxlKSA9PiByZW1vdmVUYWJsZUZyb21EeW5hbWljU291cmNlcyh0YWJsZSkpO1xyXG4gICAgZHluYW1pY1RhYmxlcy5mb3JFYWNoKCh0YWJsZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHRhYmxlW0RBVEFfS0VZXTtcclxuICAgICAgICBpZiAocmVmPy5vcHRpb25zKSB1cGRhdGVUYWJsZUJvZHlIZWlnaHQodGFibGUsIHJlZi5vcHRpb25zKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogVGhyb3R0bGVkIGVudHJ5OiBydW4gZmx1c2hEeW5hbWljSGVpZ2h0VXBkYXRlIG5vdyBvciBzY2hlZHVsZSB3aXRoIFJBRi5cclxuICovXHJcbmZ1bmN0aW9uIHJ1bkR5bmFtaWNIZWlnaHRVcGRhdGUoKSB7XHJcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgaWYgKG5vdyAtIHRocm90dGxlTGFzdCA8IFRIUk9UVExFX01TKSB7XHJcbiAgICAgICAgaWYgKCF0aHJvdHRsZVJhZikge1xyXG4gICAgICAgICAgICB0aHJvdHRsZVJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdHRsZVJhZiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aHJvdHRsZUxhc3QgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgZmx1c2hEeW5hbWljSGVpZ2h0VXBkYXRlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aHJvdHRsZUxhc3QgPSBub3c7XHJcbiAgICBmbHVzaER5bmFtaWNIZWlnaHRVcGRhdGUoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc29sdmUgdXBkYXRlT24gaW50byBzY3JvbGwgdGFyZ2V0cyAoRWxlbWVudFtdKSBhbmQgcmVzaXplOiB7IHdpbmRvdzogYm9vbGVhbiwgZWxlbWVudHM6IEVsZW1lbnRbXSB9LlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMuYm9keUhlaWdodER5bmFtaWMudXBkYXRlT25cclxuICogQHJldHVybnMge3sgc2Nyb2xsVGFyZ2V0czogRWxlbWVudFtdLCByZXNpemVXaW5kb3c6IGJvb2xlYW4sIHJlc2l6ZUVsZW1lbnRzOiBFbGVtZW50W10gfX1cclxuICovXHJcbmZ1bmN0aW9uIHJlc29sdmVVcGRhdGVPbihvcHRpb25zKSB7XHJcbiAgICBjb25zdCB1ID0gb3B0aW9ucz8uYm9keUhlaWdodER5bmFtaWM/LnVwZGF0ZU9uO1xyXG4gICAgY29uc3Qgc2Nyb2xsT24gPSB1Py5zY3JvbGxPbjtcclxuICAgIGNvbnN0IHJlc2l6ZU9uID0gdT8ucmVzaXplT247XHJcbiAgICBjb25zdCBzY3JvbGxUYXJnZXRzID0gW107XHJcbiAgICBpZiAoc2Nyb2xsT24gIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHNjcm9sbE9uKSAmJiBzY3JvbGxPbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgc2Nyb2xsT24uZm9yRWFjaCgoeCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoeCA9PT0gJ2RvY3VtZW50Jykgc2Nyb2xsVGFyZ2V0cy5wdXNoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHggJiYgdHlwZW9mIHguYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgc2Nyb2xsVGFyZ2V0cy5wdXNoKHgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh1Py5zY3JvbGwgPT09IHRydWUpIHtcclxuICAgICAgICBzY3JvbGxUYXJnZXRzLnB1c2goZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcclxuICAgICAgICBzY3JvbGxUYXJnZXRzLnB1c2godHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xyXG4gICAgfVxyXG4gICAgbGV0IHJlc2l6ZVdpbmRvdyA9IGZhbHNlO1xyXG4gICAgY29uc3QgcmVzaXplRWxlbWVudHMgPSBbXTtcclxuICAgIGlmIChyZXNpemVPbiAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkocmVzaXplT24pICYmIHJlc2l6ZU9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICByZXNpemVPbi5mb3JFYWNoKCh4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh4ID09PSAnd2luZG93JykgcmVzaXplV2luZG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgZWxzZSBpZiAoeCAmJiB0eXBlb2YgeC5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXNpemVFbGVtZW50cy5wdXNoKHgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh1Py5yZXNpemUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmVzaXplV2luZG93ID0gdHJ1ZTtcclxuICAgICAgICByZXNpemVFbGVtZW50cy5wdXNoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBzY3JvbGxUYXJnZXRzLCByZXNpemVXaW5kb3csIHJlc2l6ZUVsZW1lbnRzIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgdGFibGUgZnJvbSBkeW5hbWljVGFibGVzIGFuZCBmcm9tIGFsbCBzY3JvbGwvcmVzaXplIE1hcHM7IGRldGFjaCBsaXN0ZW5lcnMgaWYgU2V0IGJlY29tZXMgZW1wdHkuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcclxuICovXHJcbmZ1bmN0aW9uIHJlbW92ZVRhYmxlRnJvbUR5bmFtaWNTb3VyY2VzKHRhYmxlKSB7XHJcbiAgICBkeW5hbWljVGFibGVzLmRlbGV0ZSh0YWJsZSk7XHJcbiAgICBzY3JvbGxTb3VyY2VUb1RhYmxlcy5mb3JFYWNoKChzZXQsIGVsKSA9PiB7XHJcbiAgICAgICAgc2V0LmRlbGV0ZSh0YWJsZSk7XHJcbiAgICAgICAgaWYgKHNldC5zaXplID09PSAwKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbFNvdXJjZVRvVGFibGVzLmRlbGV0ZShlbCk7XHJcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsVGhyb3R0bGVkKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJlc2l6ZVNvdXJjZVRvVGFibGVzLmZvckVhY2goKHNldCwgZWwpID0+IHtcclxuICAgICAgICBzZXQuZGVsZXRlKHRhYmxlKTtcclxuICAgICAgICBpZiAoc2V0LnNpemUgPT09IDApIHtcclxuICAgICAgICAgICAgcmVzaXplU291cmNlVG9UYWJsZXMuZGVsZXRlKGVsKTtcclxuICAgICAgICAgICAgaWYgKHJlc2l6ZU9ic2VydmVyKSByZXNpemVPYnNlcnZlci51bm9ic2VydmUoZWwpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKHJlc2l6ZVdpbmRvd0F0dGFjaGVkICYmIGR5bmFtaWNUYWJsZXMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZVRocm90dGxlZCk7XHJcbiAgICAgICAgcmVzaXplV2luZG93QXR0YWNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gb25TY3JvbGxUaHJvdHRsZWQoKSB7XHJcbiAgICBydW5EeW5hbWljSGVpZ2h0VXBkYXRlKCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG9uUmVzaXplVGhyb3R0bGVkKCkge1xyXG4gICAgcnVuRHluYW1pY0hlaWdodFVwZGF0ZSgpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVnaXN0ZXIgYSB0YWJsZSB3aXRoIGJvZHlIZWlnaHREeW5hbWljOiBhZGQgdG8gU2V0IGFuZCBhdHRhY2ggc2Nyb2xsL3Jlc2l6ZSBsaXN0ZW5lcnMgcGVyIHVwZGF0ZU9uLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gZnVsbCBvcHRpb25zIChyZWYub3B0aW9ucylcclxuICovXHJcbmZ1bmN0aW9uIHJlZ2lzdGVyRHluYW1pY1RhYmxlKHRhYmxlLCBvcHRpb25zKSB7XHJcbiAgICBjb25zdCB7IHNjcm9sbFRhcmdldHMsIHJlc2l6ZVdpbmRvdywgcmVzaXplRWxlbWVudHMgfSA9IHJlc29sdmVVcGRhdGVPbihvcHRpb25zKTtcclxuICAgIGR5bmFtaWNUYWJsZXMuYWRkKHRhYmxlKTtcclxuICAgIHNjcm9sbFRhcmdldHMuZm9yRWFjaCgoZWwpID0+IHtcclxuICAgICAgICBsZXQgc2V0ID0gc2Nyb2xsU291cmNlVG9UYWJsZXMuZ2V0KGVsKTtcclxuICAgICAgICBpZiAoIXNldCkge1xyXG4gICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgICAgIHNjcm9sbFNvdXJjZVRvVGFibGVzLnNldChlbCwgc2V0KTtcclxuICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGxUaHJvdHRsZWQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0LmFkZCh0YWJsZSk7XHJcbiAgICB9KTtcclxuICAgIGlmIChyZXNpemVXaW5kb3cpIHtcclxuICAgICAgICBpZiAoIXJlc2l6ZVdpbmRvd0F0dGFjaGVkKSB7XHJcbiAgICAgICAgICAgIHJlc2l6ZVdpbmRvd0F0dGFjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplVGhyb3R0bGVkLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmVzaXplRWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcclxuICAgICAgICBsZXQgc2V0ID0gcmVzaXplU291cmNlVG9UYWJsZXMuZ2V0KGVsKTtcclxuICAgICAgICBpZiAoIXNldCkge1xyXG4gICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgICAgIHJlc2l6ZVNvdXJjZVRvVGFibGVzLnNldChlbCwgc2V0KTtcclxuICAgICAgICAgICAgaWYgKCFyZXNpemVPYnNlcnZlcikgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIob25SZXNpemVUaHJvdHRsZWQpO1xyXG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0LmFkZCh0YWJsZSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkIGdyaWQtdGVtcGxhdGUtY29sdW1ucyBmcm9tIG1lYXN1cmVkIHdpZHRocyBhbmQgb3B0aW9uYWwgb3ZlcnJpZGVzIHBlciBjb2x1bW4uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1Db2xzXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IGNvbHVtbldpZHRoc1xyXG4gKiBAcGFyYW0ge09iamVjdDxudW1iZXIsIHN0cmluZz58KHN0cmluZ3xudWxsKVtdfSBjb2x1bW5PdmVycmlkZXMgLSBtYXAgY29sdW1uIGluZGV4IOKGkiBDU1MgdmFsdWUgKGUuZy4gJzJmcicpLCBvciBhcnJheTsgbnVsbC9lbXB0eSA9IHVzZSBtZWFzdXJlZFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRUZW1wbGF0ZUNvbHVtbnMobnVtQ29scywgY29sdW1uV2lkdGhzLCBjb2x1bW5PdmVycmlkZXMpIHtcclxuICAgIGlmICghY29sdW1uV2lkdGhzIHx8IGNvbHVtbldpZHRocy5sZW5ndGggIT09IG51bUNvbHMpIHJldHVybiAnJztcclxuICAgIGNvbnN0IGdldCA9IChpKSA9PlxyXG4gICAgICAgIEFycmF5LmlzQXJyYXkoY29sdW1uT3ZlcnJpZGVzKSA/IGNvbHVtbk92ZXJyaWRlc1tpXSA6IGNvbHVtbk92ZXJyaWRlc1tpXTtcclxuICAgIGNvbnN0IHBhcnRzID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvbHM7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ID0gZ2V0KGkpO1xyXG4gICAgICAgIGlmIChvdiAhPSBudWxsICYmIHR5cGVvZiBvdiA9PT0gJ3N0cmluZycgJiYgb3YudHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKG92LnRyaW0oKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGFydHMucHVzaChgJHtNYXRoLnJvdW5kKGNvbHVtbldpZHRoc1tpXSl9ZnJgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGQgZ3JpZC10ZW1wbGF0ZS1yb3dzIGZyb20gbWVhc3VyZWQgaGVpZ2h0cyBhbmQgb3B0aW9uYWwgb3ZlcnJpZGVzIHBlciByb3cuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1Sb3dzXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IHJvd0hlaWdodHNcclxuICogQHBhcmFtIHtPYmplY3Q8bnVtYmVyLCBzdHJpbmc+fChzdHJpbmd8bnVsbClbXX0gcm93T3ZlcnJpZGVzIC0gbWFwIHJvdyBpbmRleCDihpIgQ1NTIHZhbHVlIChlLmcuICc0OHB4JywgJzJmcicpLCBvciBhcnJheTsgbnVsbC9lbXB0eSA9IHVzZSBtZWFzdXJlZFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRUZW1wbGF0ZVJvd3MobnVtUm93cywgcm93SGVpZ2h0cywgcm93T3ZlcnJpZGVzKSB7XHJcbiAgICBpZiAoIXJvd0hlaWdodHMgfHwgcm93SGVpZ2h0cy5sZW5ndGggPCBudW1Sb3dzKSByZXR1cm4gJyc7XHJcbiAgICBjb25zdCBnZXQgPSAoaSkgPT5cclxuICAgICAgICBBcnJheS5pc0FycmF5KHJvd092ZXJyaWRlcykgPyByb3dPdmVycmlkZXNbaV0gOiByb3dPdmVycmlkZXM/LltpXTtcclxuICAgIGNvbnN0IHBhcnRzID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVJvd3M7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ID0gZ2V0KGkpO1xyXG4gICAgICAgIGlmIChvdiAhPSBudWxsICYmIHR5cGVvZiBvdiA9PT0gJ3N0cmluZycgJiYgb3YudHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKG92LnRyaW0oKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGFydHMucHVzaChgJHtNYXRoLnJvdW5kKHJvd0hlaWdodHNbaV0gPz8gMCl9cHhgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xyXG59XHJcblxyXG4vKipcclxuICogTWVhc3VyZSBlYWNoIHRyIGhlaWdodCBpbiBhIHNlY3Rpb24gKHRhYmxlIG11c3Qgbm90IHlldCBoYXZlIHNjcm9sbGFibGUgY2xhc3MpLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZVNlY3Rpb25FbGVtZW50fG51bGx9IHNlY3Rpb25cclxuICogQHJldHVybnMge251bWJlcltdfVxyXG4gKi9cclxuZnVuY3Rpb24gbWVhc3VyZVJvd0hlaWdodHMoc2VjdGlvbikge1xyXG4gICAgaWYgKCFzZWN0aW9uKSByZXR1cm4gW107XHJcbiAgICBjb25zdCByb3dzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpO1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20ocm93cykubWFwKCh0cikgPT4gdHIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGx5IHNjcm9sbGFibGUgdGFibGUgbGF5b3V0IHRvIGEgc2luZ2xlIHRhYmxlLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnNcclxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBbb3B0aW9ucy5tYXhIZWlnaHRdIC0gTWF4IGhlaWdodCBvZiB0Ym9keSAoZGVmYXVsdCAnMjAwcHgnKS4gSWdub3JlZCB3aGVuIGhlaWdodCBvciBib2R5SGVpZ2h0RHluYW1pYyBpcyBzZXQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gW29wdGlvbnMuaGVpZ2h0XSAtIEZpeGVkIGhlaWdodCBvZiB0Ym9keS4gSWdub3JlZCB3aGVuIGJvZHlIZWlnaHREeW5hbWljIGlzIHNldC5cclxuICogQHBhcmFtIHt7IGdldDogKGZ1bmN0aW9uKEhUTUxUYWJsZUVsZW1lbnQpOiBudW1iZXJ8c3RyaW5nKSwgdXNlQXM6ICdoZWlnaHQnfCdtYXhIZWlnaHQnLCB1cGRhdGVPbj86IHsgc2Nyb2xsPzogYm9vbGVhbiwgcmVzaXplPzogYm9vbGVhbiwgc2Nyb2xsT24/OiAoJ2RvY3VtZW50J3xFbGVtZW50KVtdLCByZXNpemVPbj86ICgnd2luZG93J3xFbGVtZW50KVtdIH0gfX0gW29wdGlvbnMuYm9keUhlaWdodER5bmFtaWNdIC0gV2hlbiBzZXQsIGJvZHkgc2l6ZSBpcyBjb21wdXRlZCBieSBnZXQodGFibGUpIGFuZCByZS1hcHBsaWVkIHdoZW4gc2Nyb2xsL3Jlc2l6ZSBzb3VyY2VzIGZpcmUuIHVwZGF0ZU9uOiBzY3JvbGxPbi9yZXNpemVPbiBsaXN0IGVsZW1lbnRzIChzZW50aW5lbHMgJ2RvY3VtZW50Jy8nd2luZG93Jyk7IG9yIHVzZSBzY3JvbGwgKGRlZmF1bHQgZmFsc2UpIC8gcmVzaXplIChkZWZhdWx0IHRydWUpIGJvb2xlYW5zLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZ3JpZFRlbXBsYXRlQ29sdW1uc11cclxuICogQHBhcmFtIHt7IHRoZWFkPzogc3RyaW5nLCB0Ym9keT86IHN0cmluZywgdGZvb3Q/OiBzdHJpbmcgfX0gW29wdGlvbnMuZ3JpZFRlbXBsYXRlUm93c11cclxuICogQHBhcmFtIHt7IHRoZWFkPzogT2JqZWN0PG51bWJlciwgc3RyaW5nPnwoc3RyaW5nfG51bGwpW10sIHRib2R5PzogT2JqZWN0PG51bWJlciwgc3RyaW5nPnwoc3RyaW5nfG51bGwpW10sIHRmb290PzogT2JqZWN0PG51bWJlciwgc3RyaW5nPnwoc3RyaW5nfG51bGwpW10gfX0gW29wdGlvbnMucm93T3ZlcnJpZGVzXVxyXG4gKiBAcGFyYW0ge09iamVjdDxudW1iZXIsIHN0cmluZz58KHN0cmluZ3xudWxsKVtdfSBbb3B0aW9ucy5jb2x1bW5PdmVycmlkZXNdXHJcbiAqIEBwYXJhbSB7eyBjb2x1bW5XaWR0aHM/OiBudW1iZXJbXSwgcm93SGVpZ2h0cz86IHsgdGhlYWQ/OiBudW1iZXJbXSwgdGJvZHk/OiBudW1iZXJbXSwgdGZvb3Q/OiBudW1iZXJbXSB9IH0gfCB1bmRlZmluZWR9IHJlZiAtIGV4aXN0aW5nIHJlZiB3aGVuIHJlZnJlc2hpbmdcclxuICovXHJcbmZ1bmN0aW9uIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCBvcHRpb25zLCByZWYpIHtcclxuICAgIGNvbnN0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuICAgIGNvbnN0IHRmb290ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGZvb3QnKTtcclxuXHJcbiAgICBjb25zdCBudW1Db2xzID0gZ2V0VGFibGVDb2x1bW5Db3VudCh0YWJsZSk7XHJcbiAgICBpZiAobnVtQ29scyA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGFscmVhZHlTY3JvbGxhYmxlID0gdGFibGUuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX1RBQkxFKTtcclxuICAgIGNvbnN0IGN1c3RvbVRlbXBsYXRlID0gdHlwZW9mIG9wdGlvbnMuZ3JpZFRlbXBsYXRlQ29sdW1ucyA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5ncmlkVGVtcGxhdGVDb2x1bW5zLnRyaW0oKS5sZW5ndGggPiAwO1xyXG4gICAgY29uc3QgY29sdW1uV2lkdGhzID0gY3VzdG9tVGVtcGxhdGVcclxuICAgICAgICA/IG51bGxcclxuICAgICAgICA6IChyZWY/LmNvbHVtbldpZHRocyA/PyAoYWxyZWFkeVNjcm9sbGFibGUgPyBudWxsIDogbWVhc3VyZUNvbHVtbldpZHRocyh0YWJsZSwgbnVtQ29scykpKTtcclxuXHJcbiAgICBjb25zdCB0aGVhZFJvd3MgPSBnZXRSb3dDb3VudCh0aGVhZCk7XHJcbiAgICBjb25zdCB0Ym9keVJvd3MgPSBnZXRSb3dDb3VudCh0Ym9keSk7XHJcbiAgICBjb25zdCB0Zm9vdFJvd3MgPSBnZXRSb3dDb3VudCh0Zm9vdCk7XHJcblxyXG4gICAgY29uc3Qgcm93SGVpZ2h0cyA9XHJcbiAgICAgICAgcmVmPy5yb3dIZWlnaHRzID8/XHJcbiAgICAgICAgKGFscmVhZHlTY3JvbGxhYmxlXHJcbiAgICAgICAgICAgID8gbnVsbFxyXG4gICAgICAgICAgICA6IHtcclxuICAgICAgICAgICAgICAgICAgdGhlYWQ6IG1lYXN1cmVSb3dIZWlnaHRzKHRoZWFkKSxcclxuICAgICAgICAgICAgICAgICAgdGJvZHk6IG1lYXN1cmVSb3dIZWlnaHRzKHRib2R5KSxcclxuICAgICAgICAgICAgICAgICAgdGZvb3Q6IG1lYXN1cmVSb3dIZWlnaHRzKHRmb290KVxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLWNvbHMnLCBTdHJpbmcobnVtQ29scykpO1xyXG4gICAgdGFibGUuc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGhlYWQtcm93cycsIFN0cmluZyhNYXRoLm1heCgxLCB0aGVhZFJvd3MpKSk7XHJcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10Ym9keS1yb3dzJywgU3RyaW5nKE1hdGgubWF4KDEsIHRib2R5Um93cykpKTtcclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MnLCBTdHJpbmcoTWF0aC5tYXgoMSwgdGZvb3RSb3dzKSkpO1xyXG4gICAgY29uc3QgeyBib2R5U2l6ZSwgdXNlRml4ZWRIZWlnaHQgfSA9IHJlc29sdmVCb2R5SGVpZ2h0KG9wdGlvbnMsIHRhYmxlKTtcclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCcsIGJvZHlTaXplKTtcclxuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1ib2R5LWhlaWdodCcsIHVzZUZpeGVkSGVpZ2h0KTtcclxuXHJcbiAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKENMQVNTX1RBQkxFKTtcclxuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QnLCAhISh0Zm9vdCAmJiB0Zm9vdFJvd3MgPiAwKSk7XHJcbiAgICB0YWJsZS5jbGFzc0xpc3QudG9nZ2xlKCdhcHgtc2Nyb2xsYWJsZS10YWJsZS0tbm8tdGhlYWQnLCAhKHRoZWFkICYmIHRoZWFkUm93cyA+IDApKTtcclxuXHJcbiAgICAvLyBGb3JjZSByZWZsb3cgc28gdGhlIGdyaWQgbGF5b3V0IGlzIGVzdGFibGlzaGVkIGJlZm9yZSBzZXR0aW5nIG1lYXN1cmVkIHRlbXBsYXRlLWNvbHVtbnMuXHJcbiAgICAvLyBXaXRob3V0IHRoaXMsIHRoZSBicm93c2VyIGJhdGNoZXMgY2xhc3MgKyB0ZW1wbGF0ZSBpbnRvIG9uZSBwYXNzIGFuZCB0aGUgdGJvZHkgb3ZlcmZsb3dzIGhvcml6b250YWxseS5cclxuICAgIHRhYmxlLm9mZnNldEhlaWdodDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcclxuXHJcbiAgICBjb25zdCBndXR0ZXJTdWZmaXggPSAnIG1pbm1heCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpLCB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpKSc7XHJcbiAgICBpZiAoY3VzdG9tVGVtcGxhdGUpIHtcclxuICAgICAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10ZW1wbGF0ZS1jb2x1bW5zJywgb3B0aW9ucy5ncmlkVGVtcGxhdGVDb2x1bW5zLnRyaW0oKSArIGd1dHRlclN1ZmZpeCk7XHJcbiAgICB9IGVsc2UgaWYgKGNvbHVtbldpZHRocyAmJiBjb2x1bW5XaWR0aHMubGVuZ3RoID09PSBudW1Db2xzKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPVxyXG4gICAgICAgICAgICBvcHRpb25zLmNvbHVtbk92ZXJyaWRlcyAhPSBudWxsXHJcbiAgICAgICAgICAgICAgICA/IGJ1aWxkVGVtcGxhdGVDb2x1bW5zKG51bUNvbHMsIGNvbHVtbldpZHRocywgb3B0aW9ucy5jb2x1bW5PdmVycmlkZXMpXHJcbiAgICAgICAgICAgICAgICA6IGNvbHVtbldpZHRocy5tYXAoKHcpID0+IGAke01hdGgucm91bmQodyl9ZnJgKS5qb2luKCcgJyk7XHJcbiAgICAgICAgdGFibGUuc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGVtcGxhdGUtY29sdW1ucycsIHRlbXBsYXRlICsgZ3V0dGVyU3VmZml4KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGFibGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGVtcGxhdGUtY29sdW1ucycpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyUGxhY2VtZW50cyh0YWJsZSk7XHJcblxyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBbXHJcbiAgICAgICAgeyBzZWN0aW9uOiB0aGVhZCwgcm93czogTWF0aC5tYXgoMSwgdGhlYWRSb3dzKSwgaGVpZ2h0czogcm93SGVpZ2h0cz8udGhlYWQsIGtleTogJ3RoZWFkJyB9LFxyXG4gICAgICAgIHsgc2VjdGlvbjogdGJvZHksIHJvd3M6IE1hdGgubWF4KDEsIHRib2R5Um93cyksIGhlaWdodHM6IHJvd0hlaWdodHM/LnRib2R5LCBrZXk6ICd0Ym9keScgfSxcclxuICAgICAgICB7IHNlY3Rpb246IHRmb290LCByb3dzOiBNYXRoLm1heCgxLCB0Zm9vdFJvd3MpLCBoZWlnaHRzOiByb3dIZWlnaHRzPy50Zm9vdCwga2V5OiAndGZvb3QnIH1cclxuICAgIF07XHJcbiAgICBjb25zdCBjdXN0b21Sb3dzID0gb3B0aW9ucy5ncmlkVGVtcGxhdGVSb3dzICYmIHR5cGVvZiBvcHRpb25zLmdyaWRUZW1wbGF0ZVJvd3MgPT09ICdvYmplY3QnID8gb3B0aW9ucy5ncmlkVGVtcGxhdGVSb3dzIDogbnVsbDtcclxuICAgIGNvbnN0IHJvd092ZXJyaWRlcyA9IG9wdGlvbnMucm93T3ZlcnJpZGVzICYmIHR5cGVvZiBvcHRpb25zLnJvd092ZXJyaWRlcyA9PT0gJ29iamVjdCcgPyBvcHRpb25zLnJvd092ZXJyaWRlcyA6IG51bGw7XHJcbiAgICBzZWN0aW9ucy5mb3JFYWNoKCh7IHNlY3Rpb24sIHJvd3MsIGhlaWdodHMsIGtleSB9KSA9PiB7XHJcbiAgICAgICAgaWYgKCFzZWN0aW9uKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgdmFyTmFtZSA9IGAtLWFweC1zY3JvbGxhYmxlLSR7a2V5fS10ZW1wbGF0ZS1yb3dzYDtcclxuICAgICAgICBjb25zdCBjdXN0b20gPSBjdXN0b21Sb3dzPy5ba2V5XTtcclxuICAgICAgICBjb25zdCBvdmVycmlkZXMgPSByb3dPdmVycmlkZXM/LltrZXldO1xyXG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tID09PSAnc3RyaW5nJyAmJiBjdXN0b20udHJpbSgpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgc2VjdGlvbi5zdHlsZS5zZXRQcm9wZXJ0eSh2YXJOYW1lLCBjdXN0b20udHJpbSgpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGhlaWdodHMgJiYgaGVpZ2h0cy5sZW5ndGggPj0gcm93cykge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9XHJcbiAgICAgICAgICAgICAgICBvdmVycmlkZXMgIT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgID8gYnVpbGRUZW1wbGF0ZVJvd3Mocm93cywgaGVpZ2h0cy5zbGljZSgwLCByb3dzKSwgb3ZlcnJpZGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIDogaGVpZ2h0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCByb3dzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGgpID0+IGAke01hdGgucm91bmQoaCl9cHhgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcgJyk7XHJcbiAgICAgICAgICAgIHNlY3Rpb24uc3R5bGUuc2V0UHJvcGVydHkodmFyTmFtZSwgdGVtcGxhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlY3Rpb24uc3R5bGUucmVtb3ZlUHJvcGVydHkodmFyTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBsYWNlbWVudHMgPSBjb21wdXRlQ2VsbFBsYWNlbWVudHMoc2VjdGlvbiwgcm93cywgbnVtQ29scyk7XHJcbiAgICAgICAgYXBwbHlQbGFjZW1lbnRzKHBsYWNlbWVudHMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHsgY29sdW1uV2lkdGhzLCByb3dIZWlnaHRzIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBdWdtZW50cyB0aGUgQVBYIG9iamVjdCB3aXRoIHNjcm9sbGFibGVUYWJsZShvcHRpb25zIHwgJ3JlZnJlc2gnKS5cclxuICogTWFrZXMgdGhlIHRib2R5IG9mIGEgdGFibGUgc2Nyb2xsYWJsZSB3aGlsZSBrZWVwaW5nIHRoZWFkL3Rmb290IGZpeGVkIGFuZCBjb2x1bW5zIGFsaWduZWQgKENTUyBHcmlkICsgc3ViZ3JpZCkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcHggLSBUaGUgQVBYIG9iamVjdCB0byBhdWdtZW50LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBBUFgoJ3RhYmxlLmRhdGEtZ3JpZCcpLnNjcm9sbGFibGVUYWJsZSh7IG1heEhlaWdodDogMzAwIH0pO1xyXG4gKiBBUFgoJ3RhYmxlLmRhdGEtZ3JpZCcpLnNjcm9sbGFibGVUYWJsZSgncmVmcmVzaCcpO1xyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXVnbWVudFdpdGhTY3JvbGxhYmxlVGFibGUoYXB4KSB7XHJcbiAgICBhcHguc2Nyb2xsYWJsZVRhYmxlID0gZnVuY3Rpb24gKG9wdGlvbnNPckFjdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGlzUmVmcmVzaCA9IG9wdGlvbnNPckFjdGlvbiA9PT0gJ3JlZnJlc2gnO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBpc1JlZnJlc2ggPyBudWxsIDogKG9wdGlvbnNPckFjdGlvbiAmJiB0eXBlb2Ygb3B0aW9uc09yQWN0aW9uID09PSAnb2JqZWN0JyA/IG9wdGlvbnNPckFjdGlvbiA6IHt9KTtcclxuXHJcbiAgICAgICAgYXB4LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSAhPT0gJ1RBQkxFJykgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IC8qKiBAdHlwZSB7SFRNTFRhYmxlRWxlbWVudH0gKi8gKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVmID0gdGFibGVbREFUQV9LRVldO1xyXG4gICAgICAgICAgICBpZiAocmVmKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlTY3JvbGxhYmxlVGFibGUodGFibGUsIHJlZi5vcHRpb25zLCByZWYpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZWYub3B0aW9ucyA9IHsgLi4ucmVmLm9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhcHBseVNjcm9sbGFibGVUYWJsZSh0YWJsZSwgcmVmLm9wdGlvbnMsIHJlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8uY29sdW1uV2lkdGhzKSByZWYuY29sdW1uV2lkdGhzID0gcmVzdWx0LmNvbHVtbldpZHRocztcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5yb3dIZWlnaHRzKSByZWYucm93SGVpZ2h0cyA9IHJlc3VsdC5yb3dIZWlnaHRzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE9wdGlvbnMgPSByZWYub3B0aW9ucztcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50T3B0aW9ucz8uYm9keUhlaWdodER5bmFtaWMpIHJlZ2lzdGVyRHluYW1pY1RhYmxlKHRhYmxlLCBjdXJyZW50T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHJlbW92ZVRhYmxlRnJvbUR5bmFtaWNTb3VyY2VzKHRhYmxlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0FQWCBzY3JvbGxhYmxlVGFibGVdIGNyZWF0ZScsIHRhYmxlKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHlTY3JvbGxhYmxlVGFibGUodGFibGUsIG9wdGlvbnMsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgIHRhYmxlW0RBVEFfS0VZXSA9IHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsgLi4ub3B0aW9ucyB9LFxyXG4gICAgICAgICAgICAgICAgY29sdW1uV2lkdGhzOiByZXN1bHQ/LmNvbHVtbldpZHRocyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICByb3dIZWlnaHRzOiByZXN1bHQ/LnJvd0hlaWdodHMgfHwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5ib2R5SGVpZ2h0RHluYW1pYykgcmVnaXN0ZXJEeW5hbWljVGFibGUodGFibGUsIG9wdGlvbnMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gYXB4O1xyXG4gICAgfTtcclxufVxyXG4iLCIvLyBNaW5pbWFsLCBmcmFtZXdvcmstYWdub3N0aWMgVG9hc3RNYW5hZ2VyIGZvciBBUFhcclxuLy8gRVNNLWZpcnN0LCBubyBzaWRlIGVmZmVjdHMgb24gaW1wb3J0LiBET00gb25seSB3aGVuIHVzZWQuXHJcbmltcG9ydCAnLi9jc3MvdG9hc3QuY3NzJztcclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3NpdGlvbk9iamVjdFxyXG4gKiBAcHJvcGVydHkgeydzdGlja3knfCdyZWxhdGl2ZSd8J2FuY2hvcmVkJ30gW3R5cGVdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbeF1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt5XVxyXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBbZWxlbWVudF1cclxuICogQHByb3BlcnR5IHsndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnYWJvdmUnfCdiZWxvdyd8J2JlZm9yZSd8J2FmdGVyJ30gW3BsYWNlbWVudF1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtnYXBdXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZU5hdGl2ZUNTU11cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge3N0cmluZ3xQb3NpdGlvbk9iamVjdH0gUG9zaXRpb25cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gVG9hc3RDb25maWdcclxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gW3Bvc2l0aW9uXVxyXG4gKiBAcHJvcGVydHkgeyd1cCd8J2Rvd24nfCdhdXRvJ30gW2Zsb3ddIEZsb3cgZGlyZWN0aW9uIGZvciBzdGFja2luZyB0b2FzdHMuICdhdXRvJyBkZXRlcm1pbmVzIGJhc2VkIG9uIHBvc2l0aW9uLiBEZWZhdWx0OiAnYXV0bydcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhUb2FzdHNdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVmYXVsdER1cmF0aW9uTXNdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbekluZGV4XVxyXG4gKiBAcHJvcGVydHkgeydwb2xpdGUnfCdhc3NlcnRpdmUnfCdvZmYnfSBbYXJpYUxpdmVdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZ2FwXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWR1cGVdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29udGFpbmVyQ2xhc3NdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb2Zmc2V0XVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW58e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nfX0gW3Byb2dyZXNzXSBEZWZhdWx0OiBmYWxzZS4gU2hvdyBwcm9ncmVzcyBiYXIgd2hlbiB0cnVlIG9yIHsgZW5hYmxlOiB0cnVlLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbScgfS5cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge3tlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJywgcGF1c2VCdXR0b246IGJvb2xlYW59fSBQcm9ncmVzc09wdFxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUb2FzdE9wdGlvbnNcclxuICogQHByb3BlcnR5IHtzdHJpbmd8Tm9kZX0gbWVzc2FnZVxyXG4gKiBAcHJvcGVydHkgeydpbmZvJ3wnc3VjY2Vzcyd8J3dhcm5pbmcnfCdkYW5nZXInfSBbdHlwZV1cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkdXJhdGlvbk1zXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkaXNtaXNzaWJsZV1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF1cclxuICogQHByb3BlcnR5IHsocmVmOiBUb2FzdFJlZiwgZXY6IE1vdXNlRXZlbnQpID0+IHZvaWR9IFtvbkNsaWNrXVxyXG4gKiBAcHJvcGVydHkgeyhyZWY6IFRvYXN0UmVmLCByZWFzb246ICd0aW1lb3V0J3wnY2xvc2UnfCdhcGknfCdvdmVyZmxvdycpID0+IHZvaWR9IFtvbkNsb3NlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NsYXNzTmFtZV1cclxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gW3Bvc2l0aW9uXVxyXG4gKiBAcHJvcGVydHkgeyd1cCd8J2Rvd24nfCdhdXRvJ30gW2Zsb3ddIEZsb3cgZGlyZWN0aW9uIGZvciBzdGFja2luZyB0b2FzdHMuICdhdXRvJyBkZXRlcm1pbmVzIGJhc2VkIG9uIHBvc2l0aW9uLiBEZWZhdWx0OiAnYXV0bydcclxuICogQHByb3BlcnR5IHtib29sZWFufHtlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJywgcGF1c2VCdXR0b24/OiBib29sZWFufX0gW3Byb2dyZXNzXSBTaG93IHByb2dyZXNzIGJhcjogdHJ1ZSA9IHRvcCwgb3IgeyBlbmFibGUsIHBvc2l0aW9uLCBwYXVzZUJ1dHRvbiB9IChwYXVzZUJ1dHRvbiBkZWZhdWx0IGZhbHNlKS5cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gVG9hc3RSZWZcclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkXHJcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGVsXHJcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbj86ICdhcGknfCdjbG9zZScpID0+IHZvaWR9IGNsb3NlXHJcbiAqIEBwcm9wZXJ0eSB7KHBhcnRpYWw6IFBhcnRpYWw8VG9hc3RPcHRpb25zPikgPT4gdm9pZH0gdXBkYXRlXHJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gd2hlbkNsb3NlZFxyXG4gKiBAcHJvcGVydHkgeyhldmVudDogJ2Nsb3NlJ3wnY2xpY2snLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gKCkgPT4gdm9pZH0gb25cclxuICogQHByb3BlcnR5IHsoZXZlbnQ6ICdjbG9zZSd8J2NsaWNrJywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWR9IG9mZlxyXG4gKi9cclxuXHJcbmNvbnN0IGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XHJcblxyXG4vLyBTaGFyZWQgY29udGFpbmVyIGNhY2hlOiBNYXA8cG9zaXRpb24sIEhUTUxFbGVtZW50PlxyXG4vLyBDb250YWluZXJzIGFyZSBzaGFyZWQgYmV0d2VlbiBtYW5hZ2VycyB3aXRoIHRoZSBzYW1lIHBvc2l0aW9uXHJcbmNvbnN0IF9jb250YWluZXJDYWNoZSA9IG5ldyBNYXAoKTtcclxuXHJcbi8vIEdhcmJhZ2UgY29sbGVjdGlvbjogY2xlYW51cCBlbXB0eSB1bm1hbmFnZWQgY29udGFpbmVycyBhZnRlciBhIGRlbGF5XHJcbmNvbnN0IEdDX0RFTEFZX01TID0gMjAwMDA7IC8vIDIwIHNlY29uZHNcclxubGV0IF9nY1RpbWVvdXRJZCA9IG51bGw7XHJcblxyXG4vLyBXcmFwcGVyIGZvciBhbGwgdG9hc3QgY29udGFpbmVycyAoa2VlcHMgRE9NIGNsZWFuKVxyXG5sZXQgX3RvYXN0V3JhcHBlciA9IG51bGw7XHJcblxyXG4vKipcclxuICogR2V0IG9yIGNyZWF0ZSB0aGUgdG9hc3QgY29udGFpbmVycyB3cmFwcGVyXHJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VG9hc3RXcmFwcGVyKCkge1xyXG4gICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybiBudWxsO1xyXG4gICAgXHJcbiAgICBpZiAoIV90b2FzdFdyYXBwZXIpIHtcclxuICAgICAgICBfdG9hc3RXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFQWC10b2FzdC13cmFwcGVyJyk7XHJcbiAgICAgICAgaWYgKCFfdG9hc3RXcmFwcGVyKSB7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdC13cmFwcGVyJyk7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLndpZHRoID0gJzAnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLmhlaWdodCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnpJbmRleCA9ICcxMDAwMCc7IC8vIEJlbG93IGNvbnRhaW5lcnMgYnV0IGFib3ZlIG1vc3QgY29udGVudFxyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKF90b2FzdFdyYXBwZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIF90b2FzdFdyYXBwZXI7XHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfQ09ORklHID0ge1xyXG4gICAgcG9zaXRpb246ICdib3R0b20tcmlnaHQnLFxyXG4gICAgbWF4VG9hc3RzOiA1LFxyXG4gICAgZGVmYXVsdER1cmF0aW9uTXM6IDUwMDAsXHJcbiAgICB6SW5kZXg6IDExMDAwLFxyXG4gICAgYXJpYUxpdmU6ICdwb2xpdGUnLFxyXG4gICAgZ2FwOiA4LFxyXG4gICAgZGVkdXBlOiBmYWxzZSxcclxuICAgIGNvbnRhaW5lckNsYXNzOiAnJyxcclxuICAgIG9mZnNldDogMCxcclxuICAgIHByb2dyZXNzOiBmYWxzZVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbiBlbGVtZW50IHdpdGggY2xhc3Nlc1xyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlRWwodGFnLCBjbGFzc05hbWVzKSB7XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcclxuICAgIGlmIChjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgY2xhc3NOYW1lcy5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGMgPT4gZWwuY2xhc3NMaXN0LmFkZChjKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZWw7XHJcbn1cclxuXHJcbi8qKiBNaW5pbWFsIGxpbmUtYmFzZWQgcGF1c2UgKHR3byBiYXJzKSAvIHJlc3VtZSAodHJpYW5nbGUgcmlnaHQpIGljb24gU1ZHLiBVc2VzIGN1cnJlbnRDb2xvci4gKi9cclxuZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NQYXVzZVJlc3VtZUljb25TVkcocGF1c2VkKSB7XHJcbiAgICBpZiAocGF1c2VkKSB7XHJcbiAgICAgICAgcmV0dXJuIGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PHBhdGggZD1cIk04IDZMOCAxOEwxNyAxMlpcIi8+PC9zdmc+YDtcclxuICAgIH1cclxuICAgIHJldHVybiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxsaW5lIHgxPVwiOVwiIHkxPVwiNlwiIHgyPVwiOVwiIHkyPVwiMThcIi8+PGxpbmUgeDE9XCIxNVwiIHkxPVwiNlwiIHgyPVwiMTVcIiB5Mj1cIjE4XCIvPjwvc3ZnPmA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW5kIGluc2VydCBwcm9ncmVzcyBibG9jayAodHJhY2sgKyBiYXIsIG9wdGlvbmFsIHBhdXNlIGJ1dHRvbikgaW50byB0b2FzdC4gQnV0dG9uIGlzIGZpeGVkIGF0IGxlZnQgdmlhIHRyYWNrIGxheW91dC5cclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RFbFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250ZW50RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxudWxsfSBjbG9zZUJ0blxyXG4gKiBAcGFyYW0ge1Byb2dyZXNzT3B0fSBwcm9ncmVzc09wdFxyXG4gKiBAcmV0dXJucyB7eyB3cmFwOiBIVE1MRWxlbWVudCwgYmFyOiBIVE1MRWxlbWVudCwgcGF1c2VCdG46IEhUTUxFbGVtZW50fG51bGwgfX1cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZVByb2dyZXNzQmxvY2sodG9hc3RFbCwgY29udGVudEVsLCBjbG9zZUJ0biwgcHJvZ3Jlc3NPcHQpIHtcclxuICAgIGNvbnN0IHBvcyA9IHByb2dyZXNzT3B0LnBvc2l0aW9uO1xyXG4gICAgY29uc3Qgc2hvd1BhdXNlQnV0dG9uID0gcHJvZ3Jlc3NPcHQucGF1c2VCdXR0b24gPT09IHRydWU7XHJcbiAgICBjb25zdCB3cmFwID0gY3JlYXRlRWwoJ2RpdicsIGBBUFgtdG9hc3RfX3Byb2dyZXNzIEFQWC10b2FzdF9fcHJvZ3Jlc3MtLSR7cG9zfWApO1xyXG4gICAgY29uc3QgdHJhY2sgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2snKTtcclxuICAgIGNvbnN0IGJhciA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0X19wcm9ncmVzcy1iYXInKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncHJvZ3Jlc3NiYXInKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtaW4nLCAnMCcpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1heCcsICcxMDAnKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnVGVtcHMgcmVzdGFudCcpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsICcxMDAnKTtcclxuICAgIGJhci5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgIHRyYWNrLmFwcGVuZENoaWxkKGJhcik7XHJcbiAgICB3cmFwLmFwcGVuZENoaWxkKHRyYWNrKTtcclxuICAgIGxldCBwYXVzZUJ0biA9IG51bGw7XHJcbiAgICBpZiAoc2hvd1BhdXNlQnV0dG9uKSB7XHJcbiAgICAgICAgcGF1c2VCdG4gPSBjcmVhdGVFbCgnYnV0dG9uJywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UnKTtcclxuICAgICAgICBwYXVzZUJ0bi50eXBlID0gJ2J1dHRvbic7XHJcbiAgICAgICAgcGF1c2VCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1BhdXNlJyk7XHJcbiAgICAgICAgcGF1c2VCdG4uc2V0QXR0cmlidXRlKCd0aXRsZScsICdQYXVzZScpO1xyXG4gICAgICAgIHBhdXNlQnRuLmlubmVySFRNTCA9IGdldFByb2dyZXNzUGF1c2VSZXN1bWVJY29uU1ZHKGZhbHNlKTsgLy8gcnVubmluZyA9IHNob3cgcGF1c2UgaWNvblxyXG4gICAgICAgIHdyYXAuaW5zZXJ0QmVmb3JlKHBhdXNlQnRuLCB0cmFjayk7XHJcbiAgICB9XHJcbiAgICBpZiAocG9zID09PSAndG9wJykge1xyXG4gICAgICAgIHRvYXN0RWwuaW5zZXJ0QmVmb3JlKHdyYXAsIGNvbnRlbnRFbCk7XHJcbiAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG9hc3RFbC5pbnNlcnRCZWZvcmUod3JhcCwgY2xvc2VCdG4pO1xyXG4gICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoc2hvd1BhdXNlQnV0dG9uKSB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlJyk7XHJcbiAgICByZXR1cm4geyB3cmFwLCBiYXIsIHBhdXNlQnRuIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVcGRhdGUgcHJvZ3Jlc3MgYmxvY2sgcG9zaXRpb24gKGNsYXNzZXMgKyBET00gb3JkZXIpXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcHJvZ3Jlc3NXcmFwXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRlbnRFbFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IGNsb3NlQnRuXHJcbiAqIEBwYXJhbSB7J3RvcCd8J2JvdHRvbSd9IHBvc1xyXG4gKi9cclxuZnVuY3Rpb24gYXBwbHlQcm9ncmVzc1Bvc2l0aW9uKHRvYXN0RWwsIHByb2dyZXNzV3JhcCwgY29udGVudEVsLCBjbG9zZUJ0biwgcG9zKSB7XHJcbiAgICB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXRvcCcsICdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20nKTtcclxuICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZChwb3MgPT09ICd0b3AnID8gJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXRvcCcgOiAnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tJyk7XHJcbiAgICBwcm9ncmVzc1dyYXAuY2xhc3NMaXN0LnJlbW92ZSgnQVBYLXRvYXN0X19wcm9ncmVzcy0tdG9wJywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbScpO1xyXG4gICAgcHJvZ3Jlc3NXcmFwLmNsYXNzTGlzdC5hZGQoYEFQWC10b2FzdF9fcHJvZ3Jlc3MtLSR7cG9zfWApO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gcG9zID09PSAndG9wJyA/IGNvbnRlbnRFbCA6IGNsb3NlQnRuO1xyXG4gICAgaWYgKHByb2dyZXNzV3JhcC5uZXh0RWxlbWVudFNpYmxpbmcgIT09IHRhcmdldCkgdG9hc3RFbC5pbnNlcnRCZWZvcmUocHJvZ3Jlc3NXcmFwLCB0YXJnZXQpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzb2x2ZSBwcm9ncmVzcyBvcHRpb24gZnJvbSBwZXItY2FsbCBvcHRpb24gYW5kIGNvbmZpZyBkZWZhdWx0XHJcbiAqIEBwYXJhbSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbSd9fHVuZGVmaW5lZH0gb3B0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbSd9fHVuZGVmaW5lZH0gY29uZmlnRGVmYXVsdFxyXG4gKiBAcmV0dXJucyB7UHJvZ3Jlc3NPcHR9XHJcbiAqL1xyXG5mdW5jdGlvbiByZXNvbHZlUHJvZ3Jlc3Mob3B0aW9uLCBjb25maWdEZWZhdWx0KSB7XHJcbiAgICBjb25zdCBmcm9tQ29uZmlnID0gY29uZmlnRGVmYXVsdCA9PT0gdHJ1ZVxyXG4gICAgICAgID8geyBlbmFibGU6IHRydWUsIHBvc2l0aW9uOiAndG9wJywgcGF1c2VCdXR0b246IGZhbHNlIH1cclxuICAgICAgICA6IChjb25maWdEZWZhdWx0ICYmIHR5cGVvZiBjb25maWdEZWZhdWx0ID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICAgIGVuYWJsZTogISFjb25maWdEZWZhdWx0LmVuYWJsZSxcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBjb25maWdEZWZhdWx0LnBvc2l0aW9uID09PSAnYm90dG9tJyA/ICdib3R0b20nIDogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICBwYXVzZUJ1dHRvbjogY29uZmlnRGVmYXVsdC5wYXVzZUJ1dHRvbiA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDogeyBlbmFibGU6IGZhbHNlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9KTtcclxuICAgIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCB8fCBvcHRpb24gPT09IG51bGwpIHJldHVybiBmcm9tQ29uZmlnO1xyXG4gICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkgcmV0dXJuIHsgZW5hYmxlOiB0cnVlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9O1xyXG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZW5hYmxlOiAhIW9wdGlvbi5lbmFibGUsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBvcHRpb24ucG9zaXRpb24gPT09ICdib3R0b20nID8gJ2JvdHRvbScgOiAndG9wJyxcclxuICAgICAgICAgICAgcGF1c2VCdXR0b246IG9wdGlvbi5wYXVzZUJ1dHRvbiA9PT0gdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBlbmFibGU6IGZhbHNlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9O1xyXG59XHJcblxyXG4vKipcclxuICogTm9ybWFsaXplIHBsYWNlbWVudCBzeW5vbnltcyB0byBDU1MgdmFsdWVzXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGFjZW1lbnRcclxuICogQHJldHVybnMgeyd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfVxyXG4gKi9cclxuZnVuY3Rpb24gbm9ybWFsaXplUGxhY2VtZW50KHBsYWNlbWVudCkge1xyXG4gICAgY29uc3Qgc3lub255bXMgPSB7XHJcbiAgICAgICAgJ2Fib3ZlJzogJ3RvcCcsXHJcbiAgICAgICAgJ2JlbG93JzogJ2JvdHRvbScsXHJcbiAgICAgICAgJ2JlZm9yZSc6ICdsZWZ0JyxcclxuICAgICAgICAnYWZ0ZXInOiAncmlnaHQnXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHN5bm9ueW1zW3BsYWNlbWVudF0gfHwgcGxhY2VtZW50O1xyXG59XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lIGZsb3cgZGlyZWN0aW9uIGJhc2VkIG9uIHBvc2l0aW9uXHJcbiAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAqIEByZXR1cm5zIHsndXAnfCdkb3duJ31cclxuICovXHJcbmZ1bmN0aW9uIGRldGVybWluZUZsb3cocG9zaXRpb24pIHtcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9uczogdG9wID0gdXAsIGJvdHRvbSA9IGRvd25cclxuICAgICAgICBpZiAocG9zaXRpb24uaW5jbHVkZXMoJ3RvcCcpKSByZXR1cm4gJ3VwJztcclxuICAgICAgICBpZiAocG9zaXRpb24uaW5jbHVkZXMoJ2JvdHRvbScpKSByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0aWNreScgfHwgKCF0eXBlICYmIChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkpKSkge1xyXG4gICAgICAgICAgICAvLyBTdGlja3k6IGRldGVybWluZSBiYXNlZCBvbiB5IGNvb3JkaW5hdGVcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgeSBzdGFydHMgd2l0aCAnLScgb3IgaXMgYSBzbWFsbCB2YWx1ZSwgbGlrZWx5IHRvcCAodXApXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB5IGlzIGEgbGFyZ2UgdmFsdWUgb3IgcGVyY2VudGFnZSwgbGlrZWx5IGJvdHRvbSAoZG93bilcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlID0gZnJvbSBib3R0b20sIHNvIGZsb3cgZG93blxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgeSA8IDUwJSBvZiB2aWV3cG9ydCBoZWlnaHQsIGxpa2VseSB0b3AgKHVwKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBsaWtlbHkgYm90dG9tIChkb3duKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LmluY2x1ZGVzKCclJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDUwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHB4IHZhbHVlcywgYXNzdW1lIDwgNDAwcHggaXMgdG9wICh1cClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtIDwgNDAwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlID09PSAnYW5jaG9yZWQnICYmIHBvc2l0aW9uLnBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBBbmNob3JlZDogcGxhY2VtZW50IGRldGVybWluZXMgZmxvd1xyXG4gICAgICAgICAgICBjb25zdCBwbGFjZW1lbnQgPSBub3JtYWxpemVQbGFjZW1lbnQocG9zaXRpb24ucGxhY2VtZW50KTtcclxuICAgICAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcgfHwgcGxhY2VtZW50ID09PSAnYWJvdmUnKSByZXR1cm4gJ3VwJztcclxuICAgICAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ2JvdHRvbScgfHwgcGxhY2VtZW50ID09PSAnYmVsb3cnKSByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgICAgICAvLyBGb3IgbGVmdC9yaWdodCwgZGVmYXVsdCB0byBkb3duXHJcbiAgICAgICAgICAgIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlID09PSAncmVsYXRpdmUnKSB7XHJcbiAgICAgICAgICAgIC8vIFJlbGF0aXZlOiBkZXRlcm1pbmUgYmFzZWQgb24geSBvZmZzZXRcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChwb3NpdGlvbi55KTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIHkgPSBhYm92ZSBlbGVtZW50ID0gZmxvdyB1cFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFBvc2l0aXZlIHkgPSBiZWxvdyBlbGVtZW50ID0gZmxvdyBkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDAgPyAndXAnIDogJ2Rvd24nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxufVxyXG5cclxuLyoqXHJcbiAqIEdhcmJhZ2UgY29sbGVjdGlvbjogcmVtb3ZlIGVtcHR5IHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAqL1xyXG5mdW5jdGlvbiBjbGVhbnVwRW1wdHlDb250YWluZXJzKCkge1xyXG4gICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3QgY29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5BUFgtdG9hc3QtY29udGFpbmVyOm5vdChbZGF0YS1hcHgtdG9hc3QtbWFuYWdlZD1cInRydWVcIl0pJyk7XHJcbiAgICBjb250YWluZXJzLmZvckVhY2goY29udGFpbmVyID0+IHtcclxuICAgICAgICAvLyBDaGVjayBpZiBjb250YWluZXIgaXMgZW1wdHkgKG5vIHRvYXN0cylcclxuICAgICAgICBpZiAoY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbktleSkge1xyXG4gICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLmRlbGV0ZShwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICAvLyBDbGVhbiB1cCB3cmFwcGVyIGlmIGl0J3MgZW1wdHkgKGFsbCBjb250YWluZXJzIHJlbW92ZWQpXHJcbiAgICBpZiAoX3RvYXN0V3JhcHBlciAmJiBfdG9hc3RXcmFwcGVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIF90b2FzdFdyYXBwZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgX3RvYXN0V3JhcHBlciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9nY1RpbWVvdXRJZCA9IG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTY2hlZHVsZSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIGVtcHR5IHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAqL1xyXG5mdW5jdGlvbiBzY2hlZHVsZUdhcmJhZ2VDb2xsZWN0aW9uKCkge1xyXG4gICAgaWYgKF9nY1RpbWVvdXRJZCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dChfZ2NUaW1lb3V0SWQpO1xyXG4gICAgfVxyXG4gICAgX2djVGltZW91dElkID0gc2V0VGltZW91dChjbGVhbnVwRW1wdHlDb250YWluZXJzLCBHQ19ERUxBWV9NUyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGaW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudCBlbGVtZW50c1xyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XHJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudFtdfVxyXG4gKi9cclxuZnVuY3Rpb24gZmluZFNjcm9sbGFibGVQYXJlbnRzKGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IHNjcm9sbGFibGVzID0gW107XHJcbiAgICBsZXQgY3VycmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgIFxyXG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiBjdXJyZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGN1cnJlbnQpO1xyXG4gICAgICAgIGNvbnN0IG92ZXJmbG93ID0gc3R5bGUub3ZlcmZsb3cgKyBzdHlsZS5vdmVyZmxvd1kgKyBzdHlsZS5vdmVyZmxvd1g7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG92ZXJmbG93LmluY2x1ZGVzKCdzY3JvbGwnKSB8fCBvdmVyZmxvdy5pbmNsdWRlcygnYXV0bycpKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGFibGVzLnB1c2goY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBzY3JvbGxhYmxlcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEhhc2ggYW4gZWxlbWVudCB0byBjcmVhdGUgYSB1bmlxdWUgaWRlbnRpZmllclxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gaGFzaEVsZW1lbnQoZWwpIHtcclxuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHN0ciA9IGAke2VsLnRhZ05hbWV9XyR7cmVjdC5sZWZ0fV8ke3JlY3QudG9wfV8ke3JlY3Qud2lkdGh9XyR7cmVjdC5oZWlnaHR9YDtcclxuICAgIGxldCBoYXNoID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIGNoYXI7XHJcbiAgICAgICAgaGFzaCA9IGhhc2ggJiBoYXNoOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLmFicyhoYXNoKS50b1N0cmluZygzNik7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXJpYWxpemUgcG9zaXRpb24gb3B0aW9ucyBpbnRvIGEgdW5pcXVlIGtleVxyXG4gKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gc2VyaWFsaXplUG9zaXRpb24ocG9zaXRpb24pIHtcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIGBzOiR7cG9zaXRpb259YDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IFtdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFR5cGUgKGRlZmF1bHQ6IHN0aWNreSBpZiB4L3kgcHJvdmlkZWQpXHJcbiAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgaWYgKHR5cGUpIHBhcnRzLnB1c2goYHQ6JHt0eXBlfWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENvb3JkaW5hdGVzXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnggIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgeDoke3Bvc2l0aW9uLnh9YCk7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgeToke3Bvc2l0aW9uLnl9YCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRm9yIHJlbGF0aXZlL2FuY2hvcmVkOiB1c2UgZWxlbWVudCBJRCBvciBoYXNoXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudElkID0gcG9zaXRpb24uZWxlbWVudC5pZCB8fCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi5lbGVtZW50LmRhdGFzZXQ/LmFweFRvYXN0QW5jaG9ySWQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZWxfJHtoYXNoRWxlbWVudChwb3NpdGlvbi5lbGVtZW50KX1gO1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbDoke2VsZW1lbnRJZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBOb3JtYWxpemUgcGxhY2VtZW50IGZvciBzZXJpYWxpemF0aW9uICh1c2UgQ1NTIHZhbHVlcylcclxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGBwOiR7bm9ybWFsaXplZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmdhcCAhPT0gdW5kZWZpbmVkKSBwYXJ0cy5wdXNoKGBnOiR7cG9zaXRpb24uZ2FwfWApO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi51c2VOYXRpdmVDU1MpIHBhcnRzLnB1c2goYG5hdGl2ZTp0cnVlYCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGBvOiR7cGFydHMuam9pbignfCcpfWA7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiAnczpib3R0b20tcmlnaHQnO1xyXG59XHJcblxyXG4vKipcclxuICogVG9hc3RNYW5hZ2VyIGNsYXNzXHJcbiAqL1xyXG5jbGFzcyBUb2FzdE1hbmFnZXIge1xyXG4gICAgLyoqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz49fSBjb25maWcgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RDb25maWd9ICovXHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLkRFRkFVTFRfQ09ORklHLCAuLi4oY29uZmlnIHx8IHt9KSB9O1xyXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR8bnVsbH0gKi9cclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBUb2FzdFJlZj59ICovXHJcbiAgICAgICAgdGhpcy5pZFRvUmVmID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RSZWZbXX0gKi9cclxuICAgICAgICB0aGlzLm9wZW4gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPn0gY29uZmlnICovXHJcbiAgICBjb25maWd1cmUoY29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCAuLi4oY29uZmlnIHx8IHt9KSB9O1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikgdGhpcy5hcHBseUNvbnRhaW5lckNvbmZpZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0geydwb2xpdGUnfCdhc3NlcnRpdmUnfCdvZmYnfSBtb2RlICovXHJcbiAgICBzZXRBcmlhTGl2ZShtb2RlKSB7IHRoaXMuY29uZmlndXJlKHsgYXJpYUxpdmU6IG1vZGUgfSk7IH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge1RvYXN0UmVmW119ICovXHJcbiAgICBnZXRPcGVuVG9hc3RzKCkgeyByZXR1cm4gdGhpcy5vcGVuLnNsaWNlKCk7IH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtUb2FzdE9wdGlvbnN9IG9wdHMgKi9cclxuICAgIHNob3cob3B0cykge1xyXG4gICAgICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovKG51bGwpO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMob3B0cyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5kZWR1cGUgJiYgb3B0aW9ucy5pZCAmJiB0aGlzLmlkVG9SZWYuaGFzKG9wdGlvbnMuaWQpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuaWRUb1JlZi5nZXQob3B0aW9ucy5pZCk7XHJcbiAgICAgICAgICAgIHJlZi51cGRhdGUob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWY7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEZXRlcm1pbmUgcG9zaXRpb24gYW5kIGZsb3cgZm9yIHRoaXMgdG9hc3QgKG9wdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgY29uZmlnKVxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCB0aGlzLmNvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcclxuICAgICAgICBjb25zdCBmbG93ID0gb3B0aW9ucy5mbG93ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmZsb3cgOiAodGhpcy5jb25maWcuZmxvdyAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZmxvdyA6ICdhdXRvJyk7XHJcbiAgICAgICAgY29uc3QgZmluYWxGbG93ID0gZmxvdyA9PT0gJ2F1dG8nID8gZGV0ZXJtaW5lRmxvdyhwb3NpdGlvbikgOiBmbG93O1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEVuc3VyZSBkZWZhdWx0IGNvbnRhaW5lciBpcyBzZXQgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxyXG4gICAgICAgIHRoaXMuZW5zdXJlQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRvYXN0RWwgPSBjcmVhdGVFbCgnZGl2JywgYEFQWC10b2FzdCBBUFgtdG9hc3QtLSR7b3B0aW9ucy50eXBlfWApO1xyXG4gICAgICAgIHRvYXN0RWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3N0YXR1cycpO1xyXG4gICAgICAgIC8vIFByaW9yaXR5OiBvcHRpb25zLmlkID4gY29uZmlnLmlkID4gYXV0by1nZW5lcmF0ZWRcclxuICAgICAgICBjb25zdCB0b2FzdElkID0gb3B0aW9ucy5pZCB8fCBgdF8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YDtcclxuICAgICAgICB0b2FzdEVsLmRhdGFzZXQudG9hc3RJZCA9IHRvYXN0SWQ7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lKSB0b2FzdEVsLmNsYXNzTmFtZSArPSBgICR7b3B0aW9ucy5jbGFzc05hbWV9YDtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudEVsID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3RfX2NvbnRlbnQnKTtcclxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29udGVudEVsLnRleHRDb250ZW50ID0gb3B0aW9ucy5tZXNzYWdlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRFbC5hcHBlbmRDaGlsZChvcHRpb25zLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0b2FzdEVsLmFwcGVuZENoaWxkKGNvbnRlbnRFbCk7XHJcblxyXG4gICAgICAgIGxldCBjbG9zZUJ0biA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuZGlzbWlzc2libGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNsb3NlQnRuID0gY3JlYXRlRWwoJ2J1dHRvbicsICdBUFgtdG9hc3RfX2Nsb3NlJyk7XHJcbiAgICAgICAgICAgIGNsb3NlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDbG9zZScpO1xyXG4gICAgICAgICAgICBjbG9zZUJ0bi50eXBlID0gJ2J1dHRvbic7XHJcbiAgICAgICAgICAgIHRvYXN0RWwuYXBwZW5kQ2hpbGQoY2xvc2VCdG4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHByb2dyZXNzV3JhcCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHByb2dyZXNzQmFyRWwgPSBudWxsO1xyXG4gICAgICAgIGxldCBwcm9ncmVzc1BhdXNlQnRuID0gbnVsbDtcclxuICAgICAgICBpZiAob3B0aW9ucy5wcm9ncmVzcy5lbmFibGUgJiYgb3B0aW9ucy5kdXJhdGlvbk1zID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlUHJvZ3Jlc3NCbG9jayh0b2FzdEVsLCBjb250ZW50RWwsIGNsb3NlQnRuLCBvcHRpb25zLnByb2dyZXNzKTtcclxuICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwID0gY3JlYXRlZC53cmFwO1xyXG4gICAgICAgICAgICBwcm9ncmVzc0JhckVsID0gY3JlYXRlZC5iYXI7XHJcbiAgICAgICAgICAgIHByb2dyZXNzUGF1c2VCdG4gPSBjcmVhdGVkLnBhdXNlQnRuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgc3BlY2lmaWMgcG9zaXRpb25cclxuICAgICAgICBsZXQgY29udGFpbmVyID0gbnVsbDtcclxuICAgICAgICBsZXQgcG9zaXRpb25VcGRhdGVGbiA9IG51bGw7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uQ2xlYW51cCA9IG51bGw7XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsRWxlbWVudFN0eWxlID0gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICBpZiAocG9zaXRpb24gJiYgdHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbi51c2VOYXRpdmVDU1MgJiYgKHR5cGUgPT09ICdyZWxhdGl2ZScgfHwgdHlwZSA9PT0gJ2FuY2hvcmVkJykgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgLy8gdXNlTmF0aXZlQ1NTOiB0cnVlIC0gY3JlYXRlIGNvbnRhaW5lciBpbiB0YXJnZXQgZWxlbWVudCB1c2luZyBuYXRpdmUgQ1NTXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRFbCA9IHBvc2l0aW9uLmVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEVsZW1lbnRTdHlsZSA9IHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0RWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb250YWluZXIgZm9yIHN0YWNraW5nIHRvYXN0cyAocmV1c2UgaWYgZXhpc3RzKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBzZXJpYWxpemVQb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmF0aXZlQ29udGFpbmVyID0gdGFyZ2V0RWwucXVlcnlTZWxlY3RvcihgW2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uPVwiJHtwb3NpdGlvbktleX1cIl1gKTtcclxuICAgICAgICAgICAgICAgIGlmICghbmF0aXZlQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3QtY29udGFpbmVyIEFQWC10b2FzdC1jb250YWluZXItbmF0aXZlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nLCBwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmdhcCA9IGAke3RoaXMuY29uZmlnLmdhcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgcG9zaXRpb25pbmcgdG8gY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdyZWxhdGl2ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsYXRpdmU6IHVzZSB4L3kgZGlyZWN0bHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnguc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gcG9zaXRpb24ueC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gcG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuYm90dG9tID0gcG9zaXRpb24ueS5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSBwb3NpdGlvbi55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYW5jaG9yZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuY2hvcmVkOiBwb3NpdGlvbiBvdXRzaWRlIHRoZSBlbGVtZW50IHVzaW5nIDEwMCUgKGVsZW1lbnQgc2l6ZSkgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdhcCA9IHBvc2l0aW9uLmdhcCB8fCAnMWVtJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0b3AnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUucmlnaHQgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUubGVmdCA9IGBjYWxjKDEwMCUgKyAke2dhcH0pYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEVsLmFwcGVuZENoaWxkKG5hdGl2ZUNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmbG93IGRpcmVjdGlvbiBpZiBjb250YWluZXIgZXhpc3RzXHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IG5hdGl2ZUNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRFbCAmJiB0YXJnZXRFbC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uID0gb3JpZ2luYWxFbGVtZW50U3R5bGUgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBuYXRpdmUgY29udGFpbmVyIGlmIGVtcHR5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVDb250YWluZXIgJiYgbmF0aXZlQ29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBuYXRpdmVDb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLmRlbGV0ZShwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdDogZ2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgcG9zaXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZpbmFsRmxvdyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb250YWluZXIuc3R5bGUsIHN0eWxlcyk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVDb250YWluZXJQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBGb3IgcmVsYXRpdmUvYW5jaG9yZWQsIGxpc3RlbiB0byBzY3JvbGwvcmVzaXplXHJcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPT09ICdyZWxhdGl2ZScgfHwgdHlwZSA9PT0gJ2FuY2hvcmVkJykgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByYWZJZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RVcGRhdGUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRocm90dGxlTXMgPSAxNjsgLy8gfjYwZnBzXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhyb3R0bGVkVXBkYXRlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm93IC0gbGFzdFVwZGF0ZSA8IHRocm90dGxlTXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYWZJZCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlID0gbm93O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudHNcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlUGFyZW50cyA9IGZpbmRTY3JvbGxhYmxlUGFyZW50cyhwb3NpdGlvbi5lbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBMaXN0ZW4gdG8gc2Nyb2xsIG9uIHdpbmRvdyBhbmQgYWxsIHNjcm9sbGFibGUgcGFyZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhyb3R0bGVkVXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTGlzdGVuIHRvIHNjcm9sbCBvbiBhbGwgc2Nyb2xsYWJsZSBwYXJlbnQgZWxlbWVudHNcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlUGFyZW50cy5mb3JFYWNoKHBhcmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBXYXRjaCBmb3IgZWxlbWVudCByZW1vdmFsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcG9zaXRpb24uZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYuY2xvc2UoJ2FwaScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblVwZGF0ZUZuID0gdXBkYXRlQ29udGFpbmVyUG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRocm90dGxlZFVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVQYXJlbnRzLmZvckVhY2gocGFyZW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFmSWQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9uIC0gZ2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgcG9zaXRpb25cclxuICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmluYWxGbG93KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwZW5kIHRvYXN0IHRvIHRoZSBhcHByb3ByaWF0ZSBjb250YWluZXJcclxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBGYWxsYmFjayB0byBkZWZhdWx0IGNvbnRhaW5lclxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVudGVyIGFuaW1hdGlvblxyXG4gICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1lbnRlcicpO1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gRXZlbnQgaGFuZGxpbmcgYW5kIHRpbWVyc1xyXG4gICAgICAgIGxldCByZW1haW5pbmcgPSBvcHRpb25zLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgbGV0IHRpbWVySWQgPSBudWxsO1xyXG4gICAgICAgIGxldCBzdGFydFRzID0gbnVsbDtcclxuICAgICAgICBsZXQgdXNlclBhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwcm9ncmVzc1JhZklkID0gbnVsbDtcclxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHsgY2xpY2s6IG5ldyBTZXQoKSwgY2xvc2U6IG5ldyBTZXQoKSB9O1xyXG5cclxuICAgICAgICBjb25zdCBzdGFydFRpbWVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXJlbWFpbmluZyB8fCByZW1haW5pbmcgPD0gMCkgcmV0dXJuOyAvLyBzdGlja3lcclxuICAgICAgICAgICAgc3RhcnRUcyA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiByZWYuY2xvc2UoJ3RpbWVvdXQnKSwgcmVtYWluaW5nKTtcclxuICAgICAgICAgICAgaWYgKHByb2dyZXNzQmFyRWwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVySWQgPT0gbnVsbCB8fCBzdGFydFRzID09IG51bGwpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHN0YXJ0VHM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nTXMgPSBNYXRoLm1heCgwLCByZW1haW5pbmcgLSBlbGFwc2VkKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gb3B0aW9ucy5kdXJhdGlvbk1zO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBjdCA9IGR1cmF0aW9uTXMgPiAwID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCAocmVtYWluaW5nTXMgLyBkdXJhdGlvbk1zKSAqIDEwMCkpIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnN0eWxlLndpZHRoID0gYCR7cGN0fSVgO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgU3RyaW5nKE1hdGgucm91bmQocGN0KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzUmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgcGF1c2VUaW1lciA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRpbWVySWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcclxuICAgICAgICAgICAgICAgIHRpbWVySWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0VHMgIT0gbnVsbCkgcmVtYWluaW5nIC09IChEYXRlLm5vdygpIC0gc3RhcnRUcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHByb2dyZXNzUmFmSWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NSYWZJZCk7XHJcbiAgICAgICAgICAgICAgICBwcm9ncmVzc1JhZklkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGF0dGFjaFByb2dyZXNzUGF1c2VIYW5kbGVyID0gKGJ0bikgPT4ge1xyXG4gICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdXNlclBhdXNlZCA9ICF1c2VyUGF1c2VkO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJQYXVzZWQpIHBhdXNlVGltZXIoKTsgZWxzZSBzdGFydFRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IHVzZXJQYXVzZWQgPyAnUmVwcmVuZHJlJyA6ICdQYXVzZSc7XHJcbiAgICAgICAgICAgICAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgbGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgYnRuLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBsYWJlbCk7XHJcbiAgICAgICAgICAgICAgICBidG4uaW5uZXJIVE1MID0gZ2V0UHJvZ3Jlc3NQYXVzZVJlc3VtZUljb25TVkcodXNlclBhdXNlZCk7IC8vIHBhdXNlZCA9IHJlc3VtZSAodHJpYW5nbGUpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RSZWZ9ICovXHJcbiAgICAgICAgY29uc3QgcmVmID0ge1xyXG4gICAgICAgICAgICBpZDogdG9hc3RJZCxcclxuICAgICAgICAgICAgZWw6IHRvYXN0RWwsXHJcbiAgICAgICAgICAgIGNsb3NlOiAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbGVhbnVwKHJlYXNvbiB8fCAnYXBpJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHVwZGF0ZTogKHBhcnRpYWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IHRoaXMubm9ybWFsaXplT3B0aW9ucyh7IC4uLm9wdGlvbnMsIC4uLnBhcnRpYWwgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY29udGVudFxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXJnZWQubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWwudGV4dENvbnRlbnQgPSBtZXJnZWQubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyZ2VkLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWwuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEVsLmFwcGVuZENoaWxkKG1lcmdlZC5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0eXBlIGNsYXNzXHJcbiAgICAgICAgICAgICAgICBbJ2luZm8nLCdzdWNjZXNzJywnd2FybmluZycsJ2RhbmdlciddLmZvckVhY2godCA9PiB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoYEFQWC10b2FzdC0tJHt0fWApKTtcclxuICAgICAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0LS0ke21lcmdlZC50eXBlfWApO1xyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNsYXNzZXNcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSAhPT0gbWVyZ2VkLmNsYXNzTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSkgdG9hc3RFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLm9wdGlvbnMuY2xhc3NOYW1lLnNwbGl0KCcgJykuZmlsdGVyKEJvb2xlYW4pKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWVyZ2VkLmNsYXNzTmFtZSkgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKC4uLm1lcmdlZC5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHByb2dyZXNzIHZpc2liaWxpdHkvcG9zaXRpb25cclxuICAgICAgICAgICAgICAgIG9wdGlvbnMucHJvZ3Jlc3MgPSBtZXJnZWQucHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NXcmFwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXJnZWQucHJvZ3Jlc3MuZW5hYmxlIHx8IG1lcmdlZC5kdXJhdGlvbk1zIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwLnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlQcm9ncmVzc1Bvc2l0aW9uKHRvYXN0RWwsIHByb2dyZXNzV3JhcCwgY29udGVudEVsLCBjbG9zZUJ0biwgbWVyZ2VkLnByb2dyZXNzLnBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmdlZC5wcm9ncmVzcy5lbmFibGUgJiYgbWVyZ2VkLmR1cmF0aW9uTXMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZVByb2dyZXNzQmxvY2sodG9hc3RFbCwgY29udGVudEVsLCBjbG9zZUJ0biwgbWVyZ2VkLnByb2dyZXNzKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1dyYXAgPSBjcmVhdGVkLndyYXA7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbCA9IGNyZWF0ZWQuYmFyO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzUGF1c2VCdG4gPSBjcmVhdGVkLnBhdXNlQnRuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1BhdXNlQnRuKSBhdHRhY2hQcm9ncmVzc1BhdXNlSGFuZGxlcihwcm9ncmVzc1BhdXNlQnRuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1dyYXAgJiYgcHJvZ3Jlc3NXcmFwLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBtZXJnZWQucHJvZ3Jlc3MucGF1c2VCdXR0b24gPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LnJlbW92ZSgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBkdXJhdGlvbiBsb2dpY1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kdXJhdGlvbk1zID0gbWVyZ2VkLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBtZXJnZWQuZHVyYXRpb25NcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc0JhckVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbC5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsICcxMDAnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBhdXNlVGltZXIoKTtcclxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZXIoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgd2hlbkNsb3NlZDogKCkgPT4gY2xvc2VkUHJvbWlzZSxcclxuICAgICAgICAgICAgb246IChldmVudCwgaGFuZGxlcikgPT4geyBoYW5kbGVyc1tldmVudF0uYWRkKGhhbmRsZXIpOyByZXR1cm4gKCkgPT4gcmVmLm9mZihldmVudCwgaGFuZGxlcik7IH0sXHJcbiAgICAgICAgICAgIG9mZjogKGV2ZW50LCBoYW5kbGVyKSA9PiB7IGhhbmRsZXJzW2V2ZW50XS5kZWxldGUoaGFuZGxlcik7IH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBub3RpZnkgPSAoZXZlbnQsIGFyZykgPT4gaGFuZGxlcnNbZXZlbnRdLmZvckVhY2goZm4gPT4geyB0cnkgeyBmbihhcmcpOyB9IGNhdGNoIChfKSB7fSB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgY2xvc2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmaW5pc2ggPSAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBub3RpZnkoJ2Nsb3NlJywgcmVhc29uKTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vbkNsb3NlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgb3B0aW9ucy5vbkNsb3NlKHJlZiwgcmVhc29uKTsgfSBjYXRjaChfKXt9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0b2FzdEVsKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBwYXVzZVRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NSYWZJZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NSYWZJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIHBvc2l0aW9uIGxpc3RlbmVycyBhbmQgcmVzdG9yZSBzdHlsZXNcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbkNsZWFudXApIHtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAoKTtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBJZiBvdmVyZmxvdywgcmVtb3ZlIGltbWVkaWF0ZWx5IHRvIGVuZm9yY2UgaGFyZCBjYXBcclxuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT09ICdvdmVyZmxvdycpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodG9hc3RFbC5wYXJlbnRFbGVtZW50KSB0b2FzdEVsLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5vcGVuLmluZGV4T2YocmVmKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHRoaXMub3Blbi5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkVG9SZWYuZGVsZXRlKHRvYXN0SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaChyZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGFuaW1hdGUgb3V0XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZXhpdCcpO1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1leGl0LWFjdGl2ZScpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVFbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0b2FzdEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCByZW1vdmVFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvYXN0RWwucGFyZW50RWxlbWVudCkgdG9hc3RFbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRvYXN0RWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMub3Blbi5pbmRleE9mKHJlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB0aGlzLm9wZW4uc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZFRvUmVmLmRlbGV0ZSh0b2FzdElkKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVHYXJiYWdlQ29sbGVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaChyZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHJlbW92ZUVsKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIC8vIGF0dGFjaCBjbG9zZSBiZWhhdmlvclxyXG4gICAgICAgICAgICByZWYuY2xvc2UgPSAocmVhc29uKSA9PiBjbGVhbnVwKHJlYXNvbiB8fCAnYXBpJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENsaWNrIGhhbmRsaW5nXHJcbiAgICAgICAgdG9hc3RFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldikgPT4ge1xyXG4gICAgICAgICAgICBub3RpZnkoJ2NsaWNrJywgZXYpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHsgb3B0aW9ucy5vbkNsaWNrKHJlZiwgZXYpOyB9IGNhdGNoKF8pe31cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIb3ZlciBwYXVzZVxyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHBhdXNlVGltZXIpO1xyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHsgaWYgKCF1c2VyUGF1c2VkKSBzdGFydFRpbWVyKCk7IH0pO1xyXG5cclxuICAgICAgICBpZiAoY2xvc2VCdG4pIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2KSA9PiB7IGV2LnN0b3BQcm9wYWdhdGlvbigpOyByZWYuY2xvc2UoJ2Nsb3NlJyk7IH0pO1xyXG4gICAgICAgIGlmIChwcm9ncmVzc1BhdXNlQnRuKSBhdHRhY2hQcm9ncmVzc1BhdXNlSGFuZGxlcihwcm9ncmVzc1BhdXNlQnRuKTtcclxuXHJcbiAgICAgICAgLy8gVHJhY2tcclxuICAgICAgICB0aGlzLm9wZW4ucHVzaChyZWYpO1xyXG4gICAgICAgIHRoaXMuaWRUb1JlZi5zZXQodG9hc3RJZCwgcmVmKTtcclxuXHJcbiAgICAgICAgLy8gT3ZlcmZsb3cgcG9saWN5XHJcbiAgICAgICAgaWYgKHRoaXMub3Blbi5sZW5ndGggPiB0aGlzLmNvbmZpZy5tYXhUb2FzdHMpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5vcGVuWzBdO1xyXG4gICAgICAgICAgICBvbGRlc3QuY2xvc2UoJ292ZXJmbG93Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGFydFRpbWVyKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlZjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlbmllbmNlIGhlbHBlcnNcclxuICAgICAqL1xyXG4gICAgaW5mbyhtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnaW5mbycgfSk7IH1cclxuICAgIHN1Y2Nlc3MobWVzc2FnZSwgb3B0cykgeyByZXR1cm4gdGhpcy5zaG93KHsgLi4uKG9wdHN8fHt9KSwgbWVzc2FnZSwgdHlwZTogJ3N1Y2Nlc3MnIH0pOyB9XHJcbiAgICB3YXJuaW5nKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICd3YXJuaW5nJyB9KTsgfVxyXG4gICAgZGFuZ2VyKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICdkYW5nZXInIH0pOyB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7J2FwaSd8J292ZXJmbG93J30gW3JlYXNvbl0gKi9cclxuICAgIGNsb3NlQWxsKHJlYXNvbikge1xyXG4gICAgICAgIC8vIGNvcHkgdG8gYXZvaWQgbXV0YXRpb24gZHVyaW5nIGl0ZXJhdGlvblxyXG4gICAgICAgIGNvbnN0IGFsbCA9IHRoaXMub3Blbi5zbGljZSgpO1xyXG4gICAgICAgIGFsbC5mb3JFYWNoKHIgPT4gci5jbG9zZShyZWFzb24gfHwgJ2FwaScpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtUb2FzdE9wdGlvbnN9IG9wdHMgKi9cclxuICAgIG5vcm1hbGl6ZU9wdGlvbnMob3B0cykge1xyXG4gICAgICAgIGNvbnN0IG8gPSB7IC4uLm9wdHMgfTtcclxuICAgICAgICBpZiAoIW8udHlwZSkgby50eXBlID0gJ2luZm8nO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygby5kaXNtaXNzaWJsZSAhPT0gJ2Jvb2xlYW4nKSBvLmRpc21pc3NpYmxlID0gdHJ1ZTtcclxuICAgICAgICBpZiAodHlwZW9mIG8uZHVyYXRpb25NcyAhPT0gJ251bWJlcicpIG8uZHVyYXRpb25NcyA9IHRoaXMuY29uZmlnLmRlZmF1bHREdXJhdGlvbk1zO1xyXG4gICAgICAgIC8vIFVzZSBpZCBmcm9tIG9wdGlvbnMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2UgaWQgZnJvbSBjb25maWcsIG90aGVyd2lzZSB1bmRlZmluZWQgKHdpbGwgYmUgYXV0by1nZW5lcmF0ZWQpXHJcbiAgICAgICAgaWYgKCFvLmlkICYmIHRoaXMuY29uZmlnLmlkKSBvLmlkID0gdGhpcy5jb25maWcuaWQ7XHJcbiAgICAgICAgby5wcm9ncmVzcyA9IHJlc29sdmVQcm9ncmVzcyhvcHRzLnByb2dyZXNzLCB0aGlzLmNvbmZpZy5wcm9ncmVzcyk7XHJcbiAgICAgICAgcmV0dXJuIG87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIG9yIGNyZWF0ZSBhIGNvbnRhaW5lciBmb3IgYSBzcGVjaWZpYyBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB7J3VwJ3wnZG93bid9IFtmbG93XSBGbG93IGRpcmVjdGlvbiAoYWxyZWFkeSBkZXRlcm1pbmVkLCBub3QgJ2F1dG8nKVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbWFuYWdlZF0gV2hldGhlciB0aGlzIGNvbnRhaW5lciBpcyBtYW5hZ2VkIGJ5IGEgbWFuYWdlciAoZGVmYXVsdDogZmFsc2UpXHJcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cclxuICAgICAqL1xyXG4gICAgZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZsb3csIG1hbmFnZWQgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IHNlcmlhbGl6ZVBvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBGbG93IHNob3VsZCBhbHJlYWR5IGJlIGRldGVybWluZWQgKCd1cCcgb3IgJ2Rvd24nKSwgYnV0IGZhbGxiYWNrIHRvIGF1dG8gaWYgbmVlZGVkXHJcbiAgICAgICAgY29uc3QgZmluYWxGbG93ID0gZmxvdyAmJiBmbG93ICE9PSAnYXV0bycgPyBmbG93IDogZGV0ZXJtaW5lRmxvdyhwb3NpdGlvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMS4gQ2hlY2sgbWVtb3J5IGNhY2hlXHJcbiAgICAgICAgbGV0IGMgPSBfY29udGFpbmVyQ2FjaGUuZ2V0KHBvc2l0aW9uS2V5KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyAyLiBJZiBub3QgaW4gY2FjaGUsIHNlYXJjaCBpbiBET00gYnkgZGF0YSBhdHRyaWJ1dGVcclxuICAgICAgICBpZiAoIWMgJiYgaXNCcm93c2VyKSB7XHJcbiAgICAgICAgICAgIGMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHgtdG9hc3QtcG9zaXRpb249XCIke3Bvc2l0aW9uS2V5fVwiXWApO1xyXG4gICAgICAgICAgICBpZiAoYykge1xyXG4gICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLnNldChwb3NpdGlvbktleSwgYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMy4gSWYgc3RpbGwgbm90IGZvdW5kLCBjcmVhdGUgbmV3IGNvbnRhaW5lclxyXG4gICAgICAgIGlmICghYykge1xyXG4gICAgICAgICAgICBjID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3QtY29udGFpbmVyJyk7XHJcbiAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicsIHBvc2l0aW9uS2V5KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIE1hcmsgYXMgbWFuYWdlZCBpZiBjcmVhdGVkIGJ5IGEgbWFuYWdlclxyXG4gICAgICAgICAgICBpZiAobWFuYWdlZCkge1xyXG4gICAgICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQnLCAndHJ1ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgcG9zaXRpb24gY2xhc3MgKGZvciBDU1MpXHJcbiAgICAgICAgICAgIGNvbnN0IHBvc0NsYXNzID0gdHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJyBcclxuICAgICAgICAgICAgICAgID8gcG9zaXRpb24gXHJcbiAgICAgICAgICAgICAgICA6IChwb3NpdGlvbi50eXBlIHx8ICdib3R0b20tcmlnaHQnKTtcclxuICAgICAgICAgICAgYy5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3QtY29udGFpbmVyLS0ke3Bvc0NsYXNzfWApO1xyXG4gICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgICAgIGMuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgICAgIGMuc3R5bGUuZ2FwID0gYCR7dGhpcy5jb25maWcuZ2FwfXB4YDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFwcGx5IGZsb3cgZGlyZWN0aW9uXHJcbiAgICAgICAgICAgIGMuc3R5bGUuZmxleERpcmVjdGlvbiA9IGZpbmFsRmxvdyA9PT0gJ3VwJyA/ICdjb2x1bW4tcmV2ZXJzZScgOiAnY29sdW1uJztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFwcGx5IHBvc2l0aW9uIHN0eWxlcyBpZiBvYmplY3QgcG9zaXRpb25cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGMuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihwb3NpdGlvbiwgYyk7XHJcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGMuc3R5bGUsIHN0eWxlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFwcGVuZCB0byB3cmFwcGVyIGZvciBjbGVhbiBET00gb3JnYW5pemF0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXIgPSBnZXRUb2FzdFdyYXBwZXIoKTtcclxuICAgICAgICAgICAgaWYgKHdyYXBwZXIpIHtcclxuICAgICAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5zZXQocG9zaXRpb25LZXksIGMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBmbG93IGRpcmVjdGlvbiBpZiBjb250YWluZXIgZXhpc3RzIChtYXkgYmUgc2hhcmVkKVxyXG4gICAgICAgICAgICBjLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBJZiBjb250YWluZXIgZXhpc3RzIGFuZCBpcyBub3cgbWFuYWdlZCwgbWFyayBpdFxyXG4gICAgICAgICAgICBpZiAobWFuYWdlZCAmJiAhYy5oYXNBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQnLCAndHJ1ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBjO1xyXG4gICAgfVxyXG5cclxuICAgIGVuc3VyZUNvbnRhaW5lcigpIHtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIgfHwgIWlzQnJvd3NlcikgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jb25maWcucG9zaXRpb24gfHwgJ2JvdHRvbS1yaWdodCc7XHJcbiAgICAgICAgY29uc3QgZmxvdyA9IHRoaXMuY29uZmlnLmZsb3cgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmZsb3cgOiAnYXV0byc7XHJcbiAgICAgICAgLy8gQ29udGFpbmVycyBjcmVhdGVkIGJ5IGVuc3VyZUNvbnRhaW5lciBhcmUgbWFuYWdlZFxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmxvdywgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5hcHBseUNvbnRhaW5lckNvbmZpZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5Q29udGFpbmVyQ29uZmlnKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xyXG4gICAgICAgIGNvbnN0IHBvcyA9IHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycgPyBwb3NpdGlvbiA6IChwb3NpdGlvbi50eXBlIHx8ICdib3R0b20tcmlnaHQnKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBseSBzdHlsZXMgKHRoZXNlIG1heSBiZSBvdmVycmlkZGVuIGJ5IG90aGVyIG1hbmFnZXJzIHNoYXJpbmcgdGhlIGNvbnRhaW5lcilcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBTdHJpbmcodGhpcy5jb25maWcuekluZGV4KTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5nYXAgPSBgJHt0aGlzLmNvbmZpZy5nYXB9cHhgO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVXBkYXRlIHBvc2l0aW9uIGNsYXNzIChvbmx5IGZvciBzdHJpbmcgcG9zaXRpb25zKVxyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc0NsYXNzZXMgPSBbJ2JvdHRvbS1yaWdodCcsJ2JvdHRvbS1sZWZ0JywndG9wLXJpZ2h0JywndG9wLWxlZnQnXS5tYXAocCA9PiBgQVBYLXRvYXN0LWNvbnRhaW5lci0tJHtwfWApO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKC4uLnBvc0NsYXNzZXMpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3QtY29udGFpbmVyLS0ke3Bvc31gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwbHkgY29udGFpbmVyIGNsYXNzIGlmIHNwZWNpZmllZFxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5jb250YWluZXJDbGFzcykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5jb250YWluZXJDbGFzcy5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGNscyA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGNscyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBseSBvZmZzZXQgKG9ubHkgZm9yIHN0cmluZyBwb3NpdGlvbnMpXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLm9mZnNldCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYCR7dGhpcy5jb25maWcub2Zmc2V0fXB4YDtcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ2JvdHRvbScpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLnN0eWxlLnRvcCA9IG9mZnNldDtcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ3JpZ2h0JykpIHRoaXMuY29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgb2Zmc2V0IGlmIG5vdCBzcGVjaWZpZWRcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ2JvdHRvbScpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSAnJztcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUudG9wID0gJyc7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdyaWdodCcpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5yaWdodCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gRm9yIG9iamVjdCBwb3NpdGlvbnMsIGVuc3VyZSBjb250YWluZXIgaGFzIHBvc2l0aW9uOiBmaXhlZFxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHBvc2l0aW9uIGZvciBhIGNvbnRhaW5lciBiYXNlZCBvbiBwb3NpdGlvbiBjb25maWdcclxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXJFbFxyXG4gICAgICogQHJldHVybnMge3tsZWZ0Pzogc3RyaW5nLCB0b3A/OiBzdHJpbmcsIHJpZ2h0Pzogc3RyaW5nLCBib3R0b20/OiBzdHJpbmd9fVxyXG4gICAgICovXHJcbiAgICBjYWxjdWxhdGVQb3NpdGlvbihwb3NpdGlvbiwgY29udGFpbmVyRWwpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAvLyBTdHJpbmcgcG9zaXRpb25zIGFyZSBoYW5kbGVkIGJ5IGNvbnRhaW5lciBDU1NcclxuICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnc3RpY2t5JyB8fCAoIXR5cGUgJiYgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTdGlja3k6IGZpeGVkIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHZpZXdwb3J0XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTtcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi54ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueC5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnJpZ2h0ID0gcG9zaXRpb24ueC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBwb3NpdGlvbi54O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmJvdHRvbSA9IHBvc2l0aW9uLnkuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBwb3NpdGlvbi55O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAncmVsYXRpdmUnICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlOiBwb3NpdGlvbiByZWxhdGl2ZSB0byBlbGVtZW50IHdpdGggeC95IG9mZnNldFxyXG4gICAgICAgICAgICAgICAgLy8gVXNlIGZpeGVkIHBvc2l0aW9uaW5nLCBzbyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSBpcyByZWxhdGl2ZSB0byB2aWV3cG9ydFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHBvc2l0aW9uLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIHgveSBvZmZzZXRzIChjYW4gYmUgcHgsIGVtLCBldGMuKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VPZmZzZXQgPSAodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQodmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmluY2x1ZGVzKCdlbScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZW0gdG8gcHggKGFwcHJveGltYXRlOiAxZW0gPSAxNnB4KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtICogMTY7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW07XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRYID0gcGFyc2VPZmZzZXQocG9zaXRpb24ueCB8fCAnMCcpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0WSA9IHBhcnNlT2Zmc2V0KHBvc2l0aW9uLnkgfHwgJzAnKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IGAke3JlY3QubGVmdCArIG9mZnNldFh9cHhgLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogYCR7cmVjdC50b3AgKyBvZmZzZXRZfXB4YFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnYW5jaG9yZWQnICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEFuY2hvcmVkOiBwb3NpdGlvbiByZWxhdGl2ZSB0byBlbGVtZW50IHdpdGggcGxhY2VtZW50XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gcG9zaXRpb24uZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdhcCA9IHBvc2l0aW9uLmdhcCB8fCAnMWVtJztcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgZ2FwIChjYW4gYmUgcHgsIGVtLCBldGMuKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VHYXAgPSAodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuaW5jbHVkZXMoJ2VtJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSAqIDE2OyAvLyBBcHByb3hpbWF0ZTogMWVtID0gMTZweFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2FwUHggPSBwYXJzZUdhcChnYXApO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge307XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBwbGFjZW1lbnQgc3lub255bXMgKGFib3ZlL2JlbG93L2JlZm9yZS9hZnRlcikgdG8gQ1NTIHZhbHVlc1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgYWJvdmUgZWxlbWVudDogYm90dG9tIG9mIHRvYXN0ID0gdG9wIG9mIGVsZW1lbnQgLSBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90dG9tID0gdmlld3BvcnQgaGVpZ2h0IC0gKGVsZW1lbnQgdG9wIC0gZ2FwKSA9IHZpZXdwb3J0IGhlaWdodCAtIGVsZW1lbnQgdG9wICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5ib3R0b20gPSBgJHt3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LnRvcCArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBgJHtyZWN0LmxlZnR9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCBiZWxvdyBlbGVtZW50OiB0b3Agb2YgdG9hc3QgPSBib3R0b20gb2YgZWxlbWVudCArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gYCR7cmVjdC5ib3R0b20gKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gYCR7cmVjdC5sZWZ0fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IHRvIHRoZSBsZWZ0OiByaWdodCBvZiB0b2FzdCA9IGxlZnQgb2YgZWxlbWVudCAtIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMucmlnaHQgPSBgJHt3aW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QubGVmdCArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCB0byB0aGUgcmlnaHQ6IGxlZnQgb2YgdG9hc3QgPSByaWdodCBvZiBlbGVtZW50ICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gYCR7cmVjdC5yaWdodCArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz49fSBjb25maWdcclxuICogQHJldHVybnMge1RvYXN0TWFuYWdlcn1cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZVRvYXN0TWFuYWdlcihjb25maWcpIHtcclxuICAgIHJldHVybiBuZXcgVG9hc3RNYW5hZ2VyKGNvbmZpZyk7XHJcbn1cclxuXHJcbi8vIEhpZ2gtbGV2ZWwgQVBYLnRvYXN0IEFQSSAoZGVmYXVsdCAmIG5hbWVkIG1hbmFnZXJzKVxyXG5sZXQgX2RlZmF1bHRNYW5hZ2VyID0gbnVsbDtcclxuY29uc3QgX2dldERlZmF1bHQgPSAoKSA9PiB7XHJcbiAgICBpZiAoIV9kZWZhdWx0TWFuYWdlcikgX2RlZmF1bHRNYW5hZ2VyID0gY3JlYXRlVG9hc3RNYW5hZ2VyKCk7XHJcbiAgICByZXR1cm4gX2RlZmF1bHRNYW5hZ2VyO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRvYXN0IEFQSSBzdXJmYWNlIHRvIGJlIGF0dGFjaGVkIGFzIEFQWC50b2FzdC5cclxuICogQ2FsbGFibGUgZm9ybSBwcm94aWVzIHRvIGRlZmF1bHRNYW5hZ2VyLnNob3cob3B0cyk6IEFQWC50b2FzdCh7Li4ufSlcclxuICovXHJcbmZ1bmN0aW9uIHRvYXN0KG9wdHMpIHtcclxuICAgIHJldHVybiBfZ2V0RGVmYXVsdCgpLnNob3cob3B0cyk7XHJcbn1cclxuXHJcbk9iamVjdC5hc3NpZ24odG9hc3QsIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbWFuYWdlci4gSWYgZmlyc3QgYXJnIGlzIHN0cmluZywgcmVnaXN0ZXIgYXMgbmFtZWQgdW5kZXIgdG9hc3QuY3VzdG9tW25hbWVdXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xQYXJ0aWFsPFRvYXN0Q29uZmlnPn0gbmFtZU9yQ29uZmlnXHJcbiAgICAgKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+PX0gbWF5YmVDb25maWdcclxuICAgICAqIEByZXR1cm5zIHtUb2FzdE1hbmFnZXJ9XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZTogKG5hbWVPckNvbmZpZywgbWF5YmVDb25maWcpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIG5hbWVPckNvbmZpZyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVPckNvbmZpZztcclxuICAgICAgICAgICAgY29uc3QgbWFuYWdlciA9IG5ldyBUb2FzdE1hbmFnZXIoeyAuLi4obWF5YmVDb25maWcgfHwge30pIH0pO1xyXG4gICAgICAgICAgICBpZiAoIXRvYXN0LmN1c3RvbSkgdG9hc3QuY3VzdG9tID0ge307XHJcbiAgICAgICAgICAgIHRvYXN0LmN1c3RvbVtuYW1lXSA9IG1hbmFnZXI7XHJcbiAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFRvYXN0TWFuYWdlcih7IC4uLihuYW1lT3JDb25maWcgfHwge30pIH0pO1xyXG4gICAgfSxcclxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgVG9hc3RNYW5hZ2VyPn0gKi9cclxuICAgIGN1c3RvbToge30sXHJcbiAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWUgKi9cclxuICAgIHVzZTogKG5hbWUpID0+ICh0b2FzdC5jdXN0b20gJiYgdG9hc3QuY3VzdG9tW25hbWVdKSB8fCBudWxsLFxyXG4gICAgTWFuYWdlcjogVG9hc3RNYW5hZ2VyLFxyXG4gICAgc2hvdzogKG9wdHMpID0+IF9nZXREZWZhdWx0KCkuc2hvdyhvcHRzKSxcclxuICAgIGluZm86IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLmluZm8obWVzc2FnZSwgb3B0cyksXHJcbiAgICBzdWNjZXNzOiAobWVzc2FnZSwgb3B0cykgPT4gX2dldERlZmF1bHQoKS5zdWNjZXNzKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgd2FybmluZzogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkud2FybmluZyhtZXNzYWdlLCBvcHRzKSxcclxuICAgIGRhbmdlcjogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkuZGFuZ2VyKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgY29uZmlndXJlOiAoY29uZmlnKSA9PiBfZ2V0RGVmYXVsdCgpLmNvbmZpZ3VyZShjb25maWcpLFxyXG4gICAgc2V0QXJpYUxpdmU6IChtb2RlKSA9PiBfZ2V0RGVmYXVsdCgpLnNldEFyaWFMaXZlKG1vZGUpLFxyXG4gICAgY2xvc2VBbGw6IChyZWFzb24pID0+IF9nZXREZWZhdWx0KCkuY2xvc2VBbGwocmVhc29uKSxcclxuICAgIGdldE9wZW5Ub2FzdHM6ICgpID0+IF9nZXREZWZhdWx0KCkuZ2V0T3BlblRvYXN0cygpXHJcbn0pO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgdG9hc3Q7XHJcbmV4cG9ydCB7IFRvYXN0TWFuYWdlciwgY3JlYXRlVG9hc3RNYW5hZ2VyLCB0b2FzdCB9O1xyXG4iLCIvLyBJbXBvcnQgZGVzIGZvbmN0aW9ucyBldCBtb2R1bGVzIGRlcyBzb3VzLW1vZHVsZXNcclxuaW1wb3J0IGF1Z21lbnRXaXRoUGFjayBmcm9tICcuL2Zvcm0tcGFja2VyL2F1Z21lbnQtYXB4Lm1qcyc7XHJcbmltcG9ydCB7IHBhY2tGb3JtVG9KU09OIH0gZnJvbSAnLi9mb3JtLXBhY2tlci9wYWNrVG9Kc29uLm1qcyc7XHJcblxyXG4vLyBFeHBvcnQgZGUgbGEgZm9uY3Rpb24gZCdhdWdtZW50YXRpb25cclxuZXhwb3J0IHsgYXVnbWVudFdpdGhQYWNrIH07XHJcblxyXG4vLyBFeHBvcnQgZGVzIGZvbmN0aW9ucyB1dGlsaXRhaXJlc1xyXG5leHBvcnQgeyBwYWNrRm9ybVRvSlNPTiB9O1xyXG5cclxuLy8gRXhwb3J0IGQndW4gb2JqZXQgdG9vbHMgcG91ciBmYWNpbGl0ZXIgbCd1dGlsaXNhdGlvblxyXG5leHBvcnQgY29uc3QgdG9vbHMgPSB7XHJcbiAgICBwYWNrRm9ybVRvSlNPTjogcGFja0Zvcm1Ub0pTT05cclxufTtcclxuXHJcblxyXG4iLCJpbXBvcnQgeyBwYWNrRm9ybVRvSlNPTiB9IGZyb20gJy4vcGFja1RvSnNvbi5tanMnO1xyXG5cclxuLyoqXHJcbiAqIEFqb3V0ZSBsYSBtw6l0aG9kZSBwYWNrKCkgYXV4IG9iamV0cyBBUFggcG91ciBjb252ZXJ0aXIgbGVzIGZvcm11bGFpcmVzIGVuIEpTT05cclxuICogQHBhcmFtIHtPYmplY3R9IGFweCAtIEwnb2JqZXQgQVBYIMOgIGF1Z21lbnRlclxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IEFQWCBhdWdtZW50w6lcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChhcHgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydGl0IGxlIHByZW1pZXIgZm9ybXVsYWlyZSBzw6lsZWN0aW9ubsOpIGVuIG9iamV0IEpTT05cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIHBhc3PDqWVzIMOgIHBhY2tGb3JtVG9KU09OIChleC4geyBudW1lcmljS2V5c0Fsd2F5c0FycmF5OiB0cnVlIH0pXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IEpTT04gcsOpc3VsdGFudFxyXG4gICAgICogQHRocm93cyB7RXJyb3J9IFNpIGF1Y3VuIGZvcm11bGFpcmUgbidlc3QgdHJvdXbDqSBvdSBzaSBsZSBwcmVtaWVyIMOpbMOpbWVudCBuJ2VzdCBwYXMgdW4gZm9ybXVsYWlyZVxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGNvbnN0IGRhdGEgPSBBUFgoJ2Zvcm0ubXlmb3JtY2xhc3MnKS5wYWNrKCk7XHJcbiAgICAgKiBjb25zdCBkYXRhTGVnYWN5ID0gQVBYKCdmb3JtJykucGFjayh7IG51bWVyaWNLZXlzQWx3YXlzQXJyYXk6IHRydWUgfSk7XHJcbiAgICAgKi9cclxuICAgIGFweC5wYWNrID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0aGlzLmZpcnN0KCk7XHJcbiAgICAgICAgaWYgKCFmaXJzdEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbGVtZW50IGZvdW5kJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaXJzdEVsZW1lbnQudGFnTmFtZSAhPT0gJ0ZPUk0nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRWxlbWVudCBpcyBub3QgYSBmb3JtJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYWNrRm9ybVRvSlNPTihmaXJzdEVsZW1lbnQsIG9wdGlvbnMpO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGFweDtcclxufVxyXG5cclxuXHJcbiIsIi8qKlxyXG4gKiBDb252ZXJ0aXQgdW4gZm9ybXVsYWlyZSBIVE1MIGVuIG9iamV0IEpTT05cclxuICogQHBhcmFtIHtIVE1MRm9ybUVsZW1lbnR9IGZvcm0gLSBMZSBmb3JtdWxhaXJlIMOgIGNvbnZlcnRpclxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucyBkZSBjb252ZXJzaW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubnVtZXJpY0tleXNBbHdheXNBcnJheT1mYWxzZV0gLSBTaSB0cnVlLCB0b3V0ZSBjbMOpIG51bcOpcmlxdWUgZXN0IHRyYWl0w6llIGNvbW1lIGluZGV4IGRlIHRhYmxlYXUgKGNvbXBvcnRlbWVudCBkJ2F2YW50IDIuNi4yKS4gU2lub24sIGhldXJpc3RpcXVlIDogdGFibGVhdSBzZXVsZW1lbnQgc2kgaW5kaWNlcyBkZW5zZXMgMCwxLDIs4oCmLG4uXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgSlNPTiByw6lzdWx0YW50XHJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gU2kgZm9ybSBuJ2VzdCBwYXMgdW4gSFRNTEZvcm1FbGVtZW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcGFja0Zvcm1Ub0pTT04gPSAoZm9ybSwgb3B0aW9ucyA9IHt9KSA9PiB7XHJcbiAgICAvLyBWYWxpZGF0aW9uIGRlIGwnZW50csOpZVxyXG4gICAgaWYgKCFmb3JtIHx8ICEoZm9ybSBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYWNrRm9ybVRvSlNPTiBleHBlY3RzIGFuIEhUTUxGb3JtRWxlbWVudCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG51bWVyaWNLZXlzQWx3YXlzQXJyYXkgPSBvcHRpb25zLm51bWVyaWNLZXlzQWx3YXlzQXJyYXkgPT09IHRydWU7XHJcblxyXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSk7XHJcbiAgICBjb25zdCBqc29uRGF0YSA9IHt9O1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVpdCB1bmUgcmVwcsOpc2VudGF0aW9uIHN0cmluZyBkdSBjaGVtaW4gcG91ciBsZXMgbWVzc2FnZXMgZCdlcnJldXJcclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRzIC0gTGVzIHBhcnRpZXMgZHUgY2hlbWluXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBMZSBjaGVtaW4gZm9ybWF0w6lcclxuICAgICAqL1xyXG4gICAgY29uc3QgYnVpbGRQYXRoU3RyaW5nID0gKHBhcnRzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHBhcnRzLnJlZHVjZSgocGF0aCwgcGFydCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAna2V5Jykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGggPyBgJHtwYXRofVske3BhcnQubmFtZX1dYCA6IHBhcnQubmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtwYXRofVske3BhcnQuaW5kZXh9XWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3BhdGh9W11gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgICAgIH0sICcnKTtcclxuICAgIH07XHJcbiAgICBcclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIC8vIFBIQVNFIDEgOiBBTkFMWVNFIEVUIETDiVRFQ1RJT04gREVTIENPTkZMSVRTXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU3RydWN0dXJlIHBvdXIgc3RvY2tlciBsJ3V0aWxpc2F0aW9uIGQndW4gY2hlbWluXHJcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBQYXRoVXNhZ2VcclxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNGaW5hbCAtIExlIGNoZW1pbiBlc3QgdXRpbGlzw6kgY29tbWUgdmFsZXVyIGZpbmFsZVxyXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBpc0ludGVybWVkaWF0ZSAtIExlIGNoZW1pbiBlc3QgdXRpbGlzw6kgY29tbWUgY2hlbWluIGludGVybcOpZGlhaXJlXHJcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGhhc0FycmF5U3VmZml4IC0gTGUgY2hlbWluIHNlIHRlcm1pbmUgcGFyIFtdIChjcsOpZSBkZXMgdmFsZXVycyBwcmltaXRpdmVzKVxyXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGtleSAtIExhIGNsw6kgZHUgZm9ybXVsYWlyZSBxdWkgdXRpbGlzZSBjZSBjaGVtaW5cclxuICAgICAqL1xyXG4gICAgXHJcbiAgICBjb25zdCBwYXRoVXNhZ2UgPSBuZXcgTWFwKCk7IC8vIE1hcDxwYXRoU3RyaW5nLCBQYXRoVXNhZ2U+XHJcbiAgICBjb25zdCBrZXlBbmFseXNpcyA9IG5ldyBNYXAoKTsgLy8gTWFwPGJhc2VQYXRoLCB7aGFzTnVtZXJpYzogYm9vbGVhbiwgaGFzU3RyaW5nOiBib29sZWFufT5cclxuICAgIGNvbnN0IG51bWVyaWNJbmRpY2VzQnlQYXRoID0gbmV3IE1hcCgpOyAvLyBNYXA8cGF0aFN0cmluZywgU2V0PG51bWJlcj4+IOKAlCBpbmRpY2VzIHVuZGVyIGVhY2ggcGFyZW50IHBhdGhcclxuICAgIGNvbnN0IGFsbEVudHJpZXMgPSBbXTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBFbnJlZ2lzdHJlIGwndXRpbGlzYXRpb24gZCd1biBjaGVtaW4gZGFucyBwYXRoVXNhZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjdXJyZW50UGF0aCAtIExlIGNoZW1pbiDDoCBlbnJlZ2lzdHJlclxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0ZpbmFsIC0gU2kgYydlc3QgdW5lIHZhbGV1ciBmaW5hbGVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNBcnJheVN1ZmZpeCAtIFNpIGxlIGNoZW1pbiBzZSB0ZXJtaW5lIHBhciBbXVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIExhIGNsw6kgZHUgZm9ybXVsYWlyZVxyXG4gICAgICovXHJcbiAgICBjb25zdCByZWNvcmRQYXRoVXNhZ2UgPSAoY3VycmVudFBhdGgsIGlzRmluYWwsIGlzQXJyYXlTdWZmaXgsIGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHVzYWdlID0gcGF0aFVzYWdlLmdldChjdXJyZW50UGF0aCkgPz8ge1xyXG4gICAgICAgICAgICBpc0ZpbmFsOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNJbnRlcm1lZGlhdGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBoYXNBcnJheVN1ZmZpeDogZmFsc2UsXHJcbiAgICAgICAgICAgIGtleVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFwYXRoVXNhZ2UuaGFzKGN1cnJlbnRQYXRoKSkge1xyXG4gICAgICAgICAgICBwYXRoVXNhZ2Uuc2V0KGN1cnJlbnRQYXRoLCB1c2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChpc0ZpbmFsKSB7XHJcbiAgICAgICAgICAgIHVzYWdlLmlzRmluYWwgPSB0cnVlO1xyXG4gICAgICAgICAgICB1c2FnZS5rZXkgPSBrZXk7XHJcbiAgICAgICAgICAgIGlmIChpc0FycmF5U3VmZml4KSB7XHJcbiAgICAgICAgICAgICAgICB1c2FnZS5oYXNBcnJheVN1ZmZpeCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB1c2FnZS5pc0ludGVybWVkaWF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHVzYWdlLmtleSA/Pz0ga2V5O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBcclxuICAgIC8vIFByZW1pw6hyZSBwYXNzZSA6IGFuYWx5c2VyIHRvdXRlcyBsZXMgY2zDqXMgZXQgZW5yZWdpc3RyZXIgbGVzIGNoZW1pbnNcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGZvcm1EYXRhLmVudHJpZXMoKSkge1xyXG4gICAgICAgIGlmICgha2V5KSBjb250aW51ZTtcclxuICAgICAgICBcclxuICAgICAgICBhbGxFbnRyaWVzLnB1c2goeyBrZXksIHZhbHVlIH0pO1xyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGFyc2VLZXkoa2V5KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBDb25zdHJ1aXJlIHRvdXMgbGVzIGNoZW1pbnMgaW50ZXJtw6lkaWFpcmVzIGV0IGxlIGNoZW1pbiBmaW5hbFxyXG4gICAgICAgIGxldCBjdXJyZW50UGF0aCA9ICcnO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBpc0xhc3QgPSBpID09PSBwYXJ0cy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICBjb25zdCBpc0FycmF5U3VmZml4ID0gcGFydC50eXBlID09PSAnYXJyYXknO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQ29uc3RydWlyZSBsZSBjaGVtaW4ganVzcXUnw6AgY2Ugbml2ZWF1XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdrZXknKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGN1cnJlbnRQYXRoID8gYCR7Y3VycmVudFBhdGh9WyR7cGFydC5uYW1lfV1gIDogcGFydC5uYW1lO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gY3VycmVudFBhdGg7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2V0ID0gbnVtZXJpY0luZGljZXNCeVBhdGguZ2V0KHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtZXJpY0luZGljZXNCeVBhdGguc2V0KHBhcmVudFBhdGgsIHNldCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzZXQuYWRkKHBhcnQuaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBgJHtjdXJyZW50UGF0aH1bJHtwYXJ0LmluZGV4fV1gO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBgJHtjdXJyZW50UGF0aH1bXWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEVucmVnaXN0cmVyIGwndXRpbGlzYXRpb24gZHUgY2hlbWluXHJcbiAgICAgICAgICAgIHJlY29yZFBhdGhVc2FnZShjdXJyZW50UGF0aCwgaXNMYXN0LCBpc0FycmF5U3VmZml4ICYmIGlzTGFzdCwga2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQW5hbHlzZXIgY2hhcXVlIG5pdmVhdSBkZSBsYSBoacOpcmFyY2hpZSBwb3VyIGTDqXRlY3RlciBsZXMgY29uZmxpdHMgKGluZGljZXMgbnVtw6lyaXF1ZXMgdnMgY2zDqXMgZGUgY2hhw65uZSlcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRQYXJ0ID0gcGFydHNbaSArIDFdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQW5hbHlzZXIgc2V1bGVtZW50IGxlcyBjbMOpcyAocGFzIGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzKVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAna2V5Jykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZVBhdGggPSBwYXJ0Lm5hbWU7IC8vIExlIG5vbSBkZSBsYSBwcmVtacOocmUgY2zDqSBkYW5zIGxlIGNoZW1pblxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbmFseXNpcyA9IGtleUFuYWx5c2lzLmdldChiYXNlUGF0aCkgPz8geyBoYXNOdW1lcmljOiBmYWxzZSwgaGFzU3RyaW5nOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKCFrZXlBbmFseXNpcy5oYXMoYmFzZVBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5QW5hbHlzaXMuc2V0KGJhc2VQYXRoLCBhbmFseXNpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0UGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0UGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHlzaXMuaGFzTnVtZXJpYyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0UGFydC50eXBlID09PSAna2V5JyB8fCBuZXh0UGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5c2lzLmhhc1N0cmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIETDqXRlY3RlIGV0IGzDqHZlIHVuZSBleGNlcHRpb24gcG91ciB0b3VzIGxlcyBjb25mbGl0cyBkZSBjaGVtaW5zXHJcbiAgICAgKiBcclxuICAgICAqIFByaW5jaXBlIHNpbXBsZSA6IHBvdXIgY2hhcXVlIGNoZW1pbiBmaW5hbCAodmFsZXVyIHByaW1pdGl2ZSksIHbDqXJpZmllciBzaSB1biBjaGVtaW5cclxuICAgICAqIGludGVybcOpZGlhaXJlIGNvbW1lbmNlIHBhciBjZSBjaGVtaW4gc3VpdmkgZGUgJ1snLiBTaSBjJ2VzdCBsZSBjYXMsIGMnZXN0IHVuIGNvbmZsaXQuXHJcbiAgICAgKiBcclxuICAgICAqIENldHRlIGFwcHJvY2hlIHVuaWZpw6llIGNvdXZyZSB0b3VzIGxlcyBjYXMgOlxyXG4gICAgICogLSBpdGVtc1tdIChmaW5hbCkgdnMgaXRlbXNbMF1bbmFtZV0gKGludGVybcOpZGlhaXJlKVxyXG4gICAgICogLSBhcnJheVszXSAoZmluYWwpIHZzIGFycmF5WzNdW25lc3RlZF0gKGludGVybcOpZGlhaXJlKVxyXG4gICAgICogLSBkYXRhW2tleV0gKGZpbmFsKSB2cyBkYXRhW2tleV1bc3ViXSAoaW50ZXJtw6lkaWFpcmUpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGRldGVjdFBhdGhDb25mbGljdHMgPSAoKSA9PiB7XHJcbiAgICAgICAgLy8gMS4gQ29sbGVjdGVyIHRvdXMgbGVzIGNoZW1pbnMgZmluYXV4ICh2YWxldXJzIHByaW1pdGl2ZXMpXHJcbiAgICAgICAgY29uc3QgZmluYWxQYXRocyA9IG5ldyBTZXQoKTtcclxuICAgICAgICBjb25zdCBmaW5hbFBhdGhLZXlzID0gbmV3IE1hcCgpOyAvLyBQb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1clxyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAoY29uc3QgW3BhdGgsIHVzYWdlXSBvZiBwYXRoVXNhZ2UuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgIGlmICh1c2FnZS5pc0ZpbmFsKSB7XHJcbiAgICAgICAgICAgICAgICBmaW5hbFBhdGhzLmFkZChwYXRoKTtcclxuICAgICAgICAgICAgICAgIGZpbmFsUGF0aEtleXMuc2V0KHBhdGgsIHVzYWdlLmtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMi4gUG91ciBjaGFxdWUgY2hlbWluIGludGVybcOpZGlhaXJlLCB2w6lyaWZpZXIgcydpbCBjb21tZW5jZSBwYXIgdW4gY2hlbWluIGZpbmFsXHJcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgdXNhZ2VdIG9mIHBhdGhVc2FnZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgaWYgKHVzYWdlLmlzSW50ZXJtZWRpYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbmFsUGF0aCBvZiBmaW5hbFBhdGhzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVsOpcmlmaWVyIHNpIGNlIGNoZW1pbiBpbnRlcm3DqWRpYWlyZSBjb21tZW5jZSBwYXIgdW4gY2hlbWluIGZpbmFsIHN1aXZpIGRlICdbJ1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4ZW1wbGU6IGZpbmFsUGF0aCA9IFwiYXJyYXlbM11cIiwgcGF0aCA9IFwiYXJyYXlbM11bbmVzdGVkXVwiIOKGkiBjb25mbGl0XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHtmaW5hbFBhdGh9W2ApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQYXRoIGNvbmZsaWN0OiBcIiR7ZmluYWxQYXRofVwiIGlzIHVzZWQgYXMgYSBmaW5hbCB2YWx1ZSAoaW4gZmllbGQgXCIke2ZpbmFsUGF0aEtleXMuZ2V0KGZpbmFsUGF0aCl9XCIpLCBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBidXQgXCIke3BhdGh9XCIgdHJpZXMgdG8gdXNlIGl0IGFzIGFuIGludGVybWVkaWF0ZSBwYXRoIChpbiBmaWVsZCBcIiR7dXNhZ2Uua2V5fVwiKS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBjcmVhdGVzIGluY29tcGF0aWJsZSBkYXRhIHN0cnVjdHVyZXMuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFlvdSBjYW5ub3QgdXNlIFwiJHtmaW5hbFBhdGh9XCIgYXMgYSBwcmltaXRpdmUgdmFsdWUgYW5kIHRoZW4gYWNjZXNzIGl0IGFzIGFuIG9iamVjdC5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gRXjDqWN1dGVyIGxhIGTDqXRlY3Rpb24gZGVzIGNvbmZsaXRzXHJcbiAgICBkZXRlY3RQYXRoQ29uZmxpY3RzKCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWw6lyaWZpZSBzaSB1biBjaGVtaW4gZGUgYmFzZSBhIHVuIGNvbmZsaXQgKGluZGljZXMgbnVtw6lyaXF1ZXMgRVQgY2zDqXMgZGUgY2hhw65uZSlcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCAtIExlIGNoZW1pbiBkZSBiYXNlIMOgIHbDqXJpZmllclxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGhhc0NvbmZsaWN0ID0gKGJhc2VQYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFiYXNlUGF0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGFuYWx5c2lzID0ga2V5QW5hbHlzaXMuZ2V0KGJhc2VQYXRoKTtcclxuICAgICAgICByZXR1cm4gYW5hbHlzaXM/Lmhhc051bWVyaWMgJiYgYW5hbHlzaXM/Lmhhc1N0cmluZztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcnVlIGlmIGluZGljZXMgYXJlIGV4YWN0bHkgMCwgMSwgMiwgLi4uLCBuIChkZW5zZSwgc2VxdWVudGlhbCBmcm9tIDApLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gaW5kaWNlcyAtIFNvcnRlZCBhcnJheSBvZiBpbmRpY2VzXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgY29uc3QgaXNEZW5zZVNlcXVlbnRpYWwgPSAoaW5kaWNlcykgPT4ge1xyXG4gICAgICAgIGlmIChpbmRpY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5pbmRpY2VzXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzb3J0ZWQubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgaWYgKHNvcnRlZFtqXSAhPT0gaikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcnVlIGlmIG51bWVyaWMga2V5cyB1bmRlciB0aGlzIHBhdGggc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXJyYXkgaW5kaWNlcy5cclxuICAgICAqIFdpdGggbnVtZXJpY0tleXNBbHdheXNBcnJheTogYWx3YXlzIHRydWUgd2hlbiBwYXRoIGhhcyBudW1lcmljIGNoaWxkcmVuLlxyXG4gICAgICogT3RoZXJ3aXNlOiB0cnVlIG9ubHkgd2hlbiBpbmRpY2VzIGFyZSBkZW5zZSAwLi5uLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudFBhdGggLSBQYXRoIHRvIHRoZSBjb250YWluZXIgdGhhdCBoYXMgbnVtZXJpYyBjaGlsZHJlblxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHVzZUFycmF5Rm9yTnVtZXJpY1BhdGggPSAocGFyZW50UGF0aCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNldCA9IG51bWVyaWNJbmRpY2VzQnlQYXRoLmdldChwYXJlbnRQYXRoKTtcclxuICAgICAgICBpZiAoIXNldCB8fCBzZXQuc2l6ZSA9PT0gMCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKG51bWVyaWNLZXlzQWx3YXlzQXJyYXkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBpc0RlbnNlU2VxdWVudGlhbChbLi4uc2V0XSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydGl0IHVuIHRhYmxlYXUgZW4gb2JqZXQgZW4gcHLDqXNlcnZhbnQgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXMgY29tbWUgcHJvcHJpw6l0w6lzXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgLSBMZSB0YWJsZWF1IMOgIGNvbnZlcnRpclxyXG4gICAgICogQHJldHVybnMge09iamVjdH0gTCdvYmpldCByw6lzdWx0YW50XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGFycmF5VG9PYmplY3QgPSAoYXJyKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0ge307XHJcbiAgICAgICAgLy8gQ29waWVyIGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzXHJcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgYXJyLmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgICAgICAgb2JqW2lkeF0gPSBhcnJbaWR4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ29waWVyIGxlcyBwcm9wcmnDqXTDqXMgbm9uLW51bcOpcmlxdWVzXHJcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYXJyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBudW1LZXkgPSBOdW1iZXIucGFyc2VJbnQoaywgMTApO1xyXG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG51bUtleSkgfHwgayAhPT0gU3RyaW5nKG51bUtleSkpIHtcclxuICAgICAgICAgICAgICAgIG9ialtrXSA9IHY7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0aXQgdW4gb2JqZXQgZW4gdGFibGVhdSBlbiBwcsOpc2VydmFudCBsZXMgaW5kaWNlcyBudW3DqXJpcXVlc1xyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIEwnb2JqZXQgw6AgY29udmVydGlyXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IExlIHRhYmxlYXUgcsOpc3VsdGFudFxyXG4gICAgICovXHJcbiAgICBjb25zdCBvYmplY3RUb0FycmF5ID0gKG9iaikgPT4ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmo7XHJcbiAgICAgICAgY29uc3QgYXJyID0gW107XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW1LZXkgPSBOdW1iZXIucGFyc2VJbnQoaywgMTApO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFycltudW1LZXldID0gdjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzc3VyZSBxdSd1biBjb250ZW5ldXIgZXN0IHVuIG9iamV0LCBlbiBjb252ZXJ0aXNzYW50IHNpIG7DqWNlc3NhaXJlXHJcbiAgICAgKiBAcGFyYW0geyp9IGNvbnRhaW5lciAtIExlIGNvbnRlbmV1ciDDoCB2w6lyaWZpZXJcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGtleSAtIExhIGNsw6kgZGFucyBsZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBwYXJlbnQgLSBMZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlT2JqZWN0IC0gRm9yY2VyIGxhIGNvbnZlcnNpb24gZW4gb2JqZXQgbcOqbWUgcydpbCBuJ3kgYSBwYXMgZGUgY29uZmxpdFxyXG4gICAgICogQHJldHVybnMge09iamVjdH0gTGUgY29udGVuZXVyIChjb252ZXJ0aSBlbiBvYmpldCBzaSBuw6ljZXNzYWlyZSlcclxuICAgICAqL1xyXG4gICAgY29uc3QgZW5zdXJlT2JqZWN0ID0gKGNvbnRhaW5lciwga2V5LCBwYXJlbnQsIGZvcmNlT2JqZWN0ID0gZmFsc2UpID0+IHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IGFycmF5VG9PYmplY3QoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBrZXkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFtrZXldID0gb2JqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgY29udGFpbmVyICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqID0ge307XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYga2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRba2V5XSA9IG9iajtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzc3VyZSBxdSd1biBjb250ZW5ldXIgZXN0IHVuIHRhYmxlYXUsIGVuIGNvbnZlcnRpc3NhbnQgc2kgbsOpY2Vzc2FpcmVcclxuICAgICAqIEBwYXJhbSB7Kn0gY29udGFpbmVyIC0gTGUgY29udGVuZXVyIMOgIHbDqXJpZmllclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0ga2V5IC0gTGEgY2zDqSBkYW5zIGxlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gTGUgY29udGVuZXVyIChjb252ZXJ0aSBlbiB0YWJsZWF1IHNpIG7DqWNlc3NhaXJlKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBlbnN1cmVBcnJheSA9IChjb250YWluZXIsIGtleSwgcGFyZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJyID0gb2JqZWN0VG9BcnJheShjb250YWluZXIpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIGtleSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50W2tleV0gPSBhcnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFycjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgIH07XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgLy8gUEhBU0UgMiA6IFRSQUlURU1FTlQgREVTIFZBTEVVUlNcclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFpdGUgdW5lIHZhbGV1ciBmaW5hbGUgKGRlcm5pw6hyZSBwYXJ0aWUgZHUgY2hlbWluKVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgYWN0dWVsXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFydCAtIExhIHBhcnRpZSDDoCB0cmFpdGVyXHJcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gTGEgdmFsZXVyIMOgIGFzc2lnbmVyXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50IC0gTGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIC0gTGUgY2hlbWluIGRlIGJhc2UgcG91ciBsYSBkw6l0ZWN0aW9uIGRlIGNvbmZsaXRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnRQYXRoIC0gQ2hlbWluIGR1IGNvbnRlbmV1ciBhY3R1ZWwgKHBvdXIgaGV1cmlzdGlxdWUgbnVtZXJpYylcclxuICAgICAqL1xyXG4gICAgY29uc3QgcHJvY2Vzc0ZpbmFsVmFsdWUgPSAoY29udGFpbmVyLCBwYXJ0LCB2YWx1ZSwgcGFyZW50LCBiYXNlUGF0aCwgcGFyZW50UGF0aCkgPT4ge1xyXG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgICAgICAgLy8gVGFibGVhdSBleHBsaWNpdGUgYXZlYyBbXVxyXG4gICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA/Pz0gW107XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0ucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICBjb25zdCB7IGluZGV4IH0gPSBwYXJ0O1xyXG4gICAgICAgICAgICBjb25zdCB1c2VBcnJheSA9IHVzZUFycmF5Rm9yTnVtZXJpY1BhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIGlmICh1c2VBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlQXJyYXkoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChjb250YWluZXIubGVuZ3RoIDw9IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnB1c2godW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQ2zDqSBzaW1wbGUgZmluYWxlXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZsaWN0ID0gaGFzQ29uZmxpY3QoYmFzZVBhdGgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGNvbmZsaWN0KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVPYmplY3QoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gYXJyYXlUb09iamVjdChjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gIT09IHVuZGVmaW5lZCAmJiBcclxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbcGFydC5uYW1lXSA9PT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXJbcGFydC5uYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBbY29udGFpbmVyW3BhcnQubmFtZV0sIHZhbHVlXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJbcGFydC5uYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBbY29udGFpbmVyW3BhcnQubmFtZV0sIHZhbHVlXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVHJhaXRlIHVuZSBwYXJ0aWUgaW50ZXJtw6lkaWFpcmUgKGNyw6llIGxhIHN0cnVjdHVyZSlcclxuICAgICAqIEBwYXJhbSB7Kn0gY29udGFpbmVyIC0gTGUgY29udGVuZXVyIGFjdHVlbFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcnQgLSBMYSBwYXJ0aWUgw6AgdHJhaXRlclxyXG4gICAgICogQHBhcmFtIHtPYmplY3R8bnVsbH0gbmV4dFBhcnQgLSBMYSBwYXJ0aWUgc3VpdmFudGUgKHBldXQgw6p0cmUgbnVsbClcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQgLSBMZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggLSBMZSBjaGVtaW4gZGUgYmFzZSBwb3VyIGxhIGTDqXRlY3Rpb24gZGUgY29uZmxpdFxyXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydHMgLSBUb3V0ZXMgbGVzIHBhcnRpZXMgZHUgY2hlbWluIChwb3VyIGNvbnN0cnVpcmUgbGUgY2hlbWluIGNvbXBsZXQgZGFucyBsZXMgZXJyZXVycylcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpIC0gTCdpbmRleCBkZSBsYSBwYXJ0aWUgYWN0dWVsbGUgKHBvdXIgY29uc3RydWlyZSBsZSBjaGVtaW4gY29tcGxldCBkYW5zIGxlcyBlcnJldXJzKVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIExhIGNsw6kgZHUgZm9ybXVsYWlyZSAocG91ciBsZXMgbWVzc2FnZXMgZCdlcnJldXIpXHJcbiAgICAgKiBAcmV0dXJucyB7Kn0gTGUgbm91dmVhdSBjb250ZW5ldXIgYXByw6hzIHRyYWl0ZW1lbnRcclxuICAgICAqL1xyXG4gICAgY29uc3QgcHJvY2Vzc0ludGVybWVkaWF0ZVBhcnQgPSAoY29udGFpbmVyLCBwYXJ0LCBuZXh0UGFydCwgcGFyZW50LCBiYXNlUGF0aCwgcGFydHMsIGksIGtleSkgPT4ge1xyXG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICBjb25zdCB7IGluZGV4IH0gPSBwYXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhcnRzLnNsaWNlKDAsIGkpKTtcclxuICAgICAgICAgICAgY29uc3QgdXNlQXJyYXkgPSB1c2VBcnJheUZvck51bWVyaWNQYXRoKHBhcmVudFBhdGgpICYmICFoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoIXVzZUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVPYmplY3QoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPz89IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXJbaW5kZXhdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbaW5kZXhdID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhdGhQYXJ0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBvbiBwcmltaXRpdmUgdmFsdWUuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgS2V5IFwiJHtrZXl9XCIgdHJpZXMgdG8gYWNjZXNzIFwiJHtjdXJyZW50UGF0aH1cIiBidXQgaXQgaXMgYWxyZWFkeSBhICR7dHlwZW9mIGNvbnRhaW5lcltpbmRleF19IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGNvbnRhaW5lcltpbmRleF0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgZHVyaW5nIGNvbmZsaWN0IGRldGVjdGlvbiBwaGFzZS5gXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZUFycmF5KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY29udGFpbmVyLmxlbmd0aCA8PSBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5wdXNoKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbaW5kZXhdID8/PSB7fTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGFpbmVyW2luZGV4XSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW2luZGV4XSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbaW5kZXhdfSB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeShjb250YWluZXJbaW5kZXhdKX0uIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcltpbmRleF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENsw6kgbm9ybWFsZSA6IGNyw6llciBvYmpldCBvdSB0YWJsZWF1IHNlbG9uIGxhIHBhcnRpZSBzdWl2YW50ZVxyXG4gICAgICAgIGNvbnN0IG5leHRJc051bWVyaWMgPSBuZXh0UGFydD8udHlwZSA9PT0gJ251bWVyaWMnO1xyXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0ID0gaGFzQ29uZmxpY3QoYmFzZVBhdGgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChjb25mbGljdCkge1xyXG4gICAgICAgICAgICAvLyBDb25mbGl0IDogdG91am91cnMgdXRpbGlzZXIgdW4gb2JqZXRcclxuICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlT2JqZWN0KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID8/PSB7fTtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IGFycmF5VG9PYmplY3QoY29udGFpbmVyW3BhcnQubmFtZV0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW3BhcnQubmFtZV0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIENldHRlIGVycmV1ciBuZSBkZXZyYWl0IGphbWFpcyBzZSBwcm9kdWlyZSBzaSBsYSBkw6l0ZWN0aW9uIGZvbmN0aW9ubmUgY29ycmVjdGVtZW50XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJ0cy5zbGljZSgwLCBpICsgMSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IG9uIHByaW1pdGl2ZSB2YWx1ZS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW3BhcnQubmFtZV0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gUGFzIGRlIGNvbmZsaXQsIGNyw6llciBzZWxvbiBsYSBwYXJ0aWUgc3VpdmFudGVcclxuICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBuZXh0SXNOdW1lcmljID8gW10gOiB7fTtcclxuICAgICAgICB9IGVsc2UgaWYgKG5leHRJc051bWVyaWMgJiYgIUFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgIC8vIE9uIGEgYmVzb2luIGQndW4gdGFibGVhdSBtYWlzIGMnZXN0IHVuIG9iamV0XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc1N0cmluZ0tleXMgPSBPYmplY3Qua2V5cyhjb250YWluZXJbcGFydC5uYW1lXSkuc29tZShrID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG51bUtleSkgfHwgayAhPT0gU3RyaW5nKG51bUtleSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIWhhc1N0cmluZ0tleXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gb2JqZWN0VG9BcnJheShjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKCFuZXh0SXNOdW1lcmljICYmICFpc1BsYWluT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAvLyBPbiBhIGJlc29pbiBkJ3VuIG9iamV0IG1haXMgYydlc3QgdW4gdGFibGVhdVxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gYXJyYXlUb09iamVjdChjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFMnYXNzdXJlciBxdWUgY29udGFpbmVyW3BhcnQubmFtZV0gZXN0IGJpZW4gdW4gb2JqZXQgYXByw6hzIHRvdXRlcyBsZXMgY29udmVyc2lvbnNcclxuICAgICAgICBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gIT09IHVuZGVmaW5lZCAmJiBcclxuICAgICAgICAgICAgKHR5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW3BhcnQubmFtZV0gPT09IG51bGwpKSB7XHJcbiAgICAgICAgICAgIC8vIENldHRlIGVycmV1ciBuZSBkZXZyYWl0IGphbWFpcyBzZSBwcm9kdWlyZSBzaSBsYSBkw6l0ZWN0aW9uIGZvbmN0aW9ubmUgY29ycmVjdGVtZW50XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGF0aFBhcnRzKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgIGBLZXkgXCIke2tleX1cIiB0cmllcyB0byBhY2Nlc3MgXCIke2N1cnJlbnRQYXRofVwiIGJ1dCBpdCBpcyBhbHJlYWR5IGEgJHt0eXBlb2YgY29udGFpbmVyW3BhcnQubmFtZV19IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKX0uIGAgK1xyXG4gICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcltwYXJ0Lm5hbWVdO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gVHJhaXRlciB0b3V0ZXMgbGVzIGVudHLDqWVzXHJcbiAgICBmb3IgKGNvbnN0IHsgdmFsdWUsIGtleSB9IG9mIGFsbEVudHJpZXMpIHtcclxuICAgICAgICBpZiAoIWtleSkgY29udGludWU7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGFyc2VLZXkoa2V5KTtcclxuICAgICAgICBjb25zdCBwYXRoID0gW3sgY29udGFpbmVyOiBqc29uRGF0YSwga2V5OiBudWxsIH1dO1xyXG4gICAgICAgIGxldCBjb250YWluZXIgPSBqc29uRGF0YTtcclxuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHBhcnRzWzBdPy50eXBlID09PSAna2V5JyA/IHBhcnRzWzBdLm5hbWUgOiAnJztcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IHBhcnRzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRQYXJ0ID0gaSArIDEgPCBwYXJ0cy5sZW5ndGggPyBwYXJ0c1tpICsgMV0gOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNMYXN0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhcnRzLnNsaWNlKDAsIGkpKTtcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NGaW5hbFZhbHVlKGNvbnRhaW5lciwgcGFydCwgdmFsdWUsIHBhcmVudCwgYmFzZVBhdGgsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUGFydGllIGludGVybcOpZGlhaXJlIDogY3LDqWVyIGxhIHN0cnVjdHVyZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29udGFpbmVyID0gcHJvY2Vzc0ludGVybWVkaWF0ZVBhcnQoY29udGFpbmVyLCBwYXJ0LCBuZXh0UGFydCwgcGFyZW50LCBiYXNlUGF0aCwgcGFydHMsIGksIGtleSk7XHJcbiAgICAgICAgICAgICAgICBwYXRoLnB1c2goeyBjb250YWluZXIsIGtleTogcGFydC50eXBlID09PSAnbnVtZXJpYycgPyBwYXJ0LmluZGV4IDogcGFydC5uYW1lIH0pO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gbmV3Q29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBqc29uRGF0YTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBQYXJzZSB1bmUgY2zDqSBkZSBmb3JtdWxhaXJlIHBvdXIgZXh0cmFpcmUgbGVzIHBhcnRpZXMgKG5vbSwgaW5kaWNlcywgZXRjLilcclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIExhIGNsw6kgw6AgcGFyc2VyIChleDogXCJ1c2VyW2VtYWlsXVwiLCBcInRhZ3NbXVwiLCBcIml0ZW1zWzBdW25hbWVdXCIpXHJcbiAqIEByZXR1cm5zIHtBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGluZGV4PzogbnVtYmVyfT59IFRhYmxlYXUgZGVzIHBhcnRpZXMgcGFyc8OpZXNcclxuICogQHByaXZhdGVcclxuICovXHJcbmNvbnN0IHBhcnNlS2V5ID0gKGtleSkgPT4ge1xyXG4gICAgY29uc3QgcGFydHMgPSBbXTtcclxuICAgIGxldCBjdXJyZW50ID0gJyc7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBjb25zdCBsZW4gPSBrZXkubGVuZ3RoO1xyXG5cclxuICAgIHdoaWxlIChpIDwgbGVuKSB7XHJcbiAgICAgICAgY29uc3QgY2hhciA9IGtleVtpXTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoY2hhciA9PT0gJ1snKSB7XHJcbiAgICAgICAgICAgIC8vIFNhdXZlZ2FyZGVyIGxhIHBhcnRpZSBwcsOpY8OpZGVudGUgc2kgZWxsZSBleGlzdGVcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiBjdXJyZW50LCB0eXBlOiAna2V5JyB9KTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVHJvdXZlciBsYSBmaW4gZHUgY3JvY2hldFxyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIGxldCBicmFja2V0Q29udGVudCA9ICcnO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBrZXlbaV0gIT09ICddJykge1xyXG4gICAgICAgICAgICAgICAgYnJhY2tldENvbnRlbnQgKz0ga2V5W2ldO1xyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoYnJhY2tldENvbnRlbnQgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBbXSB2aWRlID0gdGFibGVhdVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgIGlmIChsYXN0UGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RQYXJ0LnR5cGUgPSAnYXJyYXknO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBbXSBhdSBkw6lidXQsIGNyw6llciB1bmUgcGFydGllIHNww6ljaWFsZVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiAnJywgdHlwZTogJ2FycmF5JyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnRlbnUgZGFucyBsZXMgY3JvY2hldHNcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bUluZGV4ID0gTnVtYmVyLnBhcnNlSW50KGJyYWNrZXRDb250ZW50LCAxMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW1JbmRleCkgJiYgYnJhY2tldENvbnRlbnQgPT09IFN0cmluZyhudW1JbmRleCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJbmRpY2UgbnVtw6lyaXF1ZVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiBTdHJpbmcobnVtSW5kZXgpLCB0eXBlOiAnbnVtZXJpYycsIGluZGV4OiBudW1JbmRleCB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTm9tIGRlIHByb3ByacOpdMOpXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IGJyYWNrZXRDb250ZW50LCB0eXBlOiAna2V5JyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpKys7IC8vIFBhc3NlciBsZSAnXSdcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJyZW50ICs9IGNoYXI7XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEFqb3V0ZXIgbGEgZGVybmnDqHJlIHBhcnRpZSBzaSBlbGxlIGV4aXN0ZVxyXG4gICAgaWYgKGN1cnJlbnQpIHtcclxuICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogY3VycmVudCwgdHlwZTogJ2tleScgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBwYXJ0cztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBWw6lyaWZpZSBzaSB1bmUgdmFsZXVyIGVzdCB1biBvYmpldCBzaW1wbGUgKHBhcyB1biB0YWJsZWF1LCBwYXMgbnVsbClcclxuICogQHBhcmFtIHsqfSBvYmogLSBMYSB2YWxldXIgw6AgdsOpcmlmaWVyXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY29uc3QgaXNQbGFpbk9iamVjdCA9IChvYmopID0+IHtcclxuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkob2JqKTtcclxufTtcclxuIiwiaW1wb3J0ICcuL2Nzcy90cmlzdGF0ZS5jc3MnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSB0cmktc3RhdGUgY2hlY2tib3ggZm9yIGVhY2ggY2hlY2tib3ggZWxlbWVudCBpbiB0aGUgYXB4LmVsZW1lbnRzIGFycmF5LlxuICogQHBhcmFtIHtBcnJheTxIVE1MRWxlbWVudD59IGFweCAtIEFuIGFycmF5IG9mIEhUTUxFbGVtZW50cyB3aGljaCBpcyByZXR1cm5lZCBieSBBUFgoKVxuICogQGV4YW1wbGVcbiAqIC8vIENhbGwgdGhlIHRyaXN0YXRlIGZ1bmN0aW9uIG9uIGFuIGFycmF5IG9mIGNoZWNrYm94IGVsZW1lbnRzXG4gKiBhcHgudHJpc3RhdGUoKTtcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xuICAgIGFweC50cmlzdGF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zID0ge30pe1xuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtvcmlnaW5hbENoZWNrYm94LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXRdID0gY3JlYXRlVHJpU3RhdGVDaGVja2JveChlbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbENoZWNrYm94Ll9hcHhUcmlzdGF0ZSA9IHsgZG9tOiB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQgfTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jYWxsYmFja3MgJiYgb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIgJiYgdHlwZW9mIG9wdGlvbnMuY2FsbGJhY2tzLmFmdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmFmdGVyKG9yaWdpbmFsQ2hlY2tib3gsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNldENoaWxkcmVuKGNoaWxkcmVuQXB4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldENoaWxkcmVuKGFweCwgY2hpbGRyZW5BcHgsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG59XG5cbi8qKlxuICogTGluayBwYXJlbnQgdHJpc3RhdGUocykgdG8gY2hpbGQgY2hlY2tib3hlcy4gV2hlbiBleGFjdGx5IG9uZSBwYXJlbnQ6IHRoYXQgcGFyZW50IGdldHNcbiAqIGluZGV0ZXJtaW5hdGUtZGFzaCBhdXRvbWF0aWNhbGx5IGFuZCBzaG93cyBkYXNoIHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkOyBjbGljayBwYXJlbnQgdG8gYXBwbHkgaXRzIHN0YXRlIHRvIGFsbCBjaGlsZHJlbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnRBcHggLSBBUFggaW5zdGFuY2Ugd2hvc2UgZWxlbWVudHMgYXJlIHRoZSBwYXJlbnQgY2hlY2tib3goZXMpXG4gKiBAcGFyYW0ge09iamVjdH0gY2hpbGRyZW5BcHggLSBBUFggaW5zdGFuY2Ugd2hvc2UgZWxlbWVudHMgYXJlIHRoZSBjaGlsZCBjaGVja2JveChlcylcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucyB1c2VkIGZvciB0aGUgcGFyZW50IChhbmQgYXBwbGllZCB0byBjaGlsZHJlbiB3aGVuIGluaXRpYWxpemluZyB0aGVtKVxuICovXG5mdW5jdGlvbiBzZXRDaGlsZHJlbihwYXJlbnRBcHgsIGNoaWxkcmVuQXB4LCBvcHRpb25zKSB7XG4gICAgY29uc3QgcGFyZW50cyA9IHBhcmVudEFweC5hbGwoKS5maWx0ZXIoKGVsKSA9PiBlbC50eXBlID09PSAnY2hlY2tib3gnKTtcbiAgICBpZiAocGFyZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBpZiAocGFyZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQVBYIHRyaXN0YXRlIHNldENoaWxkcmVuOiBvbmx5IHRoZSBmaXJzdCBwYXJlbnQgaXMgbGlua2VkIHRvIGFsbCBjaGlsZHJlbi4nKTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50Q2hlY2tib3ggPSBwYXJlbnRzWzBdO1xuICAgIGNvbnN0IHBhcmVudFJlZiA9IHBhcmVudENoZWNrYm94Ll9hcHhUcmlzdGF0ZTtcbiAgICBpZiAoIXBhcmVudFJlZikgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyZW50RG9tID0gcGFyZW50UmVmLmRvbTtcbiAgICBjb25zdCBwYXJlbnRIaWRkZW5JbnB1dCA9IHBhcmVudFJlZi5oaWRkZW5JbnB1dDtcblxuICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIGluZGV0ZXJtaW5hdGUgKGRhc2gpIG9uIHBhcmVudCB3aGVuIGl0IGhhcyBjaGlsZHJlbjogZGFzaCBzaG93cyBvbmx5IHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkICgtLW1peGVkKVxuICAgIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUtLXVuY2hlY2tlZC1pbmRldGVybWluYXRlJywgJ2FweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoJyk7XG5cbiAgICBjb25zdCBjaGlsZENoZWNrYm94ZXMgPSBjaGlsZHJlbkFweC5hbGwoKS5maWx0ZXIoKGVsKSA9PiBlbC50eXBlID09PSAnY2hlY2tib3gnKTtcbiAgICBjb25zdCBjaGlsZFJlZnMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIHN5bmNQYXJlbnRGcm9tQ2hpbGRyZW4oKSB7XG4gICAgICAgIGlmIChjaGlsZFJlZnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHN0YXRlcyA9IGNoaWxkUmVmcy5tYXAoKHJlZikgPT4gZ2V0VHJpc3RhdGVTdGF0ZShyZWYuZG9tKSk7XG4gICAgICAgIGNvbnN0IGFsbENoZWNrZWQgPSBzdGF0ZXMuZXZlcnkoKHMpID0+IHMgPT09ICdjaGVja2VkJyk7XG4gICAgICAgIGNvbnN0IGFsbENyb3NzZWQgPSBzdGF0ZXMuZXZlcnkoKHMpID0+IHMgPT09ICdjcm9zc2VkJyk7XG4gICAgICAgIGNvbnN0IGFsbFVuY2hlY2tlZCA9IHN0YXRlcy5ldmVyeSgocykgPT4gcyA9PT0gJ3VuY2hlY2tlZCcpO1xuICAgICAgICBjb25zdCBtaXhlZCA9ICFhbGxDaGVja2VkICYmICFhbGxDcm9zc2VkICYmICFhbGxVbmNoZWNrZWQ7XG5cbiAgICAgICAgcGFyZW50RG9tLmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcsICdjaGVja2VkJywgJ2Nyb3NzZWQnKTtcbiAgICAgICAgaWYgKG1peGVkKSBwYXJlbnREb20uY2xhc3NMaXN0LmFkZCgnYXB4LXRyaXN0YXRlLS1taXhlZCcpO1xuICAgICAgICBlbHNlIHBhcmVudERvbS5jbGFzc0xpc3QucmVtb3ZlKCdhcHgtdHJpc3RhdGUtLW1peGVkJyk7XG5cbiAgICAgICAgaWYgKGFsbENoZWNrZWQpIHtcbiAgICAgICAgICAgIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgfSBlbHNlIGlmIChhbGxDcm9zc2VkKSB7XG4gICAgICAgICAgICBwYXJlbnREb20uY2xhc3NMaXN0LmFkZCgnY3Jvc3NlZCcpO1xuICAgICAgICAgICAgcGFyZW50SGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50RG9tLmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xuICAgICAgICAgICAgcGFyZW50SGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseVBhcmVudFRvQ2hpbGRyZW4oKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFN0YXRlID0gZ2V0VHJpc3RhdGVTdGF0ZShwYXJlbnREb20pO1xuICAgICAgICBjaGlsZFJlZnMuZm9yRWFjaCgocmVmKSA9PiBzZXRUcmlzdGF0ZVN0YXRlKHJlZi5jaGVja2JveCwgcmVmLmRvbSwgcmVmLmhpZGRlbklucHV0LCBwYXJlbnRTdGF0ZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgY2FsbGJhY2tzOiB7XG4gICAgICAgICAgICBhZnRlcihjaGVja2JveCwgZG9tLCBoaWRkZW5JbnB1dCkge1xuICAgICAgICAgICAgICAgIGNoaWxkUmVmcy5wdXNoKHsgY2hlY2tib3gsIGRvbSwgaGlkZGVuSW5wdXQgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hhbmdlOiBzeW5jUGFyZW50RnJvbUNoaWxkcmVuXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY2hpbGRyZW5BcHgudHJpc3RhdGUoY2hpbGRPcHRpb25zKTtcblxuICAgIHN5bmNQYXJlbnRGcm9tQ2hpbGRyZW4oKTtcbiAgICBwYXJlbnREb20uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRUaW1lb3V0KGFwcGx5UGFyZW50VG9DaGlsZHJlbiwgMCkpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmlzdGF0ZVN0YXRlKGRvbSkge1xuICAgIGlmIChkb20uY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2VkJykpIHJldHVybiAnY2hlY2tlZCc7XG4gICAgaWYgKGRvbS5jbGFzc0xpc3QuY29udGFpbnMoJ2Nyb3NzZWQnKSkgcmV0dXJuICdjcm9zc2VkJztcbiAgICByZXR1cm4gJ3VuY2hlY2tlZCc7XG59XG5cbmZ1bmN0aW9uIHNldFRyaXN0YXRlU3RhdGUoY2hlY2tib3gsIGRvbSwgaGlkZGVuSW5wdXQsIHN0YXRlKSB7XG4gICAgZG9tLmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcsICdjaGVja2VkJywgJ2Nyb3NzZWQnKTtcbiAgICBkb20uY2xhc3NMaXN0LmFkZChzdGF0ZSk7XG4gICAgY29uc3QgbmFtZSA9IGNoZWNrYm94LmRhdGFzZXQubmFtZSB8fCBjaGVja2JveC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmFtZScpIHx8IGNoZWNrYm94Lm5hbWUgfHwgJyc7XG4gICAgaWYgKHN0YXRlID09PSAnY2hlY2tlZCcpIHtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XG4gICAgICAgIGlmIChuYW1lKSBoaWRkZW5JbnB1dC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBuYW1lKTtcbiAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gJ2Nyb3NzZWQnKSB7XG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ2ZhbHNlJztcbiAgICAgICAgaWYgKG5hbWUpIGhpZGRlbklucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUpO1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7XG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdG9nZ2xlVHJpU3RhdGVDaGVja2JveFN0YXRlKGN1c3RvbUNoZWNrYm94LCBhY3R1YWxDaGVja2JveCwgaGlkZGVuSW5wdXQpIHtcbiAgICBjb25zdCB3YXNDaGVja2VkID0gY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2VkJyk7XG4gICAgY29uc3Qgd2FzQ3Jvc3NlZCA9IGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5jb250YWlucygnY3Jvc3NlZCcpO1xuICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcsICdjaGVja2VkJywgJ2Nyb3NzZWQnKTtcbiAgICBpZiAod2FzQ2hlY2tlZCkge1xuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCdjcm9zc2VkJyk7XG4gICAgICAgIGFjdHVhbENoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgIH0gZWxzZSBpZiAod2FzQ3Jvc3NlZCkge1xuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpO1xuICAgICAgICBhY3R1YWxDaGVja2JveC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XG4gICAgICAgIGhpZGRlbklucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIGFjdHVhbENoZWNrYm94LmRhdGFzZXQubmFtZSk7IC8vIFJlc3RvcmUgdGhlIG5hbWUgZm9yIHBvc3RpbmdcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRyaVN0YXRlQ2hlY2tib3goY2hlY2tib3hFbGVtZW50LCBvcHRpb25zKSB7XG4gICAgXG4gICAgLy9nZXQgdGhlIGNoZWNrYm94IG1hcmdpbnMgaW5jbHVkaW5nIGJyb3dzZXIgZGVmYXVsdFxuICAgIGNvbnN0IGNoZWNrYm94U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjaGVja2JveEVsZW1lbnQpO1xuICAgIC8vIEhpZGUgdGhlIG9yaWdpbmFsIGNoZWNrYm94XG4gICAgY2hlY2tib3hFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGN1c3RvbSBjaGVja2JveCBkaXYgYW5kIHNldCBpdHMgaW5pdGlhbCBzdGF0ZVxuICAgIGNvbnN0IHRyaXN0YXRlRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnYXB4LXRyaXN0YXRlJyk7XG4gICAgaWYgKG9wdGlvbnMuc2l6ZSkge1xuICAgICAgICBpZiAob3B0aW9ucy5zaXplLndpZHRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHcgPSBvcHRpb25zLnNpemUud2lkdGg7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHcgIT09ICdudW1iZXInICYmIHR5cGVvZiB3ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RyaXN0YXRlIHNpemUud2lkdGggbXVzdCBiZSBhIG51bWJlciAocHgpIG9yIGEgc3RyaW5nIChDU1MgbGVuZ3RoKS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyaXN0YXRlRG9tLnN0eWxlLndpZHRoID0gdHlwZW9mIHcgPT09ICdudW1iZXInID8gdyArICdweCcgOiBTdHJpbmcodyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuc2l6ZS5oZWlnaHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaCA9IG9wdGlvbnMuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGggIT09ICdudW1iZXInICYmIHR5cGVvZiBoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RyaXN0YXRlIHNpemUuaGVpZ2h0IG11c3QgYmUgYSBudW1iZXIgKHB4KSBvciBhIHN0cmluZyAoQ1NTIGxlbmd0aCkuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmlzdGF0ZURvbS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgaCA9PT0gJ251bWJlcicgPyBoICsgJ3B4JyA6IFN0cmluZyhoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZihvcHRpb25zLmNsYXNzZXMpIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoLi4uY29tcHV0ZUNsYXNzZXMob3B0aW9ucy5jbGFzc2VzKSk7XG4gICAgY29uc3QgY29sb3JzID0gcmVzb2x2ZUNvbG9ycyhvcHRpb25zKTtcbiAgICBpZiAoY29sb3JzLnRpY2sgIT0gbnVsbCkgdHJpc3RhdGVEb20uc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXRyaXN0YXRlLXRpY2stY29sb3InLCBTdHJpbmcoY29sb3JzLnRpY2spKTtcbiAgICBpZiAoY29sb3JzLmNoZWNrZWQgIT0gbnVsbCkgdHJpc3RhdGVEb20uc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3InLCBTdHJpbmcoY29sb3JzLmNoZWNrZWQpKTtcbiAgICBpZiAoY29sb3JzLmNyb3NzZWQgIT0gbnVsbCkgdHJpc3RhdGVEb20uc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3InLCBTdHJpbmcoY29sb3JzLmNyb3NzZWQpKTtcblxuICAgIHRyaXN0YXRlRG9tLnN0eWxlLm1hcmdpbiA9IGNoZWNrYm94U3R5bGUubWFyZ2luO1xuXG4gICAgaWYgKGNoZWNrYm94RWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGhpZGRlbiBpbnB1dCBmaWVsZFxuICAgIGNvbnN0IGhpZGRlbklucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBoaWRkZW5JbnB1dC50eXBlID0gJ2hpZGRlbic7XG4gICAgaGlkZGVuSW5wdXQubmFtZSA9IGNoZWNrYm94RWxlbWVudC5uYW1lOyAvLyBDb3B5IHRoZSBuYW1lIGZyb20gdGhlIG9yaWdpbmFsIGNoZWNrYm94XG4gICAgY2hlY2tib3hFbGVtZW50LmRhdGFzZXQubmFtZSA9IGNoZWNrYm94RWxlbWVudC5uYW1lOyAvLyBTdG9yZSB0aGUgbmFtZSBpbiBhIGRhdGEgYXR0cmlidXRlIGZvciBsYXRlciB1c2VcbiAgICBjaGVja2JveEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIFJlbW92ZSB0aGUgbmFtZSBmcm9tIHRoZSBvcmlnaW5hbCBjaGVja2JveCB0byBhdm9pZCBkb3VibGUgcG9zdGluZ1xuXG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlKSBzZXREZWZhdWx0U3RhdGUob3B0aW9ucywgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KTtcbiAgICBlbHNle1xuICAgICAgICAvLyBTZXQgdGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBoaWRkZW4gaW5wdXQgYmFzZWQgb24gdGhlIGNoZWNrYm94J3Mgc3RhdGVcbiAgICAgICAgaWYgKGNoZWNrYm94RWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhpZGRlbklucHV0Lm5hbWUgPSAnJzsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxuICAgICAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vaGFuZGxlIGFjY2Vzc2liaWxpdHksIHNldCB0aGUgdGFiaW5kZXggdG8gdGhlIHNhbWUgYXMgdGhlIGNoZWNrYm94XG4gICAgdHJpc3RhdGVEb20udGFiSW5kZXggPSBjaGVja2JveEVsZW1lbnQudGFiSW5kZXg7XG5cbiAgICAvLyBJbnNlcnQgdGhlIGhpZGRlbiBpbnB1dCBpbnNpZGUgdGhlIGN1c3RvbSBjaGVja2JveCBkaXZcbiAgICB0cmlzdGF0ZURvbS5hcHBlbmRDaGlsZChoaWRkZW5JbnB1dCk7XG5cbiAgICAvLyBJbnNlcnQgaXQgbmV4dCB0byB0aGUgYWN0dWFsIGNoZWNrYm94XG4gICAgY2hlY2tib3hFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRyaXN0YXRlRG9tLCBjaGVja2JveEVsZW1lbnQubmV4dFNpYmxpbmcpO1xuXG4gICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyXG4gICAgdHJpc3RhdGVEb20uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0b2dnbGVUcmlTdGF0ZUNoZWNrYm94U3RhdGUodHJpc3RhdGVEb20sIGNoZWNrYm94RWxlbWVudCwgaGlkZGVuSW5wdXQpO1xuICAgICAgICBidWJibGVFdmVudHNUb09yaWdpbmFsQ2hlY2tib3gob3B0aW9ucywgY2hlY2tib3hFbGVtZW50LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQsIGUpO1xuICAgIH0pO1xuICAgIHRyaXN0YXRlRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgb25rZXl1cC5iaW5kKG51bGwsIGNoZWNrYm94RWxlbWVudCkpO1xuXG4gICAgcmV0dXJuIFtjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dF07XG59XG5cbmZ1bmN0aW9uIHNldERlZmF1bHRTdGF0ZShvcHRpb25zLCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpIHtcbiAgICAvLyBFbnN1cmUgb25seSBvbmUgc3RhdGUgY2xhc3MgaXMgc2V0ICh1bmNoZWNrZWRBcHBlYXJhbmNlIG1vZGlmaWVycyBtdXN0IG5vdCBhZmZlY3QgY2hlY2tlZC9jcm9zc2VkKVxuICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcsICdjaGVja2VkJywgJ2Nyb3NzZWQnKTtcbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0U3RhdGUgPT09ICdjaGVja2VkJykge1xuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ3VuY2hlY2tlZCcpIHtcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgnbmFtZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ2Nyb3NzZWQnKSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2Nyb3NzZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUNsYXNzZXMoY2xhc3Nlcykge1xuICAgIGxldCBjb21wdXRlZENsYXNzZXMgPSBbXTtcbiAgICBpZih0eXBlb2YgY2xhc3NlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy9yZXBsYWNlIG11bHRpcGxlIHdoaXRlIHNwYWNlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLnJlcGxhY2UoL1xcc1xccysvZywgJyAnKTtcbiAgICAgICAgaWYoY2xhc3Nlcy5pbmRleE9mKCcgJykgPiAtMSlcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICAgICAgZWxzZSBpZihjbGFzc2VzLmluZGV4T2YoJywnKSA+IC0xKVxuICAgICAgICAgICAgY29tcHV0ZWRDbGFzc2VzID0gY2xhc3Nlcy5zcGxpdCgnLCcpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBbY2xhc3Nlc107XG4gICAgfVxuICAgIGVsc2UgaWYoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBjbGFzc2VzO1xuICAgIH1cbiAgICByZXR1cm4gY29tcHV0ZWRDbGFzc2VzO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQ29sb3JzKG9wdGlvbnMpIHtcbiAgICBjb25zdCBjID0gb3B0aW9ucy5jb2xvcnMgfHwge307XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGljazogYy50aWNrICE9IG51bGwgPyBjLnRpY2sgOiBvcHRpb25zLnRpY2tDb2xvcixcbiAgICAgICAgY2hlY2tlZDogYy5jaGVja2VkICE9IG51bGwgPyBjLmNoZWNrZWQgOiBvcHRpb25zLmNoZWNrZWRDb2xvcixcbiAgICAgICAgY3Jvc3NlZDogYy5jcm9zc2VkICE9IG51bGwgPyBjLmNyb3NzZWQgOiBvcHRpb25zLmNyb3NzZWRDb2xvclxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChvcHRpb25zLCBjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCwgZXZlbnQpIHtcbiAgICAvL2lmIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSBpcyBzZXQsIGNhbGwgaXRcbiAgICBpZihvcHRpb25zLmNhbGxiYWNrcyAmJiBvcHRpb25zLmNhbGxiYWNrcy5jaGFuZ2UgJiYgdHlwZW9mIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvcHRpb25zLmNhbGxiYWNrcy5jaGFuZ2UoY2hlY2tib3hFbGVtZW50LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpO1xuICAgIH1cblxuICAgIGlmKCFvcHRpb25zLmJ1YmJsZUV2ZW50cykgcmV0dXJuO1xuXG4gICAgaWYoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xuICAgIH1cbiAgICBlbHNlIGlmKGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgICAgY2hlY2tib3hFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoJ2tleXVwJywgeyBrZXk6ICcgJywgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGVsc2UgaWYoZXZlbnQudHlwZSA9PT0gJ2NoYW5nZScpIHtcbiAgICAgICAgY2hlY2tib3hFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gb25rZXl1cChjaGVja2JveEVsZW1lbnQsIGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDMyKSB7XG4gICAgICAgIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChjaGVja2JveEVsZW1lbnQsIGV2ZW50KTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsaWNrKCk7XG4gICAgfVxufSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5iID0gZG9jdW1lbnQuYmFzZVVSSSB8fCBzZWxmLmxvY2F0aW9uLmhyZWY7XG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4vLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbi8vIFtyZXNvbHZlLCByZWplY3QsIFByb21pc2VdID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJtYWluXCI6IDBcbn07XG5cbi8vIG5vIGNodW5rIG9uIGRlbWFuZCBsb2FkaW5nXG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbi8vIG5vIG9uIGNodW5rcyBsb2FkZWRcblxuLy8gbm8ganNvbnAgZnVuY3Rpb24iLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsImltcG9ydCBhdWdtZW50V2l0aExpc3RlbiBmcm9tICcuL21vZHVsZXMvbGlzdGVuL2xpc3Rlbi5tanMnO1xuaW1wb3J0IGF1Z21lbnRXaXRoVHJpc3RhdGUgZnJvbSAnLi9tb2R1bGVzL3RyaXN0YXRlL3RyaXN0YXRlLm1qcyc7XG5pbXBvcnQgYXVnbWVudFdpdGhTY3JvbGxhYmxlVGFibGUgZnJvbSAnLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9zY3JvbGxhYmxlVGFibGUubWpzJztcbmltcG9ydCBkaWFsb2cgZnJvbSAnLi9tb2R1bGVzL2RpYWxvZy9kaWFsb2cubWpzJztcbmltcG9ydCB0b2FzdCBmcm9tICcuL21vZHVsZXMvdG9hc3QvdG9hc3QubWpzJztcbmltcG9ydCB7IGxvYWRDc3MgfSBmcm9tICcuL21vZHVsZXMvY29tbW9uLm1qcyc7XG5pbXBvcnQgeyBhdWdtZW50V2l0aFBhY2ssIHRvb2xzIH0gZnJvbSAnLi9tb2R1bGVzL3Rvb2xzL2V4cG9ydHMubWpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIEFQWCBvYmplY3QgdGhhdCB3cmFwcyBvbmUgb3IgbW9yZSBIVE1MIGVsZW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R8SFRNTENvbGxlY3Rpb258QXJyYXk8SFRNTEVsZW1lbnQ+fGpRdWVyeXxGdW5jdGlvbn0gaW5wdXQgLSBUaGUgaW5wdXQgdG8gY3JlYXRlIHRoZSBBUFggb2JqZWN0IGZyb20uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgQVBYIG9iamVjdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgaW5wdXQgdHlwZSBpcyBpbnZhbGlkLlxuICogQGV4YW1wbGVcbiAqIC8vIFhQYXRoXG4gKiBjb25zdCBhcHgxID0gQVBYKCcvL2RpdltAY2xhc3M9XCJleGFtcGxlXCJdJyk7XG4gKlxuICogLy8gQ1NTIHNlbGVjdG9yXG4gKiBjb25zdCBhcHgyID0gQVBYKCcuZXhhbXBsZScpO1xuICpcbiAqIC8vIFNpbmdsZSBlbGVtZW50XG4gKiBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUnKTtcbiAqIGNvbnN0IGFweDMgPSBBUFgoZWxlbWVudCk7XG4gKlxuICogLy8gTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb25cbiAqIGNvbnN0IG5vZGVMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmV4YW1wbGUnKTtcbiAqIGNvbnN0IGFweDQgPSBBUFgobm9kZUxpc3QpO1xuICpcbiAqIC8vIEFycmF5IG9mIGVsZW1lbnRzXG4gKiBjb25zdCBlbGVtZW50cyA9IFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXhhbXBsZTEnKSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUyJyldO1xuICogY29uc3QgYXB4NSA9IEFQWChlbGVtZW50cyk7XG4gKlxuICogLy8galF1ZXJ5IG9iamVjdFxuICogY29uc3QgJGV4YW1wbGUgPSAkKCcuZXhhbXBsZScpO1xuICogY29uc3QgYXB4NiA9IEFQWCgkZXhhbXBsZSk7XG4gKlxuICogLy8gRnVuY3Rpb24gcmV0dXJuaW5nIGFuIEFQWCBvYmplY3RcbiAqIGNvbnN0IGFweDcgPSBBUFgoKCkgPT4gQVBYKCcuZXhhbXBsZScpKTtcbiAqL1xuY29uc3QgQVBYID0gZnVuY3Rpb24gKGlucHV0LCBjb250ZXh0ID0gZG9jdW1lbnQpIHtcbiAgICBsZXQgZWxlbWVudHM7XG5cbiAgICAvLyBWYWxpZGF0ZSBjb250ZXh0XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb250ZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoQVBYLmlzQVBYT2JqZWN0KGNvbnRleHQpKSB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LmZpcnN0KCk7XG4gICAgfSBlbHNlIGlmICghKGNvbnRleHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBjb250ZXh0IGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb250ZXh0IGZvciBBUFgnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zdGFydHNXaXRoKCcvLycpKSB7XG4gICAgICAgIC8vIFhQYXRoIHdpdGggY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IGRvY3VtZW50LmV2YWx1YXRlKGlucHV0LCBjb250ZXh0LCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7XG4gICAgICAgIGxldCBub2RlcyA9IFtdO1xuICAgICAgICBsZXQgbm9kZSA9IGVsZW1lbnRzLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgbm9kZSA9IGVsZW1lbnRzLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMgPSBub2RlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQ1NTIHNlbGVjdG9yIHdpdGggY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbChpbnB1dCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIC8vIFNpbmdsZSBlbGVtZW50IHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gY29udGV4dC5jb250YWlucyhpbnB1dCkgPyBbaW5wdXRdIDogW107XG4gICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIE5vZGVMaXN0IHx8IGlucHV0IGluc3RhbmNlb2YgSFRNTENvbGxlY3Rpb24pIHtcbiAgICAgICAgLy8gTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb24gd2l0aGluIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBBcnJheS5mcm9tKGlucHV0KS5maWx0ZXIoZWwgPT4gY29udGV4dC5jb250YWlucyhlbCkpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkgJiYgaW5wdXQuZXZlcnkoZWwgPT4gZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgLy8gQXJyYXkgb2YgZWxlbWVudHMgd2l0aGluIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBpbnB1dC5maWx0ZXIoZWwgPT4gY29udGV4dC5jb250YWlucyhlbCkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGpRdWVyeSAhPSAndW5kZWZpbmVkJyAmJiBpbnB1dCBpbnN0YW5jZW9mIGpRdWVyeSkge1xuICAgICAgICAvLyBqUXVlcnkgb2JqZWN0IHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gQXJyYXkuZnJvbShpbnB1dC5nZXQoKSkuZmlsdGVyKGVsID0+IGNvbnRleHQuY29udGFpbnMoZWwpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBGdW5jdGlvbiByZXR1cm5pbmcgYW4gQVBYIG9iamVjdCB3aXRoIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBBUFgoaW5wdXQoKSwgY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHR5cGUgZm9yIEFQWCcpO1xuICAgIH1cblxuICAgIHZhciBhcHggPSB7XG4gICAgICAgIGVsZW1lbnRzOiBlbGVtZW50cyxcbiAgICAgICAgX2lzQVBYT2JqZWN0OiB0cnVlXG4gICAgfTtcbiAgICBhcHgubGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuICAgIGFweC5lYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgQXJyYXkpIHRoaXMuZWxlbWVudHMuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgTm9kZUxpc3QpIEFycmF5LmZyb20odGhpcy5lbGVtZW50cykuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgYXB4LmdldCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50c1tpbmRleF07XG4gICAgfTtcbiAgICBhcHguYWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gdGhpcy5lbGVtZW50cztcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBOb2RlTGlzdCkgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbGVtZW50cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgYXB4LmZpcnN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoMCk7XG4gICAgfTtcbiAgICBhdWdtZW50V2l0aExpc3RlbihhcHgpO1xuICAgIGF1Z21lbnRXaXRoVHJpc3RhdGUoYXB4KTtcbiAgICBhdWdtZW50V2l0aFNjcm9sbGFibGVUYWJsZShhcHgpO1xuICAgIGF1Z21lbnRXaXRoUGFjayhhcHgpO1xuICAgIHJldHVybiBhcHg7XG59O1xuXG5BUFgubG9hZENzcyA9IGxvYWRDc3M7XG5BUFguZGlhbG9nID0gZGlhbG9nO1xuQVBYLnRvYXN0ID0gdG9hc3Q7XG5BUFgudG9vbHMgPSB0b29scztcbkFQWC5pc0FQWE9iamVjdCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIG9iai5faXNBUFhPYmplY3QgPT09IHRydWU7XG59XG5BUFguaXNfbnVtZXJpYyA9IChuKSA9PiB7XG4gICAgcmV0dXJuICFpc05hTihuIC0gcGFyc2VGbG9hdChuKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFQWDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
4918
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QjtBQUNBOztBQUVBLGNBQWMsK0RBQU87QUFDckIsYUFBYSxrRUFBTTtBQUNuQixZQUFZLGdFQUFLO0FBQ2pCLFlBQVksNkRBQUs7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlFQUFlLEdBQUcsRSIsInNvdXJjZXMiOlsid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9hc3QvY3NzL3RvYXN0LmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9odG1sL2RpYWxvZy5odG1sIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3M/YTU2NyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL2Nzcy9zY3JvbGxhYmxlVGFibGUuY3NzPzkyZmQiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L2Nzcy90b2FzdC5jc3M/OGE0OCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcz9hMDk0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9kaWFsb2cubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL3Njcm9sbGFibGVUYWJsZS5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L3RvYXN0Lm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZXhwb3J0cy5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Rvb2xzL2Zvcm0tcGFja2VyL2F1Z21lbnQtYXB4Lm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZm9ybS1wYWNrZXIvcGFja1RvSnNvbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Rvb2xzL2dldFNjcm9sbGJhclNpemUubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90b29scy9sb2FkQ3NzLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvdHJpc3RhdGUubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2pzb25wIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vQVBYLm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyogRGlhbG9nIHN0eWxpbmcgKi9cclxuLkFQWC1kaWFsb2cge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHotaW5kZXg6IDEwMDI7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40KTtcclxuICAgIC8qIERpbW1lZCBiYWNrZ3JvdW5kIGZvciBmb2N1cyBvbiBkaWFsb2cgKi9cclxufVxyXG5cclxuLkFQWC1kaWFsb2ctY29udGVudCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlO1xyXG4gICAgcGFkZGluZzogNDBweDtcclxuICAgIGJvcmRlcjogbm9uZTtcclxuICAgIHdpZHRoOiBhdXRvO1xyXG4gICAgbWluLXdpZHRoOiAzMDBweDtcclxuICAgIG1heC13aWR0aDogODAlO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcclxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxufVxyXG5cclxuaDIuQVBYLWRpYWxvZy10aXRsZXtcclxuICAgIG1hcmdpbi10b3A6MDtcclxufVxyXG5cclxuLkFQWC1jbG9zZS1kaWFsb2cge1xyXG4gICAgY29sb3I6ICNhYWE7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICBmb250LXNpemU6IDI0cHg7XHJcbiAgICBtYXJnaW4tdG9wOiAtMTBweDtcclxuICAgIC8qIEFkanVzdCBwb3NpdGlvbmluZyAqL1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAtMTBweDtcclxufVxyXG5cclxuLkFQWC1jbG9zZS1kaWFsb2c6aG92ZXIsXHJcbi5BUFgtY2xvc2UtZGlhbG9nOmZvY3VzIHtcclxuICAgIGNvbG9yOiAjMzMzO1xyXG4gICAgLyogRGFya2VyIGNvbG9yIG9uIGhvdmVyL2ZvY3VzICovXHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi8qIElucHV0IGZpZWxkcyBzdHlsaW5nICovXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cInRleHRcIl0sXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cIm51bWJlclwiXSxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZVwiXSxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0ge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3M7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cInRleHRcIl06Zm9jdXMsXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cIm51bWJlclwiXTpmb2N1cyxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZVwiXTpmb2N1cyxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl06Zm9jdXMge1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjMkMzRTUwO1xyXG4gICAgLyogRGVlcCBCbHVlIENvbG9yICovXHJcbiAgICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4vKiBCdXR0b24gaW4gdGhlIGRpYWxvZyAqL1xyXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbiB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkMzRTUwO1xyXG4gICAgY29sb3I6ICNFQ0YwRjE7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xyXG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b246aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzM0NDk1RTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTtcclxuICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBnYXA6IDEwcHg7XHJcbiAgICBtYXJnaW4tdG9wOjFlbTtcclxuICAgIC8qIHNwYWNpbmcgYmV0d2VlbiBidXR0b25zICovXHJcbn1cclxuXHJcbi8qIExvYWRpbmcgaW5kaWNhdG9yICovXHJcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBoZWlnaHQ6IDEwMHB4O1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yOjpiZWZvcmUge1xyXG4gICAgY29udGVudDogJyc7XHJcbiAgICB3aWR0aDogNDBweDtcclxuICAgIGhlaWdodDogNDBweDtcclxuICAgIGJvcmRlcjogNHB4IHNvbGlkICNmM2YzZjM7XHJcbiAgICBib3JkZXItdG9wOiA0cHggc29saWQgIzJDM0U1MDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIGFuaW1hdGlvbjogQVBYLWRpYWxvZy1zcGluIDFzIGxpbmVhciBpbmZpbml0ZTtcclxufVxyXG5cclxuQGtleWZyYW1lcyBBUFgtZGlhbG9nLXNwaW4ge1xyXG4gICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxyXG4gICAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cclxufVxyXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQge1xyXG4gICAgb3BhY2l0eTogMC41O1xyXG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZCAhaW1wb3J0YW50O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBHcmF5ZWQgb3V0IGNvbG9yICovXHJcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xyXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEtlZXAgZ3JheSBvbiBob3ZlciAqL1xyXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi8qIEFkZCBhIHN1YnRsZSBzdHJpa2V0aHJvdWdoIGVmZmVjdCAqL1xyXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6OmFmdGVyIHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDFweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKTtcclxuICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsbUJBQW1CO0FBQ25CO0lBQ0ksYUFBYTtJQUNiLGVBQWU7SUFDZixhQUFhO0lBQ2IsT0FBTztJQUNQLE1BQU07SUFDTixXQUFXO0lBQ1gsWUFBWTtJQUNaLGNBQWM7SUFDZCxvQ0FBb0M7SUFDcEMsMENBQTBDO0FBQzlDOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGFBQWE7SUFDYixZQUFZO0lBQ1osV0FBVztJQUNYLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQiwyQ0FBMkM7SUFDM0MsZ0RBQWdEO0FBQ3BEOztBQUVBO0lBQ0ksWUFBWTtBQUNoQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osZUFBZTtJQUNmLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsbUJBQW1CO0FBQ3ZCOztBQUVBOztJQUVJLFdBQVc7SUFDWCxnQ0FBZ0M7SUFDaEMsZUFBZTtBQUNuQjs7QUFFQSx5QkFBeUI7QUFDekI7Ozs7SUFJSSxXQUFXO0lBQ1gsYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLGdEQUFnRDtJQUNoRCxlQUFlO0lBQ2Ysc0JBQXNCO0lBQ3RCLDZCQUE2QjtBQUNqQzs7QUFFQTs7OztJQUlJLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsYUFBYTtBQUNqQjs7QUFFQSx5QkFBeUI7QUFDekI7SUFDSSxrQkFBa0I7SUFDbEIseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsZUFBZTtJQUNmLHlCQUF5QjtJQUN6Qix3Q0FBd0M7QUFDNUM7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsMkJBQTJCO0lBQzNCLHlDQUF5QztBQUM3Qzs7QUFFQTtJQUNJLGFBQWE7SUFDYixTQUFTO0lBQ1QsY0FBYztJQUNkLDRCQUE0QjtBQUNoQzs7QUFFQSxzQkFBc0I7QUFDdEI7SUFDSSxhQUFhO0lBQ2IsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixhQUFhO0lBQ2IsV0FBVztBQUNmOztBQUVBO0lBQ0ksV0FBVztJQUNYLFdBQVc7SUFDWCxZQUFZO0lBQ1oseUJBQXlCO0lBQ3pCLDZCQUE2QjtJQUM3QixrQkFBa0I7SUFDbEIsNkNBQTZDO0FBQ2pEOztBQUVBO0lBQ0ksS0FBSyx1QkFBdUIsRUFBRTtJQUM5QixPQUFPLHlCQUF5QixFQUFFO0FBQ3RDO0FBQ0E7SUFDSSxZQUFZO0lBQ1osOEJBQThCO0lBQzlCLG9DQUFvQyxFQUFFLHFCQUFxQjtJQUMzRCwyQkFBMkI7SUFDM0IseUJBQXlCO0lBQ3pCLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLG9DQUFvQyxFQUFFLHVCQUF1QjtJQUM3RCwwQkFBMEI7QUFDOUI7O0FBRUEsc0NBQXNDO0FBQ3RDO0lBQ0ksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsb0NBQW9DO0lBQ3BDLHdCQUF3QjtBQUM1QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBEaWFsb2cgc3R5bGluZyAqL1xcclxcbi5BUFgtZGlhbG9nIHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgICB6LWluZGV4OiAxMDAyO1xcclxcbiAgICBsZWZ0OiAwO1xcclxcbiAgICB0b3A6IDA7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICBoZWlnaHQ6IDEwMCU7XFxyXFxuICAgIG92ZXJmbG93OiBhdXRvO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNCk7XFxyXFxuICAgIC8qIERpbW1lZCBiYWNrZ3JvdW5kIGZvciBmb2N1cyBvbiBkaWFsb2cgKi9cXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XFxyXFxuICAgIHBhZGRpbmc6IDQwcHg7XFxyXFxuICAgIGJvcmRlcjogbm9uZTtcXHJcXG4gICAgd2lkdGg6IGF1dG87XFxyXFxuICAgIG1pbi13aWR0aDogMzAwcHg7XFxyXFxuICAgIG1heC13aWR0aDogODAlO1xcclxcbiAgICBtYXJnaW46IGF1dG87XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcXHJcXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcXHJcXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xcclxcbn1cXHJcXG5cXHJcXG5oMi5BUFgtZGlhbG9nLXRpdGxle1xcclxcbiAgICBtYXJnaW4tdG9wOjA7XFxyXFxufVxcclxcblxcclxcbi5BUFgtY2xvc2UtZGlhbG9nIHtcXHJcXG4gICAgY29sb3I6ICNhYWE7XFxyXFxuICAgIGZsb2F0OiByaWdodDtcXHJcXG4gICAgZm9udC1zaXplOiAyNHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAtMTBweDtcXHJcXG4gICAgLyogQWRqdXN0IHBvc2l0aW9uaW5nICovXFxyXFxuICAgIG1hcmdpbi1yaWdodDogLTEwcHg7XFxyXFxufVxcclxcblxcclxcbi5BUFgtY2xvc2UtZGlhbG9nOmhvdmVyLFxcclxcbi5BUFgtY2xvc2UtZGlhbG9nOmZvY3VzIHtcXHJcXG4gICAgY29sb3I6ICMzMzM7XFxyXFxuICAgIC8qIERhcmtlciBjb2xvciBvbiBob3Zlci9mb2N1cyAqL1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi8qIElucHV0IGZpZWxkcyBzdHlsaW5nICovXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl0sXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJudW1iZXJcXFwiXSxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGVcXFwiXSxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGV0aW1lLWxvY2FsXFxcIl0ge1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgcGFkZGluZzogMTBweDtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3M7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdOmZvY3VzLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwibnVtYmVyXFxcIl06Zm9jdXMsXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRlXFxcIl06Zm9jdXMsXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRldGltZS1sb2NhbFxcXCJdOmZvY3VzIHtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjMkMzRTUwO1xcclxcbiAgICAvKiBEZWVwIEJsdWUgQ29sb3IgKi9cXHJcXG4gICAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLyogQnV0dG9uIGluIHRoZSBkaWFsb2cgKi9cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbiB7XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzJDM0U1MDtcXHJcXG4gICAgY29sb3I6ICNFQ0YwRjE7XFxyXFxuICAgIGJvcmRlcjogbm9uZTtcXHJcXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcclxcbiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbjpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzNDQ5NUU7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTtcXHJcXG4gICAgYm94LXNoYWRvdzogMCA0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIge1xcclxcbiAgICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgICBnYXA6IDEwcHg7XFxyXFxuICAgIG1hcmdpbi10b3A6MWVtO1xcclxcbiAgICAvKiBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xcclxcbn1cXHJcXG5cXHJcXG4vKiBMb2FkaW5nIGluZGljYXRvciAqL1xcclxcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yIHtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGhlaWdodDogMTAwcHg7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvcjo6YmVmb3JlIHtcXHJcXG4gICAgY29udGVudDogJyc7XFxyXFxuICAgIHdpZHRoOiA0MHB4O1xcclxcbiAgICBoZWlnaHQ6IDQwcHg7XFxyXFxuICAgIGJvcmRlcjogNHB4IHNvbGlkICNmM2YzZjM7XFxyXFxuICAgIGJvcmRlci10b3A6IDRweCBzb2xpZCAjMkMzRTUwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICAgIGFuaW1hdGlvbjogQVBYLWRpYWxvZy1zcGluIDFzIGxpbmVhciBpbmZpbml0ZTtcXHJcXG59XFxyXFxuXFxyXFxuQGtleWZyYW1lcyBBUFgtZGlhbG9nLXNwaW4ge1xcclxcbiAgICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XFxyXFxuICAgIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XFxyXFxufVxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZCB7XFxyXFxuICAgIG9wYWNpdHk6IDAuNTtcXHJcXG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZCAhaW1wb3J0YW50O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEdyYXllZCBvdXQgY29sb3IgKi9cXHJcXG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xcclxcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xcclxcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBLZWVwIGdyYXkgb24gaG92ZXIgKi9cXHJcXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi8qIEFkZCBhIHN1YnRsZSBzdHJpa2V0aHJvdWdoIGVmZmVjdCAqL1xcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDo6YWZ0ZXIge1xcclxcbiAgICBjb250ZW50OiAnJztcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0b3A6IDUwJTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIGhlaWdodDogMXB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMik7XFxyXFxuICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAvKiBBUFggU2Nyb2xsYWJsZSBUYWJsZTogc2Nyb2xsYWJsZSB0Ym9keSB3aXRoIGZpeGVkIHRoZWFkL3Rmb290IGFuZCBhbGlnbmVkIGNvbHVtbnMgKENTUyBHcmlkICsgc3ViZ3JpZClcbiAgIFVzZSAhaW1wb3J0YW50IHNvIHBhZ2Ugc3R5bGVzIChlLmcuIGRpc3BsYXk6IHRhYmxlKSBkbyBub3Qgb3ZlcnJpZGUgdGhlIGdyaWQgbGF5b3V0LiAqL1xuXG4vKiAtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnM6IHNldCBieSBKUyAobWVhc3VyZWQgd2lkdGhzICsgZ3V0dGVyKTsgZmFsbGJhY2sgPSBlcXVhbCBjb2x1bW5zICsgZ3V0dGVyICovXG4vKiAtLWFweC1zY3JvbGxhYmxlLWd1dHRlci13aWR0aDogc3BhY2UgZm9yIHZlcnRpY2FsIHNjcm9sbGJhciBzbyBpdCBkb2VzIG5vdCBvdmVybGFwIHRoZSBsYXN0IGNvbHVtbiAoc2V0IHRvIDAgdG8gYWxsb3cgb3ZlcmxhcCkgKi9cbi8qIC0tYXB4LXNjcm9sbGFibGUtYm9keS1oZWlnaHQ6IHdoZW4gY2xhc3MgYXB4LXNjcm9sbGFibGUtdGFibGUtLWJvZHktaGVpZ2h0IGlzIHNldCwgdGJvZHkgcm93IHVzZXMgZml4ZWQgaGVpZ2h0IGluc3RlYWQgb2YgbWF4LWhlaWdodCAqL1xuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHtcbiAgICBkaXNwbGF5OiBncmlkICFpbXBvcnRhbnQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS10ZW1wbGF0ZS1jb2x1bW5zLCByZXBlYXQodmFyKC0tYXB4LXNjcm9sbGFibGUtY29scywgMyksIG1pbm1heCgwLCAxZnIpKSBtaW5tYXgodmFyKC0tYXB4LXNjcm9sbGFibGUtZ3V0dGVyLXdpZHRoLCAxN3B4KSwgdmFyKC0tYXB4LXNjcm9sbGFibGUtZ3V0dGVyLXdpZHRoLCAxN3B4KSkpO1xuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpIGF1dG87XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgdGFibGUtbGF5b3V0OiB1bnNldCAhaW1wb3J0YW50O1xufVxuXG4uYXB4LXNjcm9sbGFibGUtdGFibGUtLWJvZHktaGVpZ2h0IHtcbiAgICAtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemU6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpO1xufVxuXG4vKiBUYWJsZSB3aXRoIG5vIHRmb290OiB0aGVhZCArIHRib2R5IG9ubHkgKi9cbi5hcHgtc2Nyb2xsYWJsZS10YWJsZTpub3QoLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QpIHtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gdmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1yb3ctc2l6ZSwgZml0LWNvbnRlbnQodmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1tYXgtaGVpZ2h0LCAyMDBweCkpKTtcbn1cblxuLyogVGFibGUgd2l0aCBubyB0aGVhZDogdGJvZHkgKyB0Zm9vdCBvbmx5ICovXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkIHtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemUsIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSkgYXV0bztcbn1cblxuLyogVGFibGUgd2l0aCBuZWl0aGVyIHRoZWFkIG5vciB0Zm9vdDogdGJvZHkgb25seSAqL1xuLmFweC1zY3JvbGxhYmxlLXRhYmxlLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1uby10aGVhZDpub3QoLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QpIHtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemUsIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSk7XG59XG5cbi8qIC0tYXB4LXNjcm9sbGFibGUtKi10ZW1wbGF0ZS1yb3dzOiBzZXQgYnkgSlMgKG1lYXN1cmVkIGhlaWdodHMpIG9yIG92ZXJyaWRlIGluIENTUyAvIHZpYSBvcHRpb25zICovXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0aGVhZCxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRib2R5LFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGZvb3Qge1xuICAgIGRpc3BsYXk6IGdyaWQgIWltcG9ydGFudDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHN1YmdyaWQ7XG4gICAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcbiAgICBtaW4taGVpZ2h0OiAwO1xufVxuXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0aGVhZCB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC10ZW1wbGF0ZS1yb3dzLCByZXBlYXQodmFyKC0tYXB4LXNjcm9sbGFibGUtdGhlYWQtcm93cywgMSksIGF1dG8pKTtcbn1cblxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHkge1xuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGJvZHktdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRib2R5LXJvd3MsIDEpLCBhdXRvKSk7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG59XG5cbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290IHtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRmb290LXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10Zm9vdC1yb3dzLCAxKSwgYXV0bykpO1xufVxuXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0aGVhZCA+IHRyLFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHkgPiB0cixcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290ID4gdHIge1xuICAgIGRpc3BsYXk6IGNvbnRlbnRzICFpbXBvcnRhbnQ7XG59XG5cbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0aCxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0ZCB7XG4gICAgbWluLXdpZHRoOiAwO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL2Nzcy9zY3JvbGxhYmxlVGFibGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO3lGQUN5Rjs7QUFFekYsK0dBQStHO0FBQy9HLG1JQUFtSTtBQUNuSSx5SUFBeUk7QUFDekk7SUFDSSx3QkFBd0I7SUFDeEIsK01BQStNO0lBQy9NLDRIQUE0SDtJQUM1SCxXQUFXO0lBQ1gsOEJBQThCO0FBQ2xDOztBQUVBO0lBQ0ksNEVBQTRFO0FBQ2hGOztBQUVBLDRDQUE0QztBQUM1QztJQUNJLHVIQUF1SDtBQUMzSDs7QUFFQSw0Q0FBNEM7QUFDNUM7SUFDSSx1SEFBdUg7QUFDM0g7O0FBRUEsbURBQW1EO0FBQ25EO0lBQ0ksa0hBQWtIO0FBQ3RIOztBQUVBLG9HQUFvRztBQUNwRzs7O0lBR0ksd0JBQXdCO0lBQ3hCLDhCQUE4QjtJQUM5QixtQkFBbUI7SUFDbkIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGdIQUFnSDtBQUNwSDs7QUFFQTtJQUNJLGdIQUFnSDtJQUNoSCxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksZ0hBQWdIO0FBQ3BIOztBQUVBOzs7SUFHSSw0QkFBNEI7QUFDaEM7O0FBRUE7O0lBRUksWUFBWTtJQUNaLHNCQUFzQjtBQUMxQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBBUFggU2Nyb2xsYWJsZSBUYWJsZTogc2Nyb2xsYWJsZSB0Ym9keSB3aXRoIGZpeGVkIHRoZWFkL3Rmb290IGFuZCBhbGlnbmVkIGNvbHVtbnMgKENTUyBHcmlkICsgc3ViZ3JpZClcXG4gICBVc2UgIWltcG9ydGFudCBzbyBwYWdlIHN0eWxlcyAoZS5nLiBkaXNwbGF5OiB0YWJsZSkgZG8gbm90IG92ZXJyaWRlIHRoZSBncmlkIGxheW91dC4gKi9cXG5cXG4vKiAtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnM6IHNldCBieSBKUyAobWVhc3VyZWQgd2lkdGhzICsgZ3V0dGVyKTsgZmFsbGJhY2sgPSBlcXVhbCBjb2x1bW5zICsgZ3V0dGVyICovXFxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGg6IHNwYWNlIGZvciB2ZXJ0aWNhbCBzY3JvbGxiYXIgc28gaXQgZG9lcyBub3Qgb3ZlcmxhcCB0aGUgbGFzdCBjb2x1bW4gKHNldCB0byAwIHRvIGFsbG93IG92ZXJsYXApICovXFxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LWhlaWdodDogd2hlbiBjbGFzcyBhcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQgaXMgc2V0LCB0Ym9keSByb3cgdXNlcyBmaXhlZCBoZWlnaHQgaW5zdGVhZCBvZiBtYXgtaGVpZ2h0ICovXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHtcXG4gICAgZGlzcGxheTogZ3JpZCAhaW1wb3J0YW50O1xcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnMsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1jb2xzLCAzKSwgbWlubWF4KDAsIDFmcikpIG1pbm1heCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpLCB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpKSk7XFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpIGF1dG87XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICB0YWJsZS1sYXlvdXQ6IHVuc2V0ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQge1xcbiAgICAtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemU6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpO1xcbn1cXG5cXG4vKiBUYWJsZSB3aXRoIG5vIHRmb290OiB0aGVhZCArIHRib2R5IG9ubHkgKi9cXG4uYXB4LXNjcm9sbGFibGUtdGFibGU6bm90KC5hcHgtc2Nyb2xsYWJsZS10YWJsZS0taGFzLXRmb290KSB7XFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpO1xcbn1cXG5cXG4vKiBUYWJsZSB3aXRoIG5vIHRoZWFkOiB0Ym9keSArIHRmb290IG9ubHkgKi9cXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkIHtcXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpIGF1dG87XFxufVxcblxcbi8qIFRhYmxlIHdpdGggbmVpdGhlciB0aGVhZCBub3IgdGZvb3Q6IHRib2R5IG9ubHkgKi9cXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkOm5vdCguYXB4LXNjcm9sbGFibGUtdGFibGUtLWhhcy10Zm9vdCkge1xcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemUsIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSk7XFxufVxcblxcbi8qIC0tYXB4LXNjcm9sbGFibGUtKi10ZW1wbGF0ZS1yb3dzOiBzZXQgYnkgSlMgKG1lYXN1cmVkIGhlaWdodHMpIG9yIG92ZXJyaWRlIGluIENTUyAvIHZpYSBvcHRpb25zICovXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQsXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHksXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGZvb3Qge1xcbiAgICBkaXNwbGF5OiBncmlkICFpbXBvcnRhbnQ7XFxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogc3ViZ3JpZDtcXG4gICAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcXG4gICAgbWluLWhlaWdodDogMDtcXG59XFxuXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQge1xcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzLCAxKSwgYXV0bykpO1xcbn1cXG5cXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Ym9keSB7XFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGJvZHktdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRib2R5LXJvd3MsIDEpLCBhdXRvKSk7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCB7XFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGZvb3QtdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MsIDEpLCBhdXRvKSk7XFxufVxcblxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRoZWFkID4gdHIsXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHkgPiB0cixcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCA+IHRyIHtcXG4gICAgZGlzcGxheTogY29udGVudHMgIWltcG9ydGFudDtcXG59XFxuXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHRoLFxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0ZCB7XFxuICAgIG1pbi13aWR0aDogMDtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuQVBYLXRvYXN0LWNvbnRhaW5lciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGdhcDogdmFyKC0tYXB4LXRvYXN0LWdhcCwgOHB4KTtcclxuICAgIHotaW5kZXg6IHZhcigtLWFweC10b2FzdC16LWluZGV4LCAxMTAwMCk7XHJcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxufVxyXG5cclxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxyXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tYm90dG9tLWxlZnQgeyBsZWZ0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9XHJcbi5BUFgtdG9hc3QtY29udGFpbmVyLS10b3AtcmlnaHQgeyByaWdodDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1lbmQ7IH1cclxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxyXG5cclxuLkFQWC10b2FzdCB7XHJcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcclxuICAgIG1heC13aWR0aDogdmFyKC0tYXB4LXRvYXN0LW1heC13aWR0aCwgNDIwcHgpO1xyXG4gICAgZm9udC1zaXplOiB2YXIoLS1hcHgtdG9hc3QtZm9udC1zaXplLCAxNHB4KTtcclxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XHJcbiAgICBib3gtc2hhZG93OiB2YXIoLS1hcHgtdG9hc3Qtc2hhZG93LCAwIDZweCAyNHB4IHJnYmEoMCwwLDAsMC4yKSk7XHJcbiAgICBwYWRkaW5nOiB2YXIoLS1hcHgtdG9hc3QtcGFkZGluZywgMTBweCA0MnB4IDEwcHggMTRweCk7XHJcbiAgICBjb2xvcjogIzExMTtcclxuICAgIGJhY2tncm91bmQ6ICNlZWU7XHJcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgZWFzZSwgdHJhbnNmb3JtIDE4MG1zIGVhc2U7XHJcbn1cclxuXHJcbi5BUFgtdG9hc3QtLWluZm8geyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1mZywgIzA1MmM2NSk7IH1cclxuLkFQWC10b2FzdC0tc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWJnLCAjMTk4NzU0KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWZnLCAjZmZmZmZmKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XHJcbi5BUFgtdG9hc3QtLWRhbmdlciB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1kYW5nZXItYmcsICNkYzM1NDUpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1mZywgI2ZmZmZmZik7IH1cclxuXHJcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxyXG5cclxuLkFQWC10b2FzdF9fY2xvc2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA1MCU7IHJpZ2h0OiAxMHB4O1xyXG4gICAgd2lkdGg6IDI0cHg7IGhlaWdodDogMjRweDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogY3VycmVudENvbG9yO1xyXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjsgYXBwZWFyYW5jZTogbm9uZTsgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xyXG4gICAgb3BhY2l0eTogLjc1OyB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XHJcbn1cclxuLkFQWC10b2FzdF9fY2xvc2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOmZvY3VzIHsgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEoMCwwLDAsLjIpOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xyXG4gICAgY29udGVudDogJ8OXJztcclxuICAgIGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE7IHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLyogUHJvZ3Jlc3MgYmFyIChvdXRzaWRlIGNvbnRlbnQsIGZsdXNoIHRvIHRvYXN0IGVkZ2VzKSAqL1xyXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCk7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xyXG4gICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xyXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgMCAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20ge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcclxufVxyXG4vKiBUcmFjayBjb250YWlucyB0aGUgYmFyOyBubyBtYXJnaW4gKHBhdXNlIGJ1dHRvbiBpcyBvbiB0aGUgY29ybmVyLCBvdmVybGFwcGluZykgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xyXG4gICAgZmxleDogMTtcclxuICAgIG1pbi13aWR0aDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XHJcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XHJcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoMTAyLCA3NywgMywgMC41KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4vKiBQYXVzZS9SZXN1bWUgYnV0dG9uOiByb3VuZCwgY2VudGVyIGV4YWN0bHkgb24gdG9hc3QgY29ybmVyICh0b3AtbGVmdCBvciBib3R0b20tbGVmdCkgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcclxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xyXG4gICAgbGVmdDogMDtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZDogI2VlZTtcclxuICAgIGNvbG9yOiBjdXJyZW50Q29sb3I7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgb3BhY2l0eTogMC45NTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS10b3AgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCA1MCUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxyXG4uQVBYLXRvYXN0LS1zdWNjZXNzIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtYmcsICMxOTg3NTQpOyBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBib3JkZXItY29sb3I6IHJnYmEoMTAyLCA3NywgMywgMC42KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlOmhvdmVyIHsgb3BhY2l0eTogMTsgfVxyXG4uQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC40KTsgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IH1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgaGVpZ2h0OiAxMHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuLyogRXh0cmEgdG9wL2JvdHRvbSBwYWRkaW5nIHdoZW4gcHJvZ3Jlc3MgYmFyIGlzIHByZXNlbnQgKGRlZmF1bHQgY29udGVudCBwYWRkaW5nIDEwcHggKyBiYXIgaGVpZ2h0KSAqL1xyXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20geyBwYWRkaW5nLWJvdHRvbTogY2FsYygxMHB4ICsgdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KSk7IH1cclxuLyogUmVzZXJ2ZSBzcGFjZSBmb3Igc3RhY2tpbmcgd2hlbiBwYXVzZSBidXR0b24gaXMgcHJlc2VudCAoYnV0dG9uIGV4dGVuZHMgb3V0c2lkZSB0b2FzdCBjb3JuZXIpICovXHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tYm90dG9tOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcblxyXG4vKiBBbmltYXRpb25zICovXHJcbi5BUFgtdG9hc3QtLWVudGVyIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cclxuLkFQWC10b2FzdC0tZW50ZXIuQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cclxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxyXG4uQVBYLXRvYXN0LS1leGl0LkFQWC10b2FzdC0tZXhpdC1hY3RpdmUgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxyXG5cclxuXHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtJQUNmLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsOEJBQThCO0lBQzlCLHdDQUF3QztJQUN4QyxvQkFBb0I7QUFDeEI7O0FBRUEscUNBQXFDLFdBQVcsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUU7QUFDdkYsb0NBQW9DLFVBQVUsRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUU7QUFDdkYsa0NBQWtDLFdBQVcsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUU7QUFDakYsaUNBQWlDLFVBQVUsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUU7O0FBRWpGO0lBQ0ksNENBQTRDO0lBQzVDLDRDQUE0QztJQUM1QywyQ0FBMkM7SUFDM0MsMkNBQTJDO0lBQzNDLCtEQUErRDtJQUMvRCxzREFBc0Q7SUFDdEQsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsa0JBQWtC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MEIsRUFBRVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuQVBYLXRvYXN0LWNvbnRhaW5lciB7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gICAgZ2FwOiB2YXIoLS1hcHgtdG9hc3QtZ2FwLCA4cHgpO1xcclxcbiAgICB6LWluZGV4OiB2YXIoLS1hcHgtdG9hc3Qtei1pbmRleCwgMTEwMDApO1xcclxcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxcclxcbi5BUFgtdG9hc3QtY29udGFpbmVyLS1ib3R0b20tbGVmdCB7IGxlZnQ6IDEycHg7IGJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH1cXHJcXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tdG9wLXJpZ2h0IHsgcmlnaHQ6IDEycHg7IHRvcDogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxcclxcblxcclxcbi5BUFgtdG9hc3Qge1xcclxcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcXHJcXG4gICAgbWF4LXdpZHRoOiB2YXIoLS1hcHgtdG9hc3QtbWF4LXdpZHRoLCA0MjBweCk7XFxyXFxuICAgIGZvbnQtc2l6ZTogdmFyKC0tYXB4LXRvYXN0LWZvbnQtc2l6ZSwgMTRweCk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XFxyXFxuICAgIGJveC1zaGFkb3c6IHZhcigtLWFweC10b2FzdC1zaGFkb3csIDAgNnB4IDI0cHggcmdiYSgwLDAsMCwwLjIpKTtcXHJcXG4gICAgcGFkZGluZzogdmFyKC0tYXB4LXRvYXN0LXBhZGRpbmcsIDEwcHggNDJweCAxMHB4IDE0cHgpO1xcclxcbiAgICBjb2xvcjogIzExMTtcXHJcXG4gICAgYmFja2dyb3VuZDogI2VlZTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBlYXNlLCB0cmFuc2Zvcm0gMTgwbXMgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC0taW5mbyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1pbmZvLWJnLCAjMGRjYWYwKTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1pbmZvLWZnLCAjMDUyYzY1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1mZywgI2ZmZmZmZik7IH1cXHJcXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XFxyXFxuLkFQWC10b2FzdC0tZGFuZ2VyIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1iZywgI2RjMzU0NSk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWZnLCAjZmZmZmZmKTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0b3A6IDUwJTsgcmlnaHQ6IDEwcHg7XFxyXFxuICAgIHdpZHRoOiAyNHB4OyBoZWlnaHQ6IDI0cHg7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IGN1cnJlbnRDb2xvcjtcXHJcXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyOyBhcHBlYXJhbmNlOiBub25lOyAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxyXFxuICAgIG9wYWNpdHk6IC43NTsgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbn1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpob3ZlciB7IG9wYWNpdHk6IDE7IH1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTsgb3V0bGluZS1vZmZzZXQ6IDJweDsgfVxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xcclxcbiAgICBjb250ZW50OiAnw5cnO1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi8qIFByb2dyZXNzIGJhciAob3V0c2lkZSBjb250ZW50LCBmbHVzaCB0byB0b2FzdCBlZGdlcykgKi9cXHJcXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KTtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXHJcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxyXFxuICAgIGZsZXgtc2hyaW5rOiAwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcclxcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KSB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIDAgMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSB7XFxyXFxuICAgIGJvdHRvbTogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcXHJcXG59XFxyXFxuLyogVHJhY2sgY29udGFpbnMgdGhlIGJhcjsgbm8gbWFyZ2luIChwYXVzZSBidXR0b24gaXMgb24gdGhlIGNvcm5lciwgb3ZlcmxhcHBpbmcpICovXFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xcclxcbiAgICBmbGV4OiAxO1xcclxcbiAgICBtaW4td2lkdGg6IDA7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7XFxyXFxuICAgIGhlaWdodDogMTAwJTtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIG1heC13aWR0aDogMTAwJTtcXHJcXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XFxyXFxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XFxyXFxuLkFQWC10b2FzdC0tc3VjY2VzcyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDEwMiwgNzcsIDMsIDAuNSk7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxcclxcbi8qIFBhdXNlL1Jlc3VtZSBidXR0b246IHJvdW5kLCBjZW50ZXIgZXhhY3RseSBvbiB0b2FzdCBjb3JuZXIgKHRvcC1sZWZ0IG9yIGJvdHRvbS1sZWZ0KSAqL1xcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB3aWR0aDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xcclxcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiAjZWVlO1xcclxcbiAgICBjb2xvcjogY3VycmVudENvbG9yO1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICAgIHBhZGRpbmc6IDA7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgICBsaW5lLWhlaWdodDogMTtcXHJcXG4gICAgb3BhY2l0eTogMC45NTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbiAgICBmbGV4LXNocmluazogMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xcclxcbiAgICBib3R0b206IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjMpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWJnLCAjZmZjMTA3KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDEwMiwgNzcsIDMsIDAuNik7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6Zm9jdXMgeyBvdXRsaW5lOiAycHggc29saWQgcmdiYSgwLDAsMCwuNCk7IG91dGxpbmUtb2Zmc2V0OiAtMnB4OyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcXHJcXG4gICAgd2lkdGg6IDEwcHg7XFxyXFxuICAgIGhlaWdodDogMTBweDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcbi8qIEV4dHJhIHRvcC9ib3R0b20gcGFkZGluZyB3aGVuIHByb2dyZXNzIGJhciBpcyBwcmVzZW50IChkZWZhdWx0IGNvbnRlbnQgcGFkZGluZyAxMHB4ICsgYmFyIGhlaWdodCkgKi9cXHJcXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbSB7IHBhZGRpbmctYm90dG9tOiBjYWxjKDEwcHggKyB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpKTsgfVxcclxcbi8qIFJlc2VydmUgc3BhY2UgZm9yIHN0YWNraW5nIHdoZW4gcGF1c2UgYnV0dG9uIGlzIHByZXNlbnQgKGJ1dHRvbiBleHRlbmRzIG91dHNpZGUgdG9hc3QgY29ybmVyKSAqL1xcclxcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbS5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZSB7IG1hcmdpbi1ib3R0b206IGNhbGModmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpIC8gMik7IH1cXHJcXG5cXHJcXG4vKiBBbmltYXRpb25zICovXFxyXFxuLkFQWC10b2FzdC0tZW50ZXIgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxcclxcbi5BUFgtdG9hc3QtLWVudGVyLkFQWC10b2FzdC0tZW50ZXItYWN0aXZlIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XFxyXFxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxcclxcbi5BUFgtdG9hc3QtLWV4aXQuQVBYLXRvYXN0LS1leGl0LWFjdGl2ZSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpOyB9XFxyXFxuXFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ21hc2sgaWQ9JTI3ZnJhbWUtY3V0b3V0JTI3JTNFJTNDcmVjdCB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgZmlsbD0lMjclMjNmZmYlMjcvJTNFJTNDcmVjdCB4PSUyNzMlMjcgeT0lMjczJTI3IHdpZHRoPSUyNzI2JTI3IGhlaWdodD0lMjcyNiUyNyByeD0lMjc0JTI3IHJ5PSUyNzQlMjcgZmlsbD0lMjclMjMwMDAlMjcvJTNFJTNDL21hc2slM0UlM0NyZWN0IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyBmaWxsPSUyNyUyM2NjY2NjYyUyNyBtYXNrPSUyN3VybCUyOCUyM2ZyYW1lLWN1dG91dCUyOSUyNy8lM0UlM0Mvc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgdmlld0JveD0lMjcwIDAgMzIgMzIlMjclM0UlM0NwYXRoIGQ9JTI3TTggMTZoMTYlMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgd2lkdGg9JTI3MzIlMjcgaGVpZ2h0PSUyNzMyJTI3IHZpZXdCb3g9JTI3MCAwIDMyIDMyJTI3JTNFJTNDcGF0aCBkPSUyN002IDE3TDEyIDIzTDI2IDklMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcgc3Ryb2tlLWxpbmVqb2luPSUyN3JvdW5kJTI3LyUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ3BhdGggZD0lMjdNOCA4TDI0IDI0TTI0IDhMOCAyNCUyNyBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlPSUyNyUyM2ZmZiUyNyBzdHJva2Utd2lkdGg9JTI3MyUyNyBzdHJva2UtbGluZWNhcD0lMjdyb3VuZCUyNyBzdHJva2UtbGluZWpvaW49JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8zX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmFweC10cmlzdGF0ZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWluLXdpZHRoOjEzcHg7XG4gICAgbWluLWhlaWdodDoxM3B4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmFkaXVzOjNweDtcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAtLWFweC10cmlzdGF0ZS1jaGVja2VkLWNvbG9yOiAjMDY1NGJhO1xuICAgIC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3I6ICNmMDA7XG59XG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xufVxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi8qIFdoZW4gLS1taXhlZCBpcyB1c2VkIChlLmcuIHBhcmVudCArIHN1Yi1jaGVja2JveGVzKSwgZGFzaCBzaG93cyBvbmx5IHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkICovXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjphZnRlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjphZnRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLXRpY2stY29sb3IpO1xuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICAtd2Via2l0LW1hc2stc2l6ZTogMTAwJSAxMDAlO1xuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcbiAgICBtYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIG1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICBtYXNrLW1vZGU6IGFscGhhO1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xuICAgIG1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX199KTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG59XG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3IpO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQ6OmFmdGVyLFxuLmFweC10cmlzdGF0ZS5jcm9zc2VkOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0OiAwO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yKTtcbiAgICAtd2Via2l0LW1hc2stcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgLXdlYmtpdC1tYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICAtd2Via2l0LW1hc2stbW9kZTogYWxwaGE7XG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBtYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgbWFzay1zaXplOiAxMDAlIDEwMCU7XG4gICAgbWFzay1tb2RlOiBhbHBoYTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlciB7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19ffSk7XG4gICAgbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fX30pO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX199KTtcbiAgICBtYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zX19ffSk7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLDZCQUE2QjtJQUM3QixpQkFBaUI7SUFDakIsc0NBQXNDO0lBQ3RDLHFDQUFxQztJQUNyQyxrQ0FBa0M7QUFDdEM7QUFDQTtJQUNJLHlEQUE2WDtBQUNqWTtBQUNBO0lBQ0ksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLG9CQUFvQjtBQUN4QjtBQUNBLGlHQUFpRztBQUNqRzs7SUFFSSxhQUFhO0FBQ2pCO0FBQ0E7SUFDSSxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLDJEQUEyTztJQUMzTyxtREFBbU87QUFDdk87QUFDQTtJQUNJLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7O0FBRUE7O0lBRUksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLDJEQUEyUTtJQUMzUSxtREFBbVE7QUFDdlE7O0FBRUE7SUFDSSwyREFBK1E7SUFDL1EsbURBQXVRO0FBQzNRXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5hcHgtdHJpc3RhdGUge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1pbi13aWR0aDoxM3B4O1xcbiAgICBtaW4taGVpZ2h0OjEzcHg7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6M3B4O1xcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcjogIzA2NTRiYTtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY3Jvc3NlZC1jb2xvcjogI2YwMDtcXG59XFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NtYXNrIGlkPSdmcmFtZS1jdXRvdXQnJTNFJTNDcmVjdCB3aWR0aD0nMzInIGhlaWdodD0nMzInIGZpbGw9JyUyM2ZmZicvJTNFJTNDcmVjdCB4PSczJyB5PSczJyB3aWR0aD0nMjYnIGhlaWdodD0nMjYnIHJ4PSc0JyByeT0nNCcgZmlsbD0nJTIzMDAwJy8lM0UlM0MvbWFzayUzRSUzQ3JlY3Qgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyBmaWxsPSclMjNjY2NjY2MnIG1hc2s9J3VybCglMjNmcmFtZS1jdXRvdXQpJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGU6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLyogV2hlbiAtLW1peGVkIGlzIHVzZWQgKGUuZy4gcGFyZW50ICsgc3ViLWNoZWNrYm94ZXMpLCBkYXNoIHNob3dzIG9ubHkgd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQgKi9cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS1pbmRldGVybWluYXRlLWRhc2g6bm90KC5hcHgtdHJpc3RhdGUtLW1peGVkKTo6YWZ0ZXIge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YmVmb3JlIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YWZ0ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDE2aDE2JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG4gICAgbWFzay1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyB2aWV3Qm94PScwIDAgMzIgMzInJTNFJTNDcGF0aCBkPSdNOCAxNmgxNicgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XFxufVxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZCB7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS1jcm9zc2VkLWNvbG9yKTtcXG59XFxuXFxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlcixcXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY2hlY2tlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxuICAgIG1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTggOEwyNCAyNE0yNCA4TDggMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzZmZmJyBzdHJva2Utd2lkdGg9JzMnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRVxcXCIpO1xcbiAgICBtYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDhMMjQgMjRNMjQgOEw4IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHVybCA9IFN0cmluZyh1cmwuX19lc01vZHVsZSA/IHVybC5kZWZhdWx0IDogdXJsKTtcblxuICAvLyBJZiB1cmwgaXMgYWxyZWFkeSB3cmFwcGVkIGluIHF1b3RlcywgcmVtb3ZlIHRoZW1cbiAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gdXJsLnNsaWNlKDEsIC0xKTtcbiAgfVxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfVxuXG4gIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgLy8gU2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLTMvI3VybHNcbiAgaWYgKC9bXCInKCkgXFx0XFxuXXwoJTIwKS8udGVzdCh1cmwpIHx8IG9wdGlvbnMubmVlZFF1b3Rlcykge1xuICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQodXJsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKSwgXCJcXFwiXCIpO1xuICB9XG4gIHJldHVybiB1cmw7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiLy8gTW9kdWxlXG52YXIgY29kZSA9IFwiPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZ1xcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctY29udGVudFxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiQVBYLWNsb3NlLWRpYWxvZ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDxoMiBjbGFzcz1cXFwiQVBYLWRpYWxvZy10aXRsZVxcXCI+PC9oMj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lclxcXCI+PC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbjwvZGl2PlwiO1xuLy8gRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2RlOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdG9hc3QuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90b2FzdC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdHJpc3RhdGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90cmlzdGF0ZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8vIEltcG9ydGluZyB0aGUgQ1NTIGFuZCBIVE1MIHRlbXBsYXRlc1xyXG5pbXBvcnQgJy4vY3NzL2RpYWxvZy5jc3MnO1xyXG5pbXBvcnQgZGlhbG9nVGVtcGxhdGUgZnJvbSAnLi9odG1sL2RpYWxvZy5odG1sP3Jhdyc7XHJcblxyXG5jb25zdCBjcmVhdGVEaWFsb2cgPSAob3B0aW9ucykgPT4ge1xyXG4gICAgY29uc3QgZGlhbG9nRGVmYXVsdHMgPSB7XHJcbiAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgIGNvbnRlbnQ6ICcnLFxyXG4gICAgICAgIGNvbnRlbnRVUkk6ICcnLFxyXG4gICAgICAgIGJ1dHRvbnM6IFtdLFxyXG4gICAgICAgIHNpemU6ICdtZWRpdW0nLFxyXG4gICAgICAgIHNob3dMb2FkaW5nSW5kaWNhdG9yOiBmYWxzZSxcclxuICAgICAgICBjb250ZW50TWV0aG9kOiAnR0VUJyxcclxuICAgICAgICBjb250ZW50RGF0YTogbnVsbCxcclxuICAgICAgICBjb250ZW50SGVhZGVyczogdW5kZWZpbmVkXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHsgdGl0bGUsIGNvbnRlbnQsIGNvbnRlbnRVUkksIGJ1dHRvbnMsIHNpemUsIHNob3dMb2FkaW5nSW5kaWNhdG9yLCBjb250ZW50TWV0aG9kLCBjb250ZW50RGF0YSwgY29udGVudEhlYWRlcnMgfSA9IHsgLi4uZGlhbG9nRGVmYXVsdHMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB3cmFwcGVyLmlubmVySFRNTCA9IGRpYWxvZ1RlbXBsYXRlLnRyaW0oKTtcclxuICAgIGNvbnN0IGRpYWxvZ0VsZW1lbnQgPSB3cmFwcGVyLmZpcnN0Q2hpbGQ7XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIGV2ZW50IG1hbmFnZW1lbnRcclxuICAgIGNvbnN0IGxpZmVjeWNsZVJlc29sdmVycyA9IHt9O1xyXG4gICAgY29uc3QgbGlmZWN5Y2xlRXZlbnRzID0ge307XHJcblxyXG4gICAgLy8gRGVmaW5lIGxpZmVjeWNsZSBwcm9taXNlcyBhcyBwcm9wZXJ0aWVzXHJcbiAgICBbJ29wZW5pbmcnLCAnb3BlbmVkJywgJ2Nsb3NpbmcnLCAnY2xvc2VkJywgJ2NvbnRlbnRMb2FkaW5nJywgJ2NvbnRlbnRMb2FkZWQnXS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgIGxpZmVjeWNsZUV2ZW50c1tldmVudF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgIGlmIChsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdKSB7XHJcbiAgICAgICAgICAgIGxpZmVjeWNsZVJlc29sdmVyc1tldmVudF0oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIHJlc29sdmVyIGZvdW5kIGZvciBsaWZlY3ljbGUgZXZlbnQ6ICR7ZXZlbnR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2cgPSB7XHJcbiAgICAgICAgZWxlbWVudDogZGlhbG9nRWxlbWVudCxcclxuICAgICAgICBidXR0b25zOiB7fSxcclxuICAgICAgICBpc0Nsb3NlZDogZmFsc2UsXHJcbiAgICAgICAgbGlmZWN5Y2xlOiBsaWZlY3ljbGVFdmVudHMsIC8vIExpZmVjeWNsZSBwcm9taXNlcyBkaXJlY3RseSBleHBvc2VkIGhlcmVcclxuICAgICAgICBkaXNhYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW5hYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9wZW46IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmluZycpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5vcGVuaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIElmIGxvYWRpbmcgaW5kaWNhdG9yIGlzIGVuYWJsZWQgYW5kIHdlJ3JlIGZldGNoaW5nIGNvbnRlbnQsIHNob3cgZGlhbG9nIGZpcnN0XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0xvYWRpbmdJbmRpY2F0b3IgJiYgY29udGVudFVSSSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBkaWFsb2cgdG8gdGhlIERPTSBhbmQgZGlzcGxheSBpdCBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBsb2FkaW5nIGluZGljYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWR5bmFtaWMtY29udGVudFwiKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3JcIj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExvYWQgY29udGVudCBhZnRlciBkaWFsb2cgaXMgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZldGNoQW5kSW5zZXJ0Q29udGVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiBsb2FkIGNvbnRlbnQgZmlyc3QsIHRoZW4gc2hvdyBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaEFuZEluc2VydENvbnRlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZGlhbG9nIHRvIHRoZSBET00gYW5kIGRpc3BsYXkgaXRcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmVkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLm9wZW5lZDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9wZW5pbmcgZGlhbG9nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zaW5nJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNsb3Npbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbmQgcmVtb3ZlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgY2xvc2VEaWFsb2dBbmRDbGVhbnVwKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY2xvc2VkO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGRpYWxvZyBjbG9zaW5nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjbG9zZURpYWxvZ0FuZENsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGRpYWxvZy5pc0Nsb3NlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBkaWFsb2cuaXNDbG9zZWQgPSB0cnVlO1xyXG4gICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRpYWxvZ0VsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzZXREaWFsb2dTaXplID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnQgPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1jb250ZW50XCIpO1xyXG4gICAgICAgIGNvbnN0IHNpemVzID0ge1xyXG4gICAgICAgICAgICBzbWFsbDogeyB3aWR0aDogJzMwMHB4JywgaGVpZ2h0OiAnMjAwcHgnIH0sXHJcbiAgICAgICAgICAgIG1lZGl1bTogeyB3aWR0aDogJzUwMHB4JywgaGVpZ2h0OiAnNDAwcHgnIH0sXHJcbiAgICAgICAgICAgIGxhcmdlOiB7IHdpZHRoOiAnODAwcHgnLCBoZWlnaHQ6ICc2MDBweCcgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChzaXplID09PSAnYXV0bycpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gc2l6ZXNbc2l6ZV0gfHwgKHR5cGVvZiBzaXplID09PSAnb2JqZWN0JyAmJiBzaXplKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRTaXplKSB7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbnRlbnQuc3R5bGUubWluV2lkdGggPSBzZWxlY3RlZFNpemUud2lkdGggfHwgJzUwMHB4JztcclxuICAgICAgICAgICAgZGlhbG9nQ29udGVudC5zdHlsZS5taW5IZWlnaHQgPSBzZWxlY3RlZFNpemUuaGVpZ2h0IHx8ICc0MDBweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhZGRCdXR0b25zID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXJcIik7XHJcblxyXG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoeyBrZXksIGxhYmVsLCBvcmRlciA9IDAsIGFsaWduID0gJ2ZsZXgtZW5kJywgY2xvc2VPbkNsaWNrID0gdHJ1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24nKTtcclxuICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gbGFiZWw7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5vcmRlciA9IG9yZGVyO1xyXG4gICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWtleScsIGtleSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYnV0dG9uIGNvbnRleHQgd2l0aCBkaXNhYmxlL2VuYWJsZSBtZXRob2RzXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRleHQgPSB7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlbmFibGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBidXR0b25cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbG9zZU9uQ2xpY2spIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBhcyBhIG9uZS10aW1lIFByb21pc2VcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENsaWNrUmVzb2x2ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsaWNrUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RDbGlja1Jlc29sdmVkICYmICFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2xpY2tSZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGlhbG9nLCBidXR0b246IGJ1dHRvbkNvbnRleHQgfSk7IC8vIFBhc3MgYm90aCBkaWFsb2cgYW5kIGJ1dHRvbiBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTsgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcHJvbWlzZSBmb3IgY2hhaW5pbmcgd2l0aCBgLnRoZW5gXHJcbiAgICAgICAgICAgICAgICBkaWFsb2cuYnV0dG9uc1trZXldID0gZmlyc3RDbGlja1Byb21pc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYXMgYSByZXBlYXRlZCBldmVudCBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlcnMgPSBbXTsgLy8gU3RvcmUgaGFuZGxlcnMgZm9yIGAudGhlbigpYFxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWNrUHJvbWlzZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGVuOiAoY2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChjYWxsYmFjayk7IC8vIEFkZCB0byBoYW5kbGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGlja1Byb21pc2U7IC8vIEFsbG93IGNoYWluaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcih7IGRpYWxvZywgYnV0dG9uOiBidXR0b25Db250ZXh0IH0pKTsgLy8gUGFzcyBib3RoIGRpYWxvZyBhbmQgYnV0dG9uIGNvbnRleHRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGRpYWxvZy5idXR0b25zW2tleV0gPSBjbGlja1Byb21pc2U7IC8vIEFzc2lnbiB0aGUgXCJmYWtlXCIgcHJvbWlzZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gYWxpZ247XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGZldGNoQW5kSW5zZXJ0Q29udGVudCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ3dhaXQnO1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb250ZW50ID0gZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY29udGVudExvYWRpbmcnKTtcclxuICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5jb250ZW50TG9hZGluZztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudFVSSVxyXG4gICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaENvbnRlbnQoY29udGVudFVSSSlcclxuICAgICAgICAgICAgICAgIDogY29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGR5bmFtaWNDb250ZW50LmlubmVySFRNTCA9IGNvbnRlbnRIdG1sO1xyXG5cclxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjb250ZW50TG9hZGVkJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY29udGVudExvYWRlZDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNvbnRlbnQ6JywgZXJyb3IpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gb3JpZ2luYWxDdXJzb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBmZXRjaENvbnRlbnQgPSBhc3luYyAodXJpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKGNvbnRlbnRNZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgIC8vIEFsd2F5cyBhbGxvdyBjdXN0b20gaGVhZGVyczsgd2Ugb25seSBhZGQgQ29udGVudC1UeXBlIHdoZW4gd2UgY2FuIGluZmVyIGl0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHsgLi4uKGNvbnRlbnRIZWFkZXJzIHx8IHt9KSB9O1xyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29tZSgoaykgPT4gay50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJ1aWxkIFJlcXVlc3RJbml0IGRlcGVuZGluZyBvbiBtZXRob2QgYW5kIGNvbnRlbnREYXRhIHR5cGUuXHJcbiAgICAgICAgICogV2UgYXZvaWQgc2V0dGluZyBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhIGFuZCByYXcgc3RyaW5nL0Jsb2IgcGF5bG9hZHMsXHJcbiAgICAgICAgICogdW5sZXNzIHRoZSBjYWxsZXIgZXhwbGljaXRseSBwcm92aWRlZCBpdCB2aWEgY29udGVudEhlYWRlcnMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaW5pdCA9IHsgbWV0aG9kIH07XHJcblxyXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdQT1NUJykge1xyXG4gICAgICAgICAgICBsZXQgYm9keSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRm9ybURhdGEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGNvbnRlbnREYXRhIGluc3RhbmNlb2YgRm9ybURhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGVudERhdGEgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQmxvYiA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZW50RGF0YSBpbnN0YW5jZW9mIEJsb2I7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIGNvbnRlbnREYXRhID09PSAnc3RyaW5nJztcclxuICAgICAgICAgICAgY29uc3QgaXNQbGFpbk9iamVjdCA9IGNvbnRlbnREYXRhICYmIHR5cGVvZiBjb250ZW50RGF0YSA9PT0gJ29iamVjdCcgJiYgIWlzRm9ybURhdGEgJiYgIWlzVVJMU2VhcmNoUGFyYW1zICYmICFpc0Jsb2I7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNGb3JtRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNldCBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhOyBicm93c2VyIHdpbGwgc2V0IHRoZSBib3VuZGFyeVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVVJMU2VhcmNoUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gY29udGVudERhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KGNvbnRlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFR5cGUpIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nIHx8IGlzQmxvYikge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudC1UeXBlIGxlZnQgdG8gY2FsbGVyIGlmIG5lZWRlZFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnREYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB0cnkgc2VuZCBhcy1pc1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBib2R5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmksIGluaXQpO1xyXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbnRlbnQ6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGRpYWxvZ1xyXG4gICAgc2V0RGlhbG9nU2l6ZSgpO1xyXG4gICAgYWRkQnV0dG9ucygpO1xyXG5cclxuICAgIC8vIFNldCB0aXRsZSBhbmQgY2xvc2UgYnV0dG9uIGhhbmRsZXJcclxuICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLXRpdGxlXCIpLnRleHRDb250ZW50ID0gdGl0bGU7XHJcbiAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtY2xvc2UtZGlhbG9nJykub25jbGljayA9IGRpYWxvZy5jbG9zZTtcclxuXHJcbiAgICByZXR1cm4gZGlhbG9nO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRGlhbG9nO1xyXG4iLCJsZXQgY291bnRlciA9IDA7XHJcbmNvbnN0IGRvQ2FsbGJhY2tzID0ge307XHJcbmNvbnN0IHRpbWVvdXRzID0ge307XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbGVtZW50cyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGRvIG1ldGhvZCB0byBhZGQgY2FsbGJhY2sgZnVuY3Rpb25zLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gVGhlIGFweCBvYmplY3QgdG8gYXVnbWVudCB3aXRoIHRoZSBsaXN0ZW4gZnVuY3Rpb24uXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIGF1Z21lbnRlZCBhcHggb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgbGV0IGVsZW1lbnRzID0gYXB4LmVsZW1lbnRzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkbyBtZXRob2QgdG8gYWRkIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yIChlLmcuICdjbGljaycsICdrZXlkb3duJywgZXRjLikuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSAtIFRoZSBDU1Mgc2VsZWN0b3IgdG8gdXNlIGZvciBldmVudCBkZWxlZ2F0aW9uIChvcHRpb25hbCkuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGEgZG8gbWV0aG9kIHRvIGFkZCBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICogICBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQhJywgZXZlbnQudGFyZ2V0KTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBhcHgubGlzdGVuID0gZnVuY3Rpb24gKGV2ZW50VHlwZXMsIHNlY29uZEFyZ3VtZW50LCB0aGlyZEFyZ3VtZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdG9yO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBzZWxlY3RvciBvciBvcHRpb25zXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzZWNvbmRBcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWNvbmRBcmd1bWVudDtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXJkQXJndW1lbnQgfHwge307XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHNlY29uZEFyZ3VtZW50IHx8IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgdGltZW91dER1cmF0aW9uID0gb3B0aW9ucy50aW1lb3V0IHx8IDA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50VHlwZXMpKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZXMgPSBbZXZlbnRUeXBlc107IC8vIEVuc3VyZSBldmVudFR5cGVzIGlzIGFuIGFycmF5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGV2ZW50VHlwZXMuZm9yRWFjaCgoZXZlbnRUeXBlKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgZG9DYWxsYmFja3Mgb2JqZWN0IGZvciB0aGUgY3VycmVudCBldmVudCBsaXN0ZW5lci5cclxuICAgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9DYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cclxuICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH0gLSBSZXR1cm5zIHRoZSBjdXJyZW50IG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxscy5cclxuICAgICAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgKiAgIGNvbnNvbGUubG9nKCdCdXR0b24gY2xpY2tlZCEnLCBldmVudC50YXJnZXQpO1xyXG4gICAgICAgICAgICAgKiB9KS5kbygoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICogICBjb25zb2xlLmxvZygnQW5vdGhlciBjYWxsYmFjayBmdW5jdGlvbiEnKTtcclxuICAgICAgICAgICAgICogfSk7XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBkbzogZnVuY3Rpb24gKGRvQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICghZG9DYWxsYmFja3NbdW5pcXVlSWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkb0NhbGxiYWNrc1t1bmlxdWVJZF0ucHVzaChkb0NhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxsc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFudWFsbHkgdHJpZ2dlcnMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUgb24gYWxsIGVsZW1lbnRzIG9yIGNyZWF0ZXMgYSBuZXcgZXZlbnQgaWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gdHJpZ2dlci4gVGhpcyBjYW4gYmUgYW4gZXZlbnQgdHlwZSBzdHJpbmcgKGxpa2UgJ2NsaWNrJykgb3IgYW4gYWN0dWFsIEV2ZW50IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXB4LnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICBsZXQgZXZlbnRUeXBlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50O1xyXG4gICAgICAgICAgICBldmVudCA9IG5ldyBFdmVudChldmVudCwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xyXG4gICAgICAgICAgICBldmVudFR5cGUgPSBldmVudC50eXBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZXZlbnQgdHlwZSBwcm92aWRlZCB0byBhcHgudHJpZ2dlci4gSXQgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgRXZlbnQgb2JqZWN0LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOyAgLy8gVGhpcyB3aWxsIGFsbG93IHRoZSBldmVudCB0byBidWJibGUgdXAgbmF0dXJhbGx5LlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgZXZlbnQgZGVsZWdhdGlvbiBtYW51YWxseSBieSBleGVjdXRpbmcgY2FsbGJhY2tzIGlmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3JcclxuICAgICAgICBPYmplY3Qua2V5cyhkb0NhbGxiYWNrcykuZm9yRWFjaCgodW5pcXVlSWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tEZXRhaWxzID0gZG9DYWxsYmFja3NbdW5pcXVlSWRdO1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tEZXRhaWxzICYmIGNhbGxiYWNrRGV0YWlscy5ldmVudFR5cGUgPT09IGV2ZW50VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IHRhcmdldCBtYXRjaGVzIHRoZSBzZWxlY3RvciB1c2VkIGR1cmluZyBsaXN0ZW5lciByZWdpc3RyYXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IGNhbGxiYWNrRGV0YWlscztcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0b3IgfHwgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrcyhldmVudCwgdW5pcXVlSWQsIDAsIHNlbGVjdG9yLCBldmVudC50YXJnZXQpOyAgLy8gSW1tZWRpYXRlIGV4ZWN1dGlvbiwgbm8gdGltZW91dFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59O1xyXG5cclxuXHJcbmZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yID0gJycsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRFbGVtZW50ID0gc2VsZWN0b3IgPyBjbG9zZXN0KGV2ZW50LnRhcmdldCwgc2VsZWN0b3IpIDogZWxlbWVudDtcclxuICAgIGlmICghbWF0Y2hlZEVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIHRpbWVvdXQgZm9yIHRoaXMgdW5pcXVlSWQgdG8gcHJldmVudCB1bmludGVuZGVkIGJlaGF2aW9yXHJcbiAgICBjbGVhclRpbWVvdXQodGltZW91dHNbdW5pcXVlSWRdKTtcclxuXHJcbiAgICAvLyBGdW5jdGlvbiB0byBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBvZiBjYWxsYmFja3NcclxuICAgIGZ1bmN0aW9uIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCkge1xyXG4gICAgICAgIGlmIChkb0NhbGxiYWNrc1t1bmlxdWVJZF0pIHtcclxuICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdLnJlZHVjZSgocHJldlByb21pc2UsIGRvQ2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2UHJvbWlzZS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZG9DYWxsYmFjay5iaW5kKG1hdGNoZWRFbGVtZW50KShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goKCkgPT4ge30pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aW1lb3V0RHVyYXRpb24gaXMgemVybyB0byBkZWNpZGUgd2hldGhlciB0byBkZWxheSB0aGUgY2FsbGJhY2sgZXhlY3V0aW9uIG9yIG5vdFxyXG4gICAgaWYgKHRpbWVvdXREdXJhdGlvbiA9PT0gMCkge1xyXG4gICAgICAgIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRpbWVvdXRzW3VuaXF1ZUlkXSA9IHNldFRpbWVvdXQoaGFuZGxlQ2FsbGJhY2tFeGVjdXRpb24sIHRpbWVvdXREdXJhdGlvbik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZVVuaXF1ZUlkKCkge1xyXG4gICAgY29uc3QgcmFuZG9tUGFydCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTsgLy8gTW9yZSByYW5kb21uZXNzXHJcbiAgICBjb25zdCB1bmlxdWVJZCA9IGAke0RhdGUubm93KCl9XyR7cmFuZG9tUGFydH1fJHtjb3VudGVyfWA7XHJcbiAgICBjb3VudGVyID0gKGNvdW50ZXIgKyAxKSAlIDEwMDA7IC8vIFJlc2V0IGNvdW50ZXIgdG8gYXZvaWQgb3ZlcmZsb3dcclxuXHJcbiAgICByZXR1cm4gdW5pcXVlSWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb3Nlc3QoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcbiIsImltcG9ydCAnLi9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcyc7XG5pbXBvcnQgeyBnZXRTY3JvbGxiYXJTaXplIH0gZnJvbSAnLi4vdG9vbHMvZ2V0U2Nyb2xsYmFyU2l6ZS5tanMnO1xuXG5jb25zdCBEQVRBX0tFWSA9ICdfYXB4U2Nyb2xsYWJsZVRhYmxlJztcbmNvbnN0IENMQVNTX1RBQkxFID0gJ2FweC1zY3JvbGxhYmxlLXRhYmxlJztcblxuY29uc3QgREVGQVVMVF9NQVhfSEVJR0hUID0gJzIwMHB4JztcbmNvbnN0IERFRkFVTFRfR1VUVEVSX1BYID0gMTc7XG5cbmNvbnN0IFRIUk9UVExFX01TID0gMTY7XG5cbi8qKiBAdHlwZSB7U2V0PEhUTUxUYWJsZUVsZW1lbnQ+fSAqL1xuY29uc3QgZHluYW1pY1RhYmxlcyA9IG5ldyBTZXQoKTtcbi8qKiBAdHlwZSB7TWFwPEVsZW1lbnQsIFNldDxIVE1MVGFibGVFbGVtZW50Pj59ICovXG5jb25zdCBzY3JvbGxTb3VyY2VUb1RhYmxlcyA9IG5ldyBNYXAoKTtcbi8qKiBAdHlwZSB7TWFwPEVsZW1lbnQsIFNldDxIVE1MVGFibGVFbGVtZW50Pj59ICovXG5jb25zdCByZXNpemVTb3VyY2VUb1RhYmxlcyA9IG5ldyBNYXAoKTtcbi8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbmxldCByZXNpemVXaW5kb3dBdHRhY2hlZCA9IGZhbHNlO1xuLyoqIEB0eXBlIHtSZXNpemVPYnNlcnZlcnxudWxsfSAqL1xubGV0IHJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbi8qKiBAdHlwZSB7bnVtYmVyfSAqL1xubGV0IHRocm90dGxlTGFzdCA9IDA7XG4vKiogQHR5cGUge251bWJlcnxudWxsfSAqL1xubGV0IHRocm90dGxlUmFmID0gbnVsbDtcblxuLyoqXG4gKiBTdW0gb2YgY29sc3BhbnMgZm9yIG9uZSByb3cgKGRpcmVjdCB0aC90ZCBjaGlsZHJlbiBvZiB0cikuXG4gKiBAcGFyYW0ge0hUTUxUYWJsZVJvd0VsZW1lbnR9IHRyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBnZXRSb3dDb2x1bW5Db3VudCh0cikge1xuICAgIGxldCBjb2xzID0gMDtcbiAgICB0ci5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0aCwgOnNjb3BlID4gdGQnKS5mb3JFYWNoKChjZWxsKSA9PiB7XG4gICAgICAgIGNvbHMgKz0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nKSwgMTApIHx8IDE7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHM7XG59XG5cbi8qKlxuICogR2V0IG1heGltdW0gY29sdW1uIGNvdW50IGluIGEgc2VjdGlvbiAobWF4IHN1bSBvZiBjb2xzcGFucyBhY3Jvc3MgYWxsIHJvd3MpLlxuICogQHBhcmFtIHtIVE1MVGFibGVTZWN0aW9uRWxlbWVudH0gc2VjdGlvbiAtIHRoZWFkLCB0Ym9keSwgb3IgdGZvb3RcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24oc2VjdGlvbikge1xuICAgIGlmICghc2VjdGlvbikgcmV0dXJuIDA7XG4gICAgY29uc3Qgcm93cyA9IHNlY3Rpb24ucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdHInKTtcbiAgICBsZXQgbWF4Q29scyA9IDA7XG4gICAgcm93cy5mb3JFYWNoKCh0cikgPT4ge1xuICAgICAgICBjb25zdCBzdW0gPSBnZXRSb3dDb2x1bW5Db3VudCh0cik7XG4gICAgICAgIGlmIChzdW0gPiBtYXhDb2xzKSBtYXhDb2xzID0gc3VtO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXhDb2xzO1xufVxuXG4vKipcbiAqIEdldCB0b3RhbCBjb2x1bW4gY291bnQgZm9yIHRoZSB0YWJsZSAobWF4IGFjcm9zcyB0aGVhZCwgdGJvZHksIHRmb290KS5cbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldFRhYmxlQ29sdW1uQ291bnQodGFibGUpIHtcbiAgICBjb25zdCB0aGVhZCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkJyk7XG4gICAgY29uc3QgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xuICAgIGNvbnN0IHRmb290ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGZvb3QnKTtcbiAgICBjb25zdCBjb3VudFRoZWFkID0gdGhlYWQgPyBnZXRDb2x1bW5Db3VudEZyb21TZWN0aW9uKHRoZWFkKSA6IDA7XG4gICAgY29uc3QgY291bnRUYm9keSA9IHRib2R5ID8gZ2V0Q29sdW1uQ291bnRGcm9tU2VjdGlvbih0Ym9keSkgOiAwO1xuICAgIGNvbnN0IGNvdW50VGZvb3QgPSB0Zm9vdCA/IGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24odGZvb3QpIDogMDtcbiAgICByZXR1cm4gTWF0aC5tYXgoY291bnRUaGVhZCwgY291bnRUYm9keSwgY291bnRUZm9vdCwgMSk7XG59XG5cbi8qKlxuICogTWVhc3VyZSBjdXJyZW50IGNvbHVtbiB3aWR0aHMgZnJvbSB0aGUgdGFibGUgaW4gaXRzIG5hdHVyYWwgbGF5b3V0IChiZWZvcmUgYXBwbHlpbmcgc2Nyb2xsYWJsZSBjbGFzcykuXG4gKiBQcmVmZXJzIGEgcm93IHdoZXJlIGVhY2ggY2VsbCBoYXMgY29sc3BhbiAxIHNvIHdlIGdldCBvbmUgd2lkdGggcGVyIGNvbHVtbjsgb3RoZXJ3aXNlIHNwbGl0cyBjZWxsIHdpZHRocyBieSBjb2xzcGFuLlxuICogQHBhcmFtIHtIVE1MVGFibGVFbGVtZW50fSB0YWJsZSAtIHRhYmxlIG5vdCB5ZXQgd2l0aCBzY3JvbGxhYmxlIGNsYXNzXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtQ29sc1xuICogQHJldHVybnMge251bWJlcltdfSBwaXhlbCB3aWR0aHMgcGVyIGNvbHVtblxuICovXG5mdW5jdGlvbiBtZWFzdXJlQ29sdW1uV2lkdGhzKHRhYmxlLCBudW1Db2xzKSB7XG4gICAgY29uc3QgdGhlYWQgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpO1xuICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcbiAgICBjb25zdCBzZWN0aW9ucyA9IFt0aGVhZCwgdGJvZHldLmZpbHRlcihCb29sZWFuKTtcbiAgICAvKiogQHR5cGUge0hUTUxUYWJsZVJvd0VsZW1lbnR8bnVsbH0gKi9cbiAgICBsZXQgYmVzdFJvdyA9IG51bGw7XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRyJyk7XG4gICAgICAgIGZvciAoY29uc3QgdHIgb2Ygcm93cykge1xuICAgICAgICAgICAgY29uc3QgY2VsbHMgPSB0ci5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0aCwgOnNjb3BlID4gdGQnKTtcbiAgICAgICAgICAgIGlmIChnZXRSb3dDb2x1bW5Db3VudCh0cikgIT09IG51bUNvbHMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgYWxsU2luZ2xlID0gQXJyYXkuZnJvbShjZWxscykuZXZlcnkoKGMpID0+IChwYXJzZUludChjLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpLCAxMCkgfHwgMSkgPT09IDEpO1xuICAgICAgICAgICAgaWYgKGFsbFNpbmdsZSAmJiBjZWxscy5sZW5ndGggPT09IG51bUNvbHMpIHtcbiAgICAgICAgICAgICAgICBiZXN0Um93ID0gdHI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWJlc3RSb3cpIGJlc3RSb3cgPSB0cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVzdFJvdyAmJiBBcnJheS5mcm9tKGJlc3RSb3cucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJykpLmV2ZXJ5KChjKSA9PiAocGFyc2VJbnQoYy5nZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nKSwgMTApIHx8IDEpID09PSAxKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoIWJlc3RSb3cpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHdpZHRocyA9IG5ldyBBcnJheShudW1Db2xzKS5maWxsKDApO1xuICAgIGNvbnN0IGNlbGxzID0gYmVzdFJvdy5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0aCwgOnNjb3BlID4gdGQnKTtcbiAgICBsZXQgY29sID0gMDtcbiAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IE1hdGgubWluKHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJyksIDEwKSB8fCAxLCBudW1Db2xzIC0gY29sKTtcbiAgICAgICAgaWYgKHNwYW4gPD0gMCkgYnJlYWs7XG4gICAgICAgIGNvbnN0IHcgPSBjZWxsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICBjb25zdCBwZXJDb2wgPSB3IC8gc3BhbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFuOyBpKyspIHdpZHRoc1tjb2wgKyBpXSA9IHBlckNvbDtcbiAgICAgICAgY29sICs9IHNwYW47XG4gICAgfVxuICAgIGlmIChjb2wgPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBmYWxsYmFjayA9IHdpZHRocy5zb21lKCh3KSA9PiB3ID4gMCkgPyBNYXRoLm1heCg4MCwgLi4ud2lkdGhzLmZpbHRlcigodykgPT4gdyA+IDApKSAvIDIgOiA4MDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvbHM7IGkrKykgaWYgKHdpZHRoc1tpXSA8PSAwKSB3aWR0aHNbaV0gPSBmYWxsYmFjaztcbiAgICByZXR1cm4gd2lkdGhzLnNsaWNlKDAsIG51bUNvbHMpO1xufVxuXG4vKipcbiAqIENvdW50IGRpcmVjdCB0ciBjaGlsZHJlbiBpbiBhIHNlY3Rpb24uXG4gKiBAcGFyYW0ge0hUTUxUYWJsZVNlY3Rpb25FbGVtZW50fSBzZWN0aW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBnZXRSb3dDb3VudChzZWN0aW9uKSB7XG4gICAgaWYgKCFzZWN0aW9uKSByZXR1cm4gMDtcbiAgICByZXR1cm4gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIDJEIGdyaWQgb2Ygb2NjdXBpZWQgc2xvdHMgZm9yIGEgc2VjdGlvbiAoZm9yIHJvd3NwYW4vY29sc3BhbiBwbGFjZW1lbnQpLlxuICogUGxhY2UgZWFjaCBjZWxsIGluIERPTSBvcmRlcjsgcmV0dXJuIGEgbGlzdCBvZiB7IGNlbGwsIHJvdywgY29sLCBjb2xzcGFuLCByb3dzcGFuIH0uXG4gKiBAcGFyYW0ge0hUTUxUYWJsZVNlY3Rpb25FbGVtZW50fSBzZWN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtUm93c1xuICogQHBhcmFtIHtudW1iZXJ9IG51bUNvbHNcbiAqIEByZXR1cm5zIHt7IGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50LCByb3c6IG51bWJlciwgY29sOiBudW1iZXIsIGNvbHNwYW46IG51bWJlciwgcm93c3BhbjogbnVtYmVyIH1bXX1cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUNlbGxQbGFjZW1lbnRzKHNlY3Rpb24sIG51bVJvd3MsIG51bUNvbHMpIHtcbiAgICBpZiAoIXNlY3Rpb24gfHwgbnVtUm93cyA9PT0gMCB8fCBudW1Db2xzID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3Qgb2NjdXBpZWQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBudW1Sb3dzIH0sICgpID0+IEFycmF5KG51bUNvbHMpLmZpbGwoZmFsc2UpKTtcbiAgICBjb25zdCBwbGFjZW1lbnRzID0gW107XG4gICAgY29uc3Qgcm93cyA9IHNlY3Rpb24ucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdHInKTtcblxuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICAgICAgICBjb25zdCB0ciA9IHJvd3Nbcl07XG4gICAgICAgIGNvbnN0IGNlbGxzID0gdHIucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJyk7XG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgY29uc3QgY29sc3BhbiA9IE1hdGgubWluKHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJyksIDEwKSB8fCAxLCBudW1Db2xzKTtcbiAgICAgICAgICAgIGNvbnN0IHJvd3NwYW4gPSBNYXRoLm1pbihwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgncm93c3BhbicpLCAxMCkgfHwgMSwgbnVtUm93cyAtIHIpO1xuICAgICAgICAgICAgbGV0IGNvbCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoY29sIDwgbnVtQ29scykge1xuICAgICAgICAgICAgICAgIGxldCBmcmVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByciA9IHI7IHJyIDwgciArIHJvd3NwYW4gJiYgZnJlZTsgcnIrKykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjYyA9IGNvbDsgY2MgPCBjb2wgKyBjb2xzcGFuICYmIGZyZWU7IGNjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvY2N1cGllZFtycl0/LltjY10pIGZyZWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZnJlZSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgY29sKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sICsgY29sc3BhbiA+IG51bUNvbHMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgcnIgPSByOyByciA8IHIgKyByb3dzcGFuOyBycisrKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2MgPSBjb2w7IGNjIDwgY29sICsgY29sc3BhbjsgY2MrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAob2NjdXBpZWRbcnJdKSBvY2N1cGllZFtycl1bY2NdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwbGFjZW1lbnRzLnB1c2goeyBjZWxsLCByb3c6IHIsIGNvbCwgY29sc3Bhbiwgcm93c3BhbiB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGxhY2VtZW50cztcbn1cblxuLyoqXG4gKiBBcHBseSBncmlkIHBsYWNlbWVudCBzdHlsZXMgdG8gYSBsaXN0IG9mIHBsYWNlbWVudHMgKDEtYmFzZWQgbGluZSBudW1iZXJzIGZvciBDU1MgR3JpZCkuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5UGxhY2VtZW50cyhwbGFjZW1lbnRzKSB7XG4gICAgcGxhY2VtZW50cy5mb3JFYWNoKCh7IGNlbGwsIHJvdywgY29sLCBjb2xzcGFuLCByb3dzcGFuIH0pID0+IHtcbiAgICAgICAgY2VsbC5zdHlsZS5ncmlkUm93ID0gYCR7cm93ICsgMX0gLyBzcGFuICR7cm93c3Bhbn1gO1xuICAgICAgICBjZWxsLnN0eWxlLmdyaWRDb2x1bW4gPSBgJHtjb2wgKyAxfSAvIHNwYW4gJHtjb2xzcGFufWA7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQ2xlYXIgZ3JpZCBwbGFjZW1lbnQgc3R5bGVzIGZyb20gYWxsIHRoL3RkIGluIGEgdGFibGUgKGZvciByZWZyZXNoKS5cbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJQbGFjZW1lbnRzKHRhYmxlKSB7XG4gICAgdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGgsIHRkJykuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICBjZWxsLnN0eWxlLmdyaWRSb3cgPSAnJztcbiAgICAgICAgY2VsbC5zdHlsZS5ncmlkQ29sdW1uID0gJyc7XG4gICAgfSk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGhlaWdodC9tYXhIZWlnaHQgb3B0aW9uIHRvIGEgQ1NTIGxlbmd0aCBzdHJpbmcuXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVIZWlnaHQodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIERFRkFVTFRfTUFYX0hFSUdIVDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIGAke3ZhbHVlfXB4YDtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGN1cnJlbnQgYm9keSBoZWlnaHQgZnJvbSBvcHRpb25zOiBlaXRoZXIgYm9keUhlaWdodER5bmFtaWMuZ2V0KHRhYmxlKSBvciBzdGF0aWMgaGVpZ2h0L21heEhlaWdodC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnMgKG1heSBpbmNsdWRlIGJvZHlIZWlnaHREeW5hbWljLCBoZWlnaHQsIG1heEhlaWdodClcbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcbiAqIEByZXR1cm5zIHt7IGJvZHlTaXplOiBzdHJpbmcsIHVzZUZpeGVkSGVpZ2h0OiBib29sZWFuIH19XG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVCb2R5SGVpZ2h0KG9wdGlvbnMsIHRhYmxlKSB7XG4gICAgY29uc3QgZHluID0gb3B0aW9ucy5ib2R5SGVpZ2h0RHluYW1pYztcbiAgICBpZiAoZHluICYmIHR5cGVvZiBkeW4uZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZHluLmdldCh0YWJsZSk7XG4gICAgICAgIGNvbnN0IGJvZHlTaXplID0gbm9ybWFsaXplSGVpZ2h0KHZhbHVlKTtcbiAgICAgICAgY29uc3QgdXNlRml4ZWRIZWlnaHQgPSBkeW4udXNlQXMgPT09ICdoZWlnaHQnO1xuICAgICAgICByZXR1cm4geyBib2R5U2l6ZSwgdXNlRml4ZWRIZWlnaHQgfTtcbiAgICB9XG4gICAgY29uc3QgdXNlRml4ZWRIZWlnaHQgPSBvcHRpb25zLmhlaWdodCAhPSBudWxsO1xuICAgIGNvbnN0IHJhdyA9IHVzZUZpeGVkSGVpZ2h0ID8gb3B0aW9ucy5oZWlnaHQgOiBvcHRpb25zLm1heEhlaWdodDtcbiAgICBjb25zdCBib2R5U2l6ZSA9IG5vcm1hbGl6ZUhlaWdodChyYXcpO1xuICAgIHJldHVybiB7IGJvZHlTaXplLCB1c2VGaXhlZEhlaWdodCB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZSBvbmx5IHRoZSB0Ym9keSBoZWlnaHQgQ1NTIHZhcmlhYmxlIGFuZCBjbGFzcyAodXNlZCBvbiBzY3JvbGwvcmVzaXplIGZvciBkeW5hbWljIGhlaWdodCkuXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGZ1bGwgc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnMgKHdpdGggcmVmLm9wdGlvbnMgd2hlbiBjYWxsZWQgZnJvbSB0aHJvdHRsZSlcbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFibGVCb2R5SGVpZ2h0KHRhYmxlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBib2R5U2l6ZSwgdXNlRml4ZWRIZWlnaHQgfSA9IHJlc29sdmVCb2R5SGVpZ2h0KG9wdGlvbnMsIHRhYmxlKTtcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQnLCBib2R5U2l6ZSk7XG4gICAgdGFibGUuY2xhc3NMaXN0LnRvZ2dsZSgnYXB4LXNjcm9sbGFibGUtdGFibGUtLWJvZHktaGVpZ2h0JywgdXNlRml4ZWRIZWlnaHQpO1xufVxuXG4vKipcbiAqIFJ1biBsYXp5IGNsZWFudXAgdGhlbiB1cGRhdGVUYWJsZUJvZHlIZWlnaHQgZm9yIGFsbCB0YWJsZXMgc3RpbGwgaW4gZHluYW1pY1RhYmxlcy4gKENhbGxlZCBieSB0aHJvdHRsZWQgZW50cnkgcG9pbnQgb3IgUkFGLilcbiAqL1xuZnVuY3Rpb24gZmx1c2hEeW5hbWljSGVpZ2h0VXBkYXRlKCkge1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XG4gICAgZHluYW1pY1RhYmxlcy5mb3JFYWNoKCh0YWJsZSkgPT4ge1xuICAgICAgICBpZiAoIXRhYmxlLmlzQ29ubmVjdGVkKSB0b1JlbW92ZS5wdXNoKHRhYmxlKTtcbiAgICB9KTtcbiAgICB0b1JlbW92ZS5mb3JFYWNoKCh0YWJsZSkgPT4gcmVtb3ZlVGFibGVGcm9tRHluYW1pY1NvdXJjZXModGFibGUpKTtcbiAgICBkeW5hbWljVGFibGVzLmZvckVhY2goKHRhYmxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHRhYmxlW0RBVEFfS0VZXTtcbiAgICAgICAgaWYgKHJlZj8ub3B0aW9ucykgdXBkYXRlVGFibGVCb2R5SGVpZ2h0KHRhYmxlLCByZWYub3B0aW9ucyk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogVGhyb3R0bGVkIGVudHJ5OiBydW4gZmx1c2hEeW5hbWljSGVpZ2h0VXBkYXRlIG5vdyBvciBzY2hlZHVsZSB3aXRoIFJBRi5cbiAqL1xuZnVuY3Rpb24gcnVuRHluYW1pY0hlaWdodFVwZGF0ZSgpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmIChub3cgLSB0aHJvdHRsZUxhc3QgPCBUSFJPVFRMRV9NUykge1xuICAgICAgICBpZiAoIXRocm90dGxlUmFmKSB7XG4gICAgICAgICAgICB0aHJvdHRsZVJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3R0bGVSYWYgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRocm90dGxlTGFzdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgZmx1c2hEeW5hbWljSGVpZ2h0VXBkYXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm90dGxlTGFzdCA9IG5vdztcbiAgICBmbHVzaER5bmFtaWNIZWlnaHRVcGRhdGUoKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHVwZGF0ZU9uIGludG8gc2Nyb2xsIHRhcmdldHMgKEVsZW1lbnRbXSkgYW5kIHJlc2l6ZTogeyB3aW5kb3c6IGJvb2xlYW4sIGVsZW1lbnRzOiBFbGVtZW50W10gfS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucy5ib2R5SGVpZ2h0RHluYW1pYy51cGRhdGVPblxuICogQHJldHVybnMge3sgc2Nyb2xsVGFyZ2V0czogRWxlbWVudFtdLCByZXNpemVXaW5kb3c6IGJvb2xlYW4sIHJlc2l6ZUVsZW1lbnRzOiBFbGVtZW50W10gfX1cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVwZGF0ZU9uKG9wdGlvbnMpIHtcbiAgICBjb25zdCB1ID0gb3B0aW9ucz8uYm9keUhlaWdodER5bmFtaWM/LnVwZGF0ZU9uO1xuICAgIGNvbnN0IHNjcm9sbE9uID0gdT8uc2Nyb2xsT247XG4gICAgY29uc3QgcmVzaXplT24gPSB1Py5yZXNpemVPbjtcbiAgICBjb25zdCBzY3JvbGxUYXJnZXRzID0gW107XG4gICAgaWYgKHNjcm9sbE9uICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShzY3JvbGxPbikgJiYgc2Nyb2xsT24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzY3JvbGxPbi5mb3JFYWNoKCh4KSA9PiB7XG4gICAgICAgICAgICBpZiAoeCA9PT0gJ2RvY3VtZW50Jykgc2Nyb2xsVGFyZ2V0cy5wdXNoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgICBlbHNlIGlmICh4ICYmIHR5cGVvZiB4LmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHNjcm9sbFRhcmdldHMucHVzaCh4KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh1Py5zY3JvbGwgPT09IHRydWUpIHtcbiAgICAgICAgc2Nyb2xsVGFyZ2V0cy5wdXNoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIHNjcm9sbFRhcmdldHMucHVzaCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICAgIGxldCByZXNpemVXaW5kb3cgPSBmYWxzZTtcbiAgICBjb25zdCByZXNpemVFbGVtZW50cyA9IFtdO1xuICAgIGlmIChyZXNpemVPbiAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkocmVzaXplT24pICYmIHJlc2l6ZU9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzaXplT24uZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICAgICAgaWYgKHggPT09ICd3aW5kb3cnKSByZXNpemVXaW5kb3cgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoeCAmJiB0eXBlb2YgeC5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXNpemVFbGVtZW50cy5wdXNoKHgpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHU/LnJlc2l6ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmVzaXplV2luZG93ID0gdHJ1ZTtcbiAgICAgICAgcmVzaXplRWxlbWVudHMucHVzaChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4geyBzY3JvbGxUYXJnZXRzLCByZXNpemVXaW5kb3csIHJlc2l6ZUVsZW1lbnRzIH07XG59XG5cbi8qKlxuICogUmVtb3ZlIHRhYmxlIGZyb20gZHluYW1pY1RhYmxlcyBhbmQgZnJvbSBhbGwgc2Nyb2xsL3Jlc2l6ZSBNYXBzOyBkZXRhY2ggbGlzdGVuZXJzIGlmIFNldCBiZWNvbWVzIGVtcHR5LlxuICogQHBhcmFtIHtIVE1MVGFibGVFbGVtZW50fSB0YWJsZVxuICovXG5mdW5jdGlvbiByZW1vdmVUYWJsZUZyb21EeW5hbWljU291cmNlcyh0YWJsZSkge1xuICAgIGR5bmFtaWNUYWJsZXMuZGVsZXRlKHRhYmxlKTtcbiAgICBzY3JvbGxTb3VyY2VUb1RhYmxlcy5mb3JFYWNoKChzZXQsIGVsKSA9PiB7XG4gICAgICAgIHNldC5kZWxldGUodGFibGUpO1xuICAgICAgICBpZiAoc2V0LnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHNjcm9sbFNvdXJjZVRvVGFibGVzLmRlbGV0ZShlbCk7XG4gICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbFRocm90dGxlZCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXNpemVTb3VyY2VUb1RhYmxlcy5mb3JFYWNoKChzZXQsIGVsKSA9PiB7XG4gICAgICAgIHNldC5kZWxldGUodGFibGUpO1xuICAgICAgICBpZiAoc2V0LnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJlc2l6ZVNvdXJjZVRvVGFibGVzLmRlbGV0ZShlbCk7XG4gICAgICAgICAgICBpZiAocmVzaXplT2JzZXJ2ZXIpIHJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZShlbCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocmVzaXplV2luZG93QXR0YWNoZWQgJiYgZHluYW1pY1RhYmxlcy5zaXplID09PSAwKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZVRocm90dGxlZCk7XG4gICAgICAgIHJlc2l6ZVdpbmRvd0F0dGFjaGVkID0gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBvblNjcm9sbFRocm90dGxlZCgpIHtcbiAgICBydW5EeW5hbWljSGVpZ2h0VXBkYXRlKCk7XG59XG5cbmZ1bmN0aW9uIG9uUmVzaXplVGhyb3R0bGVkKCkge1xuICAgIHJ1bkR5bmFtaWNIZWlnaHRVcGRhdGUoKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIHRhYmxlIHdpdGggYm9keUhlaWdodER5bmFtaWM6IGFkZCB0byBTZXQgYW5kIGF0dGFjaCBzY3JvbGwvcmVzaXplIGxpc3RlbmVycyBwZXIgdXBkYXRlT24uXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGZ1bGwgb3B0aW9ucyAocmVmLm9wdGlvbnMpXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyRHluYW1pY1RhYmxlKHRhYmxlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBzY3JvbGxUYXJnZXRzLCByZXNpemVXaW5kb3csIHJlc2l6ZUVsZW1lbnRzIH0gPSByZXNvbHZlVXBkYXRlT24ob3B0aW9ucyk7XG4gICAgZHluYW1pY1RhYmxlcy5hZGQodGFibGUpO1xuICAgIHNjcm9sbFRhcmdldHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgbGV0IHNldCA9IHNjcm9sbFNvdXJjZVRvVGFibGVzLmdldChlbCk7XG4gICAgICAgIGlmICghc2V0KSB7XG4gICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBzY3JvbGxTb3VyY2VUb1RhYmxlcy5zZXQoZWwsIHNldCk7XG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbFRocm90dGxlZCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldC5hZGQodGFibGUpO1xuICAgIH0pO1xuICAgIGlmIChyZXNpemVXaW5kb3cpIHtcbiAgICAgICAgaWYgKCFyZXNpemVXaW5kb3dBdHRhY2hlZCkge1xuICAgICAgICAgICAgcmVzaXplV2luZG93QXR0YWNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplVGhyb3R0bGVkLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVzaXplRWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgbGV0IHNldCA9IHJlc2l6ZVNvdXJjZVRvVGFibGVzLmdldChlbCk7XG4gICAgICAgIGlmICghc2V0KSB7XG4gICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICByZXNpemVTb3VyY2VUb1RhYmxlcy5zZXQoZWwsIHNldCk7XG4gICAgICAgICAgICBpZiAoIXJlc2l6ZU9ic2VydmVyKSByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihvblJlc2l6ZVRocm90dGxlZCk7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsKTtcbiAgICAgICAgfVxuICAgICAgICBzZXQuYWRkKHRhYmxlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCBncmlkLXRlbXBsYXRlLWNvbHVtbnMgZnJvbSBtZWFzdXJlZCB3aWR0aHMgYW5kIG9wdGlvbmFsIG92ZXJyaWRlcyBwZXIgY29sdW1uLlxuICogQHBhcmFtIHtudW1iZXJ9IG51bUNvbHNcbiAqIEBwYXJhbSB7bnVtYmVyW119IGNvbHVtbldpZHRoc1xuICogQHBhcmFtIHtPYmplY3Q8bnVtYmVyLCBzdHJpbmc+fChzdHJpbmd8bnVsbClbXX0gY29sdW1uT3ZlcnJpZGVzIC0gbWFwIGNvbHVtbiBpbmRleCDihpIgQ1NTIHZhbHVlIChlLmcuICcyZnInKSwgb3IgYXJyYXk7IG51bGwvZW1wdHkgPSB1c2UgbWVhc3VyZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdW5pdD0nZnInXSAtIENTUyB1bml0IGZvciBtZWFzdXJlZCB3aWR0aHMgKCdmcicgb3IgJ3B4JylcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkVGVtcGxhdGVDb2x1bW5zKG51bUNvbHMsIGNvbHVtbldpZHRocywgY29sdW1uT3ZlcnJpZGVzLCB1bml0ID0gJ2ZyJykge1xuICAgIGlmICghY29sdW1uV2lkdGhzIHx8IGNvbHVtbldpZHRocy5sZW5ndGggIT09IG51bUNvbHMpIHJldHVybiAnJztcbiAgICBjb25zdCBnZXQgPSAoaSkgPT5cbiAgICAgICAgQXJyYXkuaXNBcnJheShjb2x1bW5PdmVycmlkZXMpID8gY29sdW1uT3ZlcnJpZGVzW2ldIDogY29sdW1uT3ZlcnJpZGVzW2ldO1xuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db2xzOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb3YgPSBnZXQoaSk7XG4gICAgICAgIGlmIChvdiAhPSBudWxsICYmIHR5cGVvZiBvdiA9PT0gJ3N0cmluZycgJiYgb3YudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgcGFydHMucHVzaChvdi50cmltKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFydHMucHVzaChgJHtNYXRoLnJvdW5kKGNvbHVtbldpZHRoc1tpXSl9JHt1bml0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogQnVpbGQgZ3JpZC10ZW1wbGF0ZS1yb3dzIGZyb20gbWVhc3VyZWQgaGVpZ2h0cyBhbmQgb3B0aW9uYWwgb3ZlcnJpZGVzIHBlciByb3cuXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtUm93c1xuICogQHBhcmFtIHtudW1iZXJbXX0gcm93SGVpZ2h0c1xuICogQHBhcmFtIHtPYmplY3Q8bnVtYmVyLCBzdHJpbmc+fChzdHJpbmd8bnVsbClbXX0gcm93T3ZlcnJpZGVzIC0gbWFwIHJvdyBpbmRleCDihpIgQ1NTIHZhbHVlIChlLmcuICc0OHB4JywgJzJmcicpLCBvciBhcnJheTsgbnVsbC9lbXB0eSA9IHVzZSBtZWFzdXJlZFxuICogQHBhcmFtIHtzdHJpbmd9IFt1bml0PSdweCddIC0gQ1NTIHVuaXQgZm9yIG1lYXN1cmVkIGhlaWdodHMgKCdweCcgb3IgJ2ZyJylcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkVGVtcGxhdGVSb3dzKG51bVJvd3MsIHJvd0hlaWdodHMsIHJvd092ZXJyaWRlcywgdW5pdCA9ICdweCcpIHtcbiAgICBpZiAoIXJvd0hlaWdodHMgfHwgcm93SGVpZ2h0cy5sZW5ndGggPCBudW1Sb3dzKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZ2V0ID0gKGkpID0+XG4gICAgICAgIEFycmF5LmlzQXJyYXkocm93T3ZlcnJpZGVzKSA/IHJvd092ZXJyaWRlc1tpXSA6IHJvd092ZXJyaWRlcz8uW2ldO1xuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Sb3dzOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb3YgPSBnZXQoaSk7XG4gICAgICAgIGlmIChvdiAhPSBudWxsICYmIHR5cGVvZiBvdiA9PT0gJ3N0cmluZycgJiYgb3YudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgcGFydHMucHVzaChvdi50cmltKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFydHMucHVzaChgJHtNYXRoLnJvdW5kKHJvd0hlaWdodHNbaV0gPz8gMCl9JHt1bml0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogTWVhc3VyZSBlYWNoIHRyIGhlaWdodCBpbiBhIHNlY3Rpb24gKHRhYmxlIG11c3Qgbm90IHlldCBoYXZlIHNjcm9sbGFibGUgY2xhc3MpLlxuICogQHBhcmFtIHtIVE1MVGFibGVTZWN0aW9uRWxlbWVudHxudWxsfSBzZWN0aW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyW119XG4gKi9cbmZ1bmN0aW9uIG1lYXN1cmVSb3dIZWlnaHRzKHNlY3Rpb24pIHtcbiAgICBpZiAoIXNlY3Rpb24pIHJldHVybiBbXTtcbiAgICBjb25zdCByb3dzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHJvd3MpLm1hcCgodHIpID0+IHRyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG59XG5cbi8qKlxuICogQXBwbHkgc2Nyb2xsYWJsZSB0YWJsZSBsYXlvdXQgdG8gYSBzaW5nbGUgdGFibGUuXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIHNjcm9sbGFibGVUYWJsZSBvcHRpb25zXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IFtvcHRpb25zLm1heEhlaWdodF0gLSBNYXggaGVpZ2h0IG9mIHRib2R5IChkZWZhdWx0ICcyMDBweCcpLiBJZ25vcmVkIHdoZW4gaGVpZ2h0IG9yIGJvZHlIZWlnaHREeW5hbWljIGlzIHNldC5cbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gW29wdGlvbnMuaGVpZ2h0XSAtIEZpeGVkIGhlaWdodCBvZiB0Ym9keS4gSWdub3JlZCB3aGVuIGJvZHlIZWlnaHREeW5hbWljIGlzIHNldC5cbiAqIEBwYXJhbSB7eyBnZXQ6IChmdW5jdGlvbihIVE1MVGFibGVFbGVtZW50KTogbnVtYmVyfHN0cmluZyksIHVzZUFzOiAnaGVpZ2h0J3wnbWF4SGVpZ2h0JywgdXBkYXRlT24/OiB7IHNjcm9sbD86IGJvb2xlYW4sIHJlc2l6ZT86IGJvb2xlYW4sIHNjcm9sbE9uPzogKCdkb2N1bWVudCd8RWxlbWVudClbXSwgcmVzaXplT24/OiAoJ3dpbmRvdyd8RWxlbWVudClbXSB9IH19IFtvcHRpb25zLmJvZHlIZWlnaHREeW5hbWljXSAtIFdoZW4gc2V0LCBib2R5IHNpemUgaXMgY29tcHV0ZWQgYnkgZ2V0KHRhYmxlKSBhbmQgcmUtYXBwbGllZCB3aGVuIHNjcm9sbC9yZXNpemUgc291cmNlcyBmaXJlLiB1cGRhdGVPbjogc2Nyb2xsT24vcmVzaXplT24gbGlzdCBlbGVtZW50cyAoc2VudGluZWxzICdkb2N1bWVudCcvJ3dpbmRvdycpOyBvciB1c2Ugc2Nyb2xsIChkZWZhdWx0IGZhbHNlKSAvIHJlc2l6ZSAoZGVmYXVsdCB0cnVlKSBib29sZWFucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5ncmlkVGVtcGxhdGVDb2x1bW5zXVxuICogQHBhcmFtIHt7IHRoZWFkPzogc3RyaW5nLCB0Ym9keT86IHN0cmluZywgdGZvb3Q/OiBzdHJpbmcgfX0gW29wdGlvbnMuZ3JpZFRlbXBsYXRlUm93c11cbiAqIEBwYXJhbSB7eyB0aGVhZD86IE9iamVjdDxudW1iZXIsIHN0cmluZz58KHN0cmluZ3xudWxsKVtdLCB0Ym9keT86IE9iamVjdDxudW1iZXIsIHN0cmluZz58KHN0cmluZ3xudWxsKVtdLCB0Zm9vdD86IE9iamVjdDxudW1iZXIsIHN0cmluZz58KHN0cmluZ3xudWxsKVtdIH19IFtvcHRpb25zLnJvd092ZXJyaWRlc11cbiAqIEBwYXJhbSB7T2JqZWN0PG51bWJlciwgc3RyaW5nPnwoc3RyaW5nfG51bGwpW119IFtvcHRpb25zLmNvbHVtbk92ZXJyaWRlc11cbiAqIEBwYXJhbSB7eyBjb2xzPzogc3RyaW5nLCByb3dzPzogc3RyaW5nIH19IFtvcHRpb25zLmRlZmF1bHRTaXppbmdVbml0XSAtIENTUyB1bml0IGZvciBtZWFzdXJlZCB3aWR0aHMvaGVpZ2h0cy4gY29scyBkZWZhdWx0cyB0byAnZnInLCByb3dzIGRlZmF1bHRzIHRvICdweCcuXG4gKiBAcGFyYW0ge3sgY29sdW1uV2lkdGhzPzogbnVtYmVyW10sIHJvd0hlaWdodHM/OiB7IHRoZWFkPzogbnVtYmVyW10sIHRib2R5PzogbnVtYmVyW10sIHRmb290PzogbnVtYmVyW10gfSB9IHwgdW5kZWZpbmVkfSByZWYgLSBleGlzdGluZyByZWYgd2hlbiByZWZyZXNoaW5nXG4gKi9cbmZ1bmN0aW9uIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCBvcHRpb25zLCByZWYpIHtcbiAgICBjb25zdCB0aGVhZCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkJyk7XG4gICAgY29uc3QgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xuICAgIGNvbnN0IHRmb290ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGZvb3QnKTtcblxuICAgIGNvbnN0IG51bUNvbHMgPSBnZXRUYWJsZUNvbHVtbkNvdW50KHRhYmxlKTtcbiAgICBpZiAobnVtQ29scyA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYWxyZWFkeVNjcm9sbGFibGUgPSB0YWJsZS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfVEFCTEUpO1xuICAgIGNvbnN0IGN1c3RvbVRlbXBsYXRlID0gdHlwZW9mIG9wdGlvbnMuZ3JpZFRlbXBsYXRlQ29sdW1ucyA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5ncmlkVGVtcGxhdGVDb2x1bW5zLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IGN1c3RvbVRlbXBsYXRlXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IChyZWY/LmNvbHVtbldpZHRocyA/PyAoYWxyZWFkeVNjcm9sbGFibGUgPyBudWxsIDogbWVhc3VyZUNvbHVtbldpZHRocyh0YWJsZSwgbnVtQ29scykpKTtcblxuICAgIGNvbnN0IHRoZWFkUm93cyA9IGdldFJvd0NvdW50KHRoZWFkKTtcbiAgICBjb25zdCB0Ym9keVJvd3MgPSBnZXRSb3dDb3VudCh0Ym9keSk7XG4gICAgY29uc3QgdGZvb3RSb3dzID0gZ2V0Um93Q291bnQodGZvb3QpO1xuXG4gICAgY29uc3Qgcm93SGVpZ2h0cyA9XG4gICAgICAgIHJlZj8ucm93SGVpZ2h0cyA/P1xuICAgICAgICAoYWxyZWFkeVNjcm9sbGFibGVcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICB0aGVhZDogbWVhc3VyZVJvd0hlaWdodHModGhlYWQpLFxuICAgICAgICAgICAgICAgICAgdGJvZHk6IG1lYXN1cmVSb3dIZWlnaHRzKHRib2R5KSxcbiAgICAgICAgICAgICAgICAgIHRmb290OiBtZWFzdXJlUm93SGVpZ2h0cyh0Zm9vdClcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS1jb2xzJywgU3RyaW5nKG51bUNvbHMpKTtcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzJywgU3RyaW5nKE1hdGgubWF4KDEsIHRoZWFkUm93cykpKTtcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10Ym9keS1yb3dzJywgU3RyaW5nKE1hdGgubWF4KDEsIHRib2R5Um93cykpKTtcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10Zm9vdC1yb3dzJywgU3RyaW5nKE1hdGgubWF4KDEsIHRmb290Um93cykpKTtcbiAgICBjb25zdCB7IGJvZHlTaXplLCB1c2VGaXhlZEhlaWdodCB9ID0gcmVzb2x2ZUJvZHlIZWlnaHQob3B0aW9ucywgdGFibGUpO1xuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCcsIGJvZHlTaXplKTtcbiAgICB0YWJsZS5jbGFzc0xpc3QudG9nZ2xlKCdhcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQnLCB1c2VGaXhlZEhlaWdodCk7XG5cbiAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKENMQVNTX1RBQkxFKTtcbiAgICB0YWJsZS5jbGFzc0xpc3QudG9nZ2xlKCdhcHgtc2Nyb2xsYWJsZS10YWJsZS0taGFzLXRmb290JywgISEodGZvb3QgJiYgdGZvb3RSb3dzID4gMCkpO1xuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1uby10aGVhZCcsICEodGhlYWQgJiYgdGhlYWRSb3dzID4gMCkpO1xuXG4gICAgLy8gRm9yY2UgcmVmbG93IHNvIHRoZSBncmlkIGxheW91dCBpcyBlc3RhYmxpc2hlZCBiZWZvcmUgc2V0dGluZyBtZWFzdXJlZCB0ZW1wbGF0ZS1jb2x1bW5zLlxuICAgIC8vIFdpdGhvdXQgdGhpcywgdGhlIGJyb3dzZXIgYmF0Y2hlcyBjbGFzcyArIHRlbXBsYXRlIGludG8gb25lIHBhc3MgYW5kIHRoZSB0Ym9keSBvdmVyZmxvd3MgaG9yaXpvbnRhbGx5LlxuICAgIHRhYmxlLm9mZnNldEhlaWdodDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblxuICAgIGNvbnN0IGNvbFVuaXQgPSBvcHRpb25zLmRlZmF1bHRTaXppbmdVbml0Py5jb2xzIHx8ICdmcic7XG4gICAgY29uc3Qgcm93VW5pdCA9IG9wdGlvbnMuZGVmYXVsdFNpemluZ1VuaXQ/LnJvd3MgfHwgJ3B4JztcblxuICAgIGxldCBndXR0ZXJGYWxsYmFja1B4ID0gREVGQVVMVF9HVVRURVJfUFg7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWVhc3VyZWQgPSBnZXRTY3JvbGxiYXJTaXplKCd2ZXJ0aWNhbCcpO1xuICAgICAgICBpZiAodHlwZW9mIG1lYXN1cmVkID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUobWVhc3VyZWQpICYmIG1lYXN1cmVkID49IDApIHtcbiAgICAgICAgICAgIGd1dHRlckZhbGxiYWNrUHggPSBtZWFzdXJlZDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgLyogdXNlIERFRkFVTFRfR1VUVEVSX1BYICovXG4gICAgfVxuICAgIGNvbnN0IGd1dHRlclN1ZmZpeCA9IGAgbWlubWF4KHZhcigtLWFweC1zY3JvbGxhYmxlLWd1dHRlci13aWR0aCwgJHtndXR0ZXJGYWxsYmFja1B4fXB4KSwgdmFyKC0tYXB4LXNjcm9sbGFibGUtZ3V0dGVyLXdpZHRoLCAke2d1dHRlckZhbGxiYWNrUHh9cHgpKWA7XG4gICAgaWYgKGN1c3RvbVRlbXBsYXRlKSB7XG4gICAgICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnMnLCBvcHRpb25zLmdyaWRUZW1wbGF0ZUNvbHVtbnMudHJpbSgpICsgZ3V0dGVyU3VmZml4KTtcbiAgICB9IGVsc2UgaWYgKGNvbHVtbldpZHRocyAmJiBjb2x1bW5XaWR0aHMubGVuZ3RoID09PSBudW1Db2xzKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID1cbiAgICAgICAgICAgIG9wdGlvbnMuY29sdW1uT3ZlcnJpZGVzICE9IG51bGxcbiAgICAgICAgICAgICAgICA/IGJ1aWxkVGVtcGxhdGVDb2x1bW5zKG51bUNvbHMsIGNvbHVtbldpZHRocywgb3B0aW9ucy5jb2x1bW5PdmVycmlkZXMsIGNvbFVuaXQpXG4gICAgICAgICAgICAgICAgOiBjb2x1bW5XaWR0aHMubWFwKCh3KSA9PiBgJHtNYXRoLnJvdW5kKHcpfSR7Y29sVW5pdH1gKS5qb2luKCcgJyk7XG4gICAgICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnMnLCB0ZW1wbGF0ZSArIGd1dHRlclN1ZmZpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFibGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGVtcGxhdGUtY29sdW1ucycpO1xuICAgIH1cblxuICAgIGNsZWFyUGxhY2VtZW50cyh0YWJsZSk7XG5cbiAgICBjb25zdCBzZWN0aW9ucyA9IFtcbiAgICAgICAgeyBzZWN0aW9uOiB0aGVhZCwgcm93czogTWF0aC5tYXgoMSwgdGhlYWRSb3dzKSwgaGVpZ2h0czogcm93SGVpZ2h0cz8udGhlYWQsIGtleTogJ3RoZWFkJyB9LFxuICAgICAgICB7IHNlY3Rpb246IHRib2R5LCByb3dzOiBNYXRoLm1heCgxLCB0Ym9keVJvd3MpLCBoZWlnaHRzOiByb3dIZWlnaHRzPy50Ym9keSwga2V5OiAndGJvZHknIH0sXG4gICAgICAgIHsgc2VjdGlvbjogdGZvb3QsIHJvd3M6IE1hdGgubWF4KDEsIHRmb290Um93cyksIGhlaWdodHM6IHJvd0hlaWdodHM/LnRmb290LCBrZXk6ICd0Zm9vdCcgfVxuICAgIF07XG4gICAgY29uc3QgY3VzdG9tUm93cyA9IG9wdGlvbnMuZ3JpZFRlbXBsYXRlUm93cyAmJiB0eXBlb2Ygb3B0aW9ucy5ncmlkVGVtcGxhdGVSb3dzID09PSAnb2JqZWN0JyA/IG9wdGlvbnMuZ3JpZFRlbXBsYXRlUm93cyA6IG51bGw7XG4gICAgY29uc3Qgcm93T3ZlcnJpZGVzID0gb3B0aW9ucy5yb3dPdmVycmlkZXMgJiYgdHlwZW9mIG9wdGlvbnMucm93T3ZlcnJpZGVzID09PSAnb2JqZWN0JyA/IG9wdGlvbnMucm93T3ZlcnJpZGVzIDogbnVsbDtcbiAgICBzZWN0aW9ucy5mb3JFYWNoKCh7IHNlY3Rpb24sIHJvd3MsIGhlaWdodHMsIGtleSB9KSA9PiB7XG4gICAgICAgIGlmICghc2VjdGlvbikgcmV0dXJuO1xuICAgICAgICBjb25zdCB2YXJOYW1lID0gYC0tYXB4LXNjcm9sbGFibGUtJHtrZXl9LXRlbXBsYXRlLXJvd3NgO1xuICAgICAgICBjb25zdCBjdXN0b20gPSBjdXN0b21Sb3dzPy5ba2V5XTtcbiAgICAgICAgY29uc3Qgb3ZlcnJpZGVzID0gcm93T3ZlcnJpZGVzPy5ba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBjdXN0b20gPT09ICdzdHJpbmcnICYmIGN1c3RvbS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2VjdGlvbi5zdHlsZS5zZXRQcm9wZXJ0eSh2YXJOYW1lLCBjdXN0b20udHJpbSgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChoZWlnaHRzICYmIGhlaWdodHMubGVuZ3RoID49IHJvd3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID1cbiAgICAgICAgICAgICAgICBvdmVycmlkZXMgIT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICA/IGJ1aWxkVGVtcGxhdGVSb3dzKHJvd3MsIGhlaWdodHMuc2xpY2UoMCwgcm93cyksIG92ZXJyaWRlcywgcm93VW5pdClcbiAgICAgICAgICAgICAgICAgICAgOiBoZWlnaHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCByb3dzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChoKSA9PiBgJHtNYXRoLnJvdW5kKGgpfSR7cm93VW5pdH1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICAgICAgc2VjdGlvbi5zdHlsZS5zZXRQcm9wZXJ0eSh2YXJOYW1lLCB0ZW1wbGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWN0aW9uLnN0eWxlLnJlbW92ZVByb3BlcnR5KHZhck5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBsYWNlbWVudHMgPSBjb21wdXRlQ2VsbFBsYWNlbWVudHMoc2VjdGlvbiwgcm93cywgbnVtQ29scyk7XG4gICAgICAgIGFwcGx5UGxhY2VtZW50cyhwbGFjZW1lbnRzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvbHVtbldpZHRocywgcm93SGVpZ2h0cyB9O1xufVxuXG4vKipcbiAqIEF1Z21lbnRzIHRoZSBBUFggb2JqZWN0IHdpdGggc2Nyb2xsYWJsZVRhYmxlKG9wdGlvbnMgfCAncmVmcmVzaCcpLlxuICogTWFrZXMgdGhlIHRib2R5IG9mIGEgdGFibGUgc2Nyb2xsYWJsZSB3aGlsZSBrZWVwaW5nIHRoZWFkL3Rmb290IGZpeGVkIGFuZCBjb2x1bW5zIGFsaWduZWQgKENTUyBHcmlkICsgc3ViZ3JpZCkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFweCAtIFRoZSBBUFggb2JqZWN0IHRvIGF1Z21lbnQuXG4gKiBAZXhhbXBsZVxuICogQVBYKCd0YWJsZS5kYXRhLWdyaWQnKS5zY3JvbGxhYmxlVGFibGUoeyBtYXhIZWlnaHQ6IDMwMCB9KTtcbiAqIEFQWCgndGFibGUuZGF0YS1ncmlkJykuc2Nyb2xsYWJsZVRhYmxlKCdyZWZyZXNoJyk7XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGF1Z21lbnRXaXRoU2Nyb2xsYWJsZVRhYmxlKGFweCkge1xuICAgIGFweC5zY3JvbGxhYmxlVGFibGUgPSBmdW5jdGlvbiAob3B0aW9uc09yQWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGlzUmVmcmVzaCA9IG9wdGlvbnNPckFjdGlvbiA9PT0gJ3JlZnJlc2gnO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gaXNSZWZyZXNoID8gbnVsbCA6IChvcHRpb25zT3JBY3Rpb24gJiYgdHlwZW9mIG9wdGlvbnNPckFjdGlvbiA9PT0gJ29iamVjdCcgPyBvcHRpb25zT3JBY3Rpb24gOiB7fSk7XG5cbiAgICAgICAgYXB4LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgIT09ICdUQUJMRScpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gLyoqIEB0eXBlIHtIVE1MVGFibGVFbGVtZW50fSAqLyAoZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHRhYmxlW0RBVEFfS0VZXTtcbiAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCByZWYub3B0aW9ucywgcmVmKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWYub3B0aW9ucyA9IHsgLi4ucmVmLm9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHlTY3JvbGxhYmxlVGFibGUodGFibGUsIHJlZi5vcHRpb25zLCByZWYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5jb2x1bW5XaWR0aHMpIHJlZi5jb2x1bW5XaWR0aHMgPSByZXN1bHQuY29sdW1uV2lkdGhzO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5yb3dIZWlnaHRzKSByZWYucm93SGVpZ2h0cyA9IHJlc3VsdC5yb3dIZWlnaHRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50T3B0aW9ucyA9IHJlZi5vcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50T3B0aW9ucz8uYm9keUhlaWdodER5bmFtaWMpIHJlZ2lzdGVyRHluYW1pY1RhYmxlKHRhYmxlLCBjdXJyZW50T3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgZWxzZSByZW1vdmVUYWJsZUZyb21EeW5hbWljU291cmNlcyh0YWJsZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzUmVmcmVzaCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0FQWCBzY3JvbGxhYmxlVGFibGVdIGNyZWF0ZScsIHRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCBvcHRpb25zLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgdGFibGVbREFUQV9LRVldID0ge1xuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsgLi4ub3B0aW9ucyB9LFxuICAgICAgICAgICAgICAgIGNvbHVtbldpZHRoczogcmVzdWx0Py5jb2x1bW5XaWR0aHMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJvd0hlaWdodHM6IHJlc3VsdD8ucm93SGVpZ2h0cyB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uYm9keUhlaWdodER5bmFtaWMpIHJlZ2lzdGVyRHluYW1pY1RhYmxlKHRhYmxlLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFweDtcbiAgICB9O1xufVxuIiwiLy8gTWluaW1hbCwgZnJhbWV3b3JrLWFnbm9zdGljIFRvYXN0TWFuYWdlciBmb3IgQVBYXHJcbi8vIEVTTS1maXJzdCwgbm8gc2lkZSBlZmZlY3RzIG9uIGltcG9ydC4gRE9NIG9ubHkgd2hlbiB1c2VkLlxyXG5pbXBvcnQgJy4vY3NzL3RvYXN0LmNzcyc7XHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gUG9zaXRpb25PYmplY3RcclxuICogQHByb3BlcnR5IHsnc3RpY2t5J3wncmVsYXRpdmUnfCdhbmNob3JlZCd9IFt0eXBlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3hdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbeV1cclxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gW2VsZW1lbnRdXHJcbiAqIEBwcm9wZXJ0eSB7J3RvcCd8J3JpZ2h0J3wnYm90dG9tJ3wnbGVmdCd8J2Fib3ZlJ3wnYmVsb3cnfCdiZWZvcmUnfCdhZnRlcid9IFtwbGFjZW1lbnRdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZ2FwXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VOYXRpdmVDU1NdXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtzdHJpbmd8UG9zaXRpb25PYmplY3R9IFBvc2l0aW9uXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRvYXN0Q29uZmlnXHJcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IFtwb3NpdGlvbl1cclxuICogQHByb3BlcnR5IHsndXAnfCdkb3duJ3wnYXV0byd9IFtmbG93XSBGbG93IGRpcmVjdGlvbiBmb3Igc3RhY2tpbmcgdG9hc3RzLiAnYXV0bycgZGV0ZXJtaW5lcyBiYXNlZCBvbiBwb3NpdGlvbi4gRGVmYXVsdDogJ2F1dG8nXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4VG9hc3RzXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlZmF1bHREdXJhdGlvbk1zXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3pJbmRleF1cclxuICogQHByb3BlcnR5IHsncG9saXRlJ3wnYXNzZXJ0aXZlJ3wnb2ZmJ30gW2FyaWFMaXZlXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2dhcF1cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVkdXBlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRhaW5lckNsYXNzXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW29mZnNldF1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF1cclxuICogQHByb3BlcnR5IHtib29sZWFufHtlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJ319IFtwcm9ncmVzc10gRGVmYXVsdDogZmFsc2UuIFNob3cgcHJvZ3Jlc3MgYmFyIHdoZW4gdHJ1ZSBvciB7IGVuYWJsZTogdHJ1ZSwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nIH0uXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHt7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbScsIHBhdXNlQnV0dG9uOiBib29sZWFufX0gUHJvZ3Jlc3NPcHRcclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gVG9hc3RPcHRpb25zXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfE5vZGV9IG1lc3NhZ2VcclxuICogQHByb3BlcnR5IHsnaW5mbyd8J3N1Y2Nlc3MnfCd3YXJuaW5nJ3wnZGFuZ2VyJ30gW3R5cGVdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZHVyYXRpb25Nc11cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzbWlzc2libGVdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdXHJcbiAqIEBwcm9wZXJ0eSB7KHJlZjogVG9hc3RSZWYsIGV2OiBNb3VzZUV2ZW50KSA9PiB2b2lkfSBbb25DbGlja11cclxuICogQHByb3BlcnR5IHsocmVmOiBUb2FzdFJlZiwgcmVhc29uOiAndGltZW91dCd8J2Nsb3NlJ3wnYXBpJ3wnb3ZlcmZsb3cnKSA9PiB2b2lkfSBbb25DbG9zZV1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjbGFzc05hbWVdXHJcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IFtwb3NpdGlvbl1cclxuICogQHByb3BlcnR5IHsndXAnfCdkb3duJ3wnYXV0byd9IFtmbG93XSBGbG93IGRpcmVjdGlvbiBmb3Igc3RhY2tpbmcgdG9hc3RzLiAnYXV0bycgZGV0ZXJtaW5lcyBiYXNlZCBvbiBwb3NpdGlvbi4gRGVmYXVsdDogJ2F1dG8nXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbScsIHBhdXNlQnV0dG9uPzogYm9vbGVhbn19IFtwcm9ncmVzc10gU2hvdyBwcm9ncmVzcyBiYXI6IHRydWUgPSB0b3AsIG9yIHsgZW5hYmxlLCBwb3NpdGlvbiwgcGF1c2VCdXR0b24gfSAocGF1c2VCdXR0b24gZGVmYXVsdCBmYWxzZSkuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRvYXN0UmVmXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZFxyXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBlbFxyXG4gKiBAcHJvcGVydHkgeyhyZWFzb24/OiAnYXBpJ3wnY2xvc2UnKSA9PiB2b2lkfSBjbG9zZVxyXG4gKiBAcHJvcGVydHkgeyhwYXJ0aWFsOiBQYXJ0aWFsPFRvYXN0T3B0aW9ucz4pID0+IHZvaWR9IHVwZGF0ZVxyXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IHdoZW5DbG9zZWRcclxuICogQHByb3BlcnR5IHsoZXZlbnQ6ICdjbG9zZSd8J2NsaWNrJywgaGFuZGxlcjogRnVuY3Rpb24pID0+ICgpID0+IHZvaWR9IG9uXHJcbiAqIEBwcm9wZXJ0eSB7KGV2ZW50OiAnY2xvc2UnfCdjbGljaycsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkfSBvZmZcclxuICovXHJcblxyXG5jb25zdCBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xyXG5cclxuLy8gU2hhcmVkIGNvbnRhaW5lciBjYWNoZTogTWFwPHBvc2l0aW9uLCBIVE1MRWxlbWVudD5cclxuLy8gQ29udGFpbmVycyBhcmUgc2hhcmVkIGJldHdlZW4gbWFuYWdlcnMgd2l0aCB0aGUgc2FtZSBwb3NpdGlvblxyXG5jb25zdCBfY29udGFpbmVyQ2FjaGUgPSBuZXcgTWFwKCk7XHJcblxyXG4vLyBHYXJiYWdlIGNvbGxlY3Rpb246IGNsZWFudXAgZW1wdHkgdW5tYW5hZ2VkIGNvbnRhaW5lcnMgYWZ0ZXIgYSBkZWxheVxyXG5jb25zdCBHQ19ERUxBWV9NUyA9IDIwMDAwOyAvLyAyMCBzZWNvbmRzXHJcbmxldCBfZ2NUaW1lb3V0SWQgPSBudWxsO1xyXG5cclxuLy8gV3JhcHBlciBmb3IgYWxsIHRvYXN0IGNvbnRhaW5lcnMgKGtlZXBzIERPTSBjbGVhbilcclxubGV0IF90b2FzdFdyYXBwZXIgPSBudWxsO1xyXG5cclxuLyoqXHJcbiAqIEdldCBvciBjcmVhdGUgdGhlIHRvYXN0IGNvbnRhaW5lcnMgd3JhcHBlclxyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cclxuICovXHJcbmZ1bmN0aW9uIGdldFRvYXN0V3JhcHBlcigpIHtcclxuICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gbnVsbDtcclxuICAgIFxyXG4gICAgaWYgKCFfdG9hc3RXcmFwcGVyKSB7XHJcbiAgICAgICAgX3RvYXN0V3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtdG9hc3Qtd3JhcHBlcicpO1xyXG4gICAgICAgIGlmICghX3RvYXN0V3JhcHBlcikge1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3Qtd3JhcHBlcicpO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUubGVmdCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS53aWR0aCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5oZWlnaHQgPSAnMCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS56SW5kZXggPSAnMTAwMDAnOyAvLyBCZWxvdyBjb250YWluZXJzIGJ1dCBhYm92ZSBtb3N0IGNvbnRlbnRcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChfdG9hc3RXcmFwcGVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBfdG9hc3RXcmFwcGVyO1xyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX0NPTkZJRyA9IHtcclxuICAgIHBvc2l0aW9uOiAnYm90dG9tLXJpZ2h0JyxcclxuICAgIG1heFRvYXN0czogNSxcclxuICAgIGRlZmF1bHREdXJhdGlvbk1zOiA1MDAwLFxyXG4gICAgekluZGV4OiAxMTAwMCxcclxuICAgIGFyaWFMaXZlOiAncG9saXRlJyxcclxuICAgIGdhcDogOCxcclxuICAgIGRlZHVwZTogZmFsc2UsXHJcbiAgICBjb250YWluZXJDbGFzczogJycsXHJcbiAgICBvZmZzZXQ6IDAsXHJcbiAgICBwcm9ncmVzczogZmFsc2VcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW4gZWxlbWVudCB3aXRoIGNsYXNzZXNcclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZUVsKHRhZywgY2xhc3NOYW1lcykge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XHJcbiAgICBpZiAoY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGNsYXNzTmFtZXMuc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChjID0+IGVsLmNsYXNzTGlzdC5hZGQoYykpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVsO1xyXG59XHJcblxyXG4vKiogTWluaW1hbCBsaW5lLWJhc2VkIHBhdXNlICh0d28gYmFycykgLyByZXN1bWUgKHRyaWFuZ2xlIHJpZ2h0KSBpY29uIFNWRy4gVXNlcyBjdXJyZW50Q29sb3IuICovXHJcbmZ1bmN0aW9uIGdldFByb2dyZXNzUGF1c2VSZXN1bWVJY29uU1ZHKHBhdXNlZCkge1xyXG4gICAgaWYgKHBhdXNlZCkge1xyXG4gICAgICAgIHJldHVybiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxwYXRoIGQ9XCJNOCA2TDggMThMMTcgMTJaXCIvPjwvc3ZnPmA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48bGluZSB4MT1cIjlcIiB5MT1cIjZcIiB4Mj1cIjlcIiB5Mj1cIjE4XCIvPjxsaW5lIHgxPVwiMTVcIiB5MT1cIjZcIiB4Mj1cIjE1XCIgeTI9XCIxOFwiLz48L3N2Zz5gO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGFuZCBpbnNlcnQgcHJvZ3Jlc3MgYmxvY2sgKHRyYWNrICsgYmFyLCBvcHRpb25hbCBwYXVzZSBidXR0b24pIGludG8gdG9hc3QuIEJ1dHRvbiBpcyBmaXhlZCBhdCBsZWZ0IHZpYSB0cmFjayBsYXlvdXQuXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGVudEVsXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8bnVsbH0gY2xvc2VCdG5cclxuICogQHBhcmFtIHtQcm9ncmVzc09wdH0gcHJvZ3Jlc3NPcHRcclxuICogQHJldHVybnMge3sgd3JhcDogSFRNTEVsZW1lbnQsIGJhcjogSFRNTEVsZW1lbnQsIHBhdXNlQnRuOiBIVE1MRWxlbWVudHxudWxsIH19XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVQcm9ncmVzc0Jsb2NrKHRvYXN0RWwsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIHByb2dyZXNzT3B0KSB7XHJcbiAgICBjb25zdCBwb3MgPSBwcm9ncmVzc09wdC5wb3NpdGlvbjtcclxuICAgIGNvbnN0IHNob3dQYXVzZUJ1dHRvbiA9IHByb2dyZXNzT3B0LnBhdXNlQnV0dG9uID09PSB0cnVlO1xyXG4gICAgY29uc3Qgd3JhcCA9IGNyZWF0ZUVsKCdkaXYnLCBgQVBYLXRvYXN0X19wcm9ncmVzcyBBUFgtdG9hc3RfX3Byb2dyZXNzLS0ke3Bvc31gKTtcclxuICAgIGNvbnN0IHRyYWNrID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3RfX3Byb2dyZXNzLXRyYWNrJyk7XHJcbiAgICBjb25zdCBiYXIgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyJyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3Byb2dyZXNzYmFyJyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbWluJywgJzAnKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtYXgnLCAnMTAwJyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1RlbXBzIHJlc3RhbnQnKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCAnMTAwJyk7XHJcbiAgICBiYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XHJcbiAgICB0cmFjay5hcHBlbmRDaGlsZChiYXIpO1xyXG4gICAgd3JhcC5hcHBlbmRDaGlsZCh0cmFjayk7XHJcbiAgICBsZXQgcGF1c2VCdG4gPSBudWxsO1xyXG4gICAgaWYgKHNob3dQYXVzZUJ1dHRvbikge1xyXG4gICAgICAgIHBhdXNlQnRuID0gY3JlYXRlRWwoJ2J1dHRvbicsICdBUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlJyk7XHJcbiAgICAgICAgcGF1c2VCdG4udHlwZSA9ICdidXR0b24nO1xyXG4gICAgICAgIHBhdXNlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdQYXVzZScpO1xyXG4gICAgICAgIHBhdXNlQnRuLnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnUGF1c2UnKTtcclxuICAgICAgICBwYXVzZUJ0bi5pbm5lckhUTUwgPSBnZXRQcm9ncmVzc1BhdXNlUmVzdW1lSWNvblNWRyhmYWxzZSk7IC8vIHJ1bm5pbmcgPSBzaG93IHBhdXNlIGljb25cclxuICAgICAgICB3cmFwLmluc2VydEJlZm9yZShwYXVzZUJ0biwgdHJhY2spO1xyXG4gICAgfVxyXG4gICAgaWYgKHBvcyA9PT0gJ3RvcCcpIHtcclxuICAgICAgICB0b2FzdEVsLmluc2VydEJlZm9yZSh3cmFwLCBjb250ZW50RWwpO1xyXG4gICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRvYXN0RWwuaW5zZXJ0QmVmb3JlKHdyYXAsIGNsb3NlQnRuKTtcclxuICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbScpO1xyXG4gICAgfVxyXG4gICAgaWYgKHNob3dQYXVzZUJ1dHRvbikgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZScpO1xyXG4gICAgcmV0dXJuIHsgd3JhcCwgYmFyLCBwYXVzZUJ0biB9O1xyXG59XHJcblxyXG4vKipcclxuICogVXBkYXRlIHByb2dyZXNzIGJsb2NrIHBvc2l0aW9uIChjbGFzc2VzICsgRE9NIG9yZGVyKVxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b2FzdEVsXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHByb2dyZXNzV3JhcFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250ZW50RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxudWxsfSBjbG9zZUJ0blxyXG4gKiBAcGFyYW0geyd0b3AnfCdib3R0b20nfSBwb3NcclxuICovXHJcbmZ1bmN0aW9uIGFwcGx5UHJvZ3Jlc3NQb3NpdGlvbih0b2FzdEVsLCBwcm9ncmVzc1dyYXAsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIHBvcykge1xyXG4gICAgdG9hc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AnLCAnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tJyk7XHJcbiAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQocG9zID09PSAndG9wJyA/ICdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AnIDogJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbScpO1xyXG4gICAgcHJvZ3Jlc3NXcmFwLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCcsICdBUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20nKTtcclxuICAgIHByb2dyZXNzV3JhcC5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3RfX3Byb2dyZXNzLS0ke3Bvc31gKTtcclxuICAgIGNvbnN0IHRhcmdldCA9IHBvcyA9PT0gJ3RvcCcgPyBjb250ZW50RWwgOiBjbG9zZUJ0bjtcclxuICAgIGlmIChwcm9ncmVzc1dyYXAubmV4dEVsZW1lbnRTaWJsaW5nICE9PSB0YXJnZXQpIHRvYXN0RWwuaW5zZXJ0QmVmb3JlKHByb2dyZXNzV3JhcCwgdGFyZ2V0KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc29sdmUgcHJvZ3Jlc3Mgb3B0aW9uIGZyb20gcGVyLWNhbGwgb3B0aW9uIGFuZCBjb25maWcgZGVmYXVsdFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW58e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nfXx1bmRlZmluZWR9IG9wdGlvblxyXG4gKiBAcGFyYW0ge2Jvb2xlYW58e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nfXx1bmRlZmluZWR9IGNvbmZpZ0RlZmF1bHRcclxuICogQHJldHVybnMge1Byb2dyZXNzT3B0fVxyXG4gKi9cclxuZnVuY3Rpb24gcmVzb2x2ZVByb2dyZXNzKG9wdGlvbiwgY29uZmlnRGVmYXVsdCkge1xyXG4gICAgY29uc3QgZnJvbUNvbmZpZyA9IGNvbmZpZ0RlZmF1bHQgPT09IHRydWVcclxuICAgICAgICA/IHsgZW5hYmxlOiB0cnVlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9XHJcbiAgICAgICAgOiAoY29uZmlnRGVmYXVsdCAmJiB0eXBlb2YgY29uZmlnRGVmYXVsdCA9PT0gJ29iamVjdCdcclxuICAgICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgICBlbmFibGU6ICEhY29uZmlnRGVmYXVsdC5lbmFibGUsXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogY29uZmlnRGVmYXVsdC5wb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyAnYm90dG9tJyA6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgcGF1c2VCdXR0b246IGNvbmZpZ0RlZmF1bHQucGF1c2VCdXR0b24gPT09IHRydWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA6IHsgZW5hYmxlOiBmYWxzZSwgcG9zaXRpb246ICd0b3AnLCBwYXVzZUJ1dHRvbjogZmFsc2UgfSk7XHJcbiAgICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQgfHwgb3B0aW9uID09PSBudWxsKSByZXR1cm4gZnJvbUNvbmZpZztcclxuICAgIGlmIChvcHRpb24gPT09IHRydWUpIHJldHVybiB7IGVuYWJsZTogdHJ1ZSwgcG9zaXRpb246ICd0b3AnLCBwYXVzZUJ1dHRvbjogZmFsc2UgfTtcclxuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGVuYWJsZTogISFvcHRpb24uZW5hYmxlLFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogb3B0aW9uLnBvc2l0aW9uID09PSAnYm90dG9tJyA/ICdib3R0b20nIDogJ3RvcCcsXHJcbiAgICAgICAgICAgIHBhdXNlQnV0dG9uOiBvcHRpb24ucGF1c2VCdXR0b24gPT09IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgZW5hYmxlOiBmYWxzZSwgcG9zaXRpb246ICd0b3AnLCBwYXVzZUJ1dHRvbjogZmFsc2UgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBwbGFjZW1lbnQgc3lub255bXMgdG8gQ1NTIHZhbHVlc1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGxhY2VtZW50XHJcbiAqIEByZXR1cm5zIHsndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J31cclxuICovXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcclxuICAgIGNvbnN0IHN5bm9ueW1zID0ge1xyXG4gICAgICAgICdhYm92ZSc6ICd0b3AnLFxyXG4gICAgICAgICdiZWxvdyc6ICdib3R0b20nLFxyXG4gICAgICAgICdiZWZvcmUnOiAnbGVmdCcsXHJcbiAgICAgICAgJ2FmdGVyJzogJ3JpZ2h0J1xyXG4gICAgfTtcclxuICAgIHJldHVybiBzeW5vbnltc1twbGFjZW1lbnRdIHx8IHBsYWNlbWVudDtcclxufVxyXG5cclxuLyoqXHJcbiAqIERldGVybWluZSBmbG93IGRpcmVjdGlvbiBiYXNlZCBvbiBwb3NpdGlvblxyXG4gKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gKiBAcmV0dXJucyB7J3VwJ3wnZG93bid9XHJcbiAqL1xyXG5mdW5jdGlvbiBkZXRlcm1pbmVGbG93KHBvc2l0aW9uKSB7XHJcbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIC8vIFN0cmluZyBwb3NpdGlvbnM6IHRvcCA9IHVwLCBib3R0b20gPSBkb3duXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmluY2x1ZGVzKCd0b3AnKSkgcmV0dXJuICd1cCc7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmluY2x1ZGVzKCdib3R0b20nKSkgcmV0dXJuICdkb3duJztcclxuICAgICAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzdGlja3knIHx8ICghdHlwZSAmJiAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55KSkpIHtcclxuICAgICAgICAgICAgLy8gU3RpY2t5OiBkZXRlcm1pbmUgYmFzZWQgb24geSBjb29yZGluYXRlXHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHkgc3RhcnRzIHdpdGggJy0nIG9yIGlzIGEgc21hbGwgdmFsdWUsIGxpa2VseSB0b3AgKHVwKVxyXG4gICAgICAgICAgICAgICAgLy8gSWYgeSBpcyBhIGxhcmdlIHZhbHVlIG9yIHBlcmNlbnRhZ2UsIGxpa2VseSBib3R0b20gKGRvd24pXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSA9IGZyb20gYm90dG9tLCBzbyBmbG93IGRvd25cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChwb3NpdGlvbi55KTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHkgPCA1MCUgb2Ygdmlld3BvcnQgaGVpZ2h0LCBsaWtlbHkgdG9wICh1cClcclxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgbGlrZWx5IGJvdHRvbSAoZG93bilcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5pbmNsdWRlcygnJScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gPCA1MCA/ICd1cCcgOiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBweCB2YWx1ZXMsIGFzc3VtZSA8IDQwMHB4IGlzIHRvcCAodXApXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDQwMCA/ICd1cCcgOiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICdkb3duJzsgLy8gZGVmYXVsdFxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ2FuY2hvcmVkJyAmJiBwb3NpdGlvbi5wbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gQW5jaG9yZWQ6IHBsYWNlbWVudCBkZXRlcm1pbmVzIGZsb3dcclxuICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgIGlmIChwbGFjZW1lbnQgPT09ICd0b3AnIHx8IHBsYWNlbWVudCA9PT0gJ2Fib3ZlJykgcmV0dXJuICd1cCc7XHJcbiAgICAgICAgICAgIGlmIChwbGFjZW1lbnQgPT09ICdib3R0b20nIHx8IHBsYWNlbWVudCA9PT0gJ2JlbG93JykgcmV0dXJuICdkb3duJztcclxuICAgICAgICAgICAgLy8gRm9yIGxlZnQvcmlnaHQsIGRlZmF1bHQgdG8gZG93blxyXG4gICAgICAgICAgICByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ3JlbGF0aXZlJykge1xyXG4gICAgICAgICAgICAvLyBSZWxhdGl2ZTogZGV0ZXJtaW5lIGJhc2VkIG9uIHkgb2Zmc2V0XHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQocG9zaXRpb24ueSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSB5ID0gYWJvdmUgZWxlbWVudCA9IGZsb3cgdXBcclxuICAgICAgICAgICAgICAgICAgICAvLyBQb3NpdGl2ZSB5ID0gYmVsb3cgZWxlbWVudCA9IGZsb3cgZG93blxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gPCAwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHYXJiYWdlIGNvbGxlY3Rpb246IHJlbW92ZSBlbXB0eSB1bm1hbmFnZWQgY29udGFpbmVyc1xyXG4gKi9cclxuZnVuY3Rpb24gY2xlYW51cEVtcHR5Q29udGFpbmVycygpIHtcclxuICAgIGlmICghaXNCcm93c2VyKSByZXR1cm47XHJcbiAgICBcclxuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQVBYLXRvYXN0LWNvbnRhaW5lcjpub3QoW2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQ9XCJ0cnVlXCJdKScpO1xyXG4gICAgY29udGFpbmVycy5mb3JFYWNoKGNvbnRhaW5lciA9PiB7XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgY29udGFpbmVyIGlzIGVtcHR5IChubyB0b2FzdHMpXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lci5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBjb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAocG9zaXRpb25LZXkpIHtcclxuICAgICAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5kZWxldGUocG9zaXRpb25LZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgLy8gQ2xlYW4gdXAgd3JhcHBlciBpZiBpdCdzIGVtcHR5IChhbGwgY29udGFpbmVycyByZW1vdmVkKVxyXG4gICAgaWYgKF90b2FzdFdyYXBwZXIgJiYgX3RvYXN0V3JhcHBlci5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBfdG9hc3RXcmFwcGVyLnJlbW92ZSgpO1xyXG4gICAgICAgIF90b2FzdFdyYXBwZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBfZ2NUaW1lb3V0SWQgPSBudWxsO1xyXG59XHJcblxyXG4vKipcclxuICogU2NoZWR1bGUgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBlbXB0eSB1bm1hbmFnZWQgY29udGFpbmVyc1xyXG4gKi9cclxuZnVuY3Rpb24gc2NoZWR1bGVHYXJiYWdlQ29sbGVjdGlvbigpIHtcclxuICAgIGlmIChfZ2NUaW1lb3V0SWQpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQoX2djVGltZW91dElkKTtcclxuICAgIH1cclxuICAgIF9nY1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoY2xlYW51cEVtcHR5Q29udGFpbmVycywgR0NfREVMQVlfTVMpO1xyXG59XHJcblxyXG4vKipcclxuICogRmluZCBhbGwgc2Nyb2xsYWJsZSBwYXJlbnQgZWxlbWVudHNcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRbXX1cclxuICovXHJcbmZ1bmN0aW9uIGZpbmRTY3JvbGxhYmxlUGFyZW50cyhlbGVtZW50KSB7XHJcbiAgICBjb25zdCBzY3JvbGxhYmxlcyA9IFtdO1xyXG4gICAgbGV0IGN1cnJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICBcclxuICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IGRvY3VtZW50LmJvZHkgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50KTtcclxuICAgICAgICBjb25zdCBvdmVyZmxvdyA9IHN0eWxlLm92ZXJmbG93ICsgc3R5bGUub3ZlcmZsb3dZICsgc3R5bGUub3ZlcmZsb3dYO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChvdmVyZmxvdy5pbmNsdWRlcygnc2Nyb2xsJykgfHwgb3ZlcmZsb3cuaW5jbHVkZXMoJ2F1dG8nKSkge1xyXG4gICAgICAgICAgICBzY3JvbGxhYmxlcy5wdXNoKGN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gc2Nyb2xsYWJsZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIYXNoIGFuIGVsZW1lbnQgdG8gY3JlYXRlIGEgdW5pcXVlIGlkZW50aWZpZXJcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcclxuICogQHJldHVybnMge3N0cmluZ31cclxuICovXHJcbmZ1bmN0aW9uIGhhc2hFbGVtZW50KGVsKSB7XHJcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBzdHIgPSBgJHtlbC50YWdOYW1lfV8ke3JlY3QubGVmdH1fJHtyZWN0LnRvcH1fJHtyZWN0LndpZHRofV8ke3JlY3QuaGVpZ2h0fWA7XHJcbiAgICBsZXQgaGFzaCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBjaGFyO1xyXG4gICAgICAgIGhhc2ggPSBoYXNoICYgaGFzaDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXHJcbiAgICB9XHJcbiAgICByZXR1cm4gTWF0aC5hYnMoaGFzaCkudG9TdHJpbmcoMzYpO1xyXG59XHJcblxyXG4vKipcclxuICogU2VyaWFsaXplIHBvc2l0aW9uIG9wdGlvbnMgaW50byBhIHVuaXF1ZSBrZXlcclxuICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cclxuICogQHJldHVybnMge3N0cmluZ31cclxuICovXHJcbmZ1bmN0aW9uIHNlcmlhbGl6ZVBvc2l0aW9uKHBvc2l0aW9uKSB7XHJcbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBgczoke3Bvc2l0aW9ufWA7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBbXTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBUeXBlIChkZWZhdWx0OiBzdGlja3kgaWYgeC95IHByb3ZpZGVkKVxyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBwb3NpdGlvbi50eXBlIHx8IChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkgPyAnc3RpY2t5JyA6IG51bGwpO1xyXG4gICAgICAgIGlmICh0eXBlKSBwYXJ0cy5wdXNoKGB0OiR7dHlwZX1gKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBDb29yZGluYXRlc1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi54ICE9PSB1bmRlZmluZWQpIHBhcnRzLnB1c2goYHg6JHtwb3NpdGlvbi54fWApO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHBhcnRzLnB1c2goYHk6JHtwb3NpdGlvbi55fWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEZvciByZWxhdGl2ZS9hbmNob3JlZDogdXNlIGVsZW1lbnQgSUQgb3IgaGFzaFxyXG4gICAgICAgIGlmIChwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZCA9IHBvc2l0aW9uLmVsZW1lbnQuaWQgfHwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24uZWxlbWVudC5kYXRhc2V0Py5hcHhUb2FzdEFuY2hvcklkIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGVsXyR7aGFzaEVsZW1lbnQocG9zaXRpb24uZWxlbWVudCl9YDtcclxuICAgICAgICAgICAgcGFydHMucHVzaChgZWw6JHtlbGVtZW50SWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChwb3NpdGlvbi5wbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gTm9ybWFsaXplIHBsYWNlbWVudCBmb3Igc2VyaWFsaXphdGlvbiAodXNlIENTUyB2YWx1ZXMpXHJcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQbGFjZW1lbnQocG9zaXRpb24ucGxhY2VtZW50KTtcclxuICAgICAgICAgICAgcGFydHMucHVzaChgcDoke25vcm1hbGl6ZWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwb3NpdGlvbi5nYXAgIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgZzoke3Bvc2l0aW9uLmdhcH1gKTtcclxuICAgICAgICBpZiAocG9zaXRpb24udXNlTmF0aXZlQ1NTKSBwYXJ0cy5wdXNoKGBuYXRpdmU6dHJ1ZWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBgbzoke3BhcnRzLmpvaW4oJ3wnKX1gO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gJ3M6Ym90dG9tLXJpZ2h0JztcclxufVxyXG5cclxuLyoqXHJcbiAqIFRvYXN0TWFuYWdlciBjbGFzc1xyXG4gKi9cclxuY2xhc3MgVG9hc3RNYW5hZ2VyIHtcclxuICAgIC8qKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+PX0gY29uZmlnICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcclxuICAgICAgICAvKiogQHR5cGUge1RvYXN0Q29uZmlnfSAqL1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0geyAuLi5ERUZBVUxUX0NPTkZJRywgLi4uKGNvbmZpZyB8fCB7fSkgfTtcclxuICAgICAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fG51bGx9ICovXHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xyXG4gICAgICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgVG9hc3RSZWY+fSAqL1xyXG4gICAgICAgIHRoaXMuaWRUb1JlZiA9IG5ldyBNYXAoKTtcclxuICAgICAgICAvKiogQHR5cGUge1RvYXN0UmVmW119ICovXHJcbiAgICAgICAgdGhpcy5vcGVuID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz59IGNvbmZpZyAqL1xyXG4gICAgY29uZmlndXJlKGNvbmZpZykge1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLmNvbmZpZywgLi4uKGNvbmZpZyB8fCB7fSkgfTtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHRoaXMuYXBwbHlDb250YWluZXJDb25maWcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHsncG9saXRlJ3wnYXNzZXJ0aXZlJ3wnb2ZmJ30gbW9kZSAqL1xyXG4gICAgc2V0QXJpYUxpdmUobW9kZSkgeyB0aGlzLmNvbmZpZ3VyZSh7IGFyaWFMaXZlOiBtb2RlIH0pOyB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtUb2FzdFJlZltdfSAqL1xyXG4gICAgZ2V0T3BlblRvYXN0cygpIHsgcmV0dXJuIHRoaXMub3Blbi5zbGljZSgpOyB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7VG9hc3RPcHRpb25zfSBvcHRzICovXHJcbiAgICBzaG93KG9wdHMpIHtcclxuICAgICAgICBpZiAoIWlzQnJvd3NlcikgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyhudWxsKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKG9wdHMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWcuZGVkdXBlICYmIG9wdGlvbnMuaWQgJiYgdGhpcy5pZFRvUmVmLmhhcyhvcHRpb25zLmlkKSkge1xyXG4gICAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmlkVG9SZWYuZ2V0KG9wdGlvbnMuaWQpO1xyXG4gICAgICAgICAgICByZWYudXBkYXRlKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVmO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIHBvc2l0aW9uIGFuZCBmbG93IGZvciB0aGlzIHRvYXN0IChvcHRpb25zIHRha2UgcHJlY2VkZW5jZSBvdmVyIGNvbmZpZylcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24gfHwgdGhpcy5jb25maWcucG9zaXRpb24gfHwgJ2JvdHRvbS1yaWdodCc7XHJcbiAgICAgICAgY29uc3QgZmxvdyA9IG9wdGlvbnMuZmxvdyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5mbG93IDogKHRoaXMuY29uZmlnLmZsb3cgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmZsb3cgOiAnYXV0bycpO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsRmxvdyA9IGZsb3cgPT09ICdhdXRvJyA/IGRldGVybWluZUZsb3cocG9zaXRpb24pIDogZmxvdztcclxuICAgICAgICBcclxuICAgICAgICAvLyBFbnN1cmUgZGVmYXVsdCBjb250YWluZXIgaXMgc2V0IChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcclxuICAgICAgICB0aGlzLmVuc3VyZUNvbnRhaW5lcigpO1xyXG5cclxuICAgICAgICBjb25zdCB0b2FzdEVsID0gY3JlYXRlRWwoJ2RpdicsIGBBUFgtdG9hc3QgQVBYLXRvYXN0LS0ke29wdGlvbnMudHlwZX1gKTtcclxuICAgICAgICB0b2FzdEVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdzdGF0dXMnKTtcclxuICAgICAgICAvLyBQcmlvcml0eTogb3B0aW9ucy5pZCA+IGNvbmZpZy5pZCA+IGF1dG8tZ2VuZXJhdGVkXHJcbiAgICAgICAgY29uc3QgdG9hc3RJZCA9IG9wdGlvbnMuaWQgfHwgYHRfJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpfWA7XHJcbiAgICAgICAgdG9hc3RFbC5kYXRhc2V0LnRvYXN0SWQgPSB0b2FzdElkO1xyXG4gICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSkgdG9hc3RFbC5jbGFzc05hbWUgKz0gYCAke29wdGlvbnMuY2xhc3NOYW1lfWA7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbCA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0X19jb250ZW50Jyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRFbC50ZXh0Q29udGVudCA9IG9wdGlvbnMubWVzc2FnZTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMubWVzc2FnZSkge1xyXG4gICAgICAgICAgICBjb250ZW50RWwuYXBwZW5kQ2hpbGQob3B0aW9ucy5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdG9hc3RFbC5hcHBlbmRDaGlsZChjb250ZW50RWwpO1xyXG5cclxuICAgICAgICBsZXQgY2xvc2VCdG4gPSBudWxsO1xyXG4gICAgICAgIGlmIChvcHRpb25zLmRpc21pc3NpYmxlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjbG9zZUJ0biA9IGNyZWF0ZUVsKCdidXR0b24nLCAnQVBYLXRvYXN0X19jbG9zZScpO1xyXG4gICAgICAgICAgICBjbG9zZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQ2xvc2UnKTtcclxuICAgICAgICAgICAgY2xvc2VCdG4udHlwZSA9ICdidXR0b24nO1xyXG4gICAgICAgICAgICB0b2FzdEVsLmFwcGVuZENoaWxkKGNsb3NlQnRuKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwcm9ncmVzc1dyYXAgPSBudWxsO1xyXG4gICAgICAgIGxldCBwcm9ncmVzc0JhckVsID0gbnVsbDtcclxuICAgICAgICBsZXQgcHJvZ3Jlc3NQYXVzZUJ0biA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMucHJvZ3Jlc3MuZW5hYmxlICYmIG9wdGlvbnMuZHVyYXRpb25NcyA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZVByb2dyZXNzQmxvY2sodG9hc3RFbCwgY29udGVudEVsLCBjbG9zZUJ0biwgb3B0aW9ucy5wcm9ncmVzcyk7XHJcbiAgICAgICAgICAgIHByb2dyZXNzV3JhcCA9IGNyZWF0ZWQud3JhcDtcclxuICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbCA9IGNyZWF0ZWQuYmFyO1xyXG4gICAgICAgICAgICBwcm9ncmVzc1BhdXNlQnRuID0gY3JlYXRlZC5wYXVzZUJ0bjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCBvciBjcmVhdGUgY29udGFpbmVyIGZvciB0aGlzIHNwZWNpZmljIHBvc2l0aW9uXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IG51bGw7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uVXBkYXRlRm4gPSBudWxsO1xyXG4gICAgICAgIGxldCBwb3NpdGlvbkNsZWFudXAgPSBudWxsO1xyXG4gICAgICAgIGxldCBvcmlnaW5hbEVsZW1lbnRTdHlsZSA9IG51bGw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uICYmIHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAocG9zaXRpb24udXNlTmF0aXZlQ1NTICYmICh0eXBlID09PSAncmVsYXRpdmUnIHx8IHR5cGUgPT09ICdhbmNob3JlZCcpICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIHVzZU5hdGl2ZUNTUzogdHJ1ZSAtIGNyZWF0ZSBjb250YWluZXIgaW4gdGFyZ2V0IGVsZW1lbnQgdXNpbmcgbmF0aXZlIENTU1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0RWwgPSBwb3NpdGlvbi5lbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFbGVtZW50U3R5bGUgPSB0YXJnZXRFbC5zdHlsZS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgICAgIHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29udGFpbmVyIGZvciBzdGFja2luZyB0b2FzdHMgKHJldXNlIGlmIGV4aXN0cylcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uS2V5ID0gc2VyaWFsaXplUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgbGV0IG5hdGl2ZUNvbnRhaW5lciA9IHRhcmdldEVsLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFweC10b2FzdC1wb3NpdGlvbj1cIiR7cG9zaXRpb25LZXl9XCJdYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5hdGl2ZUNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lciA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0LWNvbnRhaW5lciBBUFgtdG9hc3QtY29udGFpbmVyLW5hdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uJywgcG9zaXRpb25LZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnpJbmRleCA9IFN0cmluZyh0aGlzLmNvbmZpZy56SW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5nYXAgPSBgJHt0aGlzLmNvbmZpZy5nYXB9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIFN0cmluZyh0aGlzLmNvbmZpZy5hcmlhTGl2ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZmluYWxGbG93ID09PSAndXAnID8gJ2NvbHVtbi1yZXZlcnNlJyA6ICdjb2x1bW4nO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IHBvc2l0aW9uaW5nIHRvIGNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAncmVsYXRpdmUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlOiB1c2UgeC95IGRpcmVjdGx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi54ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi54LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5yaWdodCA9IHBvc2l0aW9uLnguc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUubGVmdCA9IHBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkuc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmJvdHRvbSA9IHBvc2l0aW9uLnkuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gcG9zaXRpb24ueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FuY2hvcmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmNob3JlZDogcG9zaXRpb24gb3V0c2lkZSB0aGUgZWxlbWVudCB1c2luZyAxMDAlIChlbGVtZW50IHNpemUpICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYXAgPSBwb3NpdGlvbi5nYXAgfHwgJzFlbSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuYm90dG9tID0gYGNhbGMoMTAwJSArICR7Z2FwfSlgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gYGNhbGMoMTAwJSArICR7Z2FwfSlgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gYGNhbGMoMTAwJSArICR7Z2FwfSlgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyaWdodCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbC5hcHBlbmRDaGlsZChuYXRpdmVDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZmxvdyBkaXJlY3Rpb24gaWYgY29udGFpbmVyIGV4aXN0c1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZmluYWxGbG93ID09PSAndXAnID8gJ2NvbHVtbi1yZXZlcnNlJyA6ICdjb2x1bW4nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBuYXRpdmVDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2xlYW51cCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RWwgJiYgdGFyZ2V0RWwucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbC5zdHlsZS5wb3NpdGlvbiA9IG9yaWdpbmFsRWxlbWVudFN0eWxlIHx8ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbmF0aXZlIGNvbnRhaW5lciBpZiBlbXB0eVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF0aXZlQ29udGFpbmVyICYmIG5hdGl2ZUNvbnRhaW5lci5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uS2V5ID0gbmF0aXZlQ29udGFpbmVyLmdldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbktleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5kZWxldGUocG9zaXRpb25LZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIERlZmF1bHQ6IGdldCBvciBjcmVhdGUgY29udGFpbmVyIGZvciB0aGlzIHBvc2l0aW9uXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lckZvclBvc2l0aW9uKHBvc2l0aW9uLCBmaW5hbEZsb3cpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVDb250YWluZXJQb3NpdGlvbiA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKHBvc2l0aW9uLCBjb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29udGFpbmVyLnN0eWxlLCBzdHlsZXMpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlQ29udGFpbmVyUG9zaXRpb24oKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gRm9yIHJlbGF0aXZlL2FuY2hvcmVkLCBsaXN0ZW4gdG8gc2Nyb2xsL3Jlc2l6ZVxyXG4gICAgICAgICAgICAgICAgaWYgKCh0eXBlID09PSAncmVsYXRpdmUnIHx8IHR5cGUgPT09ICdhbmNob3JlZCcpICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmFmSWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0VXBkYXRlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aHJvdHRsZU1zID0gMTY7IC8vIH42MGZwc1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRocm90dGxlZFVwZGF0ZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyAtIGxhc3RVcGRhdGUgPCB0aHJvdHRsZU1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFmSWQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250YWluZXJQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250YWluZXJQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZSA9IG5vdztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBhbGwgc2Nyb2xsYWJsZSBwYXJlbnRzXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZVBhcmVudHMgPSBmaW5kU2Nyb2xsYWJsZVBhcmVudHMocG9zaXRpb24uZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTGlzdGVuIHRvIHNjcm9sbCBvbiB3aW5kb3cgYW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudHNcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRocm90dGxlZFVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExpc3RlbiB0byBzY3JvbGwgb24gYWxsIHNjcm9sbGFibGUgcGFyZW50IGVsZW1lbnRzXHJcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYWJsZVBhcmVudHMuZm9yRWFjaChwYXJlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gV2F0Y2ggZm9yIGVsZW1lbnQgcmVtb3ZhbFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvc2l0aW9uLmVsZW1lbnQucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLmNsb3NlKCdhcGknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25VcGRhdGVGbiA9IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2xlYW51cCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlZFVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aHJvdHRsZWRVcGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlUGFyZW50cy5mb3JFYWNoKHBhcmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZklkKSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFN0cmluZyBwb3NpdGlvbiAtIGdldCBvciBjcmVhdGUgY29udGFpbmVyIGZvciB0aGlzIHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZpbmFsRmxvdyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFwcGVuZCB0b2FzdCB0byB0aGUgYXBwcm9wcmlhdGUgY29udGFpbmVyXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGVmYXVsdCBjb250YWluZXJcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFbnRlciBhbmltYXRpb25cclxuICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZW50ZXInKTtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZW50ZXItYWN0aXZlJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEV2ZW50IGhhbmRsaW5nIGFuZCB0aW1lcnNcclxuICAgICAgICBsZXQgcmVtYWluaW5nID0gb3B0aW9ucy5kdXJhdGlvbk1zO1xyXG4gICAgICAgIGxldCB0aW1lcklkID0gbnVsbDtcclxuICAgICAgICBsZXQgc3RhcnRUcyA9IG51bGw7XHJcbiAgICAgICAgbGV0IHVzZXJQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgcHJvZ3Jlc3NSYWZJZCA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB7IGNsaWNrOiBuZXcgU2V0KCksIGNsb3NlOiBuZXcgU2V0KCkgfTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lciA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFyZW1haW5pbmcgfHwgcmVtYWluaW5nIDw9IDApIHJldHVybjsgLy8gc3RpY2t5XHJcbiAgICAgICAgICAgIHN0YXJ0VHMgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICB0aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gcmVmLmNsb3NlKCd0aW1lb3V0JyksIHJlbWFpbmluZyk7XHJcbiAgICAgICAgICAgIGlmIChwcm9ncmVzc0JhckVsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lcklkID09IG51bGwgfHwgc3RhcnRUcyA9PSBudWxsKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxhcHNlZCA9IERhdGUubm93KCkgLSBzdGFydFRzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ01zID0gTWF0aC5tYXgoMCwgcmVtYWluaW5nIC0gZWxhcHNlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IG9wdGlvbnMuZHVyYXRpb25NcztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBkdXJhdGlvbk1zID4gMCA/IE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgKHJlbWFpbmluZ01zIC8gZHVyYXRpb25NcykgKiAxMDApKSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbC5zdHlsZS53aWR0aCA9IGAke3BjdH0lYDtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIFN0cmluZyhNYXRoLnJvdW5kKHBjdCkpKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1JhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHByb2dyZXNzUmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHBhdXNlVGltZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lcklkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXJJZCk7XHJcbiAgICAgICAgICAgICAgICB0aW1lcklkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChzdGFydFRzICE9IG51bGwpIHJlbWFpbmluZyAtPSAoRGF0ZS5ub3coKSAtIHN0YXJ0VHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcm9ncmVzc1JhZklkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHByb2dyZXNzUmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBhdHRhY2hQcm9ncmVzc1BhdXNlSGFuZGxlciA9IChidG4pID0+IHtcclxuICAgICAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHVzZXJQYXVzZWQgPSAhdXNlclBhdXNlZDtcclxuICAgICAgICAgICAgICAgIGlmICh1c2VyUGF1c2VkKSBwYXVzZVRpbWVyKCk7IGVsc2Ugc3RhcnRUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSB1c2VyUGF1c2VkID8gJ1JlcHJlbmRyZScgOiAnUGF1c2UnO1xyXG4gICAgICAgICAgICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGxhYmVsKTtcclxuICAgICAgICAgICAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgbGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgYnRuLmlubmVySFRNTCA9IGdldFByb2dyZXNzUGF1c2VSZXN1bWVJY29uU1ZHKHVzZXJQYXVzZWQpOyAvLyBwYXVzZWQgPSByZXN1bWUgKHRyaWFuZ2xlKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKiogQHR5cGUge1RvYXN0UmVmfSAqL1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHtcclxuICAgICAgICAgICAgaWQ6IHRvYXN0SWQsXHJcbiAgICAgICAgICAgIGVsOiB0b2FzdEVsLFxyXG4gICAgICAgICAgICBjbG9zZTogKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2xlYW51cChyZWFzb24gfHwgJ2FwaScpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB1cGRhdGU6IChwYXJ0aWFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWQgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoeyAuLi5vcHRpb25zLCAuLi5wYXJ0aWFsIH0pO1xyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNvbnRlbnRcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWVyZ2VkLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEVsLnRleHRDb250ZW50ID0gbWVyZ2VkLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmdlZC5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEVsLmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRFbC5hcHBlbmRDaGlsZChtZXJnZWQubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdHlwZSBjbGFzc1xyXG4gICAgICAgICAgICAgICAgWydpbmZvJywnc3VjY2VzcycsJ3dhcm5pbmcnLCdkYW5nZXInXS5mb3JFYWNoKHQgPT4gdG9hc3RFbC5jbGFzc0xpc3QucmVtb3ZlKGBBUFgtdG9hc3QtLSR7dH1gKSk7XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoYEFQWC10b2FzdC0tJHttZXJnZWQudHlwZX1gKTtcclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjbGFzc2VzXHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jbGFzc05hbWUgIT09IG1lcmdlZC5jbGFzc05hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jbGFzc05hbWUpIHRvYXN0RWwuY2xhc3NMaXN0LnJlbW92ZSguLi5vcHRpb25zLmNsYXNzTmFtZS5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlZC5jbGFzc05hbWUpIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCguLi5tZXJnZWQuY2xhc3NOYW1lLnNwbGl0KCcgJykuZmlsdGVyKEJvb2xlYW4pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9ncmVzcyB2aXNpYmlsaXR5L3Bvc2l0aW9uXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLnByb2dyZXNzID0gbWVyZ2VkLnByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzV3JhcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbWVyZ2VkLnByb2dyZXNzLmVuYWJsZSB8fCBtZXJnZWQuZHVyYXRpb25NcyA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzV3JhcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzV3JhcC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5UHJvZ3Jlc3NQb3NpdGlvbih0b2FzdEVsLCBwcm9ncmVzc1dyYXAsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIG1lcmdlZC5wcm9ncmVzcy5wb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJnZWQucHJvZ3Jlc3MuZW5hYmxlICYmIG1lcmdlZC5kdXJhdGlvbk1zID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBjcmVhdGVQcm9ncmVzc0Jsb2NrKHRvYXN0RWwsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIG1lcmdlZC5wcm9ncmVzcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwID0gY3JlYXRlZC53cmFwO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwgPSBjcmVhdGVkLmJhcjtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1BhdXNlQnRuID0gY3JlYXRlZC5wYXVzZUJ0bjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NQYXVzZUJ0bikgYXR0YWNoUHJvZ3Jlc3NQYXVzZUhhbmRsZXIocHJvZ3Jlc3NQYXVzZUJ0bik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NXcmFwICYmIHByb2dyZXNzV3JhcC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgbWVyZ2VkLnByb2dyZXNzLnBhdXNlQnV0dG9uID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZScpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZHVyYXRpb24gbG9naWNcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZHVyYXRpb25NcyA9IG1lcmdlZC5kdXJhdGlvbk1zO1xyXG4gICAgICAgICAgICAgICAgcmVtYWluaW5nID0gbWVyZ2VkLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NCYXJFbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwuc3R5bGUud2lkdGggPSAnMTAwJSc7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCAnMTAwJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwYXVzZVRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBzdGFydFRpbWVyKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHdoZW5DbG9zZWQ6ICgpID0+IGNsb3NlZFByb21pc2UsXHJcbiAgICAgICAgICAgIG9uOiAoZXZlbnQsIGhhbmRsZXIpID0+IHsgaGFuZGxlcnNbZXZlbnRdLmFkZChoYW5kbGVyKTsgcmV0dXJuICgpID0+IHJlZi5vZmYoZXZlbnQsIGhhbmRsZXIpOyB9LFxyXG4gICAgICAgICAgICBvZmY6IChldmVudCwgaGFuZGxlcikgPT4geyBoYW5kbGVyc1tldmVudF0uZGVsZXRlKGhhbmRsZXIpOyB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3Qgbm90aWZ5ID0gKGV2ZW50LCBhcmcpID0+IGhhbmRsZXJzW2V2ZW50XS5mb3JFYWNoKGZuID0+IHsgdHJ5IHsgZm4oYXJnKTsgfSBjYXRjaCAoXykge30gfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNsb3NlZFByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmluaXNoID0gKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgbm90aWZ5KCdjbG9zZScsIHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25DbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IG9wdGlvbnMub25DbG9zZShyZWYsIHJlYXNvbik7IH0gY2F0Y2goXyl7fVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghdG9hc3RFbCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgcGF1c2VUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzUmFmSWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHByb2dyZXNzUmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzUmFmSWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBwb3NpdGlvbiBsaXN0ZW5lcnMgYW5kIHJlc3RvcmUgc3R5bGVzXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25DbGVhbnVwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gSWYgb3ZlcmZsb3csIHJlbW92ZSBpbW1lZGlhdGVseSB0byBlbmZvcmNlIGhhcmQgY2FwXHJcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uID09PSAnb3ZlcmZsb3cnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvYXN0RWwucGFyZW50RWxlbWVudCkgdG9hc3RFbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRvYXN0RWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMub3Blbi5pbmRleE9mKHJlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB0aGlzLm9wZW4uc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZFRvUmVmLmRlbGV0ZSh0b2FzdElkKTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5pc2gocmVhc29uKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBhbmltYXRlIG91dFxyXG4gICAgICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWV4aXQnKTtcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZXhpdC1hY3RpdmUnKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlRWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9hc3RFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgcmVtb3ZlRWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2FzdEVsLnBhcmVudEVsZW1lbnQpIHRvYXN0RWwucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSB0aGlzLm9wZW4uaW5kZXhPZihyZWYpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgdGhpcy5vcGVuLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWRUb1JlZi5kZWxldGUodG9hc3RJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2NoZWR1bGUgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciB1bm1hbmFnZWQgY29udGFpbmVyc1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlR2FyYmFnZUNvbGxlY3Rpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBmaW5pc2gocmVhc29uKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCByZW1vdmVFbCk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAvLyBhdHRhY2ggY2xvc2UgYmVoYXZpb3JcclxuICAgICAgICAgICAgcmVmLmNsb3NlID0gKHJlYXNvbikgPT4gY2xlYW51cChyZWFzb24gfHwgJ2FwaScpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBDbGljayBoYW5kbGluZ1xyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgbm90aWZ5KCdjbGljaycsIGV2KTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7IG9wdGlvbnMub25DbGljayhyZWYsIGV2KTsgfSBjYXRjaChfKXt9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gSG92ZXIgcGF1c2VcclxuICAgICAgICB0b2FzdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBwYXVzZVRpbWVyKTtcclxuICAgICAgICB0b2FzdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7IGlmICghdXNlclBhdXNlZCkgc3RhcnRUaW1lcigpOyB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNsb3NlQnRuKSBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldikgPT4geyBldi5zdG9wUHJvcGFnYXRpb24oKTsgcmVmLmNsb3NlKCdjbG9zZScpOyB9KTtcclxuICAgICAgICBpZiAocHJvZ3Jlc3NQYXVzZUJ0bikgYXR0YWNoUHJvZ3Jlc3NQYXVzZUhhbmRsZXIocHJvZ3Jlc3NQYXVzZUJ0bik7XHJcblxyXG4gICAgICAgIC8vIFRyYWNrXHJcbiAgICAgICAgdGhpcy5vcGVuLnB1c2gocmVmKTtcclxuICAgICAgICB0aGlzLmlkVG9SZWYuc2V0KHRvYXN0SWQsIHJlZik7XHJcblxyXG4gICAgICAgIC8vIE92ZXJmbG93IHBvbGljeVxyXG4gICAgICAgIGlmICh0aGlzLm9wZW4ubGVuZ3RoID4gdGhpcy5jb25maWcubWF4VG9hc3RzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMub3BlblswXTtcclxuICAgICAgICAgICAgb2xkZXN0LmNsb3NlKCdvdmVyZmxvdycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RhcnRUaW1lcigpO1xyXG4gICAgICAgIHJldHVybiByZWY7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZW5pZW5jZSBoZWxwZXJzXHJcbiAgICAgKi9cclxuICAgIGluZm8obWVzc2FnZSwgb3B0cykgeyByZXR1cm4gdGhpcy5zaG93KHsgLi4uKG9wdHN8fHt9KSwgbWVzc2FnZSwgdHlwZTogJ2luZm8nIH0pOyB9XHJcbiAgICBzdWNjZXNzKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICdzdWNjZXNzJyB9KTsgfVxyXG4gICAgd2FybmluZyhtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnd2FybmluZycgfSk7IH1cclxuICAgIGRhbmdlcihtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnZGFuZ2VyJyB9KTsgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0geydhcGknfCdvdmVyZmxvdyd9IFtyZWFzb25dICovXHJcbiAgICBjbG9zZUFsbChyZWFzb24pIHtcclxuICAgICAgICAvLyBjb3B5IHRvIGF2b2lkIG11dGF0aW9uIGR1cmluZyBpdGVyYXRpb25cclxuICAgICAgICBjb25zdCBhbGwgPSB0aGlzLm9wZW4uc2xpY2UoKTtcclxuICAgICAgICBhbGwuZm9yRWFjaChyID0+IHIuY2xvc2UocmVhc29uIHx8ICdhcGknKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7VG9hc3RPcHRpb25zfSBvcHRzICovXHJcbiAgICBub3JtYWxpemVPcHRpb25zKG9wdHMpIHtcclxuICAgICAgICBjb25zdCBvID0geyAuLi5vcHRzIH07XHJcbiAgICAgICAgaWYgKCFvLnR5cGUpIG8udHlwZSA9ICdpbmZvJztcclxuICAgICAgICBpZiAodHlwZW9mIG8uZGlzbWlzc2libGUgIT09ICdib29sZWFuJykgby5kaXNtaXNzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvLmR1cmF0aW9uTXMgIT09ICdudW1iZXInKSBvLmR1cmF0aW9uTXMgPSB0aGlzLmNvbmZpZy5kZWZhdWx0RHVyYXRpb25NcztcclxuICAgICAgICAvLyBVc2UgaWQgZnJvbSBvcHRpb25zIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgdXNlIGlkIGZyb20gY29uZmlnLCBvdGhlcndpc2UgdW5kZWZpbmVkICh3aWxsIGJlIGF1dG8tZ2VuZXJhdGVkKVxyXG4gICAgICAgIGlmICghby5pZCAmJiB0aGlzLmNvbmZpZy5pZCkgby5pZCA9IHRoaXMuY29uZmlnLmlkO1xyXG4gICAgICAgIG8ucHJvZ3Jlc3MgPSByZXNvbHZlUHJvZ3Jlc3Mob3B0cy5wcm9ncmVzcywgdGhpcy5jb25maWcucHJvZ3Jlc3MpO1xyXG4gICAgICAgIHJldHVybiBvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZCBvciBjcmVhdGUgYSBjb250YWluZXIgZm9yIGEgc3BlY2lmaWMgcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0geyd1cCd8J2Rvd24nfSBbZmxvd10gRmxvdyBkaXJlY3Rpb24gKGFscmVhZHkgZGV0ZXJtaW5lZCwgbm90ICdhdXRvJylcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21hbmFnZWRdIFdoZXRoZXIgdGhpcyBjb250YWluZXIgaXMgbWFuYWdlZCBieSBhIG1hbmFnZXIgKGRlZmF1bHQ6IGZhbHNlKVxyXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9XHJcbiAgICAgKi9cclxuICAgIGdldENvbnRhaW5lckZvclBvc2l0aW9uKHBvc2l0aW9uLCBmbG93LCBtYW5hZ2VkID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAoIWlzQnJvd3NlcikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBzZXJpYWxpemVQb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRmxvdyBzaG91bGQgYWxyZWFkeSBiZSBkZXRlcm1pbmVkICgndXAnIG9yICdkb3duJyksIGJ1dCBmYWxsYmFjayB0byBhdXRvIGlmIG5lZWRlZFxyXG4gICAgICAgIGNvbnN0IGZpbmFsRmxvdyA9IGZsb3cgJiYgZmxvdyAhPT0gJ2F1dG8nID8gZmxvdyA6IGRldGVybWluZUZsb3cocG9zaXRpb24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIDEuIENoZWNrIG1lbW9yeSBjYWNoZVxyXG4gICAgICAgIGxldCBjID0gX2NvbnRhaW5lckNhY2hlLmdldChwb3NpdGlvbktleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMi4gSWYgbm90IGluIGNhY2hlLCBzZWFyY2ggaW4gRE9NIGJ5IGRhdGEgYXR0cmlidXRlXHJcbiAgICAgICAgaWYgKCFjICYmIGlzQnJvd3Nlcikge1xyXG4gICAgICAgICAgICBjID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uPVwiJHtwb3NpdGlvbktleX1cIl1gKTtcclxuICAgICAgICAgICAgaWYgKGMpIHtcclxuICAgICAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5zZXQocG9zaXRpb25LZXksIGMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIDMuIElmIHN0aWxsIG5vdCBmb3VuZCwgY3JlYXRlIG5ldyBjb250YWluZXJcclxuICAgICAgICBpZiAoIWMpIHtcclxuICAgICAgICAgICAgYyA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0LWNvbnRhaW5lcicpO1xyXG4gICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nLCBwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBNYXJrIGFzIG1hbmFnZWQgaWYgY3JlYXRlZCBieSBhIG1hbmFnZXJcclxuICAgICAgICAgICAgaWYgKG1hbmFnZWQpIHtcclxuICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1tYW5hZ2VkJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHBvc2l0aW9uIGNsYXNzIChmb3IgQ1NTKVxyXG4gICAgICAgICAgICBjb25zdCBwb3NDbGFzcyA9IHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycgXHJcbiAgICAgICAgICAgICAgICA/IHBvc2l0aW9uIFxyXG4gICAgICAgICAgICAgICAgOiAocG9zaXRpb24udHlwZSB8fCAnYm90dG9tLXJpZ2h0Jyk7XHJcbiAgICAgICAgICAgIGMuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0LWNvbnRhaW5lci0tJHtwb3NDbGFzc31gKTtcclxuICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIFN0cmluZyh0aGlzLmNvbmZpZy5hcmlhTGl2ZSkpO1xyXG4gICAgICAgICAgICBjLnN0eWxlLnpJbmRleCA9IFN0cmluZyh0aGlzLmNvbmZpZy56SW5kZXgpO1xyXG4gICAgICAgICAgICBjLnN0eWxlLmdhcCA9IGAke3RoaXMuY29uZmlnLmdhcH1weGA7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBcHBseSBmbG93IGRpcmVjdGlvblxyXG4gICAgICAgICAgICBjLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBcHBseSBwb3NpdGlvbiBzdHlsZXMgaWYgb2JqZWN0IHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGMpO1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjLnN0eWxlLCBzdHlsZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBcHBlbmQgdG8gd3JhcHBlciBmb3IgY2xlYW4gRE9NIG9yZ2FuaXphdGlvblxyXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gZ2V0VG9hc3RXcmFwcGVyKCk7XHJcbiAgICAgICAgICAgIGlmICh3cmFwcGVyKSB7XHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfY29udGFpbmVyQ2FjaGUuc2V0KHBvc2l0aW9uS2V5LCBjKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBVcGRhdGUgZmxvdyBkaXJlY3Rpb24gaWYgY29udGFpbmVyIGV4aXN0cyAobWF5IGJlIHNoYXJlZClcclxuICAgICAgICAgICAgYy5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZmluYWxGbG93ID09PSAndXAnID8gJ2NvbHVtbi1yZXZlcnNlJyA6ICdjb2x1bW4nO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gSWYgY29udGFpbmVyIGV4aXN0cyBhbmQgaXMgbm93IG1hbmFnZWQsIG1hcmsgaXRcclxuICAgICAgICAgICAgaWYgKG1hbmFnZWQgJiYgIWMuaGFzQXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1tYW5hZ2VkJykpIHtcclxuICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1tYW5hZ2VkJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gYztcclxuICAgIH1cclxuXHJcbiAgICBlbnN1cmVDb250YWluZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyIHx8ICFpc0Jyb3dzZXIpIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xyXG4gICAgICAgIGNvbnN0IGZsb3cgPSB0aGlzLmNvbmZpZy5mbG93ICE9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy5mbG93IDogJ2F1dG8nO1xyXG4gICAgICAgIC8vIENvbnRhaW5lcnMgY3JlYXRlZCBieSBlbnN1cmVDb250YWluZXIgYXJlIG1hbmFnZWRcclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZsb3csIHRydWUpO1xyXG4gICAgICAgIHRoaXMuYXBwbHlDb250YWluZXJDb25maWcoKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUNvbnRhaW5lckNvbmZpZygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmNvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcclxuICAgICAgICBjb25zdCBwb3MgPSB0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnID8gcG9zaXRpb24gOiAocG9zaXRpb24udHlwZSB8fCAnYm90dG9tLXJpZ2h0Jyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwbHkgc3R5bGVzICh0aGVzZSBtYXkgYmUgb3ZlcnJpZGRlbiBieSBvdGhlciBtYW5hZ2VycyBzaGFyaW5nIHRoZSBjb250YWluZXIpXHJcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZ2FwID0gYCR7dGhpcy5jb25maWcuZ2FwfXB4YDtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIFN0cmluZyh0aGlzLmNvbmZpZy5hcmlhTGl2ZSkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFVwZGF0ZSBwb3NpdGlvbiBjbGFzcyAob25seSBmb3Igc3RyaW5nIHBvc2l0aW9ucylcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBwb3NDbGFzc2VzID0gWydib3R0b20tcmlnaHQnLCdib3R0b20tbGVmdCcsJ3RvcC1yaWdodCcsJ3RvcC1sZWZ0J10ubWFwKHAgPT4gYEFQWC10b2FzdC1jb250YWluZXItLSR7cH1gKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSguLi5wb3NDbGFzc2VzKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0LWNvbnRhaW5lci0tJHtwb3N9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFwcGx5IGNvbnRhaW5lciBjbGFzcyBpZiBzcGVjaWZpZWRcclxuICAgICAgICBpZiAodGhpcy5jb25maWcuY29udGFpbmVyQ2xhc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25maWcuY29udGFpbmVyQ2xhc3Muc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChjbHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChjbHMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwbHkgb2Zmc2V0IChvbmx5IGZvciBzdHJpbmcgcG9zaXRpb25zKVxyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vZmZzZXQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGAke3RoaXMuY29uZmlnLm9mZnNldH1weGA7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdib3R0b20nKSkgdGhpcy5jb250YWluZXIuc3R5bGUuYm90dG9tID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdyaWdodCcpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5yaWdodCA9IG9mZnNldDtcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9IG9mZnNldDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IG9mZnNldCBpZiBub3Qgc3BlY2lmaWVkXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdib3R0b20nKSkgdGhpcy5jb250YWluZXIuc3R5bGUuYm90dG9tID0gJyc7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLnN0eWxlLnRvcCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvcy5pbmNsdWRlcygncmlnaHQnKSkgdGhpcy5jb250YWluZXIuc3R5bGUucmlnaHQgPSAnJztcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIEZvciBvYmplY3QgcG9zaXRpb25zLCBlbnN1cmUgY29udGFpbmVyIGhhcyBwb3NpdGlvbjogZml4ZWRcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSBwb3NpdGlvbiBmb3IgYSBjb250YWluZXIgYmFzZWQgb24gcG9zaXRpb24gY29uZmlnXHJcbiAgICAgKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyRWxcclxuICAgICAqIEByZXR1cm5zIHt7bGVmdD86IHN0cmluZywgdG9wPzogc3RyaW5nLCByaWdodD86IHN0cmluZywgYm90dG9tPzogc3RyaW5nfX1cclxuICAgICAqL1xyXG4gICAgY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGNvbnRhaW5lckVsKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9ucyBhcmUgaGFuZGxlZCBieSBjb250YWluZXIgQ1NTXHJcbiAgICAgICAgICAgIHJldHVybiB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3N0aWNreScgfHwgKCF0eXBlICYmIChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gU3RpY2t5OiBmaXhlZCBwb3NpdGlvbiByZWxhdGl2ZSB0byB2aWV3cG9ydFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge307XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnguc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5yaWdodCA9IHBvc2l0aW9uLnguc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gcG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkuc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5ib3R0b20gPSBwb3NpdGlvbi55LnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gcG9zaXRpb24ueTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3JlbGF0aXZlJyAmJiBwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSZWxhdGl2ZTogcG9zaXRpb24gcmVsYXRpdmUgdG8gZWxlbWVudCB3aXRoIHgveSBvZmZzZXRcclxuICAgICAgICAgICAgICAgIC8vIFVzZSBmaXhlZCBwb3NpdGlvbmluZywgc28gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgaXMgcmVsYXRpdmUgdG8gdmlld3BvcnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBwb3NpdGlvbi5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB4L3kgb2Zmc2V0cyAoY2FuIGJlIHB4LCBlbSwgZXRjLilcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlT2Zmc2V0ID0gKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsKSByZXR1cm4gMDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5pbmNsdWRlcygnZW0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGVtIHRvIHB4IChhcHByb3hpbWF0ZTogMWVtID0gMTZweClcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSAqIDE2O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IHBhcnNlT2Zmc2V0KHBvc2l0aW9uLnggfHwgJzAnKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldFkgPSBwYXJzZU9mZnNldChwb3NpdGlvbi55IHx8ICcwJyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBgJHtyZWN0LmxlZnQgKyBvZmZzZXRYfXB4YCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IGAke3JlY3QudG9wICsgb2Zmc2V0WX1weGBcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2FuY2hvcmVkJyAmJiBwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBbmNob3JlZDogcG9zaXRpb24gcmVsYXRpdmUgdG8gZWxlbWVudCB3aXRoIHBsYWNlbWVudFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHBvc2l0aW9uLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnYXAgPSBwb3NpdGlvbi5nYXAgfHwgJzFlbSc7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIGdhcCAoY2FuIGJlIHB4LCBlbSwgZXRjLilcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlR2FwID0gKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQodmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmluY2x1ZGVzKCdlbScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gKiAxNjsgLy8gQXBwcm94aW1hdGU6IDFlbSA9IDE2cHhcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdhcFB4ID0gcGFyc2VHYXAoZ2FwKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemUgcGxhY2VtZW50IHN5bm9ueW1zIChhYm92ZS9iZWxvdy9iZWZvcmUvYWZ0ZXIpIHRvIENTUyB2YWx1ZXNcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IGFib3ZlIGVsZW1lbnQ6IGJvdHRvbSBvZiB0b2FzdCA9IHRvcCBvZiBlbGVtZW50IC0gZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdHRvbSA9IHZpZXdwb3J0IGhlaWdodCAtIChlbGVtZW50IHRvcCAtIGdhcCkgPSB2aWV3cG9ydCBoZWlnaHQgLSBlbGVtZW50IHRvcCArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMuYm90dG9tID0gYCR7d2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gYCR7cmVjdC5sZWZ0fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgYmVsb3cgZWxlbWVudDogdG9wIG9mIHRvYXN0ID0gYm90dG9tIG9mIGVsZW1lbnQgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGAke3JlY3QuYm90dG9tICsgZ2FwUHh9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IGAke3JlY3QubGVmdH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCB0byB0aGUgbGVmdDogcmlnaHQgb2YgdG9hc3QgPSBsZWZ0IG9mIGVsZW1lbnQgLSBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnJpZ2h0ID0gYCR7d2luZG93LmlubmVyV2lkdGggLSByZWN0LmxlZnQgKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBgJHtyZWN0LnRvcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgdG8gdGhlIHJpZ2h0OiBsZWZ0IG9mIHRvYXN0ID0gcmlnaHQgb2YgZWxlbWVudCArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IGAke3JlY3QucmlnaHQgKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBgJHtyZWN0LnRvcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+PX0gY29uZmlnXHJcbiAqIEByZXR1cm5zIHtUb2FzdE1hbmFnZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVUb2FzdE1hbmFnZXIoY29uZmlnKSB7XHJcbiAgICByZXR1cm4gbmV3IFRvYXN0TWFuYWdlcihjb25maWcpO1xyXG59XHJcblxyXG4vLyBIaWdoLWxldmVsIEFQWC50b2FzdCBBUEkgKGRlZmF1bHQgJiBuYW1lZCBtYW5hZ2VycylcclxubGV0IF9kZWZhdWx0TWFuYWdlciA9IG51bGw7XHJcbmNvbnN0IF9nZXREZWZhdWx0ID0gKCkgPT4ge1xyXG4gICAgaWYgKCFfZGVmYXVsdE1hbmFnZXIpIF9kZWZhdWx0TWFuYWdlciA9IGNyZWF0ZVRvYXN0TWFuYWdlcigpO1xyXG4gICAgcmV0dXJuIF9kZWZhdWx0TWFuYWdlcjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUb2FzdCBBUEkgc3VyZmFjZSB0byBiZSBhdHRhY2hlZCBhcyBBUFgudG9hc3QuXHJcbiAqIENhbGxhYmxlIGZvcm0gcHJveGllcyB0byBkZWZhdWx0TWFuYWdlci5zaG93KG9wdHMpOiBBUFgudG9hc3Qoey4uLn0pXHJcbiAqL1xyXG5mdW5jdGlvbiB0b2FzdChvcHRzKSB7XHJcbiAgICByZXR1cm4gX2dldERlZmF1bHQoKS5zaG93KG9wdHMpO1xyXG59XHJcblxyXG5PYmplY3QuYXNzaWduKHRvYXN0LCB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhIG1hbmFnZXIuIElmIGZpcnN0IGFyZyBpcyBzdHJpbmcsIHJlZ2lzdGVyIGFzIG5hbWVkIHVuZGVyIHRvYXN0LmN1c3RvbVtuYW1lXVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8UGFydGlhbDxUb2FzdENvbmZpZz59IG5hbWVPckNvbmZpZ1xyXG4gICAgICogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPj19IG1heWJlQ29uZmlnXHJcbiAgICAgKiBAcmV0dXJucyB7VG9hc3RNYW5hZ2VyfVxyXG4gICAgICovXHJcbiAgICBjcmVhdGU6IChuYW1lT3JDb25maWcsIG1heWJlQ29uZmlnKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lT3JDb25maWcgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lT3JDb25maWc7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgVG9hc3RNYW5hZ2VyKHsgLi4uKG1heWJlQ29uZmlnIHx8IHt9KSB9KTtcclxuICAgICAgICAgICAgaWYgKCF0b2FzdC5jdXN0b20pIHRvYXN0LmN1c3RvbSA9IHt9O1xyXG4gICAgICAgICAgICB0b2FzdC5jdXN0b21bbmFtZV0gPSBtYW5hZ2VyO1xyXG4gICAgICAgICAgICByZXR1cm4gbWFuYWdlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUb2FzdE1hbmFnZXIoeyAuLi4obmFtZU9yQ29uZmlnIHx8IHt9KSB9KTtcclxuICAgIH0sXHJcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFRvYXN0TWFuYWdlcj59ICovXHJcbiAgICBjdXN0b206IHt9LFxyXG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lICovXHJcbiAgICB1c2U6IChuYW1lKSA9PiAodG9hc3QuY3VzdG9tICYmIHRvYXN0LmN1c3RvbVtuYW1lXSkgfHwgbnVsbCxcclxuICAgIE1hbmFnZXI6IFRvYXN0TWFuYWdlcixcclxuICAgIHNob3c6IChvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLnNob3cob3B0cyksXHJcbiAgICBpbmZvOiAobWVzc2FnZSwgb3B0cykgPT4gX2dldERlZmF1bHQoKS5pbmZvKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgc3VjY2VzczogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkuc3VjY2VzcyhtZXNzYWdlLCBvcHRzKSxcclxuICAgIHdhcm5pbmc6IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLndhcm5pbmcobWVzc2FnZSwgb3B0cyksXHJcbiAgICBkYW5nZXI6IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLmRhbmdlcihtZXNzYWdlLCBvcHRzKSxcclxuICAgIGNvbmZpZ3VyZTogKGNvbmZpZykgPT4gX2dldERlZmF1bHQoKS5jb25maWd1cmUoY29uZmlnKSxcclxuICAgIHNldEFyaWFMaXZlOiAobW9kZSkgPT4gX2dldERlZmF1bHQoKS5zZXRBcmlhTGl2ZShtb2RlKSxcclxuICAgIGNsb3NlQWxsOiAocmVhc29uKSA9PiBfZ2V0RGVmYXVsdCgpLmNsb3NlQWxsKHJlYXNvbiksXHJcbiAgICBnZXRPcGVuVG9hc3RzOiAoKSA9PiBfZ2V0RGVmYXVsdCgpLmdldE9wZW5Ub2FzdHMoKVxyXG59KTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHRvYXN0O1xyXG5leHBvcnQgeyBUb2FzdE1hbmFnZXIsIGNyZWF0ZVRvYXN0TWFuYWdlciwgdG9hc3QgfTtcclxuIiwiLy8gSW1wb3J0IGRlcyBmb25jdGlvbnMgZXQgbW9kdWxlcyBkZXMgc291cy1tb2R1bGVzXHJcbmltcG9ydCBhdWdtZW50V2l0aFBhY2sgZnJvbSAnLi9mb3JtLXBhY2tlci9hdWdtZW50LWFweC5tanMnO1xyXG5pbXBvcnQgeyBwYWNrRm9ybVRvSlNPTiB9IGZyb20gJy4vZm9ybS1wYWNrZXIvcGFja1RvSnNvbi5tanMnO1xyXG5pbXBvcnQgeyBnZXRTY3JvbGxiYXJTaXplIH0gZnJvbSAnLi9nZXRTY3JvbGxiYXJTaXplLm1qcyc7XHJcbmltcG9ydCB7IGxvYWRDc3MgfSBmcm9tICcuL2xvYWRDc3MubWpzJztcclxuXHJcbi8vIEV4cG9ydCBkZSBsYSBmb25jdGlvbiBkJ2F1Z21lbnRhdGlvblxyXG5leHBvcnQgeyBhdWdtZW50V2l0aFBhY2sgfTtcclxuXHJcbi8vIEV4cG9ydCBkZXMgZm9uY3Rpb25zIHV0aWxpdGFpcmVzXHJcbmV4cG9ydCB7IHBhY2tGb3JtVG9KU09OIH07XHJcbmV4cG9ydCB7IGdldFNjcm9sbGJhclNpemUgfTtcclxuZXhwb3J0IHsgbG9hZENzcyB9O1xyXG5cclxuLy8gRXhwb3J0IGQndW4gb2JqZXQgdG9vbHMgcG91ciBmYWNpbGl0ZXIgbCd1dGlsaXNhdGlvblxyXG5leHBvcnQgY29uc3QgdG9vbHMgPSB7XHJcbiAgICBwYWNrRm9ybVRvSlNPTjogcGFja0Zvcm1Ub0pTT04sXHJcbiAgICBnZXRTY3JvbGxiYXJTaXplOiBnZXRTY3JvbGxiYXJTaXplLFxyXG4gICAgbG9hZENzczogbG9hZENzc1xyXG59O1xyXG5cclxuXHJcbiIsImltcG9ydCB7IHBhY2tGb3JtVG9KU09OIH0gZnJvbSAnLi9wYWNrVG9Kc29uLm1qcyc7XHJcblxyXG4vKipcclxuICogQWpvdXRlIGxhIG3DqXRob2RlIHBhY2soKSBhdXggb2JqZXRzIEFQWCBwb3VyIGNvbnZlcnRpciBsZXMgZm9ybXVsYWlyZXMgZW4gSlNPTlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gTCdvYmpldCBBUFggw6AgYXVnbWVudGVyXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgQVBYIGF1Z21lbnTDqVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0aXQgbGUgcHJlbWllciBmb3JtdWxhaXJlIHPDqWxlY3Rpb25uw6kgZW4gb2JqZXQgSlNPTlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIE9wdGlvbnMgcGFzc8OpZXMgw6AgcGFja0Zvcm1Ub0pTT04gKGV4LiB7IG51bWVyaWNLZXlzQWx3YXlzQXJyYXk6IHRydWUgfSlcclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgSlNPTiByw6lzdWx0YW50XHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gU2kgYXVjdW4gZm9ybXVsYWlyZSBuJ2VzdCB0cm91dsOpIG91IHNpIGxlIHByZW1pZXIgw6lsw6ltZW50IG4nZXN0IHBhcyB1biBmb3JtdWxhaXJlXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogY29uc3QgZGF0YSA9IEFQWCgnZm9ybS5teWZvcm1jbGFzcycpLnBhY2soKTtcclxuICAgICAqIGNvbnN0IGRhdGFMZWdhY3kgPSBBUFgoJ2Zvcm0nKS5wYWNrKHsgbnVtZXJpY0tleXNBbHdheXNBcnJheTogdHJ1ZSB9KTtcclxuICAgICAqL1xyXG4gICAgYXB4LnBhY2sgPSBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRoaXMuZmlyc3QoKTtcclxuICAgICAgICBpZiAoIWZpcnN0RWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgZm91bmQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpcnN0RWxlbWVudC50YWdOYW1lICE9PSAnRk9STScpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50IGlzIG5vdCBhIGZvcm0nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhY2tGb3JtVG9KU09OKGZpcnN0RWxlbWVudCwgb3B0aW9ucyk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59XHJcblxyXG5cclxuIiwiLyoqXHJcbiAqIENvbnZlcnRpdCB1biBmb3JtdWxhaXJlIEhUTUwgZW4gb2JqZXQgSlNPTlxyXG4gKiBAcGFyYW0ge0hUTUxGb3JtRWxlbWVudH0gZm9ybSAtIExlIGZvcm11bGFpcmUgw6AgY29udmVydGlyXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIGRlIGNvbnZlcnNpb25cclxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5udW1lcmljS2V5c0Fsd2F5c0FycmF5PWZhbHNlXSAtIFNpIHRydWUsIHRvdXRlIGNsw6kgbnVtw6lyaXF1ZSBlc3QgdHJhaXTDqWUgY29tbWUgaW5kZXggZGUgdGFibGVhdSAoY29tcG9ydGVtZW50IGQnYXZhbnQgMi42LjIpLiBTaW5vbiwgaGV1cmlzdGlxdWUgOiB0YWJsZWF1IHNldWxlbWVudCBzaSBpbmRpY2VzIGRlbnNlcyAwLDEsMizigKYsbi5cclxuICogQHJldHVybnMge09iamVjdH0gTCdvYmpldCBKU09OIHLDqXN1bHRhbnRcclxuICogQHRocm93cyB7VHlwZUVycm9yfSBTaSBmb3JtIG4nZXN0IHBhcyB1biBIVE1MRm9ybUVsZW1lbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBwYWNrRm9ybVRvSlNPTiA9IChmb3JtLCBvcHRpb25zID0ge30pID0+IHtcclxuICAgIC8vIFZhbGlkYXRpb24gZGUgbCdlbnRyw6llXHJcbiAgICBpZiAoIWZvcm0gfHwgIShmb3JtIGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhY2tGb3JtVG9KU09OIGV4cGVjdHMgYW4gSFRNTEZvcm1FbGVtZW50Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbnVtZXJpY0tleXNBbHdheXNBcnJheSA9IG9wdGlvbnMubnVtZXJpY0tleXNBbHdheXNBcnJheSA9PT0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcclxuICAgIGNvbnN0IGpzb25EYXRhID0ge307XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWl0IHVuZSByZXByw6lzZW50YXRpb24gc3RyaW5nIGR1IGNoZW1pbiBwb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1clxyXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydHMgLSBMZXMgcGFydGllcyBkdSBjaGVtaW5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IExlIGNoZW1pbiBmb3JtYXTDqVxyXG4gICAgICovXHJcbiAgICBjb25zdCBidWlsZFBhdGhTdHJpbmcgPSAocGFydHMpID0+IHtcclxuICAgICAgICByZXR1cm4gcGFydHMucmVkdWNlKChwYXRoLCBwYXJ0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdrZXknKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9WyR7cGFydC5uYW1lfV1gIDogcGFydC5uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3BhdGh9WyR7cGFydC5pbmRleH1dYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7cGF0aH1bXWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICAgICAgfSwgJycpO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgLy8gUEhBU0UgMSA6IEFOQUxZU0UgRVQgRMOJVEVDVElPTiBERVMgQ09ORkxJVFNcclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJ1Y3R1cmUgcG91ciBzdG9ja2VyIGwndXRpbGlzYXRpb24gZCd1biBjaGVtaW5cclxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IFBhdGhVc2FnZVxyXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBpc0ZpbmFsIC0gTGUgY2hlbWluIGVzdCB1dGlsaXPDqSBjb21tZSB2YWxldXIgZmluYWxlXHJcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzSW50ZXJtZWRpYXRlIC0gTGUgY2hlbWluIGVzdCB1dGlsaXPDqSBjb21tZSBjaGVtaW4gaW50ZXJtw6lkaWFpcmVcclxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaGFzQXJyYXlTdWZmaXggLSBMZSBjaGVtaW4gc2UgdGVybWluZSBwYXIgW10gKGNyw6llIGRlcyB2YWxldXJzIHByaW1pdGl2ZXMpXHJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlIHF1aSB1dGlsaXNlIGNlIGNoZW1pblxyXG4gICAgICovXHJcbiAgICBcclxuICAgIGNvbnN0IHBhdGhVc2FnZSA9IG5ldyBNYXAoKTsgLy8gTWFwPHBhdGhTdHJpbmcsIFBhdGhVc2FnZT5cclxuICAgIGNvbnN0IGtleUFuYWx5c2lzID0gbmV3IE1hcCgpOyAvLyBNYXA8YmFzZVBhdGgsIHtoYXNOdW1lcmljOiBib29sZWFuLCBoYXNTdHJpbmc6IGJvb2xlYW59PlxyXG4gICAgY29uc3QgbnVtZXJpY0luZGljZXNCeVBhdGggPSBuZXcgTWFwKCk7IC8vIE1hcDxwYXRoU3RyaW5nLCBTZXQ8bnVtYmVyPj4g4oCUIGluZGljZXMgdW5kZXIgZWFjaCBwYXJlbnQgcGF0aFxyXG4gICAgY29uc3QgYWxsRW50cmllcyA9IFtdO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEVucmVnaXN0cmUgbCd1dGlsaXNhdGlvbiBkJ3VuIGNoZW1pbiBkYW5zIHBhdGhVc2FnZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gTGUgY2hlbWluIMOgIGVucmVnaXN0cmVyXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRmluYWwgLSBTaSBjJ2VzdCB1bmUgdmFsZXVyIGZpbmFsZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0FycmF5U3VmZml4IC0gU2kgbGUgY2hlbWluIHNlIHRlcm1pbmUgcGFyIFtdXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHJlY29yZFBhdGhVc2FnZSA9IChjdXJyZW50UGF0aCwgaXNGaW5hbCwgaXNBcnJheVN1ZmZpeCwga2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXNhZ2UgPSBwYXRoVXNhZ2UuZ2V0KGN1cnJlbnRQYXRoKSA/PyB7XHJcbiAgICAgICAgICAgIGlzRmluYWw6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0ludGVybWVkaWF0ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGhhc0FycmF5U3VmZml4OiBmYWxzZSxcclxuICAgICAgICAgICAga2V5XHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXBhdGhVc2FnZS5oYXMoY3VycmVudFBhdGgpKSB7XHJcbiAgICAgICAgICAgIHBhdGhVc2FnZS5zZXQoY3VycmVudFBhdGgsIHVzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGlzRmluYWwpIHtcclxuICAgICAgICAgICAgdXNhZ2UuaXNGaW5hbCA9IHRydWU7XHJcbiAgICAgICAgICAgIHVzYWdlLmtleSA9IGtleTtcclxuICAgICAgICAgICAgaWYgKGlzQXJyYXlTdWZmaXgpIHtcclxuICAgICAgICAgICAgICAgIHVzYWdlLmhhc0FycmF5U3VmZml4ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHVzYWdlLmlzSW50ZXJtZWRpYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdXNhZ2Uua2V5ID8/PSBrZXk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gUHJlbWnDqHJlIHBhc3NlIDogYW5hbHlzZXIgdG91dGVzIGxlcyBjbMOpcyBldCBlbnJlZ2lzdHJlciBsZXMgY2hlbWluc1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7XHJcbiAgICAgICAgaWYgKCFrZXkpIGNvbnRpbnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGFsbEVudHJpZXMucHVzaCh7IGtleSwgdmFsdWUgfSk7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZUtleShrZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENvbnN0cnVpcmUgdG91cyBsZXMgY2hlbWlucyBpbnRlcm3DqWRpYWlyZXMgZXQgbGUgY2hlbWluIGZpbmFsXHJcbiAgICAgICAgbGV0IGN1cnJlbnRQYXRoID0gJyc7XHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IHBhcnRzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyYXlTdWZmaXggPSBwYXJ0LnR5cGUgPT09ICdhcnJheSc7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBDb25zdHJ1aXJlIGxlIGNoZW1pbiBqdXNxdSfDoCBjZSBuaXZlYXVcclxuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2tleScpIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY3VycmVudFBhdGggPyBgJHtjdXJyZW50UGF0aH1bJHtwYXJ0Lm5hbWV9XWAgOiBwYXJ0Lm5hbWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBjdXJyZW50UGF0aDtcclxuICAgICAgICAgICAgICAgIGxldCBzZXQgPSBudW1lcmljSW5kaWNlc0J5UGF0aC5nZXQocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldCA9IG5ldyBTZXQoKTtcclxuICAgICAgICAgICAgICAgICAgICBudW1lcmljSW5kaWNlc0J5UGF0aC5zZXQocGFyZW50UGF0aCwgc2V0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNldC5hZGQocGFydC5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGAke2N1cnJlbnRQYXRofVske3BhcnQuaW5kZXh9XWA7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGAke2N1cnJlbnRQYXRofVtdYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gRW5yZWdpc3RyZXIgbCd1dGlsaXNhdGlvbiBkdSBjaGVtaW5cclxuICAgICAgICAgICAgcmVjb3JkUGF0aFVzYWdlKGN1cnJlbnRQYXRoLCBpc0xhc3QsIGlzQXJyYXlTdWZmaXggJiYgaXNMYXN0LCBrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBBbmFseXNlciBjaGFxdWUgbml2ZWF1IGRlIGxhIGhpw6lyYXJjaGllIHBvdXIgZMOpdGVjdGVyIGxlcyBjb25mbGl0cyAoaW5kaWNlcyBudW3DqXJpcXVlcyB2cyBjbMOpcyBkZSBjaGHDrm5lKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgbmV4dFBhcnQgPSBwYXJ0c1tpICsgMV07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBbmFseXNlciBzZXVsZW1lbnQgbGVzIGNsw6lzIChwYXMgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXMpXHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdrZXknKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHBhcnQubmFtZTsgLy8gTGUgbm9tIGRlIGxhIHByZW1pw6hyZSBjbMOpIGRhbnMgbGUgY2hlbWluXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFuYWx5c2lzID0ga2V5QW5hbHlzaXMuZ2V0KGJhc2VQYXRoKSA/PyB7IGhhc051bWVyaWM6IGZhbHNlLCBoYXNTdHJpbmc6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleUFuYWx5c2lzLmhhcyhiYXNlUGF0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXlBbmFseXNpcy5zZXQoYmFzZVBhdGgsIGFuYWx5c2lzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKG5leHRQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRQYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmFseXNpcy5oYXNOdW1lcmljID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRQYXJ0LnR5cGUgPT09ICdrZXknIHx8IG5leHRQYXJ0LnR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHlzaXMuaGFzU3RyaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRMOpdGVjdGUgZXQgbMOodmUgdW5lIGV4Y2VwdGlvbiBwb3VyIHRvdXMgbGVzIGNvbmZsaXRzIGRlIGNoZW1pbnNcclxuICAgICAqIFxyXG4gICAgICogUHJpbmNpcGUgc2ltcGxlIDogcG91ciBjaGFxdWUgY2hlbWluIGZpbmFsICh2YWxldXIgcHJpbWl0aXZlKSwgdsOpcmlmaWVyIHNpIHVuIGNoZW1pblxyXG4gICAgICogaW50ZXJtw6lkaWFpcmUgY29tbWVuY2UgcGFyIGNlIGNoZW1pbiBzdWl2aSBkZSAnWycuIFNpIGMnZXN0IGxlIGNhcywgYydlc3QgdW4gY29uZmxpdC5cclxuICAgICAqIFxyXG4gICAgICogQ2V0dGUgYXBwcm9jaGUgdW5pZmnDqWUgY291dnJlIHRvdXMgbGVzIGNhcyA6XHJcbiAgICAgKiAtIGl0ZW1zW10gKGZpbmFsKSB2cyBpdGVtc1swXVtuYW1lXSAoaW50ZXJtw6lkaWFpcmUpXHJcbiAgICAgKiAtIGFycmF5WzNdIChmaW5hbCkgdnMgYXJyYXlbM11bbmVzdGVkXSAoaW50ZXJtw6lkaWFpcmUpXHJcbiAgICAgKiAtIGRhdGFba2V5XSAoZmluYWwpIHZzIGRhdGFba2V5XVtzdWJdIChpbnRlcm3DqWRpYWlyZSlcclxuICAgICAqL1xyXG4gICAgY29uc3QgZGV0ZWN0UGF0aENvbmZsaWN0cyA9ICgpID0+IHtcclxuICAgICAgICAvLyAxLiBDb2xsZWN0ZXIgdG91cyBsZXMgY2hlbWlucyBmaW5hdXggKHZhbGV1cnMgcHJpbWl0aXZlcylcclxuICAgICAgICBjb25zdCBmaW5hbFBhdGhzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsUGF0aEtleXMgPSBuZXcgTWFwKCk7IC8vIFBvdXIgbGVzIG1lc3NhZ2VzIGQnZXJyZXVyXHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgdXNhZ2VdIG9mIHBhdGhVc2FnZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgaWYgKHVzYWdlLmlzRmluYWwpIHtcclxuICAgICAgICAgICAgICAgIGZpbmFsUGF0aHMuYWRkKHBhdGgpO1xyXG4gICAgICAgICAgICAgICAgZmluYWxQYXRoS2V5cy5zZXQocGF0aCwgdXNhZ2Uua2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyAyLiBQb3VyIGNoYXF1ZSBjaGVtaW4gaW50ZXJtw6lkaWFpcmUsIHbDqXJpZmllciBzJ2lsIGNvbW1lbmNlIHBhciB1biBjaGVtaW4gZmluYWxcclxuICAgICAgICBmb3IgKGNvbnN0IFtwYXRoLCB1c2FnZV0gb2YgcGF0aFVzYWdlLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBpZiAodXNhZ2UuaXNJbnRlcm1lZGlhdGUpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmluYWxQYXRoIG9mIGZpbmFsUGF0aHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBWw6lyaWZpZXIgc2kgY2UgY2hlbWluIGludGVybcOpZGlhaXJlIGNvbW1lbmNlIHBhciB1biBjaGVtaW4gZmluYWwgc3VpdmkgZGUgJ1snXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhlbXBsZTogZmluYWxQYXRoID0gXCJhcnJheVszXVwiLCBwYXRoID0gXCJhcnJheVszXVtuZXN0ZWRdXCIg4oaSIGNvbmZsaXRcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKGAke2ZpbmFsUGF0aH1bYCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFBhdGggY29uZmxpY3Q6IFwiJHtmaW5hbFBhdGh9XCIgaXMgdXNlZCBhcyBhIGZpbmFsIHZhbHVlIChpbiBmaWVsZCBcIiR7ZmluYWxQYXRoS2V5cy5nZXQoZmluYWxQYXRoKX1cIiksIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJ1dCBcIiR7cGF0aH1cIiB0cmllcyB0byB1c2UgaXQgYXMgYW4gaW50ZXJtZWRpYXRlIHBhdGggKGluIGZpZWxkIFwiJHt1c2FnZS5rZXl9XCIpLiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIGNyZWF0ZXMgaW5jb21wYXRpYmxlIGRhdGEgc3RydWN0dXJlcy4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgWW91IGNhbm5vdCB1c2UgXCIke2ZpbmFsUGF0aH1cIiBhcyBhIHByaW1pdGl2ZSB2YWx1ZSBhbmQgdGhlbiBhY2Nlc3MgaXQgYXMgYW4gb2JqZWN0LmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyBFeMOpY3V0ZXIgbGEgZMOpdGVjdGlvbiBkZXMgY29uZmxpdHNcclxuICAgIGRldGVjdFBhdGhDb25mbGljdHMoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFbDqXJpZmllIHNpIHVuIGNoZW1pbiBkZSBiYXNlIGEgdW4gY29uZmxpdCAoaW5kaWNlcyBudW3DqXJpcXVlcyBFVCBjbMOpcyBkZSBjaGHDrm5lKVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIC0gTGUgY2hlbWluIGRlIGJhc2Ugw6AgdsOpcmlmaWVyXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgY29uc3QgaGFzQ29uZmxpY3QgPSAoYmFzZVBhdGgpID0+IHtcclxuICAgICAgICBpZiAoIWJhc2VQYXRoKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgYW5hbHlzaXMgPSBrZXlBbmFseXNpcy5nZXQoYmFzZVBhdGgpO1xyXG4gICAgICAgIHJldHVybiBhbmFseXNpcz8uaGFzTnVtZXJpYyAmJiBhbmFseXNpcz8uaGFzU3RyaW5nO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRydWUgaWYgaW5kaWNlcyBhcmUgZXhhY3RseSAwLCAxLCAyLCAuLi4sIG4gKGRlbnNlLCBzZXF1ZW50aWFsIGZyb20gMCkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRpY2VzIC0gU29ydGVkIGFycmF5IG9mIGluZGljZXNcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBjb25zdCBpc0RlbnNlU2VxdWVudGlhbCA9IChpbmRpY2VzKSA9PiB7XHJcbiAgICAgICAgaWYgKGluZGljZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLmluZGljZXNdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNvcnRlZC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBpZiAoc29ydGVkW2pdICE9PSBqKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRydWUgaWYgbnVtZXJpYyBrZXlzIHVuZGVyIHRoaXMgcGF0aCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhcnJheSBpbmRpY2VzLlxyXG4gICAgICogV2l0aCBudW1lcmljS2V5c0Fsd2F5c0FycmF5OiBhbHdheXMgdHJ1ZSB3aGVuIHBhdGggaGFzIG51bWVyaWMgY2hpbGRyZW4uXHJcbiAgICAgKiBPdGhlcndpc2U6IHRydWUgb25seSB3aGVuIGluZGljZXMgYXJlIGRlbnNlIDAuLm4uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyZW50UGF0aCAtIFBhdGggdG8gdGhlIGNvbnRhaW5lciB0aGF0IGhhcyBudW1lcmljIGNoaWxkcmVuXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgY29uc3QgdXNlQXJyYXlGb3JOdW1lcmljUGF0aCA9IChwYXJlbnRQYXRoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2V0ID0gbnVtZXJpY0luZGljZXNCeVBhdGguZ2V0KHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGlmICghc2V0IHx8IHNldC5zaXplID09PSAwKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAobnVtZXJpY0tleXNBbHdheXNBcnJheSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGlzRGVuc2VTZXF1ZW50aWFsKFsuLi5zZXRdKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0aXQgdW4gdGFibGVhdSBlbiBvYmpldCBlbiBwcsOpc2VydmFudCBsZXMgaW5kaWNlcyBudW3DqXJpcXVlcyBjb21tZSBwcm9wcmnDqXTDqXNcclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyciAtIExlIHRhYmxlYXUgw6AgY29udmVydGlyXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IHLDqXN1bHRhbnRcclxuICAgICAqL1xyXG4gICAgY29uc3QgYXJyYXlUb09iamVjdCA9IChhcnIpID0+IHtcclxuICAgICAgICBjb25zdCBvYmogPSB7fTtcclxuICAgICAgICAvLyBDb3BpZXIgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXNcclxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBhcnIubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICAgICAgICBvYmpbaWR4XSA9IGFycltpZHhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDb3BpZXIgbGVzIHByb3ByacOpdMOpcyBub24tbnVtw6lyaXF1ZXNcclxuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhhcnIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtS2V5KSB8fCBrICE9PSBTdHJpbmcobnVtS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2tdID0gdjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRpdCB1biBvYmpldCBlbiB0YWJsZWF1IGVuIHByw6lzZXJ2YW50IGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gTCdvYmpldCDDoCBjb252ZXJ0aXJcclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gTGUgdGFibGVhdSByw6lzdWx0YW50XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG9iamVjdFRvQXJyYXkgPSAob2JqKSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iajtcclxuICAgICAgICBjb25zdCBhcnIgPSBbXTtcclxuICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW1LZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyW251bUtleV0gPSB2O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcnI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzdXJlIHF1J3VuIGNvbnRlbmV1ciBlc3QgdW4gb2JqZXQsIGVuIGNvbnZlcnRpc3NhbnQgc2kgbsOpY2Vzc2FpcmVcclxuICAgICAqIEBwYXJhbSB7Kn0gY29udGFpbmVyIC0gTGUgY29udGVuZXVyIMOgIHbDqXJpZmllclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0ga2V5IC0gTGEgY2zDqSBkYW5zIGxlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VPYmplY3QgLSBGb3JjZXIgbGEgY29udmVyc2lvbiBlbiBvYmpldCBtw6ptZSBzJ2lsIG4neSBhIHBhcyBkZSBjb25mbGl0XHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMZSBjb250ZW5ldXIgKGNvbnZlcnRpIGVuIG9iamV0IHNpIG7DqWNlc3NhaXJlKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBlbnN1cmVPYmplY3QgPSAoY29udGFpbmVyLCBrZXksIHBhcmVudCwgZm9yY2VPYmplY3QgPSBmYWxzZSkgPT4ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqID0gYXJyYXlUb09iamVjdChjb250YWluZXIpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIGtleSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50W2tleV0gPSBvYmo7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXIgIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBvYmogPSB7fTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBrZXkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFtrZXldID0gb2JqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzdXJlIHF1J3VuIGNvbnRlbmV1ciBlc3QgdW4gdGFibGVhdSwgZW4gY29udmVydGlzc2FudCBzaSBuw6ljZXNzYWlyZVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgw6AgdsOpcmlmaWVyXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBrZXkgLSBMYSBjbMOpIGRhbnMgbGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R8bnVsbH0gcGFyZW50IC0gTGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHJldHVybnMge0FycmF5fSBMZSBjb250ZW5ldXIgKGNvbnZlcnRpIGVuIHRhYmxlYXUgc2kgbsOpY2Vzc2FpcmUpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGVuc3VyZUFycmF5ID0gKGNvbnRhaW5lciwga2V5LCBwYXJlbnQpID0+IHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcnIgPSBvYmplY3RUb0FycmF5KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYga2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRba2V5XSA9IGFycjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAvLyBQSEFTRSAyIDogVFJBSVRFTUVOVCBERVMgVkFMRVVSU1xyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRyYWl0ZSB1bmUgdmFsZXVyIGZpbmFsZSAoZGVybmnDqHJlIHBhcnRpZSBkdSBjaGVtaW4pXHJcbiAgICAgKiBAcGFyYW0geyp9IGNvbnRhaW5lciAtIExlIGNvbnRlbmV1ciBhY3R1ZWxcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJ0IC0gTGEgcGFydGllIMOgIHRyYWl0ZXJcclxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBMYSB2YWxldXIgw6AgYXNzaWduZXJcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQgLSBMZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggLSBMZSBjaGVtaW4gZGUgYmFzZSBwb3VyIGxhIGTDqXRlY3Rpb24gZGUgY29uZmxpdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudFBhdGggLSBDaGVtaW4gZHUgY29udGVuZXVyIGFjdHVlbCAocG91ciBoZXVyaXN0aXF1ZSBudW1lcmljKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBwcm9jZXNzRmluYWxWYWx1ZSA9IChjb250YWluZXIsIHBhcnQsIHZhbHVlLCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJlbnRQYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAvLyBUYWJsZWF1IGV4cGxpY2l0ZSBhdmVjIFtdXHJcbiAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID8/PSBbXTtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gW2NvbnRhaW5lcltwYXJ0Lm5hbWVdLCB2YWx1ZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgaW5kZXggfSA9IHBhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZUFycmF5ID0gdXNlQXJyYXlGb3JOdW1lcmljUGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgaWYgKHVzZUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVBcnJheShjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRhaW5lci5sZW5ndGggPD0gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIucHVzaCh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlT2JqZWN0KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbaW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBDbMOpIHNpbXBsZSBmaW5hbGVcclxuICAgICAgICAgICAgY29uc3QgY29uZmxpY3QgPSBoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoY29uZmxpY3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBhcnJheVRvT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJbcGFydC5uYW1lXSAhPT0gdW5kZWZpbmVkICYmIFxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgY29udGFpbmVyW3BhcnQubmFtZV0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSBudWxsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFpdGUgdW5lIHBhcnRpZSBpbnRlcm3DqWRpYWlyZSAoY3LDqWUgbGEgc3RydWN0dXJlKVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgYWN0dWVsXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFydCAtIExhIHBhcnRpZSDDoCB0cmFpdGVyXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBuZXh0UGFydCAtIExhIHBhcnRpZSBzdWl2YW50ZSAocGV1dCDDqnRyZSBudWxsKVxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCAtIExlIGNoZW1pbiBkZSBiYXNlIHBvdXIgbGEgZMOpdGVjdGlvbiBkZSBjb25mbGl0XHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0cyAtIFRvdXRlcyBsZXMgcGFydGllcyBkdSBjaGVtaW4gKHBvdXIgY29uc3RydWlyZSBsZSBjaGVtaW4gY29tcGxldCBkYW5zIGxlcyBlcnJldXJzKVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGkgLSBMJ2luZGV4IGRlIGxhIHBhcnRpZSBhY3R1ZWxsZSAocG91ciBjb25zdHJ1aXJlIGxlIGNoZW1pbiBjb21wbGV0IGRhbnMgbGVzIGVycmV1cnMpXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlIChwb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1cilcclxuICAgICAqIEByZXR1cm5zIHsqfSBMZSBub3V2ZWF1IGNvbnRlbmV1ciBhcHLDqHMgdHJhaXRlbWVudFxyXG4gICAgICovXHJcbiAgICBjb25zdCBwcm9jZXNzSW50ZXJtZWRpYXRlUGFydCA9IChjb250YWluZXIsIHBhcnQsIG5leHRQYXJ0LCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJ0cywgaSwga2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgaW5kZXggfSA9IHBhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGFydHMuc2xpY2UoMCwgaSkpO1xyXG4gICAgICAgICAgICBjb25zdCB1c2VBcnJheSA9IHVzZUFycmF5Rm9yTnVtZXJpY1BhdGgocGFyZW50UGF0aCkgJiYgIWhhc0NvbmZsaWN0KGJhc2VQYXRoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICghdXNlQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA/Pz0ge307XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRhaW5lcltpbmRleF0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltpbmRleF0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJ0cy5zbGljZSgwLCBpICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGF0aFBhcnRzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IG9uIHByaW1pdGl2ZSB2YWx1ZS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBLZXkgXCIke2tleX1cIiB0cmllcyB0byBhY2Nlc3MgXCIke2N1cnJlbnRQYXRofVwiIGJ1dCBpdCBpcyBhbHJlYWR5IGEgJHt0eXBlb2YgY29udGFpbmVyW2luZGV4XX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW2luZGV4XSl9LiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlQXJyYXkoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChjb250YWluZXIubGVuZ3RoIDw9IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnB1c2godW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPz89IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXJbaW5kZXhdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbaW5kZXhdID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhdGhQYXJ0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBvbiBwcmltaXRpdmUgdmFsdWUuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgS2V5IFwiJHtrZXl9XCIgdHJpZXMgdG8gYWNjZXNzIFwiJHtjdXJyZW50UGF0aH1cIiBidXQgaXQgaXMgYWxyZWFkeSBhICR7dHlwZW9mIGNvbnRhaW5lcltpbmRleF19IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGNvbnRhaW5lcltpbmRleF0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgZHVyaW5nIGNvbmZsaWN0IGRldGVjdGlvbiBwaGFzZS5gXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyW2luZGV4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ2zDqSBub3JtYWxlIDogY3LDqWVyIG9iamV0IG91IHRhYmxlYXUgc2Vsb24gbGEgcGFydGllIHN1aXZhbnRlXHJcbiAgICAgICAgY29uc3QgbmV4dElzTnVtZXJpYyA9IG5leHRQYXJ0Py50eXBlID09PSAnbnVtZXJpYyc7XHJcbiAgICAgICAgY29uc3QgY29uZmxpY3QgPSBoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGNvbmZsaWN0KSB7XHJcbiAgICAgICAgICAgIC8vIENvbmZsaXQgOiB0b3Vqb3VycyB1dGlsaXNlciB1biBvYmpldFxyXG4gICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVPYmplY3QoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPz89IHt9O1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gYXJyYXlUb09iamVjdChjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbcGFydC5uYW1lXSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2V0dGUgZXJyZXVyIG5lIGRldnJhaXQgamFtYWlzIHNlIHByb2R1aXJlIHNpIGxhIGTDqXRlY3Rpb24gZm9uY3Rpb25uZSBjb3JyZWN0ZW1lbnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhdGhQYXJ0cyk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgICAgICBgS2V5IFwiJHtrZXl9XCIgdHJpZXMgdG8gYWNjZXNzIFwiJHtjdXJyZW50UGF0aH1cIiBidXQgaXQgaXMgYWxyZWFkeSBhICR7dHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdfSB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeShjb250YWluZXJbcGFydC5uYW1lXSl9LiBgICtcclxuICAgICAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBQYXMgZGUgY29uZmxpdCwgY3LDqWVyIHNlbG9uIGxhIHBhcnRpZSBzdWl2YW50ZVxyXG4gICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IG5leHRJc051bWVyaWMgPyBbXSA6IHt9O1xyXG4gICAgICAgIH0gZWxzZSBpZiAobmV4dElzTnVtZXJpYyAmJiAhQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgLy8gT24gYSBiZXNvaW4gZCd1biB0YWJsZWF1IG1haXMgYydlc3QgdW4gb2JqZXRcclxuICAgICAgICAgICAgY29uc3QgaGFzU3RyaW5nS2V5cyA9IE9iamVjdC5rZXlzKGNvbnRhaW5lcltwYXJ0Lm5hbWVdKS5zb21lKGsgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtS2V5ID0gTnVtYmVyLnBhcnNlSW50KGssIDEwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtS2V5KSB8fCBrICE9PSBTdHJpbmcobnVtS2V5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICghaGFzU3RyaW5nS2V5cykge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBvYmplY3RUb0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIW5leHRJc051bWVyaWMgJiYgIWlzUGxhaW5PYmplY3QoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgIC8vIE9uIGEgYmVzb2luIGQndW4gb2JqZXQgbWFpcyBjJ2VzdCB1biB0YWJsZWF1XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBhcnJheVRvT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gUydhc3N1cmVyIHF1ZSBjb250YWluZXJbcGFydC5uYW1lXSBlc3QgYmllbiB1biBvYmpldCBhcHLDqHMgdG91dGVzIGxlcyBjb252ZXJzaW9uc1xyXG4gICAgICAgIGlmIChjb250YWluZXJbcGFydC5uYW1lXSAhPT0gdW5kZWZpbmVkICYmIFxyXG4gICAgICAgICAgICAodHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbcGFydC5uYW1lXSA9PT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgLy8gQ2V0dGUgZXJyZXVyIG5lIGRldnJhaXQgamFtYWlzIHNlIHByb2R1aXJlIHNpIGxhIGTDqXRlY3Rpb24gZm9uY3Rpb25uZSBjb3JyZWN0ZW1lbnRcclxuICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBvbiBwcmltaXRpdmUgdmFsdWUuIGAgK1xyXG4gICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW3BhcnQubmFtZV0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyW3BhcnQubmFtZV07XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyBUcmFpdGVyIHRvdXRlcyBsZXMgZW50csOpZXNcclxuICAgIGZvciAoY29uc3QgeyB2YWx1ZSwga2V5IH0gb2YgYWxsRW50cmllcykge1xyXG4gICAgICAgIGlmICgha2V5KSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZUtleShrZXkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSBbeyBjb250YWluZXI6IGpzb25EYXRhLCBrZXk6IG51bGwgfV07XHJcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IGpzb25EYXRhO1xyXG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gcGFydHNbMF0/LnR5cGUgPT09ICdrZXknID8gcGFydHNbMF0ubmFtZSA6ICcnO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gcGFydHMubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgY29uc3QgbmV4dFBhcnQgPSBpICsgMSA8IHBhcnRzLmxlbmd0aCA/IHBhcnRzW2kgKyAxXSA6IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc0xhc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGFydHMuc2xpY2UoMCwgaSkpO1xyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbmFsVmFsdWUoY29udGFpbmVyLCBwYXJ0LCB2YWx1ZSwgcGFyZW50LCBiYXNlUGF0aCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBQYXJ0aWUgaW50ZXJtw6lkaWFpcmUgOiBjcsOpZXIgbGEgc3RydWN0dXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb250YWluZXIgPSBwcm9jZXNzSW50ZXJtZWRpYXRlUGFydChjb250YWluZXIsIHBhcnQsIG5leHRQYXJ0LCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJ0cywgaSwga2V5KTtcclxuICAgICAgICAgICAgICAgIHBhdGgucHVzaCh7IGNvbnRhaW5lciwga2V5OiBwYXJ0LnR5cGUgPT09ICdudW1lcmljJyA/IHBhcnQuaW5kZXggOiBwYXJ0Lm5hbWUgfSk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBuZXdDb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGpzb25EYXRhO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlIHVuZSBjbMOpIGRlIGZvcm11bGFpcmUgcG91ciBleHRyYWlyZSBsZXMgcGFydGllcyAobm9tLCBpbmRpY2VzLCBldGMuKVxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSDDoCBwYXJzZXIgKGV4OiBcInVzZXJbZW1haWxdXCIsIFwidGFnc1tdXCIsIFwiaXRlbXNbMF1bbmFtZV1cIilcclxuICogQHJldHVybnMge0FycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgaW5kZXg/OiBudW1iZXJ9Pn0gVGFibGVhdSBkZXMgcGFydGllcyBwYXJzw6llc1xyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY29uc3QgcGFyc2VLZXkgPSAoa2V5KSA9PiB7XHJcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xyXG4gICAgbGV0IGN1cnJlbnQgPSAnJztcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IGxlbiA9IGtleS5sZW5ndGg7XHJcblxyXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcclxuICAgICAgICBjb25zdCBjaGFyID0ga2V5W2ldO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChjaGFyID09PSAnWycpIHtcclxuICAgICAgICAgICAgLy8gU2F1dmVnYXJkZXIgbGEgcGFydGllIHByw6ljw6lkZW50ZSBzaSBlbGxlIGV4aXN0ZVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IGN1cnJlbnQsIHR5cGU6ICdrZXknIH0pO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudCA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBUcm91dmVyIGxhIGZpbiBkdSBjcm9jaGV0XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgbGV0IGJyYWNrZXRDb250ZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuICYmIGtleVtpXSAhPT0gJ10nKSB7XHJcbiAgICAgICAgICAgICAgICBicmFja2V0Q29udGVudCArPSBrZXlbaV07XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChicmFja2V0Q29udGVudCA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgIC8vIFtdIHZpZGUgPSB0YWJsZWF1XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhcnQudHlwZSA9ICdhcnJheSc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFtdIGF1IGTDqWJ1dCwgY3LDqWVyIHVuZSBwYXJ0aWUgc3DDqWNpYWxlXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6ICcnLCB0eXBlOiAnYXJyYXknIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudSBkYW5zIGxlcyBjcm9jaGV0c1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtSW5kZXggPSBOdW1iZXIucGFyc2VJbnQoYnJhY2tldENvbnRlbnQsIDEwKTtcclxuICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bUluZGV4KSAmJiBicmFja2V0Q29udGVudCA9PT0gU3RyaW5nKG51bUluZGV4KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluZGljZSBudW3DqXJpcXVlXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IFN0cmluZyhudW1JbmRleCksIHR5cGU6ICdudW1lcmljJywgaW5kZXg6IG51bUluZGV4IH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBOb20gZGUgcHJvcHJpw6l0w6lcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogYnJhY2tldENvbnRlbnQsIHR5cGU6ICdrZXknIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGkrKzsgLy8gUGFzc2VyIGxlICddJ1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQWpvdXRlciBsYSBkZXJuacOocmUgcGFydGllIHNpIGVsbGUgZXhpc3RlXHJcbiAgICBpZiAoY3VycmVudCkge1xyXG4gICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiBjdXJyZW50LCB0eXBlOiAna2V5JyB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHBhcnRzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFbDqXJpZmllIHNpIHVuZSB2YWxldXIgZXN0IHVuIG9iamV0IHNpbXBsZSAocGFzIHVuIHRhYmxlYXUsIHBhcyBudWxsKVxyXG4gKiBAcGFyYW0geyp9IG9iaiAtIExhIHZhbGV1ciDDoCB2w6lyaWZpZXJcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKG9iaikgPT4ge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xyXG59O1xyXG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0U2Nyb2xsYmFyU2l6ZShvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIikge1xyXG4gICAgaWYgKCFnZXRTY3JvbGxiYXJTaXplLl9jYWNoZSkge1xyXG4gICAgICAgIGNvbnN0IG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKG91dGVyLnN0eWxlLCB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXHJcbiAgICAgICAgICAgIHRvcDogXCItOTk5OXB4XCIsXHJcbiAgICAgICAgICAgIGxlZnQ6IFwiLTk5OTlweFwiLFxyXG4gICAgICAgICAgICB3aWR0aDogXCIxMDBweFwiLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IFwiMTAwcHhcIixcclxuICAgICAgICAgICAgb3ZlcmZsb3c6IFwic2Nyb2xsXCIsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3V0ZXIpO1xyXG5cclxuICAgICAgICBnZXRTY3JvbGxiYXJTaXplLl9jYWNoZSA9IHtcclxuICAgICAgICAgICAgdmVydGljYWw6IG91dGVyLm9mZnNldFdpZHRoIC0gb3V0ZXIuY2xpZW50V2lkdGgsXHJcbiAgICAgICAgICAgIGhvcml6b250YWw6IG91dGVyLm9mZnNldEhlaWdodCAtIG91dGVyLmNsaWVudEhlaWdodCxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBvdXRlci5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZ2V0U2Nyb2xsYmFyU2l6ZS5fY2FjaGVbb3JpZW50YXRpb25dID8/IDA7XHJcbn1cclxuIiwiY29uc3QgbG9hZENzc0NhY2hlID0gbmV3IE1hcCgpO1xyXG5cclxuLyoqXHJcbiAqIExvYWRzIENTUyBmcm9tIGEgVVJMIGFuZCBpbmplY3RzIGl0IGludG8gdGhlIGRvY3VtZW50LlxyXG4gKiBJZGVtcG90ZW50OiBzYW1lIFVSTCByZXR1cm5zIHRoZSBzYW1lIFByb21pc2U7IGR1cGxpY2F0ZSBsb2FkcyBhcmUgYXZvaWRlZC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFVSTCBvZiB0aGUgQ1NTIGZpbGUgdG8gbG9hZFxyXG4gKiBAcGFyYW0ge3sgaWQ/OiBzdHJpbmcsIG1lZGlhPzogc3RyaW5nLCBiZWZvcmU/OiBOb2RlIH19IFtvcHRpb25zXSAtIE9wdGlvbmFsOiBpZCBhbmQgbWVkaWEgZm9yIHRoZSBzdHlsZSBlbGVtZW50LCBiZWZvcmUgZm9yIGluc2VydGlvbiBwb2ludFxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxIVE1MU3R5bGVFbGVtZW50Pn0gUmVzb2x2ZXMgd2l0aCB0aGUgaW5qZWN0ZWQgc3R5bGUgZWxlbWVudDsgcmVqZWN0cyBvbiBmZXRjaCBmYWlsdXJlIG9yIG5vbi1vayByZXNwb25zZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRDc3ModXJsLCBvcHRpb25zID0ge30pIHtcclxuICAgIGNvbnN0IGNhY2hlZCA9IGxvYWRDc3NDYWNoZS5nZXQodXJsKTtcclxuICAgIGlmIChjYWNoZWQpIHtcclxuICAgICAgICByZXR1cm4gY2FjaGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByb21pc2UgPSBmZXRjaCh1cmwpXHJcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgQ1NTOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAudGhlbigoY3NzKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlU2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmlkKSBzdHlsZVNoZWV0LmlkID0gb3B0aW9ucy5pZDtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMubWVkaWEpIHN0eWxlU2hlZXQubWVkaWEgPSBvcHRpb25zLm1lZGlhO1xyXG4gICAgICAgICAgICBzdHlsZVNoZWV0LnRleHRDb250ZW50ID0gY3NzO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaW5zZXJ0QmVmb3JlID0gb3B0aW9ucy5iZWZvcmU7XHJcbiAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUgJiYgaW5zZXJ0QmVmb3JlLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzdHlsZVNoZWV0LCBpbnNlcnRCZWZvcmUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZVNoZWV0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN0eWxlU2hlZXQ7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGxvYWRDc3NDYWNoZS5kZWxldGUodXJsKTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBsb2FkIENTUzpcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICBsb2FkQ3NzQ2FjaGUuc2V0KHVybCwgcHJvbWlzZSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxufVxyXG4iLCJpbXBvcnQgJy4vY3NzL3RyaXN0YXRlLmNzcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRyaS1zdGF0ZSBjaGVja2JveCBmb3IgZWFjaCBjaGVja2JveCBlbGVtZW50IGluIHRoZSBhcHguZWxlbWVudHMgYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5PEhUTUxFbGVtZW50Pn0gYXB4IC0gQW4gYXJyYXkgb2YgSFRNTEVsZW1lbnRzIHdoaWNoIGlzIHJldHVybmVkIGJ5IEFQWCgpXG4gKiBAZXhhbXBsZVxuICogLy8gQ2FsbCB0aGUgdHJpc3RhdGUgZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgY2hlY2tib3ggZWxlbWVudHNcbiAqIGFweC50cmlzdGF0ZSgpO1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoYXB4KSB7XG4gICAgYXB4LnRyaXN0YXRlID0gZnVuY3Rpb24gKG9wdGlvbnMgPSB7fSl7XG4gICAgICAgIGFweC5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW29yaWdpbmFsQ2hlY2tib3gsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dF0gPSBjcmVhdGVUcmlTdGF0ZUNoZWNrYm94KGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsQ2hlY2tib3guX2FweFRyaXN0YXRlID0geyBkb206IHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCB9O1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNhbGxiYWNrcyAmJiBvcHRpb25zLmNhbGxiYWNrcy5hZnRlciAmJiB0eXBlb2Ygb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIob3JpZ2luYWxDaGVja2JveCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0Q2hpbGRyZW4oY2hpbGRyZW5BcHgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0Q2hpbGRyZW4oYXB4LCBjaGlsZHJlbkFweCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbn1cblxuLyoqXG4gKiBMaW5rIHBhcmVudCB0cmlzdGF0ZShzKSB0byBjaGlsZCBjaGVja2JveGVzLiBXaGVuIGV4YWN0bHkgb25lIHBhcmVudDogdGhhdCBwYXJlbnQgZ2V0c1xuICogaW5kZXRlcm1pbmF0ZS1kYXNoIGF1dG9tYXRpY2FsbHkgYW5kIHNob3dzIGRhc2ggd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQ7IGNsaWNrIHBhcmVudCB0byBhcHBseSBpdHMgc3RhdGUgdG8gYWxsIGNoaWxkcmVuLlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEFweCAtIEFQWCBpbnN0YW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgdGhlIHBhcmVudCBjaGVja2JveChlcylcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaGlsZHJlbkFweCAtIEFQWCBpbnN0YW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgdGhlIGNoaWxkIGNoZWNrYm94KGVzKVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIHVzZWQgZm9yIHRoZSBwYXJlbnQgKGFuZCBhcHBsaWVkIHRvIGNoaWxkcmVuIHdoZW4gaW5pdGlhbGl6aW5nIHRoZW0pXG4gKi9cbmZ1bmN0aW9uIHNldENoaWxkcmVuKHBhcmVudEFweCwgY2hpbGRyZW5BcHgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBwYXJlbnRzID0gcGFyZW50QXB4LmFsbCgpLmZpbHRlcigoZWwpID0+IGVsLnR5cGUgPT09ICdjaGVja2JveCcpO1xuICAgIGlmIChwYXJlbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdBUFggdHJpc3RhdGUgc2V0Q2hpbGRyZW46IG9ubHkgdGhlIGZpcnN0IHBhcmVudCBpcyBsaW5rZWQgdG8gYWxsIGNoaWxkcmVuLicpO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRDaGVja2JveCA9IHBhcmVudHNbMF07XG4gICAgY29uc3QgcGFyZW50UmVmID0gcGFyZW50Q2hlY2tib3guX2FweFRyaXN0YXRlO1xuICAgIGlmICghcGFyZW50UmVmKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJlbnREb20gPSBwYXJlbnRSZWYuZG9tO1xuICAgIGNvbnN0IHBhcmVudEhpZGRlbklucHV0ID0gcGFyZW50UmVmLmhpZGRlbklucHV0O1xuXG4gICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgaW5kZXRlcm1pbmF0ZSAoZGFzaCkgb24gcGFyZW50IHdoZW4gaXQgaGFzIGNoaWxkcmVuOiBkYXNoIHNob3dzIG9ubHkgd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQgKC0tbWl4ZWQpXG4gICAgcGFyZW50RG9tLmNsYXNzTGlzdC5hZGQoJ2FweC10cmlzdGF0ZS0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUnLCAnYXB4LXRyaXN0YXRlLS1pbmRldGVybWluYXRlLWRhc2gnKTtcblxuICAgIGNvbnN0IGNoaWxkQ2hlY2tib3hlcyA9IGNoaWxkcmVuQXB4LmFsbCgpLmZpbHRlcigoZWwpID0+IGVsLnR5cGUgPT09ICdjaGVja2JveCcpO1xuICAgIGNvbnN0IGNoaWxkUmVmcyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gc3luY1BhcmVudEZyb21DaGlsZHJlbigpIHtcbiAgICAgICAgaWYgKGNoaWxkUmVmcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgY29uc3Qgc3RhdGVzID0gY2hpbGRSZWZzLm1hcCgocmVmKSA9PiBnZXRUcmlzdGF0ZVN0YXRlKHJlZi5kb20pKTtcbiAgICAgICAgY29uc3QgYWxsQ2hlY2tlZCA9IHN0YXRlcy5ldmVyeSgocykgPT4gcyA9PT0gJ2NoZWNrZWQnKTtcbiAgICAgICAgY29uc3QgYWxsQ3Jvc3NlZCA9IHN0YXRlcy5ldmVyeSgocykgPT4gcyA9PT0gJ2Nyb3NzZWQnKTtcbiAgICAgICAgY29uc3QgYWxsVW5jaGVja2VkID0gc3RhdGVzLmV2ZXJ5KChzKSA9PiBzID09PSAndW5jaGVja2VkJyk7XG4gICAgICAgIGNvbnN0IG1peGVkID0gIWFsbENoZWNrZWQgJiYgIWFsbENyb3NzZWQgJiYgIWFsbFVuY2hlY2tlZDtcblxuICAgICAgICBwYXJlbnREb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgICAgICBpZiAobWl4ZWQpIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUtLW1peGVkJyk7XG4gICAgICAgIGVsc2UgcGFyZW50RG9tLmNsYXNzTGlzdC5yZW1vdmUoJ2FweC10cmlzdGF0ZS0tbWl4ZWQnKTtcblxuICAgICAgICBpZiAoYWxsQ2hlY2tlZCkge1xuICAgICAgICAgICAgcGFyZW50RG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcbiAgICAgICAgICAgIHBhcmVudEhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xuICAgICAgICB9IGVsc2UgaWYgKGFsbENyb3NzZWQpIHtcbiAgICAgICAgICAgIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdjcm9zc2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJlbnREb20uY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgICAgICAgICAgIHBhcmVudEhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5UGFyZW50VG9DaGlsZHJlbigpIHtcbiAgICAgICAgY29uc3QgcGFyZW50U3RhdGUgPSBnZXRUcmlzdGF0ZVN0YXRlKHBhcmVudERvbSk7XG4gICAgICAgIGNoaWxkUmVmcy5mb3JFYWNoKChyZWYpID0+IHNldFRyaXN0YXRlU3RhdGUocmVmLmNoZWNrYm94LCByZWYuZG9tLCByZWYuaGlkZGVuSW5wdXQsIHBhcmVudFN0YXRlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRPcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICAgIGFmdGVyKGNoZWNrYm94LCBkb20sIGhpZGRlbklucHV0KSB7XG4gICAgICAgICAgICAgICAgY2hpbGRSZWZzLnB1c2goeyBjaGVja2JveCwgZG9tLCBoaWRkZW5JbnB1dCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGFuZ2U6IHN5bmNQYXJlbnRGcm9tQ2hpbGRyZW5cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjaGlsZHJlbkFweC50cmlzdGF0ZShjaGlsZE9wdGlvbnMpO1xuXG4gICAgc3luY1BhcmVudEZyb21DaGlsZHJlbigpO1xuICAgIHBhcmVudERvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldFRpbWVvdXQoYXBwbHlQYXJlbnRUb0NoaWxkcmVuLCAwKSk7XG59XG5cbmZ1bmN0aW9uIGdldFRyaXN0YXRlU3RhdGUoZG9tKSB7XG4gICAgaWYgKGRvbS5jbGFzc0xpc3QuY29udGFpbnMoJ2NoZWNrZWQnKSkgcmV0dXJuICdjaGVja2VkJztcbiAgICBpZiAoZG9tLmNsYXNzTGlzdC5jb250YWlucygnY3Jvc3NlZCcpKSByZXR1cm4gJ2Nyb3NzZWQnO1xuICAgIHJldHVybiAndW5jaGVja2VkJztcbn1cblxuZnVuY3Rpb24gc2V0VHJpc3RhdGVTdGF0ZShjaGVja2JveCwgZG9tLCBoaWRkZW5JbnB1dCwgc3RhdGUpIHtcbiAgICBkb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgIGRvbS5jbGFzc0xpc3QuYWRkKHN0YXRlKTtcbiAgICBjb25zdCBuYW1lID0gY2hlY2tib3guZGF0YXNldC5uYW1lIHx8IGNoZWNrYm94LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJykgfHwgY2hlY2tib3gubmFtZSB8fCAnJztcbiAgICBpZiAoc3RhdGUgPT09ICdjaGVja2VkJykge1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgaWYgKG5hbWUpIGhpZGRlbklucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUpO1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAnY3Jvc3NlZCcpIHtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgICAgICBpZiAobmFtZSkgaGlkZGVuSW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgbmFtZSk7XG4gICAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0b2dnbGVUcmlTdGF0ZUNoZWNrYm94U3RhdGUoY3VzdG9tQ2hlY2tib3gsIGFjdHVhbENoZWNrYm94LCBoaWRkZW5JbnB1dCkge1xuICAgIGNvbnN0IHdhc0NoZWNrZWQgPSBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuY29udGFpbnMoJ2NoZWNrZWQnKTtcbiAgICBjb25zdCB3YXNDcm9zc2VkID0gY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmNvbnRhaW5zKCdjcm9zc2VkJyk7XG4gICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgIGlmICh3YXNDaGVja2VkKSB7XG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ2Nyb3NzZWQnKTtcbiAgICAgICAgYWN0dWFsQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XG4gICAgfSBlbHNlIGlmICh3YXNDcm9zc2VkKSB7XG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XG4gICAgICAgIGFjdHVhbENoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgaGlkZGVuSW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgYWN0dWFsQ2hlY2tib3guZGF0YXNldC5uYW1lKTsgLy8gUmVzdG9yZSB0aGUgbmFtZSBmb3IgcG9zdGluZ1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlVHJpU3RhdGVDaGVja2JveChjaGVja2JveEVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICBcbiAgICAvL2dldCB0aGUgY2hlY2tib3ggbWFyZ2lucyBpbmNsdWRpbmcgYnJvd3NlciBkZWZhdWx0XG4gICAgY29uc3QgY2hlY2tib3hTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNoZWNrYm94RWxlbWVudCk7XG4gICAgLy8gSGlkZSB0aGUgb3JpZ2luYWwgY2hlY2tib3hcbiAgICBjaGVja2JveEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIC8vIENyZWF0ZSB0aGUgY3VzdG9tIGNoZWNrYm94IGRpdiBhbmQgc2V0IGl0cyBpbml0aWFsIHN0YXRlXG4gICAgY29uc3QgdHJpc3RhdGVEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUnKTtcbiAgICBpZiAob3B0aW9ucy5zaXplKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnNpemUud2lkdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgdyA9IG9wdGlvbnMuc2l6ZS53aWR0aDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdyAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJpc3RhdGUgc2l6ZS53aWR0aCBtdXN0IGJlIGEgbnVtYmVyIChweCkgb3IgYSBzdHJpbmcgKENTUyBsZW5ndGgpLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJpc3RhdGVEb20uc3R5bGUud2lkdGggPSB0eXBlb2YgdyA9PT0gJ251bWJlcicgPyB3ICsgJ3B4JyA6IFN0cmluZyh3KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5zaXplLmhlaWdodCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBoID0gb3B0aW9ucy5zaXplLmhlaWdodDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaCAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJpc3RhdGUgc2l6ZS5oZWlnaHQgbXVzdCBiZSBhIG51bWJlciAocHgpIG9yIGEgc3RyaW5nIChDU1MgbGVuZ3RoKS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyaXN0YXRlRG9tLnN0eWxlLmhlaWdodCA9IHR5cGVvZiBoID09PSAnbnVtYmVyJyA/IGggKyAncHgnIDogU3RyaW5nKGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuY2xhc3NlcykgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCguLi5jb21wdXRlQ2xhc3NlcyhvcHRpb25zLmNsYXNzZXMpKTtcbiAgICBjb25zdCBjb2xvcnMgPSByZXNvbHZlQ29sb3JzKG9wdGlvbnMpO1xuICAgIGlmIChjb2xvcnMudGljayAhPSBudWxsKSB0cmlzdGF0ZURvbS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcicsIFN0cmluZyhjb2xvcnMudGljaykpO1xuICAgIGlmIChjb2xvcnMuY2hlY2tlZCAhPSBudWxsKSB0cmlzdGF0ZURvbS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcicsIFN0cmluZyhjb2xvcnMuY2hlY2tlZCkpO1xuICAgIGlmIChjb2xvcnMuY3Jvc3NlZCAhPSBudWxsKSB0cmlzdGF0ZURvbS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtdHJpc3RhdGUtY3Jvc3NlZC1jb2xvcicsIFN0cmluZyhjb2xvcnMuY3Jvc3NlZCkpO1xuXG4gICAgdHJpc3RhdGVEb20uc3R5bGUubWFyZ2luID0gY2hlY2tib3hTdHlsZS5tYXJnaW47XG5cbiAgICBpZiAoY2hlY2tib3hFbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgaGlkZGVuIGlucHV0IGZpZWxkXG4gICAgY29uc3QgaGlkZGVuSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGhpZGRlbklucHV0LnR5cGUgPSAnaGlkZGVuJztcbiAgICBoaWRkZW5JbnB1dC5uYW1lID0gY2hlY2tib3hFbGVtZW50Lm5hbWU7IC8vIENvcHkgdGhlIG5hbWUgZnJvbSB0aGUgb3JpZ2luYWwgY2hlY2tib3hcbiAgICBjaGVja2JveEVsZW1lbnQuZGF0YXNldC5uYW1lID0gY2hlY2tib3hFbGVtZW50Lm5hbWU7IC8vIFN0b3JlIHRoZSBuYW1lIGluIGEgZGF0YSBhdHRyaWJ1dGUgZm9yIGxhdGVyIHVzZVxuICAgIGNoZWNrYm94RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsgLy8gUmVtb3ZlIHRoZSBuYW1lIGZyb20gdGhlIG9yaWdpbmFsIGNoZWNrYm94IHRvIGF2b2lkIGRvdWJsZSBwb3N0aW5nXG5cbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0U3RhdGUpIHNldERlZmF1bHRTdGF0ZShvcHRpb25zLCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpO1xuICAgIGVsc2V7XG4gICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGhpZGRlbiBpbnB1dCBiYXNlZCBvbiB0aGUgY2hlY2tib3gncyBzdGF0ZVxuICAgICAgICBpZiAoY2hlY2tib3hFbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlkZGVuSW5wdXQubmFtZSA9ICcnOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9oYW5kbGUgYWNjZXNzaWJpbGl0eSwgc2V0IHRoZSB0YWJpbmRleCB0byB0aGUgc2FtZSBhcyB0aGUgY2hlY2tib3hcbiAgICB0cmlzdGF0ZURvbS50YWJJbmRleCA9IGNoZWNrYm94RWxlbWVudC50YWJJbmRleDtcblxuICAgIC8vIEluc2VydCB0aGUgaGlkZGVuIGlucHV0IGluc2lkZSB0aGUgY3VzdG9tIGNoZWNrYm94IGRpdlxuICAgIHRyaXN0YXRlRG9tLmFwcGVuZENoaWxkKGhpZGRlbklucHV0KTtcblxuICAgIC8vIEluc2VydCBpdCBuZXh0IHRvIHRoZSBhY3R1YWwgY2hlY2tib3hcbiAgICBjaGVja2JveEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJpc3RhdGVEb20sIGNoZWNrYm94RWxlbWVudC5uZXh0U2libGluZyk7XG5cbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJcbiAgICB0cmlzdGF0ZURvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRvZ2dsZVRyaVN0YXRlQ2hlY2tib3hTdGF0ZSh0cmlzdGF0ZURvbSwgY2hlY2tib3hFbGVtZW50LCBoaWRkZW5JbnB1dCk7XG4gICAgICAgIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChvcHRpb25zLCBjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCwgZSk7XG4gICAgfSk7XG4gICAgdHJpc3RhdGVEb20uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBvbmtleXVwLmJpbmQobnVsbCwgY2hlY2tib3hFbGVtZW50KSk7XG5cbiAgICByZXR1cm4gW2NoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0XTtcbn1cblxuZnVuY3Rpb24gc2V0RGVmYXVsdFN0YXRlKG9wdGlvbnMsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCkge1xuICAgIC8vIEVuc3VyZSBvbmx5IG9uZSBzdGF0ZSBjbGFzcyBpcyBzZXQgKHVuY2hlY2tlZEFwcGVhcmFuY2UgbW9kaWZpZXJzIG11c3Qgbm90IGFmZmVjdCBjaGVja2VkL2Nyb3NzZWQpXG4gICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ2NoZWNrZWQnKSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAndW5jaGVja2VkJykge1xuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAnY3Jvc3NlZCcpIHtcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnY3Jvc3NlZCcpO1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlQ2xhc3NlcyhjbGFzc2VzKSB7XG4gICAgbGV0IGNvbXB1dGVkQ2xhc3NlcyA9IFtdO1xuICAgIGlmKHR5cGVvZiBjbGFzc2VzID09PSAnc3RyaW5nJykge1xuICAgICAgICAvL3JlcGxhY2UgbXVsdGlwbGUgd2hpdGUgc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMucmVwbGFjZSgvXFxzXFxzKy9nLCAnICcpO1xuICAgICAgICBpZihjbGFzc2VzLmluZGV4T2YoJyAnKSA+IC0xKVxuICAgICAgICAgICAgY29tcHV0ZWRDbGFzc2VzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xuICAgICAgICBlbHNlIGlmKGNsYXNzZXMuaW5kZXhPZignLCcpID4gLTEpXG4gICAgICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBjbGFzc2VzLnNwbGl0KCcsJyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IFtjbGFzc2VzXTtcbiAgICB9XG4gICAgZWxzZSBpZihBcnJheS5pc0FycmF5KGNsYXNzZXMpKSB7XG4gICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXM7XG4gICAgfVxuICAgIHJldHVybiBjb21wdXRlZENsYXNzZXM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb2xvcnMob3B0aW9ucykge1xuICAgIGNvbnN0IGMgPSBvcHRpb25zLmNvbG9ycyB8fCB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aWNrOiBjLnRpY2sgIT0gbnVsbCA/IGMudGljayA6IG9wdGlvbnMudGlja0NvbG9yLFxuICAgICAgICBjaGVja2VkOiBjLmNoZWNrZWQgIT0gbnVsbCA/IGMuY2hlY2tlZCA6IG9wdGlvbnMuY2hlY2tlZENvbG9yLFxuICAgICAgICBjcm9zc2VkOiBjLmNyb3NzZWQgIT0gbnVsbCA/IGMuY3Jvc3NlZCA6IG9wdGlvbnMuY3Jvc3NlZENvbG9yXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYnViYmxlRXZlbnRzVG9PcmlnaW5hbENoZWNrYm94KG9wdGlvbnMsIGNoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0LCBldmVudCkge1xuICAgIC8vaWYgb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlIGlzIHNldCwgY2FsbCBpdFxuICAgIGlmKG9wdGlvbnMuY2FsbGJhY2tzICYmIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSAmJiB0eXBlb2Ygb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZShjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCk7XG4gICAgfVxuXG4gICAgaWYoIW9wdGlvbnMuYnViYmxlRXZlbnRzKSByZXR1cm47XG5cbiAgICBpZihldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgIGNoZWNrYm94RWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGVsc2UgaWYoZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgS2V5Ym9hcmRFdmVudCgna2V5dXAnLCB7IGtleTogJyAnLCBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgZWxzZSBpZihldmVudC50eXBlID09PSAnY2hhbmdlJykge1xuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBvbmtleXVwKGNoZWNrYm94RWxlbWVudCwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzIpIHtcbiAgICAgICAgYnViYmxlRXZlbnRzVG9PcmlnaW5hbENoZWNrYm94KGNoZWNrYm94RWxlbWVudCwgZXZlbnQpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC50YXJnZXQuY2xpY2soKTtcbiAgICB9XG59IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmIgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHNlbGYubG9jYXRpb24uaHJlZjtcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gW3Jlc29sdmUsIHJlamVjdCwgUHJvbWlzZV0gPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG52YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuXHRcIm1haW5cIjogMFxufTtcblxuLy8gbm8gY2h1bmsgb24gZGVtYW5kIGxvYWRpbmdcblxuLy8gbm8gcHJlZmV0Y2hpbmdcblxuLy8gbm8gcHJlbG9hZGVkXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3RcblxuLy8gbm8gb24gY2h1bmtzIGxvYWRlZFxuXG4vLyBubyBqc29ucCBmdW5jdGlvbiIsIl9fd2VicGFja19yZXF1aXJlX18ubmMgPSB1bmRlZmluZWQ7IiwiaW1wb3J0IGF1Z21lbnRXaXRoTGlzdGVuIGZyb20gJy4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyc7XG5pbXBvcnQgYXVnbWVudFdpdGhUcmlzdGF0ZSBmcm9tICcuL21vZHVsZXMvdHJpc3RhdGUvdHJpc3RhdGUubWpzJztcbmltcG9ydCBhdWdtZW50V2l0aFNjcm9sbGFibGVUYWJsZSBmcm9tICcuL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL3Njcm9sbGFibGVUYWJsZS5tanMnO1xuaW1wb3J0IGRpYWxvZyBmcm9tICcuL21vZHVsZXMvZGlhbG9nL2RpYWxvZy5tanMnO1xuaW1wb3J0IHRvYXN0IGZyb20gJy4vbW9kdWxlcy90b2FzdC90b2FzdC5tanMnO1xuaW1wb3J0IHsgYXVnbWVudFdpdGhQYWNrLCB0b29scywgbG9hZENzcyB9IGZyb20gJy4vbW9kdWxlcy90b29scy9leHBvcnRzLm1qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBUFggb2JqZWN0IHRoYXQgd3JhcHMgb25lIG9yIG1vcmUgSFRNTCBlbGVtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfEhUTUxFbGVtZW50fE5vZGVMaXN0fEhUTUxDb2xsZWN0aW9ufEFycmF5PEhUTUxFbGVtZW50PnxqUXVlcnl8RnVuY3Rpb259IGlucHV0IC0gVGhlIGlucHV0IHRvIGNyZWF0ZSB0aGUgQVBYIG9iamVjdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gVGhlIEFQWCBvYmplY3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGlucHV0IHR5cGUgaXMgaW52YWxpZC5cbiAqIEBleGFtcGxlXG4gKiAvLyBYUGF0aFxuICogY29uc3QgYXB4MSA9IEFQWCgnLy9kaXZbQGNsYXNzPVwiZXhhbXBsZVwiXScpO1xuICpcbiAqIC8vIENTUyBzZWxlY3RvclxuICogY29uc3QgYXB4MiA9IEFQWCgnLmV4YW1wbGUnKTtcbiAqXG4gKiAvLyBTaW5nbGUgZWxlbWVudFxuICogY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGFtcGxlJyk7XG4gKiBjb25zdCBhcHgzID0gQVBYKGVsZW1lbnQpO1xuICpcbiAqIC8vIE5vZGVMaXN0IG9yIEhUTUxDb2xsZWN0aW9uXG4gKiBjb25zdCBub2RlTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leGFtcGxlJyk7XG4gKiBjb25zdCBhcHg0ID0gQVBYKG5vZGVMaXN0KTtcbiAqXG4gKiAvLyBBcnJheSBvZiBlbGVtZW50c1xuICogY29uc3QgZWxlbWVudHMgPSBbZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUxJyksIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGFtcGxlMicpXTtcbiAqIGNvbnN0IGFweDUgPSBBUFgoZWxlbWVudHMpO1xuICpcbiAqIC8vIGpRdWVyeSBvYmplY3RcbiAqIGNvbnN0ICRleGFtcGxlID0gJCgnLmV4YW1wbGUnKTtcbiAqIGNvbnN0IGFweDYgPSBBUFgoJGV4YW1wbGUpO1xuICpcbiAqIC8vIEZ1bmN0aW9uIHJldHVybmluZyBhbiBBUFggb2JqZWN0XG4gKiBjb25zdCBhcHg3ID0gQVBYKCgpID0+IEFQWCgnLmV4YW1wbGUnKSk7XG4gKi9cbmNvbnN0IEFQWCA9IGZ1bmN0aW9uIChpbnB1dCwgY29udGV4dCA9IGRvY3VtZW50KSB7XG4gICAgbGV0IGVsZW1lbnRzO1xuXG4gICAgLy8gVmFsaWRhdGUgY29udGV4dFxuICAgIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29udGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFQWC5pc0FQWE9iamVjdChjb250ZXh0KSkge1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5maXJzdCgpO1xuICAgIH0gZWxzZSBpZiAoIShjb250ZXh0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgY29udGV4dCBpbnN0YW5jZW9mIERvY3VtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29udGV4dCBmb3IgQVBYJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhcnRzV2l0aCgnLy8nKSkge1xuICAgICAgICAvLyBYUGF0aCB3aXRoIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBkb2N1bWVudC5ldmFsdWF0ZShpbnB1dCwgY29udGV4dCwgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1RZUEUsIG51bGwpO1xuICAgICAgICBsZXQgbm9kZXMgPSBbXTtcbiAgICAgICAgbGV0IG5vZGUgPSBlbGVtZW50cy5pdGVyYXRlTmV4dCgpO1xuICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgIG5vZGUgPSBlbGVtZW50cy5pdGVyYXRlTmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzID0gbm9kZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIENTUyBzZWxlY3RvciB3aXRoIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBTaW5nbGUgZWxlbWVudCB3aXRoaW4gY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IGNvbnRleHQuY29udGFpbnMoaW5wdXQpID8gW2lucHV0XSA6IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBOb2RlTGlzdCB8fCBpbnB1dCBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9uKSB7XG4gICAgICAgIC8vIE5vZGVMaXN0IG9yIEhUTUxDb2xsZWN0aW9uIHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gQXJyYXkuZnJvbShpbnB1dCkuZmlsdGVyKGVsID0+IGNvbnRleHQuY29udGFpbnMoZWwpKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIGlucHV0LmV2ZXJ5KGVsID0+IGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIGVsZW1lbnRzIHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gaW5wdXQuZmlsdGVyKGVsID0+IGNvbnRleHQuY29udGFpbnMoZWwpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBqUXVlcnkgIT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBqUXVlcnkpIHtcbiAgICAgICAgLy8galF1ZXJ5IG9iamVjdCB3aXRoaW4gY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IEFycmF5LmZyb20oaW5wdXQuZ2V0KCkpLmZpbHRlcihlbCA9PiBjb250ZXh0LmNvbnRhaW5zKGVsKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIGFuIEFQWCBvYmplY3Qgd2l0aCBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gQVBYKGlucHV0KCksIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCB0eXBlIGZvciBBUFgnKTtcbiAgICB9XG5cbiAgICB2YXIgYXB4ID0ge1xuICAgICAgICBlbGVtZW50czogZWxlbWVudHMsXG4gICAgICAgIF9pc0FQWE9iamVjdDogdHJ1ZVxuICAgIH07XG4gICAgYXB4Lmxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcbiAgICBhcHguZWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIEFycmF5KSB0aGlzLmVsZW1lbnRzLmZvckVhY2goY2FsbGJhY2spO1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIE5vZGVMaXN0KSBBcnJheS5mcm9tKHRoaXMuZWxlbWVudHMpLmZvckVhY2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGFweC5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbaW5kZXhdO1xuICAgIH07XG4gICAgYXB4LmFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIHRoaXMuZWxlbWVudHM7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgTm9kZUxpc3QpIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZWxlbWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGFweC5maXJzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KDApO1xuICAgIH07XG4gICAgYXVnbWVudFdpdGhMaXN0ZW4oYXB4KTtcbiAgICBhdWdtZW50V2l0aFRyaXN0YXRlKGFweCk7XG4gICAgYXVnbWVudFdpdGhTY3JvbGxhYmxlVGFibGUoYXB4KTtcbiAgICBhdWdtZW50V2l0aFBhY2soYXB4KTtcbiAgICByZXR1cm4gYXB4O1xufTtcblxuQVBYLmxvYWRDc3MgPSBsb2FkQ3NzO1xuQVBYLmRpYWxvZyA9IGRpYWxvZztcbkFQWC50b2FzdCA9IHRvYXN0O1xuQVBYLnRvb2xzID0gdG9vbHM7XG5BUFguaXNBUFhPYmplY3QgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAmJiBvYmouX2lzQVBYT2JqZWN0ID09PSB0cnVlO1xufVxuQVBYLmlzX251bWVyaWMgPSAobikgPT4ge1xuICAgIHJldHVybiAhaXNOYU4obiAtIHBhcnNlRmxvYXQobikpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBUFg7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9