vxe-table-plugin-export-xlsx-xhx 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,259 +1,243 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports["default"] = exports.VXETablePluginExportXLSX = void 0;
7
-
8
- var _xeUtils = _interopRequireDefault(require("xe-utils/methods/xe-utils"));
9
-
10
- var _xlsx = _interopRequireDefault(require("xlsx"));
11
-
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
13
-
14
- /* eslint-disable no-unused-vars */
15
-
16
- /* eslint-enable no-unused-vars */
17
- var _vxetable;
18
-
19
- function getFooterCellValue($table, opts, rows, column) {
20
- var cellValue = _xeUtils["default"].toString(rows[$table.$getColumnIndex(column)]);
21
-
22
- return cellValue;
23
- }
24
-
25
- function toBuffer(wbout) {
26
- var buf = new ArrayBuffer(wbout.length);
27
- var view = new Uint8Array(buf);
28
-
29
- for (var index = 0; index !== wbout.length; ++index) {
30
- view[index] = wbout.charCodeAt(index) & 0xFF;
31
- }
32
-
33
- return buf;
34
- }
35
-
36
- function exportXLSX(params) {
37
- var $table = params.$table,
38
- options = params.options,
39
- columns = params.columns,
40
- datas = params.datas;
41
- var sheetName = options.sheetName,
42
- type = options.type,
43
- isHeader = options.isHeader,
44
- isFooter = options.isFooter,
45
- original = options.original,
46
- message = options.message,
47
- footerFilterMethod = options.footerFilterMethod;
48
- var colHead = {};
49
- var footList = [];
50
- var rowList = datas;
51
-
52
- if (isHeader) {
53
- columns.forEach(function (column) {
54
- colHead[column.id] = _xeUtils["default"].toString(original ? column.property : column.getTitle());
55
- });
56
- }
57
-
58
- if (isFooter) {
59
- var _$table$getTableData = $table.getTableData(),
60
- footerData = _$table$getTableData.footerData;
61
-
62
- var footers = footerFilterMethod ? footerData.filter(footerFilterMethod) : footerData;
63
- footers.forEach(function (rows) {
64
- var item = {};
65
- columns.forEach(function (column) {
66
- item[column.id] = getFooterCellValue($table, options, rows, column);
67
- });
68
- footList.push(item);
69
- });
70
- }
71
-
72
- var book = _xlsx["default"].utils.book_new();
73
-
74
- var sheet = _xlsx["default"].utils.json_to_sheet((isHeader ? [colHead] : []).concat(rowList).concat(footList), {
75
- skipHeader: true
76
- }); // 转换数据
77
-
78
-
79
- _xlsx["default"].utils.book_append_sheet(book, sheet, sheetName);
80
-
81
- var wbout = _xlsx["default"].write(book, {
82
- bookType: type,
83
- bookSST: false,
84
- type: 'binary'
85
- });
86
-
87
- var blob = new Blob([toBuffer(wbout)], {
88
- type: 'application/octet-stream'
89
- }); // 保存导出
90
-
91
- downloadFile(blob, options);
92
-
93
- if (message !== false) {
94
- _vxetable.modal.message({
95
- message: _vxetable.t('vxe.table.expSuccess'),
96
- status: 'success'
97
- });
98
- }
99
- }
100
-
101
- function downloadFile(blob, options) {
102
- if (window.Blob) {
103
- var filename = options.filename,
104
- type = options.type;
105
-
106
- if (navigator.msSaveBlob) {
107
- navigator.msSaveBlob(blob, "".concat(filename, ".").concat(type));
108
- } else {
109
- var linkElem = document.createElement('a');
110
- linkElem.target = '_blank';
111
- linkElem.download = "".concat(filename, ".").concat(type);
112
- linkElem.href = URL.createObjectURL(blob);
113
- document.body.appendChild(linkElem);
114
- linkElem.click();
115
- document.body.removeChild(linkElem);
116
- }
117
- } else {
118
- console.error(_vxetable.t('vxe.error.notExp'));
119
- }
120
- }
121
-
122
- function replaceDoubleQuotation(val) {
123
- return val.replace(/^"/, '').replace(/"$/, '');
124
- }
125
-
126
- function parseCsv(columns, content) {
127
- var list = content.split('\n');
128
- var fields = [];
129
- var rows = [];
130
-
131
- if (list.length) {
132
- var rList = list.slice(1);
133
- list[0].split(',').map(replaceDoubleQuotation);
134
- rList.forEach(function (r) {
135
- if (r) {
136
- var item = {};
137
- r.split(',').forEach(function (val, colIndex) {
138
- if (fields[colIndex]) {
139
- item[fields[colIndex]] = replaceDoubleQuotation(val);
140
- }
141
- });
142
- rows.push(item);
143
- }
144
- });
145
- }
146
-
147
- return {
148
- fields: fields,
149
- rows: rows
150
- };
151
- }
152
-
153
- function checkImportData(columns, fields, rows) {
154
- var tableFields = [];
155
- columns.forEach(function (column) {
156
- var field = column.property;
157
-
158
- if (field) {
159
- tableFields.push(field);
160
- }
161
- });
162
- return tableFields.every(function (field) {
163
- return fields.includes(field);
164
- });
165
- }
166
-
167
- function importXLSX(params) {
168
- var columns = params.columns,
169
- options = params.options,
170
- file = params.file;
171
- var $table = params.$table;
172
- var _importResolve = $table._importResolve;
173
- var fileReader = new FileReader();
174
-
175
- fileReader.onload = function (e) {
176
- var workbook = _xlsx["default"].read(e.target.result, {
177
- type: 'binary'
178
- });
179
-
180
- var csvData = _xlsx["default"].utils.sheet_to_csv(workbook.Sheets.Sheet1);
181
-
182
- var _parseCsv = parseCsv(columns, csvData),
183
- fields = _parseCsv.fields,
184
- rows = _parseCsv.rows;
185
-
186
- var status = checkImportData(columns, fields, rows);
187
-
188
- if (status) {
189
- $table.createData(rows).then(function (data) {
190
- if (options.mode === 'append') {
191
- $table.insertAt(data, -1);
192
- } else {
193
- $table.reloadData(data);
194
- }
195
- });
196
-
197
- if (options.message !== false) {
198
- _vxetable.modal.message({
199
- message: _xeUtils["default"].template(_vxetable.t('vxe.table.impSuccess'), [rows.length]),
200
- status: 'success'
201
- });
202
- }
203
- } else if (options.message !== false) {
204
- _vxetable.modal.message({
205
- message: _vxetable.t('vxe.error.impFields'),
206
- status: 'error'
207
- });
208
- }
209
-
210
- if (_importResolve) {
211
- _importResolve(status);
212
-
213
- $table._importResolve = null;
214
- }
215
- };
216
-
217
- fileReader.readAsBinaryString(file);
218
- }
219
-
220
- function handleImportEvent(params) {
221
- if (params.options.type === 'xlsx') {
222
- importXLSX(params);
223
- return false;
224
- }
225
- }
226
-
227
- function handleExportEvent(params) {
228
- if (params.options.type === 'xlsx') {
229
- exportXLSX(params);
230
- return false;
231
- }
232
- }
233
- /**
234
- * 基于 vxe-table 表格的增强插件,支持导出 xlsx 格式
235
- */
236
-
237
-
238
- var VXETablePluginExportXLSX = {
239
- install: function install(xtable) {
240
- var interceptor = xtable.interceptor;
241
- _vxetable = xtable;
242
- Object.assign(xtable.types, {
243
- xlsx: 1
244
- });
245
- interceptor.mixin({
246
- 'event.import': handleImportEvent,
247
- 'event.export': handleExportEvent
248
- });
249
- }
250
- };
251
- exports.VXETablePluginExportXLSX = VXETablePluginExportXLSX;
252
-
253
- if (typeof window !== 'undefined' && window.VXETable) {
254
- window.VXETable.use(VXETablePluginExportXLSX);
255
- }
256
-
257
- var _default = VXETablePluginExportXLSX;
258
- exports["default"] = _default;
259
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbIl92eGV0YWJsZSIsImdldEZvb3RlckNlbGxWYWx1ZSIsIiR0YWJsZSIsIm9wdHMiLCJyb3dzIiwiY29sdW1uIiwiY2VsbFZhbHVlIiwiWEVVdGlscyIsInRvU3RyaW5nIiwiJGdldENvbHVtbkluZGV4IiwidG9CdWZmZXIiLCJ3Ym91dCIsImJ1ZiIsIkFycmF5QnVmZmVyIiwibGVuZ3RoIiwidmlldyIsIlVpbnQ4QXJyYXkiLCJpbmRleCIsImNoYXJDb2RlQXQiLCJleHBvcnRYTFNYIiwicGFyYW1zIiwib3B0aW9ucyIsImNvbHVtbnMiLCJkYXRhcyIsInNoZWV0TmFtZSIsInR5cGUiLCJpc0hlYWRlciIsImlzRm9vdGVyIiwib3JpZ2luYWwiLCJtZXNzYWdlIiwiZm9vdGVyRmlsdGVyTWV0aG9kIiwiY29sSGVhZCIsImZvb3RMaXN0Iiwicm93TGlzdCIsImZvckVhY2giLCJpZCIsInByb3BlcnR5IiwiZ2V0VGl0bGUiLCJnZXRUYWJsZURhdGEiLCJmb290ZXJEYXRhIiwiZm9vdGVycyIsImZpbHRlciIsIml0ZW0iLCJwdXNoIiwiYm9vayIsIlhMU1giLCJ1dGlscyIsImJvb2tfbmV3Iiwic2hlZXQiLCJqc29uX3RvX3NoZWV0IiwiY29uY2F0Iiwic2tpcEhlYWRlciIsImJvb2tfYXBwZW5kX3NoZWV0Iiwid3JpdGUiLCJib29rVHlwZSIsImJvb2tTU1QiLCJibG9iIiwiQmxvYiIsImRvd25sb2FkRmlsZSIsIm1vZGFsIiwidCIsInN0YXR1cyIsIndpbmRvdyIsImZpbGVuYW1lIiwibmF2aWdhdG9yIiwibXNTYXZlQmxvYiIsImxpbmtFbGVtIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidGFyZ2V0IiwiZG93bmxvYWQiLCJocmVmIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwiYm9keSIsImFwcGVuZENoaWxkIiwiY2xpY2siLCJyZW1vdmVDaGlsZCIsImNvbnNvbGUiLCJlcnJvciIsInJlcGxhY2VEb3VibGVRdW90YXRpb24iLCJ2YWwiLCJyZXBsYWNlIiwicGFyc2VDc3YiLCJjb250ZW50IiwibGlzdCIsInNwbGl0IiwiZmllbGRzIiwickxpc3QiLCJzbGljZSIsIm1hcCIsInIiLCJjb2xJbmRleCIsImNoZWNrSW1wb3J0RGF0YSIsInRhYmxlRmllbGRzIiwiZmllbGQiLCJldmVyeSIsImluY2x1ZGVzIiwiaW1wb3J0WExTWCIsImZpbGUiLCJfaW1wb3J0UmVzb2x2ZSIsImZpbGVSZWFkZXIiLCJGaWxlUmVhZGVyIiwib25sb2FkIiwiZSIsIndvcmtib29rIiwicmVhZCIsInJlc3VsdCIsImNzdkRhdGEiLCJzaGVldF90b19jc3YiLCJTaGVldHMiLCJTaGVldDEiLCJjcmVhdGVEYXRhIiwidGhlbiIsImRhdGEiLCJtb2RlIiwiaW5zZXJ0QXQiLCJyZWxvYWREYXRhIiwidGVtcGxhdGUiLCJyZWFkQXNCaW5hcnlTdHJpbmciLCJoYW5kbGVJbXBvcnRFdmVudCIsImhhbmRsZUV4cG9ydEV2ZW50IiwiVlhFVGFibGVQbHVnaW5FeHBvcnRYTFNYIiwiaW5zdGFsbCIsInh0YWJsZSIsImludGVyY2VwdG9yIiwiT2JqZWN0IiwiYXNzaWduIiwidHlwZXMiLCJ4bHN4IiwibWl4aW4iLCJWWEVUYWJsZSIsInVzZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQVNBOzs7O0FBVkE7O0FBV0E7QUFFQSxJQUFJQSxTQUFKOztBQUVBLFNBQVNDLGtCQUFULENBQTZCQyxNQUE3QixFQUE0Q0MsSUFBNUMsRUFBZ0VDLElBQWhFLEVBQTZFQyxNQUE3RSxFQUFpRztBQUMvRixNQUFJQyxTQUFTLEdBQUdDLG9CQUFRQyxRQUFSLENBQWlCSixJQUFJLENBQUNGLE1BQU0sQ0FBQ08sZUFBUCxDQUF1QkosTUFBdkIsQ0FBRCxDQUFyQixDQUFoQjs7QUFDQSxTQUFPQyxTQUFQO0FBQ0Q7O0FBRUQsU0FBU0ksUUFBVCxDQUFtQkMsS0FBbkIsRUFBNkI7QUFDM0IsTUFBSUMsR0FBRyxHQUFHLElBQUlDLFdBQUosQ0FBZ0JGLEtBQUss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QTRCckcsTUFBNUIsRUFBMkQ7QUFDekQsTUFBSUEsTUFBTSxDQUFDQyxPQUFQLENBQWVJLElBQWYsS0FBd0IsTUFBNUIsRUFBb0M7QUFDbENOLElBQUFBLFVBQVUsQ0FBQ0MsTUFBRCxDQUFWO0FBQ0EsV0FBTyxLQUFQO0FBQ0Q7QUFDRjtBQUVEOzs7OztBQUdPLElBQU1zRyx3QkFBd0IsR0FBRztBQUN0Q0MsRUFBQUEsT0FEc0MsbUJBQzdCQyxNQUQ2QixFQUNOO0FBQUEsUUFDdEJDLFdBRHNCLEdBQ05ELE1BRE0sQ0FDdEJDLFdBRHNCO0FBRTlCN0gsSUFBQUEsU0FBUyxHQUFHNEgsTUFBWjtBQUNBRSxJQUFBQSxNQUFNLENBQUNDLE1BQVAsQ0FBY0gsTUFBTSxDQUFDSSxLQUFyQixFQUE0QjtBQUFFQyxNQUFBQSxJQUFJLEVBQUU7QUFBUixLQUE1QjtBQUNBSixJQUFBQSxXQUFXLENBQUNLLEtBQVosQ0FBa0I7QUFDaEIsc0JBQWdCVixpQkFEQTtBQUVoQixzQkFBZ0JDO0FBRkEsS0FBbEI7QUFJRDtBQVRxQyxDQUFqQzs7O0FBWVAsSUFBSSxPQUFPM0QsTUFBUCxLQUFrQixXQUFsQixJQUFpQ0EsTUFBTSxDQUFDcUUsUUFBNUMsRUFBc0Q7QUFDcERyRSxFQUFBQSxNQUFNLENBQUNxRSxRQUFQLENBQWdCQyxHQUFoQixDQUFvQlYsd0JBQXBCO0FBQ0Q7O2VBRWNBLHdCIiwiZmlsZSI6ImluZGV4LmNvbW1vbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXHJcbmltcG9ydCBYRVV0aWxzIGZyb20gJ3hlLXV0aWxzL21ldGhvZHMveGUtdXRpbHMnXHJcbmltcG9ydCB7XHJcbiAgVlhFVGFibGUsXHJcbiAgVGFibGUsXHJcbiAgSW50ZXJjZXB0b3JFeHBvcnRQYXJhbXMsXHJcbiAgSW50ZXJjZXB0b3JJbXBvcnRQYXJhbXMsXHJcbiAgQ29sdW1uQ29uZmlnLFxyXG4gIEV4cG9ydE9wdG9uc1xyXG59IGZyb20gJ3Z4ZS10YWJsZS9saWIvdnhlLXRhYmxlJ1xyXG5pbXBvcnQgWExTWCBmcm9tICd4bHN4J1xyXG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXHJcblxyXG5sZXQgX3Z4ZXRhYmxlOiB0eXBlb2YgVlhFVGFibGVcclxuXHJcbmZ1bmN0aW9uIGdldEZvb3RlckNlbGxWYWx1ZSAoJHRhYmxlOiBUYWJsZSwgb3B0czogRXhwb3J0T3B0b25zLCByb3dzOiBhbnlbXSwgY29sdW1uOiBDb2x1bW5Db25maWcpIHtcclxuICB2YXIgY2VsbFZhbHVlID0gWEVVdGlscy50b1N0cmluZyhyb3dzWyR0YWJsZS4kZ2V0Q29sdW1uSW5kZXgoY29sdW1uKV0pXHJcbiAgcmV0dXJuIGNlbGxWYWx1ZVxyXG59XHJcblxyXG5mdW5jdGlvbiB0b0J1ZmZlciAod2JvdXQ6IGFueSkge1xyXG4gIGxldCBidWYgPSBuZXcgQXJyYXlCdWZmZXIod2JvdXQubGVuZ3RoKVxyXG4gIGxldCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKVxyXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggIT09IHdib3V0Lmxlbmd0aDsgKytpbmRleCkgdmlld1tpbmRleF0gPSB3Ym91dC5jaGFyQ29kZUF0KGluZGV4KSAmIDB4RkZcclxuICByZXR1cm4gYnVmXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4cG9ydFhMU1ggKHBhcmFtczogSW50ZXJjZXB0b3JFeHBvcnRQYXJhbXMpIHtcclxuICBjb25zdCB7ICR0YWJsZSwgb3B0aW9ucywgY29sdW1ucywgZGF0YXMgfSA9IHBhcmFtc1xyXG4gIGNvbnN0IHsgc2hlZXROYW1lLCB0eXBlLCBpc0hlYWRlciwgaXNGb290ZXIsIG9yaWdpbmFsLCBtZXNzYWdlLCBmb290ZXJGaWx0ZXJNZXRob2QgfSA9IG9wdGlvbnNcclxuICBjb25zdCBjb2xIZWFkOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge31cclxuICBjb25zdCBmb290TGlzdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdID0gW11cclxuICBjb25zdCByb3dMaXN0ID0gZGF0YXNcclxuICBpZiAoaXNIZWFkZXIpIHtcclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGNvbEhlYWRbY29sdW1uLmlkXSA9IFhFVXRpbHMudG9TdHJpbmcob3JpZ2luYWwgPyBjb2x1bW4ucHJvcGVydHkgOiBjb2x1bW4uZ2V0VGl0bGUoKSlcclxuICAgIH0pXHJcbiAgfVxyXG4gIGlmIChpc0Zvb3Rlcikge1xyXG4gICAgY29uc3QgeyBmb290ZXJEYXRhIH0gPSAkdGFibGUuZ2V0VGFibGVEYXRhKClcclxuICAgIGNvbnN0IGZvb3RlcnMgPSBmb290ZXJGaWx0ZXJNZXRob2QgPyBmb290ZXJEYXRhLmZpbHRlcihmb290ZXJGaWx0ZXJNZXRob2QpIDogZm9vdGVyRGF0YVxyXG4gICAgZm9vdGVycy5mb3JFYWNoKChyb3dzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW06IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fVxyXG4gICAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGl0ZW1bY29sdW1uLmlkXSA9IGdldEZvb3RlckNlbGxWYWx1ZSgkdGFibGUsIG9wdGlvbnMsIHJvd3MsIGNvbHVtbilcclxuICAgICAgfSlcclxuICAgICAgZm9vdExpc3QucHVzaChpdGVtKVxyXG4gICAgfSlcclxuICB9XHJcbiAgY29uc3QgYm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKVxyXG4gIGNvbnN0IHNoZWV0ID0gWExTWC51dGlscy5qc29uX3RvX3NoZWV0KChpc0hlYWRlciA/IFtjb2xIZWFkXSA6IFtdKS5jb25jYXQocm93TGlzdCkuY29uY2F0KGZvb3RMaXN0KSwgeyBza2lwSGVhZGVyOiB0cnVlIH0pXHJcbiAgLy8g6L2s5o2i5pWw5o2uXHJcbiAgWExTWC51dGlscy5ib29rX2FwcGVuZF9zaGVldChib29rLCBzaGVldCwgc2hlZXROYW1lKVxyXG4gIGNvbnN0IHdib3V0ID0gWExTWC53cml0ZShib29rLCB7IGJvb2tUeXBlOiB0eXBlLCBib29rU1NUOiBmYWxzZSwgdHlwZTogJ2JpbmFyeScgfSlcclxuICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3RvQnVmZmVyKHdib3V0KV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSlcclxuICAvLyDkv53lrZjlr7zlh7pcclxuICBkb3dubG9hZEZpbGUoYmxvYiwgb3B0aW9ucylcclxuICBpZiAobWVzc2FnZSAhPT0gZmFsc2UpIHtcclxuICAgIF92eGV0YWJsZS5tb2RhbC5tZXNzYWdlKHsgbWVzc2FnZTogX3Z4ZXRhYmxlLnQoJ3Z4ZS50YWJsZS5leHBTdWNjZXNzJyksIHN0YXR1czogJ3N1Y2Nlc3MnIH0pXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBkb3dubG9hZEZpbGUgKGJsb2I6IEJsb2IsIG9wdGlvbnM6IEV4cG9ydE9wdG9ucykge1xyXG4gIGlmICh3aW5kb3cuQmxvYikge1xyXG4gICAgY29uc3QgeyBmaWxlbmFtZSwgdHlwZSB9ID0gb3B0aW9uc1xyXG4gICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7XHJcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGAke2ZpbGVuYW1lfS4ke3R5cGV9YClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZhciBsaW5rRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxyXG4gICAgICBsaW5rRWxlbS50YXJnZXQgPSAnX2JsYW5rJ1xyXG4gICAgICBsaW5rRWxlbS5kb3dubG9hZCA9IGAke2ZpbGVuYW1lfS4ke3R5cGV9YFxyXG4gICAgICBsaW5rRWxlbS5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxyXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmtFbGVtKVxyXG4gICAgICBsaW5rRWxlbS5jbGljaygpXHJcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGlua0VsZW0pXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoX3Z4ZXRhYmxlLnQoJ3Z4ZS5lcnJvci5ub3RFeHAnKSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcGxhY2VEb3VibGVRdW90YXRpb24gKHZhbDogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIHZhbC5yZXBsYWNlKC9eXCIvLCAnJykucmVwbGFjZSgvXCIkLywgJycpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlQ3N2IChjb2x1bW5zOiBDb2x1bW5Db25maWdbXSwgY29udGVudDogc3RyaW5nKSB7XHJcbiAgY29uc3QgbGlzdCA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpXHJcbiAgY29uc3QgZmllbGRzOiBzdHJpbmdbXSA9IFtdXHJcbiAgY29uc3Qgcm93czogYW55W10gPSBbXVxyXG4gIGlmIChsaXN0Lmxlbmd0aCkge1xyXG4gICAgY29uc3Qgckxpc3QgPSBsaXN0LnNsaWNlKDEpXHJcbiAgICBsaXN0WzBdLnNwbGl0KCcsJykubWFwKHJlcGxhY2VEb3VibGVRdW90YXRpb24pXHJcbiAgICByTGlzdC5mb3JFYWNoKChyKSA9PiB7XHJcbiAgICAgIGlmIChyKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9XHJcbiAgICAgICAgci5zcGxpdCgnLCcpLmZvckVhY2goKHZhbCwgY29sSW5kZXgpID0+IHtcclxuICAgICAgICAgIGlmIChmaWVsZHNbY29sSW5kZXhdKSB7XHJcbiAgICAgICAgICAgIGl0ZW1bZmllbGRzW2NvbEluZGV4XV0gPSByZXBsYWNlRG91YmxlUXVvdGF0aW9uKHZhbClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHJvd3MucHVzaChpdGVtKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICByZXR1cm4geyBmaWVsZHMsIHJvd3MgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjaGVja0ltcG9ydERhdGEgKGNvbHVtbnM6IENvbHVtbkNvbmZpZ1tdLCBmaWVsZHM6IHN0cmluZ1tdLCByb3dzOiBhbnlbXSkge1xyXG4gIGxldCB0YWJsZUZpZWxkczogc3RyaW5nW10gPSBbXVxyXG4gIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICBsZXQgZmllbGQgPSBjb2x1bW4ucHJvcGVydHlcclxuICAgIGlmIChmaWVsZCkge1xyXG4gICAgICB0YWJsZUZpZWxkcy5wdXNoKGZpZWxkKVxyXG4gICAgfVxyXG4gIH0pXHJcbiAgcmV0dXJuIHRhYmxlRmllbGRzLmV2ZXJ5KChmaWVsZCkgPT4gZmllbGRzLmluY2x1ZGVzKGZpZWxkKSlcclxufVxyXG5cclxuZnVuY3Rpb24gaW1wb3J0WExTWCAocGFyYW1zOiBJbnRlcmNlcHRvckltcG9ydFBhcmFtcykge1xyXG4gIGNvbnN0IHsgY29sdW1ucywgb3B0aW9ucywgZmlsZSB9ID0gcGFyYW1zXHJcbiAgY29uc3QgJHRhYmxlOiBhbnkgPSBwYXJhbXMuJHRhYmxlXHJcbiAgY29uc3QgeyBfaW1wb3J0UmVzb2x2ZSB9ID0gJHRhYmxlXHJcbiAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcclxuICBmaWxlUmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgIGNvbnN0IHdvcmtib29rID0gWExTWC5yZWFkKGUudGFyZ2V0LnJlc3VsdCwgeyB0eXBlOiAnYmluYXJ5JyB9KVxyXG4gICAgY29uc3QgY3N2RGF0YTogc3RyaW5nID0gWExTWC51dGlscy5zaGVldF90b19jc3Yod29ya2Jvb2suU2hlZXRzLlNoZWV0MSlcclxuICAgIGNvbnN0IHsgZmllbGRzLCByb3dzIH0gPSBwYXJzZUNzdihjb2x1bW5zLCBjc3ZEYXRhKVxyXG4gICAgY29uc3Qgc3RhdHVzID0gY2hlY2tJbXBvcnREYXRhKGNvbHVtbnMsIGZpZWxkcywgcm93cylcclxuICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgJHRhYmxlLmNyZWF0ZURhdGEocm93cylcclxuICAgICAgICAudGhlbigoZGF0YTogYW55W10pID0+IHtcclxuICAgICAgICAgIGlmIChvcHRpb25zLm1vZGUgPT09ICdhcHBlbmQnKSB7XHJcbiAgICAgICAgICAgICR0YWJsZS5pbnNlcnRBdChkYXRhLCAtMSlcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICR0YWJsZS5yZWxvYWREYXRhKGRhdGEpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgaWYgKG9wdGlvbnMubWVzc2FnZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICBfdnhldGFibGUubW9kYWwubWVzc2FnZSh7IG1lc3NhZ2U6IFhFVXRpbHMudGVtcGxhdGUoX3Z4ZXRhYmxlLnQoJ3Z4ZS50YWJsZS5pbXBTdWNjZXNzJyksIFtyb3dzLmxlbmd0aF0pLCBzdGF0dXM6ICdzdWNjZXNzJyB9KVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMubWVzc2FnZSAhPT0gZmFsc2UpIHtcclxuICAgICAgX3Z4ZXRhYmxlLm1vZGFsLm1lc3NhZ2UoeyBtZXNzYWdlOiBfdnhldGFibGUudCgndnhlLmVycm9yLmltcEZpZWxkcycpLCBzdGF0dXM6ICdlcnJvcicgfSlcclxuICAgIH1cclxuICAgIGlmIChfaW1wb3J0UmVzb2x2ZSkge1xyXG4gICAgICBfaW1wb3J0UmVzb2x2ZShzdGF0dXMpXHJcbiAgICAgICR0YWJsZS5faW1wb3J0UmVzb2x2ZSA9IG51bGxcclxuICAgIH1cclxuICB9XHJcbiAgZmlsZVJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoZmlsZSlcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlSW1wb3J0RXZlbnQgKHBhcmFtczogSW50ZXJjZXB0b3JJbXBvcnRQYXJhbXMpIHtcclxuICBpZiAocGFyYW1zLm9wdGlvbnMudHlwZSA9PT0gJ3hsc3gnKSB7XHJcbiAgICBpbXBvcnRYTFNYKHBhcmFtcylcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlRXhwb3J0RXZlbnQgKHBhcmFtczogSW50ZXJjZXB0b3JFeHBvcnRQYXJhbXMpIHtcclxuICBpZiAocGFyYW1zLm9wdGlvbnMudHlwZSA9PT0gJ3hsc3gnKSB7XHJcbiAgICBleHBvcnRYTFNYKHBhcmFtcylcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIOWfuuS6jiB2eGUtdGFibGUg6KGo5qC855qE5aKe5by65o+S5Lu277yM5pSv5oyB5a+85Ye6IHhsc3gg5qC85byPXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVlhFVGFibGVQbHVnaW5FeHBvcnRYTFNYID0ge1xyXG4gIGluc3RhbGwgKHh0YWJsZTogdHlwZW9mIFZYRVRhYmxlKSB7XHJcbiAgICBjb25zdCB7IGludGVyY2VwdG9yIH0gPSB4dGFibGVcclxuICAgIF92eGV0YWJsZSA9IHh0YWJsZVxyXG4gICAgT2JqZWN0LmFzc2lnbih4dGFibGUudHlwZXMsIHsgeGxzeDogMSB9KVxyXG4gICAgaW50ZXJjZXB0b3IubWl4aW4oe1xyXG4gICAgICAnZXZlbnQuaW1wb3J0JzogaGFuZGxlSW1wb3J0RXZlbnQsXHJcbiAgICAgICdldmVudC5leHBvcnQnOiBoYW5kbGVFeHBvcnRFdmVudFxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuVlhFVGFibGUpIHtcclxuICB3aW5kb3cuVlhFVGFibGUudXNlKFZYRVRhYmxlUGx1Z2luRXhwb3J0WExTWClcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVlhFVGFibGVQbHVnaW5FeHBvcnRYTFNYXHJcbiJdfQ==
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = exports.VXETablePluginExportXLSX = void 0;
7
+ var _xeUtils = _interopRequireDefault(require("xe-utils/methods/xe-utils"));
8
+ var _xlsx = _interopRequireDefault(require("xlsx"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
+ /* eslint-disable no-unused-vars */
11
+
12
+ /* eslint-enable no-unused-vars */
13
+ var _vxetable;
14
+ function getCellLabel(column, cellValue) {
15
+ if (cellValue) {
16
+ switch (column.cellType) {
17
+ case 'string':
18
+ return _xeUtils["default"].toValueString(cellValue);
19
+ case 'number':
20
+ if (!isNaN(cellValue)) {
21
+ return Number(cellValue);
22
+ }
23
+ break;
24
+ default:
25
+ if (cellValue.length < 12 && !isNaN(cellValue)) {
26
+ return Number(cellValue);
27
+ }
28
+ break;
29
+ }
30
+ }
31
+ return cellValue;
32
+ }
33
+ function getFooterCellValue($table, opts, rows, column) {
34
+ var cellValue = _xeUtils["default"].toString(rows[$table.$getColumnIndex(column)]);
35
+ return cellValue;
36
+ }
37
+ function toBuffer(wbout) {
38
+ var buf = new ArrayBuffer(wbout.length);
39
+ var view = new Uint8Array(buf);
40
+ for (var index = 0; index !== wbout.length; ++index) {
41
+ view[index] = wbout.charCodeAt(index) & 0xFF;
42
+ }
43
+ return buf;
44
+ }
45
+ function exportXLSX(params) {
46
+ var $table = params.$table,
47
+ options = params.options,
48
+ columns = params.columns,
49
+ datas = params.datas;
50
+ var sheetName = options.sheetName,
51
+ type = options.type,
52
+ isHeader = options.isHeader,
53
+ isFooter = options.isFooter,
54
+ original = options.original,
55
+ message = options.message,
56
+ footerFilterMethod = options.footerFilterMethod;
57
+ var colHead = {};
58
+ var footList = [];
59
+ // const rowList = datas
60
+ if (isHeader) {
61
+ columns.forEach(function (column) {
62
+ colHead[column.id] = _xeUtils["default"].toString(original ? column.property : column.getTitle());
63
+ });
64
+ }
65
+ // 新增部分
66
+ var rowList = datas.map(function (item) {
67
+ var rest = {};
68
+ columns.forEach(function (column) {
69
+ rest[column.id] = getCellLabel(column, item[column.id]);
70
+ });
71
+ return rest;
72
+ });
73
+ if (isFooter) {
74
+ var _$table$getTableData = $table.getTableData(),
75
+ footerData = _$table$getTableData.footerData;
76
+ var footers = footerFilterMethod ? footerData.filter(footerFilterMethod) : footerData;
77
+ footers.forEach(function (rows) {
78
+ var item = {};
79
+ columns.forEach(function (column) {
80
+ item[column.id] = getFooterCellValue($table, options, rows, column);
81
+ });
82
+ footList.push(item);
83
+ });
84
+ }
85
+ var book = _xlsx["default"].utils.book_new();
86
+ var sheet = _xlsx["default"].utils.json_to_sheet((isHeader ? [colHead] : []).concat(rowList).concat(footList), {
87
+ skipHeader: true
88
+ });
89
+ // 转换数据
90
+ _xlsx["default"].utils.book_append_sheet(book, sheet, sheetName);
91
+ var wbout = _xlsx["default"].write(book, {
92
+ bookType: type,
93
+ bookSST: false,
94
+ type: 'binary'
95
+ });
96
+ var blob = new Blob([toBuffer(wbout)], {
97
+ type: 'application/octet-stream'
98
+ });
99
+ // 保存导出
100
+ downloadFile(blob, options);
101
+ if (message !== false) {
102
+ _vxetable.modal.message({
103
+ message: _vxetable.t('vxe.table.expSuccess'),
104
+ status: 'success'
105
+ });
106
+ }
107
+ }
108
+ function downloadFile(blob, options) {
109
+ if (window.Blob) {
110
+ var filename = options.filename,
111
+ type = options.type;
112
+ if (navigator.msSaveBlob) {
113
+ navigator.msSaveBlob(blob, "".concat(filename, ".").concat(type));
114
+ } else {
115
+ var linkElem = document.createElement('a');
116
+ linkElem.target = '_blank';
117
+ linkElem.download = "".concat(filename, ".").concat(type);
118
+ linkElem.href = URL.createObjectURL(blob);
119
+ document.body.appendChild(linkElem);
120
+ linkElem.click();
121
+ document.body.removeChild(linkElem);
122
+ }
123
+ } else {
124
+ console.error(_vxetable.t('vxe.error.notExp'));
125
+ }
126
+ }
127
+ function replaceDoubleQuotation(val) {
128
+ return val.replace(/^"/, '').replace(/"$/, '');
129
+ }
130
+ function parseCsv(columns, content) {
131
+ var list = content.split('\n');
132
+ var fields = [];
133
+ var rows = [];
134
+ if (list.length) {
135
+ var rList = list.slice(1);
136
+ list[0].split(',').map(replaceDoubleQuotation);
137
+ rList.forEach(function (r) {
138
+ if (r) {
139
+ var item = {};
140
+ r.split(',').forEach(function (val, colIndex) {
141
+ if (fields[colIndex]) {
142
+ item[fields[colIndex]] = replaceDoubleQuotation(val);
143
+ }
144
+ });
145
+ rows.push(item);
146
+ }
147
+ });
148
+ }
149
+ return {
150
+ fields: fields,
151
+ rows: rows
152
+ };
153
+ }
154
+ function checkImportData(columns, fields, rows) {
155
+ var tableFields = [];
156
+ columns.forEach(function (column) {
157
+ var field = column.property;
158
+ if (field) {
159
+ tableFields.push(field);
160
+ }
161
+ });
162
+ return tableFields.every(function (field) {
163
+ return fields.includes(field);
164
+ });
165
+ }
166
+ function importXLSX(params) {
167
+ var columns = params.columns,
168
+ options = params.options,
169
+ file = params.file;
170
+ var $table = params.$table;
171
+ var _importResolve = $table._importResolve;
172
+ var fileReader = new FileReader();
173
+ fileReader.onload = function (e) {
174
+ var workbook = _xlsx["default"].read(e.target.result, {
175
+ type: 'binary'
176
+ });
177
+ var csvData = _xlsx["default"].utils.sheet_to_csv(workbook.Sheets.Sheet1);
178
+ var _parseCsv = parseCsv(columns, csvData),
179
+ fields = _parseCsv.fields,
180
+ rows = _parseCsv.rows;
181
+ var status = checkImportData(columns, fields, rows);
182
+ if (status) {
183
+ $table.createData(rows).then(function (data) {
184
+ if (options.mode === 'append') {
185
+ $table.insertAt(data, -1);
186
+ } else {
187
+ $table.reloadData(data);
188
+ }
189
+ });
190
+ if (options.message !== false) {
191
+ _vxetable.modal.message({
192
+ message: _xeUtils["default"].template(_vxetable.t('vxe.table.impSuccess'), [rows.length]),
193
+ status: 'success'
194
+ });
195
+ }
196
+ } else if (options.message !== false) {
197
+ _vxetable.modal.message({
198
+ message: _vxetable.t('vxe.error.impFields'),
199
+ status: 'error'
200
+ });
201
+ }
202
+ if (_importResolve) {
203
+ _importResolve(status);
204
+ $table._importResolve = null;
205
+ }
206
+ };
207
+ fileReader.readAsBinaryString(file);
208
+ }
209
+ function handleImportEvent(params) {
210
+ if (params.options.type === 'xlsx') {
211
+ importXLSX(params);
212
+ return false;
213
+ }
214
+ }
215
+ function handleExportEvent(params) {
216
+ if (params.options.type === 'xlsx') {
217
+ exportXLSX(params);
218
+ return false;
219
+ }
220
+ }
221
+ /**
222
+ * 基于 vxe-table 表格的增强插件,支持导出 xlsx 格式
223
+ */
224
+ var VXETablePluginExportXLSX = {
225
+ install: function install(xtable) {
226
+ var interceptor = xtable.interceptor;
227
+ _vxetable = xtable;
228
+ Object.assign(xtable.types, {
229
+ xlsx: 1
230
+ });
231
+ interceptor.mixin({
232
+ 'event.import': handleImportEvent,
233
+ 'event.export': handleExportEvent
234
+ });
235
+ }
236
+ };
237
+ exports.VXETablePluginExportXLSX = VXETablePluginExportXLSX;
238
+ if (typeof window !== 'undefined' && window.VXETable) {
239
+ window.VXETable.use(VXETablePluginExportXLSX);
240
+ }
241
+ var _default = VXETablePluginExportXLSX;
242
+ exports["default"] = _default;
243
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIiwiaW5kZXguanMiXSwibmFtZXMiOlsiX3Z4ZXRhYmxlIiwiZ2V0Q2VsbExhYmVsIiwiY29sdW1uIiwiY2VsbFZhbHVlIiwiY2VsbFR5cGUiLCJYRVV0aWxzIiwidG9WYWx1ZVN0cmluZyIsImlzTmFOIiwiTnVtYmVyIiwibGVuZ3RoIiwiZ2V0Rm9vdGVyQ2VsbFZhbHVlIiwiJHRhYmxlIiwib3B0cyIsInJvd3MiLCJ0b1N0cmluZyIsIiRnZXRDb2x1bW5JbmRleCIsInRvQnVmZmVyIiwid2JvdXQiLCJidWYiLCJBcnJheUJ1ZmZlciIsInZpZXciLCJVaW50OEFycmF5IiwiaW5kZXgiLCJjaGFyQ29kZUF0IiwiZXhwb3J0WExTWCIsInBhcmFtcyIsIm9wdGlvbnMiLCJjb2x1bW5zIiwiZGF0YXMiLCJzaGVldE5hbWUiLCJ0eXBlIiwiaXNIZWFkZXIiLCJpc0Zvb3RlciIsIm9yaWdpbmFsIiwibWVzc2FnZSIsImZvb3RlckZpbHRlck1ldGhvZCIsImNvbEhlYWQiLCJmb290TGlzdCIsImZvckVhY2giLCJpZCIsInByb3BlcnR5IiwiZ2V0VGl0bGUiLCJyb3dMaXN0IiwibWFwIiwiaXRlbSIsInJlc3QiLCJnZXRUYWJsZURhdGEiLCJmb290ZXJEYXRhIiwiZm9vdGVycyIsImZpbHRlciIsInB1c2giLCJib29rIiwiWExTWCIsInV0aWxzIiwiYm9va19uZXciLCJzaGVldCIsImpzb25fdG9fc2hlZXQiLCJjb25jYXQiLCJza2lwSGVhZGVyIiwiYm9va19hcHBlbmRfc2hlZXQiLCJ3cml0ZSIsImJvb2tUeXBlIiwiYm9va1NTVCIsImJsb2IiLCJCbG9iIiwiZG93bmxvYWRGaWxlIiwibW9kYWwiLCJ0Iiwic3RhdHVzIiwid2luZG93IiwiZmlsZW5hbWUiLCJuYXZpZ2F0b3IiLCJtc1NhdmVCbG9iIiwibGlua0VsZW0iLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJ0YXJnZXQiLCJkb3dubG9hZCIsImhyZWYiLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjbGljayIsInJlbW92ZUNoaWxkIiwiY29uc29sZSIsImVycm9yIiwicmVwbGFjZURvdWJsZVF1b3RhdGlvbiIsInZhbCIsInJlcGxhY2UiLCJwYXJzZUNzdiIsImNvbnRlbnQiLCJsaXN0Iiwic3BsaXQiLCJmaWVsZHMiLCJyTGlzdCIsInNsaWNlIiwiciIsImNvbEluZGV4IiwiY2hlY2tJbXBvcnREYXRhIiwidGFibGVGaWVsZHMiLCJmaWVsZCIsImV2ZXJ5IiwiaW5jbHVkZXMiLCJpbXBvcnRYTFNYIiwiZmlsZSIsIl9pbXBvcnRSZXNvbHZlIiwiZmlsZVJlYWRlciIsIkZpbGVSZWFkZXIiLCJvbmxvYWQiLCJlIiwid29ya2Jvb2siLCJyZWFkIiwicmVzdWx0IiwiY3N2RGF0YSIsInNoZWV0X3RvX2NzdiIsIlNoZWV0cyIsIlNoZWV0MSIsImNyZWF0ZURhdGEiLCJ0aGVuIiwiZGF0YSIsIm1vZGUiLCJpbnNlcnRBdCIsInJlbG9hZERhdGEiLCJ0ZW1wbGF0ZSIsInJlYWRBc0JpbmFyeVN0cmluZyIsImhhbmRsZUltcG9ydEV2ZW50IiwiaGFuZGxlRXhwb3J0RXZlbnQiLCJWWEVUYWJsZVBsdWdpbkV4cG9ydFhMU1giLCJpbnN0YWxsIiwieHRhYmxlIiwiaW50ZXJjZXB0b3IiLCJPYmplY3QiLCJhc3NpZ24iLCJ0eXBlcyIsInhsc3giLCJtaXhpbiIsIlZYRVRhYmxlIiwidXNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQTtBQVNBO0FBQXVCO0FBVnZCOztBQVdBO0FBRUEsSUFBSUEsU0FBMEI7QUFHOUIsU0FBU0MsWUFBWSxDQUFFQyxNQUFvQixFQUFFQyxTQUFjLEVBQUE7RUFDekQsSUFBSUEsU0FBUyxFQUFFO0lBQ2IsUUFBUUQsTUFBTSxDQUFDRSxRQUFRO01BQ3JCLEtBQUssUUFBUTtRQUNYLE9BQU9DLG1CQUFPLENBQUNDLGFBQWEsQ0FBQ0gsU0FBUyxDQUFDO01BQ3pDLEtBQUssUUFBUTtRQUNYLElBQUksQ0FBQ0ksS0FBSyxDQUFDSixTQUFTLENBQUMsRUFBRTtVQUNyQixPQUFPSyxNQUFNLENBQUNMLFNBQVMsQ0FBQztRQ1ZsQjtRRFlSO01BQ0Y7UUFDRSxJQUFJQSxTQUFTLENBQUNNLE1BQU0sR0FBRyxFQUFFLElBQUksQ0FBQ0YsS0FBSyxDQUFDSixTQUFTLENBQUMsRUFBRTtVQUM5QyxPQUFPSyxNQUFNLENBQUNMLFNBQVMsQ0FBQztRQ1ZsQjtRRFlSO0lBQUs7RUNUVDtFRFlGLE9BQU9BLFNBQVM7QUFDbEI7QUFJQSxTQUFTTyxrQkFBa0IsQ0FBRUMsTUFBYSxFQUFFQyxJQUFrQixFQUFFQyxJQUFXLEVBQUVYLE1BQW9CLEVBQUE7RUFDL0YsSUFBSUMsU0FBUyxHQUFHRSxtQkFBTyxDQUFDUyxRQUFRLENBQUNELElBQUksQ0FBQ0YsTUFBTSxDQUFDSSxlQUFlLENBQUNiLE1BQU0sQ0FBQyxDQUFDLENBQUM7RUFDdEUsT0FBT0MsU0FBUztBQUNsQjtBQUVBLFNBQVNhLFFBQVEsQ0FBRUMsS0FBVSxFQUFBO0VBQzNCLElBQUlDLEdBQUcsR0FBRyxJQUFJQyxXQUFXLENBQUNGLEtBQUssQ0FBQ1IsTUFBTSxDQUFDO0VBQ3ZDLElBQUlXLElBQUksR0FBRyxJQUFJQyxVQUFVLENBQUNILEdBQUcsQ0FBQztFQUM5QixLQUFLLElBQUlJLEtBQUssR0FBRyxDQUFDLEVBQUVBLEtBQUssS0FBS0wsS0FBSyxDQUFDUixNQUFNLEVBQUUsRUFBRWEsS0FBSztJQUFFRixJQUFJLENBQUNFLEtBQUssQ0FBQyxHQUFHTCxLQUFLLENBQUNNLFVBQVUsQ0FBQ0QsS0FBSyxDQUFDLEdBQUcsSUFBSTtFQUFBO0VBQ2pHLE9BQU9KLEdBQUc7QUFDWjtBQUVBLFNBQVNNLFVBQVUsQ0FBRUMsTUFBK0IsRUFBQTtFQUNsRCxJQUFRZCxNQUFNLEdBQThCYyxNQUFNLENBQTFDZCxNQUFNO0lBQUVlLE9BQU8sR0FBcUJELE1BQU0sQ0FBbENDLE9BQU87SUFBRUMsT0FBTyxHQUFZRixNQUFNLENBQXpCRSxPQUFPO0lBQUVDLEtBQUssR0FBS0gsTUFBTSxDQUFoQkcsS0FBSztFQUN2QyxJQUFRQyxTQUFTLEdBQXNFSCxPQUFPLENBQXRGRyxTQUFTO0lBQUVDLElBQUksR0FBZ0VKLE9BQU8sQ0FBM0VJLElBQUk7SUFBRUMsUUFBUSxHQUFzREwsT0FBTyxDQUFyRUssUUFBUTtJQUFFQyxRQUFRLEdBQTRDTixPQUFPLENBQTNETSxRQUFRO0lBQUVDLFFBQVEsR0FBa0NQLE9BQU8sQ0FBakRPLFFBQVE7SUFBRUMsT0FBTyxHQUF5QlIsT0FBTyxDQUF2Q1EsT0FBTztJQUFFQyxrQkFBa0IsR0FBS1QsT0FBTyxDQUE5QlMsa0JBQWtCO0VBQ2xGLElBQU1DLE9BQU8sR0FBMkIsQ0FBQSxDQUFFO0VBQzFDLElBQU1DLFFBQVEsR0FBNkIsRUFBRTtFQUM3QztFQUVBLElBQUlOLFFBQVEsRUFBRTtJQUNaSixPQUFPLENBQUNXLE9BQU8sQ0FBQyxVQUFDcEMsTUFBTSxFQUFJO01BQ3pCa0MsT0FBTyxDQUFDbEMsTUFBTSxDQUFDcUMsRUFBRSxDQUFDLEdBQUdsQyxtQkFBTyxDQUFDUyxRQUFRLENBQUNtQixRQUFRLEdBQUcvQixNQUFNLENBQUNzQyxRQUFRLEdBQUd0QyxNQUFNLENBQUN1QyxRQUFRLEVBQUUsQ0FBQztJQUN2RixDQUFDLENBQUM7RUNmRjtFRGtCRjtFQUNBLElBQU1DLE9BQU8sR0FBR2QsS0FBSyxDQUFDZSxHQUFHLENBQUMsVUFBQUMsSUFBSSxFQUFHO0lBQy9CLElBQU1DLElBQUksR0FBUSxDQUFBLENBQUU7SUFDcEJsQixPQUFPLENBQUNXLE9BQU8sQ0FBQyxVQUFDcEMsTUFBTSxFQUFJO01BQ3pCMkMsSUFBSSxDQUFDM0MsTUFBTSxDQUFDcUMsRUFBRSxDQUFDLEdBQUd0QyxZQUFZLENBQUNDLE1BQU0sRUFBRTBDLElBQUksQ0FBQzFDLE1BQU0sQ0FBQ3FDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUMsQ0FBQztJQUNGLE9BQU9NLElBQUk7RUFDYixDQUFDLENBQUM7RUFFRixJQUFJYixRQUFRLEVBQUU7SUFDWiwyQkFBdUJyQixNQUFNLENBQUNtQyxZQUFZLEVBQUU7TUFBcENDLFVBQVUsd0JBQVZBLFVBQVU7SUFDbEIsSUFBTUMsT0FBTyxHQUFHYixrQkFBa0IsR0FBR1ksVUFBVSxDQUFDRSxNQUFNLENBQUNkLGtCQUFrQixDQUFDLEdBQUdZLFVBQVU7SUFDdkZDLE9BQU8sQ0FBQ1YsT0FBTyxDQUFDLFVBQUN6QixJQUFJLEVBQUk7TUFDdkIsSUFBTStCLElBQUksR0FBMkIsQ0FBQSxDQUFFO01BQ3ZDakIsT0FBTyxDQUFDVyxPQUFPLENBQUMsVUFBQ3BDLE1BQU0sRUFBSTtRQUN6QjBDLElBQUksQ0FBQzFDLE1BQU0sQ0FBQ3FDLEVBQUUsQ0FBQyxHQUFHN0Isa0JBQWtCLENBQUNDLE1BQU0sRUFBRWUsT0FBTyxFQUFFYixJQUFJLEVBQUVYLE1BQU0sQ0FBQztNQUNyRSxDQUFDLENBQUM7TUFDRm1DLFFBQVEsQ0FBQ2EsSUFBSSxDQUFDTixJQUFJLENBQUM7SUFDckIsQ0FBQyxDQUFDO0VDakJGO0VEbUJGLElBQU1PLElBQUksR0FBR0MsZ0JBQUksQ0FBQ0MsS0FBSyxDQUFDQyxRQUFRLEVBQUU7RUFDbEMsSUFBTUMsS0FBSyxHQUFHSCxnQkFBSSxDQUFDQyxLQUFLLENBQUNHLGFBQWEsQ0FBQyxDQUFDekIsUUFBUSxHQUFHLENBQUNLLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRXFCLE1BQU0sQ0FBQ2YsT0FBTyxDQUFDLENBQUNlLE1BQU0sQ0FBQ3BCLFFBQVEsQ0FBQyxFQUFFO0lBQUVxQixVQUFVLEVBQUU7RUFBSSxDQUFFLENBQUM7RUFDMUg7RUFDQU4sZ0JBQUksQ0FBQ0MsS0FBSyxDQUFDTSxpQkFBaUIsQ0FBQ1IsSUFBSSxFQUFFSSxLQUFLLEVBQUUxQixTQUFTLENBQUM7RUFDcEQsSUFBTVosS0FBSyxHQUFHbUMsZ0JBQUksQ0FBQ1EsS0FBSyxDQUFDVCxJQUFJLEVBQUU7SUFBRVUsUUFBUSxFQUFFL0IsSUFBSTtJQUFFZ0MsT0FBTyxFQUFFLEtBQUs7SUFBRWhDLElBQUksRUFBRTtFQUFRLENBQUUsQ0FBQztFQUNsRixJQUFNaUMsSUFBSSxHQUFHLElBQUlDLElBQUksQ0FBQyxDQUFDaEQsUUFBUSxDQUFDQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0lBQUVhLElBQUksRUFBRTtFQUEwQixDQUFFLENBQUM7RUFDOUU7RUFDQW1DLFlBQVksQ0FBQ0YsSUFBSSxFQUFFckMsT0FBTyxDQUFDO0VBQzNCLElBQUlRLE9BQU8sS0FBSyxLQUFLLEVBQUU7SUFDckJsQyxTQUFTLENBQUNrRSxLQUFLLENBQUNoQyxPQUFPLENBQUM7TUFBRUEsT0FBTyxFQUFFbEMsU0FBUyxDQUFDbUUsQ0FBQyxDQUFDLHNCQUFzQixDQUFDO01BQUVDLE1BQU0sRUFBRTtJQUFTLENBQUUsQ0FBQztFQ2pCNUY7QURtQko7QUFFQSxTQUFTSCxZQUFZLENBQUVGLElBQVUsRUFBRXJDLE9BQXFCLEVBQUE7RUFDdEQsSUFBSTJDLE1BQU0sQ0FBQ0wsSUFBSSxFQUFFO0lBQ2YsSUFBUU0sUUFBUSxHQUFXNUMsT0FBTyxDQUExQjRDLFFBQVE7TUFBRXhDLElBQUksR0FBS0osT0FBTyxDQUFoQkksSUFBSTtJQUN0QixJQUFJeUMsU0FBUyxDQUFDQyxVQUFVLEVBQUU7TUFDeEJELFNBQVMsQ0FBQ0MsVUFBVSxDQUFDVCxJQUFJLFlBQUtPLFFBQVEsY0FBSXhDLElBQUksRUFBRztJQ2xCL0MsQ0RtQkgsTUFBTTtNQUNMLElBQUkyQyxRQUFRLEdBQUdDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLEdBQUcsQ0FBQztNQUMxQ0YsUUFBUSxDQUFDRyxNQUFNLEdBQUcsUUFBUTtNQUMxQkgsUUFBUSxDQUFDSSxRQUFRLGFBQU1QLFFBQVEsY0FBSXhDLElBQUksQ0FBRTtNQUN6QzJDLFFBQVEsQ0FBQ0ssSUFBSSxHQUFHQyxHQUFHLENBQUNDLGVBQWUsQ0FBQ2pCLElBQUksQ0FBQztNQUN6Q1csUUFBUSxDQUFDTyxJQUFJLENBQUNDLFdBQVcsQ0FBQ1QsUUFBUSxDQUFDO01BQ25DQSxRQUFRLENBQUNVLEtBQUssRUFBRTtNQUNoQlQsUUFBUSxDQUFDTyxJQUFJLENBQUNHLFdBQVcsQ0FBQ1gsUUFBUSxDQUFDO0lDakJqQztFQUNKLENEa0JELE1BQU07SUFDTFksT0FBTyxDQUFDQyxLQUFLLENBQUN0RixTQUFTLENBQUNtRSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztFQ2hCOUM7QURrQko7QUFFQSxTQUFTb0Isc0JBQXNCLENBQUVDLEdBQVcsRUFBQTtFQUMxQyxPQUFPQSxHQUFHLENBQUNDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUNBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO0FBQ2hEO0FBRUEsU0FBU0MsUUFBUSxDQUFFL0QsT0FBdUIsRUFBRWdFLE9BQWUsRUFBQTtFQUN6RCxJQUFNQyxJQUFJLEdBQUdELE9BQU8sQ0FBQ0UsS0FBSyxDQUFDLElBQUksQ0FBQztFQUNoQyxJQUFNQyxNQUFNLEdBQWEsRUFBRTtFQUMzQixJQUFNakYsSUFBSSxHQUFVLEVBQUU7RUFDdEIsSUFBSStFLElBQUksQ0FBQ25GLE1BQU0sRUFBRTtJQUNmLElBQU1zRixLQUFLLEdBQUdILElBQUksQ0FBQ0ksS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzQkosSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNsRCxHQUFHLENBQUM0QyxzQkFBc0IsQ0FBQztJQUM5Q1EsS0FBSyxDQUFDekQsT0FBTyxDQUFDLFVBQUMyRCxDQUFDLEVBQUk7TUFDbEIsSUFBSUEsQ0FBQyxFQUFFO1FBQ0wsSUFBTXJELElBQUksR0FBMkIsQ0FBQSxDQUFFO1FBQ3ZDcUQsQ0FBQyxDQUFDSixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUN2RCxPQUFPLENBQUMsVUFBQ2tELEdBQUcsRUFBRVUsUUFBUSxFQUFJO1VBQ3JDLElBQUlKLE1BQU0sQ0FBQ0ksUUFBUSxDQUFDLEVBQUU7WUFDcEJ0RCxJQUFJLENBQUNrRCxNQUFNLENBQUNJLFFBQVEsQ0FBQyxDQUFDLEdBQUdYLHNCQUFzQixDQUFDQyxHQUFHLENBQUM7VUNsQjVDO1FEb0JaLENBQUMsQ0FBQztRQUNGM0UsSUFBSSxDQUFDcUMsSUFBSSxDQUFDTixJQUFJLENBQUM7TUNsQlg7SURvQlIsQ0FBQyxDQUFDO0VDbEJGO0VEb0JGLE9BQU87SUFBRWtELE1BQU0sRUFBTkEsTUFBTTtJQUFFakYsSUFBSSxFQUFKQTtFQUFJLENBQUU7QUFDekI7QUFFQSxTQUFTc0YsZUFBZSxDQUFFeEUsT0FBdUIsRUFBRW1FLE1BQWdCLEVBQUVqRixJQUFXLEVBQUE7RUFDOUUsSUFBSXVGLFdBQVcsR0FBYSxFQUFFO0VBQzlCekUsT0FBTyxDQUFDVyxPQUFPLENBQUMsVUFBQ3BDLE1BQU0sRUFBSTtJQUN6QixJQUFJbUcsS0FBSyxHQUFHbkcsTUFBTSxDQUFDc0MsUUFBUTtJQUMzQixJQUFJNkQsS0FBSyxFQUFFO01BQ1RELFdBQVcsQ0FBQ2xELElBQUksQ0FBQ21ELEtBQUssQ0FBQztJQ25CckI7RURxQk4sQ0FBQyxDQUFDO0VBQ0YsT0FBT0QsV0FBVyxDQUFDRSxLQUFLLENBQUMsVUFBQ0QsS0FBSztJQUFBLE9BQUtQLE1BQU0sQ0FBQ1MsUUFBUSxDQUFDRixLQUFLLENBQUM7RUFBQSxFQUFDO0FBQzdEO0FBRUEsU0FBU0csVUFBVSxDQUFFL0UsTUFBK0IsRUFBQTtFQUNsRCxJQUFRRSxPQUFPLEdBQW9CRixNQUFNLENBQWpDRSxPQUFPO0lBQUVELE9BQU8sR0FBV0QsTUFBTSxDQUF4QkMsT0FBTztJQUFFK0UsSUFBSSxHQUFLaEYsTUFBTSxDQUFmZ0YsSUFBSTtFQUM5QixJQUFNOUYsTUFBTSxHQUFRYyxNQUFNLENBQUNkLE1BQU07RUFDakMsSUFBUStGLGNBQWMsR0FBSy9GLE1BQU0sQ0FBekIrRixjQUFjO0VBQ3RCLElBQU1DLFVBQVUsR0FBRyxJQUFJQyxVQUFVLEVBQUU7RUFDbkNELFVBQVUsQ0FBQ0UsTUFBTSxHQUFHLFVBQUNDLENBQU0sRUFBSTtJQUM3QixJQUFNQyxRQUFRLEdBQUczRCxnQkFBSSxDQUFDNEQsSUFBSSxDQUFDRixDQUFDLENBQUNsQyxNQUFNLENBQUNxQyxNQUFNLEVBQUU7TUFBRW5GLElBQUksRUFBRTtJQUFRLENBQUUsQ0FBQztJQUMvRCxJQUFNb0YsT0FBTyxHQUFXOUQsZ0JBQUksQ0FBQ0MsS0FBSyxDQUFDOEQsWUFBWSxDQUFDSixRQUFRLENBQUNLLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDO0lBQ3ZFLGdCQUF5QjNCLFFBQVEsQ0FBQy9ELE9BQU8sRUFBRXVGLE9BQU8sQ0FBQztNQUEzQ3BCLE1BQU0sYUFBTkEsTUFBTTtNQUFFakYsSUFBSSxhQUFKQSxJQUFJO0lBQ3BCLElBQU11RCxNQUFNLEdBQUcrQixlQUFlLENBQUN4RSxPQUFPLEVBQUVtRSxNQUFNLEVBQUVqRixJQUFJLENBQUM7SUFDckQsSUFBSXVELE1BQU0sRUFBRTtNQUNWekQsTUFBTSxDQUFDMkcsVUFBVSxDQUFDekcsSUFBSSxDQUFDLENBQ3BCMEcsSUFBSSxDQUFDLFVBQUNDLElBQVcsRUFBSTtRQUNwQixJQUFJOUYsT0FBTyxDQUFDK0YsSUFBSSxLQUFLLFFBQVEsRUFBRTtVQUM3QjlHLE1BQU0sQ0FBQytHLFFBQVEsQ0FBQ0YsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FDcEJyQixDRHFCTCxNQUFNO1VBQ0w3RyxNQUFNLENBQUNnSCxVQUFVLENBQUNILElBQUksQ0FBQztRQ25CbkI7TURxQlIsQ0FBQyxDQUFDO01BQ0osSUFBSTlGLE9BQU8sQ0FBQ1EsT0FBTyxLQUFLLEtBQUssRUFBRTtRQUM3QmxDLFNBQVMsQ0FBQ2tFLEtBQUssQ0FBQ2hDLE9BQU8sQ0FBQztVQUFFQSxPQUFPLEVBQUU3QixtQkFBTyxDQUFDdUgsUUFBUSxDQUFDNUgsU0FBUyxDQUFDbUUsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQ3RELElBQUksQ0FBQ0osTUFBTSxDQUFDLENBQUM7VUFBRTJELE1BQU0sRUFBRTtRQUFTLENBQUUsQ0FBQztNQ25Cekg7SUFDSixDRG9CSCxNQUFNLElBQUkxQyxPQUFPLENBQUNRLE9BQU8sS0FBSyxLQUFLLEVBQUU7TUFDcENsQyxTQUFTLENBQUNrRSxLQUFLLENBQUNoQyxPQUFPLENBQUM7UUFBRUEsT0FBTyxFQUFFbEMsU0FBUyxDQUFDbUUsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO1FBQUVDLE1BQU0sRUFBRTtNQUFPLENBQUUsQ0FBQztJQ2xCdkY7SURvQkosSUFBSXNDLGNBQWMsRUFBRTtNQUNsQkEsY0FBYyxDQUFDdEMsTUFBTSxDQUFDO01BQ3RCekQsTUFBTSxDQUFDK0YsY0FBYyxHQUFHLElBQUk7SUNsQjFCO0VEb0JOLENBQUM7RUFDREMsVUFBVSxDQUFDa0Isa0JBQWtCLENBQUNwQixJQUFJLENBQUM7QUFDckM7QUFFQSxTQUFTcUIsaUJBQWlCLENBQUVyRyxNQUErQixFQUFBO0VBQ3pELElBQUlBLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDSSxJQUFJLEtBQUssTUFBTSxFQUFFO0lBQ2xDMEUsVUFBVSxDQUFDL0UsTUFBTSxDQUFDO0lBQ2xCLE9BQU8sS0FBSztFQ25CWjtBRHFCSjtBQUVBLFNBQVNzRyxpQkFBaUIsQ0FBRXRHLE1BQStCLEVBQUE7RUFDekQsSUFBSUEsTUFBTSxDQUFDQyxPQUFPLENBQUNJLElBQUksS0FBSyxNQUFNLEVBQUU7SUFDbENOLFVBQVUsQ0FBQ0MsTUFBTSxDQUFDO0lBQ2xCLE9BQU8sS0FBSztFQ3BCWjtBRHNCSjtBQUVBO0FDckJBO0FBQ0E7QUR1Qk8sSUFBTXVHLHdCQUF3QixHQUFHO0VBQ3RDQyxPQUFPLG1CQUFFQyxNQUF1QixFQUFBO0lBQzlCLElBQVFDLFdBQVcsR0FBS0QsTUFBTSxDQUF0QkMsV0FBVztJQUNuQm5JLFNBQVMsR0FBR2tJLE1BQU07SUFDbEJFLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDSCxNQUFNLENBQUNJLEtBQUssRUFBRTtNQUFFQyxJQUFJLEVBQUU7SUFBQyxDQUFFLENBQUM7SUFDeENKLFdBQVcsQ0FBQ0ssS0FBSyxDQUFDO01BQ2hCLGNBQWMsRUFBRVYsaUJBQWlCO01BQ2pDLGNBQWMsRUFBRUM7SUNyQmQsQ0RzQkgsQ0FBQztFQUNKO0FDckJGLENEc0JDO0FBQUE7QUFFRCxJQUFJLE9BQU8xRCxNQUFNLEtBQUssV0FBVyxJQUFJQSxNQUFNLENBQUNvRSxRQUFRLEVBQUU7RUFDcERwRSxNQUFNLENBQUNvRSxRQUFRLENBQUNDLEdBQUcsQ0FBQ1Ysd0JBQXdCLENBQUM7QUN0Qi9DO0FEdUJDLGVBRWNBLHdCQUF3QjtBQUFBIiwiZmlsZSI6ImluZGV4LmNvbW1vbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXHJcbmltcG9ydCBYRVV0aWxzIGZyb20gJ3hlLXV0aWxzL21ldGhvZHMveGUtdXRpbHMnXHJcbmltcG9ydCB7XHJcbiAgVlhFVGFibGUsXHJcbiAgVGFibGUsXHJcbiAgSW50ZXJjZXB0b3JFeHBvcnRQYXJhbXMsXHJcbiAgSW50ZXJjZXB0b3JJbXBvcnRQYXJhbXMsXHJcbiAgQ29sdW1uQ29uZmlnLFxyXG4gIEV4cG9ydE9wdG9uc1xyXG59IGZyb20gJ3Z4ZS10YWJsZS9saWIvdnhlLXRhYmxlJ1xyXG5pbXBvcnQgWExTWCBmcm9tICd4bHN4J1xyXG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXHJcblxyXG5sZXQgX3Z4ZXRhYmxlOiB0eXBlb2YgVlhFVGFibGVcclxuXHJcblxyXG5mdW5jdGlvbiBnZXRDZWxsTGFiZWwgKGNvbHVtbjogQ29sdW1uQ29uZmlnLCBjZWxsVmFsdWU6IGFueSkge1xyXG4gIGlmIChjZWxsVmFsdWUpIHtcclxuICAgIHN3aXRjaCAoY29sdW1uLmNlbGxUeXBlKSB7XHJcbiAgICAgIGNhc2UgJ3N0cmluZyc6XHJcbiAgICAgICAgcmV0dXJuIFhFVXRpbHMudG9WYWx1ZVN0cmluZyhjZWxsVmFsdWUpXHJcbiAgICAgIGNhc2UgJ251bWJlcic6XHJcbiAgICAgICAgaWYgKCFpc05hTihjZWxsVmFsdWUpKSB7XHJcbiAgICAgICAgICByZXR1cm4gTnVtYmVyKGNlbGxWYWx1ZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBpZiAoY2VsbFZhbHVlLmxlbmd0aCA8IDEyICYmICFpc05hTihjZWxsVmFsdWUpKSB7XHJcbiAgICAgICAgICByZXR1cm4gTnVtYmVyKGNlbGxWYWx1ZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGNlbGxWYWx1ZVxyXG59XHJcblxyXG5cclxuXHJcbmZ1bmN0aW9uIGdldEZvb3RlckNlbGxWYWx1ZSAoJHRhYmxlOiBUYWJsZSwgb3B0czogRXhwb3J0T3B0b25zLCByb3dzOiBhbnlbXSwgY29sdW1uOiBDb2x1bW5Db25maWcpIHtcclxuICB2YXIgY2VsbFZhbHVlID0gWEVVdGlscy50b1N0cmluZyhyb3dzWyR0YWJsZS4kZ2V0Q29sdW1uSW5kZXgoY29sdW1uKV0pXHJcbiAgcmV0dXJuIGNlbGxWYWx1ZVxyXG59XHJcblxyXG5mdW5jdGlvbiB0b0J1ZmZlciAod2JvdXQ6IGFueSkge1xyXG4gIGxldCBidWYgPSBuZXcgQXJyYXlCdWZmZXIod2JvdXQubGVuZ3RoKVxyXG4gIGxldCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKVxyXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggIT09IHdib3V0Lmxlbmd0aDsgKytpbmRleCkgdmlld1tpbmRleF0gPSB3Ym91dC5jaGFyQ29kZUF0KGluZGV4KSAmIDB4RkZcclxuICByZXR1cm4gYnVmXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4cG9ydFhMU1ggKHBhcmFtczogSW50ZXJjZXB0b3JFeHBvcnRQYXJhbXMpIHtcclxuICBjb25zdCB7ICR0YWJsZSwgb3B0aW9ucywgY29sdW1ucywgZGF0YXMgfSA9IHBhcmFtc1xyXG4gIGNvbnN0IHsgc2hlZXROYW1lLCB0eXBlLCBpc0hlYWRlciwgaXNGb290ZXIsIG9yaWdpbmFsLCBtZXNzYWdlLCBmb290ZXJGaWx0ZXJNZXRob2QgfSA9IG9wdGlvbnNcclxuICBjb25zdCBjb2xIZWFkOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge31cclxuICBjb25zdCBmb290TGlzdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdID0gW11cclxuICAvLyBjb25zdCByb3dMaXN0ID0gZGF0YXNcclxuXHJcbiAgaWYgKGlzSGVhZGVyKSB7XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBjb2xIZWFkW2NvbHVtbi5pZF0gPSBYRVV0aWxzLnRvU3RyaW5nKG9yaWdpbmFsID8gY29sdW1uLnByb3BlcnR5IDogY29sdW1uLmdldFRpdGxlKCkpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy8g5paw5aKe6YOo5YiGXHJcbiAgY29uc3Qgcm93TGlzdCA9IGRhdGFzLm1hcChpdGVtID0+IHtcclxuICAgIGNvbnN0IHJlc3Q6IGFueSA9IHt9XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICByZXN0W2NvbHVtbi5pZF0gPSBnZXRDZWxsTGFiZWwoY29sdW1uLCBpdGVtW2NvbHVtbi5pZF0pXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHJlc3RcclxuICB9KVxyXG5cclxuICBpZiAoaXNGb290ZXIpIHtcclxuICAgIGNvbnN0IHsgZm9vdGVyRGF0YSB9ID0gJHRhYmxlLmdldFRhYmxlRGF0YSgpXHJcbiAgICBjb25zdCBmb290ZXJzID0gZm9vdGVyRmlsdGVyTWV0aG9kID8gZm9vdGVyRGF0YS5maWx0ZXIoZm9vdGVyRmlsdGVyTWV0aG9kKSA6IGZvb3RlckRhdGFcclxuICAgIGZvb3RlcnMuZm9yRWFjaCgocm93cykgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge31cclxuICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICBpdGVtW2NvbHVtbi5pZF0gPSBnZXRGb290ZXJDZWxsVmFsdWUoJHRhYmxlLCBvcHRpb25zLCByb3dzLCBjb2x1bW4pXHJcbiAgICAgIH0pXHJcbiAgICAgIGZvb3RMaXN0LnB1c2goaXRlbSlcclxuICAgIH0pXHJcbiAgfVxyXG4gIGNvbnN0IGJvb2sgPSBYTFNYLnV0aWxzLmJvb2tfbmV3KClcclxuICBjb25zdCBzaGVldCA9IFhMU1gudXRpbHMuanNvbl90b19zaGVldCgoaXNIZWFkZXIgPyBbY29sSGVhZF0gOiBbXSkuY29uY2F0KHJvd0xpc3QpLmNvbmNhdChmb290TGlzdCksIHsgc2tpcEhlYWRlcjogdHJ1ZSB9KVxyXG4gIC8vIOi9rOaNouaVsOaNrlxyXG4gIFhMU1gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQoYm9vaywgc2hlZXQsIHNoZWV0TmFtZSlcclxuICBjb25zdCB3Ym91dCA9IFhMU1gud3JpdGUoYm9vaywgeyBib29rVHlwZTogdHlwZSwgYm9va1NTVDogZmFsc2UsIHR5cGU6ICdiaW5hcnknIH0pXHJcbiAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt0b0J1ZmZlcih3Ym91dCldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pXHJcbiAgLy8g5L+d5a2Y5a+85Ye6XHJcbiAgZG93bmxvYWRGaWxlKGJsb2IsIG9wdGlvbnMpXHJcbiAgaWYgKG1lc3NhZ2UgIT09IGZhbHNlKSB7XHJcbiAgICBfdnhldGFibGUubW9kYWwubWVzc2FnZSh7IG1lc3NhZ2U6IF92eGV0YWJsZS50KCd2eGUudGFibGUuZXhwU3VjY2VzcycpLCBzdGF0dXM6ICdzdWNjZXNzJyB9KVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZG93bmxvYWRGaWxlIChibG9iOiBCbG9iLCBvcHRpb25zOiBFeHBvcnRPcHRvbnMpIHtcclxuICBpZiAod2luZG93LkJsb2IpIHtcclxuICAgIGNvbnN0IHsgZmlsZW5hbWUsIHR5cGUgfSA9IG9wdGlvbnNcclxuICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlQmxvYikge1xyXG4gICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYihibG9iLCBgJHtmaWxlbmFtZX0uJHt0eXBlfWApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgbGlua0VsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcclxuICAgICAgbGlua0VsZW0udGFyZ2V0ID0gJ19ibGFuaydcclxuICAgICAgbGlua0VsZW0uZG93bmxvYWQgPSBgJHtmaWxlbmFtZX0uJHt0eXBlfWBcclxuICAgICAgbGlua0VsZW0uaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rRWxlbSlcclxuICAgICAgbGlua0VsZW0uY2xpY2soKVxyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmtFbGVtKVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zb2xlLmVycm9yKF92eGV0YWJsZS50KCd2eGUuZXJyb3Iubm90RXhwJykpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXBsYWNlRG91YmxlUXVvdGF0aW9uICh2YWw6IHN0cmluZykge1xyXG4gIHJldHVybiB2YWwucmVwbGFjZSgvXlwiLywgJycpLnJlcGxhY2UoL1wiJC8sICcnKVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUNzdiAoY29sdW1uczogQ29sdW1uQ29uZmlnW10sIGNvbnRlbnQ6IHN0cmluZykge1xyXG4gIGNvbnN0IGxpc3QgPSBjb250ZW50LnNwbGl0KCdcXG4nKVxyXG4gIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXVxyXG4gIGNvbnN0IHJvd3M6IGFueVtdID0gW11cclxuICBpZiAobGlzdC5sZW5ndGgpIHtcclxuICAgIGNvbnN0IHJMaXN0ID0gbGlzdC5zbGljZSgxKVxyXG4gICAgbGlzdFswXS5zcGxpdCgnLCcpLm1hcChyZXBsYWNlRG91YmxlUXVvdGF0aW9uKVxyXG4gICAgckxpc3QuZm9yRWFjaCgocikgPT4ge1xyXG4gICAgICBpZiAocikge1xyXG4gICAgICAgIGNvbnN0IGl0ZW06IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fVxyXG4gICAgICAgIHIuc3BsaXQoJywnKS5mb3JFYWNoKCh2YWwsIGNvbEluZGV4KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZmllbGRzW2NvbEluZGV4XSkge1xyXG4gICAgICAgICAgICBpdGVtW2ZpZWxkc1tjb2xJbmRleF1dID0gcmVwbGFjZURvdWJsZVF1b3RhdGlvbih2YWwpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICByb3dzLnB1c2goaXRlbSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgcmV0dXJuIHsgZmllbGRzLCByb3dzIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tJbXBvcnREYXRhIChjb2x1bW5zOiBDb2x1bW5Db25maWdbXSwgZmllbGRzOiBzdHJpbmdbXSwgcm93czogYW55W10pIHtcclxuICBsZXQgdGFibGVGaWVsZHM6IHN0cmluZ1tdID0gW11cclxuICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgbGV0IGZpZWxkID0gY29sdW1uLnByb3BlcnR5XHJcbiAgICBpZiAoZmllbGQpIHtcclxuICAgICAgdGFibGVGaWVsZHMucHVzaChmaWVsZClcclxuICAgIH1cclxuICB9KVxyXG4gIHJldHVybiB0YWJsZUZpZWxkcy5ldmVyeSgoZmllbGQpID0+IGZpZWxkcy5pbmNsdWRlcyhmaWVsZCkpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGltcG9ydFhMU1ggKHBhcmFtczogSW50ZXJjZXB0b3JJbXBvcnRQYXJhbXMpIHtcclxuICBjb25zdCB7IGNvbHVtbnMsIG9wdGlvbnMsIGZpbGUgfSA9IHBhcmFtc1xyXG4gIGNvbnN0ICR0YWJsZTogYW55ID0gcGFyYW1zLiR0YWJsZVxyXG4gIGNvbnN0IHsgX2ltcG9ydFJlc29sdmUgfSA9ICR0YWJsZVxyXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXHJcbiAgZmlsZVJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICBjb25zdCB3b3JrYm9vayA9IFhMU1gucmVhZChlLnRhcmdldC5yZXN1bHQsIHsgdHlwZTogJ2JpbmFyeScgfSlcclxuICAgIGNvbnN0IGNzdkRhdGE6IHN0cmluZyA9IFhMU1gudXRpbHMuc2hlZXRfdG9fY3N2KHdvcmtib29rLlNoZWV0cy5TaGVldDEpXHJcbiAgICBjb25zdCB7IGZpZWxkcywgcm93cyB9ID0gcGFyc2VDc3YoY29sdW1ucywgY3N2RGF0YSlcclxuICAgIGNvbnN0IHN0YXR1cyA9IGNoZWNrSW1wb3J0RGF0YShjb2x1bW5zLCBmaWVsZHMsIHJvd3MpXHJcbiAgICBpZiAoc3RhdHVzKSB7XHJcbiAgICAgICR0YWJsZS5jcmVhdGVEYXRhKHJvd3MpXHJcbiAgICAgICAgLnRoZW4oKGRhdGE6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgICBpZiAob3B0aW9ucy5tb2RlID09PSAnYXBwZW5kJykge1xyXG4gICAgICAgICAgICAkdGFibGUuaW5zZXJ0QXQoZGF0YSwgLTEpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkdGFibGUucmVsb2FkRGF0YShkYXRhKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIGlmIChvcHRpb25zLm1lc3NhZ2UgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgX3Z4ZXRhYmxlLm1vZGFsLm1lc3NhZ2UoeyBtZXNzYWdlOiBYRVV0aWxzLnRlbXBsYXRlKF92eGV0YWJsZS50KCd2eGUudGFibGUuaW1wU3VjY2VzcycpLCBbcm93cy5sZW5ndGhdKSwgc3RhdHVzOiAnc3VjY2VzcycgfSlcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLm1lc3NhZ2UgIT09IGZhbHNlKSB7XHJcbiAgICAgIF92eGV0YWJsZS5tb2RhbC5tZXNzYWdlKHsgbWVzc2FnZTogX3Z4ZXRhYmxlLnQoJ3Z4ZS5lcnJvci5pbXBGaWVsZHMnKSwgc3RhdHVzOiAnZXJyb3InIH0pXHJcbiAgICB9XHJcbiAgICBpZiAoX2ltcG9ydFJlc29sdmUpIHtcclxuICAgICAgX2ltcG9ydFJlc29sdmUoc3RhdHVzKVxyXG4gICAgICAkdGFibGUuX2ltcG9ydFJlc29sdmUgPSBudWxsXHJcbiAgICB9XHJcbiAgfVxyXG4gIGZpbGVSZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKGZpbGUpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZUltcG9ydEV2ZW50IChwYXJhbXM6IEludGVyY2VwdG9ySW1wb3J0UGFyYW1zKSB7XHJcbiAgaWYgKHBhcmFtcy5vcHRpb25zLnR5cGUgPT09ICd4bHN4Jykge1xyXG4gICAgaW1wb3J0WExTWChwYXJhbXMpXHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZUV4cG9ydEV2ZW50IChwYXJhbXM6IEludGVyY2VwdG9yRXhwb3J0UGFyYW1zKSB7XHJcbiAgaWYgKHBhcmFtcy5vcHRpb25zLnR5cGUgPT09ICd4bHN4Jykge1xyXG4gICAgZXhwb3J0WExTWChwYXJhbXMpXHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDln7rkuo4gdnhlLXRhYmxlIOihqOagvOeahOWinuW8uuaPkuS7tu+8jOaUr+aMgeWvvOWHuiB4bHN4IOagvOW8j1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFZYRVRhYmxlUGx1Z2luRXhwb3J0WExTWCA9IHtcclxuICBpbnN0YWxsICh4dGFibGU6IHR5cGVvZiBWWEVUYWJsZSkge1xyXG4gICAgY29uc3QgeyBpbnRlcmNlcHRvciB9ID0geHRhYmxlXHJcbiAgICBfdnhldGFibGUgPSB4dGFibGVcclxuICAgIE9iamVjdC5hc3NpZ24oeHRhYmxlLnR5cGVzLCB7IHhsc3g6IDEgfSlcclxuICAgIGludGVyY2VwdG9yLm1peGluKHtcclxuICAgICAgJ2V2ZW50LmltcG9ydCc6IGhhbmRsZUltcG9ydEV2ZW50LFxyXG4gICAgICAnZXZlbnQuZXhwb3J0JzogaGFuZGxlRXhwb3J0RXZlbnRcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LlZYRVRhYmxlKSB7XHJcbiAgd2luZG93LlZYRVRhYmxlLnVzZShWWEVUYWJsZVBsdWdpbkV4cG9ydFhMU1gpXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZYRVRhYmxlUGx1Z2luRXhwb3J0WExTWFxyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuaW1wb3J0IFhFVXRpbHMgZnJvbSAneGUtdXRpbHMvbWV0aG9kcy94ZS11dGlscyc7XG5pbXBvcnQgWExTWCBmcm9tICd4bHN4Jztcbi8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cbmxldCBfdnhldGFibGU7XG5mdW5jdGlvbiBnZXRDZWxsTGFiZWwoY29sdW1uLCBjZWxsVmFsdWUpIHtcbiAgICBpZiAoY2VsbFZhbHVlKSB7XG4gICAgICAgIHN3aXRjaCAoY29sdW1uLmNlbGxUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIHJldHVybiBYRVV0aWxzLnRvVmFsdWVTdHJpbmcoY2VsbFZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihjZWxsVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIoY2VsbFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChjZWxsVmFsdWUubGVuZ3RoIDwgMTIgJiYgIWlzTmFOKGNlbGxWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcihjZWxsVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2VsbFZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0Rm9vdGVyQ2VsbFZhbHVlKCR0YWJsZSwgb3B0cywgcm93cywgY29sdW1uKSB7XG4gICAgdmFyIGNlbGxWYWx1ZSA9IFhFVXRpbHMudG9TdHJpbmcocm93c1skdGFibGUuJGdldENvbHVtbkluZGV4KGNvbHVtbildKTtcbiAgICByZXR1cm4gY2VsbFZhbHVlO1xufVxuZnVuY3Rpb24gdG9CdWZmZXIod2JvdXQpIHtcbiAgICBsZXQgYnVmID0gbmV3IEFycmF5QnVmZmVyKHdib3V0Lmxlbmd0aCk7XG4gICAgbGV0IHZpZXcgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggIT09IHdib3V0Lmxlbmd0aDsgKytpbmRleClcbiAgICAgICAgdmlld1tpbmRleF0gPSB3Ym91dC5jaGFyQ29kZUF0KGluZGV4KSAmIDB4RkY7XG4gICAgcmV0dXJuIGJ1Zjtcbn1cbmZ1bmN0aW9uIGV4cG9ydFhMU1gocGFyYW1zKSB7XG4gICAgY29uc3QgeyAkdGFibGUsIG9wdGlvbnMsIGNvbHVtbnMsIGRhdGFzIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgeyBzaGVldE5hbWUsIHR5cGUsIGlzSGVhZGVyLCBpc0Zvb3Rlciwgb3JpZ2luYWwsIG1lc3NhZ2UsIGZvb3RlckZpbHRlck1ldGhvZCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb2xIZWFkID0ge307XG4gICAgY29uc3QgZm9vdExpc3QgPSBbXTtcbiAgICAvLyBjb25zdCByb3dMaXN0ID0gZGF0YXNcbiAgICBpZiAoaXNIZWFkZXIpIHtcbiAgICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGNvbEhlYWRbY29sdW1uLmlkXSA9IFhFVXRpbHMudG9TdHJpbmcob3JpZ2luYWwgPyBjb2x1bW4ucHJvcGVydHkgOiBjb2x1bW4uZ2V0VGl0bGUoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyDmlrDlop7pg6jliIZcbiAgICBjb25zdCByb3dMaXN0ID0gZGF0YXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCByZXN0ID0ge307XG4gICAgICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICByZXN0W2NvbHVtbi5pZF0gPSBnZXRDZWxsTGFiZWwoY29sdW1uLCBpdGVtW2NvbHVtbi5pZF0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3Q7XG4gICAgfSk7XG4gICAgaWYgKGlzRm9vdGVyKSB7XG4gICAgICAgIGNvbnN0IHsgZm9vdGVyRGF0YSB9ID0gJHRhYmxlLmdldFRhYmxlRGF0YSgpO1xuICAgICAgICBjb25zdCBmb290ZXJzID0gZm9vdGVyRmlsdGVyTWV0aG9kID8gZm9vdGVyRGF0YS5maWx0ZXIoZm9vdGVyRmlsdGVyTWV0aG9kKSA6IGZvb3RlckRhdGE7XG4gICAgICAgIGZvb3RlcnMuZm9yRWFjaCgocm93cykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHt9O1xuICAgICAgICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtW2NvbHVtbi5pZF0gPSBnZXRGb290ZXJDZWxsVmFsdWUoJHRhYmxlLCBvcHRpb25zLCByb3dzLCBjb2x1bW4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb290TGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgYm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKTtcbiAgICBjb25zdCBzaGVldCA9IFhMU1gudXRpbHMuanNvbl90b19zaGVldCgoaXNIZWFkZXIgPyBbY29sSGVhZF0gOiBbXSkuY29uY2F0KHJvd0xpc3QpLmNvbmNhdChmb290TGlzdCksIHsgc2tpcEhlYWRlcjogdHJ1ZSB9KTtcbiAgICAvLyDovazmjaLmlbDmja5cbiAgICBYTFNYLnV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KGJvb2ssIHNoZWV0LCBzaGVldE5hbWUpO1xuICAgIGNvbnN0IHdib3V0ID0gWExTWC53cml0ZShib29rLCB7IGJvb2tUeXBlOiB0eXBlLCBib29rU1NUOiBmYWxzZSwgdHlwZTogJ2JpbmFyeScgfSk7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt0b0J1ZmZlcih3Ym91dCldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xuICAgIC8vIOS/neWtmOWvvOWHulxuICAgIGRvd25sb2FkRmlsZShibG9iLCBvcHRpb25zKTtcbiAgICBpZiAobWVzc2FnZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgX3Z4ZXRhYmxlLm1vZGFsLm1lc3NhZ2UoeyBtZXNzYWdlOiBfdnhldGFibGUudCgndnhlLnRhYmxlLmV4cFN1Y2Nlc3MnKSwgc3RhdHVzOiAnc3VjY2VzcycgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gZG93bmxvYWRGaWxlKGJsb2IsIG9wdGlvbnMpIHtcbiAgICBpZiAod2luZG93LkJsb2IpIHtcbiAgICAgICAgY29uc3QgeyBmaWxlbmFtZSwgdHlwZSB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7XG4gICAgICAgICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYihibG9iLCBgJHtmaWxlbmFtZX0uJHt0eXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGxpbmtFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgbGlua0VsZW0udGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICBsaW5rRWxlbS5kb3dubG9hZCA9IGAke2ZpbGVuYW1lfS4ke3R5cGV9YDtcbiAgICAgICAgICAgIGxpbmtFbGVtLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rRWxlbSk7XG4gICAgICAgICAgICBsaW5rRWxlbS5jbGljaygpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rRWxlbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoX3Z4ZXRhYmxlLnQoJ3Z4ZS5lcnJvci5ub3RFeHAnKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVwbGFjZURvdWJsZVF1b3RhdGlvbih2YWwpIHtcbiAgICByZXR1cm4gdmFsLnJlcGxhY2UoL15cIi8sICcnKS5yZXBsYWNlKC9cIiQvLCAnJyk7XG59XG5mdW5jdGlvbiBwYXJzZUNzdihjb2x1bW5zLCBjb250ZW50KSB7XG4gICAgY29uc3QgbGlzdCA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IGZpZWxkcyA9IFtdO1xuICAgIGNvbnN0IHJvd3MgPSBbXTtcbiAgICBpZiAobGlzdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qgckxpc3QgPSBsaXN0LnNsaWNlKDEpO1xuICAgICAgICBsaXN0WzBdLnNwbGl0KCcsJykubWFwKHJlcGxhY2VEb3VibGVRdW90YXRpb24pO1xuICAgICAgICByTGlzdC5mb3JFYWNoKChyKSA9PiB7XG4gICAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB7fTtcbiAgICAgICAgICAgICAgICByLnNwbGl0KCcsJykuZm9yRWFjaCgodmFsLCBjb2xJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRzW2NvbEluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVtmaWVsZHNbY29sSW5kZXhdXSA9IHJlcGxhY2VEb3VibGVRdW90YXRpb24odmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJvd3MucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IGZpZWxkcywgcm93cyB9O1xufVxuZnVuY3Rpb24gY2hlY2tJbXBvcnREYXRhKGNvbHVtbnMsIGZpZWxkcywgcm93cykge1xuICAgIGxldCB0YWJsZUZpZWxkcyA9IFtdO1xuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgIGxldCBmaWVsZCA9IGNvbHVtbi5wcm9wZXJ0eTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICB0YWJsZUZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0YWJsZUZpZWxkcy5ldmVyeSgoZmllbGQpID0+IGZpZWxkcy5pbmNsdWRlcyhmaWVsZCkpO1xufVxuZnVuY3Rpb24gaW1wb3J0WExTWChwYXJhbXMpIHtcbiAgICBjb25zdCB7IGNvbHVtbnMsIG9wdGlvbnMsIGZpbGUgfSA9IHBhcmFtcztcbiAgICBjb25zdCAkdGFibGUgPSBwYXJhbXMuJHRhYmxlO1xuICAgIGNvbnN0IHsgX2ltcG9ydFJlc29sdmUgfSA9ICR0YWJsZTtcbiAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtib29rID0gWExTWC5yZWFkKGUudGFyZ2V0LnJlc3VsdCwgeyB0eXBlOiAnYmluYXJ5JyB9KTtcbiAgICAgICAgY29uc3QgY3N2RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fY3N2KHdvcmtib29rLlNoZWV0cy5TaGVldDEpO1xuICAgICAgICBjb25zdCB7IGZpZWxkcywgcm93cyB9ID0gcGFyc2VDc3YoY29sdW1ucywgY3N2RGF0YSk7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGNoZWNrSW1wb3J0RGF0YShjb2x1bW5zLCBmaWVsZHMsIHJvd3MpO1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAkdGFibGUuY3JlYXRlRGF0YShyb3dzKVxuICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubW9kZSA9PT0gJ2FwcGVuZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgJHRhYmxlLmluc2VydEF0KGRhdGEsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICR0YWJsZS5yZWxvYWREYXRhKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubWVzc2FnZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBfdnhldGFibGUubW9kYWwubWVzc2FnZSh7IG1lc3NhZ2U6IFhFVXRpbHMudGVtcGxhdGUoX3Z4ZXRhYmxlLnQoJ3Z4ZS50YWJsZS5pbXBTdWNjZXNzJyksIFtyb3dzLmxlbmd0aF0pLCBzdGF0dXM6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zLm1lc3NhZ2UgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBfdnhldGFibGUubW9kYWwubWVzc2FnZSh7IG1lc3NhZ2U6IF92eGV0YWJsZS50KCd2eGUuZXJyb3IuaW1wRmllbGRzJyksIHN0YXR1czogJ2Vycm9yJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2ltcG9ydFJlc29sdmUpIHtcbiAgICAgICAgICAgIF9pbXBvcnRSZXNvbHZlKHN0YXR1cyk7XG4gICAgICAgICAgICAkdGFibGUuX2ltcG9ydFJlc29sdmUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBmaWxlUmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhmaWxlKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUltcG9ydEV2ZW50KHBhcmFtcykge1xuICAgIGlmIChwYXJhbXMub3B0aW9ucy50eXBlID09PSAneGxzeCcpIHtcbiAgICAgICAgaW1wb3J0WExTWChwYXJhbXMpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlRXhwb3J0RXZlbnQocGFyYW1zKSB7XG4gICAgaWYgKHBhcmFtcy5vcHRpb25zLnR5cGUgPT09ICd4bHN4Jykge1xuICAgICAgICBleHBvcnRYTFNYKHBhcmFtcyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vKipcbiAqIOWfuuS6jiB2eGUtdGFibGUg6KGo5qC855qE5aKe5by65o+S5Lu277yM5pSv5oyB5a+85Ye6IHhsc3gg5qC85byPXG4gKi9cbmV4cG9ydCBjb25zdCBWWEVUYWJsZVBsdWdpbkV4cG9ydFhMU1ggPSB7XG4gICAgaW5zdGFsbCh4dGFibGUpIHtcbiAgICAgICAgY29uc3QgeyBpbnRlcmNlcHRvciB9ID0geHRhYmxlO1xuICAgICAgICBfdnhldGFibGUgPSB4dGFibGU7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oeHRhYmxlLnR5cGVzLCB7IHhsc3g6IDEgfSk7XG4gICAgICAgIGludGVyY2VwdG9yLm1peGluKHtcbiAgICAgICAgICAgICdldmVudC5pbXBvcnQnOiBoYW5kbGVJbXBvcnRFdmVudCxcbiAgICAgICAgICAgICdldmVudC5leHBvcnQnOiBoYW5kbGVFeHBvcnRFdmVudFxuICAgICAgICB9KTtcbiAgICB9XG59O1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5WWEVUYWJsZSkge1xuICAgIHdpbmRvdy5WWEVUYWJsZS51c2UoVlhFVGFibGVQbHVnaW5FeHBvcnRYTFNYKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFZYRVRhYmxlUGx1Z2luRXhwb3J0WExTWDtcbiJdfQ==