nsc-react-component 4.4.1 → 4.4.2
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/lib/base/menu/index.d.ts +1 -0
- package/lib/base/menu/index.js +2 -1
- package/lib/base/menu/index.js.map +1 -1
- package/lib/base/table/index.d.ts +3 -3
- package/lib/base/table/index.js +87 -79
- package/lib/base/table/index.js.map +1 -1
- package/lib/base/table/index_old.d.ts +119 -0
- package/lib/base/table/index_old.js +1058 -0
- package/lib/base/table/index_old.js.map +1 -0
- package/lib/page/BasePage/index.js +16 -9
- package/lib/page/BasePage/index.js.map +1 -1
- package/lib/page/BasePage/utils.d.ts +1 -0
- package/lib/page/BasePage/utils.js +23 -1
- package/lib/page/BasePage/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,1058 @@
|
|
|
1
|
+
import _Pagination from "antd/es/pagination";
|
|
2
|
+
import _Table from "antd/es/table";
|
|
3
|
+
import _Popover from "antd/es/popover";
|
|
4
|
+
import _Checkbox from "antd/es/checkbox";
|
|
5
|
+
import _Space from "antd/es/space";
|
|
6
|
+
import _Button from "antd/es/button";
|
|
7
|
+
import _message from "antd/es/message";
|
|
8
|
+
const _excluded = ["onResize", "width"],
|
|
9
|
+
_excluded2 = ["listeners"];
|
|
10
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
11
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
12
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
13
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
14
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
|
15
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
16
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
17
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
18
|
+
/*
|
|
19
|
+
* @Descripttion:
|
|
20
|
+
* @version:
|
|
21
|
+
* @Author: rxzhu
|
|
22
|
+
* @Date: 2021-03-23 08:46:20
|
|
23
|
+
* @LastEditors: rxzhu
|
|
24
|
+
* @LastEditTime: 2021-03-23 10:30:42
|
|
25
|
+
*/
|
|
26
|
+
import { AppstoreOutlined, CheckOutlined, ColumnHeightOutlined, SearchOutlined, SortAscendingOutlined, SortDescendingOutlined, RedoOutlined } from "@ant-design/icons";
|
|
27
|
+
import { isEmptyObj } from "@bj-nsc/functions";
|
|
28
|
+
import Store, { PageStore } from "@bj-nsc/msn";
|
|
29
|
+
import { utils } from "@bj-nsc/msn/lib/utils";
|
|
30
|
+
import * as React from "react";
|
|
31
|
+
import { DndProvider } from "react-dnd";
|
|
32
|
+
import BodyRow, { DndContextType, IBodyRowProps } from "../common/BodyRow";
|
|
33
|
+
import treeUtils from "../../treeUtils";
|
|
34
|
+
import "./index.module.less";
|
|
35
|
+
const {
|
|
36
|
+
BodyRowComponent,
|
|
37
|
+
HTML5Backend
|
|
38
|
+
} = BodyRow;
|
|
39
|
+
import withZhLocale from "../common/withZhLocale";
|
|
40
|
+
import { Resizable } from "react-resizable";
|
|
41
|
+
import "./resize.module.less";
|
|
42
|
+
import { getLess, getNode } from "../../utils";
|
|
43
|
+
import NoData from "../common/NoData";
|
|
44
|
+
import { getStorage } from "@bj-nsc/functions";
|
|
45
|
+
import config from "../../config";
|
|
46
|
+
import cls from "classnames";
|
|
47
|
+
const styles = null;
|
|
48
|
+
|
|
49
|
+
// interface StoreProps {}
|
|
50
|
+
|
|
51
|
+
export { DndContextType, IBodyRowProps };
|
|
52
|
+
const ResizeableTitle = props => {
|
|
53
|
+
const {
|
|
54
|
+
onResize,
|
|
55
|
+
width
|
|
56
|
+
} = props,
|
|
57
|
+
restProps = _objectWithoutProperties(props, _excluded);
|
|
58
|
+
return /*#__PURE__*/React.createElement(Resizable, {
|
|
59
|
+
width: width || 150,
|
|
60
|
+
height: 0,
|
|
61
|
+
onResize: onResize,
|
|
62
|
+
draggableOpts: {
|
|
63
|
+
enableUserSelectHack: false
|
|
64
|
+
}
|
|
65
|
+
}, /*#__PURE__*/React.createElement("th", restProps));
|
|
66
|
+
};
|
|
67
|
+
class NSCTable extends React.Component {
|
|
68
|
+
constructor(props) {
|
|
69
|
+
var _autoType;
|
|
70
|
+
super(props);
|
|
71
|
+
_defineProperty(this, "store", {});
|
|
72
|
+
_defineProperty(this, "thIconRef", /*#__PURE__*/React.createRef());
|
|
73
|
+
_defineProperty(this, "tableSearchRef", /*#__PURE__*/React.createRef());
|
|
74
|
+
_defineProperty(this, "listeners", {
|
|
75
|
+
onBeforeLoad: null,
|
|
76
|
+
load: null
|
|
77
|
+
});
|
|
78
|
+
_defineProperty(this, "components", {
|
|
79
|
+
header: {
|
|
80
|
+
cell: ResizeableTitle
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
_defineProperty(this, "handleResize", index => (e, _ref) => {
|
|
84
|
+
let {
|
|
85
|
+
size
|
|
86
|
+
} = _ref;
|
|
87
|
+
const {
|
|
88
|
+
cols
|
|
89
|
+
} = this.state;
|
|
90
|
+
const nextColumns = [...cols];
|
|
91
|
+
nextColumns[index] = _objectSpread(_objectSpread({}, nextColumns[index]), {}, {
|
|
92
|
+
width: size.width
|
|
93
|
+
});
|
|
94
|
+
this.setState({
|
|
95
|
+
cols: nextColumns
|
|
96
|
+
}, () => {
|
|
97
|
+
// 在状态更新后重新获取列配置
|
|
98
|
+
this.getColumns();
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
_defineProperty(this, "listenMessage", ev => {
|
|
102
|
+
const data = typeof ev.data === "string" ? JSON.parse(ev.data) : ev.data;
|
|
103
|
+
let _this = this;
|
|
104
|
+
if (data.eventType == "changeTableSize") {
|
|
105
|
+
const {
|
|
106
|
+
payload
|
|
107
|
+
} = data;
|
|
108
|
+
if (payload.size == "default" || payload.size == "small" || payload.size == "middle") {
|
|
109
|
+
_this.setState({
|
|
110
|
+
tableSize: payload.size
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
/**
|
|
116
|
+
* 模块列表移动排序
|
|
117
|
+
*/
|
|
118
|
+
_defineProperty(this, "moveRow", (dragIndex, hoverIndex, drag, target) => {
|
|
119
|
+
const _this = this;
|
|
120
|
+
let dragNode = drag.record;
|
|
121
|
+
let targetNode = target.record;
|
|
122
|
+
dragNode.moveArray(dragNode, targetNode);
|
|
123
|
+
let ids = dragNode.parentNode.getChildNodeIds();
|
|
124
|
+
let params = {
|
|
125
|
+
id: dragNode.id,
|
|
126
|
+
parentId: dragNode.attribute.parentId,
|
|
127
|
+
ids: ids
|
|
128
|
+
};
|
|
129
|
+
if (this.props.moveRow) {
|
|
130
|
+
this.props.moveRow(params);
|
|
131
|
+
} else {
|
|
132
|
+
this.store.reload();
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
let modal = props.type || "auto";
|
|
136
|
+
let storePrefix = getStorage("store-pre-key");
|
|
137
|
+
let autoType = getStorage(storePrefix ? storePrefix + "tableSize" : "tableSize");
|
|
138
|
+
autoType = (_autoType = autoType) === null || _autoType === void 0 ? void 0 : _autoType.content;
|
|
139
|
+
this.state = {
|
|
140
|
+
dataSource: [],
|
|
141
|
+
columns: [],
|
|
142
|
+
loading: false,
|
|
143
|
+
pagination: {},
|
|
144
|
+
activeIndex: -1,
|
|
145
|
+
//搜索文本
|
|
146
|
+
searchText: null,
|
|
147
|
+
fieldOption: null,
|
|
148
|
+
searchColor: null,
|
|
149
|
+
cols: [],
|
|
150
|
+
sorts: [],
|
|
151
|
+
filterParams: {},
|
|
152
|
+
tableSize: this.props.size || autoType || "default",
|
|
153
|
+
sortType: "single",
|
|
154
|
+
sorter: [],
|
|
155
|
+
//记录当前排序字段
|
|
156
|
+
sortInfo: {},
|
|
157
|
+
defaultSort: true,
|
|
158
|
+
checkColumn: [],
|
|
159
|
+
defaultCheck: true,
|
|
160
|
+
selectedRowKeys: [],
|
|
161
|
+
selectedRowDatas: [],
|
|
162
|
+
filter: [],
|
|
163
|
+
extra: {}
|
|
164
|
+
};
|
|
165
|
+
if (props.store instanceof Store) {
|
|
166
|
+
this.store = props.store;
|
|
167
|
+
} else {
|
|
168
|
+
const _ref2 = props.store || {},
|
|
169
|
+
{
|
|
170
|
+
listeners: listenersProps = {}
|
|
171
|
+
} = _ref2,
|
|
172
|
+
restStore = _objectWithoutProperties(_ref2, _excluded2);
|
|
173
|
+
const storeProps = _objectSpread(_objectSpread({
|
|
174
|
+
model: "model",
|
|
175
|
+
component: this,
|
|
176
|
+
listeners: {
|
|
177
|
+
onBeforeLoad: (store, options) => {
|
|
178
|
+
this.setState({
|
|
179
|
+
loading: true
|
|
180
|
+
});
|
|
181
|
+
utils.callback(listenersProps.onBeforeLoad, this, [store, options]);
|
|
182
|
+
},
|
|
183
|
+
dataChanged: (data, modelData, store) => {
|
|
184
|
+
let paging = !(this.props.pagination === false);
|
|
185
|
+
if (paging && !this.props.dataSource) {
|
|
186
|
+
this.setState({
|
|
187
|
+
dataSource: modelData,
|
|
188
|
+
pagination: store.getPagination(),
|
|
189
|
+
loading: false,
|
|
190
|
+
activeIndex: -1
|
|
191
|
+
});
|
|
192
|
+
} else {
|
|
193
|
+
this.setState({
|
|
194
|
+
dataSource: modelData,
|
|
195
|
+
loading: false
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
utils.callback(listenersProps.dataChanged, this, [data, modelData, store, paging]);
|
|
199
|
+
},
|
|
200
|
+
load: (data, modelData, store) => {
|
|
201
|
+
utils.callback(listenersProps.load, this, [data, modelData, store]);
|
|
202
|
+
},
|
|
203
|
+
onErrorLoad: (err, response) => {
|
|
204
|
+
this.setState({
|
|
205
|
+
loading: false
|
|
206
|
+
});
|
|
207
|
+
utils.callback(listenersProps.onErrorLoad, this, [err, response]);
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
data: restStore.data ? restStore.data : props.dataSource ? props.dataSource : null
|
|
211
|
+
}, restStore), {}, {
|
|
212
|
+
autoLoad: restStore.autoLoad === false ? false : true
|
|
213
|
+
});
|
|
214
|
+
this.store = new PageStore(Object.assign({}, storeProps, {
|
|
215
|
+
pagination: _objectSpread({
|
|
216
|
+
current: 1
|
|
217
|
+
}, this.props.pagination)
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
componentDidMount() {
|
|
222
|
+
const {
|
|
223
|
+
resizeColumn
|
|
224
|
+
} = this.props;
|
|
225
|
+
if (!resizeColumn) {
|
|
226
|
+
this.setState({
|
|
227
|
+
columns: [...this.props.columns]
|
|
228
|
+
});
|
|
229
|
+
} else {
|
|
230
|
+
this.setState({
|
|
231
|
+
cols: [...this.props.columns]
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
const store = this.props.store;
|
|
235
|
+
if (store && store.data) {
|
|
236
|
+
this.store.setData(store.data);
|
|
237
|
+
}
|
|
238
|
+
window.addEventListener("message", this.listenMessage);
|
|
239
|
+
}
|
|
240
|
+
componentWillUnmount() {
|
|
241
|
+
window.removeEventListener("message", this.listenMessage);
|
|
242
|
+
}
|
|
243
|
+
componentDidUpdate(prevProps, preState) {
|
|
244
|
+
const {
|
|
245
|
+
resizeColumn
|
|
246
|
+
} = this.props;
|
|
247
|
+
if (!resizeColumn) {
|
|
248
|
+
if (this.props.columns !== prevProps.columns) {
|
|
249
|
+
this.setState({
|
|
250
|
+
columns: this.props.columns
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
} else {
|
|
254
|
+
if (preState.cols !== this.state.cols) {
|
|
255
|
+
this.resetColumn();
|
|
256
|
+
}
|
|
257
|
+
if (this.props.columns !== prevProps.columns) {
|
|
258
|
+
this.setState({
|
|
259
|
+
cols: this.props.columns,
|
|
260
|
+
columns: this.props.columns
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
if (prevProps.size !== this.props.size) {
|
|
264
|
+
this.setState({
|
|
265
|
+
tableSize: this.props.size
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
resetColumn() {
|
|
271
|
+
const {
|
|
272
|
+
cols
|
|
273
|
+
} = this.state;
|
|
274
|
+
const newCols = [];
|
|
275
|
+
let colss = cols || [];
|
|
276
|
+
colss.map((col, index) => {
|
|
277
|
+
let temp = _objectSpread(_objectSpread({}, col), {}, {
|
|
278
|
+
onHeaderCell: column => ({
|
|
279
|
+
width: column.width,
|
|
280
|
+
onResize: this.handleResize(index)
|
|
281
|
+
})
|
|
282
|
+
});
|
|
283
|
+
newCols.push(temp);
|
|
284
|
+
});
|
|
285
|
+
this.setState({
|
|
286
|
+
columns: newCols
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* 清除选中颜色
|
|
292
|
+
*/
|
|
293
|
+
clearSelectColor() {
|
|
294
|
+
this.setState({
|
|
295
|
+
activeIndex: -1
|
|
296
|
+
});
|
|
297
|
+
return this;
|
|
298
|
+
}
|
|
299
|
+
getPaginationByStore() {
|
|
300
|
+
return this.store.getPagination();
|
|
301
|
+
}
|
|
302
|
+
onChange(pagination, filters, sorter, extra) {
|
|
303
|
+
const {
|
|
304
|
+
autoOnChange = true,
|
|
305
|
+
autoSort,
|
|
306
|
+
autoPagination,
|
|
307
|
+
onChange,
|
|
308
|
+
store
|
|
309
|
+
} = this.props;
|
|
310
|
+
const {
|
|
311
|
+
filterParams
|
|
312
|
+
} = this.state;
|
|
313
|
+
const isMultiple = Array.isArray(sorter);
|
|
314
|
+
if (autoOnChange === false || !store) {
|
|
315
|
+
onChange && onChange(pagination, filters, sorter, extra);
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
const handlePagination = () => {
|
|
319
|
+
let params = {};
|
|
320
|
+
const paging = this.getPaginationByStore() || {};
|
|
321
|
+
if (!isEmptyObj(pagination)) {
|
|
322
|
+
const p = {
|
|
323
|
+
[paging.currentKey || "current"]: pagination.current,
|
|
324
|
+
[paging.pageSizeKey || "size"]: pagination.pageSize
|
|
325
|
+
};
|
|
326
|
+
Object.assign(params, p);
|
|
327
|
+
}
|
|
328
|
+
let ascParams = this.getSortParam(sorter, true);
|
|
329
|
+
if (isMultiple) {
|
|
330
|
+
this.setState({
|
|
331
|
+
sorter
|
|
332
|
+
});
|
|
333
|
+
} else if (!isMultiple && !isEmptyObj(sorter)) {
|
|
334
|
+
sorter.column && this.setState({
|
|
335
|
+
sorter: [sorter],
|
|
336
|
+
defaultSort: false
|
|
337
|
+
});
|
|
338
|
+
} else {
|
|
339
|
+
this.setState({
|
|
340
|
+
sorter: []
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
this.setState({
|
|
344
|
+
filters,
|
|
345
|
+
extra
|
|
346
|
+
});
|
|
347
|
+
params = _objectSpread(_objectSpread(_objectSpread({}, filterParams), params), ascParams);
|
|
348
|
+
autoSort && this.store.reload({
|
|
349
|
+
params
|
|
350
|
+
});
|
|
351
|
+
};
|
|
352
|
+
const onChangeFn = this.props.onChange;
|
|
353
|
+
autoPagination && handlePagination();
|
|
354
|
+
// 用户传了onChange保留用户自主处理表格变化的权力
|
|
355
|
+
if (onChangeFn) {
|
|
356
|
+
utils.callback(onChangeFn, this, [pagination, filters, sorter, extra]);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
getStore() {
|
|
360
|
+
return this.store;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* 获取数据模型对象
|
|
365
|
+
*/
|
|
366
|
+
getModel() {
|
|
367
|
+
return this.store.getModel();
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* 菜单搜索过滤显示
|
|
372
|
+
* @param {String} val
|
|
373
|
+
*/
|
|
374
|
+
handleSearch(val, fieldOption, searchColor) {
|
|
375
|
+
this.setState({
|
|
376
|
+
searchText: val,
|
|
377
|
+
fieldOption: fieldOption,
|
|
378
|
+
searchColor: searchColor
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
filterColumn(checkedValue) {
|
|
382
|
+
if (checkedValue.length == 0) {
|
|
383
|
+
_message.warning("至少显示一列!");
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
const filterColumns = this.props.columns.map(col => {
|
|
387
|
+
const newCol = _objectSpread({}, col);
|
|
388
|
+
if (checkedValue.includes(col.dataIndex)) {
|
|
389
|
+
newCol.initShow = true;
|
|
390
|
+
} else {
|
|
391
|
+
newCol.initShow = false;
|
|
392
|
+
}
|
|
393
|
+
return newCol;
|
|
394
|
+
});
|
|
395
|
+
const {
|
|
396
|
+
resizeColumn
|
|
397
|
+
} = this.props;
|
|
398
|
+
if (!resizeColumn) {
|
|
399
|
+
this.setState({
|
|
400
|
+
columns: filterColumns,
|
|
401
|
+
checkColumn: checkedValue,
|
|
402
|
+
defaultCheck: false
|
|
403
|
+
});
|
|
404
|
+
} else {
|
|
405
|
+
this.setState({
|
|
406
|
+
cols: filterColumns,
|
|
407
|
+
checkColumn: checkedValue,
|
|
408
|
+
defaultCheck: false
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
getSortParam(sorter) {
|
|
413
|
+
let sortState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
414
|
+
const isMultiple = Array.isArray(sorter);
|
|
415
|
+
const {
|
|
416
|
+
sortSearch = true
|
|
417
|
+
} = this.props;
|
|
418
|
+
if (!sortSearch) {
|
|
419
|
+
return {};
|
|
420
|
+
}
|
|
421
|
+
let sortInfo = {};
|
|
422
|
+
let orderItems = [];
|
|
423
|
+
if (!isEmptyObj(sorter) && !isMultiple && sorter.column) {
|
|
424
|
+
orderItems = [{
|
|
425
|
+
column: sorter.column.field || sorter.column.dataIndex,
|
|
426
|
+
asc: sorter.order == "ascend"
|
|
427
|
+
}];
|
|
428
|
+
if (sorter.column) sortInfo[sorter.column.dataIndex] = sorter.order;
|
|
429
|
+
} else if (isMultiple) {
|
|
430
|
+
sorter.forEach(v => {
|
|
431
|
+
sortInfo[v.column.dataIndex] = v.order;
|
|
432
|
+
let field = v.column.field || v.column.dataIndex;
|
|
433
|
+
orderItems.push({
|
|
434
|
+
column: field,
|
|
435
|
+
asc: v.order == "ascend"
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
if (sortState) {
|
|
440
|
+
this.setState({
|
|
441
|
+
sortInfo: sortInfo
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
return {
|
|
445
|
+
orderItems: JSON.stringify(orderItems)
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
isBeyond(e) {
|
|
449
|
+
const ev = window.event || e; // 浏览器兼容,最好写一下
|
|
450
|
+
const textRange = el => {
|
|
451
|
+
const textContent = el;
|
|
452
|
+
const targetW = textContent.getBoundingClientRect().width;
|
|
453
|
+
const range = document.createRange();
|
|
454
|
+
range.setStart(textContent, 0);
|
|
455
|
+
range.setEnd(textContent, textContent.childNodes.length);
|
|
456
|
+
const rangeWidth = range.getBoundingClientRect().width;
|
|
457
|
+
return rangeWidth > targetW;
|
|
458
|
+
};
|
|
459
|
+
return !textRange(ev.target); // target可以保证当前划过的dom节点一直保持是:el-tooltip__trigger
|
|
460
|
+
}
|
|
461
|
+
setSelectedRowKeys(data) {
|
|
462
|
+
this.setState({
|
|
463
|
+
selectedRowKeys: data
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
setSelectedRowDatas(data) {
|
|
467
|
+
this.setState({
|
|
468
|
+
selectedRowDatas: data
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
getColumns() {
|
|
472
|
+
const {
|
|
473
|
+
columns,
|
|
474
|
+
sortType,
|
|
475
|
+
sortInfo
|
|
476
|
+
} = this.state;
|
|
477
|
+
const {
|
|
478
|
+
sortFields = [],
|
|
479
|
+
size = "large"
|
|
480
|
+
} = this.props;
|
|
481
|
+
const defaultShowCols = columns.filter(cols => cols.initShow !== false);
|
|
482
|
+
const cols = defaultShowCols.map((col, index) => {
|
|
483
|
+
// 替换 getColumns 方法中原来的 ellipsis 处理部分
|
|
484
|
+
if (col.ellipsis && !col.render) {
|
|
485
|
+
col.ellipsis = {
|
|
486
|
+
showTitle: false
|
|
487
|
+
};
|
|
488
|
+
col.render = (text, record, index) => {
|
|
489
|
+
var _this$state$cols;
|
|
490
|
+
// 获取当前列的实时宽度
|
|
491
|
+
const currentCol = (_this$state$cols = this.state.cols) === null || _this$state$cols === void 0 ? void 0 : _this$state$cols.find(c => {
|
|
492
|
+
// 处理 dataIndex 可能是字符串或数组的情况
|
|
493
|
+
if (Array.isArray(c.dataIndex) && Array.isArray(col.dataIndex)) {
|
|
494
|
+
return JSON.stringify(c.dataIndex) === JSON.stringify(col.dataIndex);
|
|
495
|
+
}
|
|
496
|
+
return c.dataIndex === col.dataIndex;
|
|
497
|
+
});
|
|
498
|
+
const actualWidth = (currentCol === null || currentCol === void 0 ? void 0 : currentCol.width) || col.width;
|
|
499
|
+
let colWidth = "100%";
|
|
500
|
+
if (actualWidth) {
|
|
501
|
+
const size = this.state.tableSize || this.props.size || "default";
|
|
502
|
+
const colWidthObj = {
|
|
503
|
+
small: 16,
|
|
504
|
+
middle: 16,
|
|
505
|
+
default: 16,
|
|
506
|
+
large: 32
|
|
507
|
+
};
|
|
508
|
+
const paddingWidth = colWidthObj[size] || 16;
|
|
509
|
+
if (actualWidth > paddingWidth) {
|
|
510
|
+
colWidth = actualWidth - paddingWidth;
|
|
511
|
+
} else {
|
|
512
|
+
colWidth = actualWidth;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
516
|
+
style: {
|
|
517
|
+
display: "inline-table",
|
|
518
|
+
width: "100%"
|
|
519
|
+
}
|
|
520
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
521
|
+
ref: el => {
|
|
522
|
+
if (el) {
|
|
523
|
+
// 清除之前的title
|
|
524
|
+
el.removeAttribute("title");
|
|
525
|
+
|
|
526
|
+
// 检查文本是否溢出
|
|
527
|
+
if (el.scrollWidth > el.clientWidth) {
|
|
528
|
+
el.setAttribute("title", text);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
},
|
|
532
|
+
className: getLess(styles, "nsc-table-text"),
|
|
533
|
+
style: {
|
|
534
|
+
width: colWidth,
|
|
535
|
+
overflow: "hidden",
|
|
536
|
+
textOverflow: "ellipsis",
|
|
537
|
+
whiteSpace: "nowrap"
|
|
538
|
+
}
|
|
539
|
+
}, text));
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
if (sortFields.indexOf(col.dataIndex) > -1) {
|
|
543
|
+
if (sortType == "single") {
|
|
544
|
+
col.sorter = true;
|
|
545
|
+
col.sortOrder = sortInfo[col.dataIndex] ? sortInfo[col.dataIndex] : null;
|
|
546
|
+
} else if (sortType == "multiple") {
|
|
547
|
+
col.sorter = {
|
|
548
|
+
multiple: index
|
|
549
|
+
};
|
|
550
|
+
col.sortOrder = sortInfo[col.dataIndex] ? sortInfo[col.dataIndex] : null;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
return col;
|
|
554
|
+
});
|
|
555
|
+
cols.map((item, index) => {
|
|
556
|
+
if (!isEmptyObj(item.filterProps)) {
|
|
557
|
+
let obj = _objectSpread({}, item);
|
|
558
|
+
const {
|
|
559
|
+
type,
|
|
560
|
+
props,
|
|
561
|
+
searchKey
|
|
562
|
+
} = item.filterProps;
|
|
563
|
+
let Div = null;
|
|
564
|
+
let text = item.title;
|
|
565
|
+
Div = getNode(type, _objectSpread(_objectSpread({
|
|
566
|
+
placeholder: "\u641C\u7D22".concat(text)
|
|
567
|
+
}, props), {}, {
|
|
568
|
+
ref: this.tableSearchRef
|
|
569
|
+
}));
|
|
570
|
+
obj = _objectSpread({
|
|
571
|
+
filterDropdown: _ref3 => {
|
|
572
|
+
let {
|
|
573
|
+
setSelectedKeys,
|
|
574
|
+
selectedKeys,
|
|
575
|
+
confirm,
|
|
576
|
+
clearFilters
|
|
577
|
+
} = _ref3;
|
|
578
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
579
|
+
className: getLess(styles, "nsc-table-search")
|
|
580
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
581
|
+
className: getLess(styles, "nsc-table-search-space")
|
|
582
|
+
}, Div), /*#__PURE__*/React.createElement(_Space, null, /*#__PURE__*/React.createElement(_Button, {
|
|
583
|
+
type: "primary",
|
|
584
|
+
onClick: () => {
|
|
585
|
+
var _this$tableSearchRef$;
|
|
586
|
+
confirm();
|
|
587
|
+
const {
|
|
588
|
+
filterParams
|
|
589
|
+
} = this.state;
|
|
590
|
+
let newFilterParams = _objectSpread({}, filterParams);
|
|
591
|
+
let key = item.field || item.dataIndex;
|
|
592
|
+
newFilterParams[key] = (_this$tableSearchRef$ = this.tableSearchRef.current) === null || _this$tableSearchRef$ === void 0 ? void 0 : _this$tableSearchRef$.getValue();
|
|
593
|
+
this.setState({
|
|
594
|
+
filterParams: _objectSpread({}, newFilterParams)
|
|
595
|
+
});
|
|
596
|
+
const sortParam = this.getSortParam(this.state.sorter);
|
|
597
|
+
this.store.load({
|
|
598
|
+
params: _objectSpread(_objectSpread({}, newFilterParams), sortParam)
|
|
599
|
+
});
|
|
600
|
+
},
|
|
601
|
+
size: "small",
|
|
602
|
+
className: getLess(styles, "nsc-table-search-button")
|
|
603
|
+
}, "\u67E5\u8BE2")));
|
|
604
|
+
},
|
|
605
|
+
filterIcon: () => {
|
|
606
|
+
return /*#__PURE__*/React.createElement(SearchOutlined, null);
|
|
607
|
+
}
|
|
608
|
+
}, obj);
|
|
609
|
+
cols[index] = obj;
|
|
610
|
+
}
|
|
611
|
+
});
|
|
612
|
+
return cols;
|
|
613
|
+
}
|
|
614
|
+
renderToolBar() {
|
|
615
|
+
let {
|
|
616
|
+
tableSize,
|
|
617
|
+
columns,
|
|
618
|
+
sortType
|
|
619
|
+
} = this.state;
|
|
620
|
+
let {
|
|
621
|
+
filterColumn,
|
|
622
|
+
columns: colLists,
|
|
623
|
+
toolbar
|
|
624
|
+
} = this.props;
|
|
625
|
+
const {
|
|
626
|
+
tableTool,
|
|
627
|
+
storeRequestConfig = {}
|
|
628
|
+
} = config();
|
|
629
|
+
let tools = ["refresh", "size", "sort", "column"];
|
|
630
|
+
let toolsClick = {};
|
|
631
|
+
if (toolbar == true) {
|
|
632
|
+
tools = ["refresh", "size", "sort", "column"];
|
|
633
|
+
} else {
|
|
634
|
+
tools = toolbar.tools ? toolbar.tools : tableTool.tools ? tableTool.tools : tools;
|
|
635
|
+
toolsClick = toolbar.onToolClick ? toolbar.onToolClick : {};
|
|
636
|
+
}
|
|
637
|
+
const sizeItem = [{
|
|
638
|
+
title: "宽松",
|
|
639
|
+
key: "default"
|
|
640
|
+
}, {
|
|
641
|
+
title: "中等",
|
|
642
|
+
key: "middle"
|
|
643
|
+
}, {
|
|
644
|
+
title: "紧凑",
|
|
645
|
+
key: "small"
|
|
646
|
+
}];
|
|
647
|
+
const sortItem = [{
|
|
648
|
+
title: "单字段排序",
|
|
649
|
+
key: "single"
|
|
650
|
+
}, {
|
|
651
|
+
title: "多字段排序",
|
|
652
|
+
key: "multiple"
|
|
653
|
+
}];
|
|
654
|
+
const sortContent = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
655
|
+
className: getLess(styles, "nsc-table-cotent-title"),
|
|
656
|
+
style: {
|
|
657
|
+
cursor: this.state.defaultSort ? "not-allowed" : "pointer",
|
|
658
|
+
color: this.state.defaultSort && "rgba(0,0,0,.45)"
|
|
659
|
+
},
|
|
660
|
+
onClick: () => {
|
|
661
|
+
if (this.state.defaultSort) {
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
664
|
+
this.setState({
|
|
665
|
+
sorter: [],
|
|
666
|
+
sortInfo: {},
|
|
667
|
+
defaultSort: true
|
|
668
|
+
});
|
|
669
|
+
const params = _objectSpread({}, this.state.filterParams);
|
|
670
|
+
this.store.reload({
|
|
671
|
+
params
|
|
672
|
+
});
|
|
673
|
+
}
|
|
674
|
+
}, "\u6062\u590D\u9ED8\u8BA4\u6392\u5E8F"), sortItem.map((item, index) => {
|
|
675
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
676
|
+
key: item.key,
|
|
677
|
+
onClick: () => {
|
|
678
|
+
this.setState({
|
|
679
|
+
sorter: [],
|
|
680
|
+
sortInfo: {},
|
|
681
|
+
sortType: item.key,
|
|
682
|
+
defaultSort: false
|
|
683
|
+
});
|
|
684
|
+
const params = _objectSpread({}, this.state.filterParams);
|
|
685
|
+
this.store.reload({
|
|
686
|
+
params
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
}, sortType == item.key ? /*#__PURE__*/React.createElement("a", null, /*#__PURE__*/React.createElement("div", {
|
|
690
|
+
className: getLess(styles, "nsc-table-content-tiem")
|
|
691
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
692
|
+
style: {
|
|
693
|
+
width: 20
|
|
694
|
+
}
|
|
695
|
+
}, sortType == item.key && /*#__PURE__*/React.createElement(CheckOutlined, null)), /*#__PURE__*/React.createElement("div", null, " ", item.title))) : /*#__PURE__*/React.createElement("div", {
|
|
696
|
+
className: getLess(styles, "nsc-table-content-tiem")
|
|
697
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
698
|
+
style: {
|
|
699
|
+
width: 20
|
|
700
|
+
}
|
|
701
|
+
}), /*#__PURE__*/React.createElement("div", null, " ", item.title)));
|
|
702
|
+
}), this.state.sorter.length > 0 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
703
|
+
className: getLess(styles, "nsc-table-cotent-title"),
|
|
704
|
+
style: {
|
|
705
|
+
color: "rgba(0,0,0,.45)"
|
|
706
|
+
}
|
|
707
|
+
}, "\u5F53\u524D\u6392\u5E8F"), this.state.sorter.map((item, index) => {
|
|
708
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
709
|
+
className: getLess(styles, "nsc-table-content-tiem"),
|
|
710
|
+
key: index
|
|
711
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
712
|
+
style: {
|
|
713
|
+
width: 20
|
|
714
|
+
}
|
|
715
|
+
}, item.order == "ascend" ? /*#__PURE__*/React.createElement(SortAscendingOutlined, null) : /*#__PURE__*/React.createElement(SortDescendingOutlined, null)), /*#__PURE__*/React.createElement("div", null, " ", item.column.title));
|
|
716
|
+
})));
|
|
717
|
+
const sizeContent = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
718
|
+
className: getLess(styles, "nsc-table-cotent-title")
|
|
719
|
+
}, "\u8868\u683C\u5BC6\u5EA6"), sizeItem.map((item, index) => {
|
|
720
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
721
|
+
key: item.key,
|
|
722
|
+
onClick: () => {
|
|
723
|
+
this.setState({
|
|
724
|
+
tableSize: item.key
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
}, tableSize == item.key ? /*#__PURE__*/React.createElement("a", null, /*#__PURE__*/React.createElement("div", {
|
|
728
|
+
className: getLess(styles, "nsc-table-content-tiem")
|
|
729
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
730
|
+
style: {
|
|
731
|
+
width: 20
|
|
732
|
+
}
|
|
733
|
+
}, tableSize == item.key && /*#__PURE__*/React.createElement(CheckOutlined, null)), /*#__PURE__*/React.createElement("div", null, " ", item.title))) : /*#__PURE__*/React.createElement("div", {
|
|
734
|
+
className: getLess(styles, "nsc-table-content-tiem")
|
|
735
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
736
|
+
style: {
|
|
737
|
+
width: 20
|
|
738
|
+
}
|
|
739
|
+
}), /*#__PURE__*/React.createElement("div", null, " ", item.title)));
|
|
740
|
+
}));
|
|
741
|
+
const defaultShowCols = columns.filter(cols => cols.initShow !== false);
|
|
742
|
+
const content = /*#__PURE__*/React.createElement(_Checkbox.Group, {
|
|
743
|
+
onChange: this.filterColumn.bind(this),
|
|
744
|
+
options: colLists.map(col => {
|
|
745
|
+
if (!col.dataIndex) {
|
|
746
|
+
col.dataIndex = col.title;
|
|
747
|
+
}
|
|
748
|
+
return {
|
|
749
|
+
label: col.title,
|
|
750
|
+
value: col.dataIndex,
|
|
751
|
+
disabled: col.filterColumn === false
|
|
752
|
+
};
|
|
753
|
+
})
|
|
754
|
+
// defaultValue={defaultShowCols.map((col) => col.dataIndex)}
|
|
755
|
+
,
|
|
756
|
+
value: this.state.defaultCheck ? defaultShowCols.map(col => col.dataIndex) : this.state.checkColumn
|
|
757
|
+
});
|
|
758
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
759
|
+
className: getLess(styles, "nsc-table-tool-bar")
|
|
760
|
+
}, tools.indexOf("column") > -1 && /*#__PURE__*/React.createElement("div", {
|
|
761
|
+
style: {
|
|
762
|
+
fontSize: 14
|
|
763
|
+
}
|
|
764
|
+
}, /*#__PURE__*/React.createElement(_Popover, {
|
|
765
|
+
title: "\u9009\u62E9\u663E\u793A\u7684\u5217",
|
|
766
|
+
content: content,
|
|
767
|
+
placement: "bottomRight",
|
|
768
|
+
trigger: "click",
|
|
769
|
+
overlayStyle: {
|
|
770
|
+
minWidth: 410,
|
|
771
|
+
maxWidth: 450
|
|
772
|
+
}
|
|
773
|
+
}, /*#__PURE__*/React.createElement(AppstoreOutlined, {
|
|
774
|
+
className: getLess(styles, "nsc-table-th-app-store-icon")
|
|
775
|
+
}))), tools.indexOf("sort") > -1 && /*#__PURE__*/React.createElement("div", {
|
|
776
|
+
style: {
|
|
777
|
+
marginRight: 8,
|
|
778
|
+
fontSize: 14
|
|
779
|
+
}
|
|
780
|
+
}, /*#__PURE__*/React.createElement(_Popover, {
|
|
781
|
+
placement: "bottom",
|
|
782
|
+
content: sortContent,
|
|
783
|
+
trigger: "click"
|
|
784
|
+
}, /*#__PURE__*/React.createElement(SortAscendingOutlined, null))), tools.indexOf("size") > -1 && /*#__PURE__*/React.createElement("div", {
|
|
785
|
+
style: {
|
|
786
|
+
marginRight: 8,
|
|
787
|
+
fontSize: 14
|
|
788
|
+
}
|
|
789
|
+
}, /*#__PURE__*/React.createElement(_Popover, {
|
|
790
|
+
placement: "bottom",
|
|
791
|
+
content: sizeContent,
|
|
792
|
+
trigger: "click"
|
|
793
|
+
}, /*#__PURE__*/React.createElement(ColumnHeightOutlined, null))), tools.indexOf("refresh") > -1 && /*#__PURE__*/React.createElement("div", {
|
|
794
|
+
style: {
|
|
795
|
+
marginRight: 8,
|
|
796
|
+
fontSize: 14,
|
|
797
|
+
cursor: "pointer"
|
|
798
|
+
},
|
|
799
|
+
onClick: () => {
|
|
800
|
+
const params = _objectSpread({}, this.state.filterParams);
|
|
801
|
+
if (toolsClick.onRefresh) {
|
|
802
|
+
toolsClick.onRefresh();
|
|
803
|
+
} else {
|
|
804
|
+
this.store.load({
|
|
805
|
+
params
|
|
806
|
+
});
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
}, /*#__PURE__*/React.createElement(RedoOutlined, null)));
|
|
810
|
+
}
|
|
811
|
+
getSelectedRowKeys() {
|
|
812
|
+
return this.state.selectedRowKeys;
|
|
813
|
+
}
|
|
814
|
+
getSelectedRowDatas() {
|
|
815
|
+
return this.state.selectedRowDatas;
|
|
816
|
+
}
|
|
817
|
+
resetSelectedRowKeys() {
|
|
818
|
+
this.setState({
|
|
819
|
+
selectedRowKeys: [],
|
|
820
|
+
selectedRowDatas: []
|
|
821
|
+
});
|
|
822
|
+
}
|
|
823
|
+
rowSelectionOnSelect(record, selected) {
|
|
824
|
+
const {
|
|
825
|
+
selectedRowKeys,
|
|
826
|
+
selectedRowDatas
|
|
827
|
+
} = this.state;
|
|
828
|
+
let {
|
|
829
|
+
rowKey = "id"
|
|
830
|
+
} = this.props;
|
|
831
|
+
let newSelectedRowKeys = [...selectedRowKeys];
|
|
832
|
+
let newSelectedRowDatas = [...selectedRowDatas];
|
|
833
|
+
if (selected) {
|
|
834
|
+
newSelectedRowKeys = [...newSelectedRowKeys, record[rowKey]];
|
|
835
|
+
newSelectedRowDatas = [...newSelectedRowDatas, record];
|
|
836
|
+
} else {
|
|
837
|
+
selectedRowKeys.map((item, index) => {
|
|
838
|
+
if (item === record[rowKey]) {
|
|
839
|
+
newSelectedRowKeys.splice(index, 1);
|
|
840
|
+
}
|
|
841
|
+
});
|
|
842
|
+
selectedRowDatas.map((item, index) => {
|
|
843
|
+
if (item[rowKey] === record[rowKey]) {
|
|
844
|
+
newSelectedRowDatas.splice(index, 1);
|
|
845
|
+
}
|
|
846
|
+
});
|
|
847
|
+
}
|
|
848
|
+
this.setState({
|
|
849
|
+
selectedRowKeys: newSelectedRowKeys,
|
|
850
|
+
selectedRowDatas: newSelectedRowDatas
|
|
851
|
+
});
|
|
852
|
+
}
|
|
853
|
+
rowSelectionOnSelectAll(selected, selectedRows, changeRows) {
|
|
854
|
+
const {
|
|
855
|
+
selectedRowKeys,
|
|
856
|
+
selectedRowDatas
|
|
857
|
+
} = this.state;
|
|
858
|
+
const {
|
|
859
|
+
rowKey = "id"
|
|
860
|
+
} = this.props;
|
|
861
|
+
let newids = [];
|
|
862
|
+
let newdatas = [];
|
|
863
|
+
if (changeRows.length > 0) {
|
|
864
|
+
let changeIds = changeRows.map(item => item[rowKey]);
|
|
865
|
+
if (selected) {
|
|
866
|
+
newids = [...selectedRowKeys, ...changeIds];
|
|
867
|
+
newdatas = [...selectedRowDatas, ...changeRows];
|
|
868
|
+
} else {
|
|
869
|
+
selectedRowKeys.map((item, index) => {
|
|
870
|
+
if (changeIds.indexOf(item) == -1) {
|
|
871
|
+
newids.push(item);
|
|
872
|
+
}
|
|
873
|
+
});
|
|
874
|
+
selectedRowDatas.map((item, index) => {
|
|
875
|
+
if (changeIds.indexOf(item[rowKey]) == -1) {
|
|
876
|
+
newdatas.push(item);
|
|
877
|
+
}
|
|
878
|
+
});
|
|
879
|
+
}
|
|
880
|
+
} else {
|
|
881
|
+
newids = [...selectedRowKeys];
|
|
882
|
+
newdatas = [...selectedRowDatas];
|
|
883
|
+
}
|
|
884
|
+
this.setState({
|
|
885
|
+
selectedRowKeys: [...newids],
|
|
886
|
+
selectedRowDatas: [...newdatas]
|
|
887
|
+
});
|
|
888
|
+
}
|
|
889
|
+
render() {
|
|
890
|
+
let _this = this,
|
|
891
|
+
{
|
|
892
|
+
loading,
|
|
893
|
+
dataSource,
|
|
894
|
+
pagination = {},
|
|
895
|
+
searchText,
|
|
896
|
+
fieldOption,
|
|
897
|
+
searchColor,
|
|
898
|
+
tableSize
|
|
899
|
+
} = this.state,
|
|
900
|
+
props = utils.omit(this.props, ["store", "onChange", "columns", "resetColumn", "toolbar", "sortFields", "filterColumn", "sortSearch", "showRowSelection", "pageType"], {
|
|
901
|
+
rowKey: "id",
|
|
902
|
+
clickChangeColor: false
|
|
903
|
+
});
|
|
904
|
+
if (props.pagination !== false) {
|
|
905
|
+
props.pagination = _objectSpread(_objectSpread({
|
|
906
|
+
position: ["bottomRight"],
|
|
907
|
+
showSizeChanger: true,
|
|
908
|
+
showQuickJumper: true
|
|
909
|
+
}, pagination), props.pagination);
|
|
910
|
+
if (props.showTotal == true) {
|
|
911
|
+
props.pagination.showTotal = function (total, _ref4) {
|
|
912
|
+
let [from, to] = _ref4;
|
|
913
|
+
// return "显示 " + from + " - " + to + "条,共 " + total + " 条";
|
|
914
|
+
return "共 " + total + " 条";
|
|
915
|
+
};
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
props.onChange = function (pagination, filters, sorter, extra) {
|
|
919
|
+
_this.onChange(_this.state.pagination, filters, sorter, extra);
|
|
920
|
+
};
|
|
921
|
+
if (props.clickChangeColor) {
|
|
922
|
+
const onRowFn = props.onRow;
|
|
923
|
+
props.onRow = function (record, index) {
|
|
924
|
+
var custom = onRowFn ? onRowFn(record, index) : {};
|
|
925
|
+
const onClickFn = custom.onClick;
|
|
926
|
+
custom.onClick = event => {
|
|
927
|
+
_this.setState({
|
|
928
|
+
activeIndex: index //获取点击行的索引
|
|
929
|
+
});
|
|
930
|
+
utils.callback(onClickFn, _this, [event]);
|
|
931
|
+
};
|
|
932
|
+
return custom;
|
|
933
|
+
};
|
|
934
|
+
props.rowClassName = function (record, index) {
|
|
935
|
+
return index === _this.state.activeIndex ? "nsc-table-clickRowStyle" : "";
|
|
936
|
+
};
|
|
937
|
+
}
|
|
938
|
+
let newDataSource = [];
|
|
939
|
+
if (searchText) {
|
|
940
|
+
const data = treeUtils.getSearchMenuDatas(this, searchText, fieldOption, searchColor);
|
|
941
|
+
newDataSource = data.treeDatas;
|
|
942
|
+
props.expandedRowKeys = data.openKeys;
|
|
943
|
+
} else {
|
|
944
|
+
newDataSource = dataSource;
|
|
945
|
+
}
|
|
946
|
+
props.store = props.store || {};
|
|
947
|
+
props.store.autoLoad = props.store.autoLoad === false ? false : true;
|
|
948
|
+
const {
|
|
949
|
+
dragable
|
|
950
|
+
} = _this.props;
|
|
951
|
+
const dragableProps = dragable === true ? {
|
|
952
|
+
components: BodyRowComponent,
|
|
953
|
+
onRow: (record, index) => ({
|
|
954
|
+
index,
|
|
955
|
+
record,
|
|
956
|
+
moveRow: this.moveRow
|
|
957
|
+
})
|
|
958
|
+
} : {};
|
|
959
|
+
let {
|
|
960
|
+
resizeColumn
|
|
961
|
+
} = this.props;
|
|
962
|
+
const resizeProps = resizeColumn === true ? {
|
|
963
|
+
components: this.components
|
|
964
|
+
} : null;
|
|
965
|
+
const {
|
|
966
|
+
tableTool
|
|
967
|
+
} = config();
|
|
968
|
+
let toolFlag = false;
|
|
969
|
+
// console.log('tableTool',tableTool)
|
|
970
|
+
|
|
971
|
+
if (tableTool.show === true) {
|
|
972
|
+
toolFlag = true;
|
|
973
|
+
}
|
|
974
|
+
if (this.props.toolbar && this.props.toolbar.show === true) {
|
|
975
|
+
toolFlag = true;
|
|
976
|
+
}
|
|
977
|
+
if (this.props.showRowSelection) {
|
|
978
|
+
const {
|
|
979
|
+
rowSelection = {}
|
|
980
|
+
} = this.props;
|
|
981
|
+
props = _objectSpread(_objectSpread({}, props), {}, {
|
|
982
|
+
rowSelection: _objectSpread({
|
|
983
|
+
selectedRowKeys: this.state.selectedRowKeys,
|
|
984
|
+
onSelect: this.rowSelectionOnSelect.bind(this),
|
|
985
|
+
onSelectAll: this.rowSelectionOnSelectAll.bind(this),
|
|
986
|
+
columnWidth: 40
|
|
987
|
+
}, rowSelection)
|
|
988
|
+
});
|
|
989
|
+
}
|
|
990
|
+
const {
|
|
991
|
+
tableProps: configTableProps
|
|
992
|
+
} = config();
|
|
993
|
+
const DefaultTable = /*#__PURE__*/React.createElement("div", {
|
|
994
|
+
className: getLess(styles, "nsc-table")
|
|
995
|
+
}, toolFlag && this.renderToolBar(), /*#__PURE__*/React.createElement(_Table, _extends({
|
|
996
|
+
childrenColumnName: "childNodes",
|
|
997
|
+
sheitem: true,
|
|
998
|
+
dataSource: newDataSource,
|
|
999
|
+
columns: this.getColumns(),
|
|
1000
|
+
loading: loading,
|
|
1001
|
+
className: cls(getLess(styles, "nsc-table-content"), props.className),
|
|
1002
|
+
locale: {
|
|
1003
|
+
emptyText: /*#__PURE__*/React.createElement(NoData, {
|
|
1004
|
+
className: getLess(styles, "nsc-table-nodata")
|
|
1005
|
+
})
|
|
1006
|
+
},
|
|
1007
|
+
scroll: {
|
|
1008
|
+
x: "max-content"
|
|
1009
|
+
}
|
|
1010
|
+
}, configTableProps, resizeProps, props, dragableProps, {
|
|
1011
|
+
size: tableSize,
|
|
1012
|
+
pagination: false
|
|
1013
|
+
// style={{ height: 600 }}
|
|
1014
|
+
})), props.pagination !== false && /*#__PURE__*/React.createElement("div", {
|
|
1015
|
+
className: getLess(styles, "nsc-table-pagination")
|
|
1016
|
+
}, /*#__PURE__*/React.createElement(_Pagination, _extends({}, props.pagination, {
|
|
1017
|
+
onChange: (page, pageSize) => {
|
|
1018
|
+
const extra = this.state.extra;
|
|
1019
|
+
extra.action = "paginate";
|
|
1020
|
+
this.setState(_ref5 => {
|
|
1021
|
+
let {
|
|
1022
|
+
pagination = {}
|
|
1023
|
+
} = _ref5;
|
|
1024
|
+
return {
|
|
1025
|
+
pagination: _objectSpread(_objectSpread({}, pagination), {}, {
|
|
1026
|
+
current: page,
|
|
1027
|
+
pageSize
|
|
1028
|
+
})
|
|
1029
|
+
};
|
|
1030
|
+
});
|
|
1031
|
+
this.onChange({
|
|
1032
|
+
current: page,
|
|
1033
|
+
pageSize
|
|
1034
|
+
}, this.state.filter, this.state.sorter, extra);
|
|
1035
|
+
}
|
|
1036
|
+
}))));
|
|
1037
|
+
return dragable === true ? /*#__PURE__*/React.createElement(DndProvider, {
|
|
1038
|
+
backend: HTML5Backend
|
|
1039
|
+
}, DefaultTable) : DefaultTable;
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
_defineProperty(NSCTable, "defaultProps", {
|
|
1043
|
+
dragable: false,
|
|
1044
|
+
showTotal: true,
|
|
1045
|
+
filterColumn: true,
|
|
1046
|
+
dragUrl: "",
|
|
1047
|
+
autoPagination: true,
|
|
1048
|
+
autoSort: true,
|
|
1049
|
+
autoOnChange: true,
|
|
1050
|
+
resizeColumn: true,
|
|
1051
|
+
toolbar: {
|
|
1052
|
+
show: false,
|
|
1053
|
+
onToolClick: {},
|
|
1054
|
+
tools: []
|
|
1055
|
+
}
|
|
1056
|
+
});
|
|
1057
|
+
export default withZhLocale(NSCTable);
|
|
1058
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBcHBzdG9yZU91dGxpbmVkIiwiQ2hlY2tPdXRsaW5lZCIsIkNvbHVtbkhlaWdodE91dGxpbmVkIiwiU2VhcmNoT3V0bGluZWQiLCJTb3J0QXNjZW5kaW5nT3V0bGluZWQiLCJTb3J0RGVzY2VuZGluZ091dGxpbmVkIiwiUmVkb091dGxpbmVkIiwiaXNFbXB0eU9iaiIsIlN0b3JlIiwiUGFnZVN0b3JlIiwidXRpbHMiLCJSZWFjdCIsIkRuZFByb3ZpZGVyIiwiQm9keVJvdyIsIkRuZENvbnRleHRUeXBlIiwiSUJvZHlSb3dQcm9wcyIsInRyZWVVdGlscyIsIkJvZHlSb3dDb21wb25lbnQiLCJIVE1MNUJhY2tlbmQiLCJ3aXRoWmhMb2NhbGUiLCJSZXNpemFibGUiLCJnZXRMZXNzIiwiZ2V0Tm9kZSIsIk5vRGF0YSIsImdldFN0b3JhZ2UiLCJjb25maWciLCJjbHMiLCJzdHlsZXMiLCJSZXNpemVhYmxlVGl0bGUiLCJwcm9wcyIsIm9uUmVzaXplIiwid2lkdGgiLCJyZXN0UHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJjcmVhdGVFbGVtZW50IiwiaGVpZ2h0IiwiZHJhZ2dhYmxlT3B0cyIsImVuYWJsZVVzZXJTZWxlY3RIYWNrIiwiTlNDVGFibGUiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsIl9hdXRvVHlwZSIsIl9kZWZpbmVQcm9wZXJ0eSIsImNyZWF0ZVJlZiIsIm9uQmVmb3JlTG9hZCIsImxvYWQiLCJoZWFkZXIiLCJjZWxsIiwiaW5kZXgiLCJlIiwiX3JlZiIsInNpemUiLCJjb2xzIiwic3RhdGUiLCJuZXh0Q29sdW1ucyIsIl9vYmplY3RTcHJlYWQiLCJzZXRTdGF0ZSIsImdldENvbHVtbnMiLCJldiIsImRhdGEiLCJKU09OIiwicGFyc2UiLCJfdGhpcyIsImV2ZW50VHlwZSIsInBheWxvYWQiLCJ0YWJsZVNpemUiLCJkcmFnSW5kZXgiLCJob3ZlckluZGV4IiwiZHJhZyIsInRhcmdldCIsImRyYWdOb2RlIiwicmVjb3JkIiwidGFyZ2V0Tm9kZSIsIm1vdmVBcnJheSIsImlkcyIsInBhcmVudE5vZGUiLCJnZXRDaGlsZE5vZGVJZHMiLCJwYXJhbXMiLCJpZCIsInBhcmVudElkIiwiYXR0cmlidXRlIiwibW92ZVJvdyIsInN0b3JlIiwicmVsb2FkIiwibW9kYWwiLCJ0eXBlIiwic3RvcmVQcmVmaXgiLCJhdXRvVHlwZSIsImNvbnRlbnQiLCJkYXRhU291cmNlIiwiY29sdW1ucyIsImxvYWRpbmciLCJwYWdpbmF0aW9uIiwiYWN0aXZlSW5kZXgiLCJzZWFyY2hUZXh0IiwiZmllbGRPcHRpb24iLCJzZWFyY2hDb2xvciIsInNvcnRzIiwiZmlsdGVyUGFyYW1zIiwic29ydFR5cGUiLCJzb3J0ZXIiLCJzb3J0SW5mbyIsImRlZmF1bHRTb3J0IiwiY2hlY2tDb2x1bW4iLCJkZWZhdWx0Q2hlY2siLCJzZWxlY3RlZFJvd0tleXMiLCJzZWxlY3RlZFJvd0RhdGFzIiwiZmlsdGVyIiwiZXh0cmEiLCJfcmVmMiIsImxpc3RlbmVycyIsImxpc3RlbmVyc1Byb3BzIiwicmVzdFN0b3JlIiwiX2V4Y2x1ZGVkMiIsInN0b3JlUHJvcHMiLCJtb2RlbCIsImNvbXBvbmVudCIsIm9wdGlvbnMiLCJjYWxsYmFjayIsImRhdGFDaGFuZ2VkIiwibW9kZWxEYXRhIiwicGFnaW5nIiwiZ2V0UGFnaW5hdGlvbiIsIm9uRXJyb3JMb2FkIiwiZXJyIiwicmVzcG9uc2UiLCJhdXRvTG9hZCIsIk9iamVjdCIsImFzc2lnbiIsImN1cnJlbnQiLCJjb21wb25lbnREaWRNb3VudCIsInJlc2l6ZUNvbHVtbiIsInNldERhdGEiLCJ3aW5kb3ciLCJhZGRFdmVudExpc3RlbmVyIiwibGlzdGVuTWVzc2FnZSIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsInByZVN0YXRlIiwicmVzZXRDb2x1bW4iLCJuZXdDb2xzIiwiY29sc3MiLCJtYXAiLCJjb2wiLCJ0ZW1wIiwib25IZWFkZXJDZWxsIiwiY29sdW1uIiwiaGFuZGxlUmVzaXplIiwicHVzaCIsImNsZWFyU2VsZWN0Q29sb3IiLCJnZXRQYWdpbmF0aW9uQnlTdG9yZSIsIm9uQ2hhbmdlIiwiZmlsdGVycyIsImF1dG9PbkNoYW5nZSIsImF1dG9Tb3J0IiwiYXV0b1BhZ2luYXRpb24iLCJpc011bHRpcGxlIiwiQXJyYXkiLCJpc0FycmF5IiwiaGFuZGxlUGFnaW5hdGlvbiIsInAiLCJjdXJyZW50S2V5IiwicGFnZVNpemVLZXkiLCJwYWdlU2l6ZSIsImFzY1BhcmFtcyIsImdldFNvcnRQYXJhbSIsIm9uQ2hhbmdlRm4iLCJnZXRTdG9yZSIsImdldE1vZGVsIiwiaGFuZGxlU2VhcmNoIiwidmFsIiwiZmlsdGVyQ29sdW1uIiwiY2hlY2tlZFZhbHVlIiwibGVuZ3RoIiwiX21lc3NhZ2UiLCJ3YXJuaW5nIiwiZmlsdGVyQ29sdW1ucyIsIm5ld0NvbCIsImluY2x1ZGVzIiwiZGF0YUluZGV4IiwiaW5pdFNob3ciLCJzb3J0U3RhdGUiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJzb3J0U2VhcmNoIiwib3JkZXJJdGVtcyIsImZpZWxkIiwiYXNjIiwib3JkZXIiLCJmb3JFYWNoIiwidiIsInN0cmluZ2lmeSIsImlzQmV5b25kIiwiZXZlbnQiLCJ0ZXh0UmFuZ2UiLCJlbCIsInRleHRDb250ZW50IiwidGFyZ2V0VyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInJhbmdlIiwiZG9jdW1lbnQiLCJjcmVhdGVSYW5nZSIsInNldFN0YXJ0Iiwic2V0RW5kIiwiY2hpbGROb2RlcyIsInJhbmdlV2lkdGgiLCJzZXRTZWxlY3RlZFJvd0tleXMiLCJzZXRTZWxlY3RlZFJvd0RhdGFzIiwic29ydEZpZWxkcyIsImRlZmF1bHRTaG93Q29scyIsImVsbGlwc2lzIiwicmVuZGVyIiwic2hvd1RpdGxlIiwidGV4dCIsIl90aGlzJHN0YXRlJGNvbHMiLCJjdXJyZW50Q29sIiwiZmluZCIsImMiLCJhY3R1YWxXaWR0aCIsImNvbFdpZHRoIiwiY29sV2lkdGhPYmoiLCJzbWFsbCIsIm1pZGRsZSIsImRlZmF1bHQiLCJsYXJnZSIsInBhZGRpbmdXaWR0aCIsInN0eWxlIiwiZGlzcGxheSIsInJlZiIsInJlbW92ZUF0dHJpYnV0ZSIsInNjcm9sbFdpZHRoIiwiY2xpZW50V2lkdGgiLCJzZXRBdHRyaWJ1dGUiLCJjbGFzc05hbWUiLCJvdmVyZmxvdyIsInRleHRPdmVyZmxvdyIsIndoaXRlU3BhY2UiLCJpbmRleE9mIiwic29ydE9yZGVyIiwibXVsdGlwbGUiLCJpdGVtIiwiZmlsdGVyUHJvcHMiLCJvYmoiLCJzZWFyY2hLZXkiLCJEaXYiLCJ0aXRsZSIsInBsYWNlaG9sZGVyIiwiY29uY2F0IiwidGFibGVTZWFyY2hSZWYiLCJmaWx0ZXJEcm9wZG93biIsIl9yZWYzIiwic2V0U2VsZWN0ZWRLZXlzIiwic2VsZWN0ZWRLZXlzIiwiY29uZmlybSIsImNsZWFyRmlsdGVycyIsIl9TcGFjZSIsIl9CdXR0b24iLCJvbkNsaWNrIiwiX3RoaXMkdGFibGVTZWFyY2hSZWYkIiwibmV3RmlsdGVyUGFyYW1zIiwia2V5IiwiZ2V0VmFsdWUiLCJzb3J0UGFyYW0iLCJmaWx0ZXJJY29uIiwicmVuZGVyVG9vbEJhciIsImNvbExpc3RzIiwidG9vbGJhciIsInRhYmxlVG9vbCIsInN0b3JlUmVxdWVzdENvbmZpZyIsInRvb2xzIiwidG9vbHNDbGljayIsIm9uVG9vbENsaWNrIiwic2l6ZUl0ZW0iLCJzb3J0SXRlbSIsInNvcnRDb250ZW50IiwiRnJhZ21lbnQiLCJjdXJzb3IiLCJjb2xvciIsInNpemVDb250ZW50IiwiX0NoZWNrYm94IiwiR3JvdXAiLCJiaW5kIiwibGFiZWwiLCJ2YWx1ZSIsImRpc2FibGVkIiwiZm9udFNpemUiLCJfUG9wb3ZlciIsInBsYWNlbWVudCIsInRyaWdnZXIiLCJvdmVybGF5U3R5bGUiLCJtaW5XaWR0aCIsIm1heFdpZHRoIiwibWFyZ2luUmlnaHQiLCJvblJlZnJlc2giLCJnZXRTZWxlY3RlZFJvd0tleXMiLCJnZXRTZWxlY3RlZFJvd0RhdGFzIiwicmVzZXRTZWxlY3RlZFJvd0tleXMiLCJyb3dTZWxlY3Rpb25PblNlbGVjdCIsInNlbGVjdGVkIiwicm93S2V5IiwibmV3U2VsZWN0ZWRSb3dLZXlzIiwibmV3U2VsZWN0ZWRSb3dEYXRhcyIsInNwbGljZSIsInJvd1NlbGVjdGlvbk9uU2VsZWN0QWxsIiwic2VsZWN0ZWRSb3dzIiwiY2hhbmdlUm93cyIsIm5ld2lkcyIsIm5ld2RhdGFzIiwiY2hhbmdlSWRzIiwib21pdCIsImNsaWNrQ2hhbmdlQ29sb3IiLCJwb3NpdGlvbiIsInNob3dTaXplQ2hhbmdlciIsInNob3dRdWlja0p1bXBlciIsInNob3dUb3RhbCIsInRvdGFsIiwiX3JlZjQiLCJmcm9tIiwidG8iLCJvblJvd0ZuIiwib25Sb3ciLCJjdXN0b20iLCJvbkNsaWNrRm4iLCJyb3dDbGFzc05hbWUiLCJuZXdEYXRhU291cmNlIiwiZ2V0U2VhcmNoTWVudURhdGFzIiwidHJlZURhdGFzIiwiZXhwYW5kZWRSb3dLZXlzIiwib3BlbktleXMiLCJkcmFnYWJsZSIsImRyYWdhYmxlUHJvcHMiLCJjb21wb25lbnRzIiwicmVzaXplUHJvcHMiLCJ0b29sRmxhZyIsInNob3ciLCJzaG93Um93U2VsZWN0aW9uIiwicm93U2VsZWN0aW9uIiwib25TZWxlY3QiLCJvblNlbGVjdEFsbCIsImNvbHVtbldpZHRoIiwidGFibGVQcm9wcyIsImNvbmZpZ1RhYmxlUHJvcHMiLCJEZWZhdWx0VGFibGUiLCJfVGFibGUiLCJfZXh0ZW5kcyIsImNoaWxkcmVuQ29sdW1uTmFtZSIsInNoZWl0ZW0iLCJsb2NhbGUiLCJlbXB0eVRleHQiLCJzY3JvbGwiLCJ4IiwiX1BhZ2luYXRpb24iLCJwYWdlIiwiYWN0aW9uIiwiX3JlZjUiLCJiYWNrZW5kIiwiZHJhZ1VybCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2Jhc2UvdGFibGUvaW5kZXhfb2xkLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBARGVzY3JpcHR0aW9uOlxyXG4gKiBAdmVyc2lvbjpcclxuICogQEF1dGhvcjogcnh6aHVcclxuICogQERhdGU6IDIwMjEtMDMtMjMgMDg6NDY6MjBcclxuICogQExhc3RFZGl0b3JzOiByeHpodVxyXG4gKiBATGFzdEVkaXRUaW1lOiAyMDIxLTAzLTIzIDEwOjMwOjQyXHJcbiAqL1xyXG5pbXBvcnQge1xyXG4gIEFwcHN0b3JlT3V0bGluZWQsXHJcbiAgQ2hlY2tPdXRsaW5lZCxcclxuICBDb2x1bW5IZWlnaHRPdXRsaW5lZCxcclxuICBTZWFyY2hPdXRsaW5lZCxcclxuICBTb3J0QXNjZW5kaW5nT3V0bGluZWQsXHJcbiAgU29ydERlc2NlbmRpbmdPdXRsaW5lZCxcclxuICBSZWRvT3V0bGluZWQsXHJcbn0gZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zXCI7XHJcbmltcG9ydCB7IGlzRW1wdHlPYmogfSBmcm9tIFwiQGJqLW5zYy9mdW5jdGlvbnNcIjtcclxuaW1wb3J0IFN0b3JlLCB7IFBhZ2VTdG9yZSwgU3RvcmVQcm9wcyB9IGZyb20gXCJAYmotbnNjL21zblwiO1xyXG5pbXBvcnQgeyB1dGlscyB9IGZyb20gXCJAYmotbnNjL21zbi9saWIvdXRpbHNcIjtcclxuaW1wb3J0IHtcclxuICBCdXR0b24sXHJcbiAgQ2hlY2tib3gsXHJcbiAgQ2hlY2tib3hPcHRpb25UeXBlLFxyXG4gIE1lbnUsXHJcbiAgbWVzc2FnZSxcclxuICBQYWdpbmF0aW9uLFxyXG4gIFBvcG92ZXIsXHJcbiAgU3BhY2UsXHJcbiAgVGFibGUsXHJcbiAgVGFibGVQcm9wcyxcclxuICBUb29sdGlwLFxyXG59IGZyb20gXCJhbnRkXCI7XHJcbmltcG9ydCB7IENvbHVtblR5cGUsIFRhYmxlUGFnaW5hdGlvbkNvbmZpZyB9IGZyb20gXCJhbnRkL2xpYi90YWJsZVwiO1xyXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgRG5kUHJvdmlkZXIgfSBmcm9tIFwicmVhY3QtZG5kXCI7XHJcbmltcG9ydCBCb2R5Um93LCB7IERuZENvbnRleHRUeXBlLCBJQm9keVJvd1Byb3BzIH0gZnJvbSBcIi4uL2NvbW1vbi9Cb2R5Um93XCI7XHJcbmltcG9ydCB0cmVlVXRpbHMgZnJvbSBcIi4uLy4uL3RyZWVVdGlsc1wiO1xyXG5pbXBvcnQgXCIuL2luZGV4Lm1vZHVsZS5sZXNzXCI7XHJcbmNvbnN0IHsgQm9keVJvd0NvbXBvbmVudCwgSFRNTDVCYWNrZW5kIH0gPSBCb2R5Um93O1xyXG5pbXBvcnQgd2l0aFpoTG9jYWxlIGZyb20gXCIuLi9jb21tb24vd2l0aFpoTG9jYWxlXCI7XHJcbmltcG9ydCB7IFJlc2l6YWJsZSB9IGZyb20gXCJyZWFjdC1yZXNpemFibGVcIjtcclxuaW1wb3J0IFwiLi9yZXNpemUubW9kdWxlLmxlc3NcIjtcclxuaW1wb3J0IHsgZ2V0TGVzcywgZ2V0Tm9kZSwgc2ltcGxpZnlDb2x1bW5zIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XHJcbmltcG9ydCBOb0RhdGEgZnJvbSBcIi4uL2NvbW1vbi9Ob0RhdGFcIjtcclxuaW1wb3J0IHsgZ2V0U3RvcmFnZSB9IGZyb20gXCJAYmotbnNjL2Z1bmN0aW9uc1wiO1xyXG5pbXBvcnQgY29uZmlnIGZyb20gXCIuLi8uLi9jb25maWdcIjtcclxuaW1wb3J0IEVsbGlwc2VDZWxsIGZyb20gXCIuLi9jb21tb24vRWxsaXBzZUNlbGxcIjtcclxuaW1wb3J0IGNscyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xyXG5pbXBvcnQgaXNFcXVhbCBmcm9tIFwibG9kYXNoL2lzRXF1YWxcIjtcclxuY29uc3Qgc3R5bGVzID0gbnVsbDtcclxuaW50ZXJmYWNlIElEcmFnUGFyYW1zIHtcclxuICBpZDogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIGlkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcclxuICBwYXJlbnRJZDogc3RyaW5nIHwgbnVtYmVyO1xyXG59XHJcbi8vIGludGVyZmFjZSBTdG9yZVByb3BzIHt9XHJcblxyXG5leHBvcnQgdHlwZSBTdG9yZVR5cGUgPSBcIlBhZ2VTdG9yZVwiIHwgXCJUcmVlU3RvcmVcIiB8IFwiQmFzZVN0b3JlXCI7XHJcblxyXG5pbnRlcmZhY2UgTlNDVGFibGVQYWdpbmF0aW9uIGV4dGVuZHMgVGFibGVQYWdpbmF0aW9uQ29uZmlnIHtcclxuICB0b3RhbEtleT86IHN0cmluZztcclxuICBwYWdlU2l6ZUtleT86IHN0cmluZztcclxuICBjdXJyZW50S2V5Pzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgVG9vbEJhclByb3BzIHtcclxuICBzaG93OiBib29sZWFuO1xyXG4gIHRvb2xzPzogQXJyYXk8c3RyaW5nPjtcclxuICBvblRvb2xDbGljaz86IHsgb25SZWZyZXNoPzogYW55OyBvblNvcnQ/OiBhbnkgfTtcclxufVxyXG5pbnRlcmZhY2UgTlNDVGFibGVQcm9wcyBleHRlbmRzIFRhYmxlUHJvcHM8YW55PiB7XHJcbiAgc3RvcmU/OiBTdG9yZVByb3BzO1xyXG4gIHNob3dUb3RhbD86IGJvb2xlYW47IC8vIOaYr+WQpuaYvuekuuaAu+adoeaVsOS/oeaBr++8jOm7mOiupHRydWVcclxuICBkcmFnYWJsZT86IGJvb2xlYW47IC8vIOaYr+WQpuWPr+aLluWKqCwg6buY6K6kZmFsc2VcclxuICBmaWx0ZXJDb2x1bW4/OiBib29sZWFuOyAvLyDmmK/lkKbmlK/mjIHov4fmu6TmmL7npLrooajmoLzliJcsIOm7mOiupHRydWVcclxuICBtb3ZlUm93PzogKHBhcmFtczogSURyYWdQYXJhbXMpID0+IHZvaWQ7IC8vIOaLluaLveWujOaIkOWQjueahOWbnuiwg1xyXG4gIGRyYWdVcmw/OiBzdHJpbmc7IC8vIOS/neWtmOaLluaLveaOkuW6j+eahOaOpeWPo1xyXG4gIHBhZ2luYXRpb24/OiBmYWxzZSB8IE5TQ1RhYmxlUGFnaW5hdGlvbjtcclxuICBhdXRvUGFnaW5hdGlvbj86IGJvb2xlYW47IC8vIOe7hOS7tuaYr+WQpuiHquWKqOWkhOeQhuWIhumhtVxyXG4gIGF1dG9Tb3J0PzogYm9vbGVhbjsgLy/nu4Tku7bmmK/lkKboh6rliqjlpITnkIbmjpLluo9cclxuICBhdXRvT25DaGFuZ2U/OiBib29sZWFuOyAvLyDnu4Tku7bmmK/lkKboh6rliqhvbkNoYW5nZSwgZmFsc2XliJnkuI3lgZrku7vkvZXlpITnkIblhajpg6jkuqTnu5nosIPnlKjmlrlcclxuICByZXNpemVDb2x1bW4/OiBib29sZWFuO1xyXG4gIHNvcnRGaWVsZHM/OiBBcnJheTxzdHJpbmc+OyAvL+mcgOimgeaOkuW6j+eahOWtl+autUluZGV4XHJcbiAgdG9vbGJhcj86IFRvb2xCYXJQcm9wcyB8IGJvb2xlYW47XHJcbiAgYXV0b1NpemU/OiBib29sZWFuO1xyXG4gIHNvcnRTZWFyY2g/OiBib29sZWFuOyAvL+aYr+WQpua3u+WKoOaOkuW6j+afpeivoizpu5jorqR0cnVlXHJcbiAgc2hvd1Jvd1NlbGVjdGlvbj86IGJvb2xlYW47XHJcbiAgcm93S2V5Pzogc3RyaW5nO1xyXG4gIFtwcm9wc05hbWU6IHN0cmluZ106IGFueTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSU5TQ1RhYmxlUHJvcHMgPSB0eXBlb2YgTlNDVGFibGUuZGVmYXVsdFByb3BzICYgTlNDVGFibGVQcm9wcztcclxuZXhwb3J0IHsgRG5kQ29udGV4dFR5cGUsIElCb2R5Um93UHJvcHMgfTtcclxuXHJcbmNvbnN0IFJlc2l6ZWFibGVUaXRsZSA9IChwcm9wczogYW55KSA9PiB7XHJcbiAgY29uc3QgeyBvblJlc2l6ZSwgd2lkdGgsIC4uLnJlc3RQcm9wcyB9ID0gcHJvcHM7XHJcbiAgcmV0dXJuIChcclxuICAgIDxSZXNpemFibGVcclxuICAgICAgd2lkdGg9e3dpZHRoIHx8IDE1MH1cclxuICAgICAgaGVpZ2h0PXswfVxyXG4gICAgICBvblJlc2l6ZT17b25SZXNpemV9XHJcbiAgICAgIGRyYWdnYWJsZU9wdHM9e3sgZW5hYmxlVXNlclNlbGVjdEhhY2s6IGZhbHNlIH19XHJcbiAgICA+XHJcbiAgICAgIDx0aCB7Li4ucmVzdFByb3BzfSAvPlxyXG4gICAgPC9SZXNpemFibGU+XHJcbiAgKTtcclxufTtcclxuY2xhc3MgTlNDVGFibGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SU5TQ1RhYmxlUHJvcHMsIGFueT4ge1xyXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XHJcbiAgICBkcmFnYWJsZTogZmFsc2UsXHJcbiAgICBzaG93VG90YWw6IHRydWUsXHJcbiAgICBmaWx0ZXJDb2x1bW46IHRydWUsXHJcbiAgICBkcmFnVXJsOiBcIlwiLFxyXG4gICAgYXV0b1BhZ2luYXRpb246IHRydWUsXHJcbiAgICBhdXRvU29ydDogdHJ1ZSxcclxuICAgIGF1dG9PbkNoYW5nZTogdHJ1ZSxcclxuICAgIHJlc2l6ZUNvbHVtbjogdHJ1ZSxcclxuICAgIHRvb2xiYXI6IHtcclxuICAgICAgc2hvdzogZmFsc2UsXHJcbiAgICAgIG9uVG9vbENsaWNrOiB7fSBhcyBhbnksXHJcbiAgICAgIHRvb2xzOiBbXSBhcyBhbnksXHJcbiAgICB9IGFzIGFueSxcclxuICB9O1xyXG5cclxuICBzdG9yZSA9IHt9IGFzIFN0b3JlUHJvcHM7XHJcbiAgdGhJY29uUmVmID0gUmVhY3QuY3JlYXRlUmVmPEhUTUxEaXZFbGVtZW50PigpO1xyXG4gIHRhYmxlU2VhcmNoUmVmID0gUmVhY3QuY3JlYXRlUmVmPGFueT4oKTtcclxuXHJcbiAgbGlzdGVuZXJzID0ge1xyXG4gICAgb25CZWZvcmVMb2FkOiBudWxsLFxyXG4gICAgbG9hZDogbnVsbCxcclxuICB9O1xyXG5cclxuICBjb21wb25lbnRzID0ge1xyXG4gICAgaGVhZGVyOiB7XHJcbiAgICAgIGNlbGw6IFJlc2l6ZWFibGVUaXRsZSxcclxuICAgIH0sXHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgIHN1cGVyKHByb3BzKTtcclxuICAgIGxldCBtb2RhbCA9IHByb3BzLnR5cGUgfHwgXCJhdXRvXCI7XHJcbiAgICBsZXQgc3RvcmVQcmVmaXggPSBnZXRTdG9yYWdlKFwic3RvcmUtcHJlLWtleVwiKTtcclxuICAgIGxldCBhdXRvVHlwZSA9IGdldFN0b3JhZ2UoXHJcbiAgICAgIHN0b3JlUHJlZml4ID8gc3RvcmVQcmVmaXggKyBcInRhYmxlU2l6ZVwiIDogXCJ0YWJsZVNpemVcIlxyXG4gICAgKTtcclxuICAgIGF1dG9UeXBlID0gYXV0b1R5cGU/LmNvbnRlbnQ7XHJcbiAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICBkYXRhU291cmNlOiBbXSxcclxuICAgICAgY29sdW1uczogW10sXHJcbiAgICAgIGxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICBwYWdpbmF0aW9uOiB7fSxcclxuICAgICAgYWN0aXZlSW5kZXg6IC0xLFxyXG4gICAgICAvL+aQnOe0ouaWh+acrFxyXG4gICAgICBzZWFyY2hUZXh0OiBudWxsLFxyXG4gICAgICBmaWVsZE9wdGlvbjogbnVsbCxcclxuICAgICAgc2VhcmNoQ29sb3I6IG51bGwsXHJcbiAgICAgIGNvbHM6IFtdLFxyXG4gICAgICBzb3J0czogW10sXHJcbiAgICAgIGZpbHRlclBhcmFtczoge30sXHJcbiAgICAgIHRhYmxlU2l6ZTogdGhpcy5wcm9wcy5zaXplIHx8IGF1dG9UeXBlIHx8IFwiZGVmYXVsdFwiLFxyXG4gICAgICBzb3J0VHlwZTogXCJzaW5nbGVcIixcclxuICAgICAgc29ydGVyOiBbXSwgLy/orrDlvZXlvZPliY3mjpLluo/lrZfmrrVcclxuICAgICAgc29ydEluZm86IHt9LFxyXG4gICAgICBkZWZhdWx0U29ydDogdHJ1ZSxcclxuICAgICAgY2hlY2tDb2x1bW46IFtdLFxyXG4gICAgICBkZWZhdWx0Q2hlY2s6IHRydWUsXHJcbiAgICAgIHNlbGVjdGVkUm93S2V5czogW10sXHJcbiAgICAgIHNlbGVjdGVkUm93RGF0YXM6IFtdLFxyXG4gICAgICBmaWx0ZXI6IFtdLFxyXG4gICAgICBleHRyYToge30sXHJcbiAgICB9O1xyXG4gICAgaWYgKHByb3BzLnN0b3JlIGluc3RhbmNlb2YgU3RvcmUpIHtcclxuICAgICAgdGhpcy5zdG9yZSA9IHByb3BzLnN0b3JlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgeyBsaXN0ZW5lcnM6IGxpc3RlbmVyc1Byb3BzID0ge30sIC4uLnJlc3RTdG9yZSB9ID1cclxuICAgICAgICBwcm9wcy5zdG9yZSB8fCB7fTtcclxuICAgICAgY29uc3Qgc3RvcmVQcm9wcyA9IHtcclxuICAgICAgICBtb2RlbDogXCJtb2RlbFwiLFxyXG4gICAgICAgIGNvbXBvbmVudDogdGhpcyxcclxuICAgICAgICBsaXN0ZW5lcnM6IHtcclxuICAgICAgICAgIG9uQmVmb3JlTG9hZDogKHN0b3JlLCBvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBsb2FkaW5nOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB1dGlscy5jYWxsYmFjayhsaXN0ZW5lcnNQcm9wcy5vbkJlZm9yZUxvYWQsIHRoaXMsIFtzdG9yZSwgb3B0aW9uc10pO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGRhdGFDaGFuZ2VkOiAoZGF0YSwgbW9kZWxEYXRhLCBzdG9yZSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcGFnaW5nID0gISh0aGlzLnByb3BzLnBhZ2luYXRpb24gPT09IGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHBhZ2luZyAmJiAhdGhpcy5wcm9wcy5kYXRhU291cmNlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhU291cmNlOiBtb2RlbERhdGEsXHJcbiAgICAgICAgICAgICAgICBwYWdpbmF0aW9uOiBzdG9yZS5nZXRQYWdpbmF0aW9uKCksXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFjdGl2ZUluZGV4OiAtMSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgZGF0YVNvdXJjZTogbW9kZWxEYXRhLCBsb2FkaW5nOiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdXRpbHMuY2FsbGJhY2sobGlzdGVuZXJzUHJvcHMuZGF0YUNoYW5nZWQsIHRoaXMsIFtcclxuICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgIG1vZGVsRGF0YSxcclxuICAgICAgICAgICAgICBzdG9yZSxcclxuICAgICAgICAgICAgICBwYWdpbmcsXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxvYWQ6IChkYXRhLCBtb2RlbERhdGEsIHN0b3JlKSA9PiB7XHJcbiAgICAgICAgICAgIHV0aWxzLmNhbGxiYWNrKGxpc3RlbmVyc1Byb3BzLmxvYWQsIHRoaXMsIFtkYXRhLCBtb2RlbERhdGEsIHN0b3JlXSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25FcnJvckxvYWQ6IChlcnIsIHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBsb2FkaW5nOiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgdXRpbHMuY2FsbGJhY2sobGlzdGVuZXJzUHJvcHMub25FcnJvckxvYWQsIHRoaXMsIFtlcnIsIHJlc3BvbnNlXSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGF0YTogcmVzdFN0b3JlLmRhdGFcclxuICAgICAgICAgID8gcmVzdFN0b3JlLmRhdGFcclxuICAgICAgICAgIDogcHJvcHMuZGF0YVNvdXJjZVxyXG4gICAgICAgICAgPyBwcm9wcy5kYXRhU291cmNlXHJcbiAgICAgICAgICA6IG51bGwsXHJcbiAgICAgICAgLi4ucmVzdFN0b3JlLFxyXG4gICAgICAgIGF1dG9Mb2FkOiByZXN0U3RvcmUuYXV0b0xvYWQgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnN0b3JlID0gbmV3IFBhZ2VTdG9yZShcclxuICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBzdG9yZVByb3BzLCB7XHJcbiAgICAgICAgICBwYWdpbmF0aW9uOiB7IGN1cnJlbnQ6IDEsIC4uLnRoaXMucHJvcHMucGFnaW5hdGlvbiB9LFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVSZXNpemUgPVxyXG4gICAgKGluZGV4OiBhbnkpID0+XHJcbiAgICAoZTogYW55LCB7IHNpemUgfTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgY29scyB9ID0gdGhpcy5zdGF0ZTtcclxuICAgICAgY29uc3QgbmV4dENvbHVtbnMgPSBbLi4uY29sc107XHJcbiAgICAgIG5leHRDb2x1bW5zW2luZGV4XSA9IHtcclxuICAgICAgICAuLi5uZXh0Q29sdW1uc1tpbmRleF0sXHJcbiAgICAgICAgd2lkdGg6IHNpemUud2lkdGgsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuc2V0U3RhdGUoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29sczogbmV4dENvbHVtbnMsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAvLyDlnKjnirbmgIHmm7TmlrDlkI7ph43mlrDojrflj5bliJfphY3nva5cclxuICAgICAgICAgIHRoaXMuZ2V0Q29sdW1ucygpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgY29uc3QgeyByZXNpemVDb2x1bW4gfSA9IHRoaXMucHJvcHM7XHJcbiAgICBpZiAoIXJlc2l6ZUNvbHVtbikge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHsgY29sdW1uczogWy4uLnRoaXMucHJvcHMuY29sdW1uc10gfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHsgY29sczogWy4uLnRoaXMucHJvcHMuY29sdW1uc10gfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMucHJvcHMuc3RvcmU7XHJcbiAgICBpZiAoc3RvcmUgJiYgc3RvcmUuZGF0YSkge1xyXG4gICAgICB0aGlzLnN0b3JlLnNldERhdGEoc3RvcmUuZGF0YSk7XHJcbiAgICB9XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5saXN0ZW5NZXNzYWdlKTtcclxuICB9XHJcbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5saXN0ZW5NZXNzYWdlKTtcclxuICB9XHJcbiAgbGlzdGVuTWVzc2FnZSA9IChldikgPT4ge1xyXG4gICAgY29uc3QgZGF0YSA9IHR5cGVvZiBldi5kYXRhID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShldi5kYXRhKSA6IGV2LmRhdGE7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgaWYgKGRhdGEuZXZlbnRUeXBlID09IFwiY2hhbmdlVGFibGVTaXplXCIpIHtcclxuICAgICAgY29uc3QgeyBwYXlsb2FkIH0gPSBkYXRhO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgcGF5bG9hZC5zaXplID09IFwiZGVmYXVsdFwiIHx8XHJcbiAgICAgICAgcGF5bG9hZC5zaXplID09IFwic21hbGxcIiB8fFxyXG4gICAgICAgIHBheWxvYWQuc2l6ZSA9PSBcIm1pZGRsZVwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIF90aGlzLnNldFN0YXRlKHsgdGFibGVTaXplOiBwYXlsb2FkLnNpemUgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmVTdGF0ZSkge1xyXG4gICAgY29uc3QgeyByZXNpemVDb2x1bW4gfSA9IHRoaXMucHJvcHM7XHJcbiAgICBpZiAoIXJlc2l6ZUNvbHVtbikge1xyXG4gICAgICBpZiAodGhpcy5wcm9wcy5jb2x1bW5zICE9PSBwcmV2UHJvcHMuY29sdW1ucykge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBjb2x1bW5zOiB0aGlzLnByb3BzLmNvbHVtbnMgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChwcmVTdGF0ZS5jb2xzICE9PSB0aGlzLnN0YXRlLmNvbHMpIHtcclxuICAgICAgICB0aGlzLnJlc2V0Q29sdW1uKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMucHJvcHMuY29sdW1ucyAhPT0gcHJldlByb3BzLmNvbHVtbnMpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgIGNvbHM6IHRoaXMucHJvcHMuY29sdW1ucyxcclxuICAgICAgICAgIGNvbHVtbnM6IHRoaXMucHJvcHMuY29sdW1ucyxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJldlByb3BzLnNpemUgIT09IHRoaXMucHJvcHMuc2l6ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB0YWJsZVNpemU6IHRoaXMucHJvcHMuc2l6ZSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXNldENvbHVtbigpIHtcclxuICAgIGNvbnN0IHsgY29scyB9ID0gdGhpcy5zdGF0ZTtcclxuICAgIGNvbnN0IG5ld0NvbHM6IGFueSA9IFtdO1xyXG4gICAgbGV0IGNvbHNzID0gY29scyB8fCBbXTtcclxuICAgIGNvbHNzLm1hcCgoY29sOiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgbGV0IHRlbXAgPSB7XHJcbiAgICAgICAgLi4uY29sLFxyXG4gICAgICAgIG9uSGVhZGVyQ2VsbDogKGNvbHVtbjogeyB3aWR0aDogYW55IH0pID0+ICh7XHJcbiAgICAgICAgICB3aWR0aDogY29sdW1uLndpZHRoLFxyXG4gICAgICAgICAgb25SZXNpemU6IHRoaXMuaGFuZGxlUmVzaXplKGluZGV4KSxcclxuICAgICAgICB9KSxcclxuICAgICAgfTtcclxuICAgICAgbmV3Q29scy5wdXNoKHRlbXApO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgY29sdW1uczogbmV3Q29scyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5riF6Zmk6YCJ5Lit6aKc6ImyXHJcbiAgICovXHJcbiAgY2xlYXJTZWxlY3RDb2xvcigpIHtcclxuICAgIHRoaXMuc2V0U3RhdGUoeyBhY3RpdmVJbmRleDogLTEgfSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGdldFBhZ2luYXRpb25CeVN0b3JlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0UGFnaW5hdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2UocGFnaW5hdGlvbiwgZmlsdGVycywgc29ydGVyLCBleHRyYSkge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBhdXRvT25DaGFuZ2UgPSB0cnVlLFxyXG4gICAgICBhdXRvU29ydCxcclxuICAgICAgYXV0b1BhZ2luYXRpb24sXHJcbiAgICAgIG9uQ2hhbmdlLFxyXG4gICAgICBzdG9yZSxcclxuICAgIH0gPSB0aGlzLnByb3BzO1xyXG4gICAgY29uc3QgeyBmaWx0ZXJQYXJhbXMgfSA9IHRoaXMuc3RhdGU7XHJcbiAgICBjb25zdCBpc011bHRpcGxlID0gQXJyYXkuaXNBcnJheShzb3J0ZXIpO1xyXG4gICAgaWYgKGF1dG9PbkNoYW5nZSA9PT0gZmFsc2UgfHwgIXN0b3JlKSB7XHJcbiAgICAgIG9uQ2hhbmdlICYmIG9uQ2hhbmdlKHBhZ2luYXRpb24sIGZpbHRlcnMsIHNvcnRlciwgZXh0cmEpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBoYW5kbGVQYWdpbmF0aW9uID0gKCkgPT4ge1xyXG4gICAgICBsZXQgcGFyYW1zID0ge30gYXMge1xyXG4gICAgICAgIHNpemU/OiBzdHJpbmc7XHJcbiAgICAgICAgcGFnZVNpemU/OiBzdHJpbmc7XHJcbiAgICAgICAgYXNjcz86IHN0cmluZztcclxuICAgICAgICBkZXNjcz86IHN0cmluZztcclxuICAgICAgICBbcHJvcE5hbWU6IHN0cmluZ106IHN0cmluZztcclxuICAgICAgfTtcclxuICAgICAgY29uc3QgcGFnaW5nID0gdGhpcy5nZXRQYWdpbmF0aW9uQnlTdG9yZSgpIHx8IHt9O1xyXG4gICAgICBpZiAoIWlzRW1wdHlPYmoocGFnaW5hdGlvbikpIHtcclxuICAgICAgICBjb25zdCBwID0ge1xyXG4gICAgICAgICAgW3BhZ2luZy5jdXJyZW50S2V5IHx8IFwiY3VycmVudFwiXTogcGFnaW5hdGlvbi5jdXJyZW50LFxyXG4gICAgICAgICAgW3BhZ2luZy5wYWdlU2l6ZUtleSB8fCBcInNpemVcIl06IHBhZ2luYXRpb24ucGFnZVNpemUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHBhcmFtcywgcCk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGFzY1BhcmFtcyA9IHRoaXMuZ2V0U29ydFBhcmFtKHNvcnRlciwgdHJ1ZSk7XHJcbiAgICAgIGlmIChpc011bHRpcGxlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNvcnRlciB9KTtcclxuICAgICAgfSBlbHNlIGlmICghaXNNdWx0aXBsZSAmJiAhaXNFbXB0eU9iaihzb3J0ZXIpKSB7XHJcbiAgICAgICAgc29ydGVyLmNvbHVtbiAmJlxyXG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNvcnRlcjogW3NvcnRlcl0sIGRlZmF1bHRTb3J0OiBmYWxzZSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc29ydGVyOiBbXSB9KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICBmaWx0ZXJzLFxyXG4gICAgICAgIGV4dHJhLFxyXG4gICAgICB9KTtcclxuICAgICAgcGFyYW1zID0geyAuLi5maWx0ZXJQYXJhbXMsIC4uLnBhcmFtcywgLi4uYXNjUGFyYW1zIH07XHJcbiAgICAgIGF1dG9Tb3J0ICYmIHRoaXMuc3RvcmUucmVsb2FkKHsgcGFyYW1zIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBvbkNoYW5nZUZuID0gdGhpcy5wcm9wcy5vbkNoYW5nZTtcclxuXHJcbiAgICBhdXRvUGFnaW5hdGlvbiAmJiBoYW5kbGVQYWdpbmF0aW9uKCk7XHJcbiAgICAvLyDnlKjmiLfkvKDkuoZvbkNoYW5nZeS/neeVmeeUqOaIt+iHquS4u+WkhOeQhuihqOagvOWPmOWMlueahOadg+WKm1xyXG4gICAgaWYgKG9uQ2hhbmdlRm4pIHtcclxuICAgICAgdXRpbHMuY2FsbGJhY2sob25DaGFuZ2VGbiwgdGhpcywgW3BhZ2luYXRpb24sIGZpbHRlcnMsIHNvcnRlciwgZXh0cmFdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFN0b3JlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDojrflj5bmlbDmja7mqKHlnovlr7nosaFcclxuICAgKi9cclxuICBnZXRNb2RlbCgpIHtcclxuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldE1vZGVsKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDoj5zljZXmkJzntKLov4fmu6TmmL7npLpcclxuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsXHJcbiAgICovXHJcbiAgaGFuZGxlU2VhcmNoKHZhbCwgZmllbGRPcHRpb24sIHNlYXJjaENvbG9yKSB7XHJcbiAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgc2VhcmNoVGV4dDogdmFsLFxyXG4gICAgICBmaWVsZE9wdGlvbjogZmllbGRPcHRpb24sXHJcbiAgICAgIHNlYXJjaENvbG9yOiBzZWFyY2hDb2xvcixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5qih5Z2X5YiX6KGo56e75Yqo5o6S5bqPXHJcbiAgICovXHJcbiAgbW92ZVJvdyA9IChkcmFnSW5kZXgsIGhvdmVySW5kZXgsIGRyYWcsIHRhcmdldCkgPT4ge1xyXG4gICAgY29uc3QgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGRyYWdOb2RlID0gZHJhZy5yZWNvcmQ7XHJcbiAgICBsZXQgdGFyZ2V0Tm9kZSA9IHRhcmdldC5yZWNvcmQ7XHJcbiAgICBkcmFnTm9kZS5tb3ZlQXJyYXkoZHJhZ05vZGUsIHRhcmdldE5vZGUpO1xyXG4gICAgbGV0IGlkcyA9IGRyYWdOb2RlLnBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlSWRzKCk7XHJcbiAgICBsZXQgcGFyYW1zID0ge1xyXG4gICAgICBpZDogZHJhZ05vZGUuaWQsXHJcbiAgICAgIHBhcmVudElkOiBkcmFnTm9kZS5hdHRyaWJ1dGUucGFyZW50SWQsXHJcbiAgICAgIGlkczogaWRzLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5wcm9wcy5tb3ZlUm93KSB7XHJcbiAgICAgIHRoaXMucHJvcHMubW92ZVJvdyhwYXJhbXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdG9yZS5yZWxvYWQoKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBmaWx0ZXJDb2x1bW4oY2hlY2tlZFZhbHVlKSB7XHJcbiAgICBpZiAoY2hlY2tlZFZhbHVlLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIG1lc3NhZ2Uud2FybmluZyhcIuiHs+WwkeaYvuekuuS4gOWIl++8gVwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZmlsdGVyQ29sdW1ucyA9IHRoaXMucHJvcHMuY29sdW1ucy5tYXAoKGNvbDogQ29sdW1uVHlwZTx7fT4pID0+IHtcclxuICAgICAgY29uc3QgbmV3Q29sID0geyAuLi5jb2wgfSBhcyBDb2x1bW5UeXBlPHt9PiAmIHsgaW5pdFNob3c6IGJvb2xlYW4gfTtcclxuICAgICAgaWYgKGNoZWNrZWRWYWx1ZS5pbmNsdWRlcyhjb2wuZGF0YUluZGV4KSkge1xyXG4gICAgICAgIG5ld0NvbC5pbml0U2hvdyA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmV3Q29sLmluaXRTaG93ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5ld0NvbDtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgeyByZXNpemVDb2x1bW4gfSA9IHRoaXMucHJvcHM7XHJcbiAgICBpZiAoIXJlc2l6ZUNvbHVtbikge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICBjb2x1bW5zOiBmaWx0ZXJDb2x1bW5zLFxyXG4gICAgICAgIGNoZWNrQ29sdW1uOiBjaGVja2VkVmFsdWUsXHJcbiAgICAgICAgZGVmYXVsdENoZWNrOiBmYWxzZSxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICBjb2xzOiBmaWx0ZXJDb2x1bW5zLFxyXG4gICAgICAgIGNoZWNrQ29sdW1uOiBjaGVja2VkVmFsdWUsXHJcbiAgICAgICAgZGVmYXVsdENoZWNrOiBmYWxzZSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldFNvcnRQYXJhbShzb3J0ZXIsIHNvcnRTdGF0ZSA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCBpc011bHRpcGxlID0gQXJyYXkuaXNBcnJheShzb3J0ZXIpO1xyXG4gICAgY29uc3QgeyBzb3J0U2VhcmNoID0gdHJ1ZSB9ID0gdGhpcy5wcm9wcztcclxuICAgIGlmICghc29ydFNlYXJjaCkge1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICBsZXQgc29ydEluZm8gPSB7fTtcclxuICAgIGxldCBvcmRlckl0ZW1zID0gW107XHJcbiAgICBpZiAoIWlzRW1wdHlPYmooc29ydGVyKSAmJiAhaXNNdWx0aXBsZSAmJiBzb3J0ZXIuY29sdW1uKSB7XHJcbiAgICAgIG9yZGVySXRlbXMgPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29sdW1uOiBzb3J0ZXIuY29sdW1uLmZpZWxkIHx8IHNvcnRlci5jb2x1bW4uZGF0YUluZGV4LFxyXG4gICAgICAgICAgYXNjOiBzb3J0ZXIub3JkZXIgPT0gXCJhc2NlbmRcIixcclxuICAgICAgICB9LFxyXG4gICAgICBdO1xyXG4gICAgICBpZiAoc29ydGVyLmNvbHVtbikgc29ydEluZm9bc29ydGVyLmNvbHVtbi5kYXRhSW5kZXhdID0gc29ydGVyLm9yZGVyO1xyXG4gICAgfSBlbHNlIGlmIChpc011bHRpcGxlKSB7XHJcbiAgICAgIHNvcnRlci5mb3JFYWNoKCh2KSA9PiB7XHJcbiAgICAgICAgc29ydEluZm9bdi5jb2x1bW4uZGF0YUluZGV4XSA9IHYub3JkZXI7XHJcbiAgICAgICAgbGV0IGZpZWxkID0gdi5jb2x1bW4uZmllbGQgfHwgdi5jb2x1bW4uZGF0YUluZGV4O1xyXG4gICAgICAgIG9yZGVySXRlbXMucHVzaCh7XHJcbiAgICAgICAgICBjb2x1bW46IGZpZWxkLFxyXG4gICAgICAgICAgYXNjOiB2Lm9yZGVyID09IFwiYXNjZW5kXCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHNvcnRTdGF0ZSkge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICBzb3J0SW5mbzogc29ydEluZm8sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgb3JkZXJJdGVtczogSlNPTi5zdHJpbmdpZnkob3JkZXJJdGVtcykgfTtcclxuICB9XHJcbiAgaXNCZXlvbmQoZSkge1xyXG4gICAgY29uc3QgZXYgPSB3aW5kb3cuZXZlbnQgfHwgZTsgLy8g5rWP6KeI5Zmo5YW85a6577yM5pyA5aW95YaZ5LiA5LiLXHJcbiAgICBjb25zdCB0ZXh0UmFuZ2UgPSAoZWwpID0+IHtcclxuICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBlbDtcclxuICAgICAgY29uc3QgdGFyZ2V0VyA9IHRleHRDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xyXG4gICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgIHJhbmdlLnNldFN0YXJ0KHRleHRDb250ZW50LCAwKTtcclxuICAgICAgcmFuZ2Uuc2V0RW5kKHRleHRDb250ZW50LCB0ZXh0Q29udGVudC5jaGlsZE5vZGVzLmxlbmd0aCk7XHJcbiAgICAgIGNvbnN0IHJhbmdlV2lkdGggPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcclxuICAgICAgcmV0dXJuIHJhbmdlV2lkdGggPiB0YXJnZXRXO1xyXG4gICAgfTtcclxuICAgIHJldHVybiAhdGV4dFJhbmdlKGV2LnRhcmdldCk7IC8vIHRhcmdldOWPr+S7peS/neivgeW9k+WJjeWIkui/h+eahGRvbeiKgueCueS4gOebtOS/neaMgeaYrzplbC10b29sdGlwX190cmlnZ2VyXHJcbiAgfVxyXG4gIHNldFNlbGVjdGVkUm93S2V5cyhkYXRhOiBBcnJheTxTdHJpbmcgfCBOdW1iZXI+KSB7XHJcbiAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgc2VsZWN0ZWRSb3dLZXlzOiBkYXRhLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHNldFNlbGVjdGVkUm93RGF0YXMoZGF0YTogQXJyYXk8T2JqZWN0Pikge1xyXG4gICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgIHNlbGVjdGVkUm93RGF0YXM6IGRhdGEsXHJcbiAgICB9KTtcclxuICB9XHJcbiAgZ2V0Q29sdW1ucygpIHtcclxuICAgIGNvbnN0IHsgY29sdW1ucywgc29ydFR5cGUsIHNvcnRJbmZvIH0gPSB0aGlzLnN0YXRlO1xyXG4gICAgY29uc3QgeyBzb3J0RmllbGRzID0gW10sIHNpemUgPSBcImxhcmdlXCIgfSA9IHRoaXMucHJvcHM7XHJcbiAgICBjb25zdCBkZWZhdWx0U2hvd0NvbHMgPSBjb2x1bW5zLmZpbHRlcigoY29scykgPT4gY29scy5pbml0U2hvdyAhPT0gZmFsc2UpO1xyXG4gICAgY29uc3QgY29scyA9IGRlZmF1bHRTaG93Q29scy5tYXAoKGNvbCwgaW5kZXgpID0+IHtcclxuICAgICAgLy8g5pu/5o2iIGdldENvbHVtbnMg5pa55rOV5Lit5Y6f5p2l55qEIGVsbGlwc2lzIOWkhOeQhumDqOWIhlxyXG4gICAgICBpZiAoY29sLmVsbGlwc2lzICYmICFjb2wucmVuZGVyKSB7XHJcbiAgICAgICAgY29sLmVsbGlwc2lzID0ge1xyXG4gICAgICAgICAgc2hvd1RpdGxlOiBmYWxzZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbC5yZW5kZXIgPSAodGV4dCwgcmVjb3JkLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgLy8g6I635Y+W5b2T5YmN5YiX55qE5a6e5pe25a695bqmXHJcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q29sID0gdGhpcy5zdGF0ZS5jb2xzPy5maW5kKChjKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIOWkhOeQhiBkYXRhSW5kZXgg5Y+v6IO95piv5a2X56ym5Liy5oiW5pWw57uE55qE5oOF5Ya1XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGMuZGF0YUluZGV4KSAmJiBBcnJheS5pc0FycmF5KGNvbC5kYXRhSW5kZXgpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGMuZGF0YUluZGV4KSA9PT0gSlNPTi5zdHJpbmdpZnkoY29sLmRhdGFJbmRleClcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjLmRhdGFJbmRleCA9PT0gY29sLmRhdGFJbmRleDtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGFjdHVhbFdpZHRoID0gY3VycmVudENvbD8ud2lkdGggfHwgY29sLndpZHRoO1xyXG4gICAgICAgICAgbGV0IGNvbFdpZHRoOiBhbnkgPSBcIjEwMCVcIjtcclxuXHJcbiAgICAgICAgICBpZiAoYWN0dWFsV2lkdGgpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc3RhdGUudGFibGVTaXplIHx8IHRoaXMucHJvcHMuc2l6ZSB8fCBcImRlZmF1bHRcIjtcclxuICAgICAgICAgICAgY29uc3QgY29sV2lkdGhPYmogPSB7XHJcbiAgICAgICAgICAgICAgc21hbGw6IDE2LFxyXG4gICAgICAgICAgICAgIG1pZGRsZTogMTYsXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDogMTYsXHJcbiAgICAgICAgICAgICAgbGFyZ2U6IDMyLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCBwYWRkaW5nV2lkdGggPSBjb2xXaWR0aE9ialtzaXplXSB8fCAxNjtcclxuXHJcbiAgICAgICAgICAgIGlmIChhY3R1YWxXaWR0aCA+IHBhZGRpbmdXaWR0aCkge1xyXG4gICAgICAgICAgICAgIGNvbFdpZHRoID0gYWN0dWFsV2lkdGggLSBwYWRkaW5nV2lkdGg7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29sV2lkdGggPSBhY3R1YWxXaWR0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogXCJpbmxpbmUtdGFibGVcIiwgd2lkdGg6IFwiMTAwJVwiIH19PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIHJlZj17KGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOa4hemZpOS5i+WJjeeahHRpdGxlXHJcbiAgICAgICAgICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwidGl0bGVcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOajgOafpeaWh+acrOaYr+WQpua6ouWHulxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5zY3JvbGxXaWR0aCA+IGVsLmNsaWVudFdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiLCB0ZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy10YWJsZS10ZXh0XCIpfVxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgd2lkdGg6IGNvbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcclxuICAgICAgICAgICAgICAgICAgdGV4dE92ZXJmbG93OiBcImVsbGlwc2lzXCIsXHJcbiAgICAgICAgICAgICAgICAgIHdoaXRlU3BhY2U6IFwibm93cmFwXCIsXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt0ZXh0fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc29ydEZpZWxkcy5pbmRleE9mKGNvbC5kYXRhSW5kZXgpID4gLTEpIHtcclxuICAgICAgICBpZiAoc29ydFR5cGUgPT0gXCJzaW5nbGVcIikge1xyXG4gICAgICAgICAgY29sLnNvcnRlciA9IHRydWU7XHJcbiAgICAgICAgICBjb2wuc29ydE9yZGVyID0gc29ydEluZm9bY29sLmRhdGFJbmRleF1cclxuICAgICAgICAgICAgPyBzb3J0SW5mb1tjb2wuZGF0YUluZGV4XVxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzb3J0VHlwZSA9PSBcIm11bHRpcGxlXCIpIHtcclxuICAgICAgICAgIGNvbC5zb3J0ZXIgPSB7IG11bHRpcGxlOiBpbmRleCB9O1xyXG4gICAgICAgICAgY29sLnNvcnRPcmRlciA9IHNvcnRJbmZvW2NvbC5kYXRhSW5kZXhdXHJcbiAgICAgICAgICAgID8gc29ydEluZm9bY29sLmRhdGFJbmRleF1cclxuICAgICAgICAgICAgOiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29sO1xyXG4gICAgfSk7XHJcbiAgICBjb2xzLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKCFpc0VtcHR5T2JqKGl0ZW0uZmlsdGVyUHJvcHMpKSB7XHJcbiAgICAgICAgbGV0IG9iaiA9IHsgLi4uaXRlbSB9O1xyXG4gICAgICAgIGNvbnN0IHsgdHlwZSwgcHJvcHMsIHNlYXJjaEtleSB9ID0gaXRlbS5maWx0ZXJQcm9wcztcclxuICAgICAgICBsZXQgRGl2ID0gbnVsbDtcclxuICAgICAgICBsZXQgdGV4dCA9IGl0ZW0udGl0bGU7XHJcbiAgICAgICAgRGl2ID0gZ2V0Tm9kZSh0eXBlLCB7XHJcbiAgICAgICAgICBwbGFjZWhvbGRlcjogYOaQnOe0oiR7dGV4dH1gLFxyXG4gICAgICAgICAgLi4ucHJvcHMsXHJcbiAgICAgICAgICByZWY6IHRoaXMudGFibGVTZWFyY2hSZWYsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb2JqID0ge1xyXG4gICAgICAgICAgZmlsdGVyRHJvcGRvd246ICh7XHJcbiAgICAgICAgICAgIHNldFNlbGVjdGVkS2V5cyxcclxuICAgICAgICAgICAgc2VsZWN0ZWRLZXlzLFxyXG4gICAgICAgICAgICBjb25maXJtLFxyXG4gICAgICAgICAgICBjbGVhckZpbHRlcnMsXHJcbiAgICAgICAgICB9KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy10YWJsZS1zZWFyY2hcIil9PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy10YWJsZS1zZWFyY2gtc3BhY2VcIil9PlxyXG4gICAgICAgICAgICAgICAgICB7RGl2fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8U3BhY2U+XHJcbiAgICAgICAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlybSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBmaWx0ZXJQYXJhbXMgfSA9IHRoaXMuc3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RmlsdGVyUGFyYW1zID0geyAuLi5maWx0ZXJQYXJhbXMgfTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBpdGVtLmZpZWxkIHx8IGl0ZW0uZGF0YUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgbmV3RmlsdGVyUGFyYW1zW2tleV0gPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU2VhcmNoUmVmLmN1cnJlbnQ/LmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW1zOiB7IC4uLm5ld0ZpbHRlclBhcmFtcyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3J0UGFyYW0gPSB0aGlzLmdldFNvcnRQYXJhbSh0aGlzLnN0YXRlLnNvcnRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmxvYWQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgLi4ubmV3RmlsdGVyUGFyYW1zLCAuLi5zb3J0UGFyYW0gfSxcclxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy10YWJsZS1zZWFyY2gtYnV0dG9uXCIpfVxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAg5p+l6K+iXHJcbiAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9TcGFjZT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBmaWx0ZXJJY29uOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiA8U2VhcmNoT3V0bGluZWQgLz47XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgLi4ub2JqLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29sc1tpbmRleF0gPSBvYmo7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNvbHM7XHJcbiAgfVxyXG4gIHJlbmRlclRvb2xCYXIoKSB7XHJcbiAgICBsZXQgeyB0YWJsZVNpemUsIGNvbHVtbnMsIHNvcnRUeXBlIH0gPSB0aGlzLnN0YXRlO1xyXG4gICAgbGV0IHsgZmlsdGVyQ29sdW1uLCBjb2x1bW5zOiBjb2xMaXN0cywgdG9vbGJhciB9ID0gdGhpcy5wcm9wcztcclxuICAgIGNvbnN0IHsgdGFibGVUb29sLCBzdG9yZVJlcXVlc3RDb25maWcgPSB7fSB9ID0gY29uZmlnKCk7XHJcbiAgICBsZXQgdG9vbHMgPSBbXCJyZWZyZXNoXCIsIFwic2l6ZVwiLCBcInNvcnRcIiwgXCJjb2x1bW5cIl07XHJcbiAgICBsZXQgdG9vbHNDbGljayA9IHt9IGFzIGFueTtcclxuICAgIGlmICh0b29sYmFyID09IHRydWUpIHtcclxuICAgICAgdG9vbHMgPSBbXCJyZWZyZXNoXCIsIFwic2l6ZVwiLCBcInNvcnRcIiwgXCJjb2x1bW5cIl07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0b29scyA9IHRvb2xiYXIudG9vbHNcclxuICAgICAgICA/IHRvb2xiYXIudG9vbHNcclxuICAgICAgICA6IHRhYmxlVG9vbC50b29sc1xyXG4gICAgICAgID8gdGFibGVUb29sLnRvb2xzXHJcbiAgICAgICAgOiB0b29scztcclxuICAgICAgdG9vbHNDbGljayA9IHRvb2xiYXIub25Ub29sQ2xpY2sgPyB0b29sYmFyLm9uVG9vbENsaWNrIDoge307XHJcbiAgICB9XHJcbiAgICBjb25zdCBzaXplSXRlbSA9IFtcclxuICAgICAgeyB0aXRsZTogXCLlrr3mnb5cIiwga2V5OiBcImRlZmF1bHRcIiB9LFxyXG4gICAgICB7IHRpdGxlOiBcIuS4reetiVwiLCBrZXk6IFwibWlkZGxlXCIgfSxcclxuICAgICAgeyB0aXRsZTogXCLntKflh5FcIiwga2V5OiBcInNtYWxsXCIgfSxcclxuICAgIF07XHJcbiAgICBjb25zdCBzb3J0SXRlbSA9IFtcclxuICAgICAgeyB0aXRsZTogXCLljZXlrZfmrrXmjpLluo9cIiwga2V5OiBcInNpbmdsZVwiIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwi5aSa5a2X5q615o6S5bqPXCIsIGtleTogXCJtdWx0aXBsZVwiIH0sXHJcbiAgICBdO1xyXG4gICAgY29uc3Qgc29ydENvbnRlbnQgPSAoXHJcbiAgICAgIDw+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3NOYW1lPXtnZXRMZXNzKHN0eWxlcywgXCJuc2MtdGFibGUtY290ZW50LXRpdGxlXCIpfVxyXG4gICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgY3Vyc29yOiB0aGlzLnN0YXRlLmRlZmF1bHRTb3J0ID8gXCJub3QtYWxsb3dlZFwiIDogXCJwb2ludGVyXCIsXHJcbiAgICAgICAgICAgIGNvbG9yOiB0aGlzLnN0YXRlLmRlZmF1bHRTb3J0ICYmIFwicmdiYSgwLDAsMCwuNDUpXCIsXHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5kZWZhdWx0U29ydCkge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgc29ydGVyOiBbXSwgc29ydEluZm86IHt9LCBkZWZhdWx0U29ydDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0geyAuLi50aGlzLnN0YXRlLmZpbHRlclBhcmFtcyB9O1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLnJlbG9hZCh7IHBhcmFtcyB9KTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAg5oGi5aSN6buY6K6k5o6S5bqPXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAge3NvcnRJdGVtLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBrZXk9e2l0ZW0ua2V5fVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICBzb3J0ZXI6IFtdLFxyXG4gICAgICAgICAgICAgICAgICBzb3J0SW5mbzoge30sXHJcbiAgICAgICAgICAgICAgICAgIHNvcnRUeXBlOiBpdGVtLmtleSxcclxuICAgICAgICAgICAgICAgICAgZGVmYXVsdFNvcnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7IC4uLnRoaXMuc3RhdGUuZmlsdGVyUGFyYW1zIH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnJlbG9hZCh7IHBhcmFtcyB9KTtcclxuICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3NvcnRUeXBlID09IGl0ZW0ua2V5ID8gKFxyXG4gICAgICAgICAgICAgICAgPGE+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtnZXRMZXNzKHN0eWxlcywgXCJuc2MtdGFibGUtY29udGVudC10aWVtXCIpfT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IHdpZHRoOiAyMCB9fT5cclxuICAgICAgICAgICAgICAgICAgICAgIHtzb3J0VHlwZSA9PSBpdGVtLmtleSAmJiA8Q2hlY2tPdXRsaW5lZCAvPn1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PiB7aXRlbS50aXRsZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtnZXRMZXNzKHN0eWxlcywgXCJuc2MtdGFibGUtY29udGVudC10aWVtXCIpfT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyB3aWR0aDogMjAgfX0+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXY+IHtpdGVtLnRpdGxlfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pfVxyXG4gICAgICAgIHt0aGlzLnN0YXRlLnNvcnRlci5sZW5ndGggPiAwICYmIChcclxuICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy10YWJsZS1jb3RlbnQtdGl0bGVcIil9XHJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6IFwicmdiYSgwLDAsMCwuNDUpXCIgfX1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIOW9k+WJjeaOkuW6j1xyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAge3RoaXMuc3RhdGUuc29ydGVyLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy10YWJsZS1jb250ZW50LXRpZW1cIil9XHJcbiAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6IDIwIH19PlxyXG4gICAgICAgICAgICAgICAgICAgIHtpdGVtLm9yZGVyID09IFwiYXNjZW5kXCIgPyAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8U29ydEFzY2VuZGluZ091dGxpbmVkIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgIDxTb3J0RGVzY2VuZGluZ091dGxpbmVkIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXY+IHtpdGVtLmNvbHVtbi50aXRsZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgPC8+XHJcbiAgICAgICAgKX1cclxuICAgICAgPC8+XHJcbiAgICApO1xyXG4gICAgY29uc3Qgc2l6ZUNvbnRlbnQgPSAoXHJcbiAgICAgIDw+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy10YWJsZS1jb3RlbnQtdGl0bGVcIil9PlxyXG4gICAgICAgICAg6KGo5qC85a+G5bqmXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAge3NpemVJdGVtLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBrZXk9e2l0ZW0ua2V5fVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICB0YWJsZVNpemU6IGl0ZW0ua2V5LFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt0YWJsZVNpemUgPT0gaXRlbS5rZXkgPyAoXHJcbiAgICAgICAgICAgICAgICA8YT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy10YWJsZS1jb250ZW50LXRpZW1cIil9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6IDIwIH19PlxyXG4gICAgICAgICAgICAgICAgICAgICAge3RhYmxlU2l6ZSA9PSBpdGVtLmtleSAmJiA8Q2hlY2tPdXRsaW5lZCAvPn1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PiB7aXRlbS50aXRsZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtnZXRMZXNzKHN0eWxlcywgXCJuc2MtdGFibGUtY29udGVudC10aWVtXCIpfT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyB3aWR0aDogMjAgfX0+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXY+IHtpdGVtLnRpdGxlfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pfVxyXG4gICAgICA8Lz5cclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgZGVmYXVsdFNob3dDb2xzID0gY29sdW1ucy5maWx0ZXIoKGNvbHMpID0+IGNvbHMuaW5pdFNob3cgIT09IGZhbHNlKTtcclxuXHJcbiAgICBjb25zdCBjb250ZW50ID0gKFxyXG4gICAgICA8Q2hlY2tib3guR3JvdXBcclxuICAgICAgICBvbkNoYW5nZT17dGhpcy5maWx0ZXJDb2x1bW4uYmluZCh0aGlzKX1cclxuICAgICAgICBvcHRpb25zPXtjb2xMaXN0cy5tYXAoXHJcbiAgICAgICAgICAoY29sOiBDb2x1bW5UeXBlPHt9PiAmIHsgZmlsdGVyQ29sdW1uOiBib29sZWFuOyBkYXRhSW5kZXg6IGFueSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghY29sLmRhdGFJbmRleCkge1xyXG4gICAgICAgICAgICAgIGNvbC5kYXRhSW5kZXggPSBjb2wudGl0bGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICBsYWJlbDogY29sLnRpdGxlLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBjb2wuZGF0YUluZGV4LFxyXG4gICAgICAgICAgICAgIGRpc2FibGVkOiBjb2wuZmlsdGVyQ29sdW1uID09PSBmYWxzZSxcclxuICAgICAgICAgICAgfSBhcyBDaGVja2JveE9wdGlvblR5cGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKX1cclxuICAgICAgICAvLyBkZWZhdWx0VmFsdWU9e2RlZmF1bHRTaG93Q29scy5tYXAoKGNvbCkgPT4gY29sLmRhdGFJbmRleCl9XHJcbiAgICAgICAgdmFsdWU9e1xyXG4gICAgICAgICAgdGhpcy5zdGF0ZS5kZWZhdWx0Q2hlY2tcclxuICAgICAgICAgICAgPyBkZWZhdWx0U2hvd0NvbHMubWFwKChjb2wpID0+IGNvbC5kYXRhSW5kZXgpXHJcbiAgICAgICAgICAgIDogdGhpcy5zdGF0ZS5jaGVja0NvbHVtblxyXG4gICAgICAgIH1cclxuICAgICAgPjwvQ2hlY2tib3guR3JvdXA+XHJcbiAgICApO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgPGRpdiBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy10YWJsZS10b29sLWJhclwiKX0+XHJcbiAgICAgICAge3Rvb2xzLmluZGV4T2YoXCJjb2x1bW5cIikgPiAtMSAmJiAoXHJcbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGZvbnRTaXplOiAxNCB9fT5cclxuICAgICAgICAgICAgPFBvcG92ZXJcclxuICAgICAgICAgICAgICB0aXRsZT1cIumAieaLqeaYvuekuueahOWIl1wiXHJcbiAgICAgICAgICAgICAgY29udGVudD17Y29udGVudH1cclxuICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21SaWdodFwiXHJcbiAgICAgICAgICAgICAgdHJpZ2dlcj1cImNsaWNrXCJcclxuICAgICAgICAgICAgICBvdmVybGF5U3R5bGU9e3sgbWluV2lkdGg6IDQxMCwgbWF4V2lkdGg6IDQ1MCB9fVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPEFwcHN0b3JlT3V0bGluZWRcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Z2V0TGVzcyhzdHlsZXMsIFwibnNjLXRhYmxlLXRoLWFwcC1zdG9yZS1pY29uXCIpfVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvUG9wb3Zlcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICl9XHJcbiAgICAgICAge3Rvb2xzLmluZGV4T2YoXCJzb3J0XCIpID4gLTEgJiYgKFxyXG4gICAgICAgICAgPGRpdiBzdHlsZT17eyBtYXJnaW5SaWdodDogOCwgZm9udFNpemU6IDE0IH19PlxyXG4gICAgICAgICAgICA8UG9wb3ZlciBwbGFjZW1lbnQ9XCJib3R0b21cIiBjb250ZW50PXtzb3J0Q29udGVudH0gdHJpZ2dlcj1cImNsaWNrXCI+XHJcbiAgICAgICAgICAgICAgPFNvcnRBc2NlbmRpbmdPdXRsaW5lZCAvPlxyXG4gICAgICAgICAgICA8L1BvcG92ZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApfVxyXG4gICAgICAgIHt0b29scy5pbmRleE9mKFwic2l6ZVwiKSA+IC0xICYmIChcclxuICAgICAgICAgIDxkaXYgc3R5bGU9e3sgbWFyZ2luUmlnaHQ6IDgsIGZvbnRTaXplOiAxNCB9fT5cclxuICAgICAgICAgICAgPFBvcG92ZXIgcGxhY2VtZW50PVwiYm90dG9tXCIgY29udGVudD17c2l6ZUNvbnRlbnR9IHRyaWdnZXI9XCJjbGlja1wiPlxyXG4gICAgICAgICAgICAgIDxDb2x1bW5IZWlnaHRPdXRsaW5lZCAvPlxyXG4gICAgICAgICAgICA8L1BvcG92ZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApfVxyXG4gICAgICAgIHt0b29scy5pbmRleE9mKFwicmVmcmVzaFwiKSA+IC0xICYmIChcclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgc3R5bGU9e3sgbWFyZ2luUmlnaHQ6IDgsIGZvbnRTaXplOiAxNCwgY3Vyc29yOiBcInBvaW50ZXJcIiB9fVxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0geyAuLi50aGlzLnN0YXRlLmZpbHRlclBhcmFtcyB9O1xyXG4gICAgICAgICAgICAgIGlmICh0b29sc0NsaWNrLm9uUmVmcmVzaCkge1xyXG4gICAgICAgICAgICAgICAgdG9vbHNDbGljay5vblJlZnJlc2goKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5sb2FkKHsgcGFyYW1zIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPFJlZG9PdXRsaW5lZCAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgKX1cclxuICAgICAgPC9kaXY+XHJcbiAgICApO1xyXG4gIH1cclxuICBnZXRTZWxlY3RlZFJvd0tleXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zZWxlY3RlZFJvd0tleXM7XHJcbiAgfVxyXG4gIGdldFNlbGVjdGVkUm93RGF0YXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zZWxlY3RlZFJvd0RhdGFzO1xyXG4gIH1cclxuICByZXNldFNlbGVjdGVkUm93S2V5cygpIHtcclxuICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICBzZWxlY3RlZFJvd0tleXM6IFtdLFxyXG4gICAgICBzZWxlY3RlZFJvd0RhdGFzOiBbXSxcclxuICAgIH0pO1xyXG4gIH1cclxuICByb3dTZWxlY3Rpb25PblNlbGVjdChyZWNvcmQ6IGFueSwgc2VsZWN0ZWQ6IGFueSkge1xyXG4gICAgY29uc3QgeyBzZWxlY3RlZFJvd0tleXMsIHNlbGVjdGVkUm93RGF0YXMgfSA9IHRoaXMuc3RhdGU7XHJcbiAgICBsZXQgeyByb3dLZXkgPSBcImlkXCIgfSA9IHRoaXMucHJvcHM7XHJcbiAgICBsZXQgbmV3U2VsZWN0ZWRSb3dLZXlzID0gWy4uLnNlbGVjdGVkUm93S2V5c107XHJcbiAgICBsZXQgbmV3U2VsZWN0ZWRSb3dEYXRhcyA9IFsuLi5zZWxlY3RlZFJvd0RhdGFzXTtcclxuICAgIGlmIChzZWxlY3RlZCkge1xyXG4gICAgICBuZXdTZWxlY3RlZFJvd0tleXMgPSBbLi4ubmV3U2VsZWN0ZWRSb3dLZXlzLCByZWNvcmRbcm93S2V5XV07XHJcbiAgICAgIG5ld1NlbGVjdGVkUm93RGF0YXMgPSBbLi4ubmV3U2VsZWN0ZWRSb3dEYXRhcywgcmVjb3JkXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbGVjdGVkUm93S2V5cy5tYXAoKGl0ZW06IGFueSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtID09PSByZWNvcmRbcm93S2V5XSkge1xyXG4gICAgICAgICAgbmV3U2VsZWN0ZWRSb3dLZXlzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgc2VsZWN0ZWRSb3dEYXRhcy5tYXAoKGl0ZW06IGFueSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtW3Jvd0tleV0gPT09IHJlY29yZFtyb3dLZXldKSB7XHJcbiAgICAgICAgICBuZXdTZWxlY3RlZFJvd0RhdGFzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICBzZWxlY3RlZFJvd0tleXM6IG5ld1NlbGVjdGVkUm93S2V5cyxcclxuICAgICAgc2VsZWN0ZWRSb3dEYXRhczogbmV3U2VsZWN0ZWRSb3dEYXRhcyxcclxuICAgIH0pO1xyXG4gIH1cclxuICByb3dTZWxlY3Rpb25PblNlbGVjdEFsbChzZWxlY3RlZDogYW55LCBzZWxlY3RlZFJvd3M6IGFueSwgY2hhbmdlUm93czogYW55KSB7XHJcbiAgICBjb25zdCB7IHNlbGVjdGVkUm93S2V5cywgc2VsZWN0ZWRSb3dEYXRhcyB9ID0gdGhpcy5zdGF0ZTtcclxuICAgIGNvbnN0IHsgcm93S2V5ID0gXCJpZFwiIH0gPSB0aGlzLnByb3BzO1xyXG4gICAgbGV0IG5ld2lkczogYW55ID0gW107XHJcbiAgICBsZXQgbmV3ZGF0YXM6IGFueSA9IFtdO1xyXG4gICAgaWYgKGNoYW5nZVJvd3MubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgY2hhbmdlSWRzID0gY2hhbmdlUm93cy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbVtyb3dLZXldKTtcclxuICAgICAgaWYgKHNlbGVjdGVkKSB7XHJcbiAgICAgICAgbmV3aWRzID0gWy4uLnNlbGVjdGVkUm93S2V5cywgLi4uY2hhbmdlSWRzXTtcclxuICAgICAgICBuZXdkYXRhcyA9IFsuLi5zZWxlY3RlZFJvd0RhdGFzLCAuLi5jaGFuZ2VSb3dzXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZWxlY3RlZFJvd0tleXMubWFwKChpdGVtOiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChjaGFuZ2VJZHMuaW5kZXhPZihpdGVtKSA9PSAtMSkge1xyXG4gICAgICAgICAgICBuZXdpZHMucHVzaChpdGVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBzZWxlY3RlZFJvd0RhdGFzLm1hcCgoaXRlbTogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoY2hhbmdlSWRzLmluZGV4T2YoaXRlbVtyb3dLZXldKSA9PSAtMSkge1xyXG4gICAgICAgICAgICBuZXdkYXRhcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBuZXdpZHMgPSBbLi4uc2VsZWN0ZWRSb3dLZXlzXTtcclxuICAgICAgbmV3ZGF0YXMgPSBbLi4uc2VsZWN0ZWRSb3dEYXRhc107XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgc2VsZWN0ZWRSb3dLZXlzOiBbLi4ubmV3aWRzXSxcclxuICAgICAgc2VsZWN0ZWRSb3dEYXRhczogWy4uLm5ld2RhdGFzXSxcclxuICAgIH0pO1xyXG4gIH1cclxuICByZW5kZXIoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzLFxyXG4gICAgICB7XHJcbiAgICAgICAgbG9hZGluZyxcclxuICAgICAgICBkYXRhU291cmNlLFxyXG4gICAgICAgIHBhZ2luYXRpb24gPSB7fSxcclxuICAgICAgICBzZWFyY2hUZXh0LFxyXG4gICAgICAgIGZpZWxkT3B0aW9uLFxyXG4gICAgICAgIHNlYXJjaENvbG9yLFxyXG4gICAgICAgIHRhYmxlU2l6ZSxcclxuICAgICAgfSA9IHRoaXMuc3RhdGUsXHJcbiAgICAgIHByb3BzID0gdXRpbHMub21pdChcclxuICAgICAgICB0aGlzLnByb3BzLFxyXG4gICAgICAgIFtcclxuICAgICAgICAgIFwic3RvcmVcIixcclxuICAgICAgICAgIFwib25DaGFuZ2VcIixcclxuICAgICAgICAgIFwiY29sdW1uc1wiLFxyXG4gICAgICAgICAgXCJyZXNldENvbHVtblwiLFxyXG4gICAgICAgICAgXCJ0b29sYmFyXCIsXHJcbiAgICAgICAgICBcInNvcnRGaWVsZHNcIixcclxuICAgICAgICAgIFwiZmlsdGVyQ29sdW1uXCIsXHJcbiAgICAgICAgICBcInNvcnRTZWFyY2hcIixcclxuICAgICAgICAgIFwic2hvd1Jvd1NlbGVjdGlvblwiLFxyXG4gICAgICAgICAgXCJwYWdlVHlwZVwiLFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcm93S2V5OiBcImlkXCIsXHJcbiAgICAgICAgICBjbGlja0NoYW5nZUNvbG9yOiBmYWxzZSxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICBpZiAocHJvcHMucGFnaW5hdGlvbiAhPT0gZmFsc2UpIHtcclxuICAgICAgcHJvcHMucGFnaW5hdGlvbiA9IHtcclxuICAgICAgICBwb3NpdGlvbjogW1wiYm90dG9tUmlnaHRcIl0sXHJcbiAgICAgICAgc2hvd1NpemVDaGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgIHNob3dRdWlja0p1bXBlcjogdHJ1ZSxcclxuICAgICAgICAuLi5wYWdpbmF0aW9uLFxyXG4gICAgICAgIC4uLnByb3BzLnBhZ2luYXRpb24sXHJcbiAgICAgIH07XHJcbiAgICAgIGlmIChwcm9wcy5zaG93VG90YWwgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHByb3BzLnBhZ2luYXRpb24uc2hvd1RvdGFsID0gZnVuY3Rpb24gKHRvdGFsLCBbZnJvbSwgdG9dKSB7XHJcbiAgICAgICAgICAvLyByZXR1cm4gXCLmmL7npLogXCIgKyBmcm9tICsgXCIgLSBcIiArIHRvICsgXCLmnaHvvIzlhbEgXCIgKyB0b3RhbCArIFwiIOadoVwiO1xyXG4gICAgICAgICAgcmV0dXJuIFwi5YWxIFwiICsgdG90YWwgKyBcIiDmnaFcIjtcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBwcm9wcy5vbkNoYW5nZSA9IGZ1bmN0aW9uIChwYWdpbmF0aW9uLCBmaWx0ZXJzLCBzb3J0ZXIsIGV4dHJhKSB7XHJcbiAgICAgIF90aGlzLm9uQ2hhbmdlKF90aGlzLnN0YXRlLnBhZ2luYXRpb24sIGZpbHRlcnMsIHNvcnRlciwgZXh0cmEpO1xyXG4gICAgfTtcclxuICAgIGlmIChwcm9wcy5jbGlja0NoYW5nZUNvbG9yKSB7XHJcbiAgICAgIGNvbnN0IG9uUm93Rm4gPSBwcm9wcy5vblJvdztcclxuICAgICAgcHJvcHMub25Sb3cgPSBmdW5jdGlvbiAocmVjb3JkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBjdXN0b20gPSBvblJvd0ZuID8gb25Sb3dGbihyZWNvcmQsIGluZGV4KSA6IHt9O1xyXG4gICAgICAgIGNvbnN0IG9uQ2xpY2tGbiA9IGN1c3RvbS5vbkNsaWNrO1xyXG4gICAgICAgIGN1c3RvbS5vbkNsaWNrID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGFjdGl2ZUluZGV4OiBpbmRleCwgLy/ojrflj5bngrnlh7vooYznmoTntKLlvJVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdXRpbHMuY2FsbGJhY2sob25DbGlja0ZuLCBfdGhpcywgW2V2ZW50XSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gY3VzdG9tO1xyXG4gICAgICB9O1xyXG4gICAgICBwcm9wcy5yb3dDbGFzc05hbWUgPSBmdW5jdGlvbiAocmVjb3JkLCBpbmRleCkge1xyXG4gICAgICAgIHJldHVybiBpbmRleCA9PT0gX3RoaXMuc3RhdGUuYWN0aXZlSW5kZXhcclxuICAgICAgICAgID8gXCJuc2MtdGFibGUtY2xpY2tSb3dTdHlsZVwiXHJcbiAgICAgICAgICA6IFwiXCI7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBsZXQgbmV3RGF0YVNvdXJjZSA9IFtdO1xyXG4gICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAgICAgY29uc3QgZGF0YSA9IHRyZWVVdGlscy5nZXRTZWFyY2hNZW51RGF0YXMoXHJcbiAgICAgICAgdGhpcyxcclxuICAgICAgICBzZWFyY2hUZXh0LFxyXG4gICAgICAgIGZpZWxkT3B0aW9uLFxyXG4gICAgICAgIHNlYXJjaENvbG9yXHJcbiAgICAgICk7XHJcbiAgICAgIG5ld0RhdGFTb3VyY2UgPSBkYXRhLnRyZWVEYXRhcztcclxuICAgICAgcHJvcHMuZXhwYW5kZWRSb3dLZXlzID0gZGF0YS5vcGVuS2V5cztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ld0RhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xyXG4gICAgfVxyXG4gICAgcHJvcHMuc3RvcmUgPSBwcm9wcy5zdG9yZSB8fCB7fTtcclxuICAgIHByb3BzLnN0b3JlLmF1dG9Mb2FkID0gcHJvcHMuc3RvcmUuYXV0b0xvYWQgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgY29uc3QgeyBkcmFnYWJsZSB9ID0gX3RoaXMucHJvcHM7XHJcbiAgICBjb25zdCBkcmFnYWJsZVByb3BzID1cclxuICAgICAgZHJhZ2FibGUgPT09IHRydWVcclxuICAgICAgICA/IHtcclxuICAgICAgICAgICAgY29tcG9uZW50czogQm9keVJvd0NvbXBvbmVudCxcclxuICAgICAgICAgICAgb25Sb3c6IChyZWNvcmQsIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgICAgIGluZGV4LFxyXG4gICAgICAgICAgICAgIHJlY29yZCxcclxuICAgICAgICAgICAgICBtb3ZlUm93OiB0aGlzLm1vdmVSb3csXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDoge307XHJcbiAgICBsZXQgeyByZXNpemVDb2x1bW4gfSA9IHRoaXMucHJvcHM7XHJcblxyXG4gICAgY29uc3QgcmVzaXplUHJvcHMgPVxyXG4gICAgICByZXNpemVDb2x1bW4gPT09IHRydWUgPyB7IGNvbXBvbmVudHM6IHRoaXMuY29tcG9uZW50cyB9IDogbnVsbDtcclxuICAgIGNvbnN0IHsgdGFibGVUb29sIH0gPSBjb25maWcoKTtcclxuICAgIGxldCB0b29sRmxhZyA9IGZhbHNlO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ3RhYmxlVG9vbCcsdGFibGVUb29sKVxyXG5cclxuICAgIGlmICh0YWJsZVRvb2wuc2hvdyA9PT0gdHJ1ZSkge1xyXG4gICAgICB0b29sRmxhZz10cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucHJvcHMudG9vbGJhciAmJiB0aGlzLnByb3BzLnRvb2xiYXIuc2hvdyA9PT0gdHJ1ZSkge1xyXG4gICAgICB0b29sRmxhZyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wcm9wcy5zaG93Um93U2VsZWN0aW9uKSB7XHJcbiAgICAgIGNvbnN0IHsgcm93U2VsZWN0aW9uID0ge30gfSA9IHRoaXMucHJvcHM7XHJcbiAgICAgIHByb3BzID0ge1xyXG4gICAgICAgIC4uLnByb3BzLFxyXG4gICAgICAgIHJvd1NlbGVjdGlvbjoge1xyXG4gICAgICAgICAgc2VsZWN0ZWRSb3dLZXlzOiB0aGlzLnN0YXRlLnNlbGVjdGVkUm93S2V5cyxcclxuICAgICAgICAgIG9uU2VsZWN0OiB0aGlzLnJvd1NlbGVjdGlvbk9uU2VsZWN0LmJpbmQodGhpcyksXHJcbiAgICAgICAgICBvblNlbGVjdEFsbDogdGhpcy5yb3dTZWxlY3Rpb25PblNlbGVjdEFsbC5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgY29sdW1uV2lkdGg6IDQwLFxyXG4gICAgICAgICAgLi4ucm93U2VsZWN0aW9uLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IHRhYmxlUHJvcHM6IGNvbmZpZ1RhYmxlUHJvcHMgfSA9IGNvbmZpZygpO1xyXG4gICAgY29uc3QgRGVmYXVsdFRhYmxlID0gKFxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Z2V0TGVzcyhzdHlsZXMsIFwibnNjLXRhYmxlXCIpfT5cclxuICAgICAgICB7dG9vbEZsYWcgJiYgdGhpcy5yZW5kZXJUb29sQmFyKCl9XHJcbiAgICAgICAgPFRhYmxlXHJcbiAgICAgICAgICBjaGlsZHJlbkNvbHVtbk5hbWU9XCJjaGlsZE5vZGVzXCJcclxuICAgICAgICAgIHNoZWl0ZW1cclxuICAgICAgICAgIGRhdGFTb3VyY2U9e25ld0RhdGFTb3VyY2V9XHJcbiAgICAgICAgICBjb2x1bW5zPXt0aGlzLmdldENvbHVtbnMoKX1cclxuICAgICAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XHJcbiAgICAgICAgICBjbGFzc05hbWU9e2NscyhnZXRMZXNzKHN0eWxlcywgXCJuc2MtdGFibGUtY29udGVudFwiKSwgcHJvcHMuY2xhc3NOYW1lKX1cclxuICAgICAgICAgIGxvY2FsZT17e1xyXG4gICAgICAgICAgICBlbXB0eVRleHQ6IChcclxuICAgICAgICAgICAgICA8Tm9EYXRhIGNsYXNzTmFtZT17Z2V0TGVzcyhzdHlsZXMsIFwibnNjLXRhYmxlLW5vZGF0YVwiKX0gLz5cclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICBzY3JvbGw9e3sgeDogXCJtYXgtY29udGVudFwiIH19XHJcbiAgICAgICAgICB7Li4uY29uZmlnVGFibGVQcm9wc31cclxuICAgICAgICAgIHsuLi5yZXNpemVQcm9wc31cclxuICAgICAgICAgIHsuLi5wcm9wc31cclxuICAgICAgICAgIHsuLi5kcmFnYWJsZVByb3BzfVxyXG4gICAgICAgICAgc2l6ZT17dGFibGVTaXplfVxyXG4gICAgICAgICAgcGFnaW5hdGlvbj17ZmFsc2V9XHJcbiAgICAgICAgICAvLyBzdHlsZT17eyBoZWlnaHQ6IDYwMCB9fVxyXG4gICAgICAgIC8+XHJcbiAgICAgICAge3Byb3BzLnBhZ2luYXRpb24gIT09IGZhbHNlICYmIChcclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtnZXRMZXNzKHN0eWxlcywgXCJuc2MtdGFibGUtcGFnaW5hdGlvblwiKX0+XHJcbiAgICAgICAgICAgIDxQYWdpbmF0aW9uXHJcbiAgICAgICAgICAgICAgey4uLnByb3BzLnBhZ2luYXRpb259XHJcbiAgICAgICAgICAgICAgb25DaGFuZ2U9eyhwYWdlLCBwYWdlU2l6ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXh0cmEgPSB0aGlzLnN0YXRlLmV4dHJhO1xyXG4gICAgICAgICAgICAgICAgZXh0cmEuYWN0aW9uID0gXCJwYWdpbmF0ZVwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgoeyBwYWdpbmF0aW9uID0ge30gfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2luYXRpb246IHsgLi4ucGFnaW5hdGlvbiwgY3VycmVudDogcGFnZSwgcGFnZVNpemUgfSxcclxuICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShcclxuICAgICAgICAgICAgICAgICAgeyBjdXJyZW50OiBwYWdlLCBwYWdlU2l6ZSB9LFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmZpbHRlcixcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5zb3J0ZXIsXHJcbiAgICAgICAgICAgICAgICAgIGV4dHJhXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApfVxyXG4gICAgICA8L2Rpdj5cclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIGRyYWdhYmxlID09PSB0cnVlID8gKFxyXG4gICAgICA8RG5kUHJvdmlkZXIgYmFja2VuZD17SFRNTDVCYWNrZW5kfT57RGVmYXVsdFRhYmxlfTwvRG5kUHJvdmlkZXI+XHJcbiAgICApIDogKFxyXG4gICAgICBEZWZhdWx0VGFibGVcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB3aXRoWmhMb2NhbGUoTlNDVGFibGUpO1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQ0VBLGdCQUFnQixFQUNoQkMsYUFBYSxFQUNiQyxvQkFBb0IsRUFDcEJDLGNBQWMsRUFDZEMscUJBQXFCLEVBQ3JCQyxzQkFBc0IsRUFDdEJDLFlBQVksUUFDUCxtQkFBbUI7QUFDMUIsU0FBU0MsVUFBVSxRQUFRLG1CQUFtQjtBQUM5QyxPQUFPQyxLQUFLLElBQUlDLFNBQVMsUUFBb0IsYUFBYTtBQUMxRCxTQUFTQyxLQUFLLFFBQVEsdUJBQXVCO0FBZTdDLE9BQU8sS0FBS0MsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsV0FBVyxRQUFRLFdBQVc7QUFDdkMsT0FBT0MsT0FBTyxJQUFJQyxjQUFjLEVBQUVDLGFBQWEsUUFBUSxtQkFBbUI7QUFDMUUsT0FBT0MsU0FBUyxNQUFNLGlCQUFpQjtBQUN2QyxPQUFPLHFCQUFxQjtBQUM1QixNQUFNO0VBQUVDLGdCQUFnQjtFQUFFQztBQUFhLENBQUMsR0FBR0wsT0FBTztBQUNsRCxPQUFPTSxZQUFZLE1BQU0sd0JBQXdCO0FBQ2pELFNBQVNDLFNBQVMsUUFBUSxpQkFBaUI7QUFDM0MsT0FBTyxzQkFBc0I7QUFDN0IsU0FBU0MsT0FBTyxFQUFFQyxPQUFPLFFBQXlCLGFBQWE7QUFDL0QsT0FBT0MsTUFBTSxNQUFNLGtCQUFrQjtBQUNyQyxTQUFTQyxVQUFVLFFBQVEsbUJBQW1CO0FBQzlDLE9BQU9DLE1BQU0sTUFBTSxjQUFjO0FBRWpDLE9BQU9DLEdBQUcsTUFBTSxZQUFZO0FBRTVCLE1BQU1DLE1BQU0sR0FBRyxJQUFJOztBQU1uQjs7QUFxQ0EsU0FBU2IsY0FBYyxFQUFFQyxhQUFhO0FBRXRDLE1BQU1hLGVBQWUsR0FBSUMsS0FBVSxJQUFLO0VBQ3RDLE1BQU07TUFBRUMsUUFBUTtNQUFFQztJQUFvQixDQUFDLEdBQUdGLEtBQUs7SUFBbkJHLFNBQVMsR0FBQUMsd0JBQUEsQ0FBS0osS0FBSyxFQUFBSyxTQUFBO0VBQy9DLG9CQUNFdkIsS0FBQSxDQUFBd0IsYUFBQSxDQUFDZixTQUFTO0lBQ1JXLEtBQUssRUFBRUEsS0FBSyxJQUFJLEdBQUk7SUFDcEJLLE1BQU0sRUFBRSxDQUFFO0lBQ1ZOLFFBQVEsRUFBRUEsUUFBUztJQUNuQk8sYUFBYSxFQUFFO01BQUVDLG9CQUFvQixFQUFFO0lBQU07RUFBRSxnQkFFL0MzQixLQUFBLENBQUF3QixhQUFBLE9BQVFILFNBQVksQ0FDWCxDQUFDO0FBRWhCLENBQUM7QUFDRCxNQUFNTyxRQUFRLFNBQVM1QixLQUFLLENBQUM2QixTQUFTLENBQXNCO0VBZ0MxREMsV0FBV0EsQ0FBQ1osS0FBSyxFQUFFO0lBQUEsSUFBQWEsU0FBQTtJQUNqQixLQUFLLENBQUNiLEtBQUssQ0FBQztJQUFDYyxlQUFBLGdCQWhCUCxDQUFDLENBQUM7SUFBQUEsZUFBQSxpQ0FDRWhDLEtBQUssQ0FBQ2lDLFNBQVMsQ0FBaUIsQ0FBQztJQUFBRCxlQUFBLHNDQUM1QmhDLEtBQUssQ0FBQ2lDLFNBQVMsQ0FBTSxDQUFDO0lBQUFELGVBQUEsb0JBRTNCO01BQ1ZFLFlBQVksRUFBRSxJQUFJO01BQ2xCQyxJQUFJLEVBQUU7SUFDUixDQUFDO0lBQUFILGVBQUEscUJBRVk7TUFDWEksTUFBTSxFQUFFO1FBQ05DLElBQUksRUFBRXBCO01BQ1I7SUFDRixDQUFDO0lBQUFlLGVBQUEsdUJBNkZFTSxLQUFVLElBQ1gsQ0FBQ0MsQ0FBTSxFQUFBQyxJQUFBLEtBQW9CO01BQUEsSUFBbEI7UUFBRUM7TUFBVSxDQUFDLEdBQUFELElBQUE7TUFDcEIsTUFBTTtRQUFFRTtNQUFLLENBQUMsR0FBRyxJQUFJLENBQUNDLEtBQUs7TUFDM0IsTUFBTUMsV0FBVyxHQUFHLENBQUMsR0FBR0YsSUFBSSxDQUFDO01BQzdCRSxXQUFXLENBQUNOLEtBQUssQ0FBQyxHQUFBTyxhQUFBLENBQUFBLGFBQUEsS0FDYkQsV0FBVyxDQUFDTixLQUFLLENBQUM7UUFDckJsQixLQUFLLEVBQUVxQixJQUFJLENBQUNyQjtNQUFLLEVBQ2xCO01BQ0QsSUFBSSxDQUFDMEIsUUFBUSxDQUNYO1FBQ0VKLElBQUksRUFBRUU7TUFDUixDQUFDLEVBQ0QsTUFBTTtRQUNKO1FBQ0EsSUFBSSxDQUFDRyxVQUFVLENBQUMsQ0FBQztNQUNuQixDQUNGLENBQUM7SUFDSCxDQUFDO0lBQUFmLGVBQUEsd0JBa0JjZ0IsRUFBRSxJQUFLO01BQ3RCLE1BQU1DLElBQUksR0FBRyxPQUFPRCxFQUFFLENBQUNDLElBQUksS0FBSyxRQUFRLEdBQUdDLElBQUksQ0FBQ0MsS0FBSyxDQUFDSCxFQUFFLENBQUNDLElBQUksQ0FBQyxHQUFHRCxFQUFFLENBQUNDLElBQUk7TUFDeEUsSUFBSUcsS0FBSyxHQUFHLElBQUk7TUFDaEIsSUFBSUgsSUFBSSxDQUFDSSxTQUFTLElBQUksaUJBQWlCLEVBQUU7UUFDdkMsTUFBTTtVQUFFQztRQUFRLENBQUMsR0FBR0wsSUFBSTtRQUN4QixJQUNFSyxPQUFPLENBQUNiLElBQUksSUFBSSxTQUFTLElBQ3pCYSxPQUFPLENBQUNiLElBQUksSUFBSSxPQUFPLElBQ3ZCYSxPQUFPLENBQUNiLElBQUksSUFBSSxRQUFRLEVBQ3hCO1VBQ0FXLEtBQUssQ0FBQ04sUUFBUSxDQUFDO1lBQUVTLFNBQVMsRUFBRUQsT0FBTyxDQUFDYjtVQUFLLENBQUMsQ0FBQztRQUM3QztNQUNGO0lBQ0YsQ0FBQztJQXFJRDtBQUNGO0FBQ0E7SUFGRVQsZUFBQSxrQkFHVSxDQUFDd0IsU0FBUyxFQUFFQyxVQUFVLEVBQUVDLElBQUksRUFBRUMsTUFBTSxLQUFLO01BQ2pELE1BQU1QLEtBQUssR0FBRyxJQUFJO01BQ2xCLElBQUlRLFFBQVEsR0FBR0YsSUFBSSxDQUFDRyxNQUFNO01BQzFCLElBQUlDLFVBQVUsR0FBR0gsTUFBTSxDQUFDRSxNQUFNO01BQzlCRCxRQUFRLENBQUNHLFNBQVMsQ0FBQ0gsUUFBUSxFQUFFRSxVQUFVLENBQUM7TUFDeEMsSUFBSUUsR0FBRyxHQUFHSixRQUFRLENBQUNLLFVBQVUsQ0FBQ0MsZUFBZSxDQUFDLENBQUM7TUFDL0MsSUFBSUMsTUFBTSxHQUFHO1FBQ1hDLEVBQUUsRUFBRVIsUUFBUSxDQUFDUSxFQUFFO1FBQ2ZDLFFBQVEsRUFBRVQsUUFBUSxDQUFDVSxTQUFTLENBQUNELFFBQVE7UUFDckNMLEdBQUcsRUFBRUE7TUFDUCxDQUFDO01BRUQsSUFBSSxJQUFJLENBQUM5QyxLQUFLLENBQUNxRCxPQUFPLEVBQUU7UUFDdEIsSUFBSSxDQUFDckQsS0FBSyxDQUFDcUQsT0FBTyxDQUFDSixNQUFNLENBQUM7TUFDNUIsQ0FBQyxNQUFNO1FBQ0wsSUFBSSxDQUFDSyxLQUFLLENBQUNDLE1BQU0sQ0FBQyxDQUFDO01BQ3JCO0lBQ0YsQ0FBQztJQWxTQyxJQUFJQyxLQUFLLEdBQUd4RCxLQUFLLENBQUN5RCxJQUFJLElBQUksTUFBTTtJQUNoQyxJQUFJQyxXQUFXLEdBQUcvRCxVQUFVLENBQUMsZUFBZSxDQUFDO0lBQzdDLElBQUlnRSxRQUFRLEdBQUdoRSxVQUFVLENBQ3ZCK0QsV0FBVyxHQUFHQSxXQUFXLEdBQUcsV0FBVyxHQUFHLFdBQzVDLENBQUM7SUFDREMsUUFBUSxJQUFBOUMsU0FBQSxHQUFHOEMsUUFBUSxjQUFBOUMsU0FBQSx1QkFBUkEsU0FBQSxDQUFVK0MsT0FBTztJQUM1QixJQUFJLENBQUNuQyxLQUFLLEdBQUc7TUFDWG9DLFVBQVUsRUFBRSxFQUFFO01BQ2RDLE9BQU8sRUFBRSxFQUFFO01BQ1hDLE9BQU8sRUFBRSxLQUFLO01BQ2RDLFVBQVUsRUFBRSxDQUFDLENBQUM7TUFDZEMsV0FBVyxFQUFFLENBQUMsQ0FBQztNQUNmO01BQ0FDLFVBQVUsRUFBRSxJQUFJO01BQ2hCQyxXQUFXLEVBQUUsSUFBSTtNQUNqQkMsV0FBVyxFQUFFLElBQUk7TUFDakI1QyxJQUFJLEVBQUUsRUFBRTtNQUNSNkMsS0FBSyxFQUFFLEVBQUU7TUFDVEMsWUFBWSxFQUFFLENBQUMsQ0FBQztNQUNoQmpDLFNBQVMsRUFBRSxJQUFJLENBQUNyQyxLQUFLLENBQUN1QixJQUFJLElBQUlvQyxRQUFRLElBQUksU0FBUztNQUNuRFksUUFBUSxFQUFFLFFBQVE7TUFDbEJDLE1BQU0sRUFBRSxFQUFFO01BQUU7TUFDWkMsUUFBUSxFQUFFLENBQUMsQ0FBQztNQUNaQyxXQUFXLEVBQUUsSUFBSTtNQUNqQkMsV0FBVyxFQUFFLEVBQUU7TUFDZkMsWUFBWSxFQUFFLElBQUk7TUFDbEJDLGVBQWUsRUFBRSxFQUFFO01BQ25CQyxnQkFBZ0IsRUFBRSxFQUFFO01BQ3BCQyxNQUFNLEVBQUUsRUFBRTtNQUNWQyxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFDRCxJQUFJaEYsS0FBSyxDQUFDc0QsS0FBSyxZQUFZM0UsS0FBSyxFQUFFO01BQ2hDLElBQUksQ0FBQzJFLEtBQUssR0FBR3RELEtBQUssQ0FBQ3NELEtBQUs7SUFDMUIsQ0FBQyxNQUFNO01BQ0wsTUFBQTJCLEtBQUEsR0FDRWpGLEtBQUssQ0FBQ3NELEtBQUssSUFBSSxDQUFDLENBQUM7UUFEYjtVQUFFNEIsU0FBUyxFQUFFQyxjQUFjLEdBQUcsQ0FBQztRQUFnQixDQUFDLEdBQUFGLEtBQUE7UUFBWEcsU0FBUyxHQUFBaEYsd0JBQUEsQ0FBQTZFLEtBQUEsRUFBQUksVUFBQTtNQUVwRCxNQUFNQyxVQUFVLEdBQUEzRCxhQUFBLENBQUFBLGFBQUE7UUFDZDRELEtBQUssRUFBRSxPQUFPO1FBQ2RDLFNBQVMsRUFBRSxJQUFJO1FBQ2ZOLFNBQVMsRUFBRTtVQUNUbEUsWUFBWSxFQUFFQSxDQUFDc0MsS0FBSyxFQUFFbUMsT0FBTyxLQUFLO1lBQ2hDLElBQUksQ0FBQzdELFFBQVEsQ0FBQztjQUFFbUMsT0FBTyxFQUFFO1lBQUssQ0FBQyxDQUFDO1lBQ2hDbEYsS0FBSyxDQUFDNkcsUUFBUSxDQUFDUCxjQUFjLENBQUNuRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUNzQyxLQUFLLEVBQUVtQyxPQUFPLENBQUMsQ0FBQztVQUNyRSxDQUFDO1VBQ0RFLFdBQVcsRUFBRUEsQ0FBQzVELElBQUksRUFBRTZELFNBQVMsRUFBRXRDLEtBQUssS0FBSztZQUN2QyxJQUFJdUMsTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDN0YsS0FBSyxDQUFDZ0UsVUFBVSxLQUFLLEtBQUssQ0FBQztZQUMvQyxJQUFJNkIsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDN0YsS0FBSyxDQUFDNkQsVUFBVSxFQUFFO2NBQ3BDLElBQUksQ0FBQ2pDLFFBQVEsQ0FBQztnQkFDWmlDLFVBQVUsRUFBRStCLFNBQVM7Z0JBQ3JCNUIsVUFBVSxFQUFFVixLQUFLLENBQUN3QyxhQUFhLENBQUMsQ0FBQztnQkFDakMvQixPQUFPLEVBQUUsS0FBSztnQkFDZEUsV0FBVyxFQUFFLENBQUM7Y0FDaEIsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxNQUFNO2NBQ0wsSUFBSSxDQUFDckMsUUFBUSxDQUFDO2dCQUFFaUMsVUFBVSxFQUFFK0IsU0FBUztnQkFBRTdCLE9BQU8sRUFBRTtjQUFNLENBQUMsQ0FBQztZQUMxRDtZQUVBbEYsS0FBSyxDQUFDNkcsUUFBUSxDQUFDUCxjQUFjLENBQUNRLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FDL0M1RCxJQUFJLEVBQ0o2RCxTQUFTLEVBQ1R0QyxLQUFLLEVBQ0x1QyxNQUFNLENBQ1AsQ0FBQztVQUNKLENBQUM7VUFDRDVFLElBQUksRUFBRUEsQ0FBQ2MsSUFBSSxFQUFFNkQsU0FBUyxFQUFFdEMsS0FBSyxLQUFLO1lBQ2hDekUsS0FBSyxDQUFDNkcsUUFBUSxDQUFDUCxjQUFjLENBQUNsRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUNjLElBQUksRUFBRTZELFNBQVMsRUFBRXRDLEtBQUssQ0FBQyxDQUFDO1VBQ3JFLENBQUM7VUFDRHlDLFdBQVcsRUFBRUEsQ0FBQ0MsR0FBRyxFQUFFQyxRQUFRLEtBQUs7WUFDOUIsSUFBSSxDQUFDckUsUUFBUSxDQUFDO2NBQUVtQyxPQUFPLEVBQUU7WUFBTSxDQUFDLENBQUM7WUFDakNsRixLQUFLLENBQUM2RyxRQUFRLENBQUNQLGNBQWMsQ0FBQ1ksV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDQyxHQUFHLEVBQUVDLFFBQVEsQ0FBQyxDQUFDO1VBQ25FO1FBQ0YsQ0FBQztRQUNEbEUsSUFBSSxFQUFFcUQsU0FBUyxDQUFDckQsSUFBSSxHQUNoQnFELFNBQVMsQ0FBQ3JELElBQUksR0FDZC9CLEtBQUssQ0FBQzZELFVBQVUsR0FDaEI3RCxLQUFLLENBQUM2RCxVQUFVLEdBQ2hCO01BQUksR0FDTHVCLFNBQVM7UUFDWmMsUUFBUSxFQUFFZCxTQUFTLENBQUNjLFFBQVEsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHO01BQUksRUFDdEQ7TUFDRCxJQUFJLENBQUM1QyxLQUFLLEdBQUcsSUFBSTFFLFNBQVMsQ0FDeEJ1SCxNQUFNLENBQUNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRWQsVUFBVSxFQUFFO1FBQzVCdEIsVUFBVSxFQUFBckMsYUFBQTtVQUFJMEUsT0FBTyxFQUFFO1FBQUMsR0FBSyxJQUFJLENBQUNyRyxLQUFLLENBQUNnRSxVQUFVO01BQ3BELENBQUMsQ0FDSCxDQUFDO0lBQ0g7RUFDRjtFQXNCQXNDLGlCQUFpQkEsQ0FBQSxFQUFHO0lBQ2xCLE1BQU07TUFBRUM7SUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDdkcsS0FBSztJQUNuQyxJQUFJLENBQUN1RyxZQUFZLEVBQUU7TUFDakIsSUFBSSxDQUFDM0UsUUFBUSxDQUFDO1FBQUVrQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzlELEtBQUssQ0FBQzhELE9BQU87TUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQyxNQUFNO01BQ0wsSUFBSSxDQUFDbEMsUUFBUSxDQUFDO1FBQUVKLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDeEIsS0FBSyxDQUFDOEQsT0FBTztNQUFFLENBQUMsQ0FBQztJQUNsRDtJQUNBLE1BQU1SLEtBQUssR0FBRyxJQUFJLENBQUN0RCxLQUFLLENBQUNzRCxLQUFLO0lBQzlCLElBQUlBLEtBQUssSUFBSUEsS0FBSyxDQUFDdkIsSUFBSSxFQUFFO01BQ3ZCLElBQUksQ0FBQ3VCLEtBQUssQ0FBQ2tELE9BQU8sQ0FBQ2xELEtBQUssQ0FBQ3ZCLElBQUksQ0FBQztJQUNoQztJQUNBMEUsTUFBTSxDQUFDQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDQyxhQUFhLENBQUM7RUFDeEQ7RUFDQUMsb0JBQW9CQSxDQUFBLEVBQUc7SUFDckJILE1BQU0sQ0FBQ0ksbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQ0YsYUFBYSxDQUFDO0VBQzNEO0VBZ0JBRyxrQkFBa0JBLENBQUNDLFNBQVMsRUFBRUMsUUFBUSxFQUFFO0lBQ3RDLE1BQU07TUFBRVQ7SUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDdkcsS0FBSztJQUNuQyxJQUFJLENBQUN1RyxZQUFZLEVBQUU7TUFDakIsSUFBSSxJQUFJLENBQUN2RyxLQUFLLENBQUM4RCxPQUFPLEtBQUtpRCxTQUFTLENBQUNqRCxPQUFPLEVBQUU7UUFDNUMsSUFBSSxDQUFDbEMsUUFBUSxDQUFDO1VBQUVrQyxPQUFPLEVBQUUsSUFBSSxDQUFDOUQsS0FBSyxDQUFDOEQ7UUFBUSxDQUFDLENBQUM7TUFDaEQ7SUFDRixDQUFDLE1BQU07TUFDTCxJQUFJa0QsUUFBUSxDQUFDeEYsSUFBSSxLQUFLLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLEVBQUU7UUFDckMsSUFBSSxDQUFDeUYsV0FBVyxDQUFDLENBQUM7TUFDcEI7TUFDQSxJQUFJLElBQUksQ0FBQ2pILEtBQUssQ0FBQzhELE9BQU8sS0FBS2lELFNBQVMsQ0FBQ2pELE9BQU8sRUFBRTtRQUM1QyxJQUFJLENBQUNsQyxRQUFRLENBQUM7VUFDWkosSUFBSSxFQUFFLElBQUksQ0FBQ3hCLEtBQUssQ0FBQzhELE9BQU87VUFDeEJBLE9BQU8sRUFBRSxJQUFJLENBQUM5RCxLQUFLLENBQUM4RDtRQUN0QixDQUFDLENBQUM7TUFDSjtNQUNBLElBQUlpRCxTQUFTLENBQUN4RixJQUFJLEtBQUssSUFBSSxDQUFDdkIsS0FBSyxDQUFDdUIsSUFBSSxFQUFFO1FBQ3RDLElBQUksQ0FBQ0ssUUFBUSxDQUFDO1VBQUVTLFNBQVMsRUFBRSxJQUFJLENBQUNyQyxLQUFLLENBQUN1QjtRQUFLLENBQUMsQ0FBQztNQUMvQztJQUNGO0VBQ0Y7RUFDQTBGLFdBQVdBLENBQUEsRUFBRztJQUNaLE1BQU07TUFBRXpGO0lBQUssQ0FBQyxHQUFHLElBQUksQ0FBQ0MsS0FBSztJQUMzQixNQUFNeUYsT0FBWSxHQUFHLEVBQUU7SUFDdkIsSUFBSUMsS0FBSyxHQUFHM0YsSUFBSSxJQUFJLEVBQUU7SUFDdEIyRixLQUFLLENBQUNDLEdBQUcsQ0FBQyxDQUFDQyxHQUFRLEVBQUVqRyxLQUFVLEtBQUs7TUFDbEMsSUFBSWtHLElBQUksR0FBQTNGLGFBQUEsQ0FBQUEsYUFBQSxLQUNIMEYsR0FBRztRQUNORSxZQUFZLEVBQUdDLE1BQXNCLEtBQU07VUFDekN0SCxLQUFLLEVBQUVzSCxNQUFNLENBQUN0SCxLQUFLO1VBQ25CRCxRQUFRLEVBQUUsSUFBSSxDQUFDd0gsWUFBWSxDQUFDckcsS0FBSztRQUNuQyxDQUFDO01BQUMsRUFDSDtNQUNEOEYsT0FBTyxDQUFDUSxJQUFJLENBQUNKLElBQUksQ0FBQztJQUNwQixDQUFDLENBQUM7SUFDRixJQUFJLENBQUMxRixRQUFRLENBQUM7TUFDWmtDLE9BQU8sRUFBRW9EO0lBQ1gsQ0FBQyxDQUFDO0VBQ0o7O0VBRUE7QUFDRjtBQUNBO0VBQ0VTLGdCQUFnQkEsQ0FBQSxFQUFHO0lBQ2pCLElBQUksQ0FBQy9GLFFBQVEsQ0FBQztNQUFFcUMsV0FBVyxFQUFFLENBQUM7SUFBRSxDQUFDLENBQUM7SUFDbEMsT0FBTyxJQUFJO0VBQ2I7RUFFQTJELG9CQUFvQkEsQ0FBQSxFQUFHO0lBQ3JCLE9BQU8sSUFBSSxDQUFDdEUsS0FBSyxDQUFDd0MsYUFBYSxDQUFDLENBQUM7RUFDbkM7RUFFQStCLFFBQVFBLENBQUM3RCxVQUFVLEVBQUU4RCxPQUFPLEVBQUV0RCxNQUFNLEVBQUVRLEtBQUssRUFBRTtJQUMzQyxNQUFNO01BQ0orQyxZQUFZLEdBQUcsSUFBSTtNQUNuQkMsUUFBUTtNQUNSQyxjQUFjO01BQ2RKLFFBQVE7TUFDUnZFO0lBQ0YsQ0FBQyxHQUFHLElBQUksQ0FBQ3RELEtBQUs7SUFDZCxNQUFNO01BQUVzRTtJQUFhLENBQUMsR0FBRyxJQUFJLENBQUM3QyxLQUFLO0lBQ25DLE1BQU15RyxVQUFVLEdBQUdDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDNUQsTUFBTSxDQUFDO0lBQ3hDLElBQUl1RCxZQUFZLEtBQUssS0FBSyxJQUFJLENBQUN6RSxLQUFLLEVBQUU7TUFDcEN1RSxRQUFRLElBQUlBLFFBQVEsQ0FBQzdELFVBQVUsRUFBRThELE9BQU8sRUFBRXRELE1BQU0sRUFBRVEsS0FBSyxDQUFDO01BQ3hEO0lBQ0Y7SUFDQSxNQUFNcUQsZ0JBQWdCLEdBQUdBLENBQUEsS0FBTTtNQUM3QixJQUFJcEYsTUFBTSxHQUFHLENBQUMsQ0FNYjtNQUNELE1BQU00QyxNQUFNLEdBQUcsSUFBSSxDQUFDK0Isb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztNQUNoRCxJQUFJLENBQUNsSixVQUFVLENBQUNzRixVQUFVLENBQUMsRUFBRTtRQUMzQixNQUFNc0UsQ0FBQyxHQUFHO1VBQ1IsQ0FBQ3pDLE1BQU0sQ0FBQzBDLFVBQVUsSUFBSSxTQUFTLEdBQUd2RSxVQUFVLENBQUNxQyxPQUFPO1VBQ3BELENBQUNSLE1BQU0sQ0FBQzJDLFdBQVcsSUFBSSxNQUFNLEdBQUd4RSxVQUFVLENBQUN5RTtRQUM3QyxDQUFDO1FBQ0R0QyxNQUFNLENBQUNDLE1BQU0sQ0FBQ25ELE1BQU0sRUFBRXFGLENBQUMsQ0FBQztNQUMxQjtNQUNBLElBQUlJLFNBQVMsR0FBRyxJQUFJLENBQUNDLFlBQVksQ0FBQ25FLE1BQU0sRUFBRSxJQUFJLENBQUM7TUFDL0MsSUFBSTBELFVBQVUsRUFBRTtRQUNkLElBQUksQ0FBQ3RHLFFBQVEsQ0FBQztVQUFFNEM7UUFBTyxDQUFDLENBQUM7TUFDM0IsQ0FBQyxNQUFNLElBQUksQ0FBQzBELFVBQVUsSUFBSSxDQUFDeEosVUFBVSxDQUFDOEYsTUFBTSxDQUFDLEVBQUU7UUFDN0NBLE1BQU0sQ0FBQ2dELE1BQU0sSUFDWCxJQUFJLENBQUM1RixRQUFRLENBQUM7VUFBRTRDLE1BQU0sRUFBRSxDQUFDQSxNQUFNLENBQUM7VUFBRUUsV0FBVyxFQUFFO1FBQU0sQ0FBQyxDQUFDO01BQzNELENBQUMsTUFBTTtRQUNMLElBQUksQ0FBQzlDLFFBQVEsQ0FBQztVQUFFNEMsTUFBTSxFQUFFO1FBQUcsQ0FBQyxDQUFDO01BQy9CO01BQ0EsSUFBSSxDQUFDNUMsUUFBUSxDQUFDO1FBQ1prRyxPQUFPO1FBQ1A5QztNQUNGLENBQUMsQ0FBQztNQUNGL0IsTUFBTSxHQUFBdEIsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsS0FBUTJDLFlBQVksR0FBS3JCLE1BQU0sR0FBS3lGLFNBQVMsQ0FBRTtNQUNyRFYsUUFBUSxJQUFJLElBQUksQ0FBQzFFLEtBQUssQ0FBQ0MsTUFBTSxDQUFDO1FBQUVOO01BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxNQUFNMkYsVUFBVSxHQUFHLElBQUksQ0FBQzVJLEtBQUssQ0FBQzZILFFBQVE7SUFFdENJLGNBQWMsSUFBSUksZ0JBQWdCLENBQUMsQ0FBQztJQUNwQztJQUNBLElBQUlPLFVBQVUsRUFBRTtNQUNkL0osS0FBSyxDQUFDNkcsUUFBUSxDQUFDa0QsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDNUUsVUFBVSxFQUFFOEQsT0FBTyxFQUFFdEQsTUFBTSxFQUFFUSxLQUFLLENBQUMsQ0FBQztJQUN4RTtFQUNGO0VBRUE2RCxRQUFRQSxDQUFBLEVBQUc7SUFDVCxPQUFPLElBQUksQ0FBQ3ZGLEtBQUs7RUFDbkI7O0VBRUE7QUFDRjtBQUNBO0VBQ0V3RixRQUFRQSxDQUFBLEVBQUc7SUFDVCxPQUFPLElBQUksQ0FBQ3hGLEtBQUssQ0FBQ3dGLFFBQVEsQ0FBQyxDQUFDO0VBQzlCOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0VBQ0VDLFlBQVlBLENBQUNDLEdBQUcsRUFBRTdFLFdBQVcsRUFBRUMsV0FBVyxFQUFFO0lBQzFDLElBQUksQ0FBQ3hDLFFBQVEsQ0FBQztNQUNac0MsVUFBVSxFQUFFOEUsR0FBRztNQUNmN0UsV0FBVyxFQUFFQSxXQUFXO01BQ3hCQyxXQUFXLEVBQUVBO0lBQ2YsQ0FBQyxDQUFDO0VBQ0o7RUF3QkE2RSxZQUFZQSxDQUFDQyxZQUFZLEVBQUU7SUFDekIsSUFBSUEsWUFBWSxDQUFDQyxNQUFNLElBQUksQ0FBQyxFQUFFO01BQzVCQyxRQUFBLENBQVFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7TUFDMUI7SUFDRjtJQUNBLE1BQU1DLGFBQWEsR0FBRyxJQUFJLENBQUN0SixLQUFLLENBQUM4RCxPQUFPLENBQUNzRCxHQUFHLENBQUVDLEdBQW1CLElBQUs7TUFDcEUsTUFBTWtDLE1BQU0sR0FBQTVILGFBQUEsS0FBUTBGLEdBQUcsQ0FBNEM7TUFDbkUsSUFBSTZCLFlBQVksQ0FBQ00sUUFBUSxDQUFDbkMsR0FBRyxDQUFDb0MsU0FBUyxDQUFDLEVBQUU7UUFDeENGLE1BQU0sQ0FBQ0csUUFBUSxHQUFHLElBQUk7TUFDeEIsQ0FBQyxNQUFNO1FBQ0xILE1BQU0sQ0FBQ0csUUFBUSxHQUFHLEtBQUs7TUFDekI7TUFDQSxPQUFPSCxNQUFNO0lBQ2YsQ0FBQyxDQUFDO0lBQ0YsTUFBTTtNQUFFaEQ7SUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDdkcsS0FBSztJQUNuQyxJQUFJLENBQUN1RyxZQUFZLEVBQUU7TUFDakIsSUFBSSxDQUFDM0UsUUFBUSxDQUFDO1FBQ1prQyxPQUFPLEVBQUV3RixhQUFhO1FBQ3RCM0UsV0FBVyxFQUFFdUUsWUFBWTtRQUN6QnRFLFlBQVksRUFBRTtNQUNoQixDQUFDLENBQUM7SUFDSixDQUFDLE1BQU07TUFDTCxJQUFJLENBQUNoRCxRQUFRLENBQUM7UUFDWkosSUFBSSxFQUFFOEgsYUFBYTtRQUNuQjNFLFdBQVcsRUFBRXVFLFlBQVk7UUFDekJ0RSxZQUFZLEVBQUU7TUFDaEIsQ0FBQyxDQUFDO0lBQ0o7RUFDRjtFQUNBK0QsWUFBWUEsQ0FBQ25FLE1BQU0sRUFBcUI7SUFBQSxJQUFuQm1GLFNBQVMsR0FBQUMsU0FBQSxDQUFBVCxNQUFBLFFBQUFTLFNBQUEsUUFBQUMsU0FBQSxHQUFBRCxTQUFBLE1BQUcsS0FBSztJQUNwQyxNQUFNMUIsVUFBVSxHQUFHQyxLQUFLLENBQUNDLE9BQU8sQ0FBQzVELE1BQU0sQ0FBQztJQUN4QyxNQUFNO01BQUVzRixVQUFVLEdBQUc7SUFBSyxDQUFDLEdBQUcsSUFBSSxDQUFDOUosS0FBSztJQUN4QyxJQUFJLENBQUM4SixVQUFVLEVBQUU7TUFDZixPQUFPLENBQUMsQ0FBQztJQUNYO0lBQ0EsSUFBSXJGLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSXNGLFVBQVUsR0FBRyxFQUFFO0lBQ25CLElBQUksQ0FBQ3JMLFVBQVUsQ0FBQzhGLE1BQU0sQ0FBQyxJQUFJLENBQUMwRCxVQUFVLElBQUkxRCxNQUFNLENBQUNnRCxNQUFNLEVBQUU7TUFDdkR1QyxVQUFVLEdBQUcsQ0FDWDtRQUNFdkMsTUFBTSxFQUFFaEQsTUFBTSxDQUFDZ0QsTUFBTSxDQUFDd0MsS0FBSyxJQUFJeEYsTUFBTSxDQUFDZ0QsTUFBTSxDQUFDaUMsU0FBUztRQUN0RFEsR0FBRyxFQUFFekYsTUFBTSxDQUFDMEYsS0FBSyxJQUFJO01BQ3ZCLENBQUMsQ0FDRjtNQUNELElBQUkxRixNQUFNLENBQUNnRCxNQUFNLEVBQUUvQyxRQUFRLENBQUNELE1BQU0sQ0FBQ2dELE1BQU0sQ0FBQ2lDLFNBQVMsQ0FBQyxHQUFHakYsTUFBTSxDQUFDMEYsS0FBSztJQUNyRSxDQUFDLE1BQU0sSUFBSWhDLFVBQVUsRUFBRTtNQUNyQjFELE1BQU0sQ0FBQzJGLE9BQU8sQ0FBRUMsQ0FBQyxJQUFLO1FBQ3BCM0YsUUFBUSxDQUFDMkYsQ0FBQyxDQUFDNUMsTUFBTSxDQUFDaUMsU0FBUyxDQUFDLEdBQUdXLENBQUMsQ0FBQ0YsS0FBSztRQUN0QyxJQUFJRixLQUFLLEdBQUdJLENBQUMsQ0FBQzVDLE1BQU0sQ0FBQ3dDLEtBQUssSUFBSUksQ0FBQyxDQUFDNUMsTUFBTSxDQUFDaUMsU0FBUztRQUNoRE0sVUFBVSxDQUFDckMsSUFBSSxDQUFDO1VBQ2RGLE1BQU0sRUFBRXdDLEtBQUs7VUFDYkMsR0FBRyxFQUFFRyxDQUFDLENBQUNGLEtBQUssSUFBSTtRQUNsQixDQUFDLENBQUM7TUFDSixDQUFDLENBQUM7SUFDSjtJQUNBLElBQUlQLFNBQVMsRUFBRTtNQUNiLElBQUksQ0FBQy9ILFFBQVEsQ0FBQztRQUNaNkMsUUFBUSxFQUFFQTtNQUNaLENBQUMsQ0FBQztJQUNKO0lBQ0EsT0FBTztNQUFFc0YsVUFBVSxFQUFFL0gsSUFBSSxDQUFDcUksU0FBUyxDQUFDTixVQUFVO0lBQUUsQ0FBQztFQUNuRDtFQUNBTyxRQUFRQSxDQUFDakosQ0FBQyxFQUFFO0lBQ1YsTUFBTVMsRUFBRSxHQUFHMkUsTUFBTSxDQUFDOEQsS0FBSyxJQUFJbEosQ0FBQyxDQUFDLENBQUM7SUFDOUIsTUFBTW1KLFNBQVMsR0FBSUMsRUFBRSxJQUFLO01BQ3hCLE1BQU1DLFdBQVcsR0FBR0QsRUFBRTtNQUN0QixNQUFNRSxPQUFPLEdBQUdELFdBQVcsQ0FBQ0UscUJBQXFCLENBQUMsQ0FBQyxDQUFDMUssS0FBSztNQUN6RCxNQUFNMkssS0FBSyxHQUFHQyxRQUFRLENBQUNDLFdBQVcsQ0FBQyxDQUFDO01BQ3BDRixLQUFLLENBQUNHLFFBQVEsQ0FBQ04sV0FBVyxFQUFFLENBQUMsQ0FBQztNQUM5QkcsS0FBSyxDQUFDSSxNQUFNLENBQUNQLFdBQVcsRUFBRUEsV0FBVyxDQUFDUSxVQUFVLENBQUMvQixNQUFNLENBQUM7TUFDeEQsTUFBTWdDLFVBQVUsR0FBR04sS0FBSyxDQUFDRCxxQkFBcUIsQ0FBQyxDQUFDLENBQUMxSyxLQUFLO01BQ3RELE9BQU9pTCxVQUFVLEdBQUdSLE9BQU87SUFDN0IsQ0FBQztJQUNELE9BQU8sQ0FBQ0gsU0FBUyxDQUFDMUksRUFBRSxDQUFDVyxNQUFNLENBQUMsQ0FBQyxDQUFDO0VBQ2hDO0VBQ0EySSxrQkFBa0JBLENBQUNySixJQUE0QixFQUFFO0lBQy9DLElBQUksQ0FBQ0gsUUFBUSxDQUFDO01BQ1ppRCxlQUFlLEVBQUU5QztJQUNuQixDQUFDLENBQUM7RUFDSjtFQUNBc0osbUJBQW1CQSxDQUFDdEosSUFBbUIsRUFBRTtJQUN2QyxJQUFJLENBQUNILFFBQVEsQ0FBQztNQUNaa0QsZ0JBQWdCLEVBQUUvQztJQUNwQixDQUFDLENBQUM7RUFDSjtFQUNBRixVQUFVQSxDQUFBLEVBQUc7SUFDWCxNQUFNO01BQUVpQyxPQUFPO01BQUVTLFFBQVE7TUFBRUU7SUFBUyxDQUFDLEdBQUcsSUFBSSxDQUFDaEQsS0FBSztJQUNsRCxNQUFNO01BQUU2SixVQUFVLEdBQUcsRUFBRTtNQUFFL0osSUFBSSxHQUFHO0lBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQ3ZCLEtBQUs7SUFDdEQsTUFBTXVMLGVBQWUsR0FBR3pILE9BQU8sQ0FBQ2lCLE1BQU0sQ0FBRXZELElBQUksSUFBS0EsSUFBSSxDQUFDa0ksUUFBUSxLQUFLLEtBQUssQ0FBQztJQUN6RSxNQUFNbEksSUFBSSxHQUFHK0osZUFBZSxDQUFDbkUsR0FBRyxDQUFDLENBQUNDLEdBQUcsRUFBRWpHLEtBQUssS0FBSztNQUMvQztNQUNBLElBQUlpRyxHQUFHLENBQUNtRSxRQUFRLElBQUksQ0FBQ25FLEdBQUcsQ0FBQ29FLE1BQU0sRUFBRTtRQUMvQnBFLEdBQUcsQ0FBQ21FLFFBQVEsR0FBRztVQUNiRSxTQUFTLEVBQUU7UUFDYixDQUFDO1FBQ0RyRSxHQUFHLENBQUNvRSxNQUFNLEdBQUcsQ0FBQ0UsSUFBSSxFQUFFaEosTUFBTSxFQUFFdkIsS0FBSyxLQUFLO1VBQUEsSUFBQXdLLGdCQUFBO1VBQ3BDO1VBQ0EsTUFBTUMsVUFBVSxJQUFBRCxnQkFBQSxHQUFHLElBQUksQ0FBQ25LLEtBQUssQ0FBQ0QsSUFBSSxjQUFBb0ssZ0JBQUEsdUJBQWZBLGdCQUFBLENBQWlCRSxJQUFJLENBQUVDLENBQUMsSUFBSztZQUM5QztZQUNBLElBQUk1RCxLQUFLLENBQUNDLE9BQU8sQ0FBQzJELENBQUMsQ0FBQ3RDLFNBQVMsQ0FBQyxJQUFJdEIsS0FBSyxDQUFDQyxPQUFPLENBQUNmLEdBQUcsQ0FBQ29DLFNBQVMsQ0FBQyxFQUFFO2NBQzlELE9BQ0V6SCxJQUFJLENBQUNxSSxTQUFTLENBQUMwQixDQUFDLENBQUN0QyxTQUFTLENBQUMsS0FBS3pILElBQUksQ0FBQ3FJLFNBQVMsQ0FBQ2hELEdBQUcsQ0FBQ29DLFNBQVMsQ0FBQztZQUVqRTtZQUNBLE9BQU9zQyxDQUFDLENBQUN0QyxTQUFTLEtBQUtwQyxHQUFHLENBQUNvQyxTQUFTO1VBQ3RDLENBQUMsQ0FBQztVQUVGLE1BQU11QyxXQUFXLEdBQUcsQ0FBQUgsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQUUzTCxLQUFLLEtBQUltSCxHQUFHLENBQUNuSCxLQUFLO1VBQ2xELElBQUkrTCxRQUFhLEdBQUcsTUFBTTtVQUUxQixJQUFJRCxXQUFXLEVBQUU7WUFDZixNQUFNekssSUFBSSxHQUFHLElBQUksQ0FBQ0UsS0FBSyxDQUFDWSxTQUFTLElBQUksSUFBSSxDQUFDckMsS0FBSyxDQUFDdUIsSUFBSSxJQUFJLFNBQVM7WUFDakUsTUFBTTJLLFdBQVcsR0FBRztjQUNsQkMsS0FBSyxFQUFFLEVBQUU7Y0FDVEMsTUFBTSxFQUFFLEVBQUU7Y0FDVkMsT0FBTyxFQUFFLEVBQUU7Y0FDWEMsS0FBSyxFQUFFO1lBQ1QsQ0FBQztZQUNELE1BQU1DLFlBQVksR0FBR0wsV0FBVyxDQUFDM0ssSUFBSSxDQUFDLElBQUksRUFBRTtZQUU1QyxJQUFJeUssV0FBVyxHQUFHTyxZQUFZLEVBQUU7Y0FDOUJOLFFBQVEsR0FBR0QsV0FBVyxHQUFHTyxZQUFZO1lBQ3ZDLENBQUMsTUFBTTtjQUNMTixRQUFRLEdBQUdELFdBQVc7WUFDeEI7VUFDRjtVQUVBLG9CQUNFbE4sS0FBQSxDQUFBd0IsYUFBQTtZQUFLa00sS0FBSyxFQUFFO2NBQUVDLE9BQU8sRUFBRSxjQUFjO2NBQUV2TSxLQUFLLEVBQUU7WUFBTztVQUFFLGdCQUNyRHBCLEtBQUEsQ0FBQXdCLGFBQUE7WUFDRW9NLEdBQUcsRUFBR2pDLEVBQUUsSUFBSztjQUNYLElBQUlBLEVBQUUsRUFBRTtnQkFDTjtnQkFDQUEsRUFBRSxDQUFDa0MsZUFBZSxDQUFDLE9BQU8sQ0FBQzs7Z0JBRTNCO2dCQUNBLElBQUlsQyxFQUFFLENBQUNtQyxXQUFXLEdBQUduQyxFQUFFLENBQUNvQyxXQUFXLEVBQUU7a0JBQ25DcEMsRUFBRSxDQUFDcUMsWUFBWSxDQUFDLE9BQU8sRUFBRW5CLElBQUksQ0FBQztnQkFDaEM7Y0FDRjtZQUNGLENBQUU7WUFDRm9CLFNBQVMsRUFBRXZOLE9BQU8sQ0FBQ00sTUFBTSxFQUFFLGdCQUFnQixDQUFFO1lBQzdDME0sS0FBSyxFQUFFO2NBQ0x0TSxLQUFLLEVBQUUrTCxRQUFRO2NBQ2ZlLFFBQVEsRUFBRSxRQUFRO2NBQ2xCQyxZQUFZLEVBQUUsVUFBVTtjQUN4QkMsVUFBVSxFQUFFO1lBQ2Q7VUFBRSxHQUVEdkIsSUFDRSxDQUNGLENBQUM7UUFFVixDQUFDO01BQ0g7TUFDQSxJQUFJTCxVQUFVLENBQUM2QixPQUFPLENBQUM5RixHQUFHLENBQUNvQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUMxQyxJQUFJbEYsUUFBUSxJQUFJLFFBQVEsRUFBRTtVQUN4QjhDLEdBQUcsQ0FBQzdDLE1BQU0sR0FBRyxJQUFJO1VBQ2pCNkMsR0FBRyxDQUFDK0YsU0FBUyxHQUFHM0ksUUFBUSxDQUFDNEMsR0FBRyxDQUFDb0MsU0FBUyxDQUFDLEdBQ25DaEYsUUFBUSxDQUFDNEMsR0FBRyxDQUFDb0MsU0FBUyxDQUFDLEdBQ3ZCLElBQUk7UUFDVixDQUFDLE1BQU0sSUFBSWxGLFFBQVEsSUFBSSxVQUFVLEVBQUU7VUFDakM4QyxHQUFHLENBQUM3QyxNQUFNLEdBQUc7WUFBRTZJLFFBQVEsRUFBRWpNO1VBQU0sQ0FBQztVQUNoQ2lHLEdBQUcsQ0FBQytGLFNBQVMsR0FBRzNJLFFBQVEsQ0FBQzRDLEdBQUcsQ0FBQ29DLFNBQVMsQ0FBQyxHQUNuQ2hGLFFBQVEsQ0FBQzRDLEdBQUcsQ0FBQ29DLFNBQVMsQ0FBQyxHQUN2QixJQUFJO1FBQ1Y7TUFDRjtNQUNBLE9BQU9wQyxHQUFHO0lBQ1osQ0FBQyxDQUFDO0lBQ0Y3RixJQUFJLENBQUM0RixHQUFHLENBQUMsQ0FBQ2tHLElBQUksRUFBRWxNLEtBQUssS0FBSztNQUN4QixJQUFJLENBQUMxQyxVQUFVLENBQUM0TyxJQUFJLENBQUNDLFdBQVcsQ0FBQyxFQUFFO1FBQ2pDLElBQUlDLEdBQUcsR0FBQTdMLGFBQUEsS0FBUTJMLElBQUksQ0FBRTtRQUNyQixNQUFNO1VBQUU3SixJQUFJO1VBQUV6RCxLQUFLO1VBQUV5TjtRQUFVLENBQUMsR0FBR0gsSUFBSSxDQUFDQyxXQUFXO1FBQ25ELElBQUlHLEdBQUcsR0FBRyxJQUFJO1FBQ2QsSUFBSS9CLElBQUksR0FBRzJCLElBQUksQ0FBQ0ssS0FBSztRQUNyQkQsR0FBRyxHQUFHak8sT0FBTyxDQUFDZ0UsSUFBSSxFQUFBOUIsYUFBQSxDQUFBQSxhQUFBO1VBQ2hCaU0sV0FBVyxpQkFBQUMsTUFBQSxDQUFPbEMsSUFBSTtRQUFFLEdBQ3JCM0wsS0FBSztVQUNSME0sR0FBRyxFQUFFLElBQUksQ0FBQ29CO1FBQWMsRUFDekIsQ0FBQztRQUNGTixHQUFHLEdBQUE3TCxhQUFBO1VBQ0RvTSxjQUFjLEVBQUVDLEtBQUEsSUFLVjtZQUFBLElBTFc7Y0FDZkMsZUFBZTtjQUNmQyxZQUFZO2NBQ1pDLE9BQU87Y0FDUEM7WUFDRixDQUFDLEdBQUFKLEtBQUE7WUFDQyxvQkFDRWxQLEtBQUEsQ0FBQXdCLGFBQUE7Y0FBS3lNLFNBQVMsRUFBRXZOLE9BQU8sQ0FBQ00sTUFBTSxFQUFFLGtCQUFrQjtZQUFFLGdCQUNsRGhCLEtBQUEsQ0FBQXdCLGFBQUE7Y0FBS3lNLFNBQVMsRUFBRXZOLE9BQU8sQ0FBQ00sTUFBTSxFQUFFLHdCQUF3QjtZQUFFLEdBQ3ZENE4sR0FDRSxDQUFDLGVBQ041TyxLQUFBLENBQUF3QixhQUFBLENBQUErTixNQUFBLHFCQUNFdlAsS0FBQSxDQUFBd0IsYUFBQSxDQUFBZ08sT0FBQTtjQUNFN0ssSUFBSSxFQUFDLFNBQVM7Y0FDZDhLLE9BQU8sRUFBRUEsQ0FBQSxLQUFNO2dCQUFBLElBQUFDLHFCQUFBO2dCQUNiTCxPQUFPLENBQUMsQ0FBQztnQkFDVCxNQUFNO2tCQUFFN0o7Z0JBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQzdDLEtBQUs7Z0JBQ25DLElBQUlnTixlQUFlLEdBQUE5TSxhQUFBLEtBQVEyQyxZQUFZLENBQUU7Z0JBQ3pDLElBQUlvSyxHQUFHLEdBQUdwQixJQUFJLENBQUN0RCxLQUFLLElBQUlzRCxJQUFJLENBQUM3RCxTQUFTO2dCQUN0Q2dGLGVBQWUsQ0FBQ0MsR0FBRyxDQUFDLElBQUFGLHFCQUFBLEdBQ2xCLElBQUksQ0FBQ1YsY0FBYyxDQUFDekgsT0FBTyxjQUFBbUkscUJBQUEsdUJBQTNCQSxxQkFBQSxDQUE2QkcsUUFBUSxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQy9NLFFBQVEsQ0FBQztrQkFDWjBDLFlBQVksRUFBQTNDLGFBQUEsS0FBTzhNLGVBQWU7Z0JBQ3BDLENBQUMsQ0FBQztnQkFDRixNQUFNRyxTQUFTLEdBQUcsSUFBSSxDQUFDakcsWUFBWSxDQUFDLElBQUksQ0FBQ2xILEtBQUssQ0FBQytDLE1BQU0sQ0FBQztnQkFDdEQsSUFBSSxDQUFDbEIsS0FBSyxDQUFDckMsSUFBSSxDQUFDO2tCQUNkZ0MsTUFBTSxFQUFBdEIsYUFBQSxDQUFBQSxhQUFBLEtBQU84TSxlQUFlLEdBQUtHLFNBQVM7Z0JBQzVDLENBQUMsQ0FBQztjQUNKLENBQUU7Y0FDRnJOLElBQUksRUFBQyxPQUFPO2NBQ1p3TCxTQUFTLEVBQUV2TixPQUFPLENBQUNNLE1BQU0sRUFBRSx5QkFBeUI7WUFBRSxHQUN2RCxjQUVPLENBQ0gsQ0FDSixDQUFDO1VBRVYsQ0FBQztVQUNEK08sVUFBVSxFQUFFQSxDQUFBLEtBQU07WUFDaEIsb0JBQU8vUCxLQUFBLENBQUF3QixhQUFBLENBQUNoQyxjQUFjLE1BQUUsQ0FBQztVQUMzQjtRQUFDLEdBQ0VrUCxHQUFHLENBQ1A7UUFDRGhNLElBQUksQ0FBQ0osS0FBSyxDQUFDLEdBQUdvTSxHQUFHO01BQ25CO0lBQ0YsQ0FBQyxDQUFDO0lBQ0YsT0FBT2hNLElBQUk7RUFDYjtFQUNBc04sYUFBYUEsQ0FBQSxFQUFHO0lBQ2QsSUFBSTtNQUFFek0sU0FBUztNQUFFeUIsT0FBTztNQUFFUztJQUFTLENBQUMsR0FBRyxJQUFJLENBQUM5QyxLQUFLO0lBQ2pELElBQUk7TUFBRXdILFlBQVk7TUFBRW5GLE9BQU8sRUFBRWlMLFFBQVE7TUFBRUM7SUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDaFAsS0FBSztJQUM3RCxNQUFNO01BQUVpUCxTQUFTO01BQUVDLGtCQUFrQixHQUFHLENBQUM7SUFBRSxDQUFDLEdBQUd0UCxNQUFNLENBQUMsQ0FBQztJQUN2RCxJQUFJdVAsS0FBSyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDO0lBQ2pELElBQUlDLFVBQVUsR0FBRyxDQUFDLENBQVE7SUFDMUIsSUFBSUosT0FBTyxJQUFJLElBQUksRUFBRTtNQUNuQkcsS0FBSyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDO0lBQy9DLENBQUMsTUFBTTtNQUNMQSxLQUFLLEdBQUdILE9BQU8sQ0FBQ0csS0FBSyxHQUNqQkgsT0FBTyxDQUFDRyxLQUFLLEdBQ2JGLFNBQVMsQ0FBQ0UsS0FBSyxHQUNmRixTQUFTLENBQUNFLEtBQUssR0FDZkEsS0FBSztNQUNUQyxVQUFVLEdBQUdKLE9BQU8sQ0FBQ0ssV0FBVyxHQUFHTCxPQUFPLENBQUNLLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDN0Q7SUFDQSxNQUFNQyxRQUFRLEdBQUcsQ0FDZjtNQUFFM0IsS0FBSyxFQUFFLElBQUk7TUFBRWUsR0FBRyxFQUFFO0lBQVUsQ0FBQyxFQUMvQjtNQUFFZixLQUFLLEVBQUUsSUFBSTtNQUFFZSxHQUFHLEVBQUU7SUFBUyxDQUFDLEVBQzlCO01BQUVmLEtBQUssRUFBRSxJQUFJO01BQUVlLEdBQUcsRUFBRTtJQUFRLENBQUMsQ0FDOUI7SUFDRCxNQUFNYSxRQUFRLEdBQUcsQ0FDZjtNQUFFNUIsS0FBSyxFQUFFLE9BQU87TUFBRWUsR0FBRyxFQUFFO0lBQVMsQ0FBQyxFQUNqQztNQUFFZixLQUFLLEVBQUUsT0FBTztNQUFFZSxHQUFHLEVBQUU7SUFBVyxDQUFDLENBQ3BDO0lBQ0QsTUFBTWMsV0FBVyxnQkFDZjFRLEtBQUEsQ0FBQXdCLGFBQUEsQ0FBQXhCLEtBQUEsQ0FBQTJRLFFBQUEscUJBQ0UzUSxLQUFBLENBQUF3QixhQUFBO01BQ0V5TSxTQUFTLEVBQUV2TixPQUFPLENBQUNNLE1BQU0sRUFBRSx3QkFBd0IsQ0FBRTtNQUNyRDBNLEtBQUssRUFBRTtRQUNMa0QsTUFBTSxFQUFFLElBQUksQ0FBQ2pPLEtBQUssQ0FBQ2lELFdBQVcsR0FBRyxhQUFhLEdBQUcsU0FBUztRQUMxRGlMLEtBQUssRUFBRSxJQUFJLENBQUNsTyxLQUFLLENBQUNpRCxXQUFXLElBQUk7TUFDbkMsQ0FBRTtNQUNGNkosT0FBTyxFQUFFQSxDQUFBLEtBQU07UUFDYixJQUFJLElBQUksQ0FBQzlNLEtBQUssQ0FBQ2lELFdBQVcsRUFBRTtVQUMxQjtRQUNGO1FBQ0EsSUFBSSxDQUFDOUMsUUFBUSxDQUFDO1VBQUU0QyxNQUFNLEVBQUUsRUFBRTtVQUFFQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1VBQUVDLFdBQVcsRUFBRTtRQUFLLENBQUMsQ0FBQztRQUM5RCxNQUFNekIsTUFBTSxHQUFBdEIsYUFBQSxLQUFRLElBQUksQ0FBQ0YsS0FBSyxDQUFDNkMsWUFBWSxDQUFFO1FBQzdDLElBQUksQ0FBQ2hCLEtBQUssQ0FBQ0MsTUFBTSxDQUFDO1VBQUVOO1FBQU8sQ0FBQyxDQUFDO01BQy9CO0lBQUUsR0FDSCxzQ0FFSSxDQUFDLEVBQ0xzTSxRQUFRLENBQUNuSSxHQUFHLENBQUMsQ0FBQ2tHLElBQUksRUFBRWxNLEtBQUssS0FBSztNQUM3QixvQkFDRXRDLEtBQUEsQ0FBQXdCLGFBQUE7UUFDRW9PLEdBQUcsRUFBRXBCLElBQUksQ0FBQ29CLEdBQUk7UUFDZEgsT0FBTyxFQUFFQSxDQUFBLEtBQU07VUFDYixJQUFJLENBQUMzTSxRQUFRLENBQUM7WUFDWjRDLE1BQU0sRUFBRSxFQUFFO1lBQ1ZDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDWkYsUUFBUSxFQUFFK0ksSUFBSSxDQUFDb0IsR0FBRztZQUNsQmhLLFdBQVcsRUFBRTtVQUNmLENBQUMsQ0FBQztVQUNGLE1BQU16QixNQUFNLEdBQUF0QixhQUFBLEtBQVEsSUFBSSxDQUFDRixLQUFLLENBQUM2QyxZQUFZLENBQUU7VUFDN0MsSUFBSSxDQUFDaEIsS0FBSyxDQUFDQyxNQUFNLENBQUM7WUFBRU47VUFBTyxDQUFDLENBQUM7UUFDL0I7TUFBRSxHQUVEc0IsUUFBUSxJQUFJK0ksSUFBSSxDQUFDb0IsR0FBRyxnQkFDbkI1UCxLQUFBLENBQUF3QixhQUFBLHlCQUNFeEIsS0FBQSxDQUFBd0IsYUFBQTtRQUFLeU0sU0FBUyxFQUFFdk4sT0FBTyxDQUFDTSxNQUFNLEVBQUUsd0JBQXdCO01BQUUsZ0JBQ3hEaEIsS0FBQSxDQUFBd0IsYUFBQTtRQUFLa00sS0FBSyxFQUFFO1VBQUV0TSxLQUFLLEVBQUU7UUFBRztNQUFFLEdBQ3ZCcUUsUUFBUSxJQUFJK0ksSUFBSSxDQUFDb0IsR0FBRyxpQkFBSTVQLEtBQUEsQ0FBQXdCLGFBQUEsQ0FBQ2xDLGFBQWEsTUFBRSxDQUN0QyxDQUFDLGVBQ05VLEtBQUEsQ0FBQXdCLGFBQUEsY0FBSyxHQUFDLEVBQUNnTixJQUFJLENBQUNLLEtBQVcsQ0FDcEIsQ0FDSixDQUFDLGdCQUVKN08sS0FBQSxDQUFBd0IsYUFBQTtRQUFLeU0sU0FBUyxFQUFFdk4sT0FBTyxDQUFDTSxNQUFNLEVBQUUsd0JBQXdCO01BQUUsZ0JBQ3hEaEIsS0FBQSxDQUFBd0IsYUFBQTtRQUFLa00sS0FBSyxFQUFFO1VBQUV0TSxLQUFLLEVBQUU7UUFBRztNQUFFLENBQU0sQ0FBQyxlQUNqQ3BCLEtBQUEsQ0FBQXdCLGFBQUEsY0FBSyxHQUFDLEVBQUNnTixJQUFJLENBQUNLLEtBQVcsQ0FDcEIsQ0FFSixDQUFDO0lBRVYsQ0FBQyxDQUFDLEVBQ0QsSUFBSSxDQUFDbE0sS0FBSyxDQUFDK0MsTUFBTSxDQUFDMkUsTUFBTSxHQUFHLENBQUMsaUJBQzNCckssS0FBQSxDQUFBd0IsYUFBQSxDQUFBeEIsS0FBQSxDQUFBMlEsUUFBQSxxQkFDRTNRLEtBQUEsQ0FBQXdCLGFBQUE7TUFDRXlNLFNBQVMsRUFBRXZOLE9BQU8sQ0FBQ00sTUFBTSxFQUFFLHdCQUF3QixDQUFFO01BQ3JEME0sS0FBSyxFQUFFO1FBQUVtRCxLQUFLLEVBQUU7TUFBa0I7SUFBRSxHQUNyQywwQkFFSSxDQUFDLEVBQ0wsSUFBSSxDQUFDbE8sS0FBSyxDQUFDK0MsTUFBTSxDQUFDNEMsR0FBRyxDQUFDLENBQUNrRyxJQUFJLEVBQUVsTSxLQUFLLEtBQUs7TUFDdEMsb0JBQ0V0QyxLQUFBLENBQUF3QixhQUFBO1FBQ0V5TSxTQUFTLEVBQUV2TixPQUFPLENBQUNNLE1BQU0sRUFBRSx3QkFBd0IsQ0FBRTtRQUNyRDRPLEdBQUcsRUFBRXROO01BQU0sZ0JBRVh0QyxLQUFBLENBQUF3QixhQUFBO1FBQUtrTSxLQUFLLEVBQUU7VUFBRXRNLEtBQUssRUFBRTtRQUFHO01BQUUsR0FDdkJvTixJQUFJLENBQUNwRCxLQUFLLElBQUksUUFBUSxnQkFDckJwTCxLQUFBLENBQUF3QixhQUFBLENBQUMvQixxQkFBcUIsTUFBRSxDQUFDLGdCQUV6Qk8sS0FBQSxDQUFBd0IsYUFBQSxDQUFDOUIsc0JBQXNCLE1BQUUsQ0FFeEIsQ0FBQyxlQUNOTSxLQUFBLENBQUF3QixhQUFBLGNBQUssR0FBQyxFQUFDZ04sSUFBSSxDQUFDOUYsTUFBTSxDQUFDbUcsS0FBVyxDQUMzQixDQUFDO0lBRVYsQ0FBQyxDQUNELENBRUosQ0FDSDtJQUNELE1BQU1pQyxXQUFXLGdCQUNmOVEsS0FBQSxDQUFBd0IsYUFBQSxDQUFBeEIsS0FBQSxDQUFBMlEsUUFBQSxxQkFDRTNRLEtBQUEsQ0FBQXdCLGFBQUE7TUFBS3lNLFNBQVMsRUFBRXZOLE9BQU8sQ0FBQ00sTUFBTSxFQUFFLHdCQUF3QjtJQUFFLEdBQUMsMEJBRXRELENBQUMsRUFDTHdQLFFBQVEsQ0FBQ2xJLEdBQUcsQ0FBQyxDQUFDa0csSUFBSSxFQUFFbE0sS0FBSyxLQUFLO01BQzdCLG9CQUNFdEMsS0FBQSxDQUFBd0IsYUFBQTtRQUNFb08sR0FBRyxFQUFFcEIsSUFBSSxDQUFDb0IsR0FBSTtRQUNkSCxPQUFPLEVBQUVBLENBQUEsS0FBTTtVQUNiLElBQUksQ0FBQzNNLFFBQVEsQ0FBQztZQUNaUyxTQUFTLEVBQUVpTCxJQUFJLENBQUNvQjtVQUNsQixDQUFDLENBQUM7UUFDSjtNQUFFLEdBRURyTSxTQUFTLElBQUlpTCxJQUFJLENBQUNvQixHQUFHLGdCQUNwQjVQLEtBQUEsQ0FBQXdCLGFBQUEseUJBQ0V4QixLQUFBLENBQUF3QixhQUFBO1FBQUt5TSxTQUFTLEVBQUV2TixPQUFPLENBQUNNLE1BQU0sRUFBRSx3QkFBd0I7TUFBRSxnQkFDeERoQixLQUFBLENBQUF3QixhQUFBO1FBQUtrTSxLQUFLLEVBQUU7VUFBRXRNLEtBQUssRUFBRTtRQUFHO01BQUUsR0FDdkJtQyxTQUFTLElBQUlpTCxJQUFJLENBQUNvQixHQUFHLGlCQUFJNVAsS0FBQSxDQUFBd0IsYUFBQSxDQUFDbEMsYUFBYSxNQUFFLENBQ3ZDLENBQUMsZUFDTlUsS0FBQSxDQUFBd0IsYUFBQSxjQUFLLEdBQUMsRUFBQ2dOLElBQUksQ0FBQ0ssS0FBVyxDQUNwQixDQUNKLENBQUMsZ0JBRUo3TyxLQUFBLENBQUF3QixhQUFBO1FBQUt5TSxTQUFTLEVBQUV2TixPQUFPLENBQUNNLE1BQU0sRUFBRSx3QkFBd0I7TUFBRSxnQkFDeERoQixLQUFBLENBQUF3QixhQUFBO1FBQUtrTSxLQUFLLEVBQUU7VUFBRXRNLEtBQUssRUFBRTtRQUFHO01BQUUsQ0FBTSxDQUFDLGVBQ2pDcEIsS0FBQSxDQUFBd0IsYUFBQSxjQUFLLEdBQUMsRUFBQ2dOLElBQUksQ0FBQ0ssS0FBVyxDQUNwQixDQUVKLENBQUM7SUFFVixDQUFDLENBQ0QsQ0FDSDtJQUVELE1BQU1wQyxlQUFlLEdBQUd6SCxPQUFPLENBQUNpQixNQUFNLENBQUV2RCxJQUFJLElBQUtBLElBQUksQ0FBQ2tJLFFBQVEsS0FBSyxLQUFLLENBQUM7SUFFekUsTUFBTTlGLE9BQU8sZ0JBQ1g5RSxLQUFBLENBQUF3QixhQUFBLENBQUF1UCxTQUFBLENBQVVDLEtBQUs7TUFDYmpJLFFBQVEsRUFBRSxJQUFJLENBQUNvQixZQUFZLENBQUM4RyxJQUFJLENBQUMsSUFBSSxDQUFFO01BQ3ZDdEssT0FBTyxFQUFFc0osUUFBUSxDQUFDM0gsR0FBRyxDQUNsQkMsR0FBK0QsSUFBSztRQUNuRSxJQUFJLENBQUNBLEdBQUcsQ0FBQ29DLFNBQVMsRUFBRTtVQUNsQnBDLEdBQUcsQ0FBQ29DLFNBQVMsR0FBR3BDLEdBQUcsQ0FBQ3NHLEtBQUs7UUFDM0I7UUFDQSxPQUFPO1VBQ0xxQyxLQUFLLEVBQUUzSSxHQUFHLENBQUNzRyxLQUFLO1VBQ2hCc0MsS0FBSyxFQUFFNUksR0FBRyxDQUFDb0MsU0FBUztVQUNwQnlHLFFBQVEsRUFBRTdJLEdBQUcsQ0FBQzRCLFlBQVksS0FBSztRQUNqQyxDQUFDO01BQ0gsQ0FDRjtNQUNBO01BQUE7TUFDQWdILEtBQUssRUFDSCxJQUFJLENBQUN4TyxLQUFLLENBQUNtRCxZQUFZLEdBQ25CMkcsZUFBZSxDQUFDbkUsR0FBRyxDQUFFQyxHQUFHLElBQUtBLEdBQUcsQ0FBQ29DLFNBQVMsQ0FBQyxHQUMzQyxJQUFJLENBQUNoSSxLQUFLLENBQUNrRDtJQUNoQixDQUNjLENBQ2xCO0lBQ0Qsb0JBQ0U3RixLQUFBLENBQUF3QixhQUFBO01BQUt5TSxTQUFTLEVBQUV2TixPQUFPLENBQUNNLE1BQU0sRUFBRSxvQkFBb0I7SUFBRSxHQUNuRHFQLEtBQUssQ0FBQ2hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsaUJBQzNCck8sS0FBQSxDQUFBd0IsYUFBQTtNQUFLa00sS0FBSyxFQUFFO1FBQUUyRCxRQUFRLEVBQUU7TUFBRztJQUFFLGdCQUMzQnJSLEtBQUEsQ0FBQXdCLGFBQUEsQ0FBQThQLFFBQUE7TUFDRXpDLEtBQUssRUFBQyxzQ0FBUTtNQUNkL0osT0FBTyxFQUFFQSxPQUFRO01BQ2pCeU0sU0FBUyxFQUFDLGFBQWE7TUFDdkJDLE9BQU8sRUFBQyxPQUFPO01BQ2ZDLFlBQVksRUFBRTtRQUFFQyxRQUFRLEVBQUUsR0FBRztRQUFFQyxRQUFRLEVBQUU7TUFBSTtJQUFFLGdCQUUvQzNSLEtBQUEsQ0FBQXdCLGFBQUEsQ0FBQ25DLGdCQUFnQjtNQUNmNE8sU0FBUyxFQUFFdk4sT0FBTyxDQUFDTSxNQUFNLEVBQUUsNkJBQTZCO0lBQUUsQ0FDM0QsQ0FDTSxDQUNOLENBQ04sRUFDQXFQLEtBQUssQ0FBQ2hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsaUJBQ3pCck8sS0FBQSxDQUFBd0IsYUFBQTtNQUFLa00sS0FBSyxFQUFFO1FBQUVrRSxXQUFXLEVBQUUsQ0FBQztRQUFFUCxRQUFRLEVBQUU7TUFBRztJQUFFLGdCQUMzQ3JSLEtBQUEsQ0FBQXdCLGFBQUEsQ0FBQThQLFFBQUE7TUFBU0MsU0FBUyxFQUFDLFFBQVE7TUFBQ3pNLE9BQU8sRUFBRTRMLFdBQVk7TUFBQ2MsT0FBTyxFQUFDO0lBQU8sZ0JBQy9EeFIsS0FBQSxDQUFBd0IsYUFBQSxDQUFDL0IscUJBQXFCLE1BQUUsQ0FDakIsQ0FDTixDQUNOLEVBQ0E0USxLQUFLLENBQUNoQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGlCQUN6QnJPLEtBQUEsQ0FBQXdCLGFBQUE7TUFBS2tNLEtBQUssRUFBRTtRQUFFa0UsV0FBVyxFQUFFLENBQUM7UUFBRVAsUUFBUSxFQUFFO01BQUc7SUFBRSxnQkFDM0NyUixLQUFBLENBQUF3QixhQUFBLENBQUE4UCxRQUFBO01BQVNDLFNBQVMsRUFBQyxRQUFRO01BQUN6TSxPQUFPLEVBQUVnTSxXQUFZO01BQUNVLE9BQU8sRUFBQztJQUFPLGdCQUMvRHhSLEtBQUEsQ0FBQXdCLGFBQUEsQ0FBQ2pDLG9CQUFvQixNQUFFLENBQ2hCLENBQ04sQ0FDTixFQUNBOFEsS0FBSyxDQUFDaEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxpQkFDNUJyTyxLQUFBLENBQUF3QixhQUFBO01BQ0VrTSxLQUFLLEVBQUU7UUFBRWtFLFdBQVcsRUFBRSxDQUFDO1FBQUVQLFFBQVEsRUFBRSxFQUFFO1FBQUVULE1BQU0sRUFBRTtNQUFVLENBQUU7TUFDM0RuQixPQUFPLEVBQUVBLENBQUEsS0FBTTtRQUNiLE1BQU10TCxNQUFNLEdBQUF0QixhQUFBLEtBQVEsSUFBSSxDQUFDRixLQUFLLENBQUM2QyxZQUFZLENBQUU7UUFDN0MsSUFBSThLLFVBQVUsQ0FBQ3VCLFNBQVMsRUFBRTtVQUN4QnZCLFVBQVUsQ0FBQ3VCLFNBQVMsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsTUFBTTtVQUNMLElBQUksQ0FBQ3JOLEtBQUssQ0FBQ3JDLElBQUksQ0FBQztZQUFFZ0M7VUFBTyxDQUFDLENBQUM7UUFDN0I7TUFDRjtJQUFFLGdCQUVGbkUsS0FBQSxDQUFBd0IsYUFBQSxDQUFDN0IsWUFBWSxNQUFFLENBQ1osQ0FFSixDQUFDO0VBRVY7RUFDQW1TLGtCQUFrQkEsQ0FBQSxFQUFHO0lBQ25CLE9BQU8sSUFBSSxDQUFDblAsS0FBSyxDQUFDb0QsZUFBZTtFQUNuQztFQUNBZ00sbUJBQW1CQSxDQUFBLEVBQUc7SUFDcEIsT0FBTyxJQUFJLENBQUNwUCxLQUFLLENBQUNxRCxnQkFBZ0I7RUFDcEM7RUFDQWdNLG9CQUFvQkEsQ0FBQSxFQUFHO0lBQ3JCLElBQUksQ0FBQ2xQLFFBQVEsQ0FBQztNQUNaaUQsZUFBZSxFQUFFLEVBQUU7TUFDbkJDLGdCQUFnQixFQUFFO0lBQ3BCLENBQUMsQ0FBQztFQUNKO0VBQ0FpTSxvQkFBb0JBLENBQUNwTyxNQUFXLEVBQUVxTyxRQUFhLEVBQUU7SUFDL0MsTUFBTTtNQUFFbk0sZUFBZTtNQUFFQztJQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDckQsS0FBSztJQUN4RCxJQUFJO01BQUV3UCxNQUFNLEdBQUc7SUFBSyxDQUFDLEdBQUcsSUFBSSxDQUFDalIsS0FBSztJQUNsQyxJQUFJa1Isa0JBQWtCLEdBQUcsQ0FBQyxHQUFHck0sZUFBZSxDQUFDO0lBQzdDLElBQUlzTSxtQkFBbUIsR0FBRyxDQUFDLEdBQUdyTSxnQkFBZ0IsQ0FBQztJQUMvQyxJQUFJa00sUUFBUSxFQUFFO01BQ1pFLGtCQUFrQixHQUFHLENBQUMsR0FBR0Esa0JBQWtCLEVBQUV2TyxNQUFNLENBQUNzTyxNQUFNLENBQUMsQ0FBQztNQUM1REUsbUJBQW1CLEdBQUcsQ0FBQyxHQUFHQSxtQkFBbUIsRUFBRXhPLE1BQU0sQ0FBQztJQUN4RCxDQUFDLE1BQU07TUFDTGtDLGVBQWUsQ0FBQ3VDLEdBQUcsQ0FBQyxDQUFDa0csSUFBUyxFQUFFbE0sS0FBVSxLQUFLO1FBQzdDLElBQUlrTSxJQUFJLEtBQUszSyxNQUFNLENBQUNzTyxNQUFNLENBQUMsRUFBRTtVQUMzQkMsa0JBQWtCLENBQUNFLE1BQU0sQ0FBQ2hRLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDckM7TUFDRixDQUFDLENBQUM7TUFDRjBELGdCQUFnQixDQUFDc0MsR0FBRyxDQUFDLENBQUNrRyxJQUFTLEVBQUVsTSxLQUFVLEtBQUs7UUFDOUMsSUFBSWtNLElBQUksQ0FBQzJELE1BQU0sQ0FBQyxLQUFLdE8sTUFBTSxDQUFDc08sTUFBTSxDQUFDLEVBQUU7VUFDbkNFLG1CQUFtQixDQUFDQyxNQUFNLENBQUNoUSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDO01BQ0YsQ0FBQyxDQUFDO0lBQ0o7SUFDQSxJQUFJLENBQUNRLFFBQVEsQ0FBQztNQUNaaUQsZUFBZSxFQUFFcU0sa0JBQWtCO01BQ25DcE0sZ0JBQWdCLEVBQUVxTTtJQUNwQixDQUFDLENBQUM7RUFDSjtFQUNBRSx1QkFBdUJBLENBQUNMLFFBQWEsRUFBRU0sWUFBaUIsRUFBRUMsVUFBZSxFQUFFO0lBQ3pFLE1BQU07TUFBRTFNLGVBQWU7TUFBRUM7SUFBaUIsQ0FBQyxHQUFHLElBQUksQ0FBQ3JELEtBQUs7SUFDeEQsTUFBTTtNQUFFd1AsTUFBTSxHQUFHO0lBQUssQ0FBQyxHQUFHLElBQUksQ0FBQ2pSLEtBQUs7SUFDcEMsSUFBSXdSLE1BQVcsR0FBRyxFQUFFO0lBQ3BCLElBQUlDLFFBQWEsR0FBRyxFQUFFO0lBQ3RCLElBQUlGLFVBQVUsQ0FBQ3BJLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDekIsSUFBSXVJLFNBQVMsR0FBR0gsVUFBVSxDQUFDbkssR0FBRyxDQUFFa0csSUFBUyxJQUFLQSxJQUFJLENBQUMyRCxNQUFNLENBQUMsQ0FBQztNQUMzRCxJQUFJRCxRQUFRLEVBQUU7UUFDWlEsTUFBTSxHQUFHLENBQUMsR0FBRzNNLGVBQWUsRUFBRSxHQUFHNk0sU0FBUyxDQUFDO1FBQzNDRCxRQUFRLEdBQUcsQ0FBQyxHQUFHM00sZ0JBQWdCLEVBQUUsR0FBR3lNLFVBQVUsQ0FBQztNQUNqRCxDQUFDLE1BQU07UUFDTDFNLGVBQWUsQ0FBQ3VDLEdBQUcsQ0FBQyxDQUFDa0csSUFBUyxFQUFFbE0sS0FBVSxLQUFLO1VBQzdDLElBQUlzUSxTQUFTLENBQUN2RSxPQUFPLENBQUNHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ2pDa0UsTUFBTSxDQUFDOUosSUFBSSxDQUFDNEYsSUFBSSxDQUFDO1VBQ25CO1FBQ0YsQ0FBQyxDQUFDO1FBQ0Z4SSxnQkFBZ0IsQ0FBQ3NDLEdBQUcsQ0FBQyxDQUFDa0csSUFBUyxFQUFFbE0sS0FBVSxLQUFLO1VBQzlDLElBQUlzUSxTQUFTLENBQUN2RSxPQUFPLENBQUNHLElBQUksQ0FBQzJELE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDekNRLFFBQVEsQ0FBQy9KLElBQUksQ0FBQzRGLElBQUksQ0FBQztVQUNyQjtRQUNGLENBQUMsQ0FBQztNQUNKO0lBQ0YsQ0FBQyxNQUFNO01BQ0xrRSxNQUFNLEdBQUcsQ0FBQyxHQUFHM00sZUFBZSxDQUFDO01BQzdCNE0sUUFBUSxHQUFHLENBQUMsR0FBRzNNLGdCQUFnQixDQUFDO0lBQ2xDO0lBQ0EsSUFBSSxDQUFDbEQsUUFBUSxDQUFDO01BQ1ppRCxlQUFlLEVBQUUsQ0FBQyxHQUFHMk0sTUFBTSxDQUFDO01BQzVCMU0sZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHMk0sUUFBUTtJQUNoQyxDQUFDLENBQUM7RUFDSjtFQUNBaEcsTUFBTUEsQ0FBQSxFQUFHO0lBQ1AsSUFBSXZKLEtBQUssR0FBRyxJQUFJO01BQ2Q7UUFDRTZCLE9BQU87UUFDUEYsVUFBVTtRQUNWRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2ZFLFVBQVU7UUFDVkMsV0FBVztRQUNYQyxXQUFXO1FBQ1gvQjtNQUNGLENBQUMsR0FBRyxJQUFJLENBQUNaLEtBQUs7TUFDZHpCLEtBQUssR0FBR25CLEtBQUssQ0FBQzhTLElBQUksQ0FDaEIsSUFBSSxDQUFDM1IsS0FBSyxFQUNWLENBQ0UsT0FBTyxFQUNQLFVBQVUsRUFDVixTQUFTLEVBQ1QsYUFBYSxFQUNiLFNBQVMsRUFDVCxZQUFZLEVBQ1osY0FBYyxFQUNkLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsVUFBVSxDQUNYLEVBQ0Q7UUFDRWlSLE1BQU0sRUFBRSxJQUFJO1FBQ1pXLGdCQUFnQixFQUFFO01BQ3BCLENBQ0YsQ0FBQztJQUNILElBQUk1UixLQUFLLENBQUNnRSxVQUFVLEtBQUssS0FBSyxFQUFFO01BQzlCaEUsS0FBSyxDQUFDZ0UsVUFBVSxHQUFBckMsYUFBQSxDQUFBQSxhQUFBO1FBQ2RrUSxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDekJDLGVBQWUsRUFBRSxJQUFJO1FBQ3JCQyxlQUFlLEVBQUU7TUFBSSxHQUNsQi9OLFVBQVUsR0FDVmhFLEtBQUssQ0FBQ2dFLFVBQVUsQ0FDcEI7TUFDRCxJQUFJaEUsS0FBSyxDQUFDZ1MsU0FBUyxJQUFJLElBQUksRUFBRTtRQUMzQmhTLEtBQUssQ0FBQ2dFLFVBQVUsQ0FBQ2dPLFNBQVMsR0FBRyxVQUFVQyxLQUFLLEVBQUFDLEtBQUEsRUFBYztVQUFBLElBQVosQ0FBQ0MsSUFBSSxFQUFFQyxFQUFFLENBQUMsR0FBQUYsS0FBQTtVQUN0RDtVQUNBLE9BQU8sSUFBSSxHQUFHRCxLQUFLLEdBQUcsSUFBSTtRQUM1QixDQUFDO01BQ0g7SUFDRjtJQUNBalMsS0FBSyxDQUFDNkgsUUFBUSxHQUFHLFVBQVU3RCxVQUFVLEVBQUU4RCxPQUFPLEVBQUV0RCxNQUFNLEVBQUVRLEtBQUssRUFBRTtNQUM3RDlDLEtBQUssQ0FBQzJGLFFBQVEsQ0FBQzNGLEtBQUssQ0FBQ1QsS0FBSyxDQUFDdUMsVUFBVSxFQUFFOEQsT0FBTyxFQUFFdEQsTUFBTSxFQUFFUSxLQUFLLENBQUM7SUFDaEUsQ0FBQztJQUNELElBQUloRixLQUFLLENBQUM0UixnQkFBZ0IsRUFBRTtNQUMxQixNQUFNUyxPQUFPLEdBQUdyUyxLQUFLLENBQUNzUyxLQUFLO01BQzNCdFMsS0FBSyxDQUFDc1MsS0FBSyxHQUFHLFVBQVUzUCxNQUFNLEVBQUV2QixLQUFLLEVBQUU7UUFDckMsSUFBSW1SLE1BQU0sR0FBR0YsT0FBTyxHQUFHQSxPQUFPLENBQUMxUCxNQUFNLEVBQUV2QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEQsTUFBTW9SLFNBQVMsR0FBR0QsTUFBTSxDQUFDaEUsT0FBTztRQUNoQ2dFLE1BQU0sQ0FBQ2hFLE9BQU8sR0FBSWhFLEtBQUssSUFBSztVQUMxQnJJLEtBQUssQ0FBQ04sUUFBUSxDQUFDO1lBQ2JxQyxXQUFXLEVBQUU3QyxLQUFLLENBQUU7VUFDdEIsQ0FBQyxDQUFDO1VBQ0Z2QyxLQUFLLENBQUM2RyxRQUFRLENBQUM4TSxTQUFTLEVBQUV0USxLQUFLLEVBQUUsQ0FBQ3FJLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxPQUFPZ0ksTUFBTTtNQUNmLENBQUM7TUFDRHZTLEtBQUssQ0FBQ3lTLFlBQVksR0FBRyxVQUFVOVAsTUFBTSxFQUFFdkIsS0FBSyxFQUFFO1FBQzVDLE9BQU9BLEtBQUssS0FBS2MsS0FBSyxDQUFDVCxLQUFLLENBQUN3QyxXQUFXLEdBQ3BDLHlCQUF5QixHQUN6QixFQUFFO01BQ1IsQ0FBQztJQUNIO0lBQ0EsSUFBSXlPLGFBQWEsR0FBRyxFQUFFO0lBQ3RCLElBQUl4TyxVQUFVLEVBQUU7TUFDZCxNQUFNbkMsSUFBSSxHQUFHNUMsU0FBUyxDQUFDd1Qsa0JBQWtCLENBQ3ZDLElBQUksRUFDSnpPLFVBQVUsRUFDVkMsV0FBVyxFQUNYQyxXQUNGLENBQUM7TUFDRHNPLGFBQWEsR0FBRzNRLElBQUksQ0FBQzZRLFNBQVM7TUFDOUI1UyxLQUFLLENBQUM2UyxlQUFlLEdBQUc5USxJQUFJLENBQUMrUSxRQUFRO0lBQ3ZDLENBQUMsTUFBTTtNQUNMSixhQUFhLEdBQUc3TyxVQUFVO0lBQzVCO0lBQ0E3RCxLQUFLLENBQUNzRCxLQUFLLEdBQUd0RCxLQUFLLENBQUNzRCxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQy9CdEQsS0FBSyxDQUFDc0QsS0FBSyxDQUFDNEMsUUFBUSxHQUFHbEcsS0FBSyxDQUFDc0QsS0FBSyxDQUFDNEMsUUFBUSxLQUFLLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSTtJQUNwRSxNQUFNO01BQUU2TTtJQUFTLENBQUMsR0FBRzdRLEtBQUssQ0FBQ2xDLEtBQUs7SUFDaEMsTUFBTWdULGFBQWEsR0FDakJELFFBQVEsS0FBSyxJQUFJLEdBQ2I7TUFDRUUsVUFBVSxFQUFFN1QsZ0JBQWdCO01BQzVCa1QsS0FBSyxFQUFFQSxDQUFDM1AsTUFBTSxFQUFFdkIsS0FBSyxNQUFNO1FBQ3pCQSxLQUFLO1FBQ0x1QixNQUFNO1FBQ05VLE9BQU8sRUFBRSxJQUFJLENBQUNBO01BQ2hCLENBQUM7SUFDSCxDQUFDLEdBQ0QsQ0FBQyxDQUFDO0lBQ1IsSUFBSTtNQUFFa0Q7SUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDdkcsS0FBSztJQUVqQyxNQUFNa1QsV0FBVyxHQUNmM00sWUFBWSxLQUFLLElBQUksR0FBRztNQUFFME0sVUFBVSxFQUFFLElBQUksQ0FBQ0E7SUFBVyxDQUFDLEdBQUcsSUFBSTtJQUNoRSxNQUFNO01BQUVoRTtJQUFVLENBQUMsR0FBR3JQLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLElBQUl1VCxRQUFRLEdBQUcsS0FBSztJQUNwQjs7SUFFQSxJQUFJbEUsU0FBUyxDQUFDbUUsSUFBSSxLQUFLLElBQUksRUFBRTtNQUMzQkQsUUFBUSxHQUFDLElBQUk7SUFDZjtJQUNBLElBQUksSUFBSSxDQUFDblQsS0FBSyxDQUFDZ1AsT0FBTyxJQUFJLElBQUksQ0FBQ2hQLEtBQUssQ0FBQ2dQLE9BQU8sQ0FBQ29FLElBQUksS0FBSyxJQUFJLEVBQUU7TUFDMURELFFBQVEsR0FBRyxJQUFJO0lBQ2pCO0lBQ0EsSUFBSSxJQUFJLENBQUNuVCxLQUFLLENBQUNxVCxnQkFBZ0IsRUFBRTtNQUMvQixNQUFNO1FBQUVDLFlBQVksR0FBRyxDQUFDO01BQUUsQ0FBQyxHQUFHLElBQUksQ0FBQ3RULEtBQUs7TUFDeENBLEtBQUssR0FBQTJCLGFBQUEsQ0FBQUEsYUFBQSxLQUNBM0IsS0FBSztRQUNSc1QsWUFBWSxFQUFBM1IsYUFBQTtVQUNWa0QsZUFBZSxFQUFFLElBQUksQ0FBQ3BELEtBQUssQ0FBQ29ELGVBQWU7VUFDM0MwTyxRQUFRLEVBQUUsSUFBSSxDQUFDeEMsb0JBQW9CLENBQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDO1VBQzlDeUQsV0FBVyxFQUFFLElBQUksQ0FBQ25DLHVCQUF1QixDQUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQztVQUNwRDBELFdBQVcsRUFBRTtRQUFFLEdBQ1pILFlBQVk7TUFDaEIsRUFDRjtJQUNIO0lBQ0EsTUFBTTtNQUFFSSxVQUFVLEVBQUVDO0lBQWlCLENBQUMsR0FBRy9ULE1BQU0sQ0FBQyxDQUFDO0lBQ2pELE1BQU1nVSxZQUFZLGdCQUNoQjlVLEtBQUEsQ0FBQXdCLGFBQUE7TUFBS3lNLFNBQVMsRUFBRXZOLE9BQU8sQ0FBQ00sTUFBTSxFQUFFLFdBQVc7SUFBRSxHQUMxQ3FULFFBQVEsSUFBSSxJQUFJLENBQUNyRSxhQUFhLENBQUMsQ0FBQyxlQUNqQ2hRLEtBQUEsQ0FBQXdCLGFBQUEsQ0FBQXVULE1BQUEsRUFBQUMsUUFBQTtNQUNFQyxrQkFBa0IsRUFBQyxZQUFZO01BQy9CQyxPQUFPO01BQ1BuUSxVQUFVLEVBQUU2TyxhQUFjO01BQzFCNU8sT0FBTyxFQUFFLElBQUksQ0FBQ2pDLFVBQVUsQ0FBQyxDQUFFO01BQzNCa0MsT0FBTyxFQUFFQSxPQUFRO01BQ2pCZ0osU0FBUyxFQUFFbE4sR0FBRyxDQUFDTCxPQUFPLENBQUNNLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxFQUFFRSxLQUFLLENBQUMrTSxTQUFTLENBQUU7TUFDdEVrSCxNQUFNLEVBQUU7UUFDTkMsU0FBUyxlQUNQcFYsS0FBQSxDQUFBd0IsYUFBQSxDQUFDWixNQUFNO1VBQUNxTixTQUFTLEVBQUV2TixPQUFPLENBQUNNLE1BQU0sRUFBRSxrQkFBa0I7UUFBRSxDQUFFO01BRTdELENBQUU7TUFDRnFVLE1BQU0sRUFBRTtRQUFFQyxDQUFDLEVBQUU7TUFBYztJQUFFLEdBQ3pCVCxnQkFBZ0IsRUFDaEJULFdBQVcsRUFDWGxULEtBQUssRUFDTGdULGFBQWE7TUFDakJ6UixJQUFJLEVBQUVjLFNBQVU7TUFDaEIyQixVQUFVLEVBQUU7TUFDWjtJQUFBLEVBQ0QsQ0FBQyxFQUNEaEUsS0FBSyxDQUFDZ0UsVUFBVSxLQUFLLEtBQUssaUJBQ3pCbEYsS0FBQSxDQUFBd0IsYUFBQTtNQUFLeU0sU0FBUyxFQUFFdk4sT0FBTyxDQUFDTSxNQUFNLEVBQUUsc0JBQXNCO0lBQUUsZ0JBQ3REaEIsS0FBQSxDQUFBd0IsYUFBQSxDQUFBK1QsV0FBQSxFQUFBUCxRQUFBLEtBQ005VCxLQUFLLENBQUNnRSxVQUFVO01BQ3BCNkQsUUFBUSxFQUFFQSxDQUFDeU0sSUFBSSxFQUFFN0wsUUFBUSxLQUFLO1FBQzVCLE1BQU16RCxLQUFLLEdBQUcsSUFBSSxDQUFDdkQsS0FBSyxDQUFDdUQsS0FBSztRQUM5QkEsS0FBSyxDQUFDdVAsTUFBTSxHQUFHLFVBQVU7UUFDekIsSUFBSSxDQUFDM1MsUUFBUSxDQUFDNFMsS0FBQSxJQUF5QjtVQUFBLElBQXhCO1lBQUV4USxVQUFVLEdBQUcsQ0FBQztVQUFFLENBQUMsR0FBQXdRLEtBQUE7VUFDaEMsT0FBTztZQUNMeFEsVUFBVSxFQUFBckMsYUFBQSxDQUFBQSxhQUFBLEtBQU9xQyxVQUFVO2NBQUVxQyxPQUFPLEVBQUVpTyxJQUFJO2NBQUU3TDtZQUFRO1VBQ3RELENBQUM7UUFDSCxDQUFDLENBQUM7UUFDRixJQUFJLENBQUNaLFFBQVEsQ0FDWDtVQUFFeEIsT0FBTyxFQUFFaU8sSUFBSTtVQUFFN0w7UUFBUyxDQUFDLEVBQzNCLElBQUksQ0FBQ2hILEtBQUssQ0FBQ3NELE1BQU0sRUFDakIsSUFBSSxDQUFDdEQsS0FBSyxDQUFDK0MsTUFBTSxFQUNqQlEsS0FDRixDQUFDO01BQ0g7SUFBRSxFQUNILENBQ0UsQ0FFSixDQUNOO0lBRUQsT0FBTytOLFFBQVEsS0FBSyxJQUFJLGdCQUN0QmpVLEtBQUEsQ0FBQXdCLGFBQUEsQ0FBQ3ZCLFdBQVc7TUFBQzBWLE9BQU8sRUFBRXBWO0lBQWEsR0FBRXVVLFlBQTBCLENBQUMsR0FFaEVBLFlBQ0Q7RUFDSDtBQUNGO0FBQUM5UyxlQUFBLENBei9CS0osUUFBUSxrQkFDVTtFQUNwQnFTLFFBQVEsRUFBRSxLQUFLO0VBQ2ZmLFNBQVMsRUFBRSxJQUFJO0VBQ2YvSSxZQUFZLEVBQUUsSUFBSTtFQUNsQnlMLE9BQU8sRUFBRSxFQUFFO0VBQ1h6TSxjQUFjLEVBQUUsSUFBSTtFQUNwQkQsUUFBUSxFQUFFLElBQUk7RUFDZEQsWUFBWSxFQUFFLElBQUk7RUFDbEJ4QixZQUFZLEVBQUUsSUFBSTtFQUNsQnlJLE9BQU8sRUFBRTtJQUNQb0UsSUFBSSxFQUFFLEtBQUs7SUFDWC9ELFdBQVcsRUFBRSxDQUFDLENBQVE7SUFDdEJGLEtBQUssRUFBRTtFQUNUO0FBQ0YsQ0FBQztBQTQrQkgsZUFBZTdQLFlBQVksQ0FBQ29CLFFBQVEsQ0FBQyJ9
|