hy-virtual-tree 1.1.42 → 1.1.44
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 +17 -0
- package/README.md +2 -2
- package/dist/index.css +139 -2
- package/dist/index.js +824 -224
- package/package.json +2 -4
package/dist/index.js
CHANGED
|
@@ -73,6 +73,12 @@ var menu_acquisitionStation_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0
|
|
|
73
73
|
|
|
74
74
|
var noData = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjhweCIgaGVpZ2h0PSI4MHB4IiB2aWV3Qm94PSIwIDAgNjggODAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICAgICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsLW9wYWNpdHk9IjAuNiI+CiAgICAgICAgPGcgaWQ9Iuagt+W8jy0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTQzOS4wMDAwMDAsIC0zNjAuMDAwMDAwKSIgZmlsbD0iIzVFOURCNCIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgPGcgaWQ9Im5vRGF0YSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQzOS4wMDAwMDAsIDM2MC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik00OCw1MiBDNDMuMDI5MjQ2Myw1MiAzOSw1NS44MDUzOTkzIDM5LDYwLjUgQzM5LDY1LjE5NDYwMDcgNDMuMDI5MjQ2Myw2OSA0OCw2OSBDNTIuOTcwNzUzNyw2OSA1Nyw2NS4xOTQ2MDA3IDU3LDYwLjUgQzU2Ljk4OTg3NjMsNTUuODA1Mzk5MyA1Mi45NjA2Mjk5LDUyIDQ4LDUyIFogTTYyLjEyMDUyNCwwIEw1Ljg1OTY3OTgsMCBDMi42MjI5OTg1NCwwIDAsMi41NjU3MTAxNSAwLDUuNzEwMTUxOTIgTDAsNzQuMjg5ODQ4MSBDMCw3Ny40NDM5MzU0IDIuNjMyODk2NjUsODAgNS44NTk2Nzk4LDgwIEw2Mi4xMjA1MjQsODAgQzYyLjY1NTAyMTgsODAgNjMuMTY5NzIzNCw3OS45MzI0ODEzIDYzLjY2NDYyODgsNzkuODA3MDg5NSBMNTYuMDcyNzgwMiw3Mi40MDg5NzAzIEM1My43NTY2MjMsNzMuOTEzNjcyNSA1MC45NzUyNTQ3LDc0Ljc3MjEyNDQgNDcuOTk1OTI0Myw3NC43NzIxMjQ0IEMzOS44OTkyNzIyLDc0Ljc3MjEyNDQgMzMuMzM2ODI2OCw2OC4zNzcxNDAxIDMzLjMzNjgyNjgsNjAuNDg3MDk5MSBDMzMuMzM2ODI2OCw1Mi41OTcwNTgxIDM5Ljg5OTI3MjIsNDYuMjAyMDczOCA0Ny45OTU5MjQzLDQ2LjIwMjA3MzggQzU2LjA5MjU3NjQsNDYuMjAyMDczOCA2Mi42NTUwMjE4LDUyLjU5NzA1ODEgNjIuNjU1MDIxOCw2MC40ODcwOTkxIEM2Mi42NTUwMjE4LDYzLjQwMDA0ODIgNjEuNzU0Mjk0LDY2LjEwMDc5NTggNjAuMjI5OTg1NCw2OC4zNTc4NDkgTDY3LjgxMTkzNiw3NS43NDYzMjI2IEM2Ny45NDA2MTE0LDc1LjI4MzMzNzQgNjgsNzQuNzkxNDE1NSA2OCw3NC4yODAyMDI2IEw2OCw1LjcwMDUwNjM5IEM2Ny45OTAxMDE5LDIuNTU2MDY0NjMgNjUuMzU3MjA1MiwwIDYyLjEyMDUyNCwwIFogTTMwLjEwOTExMTQsNDguMTIxMjEyMSBDMjkuNTYyNDI5Nyw0OC42NjY2NjY3IDI4LjgxMzI3MzMsNDkgMjcuOTkzMjUwOCw0OSBMMTUuOTk2NjI1NCw0OC45Nzk3OTggQzE0LjM0NjQ1NjcsNDguOTc5Nzk4IDEzLDQ3LjYzNjM2MzYgMTMsNDUuOTg5ODk5IEMxMyw0NS4xNzE3MTcyIDEzLjMzNDA4MzIsNDQuNDE0MTQxNCAxMy44ODA3NjQ5LDQzLjg3ODc4NzkgQzE0LjQyNzQ0NjYsNDMuMzMzMzMzMyAxNS4xNzY2MDI5LDQzIDE1Ljk5NjYyNTQsNDMgTDI4LjAwMzM3NDYsNDMuMDIwMjAyIEMyOS42NTM1NDMzLDQzLjAyMDIwMiAzMSw0NC4zNjM2MzY0IDMxLDQ2LjAxMDEwMSBDMzAuOTg5ODc2Myw0Ni44MjgyODI4IDMwLjY0NTY2OTMsNDcuNTc1NzU3NiAzMC4xMDkxMTE0LDQ4LjEyMTIxMjEgTDMwLjEwOTExMTQsNDguMTIxMjEyMSBaIE01My4xMzk4NjAxLDMyLjExODI0MzIgQzUyLjYwNTk4MDIsMzIuNjY1NTQwNSA1MS44NzQzNjcsMzMgNTEuMDczNTQ3MSwzMyBMMTUuOTI2NDUyOSwzMyBDMTQuMzE0OTI2NSwzMyAxMywzMS42NTIwMjcgMTMsMzAgQzEzLDI5LjE3OTA1NDEgMTMuMzI2MjU5OSwyOC40MjkwNTQxIDEzLjg2MDEzOTksMjcuODgxNzU2OCBDMTQuMzk0MDE5OCwyNy4zMzQ0NTk1IDE1LjEyNTYzMywyNyAxNS45MjY0NTI5LDI3IEw1MS4wNzM1NDcxLDI3IEM1Mi42ODUwNzM1LDI3IDU0LDI4LjM0Nzk3MyA1NCwzMCBDNTQsMzAuODIwOTQ1OSA1My42NjM4NTM0LDMxLjU3MDk0NTkgNTMuMTM5ODYwMSwzMi4xMTgyNDMyIEw1My4xMzk4NjAxLDMyLjExODI0MzIgWiBNNTMuMTM5ODYwMSwxNi4xMTgyNDMyIEM1Mi42MDU5ODAyLDE2LjY2NTU0MDUgNTEuODc0MzY3LDE3IDUxLjA3MzU0NzEsMTcgTDE1LjkyNjQ1MjksMTcgQzE0LjMxNDkyNjUsMTcgMTMsMTUuNjUyMDI3IDEzLDE0IEMxMywxMy4xNzkwNTQxIDEzLjMyNjI1OTksMTIuNDE4OTE4OSAxMy44NjAxMzk5LDExLjg4MTc1NjggQzE0LjM5NDAxOTgsMTEuMzM0NDU5NSAxNS4xMjU2MzMsMTEgMTUuOTI2NDUyOSwxMSBMNTEuMDczNTQ3MSwxMSBDNTIuNjg1MDczNSwxMSA1NCwxMi4zNDc5NzMgNTQsMTQgQzU0LDE0LjgyMDk0NTkgNTMuNjYzODUzNCwxNS41NzA5NDU5IDUzLjEzOTg2MDEsMTYuMTE4MjQzMiBMNTMuMTM5ODYwMSwxNi4xMTgyNDMyIFoiIGlkPSLlvaLnirYiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+';
|
|
75
75
|
|
|
76
|
+
var video_channel_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzY0MDQyMzI0MzIxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2OTUiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTUxMS40MTA4NiAwLjAwMDI2QTUxMS4wNDk4NyA1MTEuMDQ5ODcgMCAwIDEgNjczLjA5NTgxOSAyNi4wODAyNTNsNS4xOTk5OTkgMS43OWEzNjkuMjk5OTA2IDM2OS4yOTk5MDYgMCAwIDEgMTMuNjM1OTk2IDQuODU4OTk5bDIuNTU3IDEuMDIyOTk5YTM5MS4yOTk5MDEgMzkxLjI5OTkwMSAwIDAgMSAyOC4wNDE5OTMgMTEuNjc2OTk3IDY5My43ODY4MjQgNjkzLjc4NjgyNCAwIDAgMSAzNC4wOTE5OTEgMTcuMDQ1OTk2IDU4OC42OTU4NTEgNTg4LjY5NTg1MSAwIDAgMSAzNy41ODc5OSAyMi43NTY5OTRsMTIuMTAxOTk3IDguMzUyOTk4IDQuNzcyOTk5IDMuNDA4OTk5IDkuNjMxOTk4IDcuMTU5OTk5IDYuMzA2OTk4IDQuODU3OTk4YTYwMS45MDY4NDcgNjAxLjkwNjg0NyAwIDAgMSAyOC42Mzc5OTMgMjQuMjA0OTk0IDU4NC4zNDk4NTIgNTg0LjM0OTg1MiAwIDAgMSAzNi40Nzg5OSAzNi44MTk5OTFsNC42MDE5OTkgNS4xMTM5OTlhNTIzLjA2Nzg2NyA1MjMuMDY3ODY3IDAgMCAxIDQxLjMzNzk5IDU0LjIwNzk4NmwzLjY2NDk5OSA1LjYyNDk5OGEzNjguNTQxOTA2IDM2OC41NDE5MDYgMCAwIDEgMTAuMjI3OTk3IDE2LjcwNTk5Nmw0LjI2MDk5OSA3LjI0Mzk5OCA0Ljc3Mjk5OSA4LjYwODk5OCA1LjExMzk5OSA5LjcxNTk5OCAxLjcwNDk5OSAzLjQwOTk5OSAxLjcwNCAzLjQwODk5OWEyMTIuMjg3OTQ2IDIxMi4yODc5NDYgMCAwIDEgNC44NTg5OTkgOS44ODY5OTdsMi43MjY5OTkgNS44Nzk5OTlhNDE3LjEyNDg5NCA0MTcuMTI0ODk0IDAgMCAxIDExLjg0Njk5NyAyOC4xMjY5OTNsMC40MjYgMS4yNzg5OTljMi4xMzA5OTkgNS42MjQ5OTkgNC4yNjE5OTkgMTEuMzM0OTk3IDYuMTM2OTk4IDE3LjA0NTk5NmwwLjM0MSAwLjg1MmE1MDcuMTI5ODcxIDUwNy4xMjk4NzEgMCAwIDEgMTUuNTk2OTk2IDU2Ljc2NDk4NWwxLjYyIDcuNjY5OTk4YTU3OC40Njc4NTMgNTc4LjQ2Nzg1MyAwIDAgMSA2LjIyMTk5OCAzOS44ODg5OWwxLjE5MyAxMS4wNzk5OTggMC43NjcgOC4zNTI5OTdjMC41MTIgNy4wNzM5OTggMC44NTIgMTQuMTQ3OTk2IDEuMTkyOTk5IDIxLjMwNzk5NWwwLjM0MSAxOS4xNzY5OTVBNTExLjM5MDg3IDUxMS4zOTA4NyAwIDEgMSAxLjYzOTk5IDQ3MC45MDYxNGwwLjY4MTk5OS04LjM1Mjk5NyAxLjE5My0xMS4wNzk5OThhNDk0LjU5OTg3NCA0OTQuNTk5ODc0IDAgMCAxIDIuNTU2OTk5LTE5LjE3Njk5NWwxLjcwNC0xMC41Njg5OTdMOS44MjE5ODggNDExLjUwMDE1NmwxLjUzMzk5OS03LjQ5OTk5OWE1MzYuNzA0ODY0IDUzNi43MDQ4NjQgMCAwIDEgMTUuNTk3OTk2LTU2Ljg0OTk4NWwwLjM0LTAuODUyYTU3OC4xNDc4NTMgNTc4LjE0Nzg1MyAwIDAgMSA2LjEzNjk5OS0xNy4wNDU5OTZsMC40MjU5OTktMS4yNzg5OTlhNTA3LjYzOTg3MSA1MDcuNjM5ODcxIDAgMCAxIDYuODE4OTk5LTE2Ljg3NTk5Nmw1LjAyODk5OC0xMS4yNDk5OTcgMi43MjctNS45NjY5OTkgMi4zODU5OTktNC45NDI5OTggMi4zODY5OTktNC45NDM5OTkgMy40MS02LjY0Nzk5OGEzOTMuMzQ0OSAzOTMuMzQ0OSAwIDAgMSAxNC4xNDc5OTYtMjUuNjUzOTk0IDgzMy4zMTE3ODggODMzLjMxMTc4OCAwIDAgMSAxMC4yMjc5OTctMTYuNzA1OTk2bDMuNzQ5OTk5LTUuNjI0OTk4YTQ4NS41NjU4NzcgNDg1LjU2NTg3NyAwIDAgMSA0MS4zMzY5OS01NC4xMjE5ODZsNC42MDI5OTktNS4xOTk5OTkgOC44NjM5OTgtOS42Mjk5OThhMzU4LjgyNTkwOSAzNTguODI1OTA5IDAgMCAxIDEzLjM4MDk5Ni0xMy42Mzc5OTZsNC4wMDU5OTktMy45MTk5OTlhNTkwLjY1Njg1IDU5MC42NTY4NSAwIDAgMSAyMy4wMTI5OTQtMjAuODgxOTk1bDYuNzMyOTk5LTUuNjI1OTk5YTYwNi45MzU4NDYgNjA2LjkzNTg0NiAwIDAgMSAyNS4wNTc5OTMtMTkuMzQ2OTk1bDQuNjg3OTk5LTMuNDA5OTk5YTU2MS40MjE4NTcgNTYxLjQyMTg1NyAwIDAgMSA0OS43NzQ5ODctMzEuMDIzOTkybDQuODU4OTk5LTIuNjQxOTk5IDEwLjY1Mjk5Ny01LjUzOTk5OWEzNzUuNzg2OTA1IDM3NS43ODY5MDUgMCAwIDEgMjUuMzk5OTk0LTExLjkzMjk5N2w4Ljk0ODk5OC0zLjgzNDk5OSAxMi4yNzI5OTctNC44NTc5OTkgMi41NTY5OTktMC45Mzc5OTkgMTQuNTc0OTk2LTUuMjgzOTk5IDkuNTQ1OTk4LTMuMjM4OTk5LTkuNTQ1OTk4IDMuMTUzOTk5IDQuMjYwOTk5LTEuMzY0IDEwLjQ4Mzk5OC0zLjQwOTk5OUE1MTIuNzU0ODcgNTEyLjc1NDg3IDAgMCAxIDUxMS40MTA4NiAwLjAwMDI2eiBtMCAyMDQuNTU1OTQ4YTMwNi44MzQ5MjIgMzA2LjgzNDkyMiAwIDEgMCAwIDYxMy42Njk4NDQgMzA2LjgzNDkyMiAzMDYuODM0OTIyIDAgMCAwIDAtNjEzLjY2OTg0NHogbTAgMTAyLjI3ODk3NGEyMDQuNjQxOTQ4IDIwNC42NDE5NDggMCAwIDEgMC4wODYgNDA5LjE5Nzg5NiAyMDQuNTU1OTQ4IDIwNC41NTU5NDggMCAwIDEtMjA0LjU1Njk0OC0yMDQuNTU2OTQ4YzAtMjQuMDM0OTk0IDQuODU3OTk5LTQ2Ljg3Njk4OCAxMi40NDM5OTctNjguMzU1OTgzYTc2LjcwODk4MSA3Ni43MDg5ODEgMCAwIDAgMTMyLjYxOTk2Ni01Mi4yNDY5ODYgNzYuNzA4OTgxIDc2LjcwODk4MSAwIDAgMC0zMS42MTk5OTItNjEuNzA3OTg1IDIwMS4yMzE5NDkgMjAxLjIzMTk0OSAwIDAgMSA5MS4wMjY5NzctMjIuMzI5OTk0eiBtMC0yMzAuMTI1OTQxYy00MS45MzM5ODkgMC04Mi41MDM5NzkgNS45NjU5OTgtMTIwLjk0Mzk2OSAxNy4wNDU5OTUgMjcuODcwOTkzIDM2LjMwODk5MSA3MS41OTQ5ODIgNTkuNjYxOTg1IDEyMC45NDM5NjkgNTkuNjYxOTg1IDQ5LjQzNDk4NyAwIDkyLjk4Nzk3Ni0yMy4zNTI5OTQgMTIwLjk0Mzk2OS01OS42NjE5ODVhNDMxLjg2OTg5IDQzMS44Njk4OSAwIDAgMC0xMjAuOTQzOTY5LTE3LjA0NTk5NXoiIGZpbGw9IiMyQ0U4OTgiIHAtaWQ9IjE2OTYiPjwvcGF0aD48L3N2Zz4=';
|
|
77
|
+
|
|
78
|
+
var video_channel_offLine_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzY0MDQyMzI0MzIxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2OTUiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTUxMS40MTA4NiAwLjAwMDI2QTUxMS4wNDk4NyA1MTEuMDQ5ODcgMCAwIDEgNjczLjA5NTgxOSAyNi4wODAyNTNsNS4xOTk5OTkgMS43OWEzNjkuMjk5OTA2IDM2OS4yOTk5MDYgMCAwIDEgMTMuNjM1OTk2IDQuODU4OTk5bDIuNTU3IDEuMDIyOTk5YTM5MS4yOTk5MDEgMzkxLjI5OTkwMSAwIDAgMSAyOC4wNDE5OTMgMTEuNjc2OTk3IDY5My43ODY4MjQgNjkzLjc4NjgyNCAwIDAgMSAzNC4wOTE5OTEgMTcuMDQ1OTk2IDU4OC42OTU4NTEgNTg4LjY5NTg1MSAwIDAgMSAzNy41ODc5OSAyMi43NTY5OTRsMTIuMTAxOTk3IDguMzUyOTk4IDQuNzcyOTk5IDMuNDA4OTk5IDkuNjMxOTk4IDcuMTU5OTk5IDYuMzA2OTk4IDQuODU3OTk4YTYwMS45MDY4NDcgNjAxLjkwNjg0NyAwIDAgMSAyOC42Mzc5OTMgMjQuMjA0OTk0IDU4NC4zNDk4NTIgNTg0LjM0OTg1MiAwIDAgMSAzNi40Nzg5OSAzNi44MTk5OTFsNC42MDE5OTkgNS4xMTM5OTlhNTIzLjA2Nzg2NyA1MjMuMDY3ODY3IDAgMCAxIDQxLjMzNzk5IDU0LjIwNzk4NmwzLjY2NDk5OSA1LjYyNDk5OGEzNjguNTQxOTA2IDM2OC41NDE5MDYgMCAwIDEgMTAuMjI3OTk3IDE2LjcwNTk5Nmw0LjI2MDk5OSA3LjI0Mzk5OCA0Ljc3Mjk5OSA4LjYwODk5OCA1LjExMzk5OSA5LjcxNTk5OCAxLjcwNDk5OSAzLjQwOTk5OSAxLjcwNCAzLjQwODk5OWEyMTIuMjg3OTQ2IDIxMi4yODc5NDYgMCAwIDEgNC44NTg5OTkgOS44ODY5OTdsMi43MjY5OTkgNS44Nzk5OTlhNDE3LjEyNDg5NCA0MTcuMTI0ODk0IDAgMCAxIDExLjg0Njk5NyAyOC4xMjY5OTNsMC40MjYgMS4yNzg5OTljMi4xMzA5OTkgNS42MjQ5OTkgNC4yNjE5OTkgMTEuMzM0OTk3IDYuMTM2OTk4IDE3LjA0NTk5NmwwLjM0MSAwLjg1MmE1MDcuMTI5ODcxIDUwNy4xMjk4NzEgMCAwIDEgMTUuNTk2OTk2IDU2Ljc2NDk4NWwxLjYyIDcuNjY5OTk4YTU3OC40Njc4NTMgNTc4LjQ2Nzg1MyAwIDAgMSA2LjIyMTk5OCAzOS44ODg5OWwxLjE5MyAxMS4wNzk5OTggMC43NjcgOC4zNTI5OTdjMC41MTIgNy4wNzM5OTggMC44NTIgMTQuMTQ3OTk2IDEuMTkyOTk5IDIxLjMwNzk5NWwwLjM0MSAxOS4xNzY5OTVBNTExLjM5MDg3IDUxMS4zOTA4NyAwIDEgMSAxLjYzOTk5IDQ3MC45MDYxNGwwLjY4MTk5OS04LjM1Mjk5NyAxLjE5My0xMS4wNzk5OThhNDk0LjU5OTg3NCA0OTQuNTk5ODc0IDAgMCAxIDIuNTU2OTk5LTE5LjE3Njk5NWwxLjcwNC0xMC41Njg5OTdMOS44MjE5ODggNDExLjUwMDE1NmwxLjUzMzk5OS03LjQ5OTk5OWE1MzYuNzA0ODY0IDUzNi43MDQ4NjQgMCAwIDEgMTUuNTk3OTk2LTU2Ljg0OTk4NWwwLjM0LTAuODUyYTU3OC4xNDc4NTMgNTc4LjE0Nzg1MyAwIDAgMSA2LjEzNjk5OS0xNy4wNDU5OTZsMC40MjU5OTktMS4yNzg5OTlhNTA3LjYzOTg3MSA1MDcuNjM5ODcxIDAgMCAxIDYuODE4OTk5LTE2Ljg3NTk5Nmw1LjAyODk5OC0xMS4yNDk5OTcgMi43MjctNS45NjY5OTkgMi4zODU5OTktNC45NDI5OTggMi4zODY5OTktNC45NDM5OTkgMy40MS02LjY0Nzk5OGEzOTMuMzQ0OSAzOTMuMzQ0OSAwIDAgMSAxNC4xNDc5OTYtMjUuNjUzOTk0IDgzMy4zMTE3ODggODMzLjMxMTc4OCAwIDAgMSAxMC4yMjc5OTctMTYuNzA1OTk2bDMuNzQ5OTk5LTUuNjI0OTk4YTQ4NS41NjU4NzcgNDg1LjU2NTg3NyAwIDAgMSA0MS4zMzY5OS01NC4xMjE5ODZsNC42MDI5OTktNS4xOTk5OTkgOC44NjM5OTgtOS42Mjk5OThhMzU4LjgyNTkwOSAzNTguODI1OTA5IDAgMCAxIDEzLjM4MDk5Ni0xMy42Mzc5OTZsNC4wMDU5OTktMy45MTk5OTlhNTkwLjY1Njg1IDU5MC42NTY4NSAwIDAgMSAyMy4wMTI5OTQtMjAuODgxOTk1bDYuNzMyOTk5LTUuNjI1OTk5YTYwNi45MzU4NDYgNjA2LjkzNTg0NiAwIDAgMSAyNS4wNTc5OTMtMTkuMzQ2OTk1bDQuNjg3OTk5LTMuNDA5OTk5YTU2MS40MjE4NTcgNTYxLjQyMTg1NyAwIDAgMSA0OS43NzQ5ODctMzEuMDIzOTkybDQuODU4OTk5LTIuNjQxOTk5IDEwLjY1Mjk5Ny01LjUzOTk5OWEzNzUuNzg2OTA1IDM3NS43ODY5MDUgMCAwIDEgMjUuMzk5OTk0LTExLjkzMjk5N2w4Ljk0ODk5OC0zLjgzNDk5OSAxMi4yNzI5OTctNC44NTc5OTkgMi41NTY5OTktMC45Mzc5OTkgMTQuNTc0OTk2LTUuMjgzOTk5IDkuNTQ1OTk4LTMuMjM4OTk5LTkuNTQ1OTk4IDMuMTUzOTk5IDQuMjYwOTk5LTEuMzY0IDEwLjQ4Mzk5OC0zLjQwOTk5OUE1MTIuNzU0ODcgNTEyLjc1NDg3IDAgMCAxIDUxMS40MTA4NiAwLjAwMDI2eiBtMCAyMDQuNTU1OTQ4YTMwNi44MzQ5MjIgMzA2LjgzNDkyMiAwIDEgMCAwIDYxMy42Njk4NDQgMzA2LjgzNDkyMiAzMDYuODM0OTIyIDAgMCAwIDAtNjEzLjY2OTg0NHogbTAgMTAyLjI3ODk3NGEyMDQuNjQxOTQ4IDIwNC42NDE5NDggMCAwIDEgMC4wODYgNDA5LjE5Nzg5NiAyMDQuNTU1OTQ4IDIwNC41NTU5NDggMCAwIDEtMjA0LjU1Njk0OC0yMDQuNTU2OTQ4YzAtMjQuMDM0OTk0IDQuODU3OTk5LTQ2Ljg3Njk4OCAxMi40NDM5OTctNjguMzU1OTgzYTc2LjcwODk4MSA3Ni43MDg5ODEgMCAwIDAgMTMyLjYxOTk2Ni01Mi4yNDY5ODYgNzYuNzA4OTgxIDc2LjcwODk4MSAwIDAgMC0zMS42MTk5OTItNjEuNzA3OTg1IDIwMS4yMzE5NDkgMjAxLjIzMTk0OSAwIDAgMSA5MS4wMjY5NzctMjIuMzI5OTk0eiBtMC0yMzAuMTI1OTQxYy00MS45MzM5ODkgMC04Mi41MDM5NzkgNS45NjU5OTgtMTIwLjk0Mzk2OSAxNy4wNDU5OTUgMjcuODcwOTkzIDM2LjMwODk5MSA3MS41OTQ5ODIgNTkuNjYxOTg1IDEyMC45NDM5NjkgNTkuNjYxOTg1IDQ5LjQzNDk4NyAwIDkyLjk4Nzk3Ni0yMy4zNTI5OTQgMTIwLjk0Mzk2OS01OS42NjE5ODVhNDMxLjg2OTg5IDQzMS44Njk4OSAwIDAgMC0xMjAuOTQzOTY5LTE3LjA0NTk5NXoiIGZpbGw9IiM5MDkzOTkiIHAtaWQ9IjE2OTYiIGRhdGEtc3BtLWFuY2hvci1pZD0iYTMxM3gubWFuYWdlX3R5cGVfbXlwcm9qZWN0cy4wLmk0LjE4OTEzYTgxZlVzY2xCIiBjbGFzcz0ic2VsZWN0ZWQiPjwvcGF0aD48L3N2Zz4=';
|
|
79
|
+
|
|
80
|
+
var video_channel_monitor_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzY0MDQyMzI0MzIxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2OTUiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTUxMS40MTA4NiAwLjAwMDI2QTUxMS4wNDk4NyA1MTEuMDQ5ODcgMCAwIDEgNjczLjA5NTgxOSAyNi4wODAyNTNsNS4xOTk5OTkgMS43OWEzNjkuMjk5OTA2IDM2OS4yOTk5MDYgMCAwIDEgMTMuNjM1OTk2IDQuODU4OTk5bDIuNTU3IDEuMDIyOTk5YTM5MS4yOTk5MDEgMzkxLjI5OTkwMSAwIDAgMSAyOC4wNDE5OTMgMTEuNjc2OTk3IDY5My43ODY4MjQgNjkzLjc4NjgyNCAwIDAgMSAzNC4wOTE5OTEgMTcuMDQ1OTk2IDU4OC42OTU4NTEgNTg4LjY5NTg1MSAwIDAgMSAzNy41ODc5OSAyMi43NTY5OTRsMTIuMTAxOTk3IDguMzUyOTk4IDQuNzcyOTk5IDMuNDA4OTk5IDkuNjMxOTk4IDcuMTU5OTk5IDYuMzA2OTk4IDQuODU3OTk4YTYwMS45MDY4NDcgNjAxLjkwNjg0NyAwIDAgMSAyOC42Mzc5OTMgMjQuMjA0OTk0IDU4NC4zNDk4NTIgNTg0LjM0OTg1MiAwIDAgMSAzNi40Nzg5OSAzNi44MTk5OTFsNC42MDE5OTkgNS4xMTM5OTlhNTIzLjA2Nzg2NyA1MjMuMDY3ODY3IDAgMCAxIDQxLjMzNzk5IDU0LjIwNzk4NmwzLjY2NDk5OSA1LjYyNDk5OGEzNjguNTQxOTA2IDM2OC41NDE5MDYgMCAwIDEgMTAuMjI3OTk3IDE2LjcwNTk5Nmw0LjI2MDk5OSA3LjI0Mzk5OCA0Ljc3Mjk5OSA4LjYwODk5OCA1LjExMzk5OSA5LjcxNTk5OCAxLjcwNDk5OSAzLjQwOTk5OSAxLjcwNCAzLjQwODk5OWEyMTIuMjg3OTQ2IDIxMi4yODc5NDYgMCAwIDEgNC44NTg5OTkgOS44ODY5OTdsMi43MjY5OTkgNS44Nzk5OTlhNDE3LjEyNDg5NCA0MTcuMTI0ODk0IDAgMCAxIDExLjg0Njk5NyAyOC4xMjY5OTNsMC40MjYgMS4yNzg5OTljMi4xMzA5OTkgNS42MjQ5OTkgNC4yNjE5OTkgMTEuMzM0OTk3IDYuMTM2OTk4IDE3LjA0NTk5NmwwLjM0MSAwLjg1MmE1MDcuMTI5ODcxIDUwNy4xMjk4NzEgMCAwIDEgMTUuNTk2OTk2IDU2Ljc2NDk4NWwxLjYyIDcuNjY5OTk4YTU3OC40Njc4NTMgNTc4LjQ2Nzg1MyAwIDAgMSA2LjIyMTk5OCAzOS44ODg5OWwxLjE5MyAxMS4wNzk5OTggMC43NjcgOC4zNTI5OTdjMC41MTIgNy4wNzM5OTggMC44NTIgMTQuMTQ3OTk2IDEuMTkyOTk5IDIxLjMwNzk5NWwwLjM0MSAxOS4xNzY5OTVBNTExLjM5MDg3IDUxMS4zOTA4NyAwIDEgMSAxLjYzOTk5IDQ3MC45MDYxNGwwLjY4MTk5OS04LjM1Mjk5NyAxLjE5My0xMS4wNzk5OThhNDk0LjU5OTg3NCA0OTQuNTk5ODc0IDAgMCAxIDIuNTU2OTk5LTE5LjE3Njk5NWwxLjcwNC0xMC41Njg5OTdMOS44MjE5ODggNDExLjUwMDE1NmwxLjUzMzk5OS03LjQ5OTk5OWE1MzYuNzA0ODY0IDUzNi43MDQ4NjQgMCAwIDEgMTUuNTk3OTk2LTU2Ljg0OTk4NWwwLjM0LTAuODUyYTU3OC4xNDc4NTMgNTc4LjE0Nzg1MyAwIDAgMSA2LjEzNjk5OS0xNy4wNDU5OTZsMC40MjU5OTktMS4yNzg5OTlhNTA3LjYzOTg3MSA1MDcuNjM5ODcxIDAgMCAxIDYuODE4OTk5LTE2Ljg3NTk5Nmw1LjAyODk5OC0xMS4yNDk5OTcgMi43MjctNS45NjY5OTkgMi4zODU5OTktNC45NDI5OTggMi4zODY5OTktNC45NDM5OTkgMy40MS02LjY0Nzk5OGEzOTMuMzQ0OSAzOTMuMzQ0OSAwIDAgMSAxNC4xNDc5OTYtMjUuNjUzOTk0IDgzMy4zMTE3ODggODMzLjMxMTc4OCAwIDAgMSAxMC4yMjc5OTctMTYuNzA1OTk2bDMuNzQ5OTk5LTUuNjI0OTk4YTQ4NS41NjU4NzcgNDg1LjU2NTg3NyAwIDAgMSA0MS4zMzY5OS01NC4xMjE5ODZsNC42MDI5OTktNS4xOTk5OTkgOC44NjM5OTgtOS42Mjk5OThhMzU4LjgyNTkwOSAzNTguODI1OTA5IDAgMCAxIDEzLjM4MDk5Ni0xMy42Mzc5OTZsNC4wMDU5OTktMy45MTk5OTlhNTkwLjY1Njg1IDU5MC42NTY4NSAwIDAgMSAyMy4wMTI5OTQtMjAuODgxOTk1bDYuNzMyOTk5LTUuNjI1OTk5YTYwNi45MzU4NDYgNjA2LjkzNTg0NiAwIDAgMSAyNS4wNTc5OTMtMTkuMzQ2OTk1bDQuNjg3OTk5LTMuNDA5OTk5YTU2MS40MjE4NTcgNTYxLjQyMTg1NyAwIDAgMSA0OS43NzQ5ODctMzEuMDIzOTkybDQuODU4OTk5LTIuNjQxOTk5IDEwLjY1Mjk5Ny01LjUzOTk5OWEzNzUuNzg2OTA1IDM3NS43ODY5MDUgMCAwIDEgMjUuMzk5OTk0LTExLjkzMjk5N2w4Ljk0ODk5OC0zLjgzNDk5OSAxMi4yNzI5OTctNC44NTc5OTkgMi41NTY5OTktMC45Mzc5OTkgMTQuNTc0OTk2LTUuMjgzOTk5IDkuNTQ1OTk4LTMuMjM4OTk5LTkuNTQ1OTk4IDMuMTUzOTk5IDQuMjYwOTk5LTEuMzY0IDEwLjQ4Mzk5OC0zLjQwOTk5OUE1MTIuNzU0ODcgNTEyLjc1NDg3IDAgMCAxIDUxMS40MTA4NiAwLjAwMDI2eiBtMCAyMDQuNTU1OTQ4YTMwNi44MzQ5MjIgMzA2LjgzNDkyMiAwIDEgMCAwIDYxMy42Njk4NDQgMzA2LjgzNDkyMiAzMDYuODM0OTIyIDAgMCAwIDAtNjEzLjY2OTg0NHogbTAgMTAyLjI3ODk3NGEyMDQuNjQxOTQ4IDIwNC42NDE5NDggMCAwIDEgMC4wODYgNDA5LjE5Nzg5NiAyMDQuNTU1OTQ4IDIwNC41NTU5NDggMCAwIDEtMjA0LjU1Njk0OC0yMDQuNTU2OTQ4YzAtMjQuMDM0OTk0IDQuODU3OTk5LTQ2Ljg3Njk4OCAxMi40NDM5OTctNjguMzU1OTgzYTc2LjcwODk4MSA3Ni43MDg5ODEgMCAwIDAgMTMyLjYxOTk2Ni01Mi4yNDY5ODYgNzYuNzA4OTgxIDc2LjcwODk4MSAwIDAgMC0zMS42MTk5OTItNjEuNzA3OTg1IDIwMS4yMzE5NDkgMjAxLjIzMTk0OSAwIDAgMSA5MS4wMjY5NzctMjIuMzI5OTk0eiBtMC0yMzAuMTI1OTQxYy00MS45MzM5ODkgMC04Mi41MDM5NzkgNS45NjU5OTgtMTIwLjk0Mzk2OSAxNy4wNDU5OTUgMjcuODcwOTkzIDM2LjMwODk5MSA3MS41OTQ5ODIgNTkuNjYxOTg1IDEyMC45NDM5NjkgNTkuNjYxOTg1IDQ5LjQzNDk4NyAwIDkyLjk4Nzk3Ni0yMy4zNTI5OTQgMTIwLjk0Mzk2OS01OS42NjE5ODVhNDMxLjg2OTg5IDQzMS44Njk4OSAwIDAgMC0xMjAuOTQzOTY5LTE3LjA0NTk5NXoiIGZpbGw9IiMyREYyRkYiIHAtaWQ9IjE2OTYiIGRhdGEtc3BtLWFuY2hvci1pZD0iYTMxM3gubWFuYWdlX3R5cGVfbXlwcm9qZWN0cy4wLmk0LjE4OTEzYTgxZlVzY2xCIiBjbGFzcz0ic2VsZWN0ZWQiPjwvcGF0aD48L3N2Zz4=';
|
|
81
|
+
|
|
76
82
|
const svgMap = {
|
|
77
83
|
workCard_svg,
|
|
78
84
|
workCard_offLine_svg,
|
|
@@ -105,17 +111,157 @@ const svgMap = {
|
|
|
105
111
|
walkieTalkie_svg,
|
|
106
112
|
walkieTalkie_offLine_svg,
|
|
107
113
|
menu_acquisitionStation_svg,
|
|
108
|
-
noData
|
|
114
|
+
noData,
|
|
115
|
+
video_channel_svg,
|
|
116
|
+
video_channel_offLine_svg,
|
|
117
|
+
video_channel_monitor_svg
|
|
109
118
|
};
|
|
110
119
|
|
|
120
|
+
const setElementFocus = (config) => {
|
|
121
|
+
const { container, trigger, onFocus, onBlur } = config;
|
|
122
|
+
let btn = document.createElement('button');
|
|
123
|
+
const btnFocus = () => {
|
|
124
|
+
btn.focus();
|
|
125
|
+
onFocus && onFocus();
|
|
126
|
+
};
|
|
127
|
+
const btnBlur = () => {
|
|
128
|
+
btn.blur();
|
|
129
|
+
onBlur && onBlur();
|
|
130
|
+
};
|
|
131
|
+
if (trigger === 'click') {
|
|
132
|
+
container.addEventListener('click', btnFocus);
|
|
133
|
+
btn.addEventListener('blur', btnBlur);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
container.addEventListener('mouseenter', btnFocus);
|
|
137
|
+
container.addEventListener('mouseleave', btnBlur);
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
focus: btnFocus,
|
|
141
|
+
blur: btnBlur,
|
|
142
|
+
destroy() {
|
|
143
|
+
// @ts-ignore
|
|
144
|
+
btn = null;
|
|
145
|
+
if (!container)
|
|
146
|
+
return;
|
|
147
|
+
if (trigger === 'click') {
|
|
148
|
+
container.removeEventListener('click', btnFocus);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
container.removeEventListener('mouseenter', btnFocus);
|
|
152
|
+
container.removeEventListener('mouseleave', btnBlur);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
let container;
|
|
159
|
+
const getContainer$1 = () => {
|
|
160
|
+
if (container)
|
|
161
|
+
return container;
|
|
162
|
+
container = document.createElement('div');
|
|
163
|
+
document.body.appendChild(container);
|
|
164
|
+
return container;
|
|
165
|
+
};
|
|
166
|
+
class Tooltip {
|
|
167
|
+
_el;
|
|
168
|
+
_config;
|
|
169
|
+
_focus;
|
|
170
|
+
_timer;
|
|
171
|
+
constructor(props) {
|
|
172
|
+
if (!props.bind || !isElement(props.bind))
|
|
173
|
+
throw Error('【bind参数错误】:请传入元素节点');
|
|
174
|
+
this._config = this._generateConfig(props);
|
|
175
|
+
this._render();
|
|
176
|
+
}
|
|
177
|
+
_generateConfig(config) {
|
|
178
|
+
return {
|
|
179
|
+
placement: "top",
|
|
180
|
+
offset: 0,
|
|
181
|
+
trigger: "hover",
|
|
182
|
+
autoClose: 0,
|
|
183
|
+
...config
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
_render() {
|
|
187
|
+
const { bind, content } = this._config;
|
|
188
|
+
const el = document.createElement('div');
|
|
189
|
+
el.classList.add('hy-tooltip');
|
|
190
|
+
if (isElement(content)) {
|
|
191
|
+
el.appendChild(content);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
el.innerHTML = `${content}`;
|
|
195
|
+
}
|
|
196
|
+
const arrow = document.createElement('span');
|
|
197
|
+
arrow.classList.add('hy-popper__arrow');
|
|
198
|
+
el.appendChild(arrow);
|
|
199
|
+
this._el = el;
|
|
200
|
+
this._focus = setElementFocus({
|
|
201
|
+
container: bind,
|
|
202
|
+
trigger: this._config.trigger,
|
|
203
|
+
onFocus: () => {
|
|
204
|
+
if (!this._el)
|
|
205
|
+
return;
|
|
206
|
+
const container = getContainer$1();
|
|
207
|
+
container.appendChild(this._el);
|
|
208
|
+
this.setPopper();
|
|
209
|
+
if (this._config?.autoClose && isNumber(this._config?.autoClose)) {
|
|
210
|
+
this._timer && clearTimeout(this._timer);
|
|
211
|
+
this._timer = setTimeout(() => {
|
|
212
|
+
this._focus && this._focus.blur();
|
|
213
|
+
}, this._config?.autoClose);
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
onBlur: () => {
|
|
217
|
+
this._timer && clearTimeout(this._timer);
|
|
218
|
+
if (!this._el || !this._el.parentElement)
|
|
219
|
+
return;
|
|
220
|
+
this._el.parentElement.removeChild(this._el);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
setPopper() {
|
|
225
|
+
if (!this._config || !this._el)
|
|
226
|
+
return;
|
|
227
|
+
const { offset, placement } = this._config;
|
|
228
|
+
const { top, left, width, height } = this._config.bind.getBoundingClientRect();
|
|
229
|
+
this._el.classList.add(placement);
|
|
230
|
+
switch (placement) {
|
|
231
|
+
case 'top':
|
|
232
|
+
this._el.style.setProperty('top', `${top - offset}px`);
|
|
233
|
+
this._el.style.setProperty('left', `${left + width / 2}px`);
|
|
234
|
+
break;
|
|
235
|
+
case 'bottom':
|
|
236
|
+
this._el.style.setProperty('top', `${top + height + offset}px`);
|
|
237
|
+
this._el.style.setProperty('left', `${left + width / 2}px`);
|
|
238
|
+
break;
|
|
239
|
+
case 'left':
|
|
240
|
+
this._el.style.setProperty('top', `${top + height / 2}px`);
|
|
241
|
+
this._el.style.setProperty('left', `${left - offset}px`);
|
|
242
|
+
break;
|
|
243
|
+
case 'right':
|
|
244
|
+
this._el.style.setProperty('top', `${top + height / 2}px`);
|
|
245
|
+
this._el.style.setProperty('left', `${left + width + offset}px`);
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
destroy() {
|
|
250
|
+
this._timer && clearTimeout(this._timer);
|
|
251
|
+
this._focus && this._focus.destroy();
|
|
252
|
+
this._config = undefined;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
111
256
|
class Icon {
|
|
112
257
|
_el;
|
|
113
258
|
_disabled;
|
|
114
|
-
|
|
115
|
-
|
|
259
|
+
_tooltip;
|
|
260
|
+
constructor(props) {
|
|
261
|
+
const config = this._generateConfig(props);
|
|
116
262
|
this._disabled = config.disabled;
|
|
117
263
|
if (!config.svgName)
|
|
118
|
-
|
|
264
|
+
throw Error('【svgName参数错误】:请传入图标名称');
|
|
119
265
|
this._render(config);
|
|
120
266
|
}
|
|
121
267
|
_generateConfig(config) {
|
|
@@ -127,9 +273,17 @@ class Icon {
|
|
|
127
273
|
};
|
|
128
274
|
}
|
|
129
275
|
_render(config) {
|
|
130
|
-
const { svgName = '' } = config;
|
|
276
|
+
const { svgName = '', className } = config;
|
|
131
277
|
const el = document.createElement('div');
|
|
132
278
|
el.classList.add('hy-icon');
|
|
279
|
+
if (className) {
|
|
280
|
+
const classList = className.split(' ');
|
|
281
|
+
for (const name of classList) {
|
|
282
|
+
if (!name)
|
|
283
|
+
continue;
|
|
284
|
+
el.classList.add(name);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
133
287
|
const image = document.createElement('img');
|
|
134
288
|
image.src = svgMap ? svgMap[svgName] : '';
|
|
135
289
|
image.style.maxWidth = '100%';
|
|
@@ -154,12 +308,22 @@ class Icon {
|
|
|
154
308
|
}
|
|
155
309
|
});
|
|
156
310
|
this._el = el;
|
|
311
|
+
if (config.tip) {
|
|
312
|
+
this._tooltip = new Tooltip({
|
|
313
|
+
bind: el,
|
|
314
|
+
content: config.tip
|
|
315
|
+
});
|
|
316
|
+
}
|
|
157
317
|
}
|
|
158
318
|
mount(container) {
|
|
159
319
|
if (!this._el)
|
|
160
320
|
return;
|
|
161
321
|
container.appendChild(this._el);
|
|
162
322
|
}
|
|
323
|
+
destroy() {
|
|
324
|
+
this._el = undefined;
|
|
325
|
+
this._tooltip && this._tooltip.destroy();
|
|
326
|
+
}
|
|
163
327
|
}
|
|
164
328
|
|
|
165
329
|
// @ts-nocheck
|
|
@@ -600,6 +764,64 @@ class Radio {
|
|
|
600
764
|
}
|
|
601
765
|
}
|
|
602
766
|
|
|
767
|
+
// 设备状态列表
|
|
768
|
+
let globalDeviceStatus = {
|
|
769
|
+
0: '离线',
|
|
770
|
+
1: '在线',
|
|
771
|
+
2: '监控中',
|
|
772
|
+
3: '通话中',
|
|
773
|
+
4: '录像中',
|
|
774
|
+
5: '录音中',
|
|
775
|
+
6: '广播中',
|
|
776
|
+
7: 'SOS'
|
|
777
|
+
};
|
|
778
|
+
const setGlobalDeviceStatus = (status = {}) => {
|
|
779
|
+
globalDeviceStatus = {
|
|
780
|
+
...globalDeviceStatus,
|
|
781
|
+
...status,
|
|
782
|
+
};
|
|
783
|
+
};
|
|
784
|
+
const getGlobalDeviceStatus = () => {
|
|
785
|
+
return globalDeviceStatus;
|
|
786
|
+
};
|
|
787
|
+
|
|
788
|
+
// 业务类型(config.business) device-设备 channel-通道设备 groupDevice-群组设备 group-群组 user-用户 cs-采集站
|
|
789
|
+
var Business;
|
|
790
|
+
(function (Business) {
|
|
791
|
+
Business["DEVICE"] = "device";
|
|
792
|
+
Business["CHANNEL"] = "channel";
|
|
793
|
+
Business["GROUP_DEVICE"] = "groupDevice";
|
|
794
|
+
Business["GROUP"] = "group";
|
|
795
|
+
Business["USER"] = "user";
|
|
796
|
+
Business["CS"] = "cs";
|
|
797
|
+
})(Business || (Business = {}));
|
|
798
|
+
// 设备状态(data.deviceStatus) 0-离线 1-在线 2-监控中 3-通话中 4-录像中 5-录音中 6-广播中 7-SOS
|
|
799
|
+
var DeviceStatus;
|
|
800
|
+
(function (DeviceStatus) {
|
|
801
|
+
DeviceStatus[DeviceStatus["OFF_LINE"] = 0] = "OFF_LINE";
|
|
802
|
+
DeviceStatus[DeviceStatus["ON_LINE"] = 1] = "ON_LINE";
|
|
803
|
+
DeviceStatus[DeviceStatus["BE_MONITOR"] = 2] = "BE_MONITOR";
|
|
804
|
+
DeviceStatus[DeviceStatus["IN_CALL"] = 3] = "IN_CALL";
|
|
805
|
+
DeviceStatus[DeviceStatus["IN_VIDEO_RECORD"] = 4] = "IN_VIDEO_RECORD";
|
|
806
|
+
DeviceStatus[DeviceStatus["IN_AUDIO_RECORD"] = 5] = "IN_AUDIO_RECORD";
|
|
807
|
+
DeviceStatus[DeviceStatus["IN_BROADCASE"] = 6] = "IN_BROADCASE";
|
|
808
|
+
DeviceStatus[DeviceStatus["SOS"] = 7] = "SOS"; // SOS
|
|
809
|
+
})(DeviceStatus || (DeviceStatus = {}));
|
|
810
|
+
// 业务数据类型(data.dataType) 1-部门 3-设备 4-群组 5-用户 6-考勤 7-水源点 8-采集站 9-设备通道
|
|
811
|
+
var DataType;
|
|
812
|
+
(function (DataType) {
|
|
813
|
+
DataType[DataType["UNKNOW_1"] = 0] = "UNKNOW_1";
|
|
814
|
+
DataType[DataType["DEPT"] = 1] = "DEPT";
|
|
815
|
+
DataType[DataType["UNKNOW_2"] = 2] = "UNKNOW_2";
|
|
816
|
+
DataType[DataType["DEVICE"] = 3] = "DEVICE";
|
|
817
|
+
DataType[DataType["GROUP"] = 4] = "GROUP";
|
|
818
|
+
DataType[DataType["USER"] = 5] = "USER";
|
|
819
|
+
DataType[DataType["ATTENDANCE"] = 6] = "ATTENDANCE";
|
|
820
|
+
DataType[DataType["WATER_SOURCE"] = 7] = "WATER_SOURCE";
|
|
821
|
+
DataType[DataType["CS"] = 8] = "CS";
|
|
822
|
+
DataType[DataType["CHANNEL"] = 9] = "CHANNEL"; // 设备通道
|
|
823
|
+
})(DataType || (DataType = {}));
|
|
824
|
+
|
|
603
825
|
/** 生成配置项 */
|
|
604
826
|
const useConfig = (config) => {
|
|
605
827
|
let props = Object.assign({
|
|
@@ -622,37 +844,28 @@ const useConfig = (config) => {
|
|
|
622
844
|
}, config.rowSelection);
|
|
623
845
|
// 业务配置
|
|
624
846
|
let businessConfig = {
|
|
625
|
-
|
|
847
|
+
deviceStatusMap: {},
|
|
626
848
|
filterConfig: [],
|
|
627
849
|
sortByStatus: true,
|
|
628
850
|
clearEmptyBusiness: false,
|
|
629
|
-
|
|
851
|
+
isShowChannelSelect: true,
|
|
630
852
|
...(config.businessConfig || {})
|
|
631
853
|
};
|
|
632
854
|
// 设备树
|
|
633
|
-
if ([
|
|
855
|
+
if (config.business && [Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(config.business)) {
|
|
634
856
|
businessConfig = {
|
|
635
|
-
|
|
636
|
-
'离线',
|
|
637
|
-
'在线',
|
|
638
|
-
'监控中',
|
|
639
|
-
'通话中',
|
|
640
|
-
'录像中',
|
|
641
|
-
'录音中',
|
|
642
|
-
'广播中',
|
|
643
|
-
'SOS'
|
|
644
|
-
],
|
|
857
|
+
deviceStatusMap: getGlobalDeviceStatus(),
|
|
645
858
|
filterConfig: [],
|
|
646
859
|
sortByStatus: true,
|
|
647
860
|
clearEmptyBusiness: false,
|
|
648
|
-
|
|
861
|
+
isShowChannelSelect: true,
|
|
649
862
|
...(config.businessConfig || {})
|
|
650
863
|
};
|
|
651
864
|
props = {
|
|
652
865
|
class: '',
|
|
653
866
|
disabled: 'disabled',
|
|
654
867
|
showStatus: false,
|
|
655
|
-
showCount: (data) => data.dataType
|
|
868
|
+
showCount: (data) => !/^(3|9)$/.test(data.dataType),
|
|
656
869
|
...(config.props || {}),
|
|
657
870
|
value: 'onlyId',
|
|
658
871
|
label: 'label',
|
|
@@ -664,7 +877,7 @@ const useConfig = (config) => {
|
|
|
664
877
|
showSelect: (data) => {
|
|
665
878
|
if (rowSelection.type === 'checkbox')
|
|
666
879
|
return true;
|
|
667
|
-
return data.dataType
|
|
880
|
+
return /^(3|9)$/.test(data.dataType);
|
|
668
881
|
},
|
|
669
882
|
...rowSelection
|
|
670
883
|
};
|
|
@@ -722,6 +935,7 @@ const useConfig = (config) => {
|
|
|
722
935
|
fontSize: 14,
|
|
723
936
|
bgColor: '',
|
|
724
937
|
nodeBgColor: '#1c334a',
|
|
938
|
+
channelBgColor: '#10263B',
|
|
725
939
|
emptyText: '暂无数据',
|
|
726
940
|
bufferSize: 50,
|
|
727
941
|
expandOnClickNode: true,
|
|
@@ -746,13 +960,16 @@ const useHandleFun = (config) => {
|
|
|
746
960
|
if (!node)
|
|
747
961
|
return '';
|
|
748
962
|
if (business && isBusiness) {
|
|
749
|
-
switch (
|
|
750
|
-
case
|
|
751
|
-
case
|
|
752
|
-
|
|
753
|
-
case
|
|
754
|
-
case 'cs':
|
|
963
|
+
switch (node.deviceType) {
|
|
964
|
+
case DataType.DEPT: // 部门
|
|
965
|
+
case DataType.GROUP: // 群组
|
|
966
|
+
case DataType.USER: // 用户
|
|
967
|
+
case DataType.CS: // 采集站
|
|
755
968
|
return node.id;
|
|
969
|
+
case DataType.DEVICE: // 设备
|
|
970
|
+
return node.deviceId;
|
|
971
|
+
case DataType.CHANNEL: // 设备通道
|
|
972
|
+
return node.channelId;
|
|
756
973
|
}
|
|
757
974
|
}
|
|
758
975
|
return node[props.value];
|
|
@@ -782,7 +999,7 @@ const useHandleFun = (config) => {
|
|
|
782
999
|
return;
|
|
783
1000
|
return node[props.total];
|
|
784
1001
|
}
|
|
785
|
-
if ([
|
|
1002
|
+
if (business && [Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(business)) {
|
|
786
1003
|
countFilter = (data) => {
|
|
787
1004
|
return data.dataType === 3 && data.onlineState === 1;
|
|
788
1005
|
};
|
|
@@ -810,6 +1027,20 @@ const useHandleFun = (config) => {
|
|
|
810
1027
|
totalFilter,
|
|
811
1028
|
// 设置设备状态
|
|
812
1029
|
setDeviceStatus: (data) => {
|
|
1030
|
+
// 通道状态
|
|
1031
|
+
if (data.deviceType === 9) {
|
|
1032
|
+
if (data.onlineState === 1) {
|
|
1033
|
+
// 监控中
|
|
1034
|
+
if (data.beMonitor === 1) {
|
|
1035
|
+
return 2;
|
|
1036
|
+
}
|
|
1037
|
+
// 在线
|
|
1038
|
+
return 1;
|
|
1039
|
+
}
|
|
1040
|
+
// 离线
|
|
1041
|
+
return 0;
|
|
1042
|
+
}
|
|
1043
|
+
// 设备状态
|
|
813
1044
|
if (data.onlineState === 1) {
|
|
814
1045
|
// 监控中
|
|
815
1046
|
if (data.monitor === 1 || data.beMonitor === 1) {
|
|
@@ -851,12 +1082,26 @@ const getDisabled = (config, node) => {
|
|
|
851
1082
|
if (isFunction(disabled))
|
|
852
1083
|
return disabled(node.data, node);
|
|
853
1084
|
};
|
|
1085
|
+
const isShowSelect = (config, node = null) => {
|
|
1086
|
+
const { showSelect } = config.rowSelection;
|
|
1087
|
+
if (isBoolean(showSelect) || node === null)
|
|
1088
|
+
return !!showSelect;
|
|
1089
|
+
const { isShowChannelSelect } = config.businessConfig;
|
|
1090
|
+
if (config.business === Business.CHANNEL && !isShowChannelSelect && node.data.dataType === DataType.CHANNEL)
|
|
1091
|
+
return false;
|
|
1092
|
+
return !!(isFunction(showSelect) && showSelect(node.data, node));
|
|
1093
|
+
};
|
|
1094
|
+
const isCheckLeaf = (config, node) => {
|
|
1095
|
+
if (config.business !== Business.CHANNEL || config.businessConfig.isShowChannelSelect)
|
|
1096
|
+
return node.isLeaf;
|
|
1097
|
+
return node.data.dataType === 3 ? true : node.isLeaf;
|
|
1098
|
+
};
|
|
854
1099
|
function useCheck(props, tree) {
|
|
855
1100
|
const checkedKeys = new Set();
|
|
856
1101
|
let indeterminateKeys = new Set();
|
|
857
1102
|
const updateCheckedKeys = () => {
|
|
858
|
-
const {
|
|
859
|
-
if (!tree ||
|
|
1103
|
+
const { checkStrictly } = props.rowSelection;
|
|
1104
|
+
if (!tree || checkStrictly) {
|
|
860
1105
|
return;
|
|
861
1106
|
}
|
|
862
1107
|
const { levelTreeNodeMap, maxLevel } = tree;
|
|
@@ -867,28 +1112,39 @@ function useCheck(props, tree) {
|
|
|
867
1112
|
if (!nodes)
|
|
868
1113
|
continue;
|
|
869
1114
|
nodes.forEach((node) => {
|
|
870
|
-
|
|
871
|
-
if (tree.hiddenNodeKeySet.has(node.key))
|
|
1115
|
+
if (tree.hiddenNodeKeySet.has(node.key) || !isShowSelect(props, node))
|
|
872
1116
|
return;
|
|
873
|
-
if (children) {
|
|
1117
|
+
if (node.children && !isCheckLeaf(props, node)) {
|
|
874
1118
|
let allChecked = true;
|
|
875
1119
|
let hasChecked = false;
|
|
876
|
-
|
|
1120
|
+
let allHide = true;
|
|
1121
|
+
for (const childNode of node.children) {
|
|
877
1122
|
const key = childNode.key;
|
|
878
|
-
|
|
1123
|
+
// 通道需要循环处理
|
|
1124
|
+
if (childNode.data.dataType !== DataType.CHANNEL &&
|
|
1125
|
+
(tree.hiddenNodeKeySet.has(key) || !isShowSelect(props, node))) {
|
|
879
1126
|
continue;
|
|
880
|
-
if (checkedKeySet.has(key)) {
|
|
881
|
-
hasChecked = true;
|
|
882
1127
|
}
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
1128
|
+
if ((props.businessConfig?.showOnlineState && childNode.data.deviceStatus !== DeviceStatus.OFF_LINE) ||
|
|
1129
|
+
!props.businessConfig?.showOnlineState) {
|
|
1130
|
+
allHide = false;
|
|
1131
|
+
if (checkedKeySet.has(key)) {
|
|
1132
|
+
hasChecked = true;
|
|
1133
|
+
}
|
|
1134
|
+
else if (indeterminateKeySet.has(key)) {
|
|
1135
|
+
allChecked = false;
|
|
1136
|
+
hasChecked = true;
|
|
1137
|
+
break;
|
|
1138
|
+
}
|
|
1139
|
+
else {
|
|
1140
|
+
allChecked = false;
|
|
1141
|
+
}
|
|
890
1142
|
}
|
|
891
1143
|
}
|
|
1144
|
+
// 所有子元素都隐藏,则判断自身的选中状态
|
|
1145
|
+
if (allHide) {
|
|
1146
|
+
allChecked = checkedKeySet.has(node.key);
|
|
1147
|
+
}
|
|
892
1148
|
if (allChecked) {
|
|
893
1149
|
checkedKeySet.add(node.key);
|
|
894
1150
|
}
|
|
@@ -930,7 +1186,7 @@ function useCheck(props, tree) {
|
|
|
930
1186
|
const children = node.children;
|
|
931
1187
|
if ((!checkStrictly || checkOnDbclick) && children) {
|
|
932
1188
|
children.forEach((childNode) => {
|
|
933
|
-
if (!getDisabled(props, childNode)) {
|
|
1189
|
+
if (!getDisabled(props, childNode) && isShowSelect(props, childNode)) {
|
|
934
1190
|
toggle(childNode, checked);
|
|
935
1191
|
}
|
|
936
1192
|
});
|
|
@@ -987,21 +1243,39 @@ function useCheck(props, tree) {
|
|
|
987
1243
|
const checkedBusinessKeys = [];
|
|
988
1244
|
const checkedBusinessNodes = [];
|
|
989
1245
|
const { business } = props;
|
|
990
|
-
if (tree && props
|
|
1246
|
+
if (tree && isShowSelect(props)) {
|
|
991
1247
|
const { treeNodeMap } = tree;
|
|
992
1248
|
checkedKeys.forEach((key) => {
|
|
993
1249
|
const node = treeNodeMap.get(key);
|
|
994
|
-
if (node
|
|
1250
|
+
if (!node || !isShowSelect(props, node))
|
|
1251
|
+
return;
|
|
1252
|
+
if (!leafOnly || (leafOnly && isCheckLeaf(props, node))) {
|
|
995
1253
|
const data = node.data;
|
|
996
1254
|
keys.push(key);
|
|
997
1255
|
checkedNodes.push(data);
|
|
998
1256
|
// 业务选中
|
|
999
|
-
if ((['device', 'groupDevice'].includes(`${business}`) && data.dataType === 3)
|
|
1000
|
-
|
|
1001
|
-
|
|
1257
|
+
if ((['device', 'groupDevice'].includes(`${business}`) && data.dataType === 3) ||
|
|
1258
|
+
(business === 'user' && data.dataType === 5) ||
|
|
1259
|
+
(business === 'cs' && data.dataType === 8)) {
|
|
1002
1260
|
checkedBusinessKeys.push(key);
|
|
1003
1261
|
checkedBusinessNodes.push(node.data);
|
|
1004
1262
|
}
|
|
1263
|
+
// 通道类型业务选中
|
|
1264
|
+
else if (business === Business.CHANNEL && /^(3|9)$/.test(`${data.dataType}`)) {
|
|
1265
|
+
// 开启通道可选中
|
|
1266
|
+
if (props.businessConfig?.isShowChannelSelect) {
|
|
1267
|
+
// 通道类型 或 没有通道的设备
|
|
1268
|
+
if (data.dataType === 9 || isCheckLeaf(props, node)) {
|
|
1269
|
+
checkedBusinessKeys.push(key);
|
|
1270
|
+
checkedBusinessNodes.push(node.data);
|
|
1271
|
+
}
|
|
1272
|
+
}
|
|
1273
|
+
// 关闭通道可选中
|
|
1274
|
+
else if (data.dataType === 3) {
|
|
1275
|
+
checkedBusinessKeys.push(key);
|
|
1276
|
+
checkedBusinessNodes.push(node.data);
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1005
1279
|
}
|
|
1006
1280
|
});
|
|
1007
1281
|
}
|
|
@@ -1023,14 +1297,14 @@ function useCheck(props, tree) {
|
|
|
1023
1297
|
function getHalfChecked() {
|
|
1024
1298
|
const halfCheckedNodes = [];
|
|
1025
1299
|
const halfCheckedKeys = [];
|
|
1026
|
-
if (tree && props
|
|
1300
|
+
if (tree && isShowSelect(props)) {
|
|
1027
1301
|
const { treeNodeMap } = tree;
|
|
1028
1302
|
indeterminateKeys.forEach((key) => {
|
|
1029
1303
|
const node = treeNodeMap.get(key);
|
|
1030
|
-
if (node)
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1304
|
+
if (!node || !isShowSelect(props, node))
|
|
1305
|
+
return;
|
|
1306
|
+
halfCheckedKeys.push(key);
|
|
1307
|
+
halfCheckedNodes.push(node.data);
|
|
1034
1308
|
});
|
|
1035
1309
|
}
|
|
1036
1310
|
return {
|
|
@@ -1052,45 +1326,118 @@ function useCheck(props, tree) {
|
|
|
1052
1326
|
_setCheckedKeys(keys, isBusiness);
|
|
1053
1327
|
}
|
|
1054
1328
|
function setChecked(key, isChecked, isBusiness = false) {
|
|
1329
|
+
if (!tree || !isShowSelect(props))
|
|
1330
|
+
return;
|
|
1331
|
+
const { treeNodeMap, deviceMap, channelMap, userMap, csMap } = tree;
|
|
1332
|
+
if (!isBusiness || !props.business) {
|
|
1333
|
+
const node = treeNodeMap.get(key);
|
|
1334
|
+
if (node) {
|
|
1335
|
+
toggleCheckbox(node, isChecked, false);
|
|
1336
|
+
}
|
|
1337
|
+
return;
|
|
1338
|
+
}
|
|
1339
|
+
let nodeList = [];
|
|
1340
|
+
switch (props.business) {
|
|
1341
|
+
case Business.DEVICE:
|
|
1342
|
+
case Business.GROUP_DEVICE:
|
|
1343
|
+
nodeList = (deviceMap && deviceMap.get(key)) || [];
|
|
1344
|
+
break;
|
|
1345
|
+
case Business.CHANNEL:
|
|
1346
|
+
const channel = channelMap && channelMap.get(key);
|
|
1347
|
+
if (channel) {
|
|
1348
|
+
nodeList = [channel];
|
|
1349
|
+
}
|
|
1350
|
+
else {
|
|
1351
|
+
nodeList = (deviceMap && deviceMap.get(key)) || [];
|
|
1352
|
+
}
|
|
1353
|
+
break;
|
|
1354
|
+
case Business.USER:
|
|
1355
|
+
nodeList = (userMap && userMap.get(key)) || [];
|
|
1356
|
+
break;
|
|
1357
|
+
case Business.CS:
|
|
1358
|
+
nodeList = (csMap && csMap.get(key)) || [];
|
|
1359
|
+
break;
|
|
1360
|
+
}
|
|
1361
|
+
for (const node of nodeList) {
|
|
1362
|
+
if (!isShowSelect(props, node))
|
|
1363
|
+
continue;
|
|
1364
|
+
toggleCheckbox(node, isChecked, false);
|
|
1365
|
+
}
|
|
1366
|
+
}
|
|
1367
|
+
function _setCheckedKeys(keys = [], isBusiness = false) {
|
|
1055
1368
|
if (!tree)
|
|
1056
1369
|
return;
|
|
1057
|
-
const { treeNodeMap, deviceMap, userMap, csMap } = tree;
|
|
1058
|
-
if (props.
|
|
1370
|
+
const { treeNodeMap, deviceMap, channelMap, userMap, csMap } = tree;
|
|
1371
|
+
if (!isShowSelect(props) || !treeNodeMap || !keys.length)
|
|
1372
|
+
return;
|
|
1373
|
+
for (const key of keys) {
|
|
1374
|
+
// 通用逻辑
|
|
1059
1375
|
if (!isBusiness || !props.business) {
|
|
1060
1376
|
const node = treeNodeMap.get(key);
|
|
1061
|
-
if (node) {
|
|
1062
|
-
toggleCheckbox(node,
|
|
1377
|
+
if (node && !isChecked(node) && isShowSelect(props, node)) {
|
|
1378
|
+
toggleCheckbox(node, true, false, false);
|
|
1063
1379
|
}
|
|
1064
|
-
|
|
1380
|
+
continue;
|
|
1065
1381
|
}
|
|
1382
|
+
// 业务逻辑
|
|
1066
1383
|
let nodeList = [];
|
|
1067
1384
|
switch (props.business) {
|
|
1068
|
-
case
|
|
1069
|
-
case
|
|
1385
|
+
case Business.DEVICE:
|
|
1386
|
+
case Business.GROUP_DEVICE:
|
|
1070
1387
|
nodeList = (deviceMap && deviceMap.get(key)) || [];
|
|
1071
1388
|
break;
|
|
1072
|
-
case
|
|
1389
|
+
case Business.CHANNEL:
|
|
1390
|
+
const channel = channelMap && channelMap.get(key);
|
|
1391
|
+
if (channel) {
|
|
1392
|
+
nodeList = [channel];
|
|
1393
|
+
}
|
|
1394
|
+
else {
|
|
1395
|
+
nodeList = (deviceMap && deviceMap.get(key)) || [];
|
|
1396
|
+
}
|
|
1397
|
+
break;
|
|
1398
|
+
case Business.USER:
|
|
1073
1399
|
nodeList = (userMap && userMap.get(key)) || [];
|
|
1074
1400
|
break;
|
|
1075
|
-
case
|
|
1401
|
+
case Business.CS:
|
|
1076
1402
|
nodeList = (csMap && csMap.get(key)) || [];
|
|
1077
1403
|
break;
|
|
1078
1404
|
}
|
|
1079
1405
|
for (const node of nodeList) {
|
|
1080
|
-
|
|
1406
|
+
if (node && !isChecked(node) && isShowSelect(props, node)) {
|
|
1407
|
+
toggleCheckbox(node, true, false, false);
|
|
1408
|
+
}
|
|
1081
1409
|
}
|
|
1082
1410
|
}
|
|
1411
|
+
updateCheckedKeys();
|
|
1083
1412
|
}
|
|
1084
|
-
function
|
|
1085
|
-
if (!
|
|
1413
|
+
function setCheckedNodes(data, isBusiness = false) {
|
|
1414
|
+
if (!Array.isArray(data)) {
|
|
1415
|
+
console.warn('setCheckedNodes请传入数组');
|
|
1086
1416
|
return;
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1417
|
+
}
|
|
1418
|
+
const { type } = props.rowSelection;
|
|
1419
|
+
checkedKeys.clear();
|
|
1420
|
+
indeterminateKeys.clear();
|
|
1421
|
+
if (type === 'radio' && data.length > 1) {
|
|
1422
|
+
data = [data[0]];
|
|
1423
|
+
}
|
|
1424
|
+
_setCheckedNodes(data, isBusiness);
|
|
1425
|
+
}
|
|
1426
|
+
function _setCheckedNodes(data = [], isBusiness = false) {
|
|
1427
|
+
if (tree) {
|
|
1428
|
+
const { treeNodeMap, deviceMap, channelMap, userMap, csMap } = tree;
|
|
1429
|
+
if (!isShowSelect(props) || !treeNodeMap || !data.length)
|
|
1430
|
+
return;
|
|
1431
|
+
const { getKey } = useHandleFun({
|
|
1432
|
+
business: props.business,
|
|
1433
|
+
props: props.props
|
|
1434
|
+
});
|
|
1435
|
+
for (const target of data) {
|
|
1090
1436
|
// 通用逻辑
|
|
1437
|
+
let key = getKey(target);
|
|
1091
1438
|
if (!isBusiness || !props.business) {
|
|
1092
1439
|
const node = treeNodeMap.get(key);
|
|
1093
|
-
if (node && !isChecked(node)) {
|
|
1440
|
+
if (node && !isChecked(node) && isShowSelect(props, node)) {
|
|
1094
1441
|
toggleCheckbox(node, true, false, false);
|
|
1095
1442
|
}
|
|
1096
1443
|
continue;
|
|
@@ -1098,19 +1445,32 @@ function useCheck(props, tree) {
|
|
|
1098
1445
|
// 业务逻辑
|
|
1099
1446
|
let nodeList = [];
|
|
1100
1447
|
switch (props.business) {
|
|
1101
|
-
case
|
|
1102
|
-
case
|
|
1448
|
+
case Business.DEVICE:
|
|
1449
|
+
case Business.GROUP_DEVICE:
|
|
1450
|
+
key = target.deviceId;
|
|
1103
1451
|
nodeList = (deviceMap && deviceMap.get(key)) || [];
|
|
1104
1452
|
break;
|
|
1105
|
-
case
|
|
1453
|
+
case Business.CHANNEL:
|
|
1454
|
+
key = target.channelId;
|
|
1455
|
+
const channel = channelMap && channelMap.get(key);
|
|
1456
|
+
if (channel) {
|
|
1457
|
+
nodeList = [channel];
|
|
1458
|
+
}
|
|
1459
|
+
else {
|
|
1460
|
+
nodeList = (deviceMap && deviceMap.get(key)) || [];
|
|
1461
|
+
}
|
|
1462
|
+
break;
|
|
1463
|
+
case Business.USER:
|
|
1464
|
+
key = target.id;
|
|
1106
1465
|
nodeList = (userMap && userMap.get(key)) || [];
|
|
1107
1466
|
break;
|
|
1108
|
-
case
|
|
1467
|
+
case Business.CS:
|
|
1468
|
+
key = target.id;
|
|
1109
1469
|
nodeList = (csMap && csMap.get(key)) || [];
|
|
1110
1470
|
break;
|
|
1111
1471
|
}
|
|
1112
1472
|
for (const node of nodeList) {
|
|
1113
|
-
if (node && !isChecked(node)) {
|
|
1473
|
+
if (node && !isChecked(node) && isShowSelect(props, node)) {
|
|
1114
1474
|
toggleCheckbox(node, true, false, false);
|
|
1115
1475
|
}
|
|
1116
1476
|
}
|
|
@@ -1118,61 +1478,6 @@ function useCheck(props, tree) {
|
|
|
1118
1478
|
updateCheckedKeys();
|
|
1119
1479
|
}
|
|
1120
1480
|
}
|
|
1121
|
-
function setCheckedNodes(data, isBusiness = false) {
|
|
1122
|
-
if (!Array.isArray(data)) {
|
|
1123
|
-
console.warn('setCheckedNodes请传入数组');
|
|
1124
|
-
return;
|
|
1125
|
-
}
|
|
1126
|
-
const { type } = props.rowSelection;
|
|
1127
|
-
checkedKeys.clear();
|
|
1128
|
-
indeterminateKeys.clear();
|
|
1129
|
-
if (type === 'radio' && data.length > 1) {
|
|
1130
|
-
data = [data[0]];
|
|
1131
|
-
}
|
|
1132
|
-
_setCheckedNodes(data, isBusiness);
|
|
1133
|
-
}
|
|
1134
|
-
function _setCheckedNodes(data = [], isBusiness = false) {
|
|
1135
|
-
if (tree) {
|
|
1136
|
-
const { treeNodeMap, deviceMap, userMap, csMap } = tree;
|
|
1137
|
-
if (props.rowSelection.showSelect && treeNodeMap && data.length > 0) {
|
|
1138
|
-
const { getKey } = useHandleFun(props);
|
|
1139
|
-
for (const target of data) {
|
|
1140
|
-
// 通用逻辑
|
|
1141
|
-
let key = getKey(target);
|
|
1142
|
-
if (!isBusiness || !props.business) {
|
|
1143
|
-
const node = treeNodeMap.get(key);
|
|
1144
|
-
if (node && !isChecked(node)) {
|
|
1145
|
-
toggleCheckbox(node, true, false, false);
|
|
1146
|
-
}
|
|
1147
|
-
continue;
|
|
1148
|
-
}
|
|
1149
|
-
// 业务逻辑
|
|
1150
|
-
let nodeList = [];
|
|
1151
|
-
switch (props.business) {
|
|
1152
|
-
case 'device':
|
|
1153
|
-
case 'groupDevice':
|
|
1154
|
-
key = target.deviceId;
|
|
1155
|
-
nodeList = (deviceMap && deviceMap.get(key)) || [];
|
|
1156
|
-
break;
|
|
1157
|
-
case 'user':
|
|
1158
|
-
key = target.id;
|
|
1159
|
-
nodeList = (userMap && userMap.get(key)) || [];
|
|
1160
|
-
break;
|
|
1161
|
-
case 'cs':
|
|
1162
|
-
key = target.id;
|
|
1163
|
-
nodeList = (csMap && csMap.get(key)) || [];
|
|
1164
|
-
break;
|
|
1165
|
-
}
|
|
1166
|
-
for (const node of nodeList) {
|
|
1167
|
-
if (node && !isChecked(node)) {
|
|
1168
|
-
toggleCheckbox(node, true, false, false);
|
|
1169
|
-
}
|
|
1170
|
-
}
|
|
1171
|
-
}
|
|
1172
|
-
updateCheckedKeys();
|
|
1173
|
-
}
|
|
1174
|
-
}
|
|
1175
|
-
}
|
|
1176
1481
|
return {
|
|
1177
1482
|
checkedKeys,
|
|
1178
1483
|
updateCheckedKeys,
|
|
@@ -1207,7 +1512,6 @@ function useFilter(config, filterMethod, tree = {
|
|
|
1207
1512
|
if (!isFunction(filterMethod)) {
|
|
1208
1513
|
return;
|
|
1209
1514
|
}
|
|
1210
|
-
const { integratedBusiness } = config.businessConfig;
|
|
1211
1515
|
const { getCount, getTotal, countFilter, totalFilter } = useHandleFun(config);
|
|
1212
1516
|
const isCountFiler = countFilter && isFunction(countFilter);
|
|
1213
1517
|
const isTotalFiler = totalFilter && isFunction(totalFilter);
|
|
@@ -1218,37 +1522,21 @@ function useFilter(config, filterMethod, tree = {
|
|
|
1218
1522
|
const nodes = tree.treeNodes || [];
|
|
1219
1523
|
hiddenKeys.clear();
|
|
1220
1524
|
function traverse(nodes, isShow = false) {
|
|
1221
|
-
const deepBusinessList = [];
|
|
1222
1525
|
let count = 0;
|
|
1223
1526
|
let total = 0;
|
|
1224
1527
|
nodes.forEach((node) => {
|
|
1225
|
-
const businessList = [];
|
|
1226
1528
|
family.push(node);
|
|
1227
1529
|
if (isShow || (filterMethod && filterMethod(params, node.data, node))) {
|
|
1228
1530
|
family.forEach((member) => {
|
|
1229
1531
|
expandKeySet.add(member.key);
|
|
1230
1532
|
});
|
|
1231
|
-
if (integratedBusiness && !/^1|4$/.test(node.data.dataType)) {
|
|
1232
|
-
businessList.push(node.data);
|
|
1233
|
-
deepBusinessList.push(node.data);
|
|
1234
|
-
}
|
|
1235
1533
|
}
|
|
1236
1534
|
else if (node.isLeaf) {
|
|
1237
1535
|
hiddenKeys.add(node.key);
|
|
1238
1536
|
}
|
|
1239
1537
|
const children = node.children;
|
|
1240
1538
|
if (children) {
|
|
1241
|
-
const { count: childCount, total: childTotal
|
|
1242
|
-
// 保存下层业务数据
|
|
1243
|
-
if (integratedBusiness) {
|
|
1244
|
-
for (const target of list2) {
|
|
1245
|
-
if (!/^1|4$/.test(target.dataType)) {
|
|
1246
|
-
businessList.push(target);
|
|
1247
|
-
deepBusinessList.push(target);
|
|
1248
|
-
}
|
|
1249
|
-
}
|
|
1250
|
-
node.data.childrenDeviceList = businessList;
|
|
1251
|
-
}
|
|
1539
|
+
const { count: childCount, total: childTotal } = traverse(children, filterAll ? false : expandKeySet.has(node.key));
|
|
1252
1540
|
node.count = isCountFiler ? childCount : getCount(node);
|
|
1253
1541
|
node.total = isTotalFiler ? childTotal : getTotal(node);
|
|
1254
1542
|
count += childCount;
|
|
@@ -1289,7 +1577,95 @@ function useFilter(config, filterMethod, tree = {
|
|
|
1289
1577
|
}
|
|
1290
1578
|
family.pop();
|
|
1291
1579
|
});
|
|
1292
|
-
return { count, total
|
|
1580
|
+
return { count, total };
|
|
1581
|
+
}
|
|
1582
|
+
traverse(nodes);
|
|
1583
|
+
return expandKeySet;
|
|
1584
|
+
}
|
|
1585
|
+
// 通道过滤方法
|
|
1586
|
+
function channelFilter(params, filterAll = true) {
|
|
1587
|
+
if (!isFunction(filterMethod)) {
|
|
1588
|
+
return;
|
|
1589
|
+
}
|
|
1590
|
+
const { getCount, getTotal, countFilter, totalFilter } = useHandleFun(config);
|
|
1591
|
+
const isCountFiler = countFilter && isFunction(countFilter);
|
|
1592
|
+
const isTotalFiler = totalFilter && isFunction(totalFilter);
|
|
1593
|
+
const expandKeySet = new Set();
|
|
1594
|
+
const hiddenExpandIconKeys = hiddenExpandIconKeySet;
|
|
1595
|
+
const hiddenKeys = hiddenNodeKeySet;
|
|
1596
|
+
const family = [];
|
|
1597
|
+
const nodes = tree.treeNodes || [];
|
|
1598
|
+
hiddenKeys.clear();
|
|
1599
|
+
// 是否为过滤的根节点
|
|
1600
|
+
const isFilterLeaf = (node) => {
|
|
1601
|
+
if (config.business !== Business.CHANNEL)
|
|
1602
|
+
return node.isLeaf;
|
|
1603
|
+
return node.data.dataType === 3 || node.isLeaf;
|
|
1604
|
+
};
|
|
1605
|
+
function traverse(nodes, isShow = false) {
|
|
1606
|
+
let count = 0;
|
|
1607
|
+
let total = 0;
|
|
1608
|
+
nodes.forEach((node) => {
|
|
1609
|
+
const isLeaf = isFilterLeaf(node);
|
|
1610
|
+
family.push(node);
|
|
1611
|
+
if (isShow || (filterMethod && filterMethod(params, node.data, node))) {
|
|
1612
|
+
family.forEach((member) => {
|
|
1613
|
+
expandKeySet.add(member.key);
|
|
1614
|
+
});
|
|
1615
|
+
}
|
|
1616
|
+
else if (isLeaf) {
|
|
1617
|
+
hiddenKeys.add(node.key);
|
|
1618
|
+
}
|
|
1619
|
+
const children = node.children;
|
|
1620
|
+
if (children) {
|
|
1621
|
+
if (!isLeaf) {
|
|
1622
|
+
const { count: childCount, total: childTotal } = traverse(children, filterAll ? false : expandKeySet.has(node.key));
|
|
1623
|
+
node.count = isCountFiler ? childCount : getCount(node);
|
|
1624
|
+
node.total = isTotalFiler ? childTotal : getTotal(node);
|
|
1625
|
+
count += childCount;
|
|
1626
|
+
total += childTotal;
|
|
1627
|
+
}
|
|
1628
|
+
else if (!hiddenKeys.has(node.key)) {
|
|
1629
|
+
count++;
|
|
1630
|
+
total++;
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
else if (!hiddenKeys.has(node.key)) {
|
|
1634
|
+
node.count = 0;
|
|
1635
|
+
node.total = 0;
|
|
1636
|
+
// 统计,当仅展示在线时,不统计离线的设备
|
|
1637
|
+
if (!tree.hiddenNodeKeySet.has(node.key)) {
|
|
1638
|
+
if (isCountFiler && countFilter) {
|
|
1639
|
+
count += countFilter(node.data) ? 1 : 0;
|
|
1640
|
+
}
|
|
1641
|
+
if (isTotalFiler && totalFilter) {
|
|
1642
|
+
total += totalFilter(node.data) ? 1 : 0;
|
|
1643
|
+
}
|
|
1644
|
+
}
|
|
1645
|
+
}
|
|
1646
|
+
if (!isLeaf) {
|
|
1647
|
+
if (!expandKeySet.has(node.key)) {
|
|
1648
|
+
hiddenKeys.add(node.key);
|
|
1649
|
+
}
|
|
1650
|
+
else if (children) {
|
|
1651
|
+
let allHidden = true;
|
|
1652
|
+
for (const childNode of children) {
|
|
1653
|
+
if (!hiddenKeys.has(childNode.key)) {
|
|
1654
|
+
allHidden = false;
|
|
1655
|
+
break;
|
|
1656
|
+
}
|
|
1657
|
+
}
|
|
1658
|
+
if (allHidden) {
|
|
1659
|
+
hiddenExpandIconKeys.add(node.key);
|
|
1660
|
+
}
|
|
1661
|
+
else {
|
|
1662
|
+
hiddenExpandIconKeys.delete(node.key);
|
|
1663
|
+
}
|
|
1664
|
+
}
|
|
1665
|
+
}
|
|
1666
|
+
family.pop();
|
|
1667
|
+
});
|
|
1668
|
+
return { count, total };
|
|
1293
1669
|
}
|
|
1294
1670
|
traverse(nodes);
|
|
1295
1671
|
return expandKeySet;
|
|
@@ -1370,9 +1746,12 @@ function useFilter(config, filterMethod, tree = {
|
|
|
1370
1746
|
return hiddenExpandIconKeySet.has(node.key);
|
|
1371
1747
|
}
|
|
1372
1748
|
switch (config.business) {
|
|
1373
|
-
case
|
|
1749
|
+
case Business.GROUP:
|
|
1374
1750
|
doFilter = doGroupFilter;
|
|
1375
1751
|
break;
|
|
1752
|
+
case Business.CHANNEL:
|
|
1753
|
+
doFilter = channelFilter;
|
|
1754
|
+
break;
|
|
1376
1755
|
default:
|
|
1377
1756
|
doFilter = commitFilter;
|
|
1378
1757
|
break;
|
|
@@ -1387,12 +1766,12 @@ function useFilter(config, filterMethod, tree = {
|
|
|
1387
1766
|
|
|
1388
1767
|
const useStatus = (config, data, node) => {
|
|
1389
1768
|
const { business, businessConfig } = config;
|
|
1390
|
-
const {
|
|
1391
|
-
if (!business || !
|
|
1769
|
+
const { deviceStatusMap } = businessConfig;
|
|
1770
|
+
if (!business || !deviceStatusMap || !Object.keys(deviceStatusMap).length)
|
|
1392
1771
|
return;
|
|
1393
1772
|
const el = document.createElement('div');
|
|
1394
1773
|
// 设备树
|
|
1395
|
-
if ([
|
|
1774
|
+
if (business && [Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(business)) {
|
|
1396
1775
|
if (data.dataType !== 3)
|
|
1397
1776
|
return;
|
|
1398
1777
|
el.classList.add('hy-tree-node__status');
|
|
@@ -1405,7 +1784,7 @@ const useStatus = (config, data, node) => {
|
|
|
1405
1784
|
else if (data.deviceStatus !== 0) {
|
|
1406
1785
|
el.classList.add('hy-text-gradient');
|
|
1407
1786
|
}
|
|
1408
|
-
el.innerHTML =
|
|
1787
|
+
el.innerHTML = deviceStatusMap[data.deviceStatus];
|
|
1409
1788
|
return el;
|
|
1410
1789
|
}
|
|
1411
1790
|
};
|
|
@@ -1433,12 +1812,31 @@ function checkDeviceTypeFn(config, data) {
|
|
|
1433
1812
|
return `${svgName}${data.onlineState === 1 || !config.props.showStatus ? '' : '_offLine'}`;
|
|
1434
1813
|
}
|
|
1435
1814
|
const useIcon = (config, data, node) => {
|
|
1436
|
-
|
|
1815
|
+
// 设备
|
|
1816
|
+
if ((/^(device|channel|groupDevice)$/.test(config.business) && data.dataType === 3)) {
|
|
1437
1817
|
return new Icon({
|
|
1438
1818
|
svgName: checkDeviceTypeFn(config, data) + '_svg'
|
|
1439
1819
|
});
|
|
1440
1820
|
}
|
|
1441
|
-
|
|
1821
|
+
// 通道
|
|
1822
|
+
else if (config.business === Business.CHANNEL && data.dataType === 9) {
|
|
1823
|
+
const globalDeviceStatus = getGlobalDeviceStatus();
|
|
1824
|
+
// 在线
|
|
1825
|
+
let extendName = '', tip = globalDeviceStatus[1];
|
|
1826
|
+
// 离线
|
|
1827
|
+
if (data.deviceStatus === 0) {
|
|
1828
|
+
extendName = '_offLine';
|
|
1829
|
+
tip = globalDeviceStatus[0];
|
|
1830
|
+
}
|
|
1831
|
+
// 监控中
|
|
1832
|
+
else if (data.deviceStatus === 2) {
|
|
1833
|
+
extendName = '_monitor';
|
|
1834
|
+
tip = globalDeviceStatus[2];
|
|
1835
|
+
}
|
|
1836
|
+
return new Icon({ svgName: `video_channel${extendName}_svg`, width: 12, height: 12, tip });
|
|
1837
|
+
}
|
|
1838
|
+
// 采集器
|
|
1839
|
+
else if (config.business === 'cs' && data.dataType === 8) {
|
|
1442
1840
|
return new Icon({ svgName: 'menu_acquisitionStation_svg' });
|
|
1443
1841
|
}
|
|
1444
1842
|
};
|
|
@@ -1464,15 +1862,20 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
|
|
|
1464
1862
|
};
|
|
1465
1863
|
}
|
|
1466
1864
|
|
|
1467
|
-
var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqIOeUn+aIkOmFjee9rumhuSAqLwogIC8qKiDnlJ/miJDlpITnkIblh73mlbAgKi8KICBjb25zdCB1c2VIYW5kbGVGdW4gPSAoY29uZmlnKSA9PiB7CiAgICAgIGNvbnN0IHsgYnVzaW5lc3MgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmNvbmZpZy5wcm9wcyB9OwogICAgICBsZXQgeyBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHByb3BzOwogICAgICAvKiog6I635Y+Wa2V55YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldEtleShub2RlLCBpc0J1c2luZXNzID0gZmFsc2UpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICBpZiAoYnVzaW5lc3MgJiYgaXNCdXNpbmVzcykgewogICAgICAgICAgICAgIHN3aXRjaCAoYnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAnZGV2aWNlJzoKICAgICAgICAgICAgICAgICAgY2FzZSAnZ3JvdXBEZXZpY2UnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZGV2aWNlSWQ7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ3VzZXInOgogICAgICAgICAgICAgICAgICBjYXNlICdjcyc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5pZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy52YWx1ZV07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmxhYmVs5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldExhYmVsKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy5sYWJlbF07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmNoaWxkcmVu5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldENoaWxkcmVuKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbcHJvcHMuY2hpbGRyZW5dOwogICAgICAgICAgcmV0dXJuIGNoaWxkcmVuID8gWy4uLmNoaWxkcmVuXSA6IFtdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Zjb3VudOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRDb3VudChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMuY291bnRdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Z0b3RhbOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRUb3RhbChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMudG90YWxdOwogICAgICB9CiAgICAgIGlmIChbJ2RldmljZScsICdncm91cERldmljZSddLmluY2x1ZGVzKGAke2J1c2luZXNzfWApKSB7CiAgICAgICAgICBjb3VudEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDMgJiYgZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMTsKICAgICAgICAgIH07CiAgICAgICAgICB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDM7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIGVsc2UgaWYgKGJ1c2luZXNzID09PSAndXNlcicpIHsKICAgICAgICAgIGNvdW50RmlsdGVyID0gdG90YWxGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSA1OwogICAgICAgICAgfTsKICAgICAgfQogICAgICBlbHNlIGlmIChidXNpbmVzcyA9PT0gJ2NzJykgewogICAgICAgICAgY291bnRGaWx0ZXIgPSB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDg7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgICBnZXRLZXksCiAgICAgICAgICBnZXRMYWJlbCwKICAgICAgICAgIGdldENoaWxkcmVuLAogICAgICAgICAgZ2V0Q291bnQsCiAgICAgICAgICBnZXRUb3RhbCwKICAgICAgICAgIGNvdW50RmlsdGVyLAogICAgICAgICAgdG90YWxGaWx0ZXIsCiAgICAgICAgICAvLyDorr7nva7orr7lpIfnirbmgIEKICAgICAgICAgIHNldERldmljZVN0YXR1czogKGRhdGEpID0+IHsKICAgICAgICAgICAgICBpZiAoZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAvLyDnm5HmjqfkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9uaXRvciA9PT0gMSB8fCBkYXRhLmJlTW9uaXRvciA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa6K+d5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvQ2FsbCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5b2V5YOP5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvUmVjb3JkaW5nID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlvZXpn7PkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXVkaW9SZWNvcmRpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOW5v+aSreS4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5icm9hZGNhc3QgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIFNPUwogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zb3MgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOWcqOe6vwogICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8g56a757q/CiAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgIH07CiAgfTsKCiAgY29uc3QgaXNTdHJpbmcgPSAoZSkgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnOwogIGNvbnN0IGlzTnVtYmVyID0gKGUpID0+IHR5cGVvZiBlID09PSAnbnVtYmVyJzsKICBjb25zdCBpc0FycmF5ID0gKGUpID0+IEFycmF5LmlzQXJyYXkoZSk7CgogIC8vIOWkhOeQhmZpbHRlckNvbmZpZwogIGZ1bmN0aW9uIGhhbmRsZUZpbHRlckNvbmZpZyhmaWx0ZXJDb25maWcpIHsKICAgICAgcmV0dXJuIChmaWx0ZXJDb25maWcgfHwgW10pLmZpbHRlcigoaXRlbSkgPT4gewogICAgICAgICAgcmV0dXJuIChpc1N0cmluZyhpdGVtLnByb3ApICYmCiAgICAgICAgICAgICAgKGlzU3RyaW5nKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIChpc0FycmF5KGl0ZW0udmFsdWUpICYmIGl0ZW0uY29uZGl0aW9uID09PSAnYmV0d2VlbicpKSAmJgogICAgICAgICAgICAgIC9eKGVxfG5lfGlufG5vdElufGJldHdlZW58Z3R8bHR8Z2V8bGUpJC8udGVzdChpdGVtLmNvbmRpdGlvbikpOwogICAgICB9KTsKICB9CiAgLy8g5qCh6aqMZmlsdGVyQ29uZmlnCiAgZnVuY3Rpb24gdXNlRmlsdGVyQ29uZmlnKGRhdGEsIGZpbHRlckxpc3QpIHsKICAgICAgaWYgKCFmaWx0ZXJMaXN0IHx8ICFmaWx0ZXJMaXN0Lmxlbmd0aCkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmlsdGVyTGlzdC5ldmVyeSgoeyBwcm9wLCB2YWx1ZSwgY29uZGl0aW9uIH0pID0+IHsKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGFbcHJvcF07CiAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbikgewogICAgICAgICAgICAgIGNhc2UgJ2VxJzoKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gdmFsdWU7CiAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICE9PSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgIGlmIChjb25kaXRpb24gPT09ICdiZXR3ZWVuJykgewogICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldCA+PSB2YWx1ZVswXSAmJiB0YXJnZXQgPD0gdmFsdWVbMV0KICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTnVtYmVyKHRhcmdldCkpIHsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2d0JzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAnbHQnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA8IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdnZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ID49IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdsZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0IDw9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKHRhcmdldCkpIHsKICAgICAgICAgICAgICBjb25zdCBpc0luID0gdGFyZ2V0LmluY2x1ZGVzKGAke3ZhbHVlfWApOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2luJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0luOwogICAgICAgICAgICAgICAgICBjYXNlICdub3RJbic6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzSW47CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICB9CgogIHNlbGYub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHsgZGF0YSwgY29uZmlnIH0gPSBldmVudC5kYXRhOwogICAgICBjb25zdCBnZW5lcmF0ZVRyZWUgPSBnZW5lcmF0ZU1hcFtjb25maWcuYnVzaW5lc3NdOwogICAgICBpZiAoIWdlbmVyYXRlVHJlZSkgewogICAgICAgICAgc2VsZi5jbG9zZSgpOwogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHRyZWUgPSBnZW5lcmF0ZVRyZWUoZGF0YSwgY29uZmlnKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh0cmVlKTsKICB9OwogIC8vIOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIsIHNldERldmljZVN0YXR1cyB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog6K6+5aSH5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZURldmljZVRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGRldmljZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGhpZGRlbk5vZGVLZXlTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgYnVzaW5lc3NMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlTGlzdCA9IFtbXSwgW11dOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5kZXZOYW1lIHx8IHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMywgLy8g5Luj6KGo6K6+5aSHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXM6IHNldERldmljZVN0YXR1cyh2KSAvLyDorr7lpIfnirbmgIEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmRldmljZVN0YXR1cyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3Rbc29ydEJ5U3RhdHVzID8gMSA6IDBdLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKGdldEtleSh0YXJnZXQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0WzBdLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcyAmJiAhaGlkZGVuTm9kZUtleVNldC5oYXMoZ2V0S2V5KHRhcmdldCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5kZXZpY2VMaXN0WzBdLCAuLi5kZXZpY2VMaXN0WzFdXTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIC8vIOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQobm9kZS5rZXkpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieeUqOaIt+eahOmDqOmXqCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlICYmIGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAvLyDku4XmmL7npLrlnKjnur/orr7lpIfml7bvvIzpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUgJiYgIWNoaWxkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSB8fCAhaGlkZGVuTm9kZUtleVNldC5oYXMobm9kZS5rZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXZpY2VJZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlSW5mbyA9IGRldmljZU1hcC5nZXQoZGV2aWNlSWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwLnNldChkZXZpY2VJZCwgZGV2aWNlSW5mbyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGRldmljZU1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpOwogIH0KICAvLyDnvqTnu4Torr7lpIfmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZUdyb3VwRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIsIHNldERldmljZVN0YXR1cyB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog576k57uE6K6+5aSH5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZURldmljZVRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGRldmljZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGhpZGRlbk5vZGVLZXlTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDnvqTnu4QKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY2hpbGRyZW4/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgIVszLCA0XS5pbmNsdWRlcyhyYXdOb2RlLmRhdGFUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2Lmdyb3VwTmFtZSB8fCB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDQgLy8g5Luj6KGo576k57uECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmdyb3VwTGlzdF07CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZUxpc3Q/Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlTGlzdCA9IFtbXSwgW11dOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmRldmljZUxpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZGV2TmFtZSB8fCB2LmRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMywgLy8g5Luj6KGo6K6+5aSHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0W3NvcnRCeVN0YXR1cyA/IDEgOiAwXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFswXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcyAmJiAhaGlkZGVuTm9kZUtleVNldC5oYXMoZ2V0S2V5KHRhcmdldCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5kZXZpY2VMaXN0WzBdLCAuLi5kZXZpY2VMaXN0WzFdXTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIC8vIOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQobm9kZS5rZXkpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlICYmIGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAvLyDku4XmmL7npLrlnKjnur/orr7lpIfml7bvvIzpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUgJiYgIWNoaWxkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSB8fCAhaGlkZGVuTm9kZUtleVNldC5oYXMobm9kZS5rZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXZpY2VJZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlSW5mbyA9IGRldmljZU1hcC5nZXQoZGV2aWNlSWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwLnNldChkZXZpY2VJZCwgZGV2aWNlSW5mbyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGRldmljZU1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpOwogIH0KICAvLyDnvqTnu4TmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZUdyb3VwVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW59ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIC8qKiDnvqTnu4TmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlR3JvdXBUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZVRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDnvqTnu4QKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY2hpbGRyZW4/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgIVszLCA0XS5pbmNsdWRlcyhyYXdOb2RlLmRhdGFUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2Lmdyb3VwTmFtZSB8fCB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDQgLy8g5Luj6KGo576k57uECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmdyb3VwTGlzdF07CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZUxpc3Q/Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlQ291bnQgPSByYXdOb2RlLmRldmljZUxpc3QucmVkdWNlKCh2YWx1ZSwgdikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICsgKHYub25saW5lU3RhdGUgPT09IDEgPyAxIDogMCk7CiAgICAgICAgICAgICAgICAgICAgICB9LCBkZXZpY2VDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VUb3RhbCA9IHJhd05vZGUuZGV2aWNlTGlzdC5sZW5ndGggfHwgMDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGRldmljZUNvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gZGV2aWNlVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH5ZKM576k57uE55qE6YOo6ZeoIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5aSE55CG6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCwgYnVzaW5lc3NMaXN0OiBsaXN0MiB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gZGV2aWNlQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gZGV2aWNlVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQ6IG5ldyBTZXQoKQogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlR3JvdXBUcmVlKGRhdGEpOwogIH0KICAvLyDnlKjmiLfmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZVVzZXJUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgY2xlYXJFbXB0eUJ1c2luZXNzLCBpbnRlZ3JhdGVkQnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDnlKjmiLfmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlVXNlclRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHVzZXJNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgYnVzaW5lc3NMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gNSkgewogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VVc2VyTGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZGV2aWNlVXNlckxpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2Lm5hbWUgfHwgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA1LCAvLyDku6PooajnlKjmiLcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieeUqOaIt+eahOmDqOmXqCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gNSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0b3RhbEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOeUqOaItwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gNSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckxpc3QgPSB1c2VyTWFwLmdldChpZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICB1c2VyTGlzdC5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgdXNlck1hcC5zZXQoaWQsIHVzZXJMaXN0KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgdXNlck1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0OiBuZXcgU2V0KCkKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZVVzZXJUcmVlKGRhdGEpOwogIH0KICAvLyDph4fpm4bnq5nmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZUNzVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW4sIGNvdW50RmlsdGVyLCB0b3RhbEZpbHRlciB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog6YeH6ZuG56uZ5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNzVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgY3NNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgYnVzaW5lc3NMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jc0xpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmNzTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuc25hbWUgfHwgdi5zY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA4LCAvLyDku6Pooajph4fpm4bnq5kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeaciemHh+mbhuWZqOeahOmDqOmXqCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6YeH6ZuG5Zmo55qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0b3RhbEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmHh+mbhuermQogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckxpc3QgPSBjc01hcC5nZXQoaWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgdXNlckxpc3QucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIGNzTWFwLnNldChpZCwgdXNlckxpc3QpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CiAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB7IGxpc3Q6IHNpYmxpbmdzLCBjb3VudCwgdG90YWwsIGJ1c2luZXNzTGlzdDogZGVlcEJ1c2luZXNzTGlzdCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICBjc01hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0OiBuZXcgU2V0KCkKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZUNzVHJlZShkYXRhKTsKICB9CiAgY29uc3QgZ2VuZXJhdGVNYXAgPSB7CiAgICAgIC8vIOiuvuWkh+agkQogICAgICBkZXZpY2U6IGdlbmVyYXRlRGV2aWNlVHJlZSwKICAgICAgLy8g576k57uE6K6+5aSH5qCRCiAgICAgIGdyb3VwRGV2aWNlOiBnZW5lcmF0ZUdyb3VwRGV2aWNlVHJlZSwKICAgICAgLy8g576k57uE5qCRCiAgICAgIGdyb3VwOiBnZW5lcmF0ZUdyb3VwVHJlZSwKICAgICAgLy8g55So5oi35qCRCiAgICAgIHVzZXI6IGdlbmVyYXRlVXNlclRyZWUsCiAgICAgIC8vIOmHh+mbhuermQogICAgICBjczogZ2VuZXJhdGVDc1RyZWUKICB9OwoKfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2VuZXJhdGVUcmVlLmpzLm1hcAoK');
|
|
1865
|
+
var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8g5Lia5Yqh57G75Z6LKGNvbmZpZy5idXNpbmVzcykgZGV2aWNlLeiuvuWkhyBjaGFubmVsLemAmumBk+iuvuWkhyBncm91cERldmljZS3nvqTnu4Torr7lpIcgZ3JvdXAt576k57uEIHVzZXIt55So5oi3IGNzLemHh+mbhuermQogIHZhciBCdXNpbmVzczsKICAoZnVuY3Rpb24gKEJ1c2luZXNzKSB7CiAgICAgIEJ1c2luZXNzWyJERVZJQ0UiXSA9ICJkZXZpY2UiOwogICAgICBCdXNpbmVzc1siQ0hBTk5FTCJdID0gImNoYW5uZWwiOwogICAgICBCdXNpbmVzc1siR1JPVVBfREVWSUNFIl0gPSAiZ3JvdXBEZXZpY2UiOwogICAgICBCdXNpbmVzc1siR1JPVVAiXSA9ICJncm91cCI7CiAgICAgIEJ1c2luZXNzWyJVU0VSIl0gPSAidXNlciI7CiAgICAgIEJ1c2luZXNzWyJDUyJdID0gImNzIjsKICB9KShCdXNpbmVzcyB8fCAoQnVzaW5lc3MgPSB7fSkpOwogIC8vIOiuvuWkh+eKtuaAgShkYXRhLmRldmljZVN0YXR1cykgMC3nprvnur8gMS3lnKjnur8gMi3nm5HmjqfkuK0gMy3pgJror53kuK0gNC3lvZXlg4/kuK0gNS3lvZXpn7PkuK0gNi3lub/mkq3kuK0gNy1TT1MKICB2YXIgRGV2aWNlU3RhdHVzOwogIChmdW5jdGlvbiAoRGV2aWNlU3RhdHVzKSB7CiAgICAgIERldmljZVN0YXR1c1tEZXZpY2VTdGF0dXNbIk9GRl9MSU5FIl0gPSAwXSA9ICJPRkZfTElORSI7CiAgICAgIERldmljZVN0YXR1c1tEZXZpY2VTdGF0dXNbIk9OX0xJTkUiXSA9IDFdID0gIk9OX0xJTkUiOwogICAgICBEZXZpY2VTdGF0dXNbRGV2aWNlU3RhdHVzWyJCRV9NT05JVE9SIl0gPSAyXSA9ICJCRV9NT05JVE9SIjsKICAgICAgRGV2aWNlU3RhdHVzW0RldmljZVN0YXR1c1siSU5fQ0FMTCJdID0gM10gPSAiSU5fQ0FMTCI7CiAgICAgIERldmljZVN0YXR1c1tEZXZpY2VTdGF0dXNbIklOX1ZJREVPX1JFQ09SRCJdID0gNF0gPSAiSU5fVklERU9fUkVDT1JEIjsKICAgICAgRGV2aWNlU3RhdHVzW0RldmljZVN0YXR1c1siSU5fQVVESU9fUkVDT1JEIl0gPSA1XSA9ICJJTl9BVURJT19SRUNPUkQiOwogICAgICBEZXZpY2VTdGF0dXNbRGV2aWNlU3RhdHVzWyJJTl9CUk9BRENBU0UiXSA9IDZdID0gIklOX0JST0FEQ0FTRSI7CiAgICAgIERldmljZVN0YXR1c1tEZXZpY2VTdGF0dXNbIlNPUyJdID0gN10gPSAiU09TIjsgLy8gU09TCiAgfSkoRGV2aWNlU3RhdHVzIHx8IChEZXZpY2VTdGF0dXMgPSB7fSkpOwogIC8vIOS4muWKoeaVsOaNruexu+WeiyhkYXRhLmRhdGFUeXBlKSAxLemDqOmXqCAzLeiuvuWkhyA0Lee+pOe7hCA1LeeUqOaItyA2LeiAg+WLpCA3LeawtOa6kOeCuSA4LemHh+mbhuermSA5LeiuvuWkh+mAmumBkwogIHZhciBEYXRhVHlwZTsKICAoZnVuY3Rpb24gKERhdGFUeXBlKSB7CiAgICAgIERhdGFUeXBlW0RhdGFUeXBlWyJVTktOT1dfMSJdID0gMF0gPSAiVU5LTk9XXzEiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiREVQVCJdID0gMV0gPSAiREVQVCI7CiAgICAgIERhdGFUeXBlW0RhdGFUeXBlWyJVTktOT1dfMiJdID0gMl0gPSAiVU5LTk9XXzIiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiREVWSUNFIl0gPSAzXSA9ICJERVZJQ0UiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiR1JPVVAiXSA9IDRdID0gIkdST1VQIjsKICAgICAgRGF0YVR5cGVbRGF0YVR5cGVbIlVTRVIiXSA9IDVdID0gIlVTRVIiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiQVRURU5EQU5DRSJdID0gNl0gPSAiQVRURU5EQU5DRSI7CiAgICAgIERhdGFUeXBlW0RhdGFUeXBlWyJXQVRFUl9TT1VSQ0UiXSA9IDddID0gIldBVEVSX1NPVVJDRSI7CiAgICAgIERhdGFUeXBlW0RhdGFUeXBlWyJDUyJdID0gOF0gPSAiQ1MiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiQ0hBTk5FTCJdID0gOV0gPSAiQ0hBTk5FTCI7IC8vIOiuvuWkh+mAmumBkwogIH0pKERhdGFUeXBlIHx8IChEYXRhVHlwZSA9IHt9KSk7CgogIC8qKiDnlJ/miJDlpITnkIblh73mlbAgKi8KICBjb25zdCB1c2VIYW5kbGVGdW4gPSAoY29uZmlnKSA9PiB7CiAgICAgIGNvbnN0IHsgYnVzaW5lc3MgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmNvbmZpZy5wcm9wcyB9OwogICAgICBsZXQgeyBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHByb3BzOwogICAgICAvKiog6I635Y+Wa2V55YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldEtleShub2RlLCBpc0J1c2luZXNzID0gZmFsc2UpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICBpZiAoYnVzaW5lc3MgJiYgaXNCdXNpbmVzcykgewogICAgICAgICAgICAgIHN3aXRjaCAobm9kZS5kZXZpY2VUeXBlKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuREVQVDogLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuR1JPVVA6IC8vIOe+pOe7hAogICAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLlVTRVI6IC8vIOeUqOaItwogICAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkNTOiAvLyDph4fpm4bnq5kKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmlkOwogICAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkRFVklDRTogLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5kZXZpY2VJZDsKICAgICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5DSEFOTkVMOiAvLyDorr7lpIfpgJrpgZMKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmNoYW5uZWxJZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy52YWx1ZV07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmxhYmVs5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldExhYmVsKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy5sYWJlbF07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmNoaWxkcmVu5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldENoaWxkcmVuKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbcHJvcHMuY2hpbGRyZW5dOwogICAgICAgICAgcmV0dXJuIGNoaWxkcmVuID8gWy4uLmNoaWxkcmVuXSA6IFtdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Zjb3VudOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRDb3VudChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMuY291bnRdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Z0b3RhbOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRUb3RhbChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMudG90YWxdOwogICAgICB9CiAgICAgIGlmIChidXNpbmVzcyAmJiBbQnVzaW5lc3MuREVWSUNFLCBCdXNpbmVzcy5DSEFOTkVMLCBCdXNpbmVzcy5HUk9VUF9ERVZJQ0VdLmluY2x1ZGVzKGJ1c2luZXNzKSkgewogICAgICAgICAgY291bnRGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSAzICYmIGRhdGEub25saW5lU3RhdGUgPT09IDE7CiAgICAgICAgICB9OwogICAgICAgICAgdG90YWxGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSAzOwogICAgICAgICAgfTsKICAgICAgfQogICAgICBlbHNlIGlmIChidXNpbmVzcyA9PT0gJ3VzZXInKSB7CiAgICAgICAgICBjb3VudEZpbHRlciA9IHRvdGFsRmlsdGVyID0gKGRhdGEpID0+IHsKICAgICAgICAgICAgICByZXR1cm4gZGF0YS5kYXRhVHlwZSA9PT0gNTsKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgZWxzZSBpZiAoYnVzaW5lc3MgPT09ICdjcycpIHsKICAgICAgICAgIGNvdW50RmlsdGVyID0gdG90YWxGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSA4OwogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgICAgZ2V0S2V5LAogICAgICAgICAgZ2V0TGFiZWwsCiAgICAgICAgICBnZXRDaGlsZHJlbiwKICAgICAgICAgIGdldENvdW50LAogICAgICAgICAgZ2V0VG90YWwsCiAgICAgICAgICBjb3VudEZpbHRlciwKICAgICAgICAgIHRvdGFsRmlsdGVyLAogICAgICAgICAgLy8g6K6+572u6K6+5aSH54q25oCBCiAgICAgICAgICBzZXREZXZpY2VTdGF0dXM6IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgLy8g6YCa6YGT54q25oCBCiAgICAgICAgICAgICAgaWYgKGRhdGEuZGV2aWNlVHlwZSA9PT0gOSkgewogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgLy8g55uR5o6n5LitCiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5iZU1vbml0b3IgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOWcqOe6vwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g56a757q/CiAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyDorr7lpIfnirbmgIEKICAgICAgICAgICAgICBpZiAoZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAvLyDnm5HmjqfkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9uaXRvciA9PT0gMSB8fCBkYXRhLmJlTW9uaXRvciA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa6K+d5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvQ2FsbCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5b2V5YOP5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvUmVjb3JkaW5nID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlvZXpn7PkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXVkaW9SZWNvcmRpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOW5v+aSreS4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5icm9hZGNhc3QgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIFNPUwogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zb3MgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOWcqOe6vwogICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8g56a757q/CiAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgIH07CiAgfTsKCiAgY29uc3QgaXNTdHJpbmcgPSAoZSkgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnOwogIGNvbnN0IGlzTnVtYmVyID0gKGUpID0+IHR5cGVvZiBlID09PSAnbnVtYmVyJzsKICBjb25zdCBpc0FycmF5ID0gKGUpID0+IEFycmF5LmlzQXJyYXkoZSk7CgogIC8vIOWkhOeQhmZpbHRlckNvbmZpZwogIGZ1bmN0aW9uIGhhbmRsZUZpbHRlckNvbmZpZyhmaWx0ZXJDb25maWcpIHsKICAgICAgcmV0dXJuIChmaWx0ZXJDb25maWcgfHwgW10pLmZpbHRlcigoaXRlbSkgPT4gewogICAgICAgICAgcmV0dXJuIChpc1N0cmluZyhpdGVtLnByb3ApICYmCiAgICAgICAgICAgICAgKGlzU3RyaW5nKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIChpc0FycmF5KGl0ZW0udmFsdWUpICYmIGl0ZW0uY29uZGl0aW9uID09PSAnYmV0d2VlbicpKSAmJgogICAgICAgICAgICAgIC9eKGVxfG5lfGlufG5vdElufGJldHdlZW58Z3R8bHR8Z2V8bGUpJC8udGVzdChpdGVtLmNvbmRpdGlvbikpOwogICAgICB9KTsKICB9CiAgLy8g5qCh6aqMZmlsdGVyQ29uZmlnCiAgZnVuY3Rpb24gdXNlRmlsdGVyQ29uZmlnKGRhdGEsIGZpbHRlckxpc3QpIHsKICAgICAgaWYgKCFmaWx0ZXJMaXN0IHx8ICFmaWx0ZXJMaXN0Lmxlbmd0aCkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmlsdGVyTGlzdC5ldmVyeSgoeyBwcm9wLCB2YWx1ZSwgY29uZGl0aW9uIH0pID0+IHsKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGFbcHJvcF07CiAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbikgewogICAgICAgICAgICAgIGNhc2UgJ2VxJzoKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gdmFsdWU7CiAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICE9PSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgIGlmIChjb25kaXRpb24gPT09ICdiZXR3ZWVuJykgewogICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldCA+PSB2YWx1ZVswXSAmJiB0YXJnZXQgPD0gdmFsdWVbMV0KICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTnVtYmVyKHRhcmdldCkpIHsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2d0JzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAnbHQnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA8IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdnZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ID49IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdsZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0IDw9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKHRhcmdldCkpIHsKICAgICAgICAgICAgICBjb25zdCBpc0luID0gdGFyZ2V0LmluY2x1ZGVzKGAke3ZhbHVlfWApOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2luJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0luOwogICAgICAgICAgICAgICAgICBjYXNlICdub3RJbic6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzSW47CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICB9CgogIHNlbGYub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHsgZGF0YSwgY29uZmlnIH0gPSBldmVudC5kYXRhOwogICAgICBjb25zdCBnZW5lcmF0ZVRyZWUgPSBnZW5lcmF0ZU1hcFtjb25maWcuYnVzaW5lc3NdOwogICAgICBpZiAoIWdlbmVyYXRlVHJlZSkgewogICAgICAgICAgc2VsZi5jbG9zZSgpOwogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHRyZWUgPSBnZW5lcmF0ZVRyZWUoZGF0YSwgY29uZmlnKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh0cmVlKTsKICB9OwogIC8vIOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyLCBzZXREZXZpY2VTdGF0dXMgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOiuvuWkh+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBkZXZpY2VNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBoaWRkZW5Ob2RlS2V5U2V0ID0gbmV3IFNldCgpOwogICAgICAgICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXMsIGxldmVsID0gMSwgcGFyZW50ID0gdW5kZWZpbmVkKSA9PiB7CiAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VMaXN0ID0gW1tdLCBbXV07CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZUxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmRldmljZUxpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LmRldk5hbWUgfHwgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAzLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFtzb3J0QnlTdGF0dXMgPyAxIDogMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3RbMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmRldmljZUxpc3RbMF0sIC4uLmRldmljZUxpc3RbMV1dOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgLy8g6ZqQ6JeP5rKh5pyJ5Zyo57q/6K6+5aSH55qE6YOo6Zeo5ZKM576k57uECiAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93T25saW5lU3RhdGUgJiYgY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAvLyDku4XmmL7npLrlnKjnur/orr7lpIfml7bvvIzpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUgJiYgIWNoaWxkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSB8fCAhaGlkZGVuTm9kZUtleVNldC5oYXMobm9kZS5rZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXZpY2VJZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlSW5mbyA9IGRldmljZU1hcC5nZXQoZGV2aWNlSWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwLnNldChkZXZpY2VJZCwgZGV2aWNlSW5mbyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICBkZXZpY2VNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldAogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlRGV2aWNlVHJlZShkYXRhKTsKICB9CiAgLy8g6YCa6YGT6K6+5aSH5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVDaGFubmVsRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyLCBzZXREZXZpY2VTdGF0dXMgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOiuvuWkh+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBkZXZpY2VNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBjaGFubmVsTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgaGlkZGVuTm9kZUtleVNldCA9IG5ldyBTZXQoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDpnZ7orr7lpIfnsbvlnosKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IERhdGFUeXBlLkRFVklDRSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlTGlzdCA9IFtbXSwgW11dOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5kZXZOYW1lIHx8IHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogRGF0YVR5cGUuREVWSUNFLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSBEZXZpY2VTdGF0dXMuT0ZGX0xJTkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0W3NvcnRCeVN0YXR1cyA/IDEgOiAwXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChnZXRLZXkodGFyZ2V0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFswXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZGV2aWNlTGlzdFswXSwgLi4uZGV2aWNlTGlzdFsxXV07CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBEYXRhVHlwZS5ERVBULCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH55qE6YOo6Zeo5ZKM576k57uEIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa55So6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBnZXRMYWJlbChyYXdOb2RlKSwKICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwKICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZEtleVNldC5oYXModmFsdWUpCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIC8vIOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSBEYXRhVHlwZS5ERVZJQ0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6Z2e6K6+5aSH57G75Z6L5pWw5o2uCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSBEYXRhVHlwZS5ERVZJQ0UgJiYgY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInnlKjmiLfnmoTpg6jpl6gg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSAmJiBjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heaYvuekuuWcqOe6v+iuvuWkh+aXtu+8jOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSAmJiAhY2hpbGRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlIHx8ICFoaWRkZW5Ob2RlS2V5U2V0Lmhhcyhub2RlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSH57G75Z6L5pWw5o2u77yM5LiU5pyJ6YCa6YGT5pWw5o2u5aSE55CGCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSBEYXRhVHlwZS5ERVZJQ0UgJiYgcmF3Tm9kZS52aWRlb0NoYW5uZWxMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxMaXN0ID0gW1tdLCBbXV07CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLnZpZGVvQ2hhbm5lbExpc3QuZm9yRWFjaCgoYykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWwgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogcmF3Tm9kZS5vbmx5SWQgKyAnLScgKyBjLmNoYW5uZWxJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGMuY2hhbm5lbE5hbWUgfHwgYy5jaGFubmVsSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBsZXZlbCArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xlYWY6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZDogcmF3Tm9kZS5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldk5hbWU6IHJhd05vZGUuZGV2TmFtZSB8fCByYXdOb2RlLmRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLm9ubHlJZCArICctJyArIGMuY2hhbm5lbElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGMuY2hhbm5lbE5hbWUgfHwgYy5jaGFubmVsSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogRGF0YVR5cGUuQ0hBTk5FTCwgLy8g5Luj6KGo6YCa6YGTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXM6IHNldERldmljZVN0YXR1cyhjKSAvLyDorr7lpIfpgJrpgZPnirbmgIEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBub2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwuZGF0YS5kZXZpY2VTdGF0dXMgPT09IERldmljZVN0YXR1cy5PRkZfTElORSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTGlzdFtzb3J0QnlTdGF0dXMgPyAxIDogMF0ucHVzaChjaGFubmVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoY2hhbm5lbC5rZXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTGlzdFswXS5wdXNoKGNoYW5uZWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFwLnNldChjLmNoYW5uZWxJZCwgY2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KGNoYW5uZWwua2V5LCBjaGFubmVsKTsKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hhbm5lbExpc3RbMF0sIC4uLmNoYW5uZWxMaXN0WzFdXTsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGFubmVsTGlzdFswXS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gc2hvd09ubGluZVN0YXRlID8gbm9kZS5jb3VudCA6IGNoaWxkcmVuLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuREVWSUNFKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsIH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIGNoYW5uZWxNYXAsCiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgZGV2aWNlTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZURldmljZVRyZWUoZGF0YSk7CiAgfQogIC8vIOe+pOe7hOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlR3JvdXBEZXZpY2VUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgc29ydEJ5U3RhdHVzLCBzaG93T25saW5lU3RhdGUsIGNsZWFyRW1wdHlCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIsIHNldERldmljZVN0YXR1cyB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog576k57uE6K6+5aSH5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZURldmljZVRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGRldmljZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGhpZGRlbk5vZGVLZXlTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgLy8g576k57uECiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmNoaWxkcmVuPy5sZW5ndGggfHwKICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZ3JvdXBMaXN0Py5sZW5ndGggfHwKICAgICAgICAgICAgICAgICAgICAgICFbMywgNF0uaW5jbHVkZXMocmF3Tm9kZS5kYXRhVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZ3JvdXBMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5ncm91cE5hbWUgfHwgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA0IC8vIOS7o+ihqOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cExpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5ncm91cExpc3RdOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldmljZUxpc3QgPSBbW10sIFtdXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LmRldk5hbWUgfHwgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDMsIC8vIOS7o+ihqOiuvuWkhwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXM6IHNldERldmljZVN0YXR1cyh2KSAvLyDorr7lpIfnirbmgIEKICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VGaWx0ZXJDb25maWcodGFyZ2V0LCBmaWx0ZXJMaXN0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmRldmljZVN0YXR1cyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFtzb3J0QnlTdGF0dXMgPyAxIDogMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKGdldEtleSh0YXJnZXQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3RbMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZGV2aWNlTGlzdFswXSwgLi4uZGV2aWNlTGlzdFsxXV07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH55qE6YOo6Zeo5ZKM576k57uEIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa55So6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICAvLyDpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSAmJiBjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heaYvuekuuWcqOe6v+iuvuWkh+aXtu+8jOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSAmJiAhY2hpbGRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlIHx8ICFoaWRkZW5Ob2RlS2V5U2V0Lmhhcyhub2RlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsIH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGRldmljZU1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpOwogIH0KICAvLyDnvqTnu4TmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZUdyb3VwVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IGNsZWFyRW1wdHlCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVufSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICAvKiog576k57uE5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUdyb3VwVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXMsIGxldmVsID0gMSwgcGFyZW50ID0gdW5kZWZpbmVkKSA9PiB7CiAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlVG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIC8vIOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jaGlsZHJlbj8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cExpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZ3JvdXBMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZ3JvdXBOYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNCAvLyDku6PooajnvqTnu4QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZ3JvdXBMaXN0XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VDb3VudCA9IHJhd05vZGUuZGV2aWNlTGlzdC5yZWR1Y2UoKHZhbHVlLCB2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICsgKHYub25saW5lU3RhdGUgPT09IDEgPyAxIDogMCk7CiAgICAgICAgICAgICAgICAgICAgICB9LCBkZXZpY2VDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VUb3RhbCA9IHJhd05vZGUuZGV2aWNlTGlzdC5sZW5ndGggfHwgMDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGRldmljZUNvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gZGV2aWNlVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH5ZKM576k57uE55qE6YOo6ZeoIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5aSE55CG6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGRldmljZUNvdW50OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGRldmljZVRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CiAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB7IGxpc3Q6IHNpYmxpbmdzLCBjb3VudCwgdG90YWwgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVHcm91cFRyZWUoZGF0YSk7CiAgfQogIC8vIOeUqOaIt+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlVXNlclRyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDnlKjmiLfmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlVXNlclRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHVzZXJNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDUpIHsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlVXNlckxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmRldmljZVVzZXJMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5uYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNSwgLy8g5Luj6KGo55So5oi3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VGaWx0ZXJDb25maWcodGFyZ2V0LCBmaWx0ZXJMaXN0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa55So6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInnlKjmiLfnmoTpg6jpl6gg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0b3RhbEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOeUqOaItwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gNSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckxpc3QgPSB1c2VyTWFwLmdldChpZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICB1c2VyTGlzdC5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgdXNlck1hcC5zZXQoaWQsIHVzZXJMaXN0KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsIH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIHVzZXJNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVVc2VyVHJlZShkYXRhKTsKICB9CiAgLy8g6YeH6ZuG56uZ5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVDc1RyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDph4fpm4bnq5nmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlQ3NUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBjc01hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jc0xpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmNzTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuc25hbWUgfHwgdi5zY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA4LCAvLyDku6Pooajph4fpm4bnq5kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInph4fpm4blmajnmoTpg6jpl6gg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeaciemHh+mbhuWZqOeahOmDqOmXqCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YeH6ZuG56uZCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyTGlzdCA9IGNzTWFwLmdldChpZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICB1c2VyTGlzdC5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgY3NNYXAuc2V0KGlkLCB1c2VyTGlzdCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICBjc01hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0OiBuZXcgU2V0KCkKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZUNzVHJlZShkYXRhKTsKICB9CiAgY29uc3QgZ2VuZXJhdGVNYXAgPSB7CiAgICAgIC8vIOiuvuWkh+agkQogICAgICBbQnVzaW5lc3MuREVWSUNFXTogZ2VuZXJhdGVEZXZpY2VUcmVlLAogICAgICAvLyDpgJrpgZPorr7lpIfmoJEKICAgICAgW0J1c2luZXNzLkNIQU5ORUxdOiBnZW5lcmF0ZUNoYW5uZWxEZXZpY2VUcmVlLAogICAgICAvLyDnvqTnu4Torr7lpIfmoJEKICAgICAgW0J1c2luZXNzLkdST1VQX0RFVklDRV06IGdlbmVyYXRlR3JvdXBEZXZpY2VUcmVlLAogICAgICAvLyDnvqTnu4TmoJEKICAgICAgW0J1c2luZXNzLkdST1VQXTogZ2VuZXJhdGVHcm91cFRyZWUsCiAgICAgIC8vIOeUqOaIt+agkQogICAgICBbQnVzaW5lc3MuVVNFUl06IGdlbmVyYXRlVXNlclRyZWUsCiAgICAgIC8vIOmHh+mbhuermQogICAgICBbQnVzaW5lc3MuQ1NdOiBnZW5lcmF0ZUNzVHJlZQogIH07Cgp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1nZW5lcmF0ZVRyZWUuanMubWFwCgo=');
|
|
1468
1866
|
/* eslint-enable */
|
|
1469
1867
|
|
|
1470
1868
|
// 设备树
|
|
1471
1869
|
function updateDeviceTree(tree, data, config) {
|
|
1472
1870
|
const deviceMap = tree.deviceMap || new Map();
|
|
1473
1871
|
let beOnlineList = [], beOfflineList = [];
|
|
1872
|
+
const { businessConfig, hiddenNodeKeySet } = config;
|
|
1474
1873
|
const { countFilter, totalFilter, setDeviceStatus } = useHandleFun(config);
|
|
1475
|
-
const { sortByStatus, showOnlineState
|
|
1874
|
+
const { sortByStatus, showOnlineState } = businessConfig;
|
|
1875
|
+
// 是否参与统计
|
|
1876
|
+
const isStatistics = (key) => {
|
|
1877
|
+
return !(hiddenNodeKeySet.has(key) || tree.hiddenNodeKeySet.has(key));
|
|
1878
|
+
};
|
|
1476
1879
|
// 更新父节点统计
|
|
1477
1880
|
const updateParnetCount = (keySet) => {
|
|
1478
1881
|
const isCountFiler = countFilter && isFunction(countFilter);
|
|
@@ -1486,16 +1889,15 @@ function updateDeviceTree(tree, data, config) {
|
|
|
1486
1889
|
let total = isTotalFiler ? 0 : target.data.total;
|
|
1487
1890
|
const deviceList = [[], []];
|
|
1488
1891
|
if (isCountFiler || isTotalFiler) {
|
|
1489
|
-
const businessList = [];
|
|
1490
1892
|
let children = target.children || [];
|
|
1491
1893
|
for (let i = 0; i < children.length; i++) {
|
|
1492
1894
|
const item = target.children[i];
|
|
1493
1895
|
count =
|
|
1494
|
-
isCountFiler &&
|
|
1896
|
+
isCountFiler && isStatistics(item.key) && countFilter
|
|
1495
1897
|
? count + (item.children ? item.count : countFilter(item.data))
|
|
1496
1898
|
: count;
|
|
1497
1899
|
total =
|
|
1498
|
-
isTotalFiler &&
|
|
1900
|
+
isTotalFiler && isStatistics(item.key) && totalFilter
|
|
1499
1901
|
? total + (item.children ? item.total : totalFilter(item.data))
|
|
1500
1902
|
: total;
|
|
1501
1903
|
if (item.data.deviceStatus === 0) {
|
|
@@ -1504,17 +1906,7 @@ function updateDeviceTree(tree, data, config) {
|
|
|
1504
1906
|
else {
|
|
1505
1907
|
deviceList[0].push(item);
|
|
1506
1908
|
}
|
|
1507
|
-
// 更新下级设备列表
|
|
1508
|
-
if (integratedBusiness && !tree.hiddenNodeKeySet.has(item.key)) {
|
|
1509
|
-
if (/^(1|4)$/.test(item.data.dataType)) {
|
|
1510
|
-
businessList.push(...(item.data.childrenDeviceList || []));
|
|
1511
|
-
}
|
|
1512
|
-
else {
|
|
1513
|
-
businessList.push(item.data);
|
|
1514
|
-
}
|
|
1515
|
-
}
|
|
1516
1909
|
}
|
|
1517
|
-
target.data.childrenDeviceList = businessList;
|
|
1518
1910
|
}
|
|
1519
1911
|
// 在仅显示设备时,设置 部门/群组 显示状态
|
|
1520
1912
|
if (showOnlineState && count > 0) {
|
|
@@ -1561,6 +1953,130 @@ function updateDeviceTree(tree, data, config) {
|
|
|
1561
1953
|
updateParnetCount(parentKeySet);
|
|
1562
1954
|
return { tree, beOnlineList, beOfflineList };
|
|
1563
1955
|
}
|
|
1956
|
+
// 设备通道树
|
|
1957
|
+
function updateDeviceChannelTree(tree, data, config) {
|
|
1958
|
+
const deviceMap = tree.deviceMap || new Map();
|
|
1959
|
+
const channelMap = tree.channelMap || new Map();
|
|
1960
|
+
let beOnlineList = [], beOfflineList = [];
|
|
1961
|
+
const { businessConfig, hiddenNodeKeySet } = config;
|
|
1962
|
+
const { countFilter, totalFilter, setDeviceStatus } = useHandleFun(config);
|
|
1963
|
+
const { sortByStatus, showOnlineState } = businessConfig;
|
|
1964
|
+
// 是否参与统计
|
|
1965
|
+
const isStatistics = (key) => {
|
|
1966
|
+
return !(hiddenNodeKeySet.has(key) || tree.hiddenNodeKeySet.has(key));
|
|
1967
|
+
};
|
|
1968
|
+
// 更新父节点统计
|
|
1969
|
+
const updateParnetCount = (map) => {
|
|
1970
|
+
const isCountFiler = countFilter && isFunction(countFilter);
|
|
1971
|
+
const isTotalFiler = totalFilter && isFunction(totalFilter);
|
|
1972
|
+
const parentMap = new Map();
|
|
1973
|
+
for (const [, target] of map) {
|
|
1974
|
+
if (!target)
|
|
1975
|
+
continue;
|
|
1976
|
+
let count = isCountFiler ? 0 : target.data.count;
|
|
1977
|
+
let total = isTotalFiler ? 0 : target.data.total;
|
|
1978
|
+
const deviceList = [[], []];
|
|
1979
|
+
if (isCountFiler || isTotalFiler) {
|
|
1980
|
+
let children = target.children || [];
|
|
1981
|
+
for (const item of children) {
|
|
1982
|
+
if (target.data.dataType !== DataType.DEVICE) {
|
|
1983
|
+
count =
|
|
1984
|
+
isCountFiler && isStatistics(item.key) && countFilter
|
|
1985
|
+
? count + (item.data.dataType !== DataType.DEVICE ? item.count : countFilter(item.data))
|
|
1986
|
+
: count;
|
|
1987
|
+
total =
|
|
1988
|
+
isTotalFiler && isStatistics(item.key) && totalFilter
|
|
1989
|
+
? total + (item.data.dataType !== DataType.DEVICE ? item.total : totalFilter(item.data))
|
|
1990
|
+
: total;
|
|
1991
|
+
}
|
|
1992
|
+
else {
|
|
1993
|
+
count += item.data.deviceStatus === DeviceStatus.OFF_LINE ? 0 : 1;
|
|
1994
|
+
total++;
|
|
1995
|
+
}
|
|
1996
|
+
if (item.data.deviceStatus === DeviceStatus.OFF_LINE) {
|
|
1997
|
+
deviceList[sortByStatus ? 1 : 0].push(item);
|
|
1998
|
+
}
|
|
1999
|
+
else {
|
|
2000
|
+
deviceList[0].push(item);
|
|
2001
|
+
}
|
|
2002
|
+
}
|
|
2003
|
+
}
|
|
2004
|
+
// 在仅显示设备时,设置 部门/群组 显示状态
|
|
2005
|
+
if (showOnlineState && count > 0 && target.data.dataType !== DataType.DEVICE) {
|
|
2006
|
+
tree.hiddenNodeKeySet.delete(target.key);
|
|
2007
|
+
}
|
|
2008
|
+
// target.count = target.data.dataType === DataType.DEVICE ? deviceList[0].length : count
|
|
2009
|
+
// target.total = showOnlineState && target.data.dataType === DataType.DEVICE ? target.count : total
|
|
2010
|
+
target.count = count;
|
|
2011
|
+
target.total = total;
|
|
2012
|
+
target.parent && parentMap.set(target.parent.key, target.parent);
|
|
2013
|
+
target.children = [...deviceList[0], ...deviceList[1]];
|
|
2014
|
+
}
|
|
2015
|
+
parentMap.size && updateParnetCount(parentMap);
|
|
2016
|
+
};
|
|
2017
|
+
const parentMap = new Map();
|
|
2018
|
+
data.forEach((v) => {
|
|
2019
|
+
// 通道
|
|
2020
|
+
if (v.channelId) {
|
|
2021
|
+
const channel = channelMap.get(v.channelId);
|
|
2022
|
+
if (!channel)
|
|
2023
|
+
return;
|
|
2024
|
+
Object.assign(channel, {
|
|
2025
|
+
data: {
|
|
2026
|
+
...channel.data,
|
|
2027
|
+
onlyId: channel.onlyId,
|
|
2028
|
+
dataType: channel.data.dataType,
|
|
2029
|
+
deviceStatus: setDeviceStatus(v) // 设备状态
|
|
2030
|
+
}
|
|
2031
|
+
});
|
|
2032
|
+
// 在仅显示设备时,切换显隐状态
|
|
2033
|
+
if (showOnlineState) {
|
|
2034
|
+
if (channel.data.deviceStatus === DeviceStatus.OFF_LINE) {
|
|
2035
|
+
tree.hiddenNodeKeySet.add(channel.key);
|
|
2036
|
+
beOfflineList.push(channel);
|
|
2037
|
+
}
|
|
2038
|
+
else {
|
|
2039
|
+
tree.hiddenNodeKeySet.delete(channel.key);
|
|
2040
|
+
beOnlineList.push(channel);
|
|
2041
|
+
}
|
|
2042
|
+
}
|
|
2043
|
+
channel.parent && parentMap.set(channel.parent.key, channel.parent);
|
|
2044
|
+
}
|
|
2045
|
+
// 设备
|
|
2046
|
+
else {
|
|
2047
|
+
const deviceList = deviceMap.get(v.deviceId);
|
|
2048
|
+
if (!deviceList?.length)
|
|
2049
|
+
return;
|
|
2050
|
+
deviceList.forEach((device) => {
|
|
2051
|
+
const target = tree.treeNodeMap.get(device.key);
|
|
2052
|
+
if (!target)
|
|
2053
|
+
return;
|
|
2054
|
+
Object.assign(target, {
|
|
2055
|
+
data: Object.assign(target.data, {
|
|
2056
|
+
...v,
|
|
2057
|
+
onlyId: target.key,
|
|
2058
|
+
dataType: target.data.dataType,
|
|
2059
|
+
deviceStatus: setDeviceStatus(v) // 设备状态
|
|
2060
|
+
})
|
|
2061
|
+
});
|
|
2062
|
+
// 在仅显示设备时,切换显隐状态
|
|
2063
|
+
if (showOnlineState) {
|
|
2064
|
+
if (target.data.deviceStatus === DeviceStatus.OFF_LINE) {
|
|
2065
|
+
tree.hiddenNodeKeySet.add(target.key);
|
|
2066
|
+
beOfflineList.push(target);
|
|
2067
|
+
}
|
|
2068
|
+
else {
|
|
2069
|
+
tree.hiddenNodeKeySet.delete(target.key);
|
|
2070
|
+
beOnlineList.push(target);
|
|
2071
|
+
}
|
|
2072
|
+
}
|
|
2073
|
+
target.parent && parentMap.set(target.parent.key, target.parent);
|
|
2074
|
+
});
|
|
2075
|
+
}
|
|
2076
|
+
});
|
|
2077
|
+
updateParnetCount(parentMap);
|
|
2078
|
+
return { tree, beOnlineList, beOfflineList };
|
|
2079
|
+
}
|
|
1564
2080
|
// 用户树
|
|
1565
2081
|
function updateUserTree(tree, data, config) {
|
|
1566
2082
|
const userMap = tree.userMap || new Map();
|
|
@@ -1613,13 +2129,15 @@ function updateCsTree(tree, data, config) {
|
|
|
1613
2129
|
}
|
|
1614
2130
|
const updateTreeMap = {
|
|
1615
2131
|
// 设备树
|
|
1616
|
-
|
|
2132
|
+
[Business.DEVICE]: updateDeviceTree,
|
|
2133
|
+
// 设备通道树
|
|
2134
|
+
[Business.CHANNEL]: updateDeviceChannelTree,
|
|
1617
2135
|
// 群组设备树
|
|
1618
|
-
|
|
2136
|
+
[Business.GROUP_DEVICE]: updateDeviceTree,
|
|
1619
2137
|
// 用户树
|
|
1620
|
-
|
|
2138
|
+
[Business.USER]: updateUserTree,
|
|
1621
2139
|
// 采集站
|
|
1622
|
-
|
|
2140
|
+
[Business.CS]: updateCsTree
|
|
1623
2141
|
};
|
|
1624
2142
|
|
|
1625
2143
|
/** 是否显示统计 */
|
|
@@ -1640,15 +2158,22 @@ function getContainer(config) {
|
|
|
1640
2158
|
if (isElement(container)) {
|
|
1641
2159
|
el = container;
|
|
1642
2160
|
}
|
|
1643
|
-
if (el
|
|
1644
|
-
el
|
|
2161
|
+
if (!el)
|
|
2162
|
+
return el;
|
|
2163
|
+
if (bgColor) {
|
|
2164
|
+
el.style.setProperty('background-color', bgColor);
|
|
1645
2165
|
}
|
|
1646
|
-
if (
|
|
1647
|
-
el.style.
|
|
2166
|
+
if (fontSize) {
|
|
2167
|
+
el.style.setProperty('font-size', `${fontSize}px`);
|
|
1648
2168
|
}
|
|
1649
|
-
if (
|
|
1650
|
-
el.style.color
|
|
2169
|
+
if (color) {
|
|
2170
|
+
el.style.setProperty('color', color);
|
|
1651
2171
|
}
|
|
2172
|
+
el.classList.add('hy-tree');
|
|
2173
|
+
el.style.setProperty('--hy-tree-item-height', `${config.itemHeight}px`);
|
|
2174
|
+
el.style.setProperty('--hy-tree-item-gap', `${config.itemGap}px`);
|
|
2175
|
+
el.style.setProperty('--hy-tree-channel-bg-color', `${config.channelBgColor}`);
|
|
2176
|
+
el.style.setProperty('--hy-color-placeholder', `${config.placeholderColor}`);
|
|
1652
2177
|
return el;
|
|
1653
2178
|
}
|
|
1654
2179
|
class VirtualTree {
|
|
@@ -1703,7 +2228,6 @@ class VirtualTree {
|
|
|
1703
2228
|
if (!this._el) {
|
|
1704
2229
|
throw Error('【container参数错误】:请传入id或者class或者元素节点');
|
|
1705
2230
|
}
|
|
1706
|
-
this._el.classList.add('hy-tree');
|
|
1707
2231
|
this._handleMethod = config.handleMethod;
|
|
1708
2232
|
this._filterMethod = config.filterMethod;
|
|
1709
2233
|
this._onNodeExpand = config.onNodeExpand;
|
|
@@ -1942,7 +2466,9 @@ class VirtualTree {
|
|
|
1942
2466
|
return;
|
|
1943
2467
|
this._tree = await this._createTree(config.data);
|
|
1944
2468
|
this._flattenTree = this._genereateFlattenTree();
|
|
1945
|
-
const { checkedKeys, updateCheckedKeys, isIndeterminate, isChecked, toggleCheckbox, getChecked,
|
|
2469
|
+
const { checkedKeys, updateCheckedKeys, isIndeterminate, isChecked, toggleCheckbox, getChecked,
|
|
2470
|
+
// afterNodeCheck,
|
|
2471
|
+
getCheckedKeys, getCheckedNodes,
|
|
1946
2472
|
// getHalfCheckedKeys,
|
|
1947
2473
|
// getHalfCheckedNodes,
|
|
1948
2474
|
setChecked, setCheckedKeys, setCheckedNodes } = useCheck(config, this._tree);
|
|
@@ -1976,13 +2502,20 @@ class VirtualTree {
|
|
|
1976
2502
|
const generateExpandIcon = (item) => {
|
|
1977
2503
|
const el = document.createElement('div');
|
|
1978
2504
|
el.classList.add('hy-tree-node__expand');
|
|
2505
|
+
// 通道数据
|
|
2506
|
+
if (item.data.dataType === 9)
|
|
2507
|
+
return el;
|
|
2508
|
+
// 其他数据
|
|
1979
2509
|
if (this._expandedKeySet.has(item.key)) {
|
|
1980
2510
|
el.classList.add('expanded');
|
|
1981
2511
|
}
|
|
1982
2512
|
const icon = document.createElement('div');
|
|
1983
2513
|
icon.classList.add('hy-tree-node__expand-icon');
|
|
1984
2514
|
el.appendChild(icon);
|
|
1985
|
-
|
|
2515
|
+
const isHideIcon = config.business !== Business.CHANNEL || item.data.dataType !== DataType.DEVICE
|
|
2516
|
+
? item.isLeaf
|
|
2517
|
+
: this._businessConfig?.showOnlineState ? !item.count : !item.total;
|
|
2518
|
+
if (isHideIcon || this._hiddenExpandIconKeySet.has(item.key)) {
|
|
1986
2519
|
el.style.setProperty('visibility', 'hidden');
|
|
1987
2520
|
}
|
|
1988
2521
|
else {
|
|
@@ -2065,35 +2598,10 @@ class VirtualTree {
|
|
|
2065
2598
|
className = className.filter(Boolean);
|
|
2066
2599
|
el.classList.add(...className);
|
|
2067
2600
|
};
|
|
2068
|
-
/**
|
|
2069
|
-
const
|
|
2070
|
-
const { type
|
|
2071
|
-
|
|
2072
|
-
el.classList.add('hy-tree-node');
|
|
2073
|
-
if (config.itemGap) {
|
|
2074
|
-
el.style.paddingBottom = `${config.itemGap}px`;
|
|
2075
|
-
}
|
|
2076
|
-
let nodeContainer = document.createElement('div');
|
|
2077
|
-
nodeContainer.style.height = `${config.itemHeight}px`;
|
|
2078
|
-
if (config.nodeBgColor) {
|
|
2079
|
-
nodeContainer.style.backgroundColor = config.nodeBgColor;
|
|
2080
|
-
}
|
|
2081
|
-
setNodeClass(nodeContainer, item);
|
|
2082
|
-
let content = document.createElement('div');
|
|
2083
|
-
content.classList.add('hy-tree-node-content');
|
|
2084
|
-
content.style.setProperty('padding-left', `${(item.level - 1) * (config.indent || 0)}px`);
|
|
2085
|
-
// 设备离线 - 字体颜色
|
|
2086
|
-
if (['device', 'groupDevice'].includes(config.business)
|
|
2087
|
-
&& this._props.showStatus
|
|
2088
|
-
&& item.data.dataType === 3
|
|
2089
|
-
&& item.data.deviceStatus === 0) {
|
|
2090
|
-
content.style.color = config.placeholderColor;
|
|
2091
|
-
}
|
|
2092
|
-
content.appendChild(generateExpandIcon(item));
|
|
2093
|
-
// 多选框/单选框
|
|
2094
|
-
if ((isBoolean(showSelect)
|
|
2095
|
-
? showSelect
|
|
2096
|
-
: isFunction(showSelect) && showSelect(item.data, item)) && config.rowSelection.showSelectBox) {
|
|
2601
|
+
/** 生成选中节点 */
|
|
2602
|
+
const generateCheckbox = (el, item) => {
|
|
2603
|
+
const { type } = config.rowSelection;
|
|
2604
|
+
if (isShowSelect(config, item) && config.rowSelection.showSelectBox) {
|
|
2097
2605
|
if (type === 'checkbox') {
|
|
2098
2606
|
new Checkbox({
|
|
2099
2607
|
checked: isChecked(item),
|
|
@@ -2109,7 +2617,7 @@ class VirtualTree {
|
|
|
2109
2617
|
}
|
|
2110
2618
|
this.refresh();
|
|
2111
2619
|
}
|
|
2112
|
-
}).mount(
|
|
2620
|
+
}).mount(el);
|
|
2113
2621
|
}
|
|
2114
2622
|
else if (type === 'radio') {
|
|
2115
2623
|
new Radio({
|
|
@@ -2120,9 +2628,36 @@ class VirtualTree {
|
|
|
2120
2628
|
toggleCheckbox(item, checked, true, false);
|
|
2121
2629
|
this.refresh();
|
|
2122
2630
|
}
|
|
2123
|
-
}).mount(
|
|
2631
|
+
}).mount(el);
|
|
2124
2632
|
}
|
|
2125
2633
|
}
|
|
2634
|
+
};
|
|
2635
|
+
/** 渲染项 */
|
|
2636
|
+
const generateItem = (item) => {
|
|
2637
|
+
let el = document.createElement('div');
|
|
2638
|
+
el.classList.add('hy-tree-node');
|
|
2639
|
+
if (item.data.dataType === 9) {
|
|
2640
|
+
el.classList.add('hy-tree-channel-node');
|
|
2641
|
+
}
|
|
2642
|
+
let nodeContainer = document.createElement('div');
|
|
2643
|
+
nodeContainer.style.height = `${config.itemHeight}px`;
|
|
2644
|
+
if (config.nodeBgColor) {
|
|
2645
|
+
nodeContainer.style.backgroundColor = config.nodeBgColor;
|
|
2646
|
+
}
|
|
2647
|
+
setNodeClass(nodeContainer, item);
|
|
2648
|
+
let content = document.createElement('div');
|
|
2649
|
+
content.classList.add('hy-tree-node-content');
|
|
2650
|
+
content.style.setProperty('padding-left', `${(item.level - 1) * (config.indent || 0)}px`);
|
|
2651
|
+
// 设备离线 - 字体颜色
|
|
2652
|
+
if ([Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(config.business)
|
|
2653
|
+
&& this._props.showStatus
|
|
2654
|
+
&& /^(3|9)$/.test(item.data.dataType)
|
|
2655
|
+
&& item.data.deviceStatus === 0) {
|
|
2656
|
+
content.style.color = config.placeholderColor;
|
|
2657
|
+
}
|
|
2658
|
+
content.appendChild(generateExpandIcon(item));
|
|
2659
|
+
// 多选框/单选框
|
|
2660
|
+
generateCheckbox(content, item);
|
|
2126
2661
|
// 整个节点内容
|
|
2127
2662
|
this._customRender(config.renderItem, item, {
|
|
2128
2663
|
inset: true,
|
|
@@ -2149,9 +2684,7 @@ class VirtualTree {
|
|
|
2149
2684
|
if (config.onNodeClick) {
|
|
2150
2685
|
await config.onNodeClick(item.data, item, e);
|
|
2151
2686
|
}
|
|
2152
|
-
if (!getDisabled(config, item) && (
|
|
2153
|
-
? showSelect
|
|
2154
|
-
: isFunction(showSelect) && showSelect(item.data, item))) {
|
|
2687
|
+
if (!getDisabled(config, item) && isShowSelect(config, item)) {
|
|
2155
2688
|
if (config.checkOnClickNode) {
|
|
2156
2689
|
toggleCheckbox(item, !(isChecked(item) || isIndeterminate(item)), true, true);
|
|
2157
2690
|
if (!config.expandOnClickNode || item.isLeaf) {
|
|
@@ -2218,9 +2751,7 @@ class VirtualTree {
|
|
|
2218
2751
|
if (getDisabled(config, item) ||
|
|
2219
2752
|
item.isLeaf ||
|
|
2220
2753
|
!config.checkOnDblclickParentNode ||
|
|
2221
|
-
!(
|
|
2222
|
-
? showSelect
|
|
2223
|
-
: isFunction(showSelect) && showSelect(item.data, item))) {
|
|
2754
|
+
!isShowSelect(config, item)) {
|
|
2224
2755
|
return;
|
|
2225
2756
|
}
|
|
2226
2757
|
nodeClickCount = 0;
|
|
@@ -2319,7 +2850,8 @@ class VirtualTree {
|
|
|
2319
2850
|
count: this._props.count,
|
|
2320
2851
|
total: this._props.total
|
|
2321
2852
|
},
|
|
2322
|
-
businessConfig: this._businessConfig
|
|
2853
|
+
businessConfig: this._businessConfig,
|
|
2854
|
+
hiddenNodeKeySet: this._hiddenNodeKeySet
|
|
2323
2855
|
});
|
|
2324
2856
|
Object.assign(this._tree, tree);
|
|
2325
2857
|
// 设备离线时取消勾选状态
|
|
@@ -2438,6 +2970,74 @@ class VirtualTree {
|
|
|
2438
2970
|
: data;
|
|
2439
2971
|
return this._tree ? this._tree.treeNodeMap.get(key) : undefined;
|
|
2440
2972
|
};
|
|
2973
|
+
/** 获取设备/群组下的全部设备 */
|
|
2974
|
+
getDeviceIntegrated = (() => {
|
|
2975
|
+
const getAllDevice = (children, params, list = []) => {
|
|
2976
|
+
if (!children?.length)
|
|
2977
|
+
return list;
|
|
2978
|
+
const { isOnlineState = false, isFilter = false } = params;
|
|
2979
|
+
for (const node of children) {
|
|
2980
|
+
const { dataType } = node.data;
|
|
2981
|
+
// 过滤设备
|
|
2982
|
+
if (isFilter && this._hiddenNodeKeySet.has(node.key)) {
|
|
2983
|
+
continue;
|
|
2984
|
+
}
|
|
2985
|
+
// 筛选在线设备
|
|
2986
|
+
if (isOnlineState &&
|
|
2987
|
+
((!/^(1|4)$/.test(dataType) && node.data.onlineState !== 1) ||
|
|
2988
|
+
(/^(1|4)$/.test(dataType) && !node.count))) {
|
|
2989
|
+
continue;
|
|
2990
|
+
}
|
|
2991
|
+
// 部门、群组
|
|
2992
|
+
if (/^(1|4)$/.test(dataType)) {
|
|
2993
|
+
getAllDevice(node?.children || [], params, list);
|
|
2994
|
+
continue;
|
|
2995
|
+
}
|
|
2996
|
+
// 通道
|
|
2997
|
+
if (dataType === 9) {
|
|
2998
|
+
list.push(node.data);
|
|
2999
|
+
continue;
|
|
3000
|
+
}
|
|
3001
|
+
// 设备
|
|
3002
|
+
if (dataType === 3) {
|
|
3003
|
+
if (node.count) {
|
|
3004
|
+
getAllDevice(node?.children || [], params, list);
|
|
3005
|
+
}
|
|
3006
|
+
else {
|
|
3007
|
+
list.push(node.data);
|
|
3008
|
+
}
|
|
3009
|
+
continue;
|
|
3010
|
+
}
|
|
3011
|
+
// 其他类型
|
|
3012
|
+
list.push(node.data);
|
|
3013
|
+
}
|
|
3014
|
+
return list;
|
|
3015
|
+
};
|
|
3016
|
+
return (params) => {
|
|
3017
|
+
const { id, isBusiness = false } = params;
|
|
3018
|
+
if (!id)
|
|
3019
|
+
return;
|
|
3020
|
+
let node;
|
|
3021
|
+
if (isBusiness && this._business) {
|
|
3022
|
+
switch (this._business) {
|
|
3023
|
+
case Business.DEVICE:
|
|
3024
|
+
case Business.CHANNEL:
|
|
3025
|
+
case Business.GROUP_DEVICE:
|
|
3026
|
+
node = (this._tree.deviceMap && this._tree.deviceMap.get(id)) || [];
|
|
3027
|
+
break;
|
|
3028
|
+
case Business.USER:
|
|
3029
|
+
node = (this._tree.userMap && this._tree.userMap.get(id)) || [];
|
|
3030
|
+
break;
|
|
3031
|
+
case Business.CS:
|
|
3032
|
+
node = (this._tree.csMap && this._tree.csMap.get(id)) || [];
|
|
3033
|
+
break;
|
|
3034
|
+
}
|
|
3035
|
+
node = node?.[0];
|
|
3036
|
+
}
|
|
3037
|
+
node = node || this._tree.treeNodeMap.get(params.id);
|
|
3038
|
+
return getAllDevice(node?.children || [], params);
|
|
3039
|
+
};
|
|
3040
|
+
})();
|
|
2441
3041
|
/** 设置展开的节点 */
|
|
2442
3042
|
setExpandedKeys = (keys) => {
|
|
2443
3043
|
const expandedKeys = new Set();
|
|
@@ -2518,4 +3118,4 @@ class VirtualTree {
|
|
|
2518
3118
|
};
|
|
2519
3119
|
}
|
|
2520
3120
|
|
|
2521
|
-
export { VirtualScroll, VirtualTree, isArray, isBoolean, isElement, isEmpty, isFunction, isNull, isNumber, isObject, isString, isUndefined };
|
|
3121
|
+
export { Business, DataType, DeviceStatus, VirtualScroll, VirtualTree, getGlobalDeviceStatus, isArray, isBoolean, isElement, isEmpty, isFunction, isNull, isNumber, isObject, isString, isUndefined, setGlobalDeviceStatus };
|