nsc-react-component 4.4.1 → 4.4.3

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.
@@ -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+XHJcbiAgICApIDogKFxyXG4gICAgICBEZWZhdWx0VGFibGVcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB3aXRoWmhMb2NhbGUoTlNDVGFibGUpO1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQ0VBLGdCQUFnQixFQUNoQkMsYUFBYSxFQUNiQyxvQkFBb0IsRUFDcEJDLGNBQWMsRUFDZEMscUJBQXFCLEVBQ3JCQyxzQkFBc0IsRUFDdEJDLFlBQVksUUFDUCxtQkFBbUI7QUFDMUIsU0FBU0MsVUFBVSxRQUFRLG1CQUFtQjtBQUM5QyxPQUFPQyxLQUFLLElBQUlDLFNBQVMsUUFBb0IsYUFBYTtBQUMxRCxTQUFTQyxLQUFLLFFBQVEsdUJBQXVCO0FBZTdDLE9BQU8sS0FBS0MsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsV0FBVyxRQUFRLFdBQVc7QUFDdkMsT0FBT0MsT0FBTyxJQUFJQyxjQUFjLEVBQUVDLGFBQWEsUUFBUSxtQkFBbUI7QUFDMUUsT0FBT0MsU0FBUyxNQUFNLGlCQUFpQjtBQUN2QyxPQUFPLHFCQUFxQjtBQUM1QixNQUFNO0VBQUVDLGdCQUFnQjtFQUFFQztBQUFhLENBQUMsR0FBR0wsT0FBTztBQUNsRCxPQUFPTSxZQUFZLE1BQU0sd0JBQXdCO0FBQ2pELFNBQVNDLFNBQVMsUUFBUSxpQkFBaUI7QUFDM0MsT0FBTyxzQkFBc0I7QUFDN0IsU0FBU0MsT0FBTyxFQUFFQyxPQUFPLFFBQXlCLGFBQWE7QUFDL0QsT0FBT0MsTUFBTSxNQUFNLGtCQUFrQjtBQUNyQyxTQUFTQyxVQUFVLFFBQVEsbUJBQW1CO0FBQzlDLE9BQU9DLE1BQU0sTUFBTSxjQUFjO0FBRWpDLE9BQU9DLEdBQUcsTUFBTSxZQUFZO0FBRTVCLE1BQU1DLE1BQU0sR0FBRyxJ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