hy-virtual-tree 1.1.43 → 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/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
- constructor(config) {
115
- config = this._generateConfig(config);
259
+ _tooltip;
260
+ constructor(props) {
261
+ const config = this._generateConfig(props);
116
262
  this._disabled = config.disabled;
117
263
  if (!config.svgName)
118
- return;
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
@@ -621,6 +785,43 @@ const getGlobalDeviceStatus = () => {
621
785
  return globalDeviceStatus;
622
786
  };
623
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
+
624
825
  /** 生成配置项 */
625
826
  const useConfig = (config) => {
626
827
  let props = Object.assign({
@@ -647,24 +848,24 @@ const useConfig = (config) => {
647
848
  filterConfig: [],
648
849
  sortByStatus: true,
649
850
  clearEmptyBusiness: false,
650
- integratedBusiness: false,
851
+ isShowChannelSelect: true,
651
852
  ...(config.businessConfig || {})
652
853
  };
653
854
  // 设备树
654
- if (['device', 'groupDevice'].includes(`${config.business}`)) {
855
+ if (config.business && [Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(config.business)) {
655
856
  businessConfig = {
656
857
  deviceStatusMap: getGlobalDeviceStatus(),
657
858
  filterConfig: [],
658
859
  sortByStatus: true,
659
860
  clearEmptyBusiness: false,
660
- integratedBusiness: false,
861
+ isShowChannelSelect: true,
661
862
  ...(config.businessConfig || {})
662
863
  };
663
864
  props = {
664
865
  class: '',
665
866
  disabled: 'disabled',
666
867
  showStatus: false,
667
- showCount: (data) => data.dataType !== 3,
868
+ showCount: (data) => !/^(3|9)$/.test(data.dataType),
668
869
  ...(config.props || {}),
669
870
  value: 'onlyId',
670
871
  label: 'label',
@@ -676,7 +877,7 @@ const useConfig = (config) => {
676
877
  showSelect: (data) => {
677
878
  if (rowSelection.type === 'checkbox')
678
879
  return true;
679
- return data.dataType === 3;
880
+ return /^(3|9)$/.test(data.dataType);
680
881
  },
681
882
  ...rowSelection
682
883
  };
@@ -734,6 +935,7 @@ const useConfig = (config) => {
734
935
  fontSize: 14,
735
936
  bgColor: '',
736
937
  nodeBgColor: '#1c334a',
938
+ channelBgColor: '#10263B',
737
939
  emptyText: '暂无数据',
738
940
  bufferSize: 50,
739
941
  expandOnClickNode: true,
@@ -758,13 +960,16 @@ const useHandleFun = (config) => {
758
960
  if (!node)
759
961
  return '';
760
962
  if (business && isBusiness) {
761
- switch (business) {
762
- case 'device':
763
- case 'groupDevice':
764
- return node.deviceId;
765
- case 'user':
766
- case 'cs':
963
+ switch (node.deviceType) {
964
+ case DataType.DEPT: // 部门
965
+ case DataType.GROUP: // 群组
966
+ case DataType.USER: // 用户
967
+ case DataType.CS: // 采集站
767
968
  return node.id;
969
+ case DataType.DEVICE: // 设备
970
+ return node.deviceId;
971
+ case DataType.CHANNEL: // 设备通道
972
+ return node.channelId;
768
973
  }
769
974
  }
770
975
  return node[props.value];
@@ -794,7 +999,7 @@ const useHandleFun = (config) => {
794
999
  return;
795
1000
  return node[props.total];
796
1001
  }
797
- if (['device', 'groupDevice'].includes(`${business}`)) {
1002
+ if (business && [Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(business)) {
798
1003
  countFilter = (data) => {
799
1004
  return data.dataType === 3 && data.onlineState === 1;
800
1005
  };
@@ -822,6 +1027,20 @@ const useHandleFun = (config) => {
822
1027
  totalFilter,
823
1028
  // 设置设备状态
824
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
+ // 设备状态
825
1044
  if (data.onlineState === 1) {
826
1045
  // 监控中
827
1046
  if (data.monitor === 1 || data.beMonitor === 1) {
@@ -863,12 +1082,26 @@ const getDisabled = (config, node) => {
863
1082
  if (isFunction(disabled))
864
1083
  return disabled(node.data, node);
865
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
+ };
866
1099
  function useCheck(props, tree) {
867
1100
  const checkedKeys = new Set();
868
1101
  let indeterminateKeys = new Set();
869
1102
  const updateCheckedKeys = () => {
870
- const { showSelect, checkStrictly } = props.rowSelection;
871
- if (!tree || !showSelect || checkStrictly) {
1103
+ const { checkStrictly } = props.rowSelection;
1104
+ if (!tree || checkStrictly) {
872
1105
  return;
873
1106
  }
874
1107
  const { levelTreeNodeMap, maxLevel } = tree;
@@ -879,28 +1112,39 @@ function useCheck(props, tree) {
879
1112
  if (!nodes)
880
1113
  continue;
881
1114
  nodes.forEach((node) => {
882
- const children = node.children;
883
- if (tree.hiddenNodeKeySet.has(node.key))
1115
+ if (tree.hiddenNodeKeySet.has(node.key) || !isShowSelect(props, node))
884
1116
  return;
885
- if (children) {
1117
+ if (node.children && !isCheckLeaf(props, node)) {
886
1118
  let allChecked = true;
887
1119
  let hasChecked = false;
888
- for (const childNode of children) {
1120
+ let allHide = true;
1121
+ for (const childNode of node.children) {
889
1122
  const key = childNode.key;
890
- if (tree.hiddenNodeKeySet.has(key))
1123
+ // 通道需要循环处理
1124
+ if (childNode.data.dataType !== DataType.CHANNEL &&
1125
+ (tree.hiddenNodeKeySet.has(key) || !isShowSelect(props, node))) {
891
1126
  continue;
892
- if (checkedKeySet.has(key)) {
893
- hasChecked = true;
894
- }
895
- else if (indeterminateKeySet.has(key)) {
896
- allChecked = false;
897
- hasChecked = true;
898
- break;
899
1127
  }
900
- else {
901
- allChecked = false;
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
+ }
902
1142
  }
903
1143
  }
1144
+ // 所有子元素都隐藏,则判断自身的选中状态
1145
+ if (allHide) {
1146
+ allChecked = checkedKeySet.has(node.key);
1147
+ }
904
1148
  if (allChecked) {
905
1149
  checkedKeySet.add(node.key);
906
1150
  }
@@ -942,7 +1186,7 @@ function useCheck(props, tree) {
942
1186
  const children = node.children;
943
1187
  if ((!checkStrictly || checkOnDbclick) && children) {
944
1188
  children.forEach((childNode) => {
945
- if (!getDisabled(props, childNode)) {
1189
+ if (!getDisabled(props, childNode) && isShowSelect(props, childNode)) {
946
1190
  toggle(childNode, checked);
947
1191
  }
948
1192
  });
@@ -999,21 +1243,39 @@ function useCheck(props, tree) {
999
1243
  const checkedBusinessKeys = [];
1000
1244
  const checkedBusinessNodes = [];
1001
1245
  const { business } = props;
1002
- if (tree && props.rowSelection.showSelect) {
1246
+ if (tree && isShowSelect(props)) {
1003
1247
  const { treeNodeMap } = tree;
1004
1248
  checkedKeys.forEach((key) => {
1005
1249
  const node = treeNodeMap.get(key);
1006
- if (node && (!leafOnly || (leafOnly && node.isLeaf))) {
1250
+ if (!node || !isShowSelect(props, node))
1251
+ return;
1252
+ if (!leafOnly || (leafOnly && isCheckLeaf(props, node))) {
1007
1253
  const data = node.data;
1008
1254
  keys.push(key);
1009
1255
  checkedNodes.push(data);
1010
1256
  // 业务选中
1011
- if ((['device', 'groupDevice'].includes(`${business}`) && data.dataType === 3)
1012
- || (business === 'user' && data.dataType === 5)
1013
- || (business === 'cs' && data.dataType === 8)) {
1257
+ if ((['device', 'groupDevice'].includes(`${business}`) && data.dataType === 3) ||
1258
+ (business === 'user' && data.dataType === 5) ||
1259
+ (business === 'cs' && data.dataType === 8)) {
1014
1260
  checkedBusinessKeys.push(key);
1015
1261
  checkedBusinessNodes.push(node.data);
1016
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
+ }
1017
1279
  }
1018
1280
  });
1019
1281
  }
@@ -1035,14 +1297,14 @@ function useCheck(props, tree) {
1035
1297
  function getHalfChecked() {
1036
1298
  const halfCheckedNodes = [];
1037
1299
  const halfCheckedKeys = [];
1038
- if (tree && props.rowSelection.showSelect) {
1300
+ if (tree && isShowSelect(props)) {
1039
1301
  const { treeNodeMap } = tree;
1040
1302
  indeterminateKeys.forEach((key) => {
1041
1303
  const node = treeNodeMap.get(key);
1042
- if (node) {
1043
- halfCheckedKeys.push(key);
1044
- halfCheckedNodes.push(node.data);
1045
- }
1304
+ if (!node || !isShowSelect(props, node))
1305
+ return;
1306
+ halfCheckedKeys.push(key);
1307
+ halfCheckedNodes.push(node.data);
1046
1308
  });
1047
1309
  }
1048
1310
  return {
@@ -1064,45 +1326,118 @@ function useCheck(props, tree) {
1064
1326
  _setCheckedKeys(keys, isBusiness);
1065
1327
  }
1066
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) {
1067
1368
  if (!tree)
1068
1369
  return;
1069
- const { treeNodeMap, deviceMap, userMap, csMap } = tree;
1070
- if (props.rowSelection.showSelect) {
1370
+ const { treeNodeMap, deviceMap, channelMap, userMap, csMap } = tree;
1371
+ if (!isShowSelect(props) || !treeNodeMap || !keys.length)
1372
+ return;
1373
+ for (const key of keys) {
1374
+ // 通用逻辑
1071
1375
  if (!isBusiness || !props.business) {
1072
1376
  const node = treeNodeMap.get(key);
1073
- if (node) {
1074
- toggleCheckbox(node, isChecked, false);
1377
+ if (node && !isChecked(node) && isShowSelect(props, node)) {
1378
+ toggleCheckbox(node, true, false, false);
1075
1379
  }
1076
- return;
1380
+ continue;
1077
1381
  }
1382
+ // 业务逻辑
1078
1383
  let nodeList = [];
1079
1384
  switch (props.business) {
1080
- case 'device':
1081
- case 'groupDevice':
1385
+ case Business.DEVICE:
1386
+ case Business.GROUP_DEVICE:
1082
1387
  nodeList = (deviceMap && deviceMap.get(key)) || [];
1083
1388
  break;
1084
- case 'user':
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:
1085
1399
  nodeList = (userMap && userMap.get(key)) || [];
1086
1400
  break;
1087
- case 'cs':
1401
+ case Business.CS:
1088
1402
  nodeList = (csMap && csMap.get(key)) || [];
1089
1403
  break;
1090
1404
  }
1091
1405
  for (const node of nodeList) {
1092
- toggleCheckbox(node, isChecked, false);
1406
+ if (node && !isChecked(node) && isShowSelect(props, node)) {
1407
+ toggleCheckbox(node, true, false, false);
1408
+ }
1093
1409
  }
1094
1410
  }
1411
+ updateCheckedKeys();
1095
1412
  }
1096
- function _setCheckedKeys(keys = [], isBusiness = false) {
1097
- if (!tree)
1413
+ function setCheckedNodes(data, isBusiness = false) {
1414
+ if (!Array.isArray(data)) {
1415
+ console.warn('setCheckedNodes请传入数组');
1098
1416
  return;
1099
- const { treeNodeMap, deviceMap, userMap, csMap } = tree;
1100
- if (props.rowSelection.showSelect && treeNodeMap && keys.length > 0) {
1101
- for (const key of keys) {
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) {
1102
1436
  // 通用逻辑
1437
+ let key = getKey(target);
1103
1438
  if (!isBusiness || !props.business) {
1104
1439
  const node = treeNodeMap.get(key);
1105
- if (node && !isChecked(node)) {
1440
+ if (node && !isChecked(node) && isShowSelect(props, node)) {
1106
1441
  toggleCheckbox(node, true, false, false);
1107
1442
  }
1108
1443
  continue;
@@ -1110,19 +1445,32 @@ function useCheck(props, tree) {
1110
1445
  // 业务逻辑
1111
1446
  let nodeList = [];
1112
1447
  switch (props.business) {
1113
- case 'device':
1114
- case 'groupDevice':
1448
+ case Business.DEVICE:
1449
+ case Business.GROUP_DEVICE:
1450
+ key = target.deviceId;
1115
1451
  nodeList = (deviceMap && deviceMap.get(key)) || [];
1116
1452
  break;
1117
- case 'user':
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;
1118
1465
  nodeList = (userMap && userMap.get(key)) || [];
1119
1466
  break;
1120
- case 'cs':
1467
+ case Business.CS:
1468
+ key = target.id;
1121
1469
  nodeList = (csMap && csMap.get(key)) || [];
1122
1470
  break;
1123
1471
  }
1124
1472
  for (const node of nodeList) {
1125
- if (node && !isChecked(node)) {
1473
+ if (node && !isChecked(node) && isShowSelect(props, node)) {
1126
1474
  toggleCheckbox(node, true, false, false);
1127
1475
  }
1128
1476
  }
@@ -1130,61 +1478,6 @@ function useCheck(props, tree) {
1130
1478
  updateCheckedKeys();
1131
1479
  }
1132
1480
  }
1133
- function setCheckedNodes(data, isBusiness = false) {
1134
- if (!Array.isArray(data)) {
1135
- console.warn('setCheckedNodes请传入数组');
1136
- return;
1137
- }
1138
- const { type } = props.rowSelection;
1139
- checkedKeys.clear();
1140
- indeterminateKeys.clear();
1141
- if (type === 'radio' && data.length > 1) {
1142
- data = [data[0]];
1143
- }
1144
- _setCheckedNodes(data, isBusiness);
1145
- }
1146
- function _setCheckedNodes(data = [], isBusiness = false) {
1147
- if (tree) {
1148
- const { treeNodeMap, deviceMap, userMap, csMap } = tree;
1149
- if (props.rowSelection.showSelect && treeNodeMap && data.length > 0) {
1150
- const { getKey } = useHandleFun(props);
1151
- for (const target of data) {
1152
- // 通用逻辑
1153
- let key = getKey(target);
1154
- if (!isBusiness || !props.business) {
1155
- const node = treeNodeMap.get(key);
1156
- if (node && !isChecked(node)) {
1157
- toggleCheckbox(node, true, false, false);
1158
- }
1159
- continue;
1160
- }
1161
- // 业务逻辑
1162
- let nodeList = [];
1163
- switch (props.business) {
1164
- case 'device':
1165
- case 'groupDevice':
1166
- key = target.deviceId;
1167
- nodeList = (deviceMap && deviceMap.get(key)) || [];
1168
- break;
1169
- case 'user':
1170
- key = target.id;
1171
- nodeList = (userMap && userMap.get(key)) || [];
1172
- break;
1173
- case 'cs':
1174
- key = target.id;
1175
- nodeList = (csMap && csMap.get(key)) || [];
1176
- break;
1177
- }
1178
- for (const node of nodeList) {
1179
- if (node && !isChecked(node)) {
1180
- toggleCheckbox(node, true, false, false);
1181
- }
1182
- }
1183
- }
1184
- updateCheckedKeys();
1185
- }
1186
- }
1187
- }
1188
1481
  return {
1189
1482
  checkedKeys,
1190
1483
  updateCheckedKeys,
@@ -1219,7 +1512,6 @@ function useFilter(config, filterMethod, tree = {
1219
1512
  if (!isFunction(filterMethod)) {
1220
1513
  return;
1221
1514
  }
1222
- const { integratedBusiness } = config.businessConfig;
1223
1515
  const { getCount, getTotal, countFilter, totalFilter } = useHandleFun(config);
1224
1516
  const isCountFiler = countFilter && isFunction(countFilter);
1225
1517
  const isTotalFiler = totalFilter && isFunction(totalFilter);
@@ -1230,37 +1522,21 @@ function useFilter(config, filterMethod, tree = {
1230
1522
  const nodes = tree.treeNodes || [];
1231
1523
  hiddenKeys.clear();
1232
1524
  function traverse(nodes, isShow = false) {
1233
- const deepBusinessList = [];
1234
1525
  let count = 0;
1235
1526
  let total = 0;
1236
1527
  nodes.forEach((node) => {
1237
- const businessList = [];
1238
1528
  family.push(node);
1239
1529
  if (isShow || (filterMethod && filterMethod(params, node.data, node))) {
1240
1530
  family.forEach((member) => {
1241
1531
  expandKeySet.add(member.key);
1242
1532
  });
1243
- if (integratedBusiness && !/^1|4$/.test(node.data.dataType)) {
1244
- businessList.push(node.data);
1245
- deepBusinessList.push(node.data);
1246
- }
1247
1533
  }
1248
1534
  else if (node.isLeaf) {
1249
1535
  hiddenKeys.add(node.key);
1250
1536
  }
1251
1537
  const children = node.children;
1252
1538
  if (children) {
1253
- const { count: childCount, total: childTotal, businessList: list2 } = traverse(children, filterAll ? false : expandKeySet.has(node.key));
1254
- // 保存下层业务数据
1255
- if (integratedBusiness) {
1256
- for (const target of list2) {
1257
- if (!/^1|4$/.test(target.dataType)) {
1258
- businessList.push(target);
1259
- deepBusinessList.push(target);
1260
- }
1261
- }
1262
- node.data.childrenDeviceList = businessList;
1263
- }
1539
+ const { count: childCount, total: childTotal } = traverse(children, filterAll ? false : expandKeySet.has(node.key));
1264
1540
  node.count = isCountFiler ? childCount : getCount(node);
1265
1541
  node.total = isTotalFiler ? childTotal : getTotal(node);
1266
1542
  count += childCount;
@@ -1301,7 +1577,95 @@ function useFilter(config, filterMethod, tree = {
1301
1577
  }
1302
1578
  family.pop();
1303
1579
  });
1304
- return { count, total, businessList: deepBusinessList };
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 };
1305
1669
  }
1306
1670
  traverse(nodes);
1307
1671
  return expandKeySet;
@@ -1382,9 +1746,12 @@ function useFilter(config, filterMethod, tree = {
1382
1746
  return hiddenExpandIconKeySet.has(node.key);
1383
1747
  }
1384
1748
  switch (config.business) {
1385
- case 'group':
1749
+ case Business.GROUP:
1386
1750
  doFilter = doGroupFilter;
1387
1751
  break;
1752
+ case Business.CHANNEL:
1753
+ doFilter = channelFilter;
1754
+ break;
1388
1755
  default:
1389
1756
  doFilter = commitFilter;
1390
1757
  break;
@@ -1404,7 +1771,7 @@ const useStatus = (config, data, node) => {
1404
1771
  return;
1405
1772
  const el = document.createElement('div');
1406
1773
  // 设备树
1407
- if (['device', 'groupDevice'].includes(`${business}`)) {
1774
+ if (business && [Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(business)) {
1408
1775
  if (data.dataType !== 3)
1409
1776
  return;
1410
1777
  el.classList.add('hy-tree-node__status');
@@ -1445,12 +1812,31 @@ function checkDeviceTypeFn(config, data) {
1445
1812
  return `${svgName}${data.onlineState === 1 || !config.props.showStatus ? '' : '_offLine'}`;
1446
1813
  }
1447
1814
  const useIcon = (config, data, node) => {
1448
- if ((['device', 'groupDevice'].includes(config.business) && data.dataType === 3)) {
1815
+ // 设备
1816
+ if ((/^(device|channel|groupDevice)$/.test(config.business) && data.dataType === 3)) {
1449
1817
  return new Icon({
1450
1818
  svgName: checkDeviceTypeFn(config, data) + '_svg'
1451
1819
  });
1452
1820
  }
1453
- else if ((config.business === 'cs' && data.dataType === 8)) {
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) {
1454
1840
  return new Icon({ svgName: 'menu_acquisitionStation_svg' });
1455
1841
  }
1456
1842
  };
@@ -1476,15 +1862,20 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
1476
1862
  };
1477
1863
  }
1478
1864
 
1479
- var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqIOeUn+aIkOWkhOeQhuWHveaVsCAqLwogIGNvbnN0IHVzZUhhbmRsZUZ1biA9IChjb25maWcpID0+IHsKICAgICAgY29uc3QgeyBidXNpbmVzcyB9ID0gY29uZmlnOwogICAgICBjb25zdCBwcm9wcyA9IHsgLi4uY29uZmlnLnByb3BzIH07CiAgICAgIGxldCB7IGNvdW50RmlsdGVyLCB0b3RhbEZpbHRlciB9ID0gcHJvcHM7CiAgICAgIC8qKiDojrflj5ZrZXnlgLwgKi8KICAgICAgZnVuY3Rpb24gZ2V0S2V5KG5vZGUsIGlzQnVzaW5lc3MgPSBmYWxzZSkgewogICAgICAgICAgaWYgKCFub2RlKQogICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgIGlmIChidXNpbmVzcyAmJiBpc0J1c2luZXNzKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChidXNpbmVzcykgewogICAgICAgICAgICAgICAgICBjYXNlICdkZXZpY2UnOgogICAgICAgICAgICAgICAgICBjYXNlICdncm91cERldmljZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5kZXZpY2VJZDsKICAgICAgICAgICAgICAgICAgY2FzZSAndXNlcic6CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2NzJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmlkOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBub2RlW3Byb3BzLnZhbHVlXTsKICAgICAgfQogICAgICAvKiog6I635Y+WbGFiZWzlgLwgKi8KICAgICAgZnVuY3Rpb24gZ2V0TGFiZWwobm9kZSkgewogICAgICAgICAgaWYgKCFub2RlKQogICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgIHJldHVybiBub2RlW3Byb3BzLmxhYmVsXTsKICAgICAgfQogICAgICAvKiog6I635Y+WY2hpbGRyZW7lgLwgKi8KICAgICAgZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obm9kZSkgewogICAgICAgICAgaWYgKCFub2RlKQogICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtwcm9wcy5jaGlsZHJlbl07CiAgICAgICAgICByZXR1cm4gY2hpbGRyZW4gPyBbLi4uY2hpbGRyZW5dIDogW107CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmNvdW505YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldENvdW50KG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy5jb3VudF07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlnRvdGFs5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldFRvdGFsKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy50b3RhbF07CiAgICAgIH0KICAgICAgaWYgKFsnZGV2aWNlJywgJ2dyb3VwRGV2aWNlJ10uaW5jbHVkZXMoYCR7YnVzaW5lc3N9YCkpIHsKICAgICAgICAgIGNvdW50RmlsdGVyID0gKGRhdGEpID0+IHsKICAgICAgICAgICAgICByZXR1cm4gZGF0YS5kYXRhVHlwZSA9PT0gMyAmJiBkYXRhLm9ubGluZVN0YXRlID09PSAxOwogICAgICAgICAgfTsKICAgICAgICAgIHRvdGFsRmlsdGVyID0gKGRhdGEpID0+IHsKICAgICAgICAgICAgICByZXR1cm4gZGF0YS5kYXRhVHlwZSA9PT0gMzsKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgZWxzZSBpZiAoYnVzaW5lc3MgPT09ICd1c2VyJykgewogICAgICAgICAgY291bnRGaWx0ZXIgPSB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDU7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIGVsc2UgaWYgKGJ1c2luZXNzID09PSAnY3MnKSB7CiAgICAgICAgICBjb3VudEZpbHRlciA9IHRvdGFsRmlsdGVyID0gKGRhdGEpID0+IHsKICAgICAgICAgICAgICByZXR1cm4gZGF0YS5kYXRhVHlwZSA9PT0gODsKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICAgIGdldEtleSwKICAgICAgICAgIGdldExhYmVsLAogICAgICAgICAgZ2V0Q2hpbGRyZW4sCiAgICAgICAgICBnZXRDb3VudCwKICAgICAgICAgIGdldFRvdGFsLAogICAgICAgICAgY291bnRGaWx0ZXIsCiAgICAgICAgICB0b3RhbEZpbHRlciwKICAgICAgICAgIC8vIOiuvue9ruiuvuWkh+eKtuaAgQogICAgICAgICAgc2V0RGV2aWNlU3RhdHVzOiAoZGF0YSkgPT4gewogICAgICAgICAgICAgIGlmIChkYXRhLm9ubGluZVN0YXRlID09PSAxKSB7CiAgICAgICAgICAgICAgICAgIC8vIOebkeaOp+S4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tb25pdG9yID09PSAxIHx8IGRhdGEuYmVNb25pdG9yID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJror53kuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEudmlkZW9DYWxsID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlvZXlg4/kuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEudmlkZW9SZWNvcmRpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOW9lemfs+S4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdWRpb1JlY29yZGluZyA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5bm/5pKt5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmJyb2FkY2FzdCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8gU09TCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnNvcyA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDc7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5Zyo57q/CiAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyDnprvnur8KICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgfTsKICB9OwoKICBjb25zdCBpc1N0cmluZyA9IChlKSA9PiB0eXBlb2YgZSA9PT0gJ3N0cmluZyc7CiAgY29uc3QgaXNOdW1iZXIgPSAoZSkgPT4gdHlwZW9mIGUgPT09ICdudW1iZXInOwogIGNvbnN0IGlzQXJyYXkgPSAoZSkgPT4gQXJyYXkuaXNBcnJheShlKTsKCiAgLy8g5aSE55CGZmlsdGVyQ29uZmlnCiAgZnVuY3Rpb24gaGFuZGxlRmlsdGVyQ29uZmlnKGZpbHRlckNvbmZpZykgewogICAgICByZXR1cm4gKGZpbHRlckNvbmZpZyB8fCBbXSkuZmlsdGVyKChpdGVtKSA9PiB7CiAgICAgICAgICByZXR1cm4gKGlzU3RyaW5nKGl0ZW0ucHJvcCkgJiYKICAgICAgICAgICAgICAoaXNTdHJpbmcoaXRlbS52YWx1ZSkgfHwKICAgICAgICAgICAgICAgICAgaXNOdW1iZXIoaXRlbS52YWx1ZSkgfHwKICAgICAgICAgICAgICAgICAgKGlzQXJyYXkoaXRlbS52YWx1ZSkgJiYgaXRlbS5jb25kaXRpb24gPT09ICdiZXR3ZWVuJykpICYmCiAgICAgICAgICAgICAgL14oZXF8bmV8aW58bm90SW58YmV0d2VlbnxndHxsdHxnZXxsZSkkLy50ZXN0KGl0ZW0uY29uZGl0aW9uKSk7CiAgICAgIH0pOwogIH0KICAvLyDmoKHpqoxmaWx0ZXJDb25maWcKICBmdW5jdGlvbiB1c2VGaWx0ZXJDb25maWcoZGF0YSwgZmlsdGVyTGlzdCkgewogICAgICBpZiAoIWZpbHRlckxpc3QgfHwgIWZpbHRlckxpc3QubGVuZ3RoKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiBmaWx0ZXJMaXN0LmV2ZXJ5KCh7IHByb3AsIHZhbHVlLCBjb25kaXRpb24gfSkgPT4gewogICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZGF0YVtwcm9wXTsKICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgY2FzZSAnZXEnOgogICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ID09PSB2YWx1ZTsKICAgICAgICAgICAgICBjYXNlICduZSc6CiAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgIT09IHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2JldHdlZW4nKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgKICAgICAgICAgICAgICAgICAgICAgID8gdGFyZ2V0ID49IHZhbHVlWzBdICYmIHRhcmdldCA8PSB2YWx1ZVsxXQogICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNOdW1iZXIodGFyZ2V0KSkgewogICAgICAgICAgICAgIGlmICghaXNOdW1iZXIodmFsdWUpKQogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgc3dpdGNoIChjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAgY2FzZSAnZ3QnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA+IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdsdCc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0IDwgdmFsdWU7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2dlJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPj0gdmFsdWU7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPD0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoaXNTdHJpbmcodGFyZ2V0KSkgewogICAgICAgICAgICAgIGNvbnN0IGlzSW4gPSB0YXJnZXQuaW5jbHVkZXMoYCR7dmFsdWV9YCk7CiAgICAgICAgICAgICAgc3dpdGNoIChjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAgY2FzZSAnaW4nOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzSW47CiAgICAgICAgICAgICAgICAgIGNhc2UgJ25vdEluJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNJbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0pOwogIH0KCiAgc2VsZi5vbm1lc3NhZ2UgPSBhc3luYyAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgeyBkYXRhLCBjb25maWcgfSA9IGV2ZW50LmRhdGE7CiAgICAgIGNvbnN0IGdlbmVyYXRlVHJlZSA9IGdlbmVyYXRlTWFwW2NvbmZpZy5idXNpbmVzc107CiAgICAgIGlmICghZ2VuZXJhdGVUcmVlKSB7CiAgICAgICAgICBzZWxmLmNsb3NlKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgdHJlZSA9IGdlbmVyYXRlVHJlZShkYXRhLCBjb25maWcpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHRyZWUpOwogIH07CiAgLy8g6K6+5aSH5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVEZXZpY2VUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgc29ydEJ5U3RhdHVzLCBzaG93T25saW5lU3RhdGUsIGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW4sIGNvdW50RmlsdGVyLCB0b3RhbEZpbHRlciwgc2V0RGV2aWNlU3RhdHVzIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDorr7lpIfmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlRGV2aWNlVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgZGV2aWNlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgaGlkZGVuTm9kZUtleVNldCA9IG5ldyBTZXQoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VMaXN0ID0gW1tdLCBbXV07CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZUxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmRldmljZUxpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LmRldk5hbWUgfHwgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAzLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFtzb3J0QnlTdGF0dXMgPyAxIDogMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3RbMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzICYmICFoaWRkZW5Ob2RlS2V5U2V0LmhhcyhnZXRLZXkodGFyZ2V0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmRldmljZUxpc3RbMF0sIC4uLmRldmljZUxpc3RbMV1dOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgLy8g6ZqQ6JeP5rKh5pyJ5Zyo57q/6K6+5aSH55qE6YOo6Zeo5ZKM576k57uECiAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93T25saW5lU3RhdGUgJiYgY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heaYvuekuuWcqOe6v+iuvuWkh+aXtu+8jOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSAmJiAhY2hpbGRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlIHx8ICFoaWRkZW5Ob2RlS2V5U2V0Lmhhcyhub2RlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgZGV2aWNlTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZURldmljZVRyZWUoZGF0YSk7CiAgfQogIC8vIOe+pOe7hOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlR3JvdXBEZXZpY2VUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgc29ydEJ5U3RhdHVzLCBzaG93T25saW5lU3RhdGUsIGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW4sIGNvdW50RmlsdGVyLCB0b3RhbEZpbHRlciwgc2V0RGV2aWNlU3RhdHVzIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDnvqTnu4Torr7lpIfmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlRGV2aWNlVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgZGV2aWNlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgaGlkZGVuTm9kZUtleVNldCA9IG5ldyBTZXQoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIC8vIOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jaGlsZHJlbj8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cExpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZ3JvdXBMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZ3JvdXBOYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNCAvLyDku6PooajnvqTnu4QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZ3JvdXBMaXN0XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VMaXN0ID0gW1tdLCBbXV07CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZGV2aWNlTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5kZXZOYW1lIHx8IHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAzLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzOiBzZXREZXZpY2VTdGF0dXModikgLy8g6K6+5aSH54q25oCBCiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5kZXZpY2VTdGF0dXMgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3Rbc29ydEJ5U3RhdHVzID8gMSA6IDBdLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChnZXRLZXkodGFyZ2V0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0WzBdLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzICYmICFoaWRkZW5Ob2RlS2V5U2V0LmhhcyhnZXRLZXkodGFyZ2V0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmRldmljZUxpc3RbMF0sIC4uLmRldmljZUxpc3RbMV1dOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgLy8g6ZqQ6JeP5rKh5pyJ5Zyo57q/6K6+5aSH55qE6YOo6Zeo5ZKM576k57uECiAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH55qE6YOo6Zeo5ZKM576k57uEIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93T25saW5lU3RhdGUgJiYgY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heaYvuekuuWcqOe6v+iuvuWkh+aXtu+8jOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSAmJiAhY2hpbGRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlIHx8ICFoaWRkZW5Ob2RlS2V5U2V0Lmhhcyhub2RlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgZGV2aWNlTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZURldmljZVRyZWUoZGF0YSk7CiAgfQogIC8vIOe+pOe7hOagkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlR3JvdXBUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgY2xlYXJFbXB0eUJ1c2luZXNzLCBpbnRlZ3JhdGVkQnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbn0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgLyoqIOe+pOe7hOagkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVHcm91cFRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlVG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIC8vIOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jaGlsZHJlbj8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cExpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZ3JvdXBMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZ3JvdXBOYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNCAvLyDku6PooajnvqTnu4QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZ3JvdXBMaXN0XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VDb3VudCA9IHJhd05vZGUuZGV2aWNlTGlzdC5yZWR1Y2UoKHZhbHVlLCB2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHYpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKyAodi5vbmxpbmVTdGF0ZSA9PT0gMSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgIH0sIGRldmljZUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgIGRldmljZVRvdGFsID0gcmF3Tm9kZS5kZXZpY2VMaXN0Lmxlbmd0aCB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gZGV2aWNlQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBkZXZpY2VUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIflkoznvqTnu4TnmoTpg6jpl6gg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICFbMywgNF0uaW5jbHVkZXMocmF3Tm9kZS5kYXRhVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlpITnkIbpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5LiL5bGC5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbGlzdDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YS5jaGlsZHJlbkRldmljZUxpc3QgPSBidXNpbmVzc0xpc3Q7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbGlzdDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGlsZENvdW50IDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBjaGlsZFRvdGFsIDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNoaWxkQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGlsZFRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBkZXZpY2VDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBkZXZpY2VUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVHcm91cFRyZWUoZGF0YSk7CiAgfQogIC8vIOeUqOaIt+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlVXNlclRyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOeUqOaIt+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVVc2VyVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgdXNlck1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZVVzZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VVc2VyTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYubmFtZSB8fCB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDUsIC8vIOS7o+ihqOeUqOaItwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa55So6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCwgYnVzaW5lc3NMaXN0OiBsaXN0MiB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInnlKjmiLfnmoTpg6jpl6gg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g55So5oi3CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyTGlzdCA9IHVzZXJNYXAuZ2V0KGlkKSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgIHVzZXJMaXN0LnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICB1c2VyTWFwLnNldChpZCwgdXNlckxpc3QpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CiAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB7IGxpc3Q6IHNpYmxpbmdzLCBjb3VudCwgdG90YWwsIGJ1c2luZXNzTGlzdDogZGVlcEJ1c2luZXNzTGlzdCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICB1c2VyTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQ6IG5ldyBTZXQoKQogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlVXNlclRyZWUoZGF0YSk7CiAgfQogIC8vIOmHh+mbhuermeagkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlQ3NUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgY2xlYXJFbXB0eUJ1c2luZXNzLCBpbnRlZ3JhdGVkQnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDph4fpm4bnq5nmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlQ3NUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBjc01hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmNzTGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuY3NMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5zbmFtZSB8fCB2LnNjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDgsIC8vIOS7o+ihqOmHh+mbhuermQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6YeH6ZuG5Zmo55qE6YOo6ZeoIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa55So6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCwgYnVzaW5lc3NMaXN0OiBsaXN0MiB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInph4fpm4blmajnmoTpg6jpl6gg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YeH6ZuG56uZCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyTGlzdCA9IGNzTWFwLmdldChpZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICB1c2VyTGlzdC5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgY3NNYXAuc2V0KGlkLCB1c2VyTGlzdCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGNzTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQ6IG5ldyBTZXQoKQogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlQ3NUcmVlKGRhdGEpOwogIH0KICBjb25zdCBnZW5lcmF0ZU1hcCA9IHsKICAgICAgLy8g6K6+5aSH5qCRCiAgICAgIGRldmljZTogZ2VuZXJhdGVEZXZpY2VUcmVlLAogICAgICAvLyDnvqTnu4Torr7lpIfmoJEKICAgICAgZ3JvdXBEZXZpY2U6IGdlbmVyYXRlR3JvdXBEZXZpY2VUcmVlLAogICAgICAvLyDnvqTnu4TmoJEKICAgICAgZ3JvdXA6IGdlbmVyYXRlR3JvdXBUcmVlLAogICAgICAvLyDnlKjmiLfmoJEKICAgICAgdXNlcjogZ2VuZXJhdGVVc2VyVHJlZSwKICAgICAgLy8g6YeH6ZuG56uZCiAgICAgIGNzOiBnZW5lcmF0ZUNzVHJlZQogIH07Cgp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1nZW5lcmF0ZVRyZWUuanMubWFwCgo=');
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=');
1480
1866
  /* eslint-enable */
1481
1867
 
1482
1868
  // 设备树
1483
1869
  function updateDeviceTree(tree, data, config) {
1484
1870
  const deviceMap = tree.deviceMap || new Map();
1485
1871
  let beOnlineList = [], beOfflineList = [];
1872
+ const { businessConfig, hiddenNodeKeySet } = config;
1486
1873
  const { countFilter, totalFilter, setDeviceStatus } = useHandleFun(config);
1487
- const { sortByStatus, showOnlineState, integratedBusiness } = config.businessConfig;
1874
+ const { sortByStatus, showOnlineState } = businessConfig;
1875
+ // 是否参与统计
1876
+ const isStatistics = (key) => {
1877
+ return !(hiddenNodeKeySet.has(key) || tree.hiddenNodeKeySet.has(key));
1878
+ };
1488
1879
  // 更新父节点统计
1489
1880
  const updateParnetCount = (keySet) => {
1490
1881
  const isCountFiler = countFilter && isFunction(countFilter);
@@ -1498,16 +1889,15 @@ function updateDeviceTree(tree, data, config) {
1498
1889
  let total = isTotalFiler ? 0 : target.data.total;
1499
1890
  const deviceList = [[], []];
1500
1891
  if (isCountFiler || isTotalFiler) {
1501
- const businessList = [];
1502
1892
  let children = target.children || [];
1503
1893
  for (let i = 0; i < children.length; i++) {
1504
1894
  const item = target.children[i];
1505
1895
  count =
1506
- isCountFiler && !tree.hiddenNodeKeySet.has(item.key) && countFilter
1896
+ isCountFiler && isStatistics(item.key) && countFilter
1507
1897
  ? count + (item.children ? item.count : countFilter(item.data))
1508
1898
  : count;
1509
1899
  total =
1510
- isTotalFiler && !tree.hiddenNodeKeySet.has(item.key) && totalFilter
1900
+ isTotalFiler && isStatistics(item.key) && totalFilter
1511
1901
  ? total + (item.children ? item.total : totalFilter(item.data))
1512
1902
  : total;
1513
1903
  if (item.data.deviceStatus === 0) {
@@ -1516,17 +1906,7 @@ function updateDeviceTree(tree, data, config) {
1516
1906
  else {
1517
1907
  deviceList[0].push(item);
1518
1908
  }
1519
- // 更新下级设备列表
1520
- if (integratedBusiness && !tree.hiddenNodeKeySet.has(item.key)) {
1521
- if (/^(1|4)$/.test(item.data.dataType)) {
1522
- businessList.push(...(item.data.childrenDeviceList || []));
1523
- }
1524
- else {
1525
- businessList.push(item.data);
1526
- }
1527
- }
1528
1909
  }
1529
- target.data.childrenDeviceList = businessList;
1530
1910
  }
1531
1911
  // 在仅显示设备时,设置 部门/群组 显示状态
1532
1912
  if (showOnlineState && count > 0) {
@@ -1573,6 +1953,130 @@ function updateDeviceTree(tree, data, config) {
1573
1953
  updateParnetCount(parentKeySet);
1574
1954
  return { tree, beOnlineList, beOfflineList };
1575
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
+ }
1576
2080
  // 用户树
1577
2081
  function updateUserTree(tree, data, config) {
1578
2082
  const userMap = tree.userMap || new Map();
@@ -1625,13 +2129,15 @@ function updateCsTree(tree, data, config) {
1625
2129
  }
1626
2130
  const updateTreeMap = {
1627
2131
  // 设备树
1628
- device: updateDeviceTree,
2132
+ [Business.DEVICE]: updateDeviceTree,
2133
+ // 设备通道树
2134
+ [Business.CHANNEL]: updateDeviceChannelTree,
1629
2135
  // 群组设备树
1630
- groupDevice: updateDeviceTree,
2136
+ [Business.GROUP_DEVICE]: updateDeviceTree,
1631
2137
  // 用户树
1632
- user: updateUserTree,
2138
+ [Business.USER]: updateUserTree,
1633
2139
  // 采集站
1634
- cs: updateCsTree
2140
+ [Business.CS]: updateCsTree
1635
2141
  };
1636
2142
 
1637
2143
  /** 是否显示统计 */
@@ -1652,15 +2158,22 @@ function getContainer(config) {
1652
2158
  if (isElement(container)) {
1653
2159
  el = container;
1654
2160
  }
1655
- if (el && bgColor) {
1656
- el.style.backgroundColor = bgColor;
2161
+ if (!el)
2162
+ return el;
2163
+ if (bgColor) {
2164
+ el.style.setProperty('background-color', bgColor);
1657
2165
  }
1658
- if (el && fontSize) {
1659
- el.style.fontSize = `${fontSize}px`;
2166
+ if (fontSize) {
2167
+ el.style.setProperty('font-size', `${fontSize}px`);
1660
2168
  }
1661
- if (el && color) {
1662
- el.style.color = color;
2169
+ if (color) {
2170
+ el.style.setProperty('color', color);
1663
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}`);
1664
2177
  return el;
1665
2178
  }
1666
2179
  class VirtualTree {
@@ -1715,7 +2228,6 @@ class VirtualTree {
1715
2228
  if (!this._el) {
1716
2229
  throw Error('【container参数错误】:请传入id或者class或者元素节点');
1717
2230
  }
1718
- this._el.classList.add('hy-tree');
1719
2231
  this._handleMethod = config.handleMethod;
1720
2232
  this._filterMethod = config.filterMethod;
1721
2233
  this._onNodeExpand = config.onNodeExpand;
@@ -1954,7 +2466,9 @@ class VirtualTree {
1954
2466
  return;
1955
2467
  this._tree = await this._createTree(config.data);
1956
2468
  this._flattenTree = this._genereateFlattenTree();
1957
- const { checkedKeys, updateCheckedKeys, isIndeterminate, isChecked, toggleCheckbox, getChecked, getCheckedKeys, getCheckedNodes,
2469
+ const { checkedKeys, updateCheckedKeys, isIndeterminate, isChecked, toggleCheckbox, getChecked,
2470
+ // afterNodeCheck,
2471
+ getCheckedKeys, getCheckedNodes,
1958
2472
  // getHalfCheckedKeys,
1959
2473
  // getHalfCheckedNodes,
1960
2474
  setChecked, setCheckedKeys, setCheckedNodes } = useCheck(config, this._tree);
@@ -1988,13 +2502,20 @@ class VirtualTree {
1988
2502
  const generateExpandIcon = (item) => {
1989
2503
  const el = document.createElement('div');
1990
2504
  el.classList.add('hy-tree-node__expand');
2505
+ // 通道数据
2506
+ if (item.data.dataType === 9)
2507
+ return el;
2508
+ // 其他数据
1991
2509
  if (this._expandedKeySet.has(item.key)) {
1992
2510
  el.classList.add('expanded');
1993
2511
  }
1994
2512
  const icon = document.createElement('div');
1995
2513
  icon.classList.add('hy-tree-node__expand-icon');
1996
2514
  el.appendChild(icon);
1997
- if (item.isLeaf || this._hiddenExpandIconKeySet.has(item.key)) {
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)) {
1998
2519
  el.style.setProperty('visibility', 'hidden');
1999
2520
  }
2000
2521
  else {
@@ -2077,35 +2598,10 @@ class VirtualTree {
2077
2598
  className = className.filter(Boolean);
2078
2599
  el.classList.add(...className);
2079
2600
  };
2080
- /** 渲染项 */
2081
- const generateItem = (item) => {
2082
- const { type, showSelect } = config.rowSelection;
2083
- let el = document.createElement('div');
2084
- el.classList.add('hy-tree-node');
2085
- if (config.itemGap) {
2086
- el.style.paddingBottom = `${config.itemGap}px`;
2087
- }
2088
- let nodeContainer = document.createElement('div');
2089
- nodeContainer.style.height = `${config.itemHeight}px`;
2090
- if (config.nodeBgColor) {
2091
- nodeContainer.style.backgroundColor = config.nodeBgColor;
2092
- }
2093
- setNodeClass(nodeContainer, item);
2094
- let content = document.createElement('div');
2095
- content.classList.add('hy-tree-node-content');
2096
- content.style.setProperty('padding-left', `${(item.level - 1) * (config.indent || 0)}px`);
2097
- // 设备离线 - 字体颜色
2098
- if (['device', 'groupDevice'].includes(config.business)
2099
- && this._props.showStatus
2100
- && item.data.dataType === 3
2101
- && item.data.deviceStatus === 0) {
2102
- content.style.color = config.placeholderColor;
2103
- }
2104
- content.appendChild(generateExpandIcon(item));
2105
- // 多选框/单选框
2106
- if ((isBoolean(showSelect)
2107
- ? showSelect
2108
- : 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) {
2109
2605
  if (type === 'checkbox') {
2110
2606
  new Checkbox({
2111
2607
  checked: isChecked(item),
@@ -2121,7 +2617,7 @@ class VirtualTree {
2121
2617
  }
2122
2618
  this.refresh();
2123
2619
  }
2124
- }).mount(content);
2620
+ }).mount(el);
2125
2621
  }
2126
2622
  else if (type === 'radio') {
2127
2623
  new Radio({
@@ -2132,9 +2628,36 @@ class VirtualTree {
2132
2628
  toggleCheckbox(item, checked, true, false);
2133
2629
  this.refresh();
2134
2630
  }
2135
- }).mount(content);
2631
+ }).mount(el);
2136
2632
  }
2137
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);
2138
2661
  // 整个节点内容
2139
2662
  this._customRender(config.renderItem, item, {
2140
2663
  inset: true,
@@ -2161,9 +2684,7 @@ class VirtualTree {
2161
2684
  if (config.onNodeClick) {
2162
2685
  await config.onNodeClick(item.data, item, e);
2163
2686
  }
2164
- if (!getDisabled(config, item) && (isBoolean(showSelect)
2165
- ? showSelect
2166
- : isFunction(showSelect) && showSelect(item.data, item))) {
2687
+ if (!getDisabled(config, item) && isShowSelect(config, item)) {
2167
2688
  if (config.checkOnClickNode) {
2168
2689
  toggleCheckbox(item, !(isChecked(item) || isIndeterminate(item)), true, true);
2169
2690
  if (!config.expandOnClickNode || item.isLeaf) {
@@ -2230,9 +2751,7 @@ class VirtualTree {
2230
2751
  if (getDisabled(config, item) ||
2231
2752
  item.isLeaf ||
2232
2753
  !config.checkOnDblclickParentNode ||
2233
- !(isBoolean(showSelect)
2234
- ? showSelect
2235
- : isFunction(showSelect) && showSelect(item.data, item))) {
2754
+ !isShowSelect(config, item)) {
2236
2755
  return;
2237
2756
  }
2238
2757
  nodeClickCount = 0;
@@ -2331,7 +2850,8 @@ class VirtualTree {
2331
2850
  count: this._props.count,
2332
2851
  total: this._props.total
2333
2852
  },
2334
- businessConfig: this._businessConfig
2853
+ businessConfig: this._businessConfig,
2854
+ hiddenNodeKeySet: this._hiddenNodeKeySet
2335
2855
  });
2336
2856
  Object.assign(this._tree, tree);
2337
2857
  // 设备离线时取消勾选状态
@@ -2450,6 +2970,74 @@ class VirtualTree {
2450
2970
  : data;
2451
2971
  return this._tree ? this._tree.treeNodeMap.get(key) : undefined;
2452
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
+ })();
2453
3041
  /** 设置展开的节点 */
2454
3042
  setExpandedKeys = (keys) => {
2455
3043
  const expandedKeys = new Set();
@@ -2530,4 +3118,4 @@ class VirtualTree {
2530
3118
  };
2531
3119
  }
2532
3120
 
2533
- export { VirtualScroll, VirtualTree, getGlobalDeviceStatus, isArray, isBoolean, isElement, isEmpty, isFunction, isNull, isNumber, isObject, isString, isUndefined, setGlobalDeviceStatus };
3121
+ export { Business, DataType, DeviceStatus, VirtualScroll, VirtualTree, getGlobalDeviceStatus, isArray, isBoolean, isElement, isEmpty, isFunction, isNull, isNumber, isObject, isString, isUndefined, setGlobalDeviceStatus };