hy-virtual-tree 1.1.27 → 1.1.29
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/CHANGELOG.md +20 -0
- package/dist/index.js +205 -111
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
## Changelog
|
|
2
2
|
|
|
3
|
+
### 1.1.29
|
|
4
|
+
|
|
5
|
+
_2025-09-17_
|
|
6
|
+
|
|
7
|
+
- 扩展[VirtualTree] 功能
|
|
8
|
+
(1)修复开启 businessConfig.showOnlineState 时,隐藏的节点仍可被选中
|
|
9
|
+
(2)修复开启 businessConfig.showOnlineState 时,设备上下线不会同步更新勾选状态
|
|
10
|
+
(3)添加 businessConfig.sortByStatus,对设备在线和离线状态进行排序
|
|
11
|
+
|
|
12
|
+
### 1.1.28
|
|
13
|
+
|
|
14
|
+
_2025-09-16_
|
|
15
|
+
|
|
16
|
+
- 扩展[VirtualTree] 功能
|
|
17
|
+
(1)添加 businessConfig.integratedBusiness,部门和群组会集成所有下级业务数据到 childrenDeviceList 字段
|
|
18
|
+
(2)添加 businessConfig.showOnlineState,仅显示在线设备,更新数据时也会同时更新展示列表
|
|
19
|
+
(3)setData方法添加 config.props 传参
|
|
20
|
+
(4)修改props.clearEmptyBusiness为businessConfig.clearEmptyBusiness
|
|
21
|
+
(5)修复异步渲染节点导致缓存节点判断错误问题
|
|
22
|
+
|
|
3
23
|
### 1.1.27
|
|
4
24
|
|
|
5
25
|
_2025-09-16_
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,8 @@ class VirtualScroll {
|
|
|
11
11
|
* @param {number} [options.maxHeight=26840000] Maximum height in pixels for the content wrapper
|
|
12
12
|
* @param {Function} [options.onRender] 节点刷新回调
|
|
13
13
|
*/
|
|
14
|
-
|
|
14
|
+
_cacheNodeMap = new Map();
|
|
15
|
+
_isCanCache = true;
|
|
15
16
|
constructor(options) {
|
|
16
17
|
this.container = options.container;
|
|
17
18
|
this.items = options.items || [];
|
|
@@ -116,7 +117,9 @@ class VirtualScroll {
|
|
|
116
117
|
renderVisibleItems(startIndex, endIndex) {
|
|
117
118
|
this._onRender && this._onRender();
|
|
118
119
|
// Clear content container
|
|
119
|
-
|
|
120
|
+
if (!this._isCanCache) {
|
|
121
|
+
this.contentContainer.innerHTML = '';
|
|
122
|
+
}
|
|
120
123
|
// Set position considering scaling factor
|
|
121
124
|
// const fragment = document.createDocumentFragment()
|
|
122
125
|
// const fragment = []
|
|
@@ -133,12 +136,22 @@ class VirtualScroll {
|
|
|
133
136
|
itemElement.style.height = `${this.itemHeight * this.heightScale}px`;
|
|
134
137
|
itemElement.style.boxSizing = 'border-box';
|
|
135
138
|
itemElement.style.width = '100%';
|
|
139
|
+
if (!this._isCanCache) {
|
|
140
|
+
this.contentContainer.appendChild(itemElement);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
136
143
|
const innerHTML = itemElement.innerHTML;
|
|
137
|
-
if (
|
|
138
|
-
|
|
144
|
+
if (nodeMap.has(innerHTML)) {
|
|
145
|
+
this._isCanCache = false;
|
|
146
|
+
i = startIndex - 1;
|
|
147
|
+
this.contentContainer.innerHTML = '';
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (this._cacheNodeMap.has(innerHTML)) {
|
|
151
|
+
const target = this._cacheNodeMap.get(innerHTML);
|
|
139
152
|
this.contentContainer.appendChild(target);
|
|
140
153
|
nodeMap.set(innerHTML, target);
|
|
141
|
-
this.
|
|
154
|
+
this._cacheNodeMap.delete(innerHTML);
|
|
142
155
|
}
|
|
143
156
|
else {
|
|
144
157
|
this.contentContainer.appendChild(itemElement);
|
|
@@ -160,11 +173,13 @@ class VirtualScroll {
|
|
|
160
173
|
this.contentContainer.appendChild(row);
|
|
161
174
|
}
|
|
162
175
|
}
|
|
163
|
-
|
|
164
|
-
this.
|
|
176
|
+
if (this._isCanCache) {
|
|
177
|
+
for (const [key, value] of this._cacheNodeMap) {
|
|
178
|
+
this.contentContainer.removeChild(value);
|
|
179
|
+
}
|
|
180
|
+
this._cacheNodeMap.clear();
|
|
181
|
+
this._cacheNodeMap = nodeMap;
|
|
165
182
|
}
|
|
166
|
-
this.cacheNodeMap.clear();
|
|
167
|
-
this.cacheNodeMap = nodeMap;
|
|
168
183
|
}
|
|
169
184
|
/**
|
|
170
185
|
* Update data items and re-render
|
|
@@ -395,8 +410,7 @@ const useConfig = (config) => {
|
|
|
395
410
|
showCount: false,
|
|
396
411
|
total: 'total',
|
|
397
412
|
count: 'count',
|
|
398
|
-
showStatus: false
|
|
399
|
-
clearEmptyBusiness: false
|
|
413
|
+
showStatus: false
|
|
400
414
|
}, config.props);
|
|
401
415
|
let rowSelection = Object.assign({
|
|
402
416
|
type: 'checkbox',
|
|
@@ -408,7 +422,11 @@ const useConfig = (config) => {
|
|
|
408
422
|
// 业务配置
|
|
409
423
|
let businessConfig = {
|
|
410
424
|
statusTextList: [],
|
|
411
|
-
filterConfig: []
|
|
425
|
+
filterConfig: [],
|
|
426
|
+
sortByStatus: true,
|
|
427
|
+
clearEmptyBusiness: false,
|
|
428
|
+
integratedBusiness: false,
|
|
429
|
+
...(config.businessConfig || {})
|
|
412
430
|
};
|
|
413
431
|
// 设备树
|
|
414
432
|
if (['device', 'groupDevice'].includes(`${config.business}`)) {
|
|
@@ -424,6 +442,9 @@ const useConfig = (config) => {
|
|
|
424
442
|
'SOS'
|
|
425
443
|
],
|
|
426
444
|
filterConfig: [],
|
|
445
|
+
sortByStatus: true,
|
|
446
|
+
clearEmptyBusiness: false,
|
|
447
|
+
integratedBusiness: false,
|
|
427
448
|
...(config.businessConfig || {})
|
|
428
449
|
};
|
|
429
450
|
props = {
|
|
@@ -431,7 +452,6 @@ const useConfig = (config) => {
|
|
|
431
452
|
disabled: 'disabled',
|
|
432
453
|
showStatus: false,
|
|
433
454
|
showCount: (data) => data.dataType !== 3,
|
|
434
|
-
clearEmptyBusiness: false,
|
|
435
455
|
...(config.props || {}),
|
|
436
456
|
value: 'onlyId',
|
|
437
457
|
label: 'label',
|
|
@@ -455,7 +475,6 @@ const useConfig = (config) => {
|
|
|
455
475
|
disabled: 'disabled',
|
|
456
476
|
showStatus: false,
|
|
457
477
|
showCount: false,
|
|
458
|
-
clearEmptyBusiness: false,
|
|
459
478
|
...(config.props || {}),
|
|
460
479
|
value: 'onlyId',
|
|
461
480
|
label: 'label',
|
|
@@ -471,7 +490,6 @@ const useConfig = (config) => {
|
|
|
471
490
|
disabled: 'disabled',
|
|
472
491
|
showStatus: false,
|
|
473
492
|
showCount: (data) => data.dataType !== 5,
|
|
474
|
-
clearEmptyBusiness: false,
|
|
475
493
|
...(config.props || {}),
|
|
476
494
|
value: 'onlyId',
|
|
477
495
|
label: 'label',
|
|
@@ -487,7 +505,6 @@ const useConfig = (config) => {
|
|
|
487
505
|
disabled: 'disabled',
|
|
488
506
|
showStatus: false,
|
|
489
507
|
showCount: false,
|
|
490
|
-
clearEmptyBusiness: false,
|
|
491
508
|
...(config.props || {}),
|
|
492
509
|
value: 'onlyId',
|
|
493
510
|
label: 'label',
|
|
@@ -649,11 +666,15 @@ function useCheck(props, tree) {
|
|
|
649
666
|
continue;
|
|
650
667
|
nodes.forEach((node) => {
|
|
651
668
|
const children = node.children;
|
|
669
|
+
if (tree.hiddenNodeKeySet.has(node.key))
|
|
670
|
+
return;
|
|
652
671
|
if (children) {
|
|
653
672
|
let allChecked = true;
|
|
654
673
|
let hasChecked = false;
|
|
655
674
|
for (const childNode of children) {
|
|
656
675
|
const key = childNode.key;
|
|
676
|
+
if (tree.hiddenNodeKeySet.has(key))
|
|
677
|
+
continue;
|
|
657
678
|
if (checkedKeySet.has(key)) {
|
|
658
679
|
hasChecked = true;
|
|
659
680
|
}
|
|
@@ -701,7 +722,7 @@ function useCheck(props, tree) {
|
|
|
701
722
|
// 多选
|
|
702
723
|
const toggle = (node, checked) => {
|
|
703
724
|
// 对隐藏的节点不做处理
|
|
704
|
-
if (hiddenNodeKeySet.has(node.key))
|
|
725
|
+
if (hiddenNodeKeySet.has(node.key) || tree.hiddenNodeKeySet.has(node.key))
|
|
705
726
|
return;
|
|
706
727
|
checkedKeySet[checked ? 'add' : 'delete'](node.key);
|
|
707
728
|
const children = node.children;
|
|
@@ -950,6 +971,7 @@ function useCheck(props, tree) {
|
|
|
950
971
|
isIndeterminate,
|
|
951
972
|
// expose
|
|
952
973
|
getChecked,
|
|
974
|
+
afterNodeCheck,
|
|
953
975
|
getCheckedKeys,
|
|
954
976
|
getCheckedNodes,
|
|
955
977
|
getHalfCheckedKeys,
|
|
@@ -964,7 +986,8 @@ function useFilter(config, filterMethod, tree = {
|
|
|
964
986
|
treeNodeMap: new Map(),
|
|
965
987
|
levelTreeNodeMap: new Map(),
|
|
966
988
|
treeNodes: [],
|
|
967
|
-
maxLevel: 0
|
|
989
|
+
maxLevel: 0,
|
|
990
|
+
hiddenNodeKeySet: new Set()
|
|
968
991
|
}) {
|
|
969
992
|
const hiddenNodeKeySet = new Set([]);
|
|
970
993
|
const hiddenExpandIconKeySet = new Set([]);
|
|
@@ -974,6 +997,7 @@ function useFilter(config, filterMethod, tree = {
|
|
|
974
997
|
if (!isFunction(filterMethod)) {
|
|
975
998
|
return;
|
|
976
999
|
}
|
|
1000
|
+
const { integratedBusiness } = config.businessConfig;
|
|
977
1001
|
const { getCount, getTotal, countFilter, totalFilter } = useHandleFun(config);
|
|
978
1002
|
const isCountFiler = countFilter && isFunction(countFilter);
|
|
979
1003
|
const isTotalFiler = totalFilter && isFunction(totalFilter);
|
|
@@ -984,21 +1008,39 @@ function useFilter(config, filterMethod, tree = {
|
|
|
984
1008
|
const nodes = tree.treeNodes || [];
|
|
985
1009
|
hiddenKeys.clear();
|
|
986
1010
|
function traverse(nodes, isShow = false) {
|
|
1011
|
+
const deepBusinessList = [];
|
|
987
1012
|
let count = 0;
|
|
988
1013
|
let total = 0;
|
|
989
1014
|
nodes.forEach((node) => {
|
|
1015
|
+
const businessList = [];
|
|
990
1016
|
family.push(node);
|
|
1017
|
+
if (tree.hiddenNodeKeySet.has(node.key))
|
|
1018
|
+
return;
|
|
991
1019
|
if (isShow || (filterMethod && filterMethod(params, node.data, node))) {
|
|
992
1020
|
family.forEach((member) => {
|
|
993
1021
|
expandKeySet.add(member.key);
|
|
994
1022
|
});
|
|
1023
|
+
if (integratedBusiness && !/^1|4$/.test(node.data.dataType)) {
|
|
1024
|
+
businessList.push(node.data);
|
|
1025
|
+
deepBusinessList.push(node.data);
|
|
1026
|
+
}
|
|
995
1027
|
}
|
|
996
1028
|
else if (node.isLeaf) {
|
|
997
1029
|
hiddenKeys.add(node.key);
|
|
998
1030
|
}
|
|
999
1031
|
const children = node.children;
|
|
1000
1032
|
if (children) {
|
|
1001
|
-
const { count: childCount, total: childTotal } = traverse(children, filterAll ? false : expandKeySet.has(node.key));
|
|
1033
|
+
const { count: childCount, total: childTotal, businessList: list2 } = traverse(children, filterAll ? false : expandKeySet.has(node.key));
|
|
1034
|
+
// 保存下层业务数据
|
|
1035
|
+
if (integratedBusiness) {
|
|
1036
|
+
for (const target of list2) {
|
|
1037
|
+
if (!/^1|4$/.test(target.dataType)) {
|
|
1038
|
+
businessList.push(target);
|
|
1039
|
+
deepBusinessList.push(target);
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
node.data.childrenDeviceList = businessList;
|
|
1043
|
+
}
|
|
1002
1044
|
node.count = isCountFiler ? childCount : getCount(node);
|
|
1003
1045
|
node.total = isTotalFiler ? childTotal : getTotal(node);
|
|
1004
1046
|
count += childCount;
|
|
@@ -1037,7 +1079,7 @@ function useFilter(config, filterMethod, tree = {
|
|
|
1037
1079
|
}
|
|
1038
1080
|
family.pop();
|
|
1039
1081
|
});
|
|
1040
|
-
return { count, total };
|
|
1082
|
+
return { count, total, businessList: deepBusinessList };
|
|
1041
1083
|
}
|
|
1042
1084
|
traverse(nodes);
|
|
1043
1085
|
return expandKeySet;
|
|
@@ -1059,6 +1101,8 @@ function useFilter(config, filterMethod, tree = {
|
|
|
1059
1101
|
let total = 0;
|
|
1060
1102
|
nodes.forEach((node) => {
|
|
1061
1103
|
family.push(node);
|
|
1104
|
+
if (tree.hiddenNodeKeySet.has(node.key))
|
|
1105
|
+
return;
|
|
1062
1106
|
if (isShow || (filterMethod && filterMethod(params, node.data, node))) {
|
|
1063
1107
|
family.forEach((member) => {
|
|
1064
1108
|
expandKeySet.add(member.key);
|
|
@@ -1352,13 +1396,15 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
|
|
|
1352
1396
|
};
|
|
1353
1397
|
}
|
|
1354
1398
|
|
|
1355
|
-
var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqIOeUn+aIkOmFjee9rumhuSAqLwogIC8qKiDnlJ/miJDlpITnkIblh73mlbAgKi8KICBjb25zdCB1c2VIYW5kbGVGdW4gPSAoY29uZmlnKSA9PiB7CiAgICAgIGNvbnN0IHsgYnVzaW5lc3MgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmNvbmZpZy5wcm9wcyB9OwogICAgICBsZXQgeyBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHByb3BzOwogICAgICAvKiog6I635Y+Wa2V55YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldEtleShub2RlLCBpc0J1c2luZXNzID0gZmFsc2UpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICBpZiAoYnVzaW5lc3MgJiYgaXNCdXNpbmVzcykgewogICAgICAgICAgICAgIHN3aXRjaCAoYnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAnZGV2aWNlJzoKICAgICAgICAgICAgICAgICAgY2FzZSAnZ3JvdXBEZXZpY2UnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZGV2aWNlSWQ7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ3VzZXInOgogICAgICAgICAgICAgICAgICBjYXNlICdjcyc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5pZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy52YWx1ZV07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmxhYmVs5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldExhYmVsKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy5sYWJlbF07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmNoaWxkcmVu5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldENoaWxkcmVuKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbcHJvcHMuY2hpbGRyZW5dOwogICAgICAgICAgcmV0dXJuIGNoaWxkcmVuID8gWy4uLmNoaWxkcmVuXSA6IFtdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Zjb3VudOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRDb3VudChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMuY291bnRdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Z0b3RhbOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRUb3RhbChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMudG90YWxdOwogICAgICB9CiAgICAgIGlmIChbJ2RldmljZScsICdncm91cERldmljZSddLmluY2x1ZGVzKGAke2J1c2luZXNzfWApKSB7CiAgICAgICAgICBjb3VudEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDMgJiYgZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMTsKICAgICAgICAgIH07CiAgICAgICAgICB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDM7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIGVsc2UgaWYgKGJ1c2luZXNzID09PSAndXNlcicpIHsKICAgICAgICAgIGNvdW50RmlsdGVyID0gdG90YWxGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSA1OwogICAgICAgICAgfTsKICAgICAgfQogICAgICBlbHNlIGlmIChidXNpbmVzcyA9PT0gJ2NzJykgewogICAgICAgICAgY291bnRGaWx0ZXIgPSB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDg7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgICBnZXRLZXksCiAgICAgICAgICBnZXRMYWJlbCwKICAgICAgICAgIGdldENoaWxkcmVuLAogICAgICAgICAgZ2V0Q291bnQsCiAgICAgICAgICBnZXRUb3RhbCwKICAgICAgICAgIGNvdW50RmlsdGVyLAogICAgICAgICAgdG90YWxGaWx0ZXIsCiAgICAgICAgICAvLyDorr7nva7orr7lpIfnirbmgIEKICAgICAgICAgIHNldERldmljZVN0YXR1czogKGRhdGEpID0+IHsKICAgICAgICAgICAgICBpZiAoZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAvLyDnm5HmjqfkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9uaXRvciA9PT0gMSB8fCBkYXRhLmJlTW9uaXRvciA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa6K+d5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvQ2FsbCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5b2V5YOP5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvUmVjb3JkaW5nID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlvZXpn7PkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXVkaW9SZWNvcmRpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOW5v+aSreS4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5icm9hZGNhc3QgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIFNPUwogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zb3MgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOWcqOe6vwogICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8g56a757q/CiAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgIH07CiAgfTsKCiAgY29uc3QgaXNTdHJpbmcgPSAoZSkgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnOwogIGNvbnN0IGlzTnVtYmVyID0gKGUpID0+IHR5cGVvZiBlID09PSAnbnVtYmVyJzsKICBjb25zdCBpc0FycmF5ID0gKGUpID0+IEFycmF5LmlzQXJyYXkoZSk7CgogIC8vIOWkhOeQhmZpbHRlckNvbmZpZwogIGZ1bmN0aW9uIGhhbmRsZUZpbHRlckNvbmZpZyhmaWx0ZXJDb25maWcpIHsKICAgICAgcmV0dXJuIChmaWx0ZXJDb25maWcgfHwgW10pLmZpbHRlcigoaXRlbSkgPT4gewogICAgICAgICAgcmV0dXJuIChpc1N0cmluZyhpdGVtLnByb3ApICYmCiAgICAgICAgICAgICAgKGlzU3RyaW5nKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIChpc0FycmF5KGl0ZW0udmFsdWUpICYmIGl0ZW0uY29uZGl0aW9uID09PSAnYmV0d2VlbicpKSAmJgogICAgICAgICAgICAgIC9eKGVxfG5lfGlufG5vdElufGJldHdlZW58Z3R8bHR8Z2V8bGUpJC8udGVzdChpdGVtLmNvbmRpdGlvbikpOwogICAgICB9KTsKICB9CiAgLy8g5qCh6aqMZmlsdGVyQ29uZmlnCiAgZnVuY3Rpb24gdXNlRmlsdGVyQ29uZmlnKGRhdGEsIGZpbHRlckxpc3QpIHsKICAgICAgaWYgKCFmaWx0ZXJMaXN0IHx8ICFmaWx0ZXJMaXN0Lmxlbmd0aCkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmlsdGVyTGlzdC5ldmVyeSgoeyBwcm9wLCB2YWx1ZSwgY29uZGl0aW9uIH0pID0+IHsKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGFbcHJvcF07CiAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbikgewogICAgICAgICAgICAgIGNhc2UgJ2VxJzoKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gdmFsdWU7CiAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICE9PSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgIGlmIChjb25kaXRpb24gPT09ICdiZXR3ZWVuJykgewogICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldCA+PSB2YWx1ZVswXSAmJiB0YXJnZXQgPD0gdmFsdWVbMV0KICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTnVtYmVyKHRhcmdldCkpIHsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2d0JzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAnbHQnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA8IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdnZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ID49IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdsZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0IDw9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKHRhcmdldCkpIHsKICAgICAgICAgICAgICBjb25zdCBpc0luID0gdGFyZ2V0LmluY2x1ZGVzKGAke3ZhbHVlfWApOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2luJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0luOwogICAgICAgICAgICAgICAgICBjYXNlICdub3RJbic6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzSW47CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICB9CgogIHNlbGYub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHsgZGF0YSwgY29uZmlnIH0gPSBldmVudC5kYXRhOwogICAgICBjb25zdCBnZW5lcmF0ZVRyZWUgPSBnZW5lcmF0ZU1hcFtjb25maWcuYnVzaW5lc3NdOwogICAgICBpZiAoIWdlbmVyYXRlVHJlZSkgewogICAgICAgICAgc2VsZi5jbG9zZSgpOwogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHRyZWUgPSBnZW5lcmF0ZVRyZWUoZGF0YSwgY29uZmlnKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh0cmVlKTsKICB9OwogIC8vIOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IGNsZWFyRW1wdHlCdXNpbmVzcyB9ID0gY29uZmlnLnByb3BzOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIsIHNldERldmljZVN0YXR1cyB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog6K6+5aSH5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZURldmljZVRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGRldmljZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlTGlzdCA9IFtbXSwgW11dOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICcnICsgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LmRldk5hbWUgfHwgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAzLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFsxXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0WzBdLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5kZXZpY2VMaXN0WzBdLCAuLi5kZXZpY2VMaXN0WzFdXTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieeUqOaIt+eahOmDqOmXqCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsIH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGRldmljZU1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcwogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlRGV2aWNlVHJlZShkYXRhKTsKICB9CiAgLy8g576k57uE6K6+5aSH5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVHcm91cERldmljZVRyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5wcm9wczsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyLCBzZXREZXZpY2VTdGF0dXMgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOe+pOe7hOiuvuWkh+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBkZXZpY2VNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgLy8g576k57uECiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmNoaWxkcmVuPy5sZW5ndGggfHwKICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZ3JvdXBMaXN0Py5sZW5ndGggfHwKICAgICAgICAgICAgICAgICAgICAgICFbMywgNF0uaW5jbHVkZXMocmF3Tm9kZS5kYXRhVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZ3JvdXBMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICcnICsgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2Lmdyb3VwTmFtZSB8fCB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDQgLy8g5Luj6KGo576k57uECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmdyb3VwTGlzdF07CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZUxpc3Q/Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlTGlzdCA9IFtbXSwgW11dOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmRldmljZUxpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJycgKyB2LmRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5kZXZOYW1lIHx8IHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAzLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzOiBzZXREZXZpY2VTdGF0dXModikgLy8g6K6+5aSH54q25oCBCiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5kZXZpY2VTdGF0dXMgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3RbMV0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFswXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5kZXZpY2VMaXN0WzBdLCAuLi5kZXZpY2VMaXN0WzFdXTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsIH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGRldmljZU1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcwogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlRGV2aWNlVHJlZShkYXRhKTsKICB9CiAgLy8g576k57uE5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVHcm91cFRyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5wcm9wczsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbn0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgLyoqIOe+pOe7hOagkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVHcm91cFRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZVRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDnvqTnu4QKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY2hpbGRyZW4/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgIVszLCA0XS5pbmNsdWRlcyhyYXdOb2RlLmRhdGFUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJycgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZ3JvdXBOYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNCAvLyDku6PooajnvqTnu4QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZ3JvdXBMaXN0XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VDb3VudCA9IHJhd05vZGUuZGV2aWNlTGlzdC5yZWR1Y2UoKHZhbHVlLCB2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICsgKHYub25saW5lU3RhdGUgPT09IDEgPyAxIDogMCk7CiAgICAgICAgICAgICAgICAgICAgICB9LCBkZXZpY2VDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VUb3RhbCA9IHJhd05vZGUuZGV2aWNlTGlzdC5sZW5ndGggfHwgMDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGRldmljZUNvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gZGV2aWNlVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH5ZKM576k57uE55qE6YOo6ZeoIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5aSE55CG6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGRldmljZUNvdW50OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGRldmljZVRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CiAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB7IGxpc3Q6IHNpYmxpbmdzLCBjb3VudCwgdG90YWwgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZUdyb3VwVHJlZShkYXRhKTsKICB9CiAgLy8g55So5oi35qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVVc2VyVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IGNsZWFyRW1wdHlCdXNpbmVzcyB9ID0gY29uZmlnLnByb3BzOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOeUqOaIt+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVVc2VyVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgdXNlck1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gNSkgewogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VVc2VyTGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZGV2aWNlVXNlckxpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJycgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYubmFtZSB8fCB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDUsIC8vIOS7o+ihqOeUqOaItwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieeUqOaIt+eahOmDqOmXqCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gNSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbGlzdDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGlsZENvdW50IDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBjaGlsZFRvdGFsIDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNoaWxkQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGlsZFRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOe7n+iuoQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDnlKjmiLcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgPT09IDUpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IG5vZGUuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJMaXN0ID0gdXNlck1hcC5nZXQoaWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgdXNlckxpc3QucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIHVzZXJNYXAuc2V0KGlkLCB1c2VyTGlzdCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICB1c2VyTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVVc2VyVHJlZShkYXRhKTsKICB9CiAgLy8g6YeH6ZuG56uZ5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVDc1RyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5wcm9wczsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDph4fpm4bnq5nmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlQ3NUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBjc01hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jc0xpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmNzTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnJyArIHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5zbmFtZSB8fCB2LnNjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDgsIC8vIOS7o+ihqOmHh+mbhuermQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeaciemHh+mbhuWZqOeahOmDqOmXqCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6YeH6ZuG5Zmo55qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbGlzdDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGlsZENvdW50IDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBjaGlsZFRvdGFsIDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNoaWxkQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGlsZFRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOe7n+iuoQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDph4fpm4bnq5kKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgPT09IDgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IG5vZGUuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJMaXN0ID0gY3NNYXAuZ2V0KGlkKSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgIHVzZXJMaXN0LnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBjc01hcC5zZXQoaWQsIHVzZXJMaXN0KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsIH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGNzTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVDc1RyZWUoZGF0YSk7CiAgfQogIGNvbnN0IGdlbmVyYXRlTWFwID0gewogICAgICAvLyDorr7lpIfmoJEKICAgICAgZGV2aWNlOiBnZW5lcmF0ZURldmljZVRyZWUsCiAgICAgIC8vIOe+pOe7hOiuvuWkh+agkQogICAgICBncm91cERldmljZTogZ2VuZXJhdGVHcm91cERldmljZVRyZWUsCiAgICAgIC8vIOe+pOe7hOagkQogICAgICBncm91cDogZ2VuZXJhdGVHcm91cFRyZWUsCiAgICAgIC8vIOeUqOaIt+agkQogICAgICB1c2VyOiBnZW5lcmF0ZVVzZXJUcmVlLAogICAgICAvLyDph4fpm4bnq5kKICAgICAgY3M6IGdlbmVyYXRlQ3NUcmVlCiAgfTsKCn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWdlbmVyYXRlVHJlZS5qcy5tYXAKCg==');
|
|
1399
|
+
var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqIOeUn+aIkOmFjee9rumhuSAqLwogIC8qKiDnlJ/miJDlpITnkIblh73mlbAgKi8KICBjb25zdCB1c2VIYW5kbGVGdW4gPSAoY29uZmlnKSA9PiB7CiAgICAgIGNvbnN0IHsgYnVzaW5lc3MgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmNvbmZpZy5wcm9wcyB9OwogICAgICBsZXQgeyBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHByb3BzOwogICAgICAvKiog6I635Y+Wa2V55YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldEtleShub2RlLCBpc0J1c2luZXNzID0gZmFsc2UpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICBpZiAoYnVzaW5lc3MgJiYgaXNCdXNpbmVzcykgewogICAgICAgICAgICAgIHN3aXRjaCAoYnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAnZGV2aWNlJzoKICAgICAgICAgICAgICAgICAgY2FzZSAnZ3JvdXBEZXZpY2UnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZGV2aWNlSWQ7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ3VzZXInOgogICAgICAgICAgICAgICAgICBjYXNlICdjcyc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5pZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy52YWx1ZV07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmxhYmVs5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldExhYmVsKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy5sYWJlbF07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmNoaWxkcmVu5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldENoaWxkcmVuKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbcHJvcHMuY2hpbGRyZW5dOwogICAgICAgICAgcmV0dXJuIGNoaWxkcmVuID8gWy4uLmNoaWxkcmVuXSA6IFtdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Zjb3VudOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRDb3VudChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMuY291bnRdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Z0b3RhbOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRUb3RhbChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMudG90YWxdOwogICAgICB9CiAgICAgIGlmIChbJ2RldmljZScsICdncm91cERldmljZSddLmluY2x1ZGVzKGAke2J1c2luZXNzfWApKSB7CiAgICAgICAgICBjb3VudEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDMgJiYgZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMTsKICAgICAgICAgIH07CiAgICAgICAgICB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDM7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIGVsc2UgaWYgKGJ1c2luZXNzID09PSAndXNlcicpIHsKICAgICAgICAgIGNvdW50RmlsdGVyID0gdG90YWxGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSA1OwogICAgICAgICAgfTsKICAgICAgfQogICAgICBlbHNlIGlmIChidXNpbmVzcyA9PT0gJ2NzJykgewogICAgICAgICAgY291bnRGaWx0ZXIgPSB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDg7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgICBnZXRLZXksCiAgICAgICAgICBnZXRMYWJlbCwKICAgICAgICAgIGdldENoaWxkcmVuLAogICAgICAgICAgZ2V0Q291bnQsCiAgICAgICAgICBnZXRUb3RhbCwKICAgICAgICAgIGNvdW50RmlsdGVyLAogICAgICAgICAgdG90YWxGaWx0ZXIsCiAgICAgICAgICAvLyDorr7nva7orr7lpIfnirbmgIEKICAgICAgICAgIHNldERldmljZVN0YXR1czogKGRhdGEpID0+IHsKICAgICAgICAgICAgICBpZiAoZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAvLyDnm5HmjqfkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9uaXRvciA9PT0gMSB8fCBkYXRhLmJlTW9uaXRvciA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa6K+d5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvQ2FsbCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5b2V5YOP5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvUmVjb3JkaW5nID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlvZXpn7PkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXVkaW9SZWNvcmRpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOW5v+aSreS4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5icm9hZGNhc3QgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIFNPUwogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zb3MgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOWcqOe6vwogICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8g56a757q/CiAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgIH07CiAgfTsKCiAgY29uc3QgaXNTdHJpbmcgPSAoZSkgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnOwogIGNvbnN0IGlzTnVtYmVyID0gKGUpID0+IHR5cGVvZiBlID09PSAnbnVtYmVyJzsKICBjb25zdCBpc0FycmF5ID0gKGUpID0+IEFycmF5LmlzQXJyYXkoZSk7CgogIC8vIOWkhOeQhmZpbHRlckNvbmZpZwogIGZ1bmN0aW9uIGhhbmRsZUZpbHRlckNvbmZpZyhmaWx0ZXJDb25maWcpIHsKICAgICAgcmV0dXJuIChmaWx0ZXJDb25maWcgfHwgW10pLmZpbHRlcigoaXRlbSkgPT4gewogICAgICAgICAgcmV0dXJuIChpc1N0cmluZyhpdGVtLnByb3ApICYmCiAgICAgICAgICAgICAgKGlzU3RyaW5nKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIChpc0FycmF5KGl0ZW0udmFsdWUpICYmIGl0ZW0uY29uZGl0aW9uID09PSAnYmV0d2VlbicpKSAmJgogICAgICAgICAgICAgIC9eKGVxfG5lfGlufG5vdElufGJldHdlZW58Z3R8bHR8Z2V8bGUpJC8udGVzdChpdGVtLmNvbmRpdGlvbikpOwogICAgICB9KTsKICB9CiAgLy8g5qCh6aqMZmlsdGVyQ29uZmlnCiAgZnVuY3Rpb24gdXNlRmlsdGVyQ29uZmlnKGRhdGEsIGZpbHRlckxpc3QpIHsKICAgICAgaWYgKCFmaWx0ZXJMaXN0IHx8ICFmaWx0ZXJMaXN0Lmxlbmd0aCkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmlsdGVyTGlzdC5ldmVyeSgoeyBwcm9wLCB2YWx1ZSwgY29uZGl0aW9uIH0pID0+IHsKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGFbcHJvcF07CiAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbikgewogICAgICAgICAgICAgIGNhc2UgJ2VxJzoKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gdmFsdWU7CiAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICE9PSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgIGlmIChjb25kaXRpb24gPT09ICdiZXR3ZWVuJykgewogICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldCA+PSB2YWx1ZVswXSAmJiB0YXJnZXQgPD0gdmFsdWVbMV0KICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTnVtYmVyKHRhcmdldCkpIHsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2d0JzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAnbHQnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA8IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdnZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ID49IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdsZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0IDw9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKHRhcmdldCkpIHsKICAgICAgICAgICAgICBjb25zdCBpc0luID0gdGFyZ2V0LmluY2x1ZGVzKGAke3ZhbHVlfWApOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2luJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0luOwogICAgICAgICAgICAgICAgICBjYXNlICdub3RJbic6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzSW47CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICB9CgogIHNlbGYub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHsgZGF0YSwgY29uZmlnIH0gPSBldmVudC5kYXRhOwogICAgICBjb25zdCBnZW5lcmF0ZVRyZWUgPSBnZW5lcmF0ZU1hcFtjb25maWcuYnVzaW5lc3NdOwogICAgICBpZiAoIWdlbmVyYXRlVHJlZSkgewogICAgICAgICAgc2VsZi5jbG9zZSgpOwogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHRyZWUgPSBnZW5lcmF0ZVRyZWUoZGF0YSwgY29uZmlnKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh0cmVlKTsKICB9OwogIC8vIOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIsIHNldERldmljZVN0YXR1cyB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog6K6+5aSH5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZURldmljZVRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGRldmljZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGhpZGRlbk5vZGVLZXlTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgYnVzaW5lc3NMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlTGlzdCA9IFtbXSwgW11dOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICcnICsgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LmRldk5hbWUgfHwgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAzLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFtzb3J0QnlTdGF0dXMgPyAxIDogMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3RbMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzICYmICFoaWRkZW5Ob2RlS2V5U2V0LmhhcyhnZXRLZXkodGFyZ2V0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmRldmljZUxpc3RbMF0sIC4uLmRldmljZUxpc3RbMV1dOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgLy8g6ZqQ6JeP5rKh5pyJ5Zyo57q/6K6+5aSH55qE6YOo6Zeo5ZKM576k57uECiAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93T25saW5lU3RhdGUgJiYgY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heaYvuekuuWcqOe6v+iuvuWkh+aXtu+8jOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSAmJiAhY2hpbGRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlIHx8ICFoaWRkZW5Ob2RlS2V5U2V0Lmhhcyhub2RlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgZGV2aWNlTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZURldmljZVRyZWUoZGF0YSk7CiAgfQogIC8vIOe+pOe7hOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlR3JvdXBEZXZpY2VUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgc29ydEJ5U3RhdHVzLCBzaG93T25saW5lU3RhdGUsIGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW4sIGNvdW50RmlsdGVyLCB0b3RhbEZpbHRlciwgc2V0RGV2aWNlU3RhdHVzIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDnvqTnu4Torr7lpIfmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlRGV2aWNlVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgZGV2aWNlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgaGlkZGVuTm9kZUtleVNldCA9IG5ldyBTZXQoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIC8vIOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jaGlsZHJlbj8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cExpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZ3JvdXBMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnJyArIHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5ncm91cE5hbWUgfHwgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA0IC8vIOS7o+ihqOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cExpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5ncm91cExpc3RdOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldmljZUxpc3QgPSBbW10sIFtdXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICcnICsgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZGV2TmFtZSB8fCB2LmRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMywgLy8g5Luj6KGo6K6+5aSHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0W3NvcnRCeVN0YXR1cyA/IDEgOiAwXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFswXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcyAmJiAhaGlkZGVuTm9kZUtleVNldC5oYXMoZ2V0S2V5KHRhcmdldCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5kZXZpY2VMaXN0WzBdLCAuLi5kZXZpY2VMaXN0WzFdXTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIC8vIOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQobm9kZS5rZXkpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlICYmIGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAvLyDku4XmmL7npLrlnKjnur/orr7lpIfml7bvvIzpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUgJiYgIWNoaWxkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSB8fCAhaGlkZGVuTm9kZUtleVNldC5oYXMobm9kZS5rZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXZpY2VJZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlSW5mbyA9IGRldmljZU1hcC5nZXQoZGV2aWNlSWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwLnNldChkZXZpY2VJZCwgZGV2aWNlSW5mbyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGRldmljZU1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpOwogIH0KICAvLyDnvqTnu4TmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZUdyb3VwVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW59ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIC8qKiDnvqTnu4TmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlR3JvdXBUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZVRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDnvqTnu4QKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY2hpbGRyZW4/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgIVszLCA0XS5pbmNsdWRlcyhyYXdOb2RlLmRhdGFUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJycgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZ3JvdXBOYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNCAvLyDku6PooajnvqTnu4QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZ3JvdXBMaXN0XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VDb3VudCA9IHJhd05vZGUuZGV2aWNlTGlzdC5yZWR1Y2UoKHZhbHVlLCB2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHYpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKyAodi5vbmxpbmVTdGF0ZSA9PT0gMSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgIH0sIGRldmljZUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgIGRldmljZVRvdGFsID0gcmF3Tm9kZS5kZXZpY2VMaXN0Lmxlbmd0aCB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gZGV2aWNlQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBkZXZpY2VUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIflkoznvqTnu4TnmoTpg6jpl6gg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICFbMywgNF0uaW5jbHVkZXMocmF3Tm9kZS5kYXRhVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlpITnkIbpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5LiL5bGC5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbGlzdDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YS5jaGlsZHJlbkRldmljZUxpc3QgPSBidXNpbmVzc0xpc3Q7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbGlzdDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGlsZENvdW50IDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBjaGlsZFRvdGFsIDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNoaWxkQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGlsZFRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBkZXZpY2VDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBkZXZpY2VUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVHcm91cFRyZWUoZGF0YSk7CiAgfQogIC8vIOeUqOaIt+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlVXNlclRyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOeUqOaIt+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVVc2VyVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgdXNlck1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZVVzZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VVc2VyTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnJyArIHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5uYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNSwgLy8g5Luj6KGo55So5oi3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VGaWx0ZXJDb25maWcodGFyZ2V0LCBmaWx0ZXJMaXN0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInnlKjmiLfnmoTpg6jpl6gg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieeUqOaIt+eahOmDqOmXqCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5LiL5bGC5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbGlzdDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YS5jaGlsZHJlbkRldmljZUxpc3QgPSBidXNpbmVzc0xpc3Q7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbGlzdDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGlsZENvdW50IDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBjaGlsZFRvdGFsIDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNoaWxkQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGlsZFRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOe7n+iuoQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDnlKjmiLcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgPT09IDUpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IG5vZGUuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJMaXN0ID0gdXNlck1hcC5nZXQoaWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgdXNlckxpc3QucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIHVzZXJNYXAuc2V0KGlkLCB1c2VyTGlzdCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIHVzZXJNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVVc2VyVHJlZShkYXRhKTsKICB9CiAgLy8g6YeH6ZuG56uZ5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVDc1RyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOmHh+mbhuermeagkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVDc1RyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGNzTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXMsIGxldmVsID0gMSwgcGFyZW50ID0gdW5kZWZpbmVkKSA9PiB7CiAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTsKICAgICAgICAgICAgICBjb25zdCBkZWVwQnVzaW5lc3NMaXN0ID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY3NMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5jc0xpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJycgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuc25hbWUgfHwgdi5zY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA4LCAvLyDku6Pooajph4fpm4bnq5kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeaciemHh+mbhuWZqOeahOmDqOmXqCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6YeH6ZuG5Zmo55qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0b3RhbEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmHh+mbhuermQogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckxpc3QgPSBjc01hcC5nZXQoaWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgdXNlckxpc3QucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIGNzTWFwLnNldChpZCwgdXNlckxpc3QpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CiAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB7IGxpc3Q6IHNpYmxpbmdzLCBjb3VudCwgdG90YWwsIGJ1c2luZXNzTGlzdDogZGVlcEJ1c2luZXNzTGlzdCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICBjc01hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0OiBuZXcgU2V0KCkKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZUNzVHJlZShkYXRhKTsKICB9CiAgY29uc3QgZ2VuZXJhdGVNYXAgPSB7CiAgICAgIC8vIOiuvuWkh+agkQogICAgICBkZXZpY2U6IGdlbmVyYXRlRGV2aWNlVHJlZSwKICAgICAgLy8g576k57uE6K6+5aSH5qCRCiAgICAgIGdyb3VwRGV2aWNlOiBnZW5lcmF0ZUdyb3VwRGV2aWNlVHJlZSwKICAgICAgLy8g576k57uE5qCRCiAgICAgIGdyb3VwOiBnZW5lcmF0ZUdyb3VwVHJlZSwKICAgICAgLy8g55So5oi35qCRCiAgICAgIHVzZXI6IGdlbmVyYXRlVXNlclRyZWUsCiAgICAgIC8vIOmHh+mbhuermQogICAgICBjczogZ2VuZXJhdGVDc1RyZWUKICB9OwoKfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2VuZXJhdGVUcmVlLmpzLm1hcAoK');
|
|
1356
1400
|
/* eslint-enable */
|
|
1357
1401
|
|
|
1358
1402
|
// 设备树
|
|
1359
1403
|
function updateDeviceTree(tree, data, config) {
|
|
1360
1404
|
const deviceMap = tree.deviceMap || new Map();
|
|
1405
|
+
let beOnlineList = [], beOfflineList = [];
|
|
1361
1406
|
const { countFilter, totalFilter, setDeviceStatus } = useHandleFun(config);
|
|
1407
|
+
const { sortByStatus, showOnlineState, integratedBusiness } = config.businessConfig;
|
|
1362
1408
|
// 更新父节点统计
|
|
1363
1409
|
const updateParnetCount = (keySet) => {
|
|
1364
1410
|
const isCountFiler = countFilter && isFunction(countFilter);
|
|
@@ -1372,24 +1418,39 @@ function updateDeviceTree(tree, data, config) {
|
|
|
1372
1418
|
let total = isTotalFiler ? 0 : target.data.total;
|
|
1373
1419
|
const deviceList = [[], []];
|
|
1374
1420
|
if (isCountFiler || isTotalFiler) {
|
|
1421
|
+
const businessList = [];
|
|
1375
1422
|
let children = target.children || [];
|
|
1376
1423
|
for (let i = 0; i < children.length; i++) {
|
|
1377
1424
|
const item = target.children[i];
|
|
1378
1425
|
count =
|
|
1379
|
-
isCountFiler && countFilter
|
|
1426
|
+
isCountFiler && !tree.hiddenNodeKeySet.has(item.key) && countFilter
|
|
1380
1427
|
? count + (item.children ? item.count : countFilter(item.data))
|
|
1381
1428
|
: count;
|
|
1382
1429
|
total =
|
|
1383
|
-
isTotalFiler && totalFilter
|
|
1430
|
+
isTotalFiler && !tree.hiddenNodeKeySet.has(item.key) && totalFilter
|
|
1384
1431
|
? total + (item.children ? item.total : totalFilter(item.data))
|
|
1385
1432
|
: total;
|
|
1386
1433
|
if (item.data.deviceStatus === 0) {
|
|
1387
|
-
deviceList[1].push(item);
|
|
1434
|
+
deviceList[sortByStatus ? 1 : 0].push(item);
|
|
1388
1435
|
}
|
|
1389
1436
|
else {
|
|
1390
1437
|
deviceList[0].push(item);
|
|
1391
1438
|
}
|
|
1439
|
+
// 更新下级设备列表
|
|
1440
|
+
if (integratedBusiness && !tree.hiddenNodeKeySet.has(item.key)) {
|
|
1441
|
+
if (/^(1|4)$/.test(item.data.dataType)) {
|
|
1442
|
+
businessList.push(...(item.data.childrenDeviceList || []));
|
|
1443
|
+
}
|
|
1444
|
+
else {
|
|
1445
|
+
businessList.push(item.data);
|
|
1446
|
+
}
|
|
1447
|
+
}
|
|
1392
1448
|
}
|
|
1449
|
+
target.data.childrenDeviceList = businessList;
|
|
1450
|
+
}
|
|
1451
|
+
// 在仅显示设备时,切换显隐状态
|
|
1452
|
+
if (showOnlineState) {
|
|
1453
|
+
tree.hiddenNodeKeySet[count === 0 ? 'add' : 'delete'](target.key);
|
|
1393
1454
|
}
|
|
1394
1455
|
target.count = count;
|
|
1395
1456
|
target.total = total;
|
|
@@ -1418,11 +1479,22 @@ function updateDeviceTree(tree, data, config) {
|
|
|
1418
1479
|
deviceStatus: setDeviceStatus(v) // 设备状态
|
|
1419
1480
|
})
|
|
1420
1481
|
});
|
|
1482
|
+
// 在仅显示设备时,切换显隐状态
|
|
1483
|
+
if (showOnlineState) {
|
|
1484
|
+
if (target.data.deviceStatus === 0) {
|
|
1485
|
+
tree.hiddenNodeKeySet.add(target.key);
|
|
1486
|
+
beOfflineList.push(target);
|
|
1487
|
+
}
|
|
1488
|
+
else {
|
|
1489
|
+
tree.hiddenNodeKeySet.delete(target.key);
|
|
1490
|
+
beOnlineList.push(target);
|
|
1491
|
+
}
|
|
1492
|
+
}
|
|
1421
1493
|
target.parent && parentKeySet.add(target.parent.key);
|
|
1422
1494
|
});
|
|
1423
1495
|
});
|
|
1424
1496
|
updateParnetCount(parentKeySet);
|
|
1425
|
-
return tree;
|
|
1497
|
+
return { tree, beOnlineList, beOfflineList };
|
|
1426
1498
|
}
|
|
1427
1499
|
// 用户树
|
|
1428
1500
|
function updateUserTree(tree, data, config) {
|
|
@@ -1447,7 +1519,7 @@ function updateUserTree(tree, data, config) {
|
|
|
1447
1519
|
});
|
|
1448
1520
|
});
|
|
1449
1521
|
});
|
|
1450
|
-
return tree;
|
|
1522
|
+
return { tree };
|
|
1451
1523
|
}
|
|
1452
1524
|
// 采集站
|
|
1453
1525
|
function updateCsTree(tree, data, config) {
|
|
@@ -1472,7 +1544,7 @@ function updateCsTree(tree, data, config) {
|
|
|
1472
1544
|
});
|
|
1473
1545
|
});
|
|
1474
1546
|
});
|
|
1475
|
-
return tree;
|
|
1547
|
+
return { tree };
|
|
1476
1548
|
}
|
|
1477
1549
|
const updateTreeMap = {
|
|
1478
1550
|
// 设备树
|
|
@@ -1532,7 +1604,8 @@ class VirtualTree {
|
|
|
1532
1604
|
deviceMap: new Map(),
|
|
1533
1605
|
levelTreeNodeMap: new Map(),
|
|
1534
1606
|
treeNodes: [],
|
|
1535
|
-
maxLevel: 0
|
|
1607
|
+
maxLevel: 0,
|
|
1608
|
+
hiddenNodeKeySet: new Set()
|
|
1536
1609
|
};
|
|
1537
1610
|
_business;
|
|
1538
1611
|
_expandedKeySet = new Set(); // 展开的key
|
|
@@ -1546,6 +1619,7 @@ class VirtualTree {
|
|
|
1546
1619
|
_onNodeExpand;
|
|
1547
1620
|
_onNodeCollapse;
|
|
1548
1621
|
_getKey;
|
|
1622
|
+
_updateTree;
|
|
1549
1623
|
_businessConfig = {};
|
|
1550
1624
|
_isDestroy = false;
|
|
1551
1625
|
getChecked;
|
|
@@ -1602,8 +1676,7 @@ class VirtualTree {
|
|
|
1602
1676
|
label: this._props.label,
|
|
1603
1677
|
children: this._props.children,
|
|
1604
1678
|
count: this._props.count,
|
|
1605
|
-
total: this._props.total
|
|
1606
|
-
clearEmptyBusiness: this._props.clearEmptyBusiness
|
|
1679
|
+
total: this._props.total
|
|
1607
1680
|
},
|
|
1608
1681
|
expandedKeySet: this._expandedKeySet,
|
|
1609
1682
|
businessConfig: this._businessConfig
|
|
@@ -1675,84 +1748,12 @@ class VirtualTree {
|
|
|
1675
1748
|
treeNodeMap,
|
|
1676
1749
|
levelTreeNodeMap,
|
|
1677
1750
|
maxLevel,
|
|
1678
|
-
treeNodes: list
|
|
1751
|
+
treeNodes: list,
|
|
1752
|
+
hiddenNodeKeySet: new Set()
|
|
1679
1753
|
});
|
|
1680
1754
|
});
|
|
1681
1755
|
};
|
|
1682
1756
|
})();
|
|
1683
|
-
_updateTree = (() => {
|
|
1684
|
-
// 更新父节点统计
|
|
1685
|
-
const updateParnetCount = (keySet) => {
|
|
1686
|
-
if (!this._tree)
|
|
1687
|
-
return;
|
|
1688
|
-
const { countFilter, totalFilter } = useHandleFun({
|
|
1689
|
-
props: this._props
|
|
1690
|
-
});
|
|
1691
|
-
const isCountFiler = countFilter && isFunction(countFilter);
|
|
1692
|
-
const isTotalFiler = totalFilter && isFunction(totalFilter);
|
|
1693
|
-
const parentKeySet = new Set();
|
|
1694
|
-
for (const key of keySet) {
|
|
1695
|
-
const target = this._tree.treeNodeMap.get(key);
|
|
1696
|
-
if (!target)
|
|
1697
|
-
continue;
|
|
1698
|
-
let count = isCountFiler ? 0 : target.data.count;
|
|
1699
|
-
let total = isTotalFiler ? 0 : target.data.total;
|
|
1700
|
-
if (isCountFiler || isTotalFiler) {
|
|
1701
|
-
for (let i = 0; i < target.children.length; i++) {
|
|
1702
|
-
const item = target.children[i];
|
|
1703
|
-
count =
|
|
1704
|
-
isCountFiler && countFilter
|
|
1705
|
-
? count + (item.children ? item.count : countFilter(item.data))
|
|
1706
|
-
: count;
|
|
1707
|
-
total =
|
|
1708
|
-
isTotalFiler && totalFilter
|
|
1709
|
-
? total + (item.children ? item.total : totalFilter(item.data))
|
|
1710
|
-
: total;
|
|
1711
|
-
}
|
|
1712
|
-
}
|
|
1713
|
-
target.count = count;
|
|
1714
|
-
target.total = total;
|
|
1715
|
-
target.parent && parentKeySet.add(target.parent.key);
|
|
1716
|
-
}
|
|
1717
|
-
parentKeySet.size && updateParnetCount(parentKeySet);
|
|
1718
|
-
};
|
|
1719
|
-
return (data) => {
|
|
1720
|
-
return new Promise(async (resolve) => {
|
|
1721
|
-
// 业务树更新
|
|
1722
|
-
if (this._business) {
|
|
1723
|
-
const updateMethod = updateTreeMap[this._business];
|
|
1724
|
-
const value = updateMethod(this._tree, data, {
|
|
1725
|
-
business: this._business,
|
|
1726
|
-
props: {
|
|
1727
|
-
value: this._props.value,
|
|
1728
|
-
label: this._props.label,
|
|
1729
|
-
children: this._props.children,
|
|
1730
|
-
count: this._props.count,
|
|
1731
|
-
total: this._props.total
|
|
1732
|
-
}
|
|
1733
|
-
});
|
|
1734
|
-
Object.assign(this._tree, value);
|
|
1735
|
-
resolve({});
|
|
1736
|
-
return;
|
|
1737
|
-
}
|
|
1738
|
-
// 通用树更新
|
|
1739
|
-
const { treeNodeMap } = await this._createTree(data);
|
|
1740
|
-
const parentKeySet = new Set();
|
|
1741
|
-
for (const [key, value] of treeNodeMap) {
|
|
1742
|
-
const target = this._tree.treeNodeMap.get(key);
|
|
1743
|
-
if (!target)
|
|
1744
|
-
continue;
|
|
1745
|
-
this._tree.treeNodeMap.set(key, Object.assign(target, {
|
|
1746
|
-
data: value.data,
|
|
1747
|
-
label: value.label
|
|
1748
|
-
}));
|
|
1749
|
-
target.parent && parentKeySet.add(target.parent.key);
|
|
1750
|
-
}
|
|
1751
|
-
updateParnetCount(parentKeySet);
|
|
1752
|
-
resolve({});
|
|
1753
|
-
});
|
|
1754
|
-
};
|
|
1755
|
-
})();
|
|
1756
1757
|
/** 生成平铺树列表 */
|
|
1757
1758
|
_genereateFlattenTree() {
|
|
1758
1759
|
const expandedKeys = this._expandedKeySet;
|
|
@@ -1765,7 +1766,7 @@ class VirtualTree {
|
|
|
1765
1766
|
}
|
|
1766
1767
|
while (stack.length) {
|
|
1767
1768
|
const node = stack.pop();
|
|
1768
|
-
if (hiddenKeys.has(node.key))
|
|
1769
|
+
if (hiddenKeys.has(node.key) || this._tree.hiddenNodeKeySet.has(node.key))
|
|
1769
1770
|
continue;
|
|
1770
1771
|
flattenNodes.push(node);
|
|
1771
1772
|
if (node.children && expandedKeys.has(node.key)) {
|
|
@@ -1870,7 +1871,7 @@ class VirtualTree {
|
|
|
1870
1871
|
return;
|
|
1871
1872
|
this._tree = await this._createTree(config.data);
|
|
1872
1873
|
this._flattenTree = this._genereateFlattenTree();
|
|
1873
|
-
const { checkedKeys, isIndeterminate, isChecked, toggleCheckbox, getChecked, getCheckedKeys, getCheckedNodes,
|
|
1874
|
+
const { checkedKeys, updateCheckedKeys, isIndeterminate, isChecked, toggleCheckbox, getChecked, afterNodeCheck, getCheckedKeys, getCheckedNodes,
|
|
1874
1875
|
// getHalfCheckedKeys,
|
|
1875
1876
|
// getHalfCheckedNodes,
|
|
1876
1877
|
setChecked, setCheckedKeys, setCheckedNodes } = useCheck(config, this._tree);
|
|
@@ -2011,7 +2012,7 @@ class VirtualTree {
|
|
|
2011
2012
|
content.style.setProperty('padding-left', `${(item.level - 1) * (config.indent || 0)}px`);
|
|
2012
2013
|
// 设备离线 - 字体颜色
|
|
2013
2014
|
if (['device', 'groupDevice'].includes(config.business)
|
|
2014
|
-
&&
|
|
2015
|
+
&& this._props.showStatus
|
|
2015
2016
|
&& item.data.dataType === 3
|
|
2016
2017
|
&& item.data.deviceStatus === 0) {
|
|
2017
2018
|
content.style.color = config.placeholderColor;
|
|
@@ -2139,7 +2140,7 @@ class VirtualTree {
|
|
|
2139
2140
|
e.stopPropagation();
|
|
2140
2141
|
try {
|
|
2141
2142
|
// 双击回调
|
|
2142
|
-
if (config.onNodeDblClick) {
|
|
2143
|
+
if (!getDisabled(config, item) && config.onNodeDblClick) {
|
|
2143
2144
|
await config.onNodeDblClick(item.data, item, e);
|
|
2144
2145
|
}
|
|
2145
2146
|
if (getDisabled(config, item) ||
|
|
@@ -2188,6 +2189,97 @@ class VirtualTree {
|
|
|
2188
2189
|
}
|
|
2189
2190
|
});
|
|
2190
2191
|
config.onLoad && config.onLoad();
|
|
2192
|
+
// @ts-ignore
|
|
2193
|
+
// 更新函数
|
|
2194
|
+
this._updateTree = (() => {
|
|
2195
|
+
// 更新父节点统计
|
|
2196
|
+
const updateParnetCount = (keySet) => {
|
|
2197
|
+
if (!this._tree)
|
|
2198
|
+
return;
|
|
2199
|
+
const { countFilter, totalFilter } = useHandleFun({
|
|
2200
|
+
props: this._props
|
|
2201
|
+
});
|
|
2202
|
+
const isCountFiler = countFilter && isFunction(countFilter);
|
|
2203
|
+
const isTotalFiler = totalFilter && isFunction(totalFilter);
|
|
2204
|
+
const parentKeySet = new Set();
|
|
2205
|
+
for (const key of keySet) {
|
|
2206
|
+
const target = this._tree.treeNodeMap.get(key);
|
|
2207
|
+
if (!target)
|
|
2208
|
+
continue;
|
|
2209
|
+
let count = isCountFiler ? 0 : target.data.count;
|
|
2210
|
+
let total = isTotalFiler ? 0 : target.data.total;
|
|
2211
|
+
if (isCountFiler || isTotalFiler) {
|
|
2212
|
+
for (let i = 0; i < target.children.length; i++) {
|
|
2213
|
+
const item = target.children[i];
|
|
2214
|
+
count =
|
|
2215
|
+
isCountFiler && countFilter
|
|
2216
|
+
? count + (item.children ? item.count : countFilter(item.data))
|
|
2217
|
+
: count;
|
|
2218
|
+
total =
|
|
2219
|
+
isTotalFiler && totalFilter
|
|
2220
|
+
? total + (item.children ? item.total : totalFilter(item.data))
|
|
2221
|
+
: total;
|
|
2222
|
+
}
|
|
2223
|
+
}
|
|
2224
|
+
target.count = count;
|
|
2225
|
+
target.total = total;
|
|
2226
|
+
target.parent && parentKeySet.add(target.parent.key);
|
|
2227
|
+
}
|
|
2228
|
+
parentKeySet.size && updateParnetCount(parentKeySet);
|
|
2229
|
+
};
|
|
2230
|
+
return (data) => {
|
|
2231
|
+
return new Promise(async (resolve, reject) => {
|
|
2232
|
+
// 业务树更新
|
|
2233
|
+
if (this._business) {
|
|
2234
|
+
const updateMethod = updateTreeMap[this._business];
|
|
2235
|
+
if (!updateMethod) {
|
|
2236
|
+
reject({});
|
|
2237
|
+
return;
|
|
2238
|
+
}
|
|
2239
|
+
const { tree, beOfflineList } = updateMethod(this._tree, data, {
|
|
2240
|
+
business: this._business,
|
|
2241
|
+
props: {
|
|
2242
|
+
value: this._props.value,
|
|
2243
|
+
label: this._props.label,
|
|
2244
|
+
children: this._props.children,
|
|
2245
|
+
count: this._props.count,
|
|
2246
|
+
total: this._props.total
|
|
2247
|
+
},
|
|
2248
|
+
businessConfig: this._businessConfig
|
|
2249
|
+
});
|
|
2250
|
+
Object.assign(this._tree, tree);
|
|
2251
|
+
let updateNode = null;
|
|
2252
|
+
for (const node of (beOfflineList || [])) {
|
|
2253
|
+
if (checkedKeys.has(node.key)) {
|
|
2254
|
+
checkedKeys.delete(node.key);
|
|
2255
|
+
updateNode = node;
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
updateCheckedKeys();
|
|
2259
|
+
if (updateNode) {
|
|
2260
|
+
afterNodeCheck(updateNode, false);
|
|
2261
|
+
}
|
|
2262
|
+
resolve({});
|
|
2263
|
+
return;
|
|
2264
|
+
}
|
|
2265
|
+
// 通用树更新
|
|
2266
|
+
const { treeNodeMap } = await this._createTree(data);
|
|
2267
|
+
const parentKeySet = new Set();
|
|
2268
|
+
for (const [key, value] of treeNodeMap) {
|
|
2269
|
+
const target = this._tree.treeNodeMap.get(key);
|
|
2270
|
+
if (!target)
|
|
2271
|
+
continue;
|
|
2272
|
+
this._tree.treeNodeMap.set(key, Object.assign(target, {
|
|
2273
|
+
data: value.data,
|
|
2274
|
+
label: value.label
|
|
2275
|
+
}));
|
|
2276
|
+
target.parent && parentKeySet.add(target.parent.key);
|
|
2277
|
+
}
|
|
2278
|
+
updateParnetCount(parentKeySet);
|
|
2279
|
+
resolve({});
|
|
2280
|
+
});
|
|
2281
|
+
};
|
|
2282
|
+
})();
|
|
2191
2283
|
}
|
|
2192
2284
|
/** 全量更新数据 */
|
|
2193
2285
|
setData = (() => {
|
|
@@ -2206,6 +2298,7 @@ class VirtualTree {
|
|
|
2206
2298
|
let data;
|
|
2207
2299
|
if (!Array.isArray(config)) {
|
|
2208
2300
|
data = config.data;
|
|
2301
|
+
Object.assign(this._props, (config.props || {}));
|
|
2209
2302
|
Object.assign(this._businessConfig, config.businessConfig || {});
|
|
2210
2303
|
}
|
|
2211
2304
|
else {
|
|
@@ -2228,7 +2321,7 @@ class VirtualTree {
|
|
|
2228
2321
|
const cacheInterval = 500;
|
|
2229
2322
|
let cacheData = [];
|
|
2230
2323
|
return async (data, callback) => {
|
|
2231
|
-
if (!this._tree)
|
|
2324
|
+
if (!this._tree || !this._updateTree)
|
|
2232
2325
|
return;
|
|
2233
2326
|
cacheTimer && clearTimeout(cacheTimer);
|
|
2234
2327
|
if (Array.isArray(data)) {
|
|
@@ -2242,7 +2335,7 @@ class VirtualTree {
|
|
|
2242
2335
|
// cacheInterval毫秒仅更新一次数据
|
|
2243
2336
|
if (Date.now() - cacheTime >= cacheInterval) {
|
|
2244
2337
|
cacheTime = Date.now();
|
|
2245
|
-
this._updateTree([...cacheData]);
|
|
2338
|
+
await this._updateTree([...cacheData]);
|
|
2246
2339
|
cacheData = [];
|
|
2247
2340
|
this._refreshVirtualScroll();
|
|
2248
2341
|
callback && callback();
|
|
@@ -2312,7 +2405,8 @@ class VirtualTree {
|
|
|
2312
2405
|
filter = (params, filterAll = true) => {
|
|
2313
2406
|
const { doFilter, hiddenExpandIconKeySet, hiddenNodeKeySet, isForceHiddenExpandIcon } = useFilter({
|
|
2314
2407
|
props: this._props,
|
|
2315
|
-
business: this._business
|
|
2408
|
+
business: this._business,
|
|
2409
|
+
businessConfig: this._businessConfig
|
|
2316
2410
|
}, this._filterMethod, this._tree);
|
|
2317
2411
|
const keys = doFilter(params, filterAll);
|
|
2318
2412
|
if (keys) {
|