@datagrok/eda 1.1.25 → 1.1.28

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.
Files changed (111) hide show
  1. package/.vscode/settings.json +5 -0
  2. package/CHANGELOG.md +12 -0
  3. package/README.md +1 -0
  4. package/dist/05e5e0770f54f07e9474.wasm +0 -0
  5. package/dist/111.js +2 -0
  6. package/dist/111.js.map +1 -0
  7. package/dist/153.js +2 -0
  8. package/dist/153.js.map +1 -0
  9. package/dist/23.js +2 -2
  10. package/dist/23.js.map +1 -0
  11. package/dist/234.js +2 -0
  12. package/dist/234.js.map +1 -0
  13. package/dist/242.js +2 -0
  14. package/dist/242.js.map +1 -0
  15. package/dist/260.js +2 -0
  16. package/dist/260.js.map +1 -0
  17. package/dist/317.js +2 -0
  18. package/dist/317.js.map +1 -0
  19. package/dist/33.js +2 -0
  20. package/dist/33.js.map +1 -0
  21. package/dist/348.js +2 -0
  22. package/dist/348.js.map +1 -0
  23. package/dist/377.js +2 -0
  24. package/dist/377.js.map +1 -0
  25. package/dist/412.js +2 -0
  26. package/dist/412.js.map +1 -0
  27. package/dist/415.js +2 -0
  28. package/dist/415.js.map +1 -0
  29. package/dist/531.js +2 -0
  30. package/dist/531.js.map +1 -0
  31. package/dist/583.js +2 -0
  32. package/dist/583.js.map +1 -0
  33. package/dist/589.js +2 -0
  34. package/dist/589.js.map +1 -0
  35. package/dist/603.js +2 -0
  36. package/dist/603.js.map +1 -0
  37. package/dist/656.js +2 -0
  38. package/dist/656.js.map +1 -0
  39. package/dist/682.js +2 -0
  40. package/dist/682.js.map +1 -0
  41. package/dist/705.js +2 -0
  42. package/dist/705.js.map +1 -0
  43. package/dist/731.js +2 -0
  44. package/dist/731.js.map +1 -0
  45. package/dist/738.js +3 -0
  46. package/dist/738.js.map +1 -0
  47. package/dist/763.js +2 -0
  48. package/dist/763.js.map +1 -0
  49. package/dist/778.js +2 -0
  50. package/dist/778.js.map +1 -0
  51. package/dist/783.js +2 -0
  52. package/dist/783.js.map +1 -0
  53. package/dist/793.js +2 -0
  54. package/dist/793.js.map +1 -0
  55. package/dist/907.js +2 -0
  56. package/dist/907.js.map +1 -0
  57. package/dist/91.js +2 -0
  58. package/dist/91.js.map +1 -0
  59. package/dist/950.js +2 -0
  60. package/dist/950.js.map +1 -0
  61. package/dist/package-test.js +2 -2
  62. package/dist/package-test.js.map +1 -0
  63. package/dist/package.js +2 -2
  64. package/dist/package.js.map +1 -0
  65. package/package.json +92 -92
  66. package/scripts/command.txt +1 -1
  67. package/scripts/func.json +1 -1
  68. package/scripts/module.json +1 -1
  69. package/src/missing-values-imputation/ui.ts +80 -66
  70. package/src/package.ts +288 -38
  71. package/src/pls/pls-tools.ts +16 -15
  72. package/src/regression.ts +232 -0
  73. package/src/svm.ts +78 -38
  74. package/tsconfig.json +4 -4
  75. package/wasm/EDA.js +65 -1
  76. package/wasm/EDA.wasm +0 -0
  77. package/wasm/EDAAPI.js +30 -0
  78. package/wasm/EDAForWebWorker.js +1 -1
  79. package/wasm/callWasm.js +384 -393
  80. package/wasm/regression-api.cpp +66 -0
  81. package/wasm/regression.h +128 -0
  82. package/wasm/workers/fitLinearRegressionParamsWithDataNormalizingWorker.js +13 -0
  83. package/wasm/workers/fitLinearRegressionParamsWorker.js +13 -0
  84. package/webpack.config.js +1 -1
  85. package/dist/208.js +0 -2
  86. package/dist/221.js +0 -2
  87. package/dist/231.js +0 -2
  88. package/dist/261.js +0 -2
  89. package/dist/282.js +0 -2
  90. package/dist/334.js +0 -2
  91. package/dist/356.js +0 -2
  92. package/dist/36.js +0 -2
  93. package/dist/367.js +0 -2
  94. package/dist/374.js +0 -2
  95. package/dist/40.js +0 -2
  96. package/dist/413.js +0 -2
  97. package/dist/42.js +0 -2
  98. package/dist/427.js +0 -2
  99. package/dist/467.js +0 -2
  100. package/dist/523.js +0 -3
  101. package/dist/533.js +0 -2
  102. package/dist/590.js +0 -2
  103. package/dist/65.js +0 -2
  104. package/dist/694.js +0 -2
  105. package/dist/729.js +0 -2
  106. package/dist/796.js +0 -2
  107. package/dist/902.js +0 -2
  108. package/dist/910.js +0 -2
  109. package/dist/972.js +0 -2
  110. package/dist/f5343e2c2e15952ce916.wasm +0 -0
  111. /package/dist/{523.js.LICENSE.txt → 738.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","mappings":"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AG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjD8M,GAASwF,YAAc3uD,UAAUq8C,KAAK,EACjC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjD8M,GAAS0F,WAAa7uD,UAAUq8C,KAAK,EAChC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IHvmBjD,SAAWyF,GACPA,EAAkC,KAAI,OACtCA,EAAkC,KAAI,OACtCA,EAAoC,OAAI,QAC3C,CAJD,CAIGA,KAAgCA,GAA8B,CAAC,IAC3D,MAAMgN,GACT,iBAAIC,GACA,OAAOpsD,KAAKqsD,eAChB,CACA,iBAAID,CAAc9kD,GACVA,IAAOtH,KAAKqsD,kBACZrsD,KAAKqsD,gBAAkB/kD,EACvBtH,KAAKssD,GAAGC,OAAOvsD,KAAKwsD,KAE5B,CACA,iBAAIC,CAAc7f,GACd5sC,KAAK0sD,YAAY9f,GACjB5sC,KAAKssD,GAAGC,OAAOvsD,KAAKwsD,IACxB,CACA,mBAAIG,CAAgBC,GAChB5sD,KAAK4sD,WAAaA,EAClB5sD,KAAKssD,GAAGC,OAAOvsD,KAAKwsD,IACxB,CACA,WAAAhiD,CAAY8hD,EAAIO,EAAOC,EAAOlgB,EAAOmgB,EAAmB5N,GAA4B6N,MAChF,IAAI5xC,EACJpb,KAAKqsD,iBAAmB,EACxBrsD,KAAKitD,YAAc,IAAI,GAAA3W,QACvBt2C,KAAKktD,UAAY,IAAI,GAAA5W,QACrBt2C,KAAKmtD,iBAAmB,EACxBntD,KAAKotD,WAAa,GAClBptD,KAAKssD,GAAKA,EACVtsD,KAAKqtD,SAAWrtD,KAAKssD,GAAGjV,UAAU7hB,QAAQ2tB,OAAO0J,GACjD7sD,KAAKstD,SAAWttD,KAAKssD,GAAGjV,UAAU7hB,QAAQ2tB,OAAO2J,GACjD9sD,KAAKutD,OAASvtD,KAAKssD,GAAGkB,UAAkB,OACxCxtD,KAAKwsD,IAAMxsD,KAAKutD,OAAOE,WAAW,MAClCztD,KAAK+sD,iBAAmBA,EACxB/sD,KAAK0sD,YAAY9f,GACjB5sC,KAAK4sD,WAAyC,QAA3BxxC,EAAKwxB,EAAMggB,kBAA+B,IAAPxxC,EAAgBA,EAAK,IAAIorC,GAASxmD,KAAK4sC,MAAM8M,KAAK95C,QACnGgtC,EAAMggB,YACP5sD,KAAK4sD,WAAWzD,QAAO,GAAM,GAC7Bvc,EAAM8gB,YACN1tD,KAAKotD,WAAaxgB,EAAM8gB,WAC5B1tD,KAAKutD,OAAOI,YAAeC,KACO,IAA1B5tD,KAAKmtD,iBACLntD,KAAKitD,YAAY/gC,KAAK,CAAE9mB,EAAGwoD,EAAMC,QAASz4C,EAAGw4C,EAAME,QAASxmD,GAAItH,KAAKmtD,gBAAiBS,MAAOA,GAAQ,EAE7G5tD,KAAKutD,OAAOQ,YAAeH,IACvB5tD,KAAKmtD,gBAAkBntD,KAAKguD,kBAAkBJ,EAAMK,QAASL,EAAMM,UACrC,IAA1BluD,KAAKmtD,iBACLntD,KAAKktD,UAAUhhC,KAAK,CAAE9mB,EAAGwoD,EAAMC,QAASz4C,EAAGw4C,EAAME,QAASxmD,GAAItH,KAAKmtD,gBAAiBS,MAAOA,GAAQ,EAE3GtB,EAAG6B,QAAQ,wBACNpI,WAAW5M,IACZn5C,KAAKouD,aAAa,GAE1B,CACA,WAAA1B,CAAY9f,GACR5sC,KAAK4sC,MAAQA,EACb5sC,KAAKquD,oBAAsB,IAAIjyD,WAAW4D,KAAK4sC,MAAM8M,KAAK95C,QACrDgtC,EAAM0hB,yBAGPtuD,KAAKquD,oBAAoBnd,KAAK,GAF9BlxC,KAAKuuD,yBAGb,CACA,WAAAH,GACI,IAAIhzC,EAAIC,EAAIC,EAAIkzC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAItmD,EAAIumD,EAAIC,EAAIC,EACpD,MAAMC,EAASjvD,KAAKssD,GAAG4C,aAAaC,KAC9BC,EAAuBpvD,KAAK4sC,MAAMyiB,QAAUrvD,KAAK4sC,MAAMI,OAAShtC,KAAK4sC,MAAM0iB,WAAatvD,KAAK4sC,MAAM2iB,cACpGH,IACDpvD,KAAKwsD,IAAIgD,UAAwC,QAA3Bp0C,EAAKpb,KAAK4sC,MAAMI,aAA0B,IAAP5xB,EAAgBA,EAAK,EAC9Epb,KAAKwsD,IAAIiD,YAAc,QAAoC,QAA3Bp0C,EAAKrb,KAAK4sC,MAAMM,aAA0B,IAAP7xB,EAAgBA,EAAK,aAA2C,QAA7BC,EAAKtb,KAAK4sC,MAAM8iB,eAA4B,IAAPp0C,EAAgBA,EAAK,MAEpK,MAAMq0C,EAAgBV,EAAuB,eAAIjvD,KAAKssD,GAAGjV,UAAU9rC,IAAI0jD,EAAuB,gBAAK,KAC7F1kC,EAASvqB,KAAKssD,GAAGjV,UAAU9sB,OACjC,IAAK,IAAIjoB,EAAI,EAAGA,EAAItC,KAAK4sC,MAAM8M,KAAK95C,OAAQ0C,IACxC,GAAIioB,EAAOsH,IAAI7xB,KAAK4sC,MAAM8M,KAAKp3C,KAAOioB,EAAOsH,IAAI7xB,KAAK4sC,MAAMmd,GAAGznD,KAAOtC,KAAK4sD,WAAW3D,OAAO3mD,GAAI,CAC7F,IAAIstD,EAAU,EACd,MAAM,SAAEC,EAAQ,OAAEC,GAAW9vD,KAAK+vD,gBAAgBd,EAAQU,EAAertD,GACnE0tD,EAAYhwD,KAAKssD,GAAG2D,cAAcjwD,KAAKqtD,SAASx7B,IAAI7xB,KAAK4sC,MAAM8M,KAAKp3C,IAAKtC,KAAKstD,SAASz7B,IAAI7xB,KAAK4sC,MAAM8M,KAAKp3C,KACjH,IAAI4tD,EAAKF,aAA6C,EAASA,EAAU5qD,EACrE+qD,EAAKH,aAA6C,EAASA,EAAU56C,EACzE,MAAMg7C,EAAUpwD,KAAKssD,GAAG2D,cAAcjwD,KAAKqtD,SAASx7B,IAAI7xB,KAAK4sC,MAAMmd,GAAGznD,IAAKtC,KAAKstD,SAASz7B,IAAI7xB,KAAK4sC,MAAMmd,GAAGznD,KAC3G,IAAI+tD,EAAKD,aAAyC,EAASA,EAAQhrD,EAC/DkrD,EAAKF,aAAyC,EAASA,EAAQh7C,EACnE,MAAMm7C,EAAU9qD,KAAKC,IAAI1F,KAAKssD,GAAGkE,QAAQxjB,MAAOhtC,KAAKssD,GAAGkE,QAAQC,QAEhE,GADAzwD,KAAKwsD,IAAIkE,YACLR,GAAMC,GAAME,GAAMC,GAAM7qD,KAAKkrD,MAAMN,EAAKH,EAAII,EAAKH,GAAMI,EAAU,IAAM,CACvE,GAAInB,EAAsB,CACtB,MAAMliB,GAAsC,QAA5BshB,EAAKxuD,KAAK4sC,MAAMyiB,cAA2B,IAAPb,OAAgB,EAASA,EAAGlsD,IAAmC,QAA5BmsD,EAAKzuD,KAAK4sC,MAAMyiB,cAA2B,IAAPZ,OAAgB,EAASA,EAAGnsD,GAAK,UACtJotD,GAA2C,QAA/BhB,EAAK1uD,KAAK4sC,MAAM0iB,iBAA8B,IAAPZ,OAAgB,EAASA,EAAGpsD,IAAsC,QAA/BqsD,EAAK3uD,KAAK4sC,MAAM0iB,iBAA8B,IAAPX,OAAgB,EAASA,EAAGrsD,GAAK,EACpKtC,KAAKwsD,IAAIiD,YAAc,QAAQviB,KAASwiB,KACxC1vD,KAAKwsD,IAAIgD,WAA0C,QAA5BZ,EAAK5uD,KAAK4sC,MAAMgkB,cAA2B,IAAPhC,OAAgB,EAASA,EAAGtsD,IAAmC,QAA5BusD,EAAK7uD,KAAK4sC,MAAMgkB,cAA2B,IAAP/B,OAAgB,EAASA,EAAGvsD,GAAK,CACvK,CACIA,IAAMtC,KAAKqsD,iBACXrsD,KAAK6wD,wBAAuB,GAChC,MAAMC,EAAa9wD,KAAKquD,oBAAoB/rD,GAC5C,IAAIyuD,EAAe,KACnB,GAAID,EAAY,CACZlB,EAAU5vD,KAAKgxD,cAAcd,EAAIC,EAAIE,EAAIC,GACzC,MAAMW,EAAuBjxD,KAAKkxD,mBAAmBhB,EAAIC,EAAIE,EAAIC,EAAIR,EAAQF,GACvEuB,EAAsBnxD,KAAKkxD,mBAAmBb,EAAIC,EAAIJ,EAAIC,EAAIN,EAAUD,GAC9EM,EAAKe,EAAqB7rD,EAC1B+qD,EAAKc,EAAqB77C,EAC1Bi7C,EAAKc,EAAoB/rD,EACzBkrD,EAAKa,EAAoB/7C,EACzB27C,EAAe/wD,KAAK4sC,MAAM8M,KAAKp3C,GAAKtC,KAAK4sC,MAAMmd,GAAGznD,GAC9CtC,KAAKoxD,iBAAiBN,EAAYZ,EAAIC,EAAIE,EAAIC,EAAIhuD,GAClDtC,KAAKoxD,iBAAiBN,EAAYT,EAAIC,EAAIJ,EAAIC,EAAI7tD,GACtDtC,KAAKwsD,IAAI6E,OAAOnB,EAAIC,GACpBnwD,KAAKwsD,IAAI8E,iBAAiBP,EAAa3rD,EAAG2rD,EAAa37C,EAAGi7C,EAAIC,EAClE,MAEItwD,KAAKwsD,IAAI6E,OAAOnB,EAAIC,GACpBnwD,KAAKwsD,IAAI+E,OAAOlB,EAAIC,GAExB,IAAqC,QAAhC/nD,EAAKvI,KAAK4sC,MAAM4kB,kBAA+B,IAAPjpD,EAAgBA,EAAyC,QAAnCumD,EAAK9uD,KAAK4sC,MAAM2iB,qBAAkC,IAAPT,OAAgB,EAASA,EAAG7F,OAAO3mD,MACxIstD,IACDA,EAAU5vD,KAAKgxD,cAAcd,EAAIC,EAAIE,EAAIC,IACzCV,EAAU5vD,KAAKotD,YAAY,CAC3B,MAAMqE,EAAcX,EAAwE,KAA3D9wD,KAAKkxD,mBAAmBhB,EAAIC,EAAIE,EAAIC,EAAIR,EAAQF,GAC3E8B,EAAWZ,EAAaC,EAAa3rD,EAAI8qD,EACzCyB,EAAWb,EAAaC,EAAa37C,EAAI+6C,EAC/CnwD,KAAK4xD,YAAY5xD,KAAKwsD,IAAqF,QAA/EuC,EAAK0C,aAA+C,EAASA,EAAWrsD,SAAsB,IAAP2pD,EAAgBA,EAAKmB,EAAoF,QAA/ElB,EAAKyC,aAA+C,EAASA,EAAWr8C,SAAsB,IAAP45C,EAAgBA,EAAKmB,EAAIuB,EAAUC,EAC3Q,CAEJ3xD,KAAKwsD,IAAIqF,SACT7xD,KAAKwsD,IAAIsF,YACLxvD,IAAMtC,KAAKqsD,iBACXrsD,KAAK6wD,wBAAuB,EACpC,CACJ,CAEJ7wD,KAAK+xD,oBACT,CACA,sBAAAlB,CAAuBx/C,GACnB,OAAQrR,KAAK+sD,kBACT,KAAK5N,GAA4B6S,KAC7B3gD,EAAOrR,KAAKwsD,IAAIgD,WAAa,EAAIxvD,KAAKwsD,IAAIgD,WAAa,EACvD,MAEJ,KAAKrQ,GAA4B8S,OAC7B5gD,EAAOrR,KAAKwsD,IAAI0F,YAAY,CAAC,EAAG,IAAMlyD,KAAKwsD,IAAI0F,YAAY,IAC3D,MAEJ,QACI,OAEZ,CACA,eAAAnC,CAAgBd,EAAQU,EAAertD,GACnC,IAAIutD,EAAW,EACXC,EAAS,EASb,OARIH,GACAE,GAAYZ,EAAOkD,eAAiBlD,EAAOmD,cAAgBnD,EAAOkD,eAAiBxC,EAActzC,MAAMrc,KAAK4sC,MAAM8M,KAAKp3C,KAAO,EAC9HwtD,GAAUb,EAAOkD,eAAiBlD,EAAOmD,cAAgBnD,EAAOkD,eAAiBxC,EAActzC,MAAMrc,KAAK4sC,MAAMmd,GAAGznD,KAAO,GAErH2sD,EAAOoD,oBACZxC,EAAWZ,EAAOoD,kBAAoB,EACtCvC,EAASb,EAAOoD,kBAAoB,GAEjC,CAAExC,WAAUC,SACvB,CACA,kBAAAiC,GACI,MAAMO,EAAO,IAAIC,OACjBD,EAAKA,KAAKtyD,KAAKssD,GAAGkG,SAASC,KAAMzyD,KAAKssD,GAAGkG,SAASE,KAAM1yD,KAAKssD,GAAGkG,SAASxlB,MAAOhtC,KAAKssD,GAAGqG,SAASlC,QACjGzwD,KAAKwsD,IAAIoG,UAAY,QACrB5yD,KAAKwsD,IAAIkE,YACT1wD,KAAKwsD,IAAItb,KAAKohB,GACdtyD,KAAKwsD,IAAIsF,WACb,CACA,uBAAAvD,GACI,MAAMsE,EAAoB,IAAIrM,GAASxmD,KAAK4sC,MAAM8M,KAAK95C,QACvDizD,EAAkB1J,QAAO,GACzB,IAAK,IAAI7mD,GAAK,GAA4C,KAAxCA,EAAIuwD,EAAkB5H,SAAS3oD,KAAa,CAC1D,MAAMwwD,EAAexwD,EACfykB,EAAK/mB,KAAK4sC,MAAM8M,KAAKoZ,GACrB7rC,EAAKjnB,KAAK4sC,MAAMmd,GAAG+I,GACzB,IAAIC,EAAe,EACnB,IAAK,IAAI3oD,EAAI9H,GAA4C,KAAxC8H,EAAIyoD,EAAkB5H,SAAS7gD,KAAa,CACzD,MAAM4oD,EAAkBhzD,KAAK4sC,MAAM8M,KAAKtvC,GAClC6oD,EAAkBjzD,KAAK4sC,MAAMmd,GAAG3/C,IAClC4oD,IAAoBjsC,GAAMksC,IAAoBhsC,GAC9CgsC,IAAoBlsC,GAAMisC,IAAoB/rC,KAC9CjnB,KAAKquD,oBAAoBjkD,KAAO2oD,EAChCF,EAAkBrK,OAAOp+C,GAAG,GAAO,GAE3C,CACI2oD,EAAe,IACf/yD,KAAKquD,oBAAoByE,GAAgB,GAC7CD,EAAkBrK,OAAOlmD,GAAG,GAAO,EACvC,CACJ,CACA,iBAAA0rD,CAAkB5oD,EAAGgQ,GACjB,IAAI89C,GAAgB,EAChBpe,EAAU,KACVwP,EAAO,KACX,MAAM2K,EAASjvD,KAAKssD,GAAG4C,aAAaC,KAC9BQ,EAAgBV,EAAuB,eAAIjvD,KAAKssD,GAAGjV,UAAU9rC,IAAI0jD,EAAuB,gBAAK,KAC7F1kC,EAASvqB,KAAKssD,GAAGjV,UAAU9sB,OACjC,IAAK,IAAIjoB,EAAI,EAAGA,EAAItC,KAAK4sC,MAAM8M,KAAK95C,OAAQ0C,IACxC,GAAIioB,EAAOsH,IAAI7xB,KAAK4sC,MAAM8M,KAAKp3C,KAAOioB,EAAOsH,IAAI7xB,KAAK4sC,MAAMmd,GAAGznD,KAAOtC,KAAK4sD,WAAW3D,OAAO3mD,GAAI,CAC7F,MAAM,SAAEutD,EAAQ,OAAEC,GAAW9vD,KAAK+vD,gBAAgBd,EAAQU,EAAertD,GACnE6wD,EAAQnzD,KAAKssD,GAAG2D,cAAcjwD,KAAKqtD,SAASx7B,IAAI7xB,KAAK4sC,MAAM8M,KAAKp3C,IAAKtC,KAAKstD,SAASz7B,IAAI7xB,KAAK4sC,MAAM8M,KAAKp3C,KACvG8wD,EAAMpzD,KAAKssD,GAAG2D,cAAcjwD,KAAKqtD,SAASx7B,IAAI7xB,KAAK4sC,MAAMmd,GAAGznD,IAAKtC,KAAKstD,SAASz7B,IAAI7xB,KAAK4sC,MAAMmd,GAAGznD,KACvG,GAAItC,KAAKquD,oBAAoB/rD,GAAI,CAC7B,MAAMD,EAAMrC,KAAKgxD,cAAcmC,EAAM/tD,EAAG+tD,EAAM/9C,EAAGg+C,EAAIhuD,EAAGguD,EAAIh+C,GACtDi+C,EAAarzD,KAAKkxD,mBAAmBiC,EAAM/tD,EAAG+tD,EAAM/9C,EAAGg+C,EAAIhuD,EAAGguD,EAAIh+C,EAAG06C,EAAQztD,GAC7EixD,EAAWtzD,KAAKkxD,mBAAmBkC,EAAIhuD,EAAGguD,EAAIh+C,EAAG+9C,aAAqC,EAASA,EAAM/tD,EAAG+tD,aAAqC,EAASA,EAAM/9C,EAAGy6C,EAAUxtD,GACzK0uD,EAAe/wD,KAAK4sC,MAAM8M,KAAKp3C,GAAKtC,KAAK4sC,MAAMmd,GAAGznD,GACpDtC,KAAKoxD,iBAAiBpxD,KAAKquD,oBAAoB/rD,GAAI+wD,EAAWjuD,EAAGiuD,EAAWj+C,EAAGk+C,EAASluD,EAAGkuD,EAASl+C,EAAG9S,GACvGtC,KAAKoxD,iBAAiBpxD,KAAKquD,oBAAoB/rD,GAAIgxD,EAASluD,EAAGkuD,EAASl+C,EAAGi+C,EAAWjuD,EAAGiuD,EAAWj+C,EAAG9S,GAC3GgiD,EAAOtkD,KAAKuzD,yBAAyBjxD,EAAG8C,EAAGgQ,EAAGi+C,EAAYC,EAAUvC,EACxE,MAEIzM,EAAOtkD,KAAKwzD,4BAA4BpuD,EAAGgQ,EAAG+9C,EAAOC,KAEnDte,GAAoB,OAATwP,GAAiBA,EAAO,GAAMxP,GAAoB,OAATwP,GAAiBA,EAAOxP,KAC9EA,EAAUwP,EACV4O,EAAe5wD,EAEvB,CAEJ,OAAO4wD,CACX,CACA,2BAAAM,CAA4BpuD,EAAGgQ,EAAG2R,EAAIE,GAGlC,MAAMwsC,EAAOhuD,KAAKC,IAAIqhB,EAAG3hB,EAAG6hB,EAAG7hB,GACzBsuD,EAAOjuD,KAAKE,IAAIohB,EAAG3hB,EAAG6hB,EAAG7hB,GACzBuuD,EAAOluD,KAAKC,IAAIqhB,EAAG3R,EAAG6R,EAAG7R,GACzBw+C,EAAOnuD,KAAKE,IAAIohB,EAAG3R,EAAG6R,EAAG7R,GAG/B,OAAOhQ,GAAKquD,EADM,GACcruD,GAAKsuD,EADnB,GACuCt+C,GAAKu+C,EAD5C,GACgEv+C,GAAKw+C,EADrE,EAEd5zD,KAAK6zD,0BAA0BzuD,EAAGgQ,EAAG2R,EAAIE,GACzC,IACR,CACA,yBAAA4sC,CAA0BzuD,EAAGgQ,EAAG2R,EAAIE,GAChC,MAAMq9B,EAAO,CAAC5jC,EAAIiF,EAAIlQ,EAAIkN,IAAOld,KAAKgE,IAAKiX,EAAKjL,EAAK,GAAKhQ,KAAKgE,IAAKkc,EAAKhD,EAAK,GACxEnE,EAAI8lC,EAAKv9B,EAAG3hB,EAAG2hB,EAAG3R,EAAG6R,EAAG7hB,EAAG6hB,EAAG7R,GACpC,GAAS,GAALoJ,EACA,OAAO8lC,EAAKl/C,EAAGgQ,EAAG2R,EAAG3hB,EAAG2hB,EAAG3R,GAC/B,IAAIhH,IAAMhJ,EAAI2hB,EAAG3hB,IAAM6hB,EAAG7hB,EAAI2hB,EAAG3hB,IAAMgQ,EAAI2R,EAAG3R,IAAM6R,EAAG7R,EAAI2R,EAAG3R,IAAMoJ,EAEpE,OADApQ,EAAI3I,KAAKE,IAAI,EAAGF,KAAKC,IAAI,EAAG0I,IACrBk2C,EAAKl/C,EAAGgQ,EAAG2R,EAAG3hB,EAAIgJ,GAAK6Y,EAAG7hB,EAAI2hB,EAAG3hB,GAAI2hB,EAAG3R,EAAIhH,GAAK6Y,EAAG7R,EAAI2R,EAAG3R,GACtE,CACA,wBAAAm+C,CAAyBjxD,EAAG8C,EAAGgQ,EAAG2R,EAAIE,EAAI6sC,GAGtC,MAAML,EAAOhuD,KAAKC,IAAIqhB,EAAG3hB,EAAG6hB,EAAG7hB,EAAG0uD,EAAG1uD,GAC/BsuD,EAAOjuD,KAAKE,IAAIohB,EAAG3hB,EAAG6hB,EAAG7hB,EAAG0uD,EAAG1uD,GAC/BuuD,EAAOluD,KAAKC,IAAIqhB,EAAG3R,EAAG6R,EAAG7R,EAAG0+C,EAAG1+C,GAC/Bw+C,EAAOnuD,KAAKE,IAAIohB,EAAG3R,EAAG6R,EAAG7R,EAAG0+C,EAAG1+C,GAGrC,GAAIhQ,GAAKquD,EADS,GACWruD,GAAKsuD,EADhB,GACoCt+C,GAAKu+C,EADzC,GAC6Dv+C,GAAKw+C,EADlE,EACoF,CAClG,MAAM76C,EAAI26C,EAAOD,EACX38C,EAAI88C,EAAOD,EACjB,OAAO3zD,KAAK+zD,2BAA2B3uD,EAAGgQ,EAAG2R,EAAI+sC,EAAI7sC,EAAIlO,EAAGjC,EAChE,CACA,OAAO,IACX,CACA,0BAAAi9C,CAA2B3uD,EAAGgQ,EAAG4+C,EAAIjtC,EAAIE,EAAIlO,EAAGjC,GAC5C,MACMm9C,EAAWxuD,KAAKoN,OAAOkG,EAAIjC,GADjB,GAEVo9C,EAAS,EAAID,EACbE,EAAO,IAAI12D,YAAYw2D,GACvBG,EAAO,IAAI32D,YAAYw2D,GACvBI,EAAQ,IAAI52D,YAAYw2D,GAC9B,IAAIK,EAAW,KACf,MAAMC,EAAgB,IAAI/N,GAASyN,GACnC,IAAK,IAAI3xD,EAAI,EAAGA,EAAI6xD,EAAKv0D,OAAQ0C,IAAK,CAClC,MAAM8L,EAAI9L,EAAI4xD,EACRM,EAAW/uD,KAAKgE,IAAK,EAAI2E,EAAI,GAAK4lD,EAAG5uD,EAAI,EAAIgJ,GAAK,EAAIA,GAAK2Y,EAAG3hB,EAAIK,KAAKgE,IAAI2E,EAAG,GAAK6Y,EAAG7hB,EACtFqvD,EAAWhvD,KAAKgE,IAAK,EAAI2E,EAAI,GAAK4lD,EAAG5+C,EAAI,EAAIhH,GAAK,EAAIA,GAAK2Y,EAAG3R,EAAI3P,KAAKgE,IAAI2E,EAAG,GAAK6Y,EAAG7R,EACtFs/C,EAAQjvD,KAAKsM,IAAI3M,EAAIovD,GACrBG,EAAQlvD,KAAKsM,IAAIqD,EAAIq/C,GACrBG,EAAQF,EAAQC,IACjBL,GAAYA,EAAWM,KACxBN,EAAWM,GACfP,EAAM/xD,GAAKmD,KAAKE,IAAI+uD,EAAOC,GAC3BR,EAAK7xD,GAAKkyD,EACVJ,EAAK9xD,GAAKmyD,CACd,CACA,IAAK,IAAInyD,EAAI,EAAGA,EAAI6xD,EAAKv0D,OAAQ0C,IACzB+xD,EAAM/xD,GAAKgyD,GACXC,EAAc/L,OAAOlmD,GAAG,GAAM,GAEtC,IAAIwyC,EAAU,KACd,IAAK,IAAI1qC,GAAK,GAAwC,KAApCA,EAAImqD,EAActJ,SAAS7gD,KAAa,CACtD,MAAMk6C,EAAO7+C,KAAKkrD,MAAOwD,EAAK/pD,GAAKhF,EAAKgvD,EAAKhqD,GAAKgL,KAC7C0/B,GAAWA,EAAUwP,KACtBxP,EAAUwP,EAClB,CACA,OAAOxP,CACX,CACA,aAAAkc,CAAc6D,EAAKC,EAAKC,EAAKC,GACzB,OAAOvvD,KAAKmM,KAAKnM,KAAKgE,IAAIsrD,EAAMF,EAAK,GAAKpvD,KAAKgE,IAAIurD,EAAMF,EAAK,GAClE,CACA,kBAAA5D,CAAmB2D,EAAKC,EAAKC,EAAKC,EAAKpS,EAAUhjD,GAC7C,MAEMq1D,EAAMF,EAAMnS,IAFNmS,EAAMF,GAAOj1D,GAGnBs1D,EAAMF,EAAMpS,IAFNoS,EAAMF,GAAOl1D,GAGzB,OAAO,IAAI,QAASq1D,EAAKC,EAC7B,CACA,gBAAA9D,CAAiBrtD,EAAK2c,EAAIiF,EAAIlQ,EAAIkN,EAAIrgB,GAClC,MAAM6yD,EAAOz0C,GAAMjL,EAAKiL,GAAM,EACxB00C,EAAOzvC,GAAMhD,EAAKgD,GAAM,EAC9B,IAAI0vC,EAAKF,EAAOz0C,EACZ40C,EAAKF,EAAOzvC,EAChB,MAAM2+B,EAAO7+C,KAAKmM,KAAKyjD,EAAKA,EAAKC,EAAKA,GACtCD,GAAM/Q,EACNgR,GAAMhR,EACN,MAAMiR,EAAmB,GAAK9vD,KAAK+vD,KAAKzxD,EAAM,GAC9C,OAAOA,EAAM,GAAM,EACf,IAAI,QAASoxD,EAAQI,EAAmB,EAAKD,EAAIF,EAAQG,EAAmB,EAAKF,GACjF,IAAI,QAASF,EAAQI,EAAmB,EAAKD,EAAIF,EAAQG,EAAmB,EAAKF,EACzF,CACA,WAAAzD,CAAYtzD,EAAMm3D,EAAWC,EAAWC,EAAOC,GAC3C,MAAMC,EAAapwD,KAAKqwD,MAAMH,EAAQF,EAAWG,EAAQF,GAAajwD,KAAKoQ,GAC3EvX,EAAK+yD,OAAOoE,EAAaz1D,KAAKotD,WAAa3nD,KAAK6Q,IAAIu/C,EAAapwD,KAAKoQ,GAAK,IAAM6/C,EAAa11D,KAAKotD,WAAa3nD,KAAK+Z,IAAIq2C,EAAapwD,KAAKoQ,GAAK,KAChJvX,EAAKizD,OAAOkE,EAAWC,GACvBp3D,EAAKizD,OAAOkE,EAAaz1D,KAAKotD,WAAa3nD,KAAK6Q,IAAIu/C,EAAapwD,KAAKoQ,GAAK,IAAM6/C,EAAa11D,KAAKotD,WAAa3nD,KAAK+Z,IAAIq2C,EAAapwD,KAAKoQ,GAAK,IACpJ,E,2SIjTG,SAAekgD,GAA0B57B,EAAyB67B,G,0CACvE,MAAMl7B,EAAgBX,EAASv6B,OACzBi7B,EAAem7B,EAAQp2D,OAEvBq2D,EAAOD,EAAQ5oC,MAAMs4B,IACrBwQ,EAASF,EAAQ5oC,MAAMzb,MAEvBgoC,EAAS,IAAIj8C,aAAao9B,EAAgB,GAAGoW,KAAK,GAIxD,GAHAyI,EAAO7e,GAAiBm7B,EAGR,IAAXC,GAAmC,IAAjBr7B,EACrB,OAAO8e,EAET,IAEE,MAAMwc,EAAiBC,GAAkBt7B,EAAeD,GAExD,GAAIs7B,EAAeE,WAAY,CAE7B,MAAMC,QA+IZ,SAAiDn8B,EAC/C67B,EAAoB57B,G,0CASpB,aAR0BwM,GAAe,CACvCE,MAAO,YAAa1Q,YAAY,CAAC4/B,IACjC77B,SAAUA,EACVzQ,QAASssC,EACT57B,WAAYA,EACZ7B,MAAO,QAGU0O,uBAAuBxS,YAC5C,G,CA1JgC8hC,CAAkCp8B,EAAU67B,EAASG,EAAe/7B,YAE9F,IAAIo8B,EAAS,EAGb,IAAK,IAAIl0D,EAAI,EAAGA,EAAIw4B,IAAiBx4B,EACnCq3C,EAAOr3C,GAAKg0D,EAAYh0D,GACxBk0D,GAAUF,EAAYh0D,GAAK63B,EAAS1L,QAAQnsB,GAAG8qB,MAAMs4B,IAKvD,OAFA/L,EAAO7e,IAAkB07B,EAElB7c,CACT,CAGA,MAAM8c,EAAuC,GACvCC,EAAmC,GACnCC,EAAsB,IAAIj5D,aAAao9B,GACvC87B,EAAwB,IAAIl5D,aAAao9B,GAE/C,IAAI/2B,EAAM,EACN8yD,EAAwB,EAG5B,IAAK,MAAMtrD,KAAO4uB,EAAU,CAC1B,MAAM/M,EAAQ7hB,EAAI6hB,MAEdA,EAAMzb,MAAQ,IAChB8kD,EAA2BpvD,KAAKtD,GAChC2yD,EAAoBrvD,KAAKkE,GACzBorD,EAAoBE,GAAyBzpC,EAAMs4B,IACnDkR,EAAsBC,GAAyBzpC,EAAMzb,QACnDklD,KAGF9yD,CACJ,CAGA,GAA8B,IAA1B8yD,EACF,OAAOld,EAGT,MAAMmd,E7B4CH,SAAuD38B,EAAU48B,EAAaC,EAAgBhB,EAASiB,EAAYC,EAAeC,GACvI,OJkQK,SAAkBpxD,EAAQoyC,EAAU4D,GAEzC,MAAM/jB,EAAoBjyB,EAAOoyC,GAG3Bn2C,EAAOg2B,EAAkBxxB,UAGzBqxB,EAAe,GAGrB,IAAIv1B,EAAI,EACR,IAAK,MAAMmvB,KAAOzvB,EAAM,CACtB,MAAM4H,EAAM5H,EAAKyvB,GAGjB,GAAW,eAAPA,EAAJ,CAIA,OAAQ7nB,EAAIzJ,MACZ,IAAK,eACL,IAAK,MACL,IAAK,MACL,IAAK,cACL,IAAK,YACL,IAAK,aACHyJ,EAAIb,KAAOqsB,EAAMxrB,EAAIzJ,MAAM47C,EAAOz5C,IAClCA,IACA,MACF,IAAK,kBACL,IAAK,gBACH,MAAMw1B,EAAO91B,EAAK4H,EAAe,UAAO,KAAGb,KAAKa,EAAe,UAAS,OAClEmuB,EAAO/1B,EAAK4H,EAAkB,aAAO,KAAGb,KAAKa,EAAkB,aAAS,OAC9EA,EAAIb,KAAOqsB,EAAMxrB,EAAIzJ,MAAM23B,EAAMC,GACjC,MACF,IAAK,iBACL,IAAK,eACH,MAAMvuB,EAAMxH,EAAK4H,EAAe,UAAO,KAAGb,KAAKa,EAAe,UAAS,OACvEA,EAAIb,KAAOqsB,EAAMxrB,EAAIzJ,MAAMqJ,GAI7BquB,EAAaxwB,KAAKrF,EAAKyvB,GAAK1oB,KA1BlB,CA2BZ,CAGA,MAAMovB,EAnKR,SAAwBpyB,EAAQqxD,EAAWt1D,EAAYE,GACrD,IAAIqE,EAGJ,IAAK,MAAMuD,KAAO5H,EAChB4H,EAAIgqB,wBAAwB7tB,GAE9B,IAAIsxD,GAA4B,EAGhC,IAAK,MAAMztD,KAAO5H,EAChBq1D,GAA6BztD,EAAIiqB,6BAGnC,GAAIwjC,EAA2B,CAC7B,MAAM1d,EAAS,GACT/C,EAAQ,GAGd,IAAK,MAAMhtC,KAAO5H,EAChB4H,EAAI4pB,sBAAsBmmB,GAC1B/vC,EAAI8pB,qBAAqBkjB,GACzBhtC,EAAIkqB,gBAAgB/tB,GAGtB,MAAMuxD,EAA+C,SAInDjxD,EAASN,EAAOlE,MAAMu1D,EAAWE,EAAsB1gB,EAAO+C,GAKhE,IAAK,MAAM/vC,KAAO5H,EAChB4H,EAAImqB,kBAAkBhuB,EAC1B,CAGA,IAAK,MAAM6D,KAAO5H,EAChB4H,EAAIoqB,WAAWjuB,GAEjB,GAAc3L,MAAViM,EACF,OAAOA,CACX,CAuHqBkxD,CAAexxD,EAAQoyC,EAAU,EAAOtgB,GAG3D71B,EAAKk2B,YAAc9C,EAAMnwB,IAAIkzB,GAG7B,MAAMO,EAASV,EAAkBU,OAGjC,GAAsB,WAAlBA,EAAa,KACf,OAAO1C,EAAO0C,EAAa,MAAG12B,EAAK02B,EAAe,QAAG3vB,MAEvD,MAAM8vB,EAAgB,GAGtB,IAAK,MAAMP,KAAQI,EAAe,OAChCG,EAAcxxB,KAAKrF,EAAKs2B,GAAMvvB,KAAKA,MAErC,OAAO8vB,CACT,CIpUS,CAAS6C,IAAK,+CAAgD,CAACvB,EAAU48B,EAAaC,EAAgBhB,EAASiB,EAAYC,EAAeC,GACnJ,C6B9CuBK,CACjB,YAAaphC,YAAYsgC,GAAqBlhC,QAC9C,SAAUlC,iBAAiB,QAASqjC,EAAqBE,GACzD,SAAUvjC,iBAAiB,UAAWsjC,EAAuBC,GAC7Db,EACAC,EACAC,EACAW,EAAwB,GACxBpiC,aAGF,IAAK,IAAInyB,EAAI,EAAGA,EAAIu0D,IAAyBv0D,EAC3Cq3C,EAAO8c,EAA2Bn0D,IAAMw0D,EAAWx0D,GAErDq3C,EAAO7e,GAAiBg8B,EAAWD,EACrC,CAAE,MAAO14D,GACP,QAAW4zC,MAAM,6BAA6B5zC,aAAa2e,MAAQ3e,EAAE0nD,QAAU,8BACjF,CAEA,OAAOlM,CACT,G,CAGO,SAAS8d,GAAgCt9B,EAAyBwf,GACvE,MAAM7e,EAAgBX,EAASv6B,OAC/B,GAAIk7B,IAAkB6e,EAAO/5C,OAAS,EACpC,MAAM,IAAIkd,MAAM,8BAElB,MAAMvR,EAAM4uB,EAAS1L,QAAQ,GACvBoM,EAAetvB,EAAI3L,OACnBonC,EAAa,IAAItpC,aAAam9B,GAEpC,IAAI68B,EAAUnsD,EAAIkpB,aAClB,MAAMkjC,EAAOhe,EAAO7e,GACpB,IAAIkgB,EAASrB,EAAO,GAEpB,IAAK,IAAIr3C,EAAI,EAAGA,EAAIu4B,IAAgBv4B,EAClC0kC,EAAW1kC,GAAKq1D,EAAO3c,EAAS0c,EAAQp1D,GAE1C,IAAK,IAAI8H,EAAI,EAAGA,EAAI0wB,IAAiB1wB,EAAG,CACtCstD,EAAUv9B,EAAS1L,QAAQrkB,GAAGqqB,aAC9BumB,EAASrB,EAAOvvC,GAEhB,IAAK,IAAI9H,EAAI,EAAGA,EAAIu4B,IAAgBv4B,EAClC0kC,EAAW1kC,IAAM04C,EAAS0c,EAAQp1D,EACtC,CAEA,OAAO,SAAUgxB,iBACf6G,EAAS2Q,cAAc,cACvB9D,EACAnM,EAEJ,CA6DA,MAKMu7B,GAAoB,CAACt7B,EAAuBD,IALvB,EAACC,EAAuBD,IAC1C+8B,EAAiC/8B,GAAgBC,EAtLpC,IACF,UA0Ld+8B,CAAmB/8B,EAAeD,IAAkBC,GApM9B,IAqMjB,CACLu7B,YAAY,EACZj8B,WAnMuB,IAuMvBS,GA1MsB,IA2MjB,CACLw7B,YAAY,EACZj8B,WAAY30B,KAAKC,IA1MM,GA0MoBo1B,IAI3CD,GAAgBC,EACX,CACLu7B,YAAY,EACZj8B,WAAY30B,KAAKC,IAjNM,GAiNoBm1B,IAIxC,CACLw7B,YAAY,EACZj8B,WAvNyB,I,2SCqBtB,MAAM09B,GAAW,IAAI,UAGrB,SAASjyD,KACd,QAAWA,KAAKiyD,GAASC,QAC3B,CAGO,SAAej3D,K,gD9BpCfu6B,uBACC28B,SACR,C8BmCQC,EACR,G,CAWO,SAAeC,GAAOt4C,EAAkBu4C,EAAiBC,EAAiBvmB,EAAiBC,G,0CAChG,MAAM1sC,EAAI+yD,EAAK1jC,aACTrf,EAAIgjD,EAAK3jC,aACTxoB,QAAYylC,GAAgBtsC,EAAGgQ,EAAGy8B,EAASC,GAC3CumB,EAAiBz4C,EAAG4V,QAAQsV,cAAc,oBAC1CwtB,EAAU,SAAUjlC,eAAeglC,EAAgBpsD,GAEzD,OADA2T,EAAG4V,QAAQvU,IAAIq3C,GACRA,CACT,G,CAUO,SAAehyC,GAAIwgB,EAAqB3M,EAAyBC,EAAoBm+B,EAAiBl8C,G,0CAC3G,MAAMm8C,QC9DD,SAA0B1xB,EAAqB3M,EAAyBC,EAC7Em+B,EAAiBl8C,G,0CACjB,GAAgC8d,EAAUC,GAE1C,MAAMq+B,EAAYF,EAAS,EAAI,EACzBG,EAAWr8C,EAAQ,EAAI,EAE7B,a/BLKgf,eAAsDyL,EAAOtR,EAASuR,EAAiB0xB,EAAWC,GACvG,OAAO,IAAIl+D,SAAQ,CAACC,EAASC,KAC3B,MAAM4gC,EAAS,IAAIC,OAAO,IAAIC,IAAI,kBAClCF,EAAOG,YAAY,EAAYC,IAAgC,2BAAEl1B,UAAU,CAACgvB,EAASuR,EAAiB0xB,EAAWC,KACjHp9B,EAAOK,UAAY,SAASx9B,GAC1Bm9B,EAAOM,YACPnhC,EAAQ,EAAUihC,IAAgC,2BAAGv9B,EAAE4K,MACzD,IAEJ,C+BJe4vD,CAAuC7xB,EAAO3M,EAAUC,EAAYq+B,EAAWC,EAC9F,G,CDsDyBE,CAAW9xB,EAAO3M,EAAUC,EAAYm+B,EAAQl8C,GAGvE,GE/DK,SAAmCsuB,EAAgBnV,GACxD,IAAK,MAAMjqB,KAAOiqB,EAAQC,SACxBlqB,EAAI+sB,KF2DoB,KE3DJ/sB,EAAI+sB,IAC5B,CF0DEugC,CAA0B,EAAML,EAAShjC,SAExB,OAAbsR,EAAMx/B,GACR,QAAWwxD,aAAaN,OACrB,CACH,MAAMttD,EAAO47B,EAAMtR,QAEnB,IAAK,MAAMjqB,KAAOitD,EAAShjC,QACzBjqB,EAAI+sB,KAAOptB,EAAK4/B,cAAcv/B,EAAI+sB,MAClCptB,EAAK+V,IAAI1V,EAEb,CACF,G,CASO,SAAewtD,GAA6BC,EAAiBC,EAAiBpnB,EAAiBqnB,G,0CACpG,MAAMt5C,EAAKo5C,EAAK3hB,UAChB,GAAW,OAAPz3B,EACF,OACF,MAAMu5C,QAAejB,GAAOt4C,EAAIo5C,EAAMC,EAAMpnB,EAASqnB,GACrDt5C,EAAGw5C,iBAAiBD,EAAQ,UAC5B,MAAME,EAAW,CAACL,EAAK1gC,KAAM2gC,EAAK3gC,MAC5B8e,EAAK,QAAWpM,UAAUprB,EAAG0Y,MACnC,GAAK8e,EAGL,IAAK,MAAMnjC,KAAKmjC,EAAGkiB,QACjB,GAAIrlD,aAAa,qBAAwBolD,EAASriB,SAAS/iC,EAAEslD,MAAM/tB,cAAgB6tB,EAASriB,SAAS/iC,EAAEslD,MAAM9tB,aAE3G,YADAx3B,EAAEslD,MAAMC,gBAAkBL,EAAO7gC,KAIvC,G,CASO,SAASmhC,GAA4BluD,EAAgBmuD,GAC1D,MAAMvoD,EAAQ5F,EAAI6hB,MAAMznB,IAAM4F,EAAI6hB,MAAM1nB,IAExC,MAAO,CAACi0D,QADQpuD,EAAIkqB,SACH1H,QAAS,CAAC5c,SAC7B,CASO,SAASyoD,GAA4BruD,EAAgBmuD,GAE1D,MAAO,CAACC,QADQpuD,EAAIkqB,SACH1H,QAAS,CAAC,EAC7B,CAIO,SAAe8rC,K,0CACpB,MAAM7gB,EAAS,IAAI3D,GACbykB,EAAS,SAAU,4BACtB74C,IAAI+3B,EAAOsB,aACXkI,MAAK,IAAY,mCAChB,MAAM7I,EAASX,EAAOyB,YACQ,IAA1Bd,EAAOnkB,QAAQ51B,eRrIlBy7B,eAA4CyL,EAAOtR,EAASuoB,EAAQgc,EAAShf,EAASJ,EAAwBqf,EAAmB7e,GAAiB,EAAMC,GAAoB,EAAO6e,EAAgB,CAAEhf,sBAAuB,IAAMif,EAAY,CAAC,EAAGC,EAAqB,KAAMC,EAAmB,CAAC,GACpS,MAAMC,EAAmB,CACrBC,WAAW,EACXC,WAAW,EACXC,eAAe,EACfC,eAAe,GAEnB,GAAIjlC,EAAQ51B,SAAWm6D,EAAQn6D,QAAU41B,EAAQ51B,SAAW+6C,EAAuB/6C,QAC/E41B,EAAQ51B,SAAWm7C,EAAQn7C,QAAU41B,EAAQ51B,SAAWq6D,EAAchf,sBAAsBr7C,OAC5F,MAAM,IAAIkd,MAAM,yGAGpB,MAAMs6B,EAAK+D,EAAiB,QAAWnQ,UAAUlE,EAAMxO,OAAS,QAAWwgC,aAAahyB,GAAS,KAC3F4zB,EAAWr/B,UACb,MAAMs/B,EAAK,2BAA4BluD,OAAO,gBAAgBytD,EAAUU,iBAAmB,kCAC3F,IAAIrvB,EACJ,IACI,MAAMsvB,EA1BX,SAA+Bj7C,GAClC,MAAMk7C,EAAO,CAAC,UAAW,WACnBC,EAAan7C,EAAG4V,QAAQ+C,QAAQhO,QAAQstB,GAAOA,EAAGb,SAAS8jB,EAAK,MAAKl7D,OAAS,EACpF,OAAOk7D,EAAKpzD,KAAKmwC,GAAO,GAAGA,KAAMkjB,KACrC,CAsBmCC,CAAsBl0B,GAC7C,SAASm0B,EAAaC,EAASC,EAAcC,GACzC,IAAIC,EAAY,KACZC,EAAY,KACXx0B,EAAMtR,QAAQ+C,QAAQye,SAAS6jB,EAAe,KAU/CQ,EAAYv0B,EAAMtR,QAAQ2tB,OAAO0X,EAAe,IAChDS,EAAYx0B,EAAMtR,QAAQ2tB,OAAO0X,EAAe,MAVhDQ,EAAYv0B,EAAMtR,QAAQvU,IAAI,SAAUmf,MAAMy6B,EAAe,GAAI/zB,EAAM5B,WACvEo2B,EAAYx0B,EAAMtR,QAAQvU,IAAI,SAAUmf,MAAMy6B,EAAe,GAAI/zB,EAAM5B,WACnEiW,IAAmB5P,IACnBA,EAAc6L,EACT7L,YAAY,IAAK8uB,EAAkBj1D,EAAGy1D,EAAe,GAAIzlD,EAAGylD,EAAe,GAC5ExwB,MAAO6vB,EAAUU,iBAAmB9c,GAAuBtoB,EAASuoB,OAO5Emc,EAAU5lB,MACV/I,GAAalI,MAAQ,qBAAsBkI,EAAYlI,MAAM,GAC7Dg4B,EAAUv6D,MAAMwB,GAAM84D,EAAW,GAAKA,EAAW,GAAG94D,QAAKlI,IACzDkhE,EAAUx6D,MAAMwB,GAAM84D,EAAW,GAAKA,EAAW,GAAG94D,QAAKlI,KAE7D,MAAMmhE,EAAYL,EAAUC,EAAe,IAC3CR,EAAG/rC,OAAO2sC,EAAU,WAAWrB,EAAUU,iBAAmB,iCAAiCW,EAASC,QAAQ,MAClH,CACAngC,eAAeogC,IACX30B,EAAMtR,QAAQvU,IAAI,SAAUmf,MAAMy6B,EAAe,GAAI/zB,EAAM5B,WAC3D4B,EAAMtR,QAAQvU,IAAI,SAAUmf,MAAMy6B,EAAe,GAAI/zB,EAAM5B,WAC3D,IAAIw2B,EAAW,KACXvgB,IACA5P,EAAc6L,EACT7L,YAAY,IAAK8uB,EAAkBj1D,EAAGy1D,EAAe,GAAIzlD,EAAGylD,EAAe,GAC5ExwB,MAAO6vB,EAAUU,iBAAmB9c,GAAuBtoB,EAASuoB,KACxE,qBAAsBxS,EAAYlI,MAAM,IAE5C,MAAMs4B,EAAM,SAAYC,eAAe7V,WAAW/jD,IAC9C,MAAMiS,EAAIjS,EAAKA,KAAKqsC,OAChBp6B,GAAGi7C,cAAcC,MAAM9kB,OAASkB,GAAa2jB,cAAcC,MAAM9kB,OACjEp2B,GAAGi7C,cAAcC,MAAM9kB,QAAUkB,GAAa2jB,cAAcC,MAAM9kB,QAClE,SAAYwxB,gBAAgBje,GAAwC,CAAC,GACrE+d,EAAIG,cACJJ,MACAf,EAAGnwB,QACP,IAEEuxB,EAAmB,IAAIvhE,SAAQ6gC,MAAO5gC,EAASC,KACjD,IACIghE,EAAWjhE,EACX,MAAMuhE,EAAoB,GAC1B,IAAK,IAAI15D,EAAI,EAAGA,EAAIq4C,EAAuB/6C,SAAU0C,EAAG,CACpD,MAAM25D,EAAKthB,EAAuBr4C,GAGlC,GAFK23D,EAAciC,iBACfjC,EAAciC,eAAiB,IAC/BD,EAAI,CACJ,MAAME,EAAeF,EAAGlgB,OAAO,GAAGzjB,KAC5B8jC,EAAkBH,EAAGlgB,OAAO,GAAGzjB,MAC/B,QAAEqhC,EAAO,QAAE5rC,SAAkBkuC,EAAGr4D,MAAM,CAAE,CAACu4D,GAAe3mC,EAAQlzB,GAAI,CAAC85D,GAAkBrC,EAAQz3D,MAC7F23D,EAAchf,sBAAsB34C,IAAM,CAAC,IACnD05D,EAAkB30D,KAAK,CAAEsyD,UAAS5rC,YAClCksC,EAAciC,eAAe70D,KAAK0mB,EACtC,KACK,CACD,MAAM4rC,EAAUnkC,EAAQlzB,GAAGmzB,SACrB1H,EAAU,CAAC,EACjBiuC,EAAkB30D,KAAK,CAAEsyD,UAAS5rC,YAClCksC,EAAciC,eAAe70D,KAAK0mB,EACtC,CACJ,CAEAtzB,QWpGjB4gC,eAAuCkI,EAAUmX,EAAYG,EAAiBE,EAASshB,EAAqBtuC,EAASktC,GACxH,IAAIqB,QCADjhC,eAAuCtyB,EAAMgxD,EAAShc,EAAQhD,EAASif,EAAmBjsC,EAASktC,GACtG,IAAKltC,EAAQmuC,eACT,MAAM,IAAIp/C,MAAM,0CACpB,GAAI/T,EAAKnJ,SAAWm6D,EAAQn6D,QAAUmJ,EAAKnJ,SAAWmuB,EAAQmuC,eAAet8D,QAAUmJ,EAAKnJ,SAAWm7C,EAAQn7C,OAC3G,MAAM,IAAIkd,MAAM,mEACpB,OAAO,IAAItiB,SAAQ,SAAUC,EAASC,GAClC,MAAM4gC,EAAS,IAAIC,OAAO,IAAIC,IAAI,mBAClCF,EAAOG,YAAY,CACf8gC,YAAaxzD,EACb8xC,gBAAiBkf,EACjBhc,OAAQA,EACRhwB,QAASA,EACTgtB,QAASA,EACTif,kBAAmBA,IAEvB,MAAMwC,EAAe,SAAYC,cAAc7e,IAAwCmI,WAAU,KAC7F,IACIzqB,GAAQM,WACZ,CACA,QACI4gC,EAAaV,aACjB,KAEJxgC,EAAOK,UAAY,EAAG5yB,MAAQgpC,QAAO2qB,YAAWC,WAAUxB,oBACjDtd,GAAM8e,IAAc9e,GAAMsd,IAI/BqB,EAAaV,cACT/pB,EACAr3C,EAAOq3C,GAEPt3C,EAAQiiE,GAEZ71D,YAAW,IAAMy0B,EAAOM,aAAa,MATjCq/B,GAAgBA,EAAa0B,EAAUxB,EAAcuB,EAShB,CAEjD,GACJ,CDrCwCE,CAAwBr5B,EAAUsX,EAAiBH,EAAYK,EAASshB,EAAqBtuC,EAASktC,GAE1I,OADAqB,EAA0BA,EAAwB50D,KAAKmwC,GE+OpD,SAAmB9uC,GACtB,MAAM1G,EAAM0G,EAAKnJ,OACjB,IAAIkP,EAAM,EACNogC,EAAe,EACnB,IAAK,IAAI5sC,EAAI,EAAGA,EAAID,IAAOC,EACvBwM,GAAO/F,EAAKzG,GACZ4sC,GAAgBzpC,KAAKgE,IAAIV,EAAKzG,GAAI,GAEtC,MAAM4M,EAAOJ,EAAMzM,EACbw6D,EAAgB,EAAMp3D,KAAKmM,KAAKs9B,EAAe7sC,EAAMoD,KAAKgE,IAAIyF,EAAM,IAC1E,IAAK,IAAI5M,EAAI,EAAGA,EAAID,IAAOC,EACvByG,EAAKzG,IAAMyG,EAAKzG,GAAK4M,GAAQ2tD,EACjC,OAAO9zD,CACX,CF5PkE+zD,CAAUjlB,KACjEykB,CACX,CX+F0CS,CAAwBf,EAAkBt0D,KAAKmwC,GAAOA,EAAG8hB,UAAU5b,EAAQgc,EAAShf,EAASif,EAAmBC,EAAeC,EAAU7lB,SAA6Bj6C,EAAY6gE,GAExM,CACA,MAAO98D,GACHzD,EAAOyD,EACX,KAEE8N,QAAY8vD,EAGlB,OAFApB,EAAGnwB,QACHmxB,EAAIG,cACG7vD,CACX,CACA,MAAMA,QAAYwvD,IAClB,GAAIrgB,GAAqBnvC,EAAK,CAC1B,MAAM+wD,EAAY,2BAA4BvwD,OAAO,6BACrD,IACI,MAAMwwD,QAAmBvrB,GAAgBzlC,EAAI,GAAIA,EAAI,GAAIguD,EAAc7f,eAAiB,IAAM6f,EAAc5f,cAAgB,GACtHge,EAAiBvxB,EAAMtR,QAAQsV,cAAc,oBAChChE,EAAMtR,QAAQ0nC,aAAa7E,GACnCv3D,MAAMwB,GAAM26D,EAAW36D,GAAGmF,aACjC8jC,IACAA,EAAYguB,MAAMC,gBAAkBnB,EAC5C,CACA,MAAOl6D,GACH,QAAW4zC,MAAM,gCACjB11C,QAAQ01C,MAAM5zC,EAClB,CACA,QACI6+D,EAAUxyB,OACd,CACJ,CACA,GAAIv+B,EAAK,CACL,MAAMovD,EAAYv0B,EAAMtR,QAAQ2tB,OAAO0X,EAAe,IAChDS,EAAYx0B,EAAMtR,QAAQ2tB,OAAO0X,EAAe,IAGtD,GAFAQ,EAAUv6D,MAAMwB,GAAM2J,EAAI,GAAG3J,KAC7Bg5D,EAAUx6D,MAAMwB,GAAM2J,EAAI,GAAG3J,KACzB63D,EACA,IACI,MAAMgD,EAAgBhD,EAAmBpe,OAAO,GAAGzjB,KAC7C8kC,EAAgBjD,EAAmBpe,OAAO,GAAGzjB,WAC7C6hC,EACDzd,QAAQ,CAAE,CAACygB,GAAgB9B,EAAW,CAAC+B,GAAgB9B,KAAclB,IACrEvwD,MAAK,EACd,CACA,MAAO1L,GACH,QAAW4zC,MAAM,0BACjB11C,QAAQ01C,MAAM5zC,EAClB,CAEJ,GAAIotC,EAGA,OAFA,qBAAsBA,EAAYlI,MAAM,GACxCkI,EAAYjB,QAAU,+BACfiB,CAEf,CACJ,CACA,MAAOptC,GACH,QAAW4zC,MAAM,mCACjB11C,QAAQ01C,MAAM5zC,GACdw8D,EAAGnwB,QACCe,GACA,qBAAsBA,EAAYlI,MAAM,EAChD,GAEJ,OAAO,IAAI7oC,SAAQ6gC,MAAO5gC,EAASC,KAC/B,IACI,GAAIw/D,EAAUmD,cAAgBv2B,EAAM5B,SAAWg1B,EAAUmD,eAAiBnD,EAAU7lB,IAChF,WACKpzB,IAAI,UAAW,kEACfuhC,MAAKnnB,UACN,IACI,MAAMpvB,QAAYyuD,IAClBjgE,EAAQwR,EACZ,CACA,MAAO9N,GACHzD,EAAOyD,EACX,KAECm/D,UAAS,IAAM7iE,OAAQL,KACvBw0C,WAEJ,CACD,MAAM3iC,QAAYyuD,IAClBjgE,EAAQwR,EACZ,CACJ,CACA,MAAO9N,GACHzD,EAAOyD,EACX,IAER,CQxCYo/D,CAA6B5jB,EAAO7S,MAAO6S,EAAOnkB,QAASmkB,EAAOe,WACxEf,EAAOkB,gBACPlB,EAAOoB,QAASpB,EAAOgB,uBAAwBhB,EAAO4B,yBACpD5B,EAAOwB,iBAAkBxB,EAAOyB,kBAAmBzB,EAAO5rB,QAAS,CACnEsvC,aAAc,KACb1jB,EAAO0B,uBAAwB1B,EAAO2B,4BAC3C,MAAG1M,OACLkrB,EAAOxvB,QAAU,oDACjB,MAAMkzB,EAAW,KACf,MAAMtyD,EAAO8tC,EAAOL,aAAarlC,MAC3BmqD,EAAW3D,EAAO/vB,UAAU,MAC7B0zB,IAEevyD,GAAwB,IAAhBA,EAAKtL,OAI/B69D,EAAS3lB,UAAUhpB,OAAO,YAF1B2uC,EAAS3lB,UAAU72B,IAAI,YAEc,EAEzC+3B,EAAO3C,iBAAiB0P,WAAU,KAChC,IACEyX,GACF,CAAE,MAAOr/D,GACP9B,QAAQ01C,MAAM5zC,EAChB,KAEFq/D,GACF,G,CAKO,SAASE,GAAa7zD,GAC3B,IACE,MAAM8zD,EAAa,IAAI3X,GACvB,SAAU,qBACP/kC,IAAI08C,EAAWrjB,aACfkI,MAAK,IAAY,mCAChB,MAAM7I,EAASgkB,EAAWhkB,OAC1B,OAAO9vC,EAAKtG,KAAKm5C,QAAQ,CACvB98B,GAAI+5B,EAAO7S,MAAO57B,KAAMyuC,EAAOnkB,QAASukC,QAASpgB,EAAOkB,gBACxDE,QAASpB,EAAOoB,QAASif,kBAAmBrgB,EAAO4B,uBAAwBqiB,mBAAoBjkB,EAAOgB,uBACtGM,sBAAuBtB,EAAOsB,sBAAuBoL,UAAW1M,EAAO0M,UAAWC,cAAe3M,EAAO2M,cACxGtR,UAAW2E,EAAO3E,UAAW6oB,QAASlkB,EAAO4M,gBAC5C18C,MAAK,EACV,MAAG+kC,MACP,CAAE,MAAOlyC,GACP,MAAMohE,EAASphE,aAAeogB,MAAQpgB,EAAImpD,QAAUnpD,EAAI+K,WAClDs2D,EAAWrhE,aAAeogB,MAAQpgB,EAAI+G,WAAQrJ,EACpD,QAAW23C,MAAM,4BAA4B+rB,KAC7ChG,GAASkG,OAAOjsB,MAAM+rB,OAAQ1jE,EAAW2jE,EAC3C,CACF,CAkBO,SAAeE,GAAI,EAAD,a,2CAACr+C,EAAkB1U,EAAmB6uD,EAC7Dhf,EAAmBif,EAA8C4D,EACjE3iB,EAA8BoL,EAAoB,GAAIC,EAAwB,GAAItR,GAAqB,EAAO6oB,EAAkB,G,MAEhI,MAAMzmB,EAAkC,QAA7B,UAAWpM,UAAUprB,EAAG0Y,aAAK,QAAI,QAAWwgC,aAAal5C,GAC9Ds+C,EAA4Br1D,KAAKC,UAAU,CAC/CoC,KAAMA,EAAKxD,KAAK6D,GAAQA,EAAI+sB,OAC5ByhC,QAASA,EACThf,QAASA,EACTif,kBAAmBA,EACnB4D,mBAAoBA,EAAmBl2D,KAAKnE,IAAQ,MAAC,OAAU,QAAV,EAAAA,aAAI,EAAJA,EAAM+0B,YAAI,QAAI,IAAI,IACvE2iB,sBAAuBA,EACvBoL,UAAWA,EACXC,cAAeA,EACftR,UAAWA,EACX6oB,QAASA,IAKX,OAHAj+C,EAAGu+C,OAAOpqB,GAAiBmqB,GAEhB9mB,EAAG9L,UAAU,SAAU8yB,aAAc,CAAC/zB,MAAO,MAAOg0B,uBAAwB,iCAEzF,G,CAIO,SAAeC,GAA0BC,G,0CAC9C,MAAM3+C,EAAK2+C,EAAGlnB,UACd,GAAW,OAAPz3B,EACF,MAAM,IAAI9C,MAAM,0CAClB,MAAM0hD,EAAS5+C,EAAG44B,OAAOzE,IACzB,IAAKyqB,EACH,MAAM,IAAI1hD,MAAM,iDAClB,MAAMiR,EAAkCllB,KAAK41D,MAAMD,GAC7CtzD,EAAO6iB,EAAQ7iB,KAAKxD,KAAK29C,GAAYzlC,EAAG4V,QAAQ2tB,OAAOkC,KACvDuY,EAAqB7vC,EAAQ6vC,mBAAmBl2D,KAAKywC,GAAaA,EAAW,OAAQgL,OAAOhL,GAAY,OACxGlsC,QM5PDovB,eAA6Bzb,EAAI1U,EAAM6uD,EAAShf,EAASif,EAAmB4D,EAAoB3iB,EAAuBoL,EAAY,GAAIC,EAAgB,GAAItR,GAAY,EAAO6oB,EAAU,EAAGa,GAC9L,MAMMtnB,EAAK,QAAWpM,UAAUprB,EAAG0Y,OAAS,QAAWwgC,aAAal5C,GAC9D2+C,EAAKG,GAAOtnB,EAAG7L,YAAY,CAN7B+uB,WAAW,EACXC,WAAW,EACXC,eAAe,EACfC,eAAe,EAGqCpwB,MAAO,QAC/D,qBAAsBk0B,EAAGl7B,MAAM,GAC/B,MAAM64B,EAAiB,GACjBF,EAAoB,GAC1B,IAAK,IAAI15D,EAAI,EAAGA,EAAIs7D,EAAmBh+D,SAAU0C,EAAG,CAChD,MAAM25D,EAAK2B,EAAmBt7D,GAC9B,GAAI25D,EAAI,CACJ,MAAME,EAAeF,EAAGlgB,OAAO,GAAGzjB,KAC5B8jC,EAAkBH,EAAGlgB,OAAO,GAAGzjB,MAC/B,QAAEqhC,EAAO,QAAE5rC,SAAkBkuC,EAAGr4D,MAAM,CAAE,CAACu4D,GAAejxD,EAAK5I,GAAI,CAAC85D,GAAkBrC,EAAQz3D,MAC1F24C,EAAsB34C,IAAM,CAAC,IACrC05D,EAAkB30D,KAAK,CAAEsyD,UAAS5rC,YAClCmuC,EAAe70D,KAAK0mB,GAAW,CAAC,EACpC,KACK,CACD,MAAM4rC,EAAUzuD,EAAK5I,GAAGmzB,SAClB1H,EAAU,CAAC,EACjBiuC,EAAkB30D,KAAK,CAAEsyD,UAAS5rC,YAClCmuC,EAAe70D,KAAK0mB,EACxB,CACJ,CACA,MAAM4wC,EC/BH,SAAyB51D,EAAMs9C,EAAWtL,EAASif,EAAmB4E,EAAa1C,EAAgB5V,EAAgB,GAAItR,GAAY,EAAO6oB,EAAU,GACvJ,MAAMviC,EAAS,IAAIC,OAAO,IAAIC,IAAI,mBAGlC,IAAIkgC,EAqBJ,OAvBApgC,EAAOG,YAAY,CAAE1yB,OAAMs9C,YAAWtL,UAASif,oBAAmB4E,cAC9D1C,iBAAgB5V,gBAAetR,YAAW6oB,YAsBvC,CAAEvb,QApBO,IAAI9nD,SAAQ,CAACC,EAASC,KAClCghE,EAAWjhE,EACX6gC,EAAOK,UAAaiyB,IAChB/mD,YAAW,IAAMy0B,EAAOM,aAAa,KACrCnhC,EAAQmzD,EAAM7kD,KAAKkD,IAAI,EAE3BqvB,EAAOujC,QAAWjR,IACd/mD,YAAW,IAAMy0B,EAAOM,aAAa,KACrClhC,EAAOkzD,EAAM,CAChB,IAWahyB,UATA,KACd,IACI8/B,EAAS,MACTpgC,EAAOM,WACX,CACA,MAAOz9B,GACH9B,QAAQ01C,MAAM5zC,EAClB,GAGR,CDKsB2gE,CAAgB9C,EAAkBt0D,KAAKmwC,GAAOA,EAAG8hB,UAAUtT,EAAWtL,EAASif,EAAmBD,EAASmC,EAAgB5V,EAAetR,EAAW6oB,GACjKrB,EAAe,SAAYZ,eAAe7V,WAAW/jD,IACnDA,EAAKA,KAAKqsC,QAAQkrB,OAAOlvB,QAAUk0B,EAAGhF,MAAMlvB,OAASk0B,EAAGp+D,OAAS6B,EAAKA,MAAMqsC,QAAQluC,OACpFq8D,EAAaV,cACb6C,EAAU/iC,YACd,IAEE3vB,QAAY0yD,EAAUrc,QAC5B,IAAKr2C,EACD,OACJ,MAAMosD,EAAiBz4C,EAAG4V,QAAQsV,cAAc,iBAC1Ci0B,EAAiBn/C,EAAG4V,QAAQsV,cAAc,gBAC1Ck0B,EAAiBp/C,EAAG4V,QAAQsV,cAAc,gBAC1Cm0B,EAAkB,CAAC,EACzBhzD,EAAI+lC,SAAStmC,SAASnJ,IACb08D,EAAgB18D,KACjB08D,EAAgB18D,GAAK,GACzB08D,EAAgB18D,IAAI,IAExB,MAAM28D,EAAe,IAAIzhE,YAAYwO,EAAI0lC,OAAO/xC,QAChD,IAAK,IAAI0C,EAAI,EAAGA,EAAI2J,EAAIkzD,GAAGv/D,OAAQ0C,IAC/B48D,EAAajzD,EAAIkzD,GAAG78D,MACpB48D,EAAajzD,EAAImzD,GAAG98D,MAExB,MAAM+8D,EAAwBz/C,EAAG4V,QAAQsV,cAAc,sBACjDw0B,EAAsB1/C,EAAG4V,QAAQsV,cAAc,sBAC/CuwB,EAAYz7C,EAAG4V,QAAQ+pC,YAAYR,GACzC1D,EAAUv6D,MAAMwB,GAAM2J,EAAI0lC,OAAOrvC,KACjC,MAAMg5D,EAAY17C,EAAG4V,QAAQ+pC,YAAYP,GACzC1D,EAAUx6D,MAAMwB,GAAM2J,EAAI2lC,OAAOtvC,KACjC,MAAMk9D,EAAa5/C,EAAG4V,QAAQ0nC,aAAa7E,GAC3CmH,EAAW1+D,MAAMwB,GAAM2J,EAAI+lC,SAAS1vC,GAAGmF,aACvC,MAAMg4D,EAAoB7/C,EAAG4V,QAAQkqC,UAAUL,GAC/CI,EAAkB3+D,MAAMwB,GAAM28D,EAAgBhzD,EAAI+lC,SAAS1vC,MAC3D,MAAMq9D,EAAkB//C,EAAG4V,QAAQkqC,UAAUJ,GAmB7C,OAlBAK,EAAgB7+D,MAAMwB,GAAM48D,EAAa58D,KAKzCi8D,EAAGhF,MAAM/tB,YAAcuzB,EACvBR,EAAGhF,MAAM9tB,YAAcuzB,EACvBT,EAAGhF,MAAMC,gBAAkBnB,EAC3BkG,EAAGhF,MAAMlH,kBAAoB,EAC7BmK,EAAaV,cAII,IAAI3P,GAAyBoS,EAAIQ,EAAgBC,EAAgB,CAAEtlB,KAAMztC,EAAIkzD,GAAIpV,GAAI99C,EAAImzD,GAAI5N,YAAY,EAAO9B,QAAS,GAAKpB,0BAA0B,GAAQnP,GAA4B6N,MAC7M,qBAAsBuR,EAAGl7B,MAAM,GAIxB,CAAEk7B,KAAIlD,YAAWC,YAAWkE,aAAYC,oBAAmBE,kBACtE,CNyKoBC,CAAchgD,EAAI1U,EAAM6iB,EAAQgsC,QAAShsC,EAAQgtB,QACjEhtB,EAAQisC,kBAAmB4D,EAAoB7vC,EAAQktB,sBAAuBltB,EAAQs4B,UACtFt4B,EAAQu4B,cAAev4B,EAAQinB,UAAWjnB,EAAQ8vC,QAASU,GAC7D,OAAOtyD,aAAG,EAAHA,EAAKsyD,EACd,G,CAUO,SAAe10B,GAAI/C,EAAqB3M,EAAyBzQ,EAAoB0Q,EAAoB7B,G,0CAC9G,aAAaqO,GAAe,CAC1BE,MAAOA,EACP3M,SAAUA,EACVzQ,QAASA,EACT0Q,WAAYA,EACZ7B,MAAOA,GAEX,G,CAKO,SAAesnC,K,gDACdl4B,GAAOxC,GAAayE,mBAC5B,G,CAKO,SAAejD,K,gDACdgB,GAAOxC,GAAa26B,YAC5B,G,CAKO,SAAeC,K,2C3BuEf,W,mCACL,QAAWjH,aJ/VJ,YAAa1iC,YAClB,CACE,SAAUwN,YAAY,QAAS,CAAC,YAAa,OAAQ,MAAO,YAAa,SAAU,SAAU,SAAU,SAAU,QAAS,SAAU,QAAS,WAAY,UAAW,aAAc,UAAW,UAAW,SAAU,WAAY,UAAW,OAAQ,SAAU,UAAW,UAAW,UAAW,UAAW,cAAe,cAAe,SAAU,SAAU,WACzV,SAAUvQ,eAAe,SAAU,IAAI91B,WAAW,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,KAC1I,SAAU81B,eAAe,QAAS,IAAI91B,WAAW,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,KACzI,SAAU81B,eAAe,YAAa,IAAI91B,WAAW,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,KAC7I,SAAU81B,eAAe,YAAa,IAAI91B,WAAW,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,KAC7I,SAAU+1B,iBAAiB,aAAc,IAAI51B,aAAa,CAAC,KAAM,mBAAoB,mBAAoB,KAAM,kBAAmB,kBAAmB,kBAAmB,KAAM,kBAAmB,IAAK,iBAAkB,kBAAmB,mBAAoB,kBAAmB,KAAM,KAAM,kBAAmB,mBAAoB,KAAM,iBAAkB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,qBACxgB,SAAU41B,iBAAiB,SAAU,IAAI51B,aAAa,CAAC,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,IAAK,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,IAAK,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,qBAC1kB,SAAU41B,iBAAiB,QAAS,IAAI51B,aAAa,CAAC,KAAM,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,GAAI,iBAAkB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,GAAI,KAAM,iBAAkB,mBAAoB,iBAAkB,iBAAkB,KAAM,KAAM,iBAAkB,kBAAmB,kBAAmB,oBACtf,SAAU41B,iBAAiB,SAAU,IAAI51B,aAAa,CAAC,mBAAoB,kBAAmB,kBAAmB,GAAI,kBAAmB,mBAAoB,mBAAoB,mBAAoB,KAAM,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,KAAM,KAAM,mBAAoB,kBAAmB,mBAAoB,mBAAoB,KAAM,KAAM,GAAI,GAAI,mBAAoB,kBAAmB,mBAAoB,kBAAmB,KAAM,QAC7e,SAAU21B,eAAe,cAAe,IAAI91B,WAAW,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,QACtO,SAAU81B,eAAe,WAAY,IAAI91B,WAAW,CAAC,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,OAC3L,SAAU81B,eAAe,aAAc,IAAI91B,WAAW,CAAC,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,OACxL,SAAU81B,eAAe,WAAY,IAAI91B,WAAW,CAAC,IAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KAAM,KAAM,KAAM,IAAM,KAAM,IAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,QACnO,SAAU81B,eAAe,SAAU,IAAI91B,WAAW,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,KAC/I,SAAU81B,eAAe,WAAY,IAAI91B,WAAW,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,MACzK,SAAU81B,eAAe,cAAe,IAAI91B,WAAW,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,MAC5K,SAAU81B,eAAe,QAAS,IAAI91B,WAAW,CAAC,MAAO,MAAO,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,MAAO,MAAO,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,MAAO,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,MAAO,MAAO,MAAO,YI8UjP,QAAWkxC,QAAQ5C,KAAKoB,SAAU,EAClC,QAAWwB,QAAQ5C,KAAK6C,SAAS,WAAYzI,KAC7C,QAAWwI,QAAQuxB,kBAAmB,EACtC,QAAWvxB,QAAQwxB,gBAAiB,QAE9Bt4B,GAAOxC,GAAagJ,KAC5B,G,C2B9EE+xB,EACF,G,CAWO,SAAeC,GAAwB7nC,EAAcuC,EAAsBC,EAChFp1B,EAAaC,EAAao1B,G,0CAC1B,aAAaL,GAAgCsB,GAAQ,CAAC,EAAG,GAAI1D,EAAMuC,EAAcC,EAC/Ep1B,EAAKC,EAAKo1B,EACd,G,CAYO,SAAeqlC,GAA2B9nC,EAAc9jB,EAAeqmB,EAC5EC,EAAuBp1B,EAAaC,EAAao1B,G,0CACjD,aAAaL,GAAgCwB,GAAK,CAAC1nB,EAAO,GAAI8jB,EAAMuC,EAAcC,EAChFp1B,EAAKC,EAAKo1B,EACd,G,CASO,SAAeslC,GAAqBzgD,EAAkB0gD,EAC3D5tD,G,0CAEA,OAAO4wB,SADoBvD,GAAgB,CAACrtB,MAAOA,EAAOioB,OAAQqB,IAASpc,EAAI0gD,GAEjF,G,CAQO,SAAeC,GAAqB3gD,EAAkBsK,G,0CAC3D,aAAasa,GAAc5kB,EAAIsK,EACjC,G,CAQO,SAAes2C,GAA4B5gD,EAAkB0gD,G,0CAClE,OAAOv7B,GAAgBnlB,EAAI0gD,EAC7B,G,CAQO,SAAeG,GAA6B7gD,EAAkB0gD,G,0CACnE,OAAOr7B,GAAiBrlB,EAC1B,G,CAUO,SAAe8gD,GAAyB9gD,EAAkB+gD,EAAyBL,EAA0Bp2C,G,0CAClH,OAAO6Y,GAAgBnjB,EAAIsK,EAC7B,G,CAWO,SAAe02C,GAAkBhhD,EAAkB0gD,EACxD5tD,EAAe8B,G,0CAKf,OAAO8uB,SAJoBvD,GACzB,CAACrtB,MAAOA,EAAOioB,OAAQuB,GAAK1nB,MAAOA,GACnCoL,EAAI0gD,GAGR,G,CAQO,SAAeO,GAAkBjhD,EAAkBsK,G,0CACxD,aAAasa,GAAc5kB,EAAIsK,EACjC,G,CAQO,SAAe42C,GAAyBlhD,EAAkB0gD,G,0CAC/D,OAAOv7B,GAAgBnlB,EAAI0gD,EAC7B,G,CAQO,SAAeS,GAA0BnhD,EAAkB0gD,G,0CAChE,OAAOr7B,GAAiBrlB,EAC1B,G,CAWO,SAAeohD,GAAsBphD,EAAkB+gD,EAAyBL,EAA0Bp2C,G,0CAC/G,OAAO6Y,GAAgBnjB,EAAIsK,EAC7B,G,CAWO,SAAe+2C,GAAyBrhD,EAAkB0gD,EAC/D5tD,EAAenQ,EAAWsU,G,0CAK1B,OAAOysB,SAJoBvD,GACzB,CAACrtB,MAAOA,EAAOioB,OAAQsB,GAAYqE,OAAQ/9B,EAAGg+B,OAAQ1pB,GACtD+I,EAAI0gD,GAGR,G,CAQO,SAAeY,GAAyBthD,EAAkBsK,G,0CAC/D,aAAasa,GAAc5kB,EAAIsK,EACjC,G,CAQO,SAAei3C,GAAgCvhD,EAAkB0gD,G,0CACtE,OAAOv7B,GAAgBnlB,EAAI0gD,EAC7B,G,CAQO,SAAec,GAAiCxhD,EAAkB0gD,G,0CACvE,OAAOr7B,GAAiBrlB,EAC1B,G,CAUO,SAAeyhD,GAA6BzhD,EAAkB+gD,EAAyBL,EAA0Bp2C,G,0CACtH,OAAO6Y,GAAgBnjB,EAAIsK,EAC7B,G,CAWO,SAAeo3C,GAAsB1hD,EAAkB0gD,EAC5D5tD,EAAeguB,EAAe/b,G,0CAK9B,OAAO2e,SAJoBvD,GACzB,CAACrtB,MAAOA,EAAOioB,OAAQwB,GAASuE,MAAOA,EAAO/b,MAAOA,GACrD/E,EAAI0gD,GAGR,G,CAQO,SAAeiB,GAAsB3hD,EAAkBsK,G,0CAC5D,aAAasa,GAAc5kB,EAAIsK,EACjC,G,CAQO,SAAes3C,GAA6B5hD,EAAkB0gD,G,0CACnE,OAAOv7B,GAAgBnlB,EAAI0gD,EAC7B,G,CAQO,SAAemB,GAA8B7hD,EAAkB0gD,G,0CACpE,OAAOr7B,GAAiBrlB,EAC1B,G,CAUO,SAAe8hD,GAA0B9hD,EAAkB+gD,EAAyBL,EAA0Bp2C,G,0CACnH,OAAO6Y,GAAgBnjB,EAAIsK,EAC7B,G,CAUO,SAASsC,GAAMsa,EAAqBxoB,EAAmB2gC,EAAoB0iB,EAAsBnE,IEzbjG,SACL12B,EAAqB86B,EAAoBnyB,EAAmBjjB,GAE5D,MAAMue,EAAO,QAAW82B,aAAa/6B,EAAMxO,MAC3CyS,EAAKO,UAAU,SAAUw2B,QAAQ,YAAa1rC,YAAY,CAACwrC,EAASnyB,MACpE1E,EAAKO,UAAU,SAAUy2B,KAAKv1C,GAChC,CFqbEw1C,CAA4Bl7B,EAAOxoB,EAAQ2gC,E1BrUtC,SACLgjB,EAAmBxyB,EAAgB5zB,EAAgB,IAAM2hD,GAAoB,GAE7E1uB,GAAuBjzB,GAEvB,MAAMqmD,EAAa,IAAI1yB,GAAeyyB,EAAWxyB,EAAQ+tB,EAAU3hD,GAEnE,GAAI2hD,EAAU,CACZ,IAAK0E,EAAW/yB,aAAatzB,GAC3B,MAAM,IAAIiB,MAAM,GAAUqlD,qBAE5B,IAAKD,EAAWpyB,WACd,MAAM,IAAIhzB,MAAM,GAAUslD,mBAC9B,CAEA,MAAM51C,EAAQ01C,EAAW9xB,iBACnBiyB,EAAQ,YAAevmD,IAAI,EAAID,EAAO2Q,EAAMikB,KAAMjkB,EAAMkkB,MAM9D,OA9MK,SACLlkB,EAAoB3Q,EAAeymD,EAAmBC,EAAoBC,GAE1E,OAAO,YAAapsC,YAAY,CAC9B,SAAUwN,YAAY,qBACpB,CAAC,iBAAkB,gBAAiB,QAAS,GAAI2+B,EAAY,GAAIC,IACnE,SAAUtnC,SAAS,cAAenB,MAAO,iBACvC,CAACvN,EAAM+jB,KAAM/jB,EAAMgkB,KAAMhkB,EAAM8jB,MAAO,KAAM,KAAM,KAAM,OAC1D,SAAUpV,SAAS,cAAelB,IAAK,qBACrC,CAACxN,EAAMikB,KAAMjkB,EAAMkkB,KAAMlkB,EAAMskB,MAAO,KAAM,KAAM,KAAM,OAC1D,SAAU5V,SAAS,cAAenB,MAAO,cAAe,CAACvN,EAAMmkB,KAAMnkB,EAAMokB,KAAM,KAAM,KAAM,KAAM,KAAM,OACzG,SAAU1V,SAAS,cAAenB,MAAO,eAAgB,CAACvN,EAAMqkB,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,OACrG,SAAU3V,SAAS,cAAenB,MAAO,UAAW,CAACvN,EAAM5B,OAAQ,KAAM,KAAM,KAAM,KAAM,KAAM,OACjG,SAAUsQ,SAAS,cAAenB,MAChC,GAAGle,mBAAwB,CAACymD,EAAW,KAAM,KAAM,KAAM,KAAM,KAAM,QAE3E,CA8LSG,CAAiBj2C,EAAO3Q,EAAOwmD,EAJnB,6BAA6BJ,EAAU3pC,wEACGmX,EAAOnX,iBACjD,iBAAiB9L,EAAMqkB,MAAQwxB,EAAS,YAAc,qBAG3E,C0B6ScK,CAAYpkD,EAAQ2gC,EAAS0iB,EAAcnE,GAEzD,CAKO,SAASmF,KACdvjB,IACF,CAKO,SAAewjB,GAAsB97B,G,gDACpCsY,GAActY,EACtB,G,CAQO,SAAe+7B,GAAiB/7B,EAAqB3M,EAAyB5K,EAAmBuzC,G,0CACtG,MAAMriD,EAAKsiD,YAAYC,MACjBrpB,QAAeoc,GAA0B57B,EAAU5K,GACnD0zC,EAAKF,YAAYC,MACvB3mE,QAAQC,IAAI,QAAQ2mE,EAAKxiD,SACzB,MAAMumB,EAAaywB,GAAgCt9B,EAAUwf,GAC7Dt9C,QAAQC,IAAI,YAAYymE,YAAYC,MAAQC,SAE5Cj8B,EAAW1O,KAAOwO,EAAMtR,QAAQsV,cAAc9D,EAAW1O,MAEzDwO,EAAMtR,QAAQvU,IAAI+lB,GAEd87B,GACW,QAAW93B,UAAUlE,EAAMxO,MACnCgT,UAAU,SAAU8yB,aAAc,CACrC5yB,YAAajc,EAAO+I,KACpBmT,YAAazE,EAAW1O,KACxBoT,oBAAoB,GAG1B,G,CAWO,SAASw3B,GAAuCh+B,EAAkBi+B,EACvEC,EAAuBC,EAAsBC,EAAqBC,GAClE,OD5eK,SAA2Cr+B,EAAkBi+B,EAClEC,EAAuBC,EAAsBC,EAAqBC,GAClE,MAAM3jD,EAAK,OAAU4jD,KAAKC,WAAWv+B,EAAUi+B,EAAW,GACpDj4D,EAAO0U,EAAG4V,QACVkuC,EAAWx4D,EAAKujB,QAAQ00C,GAC9BO,EAASprC,KAAO,YAChB,MAAMqrC,EAASD,EAASjvC,aAClBrf,EAAI,IAAI1X,aAAawnC,GAAUgM,KAAKqyB,GAE1C,IAAIx/D,EAAM,EACNsY,EAAQ,EACRs7C,EAAO,EACP3c,EAAS,EAEb,IAAK,MAAMzvC,KAAOL,EAAM,CACtBK,EAAI+sB,KAAO,IAAIv0B,IACfsY,EAAQ5W,KAAKmF,SAAWw4D,EACxBzL,EAAOlyD,KAAKmF,SAAWy4D,EACvB,MAAMjgE,EAAMmI,EAAIkpB,aAChBumB,EAASv1C,KAAKmF,SAAW04D,EAEzB,IAAK,IAAIl5D,EAAI,EAAGA,EAAI86B,IAAY96B,EAC9BhH,EAAIgH,GAAKiS,EAAQjZ,EAAIgH,GAAKutD,EAC1BviD,EAAEhL,IAAMhH,EAAIgH,GAAK4wC,EAKnB,KAFEj3C,EAEEA,IAAQo/D,EACV,KACJ,CAEA9mD,EAAQ5W,KAAKmF,SAAWw4D,EACxBzL,EAAOlyD,KAAKmF,SAAWy4D,EAEvB,IAAK,IAAIj5D,EAAI,EAAGA,EAAI86B,IAAY96B,EAC9Bu5D,EAAOv5D,GAAKiS,EAAQsnD,EAAOv5D,GAAKgL,EAAEhL,GAIpC,OAFAc,EAAK+V,IAAI,SAAUqS,iBAAiB,IAAKle,EAAG8vB,IAErCtlB,CACT,CCmcSgkD,CAAkC1+B,EAAUi+B,EAAUC,EAAeC,EAAcC,EAAaC,EACzG,CAQO,SAAeM,GAAsBjkD,EAAkB0gD,G,0CAC5D,MAAMnmC,EAAWva,EAAG4V,QACdmkB,QAAeoc,GAA0B57B,EAAUmmC,GAEzD,OAAO,IAAIlkE,WAAWu9C,EAAOv8C,OAC/B,G,CAQO,SAAS0mE,GAAsBlkD,EAAkBsK,GACtD,MAAMiQ,EAAWva,EAAG4V,QACdmkB,EAAS,IAAIj8C,aAAcwsB,EAAqB9sB,QACtD,OAAO,YAAag5B,YAAY,CAACqhC,GAAgCt9B,EAAUwf,IAC7E,CAQO,SAASoqB,GAA6BnkD,EAAkB0gD,GAC7D,IAAK,MAAM/0D,KAAOqU,EAAG4V,QACnB,IAAKjqB,EAAIy5B,QAAQ,aACf,OAAO,EAEX,QAAKs7B,EAAct7B,QAAQ,YAI7B,CAQO,SAASg/B,GAA8BpkD,EAAkB0gD,GAC9D,OAAO1gD,EAAGslB,UAAY,GACxB,C","sources":["webpack://eda/./node_modules/@datagrok-libraries/math/src/dbscan/wasm/wasmDbscan.js","webpack://eda/./node_modules/@datagrok-libraries/ml/css/styles.css","webpack://eda/./node_modules/css-loader/dist/runtime/api.js","webpack://eda/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://eda/./node_modules/jstat/dist/jstat.js","webpack://eda/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://eda/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://eda/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://eda/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://eda/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://eda/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://eda/webpack/bootstrap","webpack://eda/webpack/runtime/amd options","webpack://eda/webpack/runtime/compat get default export","webpack://eda/webpack/runtime/define property getters","webpack://eda/webpack/runtime/get javascript chunk filename","webpack://eda/webpack/runtime/global","webpack://eda/webpack/runtime/harmony module decorator","webpack://eda/webpack/runtime/hasOwnProperty shorthand","webpack://eda/webpack/runtime/make namespace object","webpack://eda/webpack/runtime/publicPath","webpack://eda/webpack/runtime/jsonp chunk loading","webpack://eda/webpack/runtime/nonce","webpack://eda/external var \"grok\"","webpack://eda/external var \"ui\"","webpack://eda/external var \"DG\"","webpack://eda/./wasm/callWasm.js","webpack://eda/./wasm/callWasmForWebWorker.js","webpack://eda/./src/utils.ts","webpack://eda/./src/data-generators.ts","webpack://eda/./wasm/EDAAPI.js","webpack://eda/./src/svm.ts","webpack://eda/./src/pls/pls-constants.ts","webpack://eda/./src/pls/pls-tools.ts","webpack://eda/./src/stat-tools.ts","webpack://eda/./node_modules/@datagrok-libraries/math/src/dbscan/wasm/dbscan-worker-creator.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/getGPUDevice.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/multi-col-distances/webGPU-aggregation.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/multi-col-distances/webGPU-multicol-distances.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/types.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/types.js","webpack://eda/./node_modules/is-any-array/lib-esm/index.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/marcov-cluster.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/types.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/functionEditors/dimensionality-reduction-editor.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/functionEditors/consts.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/distance-matrix/types.js","webpack://eda/external var \"rxjs\"","webpack://eda/./node_modules/@datagrok-libraries/ml/css/styles.css?8c03","webpack://eda/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/multi-column-dim-reduction-editor.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/consts.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/reduce-dimensionality.js","webpack://eda/./src/missing-values-imputation/ui-constants.ts","webpack://eda/./src/missing-values-imputation/knn-imputer.ts","webpack://eda/./node_modules/@datagrok-libraries/utils/src/render-lines-on-sp.js","webpack://eda/./src/missing-values-imputation/ui.ts","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/mcl-editor.js","webpack://eda/./node_modules/@datagrok-libraries/utils/src/bit-array.js","webpack://eda/./src/regression.ts","webpack://eda/./src/package.ts","webpack://eda/./src/eda-tools.ts","webpack://eda/./src/eda-ui.ts","webpack://eda/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/embeddings-space.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/multi-dim-red-worker-creator.js","webpack://eda/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/clustering-view.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/index.js"],"sourcesContent":["\r\nexport var exportCppDbscanLib = (() => {\r\n var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;\r\n \r\n return (\r\nfunction(exportCppDbscanLib = {}) {\r\n\r\n// include: shell.js\r\n// The Module object: Our interface to the outside world. We import\r\n// and export values on it. There are various ways Module can be used:\r\n// 1. Not defined. We create it here\r\n// 2. A function parameter, function(Module) { ..generated code.. }\r\n// 3. pre-run appended it, var Module = {}; ..generated code..\r\n// 4. External script tag defines var Module.\r\n// We need to check if Module already exists (e.g. case 3 above).\r\n// Substitution will be replaced with actual code on later stage of the build,\r\n// this way Closure Compiler will not mangle it (e.g. case 4. above).\r\n// Note that if you want to run closure, and also to use Module\r\n// after the generated code, you will need to define var Module = {};\r\n// before the code. Then that object will be used in the code, and you\r\n// can continue to use Module afterwards as well.\r\nvar Module = typeof exportCppDbscanLib != 'undefined' ? exportCppDbscanLib : {};\r\n\r\n// Set up the promise that indicates the Module is initialized\r\nvar readyPromiseResolve, readyPromiseReject;\r\nModule['ready'] = new Promise(function(resolve, reject) {\r\n readyPromiseResolve = resolve;\r\n readyPromiseReject = reject;\r\n});\r\n\r\n// --pre-jses are emitted after the Module integration code, so that they can\r\n// refer to Module (if they choose; they can also define Module)\r\n\r\n\r\n// Sometimes an existing Module object exists with properties\r\n// meant to overwrite the default module functionality. Here\r\n// we collect those properties and reapply _after_ we configure\r\n// the current environment's defaults to avoid having to be so\r\n// defensive during initialization.\r\nvar moduleOverrides = Object.assign({}, Module);\r\n\r\nvar arguments_ = [];\r\nvar thisProgram = './this.program';\r\nvar quit_ = (status, toThrow) => {\r\n throw toThrow;\r\n};\r\n\r\n// Determine the runtime environment we are in. You can customize this by\r\n// setting the ENVIRONMENT setting at compile time (see settings.js).\r\n\r\n// Attempt to auto-detect the environment\r\nvar ENVIRONMENT_IS_WEB = typeof window == 'object';\r\nvar ENVIRONMENT_IS_WORKER = typeof importScripts == 'function';\r\n// N.b. Electron.js environment is simultaneously a NODE-environment, but\r\n// also a web environment.\r\nvar ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string';\r\nvar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\r\n\r\n// `/` should be present at the end if `scriptDirectory` is not empty\r\nvar scriptDirectory = '';\r\nfunction locateFile(path) {\r\n if (Module['locateFile']) {\r\n return Module['locateFile'](path, scriptDirectory);\r\n }\r\n return scriptDirectory + path;\r\n}\r\n\r\n// Hooks that are implemented differently in different runtime environments.\r\nvar read_,\r\n readAsync,\r\n readBinary,\r\n setWindowTitle;\r\n\r\n// Note that this includes Node.js workers when relevant (pthreads is enabled).\r\n// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and\r\n// ENVIRONMENT_IS_NODE.\r\nif (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\r\n if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled\r\n scriptDirectory = self.location.href;\r\n } else if (typeof document != 'undefined' && document.currentScript) { // web\r\n scriptDirectory = document.currentScript.src;\r\n }\r\n // When MODULARIZE, this JS may be executed later, after document.currentScript\r\n // is gone, so we saved it, and we use it here instead of any other info.\r\n if (_scriptDir) {\r\n scriptDirectory = _scriptDir;\r\n }\r\n // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.\r\n // otherwise, slice off the final part of the url to find the script directory.\r\n // if scriptDirectory does not contain a slash, lastIndexOf will return -1,\r\n // and scriptDirectory will correctly be replaced with an empty string.\r\n // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #),\r\n // they are removed because they could contain a slash.\r\n if (scriptDirectory.indexOf('blob:') !== 0) {\r\n scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, \"\").lastIndexOf('/')+1);\r\n } else {\r\n scriptDirectory = '';\r\n }\r\n\r\n // Differentiate the Web Worker from the Node Worker case, as reading must\r\n // be done differently.\r\n {\r\n// include: web_or_worker_shell_read.js\r\nread_ = (url) => {\r\n var xhr = new XMLHttpRequest();\r\n xhr.open('GET', url, false);\r\n xhr.send(null);\r\n return xhr.responseText;\r\n }\r\n\r\n if (ENVIRONMENT_IS_WORKER) {\r\n readBinary = (url) => {\r\n var xhr = new XMLHttpRequest();\r\n xhr.open('GET', url, false);\r\n xhr.responseType = 'arraybuffer';\r\n xhr.send(null);\r\n return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response));\r\n };\r\n }\r\n\r\n readAsync = (url, onload, onerror) => {\r\n var xhr = new XMLHttpRequest();\r\n xhr.open('GET', url, true);\r\n xhr.responseType = 'arraybuffer';\r\n xhr.onload = () => {\r\n if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0\r\n onload(xhr.response);\r\n return;\r\n }\r\n onerror();\r\n };\r\n xhr.onerror = onerror;\r\n xhr.send(null);\r\n }\r\n\r\n// end include: web_or_worker_shell_read.js\r\n }\r\n\r\n setWindowTitle = (title) => document.title = title;\r\n} else\r\n{\r\n}\r\n\r\nvar out = Module['print'] || console.log.bind(console);\r\nvar err = Module['printErr'] || console.warn.bind(console);\r\n\r\n// Merge back in the overrides\r\nObject.assign(Module, moduleOverrides);\r\n// Free the object hierarchy contained in the overrides, this lets the GC\r\n// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array.\r\nmoduleOverrides = null;\r\n\r\n// Emit code to handle expected values on the Module object. This applies Module.x\r\n// to the proper local x. This has two benefits: first, we only emit it if it is\r\n// expected to arrive, and second, by using a local everywhere else that can be\r\n// minified.\r\n\r\nif (Module['arguments']) arguments_ = Module['arguments'];\r\n\r\nif (Module['thisProgram']) thisProgram = Module['thisProgram'];\r\n\r\nif (Module['quit']) quit_ = Module['quit'];\r\n\r\n// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message\r\n\r\n\r\n// end include: shell.js\r\n// include: preamble.js\r\n// === Preamble library stuff ===\r\n\r\n// Documentation for the public APIs defined in this file must be updated in:\r\n// site/source/docs/api_reference/preamble.js.rst\r\n// A prebuilt local version of the documentation is available at:\r\n// site/build/text/docs/api_reference/preamble.js.txt\r\n// You can also build docs locally as HTML or other formats in site/\r\n// An online HTML version (which may be of a different version of Emscripten)\r\n// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html\r\n\r\nvar wasmBinary;\r\nif (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];\r\nvar noExitRuntime = Module['noExitRuntime'] || true;\r\n\r\nif (typeof WebAssembly != 'object') {\r\n abort('no native wasm support detected');\r\n}\r\n\r\n// Wasm globals\r\n\r\nvar wasmMemory;\r\n\r\n//========================================\r\n// Runtime essentials\r\n//========================================\r\n\r\n// whether we are quitting the application. no code should run after this.\r\n// set in exit() and abort()\r\nvar ABORT = false;\r\n\r\n// set by exit() and abort(). Passed to 'onExit' handler.\r\n// NOTE: This is also used as the process return code code in shell environments\r\n// but only when noExitRuntime is false.\r\nvar EXITSTATUS;\r\n\r\n/** @type {function(*, string=)} */\r\nfunction assert(condition, text) {\r\n if (!condition) {\r\n // This build was created without ASSERTIONS defined. `assert()` should not\r\n // ever be called in this configuration but in case there are callers in\r\n // the wild leave this simple abort() implemenation here for now.\r\n abort(text);\r\n }\r\n}\r\n\r\n// Memory management\r\n\r\nvar HEAP,\r\n/** @type {!Int8Array} */\r\n HEAP8,\r\n/** @type {!Uint8Array} */\r\n HEAPU8,\r\n/** @type {!Int16Array} */\r\n HEAP16,\r\n/** @type {!Uint16Array} */\r\n HEAPU16,\r\n/** @type {!Int32Array} */\r\n HEAP32,\r\n/** @type {!Uint32Array} */\r\n HEAPU32,\r\n/** @type {!Float32Array} */\r\n HEAPF32,\r\n/** @type {!Float64Array} */\r\n HEAPF64;\r\n\r\nfunction updateMemoryViews() {\r\n var b = wasmMemory.buffer;\r\n Module['HEAP8'] = HEAP8 = new Int8Array(b);\r\n Module['HEAP16'] = HEAP16 = new Int16Array(b);\r\n Module['HEAP32'] = HEAP32 = new Int32Array(b);\r\n Module['HEAPU8'] = HEAPU8 = new Uint8Array(b);\r\n Module['HEAPU16'] = HEAPU16 = new Uint16Array(b);\r\n Module['HEAPU32'] = HEAPU32 = new Uint32Array(b);\r\n Module['HEAPF32'] = HEAPF32 = new Float32Array(b);\r\n Module['HEAPF64'] = HEAPF64 = new Float64Array(b);\r\n}\r\n\r\n// include: runtime_init_table.js\r\n// In regular non-RELOCATABLE mode the table is exported\r\n// from the wasm module and this will be assigned once\r\n// the exports are available.\r\nvar wasmTable;\r\n\r\n// end include: runtime_init_table.js\r\n// include: runtime_stack_check.js\r\n// end include: runtime_stack_check.js\r\n// include: runtime_assertions.js\r\n// end include: runtime_assertions.js\r\nvar __ATPRERUN__ = []; // functions called before the runtime is initialized\r\nvar __ATINIT__ = []; // functions called during startup\r\nvar __ATEXIT__ = []; // functions called during shutdown\r\nvar __ATPOSTRUN__ = []; // functions called after the main() is called\r\n\r\nvar runtimeInitialized = false;\r\n\r\nvar runtimeKeepaliveCounter = 0;\r\n\r\nfunction keepRuntimeAlive() {\r\n return noExitRuntime || runtimeKeepaliveCounter > 0;\r\n}\r\n\r\nfunction preRun() {\r\n if (Module['preRun']) {\r\n if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];\r\n while (Module['preRun'].length) {\r\n addOnPreRun(Module['preRun'].shift());\r\n }\r\n }\r\n callRuntimeCallbacks(__ATPRERUN__);\r\n}\r\n\r\nfunction initRuntime() {\r\n runtimeInitialized = true;\r\n\r\n \r\n callRuntimeCallbacks(__ATINIT__);\r\n}\r\n\r\nfunction postRun() {\r\n\r\n if (Module['postRun']) {\r\n if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];\r\n while (Module['postRun'].length) {\r\n addOnPostRun(Module['postRun'].shift());\r\n }\r\n }\r\n\r\n callRuntimeCallbacks(__ATPOSTRUN__);\r\n}\r\n\r\nfunction addOnPreRun(cb) {\r\n __ATPRERUN__.unshift(cb);\r\n}\r\n\r\nfunction addOnInit(cb) {\r\n __ATINIT__.unshift(cb);\r\n}\r\n\r\nfunction addOnExit(cb) {\r\n}\r\n\r\nfunction addOnPostRun(cb) {\r\n __ATPOSTRUN__.unshift(cb);\r\n}\r\n\r\n// include: runtime_math.js\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc\r\n\r\n// end include: runtime_math.js\r\n// A counter of dependencies for calling run(). If we need to\r\n// do asynchronous work before running, increment this and\r\n// decrement it. Incrementing must happen in a place like\r\n// Module.preRun (used by emcc to add file preloading).\r\n// Note that you can add dependencies in preRun, even though\r\n// it happens right before run - run will be postponed until\r\n// the dependencies are met.\r\nvar runDependencies = 0;\r\nvar runDependencyWatcher = null;\r\nvar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled\r\n\r\nfunction getUniqueRunDependency(id) {\r\n return id;\r\n}\r\n\r\nfunction addRunDependency(id) {\r\n runDependencies++;\r\n\r\n if (Module['monitorRunDependencies']) {\r\n Module['monitorRunDependencies'](runDependencies);\r\n }\r\n\r\n}\r\n\r\nfunction removeRunDependency(id) {\r\n runDependencies--;\r\n\r\n if (Module['monitorRunDependencies']) {\r\n Module['monitorRunDependencies'](runDependencies);\r\n }\r\n\r\n if (runDependencies == 0) {\r\n if (runDependencyWatcher !== null) {\r\n clearInterval(runDependencyWatcher);\r\n runDependencyWatcher = null;\r\n }\r\n if (dependenciesFulfilled) {\r\n var callback = dependenciesFulfilled;\r\n dependenciesFulfilled = null;\r\n callback(); // can add another dependenciesFulfilled\r\n }\r\n }\r\n}\r\n\r\n/** @param {string|number=} what */\r\nfunction abort(what) {\r\n if (Module['onAbort']) {\r\n Module['onAbort'](what);\r\n }\r\n\r\n what = 'Aborted(' + what + ')';\r\n // TODO(sbc): Should we remove printing and leave it up to whoever\r\n // catches the exception?\r\n err(what);\r\n\r\n ABORT = true;\r\n EXITSTATUS = 1;\r\n\r\n what += '. Build with -sASSERTIONS for more info.';\r\n\r\n // Use a wasm runtime error, because a JS error might be seen as a foreign\r\n // exception, which means we'd run destructors on it. We need the error to\r\n // simply make the program stop.\r\n // FIXME This approach does not work in Wasm EH because it currently does not assume\r\n // all RuntimeErrors are from traps; it decides whether a RuntimeError is from\r\n // a trap or not based on a hidden field within the object. So at the moment\r\n // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that\r\n // allows this in the wasm spec.\r\n\r\n // Suppress closure compiler warning here. Closure compiler's builtin extern\r\n // defintion for WebAssembly.RuntimeError claims it takes no arguments even\r\n // though it can.\r\n // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed.\r\n /** @suppress {checkTypes} */\r\n var e = new WebAssembly.RuntimeError(what);\r\n\r\n readyPromiseReject(e);\r\n // Throw the error whether or not MODULARIZE is set because abort is used\r\n // in code paths apart from instantiation where an exception is expected\r\n // to be thrown when abort is called.\r\n throw e;\r\n}\r\n\r\n// include: memoryprofiler.js\r\n// end include: memoryprofiler.js\r\n// include: URIUtils.js\r\n// Prefix of data URIs emitted by SINGLE_FILE and related options.\r\nvar dataURIPrefix = 'data:application/octet-stream;base64,';\r\n\r\n// Indicates whether filename is a base64 data URI.\r\nfunction isDataURI(filename) {\r\n // Prefix of data URIs emitted by SINGLE_FILE and related options.\r\n return filename.startsWith(dataURIPrefix);\r\n}\r\n\r\n// Indicates whether filename is delivered via file protocol (as opposed to http/https)\r\nfunction isFileURI(filename) {\r\n return filename.startsWith('file://');\r\n}\r\n\r\n// end include: URIUtils.js\r\n// include: runtime_exceptions.js\r\n// end include: runtime_exceptions.js\r\nvar wasmBinaryFile;\r\n wasmBinaryFile = 'wasmDbscan.wasm';\r\n if (!isDataURI(wasmBinaryFile)) {\r\n wasmBinaryFile = locateFile(wasmBinaryFile);\r\n }\r\n\r\nfunction getBinary(file) {\r\n try {\r\n if (file == wasmBinaryFile && wasmBinary) {\r\n return new Uint8Array(wasmBinary);\r\n }\r\n if (readBinary) {\r\n return readBinary(file);\r\n }\r\n throw \"both async and sync fetching of the wasm failed\";\r\n }\r\n catch (err) {\r\n abort(err);\r\n }\r\n}\r\n\r\nfunction getBinaryPromise(binaryFile) {\r\n // If we don't have the binary yet, try to load it asynchronously.\r\n // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.\r\n // See https://github.com/github/fetch/pull/92#issuecomment-140665932\r\n // Cordova or Electron apps are typically loaded from a file:// url.\r\n // So use fetch if it is available and the url is not a file, otherwise fall back to XHR.\r\n if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {\r\n if (typeof fetch == 'function'\r\n ) {\r\n return fetch(binaryFile, { credentials: 'same-origin' }).then(function(response) {\r\n if (!response['ok']) {\r\n throw \"failed to load wasm binary file at '\" + binaryFile + \"'\";\r\n }\r\n return response['arrayBuffer']();\r\n }).catch(function () {\r\n return getBinary(binaryFile);\r\n });\r\n }\r\n }\r\n\r\n // Otherwise, getBinary should be able to get it synchronously\r\n return Promise.resolve().then(function() { return getBinary(binaryFile); });\r\n}\r\n\r\nfunction instantiateArrayBuffer(binaryFile, imports, receiver) {\r\n return getBinaryPromise(binaryFile).then(function(binary) {\r\n return WebAssembly.instantiate(binary, imports);\r\n }).then(function (instance) {\r\n return instance;\r\n }).then(receiver, function(reason) {\r\n err('failed to asynchronously prepare wasm: ' + reason);\r\n\r\n abort(reason);\r\n });\r\n}\r\n\r\nfunction instantiateAsync(binary, binaryFile, imports, callback) {\r\n if (!binary &&\r\n typeof WebAssembly.instantiateStreaming == 'function' &&\r\n !isDataURI(binaryFile) &&\r\n typeof fetch == 'function') {\r\n return fetch(binaryFile, { credentials: 'same-origin' }).then(function(response) {\r\n // Suppress closure warning here since the upstream definition for\r\n // instantiateStreaming only allows Promise<Repsponse> rather than\r\n // an actual Response.\r\n // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed.\r\n /** @suppress {checkTypes} */\r\n var result = WebAssembly.instantiateStreaming(response, imports);\r\n\r\n return result.then(\r\n callback,\r\n function(reason) {\r\n // We expect the most common failure cause to be a bad MIME type for the binary,\r\n // in which case falling back to ArrayBuffer instantiation should work.\r\n err('wasm streaming compile failed: ' + reason);\r\n err('falling back to ArrayBuffer instantiation');\r\n return instantiateArrayBuffer(binaryFile, imports, callback);\r\n });\r\n });\r\n } else {\r\n return instantiateArrayBuffer(binaryFile, imports, callback);\r\n }\r\n}\r\n\r\n// Create the wasm instance.\r\n// Receives the wasm imports, returns the exports.\r\nfunction createWasm() {\r\n // prepare imports\r\n var info = {\r\n 'env': wasmImports,\r\n 'wasi_snapshot_preview1': wasmImports,\r\n };\r\n // Load the wasm module and create an instance of using native support in the JS engine.\r\n // handle a generated wasm instance, receiving its exports and\r\n // performing other necessary setup\r\n /** @param {WebAssembly.Module=} module*/\r\n function receiveInstance(instance, module) {\r\n var exports = instance.exports;\r\n\r\n Module['asm'] = exports;\r\n\r\n wasmMemory = Module['asm']['memory'];\r\n updateMemoryViews();\r\n\r\n wasmTable = Module['asm']['__indirect_function_table'];\r\n\r\n addOnInit(Module['asm']['__wasm_call_ctors']);\r\n\r\n removeRunDependency('wasm-instantiate');\r\n\r\n return exports;\r\n }\r\n // wait for the pthread pool (if any)\r\n addRunDependency('wasm-instantiate');\r\n\r\n // Prefer streaming instantiation if available.\r\n function receiveInstantiationResult(result) {\r\n // 'result' is a ResultObject object which has both the module and instance.\r\n // receiveInstance() will swap in the exports (to Module.asm) so they can be called\r\n // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.\r\n // When the regression is fixed, can restore the above PTHREADS-enabled path.\r\n receiveInstance(result['instance']);\r\n }\r\n\r\n // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback\r\n // to manually instantiate the Wasm module themselves. This allows pages to\r\n // run the instantiation parallel to any other async startup actions they are\r\n // performing.\r\n // Also pthreads and wasm workers initialize the wasm instance through this\r\n // path.\r\n if (Module['instantiateWasm']) {\r\n\r\n try {\r\n return Module['instantiateWasm'](info, receiveInstance);\r\n } catch(e) {\r\n err('Module.instantiateWasm callback failed with error: ' + e);\r\n // If instantiation fails, reject the module ready promise.\r\n readyPromiseReject(e);\r\n }\r\n }\r\n\r\n // If instantiation fails, reject the module ready promise.\r\n instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult).catch(readyPromiseReject);\r\n return {}; // no exports yet; we'll fill them in later\r\n}\r\n\r\n// Globals used by JS i64 conversions (see makeSetValue)\r\nvar tempDouble;\r\nvar tempI64;\r\n\r\n// include: runtime_debug.js\r\n// end include: runtime_debug.js\r\n// === Body ===\r\n\r\n\r\n// end include: preamble.js\r\n\r\n /** @constructor */\r\n function ExitStatus(status) {\r\n this.name = 'ExitStatus';\r\n this.message = 'Program terminated with exit(' + status + ')';\r\n this.status = status;\r\n }\r\n\r\n function callRuntimeCallbacks(callbacks) {\r\n while (callbacks.length > 0) {\r\n // Pass the module as the first argument.\r\n callbacks.shift()(Module);\r\n }\r\n }\r\n\r\n \r\n /**\r\n * @param {number} ptr\r\n * @param {string} type\r\n */\r\n function getValue(ptr, type = 'i8') {\r\n if (type.endsWith('*')) type = '*';\r\n switch (type) {\r\n case 'i1': return HEAP8[((ptr)>>0)];\r\n case 'i8': return HEAP8[((ptr)>>0)];\r\n case 'i16': return HEAP16[((ptr)>>1)];\r\n case 'i32': return HEAP32[((ptr)>>2)];\r\n case 'i64': return HEAP32[((ptr)>>2)];\r\n case 'float': return HEAPF32[((ptr)>>2)];\r\n case 'double': return HEAPF64[((ptr)>>3)];\r\n case '*': return HEAPU32[((ptr)>>2)];\r\n default: abort('invalid type for getValue: ' + type);\r\n }\r\n }\r\n\r\n \r\n /**\r\n * @param {number} ptr\r\n * @param {number} value\r\n * @param {string} type\r\n */\r\n function setValue(ptr, value, type = 'i8') {\r\n if (type.endsWith('*')) type = '*';\r\n switch (type) {\r\n case 'i1': HEAP8[((ptr)>>0)] = value; break;\r\n case 'i8': HEAP8[((ptr)>>0)] = value; break;\r\n case 'i16': HEAP16[((ptr)>>1)] = value; break;\r\n case 'i32': HEAP32[((ptr)>>2)] = value; break;\r\n case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break;\r\n case 'float': HEAPF32[((ptr)>>2)] = value; break;\r\n case 'double': HEAPF64[((ptr)>>3)] = value; break;\r\n case '*': HEAPU32[((ptr)>>2)] = value; break;\r\n default: abort('invalid type for setValue: ' + type);\r\n }\r\n }\r\n\r\n /** @constructor */\r\n function ExceptionInfo(excPtr) {\r\n this.excPtr = excPtr;\r\n this.ptr = excPtr - 24;\r\n \r\n this.set_type = function(type) {\r\n HEAPU32[(((this.ptr)+(4))>>2)] = type;\r\n };\r\n \r\n this.get_type = function() {\r\n return HEAPU32[(((this.ptr)+(4))>>2)];\r\n };\r\n \r\n this.set_destructor = function(destructor) {\r\n HEAPU32[(((this.ptr)+(8))>>2)] = destructor;\r\n };\r\n \r\n this.get_destructor = function() {\r\n return HEAPU32[(((this.ptr)+(8))>>2)];\r\n };\r\n \r\n this.set_caught = function (caught) {\r\n caught = caught ? 1 : 0;\r\n HEAP8[(((this.ptr)+(12))>>0)] = caught;\r\n };\r\n \r\n this.get_caught = function () {\r\n return HEAP8[(((this.ptr)+(12))>>0)] != 0;\r\n };\r\n \r\n this.set_rethrown = function (rethrown) {\r\n rethrown = rethrown ? 1 : 0;\r\n HEAP8[(((this.ptr)+(13))>>0)] = rethrown;\r\n };\r\n \r\n this.get_rethrown = function () {\r\n return HEAP8[(((this.ptr)+(13))>>0)] != 0;\r\n };\r\n \r\n // Initialize native structure fields. Should be called once after allocated.\r\n this.init = function(type, destructor) {\r\n this.set_adjusted_ptr(0);\r\n this.set_type(type);\r\n this.set_destructor(destructor);\r\n }\r\n \r\n this.set_adjusted_ptr = function(adjustedPtr) {\r\n HEAPU32[(((this.ptr)+(16))>>2)] = adjustedPtr;\r\n };\r\n \r\n this.get_adjusted_ptr = function() {\r\n return HEAPU32[(((this.ptr)+(16))>>2)];\r\n };\r\n \r\n // Get pointer which is expected to be received by catch clause in C++ code. It may be adjusted\r\n // when the pointer is casted to some of the exception object base classes (e.g. when virtual\r\n // inheritance is used). When a pointer is thrown this method should return the thrown pointer\r\n // itself.\r\n this.get_exception_ptr = function() {\r\n // Work around a fastcomp bug, this code is still included for some reason in a build without\r\n // exceptions support.\r\n var isPointer = ___cxa_is_pointer_type(this.get_type());\r\n if (isPointer) {\r\n return HEAPU32[((this.excPtr)>>2)];\r\n }\r\n var adjusted = this.get_adjusted_ptr();\r\n if (adjusted !== 0) return adjusted;\r\n return this.excPtr;\r\n };\r\n }\r\n \r\n var exceptionLast = 0;\r\n \r\n var uncaughtExceptionCount = 0;\r\n function ___cxa_throw(ptr, type, destructor) {\r\n var info = new ExceptionInfo(ptr);\r\n // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception.\r\n info.init(type, destructor);\r\n exceptionLast = ptr;\r\n uncaughtExceptionCount++;\r\n throw exceptionLast;\r\n }\r\n\r\n function _abort() {\r\n abort('');\r\n }\r\n\r\n function _emscripten_memcpy_big(dest, src, num) {\r\n HEAPU8.copyWithin(dest, src, src + num);\r\n }\r\n\r\n function getHeapMax() {\r\n // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate\r\n // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side\r\n // for any code that deals with heap sizes, which would require special\r\n // casing all heap size related code to treat 0 specially.\r\n return 2147483648;\r\n }\r\n \r\n function emscripten_realloc_buffer(size) {\r\n var b = wasmMemory.buffer;\r\n try {\r\n // round size grow request up to wasm page size (fixed 64KB per spec)\r\n wasmMemory.grow((size - b.byteLength + 65535) >>> 16); // .grow() takes a delta compared to the previous size\r\n updateMemoryViews();\r\n return 1 /*success*/;\r\n } catch(e) {\r\n }\r\n // implicit 0 return to save code size (caller will cast \"undefined\" into 0\r\n // anyhow)\r\n }\r\n function _emscripten_resize_heap(requestedSize) {\r\n var oldSize = HEAPU8.length;\r\n requestedSize = requestedSize >>> 0;\r\n // With multithreaded builds, races can happen (another thread might increase the size\r\n // in between), so return a failure, and let the caller retry.\r\n \r\n // Memory resize rules:\r\n // 1. Always increase heap size to at least the requested size, rounded up\r\n // to next page multiple.\r\n // 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap\r\n // geometrically: increase the heap size according to\r\n // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most\r\n // overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB).\r\n // 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap\r\n // linearly: increase the heap size by at least\r\n // MEMORY_GROWTH_LINEAR_STEP bytes.\r\n // 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by\r\n // MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest\r\n // 4. If we were unable to allocate as much memory, it may be due to\r\n // over-eager decision to excessively reserve due to (3) above.\r\n // Hence if an allocation fails, cut down on the amount of excess\r\n // growth, in an attempt to succeed to perform a smaller allocation.\r\n \r\n // A limit is set for how much we can grow. We should not exceed that\r\n // (the wasm binary specifies it, so if we tried, we'd fail anyhow).\r\n var maxHeapSize = getHeapMax();\r\n if (requestedSize > maxHeapSize) {\r\n return false;\r\n }\r\n \r\n let alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple;\r\n \r\n // Loop through potential heap size increases. If we attempt a too eager\r\n // reservation that fails, cut down on the attempted size and reserve a\r\n // smaller bump instead. (max 3 times, chosen somewhat arbitrarily)\r\n for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\r\n var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth\r\n // but limit overreserving (default to capping at +96MB overgrowth at most)\r\n overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 );\r\n \r\n var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));\r\n \r\n var replacement = emscripten_realloc_buffer(newSize);\r\n if (replacement) {\r\n \r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function getCFunc(ident) {\r\n var func = Module['_' + ident]; // closure exported function\r\n return func;\r\n }\r\n \r\n \r\n function writeArrayToMemory(array, buffer) {\r\n HEAP8.set(array, buffer);\r\n }\r\n \r\n function lengthBytesUTF8(str) {\r\n var len = 0;\r\n for (var i = 0; i < str.length; ++i) {\r\n // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code\r\n // unit, not a Unicode code point of the character! So decode\r\n // UTF16->UTF32->UTF8.\r\n // See http://unicode.org/faq/utf_bom.html#utf16-3\r\n var c = str.charCodeAt(i); // possibly a lead surrogate\r\n if (c <= 0x7F) {\r\n len++;\r\n } else if (c <= 0x7FF) {\r\n len += 2;\r\n } else if (c >= 0xD800 && c <= 0xDFFF) {\r\n len += 4; ++i;\r\n } else {\r\n len += 3;\r\n }\r\n }\r\n return len;\r\n }\r\n \r\n function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {\r\n // Parameter maxBytesToWrite is not optional. Negative values, 0, null,\r\n // undefined and false each don't write out any bytes.\r\n if (!(maxBytesToWrite > 0))\r\n return 0;\r\n \r\n var startIdx = outIdx;\r\n var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.\r\n for (var i = 0; i < str.length; ++i) {\r\n // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code\r\n // unit, not a Unicode code point of the character! So decode\r\n // UTF16->UTF32->UTF8.\r\n // See http://unicode.org/faq/utf_bom.html#utf16-3\r\n // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description\r\n // and https://www.ietf.org/rfc/rfc2279.txt\r\n // and https://tools.ietf.org/html/rfc3629\r\n var u = str.charCodeAt(i); // possibly a lead surrogate\r\n if (u >= 0xD800 && u <= 0xDFFF) {\r\n var u1 = str.charCodeAt(++i);\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n if (outIdx >= endIdx) break;\r\n heap[outIdx++] = u;\r\n } else if (u <= 0x7FF) {\r\n if (outIdx + 1 >= endIdx) break;\r\n heap[outIdx++] = 0xC0 | (u >> 6);\r\n heap[outIdx++] = 0x80 | (u & 63);\r\n } else if (u <= 0xFFFF) {\r\n if (outIdx + 2 >= endIdx) break;\r\n heap[outIdx++] = 0xE0 | (u >> 12);\r\n heap[outIdx++] = 0x80 | ((u >> 6) & 63);\r\n heap[outIdx++] = 0x80 | (u & 63);\r\n } else {\r\n if (outIdx + 3 >= endIdx) break;\r\n heap[outIdx++] = 0xF0 | (u >> 18);\r\n heap[outIdx++] = 0x80 | ((u >> 12) & 63);\r\n heap[outIdx++] = 0x80 | ((u >> 6) & 63);\r\n heap[outIdx++] = 0x80 | (u & 63);\r\n }\r\n }\r\n // Null-terminate the pointer to the buffer.\r\n heap[outIdx] = 0;\r\n return outIdx - startIdx;\r\n }\r\n function stringToUTF8(str, outPtr, maxBytesToWrite) {\r\n return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite);\r\n }\r\n function stringToUTF8OnStack(str) {\r\n var size = lengthBytesUTF8(str) + 1;\r\n var ret = stackAlloc(size);\r\n stringToUTF8(str, ret, size);\r\n return ret;\r\n }\r\n \r\n var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined;\r\n \r\n /**\r\n * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given\r\n * array that contains uint8 values, returns a copy of that string as a\r\n * Javascript String object.\r\n * heapOrArray is either a regular array, or a JavaScript typed array view.\r\n * @param {number} idx\r\n * @param {number=} maxBytesToRead\r\n * @return {string}\r\n */\r\n function UTF8ArrayToString(heapOrArray, idx, maxBytesToRead) {\r\n var endIdx = idx + maxBytesToRead;\r\n var endPtr = idx;\r\n // TextDecoder needs to know the byte length in advance, it doesn't stop on\r\n // null terminator by itself. Also, use the length info to avoid running tiny\r\n // strings through TextDecoder, since .subarray() allocates garbage.\r\n // (As a tiny code save trick, compare endPtr against endIdx using a negation,\r\n // so that undefined means Infinity)\r\n while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;\r\n \r\n if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {\r\n return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));\r\n }\r\n var str = '';\r\n // If building with TextDecoder, we have already computed the string length\r\n // above, so test loop end condition against that\r\n while (idx < endPtr) {\r\n // For UTF8 byte structure, see:\r\n // http://en.wikipedia.org/wiki/UTF-8#Description\r\n // https://www.ietf.org/rfc/rfc2279.txt\r\n // https://tools.ietf.org/html/rfc3629\r\n var u0 = heapOrArray[idx++];\r\n if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; }\r\n var u1 = heapOrArray[idx++] & 63;\r\n if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; }\r\n var u2 = heapOrArray[idx++] & 63;\r\n if ((u0 & 0xF0) == 0xE0) {\r\n u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;\r\n } else {\r\n u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63);\r\n }\r\n \r\n if (u0 < 0x10000) {\r\n str += String.fromCharCode(u0);\r\n } else {\r\n var ch = u0 - 0x10000;\r\n str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));\r\n }\r\n }\r\n return str;\r\n }\r\n \r\n \r\n /**\r\n * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the\r\n * emscripten HEAP, returns a copy of that string as a Javascript String object.\r\n *\r\n * @param {number} ptr\r\n * @param {number=} maxBytesToRead - An optional length that specifies the\r\n * maximum number of bytes to read. You can omit this parameter to scan the\r\n * string until the first \u0000 byte. If maxBytesToRead is passed, and the string\r\n * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the\r\n * string will cut short at that byte index (i.e. maxBytesToRead will not\r\n * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing\r\n * frequent uses of UTF8ToString() with and without maxBytesToRead may throw\r\n * JS JIT optimizations off, so it is worth to consider consistently using one\r\n * @return {string}\r\n */\r\n function UTF8ToString(ptr, maxBytesToRead) {\r\n return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';\r\n }\r\n \r\n /**\r\n * @param {string|null=} returnType\r\n * @param {Array=} argTypes\r\n * @param {Arguments|Array=} args\r\n * @param {Object=} opts\r\n */\r\n function ccall(ident, returnType, argTypes, args, opts) {\r\n // For fast lookup of conversion functions\r\n var toC = {\r\n 'string': (str) => {\r\n var ret = 0;\r\n if (str !== null && str !== undefined && str !== 0) { // null string\r\n // at most 4 bytes per UTF-8 code point, +1 for the trailing '\\0'\r\n ret = stringToUTF8OnStack(str);\r\n }\r\n return ret;\r\n },\r\n 'array': (arr) => {\r\n var ret = stackAlloc(arr.length);\r\n writeArrayToMemory(arr, ret);\r\n return ret;\r\n }\r\n };\r\n \r\n function convertReturnValue(ret) {\r\n if (returnType === 'string') {\r\n \r\n return UTF8ToString(ret);\r\n }\r\n if (returnType === 'boolean') return Boolean(ret);\r\n return ret;\r\n }\r\n \r\n var func = getCFunc(ident);\r\n var cArgs = [];\r\n var stack = 0;\r\n if (args) {\r\n for (var i = 0; i < args.length; i++) {\r\n var converter = toC[argTypes[i]];\r\n if (converter) {\r\n if (stack === 0) stack = stackSave();\r\n cArgs[i] = converter(args[i]);\r\n } else {\r\n cArgs[i] = args[i];\r\n }\r\n }\r\n }\r\n var ret = func.apply(null, cArgs);\r\n function onDone(ret) {\r\n if (stack !== 0) stackRestore(stack);\r\n return convertReturnValue(ret);\r\n }\r\n \r\n ret = onDone(ret);\r\n return ret;\r\n }\r\n \r\n /**\r\n * @param {string=} returnType\r\n * @param {Array=} argTypes\r\n * @param {Object=} opts\r\n */\r\n function cwrap(ident, returnType, argTypes, opts) {\r\n // When the function takes numbers and returns a number, we can just return\r\n // the original function\r\n var numericArgs = !argTypes || argTypes.every((type) => type === 'number' || type === 'boolean');\r\n var numericRet = returnType !== 'string';\r\n if (numericRet && numericArgs && !opts) {\r\n return getCFunc(ident);\r\n }\r\n return function() {\r\n return ccall(ident, returnType, argTypes, arguments, opts);\r\n }\r\n }\r\n\r\nvar wasmImports = {\r\n \"__cxa_throw\": ___cxa_throw,\r\n \"abort\": _abort,\r\n \"emscripten_memcpy_big\": _emscripten_memcpy_big,\r\n \"emscripten_resize_heap\": _emscripten_resize_heap\r\n};\r\nvar asm = createWasm();\r\n/** @type {function(...*):?} */\r\nvar ___wasm_call_ctors = function() {\r\n return (___wasm_call_ctors = Module[\"asm\"][\"__wasm_call_ctors\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar _dbscan = Module[\"_dbscan\"] = function() {\r\n return (_dbscan = Module[\"_dbscan\"] = Module[\"asm\"][\"dbscan\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar ___errno_location = function() {\r\n return (___errno_location = Module[\"asm\"][\"__errno_location\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar _malloc = Module[\"_malloc\"] = function() {\r\n return (_malloc = Module[\"_malloc\"] = Module[\"asm\"][\"malloc\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar _free = Module[\"_free\"] = function() {\r\n return (_free = Module[\"_free\"] = Module[\"asm\"][\"free\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar stackSave = function() {\r\n return (stackSave = Module[\"asm\"][\"stackSave\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar stackRestore = function() {\r\n return (stackRestore = Module[\"asm\"][\"stackRestore\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar stackAlloc = function() {\r\n return (stackAlloc = Module[\"asm\"][\"stackAlloc\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar ___cxa_is_pointer_type = function() {\r\n return (___cxa_is_pointer_type = Module[\"asm\"][\"__cxa_is_pointer_type\"]).apply(null, arguments);\r\n};\r\n\r\n\r\n\r\n// include: postamble.js\r\n// === Auto-generated postamble setup entry stuff ===\r\n\r\nModule[\"ccall\"] = ccall;\r\nModule[\"cwrap\"] = cwrap;\r\n\r\n\r\nvar calledRun;\r\n\r\ndependenciesFulfilled = function runCaller() {\r\n // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)\r\n if (!calledRun) run();\r\n if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled\r\n};\r\n\r\nfunction run() {\r\n\r\n if (runDependencies > 0) {\r\n return;\r\n }\r\n\r\n preRun();\r\n\r\n // a preRun added a dependency, run will be called later\r\n if (runDependencies > 0) {\r\n return;\r\n }\r\n\r\n function doRun() {\r\n // run may have just been called through dependencies being fulfilled just in this very frame,\r\n // or while the async setStatus time below was happening\r\n if (calledRun) return;\r\n calledRun = true;\r\n Module['calledRun'] = true;\r\n\r\n if (ABORT) return;\r\n\r\n initRuntime();\r\n\r\n readyPromiseResolve(Module);\r\n if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();\r\n\r\n postRun();\r\n }\r\n\r\n if (Module['setStatus']) {\r\n Module['setStatus']('Running...');\r\n setTimeout(function() {\r\n setTimeout(function() {\r\n Module['setStatus']('');\r\n }, 1);\r\n doRun();\r\n }, 1);\r\n } else\r\n {\r\n doRun();\r\n }\r\n}\r\n\r\nif (Module['preInit']) {\r\n if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];\r\n while (Module['preInit'].length > 0) {\r\n Module['preInit'].pop()();\r\n }\r\n}\r\n\r\nrun();\r\n\r\n\r\n// end include: postamble.js\r\n\r\n\r\n return exportCppDbscanLib.ready\r\n}\r\n\r\n);\r\n})();\r\nif (typeof exports === 'object' && typeof module === 'object')\r\n module.exports = exportCppDbscanLib;\r\nelse if (typeof define === 'function' && define['amd'])\r\n define([], function() { return exportCppDbscanLib; });\r\nelse if (typeof exports === 'object')\r\n exports[\"exportCppDbscanLib\"] = exportCppDbscanLib;\r\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.scatter_plot_link {\n position: absolute!important;\n right: 10px;\n}\n\n.cliffs_grid {\n top: 10px;\n}\n\n.show_only_cliffs {\n top: 30px;\n}\n\n.ml-dim-reduction-settings-input i.grok-icon.grok-font-icon-settings {\n font-size: 18px;\n position: absolute;\n height: 28px;\n \n}\n\n.ml-dim-reduction-settings-input i.grok-icon.grok-font-icon-settings:not(.ml-dim-reduction-column-editor-input-root i) {\n left: -20px;\n}\n.dlg-dimensionality-reduction.ui-form, .dlg-markov-clustering.ui-form, .dlg-markov-clustering.ui-form .ui-form, .dlg-dimensionality-reduction.ui-form .ui-form {\n max-width: unset;\n}\n\n.ml-dim-reduction-column-editor-input-root label {\n display: none !important;\n}\n\n.dim-reduction-dialog-form > .ui-input-root, .dim-reduction-dialog-form > div > .ui-input-root {\n margin-left: 10px;\n}\n\n.ml-dim-reduction-column-editor-input-root input, .ml-dim-reduction-column-editor-input-root select {\n margin-left: 20px !important;\n}\n\nh3.ml-dim-reduction-column-editor-input-root {\n margin: 0 !important;\n}\n\n.ml-dim-reduction-column-editor-root, .ml-dim-reduction-column-editor-header-root {\n display: flex;\n flex-direction: row;\n align-items: center;\n margin-bottom: 10px !important;\n width: 700px !important;\n}\n\n.ml-dim-reduction-column-editor-column-title {\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.ml-dim-reduction-column-editor-header-root > h1:not(:first-child) {\n margin-left: 20px !important;\n}\n\n.ml-dim-reduction-column-editor-table-root .header > td:not(:first-child) {\n padding-left: 32px;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@datagrok-libraries/ml/css/styles.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,4BAA4B;IAC5B,WAAW;AACf;;AAEA;IACI,SAAS;AACb;;AAEA;IACI,SAAS;AACb;;AAEA;IACI,eAAe;IACf,kBAAkB;IAClB,YAAY;;AAEhB;;AAEA;IACI,WAAW;AACf;AACA;IACI,gBAAgB;AACpB;;AAEA;IACI,wBAAwB;AAC5B;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,4BAA4B;AAChC;;AAEA;IACI,oBAAoB;AACxB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,mBAAmB;IACnB,8BAA8B;IAC9B,uBAAuB;AAC3B;;AAEA;IACI,uBAAuB;IACvB,gBAAgB;AACpB;;AAEA;IACI,4BAA4B;AAChC;;AAEA;IACI,kBAAkB;AACtB\",\"sourcesContent\":[\".scatter_plot_link {\\n position: absolute!important;\\n right: 10px;\\n}\\n\\n.cliffs_grid {\\n top: 10px;\\n}\\n\\n.show_only_cliffs {\\n top: 30px;\\n}\\n\\n.ml-dim-reduction-settings-input i.grok-icon.grok-font-icon-settings {\\n font-size: 18px;\\n position: absolute;\\n height: 28px;\\n \\n}\\n\\n.ml-dim-reduction-settings-input i.grok-icon.grok-font-icon-settings:not(.ml-dim-reduction-column-editor-input-root i) {\\n left: -20px;\\n}\\n.dlg-dimensionality-reduction.ui-form, .dlg-markov-clustering.ui-form, .dlg-markov-clustering.ui-form .ui-form, .dlg-dimensionality-reduction.ui-form .ui-form {\\n max-width: unset;\\n}\\n\\n.ml-dim-reduction-column-editor-input-root label {\\n display: none !important;\\n}\\n\\n.dim-reduction-dialog-form > .ui-input-root, .dim-reduction-dialog-form > div > .ui-input-root {\\n margin-left: 10px;\\n}\\n\\n.ml-dim-reduction-column-editor-input-root input, .ml-dim-reduction-column-editor-input-root select {\\n margin-left: 20px !important;\\n}\\n\\nh3.ml-dim-reduction-column-editor-input-root {\\n margin: 0 !important;\\n}\\n\\n.ml-dim-reduction-column-editor-root, .ml-dim-reduction-column-editor-header-root {\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n margin-bottom: 10px !important;\\n width: 700px !important;\\n}\\n\\n.ml-dim-reduction-column-editor-column-title {\\n text-overflow: ellipsis;\\n overflow: hidden;\\n}\\n\\n.ml-dim-reduction-column-editor-header-root > h1:not(:first-child) {\\n margin-left: 20px !important;\\n}\\n\\n.ml-dim-reduction-column-editor-table-root .header > td:not(:first-child) {\\n padding-left: 32px;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","(function (window, factory) {\n if (typeof exports === 'object') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define(factory);\n } else {\n window.jStat = factory();\n }\n})(this, function () {\nvar jStat = (function(Math, undefined) {\n\n// For quick reference.\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\nvar toString = Object.prototype.toString;\n\n// Calculate correction for IEEE error\n// TODO: This calculation can be improved.\nfunction calcRdx(n, m) {\n var val = n > m ? n : m;\n return Math.pow(10,\n 17 - ~~(Math.log(((val > 0) ? val : -val)) * Math.LOG10E));\n}\n\n\nvar isArray = Array.isArray || function isArray(arg) {\n return toString.call(arg) === '[object Array]';\n};\n\n\nfunction isFunction(arg) {\n return toString.call(arg) === '[object Function]';\n}\n\n\nfunction isNumber(num) {\n return (typeof num === 'number') ? num - num === 0 : false;\n}\n\n\n// Converts the jStat matrix to vector.\nfunction toVector(arr) {\n return concat.apply([], arr);\n}\n\n\n// The one and only jStat constructor.\nfunction jStat() {\n return new jStat._init(arguments);\n}\n\n\n// TODO: Remove after all references in src files have been removed.\njStat.fn = jStat.prototype;\n\n\n// By separating the initializer from the constructor it's easier to handle\n// always returning a new instance whether \"new\" was used or not.\njStat._init = function _init(args) {\n // If first argument is an array, must be vector or matrix.\n if (isArray(args[0])) {\n // Check if matrix.\n if (isArray(args[0][0])) {\n // See if a mapping function was also passed.\n if (isFunction(args[1]))\n args[0] = jStat.map(args[0], args[1]);\n // Iterate over each is faster than this.push.apply(this, args[0].\n for (var i = 0; i < args[0].length; i++)\n this[i] = args[0][i];\n this.length = args[0].length;\n\n // Otherwise must be a vector.\n } else {\n this[0] = isFunction(args[1]) ? jStat.map(args[0], args[1]) : args[0];\n this.length = 1;\n }\n\n // If first argument is number, assume creation of sequence.\n } else if (isNumber(args[0])) {\n this[0] = jStat.seq.apply(null, args);\n this.length = 1;\n\n // Handle case when jStat object is passed to jStat.\n } else if (args[0] instanceof jStat) {\n // Duplicate the object and pass it back.\n return jStat(args[0].toArray());\n\n // Unexpected argument value, return empty jStat object.\n // TODO: This is strange behavior. Shouldn't this throw or some such to let\n // the user know they had bad arguments?\n } else {\n this[0] = [];\n this.length = 1;\n }\n\n return this;\n};\njStat._init.prototype = jStat.prototype;\njStat._init.constructor = jStat;\n\n\n// Utility functions.\n// TODO: for internal use only?\njStat.utils = {\n calcRdx: calcRdx,\n isArray: isArray,\n isFunction: isFunction,\n isNumber: isNumber,\n toVector: toVector\n};\n\n\njStat._random_fn = Math.random;\njStat.setRandom = function setRandom(fn) {\n if (typeof fn !== 'function')\n throw new TypeError('fn is not a function');\n jStat._random_fn = fn;\n};\n\n\n// Easily extend the jStat object.\n// TODO: is this seriously necessary?\njStat.extend = function extend(obj) {\n var i, j;\n\n if (arguments.length === 1) {\n for (j in obj)\n jStat[j] = obj[j];\n return this;\n }\n\n for (i = 1; i < arguments.length; i++) {\n for (j in arguments[i])\n obj[j] = arguments[i][j];\n }\n\n return obj;\n};\n\n\n// Returns the number of rows in the matrix.\njStat.rows = function rows(arr) {\n return arr.length || 1;\n};\n\n\n// Returns the number of columns in the matrix.\njStat.cols = function cols(arr) {\n return arr[0].length || 1;\n};\n\n\n// Returns the dimensions of the object { rows: i, cols: j }\njStat.dimensions = function dimensions(arr) {\n return {\n rows: jStat.rows(arr),\n cols: jStat.cols(arr)\n };\n};\n\n\n// Returns a specified row as a vector or return a sub matrix by pick some rows\njStat.row = function row(arr, index) {\n if (isArray(index)) {\n return index.map(function(i) {\n return jStat.row(arr, i);\n })\n }\n return arr[index];\n};\n\n\n// return row as array\n// rowa([[1,2],[3,4]],0) -> [1,2]\njStat.rowa = function rowa(arr, i) {\n return jStat.row(arr, i);\n};\n\n\n// Returns the specified column as a vector or return a sub matrix by pick some\n// columns\njStat.col = function col(arr, index) {\n if (isArray(index)) {\n var submat = jStat.arange(arr.length).map(function() {\n return new Array(index.length);\n });\n index.forEach(function(ind, i){\n jStat.arange(arr.length).forEach(function(j) {\n submat[j][i] = arr[j][ind];\n });\n });\n return submat;\n }\n var column = new Array(arr.length);\n for (var i = 0; i < arr.length; i++)\n column[i] = [arr[i][index]];\n return column;\n};\n\n\n// return column as array\n// cola([[1,2],[3,4]],0) -> [1,3]\njStat.cola = function cola(arr, i) {\n return jStat.col(arr, i).map(function(a){ return a[0] });\n};\n\n\n// Returns the diagonal of the matrix\njStat.diag = function diag(arr) {\n var nrow = jStat.rows(arr);\n var res = new Array(nrow);\n for (var row = 0; row < nrow; row++)\n res[row] = [arr[row][row]];\n return res;\n};\n\n\n// Returns the anti-diagonal of the matrix\njStat.antidiag = function antidiag(arr) {\n var nrow = jStat.rows(arr) - 1;\n var res = new Array(nrow);\n for (var i = 0; nrow >= 0; nrow--, i++)\n res[i] = [arr[i][nrow]];\n return res;\n};\n\n// Transpose a matrix or array.\njStat.transpose = function transpose(arr) {\n var obj = [];\n var objArr, rows, cols, j, i;\n\n // Make sure arr is in matrix format.\n if (!isArray(arr[0]))\n arr = [arr];\n\n rows = arr.length;\n cols = arr[0].length;\n\n for (i = 0; i < cols; i++) {\n objArr = new Array(rows);\n for (j = 0; j < rows; j++)\n objArr[j] = arr[j][i];\n obj.push(objArr);\n }\n\n // If obj is vector, return only single array.\n return obj.length === 1 ? obj[0] : obj;\n};\n\n\n// Map a function to an array or array of arrays.\n// \"toAlter\" is an internal variable.\njStat.map = function map(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n for (col = 0; col < ncol; col++)\n res[row][col] = func(arr[row][col], row, col);\n }\n\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Cumulatively combine the elements of an array or array of arrays using a function.\njStat.cumreduce = function cumreduce(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n if (ncol > 0)\n res[row][0] = arr[row][0];\n for (col = 1; col < ncol; col++)\n res[row][col] = func(res[row][col-1], arr[row][col]);\n }\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Destructively alter an array.\njStat.alter = function alter(arr, func) {\n return jStat.map(arr, func, true);\n};\n\n\n// Generate a rows x cols matrix according to the supplied function.\njStat.create = function create(rows, cols, func) {\n var res = new Array(rows);\n var i, j;\n\n if (isFunction(cols)) {\n func = cols;\n cols = rows;\n }\n\n for (i = 0; i < rows; i++) {\n res[i] = new Array(cols);\n for (j = 0; j < cols; j++)\n res[i][j] = func(i, j);\n }\n\n return res;\n};\n\n\nfunction retZero() { return 0; }\n\n\n// Generate a rows x cols matrix of zeros.\njStat.zeros = function zeros(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retZero);\n};\n\n\nfunction retOne() { return 1; }\n\n\n// Generate a rows x cols matrix of ones.\njStat.ones = function ones(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retOne);\n};\n\n\n// Generate a rows x cols matrix of uniformly random numbers.\njStat.rand = function rand(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, jStat._random_fn);\n};\n\n\nfunction retIdent(i, j) { return i === j ? 1 : 0; }\n\n\n// Generate an identity matrix of size row x cols.\njStat.identity = function identity(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retIdent);\n};\n\n\n// Tests whether a matrix is symmetric\njStat.symmetric = function symmetric(arr) {\n var size = arr.length;\n var row, col;\n\n if (arr.length !== arr[0].length)\n return false;\n\n for (row = 0; row < size; row++) {\n for (col = 0; col < size; col++)\n if (arr[col][row] !== arr[row][col])\n return false;\n }\n\n return true;\n};\n\n\n// Set all values to zero.\njStat.clear = function clear(arr) {\n return jStat.alter(arr, retZero);\n};\n\n\n// Generate sequence.\njStat.seq = function seq(min, max, length, func) {\n if (!isFunction(func))\n func = false;\n\n var arr = [];\n var hival = calcRdx(min, max);\n var step = (max * hival - min * hival) / ((length - 1) * hival);\n var current = min;\n var cnt;\n\n // Current is assigned using a technique to compensate for IEEE error.\n // TODO: Needs better implementation.\n for (cnt = 0;\n current <= max && cnt < length;\n cnt++, current = (min * hival + step * hival * cnt) / hival) {\n arr.push((func ? func(current, cnt) : current));\n }\n\n return arr;\n};\n\n\n// arange(5) -> [0,1,2,3,4]\n// arange(1,5) -> [1,2,3,4]\n// arange(5,1,-1) -> [5,4,3,2]\njStat.arange = function arange(start, end, step) {\n var rl = [];\n var i;\n step = step || 1;\n if (end === undefined) {\n end = start;\n start = 0;\n }\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(i);\n }\n } else {\n for (i = start; i > end; i += step) {\n rl.push(i);\n }\n }\n return rl;\n};\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// slice(A,{row:{end:2},col:{start:1}}) -> [[2,3],[5,6]]\n// slice(A,1,{start:1}) -> [5,6]\n// as numpy code A[:2,1:]\njStat.slice = (function(){\n function _slice(list, start, end, step) {\n // note it's not equal to range.map mode it's a bug\n var i;\n var rl = [];\n var length = list.length;\n if (start === undefined && end === undefined && step === undefined) {\n return jStat.copy(list);\n }\n\n start = start || 0;\n end = end || list.length;\n start = start >= 0 ? start : length + start;\n end = end >= 0 ? end : length + end;\n step = step || 1;\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(list[i]);\n }\n } else {\n for (i = start; i > end;i += step) {\n rl.push(list[i]);\n }\n }\n return rl;\n }\n\n function slice(list, rcSlice) {\n var colSlice, rowSlice;\n rcSlice = rcSlice || {};\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return list[rcSlice.row][rcSlice.col];\n var row = jStat.rowa(list, rcSlice.row);\n colSlice = rcSlice.col || {};\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n }\n\n if (isNumber(rcSlice.col)) {\n var col = jStat.cola(list, rcSlice.col);\n rowSlice = rcSlice.row || {};\n return _slice(col, rowSlice.start, rowSlice.end, rowSlice.step);\n }\n\n rowSlice = rcSlice.row || {};\n colSlice = rcSlice.col || {};\n var rows = _slice(list, rowSlice.start, rowSlice.end, rowSlice.step);\n return rows.map(function(row) {\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n });\n }\n\n return slice;\n}());\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// sliceAssign(A,{row:{start:1},col:{start:1}},[[0,0],[0,0]])\n// A=[[1,2,3],[4,0,0],[7,0,0]]\njStat.sliceAssign = function sliceAssign(A, rcSlice, B) {\n var nl, ml;\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return A[rcSlice.row][rcSlice.col] = B;\n rcSlice.col = rcSlice.col || {};\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A.length, rcSlice.col.end),\n rcSlice.col.step);\n var m = rcSlice.row;\n nl.forEach(function(n, i) {\n A[m][n] = B[i];\n });\n return A;\n }\n\n if (isNumber(rcSlice.col)) {\n rcSlice.row = rcSlice.row || {};\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A[0].length, rcSlice.row.end),\n rcSlice.row.step);\n var n = rcSlice.col;\n ml.forEach(function(m, j) {\n A[m][n] = B[j];\n });\n return A;\n }\n\n if (B[0].length === undefined) {\n B = [B];\n }\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A.length, rcSlice.row.end),\n rcSlice.row.step);\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A[0].length, rcSlice.col.end),\n rcSlice.col.step);\n ml.forEach(function(m, i) {\n nl.forEach(function(n, j) {\n A[m][n] = B[i][j];\n });\n });\n return A;\n};\n\n\n// [1,2,3] ->\n// [[1,0,0],[0,2,0],[0,0,3]]\njStat.diagonal = function diagonal(diagArray) {\n var mat = jStat.zeros(diagArray.length, diagArray.length);\n diagArray.forEach(function(t, i) {\n mat[i][i] = t;\n });\n return mat;\n};\n\n\n// return copy of A\njStat.copy = function copy(A) {\n return A.map(function(row) {\n if (isNumber(row))\n return row;\n return row.map(function(t) {\n return t;\n });\n });\n};\n\n\n// TODO: Go over this entire implementation. Seems a tragic waste of resources\n// doing all this work. Instead, and while ugly, use new Function() to generate\n// a custom function for each static method.\n\n// Quick reference.\nvar jProto = jStat.prototype;\n\n// Default length.\njProto.length = 0;\n\n// For internal use only.\n// TODO: Check if they're actually used, and if they are then rename them\n// to _*\njProto.push = Array.prototype.push;\njProto.sort = Array.prototype.sort;\njProto.splice = Array.prototype.splice;\njProto.slice = Array.prototype.slice;\n\n\n// Return a clean array.\njProto.toArray = function toArray() {\n return this.length > 1 ? slice.call(this) : slice.call(this)[0];\n};\n\n\n// Map a function to a matrix or vector.\njProto.map = function map(func, toAlter) {\n return jStat(jStat.map(this, func, toAlter));\n};\n\n\n// Cumulatively combine the elements of a matrix or vector using a function.\njProto.cumreduce = function cumreduce(func, toAlter) {\n return jStat(jStat.cumreduce(this, func, toAlter));\n};\n\n\n// Destructively alter an array.\njProto.alter = function alter(func) {\n jStat.alter(this, func);\n return this;\n};\n\n\n// Extend prototype with methods that have no argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(func) {\n var self = this,\n results;\n // Check for callback.\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self));\n });\n return this;\n }\n results = jStat[passfunc](this);\n return isArray(results) ? jStat(results) : results;\n };\n })(funcs[i]);\n})('transpose clear symmetric rows cols dimensions diag antidiag'.split(' '));\n\n\n// Extend prototype with methods that have one argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(index, func) {\n var self = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self, index));\n });\n return this;\n }\n return jStat(jStat[passfunc](this, index));\n };\n })(funcs[i]);\n})('row col'.split(' '));\n\n\n// Extend prototype with simple shortcut methods.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('create zeros ones rand identity'.split(' '));\n\n\n// Exposing jStat.\nreturn jStat;\n\n}(Math));\n(function(jStat, Math) {\n\nvar isFunction = jStat.utils.isFunction;\n\n// Ascending functions for sort\nfunction ascNum(a, b) { return a - b; }\n\nfunction clip(arg, min, max) {\n return Math.max(min, Math.min(arg, max));\n}\n\n\n// sum of an array\njStat.sum = function sum(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n\n// sum squared\njStat.sumsqrd = function sumsqrd(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i] * arr[i];\n return sum;\n};\n\n\n// sum of squared errors of prediction (SSE)\njStat.sumsqerr = function sumsqerr(arr) {\n var mean = jStat.mean(arr);\n var sum = 0;\n var i = arr.length;\n var tmp;\n while (--i >= 0) {\n tmp = arr[i] - mean;\n sum += tmp * tmp;\n }\n return sum;\n};\n\n// sum of an array in each row\njStat.sumrow = function sumrow(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n// product of an array\njStat.product = function product(arr) {\n var prod = 1;\n var i = arr.length;\n while (--i >= 0)\n prod *= arr[i];\n return prod;\n};\n\n\n// minimum value of an array\njStat.min = function min(arr) {\n var low = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] < low)\n low = arr[i];\n return low;\n};\n\n\n// maximum value of an array\njStat.max = function max(arr) {\n var high = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] > high)\n high = arr[i];\n return high;\n};\n\n\n// unique values of an array\njStat.unique = function unique(arr) {\n var hash = {}, _arr = [];\n for(var i = 0; i < arr.length; i++) {\n if (!hash[arr[i]]) {\n hash[arr[i]] = true;\n _arr.push(arr[i]);\n }\n }\n return _arr;\n};\n\n\n// mean value of an array\njStat.mean = function mean(arr) {\n return jStat.sum(arr) / arr.length;\n};\n\n\n// mean squared error (MSE)\njStat.meansqerr = function meansqerr(arr) {\n return jStat.sumsqerr(arr) / arr.length;\n};\n\n\n// geometric mean of an array\njStat.geomean = function geomean(arr) {\n var logs = arr.map(Math.log)\n var meanOfLogs = jStat.mean(logs)\n return Math.exp(meanOfLogs)\n};\n\n\n// median of an array\njStat.median = function median(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n // check if array is even or odd, then return the appropriate\n return !(arrlen & 1)\n ? (_arr[(arrlen / 2) - 1 ] + _arr[(arrlen / 2)]) / 2\n : _arr[(arrlen / 2) | 0 ];\n};\n\n\n// cumulative sum of an array\njStat.cumsum = function cumsum(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a + b; });\n};\n\n\n// cumulative product of an array\njStat.cumprod = function cumprod(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a * b; });\n};\n\n\n// successive differences of a sequence\njStat.diff = function diff(arr) {\n var diffs = [];\n var arrLen = arr.length;\n var i;\n for (i = 1; i < arrLen; i++)\n diffs.push(arr[i] - arr[i - 1]);\n return diffs;\n};\n\n\n// ranks of an array\njStat.rank = function (arr) {\n var i;\n var distinctNumbers = [];\n var numberCounts = {};\n for (i = 0; i < arr.length; i++) {\n var number = arr[i];\n if (numberCounts[number]) {\n numberCounts[number]++;\n } else {\n numberCounts[number] = 1;\n distinctNumbers.push(number);\n }\n }\n\n var sortedDistinctNumbers = distinctNumbers.sort(ascNum);\n var numberRanks = {};\n var currentRank = 1;\n for (i = 0; i < sortedDistinctNumbers.length; i++) {\n var number = sortedDistinctNumbers[i];\n var count = numberCounts[number];\n var first = currentRank;\n var last = currentRank + count - 1;\n var rank = (first + last) / 2;\n numberRanks[number] = rank;\n currentRank += count;\n }\n\n return arr.map(function (number) {\n return numberRanks[number];\n });\n};\n\n\n// mode of an array\n// if there are multiple modes of an array, return all of them\n// is this the appropriate way of handling it?\njStat.mode = function mode(arr) {\n var arrLen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n var count = 1;\n var maxCount = 0;\n var numMaxCount = 0;\n var mode_arr = [];\n var i;\n\n for (i = 0; i < arrLen; i++) {\n if (_arr[i] === _arr[i + 1]) {\n count++;\n } else {\n if (count > maxCount) {\n mode_arr = [_arr[i]];\n maxCount = count;\n numMaxCount = 0;\n }\n // are there multiple max counts\n else if (count === maxCount) {\n mode_arr.push(_arr[i]);\n numMaxCount++;\n }\n // resetting count for new value in array\n count = 1;\n }\n }\n\n return numMaxCount === 0 ? mode_arr[0] : mode_arr;\n};\n\n\n// range of an array\njStat.range = function range(arr) {\n return jStat.max(arr) - jStat.min(arr);\n};\n\n// variance of an array\n// flag = true indicates sample instead of population\njStat.variance = function variance(arr, flag) {\n return jStat.sumsqerr(arr) / (arr.length - (flag ? 1 : 0));\n};\n\n// pooled variance of an array of arrays\njStat.pooledvariance = function pooledvariance(arr) {\n var sumsqerr = arr.reduce(function (a, samples) {return a + jStat.sumsqerr(samples);}, 0);\n var count = arr.reduce(function (a, samples) {return a + samples.length;}, 0);\n return sumsqerr / (count - arr.length);\n};\n\n// deviation of an array\njStat.deviation = function (arr) {\n var mean = jStat.mean(arr);\n var arrlen = arr.length;\n var dev = new Array(arrlen);\n for (var i = 0; i < arrlen; i++) {\n dev[i] = arr[i] - mean;\n }\n return dev;\n};\n\n// standard deviation of an array\n// flag = true indicates sample instead of population\njStat.stdev = function stdev(arr, flag) {\n return Math.sqrt(jStat.variance(arr, flag));\n};\n\n// pooled standard deviation of an array of arrays\njStat.pooledstdev = function pooledstdev(arr) {\n return Math.sqrt(jStat.pooledvariance(arr));\n};\n\n// mean deviation (mean absolute deviation) of an array\njStat.meandev = function meandev(arr) {\n var mean = jStat.mean(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - mean));\n }\n return jStat.mean(a);\n};\n\n\n// median deviation (median absolute deviation) of an array\njStat.meddev = function meddev(arr) {\n var median = jStat.median(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - median));\n }\n return jStat.median(a);\n};\n\n\n// coefficient of variation\njStat.coeffvar = function coeffvar(arr) {\n return jStat.stdev(arr) / jStat.mean(arr);\n};\n\n\n// quartiles of an array\njStat.quartiles = function quartiles(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n return [\n _arr[ Math.round((arrlen) / 4) - 1 ],\n _arr[ Math.round((arrlen) / 2) - 1 ],\n _arr[ Math.round((arrlen) * 3 / 4) - 1 ]\n ];\n};\n\n\n// Arbitary quantiles of an array. Direct port of the scipy.stats\n// implementation by Pierre GF Gerard-Marchant.\njStat.quantiles = function quantiles(arr, quantilesArray, alphap, betap) {\n var sortedArray = arr.slice().sort(ascNum);\n var quantileVals = [quantilesArray.length];\n var n = arr.length;\n var i, p, m, aleph, k, gamma;\n\n if (typeof alphap === 'undefined')\n alphap = 3 / 8;\n if (typeof betap === 'undefined')\n betap = 3 / 8;\n\n for (i = 0; i < quantilesArray.length; i++) {\n p = quantilesArray[i];\n m = alphap + p * (1 - alphap - betap);\n aleph = n * p + m;\n k = Math.floor(clip(aleph, 1, n - 1));\n gamma = clip(aleph - k, 0, 1);\n quantileVals[i] = (1 - gamma) * sortedArray[k - 1] + gamma * sortedArray[k];\n }\n\n return quantileVals;\n};\n\n// Return the k-th percentile of values in a range, where k is in the range 0..1, inclusive.\n// Passing true for the exclusive parameter excludes both endpoints of the range.\njStat.percentile = function percentile(arr, k, exclusive) {\n var _arr = arr.slice().sort(ascNum);\n var realIndex = k * (_arr.length + (exclusive ? 1 : -1)) + (exclusive ? 0 : 1);\n var index = parseInt(realIndex);\n var frac = realIndex - index;\n if (index + 1 < _arr.length) {\n return _arr[index - 1] + frac * (_arr[index] - _arr[index - 1]);\n } else {\n return _arr[index - 1];\n }\n}\n\n// The percentile rank of score in a given array. Returns the percentage\n// of all values in the input array that are less than (kind='strict') or\n// less or equal than (kind='weak') score. Default is weak.\njStat.percentileOfScore = function percentileOfScore(arr, score, kind) {\n var counter = 0;\n var len = arr.length;\n var strict = false;\n var value, i;\n\n if (kind === 'strict')\n strict = true;\n\n for (i = 0; i < len; i++) {\n value = arr[i];\n if ((strict && value < score) ||\n (!strict && value <= score)) {\n counter++;\n }\n }\n\n return counter / len;\n};\n\n\n// Histogram (bin count) data\njStat.histogram = function histogram(arr, binCnt) {\n binCnt = binCnt || 4;\n var first = jStat.min(arr);\n var binWidth = (jStat.max(arr) - first) / binCnt;\n var len = arr.length;\n var bins = [];\n var i;\n\n for (i = 0; i < binCnt; i++)\n bins[i] = 0;\n for (i = 0; i < len; i++)\n bins[Math.min(Math.floor(((arr[i] - first) / binWidth)), binCnt - 1)] += 1;\n\n return bins;\n};\n\n\n// covariance of two arrays\njStat.covariance = function covariance(arr1, arr2) {\n var u = jStat.mean(arr1);\n var v = jStat.mean(arr2);\n var arr1Len = arr1.length;\n var sq_dev = new Array(arr1Len);\n var i;\n\n for (i = 0; i < arr1Len; i++)\n sq_dev[i] = (arr1[i] - u) * (arr2[i] - v);\n\n return jStat.sum(sq_dev) / (arr1Len - 1);\n};\n\n\n// (pearson's) population correlation coefficient, rho\njStat.corrcoeff = function corrcoeff(arr1, arr2) {\n return jStat.covariance(arr1, arr2) /\n jStat.stdev(arr1, 1) /\n jStat.stdev(arr2, 1);\n};\n\n // (spearman's) rank correlation coefficient, sp\njStat.spearmancoeff = function (arr1, arr2) {\n arr1 = jStat.rank(arr1);\n arr2 = jStat.rank(arr2);\n //return pearson's correlation of the ranks:\n return jStat.corrcoeff(arr1, arr2);\n}\n\n\n// statistical standardized moments (general form of skew/kurt)\njStat.stanMoment = function stanMoment(arr, n) {\n var mu = jStat.mean(arr);\n var sigma = jStat.stdev(arr);\n var len = arr.length;\n var skewSum = 0;\n\n for (var i = 0; i < len; i++)\n skewSum += Math.pow((arr[i] - mu) / sigma, n);\n\n return skewSum / arr.length;\n};\n\n// (pearson's) moment coefficient of skewness\njStat.skewness = function skewness(arr) {\n return jStat.stanMoment(arr, 3);\n};\n\n// (pearson's) (excess) kurtosis\njStat.kurtosis = function kurtosis(arr) {\n return jStat.stanMoment(arr, 4) - 3;\n};\n\n\nvar jProto = jStat.prototype;\n\n\n// Extend jProto with method for calculating cumulative sums and products.\n// This differs from the similar extension below as cumsum and cumprod should\n// not be run again in the case fullbool === true.\n// If a matrix is passed, automatically assume operation should be done on the\n// columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('cumsum cumprod').split(' '));\n\n\n// Extend jProto with methods which don't require arguments and work on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n if (passfunc !== 'sumrow')\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return fullbool === true\n ? jStat[passfunc](jStat.utils.toVector(arr))\n : arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('sum sumsqrd sumsqerr sumrow product min max unique mean meansqerr ' +\n 'geomean median diff rank mode range variance deviation stdev meandev ' +\n 'meddev coeffvar quartiles histogram skewness kurtosis').split(' '));\n\n\n// Extend jProto with functions that take arguments. Operations on matrices are\n// done on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n var args = Array.prototype.slice.call(arguments);\n var callbackFunction;\n\n // If the last argument is a function, we assume it's a callback; we\n // strip the callback out and call the function again.\n if (isFunction(args[args.length - 1])) {\n callbackFunction = args[args.length - 1];\n var argsToPass = args.slice(0, args.length - 1);\n\n setTimeout(function() {\n callbackFunction.call(tmpthis,\n jProto[passfunc].apply(tmpthis, argsToPass));\n });\n return this;\n\n // Otherwise we curry the function args and call normally.\n } else {\n callbackFunction = undefined;\n var curriedFunction = function curriedFunction(vector) {\n return jStat[passfunc].apply(tmpthis, [vector].concat(args));\n }\n }\n\n // If this is a matrix, run column-by-column.\n if (this.length > 1) {\n tmpthis = tmpthis.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = curriedFunction(tmpthis[i]);\n return arr;\n }\n\n // Otherwise run on the vector.\n return curriedFunction(this[0]);\n };\n })(funcs[i]);\n})('quantiles percentileOfScore'.split(' '));\n\n}(jStat, Math));\n// Special functions //\n(function(jStat, Math) {\n\n// Log-gamma function\njStat.gammaln = function gammaln(x) {\n var j = 0;\n var cof = [\n 76.18009172947146, -86.50532032941677, 24.01409824083091,\n -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5\n ];\n var ser = 1.000000000190015;\n var xx, y, tmp;\n tmp = (y = xx = x) + 5.5;\n tmp -= (xx + 0.5) * Math.log(tmp);\n for (; j < 6; j++)\n ser += cof[j] / ++y;\n return Math.log(2.5066282746310005 * ser / xx) - tmp;\n};\n\n/*\n * log-gamma function to support poisson distribution sampling. The\n * algorithm comes from SPECFUN by Shanjie Zhang and Jianming Jin and their\n * book \"Computation of Special Functions\", 1996, John Wiley & Sons, Inc.\n */\njStat.loggam = function loggam(x) {\n var x0, x2, xp, gl, gl0;\n var k, n;\n\n var a = [8.333333333333333e-02, -2.777777777777778e-03,\n 7.936507936507937e-04, -5.952380952380952e-04,\n 8.417508417508418e-04, -1.917526917526918e-03,\n 6.410256410256410e-03, -2.955065359477124e-02,\n 1.796443723688307e-01, -1.39243221690590e+00];\n x0 = x;\n n = 0;\n if ((x == 1.0) || (x == 2.0)) {\n return 0.0;\n }\n if (x <= 7.0) {\n n = Math.floor(7 - x);\n x0 = x + n;\n }\n x2 = 1.0 / (x0 * x0);\n xp = 2 * Math.PI;\n gl0 = a[9];\n for (k = 8; k >= 0; k--) {\n gl0 *= x2;\n gl0 += a[k];\n }\n gl = gl0 / x0 + 0.5 * Math.log(xp) + (x0 - 0.5) * Math.log(x0) - x0;\n if (x <= 7.0) {\n for (k = 1; k <= n; k++) {\n gl -= Math.log(x0 - 1.0);\n x0 -= 1.0;\n }\n }\n return gl;\n}\n\n// gamma of x\njStat.gammafn = function gammafn(x) {\n var p = [-1.716185138865495, 24.76565080557592, -379.80425647094563,\n 629.3311553128184, 866.9662027904133, -31451.272968848367,\n -36144.413418691176, 66456.14382024054\n ];\n var q = [-30.8402300119739, 315.35062697960416, -1015.1563674902192,\n -3107.771671572311, 22538.118420980151, 4755.8462775278811,\n -134659.9598649693, -115132.2596755535];\n var fact = false;\n var n = 0;\n var xden = 0;\n var xnum = 0;\n var y = x;\n var i, z, yi, res;\n if (x > 171.6243769536076) {\n return Infinity;\n }\n if (y <= 0) {\n res = y % 1 + 3.6e-16;\n if (res) {\n fact = (!(y & 1) ? 1 : -1) * Math.PI / Math.sin(Math.PI * res);\n y = 1 - y;\n } else {\n return Infinity;\n }\n }\n yi = y;\n if (y < 1) {\n z = y++;\n } else {\n z = (y -= n = (y | 0) - 1) - 1;\n }\n for (i = 0; i < 8; ++i) {\n xnum = (xnum + p[i]) * z;\n xden = xden * z + q[i];\n }\n res = xnum / xden + 1;\n if (yi < y) {\n res /= yi;\n } else if (yi > y) {\n for (i = 0; i < n; ++i) {\n res *= y;\n y++;\n }\n }\n if (fact) {\n res = fact / res;\n }\n return res;\n};\n\n\n// lower incomplete gamma function, which is usually typeset with a\n// lower-case greek gamma as the function symbol\njStat.gammap = function gammap(a, x) {\n return jStat.lowRegGamma(a, x) * jStat.gammafn(a);\n};\n\n\n// The lower regularized incomplete gamma function, usually written P(a,x)\njStat.lowRegGamma = function lowRegGamma(a, x) {\n var aln = jStat.gammaln(a);\n var ap = a;\n var sum = 1 / a;\n var del = sum;\n var b = x + 1 - a;\n var c = 1 / 1.0e-30;\n var d = 1 / b;\n var h = d;\n var i = 1;\n // calculate maximum number of itterations required for a\n var ITMAX = -~(Math.log((a >= 1) ? a : 1 / a) * 8.5 + a * 0.4 + 17);\n var an;\n\n if (x < 0 || a <= 0) {\n return NaN;\n } else if (x < a + 1) {\n for (; i <= ITMAX; i++) {\n sum += del *= x / ++ap;\n }\n return (sum * Math.exp(-x + a * Math.log(x) - (aln)));\n }\n\n for (; i <= ITMAX; i++) {\n an = -i * (i - a);\n b += 2;\n d = an * d + b;\n c = b + an / c;\n d = 1 / d;\n h *= d * c;\n }\n\n return (1 - h * Math.exp(-x + a * Math.log(x) - (aln)));\n};\n\n// natural log factorial of n\njStat.factorialln = function factorialln(n) {\n return n < 0 ? NaN : jStat.gammaln(n + 1);\n};\n\n// factorial of n\njStat.factorial = function factorial(n) {\n return n < 0 ? NaN : jStat.gammafn(n + 1);\n};\n\n// combinations of n, m\njStat.combination = function combination(n, m) {\n // make sure n or m don't exceed the upper limit of usable values\n return (n > 170 || m > 170)\n ? Math.exp(jStat.combinationln(n, m))\n : (jStat.factorial(n) / jStat.factorial(m)) / jStat.factorial(n - m);\n};\n\n\njStat.combinationln = function combinationln(n, m){\n return jStat.factorialln(n) - jStat.factorialln(m) - jStat.factorialln(n - m);\n};\n\n\n// permutations of n, m\njStat.permutation = function permutation(n, m) {\n return jStat.factorial(n) / jStat.factorial(n - m);\n};\n\n\n// beta function\njStat.betafn = function betafn(x, y) {\n // ensure arguments are positive\n if (x <= 0 || y <= 0)\n return undefined;\n // make sure x + y doesn't exceed the upper limit of usable values\n return (x + y > 170)\n ? Math.exp(jStat.betaln(x, y))\n : jStat.gammafn(x) * jStat.gammafn(y) / jStat.gammafn(x + y);\n};\n\n\n// natural logarithm of beta function\njStat.betaln = function betaln(x, y) {\n return jStat.gammaln(x) + jStat.gammaln(y) - jStat.gammaln(x + y);\n};\n\n\n// Evaluates the continued fraction for incomplete beta function by modified\n// Lentz's method.\njStat.betacf = function betacf(x, a, b) {\n var fpmin = 1e-30;\n var m = 1;\n var qab = a + b;\n var qap = a + 1;\n var qam = a - 1;\n var c = 1;\n var d = 1 - qab * x / qap;\n var m2, aa, del, h;\n\n // These q's will be used in factors that occur in the coefficients\n if (Math.abs(d) < fpmin)\n d = fpmin;\n d = 1 / d;\n h = d;\n\n for (; m <= 100; m++) {\n m2 = 2 * m;\n aa = m * (b - m) * x / ((qam + m2) * (a + m2));\n // One step (the even one) of the recurrence\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n h *= d * c;\n aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));\n // Next step of the recurrence (the odd one)\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n del = d * c;\n h *= del;\n if (Math.abs(del - 1.0) < 3e-7)\n break;\n }\n\n return h;\n};\n\n\n// Returns the inverse of the lower regularized inomplete gamma function\njStat.gammapinv = function gammapinv(p, a) {\n var j = 0;\n var a1 = a - 1;\n var EPS = 1e-8;\n var gln = jStat.gammaln(a);\n var x, err, t, u, pp, lna1, afac;\n\n if (p >= 1)\n return Math.max(100, a + 100 * Math.sqrt(a));\n if (p <= 0)\n return 0;\n if (a > 1) {\n lna1 = Math.log(a1);\n afac = Math.exp(a1 * (lna1 - 1) - gln);\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t * (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n x = Math.max(1e-3,\n a * Math.pow(1 - 1 / (9 * a) - x / (3 * Math.sqrt(a)), 3));\n } else {\n t = 1 - a * (0.253 + a * 0.12);\n if (p < t)\n x = Math.pow(p / t, 1 / a);\n else\n x = 1 - Math.log(1 - (p - t) / (1 - t));\n }\n\n for(; j < 12; j++) {\n if (x <= 0)\n return 0;\n err = jStat.lowRegGamma(a, x) - p;\n if (a > 1)\n t = afac * Math.exp(-(x - a1) + a1 * (Math.log(x) - lna1));\n else\n t = Math.exp(-x + a1 * Math.log(x) - gln);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * ((a - 1) / x - 1))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (Math.abs(t) < EPS * x)\n break;\n }\n\n return x;\n};\n\n\n// Returns the error function erf(x)\njStat.erf = function erf(x) {\n var cof = [-1.3026537197817094, 6.4196979235649026e-1, 1.9476473204185836e-2,\n -9.561514786808631e-3, -9.46595344482036e-4, 3.66839497852761e-4,\n 4.2523324806907e-5, -2.0278578112534e-5, -1.624290004647e-6,\n 1.303655835580e-6, 1.5626441722e-8, -8.5238095915e-8,\n 6.529054439e-9, 5.059343495e-9, -9.91364156e-10,\n -2.27365122e-10, 9.6467911e-11, 2.394038e-12,\n -6.886027e-12, 8.94487e-13, 3.13092e-13,\n -1.12708e-13, 3.81e-16, 7.106e-15,\n -1.523e-15, -9.4e-17, 1.21e-16,\n -2.8e-17];\n var j = cof.length - 1;\n var isneg = false;\n var d = 0;\n var dd = 0;\n var t, ty, tmp, res;\n\n if (x < 0) {\n x = -x;\n isneg = true;\n }\n\n t = 2 / (2 + x);\n ty = 4 * t - 2;\n\n for(; j > 0; j--) {\n tmp = d;\n d = ty * d - dd + cof[j];\n dd = tmp;\n }\n\n res = t * Math.exp(-x * x + 0.5 * (cof[0] + ty * d) - dd);\n return isneg ? res - 1 : 1 - res;\n};\n\n\n// Returns the complmentary error function erfc(x)\njStat.erfc = function erfc(x) {\n return 1 - jStat.erf(x);\n};\n\n\n// Returns the inverse of the complementary error function\njStat.erfcinv = function erfcinv(p) {\n var j = 0;\n var x, err, t, pp;\n if (p >= 2)\n return -100;\n if (p <= 0)\n return 100;\n pp = (p < 1) ? p : 2 - p;\n t = Math.sqrt(-2 * Math.log(pp / 2));\n x = -0.70711 * ((2.30753 + t * 0.27061) /\n (1 + t * (0.99229 + t * 0.04481)) - t);\n for (; j < 2; j++) {\n err = jStat.erfc(x) - pp;\n x += err / (1.12837916709551257 * Math.exp(-x * x) - x * err);\n }\n return (p < 1) ? x : -x;\n};\n\n\n// Returns the inverse of the incomplete beta function\njStat.ibetainv = function ibetainv(p, a, b) {\n var EPS = 1e-8;\n var a1 = a - 1;\n var b1 = b - 1;\n var j = 0;\n var lna, lnb, pp, t, u, err, x, al, h, w, afac;\n if (p <= 0)\n return 0;\n if (p >= 1)\n return 1;\n if (a >= 1 && b >= 1) {\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t* (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n al = (x * x - 3) / 6;\n h = 2 / (1 / (2 * a - 1) + 1 / (2 * b - 1));\n w = (x * Math.sqrt(al + h) / h) - (1 / (2 * b - 1) - 1 / (2 * a - 1)) *\n (al + 5 / 6 - 2 / (3 * h));\n x = a / (a + b * Math.exp(2 * w));\n } else {\n lna = Math.log(a / (a + b));\n lnb = Math.log(b / (a + b));\n t = Math.exp(a * lna) / a;\n u = Math.exp(b * lnb) / b;\n w = t + u;\n if (p < t / w)\n x = Math.pow(a * w * p, 1 / a);\n else\n x = 1 - Math.pow(b * w * (1 - p), 1 / b);\n }\n afac = -jStat.gammaln(a) - jStat.gammaln(b) + jStat.gammaln(a + b);\n for(; j < 10; j++) {\n if (x === 0 || x === 1)\n return x;\n err = jStat.ibeta(x, a, b) - p;\n t = Math.exp(a1 * Math.log(x) + b1 * Math.log(1 - x) + afac);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * (a1 / x - b1 / (1 - x)))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (x >= 1)\n x = 0.5 * (x + t + 1);\n if (Math.abs(t) < EPS * x && j > 0)\n break;\n }\n return x;\n};\n\n\n// Returns the incomplete beta function I_x(a,b)\njStat.ibeta = function ibeta(x, a, b) {\n // Factors in front of the continued fraction.\n var bt = (x === 0 || x === 1) ? 0 :\n Math.exp(jStat.gammaln(a + b) - jStat.gammaln(a) -\n jStat.gammaln(b) + a * Math.log(x) + b *\n Math.log(1 - x));\n if (x < 0 || x > 1)\n return false;\n if (x < (a + 1) / (a + b + 2))\n // Use continued fraction directly.\n return bt * jStat.betacf(x, a, b) / a;\n // else use continued fraction after making the symmetry transformation.\n return 1 - bt * jStat.betacf(1 - x, b, a) / b;\n};\n\n\n// Returns a normal deviate (mu=0, sigma=1).\n// If n and m are specified it returns a object of normal deviates.\njStat.randn = function randn(n, m) {\n var u, v, x, y, q;\n if (!m)\n m = n;\n if (n)\n return jStat.create(n, m, function() { return jStat.randn(); });\n do {\n u = jStat._random_fn();\n v = 1.7156 * (jStat._random_fn() - 0.5);\n x = u - 0.449871;\n y = Math.abs(v) + 0.386595;\n q = x * x + y * (0.19600 * y - 0.25472 * x);\n } while (q > 0.27597 && (q > 0.27846 || v * v > -4 * Math.log(u) * u * u));\n return v / u;\n};\n\n\n// Returns a gamma deviate by the method of Marsaglia and Tsang.\njStat.randg = function randg(shape, n, m) {\n var oalph = shape;\n var a1, a2, u, v, x, mat;\n if (!m)\n m = n;\n if (!shape)\n shape = 1;\n if (n) {\n mat = jStat.zeros(n,m);\n mat.alter(function() { return jStat.randg(shape); });\n return mat;\n }\n if (shape < 1)\n shape += 1;\n a1 = shape - 1 / 3;\n a2 = 1 / Math.sqrt(9 * a1);\n do {\n do {\n x = jStat.randn();\n v = 1 + a2 * x;\n } while(v <= 0);\n v = v * v * v;\n u = jStat._random_fn();\n } while(u > 1 - 0.331 * Math.pow(x, 4) &&\n Math.log(u) > 0.5 * x*x + a1 * (1 - v + Math.log(v)));\n // alpha > 1\n if (shape == oalph)\n return a1 * v;\n // alpha < 1\n do {\n u = jStat._random_fn();\n } while(u === 0);\n return Math.pow(u, 1 / oalph) * a1 * v;\n};\n\n\n// making use of static methods on the instance\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(\n jStat.map(this, function(value) { return jStat[passfunc](value); }));\n }\n })(funcs[i]);\n})('gammaln gammafn factorial factorialln'.split(' '));\n\n\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('randn'.split(' '));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\n// generate all distribution instance methods\n(function(list) {\n for (var i = 0; i < list.length; i++) (function(func) {\n // distribution instance method\n jStat[func] = function f(a, b, c) {\n if (!(this instanceof f))\n return new f(a, b, c);\n this._a = a;\n this._b = b;\n this._c = c;\n return this;\n };\n // distribution method to be used on a jStat instance\n jStat.fn[func] = function(a, b, c) {\n var newthis = jStat[func](a, b, c);\n newthis.data = this;\n return newthis;\n };\n // sample instance method\n jStat[func].prototype.sample = function(arr) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (arr)\n return jStat.alter(arr, function() {\n return jStat[func].sample(a, b, c);\n });\n else\n return jStat[func].sample(a, b, c);\n };\n // generate the pdf, cdf and inv instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function(x) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (!x && x !== 0)\n x = this.data;\n if (typeof x !== 'number') {\n return jStat.fn.map.call(x, function(x) {\n return jStat[func][fnfunc](x, a, b, c);\n });\n }\n return jStat[func][fnfunc](x, a, b, c);\n };\n })(vals[i]);\n })('pdf cdf inv'.split(' '));\n // generate the mean, median, mode and variance instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function() {\n return jStat[func][fnfunc](this._a, this._b, this._c);\n };\n })(vals[i]);\n })('mean median mode variance'.split(' '));\n })(list[i]);\n})((\n 'beta centralF cauchy chisquare exponential gamma invgamma kumaraswamy ' +\n 'laplace lognormal noncentralt normal pareto studentt weibull uniform ' +\n 'binomial negbin hypgeom poisson triangular tukey arcsine'\n).split(' '));\n\n\n\n// extend beta function with static methods\njStat.extend(jStat.beta, {\n pdf: function pdf(x, alpha, beta) {\n // PDF is zero outside the support\n if (x > 1 || x < 0)\n return 0;\n // PDF is one for the uniform case\n if (alpha == 1 && beta == 1)\n return 1;\n\n if (alpha < 512 && beta < 512) {\n return (Math.pow(x, alpha - 1) * Math.pow(1 - x, beta - 1)) /\n jStat.betafn(alpha, beta);\n } else {\n return Math.exp((alpha - 1) * Math.log(x) +\n (beta - 1) * Math.log(1 - x) -\n jStat.betaln(alpha, beta));\n }\n },\n\n cdf: function cdf(x, alpha, beta) {\n return (x > 1 || x < 0) ? (x > 1) * 1 : jStat.ibeta(x, alpha, beta);\n },\n\n inv: function inv(x, alpha, beta) {\n return jStat.ibetainv(x, alpha, beta);\n },\n\n mean: function mean(alpha, beta) {\n return alpha / (alpha + beta);\n },\n\n median: function median(alpha, beta) {\n return jStat.ibetainv(0.5, alpha, beta);\n },\n\n mode: function mode(alpha, beta) {\n return (alpha - 1 ) / ( alpha + beta - 2);\n },\n\n // return a random sample\n sample: function sample(alpha, beta) {\n var u = jStat.randg(alpha);\n return u / (u + jStat.randg(beta));\n },\n\n variance: function variance(alpha, beta) {\n return (alpha * beta) / (Math.pow(alpha + beta, 2) * (alpha + beta + 1));\n }\n});\n\n// extend F function with static methods\njStat.extend(jStat.centralF, {\n // This implementation of the pdf function avoids float overflow\n // See the way that R calculates this value:\n // https://svn.r-project.org/R/trunk/src/nmath/df.c\n pdf: function pdf(x, df1, df2) {\n var p, q, f;\n\n if (x < 0)\n return 0;\n\n if (df1 <= 2) {\n if (x === 0 && df1 < 2) {\n return Infinity;\n }\n if (x === 0 && df1 === 2) {\n return 1;\n }\n return (1 / jStat.betafn(df1 / 2, df2 / 2)) *\n Math.pow(df1 / df2, df1 / 2) *\n Math.pow(x, (df1/2) - 1) *\n Math.pow((1 + (df1 / df2) * x), -(df1 + df2) / 2);\n }\n\n p = (df1 * x) / (df2 + x * df1);\n q = df2 / (df2 + x * df1);\n f = df1 * q / 2.0;\n return f * jStat.binomial.pdf((df1 - 2) / 2, (df1 + df2 - 2) / 2, p);\n },\n\n cdf: function cdf(x, df1, df2) {\n if (x < 0)\n return 0;\n return jStat.ibeta((df1 * x) / (df1 * x + df2), df1 / 2, df2 / 2);\n },\n\n inv: function inv(x, df1, df2) {\n return df2 / (df1 * (1 / jStat.ibetainv(x, df1 / 2, df2 / 2) - 1));\n },\n\n mean: function mean(df1, df2) {\n return (df2 > 2) ? df2 / (df2 - 2) : undefined;\n },\n\n mode: function mode(df1, df2) {\n return (df1 > 2) ? (df2 * (df1 - 2)) / (df1 * (df2 + 2)) : undefined;\n },\n\n // return a random sample\n sample: function sample(df1, df2) {\n var x1 = jStat.randg(df1 / 2) * 2;\n var x2 = jStat.randg(df2 / 2) * 2;\n return (x1 / df1) / (x2 / df2);\n },\n\n variance: function variance(df1, df2) {\n if (df2 <= 4)\n return undefined;\n return 2 * df2 * df2 * (df1 + df2 - 2) /\n (df1 * (df2 - 2) * (df2 - 2) * (df2 - 4));\n }\n});\n\n\n// extend cauchy function with static methods\njStat.extend(jStat.cauchy, {\n pdf: function pdf(x, local, scale) {\n if (scale < 0) { return 0; }\n\n return (scale / (Math.pow(x - local, 2) + Math.pow(scale, 2))) / Math.PI;\n },\n\n cdf: function cdf(x, local, scale) {\n return Math.atan((x - local) / scale) / Math.PI + 0.5;\n },\n\n inv: function(p, local, scale) {\n return local + scale * Math.tan(Math.PI * (p - 0.5));\n },\n\n median: function median(local/*, scale*/) {\n return local;\n },\n\n mode: function mode(local/*, scale*/) {\n return local;\n },\n\n sample: function sample(local, scale) {\n return jStat.randn() *\n Math.sqrt(1 / (2 * jStat.randg(0.5))) * scale + local;\n }\n});\n\n\n\n// extend chisquare function with static methods\njStat.extend(jStat.chisquare, {\n pdf: function pdf(x, dof) {\n if (x < 0)\n return 0;\n return (x === 0 && dof === 2) ? 0.5 :\n Math.exp((dof / 2 - 1) * Math.log(x) - x / 2 - (dof / 2) *\n Math.log(2) - jStat.gammaln(dof / 2));\n },\n\n cdf: function cdf(x, dof) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(dof / 2, x / 2);\n },\n\n inv: function(p, dof) {\n return 2 * jStat.gammapinv(p, 0.5 * dof);\n },\n\n mean : function(dof) {\n return dof;\n },\n\n // TODO: this is an approximation (is there a better way?)\n median: function median(dof) {\n return dof * Math.pow(1 - (2 / (9 * dof)), 3);\n },\n\n mode: function mode(dof) {\n return (dof - 2 > 0) ? dof - 2 : 0;\n },\n\n sample: function sample(dof) {\n return jStat.randg(dof / 2) * 2;\n },\n\n variance: function variance(dof) {\n return 2 * dof;\n }\n});\n\n\n\n// extend exponential function with static methods\njStat.extend(jStat.exponential, {\n pdf: function pdf(x, rate) {\n return x < 0 ? 0 : rate * Math.exp(-rate * x);\n },\n\n cdf: function cdf(x, rate) {\n return x < 0 ? 0 : 1 - Math.exp(-rate * x);\n },\n\n inv: function(p, rate) {\n return -Math.log(1 - p) / rate;\n },\n\n mean : function(rate) {\n return 1 / rate;\n },\n\n median: function (rate) {\n return (1 / rate) * Math.log(2);\n },\n\n mode: function mode(/*rate*/) {\n return 0;\n },\n\n sample: function sample(rate) {\n return -1 / rate * Math.log(jStat._random_fn());\n },\n\n variance : function(rate) {\n return Math.pow(rate, -2);\n }\n});\n\n\n\n// extend gamma function with static methods\njStat.extend(jStat.gamma, {\n pdf: function pdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return (x === 0 && shape === 1) ? 1 / scale :\n Math.exp((shape - 1) * Math.log(x) - x / scale -\n jStat.gammaln(shape) - shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(shape, x / scale);\n },\n\n inv: function(p, shape, scale) {\n return jStat.gammapinv(p, shape) * scale;\n },\n\n mean : function(shape, scale) {\n return shape * scale;\n },\n\n mode: function mode(shape, scale) {\n if(shape > 1) return (shape - 1) * scale;\n return undefined;\n },\n\n sample: function sample(shape, scale) {\n return jStat.randg(shape) * scale;\n },\n\n variance: function variance(shape, scale) {\n return shape * scale * scale;\n }\n});\n\n// extend inverse gamma function with static methods\njStat.extend(jStat.invgamma, {\n pdf: function pdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return Math.exp(-(shape + 1) * Math.log(x) - scale / x -\n jStat.gammaln(shape) + shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return 1 - jStat.lowRegGamma(shape, scale / x);\n },\n\n inv: function(p, shape, scale) {\n return scale / jStat.gammapinv(1 - p, shape);\n },\n\n mean : function(shape, scale) {\n return (shape > 1) ? scale / (shape - 1) : undefined;\n },\n\n mode: function mode(shape, scale) {\n return scale / (shape + 1);\n },\n\n sample: function sample(shape, scale) {\n return scale / jStat.randg(shape);\n },\n\n variance: function variance(shape, scale) {\n if (shape <= 2)\n return undefined;\n return scale * scale / ((shape - 1) * (shape - 1) * (shape - 2));\n }\n});\n\n\n// extend kumaraswamy function with static methods\njStat.extend(jStat.kumaraswamy, {\n pdf: function pdf(x, alpha, beta) {\n if (x === 0 && alpha === 1)\n return beta;\n else if (x === 1 && beta === 1)\n return alpha;\n return Math.exp(Math.log(alpha) + Math.log(beta) + (alpha - 1) *\n Math.log(x) + (beta - 1) *\n Math.log(1 - Math.pow(x, alpha)));\n },\n\n cdf: function cdf(x, alpha, beta) {\n if (x < 0)\n return 0;\n else if (x > 1)\n return 1;\n return (1 - Math.pow(1 - Math.pow(x, alpha), beta));\n },\n\n inv: function inv(p, alpha, beta) {\n return Math.pow(1 - Math.pow(1 - p, 1 / beta), 1 / alpha);\n },\n\n mean : function(alpha, beta) {\n return (beta * jStat.gammafn(1 + 1 / alpha) *\n jStat.gammafn(beta)) / (jStat.gammafn(1 + 1 / alpha + beta));\n },\n\n median: function median(alpha, beta) {\n return Math.pow(1 - Math.pow(2, -1 / beta), 1 / alpha);\n },\n\n mode: function mode(alpha, beta) {\n if (!(alpha >= 1 && beta >= 1 && (alpha !== 1 && beta !== 1)))\n return undefined;\n return Math.pow((alpha - 1) / (alpha * beta - 1), 1 / alpha);\n },\n\n variance: function variance(/*alpha, beta*/) {\n throw new Error('variance not yet implemented');\n // TODO: complete this\n }\n});\n\n\n\n// extend lognormal function with static methods\njStat.extend(jStat.lognormal, {\n pdf: function pdf(x, mu, sigma) {\n if (x <= 0)\n return 0;\n return Math.exp(-Math.log(x) - 0.5 * Math.log(2 * Math.PI) -\n Math.log(sigma) - Math.pow(Math.log(x) - mu, 2) /\n (2 * sigma * sigma));\n },\n\n cdf: function cdf(x, mu, sigma) {\n if (x < 0)\n return 0;\n return 0.5 +\n (0.5 * jStat.erf((Math.log(x) - mu) / Math.sqrt(2 * sigma * sigma)));\n },\n\n inv: function(p, mu, sigma) {\n return Math.exp(-1.41421356237309505 * sigma * jStat.erfcinv(2 * p) + mu);\n },\n\n mean: function mean(mu, sigma) {\n return Math.exp(mu + sigma * sigma / 2);\n },\n\n median: function median(mu/*, sigma*/) {\n return Math.exp(mu);\n },\n\n mode: function mode(mu, sigma) {\n return Math.exp(mu - sigma * sigma);\n },\n\n sample: function sample(mu, sigma) {\n return Math.exp(jStat.randn() * sigma + mu);\n },\n\n variance: function variance(mu, sigma) {\n return (Math.exp(sigma * sigma) - 1) * Math.exp(2 * mu + sigma * sigma);\n }\n});\n\n\n\n// extend noncentralt function with static methods\njStat.extend(jStat.noncentralt, {\n pdf: function pdf(x, dof, ncp) {\n var tol = 1e-14;\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.pdf(x, dof)\n\n if (Math.abs(x) < tol) { // different formula for x == 0\n return Math.exp(jStat.gammaln((dof + 1) / 2) - ncp * ncp / 2 -\n 0.5 * Math.log(Math.PI * dof) - jStat.gammaln(dof / 2));\n }\n\n // formula for x != 0\n return dof / x *\n (jStat.noncentralt.cdf(x * Math.sqrt(1 + 2 / dof), dof+2, ncp) -\n jStat.noncentralt.cdf(x, dof, ncp));\n },\n\n cdf: function cdf(x, dof, ncp) {\n var tol = 1e-14;\n var min_iterations = 200;\n\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.cdf(x, dof);\n\n // turn negative x into positive and flip result afterwards\n var flip = false;\n if (x < 0) {\n flip = true;\n ncp = -ncp;\n }\n\n var prob = jStat.normal.cdf(-ncp, 0, 1);\n var value = tol + 1;\n // use value at last two steps to determine convergence\n var lastvalue = value;\n var y = x * x / (x * x + dof);\n var j = 0;\n var p = Math.exp(-ncp * ncp / 2);\n var q = Math.exp(-ncp * ncp / 2 - 0.5 * Math.log(2) -\n jStat.gammaln(3 / 2)) * ncp;\n while (j < min_iterations || lastvalue > tol || value > tol) {\n lastvalue = value;\n if (j > 0) {\n p *= (ncp * ncp) / (2 * j);\n q *= (ncp * ncp) / (2 * (j + 1 / 2));\n }\n value = p * jStat.beta.cdf(y, j + 0.5, dof / 2) +\n q * jStat.beta.cdf(y, j+1, dof/2);\n prob += 0.5 * value;\n j++;\n }\n\n return flip ? (1 - prob) : prob;\n }\n});\n\n\n// extend normal function with static methods\njStat.extend(jStat.normal, {\n pdf: function pdf(x, mean, std) {\n return Math.exp(-0.5 * Math.log(2 * Math.PI) -\n Math.log(std) - Math.pow(x - mean, 2) / (2 * std * std));\n },\n\n cdf: function cdf(x, mean, std) {\n return 0.5 * (1 + jStat.erf((x - mean) / Math.sqrt(2 * std * std)));\n },\n\n inv: function(p, mean, std) {\n return -1.41421356237309505 * std * jStat.erfcinv(2 * p) + mean;\n },\n\n mean : function(mean/*, std*/) {\n return mean;\n },\n\n median: function median(mean/*, std*/) {\n return mean;\n },\n\n mode: function (mean/*, std*/) {\n return mean;\n },\n\n sample: function sample(mean, std) {\n return jStat.randn() * std + mean;\n },\n\n variance : function(mean, std) {\n return std * std;\n }\n});\n\n\n\n// extend pareto function with static methods\njStat.extend(jStat.pareto, {\n pdf: function pdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return (shape * Math.pow(scale, shape)) / Math.pow(x, shape + 1);\n },\n\n cdf: function cdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return 1 - Math.pow(scale / x, shape);\n },\n\n inv: function inv(p, scale, shape) {\n return scale / Math.pow(1 - p, 1 / shape);\n },\n\n mean: function mean(scale, shape) {\n if (shape <= 1)\n return undefined;\n return (shape * Math.pow(scale, shape)) / (shape - 1);\n },\n\n median: function median(scale, shape) {\n return scale * (shape * Math.SQRT2);\n },\n\n mode: function mode(scale/*, shape*/) {\n return scale;\n },\n\n variance : function(scale, shape) {\n if (shape <= 2)\n return undefined;\n return (scale*scale * shape) / (Math.pow(shape - 1, 2) * (shape - 2));\n }\n});\n\n\n\n// extend studentt function with static methods\njStat.extend(jStat.studentt, {\n pdf: function pdf(x, dof) {\n dof = dof > 1e100 ? 1e100 : dof;\n return (1/(Math.sqrt(dof) * jStat.betafn(0.5, dof/2))) *\n Math.pow(1 + ((x * x) / dof), -((dof + 1) / 2));\n },\n\n cdf: function cdf(x, dof) {\n var dof2 = dof / 2;\n return jStat.ibeta((x + Math.sqrt(x * x + dof)) /\n (2 * Math.sqrt(x * x + dof)), dof2, dof2);\n },\n\n inv: function(p, dof) {\n var x = jStat.ibetainv(2 * Math.min(p, 1 - p), 0.5 * dof, 0.5);\n x = Math.sqrt(dof * (1 - x) / x);\n return (p > 0.5) ? x : -x;\n },\n\n mean: function mean(dof) {\n return (dof > 1) ? 0 : undefined;\n },\n\n median: function median(/*dof*/) {\n return 0;\n },\n\n mode: function mode(/*dof*/) {\n return 0;\n },\n\n sample: function sample(dof) {\n return jStat.randn() * Math.sqrt(dof / (2 * jStat.randg(dof / 2)));\n },\n\n variance: function variance(dof) {\n return (dof > 2) ? dof / (dof - 2) : (dof > 1) ? Infinity : undefined;\n }\n});\n\n\n\n// extend weibull function with static methods\njStat.extend(jStat.weibull, {\n pdf: function pdf(x, scale, shape) {\n if (x < 0 || scale < 0 || shape < 0)\n return 0;\n return (shape / scale) * Math.pow((x / scale), (shape - 1)) *\n Math.exp(-(Math.pow((x / scale), shape)));\n },\n\n cdf: function cdf(x, scale, shape) {\n return x < 0 ? 0 : 1 - Math.exp(-Math.pow((x / scale), shape));\n },\n\n inv: function(p, scale, shape) {\n return scale * Math.pow(-Math.log(1 - p), 1 / shape);\n },\n\n mean : function(scale, shape) {\n return scale * jStat.gammafn(1 + 1 / shape);\n },\n\n median: function median(scale, shape) {\n return scale * Math.pow(Math.log(2), 1 / shape);\n },\n\n mode: function mode(scale, shape) {\n if (shape <= 1)\n return 0;\n return scale * Math.pow((shape - 1) / shape, 1 / shape);\n },\n\n sample: function sample(scale, shape) {\n return scale * Math.pow(-Math.log(jStat._random_fn()), 1 / shape);\n },\n\n variance: function variance(scale, shape) {\n return scale * scale * jStat.gammafn(1 + 2 / shape) -\n Math.pow(jStat.weibull.mean(scale, shape), 2);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.uniform, {\n pdf: function pdf(x, a, b) {\n return (x < a || x > b) ? 0 : 1 / (b - a);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (x - a) / (b - a);\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (p * (b - a));\n },\n\n mean: function mean(a, b) {\n return 0.5 * (a + b);\n },\n\n median: function median(a, b) {\n return jStat.mean(a, b);\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return (a / 2 + b / 2) + (b / 2 - a / 2) * (2 * jStat._random_fn() - 1);\n },\n\n variance: function variance(a, b) {\n return Math.pow(b - a, 2) / 12;\n }\n});\n\n\n// Got this from http://www.math.ucla.edu/~tom/distributions/binomial.html\nfunction betinc(x, a, b, eps) {\n var a0 = 0;\n var b0 = 1;\n var a1 = 1;\n var b1 = 1;\n var m9 = 0;\n var a2 = 0;\n var c9;\n\n while (Math.abs((a1 - a2) / a1) > eps) {\n a2 = a1;\n c9 = -(a + m9) * (a + b + m9) * x / (a + 2 * m9) / (a + 2 * m9 + 1);\n a0 = a1 + c9 * a0;\n b0 = b1 + c9 * b0;\n m9 = m9 + 1;\n c9 = m9 * (b - m9) * x / (a + 2 * m9 - 1) / (a + 2 * m9);\n a1 = a0 + c9 * a1;\n b1 = b0 + c9 * b1;\n a0 = a0 / b1;\n b0 = b0 / b1;\n a1 = a1 / b1;\n b1 = 1;\n }\n\n return a1 / a;\n}\n\n\n// extend uniform function with static methods\njStat.extend(jStat.binomial, {\n pdf: function pdf(k, n, p) {\n return (p === 0 || p === 1) ?\n ((n * p) === k ? 1 : 0) :\n jStat.combination(n, k) * Math.pow(p, k) * Math.pow(1 - p, n - k);\n },\n\n cdf: function cdf(x, n, p) {\n var betacdf;\n var eps = 1e-10;\n\n if (x < 0)\n return 0;\n if (x >= n)\n return 1;\n if (p < 0 || p > 1 || n <= 0)\n return NaN;\n\n x = Math.floor(x);\n var z = p;\n var a = x + 1;\n var b = n - x;\n var s = a + b;\n var bt = Math.exp(jStat.gammaln(s) - jStat.gammaln(b) -\n jStat.gammaln(a) + a * Math.log(z) + b * Math.log(1 - z));\n\n if (z < (a + 1) / (s + 2))\n betacdf = bt * betinc(z, a, b, eps);\n else\n betacdf = 1 - bt * betinc(1 - z, b, a, eps);\n\n return Math.round((1 - betacdf) * (1 / eps)) / (1 / eps);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.negbin, {\n pdf: function pdf(k, r, p) {\n if (k !== k >>> 0)\n return false;\n if (k < 0)\n return 0;\n return jStat.combination(k + r - 1, r - 1) *\n Math.pow(1 - p, k) * Math.pow(p, r);\n },\n\n cdf: function cdf(x, r, p) {\n var sum = 0,\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sum += jStat.negbin.pdf(k, r, p);\n }\n return sum;\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.hypgeom, {\n pdf: function pdf(k, N, m, n) {\n // Hypergeometric PDF.\n\n // A simplification of the CDF algorithm below.\n\n // k = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(k !== k | 0) {\n return false;\n } else if(k < 0 || k < m - (N - n)) {\n // It's impossible to have this few successes drawn.\n return 0;\n } else if(k > n || k > m) {\n // It's impossible to have this many successes drawn.\n return 0;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.pdf(N - m - n + k, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return jStat.hypgeom.pdf(n - k, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return jStat.hypgeom.pdf(m - k, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.pdf(k, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate product to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < k; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledPDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n scaledPDF *= 1 - (m / (N - samplesDone));\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledPDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledPDF));\n }\n },\n\n cdf: function cdf(x, N, m, n) {\n // Hypergeometric CDF.\n\n // This algorithm is due to Prof. Thomas S. Ferguson, <tom@math.ucla.edu>,\n // and comes from his hypergeometric test calculator at\n // <http://www.math.ucla.edu/~tom/distributions/Hypergeometric.html>.\n\n // x = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(x < 0 || x < m - (N - n)) {\n // It's impossible to have this few successes drawn or fewer.\n return 0;\n } else if(x >= n || x >= m) {\n // We will always have this many successes or fewer.\n return 1;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.cdf(N - m - n + x, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return 1 - jStat.hypgeom.cdf(n - x - 1, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return 1 - jStat.hypgeom.cdf(m - x - 1, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.cdf(x, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate sum to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // Holds the intermediate, scaled total CDF.\n var scaledCDF = 1;\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < x; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledCDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n var factor = 1 - (m / (N - samplesDone));\n\n scaledPDF *= factor;\n scaledCDF *= factor;\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n\n // Add to the CDF answer.\n scaledCDF += scaledPDF;\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledCDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledCDF));\n }\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.poisson, {\n pdf: function pdf(k, l) {\n if (l < 0 || (k % 1) !== 0 || k < 0) {\n return 0;\n }\n\n return Math.pow(l, k) * Math.exp(-l) / jStat.factorial(k);\n },\n\n cdf: function cdf(x, l) {\n var sumarr = [],\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sumarr.push(jStat.poisson.pdf(k, l));\n }\n return jStat.sum(sumarr);\n },\n\n mean : function(l) {\n return l;\n },\n\n variance : function(l) {\n return l;\n },\n\n sampleSmall: function sampleSmall(l) {\n var p = 1, k = 0, L = Math.exp(-l);\n do {\n k++;\n p *= jStat._random_fn();\n } while (p > L);\n return k - 1;\n },\n\n sampleLarge: function sampleLarge(l) {\n var lam = l;\n var k;\n var U, V, slam, loglam, a, b, invalpha, vr, us;\n\n slam = Math.sqrt(lam);\n loglam = Math.log(lam);\n b = 0.931 + 2.53 * slam;\n a = -0.059 + 0.02483 * b;\n invalpha = 1.1239 + 1.1328 / (b - 3.4);\n vr = 0.9277 - 3.6224 / (b - 2);\n\n while (1) {\n U = Math.random() - 0.5;\n V = Math.random();\n us = 0.5 - Math.abs(U);\n k = Math.floor((2 * a / us + b) * U + lam + 0.43);\n if ((us >= 0.07) && (V <= vr)) {\n return k;\n }\n if ((k < 0) || ((us < 0.013) && (V > us))) {\n continue;\n }\n /* log(V) == log(0.0) ok here */\n /* if U==0.0 so that us==0.0, log is ok since always returns */\n if ((Math.log(V) + Math.log(invalpha) - Math.log(a / (us * us) + b)) <= (-lam + k * loglam - jStat.loggam(k + 1))) {\n return k;\n }\n }\n },\n\n sample: function sample(l) {\n if (l < 10)\n return this.sampleSmall(l);\n else\n return this.sampleLarge(l);\n }\n});\n\n// extend triangular function with static methods\njStat.extend(jStat.triangular, {\n pdf: function pdf(x, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (x < a || x > b) {\n return 0;\n } else if (x < c) {\n return (2 * (x - a)) / ((b - a) * (c - a));\n } else if (x === c) {\n return (2 / (b - a));\n } else { // x > c\n return (2 * (b - x)) / ((b - a) * (b - c));\n }\n }\n },\n\n cdf: function cdf(x, a, b, c) {\n if (b <= a || c < a || c > b)\n return NaN;\n if (x <= a)\n return 0;\n else if (x >= b)\n return 1;\n if (x <= c)\n return Math.pow(x - a, 2) / ((b - a) * (c - a));\n else // x > c\n return 1 - Math.pow(b - x, 2) / ((b - a) * (b - c));\n },\n\n inv: function inv(p, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (p <= ((c - a) / (b - a))) {\n return a + (b - a) * Math.sqrt(p * ((c - a) / (b - a)));\n } else { // p > ((c - a) / (b - a))\n return a + (b - a) * (1 - Math.sqrt((1 - p) * (1 - ((c - a) / (b - a)))));\n }\n }\n },\n\n mean: function mean(a, b, c) {\n return (a + b + c) / 3;\n },\n\n median: function median(a, b, c) {\n if (c <= (a + b) / 2) {\n return b - Math.sqrt((b - a) * (b - c)) / Math.sqrt(2);\n } else if (c > (a + b) / 2) {\n return a + Math.sqrt((b - a) * (c - a)) / Math.sqrt(2);\n }\n },\n\n mode: function mode(a, b, c) {\n return c;\n },\n\n sample: function sample(a, b, c) {\n var u = jStat._random_fn();\n if (u < ((c - a) / (b - a)))\n return a + Math.sqrt(u * (b - a) * (c - a))\n return b - Math.sqrt((1 - u) * (b - a) * (b - c));\n },\n\n variance: function variance(a, b, c) {\n return (a * a + b * b + c * c - a * b - a * c - b * c) / 18;\n }\n});\n\n\n// extend arcsine function with static methods\njStat.extend(jStat.arcsine, {\n pdf: function pdf(x, a, b) {\n if (b <= a) return NaN;\n\n return (x <= a || x >= b) ? 0 :\n (2 / Math.PI) *\n Math.pow(Math.pow(b - a, 2) -\n Math.pow(2 * x - a - b, 2), -0.5);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (2 / Math.PI) * Math.asin(Math.sqrt((x - a)/(b - a)));\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (0.5 - 0.5 * Math.cos(Math.PI * p)) * (b - a);\n },\n\n mean: function mean(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n median: function median(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return ((a + b) / 2) + ((b - a) / 2) *\n Math.sin(2 * Math.PI * jStat.uniform.sample(0, 1));\n },\n\n variance: function variance(a, b) {\n if (b <= a) return NaN;\n return Math.pow(b - a, 2) / 8;\n }\n});\n\n\nfunction laplaceSign(x) { return x / Math.abs(x); }\n\njStat.extend(jStat.laplace, {\n pdf: function pdf(x, mu, b) {\n return (b <= 0) ? 0 : (Math.exp(-Math.abs(x - mu) / b)) / (2 * b);\n },\n\n cdf: function cdf(x, mu, b) {\n if (b <= 0) { return 0; }\n\n if(x < mu) {\n return 0.5 * Math.exp((x - mu) / b);\n } else {\n return 1 - 0.5 * Math.exp(- (x - mu) / b);\n }\n },\n\n mean: function(mu/*, b*/) {\n return mu;\n },\n\n median: function(mu/*, b*/) {\n return mu;\n },\n\n mode: function(mu/*, b*/) {\n return mu;\n },\n\n variance: function(mu, b) {\n return 2 * b * b;\n },\n\n sample: function sample(mu, b) {\n var u = jStat._random_fn() - 0.5;\n\n return mu - (b * laplaceSign(u) * Math.log(1 - (2 * Math.abs(u))));\n }\n});\n\nfunction tukeyWprob(w, rr, cc) {\n var nleg = 12;\n var ihalf = 6;\n\n var C1 = -30;\n var C2 = -50;\n var C3 = 60;\n var bb = 8;\n var wlar = 3;\n var wincr1 = 2;\n var wincr2 = 3;\n var xleg = [\n 0.981560634246719250690549090149,\n 0.904117256370474856678465866119,\n 0.769902674194304687036893833213,\n 0.587317954286617447296702418941,\n 0.367831498998180193752691536644,\n 0.125233408511468915472441369464\n ];\n var aleg = [\n 0.047175336386511827194615961485,\n 0.106939325995318430960254718194,\n 0.160078328543346226334652529543,\n 0.203167426723065921749064455810,\n 0.233492536538354808760849898925,\n 0.249147045813402785000562436043\n ];\n\n var qsqz = w * 0.5;\n\n // if w >= 16 then the integral lower bound (occurs for c=20)\n // is 0.99999999999995 so return a value of 1.\n\n if (qsqz >= bb)\n return 1.0;\n\n // find (f(w/2) - 1) ^ cc\n // (first term in integral of hartley's form).\n\n var pr_w = 2 * jStat.normal.cdf(qsqz, 0, 1, 1, 0) - 1; // erf(qsqz / M_SQRT2)\n // if pr_w ^ cc < 2e-22 then set pr_w = 0\n if (pr_w >= Math.exp(C2 / cc))\n pr_w = Math.pow(pr_w, cc);\n else\n pr_w = 0.0;\n\n // if w is large then the second component of the\n // integral is small, so fewer intervals are needed.\n\n var wincr;\n if (w > wlar)\n wincr = wincr1;\n else\n wincr = wincr2;\n\n // find the integral of second term of hartley's form\n // for the integral of the range for equal-length\n // intervals using legendre quadrature. limits of\n // integration are from (w/2, 8). two or three\n // equal-length intervals are used.\n\n // blb and bub are lower and upper limits of integration.\n\n var blb = qsqz;\n var binc = (bb - qsqz) / wincr;\n var bub = blb + binc;\n var einsum = 0.0;\n\n // integrate over each interval\n\n var cc1 = cc - 1.0;\n for (var wi = 1; wi <= wincr; wi++) {\n var elsum = 0.0;\n var a = 0.5 * (bub + blb);\n\n // legendre quadrature with order = nleg\n\n var b = 0.5 * (bub - blb);\n\n for (var jj = 1; jj <= nleg; jj++) {\n var j, xx;\n if (ihalf < jj) {\n j = (nleg - jj) + 1;\n xx = xleg[j-1];\n } else {\n j = jj;\n xx = -xleg[j-1];\n }\n var c = b * xx;\n var ac = a + c;\n\n // if exp(-qexpo/2) < 9e-14,\n // then doesn't contribute to integral\n\n var qexpo = ac * ac;\n if (qexpo > C3)\n break;\n\n var pplus = 2 * jStat.normal.cdf(ac, 0, 1, 1, 0);\n var pminus= 2 * jStat.normal.cdf(ac, w, 1, 1, 0);\n\n // if rinsum ^ (cc-1) < 9e-14,\n // then doesn't contribute to integral\n\n var rinsum = (pplus * 0.5) - (pminus * 0.5);\n if (rinsum >= Math.exp(C1 / cc1)) {\n rinsum = (aleg[j-1] * Math.exp(-(0.5 * qexpo))) * Math.pow(rinsum, cc1);\n elsum += rinsum;\n }\n }\n elsum *= (((2.0 * b) * cc) / Math.sqrt(2 * Math.PI));\n einsum += elsum;\n blb = bub;\n bub += binc;\n }\n\n // if pr_w ^ rr < 9e-14, then return 0\n pr_w += einsum;\n if (pr_w <= Math.exp(C1 / rr))\n return 0;\n\n pr_w = Math.pow(pr_w, rr);\n if (pr_w >= 1) // 1 was iMax was eps\n return 1;\n return pr_w;\n}\n\nfunction tukeyQinv(p, c, v) {\n var p0 = 0.322232421088;\n var q0 = 0.993484626060e-01;\n var p1 = -1.0;\n var q1 = 0.588581570495;\n var p2 = -0.342242088547;\n var q2 = 0.531103462366;\n var p3 = -0.204231210125;\n var q3 = 0.103537752850;\n var p4 = -0.453642210148e-04;\n var q4 = 0.38560700634e-02;\n var c1 = 0.8832;\n var c2 = 0.2368;\n var c3 = 1.214;\n var c4 = 1.208;\n var c5 = 1.4142;\n var vmax = 120.0;\n\n var ps = 0.5 - 0.5 * p;\n var yi = Math.sqrt(Math.log(1.0 / (ps * ps)));\n var t = yi + (((( yi * p4 + p3) * yi + p2) * yi + p1) * yi + p0)\n / (((( yi * q4 + q3) * yi + q2) * yi + q1) * yi + q0);\n if (v < vmax) t += (t * t * t + t) / v / 4.0;\n var q = c1 - c2 * t;\n if (v < vmax) q += -c3 / v + c4 * t / v;\n return t * (q * Math.log(c - 1.0) + c5);\n}\n\njStat.extend(jStat.tukey, {\n cdf: function cdf(q, nmeans, df) {\n // Identical implementation as the R ptukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var nlegq = 16;\n var ihalfq = 8;\n\n var eps1 = -30.0;\n var eps2 = 1.0e-14;\n var dhaf = 100.0;\n var dquar = 800.0;\n var deigh = 5000.0;\n var dlarg = 25000.0;\n var ulen1 = 1.0;\n var ulen2 = 0.5;\n var ulen3 = 0.25;\n var ulen4 = 0.125;\n var xlegq = [\n 0.989400934991649932596154173450,\n 0.944575023073232576077988415535,\n 0.865631202387831743880467897712,\n 0.755404408355003033895101194847,\n 0.617876244402643748446671764049,\n 0.458016777657227386342419442984,\n 0.281603550779258913230460501460,\n 0.950125098376374401853193354250e-1\n ];\n var alegq = [\n 0.271524594117540948517805724560e-1,\n 0.622535239386478928628438369944e-1,\n 0.951585116824927848099251076022e-1,\n 0.124628971255533872052476282192,\n 0.149595988816576732081501730547,\n 0.169156519395002538189312079030,\n 0.182603415044923588866763667969,\n 0.189450610455068496285396723208\n ];\n\n if (q <= 0)\n return 0;\n\n // df must be > 1\n // there must be at least two values\n\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (!Number.isFinite(q))\n return 1;\n\n if (df > dlarg)\n return tukeyWprob(q, rr, cc);\n\n // calculate leading constant\n\n var f2 = df * 0.5;\n var f2lf = ((f2 * Math.log(df)) - (df * Math.log(2))) - jStat.gammaln(f2);\n var f21 = f2 - 1.0;\n\n // integral is divided into unit, half-unit, quarter-unit, or\n // eighth-unit length intervals depending on the value of the\n // degrees of freedom.\n\n var ff4 = df * 0.25;\n var ulen;\n if (df <= dhaf) ulen = ulen1;\n else if (df <= dquar) ulen = ulen2;\n else if (df <= deigh) ulen = ulen3;\n else ulen = ulen4;\n\n f2lf += Math.log(ulen);\n\n // integrate over each subinterval\n\n var ans = 0.0;\n\n for (var i = 1; i <= 50; i++) {\n var otsum = 0.0;\n\n // legendre quadrature with order = nlegq\n // nodes (stored in xlegq) are symmetric around zero.\n\n var twa1 = (2 * i - 1) * ulen;\n\n for (var jj = 1; jj <= nlegq; jj++) {\n var j, t1;\n if (ihalfq < jj) {\n j = jj - ihalfq - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 + (xlegq[j] * ulen))))\n - (((xlegq[j] * ulen) + twa1) * ff4);\n } else {\n j = jj - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 - (xlegq[j] * ulen))))\n + (((xlegq[j] * ulen) - twa1) * ff4);\n }\n\n // if exp(t1) < 9e-14, then doesn't contribute to integral\n var qsqz;\n if (t1 >= eps1) {\n if (ihalfq < jj) {\n qsqz = q * Math.sqrt(((xlegq[j] * ulen) + twa1) * 0.5);\n } else {\n qsqz = q * Math.sqrt(((-(xlegq[j] * ulen)) + twa1) * 0.5);\n }\n\n // call wprob to find integral of range portion\n\n var wprb = tukeyWprob(qsqz, rr, cc);\n var rotsum = (wprb * alegq[j]) * Math.exp(t1);\n otsum += rotsum;\n }\n // end legendre integral for interval i\n // L200:\n }\n\n // if integral for interval i < 1e-14, then stop.\n // However, in order to avoid small area under left tail,\n // at least 1 / ulen intervals are calculated.\n if (i * ulen >= 1.0 && otsum <= eps2)\n break;\n\n // end of interval i\n // L330:\n\n ans += otsum;\n }\n\n if (otsum > eps2) { // not converged\n throw new Error('tukey.cdf failed to converge');\n }\n if (ans > 1)\n ans = 1;\n return ans;\n },\n\n inv: function(p, nmeans, df) {\n // Identical implementation as the R qtukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var eps = 0.0001;\n var maxiter = 50;\n\n // df must be > 1 ; there must be at least two values\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (p < 0 || p > 1) return NaN;\n if (p === 0) return 0;\n if (p === 1) return Infinity;\n\n // Initial value\n\n var x0 = tukeyQinv(p, cc, df);\n\n // Find prob(value < x0)\n\n var valx0 = jStat.tukey.cdf(x0, nmeans, df) - p;\n\n // Find the second iterate and prob(value < x1).\n // If the first iterate has probability value\n // exceeding p then second iterate is 1 less than\n // first iterate; otherwise it is 1 greater.\n\n var x1;\n if (valx0 > 0.0)\n x1 = Math.max(0.0, x0 - 1.0);\n else\n x1 = x0 + 1.0;\n var valx1 = jStat.tukey.cdf(x1, nmeans, df) - p;\n\n // Find new iterate\n\n var ans;\n for(var iter = 1; iter < maxiter; iter++) {\n ans = x1 - ((valx1 * (x1 - x0)) / (valx1 - valx0));\n valx0 = valx1;\n\n // New iterate must be >= 0\n\n x0 = x1;\n if (ans < 0.0) {\n ans = 0.0;\n valx1 = -p;\n }\n // Find prob(value < new iterate)\n\n valx1 = jStat.tukey.cdf(ans, nmeans, df) - p;\n x1 = ans;\n\n // If the difference between two successive\n // iterates is less than eps, stop\n\n var xabs = Math.abs(x1 - x0);\n if (xabs < eps)\n return ans;\n }\n\n throw new Error('tukey.inv failed to converge');\n }\n});\n\n}(jStat, Math));\n/* Provides functions for the solution of linear system of equations, integration, extrapolation,\n * interpolation, eigenvalue problems, differential equations and PCA analysis. */\n\n(function(jStat, Math) {\n\nvar push = Array.prototype.push;\nvar isArray = jStat.utils.isArray;\n\nfunction isUsable(arg) {\n return isArray(arg) || arg instanceof jStat;\n}\n\njStat.extend({\n\n // add a vector/matrix to a vector/matrix or scalar\n add: function add(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value + arg[row][col];\n });\n }\n return jStat.map(arr, function(value) { return value + arg; });\n },\n\n // subtract a vector or scalar from the vector\n subtract: function subtract(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value - arg[row][col] || 0;\n });\n }\n return jStat.map(arr, function(value) { return value - arg; });\n },\n\n // matrix division\n divide: function divide(arr, arg) {\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.multiply(arr, jStat.inv(arg));\n }\n return jStat.map(arr, function(value) { return value / arg; });\n },\n\n // matrix multiplication\n multiply: function multiply(arr, arg) {\n var row, col, nrescols, sum, nrow, ncol, res, rescols;\n // eg: arr = 2 arg = 3 -> 6 for res[0][0] statement closure\n if (arr.length === undefined && arg.length === undefined) {\n return arr * arg;\n }\n nrow = arr.length,\n ncol = arr[0].length,\n res = jStat.zeros(nrow, nrescols = (isUsable(arg)) ? arg[0].length : ncol),\n rescols = 0;\n if (isUsable(arg)) {\n for (; rescols < nrescols; rescols++) {\n for (row = 0; row < nrow; row++) {\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += arr[row][col] * arg[col][rescols];\n res[row][rescols] = sum;\n }\n }\n return (nrow === 1 && rescols === 1) ? res[0][0] : res;\n }\n return jStat.map(arr, function(value) { return value * arg; });\n },\n\n // outer([1,2,3],[4,5,6])\n // ===\n // [[1],[2],[3]] times [[4,5,6]]\n // ->\n // [[4,5,6],[8,10,12],[12,15,18]]\n outer:function outer(A, B) {\n return jStat.multiply(A.map(function(t){ return [t] }), [B]);\n },\n\n\n // Returns the dot product of two matricies\n dot: function dot(arr, arg) {\n if (!isUsable(arr[0])) arr = [ arr ];\n if (!isUsable(arg[0])) arg = [ arg ];\n // convert column to row vector\n var left = (arr[0].length === 1 && arr.length !== 1) ? jStat.transpose(arr) : arr,\n right = (arg[0].length === 1 && arg.length !== 1) ? jStat.transpose(arg) : arg,\n res = [],\n row = 0,\n nrow = left.length,\n ncol = left[0].length,\n sum, col;\n for (; row < nrow; row++) {\n res[row] = [];\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += left[row][col] * right[row][col];\n res[row] = sum;\n }\n return (res.length === 1) ? res[0] : res;\n },\n\n // raise every element by a scalar\n pow: function pow(arr, arg) {\n return jStat.map(arr, function(value) { return Math.pow(value, arg); });\n },\n\n // exponentiate every element\n exp: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.exp(value); });\n },\n\n // generate the natural log of every element\n log: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.log(value); });\n },\n\n // generate the absolute values of the vector\n abs: function abs(arr) {\n return jStat.map(arr, function(value) { return Math.abs(value); });\n },\n\n // computes the p-norm of the vector\n // In the case that a matrix is passed, uses the first row as the vector\n norm: function norm(arr, p) {\n var nnorm = 0,\n i = 0;\n // check the p-value of the norm, and set for most common case\n if (isNaN(p)) p = 2;\n // check if multi-dimensional array, and make vector correction\n if (isUsable(arr[0])) arr = arr[0];\n // vector norm\n for (; i < arr.length; i++) {\n nnorm += Math.pow(Math.abs(arr[i]), p);\n }\n return Math.pow(nnorm, 1 / p);\n },\n\n // computes the angle between two vectors in rads\n // In case a matrix is passed, this uses the first row as the vector\n angle: function angle(arr, arg) {\n return Math.acos(jStat.dot(arr, arg) / (jStat.norm(arr) * jStat.norm(arg)));\n },\n\n // augment one matrix by another\n // Note: this function returns a matrix, not a jStat object\n aug: function aug(a, b) {\n var newarr = [];\n var i;\n for (i = 0; i < a.length; i++) {\n newarr.push(a[i].slice());\n }\n for (i = 0; i < newarr.length; i++) {\n push.apply(newarr[i], b[i]);\n }\n return newarr;\n },\n\n // The inv() function calculates the inverse of a matrix\n // Create the inverse by augmenting the matrix by the identity matrix of the\n // appropriate size, and then use G-J elimination on the augmented matrix.\n inv: function inv(a) {\n var rows = a.length;\n var cols = a[0].length;\n var b = jStat.identity(rows, cols);\n var c = jStat.gauss_jordan(a, b);\n var result = [];\n var i = 0;\n var j;\n\n //We need to copy the inverse portion to a new matrix to rid G-J artifacts\n for (; i < rows; i++) {\n result[i] = [];\n for (j = cols; j < c[0].length; j++)\n result[i][j - cols] = c[i][j];\n }\n return result;\n },\n\n // calculate the determinant of a matrix\n det: function det(a) {\n if (a.length === 2) {\n return a[0][0] * a[1][1] - a[0][1] * a[1][0];\n }\n\n var determinant = 0;\n for (var i = 0; i < a.length; i++) {\n // build a sub matrix without column `i`\n var submatrix = [];\n for (var row = 1; row < a.length; row++) {\n submatrix[row - 1] = [];\n for (var col = 0; col < a.length; col++) {\n if (col < i) {\n submatrix[row - 1][col] = a[row][col];\n } else if (col > i) {\n submatrix[row - 1][col - 1] = a[row][col];\n }\n }\n }\n\n // alternate between + and - between determinants\n var sign = i % 2 ? -1 : 1;\n determinant += det(submatrix) * a[0][i] * sign;\n }\n\n return determinant\n },\n\n gauss_elimination: function gauss_elimination(a, b) {\n var i = 0,\n j = 0,\n n = a.length,\n m = a[0].length,\n factor = 1,\n sum = 0,\n x = [],\n maug, pivot, temp, k;\n a = jStat.aug(a, b);\n maug = a[0].length;\n for(i = 0; i < n; i++) {\n pivot = a[i][i];\n j = i;\n for (k = i + 1; k < m; k++) {\n if (pivot < Math.abs(a[k][i])) {\n pivot = a[k][i];\n j = k;\n }\n }\n if (j != i) {\n for(k = 0; k < maug; k++) {\n temp = a[i][k];\n a[i][k] = a[j][k];\n a[j][k] = temp;\n }\n }\n for (j = i + 1; j < n; j++) {\n factor = a[j][i] / a[i][i];\n for(k = i; k < maug; k++) {\n a[j][k] = a[j][k] - factor * a[i][k];\n }\n }\n }\n for (i = n - 1; i >= 0; i--) {\n sum = 0;\n for (j = i + 1; j<= n - 1; j++) {\n sum = sum + x[j] * a[i][j];\n }\n x[i] =(a[i][maug - 1] - sum) / a[i][i];\n }\n return x;\n },\n\n gauss_jordan: function gauss_jordan(a, b) {\n var m = jStat.aug(a, b);\n var h = m.length;\n var w = m[0].length;\n var c = 0;\n var x, y, y2;\n // find max pivot\n for (y = 0; y < h; y++) {\n var maxrow = y;\n for (y2 = y+1; y2 < h; y2++) {\n if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))\n maxrow = y2;\n }\n var tmp = m[y];\n m[y] = m[maxrow];\n m[maxrow] = tmp\n for (y2 = y+1; y2 < h; y2++) {\n c = m[y2][y] / m[y][y];\n for (x = y; x < w; x++) {\n m[y2][x] -= m[y][x] * c;\n }\n }\n }\n // backsubstitute\n for (y = h-1; y >= 0; y--) {\n c = m[y][y];\n for (y2 = 0; y2 < y; y2++) {\n for (x = w-1; x > y-1; x--) {\n m[y2][x] -= m[y][x] * m[y2][y] / c;\n }\n }\n m[y][y] /= c;\n for (x = h; x < w; x++) {\n m[y][x] /= c;\n }\n }\n return m;\n },\n\n // solve equation\n // Ax=b\n // A is upper triangular matrix\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[1,2,3]\n // triaUpSolve(A,b) // -> [2.666,0.1666,1.666]\n // if you use matrix style\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[[1],[2],[3]]\n // will return [[2.666],[0.1666],[1.666]]\n triaUpSolve: function triaUpSolve(A, b) {\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n var matrix_mode = false;\n\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n parts = jStat.arange(i + 1, size).map(function(j) {\n return x[j] * A[i][j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n });\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n triaLowSolve: function triaLowSolve(A, b) {\n // like to triaUpSolve but A is lower triangular matrix\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n\n var matrix_mode=false;\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(j) {\n return A[i][j] * x[j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n })\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n\n // A -> [L,U]\n // A=LU\n // L is lower triangular matrix\n // U is upper triangular matrix\n lu: function lu(A) {\n var size = A.length;\n //var L=jStat.diagonal(jStat.ones(1,size)[0]);\n var L = jStat.identity(size);\n var R = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(t) {\n R[0][t] = A[0][t];\n });\n jStat.arange(1, size).forEach(function(l) {\n jStat.arange(l).forEach(function(i) {\n parts = jStat.arange(i).map(function(jj) {\n return L[l][jj] * R[jj][i];\n });\n L[l][i] = (A[l][i] - jStat.sum(parts)) / R[i][i];\n });\n jStat.arange(l, size).forEach(function(j) {\n parts = jStat.arange(l).map(function(jj) {\n return L[l][jj] * R[jj][j];\n });\n R[l][j] = A[parts.length][j] - jStat.sum(parts);\n });\n });\n return [L, R];\n },\n\n // A -> T\n // A=TT'\n // T is lower triangular matrix\n cholesky: function cholesky(A) {\n var size = A.length;\n var T = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(t) {\n return Math.pow(T[i][t],2);\n });\n T[i][i] = Math.sqrt(A[i][i] - jStat.sum(parts));\n jStat.arange(i + 1, size).forEach(function(j) {\n parts = jStat.arange(i).map(function(t) {\n return T[i][t] * T[j][t];\n });\n T[j][i] = (A[i][j] - jStat.sum(parts)) / T[i][i];\n });\n });\n return T;\n },\n\n\n gauss_jacobi: function gauss_jacobi(a, b, x, r) {\n var i = 0;\n var j = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(d), jStat.add(l, u)), -1);\n c = jStat.multiply(jStat.inv(d), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk,xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n gauss_seidel: function gauss_seidel(a, b, x, r) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d, l)), u), -1);\n c = jStat.multiply(jStat.inv(jStat.add(d, l)), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i = i + 1;\n }\n return xk;\n },\n\n SOR: function SOR(a, b, x, r, w) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.inv(jStat.add(d, jStat.multiply(l, w))),\n jStat.subtract(jStat.multiply(d, 1 - w),\n jStat.multiply(u, w)));\n c = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d,\n jStat.multiply(l, w))), b), w);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n householder: function householder(a) {\n var m = a.length;\n var n = a[0].length;\n var i = 0;\n var w = [];\n var p = [];\n var alpha, r, k, j, factor;\n for (; i < m - 1; i++) {\n alpha = 0;\n for (j = i + 1; j < n; j++)\n alpha += (a[j][i] * a[j][i]);\n factor = (a[i + 1][i] > 0) ? -1 : 1;\n alpha = factor * Math.sqrt(alpha);\n r = Math.sqrt((((alpha * alpha) - a[i + 1][i] * alpha) / 2));\n w = jStat.zeros(m, 1);\n w[i + 1][0] = (a[i + 1][i] - alpha) / (2 * r);\n for (k = i + 2; k < m; k++) w[k][0] = a[k][i] / (2 * r);\n p = jStat.subtract(jStat.identity(m, n),\n jStat.multiply(jStat.multiply(w, jStat.transpose(w)), 2));\n a = jStat.multiply(p, jStat.multiply(a, p));\n }\n return a;\n },\n\n // A -> [Q,R]\n // Q is orthogonal matrix\n // R is upper triangular\n QR: (function() {\n // x -> Q\n // find a orthogonal matrix Q st.\n // Qx=y\n // y is [||x||,0,0,...]\n\n // quick ref\n var sum = jStat.sum;\n var range = jStat.arange;\n\n function qr2(x) {\n // quick impletation\n // https://www.stat.wisc.edu/~larget/math496/qr.html\n\n var n = x.length;\n var p = x[0].length;\n\n var r = jStat.zeros(p, p);\n x = jStat.copy(x);\n\n var i,j,k;\n for(j = 0; j < p; j++){\n r[j][j] = Math.sqrt(sum(range(n).map(function(i){\n return x[i][j] * x[i][j];\n })));\n for(i = 0; i < n; i++){\n x[i][j] = x[i][j] / r[j][j];\n }\n for(k = j+1; k < p; k++){\n r[j][k] = sum(range(n).map(function(i){\n return x[i][j] * x[i][k];\n }));\n for(i = 0; i < n; i++){\n x[i][k] = x[i][k] - x[i][j]*r[j][k];\n }\n }\n }\n return [x, r];\n }\n\n return qr2;\n }()),\n\n lstsq: (function() {\n // solve least squard problem for Ax=b as QR decomposition way if b is\n // [[b1],[b2],[b3]] form will return [[x1],[x2],[x3]] array form solution\n // else b is [b1,b2,b3] form will return [x1,x2,x3] array form solution\n function R_I(A) {\n A = jStat.copy(A);\n var size = A.length;\n var I = jStat.identity(size);\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n jStat.sliceAssign(\n I, { row: i }, jStat.divide(jStat.slice(I, { row: i }), A[i][i]));\n jStat.sliceAssign(\n A, { row: i }, jStat.divide(jStat.slice(A, { row: i }), A[i][i]));\n jStat.arange(i).forEach(function(j) {\n var c = jStat.multiply(A[j][i], -1);\n var Aj = jStat.slice(A, { row: j });\n var cAi = jStat.multiply(jStat.slice(A, { row: i }), c);\n jStat.sliceAssign(A, { row: j }, jStat.add(Aj, cAi));\n var Ij = jStat.slice(I, { row: j });\n var cIi = jStat.multiply(jStat.slice(I, { row: i }), c);\n jStat.sliceAssign(I, { row: j }, jStat.add(Ij, cIi));\n })\n });\n return I;\n }\n\n function qr_solve(A, b){\n var array_mode = false;\n if (b[0].length === undefined) {\n // [c1,c2,c3] mode\n b = b.map(function(x){ return [x] });\n array_mode = true;\n }\n var QR = jStat.QR(A);\n var Q = QR[0];\n var R = QR[1];\n var attrs = A[0].length;\n var Q1 = jStat.slice(Q,{col:{end:attrs}});\n var R1 = jStat.slice(R,{row:{end:attrs}});\n var RI = R_I(R1);\n var Q2 = jStat.transpose(Q1);\n\n if(Q2[0].length === undefined){\n Q2 = [Q2]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n var x = jStat.multiply(jStat.multiply(RI, Q2), b);\n\n if(x.length === undefined){\n x = [[x]]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n\n if (array_mode)\n return x.map(function(i){ return i[0] });\n return x;\n }\n\n return qr_solve;\n }()),\n\n jacobi: function jacobi(a) {\n var condition = 1;\n var n = a.length;\n var e = jStat.identity(n, n);\n var ev = [];\n var b, i, j, p, q, maxim, theta, s;\n // condition === 1 only if tolerance is not reached\n while (condition === 1) {\n maxim = a[0][1];\n p = 0;\n q = 1;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i != j) {\n if (maxim < Math.abs(a[i][j])) {\n maxim = Math.abs(a[i][j]);\n p = i;\n q = j;\n }\n }\n }\n }\n if (a[p][p] === a[q][q])\n theta = (a[p][q] > 0) ? Math.PI / 4 : -Math.PI / 4;\n else\n theta = Math.atan(2 * a[p][q] / (a[p][p] - a[q][q])) / 2;\n s = jStat.identity(n, n);\n s[p][p] = Math.cos(theta);\n s[p][q] = -Math.sin(theta);\n s[q][p] = Math.sin(theta);\n s[q][q] = Math.cos(theta);\n // eigen vector matrix\n e = jStat.multiply(e, s);\n b = jStat.multiply(jStat.multiply(jStat.inv(s), a), s);\n a = b;\n condition = 0;\n for (i = 1; i < n; i++) {\n for (j = 1; j < n; j++) {\n if (i != j && Math.abs(a[i][j]) > 0.001) {\n condition = 1;\n }\n }\n }\n }\n for (i = 0; i < n; i++) ev.push(a[i][i]);\n //returns both the eigenvalue and eigenmatrix\n return [e, ev];\n },\n\n rungekutta: function rungekutta(f, h, p, t_j, u_j, order) {\n var k1, k2, u_j1, k3, k4;\n if (order === 2) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h, u_j + k1);\n u_j1 = u_j + (k1 + k2) / 2;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n if (order === 4) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h / 2, u_j + k1 / 2);\n k3 = h * f(t_j + h / 2, u_j + k2 / 2);\n k4 = h * f(t_j +h, u_j + k3);\n u_j1 = u_j + (k1 + 2 * k2 + 2 * k3 + k4) / 6;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n return u_j;\n },\n\n romberg: function romberg(f, a, b, order) {\n var i = 0;\n var h = (b - a) / 2;\n var x = [];\n var h1 = [];\n var g = [];\n var m, a1, j, k, I;\n while (i < order / 2) {\n I = f(a);\n for (j = a, k = 0; j <= b; j = j + h, k++) x[k] = j;\n m = x.length;\n for (j = 1; j < m - 1; j++) {\n I += (((j % 2) !== 0) ? 4 : 2) * f(x[j]);\n }\n I = (h / 3) * (I + f(b));\n g[i] = I;\n h /= 2;\n i++;\n }\n a1 = g.length;\n m = 1;\n while (a1 !== 1) {\n for (j = 0; j < a1 - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a1 = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n richardson: function richardson(X, f, x, h) {\n function pos(X, x) {\n var i = 0;\n var n = X.length;\n var p;\n for (; i < n; i++)\n if (X[i] === x) p = i;\n return p;\n }\n var h_min = Math.abs(x - X[pos(X, x) + 1]);\n var i = 0;\n var g = [];\n var h1 = [];\n var y1, y2, m, a, j;\n while (h >= h_min) {\n y1 = pos(X, x + h);\n y2 = pos(X, x);\n g[i] = (f[y1] - 2 * f[y2] + f[2 * y2 - y1]) / (h * h);\n h /= 2;\n i++;\n }\n a = g.length;\n m = 1;\n while (a != 1) {\n for (j = 0; j < a - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n simpson: function simpson(f, a, b, n) {\n var h = (b - a) / n;\n var I = f(a);\n var x = [];\n var j = a;\n var k = 0;\n var i = 1;\n var m;\n for (; j <= b; j = j + h, k++)\n x[k] = j;\n m = x.length;\n for (; i < m - 1; i++) {\n I += ((i % 2 !== 0) ? 4 : 2) * f(x[i]);\n }\n return (h / 3) * (I + f(b));\n },\n\n hermite: function hermite(X, F, dF, value) {\n var n = X.length;\n var p = 0;\n var i = 0;\n var l = [];\n var dl = [];\n var A = [];\n var B = [];\n var j;\n for (; i < n; i++) {\n l[i] = 1;\n for (j = 0; j < n; j++) {\n if (i != j) l[i] *= (value - X[j]) / (X[i] - X[j]);\n }\n dl[i] = 0;\n for (j = 0; j < n; j++) {\n if (i != j) dl[i] += 1 / (X [i] - X[j]);\n }\n A[i] = (1 - 2 * (value - X[i]) * dl[i]) * (l[i] * l[i]);\n B[i] = (value - X[i]) * (l[i] * l[i]);\n p += (A[i] * F[i] + B[i] * dF[i]);\n }\n return p;\n },\n\n lagrange: function lagrange(X, F, value) {\n var p = 0;\n var i = 0;\n var j, l;\n var n = X.length;\n for (; i < n; i++) {\n l = F[i];\n for (j = 0; j < n; j++) {\n // calculating the lagrange polynomial L_i\n if (i != j) l *= (value - X[j]) / (X[i] - X[j]);\n }\n // adding the lagrange polynomials found above\n p += l;\n }\n return p;\n },\n\n cubic_spline: function cubic_spline(X, F, value) {\n var n = X.length;\n var i = 0, j;\n var A = [];\n var B = [];\n var alpha = [];\n var c = [];\n var h = [];\n var b = [];\n var d = [];\n for (; i < n - 1; i++)\n h[i] = X[i + 1] - X[i];\n alpha[0] = 0;\n for (i = 1; i < n - 1; i++) {\n alpha[i] = (3 / h[i]) * (F[i + 1] - F[i]) -\n (3 / h[i-1]) * (F[i] - F[i-1]);\n }\n for (i = 1; i < n - 1; i++) {\n A[i] = [];\n B[i] = [];\n A[i][i-1] = h[i-1];\n A[i][i] = 2 * (h[i - 1] + h[i]);\n A[i][i+1] = h[i];\n B[i][0] = alpha[i];\n }\n c = jStat.multiply(jStat.inv(A), B);\n for (j = 0; j < n - 1; j++) {\n b[j] = (F[j + 1] - F[j]) / h[j] - h[j] * (c[j + 1][0] + 2 * c[j][0]) / 3;\n d[j] = (c[j + 1][0] - c[j][0]) / (3 * h[j]);\n }\n for (j = 0; j < n; j++) {\n if (X[j] > value) break;\n }\n j -= 1;\n return F[j] + (value - X[j]) * b[j] + jStat.sq(value-X[j]) *\n c[j] + (value - X[j]) * jStat.sq(value - X[j]) * d[j];\n },\n\n gauss_quadrature: function gauss_quadrature() {\n throw new Error('gauss_quadrature not yet implemented');\n },\n\n PCA: function PCA(X) {\n var m = X.length;\n var n = X[0].length;\n var i = 0;\n var j, temp1;\n var u = [];\n var D = [];\n var result = [];\n var temp2 = [];\n var Y = [];\n var Bt = [];\n var B = [];\n var C = [];\n var V = [];\n var Vt = [];\n for (i = 0; i < m; i++) {\n u[i] = jStat.sum(X[i]) / n;\n }\n for (i = 0; i < n; i++) {\n B[i] = [];\n for(j = 0; j < m; j++) {\n B[i][j] = X[j][i] - u[j];\n }\n }\n B = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n C[i] = [];\n for (j = 0; j < m; j++) {\n C[i][j] = (jStat.dot([B[i]], [B[j]])) / (n - 1);\n }\n }\n result = jStat.jacobi(C);\n V = result[0];\n D = result[1];\n Vt = jStat.transpose(V);\n for (i = 0; i < D.length; i++) {\n for (j = i; j < D.length; j++) {\n if(D[i] < D[j]) {\n temp1 = D[i];\n D[i] = D[j];\n D[j] = temp1;\n temp2 = Vt[i];\n Vt[i] = Vt[j];\n Vt[j] = temp2;\n }\n }\n }\n Bt = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n Y[i] = [];\n for (j = 0; j < Bt.length; j++) {\n Y[i][j] = jStat.dot([Vt[i]], [Bt[j]]);\n }\n }\n return [X, D, Vt, Y];\n }\n});\n\n// extend jStat.fn with methods that require one argument\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function(arg, func) {\n var tmpthis = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jStat.fn[passfunc].call(tmpthis, arg));\n }, 15);\n return this;\n }\n if (typeof jStat[passfunc](this, arg) === 'number')\n return jStat[passfunc](this, arg);\n else\n return jStat(jStat[passfunc](this, arg));\n };\n }(funcs[i]));\n}('add divide multiply subtract dot pow exp log abs norm angle'.split(' ')));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\nvar slice = [].slice;\nvar isNumber = jStat.utils.isNumber;\nvar isArray = jStat.utils.isArray;\n\n// flag==true denotes use of sample standard deviation\n// Z Statistics\njStat.extend({\n // 2 different parameter lists:\n // (value, mean, sd)\n // (value, array, flag)\n zscore: function zscore() {\n var args = slice.call(arguments);\n if (isNumber(args[1])) {\n return (args[0] - args[1]) / args[2];\n }\n return (args[0] - jStat.mean(args[1])) / jStat.stdev(args[1], args[2]);\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, sides)\n // (zscore, sides)\n // (value, array, sides, flag)\n ztest: function ztest() {\n var args = slice.call(arguments);\n var z;\n if (isArray(args[1])) {\n // (value, array, sides, flag)\n z = jStat.zscore(args[0],args[1],args[3]);\n return (args[2] === 1) ?\n (jStat.normal.cdf(-Math.abs(z), 0, 1)) :\n (jStat.normal.cdf(-Math.abs(z), 0, 1)*2);\n } else {\n if (args.length > 2) {\n // (value, mean, sd, sides)\n z = jStat.zscore(args[0],args[1],args[2]);\n return (args[3] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)* 2);\n } else {\n // (zscore, sides)\n z = args[0];\n return (args[1] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)*2);\n }\n }\n }\n});\n\njStat.extend(jStat.fn, {\n zscore: function zscore(value, flag) {\n return (value - this.mean()) / this.stdev(flag);\n },\n\n ztest: function ztest(value, sides, flag) {\n var zscore = Math.abs(this.zscore(value, flag));\n return (sides === 1) ?\n (jStat.normal.cdf(-zscore, 0, 1)) :\n (jStat.normal.cdf(-zscore, 0, 1) * 2);\n }\n});\n\n// T Statistics\njStat.extend({\n // 2 parameter lists\n // (value, mean, sd, n)\n // (value, array)\n tscore: function tscore() {\n var args = slice.call(arguments);\n return (args.length === 4) ?\n ((args[0] - args[1]) / (args[2] / Math.sqrt(args[3]))) :\n ((args[0] - jStat.mean(args[1])) /\n (jStat.stdev(args[1], true) / Math.sqrt(args[1].length)));\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, n, sides)\n // (tscore, n, sides)\n // (value, array, sides)\n ttest: function ttest() {\n var args = slice.call(arguments);\n var tscore;\n if (args.length === 5) {\n tscore = Math.abs(jStat.tscore(args[0], args[1], args[2], args[3]));\n return (args[4] === 1) ?\n (jStat.studentt.cdf(-tscore, args[3]-1)) :\n (jStat.studentt.cdf(-tscore, args[3]-1)*2);\n }\n if (isNumber(args[1])) {\n tscore = Math.abs(args[0])\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1]-1)) :\n (jStat.studentt.cdf(-tscore, args[1]-1) * 2);\n }\n tscore = Math.abs(jStat.tscore(args[0], args[1]))\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1].length-1)) :\n (jStat.studentt.cdf(-tscore, args[1].length-1) * 2);\n }\n});\n\njStat.extend(jStat.fn, {\n tscore: function tscore(value) {\n return (value - this.mean()) / (this.stdev(true) / Math.sqrt(this.cols()));\n },\n\n ttest: function ttest(value, sides) {\n return (sides === 1) ?\n (1 - jStat.studentt.cdf(Math.abs(this.tscore(value)), this.cols()-1)) :\n (jStat.studentt.cdf(-Math.abs(this.tscore(value)), this.cols()-1)*2);\n }\n});\n\n// F Statistics\njStat.extend({\n // Paramter list is as follows:\n // (array1, array2, array3, ...)\n // or it is an array of arrays\n // array of arrays conversion\n anovafscore: function anovafscore() {\n var args = slice.call(arguments),\n expVar, sample, sampMean, sampSampMean, tmpargs, unexpVar, i, j;\n if (args.length === 1) {\n tmpargs = new Array(args[0].length);\n for (i = 0; i < args[0].length; i++) {\n tmpargs[i] = args[0][i];\n }\n args = tmpargs;\n }\n // Builds sample array\n sample = new Array();\n for (i = 0; i < args.length; i++) {\n sample = sample.concat(args[i]);\n }\n sampMean = jStat.mean(sample);\n // Computes the explained variance\n expVar = 0;\n for (i = 0; i < args.length; i++) {\n expVar = expVar + args[i].length * Math.pow(jStat.mean(args[i]) - sampMean, 2);\n }\n expVar /= (args.length - 1);\n // Computes unexplained variance\n unexpVar = 0;\n for (i = 0; i < args.length; i++) {\n sampSampMean = jStat.mean(args[i]);\n for (j = 0; j < args[i].length; j++) {\n unexpVar += Math.pow(args[i][j] - sampSampMean, 2);\n }\n }\n unexpVar /= (sample.length - args.length);\n return expVar / unexpVar;\n },\n\n // 2 different paramter setups\n // (array1, array2, array3, ...)\n // (anovafscore, df1, df2)\n anovaftest: function anovaftest() {\n var args = slice.call(arguments),\n df1, df2, n, i;\n if (isNumber(args[0])) {\n return 1 - jStat.centralF.cdf(args[0], args[1], args[2]);\n }\n var anovafscore = jStat.anovafscore(args);\n df1 = args.length - 1;\n n = 0;\n for (i = 0; i < args.length; i++) {\n n = n + args[i].length;\n }\n df2 = n - df1 - 1;\n return 1 - jStat.centralF.cdf(anovafscore, df1, df2);\n },\n\n ftest: function ftest(fscore, df1, df2) {\n return 1 - jStat.centralF.cdf(fscore, df1, df2);\n }\n});\n\njStat.extend(jStat.fn, {\n anovafscore: function anovafscore() {\n return jStat.anovafscore(this.toArray());\n },\n\n anovaftes: function anovaftes() {\n var n = 0;\n var i;\n for (i = 0; i < this.length; i++) {\n n = n + this[i].length;\n }\n return jStat.ftest(this.anovafscore(), this.length - 1, n - this.length);\n }\n});\n\n// Tukey's range test\njStat.extend({\n // 2 parameter lists\n // (mean1, mean2, n1, n2, sd)\n // (array1, array2, sd)\n qscore: function qscore() {\n var args = slice.call(arguments);\n var mean1, mean2, n1, n2, sd;\n if (isNumber(args[0])) {\n mean1 = args[0];\n mean2 = args[1];\n n1 = args[2];\n n2 = args[3];\n sd = args[4];\n } else {\n mean1 = jStat.mean(args[0]);\n mean2 = jStat.mean(args[1]);\n n1 = args[0].length;\n n2 = args[1].length;\n sd = args[2];\n }\n return Math.abs(mean1 - mean2) / (sd * Math.sqrt((1 / n1 + 1 / n2) / 2));\n },\n\n // 3 different parameter lists:\n // (qscore, n, k)\n // (mean1, mean2, n1, n2, sd, n, k)\n // (array1, array2, sd, n, k)\n qtest: function qtest() {\n var args = slice.call(arguments);\n\n var qscore;\n if (args.length === 3) {\n qscore = args[0];\n args = args.slice(1);\n } else if (args.length === 7) {\n qscore = jStat.qscore(args[0], args[1], args[2], args[3], args[4]);\n args = args.slice(5);\n } else {\n qscore = jStat.qscore(args[0], args[1], args[2]);\n args = args.slice(3);\n }\n\n var n = args[0];\n var k = args[1];\n\n return 1 - jStat.tukey.cdf(qscore, k, n - k);\n },\n\n tukeyhsd: function tukeyhsd(arrays) {\n var sd = jStat.pooledstdev(arrays);\n var means = arrays.map(function (arr) {return jStat.mean(arr);});\n var n = arrays.reduce(function (n, arr) {return n + arr.length;}, 0);\n\n var results = [];\n for (var i = 0; i < arrays.length; ++i) {\n for (var j = i + 1; j < arrays.length; ++j) {\n var p = jStat.qtest(means[i], means[j], arrays[i].length, arrays[j].length, sd, n, arrays.length);\n results.push([[i, j], p]);\n }\n }\n\n return results;\n }\n});\n\n// Error Bounds\njStat.extend({\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n normalci: function normalci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n jStat.stdev(args[2]) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n tci: function tci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[3] - 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[2].length - 1) *\n jStat.stdev(args[2], true) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n significant: function significant(pvalue, alpha) {\n return pvalue < alpha;\n }\n});\n\njStat.extend(jStat.fn, {\n normalci: function normalci(value, alpha) {\n return jStat.normalci(value, alpha, this.toArray());\n },\n\n tci: function tci(value, alpha) {\n return jStat.tci(value, alpha, this.toArray());\n }\n});\n\n// internal method for calculating the z-score for a difference of proportions test\nfunction differenceOfProportions(p1, n1, p2, n2) {\n if (p1 > 1 || p2 > 1 || p1 <= 0 || p2 <= 0) {\n throw new Error(\"Proportions should be greater than 0 and less than 1\")\n }\n var pooled = (p1 * n1 + p2 * n2) / (n1 + n2);\n var se = Math.sqrt(pooled * (1 - pooled) * ((1/n1) + (1/n2)));\n return (p1 - p2) / se;\n}\n\n// Difference of Proportions\njStat.extend(jStat.fn, {\n oneSidedDifferenceOfProportions: function oneSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 1);\n },\n\n twoSidedDifferenceOfProportions: function twoSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 2);\n }\n});\n\n}(jStat, Math));\njStat.models = (function(){\n function sub_regress(exog) {\n var var_count = exog[0].length;\n var modelList = jStat.arange(var_count).map(function(endog_index) {\n var exog_index =\n jStat.arange(var_count).filter(function(i){return i!==endog_index});\n return ols(jStat.col(exog, endog_index).map(function(x){ return x[0] }),\n jStat.col(exog, exog_index))\n });\n return modelList;\n }\n\n // do OLS model regress\n // exog have include const columns ,it will not generate it .In fact, exog is\n // \"design matrix\" look at\n //https://en.wikipedia.org/wiki/Design_matrix\n function ols(endog, exog) {\n var nobs = endog.length;\n var df_model = exog[0].length - 1;\n var df_resid = nobs-df_model - 1;\n var coef = jStat.lstsq(exog, endog);\n var predict =\n jStat.multiply(exog, coef.map(function(x) { return [x] }))\n .map(function(p) { return p[0] });\n var resid = jStat.subtract(endog, predict);\n var ybar = jStat.mean(endog);\n // constant cause problem\n // var SST = jStat.sum(endog.map(function(y) {\n // return Math.pow(y-ybar,2);\n // }));\n var SSE = jStat.sum(predict.map(function(f) {\n return Math.pow(f - ybar, 2);\n }));\n var SSR = jStat.sum(endog.map(function(y, i) {\n return Math.pow(y - predict[i], 2);\n }));\n var SST = SSE + SSR;\n var R2 = (SSE / SST);\n return {\n exog:exog,\n endog:endog,\n nobs:nobs,\n df_model:df_model,\n df_resid:df_resid,\n coef:coef,\n predict:predict,\n resid:resid,\n ybar:ybar,\n SST:SST,\n SSE:SSE,\n SSR:SSR,\n R2:R2\n };\n }\n\n // H0: b_I=0\n // H1: b_I!=0\n function t_test(model) {\n var subModelList = sub_regress(model.exog);\n //var sigmaHat=jStat.stdev(model.resid);\n var sigmaHat = Math.sqrt(model.SSR / (model.df_resid));\n var seBetaHat = subModelList.map(function(mod) {\n var SST = mod.SST;\n var R2 = mod.R2;\n return sigmaHat / Math.sqrt(SST * (1 - R2));\n });\n var tStatistic = model.coef.map(function(coef, i) {\n return (coef - 0) / seBetaHat[i];\n });\n var pValue = tStatistic.map(function(t) {\n var leftppf = jStat.studentt.cdf(t, model.df_resid);\n return (leftppf > 0.5 ? 1 - leftppf : leftppf) * 2;\n });\n var c = jStat.studentt.inv(0.975, model.df_resid);\n var interval95 = model.coef.map(function(coef, i) {\n var d = c * seBetaHat[i];\n return [coef - d, coef + d];\n })\n return {\n se: seBetaHat,\n t: tStatistic,\n p: pValue,\n sigmaHat: sigmaHat,\n interval95: interval95\n };\n }\n\n function F_test(model) {\n var F_statistic =\n (model.R2 / model.df_model) / ((1 - model.R2) / model.df_resid);\n var fcdf = function(x, n1, n2) {\n return jStat.beta.cdf(x / (n2 / n1 + x), n1 / 2, n2 / 2)\n }\n var pvalue = 1 - fcdf(F_statistic, model.df_model, model.df_resid);\n return { F_statistic: F_statistic, pvalue: pvalue };\n }\n\n function ols_wrap(endog, exog) {\n var model = ols(endog,exog);\n var ttest = t_test(model);\n var ftest = F_test(model);\n // Provide the Wherry / Ezekiel / McNemar / Cohen Adjusted R^2\n // Which matches the 'adjusted R^2' provided by R's lm package\n var adjust_R2 =\n 1 - (1 - model.R2) * ((model.nobs - 1) / (model.df_resid));\n model.t = ttest;\n model.f = ftest;\n model.adjust_R2 = adjust_R2;\n return model;\n }\n\n return { ols: ols_wrap };\n})();\n//To regress, simply build X matrix\n//(append column of 1's) using\n//buildxmatrix and build the Y\n//matrix using buildymatrix\n//(simply the transpose)\n//and run regress.\n\n\n\n//Regressions\n\njStat.extend({\n buildxmatrix: function buildxmatrix(){\n //Parameters will be passed in as such\n //(array1,array2,array3,...)\n //as (x1,x2,x3,...)\n //needs to be (1,x1,x2,x3,...)\n var matrixRows = new Array(arguments.length);\n for(var i=0;i<arguments.length;i++){\n var array = [1];\n matrixRows[i]= array.concat(arguments[i]);\n }\n return jStat(matrixRows);\n\n },\n\n builddxmatrix: function builddxmatrix() {\n //Paramters will be passed in as such\n //([array1,array2,...]\n var matrixRows = new Array(arguments[0].length);\n for(var i=0;i<arguments[0].length;i++){\n var array = [1]\n matrixRows[i]= array.concat(arguments[0][i]);\n }\n return jStat(matrixRows);\n\n },\n\n buildjxmatrix: function buildjxmatrix(jMat) {\n //Builds from jStat Matrix\n var pass = new Array(jMat.length)\n for(var i=0;i<jMat.length;i++){\n pass[i] = jMat[i];\n }\n return jStat.builddxmatrix(pass);\n\n },\n\n buildymatrix: function buildymatrix(array){\n return jStat(array).transpose();\n },\n\n buildjymatrix: function buildjymatrix(jMat){\n return jMat.transpose();\n },\n\n matrixmult: function matrixmult(A,B){\n var i, j, k, result, sum;\n if (A.cols() == B.rows()) {\n if(B.rows()>1){\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[k][j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n },\n\n //regress and regresst to be fixed\n\n regress: function regress(jMatX,jMatY){\n //print(\"regressin!\");\n //print(jMatX.toArray());\n var innerinv = jStat.xtranspxinv(jMatX);\n //print(innerinv);\n var xtransp = jMatX.transpose();\n var next = jStat.matrixmult(jStat(innerinv),xtransp);\n return jStat.matrixmult(next,jMatY);\n\n },\n\n regresst: function regresst(jMatX,jMatY,sides){\n var beta = jStat.regress(jMatX,jMatY);\n\n var compile = {};\n compile.anova = {};\n var jMatYBar = jStat.jMatYBar(jMatX, beta);\n compile.yBar = jMatYBar;\n var yAverage = jMatY.mean();\n compile.anova.residuals = jStat.residuals(jMatY, jMatYBar);\n\n compile.anova.ssr = jStat.ssr(jMatYBar, yAverage);\n compile.anova.msr = compile.anova.ssr / (jMatX[0].length - 1);\n\n compile.anova.sse = jStat.sse(jMatY, jMatYBar);\n compile.anova.mse =\n compile.anova.sse / (jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.sst = jStat.sst(jMatY, yAverage);\n compile.anova.mst = compile.anova.sst / (jMatY.length - 1);\n\n compile.anova.r2 = 1 - (compile.anova.sse / compile.anova.sst);\n if (compile.anova.r2 < 0) compile.anova.r2 = 0;\n\n compile.anova.fratio = compile.anova.msr / compile.anova.mse;\n compile.anova.pvalue =\n jStat.anovaftest(compile.anova.fratio,\n jMatX[0].length - 1,\n jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.rmse = Math.sqrt(compile.anova.mse);\n\n compile.anova.r2adj = 1 - (compile.anova.mse / compile.anova.mst);\n if (compile.anova.r2adj < 0) compile.anova.r2adj = 0;\n\n compile.stats = new Array(jMatX[0].length);\n var covar = jStat.xtranspxinv(jMatX);\n var sds, ts, ps;\n\n for(var i=0; i<beta.length;i++){\n sds=Math.sqrt(compile.anova.mse * Math.abs(covar[i][i]));\n ts= Math.abs(beta[i] / sds);\n ps= jStat.ttest(ts, jMatY.length - jMatX[0].length - 1, sides);\n\n compile.stats[i]=[beta[i], sds, ts, ps];\n }\n\n compile.regress = beta;\n return compile;\n },\n\n xtranspx: function xtranspx(jMatX){\n return jStat.matrixmult(jMatX.transpose(),jMatX);\n },\n\n\n xtranspxinv: function xtranspxinv(jMatX){\n var inner = jStat.matrixmult(jMatX.transpose(),jMatX);\n var innerinv = jStat.inv(inner);\n return innerinv;\n },\n\n jMatYBar: function jMatYBar(jMatX, beta) {\n var yBar = jStat.matrixmult(jMatX, beta);\n return new jStat(yBar);\n },\n\n residuals: function residuals(jMatY, jMatYBar) {\n return jStat.matrixsubtract(jMatY, jMatYBar);\n },\n\n ssr: function ssr(jMatYBar, yAverage) {\n var ssr = 0;\n for(var i = 0; i < jMatYBar.length; i++) {\n ssr += Math.pow(jMatYBar[i] - yAverage, 2);\n }\n return ssr;\n },\n\n sse: function sse(jMatY, jMatYBar) {\n var sse = 0;\n for(var i = 0; i < jMatY.length; i++) {\n sse += Math.pow(jMatY[i] - jMatYBar[i], 2);\n }\n return sse;\n },\n\n sst: function sst(jMatY, yAverage) {\n var sst = 0;\n for(var i = 0; i < jMatY.length; i++) {\n sst += Math.pow(jMatY[i] - yAverage, 2);\n }\n return sst;\n },\n\n matrixsubtract: function matrixsubtract(A,B){\n var ans = new Array(A.length);\n for(var i=0;i<A.length;i++){\n ans[i] = new Array(A[i].length);\n for(var j=0;j<A[i].length;j++){\n ans[i][j]=A[i][j]-B[i][j];\n }\n }\n return jStat(ans);\n }\n});\n // Make it compatible with previous version.\n jStat.jStat = jStat;\n\n return jStat;\n});\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t529: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// no jsonp function","__webpack_require__.nc = undefined;","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","const __WEBPACK_NAMESPACE_OBJECT__ = DG;","// Runtime system for exported C/C++-functions call.\n// It was previousely developed and does NOT provide call wasm-functions in WebWorkers.\n\n// type-to-heap correspondence\nconst heapMap = {'i32': 'HEAP32', // Int32Array\n 'f32': 'HEAPF32', // Float32Array\n};\n\n// type signature to typed array ,app\nconst typeMap = {'i32': Int32Array, // Int32Array\n 'f32': Float32Array, // Float32Array\n};\n\n// type-to-shift map\nconst shiftMap = {'i32': 2, // Int32Array\n 'f32': 2, // Float32Array\n};\n\n// type-to-column_creator map\nconst typeToColumnCreatorMap = {'i32': DG.Column.fromInt32Array,\n 'f32': DG.Column.fromFloat32Array};\n\n\n// CLASSES THAT ARE USED BY CPP-WRAPPER\n\n// simple argument: a number\nclass Arg {\n constructor(data) {\n this.data = data;\n }\n\n complementArrOfParams(arrOfParams) {\n arrOfParams.push(this.data);\n }\n\n complementArrOfTypes(arrOfTypes) {\n arrOfTypes.push('number');\n }\n\n allocateMemoryForBuffer(module) {}\n\n isMemoryForBufferAllocated() {\n return true;\n }\n\n putDataToBuffer(module) {}\n\n getDataFromBuffer(module) {}\n\n freeBuffer(module) {}\n}\n\n// column argument\nclass ArgColumn extends Arg {\n constructor(data, targetType, toUpdate = false) {\n super(data);\n this.type = targetType;\n this.toUpdate = toUpdate;\n this.buf = 0;\n this.numOfRows = data.length;\n }\n\n complementArrOfParams(arrOfParams) {\n arrOfParams.push(this.buf);\n arrOfParams.push(this.numOfRows);\n }\n\n complementArrOfTypes(arrOfTypes) {\n arrOfTypes.push('number');\n arrOfTypes.push('number');\n }\n\n allocateMemoryForBuffer(module) {\n this.buf = module._malloc(this.numOfRows * typeMap[this.type].BYTES_PER_ELEMENT);\n }\n\n isMemoryForBufferAllocated() {\n return (this.buf != 0);\n }\n\n putDataToBuffer(module) {\n if (this.isMemoryForBufferAllocated()) {\n const type = this.type;\n const shift = shiftMap[type];\n const heap = module[heapMap[type]];\n let array = null;\n const col = this.data;\n\n if (((col.type == 'int') && (type == 'i32')) ||\n ((col.type == 'double') && (type == 'f32')))\n array = col.getRawData();\n else\n array = new typeMap[type](col.getRawData());\n\n if (array)\n heap.set(array, this.buf >> shift);\n }\n }\n\n getDataFromBuffer(module) {\n if (this.toUpdate && this.isMemoryForBufferAllocated()) {\n const type = this.type;\n const heap = module[heapMap[type]];\n const buffer = this.buf;\n const bytes = typeMap[type].BYTES_PER_ELEMENT;\n const array = this.data.getRawData();\n\n for (let i = 0; i < this.numOfRows; i++)\n array[i] = heap[buffer / bytes + i];\n }\n }\n\n freeBuffer(module) {\n if (this.isMemoryForBufferAllocated()) {\n module._free(this.buf);\n this.buf = 0;\n }\n }\n}\n\n// new column argument: a new column is created\nclass ArgNewColumn extends ArgColumn {\n constructor(targetType, numOfRows) {\n super([], targetType, true);\n this.numOfRows = numOfRows;\n }\n\n putDataToBuffer(module) {}\n\n getDataFromBuffer(module) {\n if (this.toUpdate && this.isMemoryForBufferAllocated()) {\n const type = this.type;\n const heap = module[heapMap[type]];\n const buf = this.buf;\n\n const columnCreator = typeToColumnCreatorMap[type];\n\n const arr = new typeMap[type](this.numOfRows);\n\n for (let i = 0; i < arr.length; i++)\n arr[i] = heap[buf / arr.BYTES_PER_ELEMENT + i];\n\n this.data = columnCreator('name', arr);\n\n //console.log(arr);\n\n // This makes mistake, when this.numOfRows = 5 (TODO: investigate why)\n //this.data = columnCreator('name', new typeMap[type](heap.buffer, this.buf, this.numOfRows));\n\n //console.log(this.data.getRawData());\n }\n }\n}\n\n// an array of columns argument\nclass ArgColumns extends Arg {\n constructor(data, targetType, toUpdate = false) {\n super(data);\n this.type = targetType;\n this.toUpdate = toUpdate;\n this.buf = 0;\n this.numOfColumns = data.length;\n this.numOfRows = data[0].length;\n }\n\n complementArrOfParams(arrOfParams) {\n arrOfParams.push(this.buf);\n arrOfParams.push(this.numOfRows);\n arrOfParams.push(this.numOfColumns);\n }\n\n complementArrOfTypes(arrOfTypes) {\n arrOfTypes.push('number');\n arrOfTypes.push('number');\n arrOfTypes.push('number');\n }\n\n allocateMemoryForBuffer(module) {\n this.buf = module._malloc(this.numOfRows * this.numOfColumns *\n typeMap[this.type].BYTES_PER_ELEMENT);\n }\n\n isMemoryForBufferAllocated() {\n return (this.buf != 0);\n }\n\n putDataToBuffer(module) {\n if (this.isMemoryForBufferAllocated()) {\n const type = this.type;\n const shift = shiftMap[type];\n const heap = module[heapMap[type]];\n const numOfBytes = typeMap[type].BYTES_PER_ELEMENT;\n\n // put columns data to buffer\n for (let i = 0; i < this.numOfColumns; i++) {\n let array = null;\n const col = this.data[i];\n\n if (((col.type == 'int') && (type == 'i32')) ||\n ((col.type == 'double') && (type == 'f32')))\n array = col.getRawData();\n else\n array = new typeMap[type](col.getRawData());\n\n // check data array\n if (array != null)\n heap.set(array, (this.buf + i * this.numOfRows * numOfBytes) >> shift);\n }\n }\n }\n\n getDataFromBuffer(module) {\n if (this.toUpdate && this.isMemoryForBufferAllocated()) {\n const type = this.type;\n const heap = module[heapMap[type]];\n const numOfRows = this.numOfRows;\n const numOfCols = this.numOfColumns;\n const arr = new typeMap[type](heap.buffer, this.buf, numOfRows * numOfCols);\n\n for (let i = 0; i < numOfCols; i++) {\n const colData = this.data[i].getRawData();\n for (let j = 0; j < numOfRows; j++)\n colData[j] = arr[j + i * numOfRows];\n }\n }\n }\n\n freeBuffer(module) {\n if (this.isMemoryForBufferAllocated()) {\n module._free(this.buf);\n this.buf = 0;\n }\n }\n}\n\n// an array of new columns: new columns are created\nclass ArgNewColumns extends ArgColumns {\n constructor(targetType, numOfRows, numOfColumns) {\n super([[]], targetType, true);\n this.data = [];\n this.numOfColumns = numOfColumns;\n this.numOfRows = numOfRows;\n }\n\n putDataToBuffer(module) { }\n\n getDataFromBuffer(module) {\n if (this.toUpdate && this.isMemoryForBufferAllocated()) {\n const type = this.type;\n const heap = module[heapMap[type]];\n const numOfRows = this.numOfRows;\n const numOfCols = this.numOfColumns;\n const numOfBytes = typeMap[type].BYTES_PER_ELEMENT;\n const columnCreator = typeToColumnCreatorMap[type];\n const buf = this.buf;\n\n for (let i = 0; i < numOfCols; i++) {\n const arr = new typeMap[type](numOfRows);\n\n for (let j = 0; j < numOfRows; j++)\n arr[j] = heap[buf / numOfBytes + j + i * numOfRows];\n\n this.data.push(columnCreator((i + 1).toString(), arr));\n }\n\n // create columns: here, may be a problem when numOfRows = 5\n /*for(let i = 0; i < numOfCols; i++)\n this.data.push(columnCreator((i + 1).toString(), new typeMap[type](heap.buffer,\n this.buf + i * numOfRows * numOfBytes, numOfRows)));*/\n }\n }\n}\n\n// a wrapper for exported C/C++-function call\nfunction cppFuncWrapper(module, cFuncName, returnType, args) {\n let result;\n\n // allocate memory for buffers\n for (const arg of args)\n arg.allocateMemoryForBuffer(module);\n\n let isEnoughOfMemoryAllocated = true;\n\n // check memory allocation\n for (const arg of args)\n isEnoughOfMemoryAllocated &= arg.isMemoryForBufferAllocated();\n\n // run exported function if enough of memory is allocated\n if (isEnoughOfMemoryAllocated) {\n const params = []; // arguments that are put to the exported function\n const types = []; // their types\n\n // prepare data that is put to exported function\n for (const arg of args) {\n arg.complementArrOfParams(params);\n arg.complementArrOfTypes(types);\n arg.putDataToBuffer(module);\n }\n\n const extendedTypeOfReturn = (returnType == 'num') ? 'number' : null;\n\n // call exported function\n if (extendedTypeOfReturn)\n result = module.ccall(cFuncName, extendedTypeOfReturn, types, params);\n else\n result = module.ccall(cFuncName, extendedTypeOfReturn, types, params);\n\n // update and get data from buffers if required\n for (const arg of args)\n arg.getDataFromBuffer(module);\n }\n\n // clear buffers\n for (const arg of args)\n arg.freeBuffer(module);\n\n if (result != undefined)\n return result;\n} // cppFuncWrapper\n\n\n// A LAYER BETWEEN JS AND CPP-WRAPPER\n\n// Parameters creator\nconst Param = {\n intColumn(column) {\n return new ArgColumn(column, 'i32');\n },\n\n newIntColumn(numOfRows) {\n return new ArgNewColumn('i32', numOfRows);\n },\n\n intColumns(columns) {\n return new ArgColumns(columns.toList(), 'i32');\n },\n\n newIntColumns(numOfRows, numOfColumns) {\n return new ArgNewColumns('i32', numOfRows, numOfColumns);\n },\n\n floatColumn(column) {\n return new ArgColumn(column, 'f32');\n },\n\n newFloatColumn(numOfRows) {\n return new ArgNewColumn('f32', numOfRows);\n },\n\n floatColumns(columns) {\n return new ArgColumns(columns.toList(), 'f32');\n },\n\n newFloatColumns(numOfRows, numOfColumns) {\n return new ArgNewColumns('f32', numOfRows, numOfColumns);\n },\n\n int(number) {\n return new Arg(number);\n },\n\n num(number) {\n return new Arg(number);\n },\n};\n\n// Return value creator\nconst Return = {\n tableFromColumns(argColumns) {\n return DG.DataFrame.fromColumns(argColumns.data);\n },\n\n num(number) {\n return number;\n },\n\n int(number) {\n return number;\n },\n\n double(number) {\n return number;\n },\n\n column(argColumn) {\n return argColumn.data;\n },\n};\n\n// The main tool that combines all together\nexport function callWasm(module, funcName, inputs) {\n // get specification of exported C/C++-function\n const funcSpecification = module[funcName];\n\n // get argumnets\n const args = funcSpecification.arguments;\n\n // array of arguments that further are used by cpp-wrapper\n const cppFuncInput = [];\n\n // complete an input for cpp\n let i = 0;\n for (const key in args) {\n const arg = args[key];\n\n // skip auxiliry element\n if (key == '_callResult')\n continue;\n\n // create an argument\n switch (arg.type) {\n case 'floatColumns':\n case 'int':\n case 'num':\n case 'floatColumn':\n case 'intColumn':\n case 'intColumns':\n arg.data = Param[arg.type](inputs[i]);\n i++;\n break;\n case 'newFloatColumns':\n case 'newIntColumns':\n const val1 = args[arg['numOfRows']['ref']].data[arg['numOfRows']['value']];\n const val2 = args[arg['numOfColumns']['ref']].data[arg['numOfColumns']['value']];\n arg.data = Param[arg.type](val1, val2);\n break;\n case 'newFloatColumn':\n case 'newIntColumn':\n const val = args[arg['numOfRows']['ref']].data[arg['numOfRows']['value']];\n arg.data = Param[arg.type](val);\n break;\n } // switch\n\n cppFuncInput.push(args[key].data);\n } // for key\n\n // CALL EXPORTED CPP-FUNCTION\n const callResult = cppFuncWrapper(module, funcName, 'num', cppFuncInput);\n\n // store result that is returned by exported cpp-function\n args._callResult = Param.num(callResult);\n\n // create output\n const output = funcSpecification.output;\n\n // if a single object must be returned\n if (output['type'] != 'objects')\n return Return[output['type']](args[output['source']].data);\n\n const arrayToReturn = [];\n\n // push data of the required arguments\n for (const name of output['source'])\n arrayToReturn.push(args[name].data.data);\n\n return arrayToReturn;\n} // callWasm\n","// Utilities for calling wasm-functions via webworker.\n\n// We use an approach that is well described here:\n// https://becominghuman.ai/passing-and-returning-webassembly-array-parameters-a0f572c65d97\n// It has been modified for usage in DATAGROK.\n\n// Constants for wasm-functions in webworkers runtime system\nconst TYPE = 'type';\nconst NUM_TYPE = 'num';\nconst FLOAT_COLUMN_TYPE = 'floatColumn';\nconst INT_COLUMN_TYPE = 'intColumn';\nconst FLOAT_COLUMNS_TYPE = 'floatColumns';\nconst NEW_FLOAT_COLUMNS_TYPE = 'newFloatColumns';\nconst INT_COLUMNS_TYPE = 'intColumns';\nconst NEW_INT_COLUMNS_TYPE = 'newIntColumns';\nconst NEW_FLOAT_COLUMN_TYPE = 'newFloatColumn';\nconst NEW_INT_COLUMN_TYPE = 'newIntColumn';\nconst COLUMN = 'column';\nconst CALL_RESULT = '_callResult';\nconst NUM_OF_ROWS = 'numOfRows';\nconst NUM_OF_COLUMNS = 'numOfColumns';\nconst REF = 'ref';\nconst VALUE = 'value';\nconst TABLE_OF_COLUMNS = 'tableFromColumns';\nconst OBJECTS = 'objects';\nconst INT_TYPE = 'int';\nconst DOUBLE_TYPE = 'double';\nconst NUMBER = 'number';\n\n// Type-to-heap correspondence.\n// It is required for JS-module generated by Emscripten,\n// and it is used, when passing array data to/from wasm-functions.\n// More info can be found at the following link:\n// https://becominghuman.ai/passing-and-returning-webassembly-array-parameters-a0f572c65d97\nconst heapMap = {\n 'intColumn': \"HEAP32\",\n 'floatColumn': \"HEAPF32\",\n 'floatColumns': \"HEAPF32\",\n 'newFloatColumns': \"HEAPF32\",\n 'intColumns': \"HEAP32\",\n 'newIntColumns': \"HEAP32\",\n 'newFloatColumn': \"HEAPF32\",\n 'newIntColumn': \"HEAP32\"\n };\n\n// Type signature to typed array map.\n// It is used, when manipulating column(s).\nconst typeMap = {\n 'intColumn': Int32Array,\n 'floatColumn': Float32Array,\n 'floatColumns': Float32Array,\n 'newFloatColumns': Float32Array,\n 'intColumns': Int32Array, \n 'newIntColumns': Int32Array,\n 'newFloatColumn': Float32Array,\n 'newIntColumn': Int32Array\n }; \n\n// Type-to-shift map.\n// It is used, when passing array to/from wasm-functions.\n// More info can be found at the following link:\n// https://becominghuman.ai/passing-and-returning-webassembly-array-parameters-a0f572c65d97 \nconst shiftMap = {'intColumn': 2, \n 'floatColumn': 2, \n 'floatColumns': 2, \n 'newFloatColumns': 2, \n 'intColumns': 2, \n 'newIntColumns': 2,\n 'newFloatColumn': 2,\n 'newIntColumn': 2\n }; \n\n// Get input for C++-function.\n// This function takes specification of arguments (argsSpecification) & input data (inputVals)\n// and returns input that will be further used in cpp/wasm-function.\nexport function getCppInput(argsSpecification, inputVals) {\n let cppFuncInput = [];\n let ref;\n\n // complete an input for cpp\n let i = 0;\n for(const key in argsSpecification) {\n const arg = argsSpecification[key]; \n const type = arg.type;\n \n // skip auxiliry element\n if(key === CALL_RESULT) \n continue;\n\n // here, we consider each type of input\n switch(type) { \n \n // numbers\n case NUM_TYPE: \n case INT_TYPE:\n case DOUBLE_TYPE:\n arg.data = inputVals[i];\n i++;\n break;\n\n // column\n case INT_COLUMN_TYPE:\n case FLOAT_COLUMN_TYPE:\n\n let array;\n\n // this is OK if type of column and target type coinside\n //array = inputVals[i].getRawData();\n\n let col = inputVals[i];\n\n // here, we check types and perform an appropriate transform\n if( ( (col.type === INT_TYPE) && (type === INT_COLUMN_TYPE) ) \n || ( (col.type === DOUBLE_TYPE) && (type === FLOAT_COLUMN_TYPE) ) )\n array = col.getRawData();\n else\n array = new typeMap[type](col.getRawData());\n\n /*if(((col.type == 'int') && (type == INT_COLUMN_TYPE)) \n || ((col.type == 'double') && (type == FLOAT_COLUMN_TYPE)))\n array = col.getRawData();\n else\n array = new typeMap[type](col.getRawData());*/\n\n // check types\n arg.data = { 'array': array,\n 'numOfRows': array.length}; \n \n i++;\n break;\n\n // new column \n case NEW_INT_COLUMN_TYPE:\n case NEW_FLOAT_COLUMN_TYPE:\n let val = 0; \n\n ref = arg[NUM_OF_ROWS][REF];\n\n if (argsSpecification[ref].type === NUM_TYPE)\n val = argsSpecification[ref].data;\n else\n val = argsSpecification[ref].data[arg[NUM_OF_ROWS][VALUE]]; \n\n arg.data = {'numOfRows': val};\n\n i++;\n break;\n\n // columns or column_list\n case INT_COLUMNS_TYPE:\n case FLOAT_COLUMNS_TYPE: \n let arrays = []; \n\n // this is OK if type of columns and target type coinside\n //for(let col of inputVals[i].toList())\n // arrays.push(col.getRawData());\n\n // here, we check types and perform an appropriate transform\n for(let col of inputVals[i].toList())\n if( ( (col.type === INT_TYPE) && (type === INT_COLUMN_TYPE) ) \n || ( (col.type === DOUBLE_TYPE) && (type === FLOAT_COLUMN_TYPE) ) )\n arrays.push(col.getRawData());\n else\n arrays.push(new typeMap[type](col.getRawData()));\n \n /*for(let col of inputVals[i].toList())\n if(((col.type == 'int') && (type == INT_COLUMN_TYPE)) \n || ((col.type == 'double') && (type == FLOAT_COLUMN_TYPE)))\n arrays.push(col.getRawData());\n else\n arrays.push(new typeMap[type](col.getRawData()));*/\n\n arg.data = { 'arrays': arrays,\n 'numOfRows': arrays[0].length,\n 'numOfColumns': arrays.length};\n\n i++; \n break;\n\n // new columns or new column_list\n case NEW_INT_COLUMNS_TYPE:\n case NEW_FLOAT_COLUMNS_TYPE:\n let val1 = 0;\n let val2 = 0;\n\n ref = arg[NUM_OF_ROWS][REF];\n\n if (argsSpecification[ref].type === NUM_TYPE)\n val1 = argsSpecification[ref].data;\n else\n val1 = argsSpecification[ref].data[arg[NUM_OF_ROWS][VALUE]];\n\n ref = arg[NUM_OF_COLUMNS][REF];\n\n //console.log('Ref:');\n //console.log(ref);\n //console.log(argsSpecification[ref].data);\n\n if (argsSpecification[ref].type === NUM_TYPE)\n val2 = argsSpecification[ref].data;\n else\n val2 = argsSpecification[ref].data[arg[NUM_OF_COLUMNS][VALUE]]; \n\n arg.data = {'numOfRows': val1,\n 'numOfColumns': val2};\n\n i++;\n break; \n\n default: \n return; // TODO: specify behaviour \n } // switch \n\n cppFuncInput.push(arg);\n } // for key\n\n //console.log('cppFuncInput:');\n //console.log(cppFuncInput);\n\n return cppFuncInput;\n} // getCppInput\n\n// Allocate memory for buffers for array data\nfunction allocateMemoryForBuffer(module, inputs) {\n for(const arg of inputs) { \n const type = arg.type;\n\n switch(type) { // Process each type of input\n\n // numbers\n case NUM_TYPE: \n case INT_TYPE:\n case DOUBLE_TYPE:\n break;\n\n // column & new column\n case INT_COLUMN_TYPE:\n case FLOAT_COLUMN_TYPE:\n case NEW_FLOAT_COLUMN_TYPE:\n case NEW_INT_COLUMN_TYPE:\n arg.data.buf = module._malloc(arg.data.numOfRows * typeMap[type].BYTES_PER_ELEMENT);\n break;\n\n // columns & new columns\n case INT_COLUMNS_TYPE: \n case NEW_INT_COLUMNS_TYPE:\n case FLOAT_COLUMNS_TYPE: \n case NEW_FLOAT_COLUMNS_TYPE: // allocation memory for columns that are created\n arg.data.buf = module._malloc(arg.data.numOfRows * arg.data.numOfColumns \n * typeMap[type].BYTES_PER_ELEMENT);\n break;\n\n // TODO: process other cases and mistakes\n default:\n break; \n } \n }\n \n //console.log('inputs after memory allocation:');\n //console.log(inputs);\n} // allocateMemoryForBuffer\n\n// Get array of values that are put to wasm-function.\nfunction getArrOfWasmParams(inputs) {\n let params = [];\n\n // Process each type of input\n for(const arg of inputs) {\n switch (arg.type) {\n\n // numbers\n case NUM_TYPE: \n case INT_TYPE:\n case DOUBLE_TYPE:\n params.push(arg.data);\n break;\n\n // column & new column\n case INT_COLUMN_TYPE:\n case FLOAT_COLUMN_TYPE:\n case NEW_FLOAT_COLUMN_TYPE:\n case NEW_INT_COLUMN_TYPE:\n params.push(arg.data.buf); \n params.push(arg.data.numOfRows);\n break;\n \n // columns & new columns\n case INT_COLUMNS_TYPE:\n case NEW_INT_COLUMNS_TYPE:\n case FLOAT_COLUMNS_TYPE:\n case NEW_FLOAT_COLUMNS_TYPE: \n params.push(arg.data.buf);\n params.push(arg.data.numOfRows);\n params.push(arg.data.numOfColumns);\n break;\n \n // TODO: process other cases and mistakes\n default:\n break;\n }\n }\n\n return params;\n} // getArrOfWasmParams\n\n// Get array of types that are put to wasm-function.\nfunction getArrOfWasmTypes(inputs) {\n let types = [];\n\n for(const arg of inputs) {\n switch (arg.type) { // Process each type of input\n\n // numbers\n case NUM_TYPE:\n case INT_TYPE:\n case DOUBLE_TYPE:\n types.push(NUMBER);\n break;\n\n // column & new column\n case INT_COLUMN_TYPE:\n case FLOAT_COLUMN_TYPE:\n case NEW_FLOAT_COLUMN_TYPE:\n case NEW_INT_COLUMN_TYPE:\n types.push(NUMBER); \n types.push(NUMBER);\n break;\n \n // columns & new columns\n case INT_COLUMNS_TYPE:\n case NEW_INT_COLUMNS_TYPE:\n case FLOAT_COLUMNS_TYPE:\n case NEW_FLOAT_COLUMNS_TYPE:\n types.push(NUMBER);\n types.push(NUMBER);\n types.push(NUMBER);\n break;\n\n // TODO: process other cases and mistakes\n default:\n break;\n }\n }\n\n return types;\n} // getArrOfWasmTypes\n\n// Put array data to buffer\nfunction putDataToBuffer(module, inputs) {\n let shift;\n let heap; \n \n for(const arg of inputs) {\n const type = arg.type;\n\n switch (type) { // Process each type of input\n\n // numbers\n case NUM_TYPE:\n case INT_TYPE:\n case DOUBLE_TYPE: \n break;\n \n // column\n case INT_COLUMN_TYPE:\n case FLOAT_COLUMN_TYPE: \n shift = shiftMap[type];\n heap = module[heapMap[type]]; \n heap.set(arg.data.array, arg.data.buf >> shift);\n break;\n \n // columns\n case INT_COLUMNS_TYPE:\n case FLOAT_COLUMNS_TYPE:\n shift = shiftMap[type];\n heap = module[heapMap[type]];\n let numOfBytes = typeMap[type].BYTES_PER_ELEMENT;\n let buf = arg.data.buf;\n let numOfColumns = arg.data.numOfColumns;\n let numOfRows = arg.data.numOfRows;\n let arrays = arg.data.arrays;\n\n for(let i = 0; i < numOfColumns; i++)\n heap.set(arrays[i], (buf + i * numOfRows * numOfBytes) >> shift);\n \n break;\n\n // new column(s)\n case NEW_INT_COLUMNS_TYPE:\n case NEW_FLOAT_COLUMNS_TYPE:\n case NEW_FLOAT_COLUMN_TYPE:\n case NEW_INT_COLUMN_TYPE: \n break;\n\n // TODO: process other cases and mistakes\n default:\n break;\n }\n }\n} // putDataToBuffer\n\n// Get array data from buffer.\nfunction getDataFromBuffer(module, inputs) {\n\n let heap;\n let numOfRows;\n let numOfCols;\n let numOfBytes; \n let buf;\n\n for(const arg of inputs) {\n const type = arg.type;\n\n switch (type) { // Process each type of input\n \n // number\n case NUM_TYPE:\n case INT_TYPE:\n case DOUBLE_TYPE:\n break;\n\n // column(s)\n case INT_COLUMN_TYPE:\n case FLOAT_COLUMN_TYPE:\n case FLOAT_COLUMNS_TYPE: \n case INT_COLUMNS_TYPE: \n break;\n\n // new column\n case NEW_FLOAT_COLUMN_TYPE:\n case NEW_INT_COLUMN_TYPE:\n heap = module[heapMap[type]];\n numOfRows = arg.data.numOfRows;\n numOfBytes = typeMap[type].BYTES_PER_ELEMENT; \n buf = arg.data.buf;\n let array = new typeMap[type](numOfRows);\n\n for(let j = 0; j < numOfRows; j++)\n array[j] = heap[buf / numOfBytes + j];\n\n arg.array = array;\n\n break;\n\n // new columns\n case NEW_INT_COLUMNS_TYPE:\n case NEW_FLOAT_COLUMNS_TYPE: \n heap = module[heapMap[type]];\n numOfRows = arg.data.numOfRows;\n numOfCols = arg.data.numOfColumns;\n numOfBytes = typeMap[type].BYTES_PER_ELEMENT; \n buf = arg.data.buf;\n let arrays = [];\n\n for(let i = 0; i < numOfCols; i++) {\n let arr = new typeMap[type](numOfRows);\n\n for(let j = 0; j < numOfRows; j++)\n arr[j] = heap[buf / numOfBytes + j + i * numOfRows]; \n \n arrays.push(arr);\n }\n\n arg.arrays = arrays;\n \n break;\n \n // TODO: process other cases and mistakes\n default:\n break;\n }\n } \n} // getDataFromBuffer\n\n// Clear memory allocated for array data\nfunction clearMemoryForBuffer(module, inputs) {\n for(const arg of inputs) \n switch(arg.type) { // process each type of input\n\n // number\n case NUM_TYPE:\n case INT_TYPE:\n case DOUBLE_TYPE:\n break;\n\n // each non-number case\n case INT_COLUMN_TYPE:\n case FLOAT_COLUMN_TYPE: \n case INT_COLUMNS_TYPE:\n case NEW_INT_COLUMNS_TYPE:\n case FLOAT_COLUMNS_TYPE:\n case NEW_FLOAT_COLUMNS_TYPE:\n case NEW_FLOAT_COLUMN_TYPE:\n case NEW_INT_COLUMN_TYPE:\n module._free(arg.data.buf);\n break;\n\n // TODO: process other cases and mistakes\n default:\n break; \n } \n} // clearMemoryForBuffer\n\n// Extract newly created data: new column(s) are created\nfunction extractNewlyCreatedData(funcSpecificationArgs, argsAfterWasmCall) {\n // type-to-column_creator map\n const typeToColumnCreatorMap = {'newFloatColumns': DG.Column.fromFloat32Array,\n 'newIntColumns': DG.Column.fromInt32Array,\n 'newFloatColumn': DG.Column.fromFloat32Array,\n 'newIntColumn': DG.Column.fromInt32Array};\n\n let i = 0;\n\n for(const key in funcSpecificationArgs) \n {\n const arg = funcSpecificationArgs[key];\n\n switch(arg.type){ // Process each type\n\n // number\n case NUM_TYPE:\n case INT_TYPE:\n case DOUBLE_TYPE:\n break;\n\n // column(s)\n case INT_COLUMN_TYPE:\n case FLOAT_COLUMN_TYPE:\n case FLOAT_COLUMNS_TYPE:\n case INT_COLUMNS_TYPE:\n break;\n\n // new column\n case NEW_FLOAT_COLUMN_TYPE:\n case NEW_INT_COLUMN_TYPE:\n let name;\n\n // specify name for column\n if(arg.name == undefined)\n name = (0).toString();\n else \n names = arg.name;\n\n arg.column = typeToColumnCreatorMap[arg.type](name,\n argsAfterWasmCall[i].array);\n break;\n\n // new columns\n case NEW_INT_COLUMNS_TYPE:\n case NEW_FLOAT_COLUMNS_TYPE:\n let columns = [];\n let length = argsAfterWasmCall[i].arrays.length;\n\n let names = [];\n\n // specify name for column\n if(arg.names == undefined)\n for(let k = 1; k <= length; k++)\n names.push((k).toString());\n else names = arg.names;\n\n for(let j = 0; j < length; j++)\n columns.push(typeToColumnCreatorMap[arg.type](names[j],\n argsAfterWasmCall[i].arrays[j]));\n\n arg.columns = columns;\n \n break;\n\n // TODO: process other cases and mistakes\n default:\n break;\n }\n\n i++;\n }\n} // extractNewlyCreatedData\n\n// Get output data: overall output is created\nfunction getOutput(funcSpecification) { \n let output = funcSpecification.output;\n \n const typeToDataFieldMap = {'newFloatColumns': 'columns',\n 'newIntColumns': 'columns',\n 'newFloatColumn': 'column',\n 'newIntColumn': 'column'};\n\n switch(output.type) {\n\n case NUM_TYPE:\n case INT_TYPE:\n case DOUBLE_TYPE:\n return funcSpecification.arguments[output.source];\n break;\n\n case COLUMN:\n return funcSpecification.arguments[output.source].column;\n break;\n\n case TABLE_OF_COLUMNS:\n return DG.DataFrame.fromColumns(funcSpecification.arguments[output.source].columns);\n break;\n\n case OBJECTS:\n let arrayToReturn = [];\n \n // push data of the required arguments\n for(let name of output.source) {\n let arg = funcSpecification.arguments[name];\n arrayToReturn.push(arg[typeToDataFieldMap[arg.type]]);\n } \n\n return arrayToReturn;\n break;\n\n // TODO: process other cases and mistakes\n default:\n break;\n }\n\n} // getOutput\n\n// Clear newly created data fields (new column(s))\nfunction clearNewlyCreatedData(funcSpecificationArgs) { \n for(const key in funcSpecificationArgs) {\n const arg = funcSpecificationArgs[key];\n\n switch (arg.type) {\n case NUM_TYPE:\n case INT_TYPE:\n case DOUBLE_TYPE:\n case INT_COLUMN_TYPE:\n case FLOAT_COLUMN_TYPE: \n case INT_COLUMNS_TYPE:\n case FLOAT_COLUMNS_TYPE:\n break;\n\n case NEW_INT_COLUMN_TYPE:\n case NEW_FLOAT_COLUMN_TYPE:\n arg.column = null; \n break;\n\n case NEW_INT_COLUMNS_TYPE:\n case NEW_FLOAT_COLUMNS_TYPE:\n arg.columns = null;\n break;\n \n // TODO: process other cases and mistakes\n default:\n break;\n }\n }\n} // clearNewlyCreatedData\n\n// THE MAIN FUNCTION: a wrapper for C++-function call\nexport function cppWrapper(module, args, cppFuncName, returnType) {\n // allocate memory for arrays that are passed to C++-function\n allocateMemoryForBuffer(module, args);\n\n // put data (just column(s)) to allocated buffers\n putDataToBuffer(module, args);\n\n // create array of parameters that are passed to C++-function\n let params = getArrOfWasmParams(args);\n\n //console.log('params:');\n //console.log(params);\n\n // create array of parameters' types that are passed to C++-function\n let types = getArrOfWasmTypes(args);\n \n //console.log('types:');\n //console.log(types);\n\n // call wasm-function\n let result = module.ccall(cppFuncName, returnType, types, params);\n \n //console.log(result);\n\n // get data from buffers (just column(s))\n getDataFromBuffer(module, args); \n\n // clear memory that was previousely allocated\n clearMemoryForBuffer(module, args);\n\n //console.log('done');\n\n return result;\n}\n\n// Get the required output.\n// It takes a specification of the function and the data computed\n// and extracts the required results.\nexport function getResult(funcSpecification, dataFromWebWorker) {\n funcSpecification.arguments._callResult = dataFromWebWorker.callResult; \n\n extractNewlyCreatedData(funcSpecification.arguments, dataFromWebWorker.args); \n\n let outPut = getOutput(funcSpecification);\n\n // Below, we remove newly created column(s), which are created at the extraction-step.\n // It is especially required, when multiple call of wasm-functions in webworker.\n clearNewlyCreatedData(funcSpecification.arguments);\n\n return outPut;\n}","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\n// Inputs correctness check tools\n\n//Limitation constants\nconst COMP_MIN = 1;\nconst SAMPLES_COUNT_MIN = 1;\nconst FEATURES_COUNT_MIN = 1;\nconst PERCENTAGE_MIN = 0;\nconst PERCENTAGE_MAX = 100;\nconst MAX_ELEMENTS_COUNT = 100000000;\n\n// Error messages\nconst COMP_POSITVE_MES = 'components must be positive.';\nconst COMP_EXCESS = 'components must not be greater than features count.';\nconst INCORERRECT_MIN_MAX_MES = 'min must be less than max.';\nconst INCORERRECT_FEATURES_MES = 'features must be positive.';\nconst INCORERRECT_SAMPLES_MES = 'samples must be positive.';\nconst INCORERRECT_PERCENTAGE_MES = 'violators percentage must be from the range from 0 to 100.';\nconst DATAFRAME_IS_TOO_BIG_MES = 'dataframe is too big.';\nconst UNSUPPORTED_COLUMN_TYPE_MES = 'unsupported column type: ';\nconst INCORRECT_MIN_DIST_MES = 'min distance must be positive.';\nconst INCORRECT_SPREAD_MES = 'spread must be positive.';\nconst INCORRECT_EPOCH_MES = 'number of epoch must be at least 1.';\nconst INCORRECT_NEIBORS_MES = 'number of neibors must be at least 2 and not greater than samples count.';\nconst INCORRECT_ITERATIONS_MES = 'number of iterations must be at least 1.';\nconst INCORRECT_LEARNING_RATE_MES = 'learning rate must be positive.';\nconst INCORRECT_PERPLEXITY_MES = 'perplexity must be at least 2 and not greater than samples count.';\nconst INCORRECT_STEPS_MES = 'steps must be non-negative.';\nconst INCORRECT_CYCLES_MES = 'cycles must be positive.';\nconst INCORRECT_CUTOFF_MES = 'cutoff must be non-negative.';\n\n/** Check column type */\nexport function checkColumnType(col: DG.Column): void {\n if ((col.type != DG.COLUMN_TYPE.FLOAT) && (col.type != DG.COLUMN_TYPE.INT))\n throw new Error(UNSUPPORTED_COLUMN_TYPE_MES + col.type);\n}\n\n/** Check missing values */\nexport function checkMissingVals(col: DG.Column): void {\n if (col.stats.missingValueCount > 0 )\n throw new Error(`The column '${col.name}' has missing values.`);\n}\n\n// Check dimension reducer inputs\nexport function checkDimensionReducerInputs(features: DG.ColumnList, components: number): void {\n if (components < COMP_MIN)\n throw new Error(COMP_POSITVE_MES);\n\n if (components > features.length)\n throw new Error(COMP_EXCESS);\n\n for (const col of features) {\n checkColumnType(col);\n checkMissingVals(col);\n }\n}\n\n// Check UMAP inputs\nexport function checkUMAPinputs(features: DG.ColumnList, components: number, epochs: number,\n neighbors: number, minDist: number, spread: number): void {\n // General dim reducer checks\n checkDimensionReducerInputs(features, components);\n\n // Check data total size\n if (features.length * features.byIndex(0).length > MAX_ELEMENTS_COUNT)\n throw new Error(DATAFRAME_IS_TOO_BIG_MES);\n\n // UMAP specific checks\n\n if (minDist <= 0)\n throw new Error(INCORRECT_MIN_DIST_MES);\n\n if (spread <= 0)\n throw new Error(INCORRECT_SPREAD_MES);\n\n if (epochs < 1)\n throw new Error(INCORRECT_EPOCH_MES);\n\n if ((neighbors < 2) || (neighbors > features.byIndex(0).length))\n throw new Error(INCORRECT_NEIBORS_MES);\n}\n\n// Check t-SNE inputs\nexport function checkTSNEinputs(features: DG.ColumnList, components: number,\n learningRate: number, perplexity: number, iterations: number): void {\n // General dim reducer checks\n checkDimensionReducerInputs(features, components);\n\n // Check data total size\n if (features.length * features.byIndex(0).length > MAX_ELEMENTS_COUNT)\n throw new Error(DATAFRAME_IS_TOO_BIG_MES);\n\n // t-SNE specific checks\n\n if (learningRate < 0)\n throw new Error(INCORRECT_LEARNING_RATE_MES);\n\n if (iterations < 1)\n throw new Error(INCORRECT_ITERATIONS_MES);\n\n if ((perplexity < 2) || (perplexity > features.byIndex(0).length))\n throw new Error(INCORRECT_PERPLEXITY_MES);\n}\n\n// Check SPE inputs\nexport function checkSPEinputs(features: DG.ColumnList, dimension: number,\n steps: number, cycles: number, cutoff: number, lambda: number): void {\n // General dim reducer checks\n checkDimensionReducerInputs(features, dimension);\n\n // Check data total size\n if (features.length * features.byIndex(0).length > MAX_ELEMENTS_COUNT)\n throw new Error(DATAFRAME_IS_TOO_BIG_MES);\n\n // SPE specific checks\n\n if (steps < 0)\n throw new Error(INCORRECT_STEPS_MES);\n\n if (cycles <= 0)\n throw new Error(INCORRECT_CYCLES_MES);\n\n if (cutoff < 0)\n throw new Error(INCORRECT_CUTOFF_MES);\n\n if (lambda <= 0)\n throw new Error(INCORRECT_LEARNING_RATE_MES);\n}\n\n// Check wasm dimension reducer inputs\nexport function checkWasmDimensionReducerInputs(features: DG.ColumnList, components: number): void {\n // General dim reducer checks\n checkDimensionReducerInputs(features, components);\n\n // Check data total size\n if (features.length * features.byIndex(0).length > MAX_ELEMENTS_COUNT)\n throw new Error(DATAFRAME_IS_TOO_BIG_MES);\n}\n\n// Check inputs of data for SVM testing generator\nexport function checkGeneratorSVMinputs(samplesCount: number, featuresCount: number,\n min: number, max: number, violatorsPercentage: number): void {\n if (min >= max)\n throw new Error(INCORERRECT_MIN_MAX_MES);\n\n if (featuresCount < FEATURES_COUNT_MIN)\n throw new Error(INCORERRECT_FEATURES_MES);\n\n if (samplesCount < SAMPLES_COUNT_MIN)\n throw new Error(INCORERRECT_SAMPLES_MES);\n\n if ((violatorsPercentage < PERCENTAGE_MIN) || (violatorsPercentage > PERCENTAGE_MAX))\n throw new Error(INCORERRECT_PERCENTAGE_MES);\n}\n\n// Returns rows of column data\nexport function getRowsOfNumericalColumnns(columnList: DG.ColumnList): any[][] {\n const columns = columnList.toList();\n const rowCount = columns[0].length;\n const colCount = columns.length;\n\n const output = [] as any[][];\n\n for (let i = 0; i < rowCount; ++i)\n output.push(Array(colCount));\n\n for (let j = 0; j < colCount; ++j) {\n const col = columns[j];\n\n checkColumnType(col);\n\n const array = col.getRawData();\n\n for (let i = 0; i < rowCount; ++i)\n output[i][j] = array[i];\n }\n\n return output;\n}\n","/* eslint-disable max-len */\n// Test data generation tools\n\n/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {checkGeneratorSVMinputs} from './utils';\nimport {_generateDatasetInWebWorker} from '../wasm/EDAAPI';\n\nconst SVM_GEN_FEATURES_INDEX = 0;\nconst SVM_GEN_LABELS_INDEX = 1;\nconst SVM_FEATURE_NAME = 'Feature #';\nconst SVM_LABEL_NAME = 'Label';\n\n// Returns the dataframe \"cars\"\nexport function carsDataframe(): DG.DataFrame {\n return DG.DataFrame.fromColumns(\n [\n DG.Column.fromStrings('model', ['alfaromeo', 'audi', 'bmw', 'chevrolet', 'dodge1', 'dodge2', 'honda1', 'honda2', 'isuzu', 'jaguar', 'mazda', 'mercedes', 'mercury', 'mitsubishi', 'nissan1', 'nissan2', 'peugot', 'plymouth', 'porsche', 'saab', 'subaru', 'toyota1', 'toyota2', 'toyota3', 'toyota4', 'volkswagen1', 'volkswagen2', 'volvo1', 'volvo2', 'volvo3']),\n DG.Column.fromInt32Array('diesel', new Int32Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1])),\n DG.Column.fromInt32Array('turbo', new Int32Array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1])),\n DG.Column.fromInt32Array('two.doors', new Int32Array([1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0])),\n DG.Column.fromInt32Array('hatchback', new Int32Array([1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0])),\n DG.Column.fromFloat32Array('wheel.base', new Float32Array([94.5, 105.80000305175781, 101.19999694824219, 94.5, 93.69999694824219, 93.69999694824219, 93.69999694824219, 96.5, 94.30000305175781, 113, 93.0999984741211, 115.5999984741211, 102.69999694824219, 93.69999694824219, 94.5, 94.5, 93.69999694824219, 114.19999694824219, 89.5, 99.0999984741211, 97.19999694824219, 95.69999694824219, 95.69999694824219, 98.4000015258789, 102.4000015258789, 97.30000305175781, 100.4000015258789, 104.30000305175781, 109.0999984741211, 109.0999984741211])),\n DG.Column.fromFloat32Array('length', new Float32Array([171.1999969482422, 192.6999969482422, 176.8000030517578, 158.8000030517578, 157.3000030517578, 157.3000030517578, 150, 175.39999389648438, 170.6999969482422, 199.60000610351562, 166.8000030517578, 202.60000610351562, 178.39999389648438, 157.3000030517578, 170.1999969482422, 165.3000030517578, 157.3000030517578, 198.89999389648438, 168.89999389648438, 186.60000610351562, 172, 158.6999969482422, 166.3000030517578, 176.1999969482422, 175.60000610351562, 171.6999969482422, 180.1999969482422, 188.8000030517578, 188.8000030517578, 188.8000030517578])),\n DG.Column.fromFloat32Array('width', new Float32Array([65.5, 71.4000015258789, 64.80000305175781, 63.599998474121094, 63.79999923706055, 63.79999923706055, 64, 65.19999694824219, 61.79999923706055, 69.5999984741211, 64.19999694824219, 71.69999694824219, 68, 64.4000015258789, 63.79999923706055, 63.79999923706055, 63.79999923706055, 68.4000015258789, 65, 66.5, 65.4000015258789, 63.599998474121094, 64.4000015258789, 65.5999984741211, 66.5, 65.5, 66.9000015258789, 67.19999694824219, 68.80000305175781, 68.9000015258789])),\n DG.Column.fromFloat32Array('height', new Float32Array([52.400001525878906, 55.70000076293945, 54.29999923706055, 52, 50.79999923706055, 50.599998474121094, 52.599998474121094, 54.099998474121094, 53.5, 52.79999923706055, 54.099998474121094, 56.29999923706055, 54.79999923706055, 50.79999923706055, 53.5, 54.5, 50.599998474121094, 58.70000076293945, 51.599998474121094, 56.099998474121094, 52.5, 54.5, 53, 52, 54.900001525878906, 55.70000076293945, 55.099998474121094, 56.20000076293945, 55.5, 55.5])),\n DG.Column.fromInt32Array('curb.weight', new Int32Array([2823, 2844, 2395, 1909, 2128, 1967, 1956, 2304, 2337, 4066, 1950, 3770, 2910, 1918, 2024, 1951, 1967, 3430, 2800, 2695, 2190, 1985, 2275, 2551, 2480, 2261, 2661, 2912, 3049, 3217])),\n DG.Column.fromInt32Array('eng.size', new Int32Array([152, 136, 108, 90, 98, 90, 92, 110, 111, 258, 91, 183, 140, 92, 97, 97, 90, 152, 194, 121, 108, 92, 110, 146, 110, 97, 136, 141, 141, 145])),\n DG.Column.fromInt32Array('horsepower', new Int32Array([154, 110, 101, 70, 102, 68, 76, 86, 78, 176, 68, 123, 175, 68, 69, 69, 68, 95, 207, 110, 82, 62, 56, 116, 73, 52, 110, 114, 160, 106])),\n DG.Column.fromInt32Array('peak.rpm', new Int32Array([5000, 5500, 5800, 5400, 5500, 5500, 6000, 5800, 4800, 4750, 5000, 4350, 5000, 5500, 5200, 5200, 5500, 4150, 5900, 5250, 4400, 4800, 4500, 4800, 4500, 4800, 5500, 5400, 5300, 4800])),\n DG.Column.fromInt32Array('symbol', new Int32Array([1, 1, 2, 0, 1, 1, 1, 0, 0, 0, 1, -1, 1, 2, 1, 1, 1, 0, 3, 2, 0, 1, 0, 2, -1, 2, 0, -2, -1, -1])),\n DG.Column.fromInt32Array('city.mpg', new Int32Array([19, 19, 23, 38, 24, 31, 30, 27, 24, 15, 31, 22, 19, 37, 31, 31, 31, 25, 17, 21, 28, 35, 34, 24, 30, 37, 19, 23, 19, 26])),\n DG.Column.fromInt32Array('highway.mpg', new Int32Array([26, 25, 29, 43, 30, 38, 34, 33, 29, 19, 38, 25, 24, 41, 37, 37, 38, 25, 25, 28, 33, 39, 36, 30, 33, 46, 24, 28, 25, 27])),\n DG.Column.fromInt32Array('price', new Int32Array([16500, 17710, 16430, 6575, 7957, 6229, 7129, 8845, 6785, 35550, 7395, 31600, 16503, 5389, 7349, 7299, 6229, 13860, 37028, 12170, 7775, 5348, 7898, 9989, 10698, 7775, 13295, 12940, 19045, 22470])),\n ]);\n} // carsDataframe\n\n// Generate dataset for testing binary classifiers\nexport async function testDataForBinaryClassification(kernel: number, kernelParams: Array<number>,\n name: string, samplesCount: number, featuresCount: number, min: number,\n max: number, violatorsPercentage: number): Promise<DG.DataFrame> {\n // check inputs\n checkGeneratorSVMinputs(samplesCount, featuresCount, min, max, violatorsPercentage);\n\n // kernel params column\n const kernelParamsCol = DG.Column.fromList('double', 'kernelParams', kernelParams);\n\n // CALL WASM-COMPUTATIONS\n let _output: any;\n const _promise = _generateDatasetInWebWorker(kernel, kernelParamsCol,\n samplesCount, featuresCount, min, max, violatorsPercentage);\n\n await _promise.then(\n (_result) => {_output = _result;},\n (_error) => {throw new Error(`Error: ${_error}`);},\n );\n\n // Rename labels column\n _output[SVM_GEN_LABELS_INDEX].name = SVM_LABEL_NAME;\n\n // Rename feature columns\n for (const col of _output[SVM_GEN_FEATURES_INDEX])\n col.name = SVM_FEATURE_NAME + col.name;\n\n // Create dataframe\n const df = DG.DataFrame.fromColumns(_output[SVM_GEN_FEATURES_INDEX]);\n df.name = name;\n df.columns.add(_output[SVM_GEN_LABELS_INDEX]);\n\n return df;\n} // testDataForMachineLearning\n","// The following code is generated automatically.\n// JavaScript API for call wasm-functions from the module EDA\n\n// Imports for call wasm runtime-system: in the main stream and in webworkers\nimport {callWasm} from '../wasm/callWasm';\nimport {getCppInput, getResult} from '../wasm/callWasmForWebWorker';\n\nexport async function _initEDAAPI() {\n await initEDA();\n}\n\nexport function _principalComponentAnalysis(table, columns, componentsCount, centerNum, scaleNum) {\n return callWasm(EDA, 'principalComponentAnalysis', [columns, componentsCount, centerNum, scaleNum]);\n}\n\nexport async function _principalComponentAnalysisInWebWorker(table, columns, componentsCount, centerNum, scaleNum) {\n return new Promise((resolve, reject) => {\n const worker = new Worker(new URL('../wasm/workers/principalComponentAnalysisWorker.js', import.meta.url));\n worker.postMessage(getCppInput(EDA['principalComponentAnalysis'].arguments,[columns, componentsCount, centerNum, scaleNum]));\n worker.onmessage = function(e) {\n worker.terminate();\n resolve(getResult(EDA['principalComponentAnalysis'], e.data));\n }\n });\n}\n\nexport function _error(df, col1, col2) {\n return callWasm(EDA, 'error', [col1, col2]);\n}\n\nexport async function _errorInWebWorker(df, col1, col2) {\n return new Promise((resolve, reject) => {\n const worker = new Worker(new URL('../wasm/workers/errorWorker.js', import.meta.url));\n worker.postMessage(getCppInput(EDA['error'].arguments,[col1, col2]));\n worker.onmessage = function(e) {\n worker.terminate();\n resolve(getResult(EDA['error'], e.data));\n }\n });\n}\n\nexport function _partialLeastSquareRegression(table, features, predict, componentsCount) {\n return callWasm(EDA, 'partialLeastSquareRegression', [features, predict, componentsCount]);\n}\n\nexport async function _partialLeastSquareRegressionInWebWorker(table, features, predict, componentsCount) {\n return new Promise((resolve, reject) => {\n const worker = new Worker(new URL('../wasm/workers/partialLeastSquareRegressionWorker.js', import.meta.url));\n worker.postMessage(getCppInput(EDA['partialLeastSquareRegression'].arguments,[features, predict, componentsCount]));\n worker.onmessage = function(e) {\n worker.terminate();\n resolve(getResult(EDA['partialLeastSquareRegression'], e.data));\n }\n });\n}\n\nexport function _generateDataset(kernel, kernelParams, samplesCount, featuresCount, min, max, violatorsPercentage) {\n return callWasm(EDA, 'generateDataset', [kernel, kernelParams, samplesCount, featuresCount, min, max, violatorsPercentage]);\n}\n\nexport async function _generateDatasetInWebWorker(kernel, kernelParams, samplesCount, featuresCount, min, max, violatorsPercentage) {\n return new Promise((resolve, reject) => {\n const worker = new Worker(new URL('../wasm/workers/generateDatasetWorker.js', import.meta.url));\n worker.postMessage(getCppInput(EDA['generateDataset'].arguments,[kernel, kernelParams, samplesCount, featuresCount, min, max, violatorsPercentage]));\n worker.onmessage = function(e) {\n worker.terminate();\n resolve(getResult(EDA['generateDataset'], e.data));\n }\n });\n}\n\nexport function _normalizeDataset(data) {\n return callWasm(EDA, 'normalizeDataset', [data]);\n}\n\nexport async function _normalizeDatasetInWebWorker(data) {\n return new Promise((resolve, reject) => {\n const worker = new Worker(new URL('../wasm/workers/normalizeDatasetWorker.js', import.meta.url));\n worker.postMessage(getCppInput(EDA['normalizeDataset'].arguments,[data]));\n worker.onmessage = function(e) {\n worker.terminate();\n resolve(getResult(EDA['normalizeDataset'], e.data));\n }\n });\n}\n\nexport function _trainLSSVM(gamma, kernel, kernelParams, modelParamsCount, precomputedWeightsCount, dataset, labels) {\n return callWasm(EDA, 'trainLSSVM', [gamma, kernel, kernelParams, modelParamsCount, precomputedWeightsCount, dataset, labels]);\n}\n\nexport async function _trainLSSVMInWebWorker(gamma, kernel, kernelParams, modelParamsCount, precomputedWeightsCount, dataset, labels) {\n return new Promise((resolve, reject) => {\n const worker = new Worker(new URL('../wasm/workers/trainLSSVMWorker.js', import.meta.url));\n worker.postMessage(getCppInput(EDA['trainLSSVM'].arguments,[gamma, kernel, kernelParams, modelParamsCount, precomputedWeightsCount, dataset, labels]));\n worker.onmessage = function(e) {\n worker.terminate();\n resolve(getResult(EDA['trainLSSVM'], e.data));\n }\n });\n}\n\nexport function _predictByLSSVM(kernel, kernelParams, normalizedData, labels, means, stdDevs, modelParams, precomputedWeights, targetData) {\n return callWasm(EDA, 'predictByLSSVM', [kernel, kernelParams, normalizedData, labels, means, stdDevs, modelParams, precomputedWeights, targetData]);\n}\n\nexport async function _predictByLSSVMInWebWorker(kernel, kernelParams, normalizedData, labels, means, stdDevs, modelParams, precomputedWeights, targetData) {\n return new Promise((resolve, reject) => {\n const worker = new Worker(new URL('../wasm/workers/predictByLSSVMWorker.js', import.meta.url));\n worker.postMessage(getCppInput(EDA['predictByLSSVM'].arguments,[kernel, kernelParams, normalizedData, labels, means, stdDevs, modelParams, precomputedWeights, targetData]));\n worker.onmessage = function(e) {\n worker.terminate();\n resolve(getResult(EDA['predictByLSSVM'], e.data));\n }\n });\n}\n\nexport function _trainAndAnalyzeLSSVM(gamma, kernel, kernelParams, modelParamsCount, precomputedWeightsCount, confusionMatrixElementsCount, dataset, labels) {\n return callWasm(EDA, 'trainAndAnalyzeLSSVM', [gamma, kernel, kernelParams, modelParamsCount, precomputedWeightsCount, confusionMatrixElementsCount, dataset, labels]);\n}\n\nexport async function _trainAndAnalyzeLSSVMInWebWorker(gamma, kernel, kernelParams, modelParamsCount, precomputedWeightsCount, confusionMatrixElementsCount, dataset, labels) {\n return new Promise((resolve, reject) => {\n const worker = new Worker(new URL('../wasm/workers/trainAndAnalyzeLSSVMWorker.js', import.meta.url));\n worker.postMessage(getCppInput(EDA['trainAndAnalyzeLSSVM'].arguments,[gamma, kernel, kernelParams, modelParamsCount, precomputedWeightsCount, confusionMatrixElementsCount, dataset, labels]));\n worker.onmessage = function(e) {\n worker.terminate();\n resolve(getResult(EDA['trainAndAnalyzeLSSVM'], e.data));\n }\n });\n}\n\nexport function _fitLinearRegressionParamsWithDataNormalizing(features, featureAvgs, featureStdDevs, targets, targetsAvg, targetsStdDev, paramsCount) {\n return callWasm(EDA, 'fitLinearRegressionParamsWithDataNormalizing', [features, featureAvgs, featureStdDevs, targets, targetsAvg, targetsStdDev, paramsCount]);\n}\n\nexport async function _fitLinearRegressionParamsWithDataNormalizingInWebWorker(features, featureAvgs, featureStdDevs, targets, targetsAvg, targetsStdDev, paramsCount) {\n return new Promise((resolve, reject) => {\n const worker = new Worker(new URL('../wasm/workers/fitLinearRegressionParamsWithDataNormalizingWorker.js', import.meta.url));\n worker.postMessage(getCppInput(EDA['fitLinearRegressionParamsWithDataNormalizing'].arguments,[features, featureAvgs, featureStdDevs, targets, targetsAvg, targetsStdDev, paramsCount]));\n worker.onmessage = function(e) {\n worker.terminate();\n resolve(getResult(EDA['fitLinearRegressionParamsWithDataNormalizing'], e.data));\n }\n });\n}\n\nexport function _fitLinearRegressionParams(features, targets, paramsCount) {\n return callWasm(EDA, 'fitLinearRegressionParams', [features, targets, paramsCount]);\n}\n\nexport async function _fitLinearRegressionParamsInWebWorker(features, targets, paramsCount) {\n return new Promise((resolve, reject) => {\n const worker = new Worker(new URL('../wasm/workers/fitLinearRegressionParamsWorker.js', import.meta.url));\n worker.postMessage(getCppInput(EDA['fitLinearRegressionParams'].arguments,[features, targets, paramsCount]));\n worker.onmessage = function(e) {\n worker.terminate();\n resolve(getResult(EDA['fitLinearRegressionParams'], e.data));\n }\n });\n}\n\n","/* Support vector machine (SVM) tools.\n It's developed for applying in combination with DATAGROK predictive tools.\n\n Training & predicting are provided by wasm-computations.\n\n Least square support vector machine (LS-SVM) is implemented:\n [1] Suykens, J., Vandewalle, J. \"Least Squares Support Vector Machine Classifiers\",\n Neural Processing Letters 9, 293-300 (1999). https://doi.org/10.1023/A:1018628609742\n*/\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {_trainAndAnalyzeLSSVMInWebWorker, _predictByLSSVMInWebWorker} from '../wasm/EDAAPI';\n\n// 1. CONSTANTS\n\n// kernel types\nexport const LINEAR = 0;\nexport const POLYNOMIAL = 1;\nexport const RBF = 2;\nexport const SIGMOID = 3;\n\n// output-related\nconst CONFUSION_MATR_SIZE = 4;\nconst NORMALIZED_DATA_INDEX = 0;\nconst MEANS_INDEX = 1;\nconst STD_DEVS_INDEX = 2;\nconst MODEL_PARAMS_INDEX = 3;\nconst MODEL_WEIGHTS_INDEX = 4;\nconst PREDICTED_LABELS_INDEX = 5;\nconst CORRECTNESS_INDEX = 6;\nconst CONFUSION_MATRIX_INDEX = 7;\nconst TRUE_POSITIVE_INDEX = 0;\nconst FALSE_NEGATIVE_INDEX = 1;\nconst FALSE_POSITIVE_INDEX = 2;\nconst TRUE_NEGATIVE_INDEX = 3;\n\n// kernel parameters indeces\nconst RBF_SIGMA_INDEX = 0;\nconst POLYNOMIAL_C_INDEX = 0;\nconst POLYNOMIAL_D_INDEX = 1;\nconst SIGMOID_KAPPA_INDEX = 0;\nconst SIGMOID_THETA_INDEX = 1;\n\n// hyperparameters limits\nconst GAMMA_INFIMUM_LIMIT = 0;\nconst RBF_SIGMA_INFIMUM_LIMIT = 0;\nconst POLYNOMIAL_C_INFIMUM_LIMIT = 0;\nconst POLYNOMIAL_D_INFIMUM_LIMIT = 0;\n\n// error messages\nconst WRONG_GAMMA_MESSAGE = 'gamma must be strictly positive.';\nconst WRONG_RBF_SIGMA_MESSAGE = 'sigma must be strictly positive.';\nconst WRONG_POLYNOMIAL_C_MESSAGE = 'c must be strictly positive.';\nconst WRONG_POLYNOMIAL_D_MESSAGE = 'd must be strictly positive.';\nconst WRONG_KERNEL_MESSAGE = 'incorrect kernel.';\nconst WRONG_LABELS_MESSAGE = 'labels must be strings of two categories.';\n\n// names\nconst LABELS = 'Labels';\nconst PREDICTED = 'predicted';\nconst CORRECTNESS = 'correctness';\nconst CONFUSION_MATRIX_NAME = 'Confusion matrix';\nconst MEAN = 'mean';\nconst STD_DEV = 'std dev';\nconst MODEL_PARAMS_NAME = 'alpha';\nconst MODEL_WEIGHTS_NAME = 'weight';\nconst GAMMA = 'Gamma';\nconst KERNEL = 'Kernel';\nconst KERNEL_PARAMS = 'Kernel params';\nconst KERNEL_PARAM_1 = 'Kernel parameter 1';\nconst KERNEL_PARAM_2 = 'Kernel parameter 2';\nconst FEATURES_COUNT_NAME = 'Features count';\nconst TRAIN_SAMPLES_COUNT_NAME = 'Train samples count';\nconst TRAIN_ERROR = 'Train error, %';\nconst KERNEL_TYPE_TO_NAME_MAP = ['linear', 'polynomial', 'RBF', 'sigmoid'];\nconst POSITIVE_NAME = 'positive (P)';\nconst NEGATIVE_NAME = 'negative (N)';\nconst PREDICTED_POSITIVE_NAME = 'predicted positive (PP)';\nconst PREDICTED_NEGATIVE_NAME = 'predicted negative (PN)';\nconst SENSITIVITY = 'Sensitivity';\nconst SPECIFICITY = 'Specificity';\nconst BALANCED_ACCURACY = 'Balanced accuracy';\nconst POSITIVE_PREDICTIVE_VALUE = 'Positive predicitve value';\nconst NEGATIVE_PREDICTIVE_VALUE = 'Negative predicitve value';\nconst ML_REPORT = 'Model report';\nconst ML_REPORT_PREDICTED_LABELS = 'Predicted labels';\nconst ML_REPORT_TRAIN_LABELS = 'Train labels';\nconst ML_REPORT_CORRECTNESS = 'Prediction correctness';\nconst PREDICTION = 'prediction';\n\n// Pack/unpack constants\nconst BYTES = 4;\nconst INTS_COUNT = 3;\nconst KER_PARAMS_COUNT = 2;\nconst MODEL_KERNEL_INDEX = 0;\nconst SAMPLES_COUNT_INDEX = 1;\nconst FEATURES_COUNT_INDEX = 2;\n\n// misc\nconst INIT_VALUE = 0; // any number can be used\nconst LS_SVM_ADD_CONST = 1; // see [1] for more details\n\n// 2. TOOLS\n\n// Check LS-SVM learning hyperparameters\nfunction checkHyperparameters(hyperparameters: any): void {\n // check gamma\n if (hyperparameters.gamma <= GAMMA_INFIMUM_LIMIT)\n throw new Error(WRONG_GAMMA_MESSAGE);\n\n // check kernel & its parameters\n switch (hyperparameters.kernel) {\n case LINEAR: // the case of linear kernel\n return;\n\n case RBF: // the case of RBF kernel\n if (hyperparameters.sigma <= RBF_SIGMA_INFIMUM_LIMIT)\n throw new Error(WRONG_RBF_SIGMA_MESSAGE);\n return;\n\n case POLYNOMIAL: // the case of polynomial kernel\n // check c\n if (hyperparameters.cParam <= POLYNOMIAL_C_INFIMUM_LIMIT)\n throw new Error(WRONG_POLYNOMIAL_C_MESSAGE);\n // check d\n if (hyperparameters.dParam <= POLYNOMIAL_D_INFIMUM_LIMIT)\n throw new Error(WRONG_POLYNOMIAL_D_MESSAGE);\n return;\n\n case SIGMOID: // the case of polynomial kernel\n return;\n\n default: // incorrect kernel\n throw new Error(WRONG_KERNEL_MESSAGE);\n } // switch\n} // checkHyperparameters\n\n// Returnes labels predicted by the model specified\nasync function predict(model: any, dataset: DG.ColumnList): Promise<DG.Column> {\n let _output: any;\n\n const _promise = _predictByLSSVMInWebWorker(model.kernelType, model.kernelParams,\n model.normalizedTrainData.columns, model.trainLabels, model.means, model.stdDevs,\n model.modelParams, model.modelWeights, dataset);\n\n await _promise.then(\n (_result) => {_output = _result;},\n (_error) => {throw new Error(`Error: ${_error}`);},\n );\n\n return _output;\n} // predict\n\n// Evaluate accuracy of the model\nfunction evaluateAccuracy(model: any): void {\n const data = model.confusionMatrix.getRawData();\n\n // here, the classic notation is used (see https://en.wikipedia.org/wiki/Sensitivity_and_specificity)\n\n const TP = data[TRUE_POSITIVE_INDEX]; // true positive\n const TN = data[TRUE_NEGATIVE_INDEX]; // true negative\n const FP = data[FALSE_POSITIVE_INDEX]; // false positive\n const FN = data[FALSE_NEGATIVE_INDEX]; // false negative\n\n const P = TP + FN; // positive\n const N = FP + TN; // negative\n\n const TPR = TP / P; // true positive rate\n const TNR = TN / N; // true negative rate\n\n const PPV = TP / (TP + FP); // positive predicitve value\n const NPV = TN / (TN + FN); // negative predicitve value\n\n const ACC = (TP + TN) / (P + N); // accuracy\n const BA = (TPR + TNR) / 2; // balanced accuracy\n\n model.sensitivity = TPR;\n model.specificity = TNR;\n model.balancedAccuracy = BA;\n model.positivePredicitveValue = PPV;\n model.negativePredicitveValue = NPV;\n model.trainError = (1 - ACC) * 100; // train error, %\n} // evaluateAccuracy\n\n// Returns trained LS-SVM model.\nasync function trainAndAnalyzeModel(hyperparameters: any, dataset: DG.ColumnList,\n labels: DG.Column): Promise<any> {\n // check correctness of hyperparameter gamma\n checkHyperparameters(hyperparameters);\n\n // create default kernel params array\n const kernelParamsArray = [INIT_VALUE, INIT_VALUE];\n\n // fill kernelParams\n switch (hyperparameters.kernel) {\n case LINEAR: // no kernel parameters in the case of linear kernel\n break;\n\n case RBF: // sigma parameter in the case of RBF-kernel\n kernelParamsArray[RBF_SIGMA_INDEX] = hyperparameters.sigma;\n break;\n\n case POLYNOMIAL: // sigma parameter in the case of polynomial kernel\n kernelParamsArray[POLYNOMIAL_C_INDEX] = hyperparameters.cParam;\n kernelParamsArray[POLYNOMIAL_D_INDEX] = hyperparameters.dParam;\n break;\n\n case SIGMOID: // sigma parameter in the case of sigmoid kernel\n kernelParamsArray[SIGMOID_KAPPA_INDEX] = hyperparameters.kappa;\n kernelParamsArray[SIGMOID_THETA_INDEX] = hyperparameters.theta;\n break;\n\n default: // incorrect kernel\n throw new Error(WRONG_KERNEL_MESSAGE);\n };\n\n // create kernel params column\n const kernelParams = DG.Column.fromList('double', KERNEL_PARAMS, kernelParamsArray);\n\n // compute size of model params & precomputed weigths\n const trainCols = dataset.toList();\n const modelParamsCount = trainCols[0].length + LS_SVM_ADD_CONST;\n const precomputedWeightsCount = trainCols.length + LS_SVM_ADD_CONST;\n const confusionMatrixElementsCount = CONFUSION_MATR_SIZE;\n\n // call webassembly training function\n\n let output: any;\n const _promise = _trainAndAnalyzeLSSVMInWebWorker(hyperparameters.gamma, hyperparameters.kernel,\n kernelParams, modelParamsCount, precomputedWeightsCount, confusionMatrixElementsCount,\n dataset, labels);\n\n await _promise.then(\n (_result) => {output = _result;},\n (_error) => {throw new Error(`Error: ${_error}`);},\n );\n\n // rename output columns\n output[MEANS_INDEX].name = MEAN;\n output[STD_DEVS_INDEX].name = STD_DEV;\n output[MODEL_PARAMS_INDEX].name = MODEL_PARAMS_NAME;\n output[MODEL_WEIGHTS_INDEX].name = MODEL_WEIGHTS_NAME;\n\n output[PREDICTED_LABELS_INDEX].name = PREDICTED;\n output[CORRECTNESS_INDEX].name = CORRECTNESS;\n output[CONFUSION_MATRIX_INDEX].name = CONFUSION_MATRIX_NAME;\n\n // complete model\n const model = {\n trainGamma: hyperparameters.gamma,\n kernelType: hyperparameters.kernel,\n kernelParams: kernelParams,\n trainLabels: labels,\n normalizedTrainData: DG.DataFrame.fromColumns(output[NORMALIZED_DATA_INDEX]),\n means: output[MEANS_INDEX],\n stdDevs: output[STD_DEVS_INDEX],\n modelParams: output[MODEL_PARAMS_INDEX],\n modelWeights: output[MODEL_WEIGHTS_INDEX],\n predictedLabels: output[PREDICTED_LABELS_INDEX],\n correctness: output[CORRECTNESS_INDEX],\n confusionMatrix: output[CONFUSION_MATRIX_INDEX],\n trainError: undefined,\n featuresCount: trainCols.length,\n trainSamplesCount: trainCols[0].length,\n };\n\n evaluateAccuracy(model);\n\n return model;\n} // trainAndAnalyzeModel\n\n// Wrapper for combining the function \"trainAndAnalyzeModel\" with Datagrok predicitve tools\nexport async function getTrainedModel(hyperparameters: any, df: DG.DataFrame, labels: DG.Column): Promise<any> {\n const columns = df.columns;\n\n if (labels.categories.length != 2)\n throw new Error(WRONG_LABELS_MESSAGE);\n let labelNumeric : DG.Column = DG.Column.float(labels.name, labels.length);\n for (var i = 0; i < labels.length; i++)\n labelNumeric.set(i, labels.get(i) == labels.categories[0] ? -1.0 : 1.0, false);\n\n let model = await trainAndAnalyzeModel(hyperparameters, columns, labelNumeric);\n model.realLabels = labels;\n return model;\n}\n\n// Returns dataframe with short info about model\nfunction getModelInfo(model: any): DG.DataFrame {\n const kernelParams = model.kernelParams.getRawData();\n\n return DG.DataFrame.fromColumns([\n DG.Column.fromList('double', GAMMA, [model.trainGamma]),\n DG.Column.fromStrings(KERNEL, [KERNEL_TYPE_TO_NAME_MAP[model.kernelType]]),\n DG.Column.fromList('double', KERNEL_PARAM_1, [kernelParams[0]]),\n DG.Column.fromList('double', KERNEL_PARAM_2, [kernelParams[1]]),\n DG.Column.fromList('double', FEATURES_COUNT_NAME, [model.featuresCount]),\n DG.Column.fromList('double', TRAIN_SAMPLES_COUNT_NAME, [model.trainSamplesCount]),\n DG.Column.fromList('double', TRAIN_ERROR, [model.trainError]),\n DG.Column.fromList('double', BALANCED_ACCURACY, [model.balancedAccuracy]),\n DG.Column.fromList('double', SENSITIVITY, [model.sensitivity]),\n DG.Column.fromList('double', SPECIFICITY, [model.specificity]),\n DG.Column.fromList('double', POSITIVE_PREDICTIVE_VALUE, [model.positivePredicitveValue]),\n DG.Column.fromList('double', NEGATIVE_PREDICTIVE_VALUE, [model.negativePredicitveValue]),\n ]);\n}\n\n// Get dataframe with confusion matrix\nfunction getConfusionMatrixDF(model: any): DG.DataFrame {\n const data = model.confusionMatrix.getRawData();\n\n return DG.DataFrame.fromColumns([\n DG.Column.fromStrings('', [POSITIVE_NAME, NEGATIVE_NAME]),\n DG.Column.fromList('int', PREDICTED_POSITIVE_NAME,\n [data[TRUE_POSITIVE_INDEX], data[FALSE_POSITIVE_INDEX]]),\n DG.Column.fromList('int', PREDICTED_NEGATIVE_NAME,\n [data[FALSE_NEGATIVE_INDEX], data[TRUE_NEGATIVE_INDEX]]),\n ]);\n}\n\n// Show training report\nexport function showTrainReport(df: DG.DataFrame, packedModel: any): HTMLElement {\n const model = getUnpackedModel(packedModel);\n return DG.Viewer.form(model.modelInfo, {showNavigation: false}).root;\n} // showTrainReport\n\n// Returns trained model packed into UInt8Array\nexport function getPackedModel(model: any): any {\n // get principal data\n const dataCols = model.normalizedTrainData.columns;\n const samplesCount = model.trainSamplesCount;\n const featuresCount = model.featuresCount;\n const realLabelsBuffer = DG.DataFrame.fromColumns([model.realLabels]).toByteArray();\n const realLabelsSize = BYTES + realLabelsBuffer.length + 4 - realLabelsBuffer.length % 4;\n const modelInfoBuffer = getModelInfo(model).toByteArray();\n const modelInfoSize = BYTES + modelInfoBuffer.length + 4 - modelInfoBuffer.length % 4;\n \n /*let bufferSize = BYTES * (7 + featuresCount * samplesCount\n + 3 * featuresCount + 2 * samplesCount);*/\n\n // compute size of packed model\n const bufferSize = BYTES * (INTS_COUNT + KER_PARAMS_COUNT +\n samplesCount + featuresCount + featuresCount + samplesCount + LS_SVM_ADD_CONST +\n featuresCount + LS_SVM_ADD_CONST + featuresCount * samplesCount) + realLabelsSize + modelInfoSize;\n\n // packed model\n const result = new Uint8Array(bufferSize);\n const buffer = result.buffer;\n let offset = 0;\n\n // pack kernel type and sizes\n let ints = new Int32Array(buffer, offset, INTS_COUNT);\n ints[MODEL_KERNEL_INDEX] = model.kernelType;\n ints[SAMPLES_COUNT_INDEX] = samplesCount;\n ints[FEATURES_COUNT_INDEX] = featuresCount;\n offset += INTS_COUNT * BYTES;\n\n // pack kernel parameters\n let floats = new Float32Array(buffer, offset, KER_PARAMS_COUNT);\n floats.set(model.kernelParams.getRawData());\n offset += KER_PARAMS_COUNT * BYTES;\n\n // pack pack labels of training data\n floats = new Float32Array(buffer, offset, samplesCount);\n floats.set(model.trainLabels.getRawData());\n offset += samplesCount * BYTES;\n\n // pack mean values of training data\n floats = new Float32Array(buffer, offset, featuresCount);\n floats.set(model.means.getRawData());\n offset += featuresCount * BYTES;\n\n // pack standard deviations of training data\n floats = new Float32Array(buffer, offset, featuresCount);\n floats.set(model.stdDevs.getRawData());\n offset += featuresCount * BYTES;\n\n // pack model paramters\n floats = new Float32Array(buffer, offset, samplesCount + LS_SVM_ADD_CONST);\n floats.set(model.modelParams.getRawData());\n offset += (samplesCount + LS_SVM_ADD_CONST) * BYTES;\n\n // pack model's precomputed weights\n floats = new Float32Array(buffer, offset, featuresCount + LS_SVM_ADD_CONST);\n floats.set(model.modelWeights.getRawData());\n offset += (featuresCount + LS_SVM_ADD_CONST) * BYTES;\n\n // pack training dataset\n for (const col of dataCols) {\n floats = new Float32Array(buffer, offset, featuresCount);\n floats.set(col.getRawData());\n offset += featuresCount * BYTES;\n }\n\n // pack labels of training data\n ints = new Int32Array(buffer, offset, 1);\n ints[0] = realLabelsBuffer.length;\n result.set(realLabelsBuffer, offset + BYTES);\n offset += realLabelsSize;\n\n // pack model info\n ints = new Int32Array(buffer, offset, 1);\n ints[0] = modelInfoBuffer.length;\n result.set(modelInfoBuffer, offset + BYTES);\n offset += modelInfoSize;\n\n return result;\n} // getPackedModel\n\n// Returns unpacked model\nfunction getUnpackedModel(packedModel: any): any {\n const modelBytes = packedModel.buffer;\n let offset = 0;\n\n // extract kernel type and sizes\n const header = new Int32Array(modelBytes, offset, INTS_COUNT);\n offset += INTS_COUNT * BYTES;\n const samplesCount = header[SAMPLES_COUNT_INDEX];\n const featuresCount = header[FEATURES_COUNT_INDEX];\n // extract parameters of kernel\n const kernelParams = DG.Column.fromFloat32Array(KERNEL_PARAMS,\n new Float32Array(modelBytes, offset, KER_PARAMS_COUNT));\n offset += KER_PARAMS_COUNT * BYTES;\n\n // extract training labels\n const trainLabels = DG.Column.fromFloat32Array(LABELS,\n new Float32Array(modelBytes, offset, samplesCount));\n offset += samplesCount * BYTES;\n\n // extract mean values of training data\n const means = DG.Column.fromFloat32Array( MEAN,\n new Float32Array(modelBytes, offset, featuresCount));\n offset += featuresCount * BYTES;\n\n // extract standard deviations of training data\n const stdDevs = DG.Column.fromFloat32Array( STD_DEV,\n new Float32Array(modelBytes, offset, featuresCount));\n offset += featuresCount * BYTES;\n\n // extract parameters of model\n const modelParams = DG.Column.fromFloat32Array( MODEL_PARAMS_NAME,\n new Float32Array(modelBytes, offset, samplesCount + LS_SVM_ADD_CONST));\n offset += (samplesCount + LS_SVM_ADD_CONST) * BYTES;\n\n // extract model's precomputed weights\n const modelWeights = DG.Column.fromFloat32Array( MODEL_WEIGHTS_NAME,\n new Float32Array(modelBytes, offset, featuresCount + LS_SVM_ADD_CONST));\n offset += (featuresCount + LS_SVM_ADD_CONST) * BYTES;\n\n // extract training data columns\n const dataCols = [];\n\n for (let i = 0; i < samplesCount; i++) {\n dataCols.push( DG.Column.fromFloat32Array( i.toString(),\n new Float32Array(modelBytes, offset, featuresCount)) );\n offset += featuresCount * BYTES;\n }\n\n const normalizedTrainData = DG.DataFrame.fromColumns(dataCols);\n\n // extract real training labels\n const labelsCount = new Int32Array(modelBytes, offset, 1)[0];\n const labelsBytesCount = labelsCount + 4 - labelsCount % 4;\n offset += BYTES;\n const realLabels = DG.DataFrame.fromByteArray(new Uint8Array(modelBytes, offset, labelsCount)).columns.byIndex(0);\n offset += labelsBytesCount;\n\n // extract model info\n const modelInfoSize = new Int32Array(modelBytes, offset, 1)[0];\n const modelInfoBytesSize = modelInfoSize + 4 - modelInfoSize % 4;\n offset += BYTES;\n const modelInfo = DG.DataFrame.fromByteArray(new Uint8Array(modelBytes, offset, modelInfoSize));\n offset += modelInfoBytesSize;\n \n const model = {kernelType: header[MODEL_KERNEL_INDEX],\n kernelParams: kernelParams,\n trainLabels: trainLabels,\n realLabels: realLabels,\n means: means,\n stdDevs: stdDevs,\n modelParams: modelParams,\n modelWeights: modelWeights,\n normalizedTrainData: normalizedTrainData,\n modelInfo: modelInfo\n };\n\n return model;\n} // getUnpackedModel\n\n// Wrapper for combining the function \"predict\" with Datagrok predicitve tools\nexport async function getPrediction(df: DG.DataFrame, packedModel: any): Promise<DG.DataFrame> {\n const model = getUnpackedModel(new Uint8Array(packedModel));\n\n const resNumeric = await predict(model, df.columns);\n const res = DG.Column.string(PREDICTION, resNumeric.length);\n const categories = model.realLabels.categories;\n for (var i = 0; i < res.length; i++) {\n res.set(i, resNumeric.get(i) == -1 ? categories[0] : categories[1]);\n }\n\n return DG.DataFrame.fromColumns([res]);\n} // getPrediction\n\n\nexport function isApplicableSVM(df: DG.DataFrame, labels: DG.Column): boolean {\n const columns = df.columns;\n if (!labels.matches('categorical') || labels.categories.length > 2)\n return false;\n var res: boolean = true;\n for (var i = 0; i < columns.length; i++)\n res = res && (columns.byIndex(i).matches('numerical'));\n return res;\n}\n\nexport function isInteractiveSVM(df: DG.DataFrame, labels: DG.Column): boolean {\n return df.rowCount <= 1000;\n}","// PLS specific constants\n\n/** Types of analysis using PLS */\nexport enum PLS_ANALYSIS {\n COMPUTE_COMPONENTS,\n PERFORM_MVA,\n DEMO,\n}\n\n/** Errors & warnings */\nexport enum ERROR_MSG {\n NO_DF = 'No dataframe is opened',\n NO_COLS = 'No numeric columns without missing values',\n ONE_COL = 'No columns to be used as features (just one numeric columns without missing values)',\n EMPTY_DF = 'Dataframe is empty',\n}\n\n/** Widget titles */\nexport enum TITLE {\n PREDICT = 'Predict',\n USING = 'Using',\n COMPONENTS = 'Components',\n PLS = 'PLS',\n MVA = 'Multivariate Analysis (PLS)',\n RUN = 'RUN',\n NAMES = 'Names',\n MODEL = 'Observed vs. Predicted',\n FEATURE = 'Feature',\n REGR_COEFS = 'Regression Coefficients',\n XLOADING = 'x.loading.p',\n LOADINGS = 'Loadings',\n XSCORE = 'x.score.t',\n YSCORE = 'y.score.u',\n SCORES = 'Scores',\n EXPL_VAR = 'Explained Variance',\n EXPLORE = 'Explore',\n}\n\n/** Tooltips */\nexport enum HINT {\n PREDICT = 'Column with the response variable',\n FEATURES = 'Predictors (features)',\n COMPONENTS = 'Number of PLS components',\n PLS = 'Compute PLS components',\n MVA = 'Perform multivariate analysis',\n NAMES = 'Names of data samples',\n}\n\n/** Links to help */\nexport enum LINK {\n PLS = 'https://datagrok.ai/help/explore/multivariate-analysis/pls#pls-components',\n MVA = 'https://datagrok.ai/help/explore/multivariate-analysis/pls',\n MODEL = 'https://datagrok.ai/help/explore/multivariate-analysis/plots/predicted-vs-reference',\n COEFFS = 'https://datagrok.ai/help/explore/multivariate-analysis/plots/regression-coefficients',\n LOADINGS = 'https://datagrok.ai/help/explore/multivariate-analysis/plots/loadings',\n EXPL_VARS = 'https://datagrok.ai/help/explore/multivariate-analysis/plots/explained-variance',\n SCORES = 'https://datagrok.ai/help/explore/multivariate-analysis/plots/scores',\n}\n\n/** Components consts */\nexport enum COMPONENTS {\n DEFAULT = 3,\n MIN = 1,\n}\n\n/** Items used for naming results */\nexport enum RESULT_NAMES {\n PREFIX = 'PLS',\n SUFFIX = '(predicted)',\n COMP = 'component',\n COMPS = 'components',\n}\n\n/** Indeces of wasm-computation output */\nexport enum WASM_OUTPUT_IDX {\n PREDICTION = 0,\n REGR_COEFFS = 1,\n T_SCORES = 2,\n U_SCORES = 3,\n X_LOADINGS = 4,\n Y_LOADINGS = 5,\n}\n\nexport const INT = 'Int';\nexport const TIMEOUT = 6;\nexport const RADIUS = [0.49, 0.79, 0.99];\nexport const LINE_WIDTH = 1;\nexport const X_COORD = 200;\nexport const Y_COORD = 200;\nexport const DELAY = 2000;\n\n/** Curves colors */\nexport enum COLOR {\n AXIS = '#838383',\n CIRCLE = '#0000FF',\n};\n\n/** Intro markdown for demo app */\nexport const DEMO_INTRO_MD = `# Data\nEach car has many features - patterns extraction is complicated.\n\n# Model\nPredict car price by its other features.\n\n# Try\nPress 'RUN' to perform multivariate analysis using partial least squares\n([PLS](https://en.wikipedia.org/wiki/Partial_least_squares_regression)) regression.\n\n# Essence\nThe method finds the latent factors that\n\n* capture the maximum variance in the features\n* maximize correlation with the response variable`;\n\n/** Description of demo results: wizard components */\nexport const DEMO_RESULTS = [\n {caption: TITLE.MODEL, text: 'Closer to the line means better price prediction.'},\n {caption: TITLE.SCORES, text: 'The latent factor values for each data sample reflect the similarities and dissimilarities among observations.'},\n {caption: TITLE.LOADINGS, text: 'The impact of each feature on the latent factors: higher loading means stronger influence.'},\n {caption: TITLE.REGR_COEFS, text: 'Parameters of the obtained linear model: features make different contribution to the prediction.'},\n {caption: TITLE.EXPL_VAR, text: 'How well the latent components fit source data: closer to one means better fit.'},\n];\n\n/** Form results markdown for demo app */\nexport const DEMO_RESULTS_MD = DEMO_RESULTS.map((item) => `# ${item.caption}\\n\\n${item.text}`)\n .join('\\n\\n') + `\\n\\n# Learn more\n \n * [Multivariate analysis](${LINK.MVA}),\n * [ANOVA](https://datagrok.ai/help/explore/anova)`;\n","// Tools for multivariate analysis by PLS\n\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {PLS_ANALYSIS, ERROR_MSG, TITLE, HINT, LINK, COMPONENTS, INT, TIMEOUT,\n RESULT_NAMES, WASM_OUTPUT_IDX, RADIUS, LINE_WIDTH, COLOR, X_COORD, Y_COORD,\n DEMO_INTRO_MD, DEMO_RESULTS_MD, DEMO_RESULTS} from './pls-constants';\nimport {checkWasmDimensionReducerInputs, checkColumnType, checkMissingVals} from '../utils';\nimport {_partialLeastSquareRegressionInWebWorker} from '../../wasm/EDAAPI';\nimport {carsDataframe} from '../data-generators';\n\nconst min = Math.min;\nconst max = Math.max;\n\n/** PLS analysis results */\nexport type PlsOutput = {\n prediction: DG.Column<DG.COLUMN_TYPE.FLOAT>,\n regressionCoefficients: DG.Column<DG.COLUMN_TYPE.FLOAT>,\n tScores: DG.Column<DG.COLUMN_TYPE.FLOAT>[],\n uScores: DG.Column<DG.COLUMN_TYPE.FLOAT>[],\n xLoadings: DG.Column<DG.COLUMN_TYPE.FLOAT>[],\n yLoadings: DG.Column<DG.COLUMN_TYPE.FLOAT>,\n};\n\n/** PLS analysis input */\nexport type PlsInput = {\n table: DG.DataFrame,\n features: DG.ColumnList,\n predict: DG.Column,\n components: number,\n names : DG.Column | null,\n};\n\n/** Partial least square regression (PLS) */\nexport async function getPlsAnalysis(input: PlsInput): Promise<PlsOutput> {\n checkWasmDimensionReducerInputs(input.features, input.components);\n\n // Check the responce column\n checkColumnType(input.predict);\n checkMissingVals(input.predict);\n\n const result = await _partialLeastSquareRegressionInWebWorker(\n input.table,\n input.features,\n input.predict,\n input.components,\n );\n\n return {\n prediction: result[WASM_OUTPUT_IDX.PREDICTION],\n regressionCoefficients: result[WASM_OUTPUT_IDX.REGR_COEFFS],\n tScores: result[WASM_OUTPUT_IDX.T_SCORES],\n uScores: result[WASM_OUTPUT_IDX.U_SCORES],\n xLoadings: result[WASM_OUTPUT_IDX.X_LOADINGS],\n yLoadings: result[WASM_OUTPUT_IDX.Y_LOADINGS],\n };\n}\n\n/** Perform multivariate analysis using the PLS regression */\nasync function performMVA(input: PlsInput, analysisType: PLS_ANALYSIS): Promise<void> {\n const result = await getPlsAnalysis(input);\n\n const plsCols = result.tScores;\n const cols = input.table.columns;\n const featuresNames = input.features.names();\n const prefix = (analysisType === PLS_ANALYSIS.COMPUTE_COMPONENTS) ? RESULT_NAMES.PREFIX : TITLE.XSCORE;\n\n // add PLS components to the table\n plsCols.forEach((col, idx) => {\n col.name = cols.getUnusedName(`${prefix}${idx + 1}`);\n cols.add(col);\n });\n\n if (analysisType === PLS_ANALYSIS.COMPUTE_COMPONENTS)\n return;\n\n const view = grok.shell.tableView(input.table.name);\n\n // 0.1 Buffer table\n const buffer = DG.DataFrame.fromColumns([\n DG.Column.fromStrings(TITLE.FEATURE, featuresNames),\n result.regressionCoefficients,\n ]);\n\n // 0.2. Add X-Loadings\n result.xLoadings.forEach((col, idx) => {\n col.name = buffer.columns.getUnusedName(`${TITLE.XLOADING}${idx + 1}`);\n buffer.columns.add(col);\n });\n\n // 1. Predicted vs Reference scatter plot\n const pred = result.prediction;\n pred.name = cols.getUnusedName(`${input.predict.name} ${RESULT_NAMES.SUFFIX}`);\n cols.add(pred);\n const predictVsReferScatter = view.addViewer(DG.Viewer.scatterPlot(input.table, {\n title: TITLE.MODEL,\n xColumnName: input.predict.name,\n yColumnName: pred.name,\n showRegressionLine: true,\n markerType: DG.MARKER_TYPE.CIRCLE,\n labels: input.names?.name,\n help: LINK.MODEL,\n }));\n\n // 2. Regression Coefficients Bar Chart\n result.regressionCoefficients.name = TITLE.REGR_COEFS;\n const regrCoeffsBar = view.addViewer(DG.Viewer.barChart(buffer, {\n title: TITLE.REGR_COEFS,\n splitColumnName: TITLE.FEATURE,\n valueColumnName: result.regressionCoefficients.name,\n valueAggrType: DG.AGG.AVG,\n help: LINK.COEFFS,\n showValueSelector: false,\n showStackSelector: false,\n }));\n\n // 3. Loadings Scatter Plot\n result.xLoadings.forEach((col, idx) => col.name = `${TITLE.XLOADING}${idx + 1}`);\n const loadingsScatter = view.addViewer(DG.Viewer.scatterPlot(buffer, {\n title: TITLE.LOADINGS,\n xColumnName: `${TITLE.XLOADING}1`,\n yColumnName: `${TITLE.XLOADING}${result.xLoadings.length > 1 ? '2' : '1'}`,\n markerType: DG.MARKER_TYPE.CIRCLE,\n labels: TITLE.FEATURE,\n help: LINK.LOADINGS,\n }));\n\n // 4. Scores Scatter Plot\n\n // 4.1) data\n const scoreNames = plsCols.map((col) => col.name);\n result.uScores.forEach((col, idx) => {\n col.name = cols.getUnusedName(`${TITLE.YSCORE}${idx + 1}`);\n cols.add(col);\n scoreNames.push(col.name);\n });\n\n // 4.2) create scatter\n const scoresScatter = DG.Viewer.scatterPlot(input.table, {\n title: TITLE.SCORES,\n xColumnName: plsCols[0].name,\n yColumnName: (plsCols.length > 1) ? plsCols[1].name : result.uScores[0].name,\n markerType: DG.MARKER_TYPE.CIRCLE,\n labels: input.names?.name,\n help: LINK.SCORES,\n showViewerFormulaLines: true,\n });\n\n // 4.3) create lines & circles\n const lines = [] as DG.FormulaLine[];\n\n const addLine = (formula: string, radius: number) => {\n lines.push({\n type: 'line',\n formula: formula,\n width: LINE_WIDTH,\n visible: true,\n title: ' ',\n min: -radius,\n max: radius,\n color: COLOR.CIRCLE,\n });\n };\n\n scoreNames.forEach((xName) => {\n const x = '${' + xName + '}';\n lines.push({type: 'line', formula: `${x} = 0`, width: LINE_WIDTH, visible: true, title: ' ', color: COLOR.AXIS});\n\n scoreNames.forEach((yName) => {\n const y = '${' + yName + '}';\n\n RADIUS.forEach((r) => {\n addLine(y + ` = sqrt(${r*r} - ${x} * ${x})`, r);\n addLine(y + ` = -sqrt(${r*r} - ${x} * ${x})`, r);\n });\n });\n });\n\n scoresScatter.meta.formulaLines.addAll(lines);\n view.addViewer(scoresScatter);\n\n // 5. Explained Variances\n\n // 5.1) computation, source: the paper https://doi.org/10.1002/cem.2589\n // here, we use notations from this paper\n const q = result.yLoadings.getRawData();\n const p = result.xLoadings.map((col) => col.getRawData());\n const n = input.table.rowCount;\n const m = featuresNames.length;\n const A = input.components;\n const yExplVars = new Float32Array(A);\n const compNames = [] as string[];\n const xExplVars: Float32Array[] = [];\n for (let i = 0; i < m; ++i)\n xExplVars.push(new Float32Array(A));\n\n yExplVars[0] = q[0]**2 / n;\n compNames.push(`1 ${RESULT_NAMES.COMP}`);\n xExplVars.forEach((arr, idx) => {arr[0] = p[0][idx]**2 / n;});\n\n for (let comp = 1; comp < A; ++comp) {\n yExplVars[comp] = yExplVars[comp - 1] + q[comp]**2 / n;\n xExplVars.forEach((arr, idx) => arr[comp] = arr[comp - 1] + p[comp][idx]**2 / n);\n compNames.push(`${comp + 1} ${RESULT_NAMES.COMPS}`);\n }\n\n // 5.2) create df\n const explVarsDF = DG.DataFrame.fromColumns([\n DG.Column.fromStrings(TITLE.COMPONENTS, compNames),\n DG.Column.fromFloat32Array(input.predict.name, yExplVars),\n ]);\n\n xExplVars.forEach((arr, idx) => explVarsDF.columns.add(DG.Column.fromFloat32Array(featuresNames[idx], arr)));\n\n // 5.3) bar chart\n const explVarsBar = view.addViewer(DG.Viewer.barChart(explVarsDF, {\n title: TITLE.EXPL_VAR,\n splitColumnName: TITLE.COMPONENTS,\n valueColumnName: input.predict.name,\n valueAggrType: DG.AGG.AVG,\n help: LINK.EXPL_VARS,\n showCategorySelector: false,\n showStackSelector: false,\n }));\n\n // emphasize viewers in the demo case\n if (analysisType === PLS_ANALYSIS.DEMO) {\n const pages = [predictVsReferScatter, scoresScatter, loadingsScatter, regrCoeffsBar, explVarsBar]\n .map((viewer, idx) => {\n return {\n text: DEMO_RESULTS[idx].text,\n showNextTo: viewer.root,\n };\n });\n\n const wizard = ui.hints.addTextHint({title: TITLE.EXPLORE, pages: pages});\n wizard.helpUrl = LINK.MVA;\n grok.shell.windows.help.showHelp(ui.markdown(DEMO_RESULTS_MD));\n }\n} // performMVA\n\n/** Run multivariate analysis (PLS) */\nexport async function runMVA(analysisType: PLS_ANALYSIS): Promise<void> {\n const table = grok.shell.t;\n\n if (table === null) {\n grok.shell.warning(ERROR_MSG.NO_DF);\n return;\n }\n\n if (table.rowCount === 0) {\n grok.shell.warning(ERROR_MSG.EMPTY_DF);\n return;\n }\n\n const numColNames = [] as string[];\n const numCols = [] as DG.Column[];\n const strCols = [] as DG.Column[];\n\n const isValidNumeric = (col: DG.Column) =>\n ((col.type === DG.COLUMN_TYPE.INT) || (col.type === DG.COLUMN_TYPE.FLOAT)) &&\n (col.stats.missingValueCount === 0);\n\n table.columns.toList().forEach((col) => {\n if (isValidNumeric(col)) {\n numColNames.push(col.name);\n numCols.push(col);\n } else if (col.type === DG.COLUMN_TYPE.STRING)\n strCols.push(col);\n });\n\n if (numColNames.length === 0) {\n grok.shell.warning(ERROR_MSG.NO_COLS);\n return;\n }\n\n if (numColNames.length === 1) {\n grok.shell.warning(ERROR_MSG.ONE_COL);\n return;\n }\n\n // responce (to predict)\n let predict = numCols[numCols.length - 1];\n const predictInput = ui.input.column(TITLE.PREDICT, {table: table, value: predict, onValueChanged: () => {\n predict = predictInput.value!;\n updateIputs();\n }, filter: (col: DG.Column) => isValidNumeric(col)},\n );\n predictInput.setTooltip(HINT.PREDICT);\n\n // predictors (features)\n let features: DG.Column[];\n const featuresInput = ui.input.columns(TITLE.USING, {table: table, available: numColNames});\n featuresInput.onInput(() => updateIputs());\n featuresInput.setTooltip(HINT.FEATURES);\n\n // components count\n let components = min(numColNames.length - 1, COMPONENTS.DEFAULT as number);\n const componentsInput = ui.input.forProperty(DG.Property.fromOptions({\n name: TITLE.COMPONENTS,\n inputType: INT,\n defaultValue: components,\n //@ts-ignore\n showPlusMinus: true,\n min: COMPONENTS.MIN,\n }));\n componentsInput.onInput(() => updateIputs());\n componentsInput.setTooltip(HINT.COMPONENTS);\n\n let dlgTitle: string;\n let dlgHelpUrl: string;\n let dlgRunBtnTooltip: string;\n\n if (analysisType === PLS_ANALYSIS.COMPUTE_COMPONENTS) {\n dlgTitle = TITLE.PLS;\n dlgHelpUrl = LINK.PLS;\n dlgRunBtnTooltip = HINT.PLS;\n } else {\n dlgTitle = TITLE.MVA;\n dlgHelpUrl = LINK.MVA;\n dlgRunBtnTooltip = HINT.MVA;\n }\n\n const updateIputs = () => {\n featuresInput.value = featuresInput.value.filter((col) => col !== predict);\n features = featuresInput.value;\n\n componentsInput.value = min(max(componentsInput.value ?? components, COMPONENTS.MIN), features.length);\n components = componentsInput.value;\n\n dlg.getButton(TITLE.RUN).disabled = (features.length === 0) || (components <= 0);\n };\n\n // names of samples\n let names = (strCols.length > 0) ? strCols[0] : null;\n const namesInputs = ui.input.column(TITLE.NAMES, {table: table, value: names!, onValueChanged: () => names = predictInput.value,\n filter: (col: DG.Column) => col.type === DG.COLUMN_TYPE.STRING},\n );\n namesInputs.setTooltip(HINT.NAMES);\n namesInputs.root.hidden = (strCols.length === 0) || (analysisType === PLS_ANALYSIS.COMPUTE_COMPONENTS);\n\n const dlg = ui.dialog({title: dlgTitle, helpUrl: dlgHelpUrl})\n .add(ui.form([predictInput, featuresInput, componentsInput, namesInputs]))\n .addButton(TITLE.RUN, async () => {\n dlg.close();\n\n await performMVA({\n table: table,\n features: DG.DataFrame.fromColumns(features).columns,\n predict: predict,\n components: components,\n names: names,\n }, analysisType);\n }, undefined, dlgRunBtnTooltip)\n .show({x: X_COORD, y: Y_COORD});\n\n // the following delay provides correct styles (see https://reddata.atlassian.net/browse/GROK-15196)\n setTimeout(() => {\n featuresInput.value = numCols.filter((col) => col !== predict);\n features = featuresInput.value;\n }, TIMEOUT);\n\n grok.shell.v.append(dlg.root);\n} // runMVA\n\n/** Run multivariate analysis demo */\nexport async function runDemoMVA(): Promise<void> {\n grok.shell.addTableView(carsDataframe());\n grok.shell.windows.help.visible = true;\n grok.shell.windows.help.showHelp(ui.markdown(DEMO_INTRO_MD));\n grok.shell.windows.showContextPanel = false;\n grok.shell.windows.showProperties = false;\n\n await runMVA(PLS_ANALYSIS.DEMO);\n}\n","// Statistic tools\n\n/* REFERENCES\n\n [1] One-way analysis of variance, https://en.wikipedia.org/wiki/One-way_analysis_of_variance\n\n [2] G.W. Heiman. Basic Statistics for the Behavioral Sciences, 6th ed. Wadsworth Publishing, 2010\n\n [3] F-test of equality of variances, https://en.wikipedia.org/wiki/F-test_of_equality_of_variances\n\n [4] S. McKillup. Statistics Explained, Cambridge University Press, 2005\n\n*/\n\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\n//@ts-ignore: no types\nimport * as jStat from 'jstat';\n\nenum ERROR_MSG {\n NON_EQUAL_FACTORS_VALUES_SIZE = 'non-equal sizes of factor and values arrays. INPUT ERROR.',\n INCORRECT_SIGNIFICANCE_LEVEL = 'incorrect significance level. It must be from the interval (0, 1). INPUT ERROR.',\n INCORRECT_SAMPLE_SIZE = 'incorrect size of sample. DATA FACTORIZAING ERROR.',\n NON_EQUAL_VARIANCES = 'variances are not equal.',\n NON_NORMAL_DISTRIB = 'non-normal distribution.',\n UNSUPPORTED_COLUMN_TYPE = 'unsupported column type.',\n INCORRECT_CATEGORIES_COL_TYPE = 'incorrect categories column type.',\n ANOVA_FAILED_JUST_ONE_CAT = 'ANOVA filed: there should be at least 2 categories.'\n};\n\ntype SampleData = {\n sum: number,\n sumOfSquares: number,\n size: number,\n};\n\n/** One-way ANOVA computation results. The classic notations are used (see [2], p. 290). */\ntype OneWayAnova = {\n /** sum of squares between groups, SSbn */\n ssBn: number,\n /** sum of squares within groups, SSnn */\n ssWn: number,\n /** total sum of squares, SStot */\n ssTot: number,\n /** degrees of freedom between groups, DFbn */\n dfBn: number,\n /** degrees of freedom within groups, DFwn */\n dfWn: number,\n /** total degrees of freedom, DFtot */\n dfTot: number,\n /** mean square between groups, MSbn */\n msBn: number,\n /** mean square within groups, MSwn */\n msWn: number,\n /** Fobt, value of F-statistics, Fstat */\n fStat: number,\n /** p-value corresponding to F-statistics, pValue */\n pValue: number,\n};\n\n/** Categorical column */\ntype CatCol = DG.Column<DG.COLUMN_TYPE.STRING>;\n\n/** Numerical column */\ntype NumCol = DG.Column<DG.COLUMN_TYPE.FLOAT> | DG.Column<DG.COLUMN_TYPE.INT>;\n\n/** Create dataframe with one-way ANOVA results. */\nexport function getOneWayAnovaDF(\n anova: OneWayAnova, alpha: number, fCritical: number, hypothesis: string, testResult: string,\n): DG.DataFrame {\n return DG.DataFrame.fromColumns([\n DG.Column.fromStrings('Source of variance',\n ['Between groups', 'Within groups', 'Total', '', hypothesis, '', testResult]),\n DG.Column.fromList(DG.COLUMN_TYPE.FLOAT, 'Sum of squares',\n [anova.ssBn, anova.ssWn, anova.ssTot, null, null, null, null]),\n DG.Column.fromList(DG.COLUMN_TYPE.INT, 'Degrees of freedom',\n [anova.dfBn, anova.dfWn, anova.dfTot, null, null, null, null]),\n DG.Column.fromList(DG.COLUMN_TYPE.FLOAT, 'Mean square', [anova.msBn, anova.msWn, null, null, null, null, null]),\n DG.Column.fromList(DG.COLUMN_TYPE.FLOAT, 'F-statistics', [anova.fStat, null, null, null, null, null, null]),\n DG.Column.fromList(DG.COLUMN_TYPE.FLOAT, 'p-value', [anova.pValue, null, null, null, null, null, null]),\n DG.Column.fromList(DG.COLUMN_TYPE.FLOAT,\n `${alpha}-critical value`, [fCritical, null, null, null, null, null, null]),\n ]);\n} // getOneWayAnovaDF\n\n/** Check correctness of significance level. */\nexport function checkSignificanceLevel(alpha: number) {\n if ((alpha <= 0) || (alpha >= 1))\n throw new Error(ERROR_MSG.INCORRECT_SIGNIFICANCE_LEVEL);\n}\n\n/** Compute unbiased variance.*/\nexport function getVariance(data: SampleData): number {\n // The applied formulas can be found in [4] (see p. 63)\n const size = data.size;\n\n if (size <= 0)\n throw new Error(ERROR_MSG.INCORRECT_SAMPLE_SIZE);\n\n if (size === 1)\n return 0;\n\n return (data.sumOfSquares - (data.sum) ** 2 / size) / (size - 1);\n} // getVariance\n\n/** Check equality of variances of 2 samples. F-test is performed.*/\nfunction areVarsEqual(xData: SampleData, yData: SampleData, alpha: number = 0.05): boolean {\n // The applied approach can be found in [3]\n checkSignificanceLevel(alpha);\n\n const xVar = getVariance(xData);\n const yVar = getVariance(yData);\n\n if (yVar === 0)\n return (xVar === yVar);\n\n const fStat = xVar / yVar;\n const fCrit = jStat.centralF.inv(1 - alpha, xData.size - 1, yData.size - 1);\n\n return (fStat < fCrit);\n} // areVarsEqual\n\nexport class FactorizedData {\n private isNormDistrib: boolean | undefined = undefined;\n private categories: string[] = [];\n private sums!: Float64Array;\n private sumsOfSquares!: Float64Array;\n private subSampleSizes!: Int32Array;\n private size!: number;\n private catCount!: number;\n\n constructor(categories: CatCol, values: NumCol, checkNormality: boolean = false, alpha: number = 0.05) {\n if (categories.type !== DG.COLUMN_TYPE.STRING)\n throw new Error();\n\n if (categories.length !== values.length)\n throw new Error(ERROR_MSG.NON_EQUAL_FACTORS_VALUES_SIZE);\n\n this.setStats(categories, values, checkNormality, alpha);\n }\n\n public isNormal(): boolean | undefined {\n return true;\n }\n\n /** Check equality of variances of factorized data. */\n public areVarsEqual(alpha: number = 0.05): boolean {\n const K = this.catCount;\n\n if (K === 1)\n return true;\n\n const first: SampleData = {sum: this.sums[0], sumOfSquares: this.sumsOfSquares[0], size: this.subSampleSizes[0]};\n\n for (let i = 1; i < K; ++i) {\n if (!areVarsEqual(first, {sum: this.sums[i], sumOfSquares: this.sumsOfSquares[i],\n size: this.subSampleSizes[i]}, alpha))\n return false;\n }\n\n return true;\n } // areVarsEqual\n\n /** Perform one-way ANOVA computations. */\n public getOneWayAnova(): OneWayAnova {\n // Further, notations and formulas from (see [2], p. 290) are used.\n\n const K = this.catCount;\n\n if (K === 1)\n throw new Error(ERROR_MSG.ANOVA_FAILED_JUST_ONE_CAT);\n\n let sum = 0;\n let sumOfSquares = 0;\n const N = this.size;\n let buf = 0;\n\n for (let i = 0; i < K; ++i) {\n sum += this.sums[i];\n sumOfSquares += this.sumsOfSquares[i];\n buf += this.sums[i] ** 2 / this.subSampleSizes[i];\n }\n\n const ssTot = sumOfSquares - sum ** 2 / N;\n const ssBn = buf - sum ** 2 / N;\n const ssWn = ssTot - ssBn;\n\n const dfBn = K - 1;\n const dfWn = N - K;\n const dfTot = N - 1;\n\n const msBn = ssBn / dfBn;\n const msWn = ssWn / dfWn;\n\n const fStat = msBn / msWn;\n\n return {\n ssBn: ssBn,\n ssWn: ssWn,\n ssTot: ssTot,\n dfBn: dfBn,\n dfWn: dfWn,\n dfTot: dfTot,\n msBn: msBn,\n msWn: msWn,\n fStat: fStat,\n pValue: 1 - jStat.centralF.cdf(fStat, dfBn, dfWn),\n };\n } // getOneWayAnova\n\n /** Compute sum & sums of squares with respect to factor levels. */\n private setStats(categories: CatCol, values: NumCol, _checkNormality: boolean = false, _alpha: number = 0.05): void {\n // TODO: provide check normality feature\n const type = values.type;\n const size = values.length;\n\n switch (type) {\n case DG.COLUMN_TYPE.INT:\n case DG.COLUMN_TYPE.FLOAT:\n this.categories = categories.categories;\n const catCount = this.categories.length;\n this.catCount = catCount;\n this.size = size;\n\n const vals = values.getRawData();\n const cats = categories.getRawData();\n\n const sums = new Float64Array(catCount).fill(0);\n const sumsOfSquares = new Float64Array(catCount).fill(0);\n const subSampleSizes = new Int32Array(catCount).fill(0);\n\n for (let i = 0; i < size; ++i) {\n const c = cats[i];\n sums[c] += vals[i];\n sumsOfSquares[c] += vals[i] ** 2;\n ++subSampleSizes[c];\n }\n\n this.sums = sums;\n this.sumsOfSquares = sumsOfSquares;\n this.subSampleSizes = subSampleSizes;\n\n break;\n\n default:\n throw new Error(ERROR_MSG.UNSUPPORTED_COLUMN_TYPE);\n }\n } // setStats\n} // FactorizedData\n\n/** Perform one-way analysis of variances. */\nexport function oneWayAnova(\n categores: CatCol, values: NumCol, alpha: number = 0.05, validate: boolean = false,\n): DG.DataFrame {\n checkSignificanceLevel(alpha);\n\n const factorized = new FactorizedData(categores, values, validate, alpha);\n\n if (validate) {\n if (!factorized.areVarsEqual(alpha))\n throw new Error(ERROR_MSG.NON_EQUAL_VARIANCES);\n\n if (!factorized.isNormal())\n throw new Error(ERROR_MSG.NON_NORMAL_DISTRIB);\n }\n\n const anova = factorized.getOneWayAnova();\n const fCrit = jStat.centralF.inv(1 - alpha, anova.dfBn, anova.dfWn);\n\n const hypothesis = `THE NULL HYPOTHESIS: the \"${categores.name}\" \n factor does not produce a significant difference in the \"${values.name}\" feature.`;\n const testResult = `Test result: ${(anova.fStat > fCrit) ? 'REJECTED.' : 'FAILED TO REJECT.'}`;\n\n return getOneWayAnovaDF(anova, alpha, fCrit, hypothesis, testResult);\n} // oneWayAnova\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/** Calculates Clusters based on dbscan algorithm in wasm.\n * @param embedX - embeddings x location.\n * @param embedY - embeddings y location.\n * @param minPts - minimum number of points in a cluster.\n * @param epsilon - epsilon.\n * @returns array with cluster indexes.\n */\nexport function getDbscanWorker(embedX, embedY, epsilon, minPts) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise(function (resolve, reject) {\n const worker = new Worker(new URL('./clustering-worker', import.meta.url));\n worker.postMessage({ embedX, embedY, minPts, epsilon });\n worker.onmessage = ({ data: { error, clusters } }) => {\n worker.terminate();\n error ? reject(error) : resolve(clusters);\n };\n });\n });\n}\n//# sourceMappingURL=dbscan-worker-creator.js.map","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nlet gpuAdapter = null;\nlet gpuDevice = null;\nexport function getGPUDevice() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!gpuAdapter) {\n //reason: only here we get the gpuAdapter\n // eslint-disable-next-line no-restricted-syntax\n gpuAdapter = yield navigator.gpu.requestAdapter({ powerPreference: 'high-performance' });\n if (gpuAdapter == null)\n return null;\n }\n let isLost = false;\n if (gpuDevice) {\n gpuDevice.lost.then(() => {\n isLost = true;\n });\n yield new Promise((r) => setTimeout(r, 10)); // wait to see if the device is lost\n }\n if (!gpuDevice || isLost) {\n const requiredBufferSize = 1000000000; // ~1000MB\n const adapterLimits = gpuAdapter.limits;\n const buffferSizeLimit = adapterLimits.maxBufferSize;\n const storageBufferSizeLimit = adapterLimits.maxStorageBufferBindingSize;\n try {\n gpuDevice = yield gpuAdapter.requestDevice({ requiredLimits: {\n maxBufferSize: Math.min(buffferSizeLimit, requiredBufferSize),\n maxStorageBufferBindingSize: Math.min(storageBufferSizeLimit, requiredBufferSize)\n } });\n return gpuDevice;\n }\n catch (e) {\n console.error('Failed to create device with required limits', e);\n gpuDevice = yield gpuAdapter.requestDevice();\n return gpuDevice;\n }\n }\n return gpuDevice;\n });\n}\nexport function getGPUAdapterDescription() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!gpuAdapter) {\n // reason: only here we get the gpuAdapter\n // eslint-disable-next-line no-restricted-syntax\n gpuAdapter = yield navigator.gpu.requestAdapter();\n if (gpuAdapter == null)\n return null;\n }\n const info = yield gpuAdapter.requestAdapterInfo();\n if (!info)\n return null;\n const outString = replaceEmptyString(info.description, replaceEmptyString(info.vendor, 'No GPU description available'));\n return outString;\n });\n}\nfunction replaceEmptyString(str, replacement) {\n return !str || str == '' ? replacement : str;\n}\n//# sourceMappingURL=getGPUDevice.js.map","function euclideanAggregationWgsl(arraySize) {\n return `\n var sum = 0.0;\n for (var i = 0u; i < ${arraySize}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `;\n}\n;\nfunction manhattanAggregationWgsl(arraySize) {\n return `\n var sum = 0.0;\n for (var i = 0u; i < ${arraySize}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `;\n}\nexport var WEBGSLAGGREGATION;\n(function (WEBGSLAGGREGATION) {\n WEBGSLAGGREGATION[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n WEBGSLAGGREGATION[\"MANHATTAN\"] = \"MANHATTAN\";\n})(WEBGSLAGGREGATION || (WEBGSLAGGREGATION = {}));\nexport const WEBGSLAGGREGATIONFUNCTIONS = {\n [WEBGSLAGGREGATION.EUCLIDEAN]: euclideanAggregationWgsl,\n [WEBGSLAGGREGATION.MANHATTAN]: manhattanAggregationWgsl\n};\n//# sourceMappingURL=webGPU-aggregation.js.map","/* eslint-disable max-len */\n// in all the functions below, the variables a and b are assumed to be arrays of uint32/f32\n//values which are infered from the code this chunk is injected into\n// also, we have access to computeInfo struct, which contains the following fields:\n// computeInfo.entrySizes: array of arrays of u32 containing the sizes of the entries\n// other fields are specific to the distance function should be injected from the main script that calls this function,\n// and should be available in the supplementaryInfo struct\n// like the similarity matrix for monomer chemical distance.\n// the getProcessInfo function should return correct buffer allocation mechanism for the supplementaryInfo,\n// for every entry list\n// the maxDistance variable is also assumed to be available in the\n// scope of the function, in case of knn it is the distance in the last postion of knn on this index,\n// in case of sparse matrix, it can be just the threshold for the distance.\n// hamming distance for sequnences of uint32 arrays of max length ${maxArraySize}\nexport function webGPUHamming(_maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${_maxArraySize}; i = i + 1u) {\n diff = diff + f32(a[i] != b[i]);\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${_maxArraySize};\n `;\n}\nexport function webGPUMonomerChemicalDistance(_maxArraySize, entryIndex) {\n // it is assumet that suppInfo struct contains correct matrix called similarityMatrix${entryIndex}, (similarityMatrix0, similarityMatrix1, etc)\n // this should be guaranteed by the getProcessInfo function.\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n let simMatrix = &(suppInfo.similarityMatrix${entryIndex}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${_maxArraySize}; i = i + 1u) {\n diff = diff + 1.0 - (*simMatrix)[u32(a[i])][u32(b[i])];\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${_maxArraySize};\n `;\n}\nexport function webGPULevenstein(maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n\n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${maxArraySize + 1}u>, 2>; // initialize to 0\n \n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = f32(i);\n }\n\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n dynamicPassMat[curIndex][0] = f32(i);\n var minEntry: f32 = f32(maxLength);\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n let bMon = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n var cost: f32 = f32(a[j - 1] != bMon);\n var res: f32 = min(\n min(\n (*prevRow)[j] + 1.0, // deletion\n (*curRow)[j - 1] + 1.0, // insertion\n ),\n (*prevRow)[j - 1] + cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n `;\n}\nexport function webGPUNeedlemanWunsch(maxArraySize, entryIndex) {\n // version of the levenshtain where the cost of substitution is customizable\n // it is assumet that suppInfo struct contains correct matrix called similarityMatrix${entryIndex}, (similarityMatrix0, similarityMatrix1, etc)\n // and gapOpenPenalty, gapExtensionPenalty\n // this should be guaranteed by the getProcessInfo function.\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${maxArraySize + 1}u>, 2>; // initialize to 0\n \n // we need to keep track of which operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n var verticalGaps: array<u32, ${maxArraySize + 1}u>;\n var horizontalGaps: array<u32, ${maxArraySize + 1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${entryIndex};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${entryIndex};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${entryIndex}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n \n `;\n}\nexport function webGPUEuclidean(maxArraySize, _entryIndex) {\n return `\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${maxArraySize}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `;\n}\nexport function webGPUManhattan(maxArraySize, _entryIndex) {\n return `\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${maxArraySize}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `;\n}\nexport function webGPUOneHotDistance(_maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n if (aLength != bLength) {\n return 1.0;\n }\n for (var i = 0u; i < aLength; i = i + 1u) {\n if(a[i] != b[i]) {\n return 1.0;\n }\n }\n return 0.0;\n `;\n}\nexport function webGPUNumericDistance(_maxArraySize, entryIndex) {\n // we assume that range${entryIndex} is available in the supplementaryInfo struct\n return `\n let range = suppInfo.range${entryIndex};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `;\n}\n// tanimoto distance for uint32 arrays of length ${maxArraySize}\nexport function webGPUTanimotoBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n\n if (onBitsa == 0u && onBitsb == 0u) {\n return 0.0;\n }\n\n let totalOnBits = onBitsa + onBitsb;\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `;\n}\nexport function webGPUAsymmetricBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let min = min(onBitsa, onBitsb);\n if (min == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `;\n}\nexport function webGPUCosineBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa * onBitsb; // p.s. here total is taken by multiplying\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `;\n}\nexport function webGPUSokalBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa + onBitsb;\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(total * 2 - commonBits * 3);\n `;\n}\nexport var WEBGPUDISTANCE;\n(function (WEBGPUDISTANCE) {\n WEBGPUDISTANCE[\"HAMMING\"] = \"Hamming\";\n WEBGPUDISTANCE[\"EUCLIDEAN\"] = \"Euclidean\";\n WEBGPUDISTANCE[\"MANHATTAN\"] = \"Manhattan\";\n WEBGPUDISTANCE[\"TANIMOTO\"] = \"Tanimoto\";\n WEBGPUDISTANCE[\"LEVENSTEIN\"] = \"Levenshtein\";\n WEBGPUDISTANCE[\"NEEDLEMAN_WUNSCH\"] = \"Needlemann-Wunsch\";\n WEBGPUDISTANCE[\"MONOMER_CHEMICAL_DISTANCE\"] = \"Monomer chemical distance\";\n WEBGPUDISTANCE[\"SOKAL\"] = \"Sokal\";\n WEBGPUDISTANCE[\"COSINE\"] = \"Cosine\";\n WEBGPUDISTANCE[\"ASYMMETRIC\"] = \"Asymmetric\";\n WEBGPUDISTANCE[\"Difference\"] = \"Difference\";\n WEBGPUDISTANCE[\"OneHot\"] = \"One-Hot\";\n})(WEBGPUDISTANCE || (WEBGPUDISTANCE = {}));\nexport const webGPUFunctions = {\n [WEBGPUDISTANCE.HAMMING]: webGPUHamming,\n [WEBGPUDISTANCE.EUCLIDEAN]: webGPUEuclidean,\n [WEBGPUDISTANCE.MANHATTAN]: webGPUManhattan,\n [WEBGPUDISTANCE.TANIMOTO]: webGPUTanimotoBitArray,\n [WEBGPUDISTANCE.LEVENSTEIN]: webGPULevenstein,\n [WEBGPUDISTANCE.NEEDLEMAN_WUNSCH]: webGPUNeedlemanWunsch,\n [WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE]: webGPUMonomerChemicalDistance,\n [WEBGPUDISTANCE.SOKAL]: webGPUSokalBitArray,\n [WEBGPUDISTANCE.COSINE]: webGPUCosineBitArray,\n [WEBGPUDISTANCE.ASYMMETRIC]: webGPUAsymmetricBitArray,\n [WEBGPUDISTANCE.Difference]: webGPUNumericDistance,\n [WEBGPUDISTANCE.OneHot]: webGPUOneHotDistance\n};\nexport const distanceFunctionComplexity = {\n [WEBGPUDISTANCE.HAMMING]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.EUCLIDEAN]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.MANHATTAN]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.TANIMOTO]: (maxEntrySize) => Math.ceil(maxEntrySize / 60),\n [WEBGPUDISTANCE.SOKAL]: (maxEntrySize) => Math.ceil(maxEntrySize / 60),\n [WEBGPUDISTANCE.COSINE]: (maxEntrySize) => Math.ceil(maxEntrySize / 60),\n [WEBGPUDISTANCE.ASYMMETRIC]: (maxEntrySize) => Math.ceil(maxEntrySize / 60),\n [WEBGPUDISTANCE.LEVENSTEIN]: (maxEntrySize) => Math.ceil(maxEntrySize * maxEntrySize / 60),\n [WEBGPUDISTANCE.NEEDLEMAN_WUNSCH]: (maxEntrySize) => Math.ceil(maxEntrySize * maxEntrySize / 60),\n [WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE]: (maxEntrySize) => Math.ceil(maxEntrySize / 25),\n [WEBGPUDISTANCE.Difference]: (_maxEntrySize) => 1,\n [WEBGPUDISTANCE.OneHot]: (_maxEntrySize) => Math.ceil(_maxEntrySize / 40),\n};\nexport const TypeSupportedDistances = {\n [\"STRING\" /* WGPUENTRYTYPE.STRING */]: new Set([WEBGPUDISTANCE.HAMMING, WEBGPUDISTANCE.LEVENSTEIN, WEBGPUDISTANCE.NEEDLEMAN_WUNSCH, WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE, WEBGPUDISTANCE.OneHot]),\n [\"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */]: new Set([WEBGPUDISTANCE.HAMMING, WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE, WEBGPUDISTANCE.LEVENSTEIN, WEBGPUDISTANCE.NEEDLEMAN_WUNSCH, WEBGPUDISTANCE.TANIMOTO, WEBGPUDISTANCE.COSINE, WEBGPUDISTANCE.SOKAL, WEBGPUDISTANCE.ASYMMETRIC, WEBGPUDISTANCE.OneHot, WEBGPUDISTANCE.Difference]),\n [\"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.OneHot, WEBGPUDISTANCE.Difference]),\n [\"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.Difference]),\n [\"NUMBER\" /* WGPUENTRYTYPE.NUMBER */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.Difference]),\n [\"BITARRAY\" /* WGPUENTRYTYPE.BITARRAY */]: new Set([WEBGPUDISTANCE.TANIMOTO, WEBGPUDISTANCE.COSINE, WEBGPUDISTANCE.SOKAL, WEBGPUDISTANCE.ASYMMETRIC])\n};\n//# sourceMappingURL=webGPU-multicol-distances.js.map","export var MatrixMatrixOpType;\n(function (MatrixMatrixOpType) {\n MatrixMatrixOpType[\"ADD\"] = \"ADD\";\n MatrixMatrixOpType[\"SUB\"] = \"SUB\";\n MatrixMatrixOpType[\"MULT\"] = \"MULT\";\n})(MatrixMatrixOpType || (MatrixMatrixOpType = {}));\nexport var MatrixOpType;\n(function (MatrixOpType) {\n MatrixOpType[\"SQUARE\"] = \"SQUARE\";\n MatrixOpType[\"INVERSE\"] = \"INVERSE\";\n MatrixOpType[\"TRANSPOSE\"] = \"TRANSPOSE\";\n MatrixOpType[\"NORM\"] = \"NORM\";\n MatrixOpType[\"COLUMN_NORM\"] = \"COLUMN_NORM\";\n})(MatrixOpType || (MatrixOpType = {}));\nexport var MatrixScalarOpType;\n(function (MatrixScalarOpType) {\n MatrixScalarOpType[\"SCALARMULT\"] = \"SCALARMULT\";\n MatrixScalarOpType[\"SCALARADD\"] = \"SCALARADD\";\n MatrixScalarOpType[\"SCALARPOW\"] = \"SCALARPOW\";\n})(MatrixScalarOpType || (MatrixScalarOpType = {}));\n//# sourceMappingURL=types.js.map","export var DimReductionMethods;\n(function (DimReductionMethods) {\n DimReductionMethods[\"UMAP\"] = \"UMAP\";\n DimReductionMethods[\"T_SNE\"] = \"t-SNE\";\n})(DimReductionMethods || (DimReductionMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxtQkFHWDtBQUhELFdBQVksbUJBQW1CO0lBQzNCLG9DQUFhLENBQUE7SUFDYixzQ0FBZSxDQUFBO0FBQ25CLENBQUMsRUFIVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBRzlCO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpbVJlZHVjdGlvbk1ldGhvZHN7XG4gICAgVU1BUCA9ICdVTUFQJyxcbiAgICBUX1NORSA9ICd0LVNORSdcbn07XG4iXX0=","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n *\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n const tag = toString.call(value);\n return tag.endsWith('Array]') && !tag.includes('Big');\n}\n//# sourceMappingURL=index.js.map","import { bioLayout } from './bio-layout';\nimport { markovClusterWebGPU } from '@datagrok-libraries/math/src/webGPU/MCL/MCL-webGPU';\nexport const defaultMCLOptions = {\n expandFactor: 2,\n maxIterations: 5,\n inflateFactor: 2,\n multFactor: 1,\n};\nexport class MCLSparseReducer {\n constructor(opts = {}) {\n this._options = { ...defaultMCLOptions, ...opts };\n }\n async transform(sparseMatrix, nRows) {\n // testWorkerMultiply();\n // return new Int32Array(nRows);\n let sparseObject = this.toObjectForm(sparseMatrix);\n if (this._options.maxIterations > 0) {\n this.addLoops(sparseObject, nRows);\n this.normalize(sparseObject);\n for (let i = 0; i < this._options.maxIterations; i++) {\n sparseObject = this.expand(sparseObject, nRows);\n this.inflate(sparseObject);\n this.normalize(sparseObject);\n }\n }\n const { clusters, is, js } = this.assignClusters(sparseObject, nRows);\n this.correctClusters(clusters);\n const embeddings = await this.layout(clusters, sparseObject, nRows);\n return { clusters, embedX: embeddings.embedX, embedY: embeddings.embedY, is, js };\n }\n async transformWebGPU(sparseMatrix, nRows) {\n if (this._options.maxIterations === 0)\n return this.transform(sparseMatrix, nRows);\n const mclRes = await markovClusterWebGPU(sparseMatrix, nRows, this._options.maxIterations, this._options.inflateFactor);\n const sparseObject = this.csrToSparseObject(mclRes, nRows);\n const { clusters, is, js } = this.assignClusters(sparseObject, nRows);\n this.correctClusters(clusters);\n const embeddings = await this.layout(clusters, sparseObject, nRows);\n return { clusters, embedX: embeddings.embedX, embedY: embeddings.embedY, is, js };\n }\n correctClusters(clusters) {\n const clusterSizeMap = {};\n for (const cluster of clusters) {\n if (!clusterSizeMap[cluster])\n clusterSizeMap[cluster] = 0;\n clusterSizeMap[cluster]++;\n }\n const sortedIndexes = Object.keys(clusterSizeMap).map(Number).sort((a, b) => clusterSizeMap[b] - clusterSizeMap[a]);\n const clusterMap = {};\n sortedIndexes.forEach((clusterIdx, i) => clusterMap[clusterIdx] = i + 1);\n for (let i = 0; i < clusters.length; i++)\n clusters[i] = clusterMap[clusters[i]];\n // let curCluster = 1;\n // for (let i = 0; i < clusters.length; i++) {\n // if (!clusterMap[clusters[i]]) {\n // clusterMap[clusters[i]] = curCluster;\n // clusters[i] = curCluster;\n // curCluster++;\n // } else {\n // clusters[i] = clusterMap[clusters[i]];\n // }\n // }\n }\n csrToSparseObject(mclRes, nRows) {\n const order = Math.floor(Math.max(Math.log10(nRows), 2)) + 1;\n const minOrder = 1 / Math.pow(10, order);\n const sparseObject = {};\n for (let i = 0; i < nRows; i++) {\n sparseObject[i] = {};\n for (let k = mclRes.indexOffsets[i]; k < mclRes.indexOffsets[i + 1]; k++) {\n const j = mclRes.KNNIndexes[k];\n if (j <= i || mclRes.KNNSimilarities[k] < minOrder)\n continue;\n sparseObject[i][j] = mclRes.KNNSimilarities[k];\n }\n }\n return sparseObject;\n }\n async layout(clusters, sparseMatrix, nRows) {\n const embedX = new Float32Array(nRows).fill(0);\n const embedY = new Float32Array(nRows).fill(0);\n const clusterMap = {};\n clusters.forEach((cluster, i) => {\n if (!clusterMap[cluster])\n clusterMap[cluster] = [];\n clusterMap[cluster].push(i);\n });\n // const nClusters = Object.keys(clusterMap).length;\n // const perRow = Math.floor(Math.sqrt(nClusters));\n let clusterNum = 0;\n const sortedClusterNames = Object.keys(clusterMap);\n sortedClusterNames.sort((a, b) => clusterMap[b].length - clusterMap[a].length);\n let perRow = 6;\n let yOffset = 0;\n const layoutSize = 5;\n for (const clusterName of sortedClusterNames) {\n const cluster = clusterMap[clusterName];\n const embeddings = await bioLayout(cluster, sparseMatrix, 0.001);\n if (clusterNum === Math.ceil(perRow / 1.5)) {\n clusterNum = 0;\n yOffset += layoutSize / perRow;\n perRow = Math.ceil(perRow * 1.5);\n }\n const offsetX = ((clusterNum % perRow) * layoutSize / perRow) * 1.5;\n // const offsetY = Math.floor(clusterNum / perRow) * 2;\n for (let i = 0; i < embeddings.embedX.length; i++) {\n embedX[cluster[i]] = embeddings.embedX[i] * layoutSize / perRow + offsetX;\n embedY[cluster[i]] = embeddings.embedY[i] * layoutSize / perRow + yOffset;\n }\n clusterNum++;\n }\n return { embedX, embedY };\n }\n mergeClusters(clusters, i, j) {\n const iCluster = clusters[i];\n const jCluster = clusters[j];\n for (let k = 0; k < clusters.length; k++) {\n if (clusters[k] === jCluster)\n clusters[k] = iCluster;\n }\n }\n assignClusters(sparseMatrix, nRows) {\n let clusterNum = 0;\n const is = [];\n const js = [];\n const order = Math.floor(Math.max(Math.log10(nRows), 2)) + 1;\n const minOrder = Math.pow(10, order);\n const clusters = new Array(nRows).fill(-1);\n for (const i of Object.keys(sparseMatrix)) {\n for (const j of Object.keys(sparseMatrix[i])) {\n if (Math.round(sparseMatrix[i][j] * minOrder) / minOrder > 0 &&\n sparseMatrix[i][j] !== Number(i) && Number(j) > Number(i)) {\n is.push(Number(i));\n js.push(Number(j));\n if (clusters[Number(i)] !== -1 && clusters[Number(j)] !== -1) {\n if (clusters[Number(i)] !== clusters[Number(j)])\n this.mergeClusters(clusters, Number(i), Number(j));\n }\n else if (clusters[Number(i)] !== -1) {\n clusters[Number(j)] = clusters[Number(i)];\n }\n else if (clusters[Number(j)] !== -1) {\n clusters[Number(i)] = clusters[Number(j)];\n }\n else {\n clusterNum++;\n clusters[Number(i)] = clusterNum;\n clusters[Number(j)] = clusterNum;\n }\n }\n }\n }\n for (let i = 0; i < clusters.length; i++) {\n if (clusters[i] === -1) {\n clusterNum++;\n clusters[i] = clusterNum;\n }\n }\n return { clusters, is: new Uint32Array(is), js: new Uint32Array(js) };\n }\n /** same as assign clusters but working on the level of CSR format returned from webGPU */\n assignClustersCSR(mclRes, nRows) {\n let clusterNum = 0;\n const is = [];\n const js = [];\n const order = Math.floor(Math.max(Math.log10(nRows), 2)) + 1;\n const minOrder = 1 / Math.pow(10, order);\n const clusters = new Array(nRows).fill(-1);\n const correctedOffsets = new Uint32Array(nRows + 1);\n let offsetCounter = 0;\n correctedOffsets[0] = 0;\n for (let i = 0; i < nRows; i++) {\n for (let k = mclRes.indexOffsets[i]; k < mclRes.indexOffsets[i + 1]; k++) {\n const j = mclRes.KNNIndexes[k];\n if (j <= i || mclRes.KNNSimilarities[k] <= minOrder)\n continue;\n is.push(i);\n js.push(j);\n offsetCounter++;\n if (clusters[i] !== -1 && clusters[j] !== -1) {\n if (clusters[i] !== clusters[j])\n this.mergeClusters(clusters, i, j);\n }\n else if (clusters[i] !== -1) {\n clusters[j] = clusters[i];\n }\n else if (clusters[j] !== -1) {\n clusters[i] = clusters[j];\n }\n else {\n clusterNum++;\n clusters[i] = clusterNum;\n clusters[j] = clusterNum;\n }\n }\n correctedOffsets[i + 1] = offsetCounter;\n }\n for (let i = 0; i < clusters.length; i++) {\n if (clusters[i] === -1) {\n clusterNum++;\n clusters[i] = clusterNum;\n }\n }\n return { clusters, is: new Uint32Array(is), js: new Uint32Array(js), correctedOffsets };\n }\n toObjectForm(sparseMatrix) {\n const sparseObject = {};\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n if (!sparseObject[sparseMatrix.i[i]])\n sparseObject[sparseMatrix.i[i]] = {};\n sparseObject[sparseMatrix.i[i]][sparseMatrix.j[i]] = 1 - sparseMatrix.distance[i];\n if (!sparseObject[sparseMatrix.j[i]])\n sparseObject[sparseMatrix.j[i]] = {};\n sparseObject[sparseMatrix.j[i]][sparseMatrix.i[i]] = 1 - sparseMatrix.distance[i];\n }\n return sparseObject;\n }\n addLoops(sparseObject, nRows) {\n for (let i = 0; i < nRows; i++) {\n if (!sparseObject[i])\n sparseObject[i] = {};\n sparseObject[i][i] = this._options.multFactor;\n }\n }\n normalize(sparseObject) {\n for (const i of Object.keys(sparseObject)) {\n const row = sparseObject[i];\n let sum = 0;\n for (const j of Object.keys(row))\n sum += row[j];\n if (sum === 0)\n continue;\n for (const j of Object.keys(row))\n sparseObject[i][j] /= sum;\n }\n }\n expand(sparseObject, nRows) {\n const expandedObject = {};\n const order = Math.floor(Math.max(Math.log10(nRows), 2)) + 1;\n const minOrder = Math.pow(10, order);\n for (let i = 0; i < nRows; i++) {\n if (!sparseObject[i])\n continue;\n // const row = sparseObject[i];\n expandedObject[i] ?? (expandedObject[i] = {});\n for (let j = i; j < nRows; j++) {\n if (!sparseObject[i]?.[j])\n continue;\n const val = this.getExpandValue(sparseObject, i, j); //pruning step\n if (Math.round(val * minOrder) / minOrder > 0) {\n expandedObject[i][j] = val;\n if (!expandedObject[j])\n expandedObject[j] = {};\n expandedObject[j][i] = val;\n }\n }\n }\n return expandedObject;\n }\n // private prune(row: SparseMatrixObject[number]) {\n // }\n inflate(sparseObject) {\n for (const i of Object.keys(sparseObject)) {\n const row = sparseObject[i];\n for (const j of Object.keys(row))\n sparseObject[i][j] = Math.pow(sparseObject[i][j], this._options.inflateFactor);\n }\n }\n getExpandValue(sparseObject, i, j) {\n let val = 0;\n const currentIndexes = Object.keys(sparseObject[i] ?? {});\n const otherIndexes = Object.keys(sparseObject[j] ?? {});\n for (const k of currentIndexes) {\n if (otherIndexes.includes(k))\n val += sparseObject[i][k] * sparseObject[j][k];\n }\n return val;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFyY292LWNsdXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYXJjb3YtY2x1c3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBR3ZDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFlO0lBQzNDLFlBQVksRUFBRSxDQUFDO0lBQ2YsYUFBYSxFQUFFLENBQUM7SUFDaEIsYUFBYSxFQUFFLENBQUM7SUFDaEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUYsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixZQUFZLE9BQTRCLEVBQUU7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFDLEdBQUcsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLEVBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFnQyxFQUFFLEtBQWE7UUFDcEUsd0JBQXdCO1FBQ3hCLGdDQUFnQztRQUNoQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDckQsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFD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LEVBQUUsQ0FBTTtRQUNyRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RCxLQUFLLE1BQU0sQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQy9CLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQVEsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U3BhcnNlTWF0cml4UmVzdWx0fSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvc3BhcnNlLW1hdHJpeC1zZXJ2aWNlJztcbmltcG9ydCB7YmlvTGF5b3V0fSBmcm9tICcuL2Jpby1sYXlvdXQnO1xuaW1wb3J0IHtNQ0xPcHRpb25zLCBTcGFyc2VNYXRyaXhPYmplY3R9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtNQ0xPcFJldHVyblR5cGV9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL01DTC90eXBlcyc7XG5pbXBvcnQge21hcmtvdkNsdXN0ZXJXZWJHUFV9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL01DTC9NQ0wtd2ViR1BVJztcbmV4cG9ydCBjb25zdCBkZWZhdWx0TUNMT3B0aW9uczogTUNMT3B0aW9ucyA9IHtcbiAgZXhwYW5kRmFjdG9yOiAyLFxuICBtYXhJdGVyYXRpb25zOiA1LFxuICBpbmZsYXRlRmFjdG9yOiAyLFxuICBtdWx0RmFjdG9yOiAxLFxufTtcblxuZXhwb3J0IGNsYXNzIE1DTFNwYXJzZVJlZHVjZXIge1xuICBwcml2YXRlIF9vcHRpb25zOiBNQ0xPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM6IFBhcnRpYWw8TUNMT3B0aW9ucz4gPSB7fSkge1xuICAgIHRoaXMuX29wdGlvbnMgPSB7Li4uZGVmYXVsdE1DTE9wdGlvbnMsIC4uLm9wdHN9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHRyYW5zZm9ybShzcGFyc2VNYXRyaXg6IFNwYXJzZU1hdHJpeFJlc3VsdCwgblJvd3M6IG51bWJlcikge1xuICAgIC8vIHRlc3RXb3JrZXJNdWx0aXBseSgpO1xuICAgIC8vIHJldHVybiBuZXcgSW50MzJBcnJheShuUm93cyk7XG4gICAgbGV0IHNwYXJzZU9iamVjdCA9IHRoaXMudG9PYmplY3RGb3JtKHNwYXJzZU1hdHJpeCk7XG4gICAgaWYgKHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucyA+IDApIHtcbiAgICAgIHRoaXMuYWRkTG9vcHMoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgICB0aGlzLm5vcm1hbGl6ZShzcGFyc2VPYmplY3QpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcHRpb25zLm1heEl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICBzcGFyc2VPYmplY3QgPSB0aGlzLmV4cGFuZChzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgdGhpcy5pbmZsYXRlKHNwYXJzZU9iamVjdCk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplKHNwYXJzZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHtjbHVzdGVycywgaXMsIGpzfSA9IHRoaXMuYXNzaWduQ2x1c3RlcnMoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBhd2FpdCB0aGlzLmxheW91dChjbHVzdGVycywgc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgcmV0dXJuIHtjbHVzdGVycywgZW1iZWRYOiBlbWJlZGRpbmdzLmVtYmVkWCwgZW1iZWRZOiBlbWJlZGRpbmdzLmVtYmVkWSwgaXMsIGpzfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm1XZWJHUFUoc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXhSZXN1bHQsIG5Sb3dzOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5tYXhJdGVyYXRpb25zID09PSAwKVxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtKHNwYXJzZU1hdHJpeCwgblJvd3MpO1xuXG4gICAgY29uc3QgbWNsUmVzID0gYXdhaXQgbWFya292Q2x1c3RlcldlYkdQVShcbiAgICAgIHNwYXJzZU1hdHJpeCwgblJvd3MsIHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucywgdGhpcy5fb3B0aW9ucy5pbmZsYXRlRmFjdG9yXG4gICAgKTtcbiAgICBjb25zdCBzcGFyc2VPYmplY3QgPSB0aGlzLmNzclRvU3BhcnNlT2JqZWN0KG1jbFJlcywgblJvd3MpO1xuICAgIGNvbnN0IHtjbHVzdGVycywgaXMsIGpzfSA9IHRoaXMuYXNzaWduQ2x1c3RlcnMoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBhd2FpdCB0aGlzLmxheW91dChjbHVzdGVycywgc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgcmV0dXJuIHtjbHVzdGVycywgZW1iZWRYOiBlbWJlZGRpbmdzLmVtYmVkWCwgZW1iZWRZOiBlbWJlZGRpbmdzLmVtYmVkWSwgaXMsIGpzfTtcbiAgfVxuXG4gIHByaXZhdGUgY29ycmVjdENsdXN0ZXJzKGNsdXN0ZXJzOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGNsdXN0ZXJTaXplTWFwOiB7W186IG51bWJlcl06IG51bWJlcn0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGNsdXN0ZXIgb2YgY2x1c3RlcnMpIHtcbiAgICAgIGlmICghY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0pXG4gICAgICAgIGNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdID0gMDtcbiAgICAgIGNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdKys7XG4gICAgfVxuICAgIGNvbnN0IHNvcnRlZEluZGV4ZXMgPSBPYmplY3Qua2V5cyhjbHVzdGVyU2l6ZU1hcCkubWFwKE51bWJlcikuc29ydCgoYSwgYikgPT4gY2x1c3RlclNpemVNYXBbYl0gLSBjbHVzdGVyU2l6ZU1hcFthXSk7XG4gICAgY29uc3QgY2x1c3Rlck1hcDoge1tfOiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gICAgc29ydGVkSW5kZXhlcy5mb3JFYWNoKChjbHVzdGVySWR4LCBpKSA9PiBjbHVzdGVyTWFwW2NsdXN0ZXJJZHhdID0gaSArIDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspXG4gICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dO1xuICAgIC8vIGxldCBjdXJDbHVzdGVyID0gMTtcbiAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gICBpZiAoIWNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dKSB7XG4gICAgLy8gICAgIGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dID0gY3VyQ2x1c3RlcjtcbiAgICAvLyAgICAgY2x1c3RlcnNbaV0gPSBjdXJDbHVzdGVyO1xuICAgIC8vICAgICBjdXJDbHVzdGVyKys7XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgfVxuXG4gIHByaXZhdGUgY3NyVG9TcGFyc2VPYmplY3QobWNsUmVzOiBNQ0xPcFJldHVyblR5cGUsIG5Sb3dzOiBudW1iZXIpIHtcbiAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgY29uc3QgbWluT3JkZXIgPSAxIC8gTWF0aC5wb3coMTAsIG9yZGVyKTtcbiAgICBjb25zdCBzcGFyc2VPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgc3BhcnNlT2JqZWN0W2ldID0ge307XG4gICAgICBmb3IgKGxldCBrID0gbWNsUmVzLmluZGV4T2Zmc2V0c1tpXTsgayA8IG1jbFJlcy5pbmRleE9mZnNldHNbaSArIDFdOyBrKyspIHtcbiAgICAgICAgY29uc3QgaiA9IG1jbFJlcy5LTk5JbmRleGVzW2tdO1xuICAgICAgICBpZiAoaiA8PSBpIHx8IG1jbFJlcy5LTk5TaW1pbGFyaXRpZXNba10gPCBtaW5PcmRlcilcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgc3BhcnNlT2JqZWN0W2ldW2pdID0gbWNsUmVzLktOTlNpbWlsYXJpdGllc1trXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNwYXJzZU9iamVjdDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbGF5b3V0KGNsdXN0ZXJzOiBudW1iZXJbXSwgc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXhPYmplY3QsIG5Sb3dzOiBudW1iZXIpIHtcbiAgICBjb25zdCBlbWJlZFggPSBuZXcgRmxvYXQzMkFycmF5KG5Sb3dzKS5maWxsKDApO1xuICAgIGNvbnN0IGVtYmVkWSA9IG5ldyBGbG9hdDMyQXJyYXkoblJvd3MpLmZpbGwoMCk7XG4gICAgY29uc3QgY2x1c3Rlck1hcDoge1tfOiBudW1iZXJdOiBudW1iZXJbXX0gPSB7fTtcbiAgICBjbHVzdGVycy5mb3JFYWNoKChjbHVzdGVyLCBpKSA9PiB7XG4gICAgICBpZiAoIWNsdXN0ZXJNYXBbY2x1c3Rlcl0pXG4gICAgICAgIGNsdXN0ZXJNYXBbY2x1c3Rlcl0gPSBbXTtcbiAgICAgIGNsdXN0ZXJNYXBbY2x1c3Rlcl0ucHVzaChpKTtcbiAgICB9KTtcbiAgICAvLyBjb25zdCBuQ2x1c3RlcnMgPSBPYmplY3Qua2V5cyhjbHVzdGVyTWFwKS5sZW5ndGg7XG4gICAgLy8gY29uc3QgcGVyUm93ID0gTWF0aC5mbG9vcihNYXRoLnNxcnQobkNsdXN0ZXJzKSk7XG4gICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgIGNvbnN0IHNvcnRlZENsdXN0ZXJOYW1lcyA9IE9iamVjdC5rZXlzKGNsdXN0ZXJNYXApO1xuICAgIHNvcnRlZENsdXN0ZXJOYW1lcy5zb3J0KChhLCBiKSA9PiBjbHVzdGVyTWFwW2IgYXMgYW55XS5sZW5ndGggLSBjbHVzdGVyTWFwW2EgYXMgYW55XS5sZW5ndGgpO1xuICAgIGxldCBwZXJSb3cgPSA2O1xuXG4gICAgbGV0IHlPZmZzZXQgPSAwO1xuICAgIGNvbnN0IGxheW91dFNpemUgPSA1O1xuICAgIGZvciAoY29uc3QgY2x1c3Rlck5hbWUgb2Ygc29ydGVkQ2x1c3Rlck5hbWVzKSB7XG4gICAgICBjb25zdCBjbHVzdGVyID0gY2x1c3Rlck1hcFtjbHVzdGVyTmFtZSBhcyBhbnldITtcbiAgICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBhd2FpdCBiaW9MYXlvdXQoY2x1c3Rlciwgc3BhcnNlTWF0cml4LCAwLjAwMSk7XG4gICAgICBpZiAoY2x1c3Rlck51bSA9PT0gTWF0aC5jZWlsKHBlclJvdyAvIDEuNSkpIHtcbiAgICAgICAgY2x1c3Rlck51bSA9IDA7XG4gICAgICAgIHlPZmZzZXQgKz0gbGF5b3V0U2l6ZSAvIHBlclJvdztcbiAgICAgICAgcGVyUm93ID0gTWF0aC5jZWlsKHBlclJvdyAqIDEuNSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvZmZzZXRYID0gKChjbHVzdGVyTnVtICUgcGVyUm93KSAqIGxheW91dFNpemUgLyBwZXJSb3cpICogMS41O1xuICAgICAgLy8gY29uc3Qgb2Zmc2V0WSA9IE1hdGguZmxvb3IoY2x1c3Rlck51bSAvIHBlclJvdykgKiAyO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVtYmVkZGluZ3MuZW1iZWRYLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVtYmVkWFtjbHVzdGVyW2ldXSA9IGVtYmVkZGluZ3MuZW1iZWRYW2ldICogbGF5b3V0U2l6ZSAvIHBlclJvdyArIG9mZnNldFg7XG4gICAgICAgIGVtYmVkWVtjbHVzdGVyW2ldXSA9IGVtYmVkZGluZ3MuZW1iZWRZW2ldICogbGF5b3V0U2l6ZSAvIHBlclJvdyArIHlPZmZzZXQ7XG4gICAgICB9XG4gICAgICBjbHVzdGVyTnVtKys7XG4gICAgfVxuICAgIHJldHVybiB7ZW1iZWRYLCBlbWJlZFl9O1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNsdXN0ZXJzKGNsdXN0ZXJzOiBudW1iZXJbXSwgaTogbnVtYmVyLCBqOiBudW1iZXIpIHtcbiAgICBjb25zdCBpQ2x1c3RlciA9IGNsdXN0ZXJzW2ldO1xuICAgIGNvbnN0IGpDbHVzdGVyID0gY2x1c3RlcnNbal07XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjbHVzdGVycy5sZW5ndGg7IGsrKykge1xuICAgICAgaWYgKGNsdXN0ZXJzW2tdID09PSBqQ2x1c3RlcilcbiAgICAgICAgY2x1c3RlcnNba10gPSBpQ2x1c3RlcjtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFzc2lnbkNsdXN0ZXJzKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4T2JqZWN0LCBuUm93czogbnVtYmVyKSB7XG4gICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgIGNvbnN0IGlzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IGpzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IG9yZGVyID0gTWF0aC5mbG9vcihNYXRoLm1heChNYXRoLmxvZzEwKG5Sb3dzKSwgMikpICsgMTtcbiAgICBjb25zdCBtaW5PcmRlciA9IE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgY29uc3QgY2x1c3RlcnM6IG51bWJlcltdID0gbmV3IEFycmF5KG5Sb3dzKS5maWxsKC0xKTtcbiAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlTWF0cml4KSkge1xuICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHNwYXJzZU1hdHJpeFtpIGFzIGFueV0pKSB7XG4gICAgICAgIGlmIChNYXRoLnJvdW5kKHNwYXJzZU1hdHJpeFtpIGFzIGFueV1baiBhcyBhbnldICogbWluT3JkZXIpIC8gbWluT3JkZXIgPiAwICYmXG4gICAgICAgICAgc3BhcnNlTWF0cml4W2kgYXMgYW55XVtqIGFzIGFueV0gIT09IE51bWJlcihpKSAmJiBOdW1iZXIoaikgPiBOdW1iZXIoaSkpIHtcbiAgICAgICAgICBpcy5wdXNoKE51bWJlcihpKSk7XG4gICAgICAgICAganMucHVzaChOdW1iZXIoaikpO1xuICAgICAgICAgIGlmIChjbHVzdGVyc1tOdW1iZXIoaSldICE9PSAtMSAmJiBjbHVzdGVyc1tOdW1iZXIoaildICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW051bWJlcihpKV0gIT09IGNsdXN0ZXJzW051bWJlcihqKV0pXG4gICAgICAgICAgICAgIHRoaXMubWVyZ2VDbHVzdGVycyhjbHVzdGVycywgTnVtYmVyKGkpLCBOdW1iZXIoaikpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2x1c3RlcnNbTnVtYmVyKGkpXSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihqKV0gPSBjbHVzdGVyc1tOdW1iZXIoaSldO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2x1c3RlcnNbTnVtYmVyKGopXSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihpKV0gPSBjbHVzdGVyc1tOdW1iZXIoaildO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgICBjbHVzdGVyc1tOdW1iZXIoaSldID0gY2x1c3Rlck51bTtcbiAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihqKV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpPTA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNsdXN0ZXJzW2ldID09PSAtMSkge1xuICAgICAgICBjbHVzdGVyTnVtICsrO1xuICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJOdW07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7Y2x1c3RlcnMsIGlzOiBuZXcgVWludDMyQXJyYXkoaXMpLCBqczogbmV3IFVpbnQzMkFycmF5KGpzKX07XG4gIH1cblxuICAvKiogc2FtZSBhcyBhc3NpZ24gY2x1c3RlcnMgYnV0IHdvcmtpbmcgb24gdGhlIGxldmVsIG9mIENTUiBmb3JtYXQgcmV0dXJuZWQgZnJvbSB3ZWJHUFUgKi9cbiAgcHJpdmF0ZSBhc3NpZ25DbHVzdGVyc0NTUihtY2xSZXM6IE1DTE9wUmV0dXJuVHlwZSwgblJvd3M6IG51bWJlcikge1xuICAgIGxldCBjbHVzdGVyTnVtID0gMDtcbiAgICBjb25zdCBpczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBqczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgY29uc3QgbWluT3JkZXIgPSAxIC8gTWF0aC5wb3coMTAsIG9yZGVyKTtcbiAgICBjb25zdCBjbHVzdGVyczogbnVtYmVyW10gPSBuZXcgQXJyYXkoblJvd3MpLmZpbGwoLTEpO1xuICAgIGNvbnN0IGNvcnJlY3RlZE9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkoblJvd3MgKyAxKTtcbiAgICBsZXQgb2Zmc2V0Q291bnRlciA9IDA7XG4gICAgY29ycmVjdGVkT2Zmc2V0c1swXSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuUm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBrID0gbWNsUmVzLmluZGV4T2Zmc2V0c1tpXTsgayA8IG1jbFJlcy5pbmRleE9mZnNldHNbaSArIDFdOyBrKyspIHtcbiAgICAgICAgY29uc3QgaiA9IG1jbFJlcy5LTk5JbmRleGVzW2tdO1xuICAgICAgICBpZiAoaiA8PSBpIHx8IG1jbFJlcy5LTk5TaW1pbGFyaXRpZXNba10gPD0gbWluT3JkZXIpXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlzLnB1c2goaSk7XG4gICAgICAgIGpzLnB1c2goaik7XG4gICAgICAgIG9mZnNldENvdW50ZXIrKztcbiAgICAgICAgaWYgKGNsdXN0ZXJzW2ldICE9PSAtMSAmJiBjbHVzdGVyc1tqXSAhPT0gLTEpIHtcbiAgICAgICAgICBpZiAoY2x1c3RlcnNbaV0gIT09IGNsdXN0ZXJzW2pdKVxuICAgICAgICAgICAgdGhpcy5tZXJnZUNsdXN0ZXJzKGNsdXN0ZXJzLCBpLCBqKTtcbiAgICAgICAgfSBlbHNlIGlmIChjbHVzdGVyc1tpXSAhPT0gLTEpIHtcbiAgICAgICAgICBjbHVzdGVyc1tqXSA9IGNsdXN0ZXJzW2ldO1xuICAgICAgICB9IGVsc2UgaWYgKGNsdXN0ZXJzW2pdICE9PSAtMSkge1xuICAgICAgICAgIGNsdXN0ZXJzW2ldID0gY2x1c3RlcnNbal07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck51bTtcbiAgICAgICAgICBjbHVzdGVyc1tqXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvcnJlY3RlZE9mZnNldHNbaSArIDFdID0gb2Zmc2V0Q291bnRlcjtcbiAgICB9XG4gICAgZm9yIChsZXQgaT0wOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChjbHVzdGVyc1tpXSA9PT0gLTEpIHtcbiAgICAgICAgY2x1c3Rlck51bSArKztcbiAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge2NsdXN0ZXJzLCBpczogbmV3IFVpbnQzMkFycmF5KGlzKSwganM6IG5ldyBVaW50MzJBcnJheShqcyksIGNvcnJlY3RlZE9mZnNldHN9O1xuICB9XG5cbiAgcHVibGljIHRvT2JqZWN0Rm9ybShzcGFyc2VNYXRyaXg6IFNwYXJzZU1hdHJpeFJlc3VsdCk6IFNwYXJzZU1hdHJpeE9iamVjdCB7XG4gICAgY29uc3Qgc3BhcnNlT2JqZWN0OiB7W186IG51bWJlcl06IHtbXzogbnVtYmVyXTogbnVtYmVyfX0gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZU1hdHJpeC5pLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXguaVtpXV0pXG4gICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXguaVtpXV0gPSB7fTtcbiAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXguaVtpXV1bc3BhcnNlTWF0cml4LmpbaV1dID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcbiAgICAgIGlmICghc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5qW2ldXSlcbiAgICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5qW2ldXSA9IHt9O1xuICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5qW2ldXVtzcGFyc2VNYXRyaXguaVtpXV0gPSAxIC0gc3BhcnNlTWF0cml4LmRpc3RhbmNlW2ldO1xuICAgIH1cbiAgICByZXR1cm4gc3BhcnNlT2JqZWN0O1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRMb29wcyhzcGFyc2VPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCwgblJvd3M6IG51bWJlcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0pXG4gICAgICAgIHNwYXJzZU9iamVjdFtpXSA9IHt9O1xuICAgICAgc3BhcnNlT2JqZWN0W2ldW2ldID0gdGhpcy5fb3B0aW9ucy5tdWx0RmFjdG9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplKHNwYXJzZU9iamVjdDogU3BhcnNlTWF0cml4T2JqZWN0KSB7XG4gICAgZm9yIChjb25zdCBpIG9mIE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdCkpIHtcbiAgICAgIGNvbnN0IHJvdyA9IHNwYXJzZU9iamVjdFtpIGFzIGFueV07XG4gICAgICBsZXQgc3VtID0gMDtcbiAgICAgIGZvciAoY29uc3QgaiBvZiBPYmplY3Qua2V5cyhyb3cpKVxuICAgICAgICBzdW0gKz0gcm93W2ogYXMgYW55XTtcbiAgICAgIGlmIChzdW0gPT09IDApIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHJvdykpXG4gICAgICAgIHNwYXJzZU9iamVjdFtpIGFzIGFueV1baiBhcyBhbnldIC89IHN1bTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4cGFuZChzcGFyc2VPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCwgblJvd3M6IG51bWJlcikge1xuICAgIGNvbnN0IGV4cGFuZGVkT2JqZWN0OiBTcGFyc2VNYXRyaXhPYmplY3QgPSB7fTtcbiAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgY29uc3QgbWluT3JkZXIgPSBNYXRoLnBvdygxMCwgb3JkZXIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0pXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgLy8gY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2ldO1xuICAgICAgZXhwYW5kZWRPYmplY3RbaV0gPz89IHt9O1xuICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBuUm93czsgaisrKSB7XG4gICAgICAgIGlmICghc3BhcnNlT2JqZWN0W2ldPy5bal0pXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0RXhwYW5kVmFsdWUoc3BhcnNlT2JqZWN0LCBpLCBqKTsgLy9wcnVuaW5nIHN0ZXBcbiAgICAgICAgaWYgKE1hdGgucm91bmQodmFsICogbWluT3JkZXIpIC8gbWluT3JkZXIgPiAwKSB7XG4gICAgICAgICAgZXhwYW5kZWRPYmplY3RbaV1bal0gPSB2YWw7XG4gICAgICAgICAgaWYgKCFleHBhbmRlZE9iamVjdFtqXSlcbiAgICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2pdID0ge307XG4gICAgICAgICAgZXhwYW5kZWRPYmplY3Rbal1baV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4cGFuZGVkT2JqZWN0O1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBwcnVuZShyb3c6IFNwYXJzZU1hdHJpeE9iamVjdFtudW1iZXJdKSB7XG5cbiAgLy8gfVxuXG4gIHByaXZhdGUgaW5mbGF0ZShzcGFyc2VPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCkge1xuICAgIGZvciAoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3QpKSB7XG4gICAgICBjb25zdCByb3cgPSBzcGFyc2VPYmplY3RbaSBhcyBhbnldO1xuICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHJvdykpXG4gICAgICAgIHNwYXJzZU9iamVjdFtpIGFzIGFueV1baiBhcyBhbnldID0gTWF0aC5wb3coc3BhcnNlT2JqZWN0W2kgYXMgYW55XVtqIGFzIGFueV0sIHRoaXMuX29wdGlvbnMuaW5mbGF0ZUZhY3Rvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHBhbmRWYWx1ZShzcGFyc2VPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCwgaTogYW55LCBqOiBhbnkpIHtcbiAgICBsZXQgdmFsID0gMDtcbiAgICBjb25zdCBjdXJyZW50SW5kZXhlcyA9IE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdFtpXSA/PyB7fSk7XG4gICAgY29uc3Qgb3RoZXJJbmRleGVzID0gT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0W2pdID8/IHt9KTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgY3VycmVudEluZGV4ZXMpIHtcbiAgICAgIGlmIChvdGhlckluZGV4ZXMuaW5jbHVkZXMoaykpXG4gICAgICAgIHZhbCArPSBzcGFyc2VPYmplY3RbaV1bayBhcyBhbnldICogc3BhcnNlT2JqZWN0W2pdW2sgYXMgYW55XTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxufVxuXG4iXX0=","export const MCLMethodName = 'MCL';\nexport const MCL_OPTIONS_TAG = 'MCL_OPTIONS';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFZQSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDO0FBZW5DLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5cbmV4cG9ydCB0eXBlIE1DTE9wdGlvbnMgPSB7XG4gICAgZXhwYW5kRmFjdG9yOiBudW1iZXIsXG4gICAgbWF4SXRlcmF0aW9uczogbnVtYmVyLFxuICAgIGluZmxhdGVGYWN0b3I6IG51bWJlcixcbiAgICBtdWx0RmFjdG9yOiBudW1iZXIsXG59XG5cbmV4cG9ydCB0eXBlIFNwYXJzZU1hdHJpeE9iamVjdCA9IHtbXzogbnVtYmVyXToge1tfOiBudW1iZXJdOiBudW1iZXJ9fTtcblxuZXhwb3J0IGNvbnN0IE1DTE1ldGhvZE5hbWUgPSAnTUNMJztcblxuZXhwb3J0IHR5cGUgTUNMU2VyaWFsaXphYmxlT3B0aW9ucyA9IHtcbiAgICBjb2xzOiBzdHJpbmdbXTtcbiAgICBtZXRyaWNzOiBLbm93bk1ldHJpY3NbXTtcbiAgICB3ZWlnaHRzOiBudW1iZXJbXTtcbiAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZDtcbiAgICBwcmVwcm9jZXNzaW5nRnVuY3M6IChzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKVtdO1xuICAgIHByZXByb2Nlc3NpbmdGdW5jQXJnczogYW55W107XG4gICAgdGhyZXNob2xkOiBudW1iZXI7XG4gICAgbWF4SXRlcmF0aW9uczogbnVtYmVyO1xuICAgIHVzZVdlYkdQVTogYm9vbGVhbjtcbiAgICBpbmZsYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBNQ0xfT1BUSU9OU19UQUcgPSAnTUNMX09QVElPTlMnO1xuIl19","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport { DIM_RED_PREPROCESSING_FUNCTION_TAG, SUPPORTED_DISTANCE_FUNCTIONS_TAG, SUPPORTED_SEMTYPES_TAG, SUPPORTED_TYPES_TAG, SUPPORTED_UNITS_TAG } from './consts';\nimport { TSNEOptions, UMAPOptions } from '../multi-column-dimensionality-reduction/multi-column-dim-reduction-editor';\nimport { DimReductionMethods } from '../multi-column-dimensionality-reduction/types';\nimport { MCLMethodName } from '../MCL';\nexport const SEQ_COL_NAMES = {\n [DG.SEMTYPE.MOLECULE]: 'Molecules',\n [DG.SEMTYPE.MACROMOLECULE]: 'Sequences'\n};\nexport class DBScanOptions {\n constructor() {\n this.epsilon = {\n uiName: 'Epsilon', value: 0.01, tooltip: 'Minimum distance between cluster points', min: 0, max: 2, step: 0.005\n };\n this.minPts = {\n uiName: 'Minimum points', value: 4, tooltip: 'Minimum number of points in cluster', min: 1, max: 1000, step: 1\n };\n }\n ;\n}\nexport class DimReductionBaseEditor {\n get algorithmOptions() {\n const algorithmParams = this.methodsParams[this.methodInput.value];\n const options = {};\n Object.keys(algorithmParams).forEach((key) => {\n if (algorithmParams[key].value != null)\n options[key] = algorithmParams[key].value;\n });\n return options;\n }\n get dbScanOptions() {\n return {\n dbScanEpsilon: this.dbScanParams.epsilon.value ?? 0.01,\n dbScanMinPts: this.dbScanParams.minPts.value ?? 4\n };\n }\n constructor(editorSettings = {}) {\n this.editorSettings = {};\n this.plotEmbeddingsInput = ui.boolInput('Plot embeddings', true);\n this.clusterEmbeddingsInput = ui.boolInput('Cluster embeddings', true);\n this.preprocessingFunctionInputRoot = null;\n this.methods = [DimReductionMethods.UMAP, DimReductionMethods.T_SNE];\n this.columnFunctionsMap = {};\n this.supportedFunctions = {};\n this.availableMetrics = [];\n this.methodSettingsDiv = ui.inputs([]);\n this.dbScanSettingsDiv = ui.inputs([]);\n this.preprocessingFuncSettingsDiv = ui.inputs([]);\n this.preprocessingFunctionSettings = {};\n this.methodsParams = {\n [DimReductionMethods.UMAP]: new UMAPOptions(),\n [DimReductionMethods.T_SNE]: new TSNEOptions()\n };\n this.dbScanParams = new DBScanOptions();\n this.editorSettings = editorSettings;\n if (this.editorSettings.enableMCL)\n this.methods.push(MCLMethodName);\n const preporcessingFuncs = DG.Func.find({ tags: [DIM_RED_PREPROCESSING_FUNCTION_TAG] });\n // map that contains all preprocessing functions and their metadata\n preporcessingFuncs.forEach((f) => {\n const semTypes = f.options.get(SUPPORTED_SEMTYPES_TAG) ?? '';\n const name = f.friendlyName ?? f.name;\n const types = f.options.get(SUPPORTED_TYPES_TAG) ?? '';\n const units = f.options.get(SUPPORTED_UNITS_TAG) ?? '';\n const distanceFunctions = f.options.get(SUPPORTED_DISTANCE_FUNCTIONS_TAG) ?? '';\n if (this.editorSettings.semtype && !semTypes.includes(this.editorSettings.semtype))\n return;\n if (this.editorSettings.type && !types.includes(this.editorSettings.type))\n return;\n if (this.editorSettings.units && !units.includes(this.editorSettings.units))\n return;\n this.supportedFunctions[name] = {\n func: f,\n semTypes: semTypes ? semTypes.split(',') : [],\n types: types ? types.split(',') : [],\n units: units ? units.split(',') : [],\n distanceFunctions: distanceFunctions ? distanceFunctions.split(',') : [],\n };\n });\n this.tableInput = ui.tableInput('Table', grok.shell.tv.dataFrame, grok.shell.tables, () => {\n this.onTableInputChanged();\n });\n this.onTableInputChanged();\n this.regenerateColInput();\n this.onColumnInputChanged();\n let settingsOpened = false;\n let dbScanSettingsOpened = false;\n this.methodInput = ui.choiceInput('Method', DimReductionMethods.UMAP, this.methods, () => {\n if (settingsOpened)\n this.createAlgorithmSettingsDiv(this.methodSettingsDiv, this.methodsParams[this.methodInput.value]);\n });\n this.methodSettingsIcon = ui.icons.settings(() => {\n settingsOpened = !settingsOpened;\n if (!settingsOpened)\n ui.empty(this.methodSettingsDiv);\n else\n this.createAlgorithmSettingsDiv(this.methodSettingsDiv, this.methodsParams[this.methodInput.value]);\n }, 'Modify methods parameters');\n this.dbScanSettingsIcon = ui.icons.settings(() => {\n dbScanSettingsOpened = !dbScanSettingsOpened;\n if (!dbScanSettingsOpened)\n ui.empty(this.dbScanSettingsDiv);\n else\n this.createAlgorithmSettingsDiv(this.dbScanSettingsDiv, this.dbScanParams);\n }, 'Modify clustering parameters');\n this.clusterEmbeddingsInput.classList.add('ml-dim-reduction-settings-input');\n this.clusterEmbeddingsInput.root.prepend(this.dbScanSettingsIcon);\n this.methodInput.root.classList.add('ml-dim-reduction-settings-input');\n this.methodInput.root.prepend(this.methodSettingsIcon);\n this.methodSettingsDiv = ui.inputs([]);\n const functions = this.columnFunctionsMap[this.colInput.value.name];\n this.preprocessingFunctionInput = ui.choiceInput('Encoding function', functions[0], functions, () => {\n this.onPreprocessingFunctionChanged();\n });\n let flagPfi = false;\n if (!this.preprocessingFunctionInputRoot) {\n this.preprocessingFunctionInputRoot = this.preprocessingFunctionInput.root;\n flagPfi = true;\n }\n if (!flagPfi) {\n ui.empty(this.preprocessingFunctionInputRoot);\n Array.from(this.preprocessingFunctionInput.root.children)\n .forEach((child) => this.preprocessingFunctionInputRoot.append(child));\n }\n this.preprocessingFunctionInputRoot.classList.add('ml-dim-reduction-settings-input');\n let preprocessingSettingsOpened = false;\n this.preprocessingFuncSettingsIcon = ui.icons.settings(async () => {\n if (!preprocessingSettingsOpened) {\n await this.createPreprocessingFuncParamsDiv(this.preprocessingFuncSettingsDiv, this.supportedFunctions[this.preprocessingFunctionInput.value].func);\n }\n else {\n ui.empty(this.preprocessingFuncSettingsDiv);\n }\n preprocessingSettingsOpened = !preprocessingSettingsOpened;\n }, 'Modify encoding function parameters');\n this.preprocessingFunctionInputRoot.prepend(this.preprocessingFuncSettingsIcon);\n this.similarityMetricInput = ui.choiceInput('Similarity', '', [], null);\n this.similarityMetricInput.nullable = false;\n if (!this.similarityMetricInputRoot)\n this.similarityMetricInputRoot = this.similarityMetricInput.root;\n this.onPreprocessingFunctionChanged();\n }\n getColInput() {\n const firstSupportedColumn = this.tableInput.value?.columns.toList()\n .find((col) => !!this.columnFunctionsMap[col.name]) ?? null;\n const input = ui.columnInput('Column', this.tableInput.value, firstSupportedColumn, () => this.onColumnInputChanged(), { filter: (col) => !!this.columnFunctionsMap[col.name] });\n if (!this.colInputRoot)\n this.colInputRoot = input.root;\n return input;\n }\n regenerateColInput() {\n let flag = false;\n if (this.colInputRoot) {\n flag = true;\n ui.empty(this.colInputRoot);\n }\n this.colInput = this.getColInput();\n if (flag)\n Array.from(this.colInput.root.children).forEach((child) => this.colInputRoot.append(child));\n this.onColumnInputChanged();\n }\n onTableInputChanged() {\n const value = this.tableInput.value;\n if (!value)\n return;\n this.columnFunctionsMap = {};\n const columns = value.columns.toList();\n columns.forEach((col) => {\n Object.keys(this.supportedFunctions).forEach((funcName) => {\n const semTypes = this.supportedFunctions[funcName].semTypes;\n const types = this.supportedFunctions[funcName].types;\n const units = this.supportedFunctions[funcName].units;\n const semTypeSupported = !semTypes.length || (col.semType && semTypes.includes(col.semType));\n const typeSuported = !types.length || types.includes(col.type);\n const unitsSupported = !units.length ||\n (col.getTag(DG.TAGS.UNITS) && units.includes(col.getTag(DG.TAGS.UNITS)));\n if (semTypeSupported && typeSuported && unitsSupported) {\n if (!this.columnFunctionsMap[col.name])\n this.columnFunctionsMap[col.name] = [];\n this.columnFunctionsMap[col.name].push(funcName);\n }\n });\n });\n this.regenerateColInput();\n }\n onColumnInputChanged() {\n const col = this.colInput.value;\n if (!col)\n return;\n const supportedPreprocessingFunctions = this.columnFunctionsMap[col.name];\n this.preprocessingFunctionInput = ui.choiceInput('Preprocessing function', supportedPreprocessingFunctions[0], supportedPreprocessingFunctions, () => {\n this.onPreprocessingFunctionChanged();\n });\n let flag = false;\n if (!this.preprocessingFunctionInputRoot) {\n this.preprocessingFunctionInputRoot = this.preprocessingFunctionInput.root;\n flag = true;\n }\n if (!flag) {\n ui.empty(this.preprocessingFunctionInputRoot);\n Array.from(this.preprocessingFunctionInput.root.children)\n .forEach((child) => this.preprocessingFunctionInputRoot.append(child));\n }\n this.onPreprocessingFunctionChanged();\n }\n onPreprocessingFunctionChanged() {\n ui.empty(this.preprocessingFuncSettingsDiv);\n this.preprocessingFunctionSettings = {};\n const fName = this.preprocessingFunctionInput.value;\n const distanceFs = this.supportedFunctions[fName].distanceFunctions;\n this.availableMetrics = [...distanceFs];\n this.similarityMetricInput = ui.choiceInput('Similarity', this.availableMetrics[0], this.availableMetrics, null);\n this.similarityMetricInput.nullable = false;\n if (!this.similarityMetricInputRoot)\n this.similarityMetricInputRoot = this.similarityMetricInput.root;\n ui.empty(this.similarityMetricInputRoot);\n Array.from(this.similarityMetricInput.root.children)\n .forEach((child) => this.similarityMetricInputRoot.append(child));\n if (this.preprocessingFuncSettingsIcon) {\n if (this.supportedFunctions[fName].func.inputs.length < 3)\n this.preprocessingFuncSettingsIcon.style.display = 'none';\n else\n this.preprocessingFuncSettingsIcon.style.display = 'flex';\n }\n }\n createAlgorithmSettingsDiv(paramsForm, params) {\n ui.empty(paramsForm);\n Object.keys(params).forEach((it) => {\n const param = params[it];\n const input = param.type === 'string' ?\n ui.stringInput(param.uiName, param.value ?? '', () => {\n param.value = input.value;\n }) : param.type === 'boolean' ?\n ui.boolInput(param.uiName, param.value ?? false, () => {\n param.value = input.value;\n }) :\n ui.floatInput(param.uiName, param.value, () => {\n param.value = input.value;\n });\n paramsForm.append(input.root);\n if (param.disable) {\n input.enabled = false;\n ui.tooltip.bind(input.input ?? input.root, param.disableTooltip ?? '');\n }\n else {\n ui.tooltip.bind(input.input ?? input.root, param.tooltip);\n }\n });\n return paramsForm;\n }\n async createPreprocessingFuncParamsDiv(paramsForm, func) {\n ui.empty(paramsForm);\n if (func.inputs.length < 3)\n return ui.div();\n const fc = func.prepare();\n const inputs = await fc.buildEditor(ui.div());\n for (let i = 2; i < func.inputs.length; i++) {\n const fInput = func.inputs[i];\n if (this.preprocessingFunctionSettings[fInput.name] || fc.inputParams[func.inputs[i].name].value ||\n fInput.defaultValue) {\n this.preprocessingFunctionSettings[fInput.name] =\n this.preprocessingFunctionSettings[fInput.name] ?? fc.inputParams[fInput.name].value ?? fInput.defaultValue;\n }\n const input = inputs.find((inp) => inp.property.name === fInput.name);\n if (!input)\n continue;\n if (this.preprocessingFunctionSettings[fInput.name] !== null &&\n this.preprocessingFunctionSettings[fInput.name] !== undefined)\n input.value = this.preprocessingFunctionSettings[fInput.name];\n input.onChanged(() => { this.preprocessingFunctionSettings[fInput.name] = input.value; });\n paramsForm.append(input.root);\n }\n return paramsForm;\n }\n getEditor() {\n return ui.div([\n this.tableInput,\n this.colInputRoot,\n this.preprocessingFunctionInputRoot,\n this.preprocessingFuncSettingsDiv,\n this.methodInput,\n this.methodSettingsDiv,\n this.similarityMetricInputRoot,\n this.plotEmbeddingsInput,\n this.clusterEmbeddingsInput,\n this.dbScanSettingsDiv\n ], { style: { minWidth: '420px' }, classes: 'ui-form dim-reduction-dialog-form' });\n }\n getParams() {\n return {\n table: this.tableInput.value,\n col: this.colInput.value,\n methodName: this.methodInput.value,\n preprocessingFunction: this.supportedFunctions[this.preprocessingFunctionInput.value].func,\n similarityMetric: this.similarityMetricInput.value,\n plotEmbeddings: this.plotEmbeddingsInput.value,\n clusterEmbeddings: this.clusterEmbeddingsInput.value,\n options: { ...this.algorithmOptions, ...this.dbScanOptions,\n preprocessingFuncArgs: (this.preprocessingFunctionSettings ?? {}) }\n };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9uYWxpdHktcmVkdWN0aW9uLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRpbWVuc2lvbmFsaXR5LXJlZHVjdGlvbi1lZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLGtDQUFrQyxFQUFFLGdDQUFnQyxFQUMxRSxzQkFBc0IsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUdwRixPQUFPLEVBQUMsV0FBVyxFQUFFLFdBQVcsRUFBQyxNQUFNLDRFQUE0RSxDQUFDO0FBR3BILE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ25GLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHO0lBQzNCLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxXQUFXO0lBQ2xDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxXQUFXO0NBQ3hDLENBQUM7QUF5QkYsTUFBTSxPQUFPLGFBQWE7SUFNdEI7UUFMQSxZQUFPLEdBQXVCO1lBQzVCLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUseUNBQXlDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLO1NBQUMsQ0FBQztRQUNuSCxXQUFNLEdBQXVCO1lBQzNCLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxHQUFH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LENBQUMsNEJBQTRCO1lBQ2pDLElBQUksQ0FBQyxXQUFXO1lBQ2hCLElBQUksQ0FBQyxpQkFBaUI7WUFDdEIsSUFBSSxDQUFDLHlCQUF5QjtZQUM5QixJQUFJLENBQUMsbUJBQW1CO1lBQ3hCLElBQUksQ0FBQyxzQkFBc0I7WUFDM0IsSUFBSSxDQUFDLGlCQUFpQjtTQUN2QixFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxFQUFFLE9BQU8sRUFBRSxtQ0FBbUMsRUFBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVNLFNBQVM7UUFDZCxPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBTTtZQUM3QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFNO1lBQ3pCLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQU07WUFDbkMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFNLENBQUMsQ0FBQyxJQUFJO1lBQzNGLGdCQUFnQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFNO1lBQ25ELGNBQWMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBTTtZQUMvQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBTTtZQUNyRCxPQUFPLEVBQUUsRUFBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhO2dCQUN2RCxxQkFBcUIsRUFBRSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsSUFBSSxFQUFFLENBQUMsRUFBQztTQUNyRSxDQUFDO0lBQ0osQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7RElNX1JFRF9QUkVQUk9DRVNTSU5HX0ZVTkNUSU9OX1RBRywgU1VQUE9SVEVEX0RJU1RBTkNFX0ZVTkNUSU9OU19UQUcsXG4gIFNVUFBPUlRFRF9TRU1UWVBFU19UQUcsIFNVUFBPUlRFRF9UWVBFU19UQUcsIFNVUFBPUlRFRF9VTklUU19UQUd9IGZyb20gJy4vY29uc3RzJztcbmltcG9ydCB7SURCU2Nhbk9wdGlvbnN9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aCc7XG5pbXBvcnQge09wdGlvbnN9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7VFNORU9wdGlvbnMsIFVNQVBPcHRpb25zfSBmcm9tICcuLi9tdWx0aS1jb2x1bW4tZGltZW5zaW9uYWxpdHktcmVkdWN0aW9uL211bHRpLWNvbHVtbi1kaW0tcmVkdWN0aW9uLWVkaXRvcic7XG5pbXBvcnQge0lEaW1SZWR1Y3Rpb25QYXJhbSwgSVRTTkVPcHRpb25zLCBJVU1BUE9wdGlvbnN9XG4gIGZyb20gJy4uL211bHRpLWNvbHVtbi1kaW1lbnNpb25hbGl0eS1yZWR1Y3Rpb24vbXVsdGktY29sdW1uLWRpbS1yZWR1Y2VyJztcbmltcG9ydCB7RGltUmVkdWN0aW9uTWV0aG9kc30gZnJvbSAnLi4vbXVsdGktY29sdW1uLWRpbWVuc2lvbmFsaXR5LXJlZHVjdGlvbi90eXBlcyc7XG5pbXBvcnQge01DTE1ldGhvZE5hbWV9IGZyb20gJy4uL01DTCc7XG5cbmV4cG9ydCBjb25zdCBTRVFfQ09MX05BTUVTID0ge1xuICBbREcuU0VNVFlQRS5NT0xFQ1VMRV06ICdNb2xlY3VsZXMnLFxuICBbREcuU0VNVFlQRS5NQUNST01PTEVDVUxFXTogJ1NlcXVlbmNlcydcbn07XG5cbmV4cG9ydCB0eXBlIFByZXByb2Nlc3NGdW5jdGlvblJldHVyblR5cGUgPSB7XG4gICAgZW50cmllczogYW55W10sXG4gICAgb3B0aW9ucz86IHtbXzogc3RyaW5nXTogYW55fVxufTtcblxuZXhwb3J0IHR5cGUgRGltUmVkdWN0aW9uRWRpdG9yT3B0aW9ucyA9IHtcbiAgICBzZW10eXBlPzogc3RyaW5nLFxuICAgIHR5cGU/OiBzdHJpbmcsXG4gICAgdW5pdHM/OiBzdHJpbmcsXG4gICAgZW5hYmxlTUNMPzogYm9vbGVhbixcbn1cblxuZXhwb3J0IHR5cGUgRGltUmVkdWN0aW9uUGFyYW1zID0ge1xuICAgIHRhYmxlOiBERy5EYXRhRnJhbWUsXG4gICAgY29sOiBERy5Db2x1bW4sXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIHByZXByb2Nlc3NpbmdGdW5jdGlvbjogREcuRnVuYyxcbiAgICBzaW1pbGFyaXR5TWV0cmljOiBzdHJpbmcsXG4gICAgcGxvdEVtYmVkZGluZ3M/OiBib29sZWFuLFxuICAgIGNsdXN0ZXJFbWJlZGRpbmdzPzogYm9vbGVhbixcbiAgICBvcHRpb25zOiAoSVVNQVBPcHRpb25zIHwgSVRTTkVPcHRpb25zKSAmIFBhcnRpYWw8SURCU2Nhbk9wdGlvbnM+ICYge3ByZXByb2Nlc3NpbmdGdW5jQXJncz86IE9wdGlvbnN9ICYgT3B0aW9uc1xufTtcblxuZXhwb3J0IGNsYXNzIERCU2Nhbk9wdGlvbnMge1xuICAgIGVwc2lsb246IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHtcbiAgICAgIHVpTmFtZTogJ0Vwc2lsb24nLCB2YWx1ZTogMC4wMSwgdG9vbHRpcDogJ01pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiBjbHVzdGVyIHBvaW50cycsIG1pbjogMCwgbWF4OiAyLCBzdGVwOiAwLjAwNX07XG4gICAgbWluUHRzOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7XG4gICAgICB1aU5hbWU6ICdNaW5pbXVtIHBvaW50cycsIHZhbHVlOiA0LCB0b29sdGlwOiAnTWluaW11bSBudW1iZXIgb2YgcG9pbnRzIGluIGNsdXN0ZXInLCBtaW46IDEsIG1heDogMTAwMCwgc3RlcDogMX07XG5cbiAgICBjb25zdHJ1Y3RvcigpIHt9O1xufVxuZXhwb3J0IGNsYXNzIERpbVJlZHVjdGlvbkJhc2VFZGl0b3Ige1xuICAgIGVkaXRvclNldHRpbmdzOiBEaW1SZWR1Y3Rpb25FZGl0b3JPcHRpb25zID0ge307XG4gICAgdGFibGVJbnB1dDogREcuSW5wdXRCYXNlPERHLkRhdGFGcmFtZSB8IG51bGw+O1xuICAgIGNvbElucHV0ITogREcuSW5wdXRCYXNlPERHLkNvbHVtbiB8IG51bGw+O1xuICAgIHByZXByb2Nlc3NpbmdGdW5jdGlvbklucHV0OiBERy5JbnB1dEJhc2U8c3RyaW5nIHwgbnVsbD47XG4gICAgcGxvdEVtYmVkZGluZ3NJbnB1dCA9IHVpLmJvb2xJbnB1dCgnUGxvdCBlbWJlZGRpbmdzJywgdHJ1ZSk7XG4gICAgY2x1c3RlckVtYmVkZGluZ3NJbnB1dCA9IHVpLmJvb2xJbnB1dCgnQ2x1c3RlciBlbWJlZGRpbmdzJywgdHJ1ZSk7XG4gICAgcHJlcHJvY2Vzc2luZ0Z1bmN0aW9uSW5wdXRSb290OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGNvbElucHV0Um9vdCE6IEhUTUxFbGVtZW50O1xuICAgIG1ldGhvZHM6IERpbVJlZHVjdGlvbk1ldGhvZHNbXSA9IFtEaW1SZWR1Y3Rpb25NZXRob2RzLlVNQVAsIERpbVJlZHVjdGlvbk1ldGhvZHMuVF9TTkVdO1xuICAgIG1ldGhvZElucHV0OiBERy5DaG9pY2VJbnB1dDxzdHJpbmcgfCBudWxsPjtcbiAgICBtZXRob2RTZXR0aW5nc0ljb246IEhUTUxFbGVtZW50O1xuICAgIGRiU2NhblNldHRpbmdzSWNvbjogSFRNTEVsZW1lbnQ7XG4gICAgcHJlcHJvY2Vzc2luZ0Z1bmNTZXR0aW5nc0ljb246IEhUTUxFbGVtZW50O1xuICAgIGNvbHVtbkZ1bmN0aW9uc01hcDoge1trZXk6IHN0cmluZ106IHN0cmluZ1tdfSA9IHt9O1xuICAgIHN1cHBvcnRlZEZ1bmN0aW9uczoge1tuYW1lOiBzdHJpbmddOiB7XG4gICAgICAgIGZ1bmM6IERHLkZ1bmMsXG4gICAgICAgIHNlbVR5cGVzOiBzdHJpbmdbXSxcbiAgICAgICAgdHlwZXM6IHN0cmluZ1tdLFxuICAgICAgICB1bml0czogc3RyaW5nW10sXG4gICAgICAgIGRpc3RhbmNlRnVuY3Rpb25zOiBzdHJpbmdbXVxuICAgIH19ID0ge307XG4gICAgYXZhaWxhYmxlTWV0cmljczogc3RyaW5nW10gPSBbXTtcbiAgICBzaW1pbGFyaXR5TWV0cmljSW5wdXRSb290ITogSFRNTEVsZW1lbnQ7XG4gICAgbWV0aG9kU2V0dGluZ3NEaXYgPSB1aS5pbnB1dHMoW10pO1xuICAgIGRiU2NhblNldHRpbmdzRGl2ID0gdWkuaW5wdXRzKFtdKTtcbiAgICBwcmVwcm9jZXNzaW5nRnVuY1NldHRpbmdzRGl2ID0gdWkuaW5wdXRzKFtdKTtcbiAgICBwcmVwcm9jZXNzaW5nRnVuY3Rpb25TZXR0aW5nczogT3B0aW9ucyA9IHt9O1xuICAgIG1ldGhvZHNQYXJhbXM6IHtba2V5OiBzdHJpbmddOiBVTUFQT3B0aW9ucyB8IFRTTkVPcHRpb25zfSA9IHtcbiAgICAgIFtEaW1SZWR1Y3Rpb25NZXRob2RzLlVNQVBdOiBuZXcgVU1BUE9wdGlvbnMoKSxcbiAgICAgIFtEaW1SZWR1Y3Rpb25NZXRob2RzLlRfU05FXTogbmV3IFRTTkVPcHRpb25zKClcbiAgICB9O1xuICAgIGRiU2NhblBhcmFtcyA9IG5ldyBEQlNjYW5PcHRpb25zKCk7XG4gICAgc2ltaWxhcml0eU1ldHJpY0lucHV0ITogREcuSW5wdXRCYXNlPHN0cmluZyB8IG51bGw+O1xuICAgIGdldCBhbGdvcml0aG1PcHRpb25zKCk6IChJVU1BUE9wdGlvbnMgfCBJVFNORU9wdGlvbnMpICYgT3B0aW9ucyB7XG4gICAgICBjb25zdCBhbGdvcml0aG1QYXJhbXM6IFVNQVBPcHRpb25zIHwgVFNORU9wdGlvbnMgPSB0aGlzLm1ldGhvZHNQYXJhbXNbdGhpcy5tZXRob2RJbnB1dC52YWx1ZSFdO1xuICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge307XG4gICAgICBPYmplY3Qua2V5cyhhbGdvcml0aG1QYXJhbXMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICgoYWxnb3JpdGhtUGFyYW1zIGFzIGFueSlba2V5XS52YWx1ZSAhPSBudWxsKVxuICAgICAgICAgIG9wdGlvbnNba2V5XSA9IChhbGdvcml0aG1QYXJhbXMgYXMgYW55KVtrZXldLnZhbHVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBnZXQgZGJTY2FuT3B0aW9ucygpOiBJREJTY2FuT3B0aW9ucyB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYlNjYW5FcHNpbG9uOiB0aGlzLmRiU2NhblBhcmFtcy5lcHNpbG9uLnZhbHVlID8/IDAuMDEsXG4gICAgICAgIGRiU2Nhbk1pblB0czogdGhpcy5kYlNjYW5QYXJhbXMubWluUHRzLnZhbHVlID8/IDRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yU2V0dGluZ3M6IERpbVJlZHVjdGlvbkVkaXRvck9wdGlvbnMgPSB7fSkge1xuICAgICAgdGhpcy5lZGl0b3JTZXR0aW5ncyA9IGVkaXRvclNldHRpbmdzO1xuICAgICAgaWYgKHRoaXMuZWRpdG9yU2V0dGluZ3MuZW5hYmxlTUNMKVxuICAgICAgICB0aGlzLm1ldGhvZHMucHVzaChNQ0xNZXRob2ROYW1lIGFzIGFueSk7XG5cbiAgICAgIGNvbnN0IHByZXBvcmNlc3NpbmdGdW5jcyA9IERHLkZ1bmMuZmluZCh7dGFnczogW0RJTV9SRURfUFJFUFJPQ0VTU0lOR19GVU5DVElPTl9UQUddfSk7XG4gICAgICAvLyBtYXAgdGhhdCBjb250YWlucyBhbGwgcHJlcHJvY2Vzc2luZyBmdW5jdGlvbnMgYW5kIHRoZWlyIG1ldGFkYXRhXG4gICAgICBwcmVwb3JjZXNzaW5nRnVuY3MuZm9yRWFjaCgoZikgPT4ge1xuICAgICAgICBjb25zdCBzZW1UeXBlczogc3RyaW5nID0gZi5vcHRpb25zLmdldChTVVBQT1JURURfU0VNVFlQRVNfVEFHKSA/PyAnJztcbiAgICAgICAgY29uc3QgbmFtZSA9IGYuZnJpZW5kbHlOYW1lID8/IGYubmFtZTtcbiAgICAgICAgY29uc3QgdHlwZXM6IHN0cmluZyA9IGYub3B0aW9ucy5nZXQoU1VQUE9SVEVEX1RZUEVTX1RBRykgPz8gJyc7XG4gICAgICAgIGNvbnN0IHVuaXRzOiBzdHJpbmcgPSBmLm9wdGlvbnMuZ2V0KFNVUFBPUlRFRF9VTklUU19UQUcpID8/ICcnO1xuICAgICAgICBjb25zdCBkaXN0YW5jZUZ1bmN0aW9uczogc3RyaW5nID0gZi5vcHRpb25zLmdldChTVVBQT1JURURfRElTVEFOQ0VfRlVOQ1RJT05TX1RBRykgPz8gJyc7XG4gICAgICAgIGlmICh0aGlzLmVkaXRvclNldHRpbmdzLnNlbXR5cGUgJiYgIXNlbVR5cGVzLmluY2x1ZGVzKHRoaXMuZWRpdG9yU2V0dGluZ3Muc2VtdHlwZSkpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5lZGl0b3JTZXR0aW5ncy50eXBlICYmICF0eXBlcy5pbmNsdWRlcyh0aGlzLmVkaXRvclNldHRpbmdzLnR5cGUpKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuZWRpdG9yU2V0dGluZ3MudW5pdHMgJiYgIXVuaXRzLmluY2x1ZGVzKHRoaXMuZWRpdG9yU2V0dGluZ3MudW5pdHMpKVxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLnN1cHBvcnRlZEZ1bmN0aW9uc1tuYW1lXSA9IHtcbiAgICAgICAgICBmdW5jOiBmLFxuICAgICAgICAgIHNlbVR5cGVzOiBzZW1UeXBlcyA/IHNlbVR5cGVzLnNwbGl0KCcsJykgOiBbXSxcbiAgICAgICAgICB0eXBlczogdHlwZXMgPyB0eXBlcy5zcGxpdCgnLCcpIDogW10sXG4gICAgICAgICAgdW5pdHM6IHVuaXRzID8gdW5pdHMuc3BsaXQoJywnKSA6IFtdLFxuICAgICAgICAgIGRpc3RhbmNlRnVuY3Rpb25zOiBkaXN0YW5jZUZ1bmN0aW9ucyA/IGRpc3RhbmNlRnVuY3Rpb25zLnNwbGl0KCcsJykgOiBbXSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnRhYmxlSW5wdXQgPSB1aS50YWJsZUlucHV0KCdUYWJsZScsIGdyb2suc2hlbGwudHYuZGF0YUZyYW1lLCBncm9rLnNoZWxsLnRhYmxlcywgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uVGFibGVJbnB1dENoYW5nZWQoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vblRhYmxlSW5wdXRDaGFuZ2VkKCk7XG5cbiAgICAgIHRoaXMucmVnZW5lcmF0ZUNvbElucHV0KCk7XG4gICAgICB0aGlzLm9uQ29sdW1uSW5wdXRDaGFuZ2VkKCk7XG4gICAgICBsZXQgc2V0dGluZ3NPcGVuZWQgPSBmYWxzZTtcbiAgICAgIGxldCBkYlNjYW5TZXR0aW5nc09wZW5lZCA9IGZhbHNlO1xuICAgICAgdGhpcy5tZXRob2RJbnB1dCA9IHVpLmNob2ljZUlucHV0KCdNZXRob2QnLCBEaW1SZWR1Y3Rpb25NZXRob2RzLlVNQVAsXG4gICAgICAgIHRoaXMubWV0aG9kcywgKCkgPT4ge1xuICAgICAgICAgIGlmIChzZXR0aW5nc09wZW5lZClcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQWxnb3JpdGhtU2V0dGluZ3NEaXYodGhpcy5tZXRob2RTZXR0aW5nc0RpdiwgdGhpcy5tZXRob2RzUGFyYW1zW3RoaXMubWV0aG9kSW5wdXQudmFsdWUhXSk7XG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5tZXRob2RTZXR0aW5nc0ljb24gPSB1aS5pY29ucy5zZXR0aW5ncygoKT0+IHtcbiAgICAgICAgc2V0dGluZ3NPcGVuZWQgPSAhc2V0dGluZ3NPcGVuZWQ7XG4gICAgICAgIGlmICghc2V0dGluZ3NPcGVuZWQpXG4gICAgICAgICAgdWkuZW1wdHkodGhpcy5tZXRob2RTZXR0aW5nc0Rpdik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzLmNyZWF0ZUFsZ29yaXRobVNldHRpbmdzRGl2KHRoaXMubWV0aG9kU2V0dGluZ3NEaXYsIHRoaXMubWV0aG9kc1BhcmFtc1t0aGlzLm1ldGhvZElucHV0LnZhbHVlIV0pO1xuICAgICAgfSwgJ01vZGlmeSBtZXRob2RzIHBhcmFtZXRlcnMnKTtcbiAgICAgIHRoaXMuZGJTY2FuU2V0dGluZ3NJY29uID0gdWkuaWNvbnMuc2V0dGluZ3MoKCk9PiB7XG4gICAgICAgIGRiU2NhblNldHRpbmdzT3BlbmVkID0gIWRiU2NhblNldHRpbmdzT3BlbmVkO1xuICAgICAgICBpZiAoIWRiU2NhblNldHRpbmdzT3BlbmVkKVxuICAgICAgICAgIHVpLmVtcHR5KHRoaXMuZGJTY2FuU2V0dGluZ3NEaXYpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy5jcmVhdGVBbGdvcml0aG1TZXR0aW5nc0Rpdih0aGlzLmRiU2NhblNldHRpbmdzRGl2LCB0aGlzLmRiU2NhblBhcmFtcyk7XG4gICAgICB9LCAnTW9kaWZ5IGNsdXN0ZXJpbmcgcGFyYW1ldGVycycpO1xuICAgICAgdGhpcy5jbHVzdGVyRW1iZWRkaW5nc0lucHV0LmNsYXNzTGlzdC5hZGQoJ21sLWRpbS1yZWR1Y3Rpb24tc2V0dGluZ3MtaW5wdXQnKTtcbiAgICAgIHRoaXMuY2x1c3RlckVtYmVkZGluZ3NJbnB1dC5yb290LnByZXBlbmQodGhpcy5kYlNjYW5TZXR0aW5nc0ljb24pO1xuICAgICAgdGhpcy5tZXRob2RJbnB1dC5yb290LmNsYXNzTGlzdC5hZGQoJ21sLWRpbS1yZWR1Y3Rpb24tc2V0dGluZ3MtaW5wdXQnKTtcbiAgICAgIHRoaXMubWV0aG9kSW5wdXQucm9vdC5wcmVwZW5kKHRoaXMubWV0aG9kU2V0dGluZ3NJY29uKTtcbiAgICAgIHRoaXMubWV0aG9kU2V0dGluZ3NEaXYgPSB1aS5pbnB1dHMoW10pO1xuICAgICAgY29uc3QgZnVuY3Rpb25zID0gdGhpcy5jb2x1bW5GdW5jdGlvbnNNYXBbdGhpcy5jb2xJbnB1dC52YWx1ZSEubmFtZV07XG5cbiAgICAgIHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uSW5wdXQgPSB1aS5jaG9pY2VJbnB1dCgnRW5jb2RpbmcgZnVuY3Rpb24nLFxuICAgICAgICBmdW5jdGlvbnNbMF0sIGZ1bmN0aW9ucywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMub25QcmVwcm9jZXNzaW5nRnVuY3Rpb25DaGFuZ2VkKCk7XG4gICAgICAgIH0pO1xuICAgICAgbGV0IGZsYWdQZmkgPSBmYWxzZTtcbiAgICAgIGlmICghdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25JbnB1dFJvb3QpIHtcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25JbnB1dFJvb3QgPSB0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvbklucHV0LnJvb3Q7XG4gICAgICAgIGZsYWdQZmkgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFmbGFnUGZpKSB7XG4gICAgICAgIHVpLmVtcHR5KHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uSW5wdXRSb290KTtcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvbklucHV0LnJvb3QuY2hpbGRyZW4pXG4gICAgICAgICAgLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvbklucHV0Um9vdCEuYXBwZW5kKGNoaWxkKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvbklucHV0Um9vdC5jbGFzc0xpc3QuYWRkKCdtbC1kaW0tcmVkdWN0aW9uLXNldHRpbmdzLWlucHV0Jyk7XG4gICAgICBsZXQgcHJlcHJvY2Vzc2luZ1NldHRpbmdzT3BlbmVkID0gZmFsc2U7XG4gICAgICB0aGlzLnByZXByb2Nlc3NpbmdGdW5jU2V0dGluZ3NJY29uID0gdWkuaWNvbnMuc2V0dGluZ3MoYXN5bmMgKCk9PiB7XG4gICAgICAgIGlmICghcHJlcHJvY2Vzc2luZ1NldHRpbmdzT3BlbmVkKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVQcmVwcm9jZXNzaW5nRnVuY1BhcmFtc0RpdihcbiAgICAgICAgICAgIHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmNTZXR0aW5nc0RpdiwgdGhpcy5zdXBwb3J0ZWRGdW5jdGlvbnNbdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25JbnB1dC52YWx1ZSFdLmZ1bmMpO1xuICAgICAgICB9IGVsc2UgeyB1aS5lbXB0eSh0aGlzLnByZXByb2Nlc3NpbmdGdW5jU2V0dGluZ3NEaXYpOyB9XG4gICAgICAgIHByZXByb2Nlc3NpbmdTZXR0aW5nc09wZW5lZCA9ICFwcmVwcm9jZXNzaW5nU2V0dGluZ3NPcGVuZWQ7XG4gICAgICB9LCAnTW9kaWZ5IGVuY29kaW5nIGZ1bmN0aW9uIHBhcmFtZXRlcnMnKTtcbiAgICAgIHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uSW5wdXRSb290LnByZXBlbmQodGhpcy5wcmVwcm9jZXNzaW5nRnVuY1NldHRpbmdzSWNvbik7XG5cbiAgICAgIHRoaXMuc2ltaWxhcml0eU1ldHJpY0lucHV0ID0gdWkuY2hvaWNlSW5wdXQoJ1NpbWlsYXJpdHknLCAnJywgW10sIG51bGwpO1xuICAgICAgdGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXQubnVsbGFibGUgPSBmYWxzZTtcbiAgICAgIGlmICghdGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXRSb290KVxuICAgICAgICB0aGlzLnNpbWlsYXJpdHlNZXRyaWNJbnB1dFJvb3QgPSB0aGlzLnNpbWlsYXJpdHlNZXRyaWNJbnB1dC5yb290O1xuICAgICAgdGhpcy5vblByZXByb2Nlc3NpbmdGdW5jdGlvbkNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbElucHV0KCkge1xuICAgICAgY29uc3QgZmlyc3RTdXBwb3J0ZWRDb2x1bW4gPSB0aGlzLnRhYmxlSW5wdXQudmFsdWU/LmNvbHVtbnMudG9MaXN0KClcbiAgICAgICAgLmZpbmQoKGNvbCkgPT4gISF0aGlzLmNvbHVtbkZ1bmN0aW9uc01hcFtjb2wubmFtZV0pID8/IG51bGw7XG4gICAgICBjb25zdCBpbnB1dCA9IHVpLmNvbHVtbklucHV0KCdDb2x1bW4nLCB0aGlzLnRhYmxlSW5wdXQudmFsdWUhLCBmaXJzdFN1cHBvcnRlZENvbHVtbixcbiAgICAgICAgKCkgPT4gdGhpcy5vbkNvbHVtbklucHV0Q2hhbmdlZCgpLCB7ZmlsdGVyOiAoY29sOiBERy5Db2x1bW4pID0+ICEhdGhpcy5jb2x1bW5GdW5jdGlvbnNNYXBbY29sLm5hbWVdfSk7XG4gICAgICBpZiAoIXRoaXMuY29sSW5wdXRSb290KVxuICAgICAgICB0aGlzLmNvbElucHV0Um9vdCA9IGlucHV0LnJvb3Q7XG4gICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdlbmVyYXRlQ29sSW5wdXQoKSB7XG4gICAgICBsZXQgZmxhZyA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuY29sSW5wdXRSb290KSB7XG4gICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICB1aS5lbXB0eSh0aGlzLmNvbElucHV0Um9vdCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbElucHV0ID0gdGhpcy5nZXRDb2xJbnB1dCgpO1xuICAgICAgaWYgKGZsYWcpXG4gICAgICAgIEFycmF5LmZyb20odGhpcy5jb2xJbnB1dC5yb290LmNoaWxkcmVuKS5mb3JFYWNoKChjaGlsZCkgPT4gdGhpcy5jb2xJbnB1dFJvb3QuYXBwZW5kKGNoaWxkKSk7XG4gICAgICB0aGlzLm9uQ29sdW1uSW5wdXRDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgb25UYWJsZUlucHV0Q2hhbmdlZCgpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50YWJsZUlucHV0LnZhbHVlO1xuICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5jb2x1bW5GdW5jdGlvbnNNYXAgPSB7fTtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB2YWx1ZS5jb2x1bW5zLnRvTGlzdCgpO1xuICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdXBwb3J0ZWRGdW5jdGlvbnMpLmZvckVhY2goKGZ1bmNOYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VtVHlwZXMgPSB0aGlzLnN1cHBvcnRlZEZ1bmN0aW9uc1tmdW5jTmFtZV0uc2VtVHlwZXM7XG4gICAgICAgICAgY29uc3QgdHlwZXMgPSB0aGlzLnN1cHBvcnRlZEZ1bmN0aW9uc1tmdW5jTmFtZV0udHlwZXM7XG4gICAgICAgICAgY29uc3QgdW5pdHMgPSB0aGlzLnN1cHBvcnRlZEZ1bmN0aW9uc1tmdW5jTmFtZV0udW5pdHM7XG4gICAgICAgICAgY29uc3Qgc2VtVHlwZVN1cHBvcnRlZCA9ICFzZW1UeXBlcy5sZW5ndGggfHwgKGNvbC5zZW1UeXBlICYmIHNlbVR5cGVzLmluY2x1ZGVzKGNvbC5zZW1UeXBlKSk7XG4gICAgICAgICAgY29uc3QgdHlwZVN1cG9ydGVkID0gIXR5cGVzLmxlbmd0aCB8fCB0eXBlcy5pbmNsdWRlcyhjb2wudHlwZSk7XG4gICAgICAgICAgY29uc3QgdW5pdHNTdXBwb3J0ZWQgPSAhdW5pdHMubGVuZ3RoIHx8XG4gICAgICAgICAgICAoY29sLmdldFRhZyhERy5UQUdTLlVOSVRTKSAmJiB1bml0cy5pbmNsdWRlcyhjb2wuZ2V0VGFnKERHLlRBR1MuVU5JVFMpKSk7XG4gICAgICAgICAgaWYgKHNlbVR5cGVTdXBwb3J0ZWQgJiYgdHlwZVN1cG9ydGVkICYmIHVuaXRzU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29sdW1uRnVuY3Rpb25zTWFwW2NvbC5uYW1lXSlcbiAgICAgICAgICAgICAgdGhpcy5jb2x1bW5GdW5jdGlvbnNNYXBbY29sLm5hbWVdID0gW107XG4gICAgICAgICAgICB0aGlzLmNvbHVtbkZ1bmN0aW9uc01hcFtjb2wubmFtZV0ucHVzaChmdW5jTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZWdlbmVyYXRlQ29sSW5wdXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ29sdW1uSW5wdXRDaGFuZ2VkKCkge1xuICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xJbnB1dC52YWx1ZTtcbiAgICAgIGlmICghY29sKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBzdXBwb3J0ZWRQcmVwcm9jZXNzaW5nRnVuY3Rpb25zID0gdGhpcy5jb2x1bW5GdW5jdGlvbnNNYXBbY29sLm5hbWVdO1xuICAgICAgdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25JbnB1dCA9IHVpLmNob2ljZUlucHV0KCdQcmVwcm9jZXNzaW5nIGZ1bmN0aW9uJyxcbiAgICAgICAgc3VwcG9ydGVkUHJlcHJvY2Vzc2luZ0Z1bmN0aW9uc1swXSwgc3VwcG9ydGVkUHJlcHJvY2Vzc2luZ0Z1bmN0aW9ucywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMub25QcmVwcm9jZXNzaW5nRnVuY3Rpb25DaGFuZ2VkKCk7XG4gICAgICAgIH0pO1xuICAgICAgbGV0IGZsYWcgPSBmYWxzZTtcbiAgICAgIGlmICghdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25JbnB1dFJvb3QpIHtcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25JbnB1dFJvb3QgPSB0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvbklucHV0LnJvb3Q7XG4gICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgIHVpLmVtcHR5KHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uSW5wdXRSb290KTtcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvbklucHV0LnJvb3QuY2hpbGRyZW4pXG4gICAgICAgICAgLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvbklucHV0Um9vdCEuYXBwZW5kKGNoaWxkKSk7XG4gICAgICB9XG4gICAgICB0aGlzLm9uUHJlcHJvY2Vzc2luZ0Z1bmN0aW9uQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25QcmVwcm9jZXNzaW5nRnVuY3Rpb25DaGFuZ2VkKCkge1xuICAgICAgdWkuZW1wdHkodGhpcy5wcmVwcm9jZXNzaW5nRnVuY1NldHRpbmdzRGl2KTtcbiAgICAgIHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uU2V0dGluZ3MgPSB7fTtcbiAgICAgIGNvbnN0IGZOYW1lID0gdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25JbnB1dC52YWx1ZSE7XG4gICAgICBjb25zdCBkaXN0YW5jZUZzID0gdGhpcy5zdXBwb3J0ZWRGdW5jdGlvbnNbZk5hbWVdLmRpc3RhbmNlRnVuY3Rpb25zO1xuICAgICAgdGhpcy5hdmFpbGFibGVNZXRyaWNzID0gWy4uLmRpc3RhbmNlRnNdO1xuICAgICAgdGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXQgPSB1aS5jaG9pY2VJbnB1dCgnU2ltaWxhcml0eScsIHRoaXMuYXZhaWxhYmxlTWV0cmljc1swXSwgdGhpcy5hdmFpbGFibGVNZXRyaWNzLCBudWxsKTtcbiAgICAgIHRoaXMuc2ltaWxhcml0eU1ldHJpY0lucHV0Lm51bGxhYmxlID0gZmFsc2U7XG4gICAgICBpZiAoIXRoaXMuc2ltaWxhcml0eU1ldHJpY0lucHV0Um9vdClcbiAgICAgICAgdGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXRSb290ID0gdGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXQucm9vdDtcblxuICAgICAgdWkuZW1wdHkodGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXRSb290KTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXQucm9vdC5jaGlsZHJlbilcbiAgICAgICAgLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLnNpbWlsYXJpdHlNZXRyaWNJbnB1dFJvb3QuYXBwZW5kKGNoaWxkKSk7XG4gICAgICBpZiAodGhpcy5wcmVwcm9jZXNzaW5nRnVuY1NldHRpbmdzSWNvbikge1xuICAgICAgICBpZiAodGhpcy5zdXBwb3J0ZWRGdW5jdGlvbnNbZk5hbWVdLmZ1bmMuaW5wdXRzLmxlbmd0aCA8IDMpXG4gICAgICAgICAgdGhpcy5wcmVwcm9jZXNzaW5nRnVuY1NldHRpbmdzSWNvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy5wcmVwcm9jZXNzaW5nRnVuY1NldHRpbmdzSWNvbi5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQWxnb3JpdGhtU2V0dGluZ3NEaXYoXG4gICAgICBwYXJhbXNGb3JtOiBIVE1MRWxlbWVudCwgcGFyYW1zOiBVTUFQT3B0aW9ucyB8IFRTTkVPcHRpb25zIHwgREJTY2FuT3B0aW9ucyk6IEhUTUxFbGVtZW50IHtcbiAgICAgIHVpLmVtcHR5KHBhcmFtc0Zvcm0pO1xuICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChpdDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtOiBJRGltUmVkdWN0aW9uUGFyYW0gfCBJRGltUmVkdWN0aW9uUGFyYW08c3RyaW5nPiB8IElEaW1SZWR1Y3Rpb25QYXJhbTxib29sZWFuPiA9XG4gICAgICAgICAgKHBhcmFtcyBhcyBhbnkpW2l0XTtcblxuICAgICAgICBjb25zdCBpbnB1dCA9IHBhcmFtLnR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICB1aS5zdHJpbmdJbnB1dChwYXJhbS51aU5hbWUsIHBhcmFtLnZhbHVlID8/ICcnLCAoKSA9PiB7XG4gICAgICAgICAgICBwYXJhbS52YWx1ZSA9IChpbnB1dCBhcyBERy5JbnB1dEJhc2U8c3RyaW5nPikudmFsdWU7XG4gICAgICAgICAgfSkgOiBwYXJhbS50eXBlID09PSAnYm9vbGVhbicgP1xuICAgICAgICAgICAgdWkuYm9vbElucHV0KHBhcmFtLnVpTmFtZSwgcGFyYW0udmFsdWUgPz8gZmFsc2UsICgpID0+IHtcbiAgICAgICAgICAgICAgcGFyYW0udmFsdWUgPSAoaW5wdXQgYXMgREcuSW5wdXRCYXNlPGJvb2xlYW4+KS52YWx1ZTtcbiAgICAgICAgICAgIH0pIDpcbiAgICAgICAgICAgIHVpLmZsb2F0SW5wdXQocGFyYW0udWlOYW1lLCBwYXJhbS52YWx1ZSBhcyBhbnksICgpID0+IHtcbiAgICAgICAgICAgICAgcGFyYW0udmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBwYXJhbXNGb3JtLmFwcGVuZChpbnB1dC5yb290KTtcbiAgICAgICAgaWYgKHBhcmFtLmRpc2FibGUpIHtcbiAgICAgICAgICBpbnB1dC5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgdWkudG9vbHRpcC5iaW5kKGlucHV0LmlucHV0ID8/IGlucHV0LnJvb3QsIHBhcmFtLmRpc2FibGVUb29sdGlwID8/ICcnKTtcbiAgICAgICAgfSBlbHNlIHsgdWkudG9vbHRpcC5iaW5kKGlucHV0LmlucHV0ID8/IGlucHV0LnJvb3QsIHBhcmFtLnRvb2x0aXApOyB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwYXJhbXNGb3JtO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlUHJlcHJvY2Vzc2luZ0Z1bmNQYXJhbXNEaXYocGFyYW1zRm9ybTogSFRNTEVsZW1lbnQsIGZ1bmM6IERHLkZ1bmMpOiBQcm9taXNlPEhUTUxFbGVtZW50PiB7XG4gICAgICB1aS5lbXB0eShwYXJhbXNGb3JtKTtcbiAgICAgIGlmIChmdW5jLmlucHV0cy5sZW5ndGggPCAzKVxuICAgICAgICByZXR1cm4gdWkuZGl2KCk7XG4gICAgICBjb25zdCBmYyA9IGZ1bmMucHJlcGFyZSgpO1xuICAgICAgY29uc3QgaW5wdXRzID0gYXdhaXQgZmMuYnVpbGRFZGl0b3IodWkuZGl2KCkpO1xuICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBmdW5jLmlucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBmSW5wdXQgPSBmdW5jLmlucHV0c1tpXTtcbiAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uU2V0dGluZ3NbZklucHV0Lm5hbWVdIHx8IGZjLmlucHV0UGFyYW1zW2Z1bmMuaW5wdXRzW2ldLm5hbWVdLnZhbHVlIHx8XG4gICAgICAgICAgIGZJbnB1dC5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvblNldHRpbmdzW2ZJbnB1dC5uYW1lXSA9XG4gICAgICAgICAgICB0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvblNldHRpbmdzW2ZJbnB1dC5uYW1lXSA/PyBmYy5pbnB1dFBhcmFtc1tmSW5wdXQubmFtZV0udmFsdWUgPz8gZklucHV0LmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnB1dCA9IGlucHV0cy5maW5kKChpbnApID0+IGlucC5wcm9wZXJ0eS5uYW1lID09PSBmSW5wdXQubmFtZSk7XG4gICAgICAgIGlmICghaW5wdXQpXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmICh0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvblNldHRpbmdzW2ZJbnB1dC5uYW1lXSAhPT0gbnVsbCAmJlxuICAgICAgICAgIHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uU2V0dGluZ3NbZklucHV0Lm5hbWVdICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvblNldHRpbmdzW2ZJbnB1dC5uYW1lXTtcbiAgICAgICAgaW5wdXQub25DaGFuZ2VkKCgpID0+IHsgdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25TZXR0aW5nc1tmSW5wdXQubmFtZV0gPSBpbnB1dC52YWx1ZTsgfSk7XG4gICAgICAgIHBhcmFtc0Zvcm0uYXBwZW5kKGlucHV0LnJvb3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmFtc0Zvcm07XG4gICAgfVxuXG4gICAgcHVibGljIGdldEVkaXRvcigpOiBIVE1MRWxlbWVudCB7XG4gICAgICByZXR1cm4gdWkuZGl2KFtcbiAgICAgICAgdGhpcy50YWJsZUlucHV0LFxuICAgICAgICB0aGlzLmNvbElucHV0Um9vdCxcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25JbnB1dFJvb3QsXG4gICAgICAgIHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmNTZXR0aW5nc0RpdixcbiAgICAgICAgdGhpcy5tZXRob2RJbnB1dCxcbiAgICAgICAgdGhpcy5tZXRob2RTZXR0aW5nc0RpdixcbiAgICAgICAgdGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXRSb290LFxuICAgICAgICB0aGlzLnBsb3RFbWJlZGRpbmdzSW5wdXQsXG4gICAgICAgIHRoaXMuY2x1c3RlckVtYmVkZGluZ3NJbnB1dCxcbiAgICAgICAgdGhpcy5kYlNjYW5TZXR0aW5nc0RpdlxuICAgICAgXSwge3N0eWxlOiB7bWluV2lkdGg6ICc0MjBweCd9LCBjbGFzc2VzOiAndWktZm9ybSBkaW0tcmVkdWN0aW9uLWRpYWxvZy1mb3JtJ30pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbXMoKTogRGltUmVkdWN0aW9uUGFyYW1zIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhYmxlOiB0aGlzLnRhYmxlSW5wdXQudmFsdWUhLFxuICAgICAgICBjb2w6IHRoaXMuY29sSW5wdXQudmFsdWUhLFxuICAgICAgICBtZXRob2ROYW1lOiB0aGlzLm1ldGhvZElucHV0LnZhbHVlISxcbiAgICAgICAgcHJlcHJvY2Vzc2luZ0Z1bmN0aW9uOiB0aGlzLnN1cHBvcnRlZEZ1bmN0aW9uc1t0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvbklucHV0LnZhbHVlIV0uZnVuYyxcbiAgICAgICAgc2ltaWxhcml0eU1ldHJpYzogdGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXQudmFsdWUhLFxuICAgICAgICBwbG90RW1iZWRkaW5nczogdGhpcy5wbG90RW1iZWRkaW5nc0lucHV0LnZhbHVlISxcbiAgICAgICAgY2x1c3RlckVtYmVkZGluZ3M6IHRoaXMuY2x1c3RlckVtYmVkZGluZ3NJbnB1dC52YWx1ZSEsXG4gICAgICAgIG9wdGlvbnM6IHsuLi50aGlzLmFsZ29yaXRobU9wdGlvbnMsIC4uLnRoaXMuZGJTY2FuT3B0aW9ucyxcbiAgICAgICAgICBwcmVwcm9jZXNzaW5nRnVuY0FyZ3M6ICh0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvblNldHRpbmdzID8/IHt9KX1cbiAgICAgIH07XG4gICAgfVxufVxuIl19","export const DIM_RED_PREPROCESSING_FUNCTION_TAG = 'dim-red-preprocessing-function';\nexport const DIM_RED_POSTPROCESSING_FUNCTION_TAG = 'dim-red-postprocessing-function';\nexport const DIM_RED_DEFAULT_POSTPROCESSING_FUNCTION_META = 'defaultPostProcessingFunction';\nexport const SUPPORTED_SEMTYPES_TAG = 'supportedSemTypes';\nexport const SUPPORTED_TYPES_TAG = 'supportedTypes';\nexport const SUPPORTED_UNITS_TAG = 'supportedUnits';\nexport const SUPPORTED_DISTANCE_FUNCTIONS_TAG = 'supportedDistanceFunctions';\nexport const BYPASS_LARGE_DATA_WARNING = 'bypassLargeDataWarning';\nexport const SHOW_SCATTERPLOT_PROGRESS = 'show-scatterplot-progress';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLGdDQUFnQyxDQUFDO0FBQ25GLE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFHLGlDQUFpQyxDQUFDO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLDRDQUE0QyxHQUFHLCtCQUErQixDQUFDO0FBQzVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDO0FBQzFELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLDRCQUE0QixDQUFDO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLHdCQUF3QixDQUFDO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLDJCQUEyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IERJTV9SRURfUFJFUFJPQ0VTU0lOR19GVU5DVElPTl9UQUcgPSAnZGltLXJlZC1wcmVwcm9jZXNzaW5nLWZ1bmN0aW9uJztcbmV4cG9ydCBjb25zdCBESU1fUkVEX1BPU1RQUk9DRVNTSU5HX0ZVTkNUSU9OX1RBRyA9ICdkaW0tcmVkLXBvc3Rwcm9jZXNzaW5nLWZ1bmN0aW9uJztcbmV4cG9ydCBjb25zdCBESU1fUkVEX0RFRkFVTFRfUE9TVFBST0NFU1NJTkdfRlVOQ1RJT05fTUVUQSA9ICdkZWZhdWx0UG9zdFByb2Nlc3NpbmdGdW5jdGlvbic7XG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX1NFTVRZUEVTX1RBRyA9ICdzdXBwb3J0ZWRTZW1UeXBlcyc7XG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX1RZUEVTX1RBRyA9ICdzdXBwb3J0ZWRUeXBlcyc7XG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX1VOSVRTX1RBRyA9ICdzdXBwb3J0ZWRVbml0cyc7XG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX0RJU1RBTkNFX0ZVTkNUSU9OU19UQUcgPSAnc3VwcG9ydGVkRGlzdGFuY2VGdW5jdGlvbnMnO1xuZXhwb3J0IGNvbnN0IEJZUEFTU19MQVJHRV9EQVRBX1dBUk5JTkcgPSAnYnlwYXNzTGFyZ2VEYXRhV2FybmluZyc7XG5leHBvcnQgY29uc3QgU0hPV19TQ0FUVEVSUExPVF9QUk9HUkVTUyA9ICdzaG93LXNjYXR0ZXJwbG90LXByb2dyZXNzJztcbiJdfQ==","export var DistanceAggregationMethods;\n(function (DistanceAggregationMethods) {\n DistanceAggregationMethods[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n DistanceAggregationMethods[\"MANHATTAN\"] = \"MANHATTAN\";\n})(DistanceAggregationMethods || (DistanceAggregationMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSwwQkFHVDtBQUhILFdBQVksMEJBQTBCO0lBQ2xDLHFEQUF1QixDQUFBO0lBQ3ZCLHFEQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFIUywwQkFBMEIsS0FBMUIsMEJBQTBCLFFBR25DO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIHtcbiAgICBFVUNMSURFQU4gPSAnRVVDTElERUFOJyxcbiAgICBNQU5IQVRUQU4gPSAnTUFOSEFUVEFOJyxcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IGtleW9mIHR5cGVvZiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcztcbiJdfQ==","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs;","\n import API from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../css-loader/dist/cjs.js!./styles.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../css-loader/dist/cjs.js!./styles.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport { DimReductionMethods } from './types';\nimport { DBScanOptions } from '../functionEditors/dimensionality-reduction-editor';\nimport { DIM_RED_DEFAULT_POSTPROCESSING_FUNCTION_META, DIM_RED_POSTPROCESSING_FUNCTION_TAG, DIM_RED_PREPROCESSING_FUNCTION_TAG, SUPPORTED_DISTANCE_FUNCTIONS_TAG, SUPPORTED_SEMTYPES_TAG, SUPPORTED_TYPES_TAG, SUPPORTED_UNITS_TAG } from '../functionEditors/consts';\nimport { DistanceAggregationMethods } from '../distance-matrix/types';\nimport { Subject } from 'rxjs';\nimport '../../css/styles.css';\nimport { getGPUAdapterDescription } from '@datagrok-libraries/math/src/webGPU/getGPUDevice';\nexport class UMAPOptions {\n constructor() {\n this.learningRate = { uiName: 'Learninig rate', value: 1, tooltip: 'The initial learning rate for the embedding optimization' };\n // nComponents: IDimReductionParam =\n // {uiName: 'Components', value: 2, tooltip: 'The number of components (dimensions) to project the data to'};\n this.nEpochs = { uiName: 'Epochs', value: 0,\n tooltip: 'The number of epochs to optimize embeddings via SGD. Computed automatically if set to 0' };\n this.nNeighbors = { uiName: 'Neighbors', value: 15, tooltip: 'The number of nearest neighbors to construct the fuzzy manifold' };\n this.spread = { uiName: 'Spread', value: 1,\n tooltip: `The effective scale of embedded points, used with min distance to control \n the clumped/dispersed nature of the embedding` };\n this.minDist = { uiName: 'Min distance', value: 0.1,\n tooltip: `The effective minimum distance between embedded points, \n used with spread to control the clumped/dispersed nature of the embedding` };\n this.randomSeed = { uiName: 'Random seed', value: null, tooltip: 'Random seed', type: 'string' };\n this.useWebGPU = { uiName: 'Use WebGPU', value: false, tooltip: 'Use WebGPU for KNN computations', type: 'boolean',\n disableTooltip: 'WebGPU is not available' };\n getGPUAdapterDescription().then((desc) => {\n if (desc) {\n this.useWebGPU.tooltip += ` (${desc})`;\n }\n else {\n this.useWebGPU.value = false;\n this.useWebGPU.disable = true;\n }\n });\n }\n ;\n}\nexport class TSNEOptions {\n // dim: IDimReductionParam = {uiName: 'Dimensionality', value: 2, tooltip: 'Dimensionality of the embedding'};\n constructor() {\n this.epsilon = { uiName: 'Epsilon', value: 10, tooltip: 'Epsilon is learning rate' };\n this.perplexity = { uiName: 'Perplexity', value: 30, tooltip: 'Roughly how many neighbors each point influences' };\n }\n ;\n}\nexport class MultiColumnDimReductionEditor {\n constructor(editorSettings = {}) {\n this.editorSettings = {};\n this.columnOptEditors = [];\n this.columnOptEditorsRoot = ui.div();\n this.columnParamsEditorRoot = ui.div();\n this.weightsEditorRoot = ui.div();\n this.columnFunctionsMap = {};\n this.methodsParams = {\n [DimReductionMethods.UMAP]: new UMAPOptions(),\n [DimReductionMethods.T_SNE]: new TSNEOptions()\n };\n this.dbScanParams = new DBScanOptions();\n this.methodSettingsDivs = [];\n this.supportedFunctions = {};\n this.methodSettingsAnchor = ui.div();\n this.plotEmbeddingsInput = ui.boolInput('Plot embeddings', true);\n this.aggregationMethodInput = ui.choiceInput('Aggregation', DistanceAggregationMethods.EUCLIDEAN, [DistanceAggregationMethods.EUCLIDEAN, DistanceAggregationMethods.MANHATTAN]);\n this.aggregationMethodInput.setTooltip('Aggregation method for combining distances between columns');\n this.onColumnsChanged = new Subject();\n this.editorSettings = editorSettings;\n this.columnParamsEditorAccordion = ui.accordion();\n const preporcessingFuncs = DG.Func.find({ tags: [DIM_RED_PREPROCESSING_FUNCTION_TAG] });\n preporcessingFuncs.forEach((f) => {\n const semTypes = f.options.get(SUPPORTED_SEMTYPES_TAG) ?? '';\n const name = f.friendlyName ?? f.name;\n const types = f.options.get(SUPPORTED_TYPES_TAG) ?? '';\n const units = f.options.get(SUPPORTED_UNITS_TAG) ?? '';\n const distanceFunctions = f.options.get(SUPPORTED_DISTANCE_FUNCTIONS_TAG) ?? '';\n if (this.editorSettings.semtype && !semTypes.includes(this.editorSettings.semtype))\n return;\n if (this.editorSettings.type && !types.includes(this.editorSettings.type))\n return;\n if (this.editorSettings.units && !units.includes(this.editorSettings.units))\n return;\n this.supportedFunctions[name] = {\n func: f,\n semTypes: semTypes ? semTypes.split(',') : [],\n types: types ? types.split(',') : [],\n units: units ? units.split(',') : [],\n distanceFunctions: distanceFunctions ? distanceFunctions.split(',') : [],\n };\n });\n this.postProcessingEditor = new PostProcessingFuncEditor();\n this.tableInput = ui.tableInput('Table', grok.shell.tv.dataFrame, grok.shell.tables, () => {\n this.onTableInputChanged();\n });\n this.onTableInputChanged();\n let settingsOpened = false;\n this.methodInput = ui.choiceInput('Method', DimReductionMethods.UMAP, [DimReductionMethods.UMAP, DimReductionMethods.T_SNE], () => {\n if (settingsOpened)\n this.createAlgorithmSettingsDiv(this.methodsParams[this.methodInput.value]);\n });\n this.methodSettingsIcon = ui.icons.settings(() => {\n settingsOpened = !settingsOpened;\n if (!settingsOpened) {\n this.methodSettingsDivs.forEach((it) => it.remove());\n this.methodSettingsDivs = [];\n }\n else {\n this.createAlgorithmSettingsDiv(this.methodsParams[this.methodInput.value]);\n }\n }, 'Modify methods parameters');\n this.methodInput.root.classList.add('ml-dim-reduction-settings-input');\n this.methodInput.root.prepend(this.methodSettingsIcon);\n this.columnParamsEditorAccordion.addPane('Column options', () => this.columnOptEditorsRoot, true, null, false);\n this.columnParamsEditorAccordion.root.style.display = 'none';\n this.columnParamsEditorRoot.appendChild(this.columnParamsEditorAccordion.root);\n this.columnParamsEditorRoot.appendChild(this.weightsEditorRoot);\n }\n onTableInputChanged() {\n const table = this.tableInput.value;\n if (!table)\n return;\n ui.empty(this.columnOptEditorsRoot);\n ui.empty(this.weightsEditorRoot);\n this.columnFunctionsMap = {};\n const columns = table.columns.toList();\n columns.forEach((col) => {\n Object.keys(this.supportedFunctions).forEach((funcName) => {\n const semTypes = this.supportedFunctions[funcName].semTypes;\n const types = this.supportedFunctions[funcName].types;\n const units = this.supportedFunctions[funcName].units;\n const semTypeSupported = !semTypes.length || (col.semType && semTypes.includes(col.semType));\n const typeSuported = !types.length || types.includes(col.type);\n const unitsSupported = !units.length ||\n (col.getTag(DG.TAGS.UNITS) && units.includes(col.getTag(DG.TAGS.UNITS)));\n if (semTypeSupported && typeSuported && unitsSupported) {\n if (!this.columnFunctionsMap[col.name])\n this.columnFunctionsMap[col.name] = [];\n this.columnFunctionsMap[col.name].push(funcName);\n }\n });\n });\n const supportedColNames = Object.keys(this.columnFunctionsMap);\n const columnsInput = ui.columnsInput('Columns', table, () => {\n this.onColumnsChanged.next();\n ui.empty(this.columnOptEditorsRoot);\n ui.empty(this.weightsEditorRoot);\n const cols = columnsInput.value;\n if (!cols || cols?.length < 2)\n this.aggregationMethodInput.root.style.display = 'none';\n else\n this.aggregationMethodInput.root.style.display = 'flex';\n if (!cols || cols.length === 0) {\n this.columnParamsEditorAccordion.root.style.display = 'none';\n return;\n }\n this.columnOptEditors = cols.map((col) => {\n const editorClass = new DimReductionColumnEditor(col, this.columnFunctionsMap[col.name].map((it) => this.supportedFunctions[it]));\n return editorClass;\n });\n const editorsRoot = ui.divV([], { style: { maxHeight: '400px', overflow: 'auto' } });\n this.columnOptEditors.forEach((editor) => {\n editorsRoot.appendChild(editor.accordionDiv);\n });\n //this.columnOptEditorsRoot.appendChild(editorsRoot);\n const doubledColEditors = new Array(this.columnOptEditors.length * 2).fill(null)\n .map((_, i) => i % 2 === 0 ? this.columnOptEditors[i / 2].colOptEditors : []);\n let c = 0;\n const table = ui.table(doubledColEditors, (item) => {\n c++;\n if (item && item.length > 0)\n return item;\n const paramsEditor = (this.columnOptEditors[Math.floor((c - 1) / 2)].preprocessingFuncSettingsDiv = ui.div([]));\n return [paramsEditor, ui.div(), ui.div(), ui.div()];\n }, ['Column', 'Encoding function', 'Similarity metric', 'Weight']);\n this.columnOptEditors\n .forEach((it) => {\n it.preprocessingFuncSettingsDiv?.parentElement?.setAttribute('colspan', '4');\n it.preprocessingFuncSettingsDiv?.parentElement?.parentElement?.style?.setProperty('height', 'unset');\n });\n if (this.columnOptEditors.length > 0)\n this.columnParamsEditorAccordion.root.style.display = 'flex';\n table.classList.add('ml-dim-reduction-column-editor-table-root');\n this.columnOptEditorsRoot.appendChild(table);\n }, { available: supportedColNames });\n columnsInput.fireChanged();\n if (!this.columnsInputRoot) {\n this.columnsInputRoot = columnsInput.root;\n this.columnsInput = columnsInput;\n }\n else {\n ui.empty(this.columnsInputRoot);\n this.columnsInput = columnsInput;\n Array.from(this.columnsInput.root.children)\n .forEach((it) => this.columnsInputRoot.appendChild(it));\n }\n }\n createAlgorithmSettingsDiv(params) {\n this.methodSettingsDivs.forEach((it) => it.remove());\n this.methodSettingsDivs = [];\n const anchor = this.methodSettingsAnchor;\n const parent = anchor.parentElement;\n if (!parent)\n return;\n Object.keys(params).forEach((it) => {\n const param = params[it];\n const input = param.type === 'string' ?\n ui.stringInput(param.uiName, param.value ?? '', () => {\n param.value = input.value;\n }) : param.type === 'boolean' ?\n ui.boolInput(param.uiName, param.value ?? false, () => {\n param.value = input.value;\n }) :\n ui.floatInput(param.uiName, param.value, () => {\n param.value = input.value;\n });\n if (param.disable) {\n input.enabled = false;\n ui.tooltip.bind(input.input ?? input.root, param.disableTooltip ?? '');\n }\n else {\n ui.tooltip.bind(input.input ?? input.root, param.tooltip);\n }\n parent.insertBefore(input.root, anchor);\n this.methodSettingsDivs.push(input.root);\n });\n }\n get algorithmOptions() {\n const algorithmParams = this.methodsParams[this.methodInput.value];\n const options = {};\n Object.keys(algorithmParams).forEach((key) => {\n if (algorithmParams[key].value != null)\n options[key] = algorithmParams[key].value;\n });\n return options;\n }\n get dbScanOptions() {\n return {\n dbScanEpsilon: this.dbScanParams.epsilon.value ?? 0.01,\n dbScanMinPts: this.dbScanParams.minPts.value ?? 4\n };\n }\n getEditor() {\n const div = ui.div([\n this.tableInput.root,\n this.columnsInputRoot,\n this.columnParamsEditorRoot,\n this.aggregationMethodInput.root,\n this.methodInput.root,\n this.methodSettingsAnchor,\n this.plotEmbeddingsInput,\n this.postProcessingEditor.root,\n ], { style: { minWidth: '420px' }, classes: 'dim-reduction-dialog-form' });\n return div;\n }\n getParams() {\n return {\n table: this.tableInput.value,\n columns: this.columnsInput.value,\n methodName: this.methodInput.value,\n preprocessingFunctions: this.columnOptEditors.map((it) => it.preProcessingFunction),\n distanceMetrics: this.columnOptEditors.map((it) => it.similarityMetricInput.value),\n weights: this.columnOptEditors.map((it) => it.weight ?? 1),\n options: { ...this.algorithmOptions, ...this.dbScanOptions,\n preprocessingFuncArgs: this.columnOptEditors.map((it) => it.preprocessingFunctionSettings) },\n plotEmbeddings: this.plotEmbeddingsInput.value,\n clusterEmbeddings: false,\n postProcessingFunction: this.postProcessingEditor.postProcessingFunction,\n postProcessingFunctionArgs: this.postProcessingEditor.args,\n aggreaggregationMethod: this.aggregationMethodInput.value\n };\n }\n}\nclass DimReductionColumnEditor {\n constructor(column, supportedFunctions) {\n this.preprocessingFuncSettingsDiv = ui.div([]);\n this.preprocessingFunctionSettings = {};\n this.editorDiv = ui.div([]);\n this.hasExtraSettings = true;\n this.functionsMap = {};\n this.needsConfiguration = false;\n this.weight = 1;\n this.colOptEditors = [];\n this.weightInput = ui.floatInput('Weight', 1, () => { this.weight = this.weightInput.value ?? 1; });\n this.column = column;\n // sort by specificity\n this.supportedFunctions = supportedFunctions.sort((a, b) => {\n if ((a.units.length === 0 || b.units.length === 0) && a.units.length !== b.units.length)\n return b.units.length - a.units.length;\n if (a.units.length !== b.units.length)\n return a.units.length - b.units.length;\n if (a.semTypes.length === 0 || b.semTypes.length === 0)\n return b.semTypes.length - a.semTypes.length;\n if (a.semTypes.length !== b.semTypes.length)\n return a.semTypes.length - b.semTypes.length;\n return a.types.length - b.types.length;\n });\n this.supportedFunctions.forEach((f) => {\n this.functionsMap[getFuncName(f.func)] = f.func;\n });\n this.preprocessingFunctionInput = ui.choiceInput('Encoding function', getFuncName(this.supportedFunctions[0].func), this.supportedFunctions.map((it) => getFuncName(it.func)), () => {\n const val = this.preprocessingFunctionInput.value;\n const func = this.functionsMap[val];\n this.preprocessingFunctionSettings = {};\n this.hasExtraSettings = func.inputs.length > 2;\n const supF = this.supportedFunctions.find((it) => getFuncName(it.func) === val);\n this.getSimilarityMetricInput(supF);\n ui.empty(this.preprocessingFuncSettingsDiv);\n settingsOpened = false;\n if (!this.hasExtraSettings)\n this.preprocessingFuncSettingsIcon.style.display = 'none';\n else\n this.preprocessingFuncSettingsIcon.style.display = 'flex';\n });\n this.preprocessingFunctionInput.root.style.display = 'flex';\n this.createSettingsDiv(this.preprocessingFuncSettingsDiv, this.supportedFunctions[0].func)\n .then(() => { ui.empty(this.preprocessingFuncSettingsDiv); });\n this.getSimilarityMetricInput(this.supportedFunctions[0]);\n this.hasExtraSettings = this.supportedFunctions[0].func.inputs.length > 2;\n let settingsOpened = false;\n this.preprocessingFuncSettingsIcon = ui.icons.settings(async () => {\n settingsOpened = !settingsOpened;\n if (settingsOpened) {\n await this.createSettingsDiv(this.preprocessingFuncSettingsDiv, this.functionsMap[this.preprocessingFunctionInput.value]);\n }\n else {\n ui.empty(this.preprocessingFuncSettingsDiv);\n }\n }, 'Modify encoding function parameters');\n this.preprocessingFunctionInput.root.classList.add('ml-dim-reduction-settings-input');\n this.preprocessingFunctionInput.root.prepend(this.preprocessingFuncSettingsIcon);\n if (!this.hasExtraSettings)\n this.preprocessingFuncSettingsIcon.style.display = 'none';\n else\n this.preprocessingFuncSettingsIcon.style.display = 'flex';\n this.needsConfiguration = !(supportedFunctions.length < 2 && !this.hasExtraSettings &&\n supportedFunctions[0].distanceFunctions.length < 2);\n const columnTitle = ui.h3(this.column.name, { classes: 'ml-dim-reduction-column-editor-column-title' });\n this.colOptEditors = [\n columnTitle, this.preprocessingFunctionInput.root,\n this.similarityMetricInputRoot, this.weightInput.root\n ];\n // assign tooltips\n ui.tooltip.bind(columnTitle, this.column.name);\n // this.colOptEditors.forEach((it, i) => {\n // it.style.width = `${editorWidths[i]}%`;\n // });\n //add classes\n this.colOptEditors.forEach((it) => it.classList.add('ml-dim-reduction-column-editor-input-root'));\n const distanceOptionsDiv = ui.divH(this.colOptEditors, { classes: 'ml-dim-reduction-column-editor-root' });\n this.accordionDiv = ui.divV([]);\n this.editorDiv.appendChild(distanceOptionsDiv);\n this.editorDiv.appendChild(this.preprocessingFuncSettingsDiv);\n this.accordionDiv.appendChild(this.editorDiv);\n }\n getSimilarityMetricInput(preFunc) {\n const input = ui.choiceInput('Similarity metric', preFunc.distanceFunctions[0], preFunc.distanceFunctions);\n if (!this.similarityMetricInputRoot) {\n this.similarityMetricInputRoot = input.root;\n this.similarityMetricInput = input;\n }\n else {\n ui.empty(this.similarityMetricInputRoot);\n this.similarityMetricInput = input;\n Array.from(this.similarityMetricInput.root.children)\n .forEach((it) => this.similarityMetricInputRoot.appendChild(it));\n }\n }\n get preProcessingFunction() {\n return this.functionsMap[this.preprocessingFunctionInput.value];\n }\n async createSettingsDiv(paramsForm, func) {\n ui.empty(paramsForm);\n if (func.inputs.length < 3)\n return ui.div();\n const fc = func.prepare();\n const inputs = await fc.buildEditor(ui.div());\n for (let i = 2; i < func.inputs.length; i++) {\n const fInput = func.inputs[i];\n const val = this.preprocessingFunctionSettings[fInput.name] ||\n fc.inputParams[func.inputs[i].name].value || fInput.defaultValue;\n if (val)\n this.preprocessingFunctionSettings[fInput.name] = val;\n const input = inputs.find((inp) => inp.property.name === fInput.name);\n if (!input)\n continue;\n if (this.preprocessingFunctionSettings[fInput.name] !== null &&\n this.preprocessingFunctionSettings[fInput.name] !== undefined)\n input.value = this.preprocessingFunctionSettings[fInput.name];\n input.onChanged(() => { this.preprocessingFunctionSettings[fInput.name] = input.value; });\n paramsForm.append(input.root);\n }\n paramsForm.style.marginBottom = '10px';\n return paramsForm;\n }\n}\nfunction getFuncName(func) {\n return func.friendlyName ?? func.name;\n}\nclass PostProcessingFuncEditor {\n constructor() {\n this.postProcessingFunctionsMap = {};\n this._root = ui.div([]);\n this._postProcessingArgs = {};\n this._argsElement = ui.div([]);\n this._settingsOpened = false;\n this._settingsIcon = ui.icons.settings(async () => {\n this._settingsOpened = !this._settingsOpened;\n if (this._settingsOpened)\n this._argsElement.style.display = 'block';\n else\n this._argsElement.style.display = 'none';\n });\n this._argsElement.style.display = 'none';\n const postProcessingFuncs = DG.Func.find({ tags: [DIM_RED_POSTPROCESSING_FUNCTION_TAG] })\n .filter((f) => f.inputs.length >= 2);\n postProcessingFuncs.forEach((f) => {\n const name = f.friendlyName ?? f.name;\n this.postProcessingFunctionsMap[name] = f;\n });\n this.postProcessingFunctionsMap['None'] = null;\n const defaultPostProcessingFunc = Object.keys(this.postProcessingFunctionsMap).find((it) => !!this.postProcessingFunctionsMap[it]?.options?.[DIM_RED_DEFAULT_POSTPROCESSING_FUNCTION_META]) ?? 'None';\n this.postProcessingFunctionInput =\n ui.choiceInput('Postprocessing', defaultPostProcessingFunc, Object.keys(this.postProcessingFunctionsMap), async () => { await this.onFunctionChanged(); }, { nullable: false });\n this.onFunctionChanged();\n this.postProcessingFunctionInput.nullable = false;\n this.postProcessingFunctionInput.classList.add('ml-dim-reduction-settings-input');\n this.postProcessingFunctionInput.root.prepend(this._settingsIcon);\n this._root.appendChild(this.postProcessingFunctionInput.root);\n this._root.appendChild(this._argsElement);\n }\n get postProcessingFunction() {\n return this.postProcessingFunctionInput.value ?\n this.postProcessingFunctionsMap[this.postProcessingFunctionInput.value] : null;\n }\n async onFunctionChanged() {\n const func = this.postProcessingFunction;\n ui.empty(this._argsElement);\n this._postProcessingArgs = {};\n if (!func || func.inputs.length < 3) {\n this._settingsIcon.style.display = 'none';\n return;\n }\n ;\n this._settingsIcon.style.display = 'flex';\n const fc = func.prepare();\n const inputs = await fc.buildEditor(ui.div());\n for (let i = 2; i < func.inputs.length; i++) {\n const fInput = func.inputs[i];\n const val = this._postProcessingArgs[fInput.name] ||\n fc.inputParams[func.inputs[i].name].value || fInput.defaultValue;\n if (val)\n this._postProcessingArgs[fInput.name] = val;\n const input = inputs.find((inp) => inp.property.name === fInput.name);\n if (!input)\n continue;\n input.onChanged(() => { this._postProcessingArgs[fInput.name] = input.value; });\n this._argsElement.append(input.root);\n }\n }\n get root() {\n return this._root;\n }\n get args() {\n return this._postProcessingArgs;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktY29sdW1uLWRpbS1yZWR1Y3Rpb24tZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXVsdGktY29sdW1uLWRpbS1yZWR1Y3Rpb24tZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM1QyxPQUFPLEVBQTRCLGFBQWEsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBRzVHLE9BQU8sRUFBQyw0Q0FBNEMsRUFBRSxtQ0FBbUMsRUFDdkYsa0NBQWtDLEVBQUUsZ0NBQWdDLEVBQ3BFLHNCQUFzQixFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDckcsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFcEUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBRTFGLE1BQU0sT0FBTyxXQUFXO0lBdUJ0QjtRQXRCQSxpQkFBWSxHQUNaLEVBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLDBEQUEwRCxFQUFDLENBQUM7UUFDMUcsb0NBQW9DO1FBQ3BDLDZHQUE2RztRQUM3RyxZQUFPLEdBQ0wsRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSx5RkFBeUYsRUFBQyxDQUFDO1FBQ3hHLGVBQVUsR0FDVixFQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsaUVBQWlFLEVBQUMsQ0FBQztRQUM3RyxXQUFNLEdBQ04sRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE9BQU8sRUFDUDtrREFDOEMsRUFBQyxDQUFDO1FBQ2xELFlBQU8sR0FDUCxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLEdBQUc7WUFDakMsT0FBTyxFQUFFOzRFQUMrRCxFQUFDLENBQUM7UUFDNUUsZUFBVSxHQUErQixFQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQztRQUN0SCxjQUFTLEdBQ1AsRUFBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLElBQUksRUFBRSxTQUFTO1lBQzlGLGNBQWMsRUFBRSx5QkFBeUIsRUFBQyxDQUFDO1FBRTdDLHdCQUF3QixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdkMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDO1lBQ3pDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUEsQ0FBQztDQUNIO0FBRUQsTUFBTSxPQUFPLFdBQVc7SUFLdEIsOEdBQThHO0lBRTlHO1FBTkEsWUFBTyxHQUNQLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSwwQkFBMEIsRUFBQyxDQUFDO1FBQ3BFLGVBQVUsR0FDVixFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsa0RBQWtELEVBQUMsQ0FBQztJQUdoRixDQUFDO0lBQUEsQ0FBQztDQUNsQjtBQXNCRCxNQUFNLE9BQU8sNkJBQTZCO0lBMkJ0QyxZQUFZLGlCQUE0QyxFQUFFO1FBMUIxRCxtQkFBYyxHQUE4QixFQUFFLENBQUM7UUFJL0MscUJBQWdCLEdBQStCLEVBQUUsQ0FBQztRQUNsRCx5QkFBb0IsR0FBZ0IsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdDLDJCQUFzQixHQUFnQixFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFL0Msc0JBQWlCLEdBQWdCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQyx1QkFBa0IsR0FBOEIsRUFBRSxDQUFDO1FBQ25ELGtCQUFhLEdBQStDO1lBQzFELENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxXQUFXLEVBQUU7WUFDN0MsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLFdBQVcsRUFBRTtTQUMvQyxDQUFDO1FBQ0YsaUJBQVksR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ25DLHVCQUFrQixHQUFrQixFQUFFLENBQUM7UUFDdkMsdUJBQWtCLEdBQStDLEVBQUUsQ0FBQztRQUdwRSx5QkFBb0IsR0FBZ0IsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdDLHdCQUFtQixHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFNUQsMkJBQXNCLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsMEJBQTBCLENBQUMsU0FBUyxFQUN6RixDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSwwQkFBMEIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBSTlFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUNyRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUN0RixrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMvQixNQUFNLFFBQVEsR0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyRSxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDdEMsTUFBTSxLQUFLLEdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0QsTUFBTSxLQUFLLEdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0QsTUFBTSxpQkFBaUIsR0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4RixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztnQkFDaEYsT0FBTztZQUNULElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO2dCQUN2RSxPQUFPO1lBQ1QsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7Z0JBQ3pFLE9BQU87WUFFVCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUc7Z0JBQzlCLElBQUksRUFBRSxDQUFDO2dCQUNQLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzdDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7YUFDekUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksd0JBQXdCLEVBQUUsQ0FBQztRQUUzRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDeEYsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFFM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQ2xFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRTtZQUMxRCxJQUFJLGNBQWM7Z0JBQ2hCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBTSxDQUFDLENBQUMsQ0FBQztRQUNqRixDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFFLEVBQUU7WUFDOUMsY0FBYyxHQUFHLENBQUMsY0FBYyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7WUFDL0IsQ0FBQztpQkFBTSxDQUFDO2dCQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBTSxDQUFDLENBQUMsQ0FBQztZQUFDLENBQUM7UUFDMUYsQ0FBQyxFQUFFLDJCQUEyQixDQUFDLENBQUM7UUFFaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9HLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDN0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLO1lBQ1IsT0FBTztRQUNULEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDcEMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQzdCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ3hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQzVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQ3RELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQ3RELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUM3RixNQUFNLFlBQVksR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9ELE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07b0JBQ2xDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxnQkFBZ0IsSUFBSSxZQUFZLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQzt3QkFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMvRCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQzFELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QixFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3BDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDakMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUNoQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxNQUFNLEdBQUcsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQzs7Z0JBRXhELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDMUQsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUM3RCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3ZDLE1BQU0sV0FBVyxHQUFHLElBQUksd0JBQXdCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDakcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxXQUFXLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBQyxFQUFDLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ3ZDLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQy9DLENBQUMsQ0FBQyxDQUFDO1lBQ0gscURBQXFEO1lBQ3JELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxLQUFLLENBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2lCQUNsRixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDakQsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUN6QixPQUFPLElBQUksQ0FBQztnQkFDZCxNQUFNLFlBQVksR0FDaEIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0YsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyxnQkFBZ0I7aUJBQ2xCLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUNkLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDN0UsRUFBRSxDQUFDLDRCQUE0QixFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdkcsQ0FBQyxDQUFDLENBQUM7WUFDTCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUMvRCxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxFQUFFLEVBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFDLENBQUMsQ0FBQztRQUNuQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ25DLENBQUM7YUFBTSxDQUFDO1lBQ04sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztZQUNqQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztpQkFDeEMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQztJQUNILENBQUM7SUFDTywwQkFBMEIsQ0FDaEMsTUFBaUQ7UUFDakQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQXNDLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU07WUFDVCxPQUFPO1FBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRTtZQUN0QyxNQUFNLEtBQUssR0FDUixNQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFdEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQztnQkFDckMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRTtvQkFDbkQsS0FBSyxDQUFDLEtBQUssR0FBSSxLQUE4QixDQUFDLEtBQUssQ0FBQztnQkFDdEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUM7Z0JBQzdCLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUU7b0JBQ3BELEtBQUssQ0FBQyxLQUFLLEdBQUksS0FBK0IsQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0osRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFZLEVBQUUsR0FBRyxFQUFFO29CQUNuRCxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQzVCLENBQUMsQ0FBQyxDQUFDO1lBQ1AsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN6RSxDQUFDO2lCQUFNLENBQUM7Z0JBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUFDLENBQUM7WUFDckUsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLE1BQU0sZUFBZSxHQUE4QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBTSxDQUFDLENBQUM7UUFDL0YsTUFBTSxPQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFDbkQsSUFBSyxlQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJO2dCQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUksZUFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTztZQUNMLGFBQWEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSTtZQUN0RCxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUM7U0FDbEQsQ0FBQztJQUNKLENBQUM7SUFFTSxTQUFTO1FBQ2QsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7WUFDcEIsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixJQUFJLENBQUMsc0JBQXNCO1lBQzNCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJO1lBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTtZQUNyQixJQUFJLENBQUMsb0JBQW9CO1lBQ3pCLElBQUksQ0FBQyxtQkFBbUI7WUFDeEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUk7U0FDL0IsRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUMsRUFBRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLFNBQVM7UUFDZCxPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBTTtZQUM3QixPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFNO1lBQ2pDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQU07WUFDbkMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDO1lBQ25GLGVBQWUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsS0FBTSxDQUFDO1lBQ25GLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUMxRCxPQUFPLEVBQUUsRUFBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhO2dCQUN2RCxxQkFBcUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsNkJBQTZCLENBQUMsRUFBQztZQUM3RixjQUFjLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUs7WUFDOUMsaUJBQWlCLEVBQUUsS0FBSztZQUN4QixzQkFBc0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCO1lBQ3hFLDBCQUEwQixFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJO1lBQzFELHNCQUFzQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLO1NBQzFELENBQUM7SUFDSixDQUFDO0NBQ0o7QUFHRCxNQUFNLHdCQUF3QjtJQWlCMUIsWUFBWSxNQUFpQixFQUFFLGtCQUE4QztRQWhCN0UsaUNBQTRCLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUsxQyxrQ0FBNkIsR0FBWSxFQUFFLENBQUM7UUFJNUMsY0FBUyxHQUFnQixFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLHFCQUFnQixHQUFZLElBQUksQ0FBQztRQUNqQyxpQkFBWSxHQUEyQixFQUFFLENBQUM7UUFDMUMsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBRXBDLFdBQU0sR0FBVyxDQUFDLENBQUM7UUFDbkIsa0JBQWEsR0FBa0IsRUFBRSxDQUFDO1FBRWhDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQ3JGLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDekMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQ25DLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDekMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDcEQsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMvQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTTtnQkFDekMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMvQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFDbEUsV0FBVyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ3ZHLEdBQUcsRUFBRTtZQUNILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFNLENBQUM7WUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUUsQ0FBQztZQUNqRixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM1QyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO2dCQUN4QixJQUFJLENBQUMsNkJBQTZCLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7O2dCQUUxRCxJQUFJLENBQUMsNkJBQTZCLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDOUQsQ0FBQyxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRTVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUN2RixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUUxRSxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2hFLGNBQWMsR0FBRyxDQUFDLGNBQWMsQ0FBQztZQUNqQyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQzVELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQU0sQ0FBQyxDQUFDLENBQUM7WUFDL0QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUMsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1FBRTFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBRWpGLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3hCLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQzs7WUFFMUQsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRTVELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFDbkYsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXBELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBQyxPQUFPLEVBQUUsNkNBQTZDLEVBQUMsQ0FBQyxDQUFDO1FBQ3RHLElBQUksQ0FBQyxhQUFhLEdBQUc7WUFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJO1lBQ2pELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7U0FDdEQsQ0FBQztRQUNGLGtCQUFrQjtRQUNsQixFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQywwQ0FBMEM7UUFDMUMsNENBQTRDO1FBQzVDLE1BQU07UUFFTixhQUFhO1FBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUMsQ0FBQztRQUVsRyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ2hDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBQyxPQUFPLEVBQUUscUNBQXFDLEVBQUMsQ0FDckUsQ0FBQztRQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsT0FBaUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0csSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQzVDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDckMsQ0FBQzthQUFNLENBQUM7WUFDTixFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7WUFDbkMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztpQkFDakQsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckUsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLHFCQUFxQjtRQUN2QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQU0sQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBdUIsRUFBRSxJQUFhO1FBQzVELEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDdkQsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDO1lBQ3JFLElBQUksR0FBRztnQkFDTCxJQUFJLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLEtBQUs7Z0JBQ1IsU0FBUztZQUNYLElBQUksSUFBSSxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJO2dCQUN4RCxJQUFJLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVM7Z0JBQy9ELEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRSxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFGLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxVQUFVLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7UUFDdkMsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztDQUNKO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBYTtJQUNoQyxPQUFPLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSx3QkFBd0I7SUFRNUI7UUFQQSwrQkFBMEIsR0FBb0MsRUFBRSxDQUFDO1FBRXpELFVBQUssR0FBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyx3QkFBbUIsR0FBWSxFQUFFLENBQUM7UUFDbEMsaUJBQVksR0FBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV2QyxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUV2QyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2hELElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzdDLElBQUksSUFBSSxDQUFDLGVBQWU7Z0JBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7O2dCQUUxQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUV6QyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLENBQUMsbUNBQW1DLENBQUMsRUFBQyxDQUFDO2FBQ3BGLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3RDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRS9DLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUN6RixDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLDRDQUE0QyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7UUFDNUcsSUFBSSxDQUFDLDJCQUEyQjtZQUM5QixFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLHlCQUF5QixFQUN4RCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDN0YsRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsMkJBQTJCLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUNsRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbkYsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUI7UUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQ3pDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1lBQzFDLE9BQU87UUFDVCxDQUFDO1FBQUEsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUMvQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFDbkUsSUFBSSxHQUFHO2dCQUNMLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzlDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsS0FBSztnQkFDUixTQUFTO1lBQ1gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQge0RpbVJlZHVjdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtEaW1SZWR1Y3Rpb25FZGl0b3JPcHRpb25zLCBEQlNjYW5PcHRpb25zfSBmcm9tICcuLi9mdW5jdGlvbkVkaXRvcnMvZGltZW5zaW9uYWxpdHktcmVkdWN0aW9uLWVkaXRvcic7XG5pbXBvcnQge0lEQlNjYW5PcHRpb25zfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL21hdGgnO1xuaW1wb3J0IHtPcHRpb25zfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge0RJTV9SRURfREVGQVVMVF9QT1NUUFJPQ0VTU0lOR19GVU5DVElPTl9NRVRBLCBESU1fUkVEX1BPU1RQUk9DRVNTSU5HX0ZVTkNUSU9OX1RBRyxcbiAgRElNX1JFRF9QUkVQUk9DRVNTSU5HX0ZVTkNUSU9OX1RBRywgU1VQUE9SVEVEX0RJU1RBTkNFX0ZVTkNUSU9OU19UQUcsXG4gIFNVUFBPUlRFRF9TRU1UWVBFU19UQUcsIFNVUFBPUlRFRF9UWVBFU19UQUcsIFNVUFBPUlRFRF9VTklUU19UQUd9IGZyb20gJy4uL2Z1bmN0aW9uRWRpdG9ycy9jb25zdHMnO1xuaW1wb3J0IHtEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kc30gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4L3R5cGVzJztcbmltcG9ydCB7SURpbVJlZHVjdGlvblBhcmFtLCBJVFNORU9wdGlvbnMsIElVTUFQT3B0aW9uc30gZnJvbSAnLi9tdWx0aS1jb2x1bW4tZGltLXJlZHVjZXInO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCAnLi4vLi4vY3NzL3N0eWxlcy5jc3MnO1xuaW1wb3J0IHtnZXRHUFVBZGFwdGVyRGVzY3JpcHRpb259IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL2dldEdQVURldmljZSc7XG5cbmV4cG9ydCBjbGFzcyBVTUFQT3B0aW9ucyB7XG4gIGxlYXJuaW5nUmF0ZTogSURpbVJlZHVjdGlvblBhcmFtID1cbiAge3VpTmFtZTogJ0xlYXJuaW5pZyByYXRlJywgdmFsdWU6IDEsIHRvb2x0aXA6ICdUaGUgaW5pdGlhbCBsZWFybmluZyByYXRlIGZvciB0aGUgZW1iZWRkaW5nIG9wdGltaXphdGlvbid9O1xuICAvLyBuQ29tcG9uZW50czogSURpbVJlZHVjdGlvblBhcmFtID1cbiAgLy8ge3VpTmFtZTogJ0NvbXBvbmVudHMnLCB2YWx1ZTogMiwgdG9vbHRpcDogJ1RoZSBudW1iZXIgb2YgY29tcG9uZW50cyAoZGltZW5zaW9ucykgdG8gcHJvamVjdCB0aGUgZGF0YSB0byd9O1xuICBuRXBvY2hzOiBJRGltUmVkdWN0aW9uUGFyYW0gPVxuICAgIHt1aU5hbWU6ICdFcG9jaHMnLCB2YWx1ZTogMCxcbiAgICAgIHRvb2x0aXA6ICdUaGUgbnVtYmVyIG9mIGVwb2NocyB0byBvcHRpbWl6ZSBlbWJlZGRpbmdzIHZpYSBTR0QuIENvbXB1dGVkIGF1dG9tYXRpY2FsbHkgaWYgc2V0IHRvIDAnfTtcbiAgbk5laWdoYm9yczogSURpbVJlZHVjdGlvblBhcmFtID1cbiAge3VpTmFtZTogJ05laWdoYm9ycycsIHZhbHVlOiAxNSwgdG9vbHRpcDogJ1RoZSBudW1iZXIgb2YgbmVhcmVzdCBuZWlnaGJvcnMgdG8gY29uc3RydWN0IHRoZSBmdXp6eSBtYW5pZm9sZCd9O1xuICBzcHJlYWQ6IElEaW1SZWR1Y3Rpb25QYXJhbSA9XG4gIHt1aU5hbWU6ICdTcHJlYWQnLCB2YWx1ZTogMSxcbiAgICB0b29sdGlwOlxuICAgIGBUaGUgZWZmZWN0aXZlIHNjYWxlIG9mIGVtYmVkZGVkIHBvaW50cywgdXNlZCB3aXRoIG1pbiBkaXN0YW5jZSB0byBjb250cm9sIFxuICAgIHRoZSBjbHVtcGVkL2Rpc3BlcnNlZCBuYXR1cmUgb2YgdGhlIGVtYmVkZGluZ2B9O1xuICBtaW5EaXN0OiBJRGltUmVkdWN0aW9uUGFyYW0gPVxuICB7dWlOYW1lOiAnTWluIGRpc3RhbmNlJywgdmFsdWU6IDAuMSxcbiAgICB0b29sdGlwOiBgVGhlIGVmZmVjdGl2ZSBtaW5pbXVtIGRpc3RhbmNlIGJldHdlZW4gZW1iZWRkZWQgcG9pbnRzLCBcbiAgdXNlZCB3aXRoIHNwcmVhZCB0byBjb250cm9sIHRoZSBjbHVtcGVkL2Rpc3BlcnNlZCBuYXR1cmUgb2YgdGhlIGVtYmVkZGluZ2B9O1xuICByYW5kb21TZWVkOiBJRGltUmVkdWN0aW9uUGFyYW08c3RyaW5nPiA9IHt1aU5hbWU6ICdSYW5kb20gc2VlZCcsIHZhbHVlOiBudWxsLCB0b29sdGlwOiAnUmFuZG9tIHNlZWQnLCB0eXBlOiAnc3RyaW5nJ307XG4gIHVzZVdlYkdQVTogSURpbVJlZHVjdGlvblBhcmFtPGJvb2xlYW4+ID1cbiAgICB7dWlOYW1lOiAnVXNlIFdlYkdQVScsIHZhbHVlOiBmYWxzZSwgdG9vbHRpcDogJ1VzZSBXZWJHUFUgZm9yIEtOTiBjb21wdXRhdGlvbnMnLCB0eXBlOiAnYm9vbGVhbicsXG4gICAgICBkaXNhYmxlVG9vbHRpcDogJ1dlYkdQVSBpcyBub3QgYXZhaWxhYmxlJ307XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGdldEdQVUFkYXB0ZXJEZXNjcmlwdGlvbigpLnRoZW4oKGRlc2MpID0+IHtcbiAgICAgIGlmIChkZXNjKSB7XG4gICAgICAgIHRoaXMudXNlV2ViR1BVLnRvb2x0aXAgKz0gYCAoJHtkZXNjfSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51c2VXZWJHUFUudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51c2VXZWJHUFUuZGlzYWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUU05FT3B0aW9ucyB7XG4gIGVwc2lsb246IElEaW1SZWR1Y3Rpb25QYXJhbSA9XG4gIHt1aU5hbWU6ICdFcHNpbG9uJywgdmFsdWU6IDEwLCB0b29sdGlwOiAnRXBzaWxvbiBpcyBsZWFybmluZyByYXRlJ307XG4gIHBlcnBsZXhpdHk6IElEaW1SZWR1Y3Rpb25QYXJhbSA9XG4gIHt1aU5hbWU6ICdQZXJwbGV4aXR5JywgdmFsdWU6IDMwLCB0b29sdGlwOiAnUm91Z2hseSBob3cgbWFueSBuZWlnaGJvcnMgZWFjaCBwb2ludCBpbmZsdWVuY2VzJ307XG4gIC8vIGRpbTogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ0RpbWVuc2lvbmFsaXR5JywgdmFsdWU6IDIsIHRvb2x0aXA6ICdEaW1lbnNpb25hbGl0eSBvZiB0aGUgZW1iZWRkaW5nJ307XG5cbiAgY29uc3RydWN0b3IoKSB7fTtcbn1cblxuZXhwb3J0IHR5cGUgRGltUmVkU3VwcG9ydGVkRnVuY3Rpb25zID0ge1xuICAgIGZ1bmM6IERHLkZ1bmMsXG4gICAgc2VtVHlwZXM6IHN0cmluZ1tdLFxuICAgIHR5cGVzOiBzdHJpbmdbXSxcbiAgICB1bml0czogc3RyaW5nW10sXG4gICAgZGlzdGFuY2VGdW5jdGlvbnM6IHN0cmluZ1tdXG59XG5cbmV4cG9ydCB0eXBlIE11bHRpQ29sRGltUmVkdWN0aW9uUGFyYW1zID0ge1xuICAgIHRhYmxlOiBERy5EYXRhRnJhbWUsXG4gICAgY29sdW1uczogREcuQ29sdW1uTGlzdCxcbiAgICBtZXRob2ROYW1lOiBEaW1SZWR1Y3Rpb25NZXRob2RzLFxuICAgIHByZXByb2Nlc3NpbmdGdW5jdGlvbnM6IERHLkZ1bmNbXSxcbiAgICBkaXN0YW5jZU1ldHJpY3M6IHN0cmluZ1tdLFxuICAgIHdlaWdodHM6IG51bWJlcltdLFxuICAgIG9wdGlvbnM6IChJVU1BUE9wdGlvbnMgfCBJVFNORU9wdGlvbnMpICYgUGFydGlhbDxJREJTY2FuT3B0aW9ucz4gJiB7cHJlcHJvY2Vzc2luZ0Z1bmNBcmdzOiBPcHRpb25zW119ICYgT3B0aW9ucyxcbiAgICBwbG90RW1iZWRkaW5ncz86IGJvb2xlYW4sXG4gICAgY2x1c3RlckVtYmVkZGluZ3M/OiBib29sZWFuLFxufVxuXG5leHBvcnQgY2xhc3MgTXVsdGlDb2x1bW5EaW1SZWR1Y3Rpb25FZGl0b3Ige1xuICAgIGVkaXRvclNldHRpbmdzOiBEaW1SZWR1Y3Rpb25FZGl0b3JPcHRpb25zID0ge307XG4gICAgdGFibGVJbnB1dCE6IERHLklucHV0QmFzZTxERy5EYXRhRnJhbWUgfCBudWxsPjtcbiAgICBjb2x1bW5zSW5wdXQhOiBERy5JbnB1dEJhc2U8REcuQ29sdW1uW10+O1xuICAgIGNvbHVtbnNJbnB1dFJvb3QhOiBIVE1MRWxlbWVudDtcbiAgICBjb2x1bW5PcHRFZGl0b3JzOiBEaW1SZWR1Y3Rpb25Db2x1bW5FZGl0b3JbXSA9IFtdO1xuICAgIGNvbHVtbk9wdEVkaXRvcnNSb290OiBIVE1MRWxlbWVudCA9IHVpLmRpdigpO1xuICAgIGNvbHVtblBhcmFtc0VkaXRvclJvb3Q6IEhUTUxFbGVtZW50ID0gdWkuZGl2KCk7XG4gICAgY29sdW1uUGFyYW1zRWRpdG9yQWNjb3JkaW9uOiBERy5BY2NvcmRpb247XG4gICAgd2VpZ2h0c0VkaXRvclJvb3Q6IEhUTUxFbGVtZW50ID0gdWkuZGl2KCk7XG4gICAgY29sdW1uRnVuY3Rpb25zTWFwOiB7W2tleTogc3RyaW5nXTogc3RyaW5nW119ID0ge307XG4gICAgbWV0aG9kc1BhcmFtczoge1trZXk6IHN0cmluZ106IFVNQVBPcHRpb25zIHwgVFNORU9wdGlvbnN9ID0ge1xuICAgICAgW0RpbVJlZHVjdGlvbk1ldGhvZHMuVU1BUF06IG5ldyBVTUFQT3B0aW9ucygpLFxuICAgICAgW0RpbVJlZHVjdGlvbk1ldGhvZHMuVF9TTkVdOiBuZXcgVFNORU9wdGlvbnMoKVxuICAgIH07XG4gICAgZGJTY2FuUGFyYW1zID0gbmV3IERCU2Nhbk9wdGlvbnMoKTtcbiAgICBtZXRob2RTZXR0aW5nc0RpdnM6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBzdXBwb3J0ZWRGdW5jdGlvbnM6IHtbbmFtZTogc3RyaW5nXTogRGltUmVkU3VwcG9ydGVkRnVuY3Rpb25zfSA9IHt9O1xuICAgIG1ldGhvZElucHV0OiBERy5JbnB1dEJhc2U8c3RyaW5nIHwgbnVsbD47XG4gICAgbWV0aG9kU2V0dGluZ3NJY29uOiBIVE1MRWxlbWVudDtcbiAgICBtZXRob2RTZXR0aW5nc0FuY2hvcjogSFRNTEVsZW1lbnQgPSB1aS5kaXYoKTtcbiAgICBwbG90RW1iZWRkaW5nc0lucHV0ID0gdWkuYm9vbElucHV0KCdQbG90IGVtYmVkZGluZ3MnLCB0cnVlKTtcbiAgICBwb3N0UHJvY2Vzc2luZ0VkaXRvcjogUG9zdFByb2Nlc3NpbmdGdW5jRWRpdG9yO1xuICAgIGFnZ3JlZ2F0aW9uTWV0aG9kSW5wdXQgPSB1aS5jaG9pY2VJbnB1dCgnQWdncmVnYXRpb24nLCBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU4sXG4gICAgICBbRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuRVVDTElERUFOLCBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5NQU5IQVRUQU5dKTtcblxuICAgIG9uQ29sdW1uc0NoYW5nZWQ6IFN1YmplY3Q8dm9pZD47XG4gICAgY29uc3RydWN0b3IoZWRpdG9yU2V0dGluZ3M6IERpbVJlZHVjdGlvbkVkaXRvck9wdGlvbnMgPSB7fSkge1xuICAgICAgdGhpcy5hZ2dyZWdhdGlvbk1ldGhvZElucHV0LnNldFRvb2x0aXAoJ0FnZ3JlZ2F0aW9uIG1ldGhvZCBmb3IgY29tYmluaW5nIGRpc3RhbmNlcyBiZXR3ZWVuIGNvbHVtbnMnKTtcbiAgICAgIHRoaXMub25Db2x1bW5zQ2hhbmdlZCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICB0aGlzLmVkaXRvclNldHRpbmdzID0gZWRpdG9yU2V0dGluZ3M7XG4gICAgICB0aGlzLmNvbHVtblBhcmFtc0VkaXRvckFjY29yZGlvbiA9IHVpLmFjY29yZGlvbigpO1xuICAgICAgY29uc3QgcHJlcG9yY2Vzc2luZ0Z1bmNzID0gREcuRnVuYy5maW5kKHt0YWdzOiBbRElNX1JFRF9QUkVQUk9DRVNTSU5HX0ZVTkNUSU9OX1RBR119KTtcbiAgICAgIHByZXBvcmNlc3NpbmdGdW5jcy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbVR5cGVzOiBzdHJpbmcgPSBmLm9wdGlvbnMuZ2V0KFNVUFBPUlRFRF9TRU1UWVBFU19UQUcpID8/ICcnO1xuICAgICAgICBjb25zdCBuYW1lID0gZi5mcmllbmRseU5hbWUgPz8gZi5uYW1lO1xuICAgICAgICBjb25zdCB0eXBlczogc3RyaW5nID0gZi5vcHRpb25zLmdldChTVVBQT1JURURfVFlQRVNfVEFHKSA/PyAnJztcbiAgICAgICAgY29uc3QgdW5pdHM6IHN0cmluZyA9IGYub3B0aW9ucy5nZXQoU1VQUE9SVEVEX1VOSVRTX1RBRykgPz8gJyc7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnVuY3Rpb25zOiBzdHJpbmcgPSBmLm9wdGlvbnMuZ2V0KFNVUFBPUlRFRF9ESVNUQU5DRV9GVU5DVElPTlNfVEFHKSA/PyAnJztcbiAgICAgICAgaWYgKHRoaXMuZWRpdG9yU2V0dGluZ3Muc2VtdHlwZSAmJiAhc2VtVHlwZXMuaW5jbHVkZXModGhpcy5lZGl0b3JTZXR0aW5ncy5zZW10eXBlKSlcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmVkaXRvclNldHRpbmdzLnR5cGUgJiYgIXR5cGVzLmluY2x1ZGVzKHRoaXMuZWRpdG9yU2V0dGluZ3MudHlwZSkpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5lZGl0b3JTZXR0aW5ncy51bml0cyAmJiAhdW5pdHMuaW5jbHVkZXModGhpcy5lZGl0b3JTZXR0aW5ncy51bml0cykpXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuc3VwcG9ydGVkRnVuY3Rpb25zW25hbWVdID0ge1xuICAgICAgICAgIGZ1bmM6IGYsXG4gICAgICAgICAgc2VtVHlwZXM6IHNlbVR5cGVzID8gc2VtVHlwZXMuc3BsaXQoJywnKSA6IFtdLFxuICAgICAgICAgIHR5cGVzOiB0eXBlcyA/IHR5cGVzLnNwbGl0KCcsJykgOiBbXSxcbiAgICAgICAgICB1bml0czogdW5pdHMgPyB1bml0cy5zcGxpdCgnLCcpIDogW10sXG4gICAgICAgICAgZGlzdGFuY2VGdW5jdGlvbnM6IGRpc3RhbmNlRnVuY3Rpb25zID8gZGlzdGFuY2VGdW5jdGlvbnMuc3BsaXQoJywnKSA6IFtdLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucG9zdFByb2Nlc3NpbmdFZGl0b3IgPSBuZXcgUG9zdFByb2Nlc3NpbmdGdW5jRWRpdG9yKCk7XG5cbiAgICAgIHRoaXMudGFibGVJbnB1dCA9IHVpLnRhYmxlSW5wdXQoJ1RhYmxlJywgZ3Jvay5zaGVsbC50di5kYXRhRnJhbWUsIGdyb2suc2hlbGwudGFibGVzLCAoKSA9PiB7XG4gICAgICAgIHRoaXMub25UYWJsZUlucHV0Q2hhbmdlZCgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm9uVGFibGVJbnB1dENoYW5nZWQoKTtcbiAgICAgIGxldCBzZXR0aW5nc09wZW5lZCA9IGZhbHNlO1xuXG4gICAgICB0aGlzLm1ldGhvZElucHV0ID0gdWkuY2hvaWNlSW5wdXQoJ01ldGhvZCcsIERpbVJlZHVjdGlvbk1ldGhvZHMuVU1BUCxcbiAgICAgICAgW0RpbVJlZHVjdGlvbk1ldGhvZHMuVU1BUCwgRGltUmVkdWN0aW9uTWV0aG9kcy5UX1NORV0sICgpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGluZ3NPcGVuZWQpXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFsZ29yaXRobVNldHRpbmdzRGl2KHRoaXMubWV0aG9kc1BhcmFtc1t0aGlzLm1ldGhvZElucHV0LnZhbHVlIV0pO1xuICAgICAgICB9KTtcbiAgICAgIHRoaXMubWV0aG9kU2V0dGluZ3NJY29uID0gdWkuaWNvbnMuc2V0dGluZ3MoKCk9PiB7XG4gICAgICAgIHNldHRpbmdzT3BlbmVkID0gIXNldHRpbmdzT3BlbmVkO1xuICAgICAgICBpZiAoIXNldHRpbmdzT3BlbmVkKSB7XG4gICAgICAgICAgdGhpcy5tZXRob2RTZXR0aW5nc0RpdnMuZm9yRWFjaCgoaXQpID0+IGl0LnJlbW92ZSgpKTtcbiAgICAgICAgICB0aGlzLm1ldGhvZFNldHRpbmdzRGl2cyA9IFtdO1xuICAgICAgICB9IGVsc2UgeyB0aGlzLmNyZWF0ZUFsZ29yaXRobVNldHRpbmdzRGl2KHRoaXMubWV0aG9kc1BhcmFtc1t0aGlzLm1ldGhvZElucHV0LnZhbHVlIV0pOyB9XG4gICAgICB9LCAnTW9kaWZ5IG1ldGhvZHMgcGFyYW1ldGVycycpO1xuXG4gICAgICB0aGlzLm1ldGhvZElucHV0LnJvb3QuY2xhc3NMaXN0LmFkZCgnbWwtZGltLXJlZHVjdGlvbi1zZXR0aW5ncy1pbnB1dCcpO1xuICAgICAgdGhpcy5tZXRob2RJbnB1dC5yb290LnByZXBlbmQodGhpcy5tZXRob2RTZXR0aW5nc0ljb24pO1xuICAgICAgdGhpcy5jb2x1bW5QYXJhbXNFZGl0b3JBY2NvcmRpb24uYWRkUGFuZSgnQ29sdW1uIG9wdGlvbnMnLCAoKSA9PiB0aGlzLmNvbHVtbk9wdEVkaXRvcnNSb290LCB0cnVlLCBudWxsLCBmYWxzZSk7XG4gICAgICB0aGlzLmNvbHVtblBhcmFtc0VkaXRvckFjY29yZGlvbi5yb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB0aGlzLmNvbHVtblBhcmFtc0VkaXRvclJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2x1bW5QYXJhbXNFZGl0b3JBY2NvcmRpb24ucm9vdCk7XG4gICAgICB0aGlzLmNvbHVtblBhcmFtc0VkaXRvclJvb3QuYXBwZW5kQ2hpbGQodGhpcy53ZWlnaHRzRWRpdG9yUm9vdCk7XG4gICAgfVxuXG4gICAgb25UYWJsZUlucHV0Q2hhbmdlZCgpIHtcbiAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZUlucHV0LnZhbHVlO1xuICAgICAgaWYgKCF0YWJsZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdWkuZW1wdHkodGhpcy5jb2x1bW5PcHRFZGl0b3JzUm9vdCk7XG4gICAgICB1aS5lbXB0eSh0aGlzLndlaWdodHNFZGl0b3JSb290KTtcblxuICAgICAgdGhpcy5jb2x1bW5GdW5jdGlvbnNNYXAgPSB7fTtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0YWJsZS5jb2x1bW5zLnRvTGlzdCgpO1xuICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdXBwb3J0ZWRGdW5jdGlvbnMpLmZvckVhY2goKGZ1bmNOYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VtVHlwZXMgPSB0aGlzLnN1cHBvcnRlZEZ1bmN0aW9uc1tmdW5jTmFtZV0uc2VtVHlwZXM7XG4gICAgICAgICAgY29uc3QgdHlwZXMgPSB0aGlzLnN1cHBvcnRlZEZ1bmN0aW9uc1tmdW5jTmFtZV0udHlwZXM7XG4gICAgICAgICAgY29uc3QgdW5pdHMgPSB0aGlzLnN1cHBvcnRlZEZ1bmN0aW9uc1tmdW5jTmFtZV0udW5pdHM7XG4gICAgICAgICAgY29uc3Qgc2VtVHlwZVN1cHBvcnRlZCA9ICFzZW1UeXBlcy5sZW5ndGggfHwgKGNvbC5zZW1UeXBlICYmIHNlbVR5cGVzLmluY2x1ZGVzKGNvbC5zZW1UeXBlKSk7XG4gICAgICAgICAgY29uc3QgdHlwZVN1cG9ydGVkID0gIXR5cGVzLmxlbmd0aCB8fCB0eXBlcy5pbmNsdWRlcyhjb2wudHlwZSk7XG4gICAgICAgICAgY29uc3QgdW5pdHNTdXBwb3J0ZWQgPSAhdW5pdHMubGVuZ3RoIHx8XG4gICAgICAgICAgICAoY29sLmdldFRhZyhERy5UQUdTLlVOSVRTKSAmJiB1bml0cy5pbmNsdWRlcyhjb2wuZ2V0VGFnKERHLlRBR1MuVU5JVFMpKSk7XG4gICAgICAgICAgaWYgKHNlbVR5cGVTdXBwb3J0ZWQgJiYgdHlwZVN1cG9ydGVkICYmIHVuaXRzU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29sdW1uRnVuY3Rpb25zTWFwW2NvbC5uYW1lXSlcbiAgICAgICAgICAgICAgdGhpcy5jb2x1bW5GdW5jdGlvbnNNYXBbY29sLm5hbWVdID0gW107XG4gICAgICAgICAgICB0aGlzLmNvbHVtbkZ1bmN0aW9uc01hcFtjb2wubmFtZV0ucHVzaChmdW5jTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3VwcG9ydGVkQ29sTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbHVtbkZ1bmN0aW9uc01hcCk7XG4gICAgICBjb25zdCBjb2x1bW5zSW5wdXQgPSB1aS5jb2x1bW5zSW5wdXQoJ0NvbHVtbnMnLCB0YWJsZSwgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uQ29sdW1uc0NoYW5nZWQubmV4dCgpO1xuICAgICAgICB1aS5lbXB0eSh0aGlzLmNvbHVtbk9wdEVkaXRvcnNSb290KTtcbiAgICAgICAgdWkuZW1wdHkodGhpcy53ZWlnaHRzRWRpdG9yUm9vdCk7XG4gICAgICAgIGNvbnN0IGNvbHMgPSBjb2x1bW5zSW5wdXQudmFsdWU7XG4gICAgICAgIGlmICghY29scyB8fCBjb2xzPy5sZW5ndGggPCAyKVxuICAgICAgICAgIHRoaXMuYWdncmVnYXRpb25NZXRob2RJbnB1dC5yb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0aW9uTWV0aG9kSW5wdXQucm9vdC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICBpZiAoIWNvbHMgfHwgY29scy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmNvbHVtblBhcmFtc0VkaXRvckFjY29yZGlvbi5yb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb2x1bW5PcHRFZGl0b3JzID0gY29scy5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVkaXRvckNsYXNzID0gbmV3IERpbVJlZHVjdGlvbkNvbHVtbkVkaXRvcihjb2wsIHRoaXMuY29sdW1uRnVuY3Rpb25zTWFwW2NvbC5uYW1lXS5tYXAoKGl0KSA9PlxuICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWRGdW5jdGlvbnNbaXRdKSk7XG4gICAgICAgICAgcmV0dXJuIGVkaXRvckNsYXNzO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZWRpdG9yc1Jvb3QgPSB1aS5kaXZWKFtdLCB7c3R5bGU6IHttYXhIZWlnaHQ6ICc0MDBweCcsIG92ZXJmbG93OiAnYXV0byd9fSk7XG4gICAgICAgIHRoaXMuY29sdW1uT3B0RWRpdG9ycy5mb3JFYWNoKChlZGl0b3IpID0+IHtcbiAgICAgICAgICBlZGl0b3JzUm9vdC5hcHBlbmRDaGlsZChlZGl0b3IuYWNjb3JkaW9uRGl2KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vdGhpcy5jb2x1bW5PcHRFZGl0b3JzUm9vdC5hcHBlbmRDaGlsZChlZGl0b3JzUm9vdCk7XG4gICAgICAgIGNvbnN0IGRvdWJsZWRDb2xFZGl0b3JzID0gbmV3IEFycmF5PGFueT4odGhpcy5jb2x1bW5PcHRFZGl0b3JzLmxlbmd0aCAqIDIpLmZpbGwobnVsbClcbiAgICAgICAgICAubWFwKChfLCBpKSA9PiBpICUgMiA9PT0gMCA/IHRoaXMuY29sdW1uT3B0RWRpdG9yc1tpIC8gMl0uY29sT3B0RWRpdG9ycyA6IFtdKTtcbiAgICAgICAgbGV0IGMgPSAwO1xuICAgICAgICBjb25zdCB0YWJsZSA9IHVpLnRhYmxlKGRvdWJsZWRDb2xFZGl0b3JzLCAoaXRlbSkgPT4ge1xuICAgICAgICAgIGMrKztcbiAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICBjb25zdCBwYXJhbXNFZGl0b3IgPVxuICAgICAgICAgICAgKHRoaXMuY29sdW1uT3B0RWRpdG9yc1tNYXRoLmZsb29yKChjIC0gMSkgLyAyKV0ucHJlcHJvY2Vzc2luZ0Z1bmNTZXR0aW5nc0RpdiA9IHVpLmRpdihbXSkpO1xuICAgICAgICAgIHJldHVybiBbcGFyYW1zRWRpdG9yLCB1aS5kaXYoKSwgdWkuZGl2KCksIHVpLmRpdigpXTtcbiAgICAgICAgfSwgWydDb2x1bW4nLCAnRW5jb2RpbmcgZnVuY3Rpb24nLCAnU2ltaWxhcml0eSBtZXRyaWMnLCAnV2VpZ2h0J10pO1xuICAgICAgICB0aGlzLmNvbHVtbk9wdEVkaXRvcnNcbiAgICAgICAgICAuZm9yRWFjaCgoaXQpID0+IHtcbiAgICAgICAgICAgIGl0LnByZXByb2Nlc3NpbmdGdW5jU2V0dGluZ3NEaXY/LnBhcmVudEVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnY29sc3BhbicsICc0Jyk7XG4gICAgICAgICAgICBpdC5wcmVwcm9jZXNzaW5nRnVuY1NldHRpbmdzRGl2Py5wYXJlbnRFbGVtZW50Py5wYXJlbnRFbGVtZW50Py5zdHlsZT8uc2V0UHJvcGVydHkoJ2hlaWdodCcsICd1bnNldCcpO1xuICAgICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5PcHRFZGl0b3JzLmxlbmd0aCA+IDApXG4gICAgICAgICAgdGhpcy5jb2x1bW5QYXJhbXNFZGl0b3JBY2NvcmRpb24ucm9vdC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKCdtbC1kaW0tcmVkdWN0aW9uLWNvbHVtbi1lZGl0b3ItdGFibGUtcm9vdCcpO1xuICAgICAgICB0aGlzLmNvbHVtbk9wdEVkaXRvcnNSb290LmFwcGVuZENoaWxkKHRhYmxlKTtcbiAgICAgIH0sIHthdmFpbGFibGU6IHN1cHBvcnRlZENvbE5hbWVzfSk7XG4gICAgICBjb2x1bW5zSW5wdXQuZmlyZUNoYW5nZWQoKTtcbiAgICAgIGlmICghdGhpcy5jb2x1bW5zSW5wdXRSb290KSB7XG4gICAgICAgIHRoaXMuY29sdW1uc0lucHV0Um9vdCA9IGNvbHVtbnNJbnB1dC5yb290O1xuICAgICAgICB0aGlzLmNvbHVtbnNJbnB1dCA9IGNvbHVtbnNJbnB1dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVpLmVtcHR5KHRoaXMuY29sdW1uc0lucHV0Um9vdCk7XG4gICAgICAgIHRoaXMuY29sdW1uc0lucHV0ID0gY29sdW1uc0lucHV0O1xuICAgICAgICBBcnJheS5mcm9tKHRoaXMuY29sdW1uc0lucHV0LnJvb3QuY2hpbGRyZW4pXG4gICAgICAgICAgLmZvckVhY2goKGl0KSA9PiB0aGlzLmNvbHVtbnNJbnB1dFJvb3QuYXBwZW5kQ2hpbGQoaXQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBjcmVhdGVBbGdvcml0aG1TZXR0aW5nc0RpdihcbiAgICAgIHBhcmFtczogVU1BUE9wdGlvbnMgfCBUU05FT3B0aW9ucyB8IERCU2Nhbk9wdGlvbnMpOiB2b2lkIHtcbiAgICAgIHRoaXMubWV0aG9kU2V0dGluZ3NEaXZzLmZvckVhY2goKGl0KSA9PiBpdC5yZW1vdmUoKSk7XG4gICAgICB0aGlzLm1ldGhvZFNldHRpbmdzRGl2cyA9IFtdO1xuICAgICAgY29uc3QgYW5jaG9yID0gdGhpcy5tZXRob2RTZXR0aW5nc0FuY2hvcjtcbiAgICAgIGNvbnN0IHBhcmVudCA9IGFuY2hvci5wYXJlbnRFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmICghcGFyZW50KVxuICAgICAgICByZXR1cm47XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGl0OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW06IElEaW1SZWR1Y3Rpb25QYXJhbSB8IElEaW1SZWR1Y3Rpb25QYXJhbTxzdHJpbmc+IHwgSURpbVJlZHVjdGlvblBhcmFtPGJvb2xlYW4+ID1cbiAgICAgICAgICAocGFyYW1zIGFzIGFueSlbaXRdO1xuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGFyYW0udHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgIHVpLnN0cmluZ0lucHV0KHBhcmFtLnVpTmFtZSwgcGFyYW0udmFsdWUgPz8gJycsICgpID0+IHtcbiAgICAgICAgICAgIHBhcmFtLnZhbHVlID0gKGlucHV0IGFzIERHLklucHV0QmFzZTxzdHJpbmc+KS52YWx1ZTtcbiAgICAgICAgICB9KSA6IHBhcmFtLnR5cGUgPT09ICdib29sZWFuJyA/XG4gICAgICAgICAgICB1aS5ib29sSW5wdXQocGFyYW0udWlOYW1lLCBwYXJhbS52YWx1ZSA/PyBmYWxzZSwgKCkgPT4ge1xuICAgICAgICAgICAgICBwYXJhbS52YWx1ZSA9IChpbnB1dCBhcyBERy5JbnB1dEJhc2U8Ym9vbGVhbj4pLnZhbHVlO1xuICAgICAgICAgICAgfSkgOlxuICAgICAgICAgICAgdWkuZmxvYXRJbnB1dChwYXJhbS51aU5hbWUsIHBhcmFtLnZhbHVlIGFzIGFueSwgKCkgPT4ge1xuICAgICAgICAgICAgICBwYXJhbS52YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmIChwYXJhbS5kaXNhYmxlKSB7XG4gICAgICAgICAgaW5wdXQuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHVpLnRvb2x0aXAuYmluZChpbnB1dC5pbnB1dCA/PyBpbnB1dC5yb290LCBwYXJhbS5kaXNhYmxlVG9vbHRpcCA/PyAnJyk7XG4gICAgICAgIH0gZWxzZSB7IHVpLnRvb2x0aXAuYmluZChpbnB1dC5pbnB1dCA/PyBpbnB1dC5yb290LCBwYXJhbS50b29sdGlwKTsgfVxuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGlucHV0LnJvb3QsIGFuY2hvcik7XG4gICAgICAgIHRoaXMubWV0aG9kU2V0dGluZ3NEaXZzLnB1c2goaW5wdXQucm9vdCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgYWxnb3JpdGhtT3B0aW9ucygpOiBJVU1BUE9wdGlvbnMgfCBJVFNORU9wdGlvbnMge1xuICAgICAgY29uc3QgYWxnb3JpdGhtUGFyYW1zOiBVTUFQT3B0aW9ucyB8IFRTTkVPcHRpb25zID0gdGhpcy5tZXRob2RzUGFyYW1zW3RoaXMubWV0aG9kSW5wdXQudmFsdWUhXTtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMoYWxnb3JpdGhtUGFyYW1zKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoKGFsZ29yaXRobVBhcmFtcyBhcyBhbnkpW2tleV0udmFsdWUgIT0gbnVsbClcbiAgICAgICAgICBvcHRpb25zW2tleV0gPSAoYWxnb3JpdGhtUGFyYW1zIGFzIGFueSlba2V5XS52YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgZ2V0IGRiU2Nhbk9wdGlvbnMoKTogSURCU2Nhbk9wdGlvbnMge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGJTY2FuRXBzaWxvbjogdGhpcy5kYlNjYW5QYXJhbXMuZXBzaWxvbi52YWx1ZSA/PyAwLjAxLFxuICAgICAgICBkYlNjYW5NaW5QdHM6IHRoaXMuZGJTY2FuUGFyYW1zLm1pblB0cy52YWx1ZSA/PyA0XG4gICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFZGl0b3IoKTogSFRNTEVsZW1lbnQge1xuICAgICAgY29uc3QgZGl2ID0gdWkuZGl2KFtcbiAgICAgICAgdGhpcy50YWJsZUlucHV0LnJvb3QsXG4gICAgICAgIHRoaXMuY29sdW1uc0lucHV0Um9vdCxcbiAgICAgICAgdGhpcy5jb2x1bW5QYXJhbXNFZGl0b3JSb290LFxuICAgICAgICB0aGlzLmFnZ3JlZ2F0aW9uTWV0aG9kSW5wdXQucm9vdCxcbiAgICAgICAgdGhpcy5tZXRob2RJbnB1dC5yb290LFxuICAgICAgICB0aGlzLm1ldGhvZFNldHRpbmdzQW5jaG9yLFxuICAgICAgICB0aGlzLnBsb3RFbWJlZGRpbmdzSW5wdXQsXG4gICAgICAgIHRoaXMucG9zdFByb2Nlc3NpbmdFZGl0b3Iucm9vdCxcbiAgICAgIF0sIHtzdHlsZToge21pbldpZHRoOiAnNDIwcHgnfSwgY2xhc3NlczogJ2RpbS1yZWR1Y3Rpb24tZGlhbG9nLWZvcm0nfSk7XG4gICAgICByZXR1cm4gZGl2O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YWJsZTogdGhpcy50YWJsZUlucHV0LnZhbHVlISxcbiAgICAgICAgY29sdW1uczogdGhpcy5jb2x1bW5zSW5wdXQudmFsdWUhLFxuICAgICAgICBtZXRob2ROYW1lOiB0aGlzLm1ldGhvZElucHV0LnZhbHVlISxcbiAgICAgICAgcHJlcHJvY2Vzc2luZ0Z1bmN0aW9uczogdGhpcy5jb2x1bW5PcHRFZGl0b3JzLm1hcCgoaXQpID0+IGl0LnByZVByb2Nlc3NpbmdGdW5jdGlvbiksXG4gICAgICAgIGRpc3RhbmNlTWV0cmljczogdGhpcy5jb2x1bW5PcHRFZGl0b3JzLm1hcCgoaXQpID0+IGl0LnNpbWlsYXJpdHlNZXRyaWNJbnB1dC52YWx1ZSEpLFxuICAgICAgICB3ZWlnaHRzOiB0aGlzLmNvbHVtbk9wdEVkaXRvcnMubWFwKChpdCkgPT4gaXQud2VpZ2h0ID8/IDEpLFxuICAgICAgICBvcHRpb25zOiB7Li4udGhpcy5hbGdvcml0aG1PcHRpb25zLCAuLi50aGlzLmRiU2Nhbk9wdGlvbnMsXG4gICAgICAgICAgcHJlcHJvY2Vzc2luZ0Z1bmNBcmdzOiB0aGlzLmNvbHVtbk9wdEVkaXRvcnMubWFwKChpdCkgPT4gaXQucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uU2V0dGluZ3MpfSxcbiAgICAgICAgcGxvdEVtYmVkZGluZ3M6IHRoaXMucGxvdEVtYmVkZGluZ3NJbnB1dC52YWx1ZSxcbiAgICAgICAgY2x1c3RlckVtYmVkZGluZ3M6IGZhbHNlLFxuICAgICAgICBwb3N0UHJvY2Vzc2luZ0Z1bmN0aW9uOiB0aGlzLnBvc3RQcm9jZXNzaW5nRWRpdG9yLnBvc3RQcm9jZXNzaW5nRnVuY3Rpb24sXG4gICAgICAgIHBvc3RQcm9jZXNzaW5nRnVuY3Rpb25BcmdzOiB0aGlzLnBvc3RQcm9jZXNzaW5nRWRpdG9yLmFyZ3MsXG4gICAgICAgIGFnZ3JlYWdncmVnYXRpb25NZXRob2Q6IHRoaXMuYWdncmVnYXRpb25NZXRob2RJbnB1dC52YWx1ZVxuICAgICAgfTtcbiAgICB9XG59XG5cblxuY2xhc3MgRGltUmVkdWN0aW9uQ29sdW1uRWRpdG9yIHtcbiAgICBwcmVwcm9jZXNzaW5nRnVuY1NldHRpbmdzRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBwcmVwcm9jZXNzaW5nRnVuY3Rpb25JbnB1dDogREcuSW5wdXRCYXNlPHN0cmluZyB8IG51bGw+O1xuICAgIHByZXByb2Nlc3NpbmdGdW5jU2V0dGluZ3NJY29uOiBIVE1MRWxlbWVudDtcbiAgICBzaW1pbGFyaXR5TWV0cmljSW5wdXQhOiBERy5JbnB1dEJhc2U8c3RyaW5nIHwgbnVsbD47XG4gICAgc2ltaWxhcml0eU1ldHJpY0lucHV0Um9vdCE6IEhUTUxFbGVtZW50O1xuICAgIHByZXByb2Nlc3NpbmdGdW5jdGlvblNldHRpbmdzOiBPcHRpb25zID0ge307XG4gICAgYWNjb3JkaW9uRGl2OiBIVE1MRWxlbWVudDtcbiAgICBjb2x1bW46IERHLkNvbHVtbjtcbiAgICBzdXBwb3J0ZWRGdW5jdGlvbnM6IERpbVJlZFN1cHBvcnRlZEZ1bmN0aW9uc1tdO1xuICAgIGVkaXRvckRpdjogSFRNTEVsZW1lbnQgPSB1aS5kaXYoW10pO1xuICAgIGhhc0V4dHJhU2V0dGluZ3M6IGJvb2xlYW4gPSB0cnVlO1xuICAgIGZ1bmN0aW9uc01hcDoge1tfOiBzdHJpbmddOiBERy5GdW5jfSA9IHt9O1xuICAgIG5lZWRzQ29uZmlndXJhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHdlaWdodElucHV0OiBERy5JbnB1dEJhc2U8bnVtYmVyIHwgbnVsbD47XG4gICAgd2VpZ2h0OiBudW1iZXIgPSAxO1xuICAgIGNvbE9wdEVkaXRvcnM6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBjb25zdHJ1Y3Rvcihjb2x1bW46IERHLkNvbHVtbiwgc3VwcG9ydGVkRnVuY3Rpb25zOiBEaW1SZWRTdXBwb3J0ZWRGdW5jdGlvbnNbXSkge1xuICAgICAgdGhpcy53ZWlnaHRJbnB1dCA9IHVpLmZsb2F0SW5wdXQoJ1dlaWdodCcsIDEsICgpID0+IHsgdGhpcy53ZWlnaHQgPSB0aGlzLndlaWdodElucHV0LnZhbHVlID8/IDE7IH0pO1xuICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gICAgICAvLyBzb3J0IGJ5IHNwZWNpZmljaXR5XG4gICAgICB0aGlzLnN1cHBvcnRlZEZ1bmN0aW9ucyA9IHN1cHBvcnRlZEZ1bmN0aW9ucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGlmICgoYS51bml0cy5sZW5ndGggPT09IDAgfHwgYi51bml0cy5sZW5ndGggPT09IDApICYmIGEudW5pdHMubGVuZ3RoICE9PSBiLnVuaXRzLmxlbmd0aClcbiAgICAgICAgICByZXR1cm4gYi51bml0cy5sZW5ndGggLSBhLnVuaXRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGEudW5pdHMubGVuZ3RoICE9PSBiLnVuaXRzLmxlbmd0aClcbiAgICAgICAgICByZXR1cm4gYS51bml0cy5sZW5ndGggLSBiLnVuaXRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGEuc2VtVHlwZXMubGVuZ3RoID09PSAwIHx8IGIuc2VtVHlwZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgIHJldHVybiBiLnNlbVR5cGVzLmxlbmd0aCAtIGEuc2VtVHlwZXMubGVuZ3RoO1xuICAgICAgICBpZiAoYS5zZW1UeXBlcy5sZW5ndGggIT09IGIuc2VtVHlwZXMubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiBhLnNlbVR5cGVzLmxlbmd0aCAtIGIuc2VtVHlwZXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gYS50eXBlcy5sZW5ndGggLSBiLnR5cGVzLmxlbmd0aDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdXBwb3J0ZWRGdW5jdGlvbnMuZm9yRWFjaCgoZikgPT4ge1xuICAgICAgICB0aGlzLmZ1bmN0aW9uc01hcFtnZXRGdW5jTmFtZShmLmZ1bmMpXSA9IGYuZnVuYztcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25JbnB1dCA9IHVpLmNob2ljZUlucHV0KCdFbmNvZGluZyBmdW5jdGlvbicsXG4gICAgICAgIGdldEZ1bmNOYW1lKHRoaXMuc3VwcG9ydGVkRnVuY3Rpb25zWzBdLmZ1bmMpLCB0aGlzLnN1cHBvcnRlZEZ1bmN0aW9ucy5tYXAoKGl0KSA9PiBnZXRGdW5jTmFtZShpdC5mdW5jKSksXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvbklucHV0LnZhbHVlITtcbiAgICAgICAgICBjb25zdCBmdW5jID0gdGhpcy5mdW5jdGlvbnNNYXBbdmFsXTtcbiAgICAgICAgICB0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvblNldHRpbmdzID0ge307XG4gICAgICAgICAgdGhpcy5oYXNFeHRyYVNldHRpbmdzID0gZnVuYy5pbnB1dHMubGVuZ3RoID4gMjtcbiAgICAgICAgICBjb25zdCBzdXBGID0gdGhpcy5zdXBwb3J0ZWRGdW5jdGlvbnMuZmluZCgoaXQpID0+IGdldEZ1bmNOYW1lKGl0LmZ1bmMpID09PSB2YWwpITtcbiAgICAgICAgICB0aGlzLmdldFNpbWlsYXJpdHlNZXRyaWNJbnB1dChzdXBGKTtcbiAgICAgICAgICB1aS5lbXB0eSh0aGlzLnByZXByb2Nlc3NpbmdGdW5jU2V0dGluZ3NEaXYpO1xuICAgICAgICAgIHNldHRpbmdzT3BlbmVkID0gZmFsc2U7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0V4dHJhU2V0dGluZ3MpXG4gICAgICAgICAgICB0aGlzLnByZXByb2Nlc3NpbmdGdW5jU2V0dGluZ3NJY29uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5wcmVwcm9jZXNzaW5nRnVuY1NldHRpbmdzSWNvbi5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25JbnB1dC5yb290LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgICAgIHRoaXMuY3JlYXRlU2V0dGluZ3NEaXYodGhpcy5wcmVwcm9jZXNzaW5nRnVuY1NldHRpbmdzRGl2LCB0aGlzLnN1cHBvcnRlZEZ1bmN0aW9uc1swXS5mdW5jKVxuICAgICAgICAudGhlbigoKSA9PiB7IHVpLmVtcHR5KHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmNTZXR0aW5nc0Rpdik7IH0pO1xuXG4gICAgICB0aGlzLmdldFNpbWlsYXJpdHlNZXRyaWNJbnB1dCh0aGlzLnN1cHBvcnRlZEZ1bmN0aW9uc1swXSk7XG4gICAgICB0aGlzLmhhc0V4dHJhU2V0dGluZ3MgPSB0aGlzLnN1cHBvcnRlZEZ1bmN0aW9uc1swXS5mdW5jLmlucHV0cy5sZW5ndGggPiAyO1xuXG4gICAgICBsZXQgc2V0dGluZ3NPcGVuZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmNTZXR0aW5nc0ljb24gPSB1aS5pY29ucy5zZXR0aW5ncyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHNldHRpbmdzT3BlbmVkID0gIXNldHRpbmdzT3BlbmVkO1xuICAgICAgICBpZiAoc2V0dGluZ3NPcGVuZWQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVNldHRpbmdzRGl2KHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmNTZXR0aW5nc0RpdixcbiAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25zTWFwW3RoaXMucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uSW5wdXQudmFsdWUhXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdWkuZW1wdHkodGhpcy5wcmVwcm9jZXNzaW5nRnVuY1NldHRpbmdzRGl2KTtcbiAgICAgICAgfVxuICAgICAgfSwgJ01vZGlmeSBlbmNvZGluZyBmdW5jdGlvbiBwYXJhbWV0ZXJzJyk7XG5cbiAgICAgIHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uSW5wdXQucm9vdC5jbGFzc0xpc3QuYWRkKCdtbC1kaW0tcmVkdWN0aW9uLXNldHRpbmdzLWlucHV0Jyk7XG4gICAgICB0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvbklucHV0LnJvb3QucHJlcGVuZCh0aGlzLnByZXByb2Nlc3NpbmdGdW5jU2V0dGluZ3NJY29uKTtcblxuICAgICAgaWYgKCF0aGlzLmhhc0V4dHJhU2V0dGluZ3MpXG4gICAgICAgIHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmNTZXR0aW5nc0ljb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzaW5nRnVuY1NldHRpbmdzSWNvbi5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuXG4gICAgICB0aGlzLm5lZWRzQ29uZmlndXJhdGlvbiA9ICEoc3VwcG9ydGVkRnVuY3Rpb25zLmxlbmd0aCA8IDIgJiYgIXRoaXMuaGFzRXh0cmFTZXR0aW5ncyAmJlxuICAgICAgc3VwcG9ydGVkRnVuY3Rpb25zWzBdLmRpc3RhbmNlRnVuY3Rpb25zLmxlbmd0aCA8IDIpO1xuXG4gICAgICBjb25zdCBjb2x1bW5UaXRsZSA9IHVpLmgzKHRoaXMuY29sdW1uLm5hbWUsIHtjbGFzc2VzOiAnbWwtZGltLXJlZHVjdGlvbi1jb2x1bW4tZWRpdG9yLWNvbHVtbi10aXRsZSd9KTtcbiAgICAgIHRoaXMuY29sT3B0RWRpdG9ycyA9IFtcbiAgICAgICAgY29sdW1uVGl0bGUsIHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uSW5wdXQucm9vdCxcbiAgICAgICAgdGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXRSb290LCB0aGlzLndlaWdodElucHV0LnJvb3RcbiAgICAgIF07XG4gICAgICAvLyBhc3NpZ24gdG9vbHRpcHNcbiAgICAgIHVpLnRvb2x0aXAuYmluZChjb2x1bW5UaXRsZSwgdGhpcy5jb2x1bW4ubmFtZSk7XG5cbiAgICAgIC8vIHRoaXMuY29sT3B0RWRpdG9ycy5mb3JFYWNoKChpdCwgaSkgPT4ge1xuICAgICAgLy8gICBpdC5zdHlsZS53aWR0aCA9IGAke2VkaXRvcldpZHRoc1tpXX0lYDtcbiAgICAgIC8vIH0pO1xuXG4gICAgICAvL2FkZCBjbGFzc2VzXG4gICAgICB0aGlzLmNvbE9wdEVkaXRvcnMuZm9yRWFjaCgoaXQpID0+IGl0LmNsYXNzTGlzdC5hZGQoJ21sLWRpbS1yZWR1Y3Rpb24tY29sdW1uLWVkaXRvci1pbnB1dC1yb290JykpO1xuXG4gICAgICBjb25zdCBkaXN0YW5jZU9wdGlvbnNEaXYgPSB1aS5kaXZIKFxuICAgICAgICB0aGlzLmNvbE9wdEVkaXRvcnMsIHtjbGFzc2VzOiAnbWwtZGltLXJlZHVjdGlvbi1jb2x1bW4tZWRpdG9yLXJvb3QnfVxuICAgICAgKTtcblxuICAgICAgdGhpcy5hY2NvcmRpb25EaXYgPSB1aS5kaXZWKFtdKTtcbiAgICAgIHRoaXMuZWRpdG9yRGl2LmFwcGVuZENoaWxkKGRpc3RhbmNlT3B0aW9uc0Rpdik7XG4gICAgICB0aGlzLmVkaXRvckRpdi5hcHBlbmRDaGlsZCh0aGlzLnByZXByb2Nlc3NpbmdGdW5jU2V0dGluZ3NEaXYpO1xuICAgICAgdGhpcy5hY2NvcmRpb25EaXYuYXBwZW5kQ2hpbGQodGhpcy5lZGl0b3JEaXYpO1xuICAgIH1cblxuICAgIGdldFNpbWlsYXJpdHlNZXRyaWNJbnB1dChwcmVGdW5jOiBEaW1SZWRTdXBwb3J0ZWRGdW5jdGlvbnMpIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gdWkuY2hvaWNlSW5wdXQoJ1NpbWlsYXJpdHkgbWV0cmljJywgcHJlRnVuYy5kaXN0YW5jZUZ1bmN0aW9uc1swXSwgcHJlRnVuYy5kaXN0YW5jZUZ1bmN0aW9ucyk7XG4gICAgICBpZiAoIXRoaXMuc2ltaWxhcml0eU1ldHJpY0lucHV0Um9vdCkge1xuICAgICAgICB0aGlzLnNpbWlsYXJpdHlNZXRyaWNJbnB1dFJvb3QgPSBpbnB1dC5yb290O1xuICAgICAgICB0aGlzLnNpbWlsYXJpdHlNZXRyaWNJbnB1dCA9IGlucHV0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdWkuZW1wdHkodGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXRSb290KTtcbiAgICAgICAgdGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXQgPSBpbnB1dDtcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLnNpbWlsYXJpdHlNZXRyaWNJbnB1dC5yb290LmNoaWxkcmVuKVxuICAgICAgICAgIC5mb3JFYWNoKChpdCkgPT4gdGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXRSb290LmFwcGVuZENoaWxkKGl0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHByZVByb2Nlc3NpbmdGdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmZ1bmN0aW9uc01hcFt0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvbklucHV0LnZhbHVlIV07XG4gICAgfVxuXG4gICAgYXN5bmMgY3JlYXRlU2V0dGluZ3NEaXYocGFyYW1zRm9ybTogSFRNTEVsZW1lbnQsIGZ1bmM6IERHLkZ1bmMpOiBQcm9taXNlPEhUTUxFbGVtZW50PiB7XG4gICAgICB1aS5lbXB0eShwYXJhbXNGb3JtKTtcbiAgICAgIGlmIChmdW5jLmlucHV0cy5sZW5ndGggPCAzKVxuICAgICAgICByZXR1cm4gdWkuZGl2KCk7XG4gICAgICBjb25zdCBmYyA9IGZ1bmMucHJlcGFyZSgpO1xuICAgICAgY29uc3QgaW5wdXRzID0gYXdhaXQgZmMuYnVpbGRFZGl0b3IodWkuZGl2KCkpO1xuICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBmdW5jLmlucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBmSW5wdXQgPSBmdW5jLmlucHV0c1tpXTtcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25TZXR0aW5nc1tmSW5wdXQubmFtZV0gfHxcbiAgICAgICAgICAgIGZjLmlucHV0UGFyYW1zW2Z1bmMuaW5wdXRzW2ldLm5hbWVdLnZhbHVlIHx8IGZJbnB1dC5kZWZhdWx0VmFsdWU7XG4gICAgICAgIGlmICh2YWwpXG4gICAgICAgICAgdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25TZXR0aW5nc1tmSW5wdXQubmFtZV0gPSB2YWw7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzLmZpbmQoKGlucCkgPT4gaW5wLnByb3BlcnR5Lm5hbWUgPT09IGZJbnB1dC5uYW1lKTtcbiAgICAgICAgaWYgKCFpbnB1dClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uU2V0dGluZ3NbZklucHV0Lm5hbWVdICE9PSBudWxsICYmXG4gICAgICAgICAgICB0aGlzLnByZXByb2Nlc3NpbmdGdW5jdGlvblNldHRpbmdzW2ZJbnB1dC5uYW1lXSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5wcmVwcm9jZXNzaW5nRnVuY3Rpb25TZXR0aW5nc1tmSW5wdXQubmFtZV07XG4gICAgICAgIGlucHV0Lm9uQ2hhbmdlZCgoKSA9PiB7IHRoaXMucHJlcHJvY2Vzc2luZ0Z1bmN0aW9uU2V0dGluZ3NbZklucHV0Lm5hbWVdID0gaW5wdXQudmFsdWU7IH0pO1xuICAgICAgICBwYXJhbXNGb3JtLmFwcGVuZChpbnB1dC5yb290KTtcbiAgICAgIH1cbiAgICAgIHBhcmFtc0Zvcm0uc3R5bGUubWFyZ2luQm90dG9tID0gJzEwcHgnO1xuICAgICAgcmV0dXJuIHBhcmFtc0Zvcm07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jOiBERy5GdW5jKSB7XG4gIHJldHVybiBmdW5jLmZyaWVuZGx5TmFtZSA/PyBmdW5jLm5hbWU7XG59XG5cbmNsYXNzIFBvc3RQcm9jZXNzaW5nRnVuY0VkaXRvciB7XG4gIHBvc3RQcm9jZXNzaW5nRnVuY3Rpb25zTWFwOiB7W2tleTogc3RyaW5nXTogREcuRnVuYyB8IG51bGx9ID0ge307XG4gIHBvc3RQcm9jZXNzaW5nRnVuY3Rpb25JbnB1dDogREcuQ2hvaWNlSW5wdXQ8c3RyaW5nIHwgbnVsbD47XG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50ID0gdWkuZGl2KFtdKTtcbiAgcHJpdmF0ZSBfcG9zdFByb2Nlc3NpbmdBcmdzOiBPcHRpb25zID0ge307XG4gIHByaXZhdGUgX2FyZ3NFbGVtZW50OiBIVE1MRWxlbWVudCA9IHVpLmRpdihbXSk7XG4gIHByaXZhdGUgX3NldHRpbmdzSWNvbjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3NldHRpbmdzT3BlbmVkOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3NldHRpbmdzSWNvbiA9IHVpLmljb25zLnNldHRpbmdzKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuX3NldHRpbmdzT3BlbmVkID0gIXRoaXMuX3NldHRpbmdzT3BlbmVkO1xuICAgICAgaWYgKHRoaXMuX3NldHRpbmdzT3BlbmVkKVxuICAgICAgICB0aGlzLl9hcmdzRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5fYXJnc0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9KTtcbiAgICB0aGlzLl9hcmdzRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgY29uc3QgcG9zdFByb2Nlc3NpbmdGdW5jcyA9IERHLkZ1bmMuZmluZCh7dGFnczogW0RJTV9SRURfUE9TVFBST0NFU1NJTkdfRlVOQ1RJT05fVEFHXX0pXG4gICAgICAuZmlsdGVyKChmKSA9PiBmLmlucHV0cy5sZW5ndGggPj0gMik7XG4gICAgcG9zdFByb2Nlc3NpbmdGdW5jcy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gZi5mcmllbmRseU5hbWUgPz8gZi5uYW1lO1xuICAgICAgdGhpcy5wb3N0UHJvY2Vzc2luZ0Z1bmN0aW9uc01hcFtuYW1lXSA9IGY7XG4gICAgfSk7XG4gICAgdGhpcy5wb3N0UHJvY2Vzc2luZ0Z1bmN0aW9uc01hcFsnTm9uZSddID0gbnVsbDtcblxuICAgIGNvbnN0IGRlZmF1bHRQb3N0UHJvY2Vzc2luZ0Z1bmMgPSBPYmplY3Qua2V5cyh0aGlzLnBvc3RQcm9jZXNzaW5nRnVuY3Rpb25zTWFwKS5maW5kKChpdCkgPT5cbiAgICAgICEhdGhpcy5wb3N0UHJvY2Vzc2luZ0Z1bmN0aW9uc01hcFtpdF0/Lm9wdGlvbnM/LltESU1fUkVEX0RFRkFVTFRfUE9TVFBST0NFU1NJTkdfRlVOQ1RJT05fTUVUQV0pID8/ICdOb25lJztcbiAgICB0aGlzLnBvc3RQcm9jZXNzaW5nRnVuY3Rpb25JbnB1dCA9XG4gICAgICB1aS5jaG9pY2VJbnB1dCgnUG9zdHByb2Nlc3NpbmcnLCBkZWZhdWx0UG9zdFByb2Nlc3NpbmdGdW5jLFxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnBvc3RQcm9jZXNzaW5nRnVuY3Rpb25zTWFwKSwgYXN5bmMgKCkgPT4geyBhd2FpdCB0aGlzLm9uRnVuY3Rpb25DaGFuZ2VkKCk7IH0sXG4gICAgICAgIHtudWxsYWJsZTogZmFsc2V9KTtcbiAgICB0aGlzLm9uRnVuY3Rpb25DaGFuZ2VkKCk7XG4gICAgdGhpcy5wb3N0UHJvY2Vzc2luZ0Z1bmN0aW9uSW5wdXQubnVsbGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLnBvc3RQcm9jZXNzaW5nRnVuY3Rpb25JbnB1dC5jbGFzc0xpc3QuYWRkKCdtbC1kaW0tcmVkdWN0aW9uLXNldHRpbmdzLWlucHV0Jyk7XG4gICAgdGhpcy5wb3N0UHJvY2Vzc2luZ0Z1bmN0aW9uSW5wdXQucm9vdC5wcmVwZW5kKHRoaXMuX3NldHRpbmdzSWNvbik7XG4gICAgdGhpcy5fcm9vdC5hcHBlbmRDaGlsZCh0aGlzLnBvc3RQcm9jZXNzaW5nRnVuY3Rpb25JbnB1dC5yb290KTtcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMuX2FyZ3NFbGVtZW50KTtcbiAgfVxuXG4gIGdldCBwb3N0UHJvY2Vzc2luZ0Z1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnBvc3RQcm9jZXNzaW5nRnVuY3Rpb25JbnB1dC52YWx1ZSA/XG4gICAgICB0aGlzLnBvc3RQcm9jZXNzaW5nRnVuY3Rpb25zTWFwW3RoaXMucG9zdFByb2Nlc3NpbmdGdW5jdGlvbklucHV0LnZhbHVlXSA6IG51bGw7XG4gIH1cblxuICBhc3luYyBvbkZ1bmN0aW9uQ2hhbmdlZCgpIHtcbiAgICBjb25zdCBmdW5jID0gdGhpcy5wb3N0UHJvY2Vzc2luZ0Z1bmN0aW9uO1xuICAgIHVpLmVtcHR5KHRoaXMuX2FyZ3NFbGVtZW50KTtcbiAgICB0aGlzLl9wb3N0UHJvY2Vzc2luZ0FyZ3MgPSB7fTtcbiAgICBpZiAoIWZ1bmMgfHwgZnVuYy5pbnB1dHMubGVuZ3RoIDwgMykge1xuICAgICAgdGhpcy5fc2V0dGluZ3NJY29uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICByZXR1cm47XG4gICAgfTtcbiAgICB0aGlzLl9zZXR0aW5nc0ljb24uc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBjb25zdCBmYyA9IGZ1bmMucHJlcGFyZSgpO1xuICAgIGNvbnN0IGlucHV0cyA9IGF3YWl0IGZjLmJ1aWxkRWRpdG9yKHVpLmRpdigpKTtcbiAgICBmb3IgKGxldCBpID0gMjsgaSA8IGZ1bmMuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBmSW5wdXQgPSBmdW5jLmlucHV0c1tpXTtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuX3Bvc3RQcm9jZXNzaW5nQXJnc1tmSW5wdXQubmFtZV0gfHxcbiAgICAgICAgZmMuaW5wdXRQYXJhbXNbZnVuYy5pbnB1dHNbaV0ubmFtZV0udmFsdWUgfHwgZklucHV0LmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmICh2YWwpXG4gICAgICAgIHRoaXMuX3Bvc3RQcm9jZXNzaW5nQXJnc1tmSW5wdXQubmFtZV0gPSB2YWw7XG4gICAgICBjb25zdCBpbnB1dCA9IGlucHV0cy5maW5kKChpbnApID0+IGlucC5wcm9wZXJ0eS5uYW1lID09PSBmSW5wdXQubmFtZSk7XG4gICAgICBpZiAoIWlucHV0KVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGlucHV0Lm9uQ2hhbmdlZCgoKSA9PiB7IHRoaXMuX3Bvc3RQcm9jZXNzaW5nQXJnc1tmSW5wdXQubmFtZV0gPSBpbnB1dC52YWx1ZTsgfSk7XG4gICAgICB0aGlzLl9hcmdzRWxlbWVudC5hcHBlbmQoaW5wdXQucm9vdCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJvb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gIH1cblxuICBnZXQgYXJncygpIHtcbiAgICByZXR1cm4gdGhpcy5fcG9zdFByb2Nlc3NpbmdBcmdzO1xuICB9XG59XG4iXX0=","export const DIMENSIONALITY_REDUCER_TERMINATE_EVENT = 'dimensionality-reducer-terminate-event';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLHNDQUFzQyxHQUFHLHdDQUF3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IERJTUVOU0lPTkFMSVRZX1JFRFVDRVJfVEVSTUlOQVRFX0VWRU5UID0gJ2RpbWVuc2lvbmFsaXR5LXJlZHVjZXItdGVybWluYXRlLWV2ZW50JztcbiJdfQ==","import { DistanceAggregationMethods } from './types';\nexport const isNil = (x) => x === null || x === undefined;\nexport function insertSmaller(distancesAr, indexes, num, index) {\n if (num > distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num < v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function insertLarger(distancesAr, indexes, num, index) {\n if (num < distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num > v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function getAggregationFunction(aggregationMethod, weights) {\n switch (aggregationMethod) {\n case DistanceAggregationMethods.MANHATTAN:\n return (vs) => vs.reduce((acc, val, idx) => acc + val * weights[idx], 0);\n default:\n return (vs) => {\n // euclidean\n const sum = vs.reduce((acc, val, idx) => acc + (val * weights[idx]) ** 2, 0);\n return Math.sqrt(sum);\n };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxPQUFpQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ2hHLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPO0lBRVQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQXFCLEVBQUUsT0FBaUIsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUMvRixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztJQUVULE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxpQkFBNEMsRUFBRSxPQUFpQjtJQUUvRCxRQUFRLGlCQUFpQixFQUFFLENBQUM7UUFDMUIsS0FBSywwQkFBMEIsQ0FBQyxTQUFTO1lBQ3ZDLE9BQU8sQ0FBQyxFQUFZLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckY7WUFDRSxPQUFPLENBQUMsRUFBWSxFQUFFLEVBQUU7Z0JBQ3RCLFlBQVk7Z0JBQ1osTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDO0lBQ04sQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGlzTmlsID0gKHg6IGFueSkgPT4geCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRTbWFsbGVyKGRpc3RhbmNlc0FyOiBudW1iZXJbXSwgaW5kZXhlczogbnVtYmVyW10sIG51bTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGlmIChudW0gPiBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGgtMV0pXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPCB2KTtcbiAgZGlzdGFuY2VzQXIucG9wKCk7XG4gIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgaW5kZXhlcy5wb3AoKTtcbiAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExhcmdlcihkaXN0YW5jZXNBcjogbnVtYmVyW10sIGluZGV4ZXM6IG51bWJlcltdLCBudW06IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICBpZiAobnVtIDwgZGlzdGFuY2VzQXJbZGlzdGFuY2VzQXIubGVuZ3RoLTFdKVxuICAgIHJldHVybjtcblxuICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpc3RhbmNlc0FyLmZpbmRJbmRleCgodikgPT4gbnVtID4gdik7XG4gIGRpc3RhbmNlc0FyLnBvcCgpO1xuICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gIGluZGV4ZXMucG9wKCk7XG4gIGluZGV4ZXMuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9uKFxuICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgd2VpZ2h0czogbnVtYmVyW11cbik6ICh2YWx1ZXM6IG51bWJlcltdKSA9PiBudW1iZXIge1xuICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uTWV0aG9kKSB7XG4gICAgY2FzZSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5NQU5IQVRUQU46XG4gICAgICByZXR1cm4gKHZzOiBudW1iZXJbXSkgPT4gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyB2YWwgKiB3ZWlnaHRzW2lkeF0sIDApO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKHZzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICAvLyBldWNsaWRlYW5cbiAgICAgICAgY29uc3Qgc3VtID0gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyAodmFsICogd2VpZ2h0c1tpZHhdKSAqKiAyLCAwKTtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydChzdW0pO1xuICAgICAgfTtcbiAgfVxufVxuIl19","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport { BYPASS_LARGE_DATA_WARNING, SHOW_SCATTERPLOT_PROGRESS } from '../functionEditors/consts';\nimport { getDbscanWorker } from '@datagrok-libraries/math';\nimport { DIMENSIONALITY_REDUCER_TERMINATE_EVENT } from './consts';\nimport { getNormalizedEmbeddings } from './embeddings-space';\nexport function getEmbeddingColsNames(df) {\n const axes = ['Embed_X', 'Embed_Y'];\n const colNameInd = df.columns.names().filter((it) => it.includes(axes[0])).length + 1;\n return axes.map((it) => `${it}_${colNameInd}`);\n}\nexport function getEmbeddingViewerName(columns, method) {\n const colNames = columns.length > 4 ? `${columns.length} columns` : columns.map((it) => it.name).join(', ');\n return `${method} (${colNames})`;\n}\nexport async function multiColReduceDimensionality(table, columns, method, metrics, weights, preprocessingFunctions, aggregationMethod, plotEmbeddings = true, clusterEmbeddings = false, dimRedOptions = { preprocessingFuncArgs: [] }, uiOptions = {}, postProcessingFunc = null, postProcFuncArgs = {}) {\n const scatterPlotProps = {\n showXAxis: false,\n showYAxis: false,\n showXSelector: false,\n showYSelector: false,\n };\n if (columns.length !== metrics.length || columns.length !== preprocessingFunctions.length ||\n columns.length !== weights.length || columns.length !== dimRedOptions.preprocessingFuncArgs.length) {\n throw new Error('columns, metrics and preprocessing functions, weights and function arguments' +\n 'must have the same length');\n }\n const tv = plotEmbeddings ? grok.shell.tableView(table.name) ?? grok.shell.addTableView(table) : null;\n const doReduce = async () => {\n const pg = DG.TaskBarProgressIndicator.create(`Initializing ${uiOptions.scatterPlotName ?? 'dimensionality reduction'} ...`);\n let scatterPlot = undefined;\n try {\n const embedColsNames = getEmbeddingColsNames(table);\n function progressFunc(_nEpoch, epochsLength, embeddings) {\n let embedXCol = null;\n let embedYCol = null;\n if (!table.columns.names().includes(embedColsNames[0])) {\n embedXCol = table.columns.add(DG.Column.float(embedColsNames[0], table.rowCount));\n embedYCol = table.columns.add(DG.Column.float(embedColsNames[1], table.rowCount));\n if (plotEmbeddings && !scatterPlot) {\n scatterPlot = tv\n .scatterPlot({ ...scatterPlotProps, x: embedColsNames[0], y: embedColsNames[1],\n title: uiOptions.scatterPlotName ?? getEmbeddingViewerName(columns, method) });\n }\n }\n else {\n embedXCol = table.columns.byName(embedColsNames[0]);\n embedYCol = table.columns.byName(embedColsNames[1]);\n }\n if (uiOptions[SHOW_SCATTERPLOT_PROGRESS]) {\n scatterPlot?.root && ui.setUpdateIndicator(scatterPlot.root, false);\n embedXCol.init((i) => embeddings[0] ? embeddings[0][i] : undefined);\n embedYCol.init((i) => embeddings[1] ? embeddings[1][i] : undefined);\n }\n const progress = (_nEpoch / epochsLength * 100);\n pg.update(progress, `Running ${uiOptions.scatterPlotName ?? 'dimensionality reduction'}... ${progress.toFixed(0)}%`);\n }\n async function getDimRed() {\n table.columns.add(DG.Column.float(embedColsNames[0], table.rowCount));\n table.columns.add(DG.Column.float(embedColsNames[1], table.rowCount));\n let resolveF = null;\n if (plotEmbeddings) {\n scatterPlot = tv\n .scatterPlot({ ...scatterPlotProps, x: embedColsNames[0], y: embedColsNames[1],\n title: uiOptions.scatterPlotName ?? getEmbeddingViewerName(columns, method) });\n ui.setUpdateIndicator(scatterPlot.root, true);\n }\n const sub = grok.events.onViewerClosed.subscribe((args) => {\n const v = args.args.viewer;\n if (v?.getOptions()?.look?.title && scatterPlot?.getOptions()?.look?.title &&\n v?.getOptions()?.look?.title === scatterPlot?.getOptions()?.look?.title) {\n grok.events.fireCustomEvent(DIMENSIONALITY_REDUCER_TERMINATE_EVENT, {});\n sub.unsubscribe();\n resolveF?.();\n pg.close();\n }\n });\n const dimRedResPromise = new Promise(async (resolve, reject) => {\n try {\n resolveF = resolve;\n const encodedColEntries = [];\n for (let i = 0; i < preprocessingFunctions.length; ++i) {\n const pf = preprocessingFunctions[i];\n if (!dimRedOptions.distanceFnArgs)\n dimRedOptions.distanceFnArgs = [];\n if (pf) {\n const colInputName = pf.inputs[0].name;\n const metricInputName = pf.inputs[1].name;\n const { entries, options } = await pf.apply({ [colInputName]: columns[i], [metricInputName]: metrics[i],\n ...(dimRedOptions.preprocessingFuncArgs[i] ?? {}) });\n encodedColEntries.push({ entries, options });\n dimRedOptions.distanceFnArgs.push(options);\n }\n else {\n const entries = columns[i].toList();\n const options = {};\n encodedColEntries.push({ entries, options });\n dimRedOptions.distanceFnArgs.push(options);\n }\n }\n const res = await getNormalizedEmbeddings(encodedColEntries.map((it) => it.entries), method, metrics, weights, aggregationMethod, dimRedOptions, uiOptions[BYPASS_LARGE_DATA_WARNING] ? undefined : progressFunc);\n resolve(res);\n }\n catch (e) {\n reject(e);\n }\n });\n const res = await dimRedResPromise;\n pg.close();\n sub.unsubscribe();\n return res;\n }\n const res = await getDimRed();\n if (clusterEmbeddings && res) {\n const clusterPg = DG.TaskBarProgressIndicator.create(`Clustering embeddings ...`);\n try {\n const clusterRes = await getDbscanWorker(res[0], res[1], dimRedOptions.dbScanEpsilon ?? 0.01, dimRedOptions.dbScanMinPts ?? 4);\n const clusterColName = table.columns.getUnusedName('Cluster (DBSCAN)');\n const clusterCol = table.columns.addNewString(clusterColName);\n clusterCol.init((i) => clusterRes[i].toString());\n if (scatterPlot)\n scatterPlot.props.colorColumnName = clusterColName;\n }\n catch (e) {\n grok.shell.error('Clustering embeddings failed');\n console.error(e);\n }\n finally {\n clusterPg.close();\n }\n }\n if (res) {\n const embedXCol = table.columns.byName(embedColsNames[0]);\n const embedYCol = table.columns.byName(embedColsNames[1]);\n embedXCol.init((i) => res[0][i]);\n embedYCol.init((i) => res[1][i]);\n if (postProcessingFunc) {\n try {\n const col1InputName = postProcessingFunc.inputs[0].name;\n const col2InputName = postProcessingFunc.inputs[1].name;\n await postProcessingFunc\n .prepare({ [col1InputName]: embedXCol, [col2InputName]: embedYCol, ...postProcFuncArgs })\n .call(true);\n }\n catch (e) {\n grok.shell.error('Post-processing failed');\n console.error(e);\n }\n }\n if (scatterPlot) {\n ui.setUpdateIndicator(scatterPlot.root, false);\n scatterPlot.helpUrl = '/help/compute/sequence-space';\n return scatterPlot;\n }\n }\n }\n catch (e) {\n grok.shell.error('Dimensionality reduction failed');\n console.error(e);\n pg.close();\n if (scatterPlot)\n ui.setUpdateIndicator(scatterPlot.root, false);\n }\n };\n return new Promise(async (resolve, reject) => {\n try {\n if (uiOptions.fastRowCount && table.rowCount > uiOptions.fastRowCount && !uiOptions[BYPASS_LARGE_DATA_WARNING]) {\n ui.dialog()\n .add(ui.divText('Analysis might take several minutes. Do you want to continue?'))\n .onOK(async () => {\n try {\n const res = await doReduce();\n resolve(res);\n }\n catch (e) {\n reject(e);\n }\n })\n .onCancel(() => resolve(undefined))\n .show();\n }\n else {\n const res = await doReduce();\n resolve(res);\n }\n }\n catch (e) {\n reject(e);\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlLWRpbWVuc2lvbmFsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVkdWNlLWRpbWVuc2lvbmFsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRS9GLE9BQU8sRUFBaUIsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekUsT0FBTyxFQUFDLHNDQUFzQyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBWTNELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxFQUFnQjtJQUNwRCxNQUFNLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwQyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDOUYsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsT0FBb0IsRUFBRSxNQUEyQjtJQUN0RixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMs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QkFDSCxDQUFDLENBQUM7cUJBQ0QsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDbEMsSUFBSSxFQUFFLENBQUM7WUFDWixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxHQUFHLEdBQUcsTUFBTSxRQUFRLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQge0JZUEFTU19MQVJHRV9EQVRBX1dBUk5JTkcsIFNIT1dfU0NBVFRFUlBMT1RfUFJPR1JFU1N9IGZyb20gJy4uL2Z1bmN0aW9uRWRpdG9ycy9jb25zdHMnO1xuaW1wb3J0IHtNYXRyaXgsIE9wdGlvbnN9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7SURCU2Nhbk9wdGlvbnMsIGdldERic2Nhbldvcmtlcn0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoJztcbmltcG9ydCB7RElNRU5TSU9OQUxJVFlfUkVEVUNFUl9URVJNSU5BVEVfRVZFTlR9IGZyb20gJy4vY29uc3RzJztcbmltcG9ydCB7UHJlcHJvY2Vzc0Z1bmN0aW9uUmV0dXJuVHlwZX0gZnJvbSAnLi4vZnVuY3Rpb25FZGl0b3JzL2RpbWVuc2lvbmFsaXR5LXJlZHVjdGlvbi1lZGl0b3InO1xuaW1wb3J0IHtnZXROb3JtYWxpemVkRW1iZWRkaW5nc30gZnJvbSAnLi9lbWJlZGRpbmdzLXNwYWNlJztcbmltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZH0gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4L3R5cGVzJztcbmltcG9ydCB7SVRTTkVPcHRpb25zLCBJVU1BUE9wdGlvbnN9IGZyb20gJy4vbXVsdGktY29sdW1uLWRpbS1yZWR1Y2VyJztcbmltcG9ydCB7RGltUmVkdWN0aW9uTWV0aG9kc30gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIERpbVJlZFVpT3B0aW9ucyA9IHtcbiAgICBbQllQQVNTX0xBUkdFX0RBVEFfV0FSTklOR10/OiBib29sZWFuLFxuICAgIFtTSE9XX1NDQVRURVJQTE9UX1BST0dSRVNTXT86IGJvb2xlYW4sXG4gICAgZmFzdFJvd0NvdW50PzogbnVtYmVyLFxuICAgIHNjYXR0ZXJQbG90TmFtZT86IHN0cmluZyxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVtYmVkZGluZ0NvbHNOYW1lcyhkZjogREcuRGF0YUZyYW1lKSB7XG4gIGNvbnN0IGF4ZXMgPSBbJ0VtYmVkX1gnLCAnRW1iZWRfWSddO1xuICBjb25zdCBjb2xOYW1lSW5kID0gZGYuY29sdW1ucy5uYW1lcygpLmZpbHRlcigoaXQ6IHN0cmluZykgPT4gaXQuaW5jbHVkZXMoYXhlc1swXSkpLmxlbmd0aCArIDE7XG4gIHJldHVybiBheGVzLm1hcCgoaXQpID0+IGAke2l0fV8ke2NvbE5hbWVJbmR9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbWJlZGRpbmdWaWV3ZXJOYW1lKGNvbHVtbnM6IERHLkNvbHVtbltdLCBtZXRob2Q6IERpbVJlZHVjdGlvbk1ldGhvZHMpIHtcbiAgY29uc3QgY29sTmFtZXMgPSBjb2x1bW5zLmxlbmd0aCA+IDQgPyBgJHtjb2x1bW5zLmxlbmd0aH0gY29sdW1uc2AgOiBjb2x1bW5zLm1hcCgoaXQpID0+IGl0Lm5hbWUpLmpvaW4oJywgJyk7XG4gIHJldHVybiBgJHttZXRob2R9ICgke2NvbE5hbWVzfSlgO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbXVsdGlDb2xSZWR1Y2VEaW1lbnNpb25hbGl0eSh0YWJsZTogREcuRGF0YUZyYW1lLCBjb2x1bW5zOiBERy5Db2x1bW5bXSxcbiAgbWV0aG9kOiBEaW1SZWR1Y3Rpb25NZXRob2RzLCBtZXRyaWNzOiBLbm93bk1ldHJpY3NbXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gIHByZXByb2Nlc3NpbmdGdW5jdGlvbnM6IChERy5GdW5jIHwgbnVsbCB8IHVuZGVmaW5lZClbXSxcbiAgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIHBsb3RFbWJlZGRpbmdzOiBib29sZWFuID0gdHJ1ZSwgY2x1c3RlckVtYmVkZGluZ3M6IGJvb2xlYW4gPSBmYWxzZSxcbiAgZGltUmVkT3B0aW9uczogKElVTUFQT3B0aW9ucyB8IElUU05FT3B0aW9ucykgJiBQYXJ0aWFsPElEQlNjYW5PcHRpb25zPiAmIHtwcmVwcm9jZXNzaW5nRnVuY0FyZ3M6IE9wdGlvbnNbXX0gJlxuICAgIE9wdGlvbnMgPSB7cHJlcHJvY2Vzc2luZ0Z1bmNBcmdzOiBbXX0sXG4gIHVpT3B0aW9uczogRGltUmVkVWlPcHRpb25zID0ge30sIHBvc3RQcm9jZXNzaW5nRnVuYzogREcuRnVuYyB8IG51bGwgPSBudWxsLCBwb3N0UHJvY0Z1bmNBcmdzOiBPcHRpb25zID0ge30pIHtcbiAgY29uc3Qgc2NhdHRlclBsb3RQcm9wcyA9IHtcbiAgICBzaG93WEF4aXM6IGZhbHNlLFxuICAgIHNob3dZQXhpczogZmFsc2UsXG4gICAgc2hvd1hTZWxlY3RvcjogZmFsc2UsXG4gICAgc2hvd1lTZWxlY3RvcjogZmFsc2UsXG4gIH07XG4gIGlmIChjb2x1bW5zLmxlbmd0aCAhPT0gbWV0cmljcy5sZW5ndGggfHwgY29sdW1ucy5sZW5ndGggIT09IHByZXByb2Nlc3NpbmdGdW5jdGlvbnMubGVuZ3RoIHx8XG4gICAgICAgIGNvbHVtbnMubGVuZ3RoICE9PSB3ZWlnaHRzLmxlbmd0aCB8fCBjb2x1bW5zLmxlbmd0aCAhPT0gZGltUmVkT3B0aW9ucy5wcmVwcm9jZXNzaW5nRnVuY0FyZ3MubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb2x1bW5zLCBtZXRyaWNzIGFuZCBwcmVwcm9jZXNzaW5nIGZ1bmN0aW9ucywgd2VpZ2h0cyBhbmQgZnVuY3Rpb24gYXJndW1lbnRzJyArXG4gICAgICAnbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuICB9XG5cbiAgY29uc3QgdHYgPSBwbG90RW1iZWRkaW5ncyA/IGdyb2suc2hlbGwudGFibGVWaWV3KHRhYmxlLm5hbWUpID8/IGdyb2suc2hlbGwuYWRkVGFibGVWaWV3KHRhYmxlKSA6IG51bGw7XG5cbiAgY29uc3QgZG9SZWR1Y2UgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGcgPSBERy5UYXNrQmFyUHJvZ3Jlc3NJbmRpY2F0b3IuY3JlYXRlKFxuICAgICAgYEluaXRpYWxpemluZyAke3VpT3B0aW9ucy5zY2F0dGVyUGxvdE5hbWUgPz8gJ2RpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbid9IC4uLmApO1xuICAgIGxldCBzY2F0dGVyUGxvdDogREcuU2NhdHRlclBsb3RWaWV3ZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVtYmVkQ29sc05hbWVzID0gZ2V0RW1iZWRkaW5nQ29sc05hbWVzKHRhYmxlKTtcbiAgICAgIGZ1bmN0aW9uIHByb2dyZXNzRnVuYyhfbkVwb2NoOiBudW1iZXIsIGVwb2Noc0xlbmd0aDogbnVtYmVyLCBlbWJlZGRpbmdzOiBudW1iZXJbXVtdKSB7XG4gICAgICAgIGxldCBlbWJlZFhDb2w6IERHLkNvbHVtbiB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgZW1iZWRZQ29sOiBERy5Db2x1bW4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgaWYgKCF0YWJsZS5jb2x1bW5zLm5hbWVzKCkuaW5jbHVkZXMoZW1iZWRDb2xzTmFtZXNbMF0pKSB7XG4gICAgICAgICAgZW1iZWRYQ29sID0gdGFibGUuY29sdW1ucy5hZGQoREcuQ29sdW1uLmZsb2F0KGVtYmVkQ29sc05hbWVzWzBdLCB0YWJsZS5yb3dDb3VudCkpO1xuICAgICAgICAgIGVtYmVkWUNvbCA9IHRhYmxlLmNvbHVtbnMuYWRkKERHLkNvbHVtbi5mbG9hdChlbWJlZENvbHNOYW1lc1sxXSwgdGFibGUucm93Q291bnQpKTtcbiAgICAgICAgICBpZiAocGxvdEVtYmVkZGluZ3MgJiYgIXNjYXR0ZXJQbG90KSB7XG4gICAgICAgICAgICBzY2F0dGVyUGxvdCA9IHR2IVxuICAgICAgICAgICAgICAuc2NhdHRlclBsb3Qoey4uLnNjYXR0ZXJQbG90UHJvcHMsIHg6IGVtYmVkQ29sc05hbWVzWzBdLCB5OiBlbWJlZENvbHNOYW1lc1sxXSxcbiAgICAgICAgICAgICAgICB0aXRsZTogdWlPcHRpb25zLnNjYXR0ZXJQbG90TmFtZSA/PyBnZXRFbWJlZGRpbmdWaWV3ZXJOYW1lKGNvbHVtbnMsIG1ldGhvZCl9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW1iZWRYQ29sID0gdGFibGUuY29sdW1ucy5ieU5hbWUoZW1iZWRDb2xzTmFtZXNbMF0pO1xuICAgICAgICAgIGVtYmVkWUNvbCA9IHRhYmxlLmNvbHVtbnMuYnlOYW1lKGVtYmVkQ29sc05hbWVzWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1aU9wdGlvbnNbU0hPV19TQ0FUVEVSUExPVF9QUk9HUkVTU10pIHtcbiAgICAgICAgICBzY2F0dGVyUGxvdD8ucm9vdCAmJiB1aS5zZXRVcGRhdGVJbmRpY2F0b3Ioc2NhdHRlclBsb3QhLnJvb3QsIGZhbHNlKTtcbiAgICAgICAgICBlbWJlZFhDb2wuaW5pdCgoaSkgPT4gZW1iZWRkaW5nc1swXSA/IGVtYmVkZGluZ3NbMF1baV0gOiB1bmRlZmluZWQpO1xuICAgICAgICAgIGVtYmVkWUNvbC5pbml0KChpKSA9PiBlbWJlZGRpbmdzWzFdID8gZW1iZWRkaW5nc1sxXVtpXSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSAoX25FcG9jaCAvIGVwb2Noc0xlbmd0aCAqIDEwMCk7XG4gICAgICAgIHBnLnVwZGF0ZShwcm9ncmVzcyxcbiAgICAgICAgICBgUnVubmluZyAke3VpT3B0aW9ucy5zY2F0dGVyUGxvdE5hbWUgPz8gJ2RpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbid9Li4uICR7cHJvZ3Jlc3MudG9GaXhlZCgwKX0lYCk7XG4gICAgICB9XG4gICAgICBhc3luYyBmdW5jdGlvbiBnZXREaW1SZWQoKSB7XG4gICAgICAgIHRhYmxlLmNvbHVtbnMuYWRkKERHLkNvbHVtbi5mbG9hdChlbWJlZENvbHNOYW1lc1swXSwgdGFibGUucm93Q291bnQpKTtcbiAgICAgICAgdGFibGUuY29sdW1ucy5hZGQoREcuQ29sdW1uLmZsb2F0KGVtYmVkQ29sc05hbWVzWzFdLCB0YWJsZS5yb3dDb3VudCkpO1xuICAgICAgICBsZXQgcmVzb2x2ZUY6IEZ1bmN0aW9uIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmIChwbG90RW1iZWRkaW5ncykge1xuICAgICAgICAgIHNjYXR0ZXJQbG90ID0gdHYhXG4gICAgICAgICAgICAuc2NhdHRlclBsb3Qoey4uLnNjYXR0ZXJQbG90UHJvcHMsIHg6IGVtYmVkQ29sc05hbWVzWzBdLCB5OiBlbWJlZENvbHNOYW1lc1sxXSxcbiAgICAgICAgICAgICAgdGl0bGU6IHVpT3B0aW9ucy5zY2F0dGVyUGxvdE5hbWUgPz8gZ2V0RW1iZWRkaW5nVmlld2VyTmFtZShjb2x1bW5zLCBtZXRob2QpfSk7XG4gICAgICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHNjYXR0ZXJQbG90LnJvb3QsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViID0gZ3Jvay5ldmVudHMub25WaWV3ZXJDbG9zZWQuc3Vic2NyaWJlKChhcmdzKSA9PiB7XG4gICAgICAgICAgY29uc3QgdiA9IGFyZ3MuYXJncy52aWV3ZXIgYXMgdW5rbm93biBhcyBERy5WaWV3ZXI8YW55PjtcbiAgICAgICAgICBpZiAodj8uZ2V0T3B0aW9ucygpPy5sb29rPy50aXRsZSAmJiBzY2F0dGVyUGxvdD8uZ2V0T3B0aW9ucygpPy5sb29rPy50aXRsZSAmJlxuICAgICAgICAgICAgICAgICAgICAgIHY/LmdldE9wdGlvbnMoKT8ubG9vaz8udGl0bGUgPT09IHNjYXR0ZXJQbG90Py5nZXRPcHRpb25zKCk/Lmxvb2s/LnRpdGxlKSB7XG4gICAgICAgICAgICBncm9rLmV2ZW50cy5maXJlQ3VzdG9tRXZlbnQoRElNRU5TSU9OQUxJVFlfUkVEVUNFUl9URVJNSU5BVEVfRVZFTlQsIHt9KTtcbiAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZUY/LigpO1xuICAgICAgICAgICAgcGcuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRpbVJlZFJlc1Byb21pc2UgPSBuZXcgUHJvbWlzZTxNYXRyaXggfCB1bmRlZmluZWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZUYgPSByZXNvbHZlO1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlZENvbEVudHJpZXM6IFByZXByb2Nlc3NGdW5jdGlvblJldHVyblR5cGVbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVwcm9jZXNzaW5nRnVuY3Rpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBmID0gcHJlcHJvY2Vzc2luZ0Z1bmN0aW9uc1tpXTtcbiAgICAgICAgICAgICAgaWYgKCFkaW1SZWRPcHRpb25zLmRpc3RhbmNlRm5BcmdzKVxuICAgICAgICAgICAgICAgIGRpbVJlZE9wdGlvbnMuZGlzdGFuY2VGbkFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgaWYgKHBmKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sSW5wdXROYW1lID0gcGYuaW5wdXRzWzBdLm5hbWU7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0cmljSW5wdXROYW1lID0gcGYuaW5wdXRzWzFdLm5hbWU7XG4gICAgICAgICAgICAgICAgY29uc3Qge2VudHJpZXMsIG9wdGlvbnN9OiBQcmVwcm9jZXNzRnVuY3Rpb25SZXR1cm5UeXBlID1cbiAgICAgICAgICAgICAgICBhd2FpdCBwZi5hcHBseSh7W2NvbElucHV0TmFtZV06IGNvbHVtbnNbaV0sIFttZXRyaWNJbnB1dE5hbWVdOiBtZXRyaWNzW2ldLFxuICAgICAgICAgICAgICAgICAgLi4uKGRpbVJlZE9wdGlvbnMucHJlcHJvY2Vzc2luZ0Z1bmNBcmdzW2ldID8/IHt9KX0pO1xuICAgICAgICAgICAgICAgIGVuY29kZWRDb2xFbnRyaWVzLnB1c2goe2VudHJpZXMsIG9wdGlvbnN9KTtcbiAgICAgICAgICAgICAgICBkaW1SZWRPcHRpb25zLmRpc3RhbmNlRm5BcmdzLnB1c2gob3B0aW9ucyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGNvbHVtbnNbaV0udG9MaXN0KCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgICAgIGVuY29kZWRDb2xFbnRyaWVzLnB1c2goe2VudHJpZXMsIG9wdGlvbnN9KTtcbiAgICAgICAgICAgICAgICBkaW1SZWRPcHRpb25zLmRpc3RhbmNlRm5BcmdzLnB1c2gob3B0aW9ucyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdldE5vcm1hbGl6ZWRFbWJlZGRpbmdzKGVuY29kZWRDb2xFbnRyaWVzLm1hcCgoaXQpID0+IGl0LmVudHJpZXMpLCBtZXRob2QsXG4gICAgICAgICAgICAgIG1ldHJpY3MsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCBkaW1SZWRPcHRpb25zLFxuICAgICAgICAgICAgICB1aU9wdGlvbnNbQllQQVNTX0xBUkdFX0RBVEFfV0FSTklOR10gPyB1bmRlZmluZWQgOiBwcm9ncmVzc0Z1bmMpO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBkaW1SZWRSZXNQcm9taXNlO1xuICAgICAgICBwZy5jbG9zZSgpO1xuICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdldERpbVJlZCgpO1xuXG4gICAgICBpZiAoY2x1c3RlckVtYmVkZGluZ3MgJiYgcmVzKSB7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJQZyA9IERHLlRhc2tCYXJQcm9ncmVzc0luZGljYXRvci5jcmVhdGUoYENsdXN0ZXJpbmcgZW1iZWRkaW5ncyAuLi5gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjbHVzdGVyUmVzID0gYXdhaXQgZ2V0RGJzY2FuV29ya2VyKHJlc1swXSwgcmVzWzFdLFxuICAgICAgICAgICAgZGltUmVkT3B0aW9ucy5kYlNjYW5FcHNpbG9uID8/IDAuMDEsIGRpbVJlZE9wdGlvbnMuZGJTY2FuTWluUHRzID8/IDQpO1xuICAgICAgICAgIGNvbnN0IGNsdXN0ZXJDb2xOYW1lID0gdGFibGUuY29sdW1ucy5nZXRVbnVzZWROYW1lKCdDbHVzdGVyIChEQlNDQU4pJyk7XG4gICAgICAgICAgY29uc3QgY2x1c3RlckNvbCA9IHRhYmxlLmNvbHVtbnMuYWRkTmV3U3RyaW5nKGNsdXN0ZXJDb2xOYW1lKTtcbiAgICAgICAgICBjbHVzdGVyQ29sLmluaXQoKGkpID0+IGNsdXN0ZXJSZXNbaV0udG9TdHJpbmcoKSk7XG4gICAgICAgICAgaWYgKHNjYXR0ZXJQbG90KVxuICAgICAgICAgICAgKHNjYXR0ZXJQbG90IGFzIERHLlNjYXR0ZXJQbG90Vmlld2VyKS5wcm9wcy5jb2xvckNvbHVtbk5hbWUgPSBjbHVzdGVyQ29sTmFtZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGdyb2suc2hlbGwuZXJyb3IoJ0NsdXN0ZXJpbmcgZW1iZWRkaW5ncyBmYWlsZWQnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGNsdXN0ZXJQZy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGNvbnN0IGVtYmVkWENvbCA9IHRhYmxlLmNvbHVtbnMuYnlOYW1lKGVtYmVkQ29sc05hbWVzWzBdKTtcbiAgICAgICAgY29uc3QgZW1iZWRZQ29sID0gdGFibGUuY29sdW1ucy5ieU5hbWUoZW1iZWRDb2xzTmFtZXNbMV0pO1xuICAgICAgICBlbWJlZFhDb2wuaW5pdCgoaSkgPT4gcmVzWzBdW2ldKTtcbiAgICAgICAgZW1iZWRZQ29sLmluaXQoKGkpID0+IHJlc1sxXVtpXSk7XG4gICAgICAgIGlmIChwb3N0UHJvY2Vzc2luZ0Z1bmMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29sMUlucHV0TmFtZSA9IHBvc3RQcm9jZXNzaW5nRnVuYy5pbnB1dHNbMF0ubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGNvbDJJbnB1dE5hbWUgPSBwb3N0UHJvY2Vzc2luZ0Z1bmMuaW5wdXRzWzFdLm5hbWU7XG4gICAgICAgICAgICBhd2FpdCBwb3N0UHJvY2Vzc2luZ0Z1bmNcbiAgICAgICAgICAgICAgLnByZXBhcmUoe1tjb2wxSW5wdXROYW1lXTogZW1iZWRYQ29sLCBbY29sMklucHV0TmFtZV06IGVtYmVkWUNvbCwgLi4ucG9zdFByb2NGdW5jQXJnc30pXG4gICAgICAgICAgICAgIC5jYWxsKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGdyb2suc2hlbGwuZXJyb3IoJ1Bvc3QtcHJvY2Vzc2luZyBmYWlsZWQnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzY2F0dGVyUGxvdCkge1xuICAgICAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcigoc2NhdHRlclBsb3QgYXMgREcuU2NhdHRlclBsb3RWaWV3ZXIpLnJvb3QsIGZhbHNlKTtcbiAgICAgICAgICAoc2NhdHRlclBsb3QgYXMgREcuU2NhdHRlclBsb3RWaWV3ZXIpLmhlbHBVcmwgPSAnL2hlbHAvY29tcHV0ZS9zZXF1ZW5jZS1zcGFjZSc7XG4gICAgICAgICAgcmV0dXJuIHNjYXR0ZXJQbG90IGFzIERHLlNjYXR0ZXJQbG90Vmlld2VyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZ3Jvay5zaGVsbC5lcnJvcignRGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIGZhaWxlZCcpO1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHBnLmNsb3NlKCk7XG4gICAgICBpZiAoc2NhdHRlclBsb3QpXG4gICAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcigoc2NhdHRlclBsb3QgYXMgREcuU2NhdHRlclBsb3RWaWV3ZXIpLnJvb3QsIGZhbHNlKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBuZXcgUHJvbWlzZTxERy5TY2F0dGVyUGxvdFZpZXdlciB8IHVuZGVmaW5lZD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAodWlPcHRpb25zLmZhc3RSb3dDb3VudCAmJiB0YWJsZS5yb3dDb3VudCA+IHVpT3B0aW9ucy5mYXN0Um93Q291bnQgJiYgIXVpT3B0aW9uc1tCWVBBU1NfTEFSR0VfREFUQV9XQVJOSU5HXSkge1xuICAgICAgICB1aS5kaWFsb2coKVxuICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnQW5hbHlzaXMgbWlnaHQgdGFrZSBzZXZlcmFsIG1pbnV0ZXMuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPycpKVxuICAgICAgICAgIC5vbk9LKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGRvUmVkdWNlKCk7XG4gICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uQ2FuY2VsKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSlcbiAgICAgICAgICAuc2hvdygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZG9SZWR1Y2UoKTtcbiAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChlKTtcbiAgICB9XG4gIH0pO1xufVxuIl19","/** Error & info messages */\nexport enum ERROR_MSG {\n NO_DATAFRAME = 'No dataframe is opened',\n NO_MISSING_VALUES = 'No missing values',\n ONE_AVAILABLE_FEATURE = 'Not enough of feature columns to apply imputation using the KNN method',\n ONE_FEATURE_SELECTED = 'Imputation cannot be applied to',\n UNSUPPORTED_COLUMN_TYPE = 'Unsupported column type',\n UNSUPPORTED_IMPUTATION_STRATEGY = 'Unsupported imputation strategy',\n KNN_CANNOT_BE_APPLIED = 'KNN imputer cannot be applied: no columns to be used as features',\n KNN_NO_TARGET_COLUMNS = 'KNN imputer cannot be applied: no columns with missing values',\n KNN_NO_FEATURE_COLUMNS = 'KNN imputer cannot be applied: no feature columns',\n KNN_NOT_ENOUGH_OF_ROWS = 'KNN imputer cannot be applied: not enough of rows',\n KNN_IMPOSSIBLE_IMPUTATION = 'Imputation is impossible, no features can be used',\n INCORRECT_NEIGHBORS = 'Incorrect number of neighbors',\n KNN_FAILS = 'KNN IMPUTATION FAILS',\n CORE_ISSUE = 'Core issue',\n FAILED_TO_IMPUTE = 'Failed to impute',\n UNSUPPORTED_FILL_VALUE_TYPE = 'Unsupported fill value type',\n EMPTY_COLUMN = 'Column contains just null values',\n FAILS_TO_PREDICT_IMPUTATION_FAILS = 'Failed to predict imputation fails',\n WRONG_PREDICTIONS = 'wrong evaluation of KNN imputation fails',\n};\n\n/** Suffix used for column copy */\nexport const COPY_SUFFIX = 'copy';\n\n/** UI titles */\nexport enum TITLE {\n KNN_IMPUTER = 'Impute',\n TABLE = 'Table',\n IN_PLACE = 'In-place',\n COLUMNS = 'Impute',\n FEATURES = 'Using',\n CANCEL = 'CANCEL',\n RUN = 'RUN',\n OK = 'OK',\n NEIGHBORS = 'Neighbors',\n DISTANCE = 'Distance',\n FILL = 'Fill',\n MARK = 'Mark',\n SIMPLE_IMPUTER = 'Simple impute',\n SETTINGS = 'Settings',\n KEEP_EMPTY = 'Keep empty',\n};\n\n/** Help links */\nexport const KNN_IMPUTER = '/help/transform/missing-values-imputation';\n\n/** Tooltips */ \nexport enum HINT {\n TARGET = 'Columns with missing values that must be filled',\n FEATURES = \"Columns with features to be used for determining the 'nearest' elements in the KNN method\",\n IN_PLACE = 'Defines whether to use in-place imputation or add a new column without missing values',\n METRIC = 'Type of metric between the feature values',\n WEIGHT = 'Weight',\n NEIGHBORS = 'Neighbors count used in the KNN method',\n DISTANCE = 'Type of distance between elements with the specified features',\n METRIC_SETTINGS = 'Show additional options',\n FILL_FAILED_ITEMS = 'Impute missing values using a simple approach: mean, median or most frequent',\n MARK_FAILED_ITEMS = 'Mark missing values cells with a color',\n FILL_VALUE = 'Fill value',\n IMPUTATION_SETTINGS = 'Simple imputation settings',\n KEEP_EMPTY = 'Defines whether to keep empty missing values failed to be imputed OR fill them using simple imputation',\n};\n","// Tools for missing values imputation using the k-nearest neighbors method\n\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {ERROR_MSG, COPY_SUFFIX} from './ui-constants';\n\n/** Column types supported by the missing values imputer */\nexport const SUPPORTED_COLUMN_TYPES = [\n DG.COLUMN_TYPE.INT,\n DG.COLUMN_TYPE.FLOAT,\n DG.COLUMN_TYPE.STRING,\n DG.COLUMN_TYPE.DATE_TIME,\n DG.COLUMN_TYPE.QNUM,\n] as string[];\n\n/** Return null value with respect to the column type */\nexport function getNullValue(col: DG.Column): number {\n switch (col.type) {\n case DG.COLUMN_TYPE.INT: \n return DG.INT_NULL;\n\n case DG.COLUMN_TYPE.FLOAT:\n return DG.FLOAT_NULL;\n \n case DG.COLUMN_TYPE.QNUM:\n return DG.FLOAT_NULL;\n\n case DG.COLUMN_TYPE.DATE_TIME:\n return DG.FLOAT_NULL;\n\n case DG.COLUMN_TYPE.STRING:\n return col.max;\n \n default:\n throw new Error(ERROR_MSG.UNSUPPORTED_COLUMN_TYPE);\n } \n}\n\n/** Metric types (between column elements) */\nexport enum METRIC_TYPE {\n ONE_HOT = 'One-hot',\n DIFFERENCE = 'Difference',\n};\n\n/** Distance types (over several columns). */\nexport enum DISTANCE_TYPE {\n EUCLIDEAN = 'Euclidean',\n MANHATTAN = 'Manhattan',\n};\n\n/** Metric specification. */\nexport type MetricInfo = {\n weight: number,\n type: METRIC_TYPE,\n};\n\n/** Default values */\nexport enum DEFAULT {\n WEIGHT = 1,\n NEIGHBORS = 4,\n IN_PLACE = 1,\n SELECTED = 1,\n KEEP_EMPTY = 0,\n};\n\n/** Min number of neighbors for KNN */\nexport const MIN_NEIGHBORS = 1;\n\n/** Dataframe item: index - number of row, dist - distance to the target element */\ntype Item = {\n index: number,\n dist: number,\n};\n\n/** Impute missing values using the KNN method and returns an array of items for which an imputation fails */\nexport function impute(df: DG.DataFrame, targetColNames: string[], featuresMetrics: Map<string, MetricInfo>,\n missingValsIndices: Map<string, number[]>, distance: DISTANCE_TYPE, neighbors: number, inPlace: boolean): Map<string, number[]>\n{\n // 1. Check inputs completness\n\n if (neighbors < MIN_NEIGHBORS)\n throw new Error(ERROR_MSG.INCORRECT_NEIGHBORS);\n\n if (df.rowCount < 2)\n throw new Error(ERROR_MSG.KNN_NOT_ENOUGH_OF_ROWS);\n\n if (targetColNames.length === 0)\n throw new Error(ERROR_MSG.KNN_NO_TARGET_COLUMNS);\n\n if (featuresMetrics.size === 0)\n throw new Error(ERROR_MSG.KNN_NO_FEATURE_COLUMNS);\n \n if (featuresMetrics.size === 1)\n targetColNames.forEach((name) => {\n if (featuresMetrics.has(name))\n throw new Error(`${ERROR_MSG.KNN_NO_FEATURE_COLUMNS} can be used for the column '${name}'`);\n });\n\n targetColNames.forEach((name) => {\n if (!missingValsIndices.has(name))\n throw new Error(`${ERROR_MSG.KNN_FAILS}: ${ERROR_MSG.WRONG_PREDICTIONS}`); \n });\n\n const columns = df.columns;\n\n // 2. Imputation\n\n targetColNames.forEach((name) => {\n if (!SUPPORTED_COLUMN_TYPES.includes(columns.byName(name).type))\n throw new Error(ERROR_MSG.UNSUPPORTED_COLUMN_TYPE);\n });\n\n featuresMetrics.forEach((val, name) => {\n if (!SUPPORTED_COLUMN_TYPES.includes(df.getCol(name).type))\n throw new Error(ERROR_MSG.UNSUPPORTED_COLUMN_TYPE);\n });\n\n /** Failed to impute items */\n const failedToImpute = new Map<string, number[]>();\n\n // 2. Missing values imputation in each target column\n targetColNames.forEach((name) => {\n const col = columns.byName(name);\n const nullValue = getNullValue(col);\n const len = col.length;\n const source = col.getRawData();\n const frequencies = new Uint16Array(col.categories.length);\n\n const featureSource = [] as Array<Int32Array | Uint32Array | Float32Array | Float64Array>;\n const featureNullVal = [] as number[];\n const metricFunc = [] as ((a: number, b: number) => number)[];\n\n const failedToImputeIndices = [] as number[];\n\n // create features tools\n featuresMetrics.forEach((metricInfo, name) => {\n if (name !== col.name) {\n const feature = columns.byName(name);\n featureSource.push(feature.getRawData());\n featureNullVal.push(getNullValue(feature));\n \n switch (metricInfo.type) {\n case METRIC_TYPE.DIFFERENCE:\n metricFunc.push((a: number, b: number) => metricInfo.weight * Math.abs(a - b)); \n break;\n\n case METRIC_TYPE.ONE_HOT:\n metricFunc.push((a: number, b: number) => metricInfo.weight * ((a === b) ? 0 : 1)); \n break;\n \n default:\n break;\n }\n }});\n \n const featuresCount = featureSource.length;\n const properIndices = new Uint32Array(featureSource.length);\n const bufferVector = new Float32Array(featureSource.length);\n let properIndicesCount = 0;\n\n // closest items\n const nearestItems = new Array<Item>(neighbors);\n let nearestItemsCount = 0;\n\n // auxiliry variables\n let maxInd = 0;\n let maxDist = 0;\n let sum = 0;\n let fillValue = 0;\n\n /** Obtain proper indices for KNN: features with missing vals are skipped */\n const getProperIndeces = (idx: number) => {\n properIndicesCount = 0;\n \n for (let i = 0; i < featuresCount; ++i)\n if (featureSource[i][idx] !== featureNullVal[i]) {\n properIndices[properIndicesCount] = i;\n ++properIndicesCount;\n }\n };\n\n /** Compute buffer vector */\n const computeBufferVector = (idx: number, cur: number) => {\n properIndices.forEach((properIndex, k) => {\n bufferVector[k] = metricFunc[properIndex](featureSource[properIndex][idx], featureSource[properIndex][cur]);\n })\n };\n\n /** Euclidean distance function */\n const euclideanDistFunc = () => {\n let sum = 0;\n\n for (let i = 0; i < properIndicesCount; ++i)\n sum +=bufferVector[i] * bufferVector[i];\n\n return Math.sqrt(sum);\n };\n\n /** Manhattan distance function */\n const manhattanDistFunc = () => {\n let sum = 0;\n \n for (let i = 0; i < properIndicesCount; ++i)\n sum += Math.abs(bufferVector[i]);\n \n return Math.sqrt(sum);\n };\n\n /** Return norm of the buffer vector (distance between i-th & j-th elements) */\n const dist = (distance === DISTANCE_TYPE.EUCLIDEAN) ? euclideanDistFunc : manhattanDistFunc;\n\n /** Check if the current item (i.e. table row) can be used */\n const canItemBeUsed = (cur: number) => {\n if (source[cur] === nullValue)\n return false;\n\n for (let i = 0; i < properIndicesCount; ++i) \n if (featureSource[properIndices[i]][cur] === featureNullVal[properIndices[i]])\n return false;\n\n return true;\n };\n\n /** Return the most frequent of the nearest items (for categorial data) */\n const mostFrequentOfTheNearestItems = () => {\n frequencies.forEach((v, i,arr) => arr[i] = 0);\n let i = 0;\n\n for (i = 0; i < nearestItemsCount; ++i)\n ++frequencies[source[nearestItems[i].index]];\n\n let maxFreq = frequencies[0];\n let maxFreqIdx = 0;\n \n frequencies.forEach((v, i) => {\n if (v > maxFreq) {\n maxFreq = v;\n maxFreqIdx = i;\n }\n });\n\n return maxFreqIdx;\n };\n\n /** Get imputation value */\n const getFillValue = (idx: number) => { \n getProperIndeces(idx);\n\n // check available features\n if (properIndicesCount === 0)\n throw new Error(`${ERROR_MSG.KNN_IMPOSSIBLE_IMPUTATION}: the column \"${col.name}\", row ${idx + 1}`);\n\n nearestItemsCount = 0;\n\n // search for the closest items\n for (let cur = 0; cur < len; ++cur)\n if (canItemBeUsed(cur) && (cur !== idx)) {\n // 1) compute distance between cur-th and idx-th items\n computeBufferVector(idx, cur);\n const curDist = dist();\n\n // 2) insert the current item\n if (nearestItemsCount < neighbors) {\n nearestItems[nearestItemsCount] = {index: cur, dist: curDist};\n ++nearestItemsCount;\n }\n else {\n // 2.1) find the farest\n maxInd = 0;\n maxDist = nearestItems[0].dist;\n\n for(let i = 1; i < nearestItemsCount; ++i)\n if (maxDist < nearestItems[i].dist) {\n maxDist = nearestItems[i].dist;\n maxInd = i;\n }\n \n // 2.2) replace\n if (curDist < maxDist)\n nearestItems[maxInd] = {index: cur, dist: curDist};\n } // else\n } // for cur\n \n // check found nearest items\n if (nearestItemsCount === 0)\n throw new Error(`${ERROR_MSG.KNN_IMPOSSIBLE_IMPUTATION}: the column \"${col.name}\", row ${idx + 1}`);\n\n if (col.type === DG.COLUMN_TYPE.STRING)\n return mostFrequentOfTheNearestItems();\n\n // compute fill value\n sum = 0;\n for (let i = 0; i < nearestItemsCount; ++i)\n sum += source[nearestItems[i].index]; \n\n fillValue = sum / nearestItemsCount;\n\n if (col.type === DG.COLUMN_TYPE.INT)\n return Math.round(fillValue);\n\n return fillValue; \n }; // getFillValue\n \n if (inPlace) {\n // use indices found previousely\n for (const i of missingValsIndices.get(name)!) \n try {\n source[i] = getFillValue(i);\n } catch (err) {\n failedToImputeIndices.push(i);\n \n if (!(err instanceof Error))\n grok.shell.error(ERROR_MSG.CORE_ISSUE);\n }\n \n if (failedToImputeIndices.length > 0)\n failedToImpute.set(name, failedToImputeIndices);\n\n // to reset view \n col.set(0, col.get(0));\n } // if\n else {\n //@ts-ignore\n const copy = col.clone();\n\n let i = 1;\n let copyName = `${name}(${COPY_SUFFIX})`;\n\n // find an appropriate name\n while (df.columns.contains(copyName)) {\n copyName = `${name}(${COPY_SUFFIX} ${i})`;\n ++i;\n }\n\n copy.name = copyName;\n \n const copySource = copy.getRawData();\n\n // use indices found previousely\n for (const i of missingValsIndices.get(name)!) \n try {\n copySource[i] = getFillValue(i);\n } catch (err) {\n failedToImputeIndices.push(i); \n \n if (!(err instanceof Error))\n grok.shell.error(ERROR_MSG.CORE_ISSUE);\n }\n\n if (failedToImputeIndices.length > 0)\n failedToImpute.set(copyName, failedToImputeIndices);\n\n copy.set(0, copy.get(0));\n\n df.columns.add(copy);\n } // else\n });\n\n return failedToImpute;\n} // impute\n\n/** Return indices of missing values for each column */\nexport function getMissingValsIndices(columns: DG.Column[]): Map<string, number[]> {\n const misValsInds = new Map<string, number[]>();\n\n for (const col of columns) {\n if (!SUPPORTED_COLUMN_TYPES.includes(col.type))\n throw new Error(ERROR_MSG.UNSUPPORTED_COLUMN_TYPE);\n\n if (col.stats.missingValueCount === 0)\n continue;\n\n const indices = [] as number[];\n const nullValue = getNullValue(col);\n \n col.getRawData().forEach((val, idx) => {\n if (val === nullValue)\n indices.push(idx);\n });\n\n misValsInds.set(col.name, indices);\n }\n\n return misValsInds;\n}\n\n/** Predict existence of missing values imputation fails */\nexport function areThereFails(targetColNames: string[], featureColNames: string[], misValsInds: Map<string, number[]>): boolean {\n // check feature columns\n for (const name of featureColNames)\n if (!misValsInds.has(name))\n return false;\n\n // check target columns\n for (const target of targetColNames) {\n const indices = misValsInds.get(target);\n\n if (indices === undefined)\n throw new Error(ERROR_MSG.FAILS_TO_PREDICT_IMPUTATION_FAILS);\n \n for (const idx of indices) {\n let failToImpute = true;\n\n for (const feature of featureColNames) {\n const featureInds = misValsInds.get(feature);\n\n if (featureInds === undefined)\n throw new Error(ERROR_MSG.FAILS_TO_PREDICT_IMPUTATION_FAILS);\n\n if (!featureInds.includes(idx)) {\n failToImpute = false;\n break;\n }\n }\n\n if (failToImpute)\n return true;\n }\n }\n\n return false;\n} // predictFails\n\n/** Returns first non-null value */\nfunction getFirstNonNull<T>(col: DG.Column<T>): T {\n const nullValue = getNullValue(col);\n const raw = col.getRawData();\n const len = raw.length;\n\n for (let i = 0; i < len; ++i)\n if (raw[i] !== nullValue)\n return col.get(i)!;\n\n throw new Error(ERROR_MSG.EMPTY_COLUMN); \n}\n\n/** Return default fill value with respect to the column type */\nfunction getDefaultFillValue<T>(col: DG.Column<T>): T {\n switch (col.type) {\n case DG.COLUMN_TYPE.STRING:\n case DG.COLUMN_TYPE.DATE_TIME:\n return getFirstNonNull(col); // TODO: replace by most frequent\n\n case DG.COLUMN_TYPE.INT:\n case DG.COLUMN_TYPE.FLOAT:\n case DG.COLUMN_TYPE.QNUM:\n return col.stats.avg as T;\n\n default:\n throw new Error(ERROR_MSG.UNSUPPORTED_COLUMN_TYPE);\n }\n}\n\n/** Perform missing values imputation using the simple approach */\nexport function imputeFailed(df: DG.DataFrame, failedToImpute: Map<string, number[]>): void {\n failedToImpute.forEach((indices, colName) => {\n const col = df.col(colName);\n if (col !== null) {\n if (!SUPPORTED_COLUMN_TYPES.includes(col.type))\n throw new Error(ERROR_MSG.UNSUPPORTED_COLUMN_TYPE); \n\n const fillVal = getDefaultFillValue(col);\n indices.forEach((idx) => col.set(idx, fillVal));\n }\n });\n}\n","/* eslint-disable max-len */\nimport * as DG from 'datagrok-api/dg';\nimport { Subject } from 'rxjs';\nimport BitArray from './bit-array';\nexport var ScatterPlotCurrentLineStyle;\n(function (ScatterPlotCurrentLineStyle) {\n ScatterPlotCurrentLineStyle[\"none\"] = \"none\";\n ScatterPlotCurrentLineStyle[\"bold\"] = \"bold\";\n ScatterPlotCurrentLineStyle[\"dashed\"] = \"dashed\";\n})(ScatterPlotCurrentLineStyle || (ScatterPlotCurrentLineStyle = {}));\nexport class ScatterPlotLinesRenderer {\n get currentLineId() {\n return this._currentLineIdx;\n }\n set currentLineId(id) {\n if (id !== this._currentLineIdx) {\n this._currentLineIdx = id;\n this.sp.render(this.ctx);\n }\n }\n set linesToRender(lines) {\n this.updateLines(lines);\n this.sp.render(this.ctx);\n }\n set linesVisibility(visibility) {\n this.visibility = visibility;\n this.sp.render(this.ctx);\n }\n constructor(sp, xAxis, yAxis, lines, currentLineStyle = ScatterPlotCurrentLineStyle.none) {\n var _a;\n this._currentLineIdx = -1;\n this.lineClicked = new Subject();\n this.lineHover = new Subject();\n this.mouseOverLineId = -1;\n this.arrowWidth = 15;\n this.sp = sp;\n this.xAxisCol = this.sp.dataFrame.columns.byName(xAxis);\n this.yAxisCol = this.sp.dataFrame.columns.byName(yAxis);\n this.canvas = this.sp.getInfo()['canvas'];\n this.ctx = this.canvas.getContext('2d');\n this.currentLineStyle = currentLineStyle;\n this.updateLines(lines);\n this.visibility = (_a = lines.visibility) !== null && _a !== void 0 ? _a : new BitArray(this.lines.from.length);\n if (!lines.visibility)\n this.visibility.setAll(true, false);\n if (lines.arrowSize)\n this.arrowWidth = lines.arrowSize;\n this.canvas.onmousedown = (event) => {\n if (this.mouseOverLineId !== -1)\n this.lineClicked.next({ x: event.clientX, y: event.clientY, id: this.mouseOverLineId, event: event });\n };\n this.canvas.onmousemove = (event) => {\n this.mouseOverLineId = this.checkCoordsOnLine(event.offsetX, event.offsetY);\n if (this.mouseOverLineId !== -1)\n this.lineHover.next({ x: event.clientX, y: event.clientY, id: this.mouseOverLineId, event: event });\n };\n sp.onEvent('d4-before-draw-scene')\n .subscribe((_) => {\n this.renderLines();\n });\n }\n updateLines(lines) {\n this.lines = lines;\n this.multipleLinesCounts = new Uint8Array(this.lines.from.length);\n if (!lines.skipMultiLineCalculation)\n this.createMultiLinesIndices();\n else\n this.multipleLinesCounts.fill(0);\n }\n renderLines() {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;\n const spLook = this.sp.getOptions().look;\n const individualLineStyles = this.lines.colors || this.lines.width || this.lines.opacities || this.lines.drawArrowsArr;\n if (!individualLineStyles) {\n this.ctx.lineWidth = (_a = this.lines.width) !== null && _a !== void 0 ? _a : 1;\n this.ctx.strokeStyle = `rgba(${(_b = this.lines.color) !== null && _b !== void 0 ? _b : '0,128,0'},${(_c = this.lines.opacity) !== null && _c !== void 0 ? _c : 1})`;\n }\n const markerSizeCol = spLook['sizeColumnName'] ? this.sp.dataFrame.col(spLook['sizeColumnName']) : null;\n const filter = this.sp.dataFrame.filter;\n for (let i = 0; i < this.lines.from.length; i++) {\n if (filter.get(this.lines.from[i]) && filter.get(this.lines.to[i]) && this.visibility.getBit(i)) {\n let lineLen = 0;\n const { sizeFrom, sizeTo } = this.getMarkersSizes(spLook, markerSizeCol, i);\n const pointFrom = this.sp.worldToScreen(this.xAxisCol.get(this.lines.from[i]), this.yAxisCol.get(this.lines.from[i]));\n let aX = pointFrom === null || pointFrom === void 0 ? void 0 : pointFrom.x;\n let aY = pointFrom === null || pointFrom === void 0 ? void 0 : pointFrom.y;\n const pointTo = this.sp.worldToScreen(this.xAxisCol.get(this.lines.to[i]), this.yAxisCol.get(this.lines.to[i]));\n let bX = pointTo === null || pointTo === void 0 ? void 0 : pointTo.x;\n let bY = pointTo === null || pointTo === void 0 ? void 0 : pointTo.y;\n const minAxis = Math.min(this.sp.viewBox.width, this.sp.viewBox.height);\n this.ctx.beginPath();\n if (aX && aY && bX && bY && Math.hypot(bX - aX, bY - aY) / minAxis > 0.01) {\n if (individualLineStyles) {\n const color = ((_d = this.lines.colors) === null || _d === void 0 ? void 0 : _d[i]) ? (_e = this.lines.colors) === null || _e === void 0 ? void 0 : _e[i] : '0,128,0';\n const opacity = ((_f = this.lines.opacities) === null || _f === void 0 ? void 0 : _f[i]) ? (_g = this.lines.opacities) === null || _g === void 0 ? void 0 : _g[i] : 1;\n this.ctx.strokeStyle = `rgba(${color},${opacity})`;\n this.ctx.lineWidth = ((_h = this.lines.widths) === null || _h === void 0 ? void 0 : _h[i]) ? (_j = this.lines.widths) === null || _j === void 0 ? void 0 : _j[i] : 1;\n }\n if (i === this._currentLineIdx)\n this.toggleCurrentLineStyle(true);\n const multiLines = this.multipleLinesCounts[i];\n let controlPoint = null;\n if (multiLines) {\n lineLen = this.getLineLength(aX, aY, bX, bY);\n const startPointWithMarker = this.getPointOnDistance(aX, aY, bX, bY, sizeTo, lineLen);\n const endtPointWithMarker = this.getPointOnDistance(bX, bY, aX, aY, sizeFrom, lineLen);\n aX = startPointWithMarker.x;\n aY = startPointWithMarker.y;\n bX = endtPointWithMarker.x;\n bY = endtPointWithMarker.y;\n controlPoint = this.lines.from[i] > this.lines.to[i] ?\n this.findControlPoint(multiLines, aX, aY, bX, bY, i) :\n this.findControlPoint(multiLines, bX, bY, aX, aY, i);\n this.ctx.moveTo(aX, aY);\n this.ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, bX, bY);\n }\n else {\n this.ctx.moveTo(aX, aY);\n this.ctx.lineTo(bX, bY);\n }\n if ((_k = this.lines.drawArrows) !== null && _k !== void 0 ? _k : (_l = this.lines.drawArrowsArr) === null || _l === void 0 ? void 0 : _l.getBit(i)) {\n if (!lineLen)\n lineLen = this.getLineLength(aX, aY, bX, bY);\n if (lineLen > this.arrowWidth) {\n const arrowPoint = !multiLines ? this.getPointOnDistance(aX, aY, bX, bY, sizeTo, lineLen) : null;\n const arrowCPX = multiLines ? controlPoint.x : aX;\n const arrowCPY = multiLines ? controlPoint.y : aY;\n this.canvasArrow(this.ctx, (_m = arrowPoint === null || arrowPoint === void 0 ? void 0 : arrowPoint.x) !== null && _m !== void 0 ? _m : aX, (_o = arrowPoint === null || arrowPoint === void 0 ? void 0 : arrowPoint.y) !== null && _o !== void 0 ? _o : aY, arrowCPX, arrowCPY);\n }\n }\n this.ctx.stroke();\n this.ctx.closePath();\n if (i === this._currentLineIdx)\n this.toggleCurrentLineStyle(false);\n }\n }\n }\n this.fillLeftBottomRect();\n }\n toggleCurrentLineStyle(flag) {\n switch (this.currentLineStyle) {\n case ScatterPlotCurrentLineStyle.bold: {\n flag ? this.ctx.lineWidth += 2 : this.ctx.lineWidth -= 2;\n break;\n }\n case ScatterPlotCurrentLineStyle.dashed: {\n flag ? this.ctx.setLineDash([5, 5]) : this.ctx.setLineDash([]);\n break;\n }\n default:\n return;\n }\n }\n getMarkersSizes(spLook, markerSizeCol, i) {\n let sizeFrom = 3;\n let sizeTo = 3;\n if (markerSizeCol) {\n sizeFrom = (spLook.markerMinSize + (spLook.markerMaxSize - spLook.markerMinSize) * markerSizeCol.scale(this.lines.from[i])) / 2;\n sizeTo = (spLook.markerMinSize + (spLook.markerMaxSize - spLook.markerMinSize) * markerSizeCol.scale(this.lines.to[i])) / 2;\n }\n else if (spLook.markerDefaultSize) {\n sizeFrom = spLook.markerDefaultSize / 2;\n sizeTo = spLook.markerDefaultSize / 2;\n }\n return { sizeFrom, sizeTo };\n }\n fillLeftBottomRect() {\n const rect = new Path2D();\n rect.rect(this.sp.yAxisBox.minX, this.sp.yAxisBox.maxY, this.sp.yAxisBox.width, this.sp.xAxisBox.height);\n this.ctx.fillStyle = `white`;\n this.ctx.beginPath();\n this.ctx.fill(rect);\n this.ctx.closePath();\n }\n createMultiLinesIndices() {\n const arrayIdxsBitArray = new BitArray(this.lines.from.length);\n arrayIdxsBitArray.setAll(true);\n for (let i = -1; (i = arrayIdxsBitArray.findNext(i)) !== -1;) {\n const firstLineIdx = i;\n const p1 = this.lines.from[firstLineIdx];\n const p2 = this.lines.to[firstLineIdx];\n let linesPerPair = 1;\n for (let j = i; (j = arrayIdxsBitArray.findNext(j)) !== -1;) {\n const pointToCompare1 = this.lines.from[j];\n const pointToCompare2 = this.lines.to[j];\n if (pointToCompare1 === p1 && pointToCompare2 === p2 ||\n pointToCompare2 === p1 && pointToCompare1 === p2) {\n this.multipleLinesCounts[j] = ++linesPerPair;\n arrayIdxsBitArray.setBit(j, false, false);\n }\n }\n if (linesPerPair > 1)\n this.multipleLinesCounts[firstLineIdx] = 1;\n arrayIdxsBitArray.setBit(i, false, false);\n }\n }\n checkCoordsOnLine(x, y) {\n let candidateIdx = -1;\n let minDist = null;\n let dist = null;\n const spLook = this.sp.getOptions().look;\n const markerSizeCol = spLook['sizeColumnName'] ? this.sp.dataFrame.col(spLook['sizeColumnName']) : null;\n const filter = this.sp.dataFrame.filter;\n for (let i = 0; i < this.lines.from.length; i++) {\n if (filter.get(this.lines.from[i]) && filter.get(this.lines.to[i]) && this.visibility.getBit(i)) {\n const { sizeFrom, sizeTo } = this.getMarkersSizes(spLook, markerSizeCol, i);\n const pFrom = this.sp.worldToScreen(this.xAxisCol.get(this.lines.from[i]), this.yAxisCol.get(this.lines.from[i]));\n const pTo = this.sp.worldToScreen(this.xAxisCol.get(this.lines.to[i]), this.yAxisCol.get(this.lines.to[i]));\n if (this.multipleLinesCounts[i]) {\n const len = this.getLineLength(pFrom.x, pFrom.y, pTo.x, pTo.y);\n const fromMarker = this.getPointOnDistance(pFrom.x, pFrom.y, pTo.x, pTo.y, sizeTo, len);\n const toMarker = this.getPointOnDistance(pTo.x, pTo.y, pFrom === null || pFrom === void 0 ? void 0 : pFrom.x, pFrom === null || pFrom === void 0 ? void 0 : pFrom.y, sizeFrom, len);\n const controlPoint = this.lines.from[i] > this.lines.to[i] ?\n this.findControlPoint(this.multipleLinesCounts[i], fromMarker.x, fromMarker.y, toMarker.x, toMarker.y, i) :\n this.findControlPoint(this.multipleLinesCounts[i], toMarker.x, toMarker.y, fromMarker.x, fromMarker.y, i);\n dist = this.calculateDistToCurveLine(i, x, y, fromMarker, toMarker, controlPoint);\n }\n else {\n dist = this.calculateDistToStraightLine(x, y, pFrom, pTo);\n }\n if ((!minDist && dist !== null && dist < 5) || minDist && dist !== null && dist < minDist) {\n minDist = dist;\n candidateIdx = i;\n }\n }\n }\n return candidateIdx;\n }\n calculateDistToStraightLine(x, y, p1, p2) {\n /* calculating coordinates of a rect around a line. If cursor coords are outside this rect - assume that\n point is not on line and do not calculate distance to line */\n const xMin = Math.min(p1.x, p2.x);\n const xMax = Math.max(p1.x, p2.x);\n const yMin = Math.min(p1.y, p2.y);\n const yMax = Math.max(p1.y, p2.y);\n //adding a couple of pixels to increase the width/height of the rect\n const threshold = 2;\n return x >= xMin - threshold && x <= xMax + threshold && y >= yMin - threshold && y <= yMax + threshold ?\n this.distToStraightLineSegment(x, y, p1, p2) :\n null;\n }\n distToStraightLineSegment(x, y, p1, p2) {\n const dist = (x1, y1, x2, y2) => Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2);\n const l = dist(p1.x, p1.y, p2.x, p2.y);\n if (l == 0)\n return dist(x, y, p1.x, p1.y);\n let t = ((x - p1.x) * (p2.x - p1.x) + (y - p1.y) * (p2.y - p1.y)) / l;\n t = Math.max(0, Math.min(1, t));\n return dist(x, y, p1.x + t * (p2.x - p1.x), p1.y + t * (p2.y - p1.y));\n }\n calculateDistToCurveLine(i, x, y, p1, p2, pc) {\n /* calculating coordinates of a rect around a line. If cursor coords are outside this shape - assume that\n point is not on line and do not calculate distance to line */\n const xMin = Math.min(p1.x, p2.x, pc.x);\n const xMax = Math.max(p1.x, p2.x, pc.x);\n const yMin = Math.min(p1.y, p2.y, pc.y);\n const yMax = Math.max(p1.y, p2.y, pc.y);\n //adding a couple of pixels to increase the width/height of the rect\n const threshold = 2;\n if (x >= xMin - threshold && x <= xMax + threshold && y >= yMin - threshold && y <= yMax + threshold) {\n const w = xMax - xMin;\n const h = yMax - yMin;\n return this.calculateDistToCurveInRect(x, y, p1, pc, p2, w, h);\n }\n return null;\n }\n calculateDistToCurveInRect(x, y, p0, p1, p2, w, h) {\n const stepLen = 3;\n const stepsNum = Math.floor((w + h) / stepLen);\n const deltaT = 1 / stepsNum;\n const arrX = new Uint32Array(stepsNum);\n const arrY = new Uint32Array(stepsNum);\n const maxHW = new Uint32Array(stepsNum);\n let minSumHW = null;\n const candidateIdxs = new BitArray(stepsNum);\n for (let i = 0; i < arrX.length; i++) {\n const t = i * deltaT;\n const xOnCurve = Math.pow((1 - t), 2) * p0.x + 2 * t * (1 - t) * p1.x + Math.pow(t, 2) * p2.x;\n const yOnCurve = Math.pow((1 - t), 2) * p0.y + 2 * t * (1 - t) * p1.y + Math.pow(t, 2) * p2.y;\n const rectW = Math.abs(x - xOnCurve);\n const rectH = Math.abs(y - yOnCurve);\n const sumHW = rectW + rectH;\n if (!minSumHW || minSumHW > sumHW)\n minSumHW = sumHW;\n maxHW[i] = Math.max(rectW, rectH);\n arrX[i] = xOnCurve;\n arrY[i] = yOnCurve;\n }\n for (let i = 0; i < arrX.length; i++) {\n if (maxHW[i] < minSumHW)\n candidateIdxs.setBit(i, true, false);\n }\n let minDist = null;\n for (let j = -1; (j = candidateIdxs.findNext(j)) !== -1;) {\n const dist = Math.hypot((arrX[j] - x), (arrY[j] - y));\n if (!minDist || minDist > dist)\n minDist = dist;\n }\n return minDist;\n }\n getLineLength(p1x, p1y, p2x, p2y) {\n return Math.sqrt(Math.pow(p2x - p1x, 2) + Math.pow(p2y - p1y, 2));\n }\n getPointOnDistance(p1x, p1y, p2x, p2y, distance, length) {\n const dx = (p2x - p1x) / length;\n const dy = (p2y - p1y) / length;\n const p3x = p2x - distance * dx;\n const p3y = p2y - distance * dy;\n return new DG.Point(p3x, p3y);\n }\n findControlPoint(idx, x1, y1, x2, y2, i) {\n const midX = x1 + (x2 - x1) / 2;\n const midY = y1 + (y2 - y1) / 2;\n let dx = midX - x1;\n let dy = midY - y1;\n const dist = Math.sqrt(dx * dx + dy * dy);\n dx /= dist;\n dy /= dist;\n const perpendicularLen = 50 * Math.ceil(idx / 2);\n return idx % 2 === 0 ?\n new DG.Point(midX + (perpendicularLen / 2) * dy, midY - (perpendicularLen / 2) * dx) :\n new DG.Point(midX - (perpendicularLen / 2) * dy, midY + (perpendicularLen / 2) * dx);\n }\n canvasArrow(path, arrowEndX, arrowEndY, quadX, quadY) {\n const arrowAngle = Math.atan2(quadX - arrowEndX, quadY - arrowEndY) + Math.PI;\n path.moveTo(arrowEndX - (this.arrowWidth * Math.sin(arrowAngle - Math.PI / 10)), arrowEndY - (this.arrowWidth * Math.cos(arrowAngle - Math.PI / 10)));\n path.lineTo(arrowEndX, arrowEndY);\n path.lineTo(arrowEndX - (this.arrowWidth * Math.sin(arrowAngle + Math.PI / 10)), arrowEndY - (this.arrowWidth * Math.cos(arrowAngle + Math.PI / 10)));\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWxpbmVzLW9uLXNwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVuZGVyLWxpbmVzLW9uLXNwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxRQUFRLE1BQU0sYUFBYSxDQUFDO0FBRW5DLE1BQU0sQ0FBTixJQUFZLDJCQUlYO0FBSkQsV0FBWSwyQkFBMkI7SUFDbkMsNENBQWEsQ0FBQTtJQUNiLDRDQUFhLENBQUE7SUFDYixnREFBaUIsQ0FBQTtBQUNyQixDQUFDLEVBSlcsMkJBQTJCLEtBQTNCLDJCQUEyQixRQUl0QztBQThCRCxNQUFNLE9BQU8sd0JBQXdCO0lBZ0JuQyxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksYUFBYSxDQUFDLEVBQVU7UUFDMUIsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQsSUFBSSxhQUFhLENBQUMsS0FBa0I7UUFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksZUFBZSxDQUFDLFVBQW9CO1FBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJ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LFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQzdFLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgQml0QXJyYXkgZnJvbSAnLi9iaXQtYXJyYXknO1xuXG5leHBvcnQgZW51bSBTY2F0dGVyUGxvdEN1cnJlbnRMaW5lU3R5bGUge1xuICAgIG5vbmUgPSAnbm9uZScsXG4gICAgYm9sZCA9ICdib2xkJyxcbiAgICBkYXNoZWQgPSAnZGFzaGVkJ1xufVxuXG50eXBlIE1hcmtlclNpemUgPSB7XG4gICAgc2l6ZUZyb206IG51bWJlcixcbiAgICBzaXplVG86IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBNb3VzZU92ZXJMaW5lRXZlbnQgPSB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICBpZDogbnVtYmVyO1xuICAgIGV2ZW50OiBNb3VzZUV2ZW50XG59XG5cbmV4cG9ydCB0eXBlIElMaW5lU2VyaWVzID0ge1xuICAgIGZyb206IFVpbnQzMkFycmF5O1xuICAgIHRvOiBVaW50MzJBcnJheTtcbiAgICBjb2xvcj86IHN0cmluZzsgLy8gY29tbW9uIGNvbG9yLiBVc2UgW2NvbG9yc10gaWYgeW91IG5lZWQgaW5kaXZpZHVhbCBjb2xvcnMgcGVyIGxpbmVcbiAgICBjb2xvcnM/OiBzdHJpbmdbXTsgLy8gbGluZSBjb2xvcnMuIElmIHRoZXkgYXJlIHRoZSBzYW1lIGZvciB0aGUgc2VyaWVzLCB1c2UgW2NvbG9yXSBpbnN0ZWFkLlxuICAgIHdpZHRoPzogbnVtYmVyOyAvLyBjb21tb24gd2lkdGguIFVzZSBbY29sb3JzXSBpZiB5b3UgbmVlZCBpbmRpdmlkdWFsIHdpZHRocyBwZXIgbGluZVxuICAgIHdpZHRocz86IEZsb2F0MzJBcnJheTsgLy8gbGluZSB3aWR0aHMuIElmIHRoZXkgYXJlIHRoZSBzYW1lIGZvciB0aGUgc2VyaWVzLCB1c2UgW3dpZHRoXSBpbnN0ZWFkLlxuICAgIG9wYWNpdHk/OiBudW1iZXI7IC8vIGNvbW1vbiBvcGFjaXR5LiBVc2UgW29wYWNpdGllc10gaWYgeW91IG5lZWQgaW5kaXZpZHVhbCBvcGFjaXRpZXMgcGVyIGxpbmVcbiAgICBvcGFjaXRpZXM/OiBGbG9hdDMyQXJyYXk7IC8vIGxpbmUgb3BhY2l0aWVzLiBJZiB0aGV5IGFyZSB0aGUgc2FtZSBmb3IgdGhlIHNlcmllcywgdXNlIFtvcGFjaXR5XSBpbnN0ZWFkXG4gICAgZHJhd0Fycm93cz86IGJvb2xlYW47IC8vIGNvbW1vbiBwYXJhbWV0ZXIgdG8gZHJhdyBhcnJvd3MuIFVzZSBbZHJhd0Fycm93c0Fycl0gaWYgeW91IG5lZWQgdG8gZHJhdyBhcnJvd3Mgbm90IGZvciBlYWNoIGxpbmVcbiAgICBkcmF3QXJyb3dzQXJyPzogQml0QXJyYXk7IC8vIGluZGl2aWR1YWwgcGFyYW1ldGVyIGZvciBlYWNoIGxpbmUuIElmIHRoZXkgYXJlIHRoZSBzYW1lIGZvciB0aGUgc2VyaWVzLCB1c2UgW2RyYXdBcnJvd3NdIGluc3RlYWRcbiAgICB2aXNpYmlsaXR5PzogQml0QXJyYXk7IC8vIGluZGl2aWR1YWwgcGFyYW1ldGVyIGZvciBlYWNoIGxpbmUuIFNldCBiaXQgdG8gZmFsc2UgdG8gaGlkZSB0aGUgbGluZVxuICAgIGFycm93U2l6ZT86IG51bWJlcjsgLy8gY29tbW9uIGZvciBhbGwgYXJyb3dzXG4gICAgc2tpcE11bHRpTGluZUNhbGN1bGF0aW9uPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNjYXR0ZXJQbG90TGluZXNSZW5kZXJlciB7XG4gIHNwOiBERy5TY2F0dGVyUGxvdFZpZXdlcjtcbiAgeEF4aXNDb2w6IERHLkNvbHVtbjtcbiAgeUF4aXNDb2w6IERHLkNvbHVtbjtcbiAgX2N1cnJlbnRMaW5lSWR4ID0gLTE7XG4gIGxpbmVzITogSUxpbmVTZXJpZXM7XG4gIGxpbmVDbGlja2VkID0gbmV3IFN1YmplY3Q8TW91c2VPdmVyTGluZUV2ZW50PigpO1xuICBsaW5lSG92ZXIgPSBuZXcgU3ViamVjdDxNb3VzZU92ZXJMaW5lRXZlbnQ+KCk7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICBtb3VzZU92ZXJMaW5lSWQgPSAtMTtcbiAgbXVsdGlwbGVMaW5lc0NvdW50cyE6IFVpbnQ4QXJyYXk7XG4gIHZpc2liaWxpdHk6IEJpdEFycmF5O1xuICBjdXJyZW50TGluZVN0eWxlOiBTY2F0dGVyUGxvdEN1cnJlbnRMaW5lU3R5bGU7XG4gIGFycm93V2lkdGggPSAxNTtcblxuICBnZXQgY3VycmVudExpbmVJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50TGluZUlkeDtcbiAgfVxuXG4gIHNldCBjdXJyZW50TGluZUlkKGlkOiBudW1iZXIpIHtcbiAgICBpZiAoaWQgIT09IHRoaXMuX2N1cnJlbnRMaW5lSWR4KSB7XG4gICAgICB0aGlzLl9jdXJyZW50TGluZUlkeCA9IGlkO1xuICAgICAgdGhpcy5zcC5yZW5kZXIodGhpcy5jdHgpO1xuICAgIH1cbiAgfVxuXG4gIHNldCBsaW5lc1RvUmVuZGVyKGxpbmVzOiBJTGluZVNlcmllcykge1xuICAgIHRoaXMudXBkYXRlTGluZXMobGluZXMpO1xuICAgIHRoaXMuc3AucmVuZGVyKHRoaXMuY3R4KTtcbiAgfVxuXG4gIHNldCBsaW5lc1Zpc2liaWxpdHkodmlzaWJpbGl0eTogQml0QXJyYXkpIHtcbiAgICB0aGlzLnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5O1xuICAgIHRoaXMuc3AucmVuZGVyKHRoaXMuY3R4KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNwOiBERy5TY2F0dGVyUGxvdFZpZXdlciwgeEF4aXM6IHN0cmluZywgeUF4aXM6IHN0cmluZywgbGluZXM6IElMaW5lU2VyaWVzLFxuICAgIGN1cnJlbnRMaW5lU3R5bGUgPSBTY2F0dGVyUGxvdEN1cnJlbnRMaW5lU3R5bGUubm9uZSkge1xuICAgIHRoaXMuc3AgPSBzcDtcbiAgICB0aGlzLnhBeGlzQ29sID0gdGhpcy5zcC5kYXRhRnJhbWUhLmNvbHVtbnMuYnlOYW1lKHhBeGlzKTtcbiAgICB0aGlzLnlBeGlzQ29sID0gdGhpcy5zcC5kYXRhRnJhbWUhLmNvbHVtbnMuYnlOYW1lKHlBeGlzKTtcbiAgICB0aGlzLmNhbnZhcyA9IHRoaXMuc3AuZ2V0SW5mbygpWydjYW52YXMnXTtcbiAgICB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJykgYXMgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgIHRoaXMuY3VycmVudExpbmVTdHlsZSA9IGN1cnJlbnRMaW5lU3R5bGU7XG4gICAgdGhpcy51cGRhdGVMaW5lcyhsaW5lcyk7XG4gICAgdGhpcy52aXNpYmlsaXR5ID0gbGluZXMudmlzaWJpbGl0eSA/PyBuZXcgQml0QXJyYXkodGhpcy5saW5lcy5mcm9tLmxlbmd0aCk7XG4gICAgaWYgKCFsaW5lcy52aXNpYmlsaXR5KVxuICAgICAgdGhpcy52aXNpYmlsaXR5LnNldEFsbCh0cnVlLCBmYWxzZSk7XG4gICAgaWYgKGxpbmVzLmFycm93U2l6ZSlcbiAgICAgIHRoaXMuYXJyb3dXaWR0aCA9IGxpbmVzLmFycm93U2l6ZTtcblxuICAgIHRoaXMuY2FudmFzLm9ubW91c2Vkb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5tb3VzZU92ZXJMaW5lSWQgIT09IC0xKVxuICAgICAgICB0aGlzLmxpbmVDbGlja2VkLm5leHQoe3g6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFksIGlkOiB0aGlzLm1vdXNlT3ZlckxpbmVJZCwgZXZlbnQ6IGV2ZW50fSk7XG4gICAgfTtcblxuICAgIHRoaXMuY2FudmFzLm9ubW91c2Vtb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm1vdXNlT3ZlckxpbmVJZCA9IHRoaXMuY2hlY2tDb29yZHNPbkxpbmUoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG4gICAgICBpZiAodGhpcy5tb3VzZU92ZXJMaW5lSWQgIT09IC0xKVxuICAgICAgICB0aGlzLmxpbmVIb3Zlci5uZXh0KHt4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZLCBpZDogdGhpcy5tb3VzZU92ZXJMaW5lSWQsIGV2ZW50OiBldmVudH0pO1xuICAgIH07XG5cbiAgICBzcC5vbkV2ZW50KCdkNC1iZWZvcmUtZHJhdy1zY2VuZScpXG4gICAgICAuc3Vic2NyaWJlKChfOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJMaW5lcygpO1xuICAgICAgfSk7XG4gIH1cblxuICB1cGRhdGVMaW5lcyhsaW5lczogSUxpbmVTZXJpZXMpIHtcbiAgICB0aGlzLmxpbmVzID0gbGluZXM7XG4gICAgdGhpcy5tdWx0aXBsZUxpbmVzQ291bnRzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5saW5lcy5mcm9tLmxlbmd0aCk7XG4gICAgaWYgKCFsaW5lcy5za2lwTXVsdGlMaW5lQ2FsY3VsYXRpb24pXG4gICAgICB0aGlzLmNyZWF0ZU11bHRpTGluZXNJbmRpY2VzKCk7XG4gICAgZWxzZVxuICAgICAgdGhpcy5tdWx0aXBsZUxpbmVzQ291bnRzLmZpbGwoMCk7XG4gIH1cblxuICByZW5kZXJMaW5lcygpOiB2b2lkIHtcbiAgICBjb25zdCBzcExvb2sgPSB0aGlzLnNwLmdldE9wdGlvbnMoKS5sb29rO1xuICAgIGNvbnN0IGluZGl2aWR1YWxMaW5lU3R5bGVzID0gdGhpcy5saW5lcy5jb2xvcnMgfHwgdGhpcy5saW5lcy53aWR0aCB8fCB0aGlzLmxpbmVzLm9wYWNpdGllcyB8fCB0aGlzLmxpbmVzLmRyYXdBcnJvd3NBcnI7XG4gICAgaWYgKCFpbmRpdmlkdWFsTGluZVN0eWxlcykge1xuICAgICAgdGhpcy5jdHgubGluZVdpZHRoID0gdGhpcy5saW5lcy53aWR0aCA/PyAxO1xuICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBgcmdiYSgke3RoaXMubGluZXMuY29sb3IgPz8gJzAsMTI4LDAnfSwke3RoaXMubGluZXMub3BhY2l0eSA/PyAxfSlgO1xuICAgIH1cbiAgICBjb25zdCBtYXJrZXJTaXplQ29sID0gc3BMb29rWydzaXplQ29sdW1uTmFtZSddID8gdGhpcy5zcC5kYXRhRnJhbWUuY29sKHNwTG9va1snc2l6ZUNvbHVtbk5hbWUnXSkgOiBudWxsO1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuc3AuZGF0YUZyYW1lLmZpbHRlcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMuZnJvbS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGZpbHRlci5nZXQodGhpcy5saW5lcy5mcm9tW2ldKSAmJiBmaWx0ZXIuZ2V0KHRoaXMubGluZXMudG9baV0pICYmIHRoaXMudmlzaWJpbGl0eS5nZXRCaXQoaSkpIHtcbiAgICAgICAgbGV0IGxpbmVMZW4gPSAwO1xuICAgICAgICBjb25zdCB7c2l6ZUZyb20sIHNpemVUb30gPSB0aGlzLmdldE1hcmtlcnNTaXplcyhzcExvb2ssIG1hcmtlclNpemVDb2wsIGkpO1xuICAgICAgICBjb25zdCBwb2ludEZyb20gPSB0aGlzLnNwLndvcmxkVG9TY3JlZW4odGhpcy54QXhpc0NvbC5nZXQodGhpcy5saW5lcy5mcm9tW2ldKSwgdGhpcy55QXhpc0NvbC5nZXQodGhpcy5saW5lcy5mcm9tW2ldKSk7XG4gICAgICAgIGxldCBhWCA9IHBvaW50RnJvbT8ueDtcbiAgICAgICAgbGV0IGFZID0gcG9pbnRGcm9tPy55O1xuICAgICAgICBjb25zdCBwb2ludFRvID0gdGhpcy5zcC53b3JsZFRvU2NyZWVuKHRoaXMueEF4aXNDb2wuZ2V0KHRoaXMubGluZXMudG9baV0pLCB0aGlzLnlBeGlzQ29sLmdldCh0aGlzLmxpbmVzLnRvW2ldKSk7XG4gICAgICAgIGxldCBiWCA9IHBvaW50VG8/Lng7XG4gICAgICAgIGxldCBiWSA9IHBvaW50VG8/Lnk7XG4gICAgICAgIGNvbnN0IG1pbkF4aXMgPSBNYXRoLm1pbih0aGlzLnNwLnZpZXdCb3gud2lkdGgsIHRoaXMuc3Audmlld0JveC5oZWlnaHQpO1xuICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgaWYgKGFYICYmIGFZICYmIGJYICYmIGJZICYmIE1hdGguaHlwb3QoYlghIC0gYVghLCBiWSEgLSBhWSEpIC8gbWluQXhpcyA+IDAuMDEpIHtcbiAgICAgICAgICBpZiAoaW5kaXZpZHVhbExpbmVTdHlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy5saW5lcy5jb2xvcnM/LltpXSA/IHRoaXMubGluZXMuY29sb3JzPy5baV0gOiAnMCwxMjgsMCc7XG4gICAgICAgICAgICBjb25zdCBvcGFjaXR5ID0gdGhpcy5saW5lcy5vcGFjaXRpZXM/LltpXSA/IHRoaXMubGluZXMub3BhY2l0aWVzPy5baV0gOiAxO1xuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBgcmdiYSgke2NvbG9yfSwke29wYWNpdHl9KWA7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lV2lkdGggPSB0aGlzLmxpbmVzLndpZHRocz8uW2ldID8gdGhpcy5saW5lcy53aWR0aHM/LltpXSA6IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpID09PSB0aGlzLl9jdXJyZW50TGluZUlkeClcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ3VycmVudExpbmVTdHlsZSh0cnVlKTtcbiAgICAgICAgICBjb25zdCBtdWx0aUxpbmVzID0gdGhpcy5tdWx0aXBsZUxpbmVzQ291bnRzW2ldO1xuICAgICAgICAgIGxldCBjb250cm9sUG9pbnQ6IERHLlBvaW50IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgaWYgKG11bHRpTGluZXMpIHtcbiAgICAgICAgICAgIGxpbmVMZW4gPSB0aGlzLmdldExpbmVMZW5ndGgoYVgsIGFZLCBiWCwgYlkpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRQb2ludFdpdGhNYXJrZXIgPSB0aGlzLmdldFBvaW50T25EaXN0YW5jZShhWCwgYVksIGJYLCBiWSwgc2l6ZVRvLCBsaW5lTGVuKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZHRQb2ludFdpdGhNYXJrZXIgPSB0aGlzLmdldFBvaW50T25EaXN0YW5jZShiWCwgYlksIGFYLCBhWSwgc2l6ZUZyb20sIGxpbmVMZW4pO1xuICAgICAgICAgICAgYVggPSBzdGFydFBvaW50V2l0aE1hcmtlci54O1xuICAgICAgICAgICAgYVkgPSBzdGFydFBvaW50V2l0aE1hcmtlci55O1xuICAgICAgICAgICAgYlggPSBlbmR0UG9pbnRXaXRoTWFya2VyLng7XG4gICAgICAgICAgICBiWSA9IGVuZHRQb2ludFdpdGhNYXJrZXIueTtcbiAgICAgICAgICAgIGNvbnRyb2xQb2ludCA9IHRoaXMubGluZXMuZnJvbVtpXSA+IHRoaXMubGluZXMudG9baV0gP1xuICAgICAgICAgICAgICB0aGlzLmZpbmRDb250cm9sUG9pbnQobXVsdGlMaW5lcywgYVgsIGFZLCBiWCwgYlksIGkpIDpcbiAgICAgICAgICAgICAgdGhpcy5maW5kQ29udHJvbFBvaW50KG11bHRpTGluZXMsIGJYLCBiWSwgYVgsIGFZLCBpKTtcbiAgICAgICAgICAgIHRoaXMuY3R4Lm1vdmVUbyhhWCEsIGFZISk7XG4gICAgICAgICAgICB0aGlzLmN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgYlgsIGJZKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKGFYISwgYVkhKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmxpbmVUbyhiWCwgYlkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5saW5lcy5kcmF3QXJyb3dzID8/IHRoaXMubGluZXMuZHJhd0Fycm93c0Fycj8uZ2V0Qml0KGkpKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmVMZW4pXG4gICAgICAgICAgICAgIGxpbmVMZW4gPSB0aGlzLmdldExpbmVMZW5ndGgoYVgsIGFZLCBiWCwgYlkpO1xuICAgICAgICAgICAgaWYgKGxpbmVMZW4gPiB0aGlzLmFycm93V2lkdGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgYXJyb3dQb2ludCA9ICFtdWx0aUxpbmVzID8gdGhpcy5nZXRQb2ludE9uRGlzdGFuY2UoYVgsIGFZLCBiWCwgYlksIHNpemVUbywgbGluZUxlbikgOiBudWxsO1xuICAgICAgICAgICAgICBjb25zdCBhcnJvd0NQWCA9IG11bHRpTGluZXMgPyBjb250cm9sUG9pbnQhLnggOiBhWDtcbiAgICAgICAgICAgICAgY29uc3QgYXJyb3dDUFkgPSBtdWx0aUxpbmVzID8gY29udHJvbFBvaW50IS55IDogYVk7XG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzQXJyb3codGhpcy5jdHgsIGFycm93UG9pbnQ/LnggPz8gYVgsIGFycm93UG9pbnQ/LnkgPz8gYVksIGFycm93Q1BYLCBhcnJvd0NQWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuICAgICAgICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgIGlmIChpID09PSB0aGlzLl9jdXJyZW50TGluZUlkeClcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ3VycmVudExpbmVTdHlsZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5maWxsTGVmdEJvdHRvbVJlY3QoKTtcbiAgfVxuXG4gIHRvZ2dsZUN1cnJlbnRMaW5lU3R5bGUoZmxhZzogYm9vbGVhbikge1xuICAgIHN3aXRjaCAodGhpcy5jdXJyZW50TGluZVN0eWxlKSB7XG4gICAgICBjYXNlIFNjYXR0ZXJQbG90Q3VycmVudExpbmVTdHlsZS5ib2xkOiB7XG4gICAgICAgIGZsYWcgPyB0aGlzLmN0eC5saW5lV2lkdGggKz0gMiA6IHRoaXMuY3R4LmxpbmVXaWR0aCAtPSAyO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2NhdHRlclBsb3RDdXJyZW50TGluZVN0eWxlLmRhc2hlZDoge1xuICAgICAgICBmbGFnID8gdGhpcy5jdHguc2V0TGluZURhc2goWzUsIDVdKSA6IHRoaXMuY3R4LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgZ2V0TWFya2Vyc1NpemVzKHNwTG9vazogYW55LCBtYXJrZXJTaXplQ29sOiBERy5Db2x1bW4gfCBudWxsLCBpOiBudW1iZXIpOiBNYXJrZXJTaXplIHtcbiAgICBsZXQgc2l6ZUZyb20gPSAzO1xuICAgIGxldCBzaXplVG8gPSAzO1xuICAgIGlmIChtYXJrZXJTaXplQ29sKSB7XG4gICAgICBzaXplRnJvbSA9IChzcExvb2subWFya2VyTWluU2l6ZSArIChzcExvb2subWFya2VyTWF4U2l6ZSAtIHNwTG9vay5tYXJrZXJNaW5TaXplKSAqIG1hcmtlclNpemVDb2wuc2NhbGUodGhpcy5saW5lcy5mcm9tW2ldKSkgLyAyO1xuICAgICAgc2l6ZVRvID0gKHNwTG9vay5tYXJrZXJNaW5TaXplICsgKHNwTG9vay5tYXJrZXJNYXhTaXplIC0gc3BMb29rLm1hcmtlck1pblNpemUpICogbWFya2VyU2l6ZUNvbC5zY2FsZSh0aGlzLmxpbmVzLnRvW2ldKSkgLyAyO1xuICAgIH0gZWxzZSBpZiAoc3BMb29rLm1hcmtlckRlZmF1bHRTaXplKSB7XG4gICAgICBzaXplRnJvbSA9IHNwTG9vay5tYXJrZXJEZWZhdWx0U2l6ZSAvIDI7XG4gICAgICBzaXplVG8gPSBzcExvb2subWFya2VyRGVmYXVsdFNpemUgLyAyO1xuICAgIH1cbiAgICByZXR1cm4ge3NpemVGcm9tLCBzaXplVG99O1xuICB9XG5cblxuICBmaWxsTGVmdEJvdHRvbVJlY3QoKSB7XG4gICAgY29uc3QgcmVjdCA9IG5ldyBQYXRoMkQoKTtcbiAgICByZWN0LnJlY3QodGhpcy5zcC55QXhpc0JveC5taW5YLCB0aGlzLnNwLnlBeGlzQm94Lm1heFksIHRoaXMuc3AueUF4aXNCb3gud2lkdGgsIHRoaXMuc3AueEF4aXNCb3guaGVpZ2h0KTtcbiAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBgd2hpdGVgO1xuICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuY3R4LmZpbGwocmVjdCk7XG4gICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG4gIH1cblxuICBjcmVhdGVNdWx0aUxpbmVzSW5kaWNlcygpOiB2b2lkIHtcbiAgICBjb25zdCBhcnJheUlkeHNCaXRBcnJheSA9IG5ldyBCaXRBcnJheSh0aGlzLmxpbmVzLmZyb20ubGVuZ3RoKTtcbiAgICBhcnJheUlkeHNCaXRBcnJheS5zZXRBbGwodHJ1ZSk7XG4gICAgZm9yIChsZXQgaSA9IC0xOyAoaSA9IGFycmF5SWR4c0JpdEFycmF5LmZpbmROZXh0KGkpKSAhPT0gLTE7KSB7XG4gICAgICBjb25zdCBmaXJzdExpbmVJZHggPSBpO1xuICAgICAgY29uc3QgcDEgPSB0aGlzLmxpbmVzLmZyb21bZmlyc3RMaW5lSWR4XTtcbiAgICAgIGNvbnN0IHAyID0gdGhpcy5saW5lcy50b1tmaXJzdExpbmVJZHhdO1xuICAgICAgbGV0IGxpbmVzUGVyUGFpciA9IDE7XG4gICAgICBmb3IgKGxldCBqID0gaTsgKGogPSBhcnJheUlkeHNCaXRBcnJheS5maW5kTmV4dChqKSkgIT09IC0xOykge1xuICAgICAgICBjb25zdCBwb2ludFRvQ29tcGFyZTEgPSB0aGlzLmxpbmVzLmZyb21bal07XG4gICAgICAgIGNvbnN0IHBvaW50VG9Db21wYXJlMiA9IHRoaXMubGluZXMudG9bal07XG4gICAgICAgIGlmIChwb2ludFRvQ29tcGFyZTEgPT09IHAxICYmIHBvaW50VG9Db21wYXJlMiA9PT0gcDIgfHxcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRUb0NvbXBhcmUyID09PSBwMSAmJiBwb2ludFRvQ29tcGFyZTEgPT09IHAyKSB7XG4gICAgICAgICAgdGhpcy5tdWx0aXBsZUxpbmVzQ291bnRzW2pdID0gKytsaW5lc1BlclBhaXI7XG4gICAgICAgICAgYXJyYXlJZHhzQml0QXJyYXkuc2V0Qml0KGosIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsaW5lc1BlclBhaXIgPiAxKVxuICAgICAgICB0aGlzLm11bHRpcGxlTGluZXNDb3VudHNbZmlyc3RMaW5lSWR4XSA9IDE7XG4gICAgICBhcnJheUlkeHNCaXRBcnJheS5zZXRCaXQoaSwgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0Nvb3Jkc09uTGluZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGNhbmRpZGF0ZUlkeCA9IC0xO1xuICAgIGxldCBtaW5EaXN0ID0gbnVsbDtcbiAgICBsZXQgZGlzdCA9IG51bGw7XG4gICAgY29uc3Qgc3BMb29rID0gdGhpcy5zcC5nZXRPcHRpb25zKCkubG9vaztcbiAgICBjb25zdCBtYXJrZXJTaXplQ29sID0gc3BMb29rWydzaXplQ29sdW1uTmFtZSddID8gdGhpcy5zcC5kYXRhRnJhbWUuY29sKHNwTG9va1snc2l6ZUNvbHVtbk5hbWUnXSkgOiBudWxsO1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuc3AuZGF0YUZyYW1lLmZpbHRlcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMuZnJvbS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGZpbHRlci5nZXQodGhpcy5saW5lcy5mcm9tW2ldKSAmJiBmaWx0ZXIuZ2V0KHRoaXMubGluZXMudG9baV0pICYmIHRoaXMudmlzaWJpbGl0eS5nZXRCaXQoaSkpIHtcbiAgICAgICAgY29uc3Qge3NpemVGcm9tLCBzaXplVG99ID0gdGhpcy5nZXRNYXJrZXJzU2l6ZXMoc3BMb29rLCBtYXJrZXJTaXplQ29sLCBpKTtcbiAgICAgICAgY29uc3QgcEZyb20gPSB0aGlzLnNwLndvcmxkVG9TY3JlZW4odGhpcy54QXhpc0NvbC5nZXQodGhpcy5saW5lcy5mcm9tW2ldKSwgdGhpcy55QXhpc0NvbC5nZXQodGhpcy5saW5lcy5mcm9tW2ldKSk7XG4gICAgICAgIGNvbnN0IHBUbyA9IHRoaXMuc3Aud29ybGRUb1NjcmVlbih0aGlzLnhBeGlzQ29sLmdldCh0aGlzLmxpbmVzLnRvW2ldKSwgdGhpcy55QXhpc0NvbC5nZXQodGhpcy5saW5lcy50b1tpXSkpO1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZUxpbmVzQ291bnRzW2ldKSB7XG4gICAgICAgICAgY29uc3QgbGVuID0gdGhpcy5nZXRMaW5lTGVuZ3RoKHBGcm9tLngsIHBGcm9tLnksIHBUby54LCBwVG8ueSk7XG4gICAgICAgICAgY29uc3QgZnJvbU1hcmtlciA9IHRoaXMuZ2V0UG9pbnRPbkRpc3RhbmNlKHBGcm9tLngsIHBGcm9tLnksIHBUby54LCBwVG8ueSwgc2l6ZVRvLCBsZW4pO1xuICAgICAgICAgIGNvbnN0IHRvTWFya2VyID0gdGhpcy5nZXRQb2ludE9uRGlzdGFuY2UocFRvLngsIHBUby55LCBwRnJvbT8ueCwgcEZyb20/LnksIHNpemVGcm9tLCBsZW4pO1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2xQb2ludCA9IHRoaXMubGluZXMuZnJvbVtpXSA+IHRoaXMubGluZXMudG9baV0gP1xuICAgICAgICAgICAgdGhpcy5maW5kQ29udHJvbFBvaW50KHRoaXMubXVsdGlwbGVMaW5lc0NvdW50c1tpXSwgZnJvbU1hcmtlci54LCBmcm9tTWFya2VyLnksIHRvTWFya2VyLngsIHRvTWFya2VyLnksIGkpIDpcbiAgICAgICAgICAgIHRoaXMuZmluZENvbnRyb2xQb2ludCh0aGlzLm11bHRpcGxlTGluZXNDb3VudHNbaV0sIHRvTWFya2VyLngsIHRvTWFya2VyLnksIGZyb21NYXJrZXIueCwgZnJvbU1hcmtlci55LCBpKTtcbiAgICAgICAgICBkaXN0ID0gdGhpcy5jYWxjdWxhdGVEaXN0VG9DdXJ2ZUxpbmUoaSwgeCwgeSwgZnJvbU1hcmtlciwgdG9NYXJrZXIsIGNvbnRyb2xQb2ludCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlzdCA9IHRoaXMuY2FsY3VsYXRlRGlzdFRvU3RyYWlnaHRMaW5lKHgsIHksIHBGcm9tLCBwVG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIW1pbkRpc3QgJiYgZGlzdCAhPT0gbnVsbCAmJiBkaXN0IDwgNSkgfHwgbWluRGlzdCAmJiBkaXN0ICE9PSBudWxsICYmIGRpc3QgPCBtaW5EaXN0KSB7XG4gICAgICAgICAgbWluRGlzdCA9IGRpc3Q7XG4gICAgICAgICAgY2FuZGlkYXRlSWR4ID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2FuZGlkYXRlSWR4O1xuICB9XG5cbiAgY2FsY3VsYXRlRGlzdFRvU3RyYWlnaHRMaW5lKHg6IG51bWJlciwgeTogbnVtYmVyLCBwMTogREcuUG9pbnQsIHAyOiBERy5Qb2ludCk6IG51bWJlciB8IG51bGwge1xuICAgIC8qIGNhbGN1bGF0aW5nIGNvb3JkaW5hdGVzIG9mIGEgcmVjdCBhcm91bmQgYSBsaW5lLiBJZiBjdXJzb3IgY29vcmRzIGFyZSBvdXRzaWRlIHRoaXMgcmVjdCAtIGFzc3VtZSB0aGF0XG4gICAgICAgIHBvaW50IGlzIG5vdCBvbiBsaW5lIGFuZCBkbyBub3QgY2FsY3VsYXRlIGRpc3RhbmNlIHRvIGxpbmUgKi9cbiAgICBjb25zdCB4TWluID0gTWF0aC5taW4ocDEueCwgcDIueCk7XG4gICAgY29uc3QgeE1heCA9IE1hdGgubWF4KHAxLngsIHAyLngpO1xuICAgIGNvbnN0IHlNaW4gPSBNYXRoLm1pbihwMS55LCBwMi55KTtcbiAgICBjb25zdCB5TWF4ID0gTWF0aC5tYXgocDEueSwgcDIueSk7XG5cbiAgICAvL2FkZGluZyBhIGNvdXBsZSBvZiBwaXhlbHMgdG8gaW5jcmVhc2UgdGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgcmVjdFxuICAgIGNvbnN0IHRocmVzaG9sZCA9IDI7XG4gICAgcmV0dXJuIHggPj0geE1pbiAtIHRocmVzaG9sZCAmJiB4IDw9IHhNYXggKyB0aHJlc2hvbGQgJiYgeSA+PSB5TWluIC0gdGhyZXNob2xkICYmIHkgPD0geU1heCArIHRocmVzaG9sZCA/XG4gICAgICB0aGlzLmRpc3RUb1N0cmFpZ2h0TGluZVNlZ21lbnQoeCwgeSwgcDEsIHAyKSA6XG4gICAgICBudWxsO1xuICB9XG5cbiAgZGlzdFRvU3RyYWlnaHRMaW5lU2VnbWVudCh4OiBudW1iZXIsIHk6IG51bWJlciwgcDE6IERHLlBvaW50LCBwMjogREcuUG9pbnQpIHtcbiAgICBjb25zdCBkaXN0ID0gKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpID0+IE1hdGgucG93KCh4MSAtIHgyKSwgMikgKyBNYXRoLnBvdygoeTEgLSB5MiksIDIpO1xuICAgIGNvbnN0IGwgPSBkaXN0KHAxLngsIHAxLnksIHAyLngsIHAyLnkpO1xuICAgIGlmIChsID09IDApIHJldHVybiBkaXN0KHgsIHksIHAxLngsIHAxLnkpO1xuICAgIGxldCB0ID0gKCh4IC0gcDEueCkgKiAocDIueCAtIHAxLngpICsgKHkgLSBwMS55KSAqIChwMi55IC0gcDEueSkpIC8gbDtcbiAgICB0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdCkpO1xuICAgIHJldHVybiBkaXN0KHgsIHksIHAxLnggKyB0ICogKHAyLnggLSBwMS54KSwgcDEueSArIHQgKiAocDIueSAtIHAxLnkpKTtcbiAgfVxuXG4gIGNhbGN1bGF0ZURpc3RUb0N1cnZlTGluZShpOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyLCBwMTogREcuUG9pbnQsIHAyOiBERy5Qb2ludCxcbiAgICBwYzogREcuUG9pbnQpOiBudW1iZXIgfCBudWxsIHtcbiAgICAvKiBjYWxjdWxhdGluZyBjb29yZGluYXRlcyBvZiBhIHJlY3QgYXJvdW5kIGEgbGluZS4gSWYgY3Vyc29yIGNvb3JkcyBhcmUgb3V0c2lkZSB0aGlzIHNoYXBlIC0gYXNzdW1lIHRoYXRcbiAgICAgICAgcG9pbnQgaXMgbm90IG9uIGxpbmUgYW5kIGRvIG5vdCBjYWxjdWxhdGUgZGlzdGFuY2UgdG8gbGluZSAqL1xuICAgIGNvbnN0IHhNaW4gPSBNYXRoLm1pbihwMS54LCBwMi54LCBwYy54KTtcbiAgICBjb25zdCB4TWF4ID0gTWF0aC5tYXgocDEueCwgcDIueCwgcGMueCk7XG4gICAgY29uc3QgeU1pbiA9IE1hdGgubWluKHAxLnksIHAyLnksIHBjLnkpO1xuICAgIGNvbnN0IHlNYXggPSBNYXRoLm1heChwMS55LCBwMi55LCBwYy55KTtcblxuICAgIC8vYWRkaW5nIGEgY291cGxlIG9mIHBpeGVscyB0byBpbmNyZWFzZSB0aGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSByZWN0XG4gICAgY29uc3QgdGhyZXNob2xkID0gMjtcbiAgICBpZiAoeCA+PSB4TWluIC0gdGhyZXNob2xkICYmIHggPD0geE1heCArIHRocmVzaG9sZCAmJiB5ID49IHlNaW4gLSB0aHJlc2hvbGQgJiYgeSA8PSB5TWF4ICsgdGhyZXNob2xkKSB7XG4gICAgICBjb25zdCB3ID0geE1heCAtIHhNaW47XG4gICAgICBjb25zdCBoID0geU1heCAtIHlNaW47XG4gICAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVEaXN0VG9DdXJ2ZUluUmVjdCh4LCB5LCBwMSwgcGMsIHAyLCB3LCBoKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjYWxjdWxhdGVEaXN0VG9DdXJ2ZUluUmVjdCh4OiBudW1iZXIsIHk6IG51bWJlciwgcDA6IERHLlBvaW50LCBwMTogREcuUG9pbnQsIHAyOiBERy5Qb2ludCxcbiAgICB3OiBudW1iZXIsIGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RlcExlbiA9IDM7XG4gICAgY29uc3Qgc3RlcHNOdW0gPSBNYXRoLmZsb29yKCh3ICsgaCkgLyBzdGVwTGVuKTtcbiAgICBjb25zdCBkZWx0YVQgPSAxIC8gc3RlcHNOdW07XG4gICAgY29uc3QgYXJyWCA9IG5ldyBVaW50MzJBcnJheShzdGVwc051bSk7XG4gICAgY29uc3QgYXJyWSA9IG5ldyBVaW50MzJBcnJheShzdGVwc051bSk7XG4gICAgY29uc3QgbWF4SFcgPSBuZXcgVWludDMyQXJyYXkoc3RlcHNOdW0pO1xuICAgIGxldCBtaW5TdW1IVzogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY2FuZGlkYXRlSWR4cyA9IG5ldyBCaXRBcnJheShzdGVwc051bSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJYLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0ID0gaSAqIGRlbHRhVDtcbiAgICAgIGNvbnN0IHhPbkN1cnZlID0gTWF0aC5wb3coKDEgLSB0KSwgMikgKiBwMC54ICsgMiAqIHQgKiAoMSAtIHQpICogcDEueCArIE1hdGgucG93KHQsIDIpICogcDIueDtcbiAgICAgIGNvbnN0IHlPbkN1cnZlID0gTWF0aC5wb3coKDEgLSB0KSwgMikgKiBwMC55ICsgMiAqIHQgKiAoMSAtIHQpICogcDEueSArIE1hdGgucG93KHQsIDIpICogcDIueTtcbiAgICAgIGNvbnN0IHJlY3RXID0gTWF0aC5hYnMoeCAtIHhPbkN1cnZlKTtcbiAgICAgIGNvbnN0IHJlY3RIID0gTWF0aC5hYnMoeSAtIHlPbkN1cnZlKTtcbiAgICAgIGNvbnN0IHN1bUhXID0gcmVjdFcgKyByZWN0SDtcbiAgICAgIGlmICghbWluU3VtSFcgfHwgbWluU3VtSFcgPiBzdW1IVylcbiAgICAgICAgbWluU3VtSFcgPSBzdW1IVztcbiAgICAgIG1heEhXW2ldID0gTWF0aC5tYXgocmVjdFcsIHJlY3RIKTtcbiAgICAgIGFyclhbaV0gPSB4T25DdXJ2ZTtcbiAgICAgIGFycllbaV0gPSB5T25DdXJ2ZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJYLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobWF4SFdbaV0gPCBtaW5TdW1IVyEpXG4gICAgICAgIGNhbmRpZGF0ZUlkeHMuc2V0Qml0KGksIHRydWUsIGZhbHNlKTtcbiAgICB9XG4gICAgbGV0IG1pbkRpc3Q6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGZvciAobGV0IGogPSAtMTsgKGogPSBjYW5kaWRhdGVJZHhzLmZpbmROZXh0KGopKSAhPT0gLTE7KSB7XG4gICAgICBjb25zdCBkaXN0ID0gTWF0aC5oeXBvdCgoYXJyWFtqXSAtIHgpLCAoYXJyWVtqXSAtIHkpKTtcbiAgICAgIGlmICghbWluRGlzdCB8fCBtaW5EaXN0ID4gZGlzdClcbiAgICAgICAgbWluRGlzdCA9IGRpc3Q7XG4gICAgfVxuICAgIHJldHVybiBtaW5EaXN0ITtcbiAgfVxuXG4gIGdldExpbmVMZW5ndGgocDF4OiBudW1iZXIsIHAxeTogbnVtYmVyLCBwMng6IG51bWJlciwgcDJ5OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cocDJ4IC0gcDF4LCAyKSArIE1hdGgucG93KHAyeSAtIHAxeSwgMikpO1xuICB9XG5cbiAgZ2V0UG9pbnRPbkRpc3RhbmNlKHAxeDogbnVtYmVyLCBwMXk6IG51bWJlciwgcDJ4OiBudW1iZXIsIHAyeTogbnVtYmVyLCBkaXN0YW5jZTogbnVtYmVyLCBsZW5ndGg6IG51bWJlcik6IERHLlBvaW50IHtcbiAgICBjb25zdCBkeCA9IChwMnggLSBwMXgpIC8gbGVuZ3RoO1xuICAgIGNvbnN0IGR5ID0gKHAyeSAtIHAxeSkgLyBsZW5ndGg7XG4gICAgY29uc3QgcDN4ID0gcDJ4IC0gZGlzdGFuY2UgKiBkeDtcbiAgICBjb25zdCBwM3kgPSBwMnkgLSBkaXN0YW5jZSAqIGR5O1xuXG4gICAgcmV0dXJuIG5ldyBERy5Qb2ludChwM3gsIHAzeSk7XG4gIH1cblxuICBmaW5kQ29udHJvbFBvaW50KGlkeDogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBpPzogbnVtYmVyKTogREcuUG9pbnQge1xuICAgIGNvbnN0IG1pZFggPSB4MSArICh4MiAtIHgxKSAvIDI7XG4gICAgY29uc3QgbWlkWSA9IHkxICsgKHkyIC0geTEpIC8gMjtcbiAgICBsZXQgZHggPSBtaWRYIC0geDE7XG4gICAgbGV0IGR5ID0gbWlkWSAtIHkxO1xuICAgIGNvbnN0IGRpc3QgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgIGR4IC89IGRpc3Q7XG4gICAgZHkgLz0gZGlzdDtcbiAgICBjb25zdCBwZXJwZW5kaWN1bGFyTGVuID0gNTAgKiBNYXRoLmNlaWwoaWR4IC8gMik7XG4gICAgcmV0dXJuIGlkeCAlIDIgPT09IDAgP1xuICAgICAgbmV3IERHLlBvaW50KG1pZFggKyAocGVycGVuZGljdWxhckxlbiAvIDIpICogZHksIG1pZFkgLSAocGVycGVuZGljdWxhckxlbiAvIDIpICogZHgpIDpcbiAgICAgIG5ldyBERy5Qb2ludChtaWRYIC0gKHBlcnBlbmRpY3VsYXJMZW4gLyAyKSAqIGR5LCBtaWRZICsgKHBlcnBlbmRpY3VsYXJMZW4gLyAyKSAqIGR4KTtcbiAgfVxuXG4gIGNhbnZhc0Fycm93KHBhdGg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgYXJyb3dFbmRYOiBudW1iZXIsIGFycm93RW5kWTogbnVtYmVyLCBxdWFkWDogbnVtYmVyLCBxdWFkWTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgYXJyb3dBbmdsZSA9IE1hdGguYXRhbjIocXVhZFggLSBhcnJvd0VuZFgsIHF1YWRZIC0gYXJyb3dFbmRZKSArIE1hdGguUEk7XG4gICAgcGF0aC5tb3ZlVG8oYXJyb3dFbmRYIC0gKHRoaXMuYXJyb3dXaWR0aCAqIE1hdGguc2luKGFycm93QW5nbGUgLSBNYXRoLlBJIC8gMTApKSxcbiAgICAgIGFycm93RW5kWSAtICh0aGlzLmFycm93V2lkdGggKiBNYXRoLmNvcyhhcnJvd0FuZ2xlIC0gTWF0aC5QSSAvIDEwKSkpO1xuICAgIHBhdGgubGluZVRvKGFycm93RW5kWCwgYXJyb3dFbmRZKTtcbiAgICBwYXRoLmxpbmVUbyhhcnJvd0VuZFggLSAodGhpcy5hcnJvd1dpZHRoICogTWF0aC5zaW4oYXJyb3dBbmdsZSArIE1hdGguUEkgLyAxMCkpLFxuICAgICAgYXJyb3dFbmRZIC0gKHRoaXMuYXJyb3dXaWR0aCAqIE1hdGguY29zKGFycm93QW5nbGUgKyBNYXRoLlBJIC8gMTApKSk7XG4gIH1cbn1cbiJdfQ==","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {TITLE, KNN_IMPUTER, ERROR_MSG, HINT} from './ui-constants';\nimport {SUPPORTED_COLUMN_TYPES, METRIC_TYPE, DISTANCE_TYPE, MetricInfo, DEFAULT, MIN_NEIGHBORS,\n impute, getMissingValsIndices, areThereFails, imputeFailed} from './knn-imputer';\n\n/** Setting of the feature metric inputs */\ntype FeatureInputSettings = {\n defaultWeight: number,\n defaultMetric: METRIC_TYPE,\n availableMetrics: METRIC_TYPE[],\n};\n\n/** Return default setting of the feature metric inputs */\nfunction getFeatureInputSettings(type: DG.COLUMN_TYPE): FeatureInputSettings {\n switch (type) {\n case DG.COLUMN_TYPE.STRING:\n case DG.COLUMN_TYPE.DATE_TIME:\n return {\n defaultWeight: DEFAULT.WEIGHT,\n defaultMetric: METRIC_TYPE.ONE_HOT,\n availableMetrics: [METRIC_TYPE.ONE_HOT],\n };\n\n case DG.COLUMN_TYPE.INT:\n case DG.COLUMN_TYPE.FLOAT:\n case DG.COLUMN_TYPE.QNUM:\n return {\n defaultWeight: DEFAULT.WEIGHT,\n defaultMetric: METRIC_TYPE.DIFFERENCE,\n availableMetrics: [METRIC_TYPE.DIFFERENCE, METRIC_TYPE.ONE_HOT],\n };\n\n default:\n throw new Error(ERROR_MSG.UNSUPPORTED_COLUMN_TYPE);\n }\n}\n\n/** Run the KNN missing values imputer */\nexport async function runKNNImputer(df?: DG.DataFrame): Promise<void> {\n /** current dataframe */\n df ??= grok.shell.t;\n\n if (df === null) {\n grok.shell.warning(ERROR_MSG.NO_DATAFRAME);\n return;\n }\n\n /** columns with missing values */\n const colsWithMissingVals = [] as DG.Column[];\n\n /** names of columns with missing values */\n const availableTargetColsNames = [] as string[];\n\n /** names of columns that can be used as features */\n const availableFeatureColsNames = [] as string[];\n\n // get columns with missing vals & available feature cols\n df.columns.toList()\n .filter((col) => SUPPORTED_COLUMN_TYPES.includes(col.type))\n .forEach((col) => {\n availableFeatureColsNames.push(col.name);\n\n if (col.stats.missingValueCount > 0) {\n colsWithMissingVals.push(col);\n availableTargetColsNames.push(col.name);\n }\n });\n\n // get indices of missing values: col name -> array of indices\n const misValsInds = getMissingValsIndices(colsWithMissingVals);\n\n if (colsWithMissingVals.length === 0) {\n grok.shell.info(ERROR_MSG.NO_MISSING_VALUES);\n return;\n }\n\n if (availableFeatureColsNames.length === 1) {\n grok.shell.error(ERROR_MSG.ONE_AVAILABLE_FEATURE);\n return;\n }\n\n // In-place components\n let inPlace = DEFAULT.IN_PLACE > 0;\n const inPlaceInput = ui.input.bool(TITLE.IN_PLACE, {value: inPlace,\n onValueChanged: () => {inPlace = inPlaceInput.value ?? false;}});\n inPlaceInput.setTooltip(HINT.IN_PLACE);\n\n // Keep empty feature\n let keepEmpty = DEFAULT.KEEP_EMPTY > 0;\n const keepEmptyInput = ui.input.bool(TITLE.KEEP_EMPTY, {value: keepEmpty,\n onValueChanged: () => {keepEmpty = keepEmptyInput.value ?? false;}});\n keepEmptyInput.setTooltip(HINT.KEEP_EMPTY);\n\n // Neighbors components\n let neighbors = DEFAULT.NEIGHBORS;\n const neighborsInput = ui.input.int(TITLE.NEIGHBORS, {value: neighbors, onValueChanged: () => {\n const val = neighborsInput.value;\n if (val === null)\n neighborsInput.value = neighbors;\n else if (val >= MIN_NEIGHBORS)\n neighbors = val;\n else\n neighborsInput.value = neighbors;\n }});\n neighborsInput.setTooltip(HINT.NEIGHBORS);\n\n // Distance components\n let distType = DISTANCE_TYPE.EUCLIDEAN;\n const distTypeInput: DG.ChoiceInput<DISTANCE_TYPE> = ui.input.choice(TITLE.DISTANCE, {value: distType,\n items: [DISTANCE_TYPE.EUCLIDEAN, DISTANCE_TYPE.MANHATTAN], onValueChanged: () => distType = distTypeInput.value ?? DISTANCE_TYPE.EUCLIDEAN}) as DG.ChoiceInput<DISTANCE_TYPE>;\n distTypeInput.setTooltip(HINT.DISTANCE);\n\n // Target columns components (cols with missing values to be imputed)\n let targetColNames = colsWithMissingVals.map((col) => col.name);\n const targetColInput = ui.input.columns(TITLE.COLUMNS, {table: df, onValueChanged: () => {\n targetColNames = targetColInput.value.map((col) => col.name);\n checkApplicability();\n }, available: availableTargetColsNames, checked: availableTargetColsNames});\n targetColInput.setTooltip(HINT.TARGET);\n\n // Feature columns components\n let selectedFeatureColNames = availableFeatureColsNames as string[];\n const featuresInput = ui.input.columns(TITLE.FEATURES, {table: df, onValueChanged: () => {\n selectedFeatureColNames = featuresInput.value.map((col) => col.name);\n\n if (selectedFeatureColNames.length > 0) {\n checkApplicability();\n metricInfoInputs.forEach((div, name) => div.hidden = !selectedFeatureColNames.includes(name));\n } else\n hideWidgets();\n }, available: availableFeatureColsNames, checked: availableFeatureColsNames});\n featuresInput.setTooltip(HINT.FEATURES);\n\n /** Hide widgets (use if run is not applicable) */\n const hideWidgets = () => {\n dlg.getButton(TITLE.RUN).disabled = true;\n inPlaceInput.root.hidden = true;\n keepEmptyInput.root.hidden = true;\n neighborsInput.root.hidden = true;\n distDiv.hidden = true;\n metricsDiv.hidden = true;\n };\n\n /** Show widgets (use if run is applicable) */\n const showWidgets = () => {\n dlg.getButton(TITLE.RUN).disabled = false;\n distDiv.hidden = false;\n inPlaceInput.root.hidden = false;\n neighborsInput.root.hidden = false;\n distTypeInput.root.hidden = false;\n keepEmptyInput.root.hidden = !areThereFails(targetColNames, selectedFeatureColNames, misValsInds);\n };\n\n /** Check applicability of the imputation */\n const checkApplicability = () => {\n showWidgets();\n\n if (selectedFeatureColNames.length === 1) {\n targetColNames.forEach((name) => {\n if (selectedFeatureColNames[0] === name) {\n hideWidgets();\n grok.shell.warning(`${ERROR_MSG.ONE_FEATURE_SELECTED} the column '${name}'`);\n }\n });\n }\n };\n\n // Metrics components\n const featuresMetrics = new Map<string, MetricInfo>();\n const metricInfoInputs = new Map<string, HTMLDivElement>();\n const metricsDiv = ui.divV([]);\n metricsDiv.style.overflow = 'auto';\n\n // Create metrics UI\n availableFeatureColsNames.forEach((name) => {\n // initialization\n const type = df!.col(name)!.type as DG.COLUMN_TYPE;\n const settings = getFeatureInputSettings(type);\n featuresMetrics.set(name, {weight: settings.defaultWeight, type: settings.defaultMetric});\n\n // distance input\n const distTypeInput = ui.input.choice(name, {value: settings.defaultMetric,\n items: settings.availableMetrics, onValueChanged: () => {\n const distInfo = featuresMetrics.get(name) ?? {weight: settings.defaultWeight, type: settings.defaultMetric};\n distInfo.type = distTypeInput.value ?? settings.defaultMetric;\n featuresMetrics.set(name, distInfo);\n }});\n distTypeInput.root.style.width = '50%';\n distTypeInput.setTooltip(HINT.METRIC);\n distTypeInput.root.hidden = true; // this input will be used further\n\n // The following should provide a slider (see th bug https://reddata.atlassian.net/browse/GROK-14431)\n // @ts-ignore\n const prop = DG.Property.fromOptions({'name': name, 'inputType': 'Float', 'min': 0, 'max': 10, 'showSlider': true, 'step': 1});\n const weightInput = ui.input.forProperty(prop);\n weightInput.value = settings.defaultWeight;\n weightInput.onChanged(() => {\n const distInfo = featuresMetrics.get(name) ?? {weight: settings.defaultWeight, type: settings.defaultMetric};\n distInfo.weight = weightInput.value ?? settings.defaultWeight;\n featuresMetrics.set(name, distInfo);\n });\n weightInput.setTooltip(HINT.WEIGHT);\n\n const div = ui.divH([distTypeInput.root, weightInput.root]);\n metricInfoInputs.set(name, div);\n metricsDiv.append(div);\n });\n\n // The main dialog\n const dlg = ui.dialog({title: TITLE.KNN_IMPUTER, helpUrl: KNN_IMPUTER});\n grok.shell.v.root.appendChild(dlg.root);\n\n metricsDiv.hidden = true;\n keepEmptyInput.root.hidden = !areThereFails(targetColNames, selectedFeatureColNames, misValsInds);\n\n // Icon showing/hiding metrics UI\n const settingsIcon = ui.icons.settings(() => {metricsDiv.hidden = !metricsDiv.hidden;}, HINT.METRIC_SETTINGS);\n\n const distDiv = ui.divH([distTypeInput.root, settingsIcon]);\n\n let resolve: (value: void | PromiseLike<void>) => void;\n let reject: (reason?: any) => void;\n let okClicked = false;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n dlg.add(targetColInput)\n .add(featuresInput)\n .add(distDiv)\n .add(metricsDiv)\n .add(neighborsInput)\n .add(inPlaceInput)\n .add(keepEmptyInput)\n .show()\n .onOK(() => {\n okClicked = true;\n dlg.close();\n availableFeatureColsNames.filter((name) => !selectedFeatureColNames.includes(name)).forEach((name) => featuresMetrics.delete(name));\n\n try {\n const failedToImpute = impute(df!, targetColNames, featuresMetrics, misValsInds, distType, neighbors, inPlace);\n\n if (!keepEmpty)\n imputeFailed(df!, failedToImpute);\n resolve();\n } catch (err) {\n if (err instanceof Error)\n grok.shell.error(`${ERROR_MSG.KNN_FAILS}: ${err.message}`);\n else\n grok.shell.error(`${ERROR_MSG.KNN_FAILS}: ${ERROR_MSG.CORE_ISSUE}`);\n reject(err);\n }\n }).onClose.subscribe(() => !okClicked && reject());\n\n return promise;\n} // runKNNImputer\n","import * as ui from 'datagrok-api/ui';\nimport { MultiColumnDimReductionEditor } from '../multi-column-dimensionality-reduction/multi-column-dim-reduction-editor';\nimport { getGPUAdapterDescription } from '@datagrok-libraries/math/src/webGPU/getGPUDevice';\nimport { defaultMCLOptions } from './marcov-cluster';\nexport class MCLEditor extends MultiColumnDimReductionEditor {\n constructor(editorSettings = {}) {\n super(editorSettings);\n this.similarityThresholdInput = ui.intInput('Similarity Threshold', 80);\n this.maxIterationsInput = ui.intInput('Max Iterations', 5);\n this.useWebGPUInput = ui.boolInput('Use WebGPU', false);\n this.inflateInput = ui.floatInput('Inflation Factor', defaultMCLOptions.inflateFactor);\n getGPUAdapterDescription().then((desc) => {\n if (desc) {\n this.useWebGPUInput.setTooltip(`Use webGPU for MCL calculation (${desc})`);\n }\n else {\n this.useWebGPUInput.value = false;\n this.useWebGPUInput.setTooltip('WebGPU is not available');\n this.useWebGPUInput.enabled = false;\n }\n });\n }\n getEditor() {\n const div = ui.div([\n this.tableInput.root,\n this.columnsInputRoot,\n this.columnParamsEditorRoot,\n this.aggregationMethodInput.root,\n this.similarityThresholdInput.root,\n this.inflateInput.root,\n this.maxIterationsInput.root,\n this.useWebGPUInput.root,\n ], { style: { minWidth: '420px' }, classes: 'ui-form' });\n return div;\n }\n get params() {\n return {\n table: this.tableInput.value,\n columns: this.columnsInput.value,\n methodName: this.methodInput.value,\n preprocessingFunctions: this.columnOptEditors.map((it) => it.preProcessingFunction),\n distanceMetrics: this.columnOptEditors.map((it) => it.similarityMetricInput.value),\n weights: this.columnOptEditors.map((it) => it.weight),\n preprocessingFuncArgs: this.columnOptEditors.map((it) => it.preprocessingFunctionSettings),\n aggreaggregationMethod: this.aggregationMethodInput.value,\n threshold: this.similarityThresholdInput.value,\n maxIterations: this.maxIterationsInput.value ?? 5,\n useWebGPU: this.useWebGPUInput.value ?? false,\n inflateFactor: this.inflateInput.value ?? defaultMCLOptions.inflateFactor,\n };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNsLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1jbC1lZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFDL0IsNEVBQTRFLENBQUM7QUFDcEYsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sa0RBQWtELENBQUM7QUFDMUYsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFHbkQsTUFBTSxPQUFPLFNBQVUsU0FBUSw2QkFBNkI7SUFLeEQsWUFBWSxpQkFBNEMsRUFBRTtRQUN4RCxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkYsd0JBQXdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2QyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLG1DQUFtQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQzdFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sU0FBUztRQUNkLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0I7WUFDckIsSUFBSSxDQUFDLHNCQUFzQjtZQUMzQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSTtZQUNoQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSTtZQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUk7WUFDdEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUk7WUFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJO1NBQ3pCLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUM7UUFDckQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2YsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQU07WUFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBTTtZQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFNO1lBQ25DLHNCQUFzQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztZQUNuRixlQUFlLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLEtBQU0sQ0FBQztZQUNuRixPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU8sQ0FBQztZQUN0RCxxQkFBcUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsNkJBQTZCLENBQUM7WUFDMUYsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUs7WUFDekQsU0FBUyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLO1lBQzlDLGFBQWEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxJQUFJLENBQUM7WUFDakQsU0FBUyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxJQUFJLEtBQUs7WUFDN0MsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLGlCQUFpQixDQUFDLGFBQWE7U0FDMUUsQ0FBQztJQUNKLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0IHtEaW1SZWR1Y3Rpb25FZGl0b3JPcHRpb25zfSBmcm9tICcuLi9mdW5jdGlvbkVkaXRvcnMvZGltZW5zaW9uYWxpdHktcmVkdWN0aW9uLWVkaXRvcic7XG5pbXBvcnQge011bHRpQ29sdW1uRGltUmVkdWN0aW9uRWRpdG9yfVxuICBmcm9tICcuLi9tdWx0aS1jb2x1bW4tZGltZW5zaW9uYWxpdHktcmVkdWN0aW9uL211bHRpLWNvbHVtbi1kaW0tcmVkdWN0aW9uLWVkaXRvcic7XG5pbXBvcnQge2dldEdQVUFkYXB0ZXJEZXNjcmlwdGlvbn0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvZ2V0R1BVRGV2aWNlJztcbmltcG9ydCB7ZGVmYXVsdE1DTE9wdGlvbnN9IGZyb20gJy4vbWFyY292LWNsdXN0ZXInO1xuXG5cbmV4cG9ydCBjbGFzcyBNQ0xFZGl0b3IgZXh0ZW5kcyBNdWx0aUNvbHVtbkRpbVJlZHVjdGlvbkVkaXRvciB7XG4gICAgcHVibGljIHNpbWlsYXJpdHlUaHJlc2hvbGRJbnB1dDogREcuSW5wdXRCYXNlPG51bWJlciB8IG51bGw+O1xuICAgIHB1YmxpYyBtYXhJdGVyYXRpb25zSW5wdXQ6IERHLklucHV0QmFzZTxudW1iZXIgfCBudWxsPjtcbiAgICBwdWJsaWMgdXNlV2ViR1BVSW5wdXQ6IERHLklucHV0QmFzZTxib29sZWFuIHwgbnVsbD47XG4gICAgcHVibGljIGluZmxhdGVJbnB1dDogREcuSW5wdXRCYXNlPG51bWJlciB8IG51bGw+O1xuICAgIGNvbnN0cnVjdG9yKGVkaXRvclNldHRpbmdzOiBEaW1SZWR1Y3Rpb25FZGl0b3JPcHRpb25zID0ge30pIHtcbiAgICAgIHN1cGVyKGVkaXRvclNldHRpbmdzKTtcbiAgICAgIHRoaXMuc2ltaWxhcml0eVRocmVzaG9sZElucHV0ID0gdWkuaW50SW5wdXQoJ1NpbWlsYXJpdHkgVGhyZXNob2xkJywgODApO1xuICAgICAgdGhpcy5tYXhJdGVyYXRpb25zSW5wdXQgPSB1aS5pbnRJbnB1dCgnTWF4IEl0ZXJhdGlvbnMnLCA1KTtcbiAgICAgIHRoaXMudXNlV2ViR1BVSW5wdXQgPSB1aS5ib29sSW5wdXQoJ1VzZSBXZWJHUFUnLCBmYWxzZSk7XG4gICAgICB0aGlzLmluZmxhdGVJbnB1dCA9IHVpLmZsb2F0SW5wdXQoJ0luZmxhdGlvbiBGYWN0b3InLCBkZWZhdWx0TUNMT3B0aW9ucy5pbmZsYXRlRmFjdG9yKTtcbiAgICAgIGdldEdQVUFkYXB0ZXJEZXNjcmlwdGlvbigpLnRoZW4oKGRlc2MpID0+IHtcbiAgICAgICAgaWYgKGRlc2MpIHtcbiAgICAgICAgICB0aGlzLnVzZVdlYkdQVUlucHV0LnNldFRvb2x0aXAoYFVzZSB3ZWJHUFUgZm9yIE1DTCBjYWxjdWxhdGlvbiAoJHtkZXNjfSlgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnVzZVdlYkdQVUlucHV0LnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy51c2VXZWJHUFVJbnB1dC5zZXRUb29sdGlwKCdXZWJHUFUgaXMgbm90IGF2YWlsYWJsZScpO1xuICAgICAgICAgIHRoaXMudXNlV2ViR1BVSW5wdXQuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RWRpdG9yKCk6IEhUTUxFbGVtZW50IHtcbiAgICAgIGNvbnN0IGRpdiA9IHVpLmRpdihbXG4gICAgICAgIHRoaXMudGFibGVJbnB1dC5yb290LFxuICAgICAgICB0aGlzLmNvbHVtbnNJbnB1dFJvb3QsXG4gICAgICAgIHRoaXMuY29sdW1uUGFyYW1zRWRpdG9yUm9vdCxcbiAgICAgICAgdGhpcy5hZ2dyZWdhdGlvbk1ldGhvZElucHV0LnJvb3QsXG4gICAgICAgIHRoaXMuc2ltaWxhcml0eVRocmVzaG9sZElucHV0LnJvb3QsXG4gICAgICAgIHRoaXMuaW5mbGF0ZUlucHV0LnJvb3QsXG4gICAgICAgIHRoaXMubWF4SXRlcmF0aW9uc0lucHV0LnJvb3QsXG4gICAgICAgIHRoaXMudXNlV2ViR1BVSW5wdXQucm9vdCxcbiAgICAgIF0sIHtzdHlsZToge21pbldpZHRoOiAnNDIwcHgnfSwgY2xhc3NlczogJ3VpLWZvcm0nfSk7XG4gICAgICByZXR1cm4gZGl2O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyYW1zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFibGU6IHRoaXMudGFibGVJbnB1dC52YWx1ZSEsXG4gICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1uc0lucHV0LnZhbHVlISxcbiAgICAgICAgbWV0aG9kTmFtZTogdGhpcy5tZXRob2RJbnB1dC52YWx1ZSEsXG4gICAgICAgIHByZXByb2Nlc3NpbmdGdW5jdGlvbnM6IHRoaXMuY29sdW1uT3B0RWRpdG9ycy5tYXAoKGl0KSA9PiBpdC5wcmVQcm9jZXNzaW5nRnVuY3Rpb24pLFxuICAgICAgICBkaXN0YW5jZU1ldHJpY3M6IHRoaXMuY29sdW1uT3B0RWRpdG9ycy5tYXAoKGl0KSA9PiBpdC5zaW1pbGFyaXR5TWV0cmljSW5wdXQudmFsdWUhKSxcbiAgICAgICAgd2VpZ2h0czogdGhpcy5jb2x1bW5PcHRFZGl0b3JzLm1hcCgoaXQpID0+IGl0LndlaWdodCEpLFxuICAgICAgICBwcmVwcm9jZXNzaW5nRnVuY0FyZ3M6IHRoaXMuY29sdW1uT3B0RWRpdG9ycy5tYXAoKGl0KSA9PiBpdC5wcmVwcm9jZXNzaW5nRnVuY3Rpb25TZXR0aW5ncyksXG4gICAgICAgIGFnZ3JlYWdncmVnYXRpb25NZXRob2Q6IHRoaXMuYWdncmVnYXRpb25NZXRob2RJbnB1dC52YWx1ZSxcbiAgICAgICAgdGhyZXNob2xkOiB0aGlzLnNpbWlsYXJpdHlUaHJlc2hvbGRJbnB1dC52YWx1ZSxcbiAgICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zSW5wdXQudmFsdWUgPz8gNSxcbiAgICAgICAgdXNlV2ViR1BVOiB0aGlzLnVzZVdlYkdQVUlucHV0LnZhbHVlID8/IGZhbHNlLFxuICAgICAgICBpbmZsYXRlRmFjdG9yOiB0aGlzLmluZmxhdGVJbnB1dC52YWx1ZSA/PyBkZWZhdWx0TUNMT3B0aW9ucy5pbmZsYXRlRmFjdG9yLFxuICAgICAgfTtcbiAgICB9XG59XG4iXX0=","export default class BitArray {\n constructor(arg, defaultValue = false) {\n this._length = 0;\n this._version = 0;\n this._updateLevel = 0;\n this._selectedCount = 0;\n this._selectedCountVersion = -1;\n this._selectedIndexesVersion = -1;\n this._versionedName = '';\n this._versionedNameVersion = -1;\n this.SHRINK_THRESHOLD = 0x100;\n if (typeof arg === 'number') {\n const length = arg;\n const buff = BitArray._createBuffer(length);\n if (defaultValue) {\n for (let i = 0; i < buff.length; i++)\n buff[i] = -1;\n }\n this._data = buff;\n this._length = length;\n }\n else if (arg instanceof Uint32Array) {\n this._data = arg;\n this._length = defaultValue;\n }\n else {\n throw new Error('Invalid constructor');\n }\n }\n getRawData() { return this._data; }\n assureGoez(num, argName) {\n if (num < 0)\n throw new Error(`${argName} should be greater than zero`);\n }\n assureInRange(value, min, max, argName) {\n if ((value < min) || (value > max))\n throw new Error(`Argument ${argName} (${value}) out of range (${min}, ${max})`);\n }\n copy(src, dst, count) {\n for (let i = 0; i < count; i++)\n dst[i] = src[i];\n }\n copyFrom(other) {\n if (this._length != other._length)\n throw new Error(`Lengths differ (${this._length} != ${other._length})`);\n this.copy(other._data, this._data, this.lengthInInts);\n this._version++;\n }\n get length() {\n return this._length;\n }\n get buffer() {\n return this._data;\n }\n set buffer(data) {\n this._data = data;\n this._version++;\n }\n get version() {\n return this._version;\n }\n set version(value) {\n this._version = value;\n }\n incrementVersion(notify = true) {\n this._version++;\n }\n get lengthInInts() {\n return Math.floor((this._length + 0x1f) / 0x20);\n }\n get versionedName() {\n return this._version == this._versionedNameVersion ? this._versionedName : '';\n }\n set versionedName(name) {\n this._versionedName = name;\n this._versionedNameVersion = this._version;\n }\n get self() {\n return this;\n }\n setLength(value) {\n if (value < 0)\n throw new Error('should be >= 0');\n if (value == this._length)\n return;\n const nIntsNeeded = Math.floor((value + 0x1f) / 0x20);\n if ((nIntsNeeded > this._data.length) || ((nIntsNeeded + this.SHRINK_THRESHOLD) < this._data.length)) {\n const newData = new Uint32Array(nIntsNeeded);\n this.copy(this._data, newData, (nIntsNeeded > this._data.length) ? this._data.length : nIntsNeeded);\n this._data = newData;\n }\n if (value > this._length) {\n if (this._length % 0x20 > 0)\n this._data[this.lengthInInts - 1] &= (1 << ((this._length % 0x20) & 0x1f)) - 1;\n this._data.fill(0, this.lengthInInts, nIntsNeeded);\n }\n this._length = value;\n this._version++;\n }\n static fromAnd(set1, set2) {\n if (set1._length != set2._length)\n throw new Error(`Lengths differ (${set1._length} != ${set2._length})`);\n const temp = new BitArray(set1._length);\n temp._length = set1._length;\n temp._data = BitArray._createBuffer(temp._length);\n temp._version = 0;\n const len = set1.lengthInInts;\n for (let i = 0; i < len; i++)\n temp._data[i] = set1._data[i] & set2._data[i];\n return temp;\n }\n static _createBuffer(length) {\n return new Uint32Array(Math.floor((length + 0x1f) / 0x20));\n }\n static fromValues(values) {\n const temp = new BitArray(values.length);\n temp._version = 0;\n for (let i = 0; i < temp._length; i++) {\n if (values[i])\n temp._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n return temp;\n }\n /// Constructs a [BitSet] of length [count], where idx-th bit is determined by a call to [flag] (idx).\n static fromSeq(count, flag) {\n const temp = new BitArray(count);\n for (let i = 0; i < count; ++i)\n temp.setBit(i, flag(i));\n temp._version = 0;\n return temp;\n }\n /// Constructs a [BitSet] from a string [s] containing '0' or '1'.\n static fromString(s) {\n return BitArray.fromSeq(s.length, (i) => s.charAt(i) == '1');\n }\n /// Constructs a [BitSet], based on length [_length] and byte array [_data].\n static fromUint32Array(_length, _data) {\n const temp = new BitArray(_length);\n temp._data = _data;\n return temp;\n }\n /// Deserializes a [BitSet] from [bytes].\n static fromBytes(bytes) {\n const len = bytes.length;\n const temp = new BitArray(len * 8);\n temp._data = new Uint32Array(Math.floor((len + 3) / 4));\n temp._length = len * 8;\n let num1 = 0;\n let num2 = 0;\n while ((len - num2) >= 4) {\n temp._data[num1++] = (((bytes[num2] & 0xff) | ((bytes[num2 + 1] & 0xff) << 8)) |\n ((bytes[num2 + 2] & 0xff) << 0x10)) | ((bytes[num2 + 3] & 0xff) << 0x18);\n num2 += 4;\n }\n if (len - num2 == 3)\n temp._data[num1] = (bytes[num2 + 2] & 0xff) << 0x10;\n if (len - num2 == 2)\n temp._data[num1] |= (bytes[num2 + 1] & 0xff) << 8;\n if (len - num2 == 1)\n temp._data[num1] |= bytes[num2] & 0xff;\n temp._version = 0;\n return temp;\n }\n toString() {\n return `${this._length} bits, ${this.countBits(true)} set`;\n }\n /// Performs deep comparison of two bitsets.\n equals(other) {\n if (this == other)\n return true;\n if (other == null)\n return false;\n if (this._length != other._length)\n return false;\n if (this._length == 0)\n return true;\n for (let i = 0; i < this._data.length - 1; i++)\n if (this._data[i] != other._data[i])\n return false;\n for (let i = (this._data.length - 1) * 8; i < this._length; i++) {\n if (this.getBit(i) != other.getBit(i))\n return false;\n }\n return true;\n }\n /** Clones a bitset. */\n clone() {\n const bitArray = new BitArray(0, false);\n bitArray._data = Uint32Array.from(this._data); // effective length: (lengthInInts)\n bitArray._length = this._length;\n bitArray._version = this._version;\n return bitArray;\n }\n /** Initializes a bitset. */\n init(flag, notify) {\n this.setAll(false, false);\n for (let i = 0; i < this._length; i++) {\n if (flag(i))\n this._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts a bitset.\n invert(notify = true) {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] ^= -1;\n this.incrementVersion(notify);\n }\n /// Sets all bits to [value], optionally suppressing notifications.\n setAll(value, notify = false) {\n const flags = value ? -1 : 0;\n const len = this.lengthInInts;\n for (let i = 0; i < len; i++) //todo: optimize\n this._data[i] = flags;\n this.incrementVersion(notify);\n }\n /// Sets bits at [indexes] position to [value].\n /// Clears the bitset if [clear] flag is true.\n /// Change notification is raised when [notify] is true.\n setIndexes(indexes, value = true, clear = true, notify = true) {\n if (clear)\n this.setAll(!value, false);\n for (const i of indexes)\n this.setFast(i, value);\n this.incrementVersion(notify);\n }\n everyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) != value)\n return false;\n }\n return true;\n }\n anyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) == value)\n return true;\n }\n return false;\n }\n setWhere(check, value = true, clear = true, notify = true, allowClear = true) {\n if (clear && allowClear)\n this.setAll(!value, false);\n if (allowClear) {\n for (let i = 0; i < this._length; i++) {\n if (check(i))\n this.setFast(i, value);\n }\n }\n else {\n for (let i = 0; i < this._length; i++)\n this.setFast(i, check(i) ? value : !value);\n }\n this.incrementVersion(notify);\n }\n getRange(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return BitArray.fromValues(arr);\n }\n getRangeAsList(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return arr;\n }\n setRange(from, to, value, notify = true) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length - 1, 'to');\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n //todo: optimize\n if (value) {\n for (let i = start; i <= end; i++)\n this.setTrue(i);\n }\n else {\n for (let i = start; i <= end; i++)\n this.setFalse(i);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Sets n randomly chosen bits to value, remaining bits to !value.\n setRandom(n, value, notify = true) {\n if (n < 0 || n > this._length)\n throw new Error('n must be >= 0 && <= Count');\n if (n > this._length / 2)\n this.setRandom(this._length - n, !value);\n this.setAll(!value);\n for (let k = 0; k < n;) {\n const i = Math.floor(Math.random() * this._length);\n if (this.getBit(i) == value)\n continue;\n this.setFast(i, value);\n k++;\n }\n this.incrementVersion(notify);\n }\n /// Modifies current bitset by performing the bitwise AND operation against the\n /// corresponding elements in the specified bitset.\n and(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] &= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise AND NOT operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n andNot(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n const len = this.lengthInInts;\n for (let num2 = 0; num2 < len; num2++)\n this._data[num2] &= ~value._data[num2];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise NOT AND operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n notAnd(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = (~this._data[i]) & value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts all bit values in the current bitset\n not(notify = true) {\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = ~this._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n or(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] |= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise exclusive OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n xor(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] ^= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inserts n 0-bits at position pos, resizing self and shifting bits appropriately.\n insertAt(pos, n, flag = false) {\n this.assureInRange(pos, 0, this._length, 'pos');\n if (n == 0)\n return;\n //TODO: optimize\n //the most primitive implementation, optimize it later!\n // beginUpdate();\n const oldlength = this._length;\n this.setLength(this._length + n);\n //if (!contains(!flag)) return; // nothing to do\n for (let i = oldlength - 1; i >= pos; i--)\n this.setBit(i + n, this.getBit(i));\n for (let i = pos; i < pos + n; i++)\n this.setBit(i, flag);\n // endUpdate();\n }\n /// Deletes n bits beginning at position pos, resizing self and shifting remaining\n /// bits appropriately.\n removeAt(pos, n = 1) {\n // the most primitive implementation, optimize it later!\n if (n < 0)\n throw new Error('n cannot be negative');\n this.assureInRange(pos, 0, this._length - n, 'pos');\n if (this.contains(true)) {\n for (let i = pos; i < this._length - n; i++)\n this.setBit(i, this.getBit(i + n));\n }\n this.setLength(this._length - n);\n }\n removeByMask(mask, flag = true) {\n if (this._length != mask.length)\n throw new Error('length != mask.length');\n if (mask == this) { // no need to iterate\n this.setLength(mask.countBits(!flag));\n this.setAll(!flag);\n }\n else {\n let dstIdx = 0;\n for (let srcIdx = -1; (srcIdx = mask.findNext(srcIdx, !flag)) != -1;)\n this.setFast(dstIdx++, this.getBit(srcIdx));\n this._length = dstIdx;\n this._version++;\n }\n return this;\n }\n /// Similar to the [] operator.\n getBit(pos) {\n return (this._data[Math.floor(pos / 0x20)] & (1 << (pos & 0x1f))) != 0;\n }\n /// Similar to the [] operator.\n setBit(pos, bit, notify = true) {\n this.setFast(pos, bit);\n if (notify)\n this._version++;\n else\n this._version++;\n }\n /// Sets [i]-th bit to [value], does not check bounds, does not increment version\n setFast(i, value) {\n if (value)\n this._data[Math.floor(i / 0x20)] |= 1 << (i & 0x1f);\n else\n this._data[Math.floor(i / 0x20)] &= ~(1 << (i & 0x1f));\n }\n setTrue(pos) {\n this._data[Math.floor(pos / 0x20)] |= 1 << (pos & 0x1f);\n }\n setFalse(pos) {\n this._data[Math.floor(pos / 0x20)] &= ~(1 << (pos & 0x1f));\n }\n trueCount() {\n return this.countBits(true);\n }\n falseCount() {\n return this.countBits(false);\n }\n /// Counts bits of the specified value.\n countBits(value) {\n if (this._length == 0)\n return 0;\n if (this._selectedCountVersion != this._version) {\n this._selectedCount = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i]; k != 0; k >>>= 8) { //todo: cast data[i] to uint\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n }\n }\n // The last int.\n let k = this._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0) /* if remainingBits == 0, the last int is fully used and ALL bits should be left as is */\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n this._selectedCountVersion = this._version;\n }\n return (value ? this._selectedCount : this._length - this._selectedCount);\n }\n /// Returns a number of set bits where also [check] is true\n countWhere(check) {\n let result = 0;\n if (this.trueCount() == this._length) {\n for (let i = 0; i < this._length; i++)\n result += check(i) ? 1 : 0;\n }\n else {\n for (let i = -1; (i = this.findNext(i, true)) != -1;)\n result += check(i) ? 1 : 0;\n }\n return result;\n }\n /// Performs bit \"and\" and counts bits of the specified value, without bitset modification.\n andWithCountBits(second, value) {\n if (this._length == 0)\n return 0;\n let count = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i] & second._data[i]; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n }\n // The last int.\n let k = this._data[i] & second._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0)\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n return (value ? count : this._length - count);\n }\n clear() {\n this.setLength(0);\n }\n contains(value) {\n return this.findNext(-1, value) >= 0;\n }\n get allTrue() {\n return this.countBits(true) == this._length;\n }\n get allFalse() {\n return this.countBits(false) == this._length;\n }\n get anyTrue() {\n return this.countBits(true) > 0;\n }\n get anyFalse() {\n return this.countBits(false) > 0;\n }\n /// Returns the position of the next bit of the specified value, starting from the specified position.\n /// Returns -1, if there are no such bits.\n findNext(index, value = true) {\n this.assureInRange(index, -1, this._length, 'index');\n if (index >= this._length - 1)\n return -1;\n index = index < 0 ? 0 : index + 1; // skip start\n let unusedBits = index & 0x1f;\n const numInts = this.lengthInInts;\n for (let i = Math.floor(index / 32); i < numInts; i++) {\n let k = (value ? this._data[i] : ~this._data[i]); // uint cast\n if (unusedBits != 0) {\n k &= ((0xffffffff << unusedBits) & 0xffffffff);\n unusedBits = 0;\n }\n else if (!value && k == -4294967296) /* looking for false, all bits are set */ {\n continue;\n }\n for (let j = 0; k != 0; j += 8, k >>>= 8) {\n const p = BitArray._firstOnBit[k & 0xff];\n if (p >= 0) {\n index = p + (i * 32) + j;\n if (index >= this._length)\n return -1;\n return index;\n }\n }\n }\n return -1;\n }\n /// Finds previous bit of the specified value in the bitset.\n findPrev(index, value = true) {\n if (index == 0)\n return -1;\n this.assureInRange(index, -1, this._length, 'index');\n index = index < 0 ? this._length - 1 : index - 1; // skip start\n const lastIntIdx = Math.floor(index / 0x20);\n let remainingBits = (index + 1) & 0x1f;\n for (let i = lastIntIdx; i >= 0; i--) {\n let k = (value ? this._data[i] : ~this._data[i]); // cast\n if (remainingBits != 0) {\n k &= ~((4294967295) << remainingBits);\n remainingBits = 0;\n }\n for (let j = 24; k != 0; j -= 8, k <<= 8) {\n const p = BitArray._lastOnBit[k >>> 0x18];\n if (p >= 0)\n return p + (i * 32) + j;\n }\n }\n return -1;\n }\n}\nBitArray._onBitCount = Int8Array.from([\n 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8\n]);\nBitArray._firstOnBit = Int8Array.from([\n -1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0\n]);\nBitArray._lastOnBit = Int8Array.from([\n -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7\n]);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYml0LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUTtJQW9FM0IsWUFBWSxHQUF5QixFQUFFLGVBQWlDLEtBQUs7UUFackUsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25CLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDdkI7YUFBTSxJQUFJLEdBQUcsWUFBWSxXQUFXLEVBQUU7WUFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFrQixDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBc0IsQ0FBQztTQUN2QzthQUFNO1lBQ0wsTUFBTSxJ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QUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FBQyxDQUFDLENBQUM7QUFFNUMsb0JBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUFDLENBQUMsQ0FBQztBQUU1QyxtQkFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQy9DLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQml0QXJyYXkge1xuICBzdGF0aWMgX29uQml0Q291bnQgPSBJbnQ4QXJyYXkuZnJvbShbXG4gICAgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNCxcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgNSwgNiwgNiwgNywgNiwgNywgNywgOF0pO1xuXG4gIHN0YXRpYyBfZmlyc3RPbkJpdCA9IEludDhBcnJheS5mcm9tKFtcbiAgICAtMSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA2LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDcsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNiwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMF0pO1xuXG4gIHN0YXRpYyBfbGFzdE9uQml0ID0gSW50OEFycmF5LmZyb20oW1xuICAgIC0xLCAwLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLFxuICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3XSk7XG5cbiAgcHJpdmF0ZSBfZGF0YTogVWludDMyQXJyYXk7XG4gIHByaXZhdGUgX2xlbmd0aCA9IDA7XG4gIHByaXZhdGUgX3ZlcnNpb24gPSAwO1xuICBwcml2YXRlIF91cGRhdGVMZXZlbCA9IDA7XG4gIHByaXZhdGUgX3NlbGVjdGVkQ291bnQgPSAwO1xuICBwcml2YXRlIF9zZWxlY3RlZENvdW50VmVyc2lvbiA9IC0xO1xuICBwcml2YXRlIF9zZWxlY3RlZEluZGV4ZXNWZXJzaW9uID0gLTE7XG4gIHByaXZhdGUgX3ZlcnNpb25lZE5hbWUgPSAnJztcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkTmFtZVZlcnNpb24gPSAtMTtcbiAgU0hSSU5LX1RIUkVTSE9MRCA9IDB4MTAwO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFVpbnQzMkFycmF5LCBsZW5ndGg6IG51bWJlcilcbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4pXG4gIGNvbnN0cnVjdG9yKGFyZzogbnVtYmVyIHwgVWludDMyQXJyYXksIGRlZmF1bHRWYWx1ZTogYm9vbGVhbiB8IG51bWJlciA9IGZhbHNlKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBhcmc7XG4gICAgICBjb25zdCBidWZmID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcihsZW5ndGgpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmYubGVuZ3RoOyBpKyspXG4gICAgICAgICAgYnVmZltpXSA9IC0xO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YSA9IGJ1ZmY7XG4gICAgICB0aGlzLl9sZW5ndGggPSBsZW5ndGg7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkge1xuICAgICAgdGhpcy5fZGF0YSA9IGFyZyBhcyBVaW50MzJBcnJheTtcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRlZmF1bHRWYWx1ZSBhcyBudW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0UmF3RGF0YSgpIHsgcmV0dXJuIHRoaXMuX2RhdGE7IH1cblxuICBhc3N1cmVHb2V6KG51bTogbnVtYmVyLCBhcmdOYW1lOiBTdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobnVtIDwgMCkgdGhyb3cgbmV3IEVycm9yKGAke2FyZ05hbWV9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyb2ApO1xuICB9XG5cbiAgYXNzdXJlSW5SYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIGFyZ05hbWU6IFN0cmluZyk6IHZvaWQge1xuICAgIGlmICgodmFsdWUgPCBtaW4pIHx8ICh2YWx1ZSA+IG1heCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gKCR7dmFsdWV9KSBvdXQgb2YgcmFuZ2UgKCR7bWlufSwgJHttYXh9KWApO1xuICB9XG5cbiAgY29weShzcmM6IFVpbnQzMkFycmF5LCBkc3Q6IFVpbnQzMkFycmF5LCBjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKVxuICAgICAgZHN0W2ldID0gc3JjW2ldO1xuICB9XG5cbiAgY29weUZyb20ob3RoZXI6IEJpdEFycmF5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSBvdGhlci5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZW5ndGhzIGRpZmZlciAoJHt0aGlzLl9sZW5ndGh9ICE9ICR7b3RoZXIuX2xlbmd0aH0pYCk7XG4gICAgdGhpcy5jb3B5KG90aGVyLl9kYXRhLCB0aGlzLl9kYXRhLCB0aGlzLmxlbmd0aEluSW50cyk7XG4gICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGJ1ZmZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHNldCBidWZmZXIoZGF0YTogVWludDMyQXJyYXkpIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgfVxuXG4gIHNldCB2ZXJzaW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92ZXJzaW9uID0gdmFsdWU7XG4gIH1cblxuICBpbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgbGVuZ3RoSW5JbnRzKCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKCh0aGlzLl9sZW5ndGggKyAweDFmKSAvIDB4MjApO1xuICB9XG5cbiAgZ2V0IHZlcnNpb25lZE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gPT0gdGhpcy5fdmVyc2lvbmVkTmFtZVZlcnNpb24gPyB0aGlzLl92ZXJzaW9uZWROYW1lIDogJyc7XG4gIH1cblxuICBzZXQgdmVyc2lvbmVkTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lID0gbmFtZTtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lVmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICBnZXQgc2VsZigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExlbmd0aCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIGJlID49IDAnKTtcblxuICAgIGlmICh2YWx1ZSA9PSB0aGlzLl9sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuSW50c05lZWRlZCA9IE1hdGguZmxvb3IoKHZhbHVlICsgMHgxZikgLyAweDIwKTtcbiAgICBpZiAoKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpIHx8ICgobkludHNOZWVkZWQgKyB0aGlzLlNIUklOS19USFJFU0hPTEQpIDwgdGhpcy5fZGF0YS5sZW5ndGgpKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gbmV3IFVpbnQzMkFycmF5KG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuY29weSh0aGlzLl9kYXRhLCBuZXdEYXRhLCAobkludHNOZWVkZWQgPiB0aGlzLl9kYXRhLmxlbmd0aCkgPyB0aGlzLl9kYXRhLmxlbmd0aCA6IG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXdEYXRhO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+IHRoaXMuX2xlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX2xlbmd0aCAlIDB4MjAgPiAwKVxuICAgICAgICB0aGlzLl9kYXRhW3RoaXMubGVuZ3RoSW5JbnRzIC0gMV0gJj0gKDEgPDwgKCh0aGlzLl9sZW5ndGggJSAweDIwKSAmIDB4MWYpKSAtIDE7XG5cbiAgICAgIHRoaXMuX2RhdGEuZmlsbCgwLCB0aGlzLmxlbmd0aEluSW50cywgbkludHNOZWVkZWQpO1xuICAgIH1cbiAgICB0aGlzLl9sZW5ndGggPSB2YWx1ZTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBzdGF0aWMgZnJvbUFuZChzZXQxOiBCaXRBcnJheSwgc2V0MjogQml0QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgaWYgKHNldDEuX2xlbmd0aCAhPSBzZXQyLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExlbmd0aHMgZGlmZmVyICgke3NldDEuX2xlbmd0aH0gIT0gJHtzZXQyLl9sZW5ndGh9KWApO1xuXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShzZXQxLl9sZW5ndGgpO1xuICAgIHRlbXAuX2xlbmd0aCA9IHNldDEuX2xlbmd0aDtcbiAgICB0ZW1wLl9kYXRhID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcih0ZW1wLl9sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgY29uc3QgbGVuID0gc2V0MS5sZW5ndGhJbkludHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIHRlbXAuX2RhdGFbaV0gPSBzZXQxLl9kYXRhW2ldICYgc2V0Mi5fZGF0YVtpXTtcblxuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2NyZWF0ZUJ1ZmZlcihsZW5ndGg6IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoKGxlbmd0aCArIDB4MWYpIC8gMHgyMCkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21WYWx1ZXModmFsdWVzOiBBcnJheTxib29sZWFuPik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlc1tpXSlcbiAgICAgICAgdGVtcC5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0gb2YgbGVuZ3RoIFtjb3VudF0sIHdoZXJlIGlkeC10aCBiaXQgaXMgZGV0ZXJtaW5lZCBieSBhIGNhbGwgdG8gW2ZsYWddIChpZHgpLlxuICBzdGF0aWMgZnJvbVNlcShjb3VudDogbnVtYmVyLCBmbGFnOiBGdW5jdGlvbik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpXG4gICAgICB0ZW1wLnNldEJpdChpLCBmbGFnKGkpKTtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBmcm9tIGEgc3RyaW5nIFtzXSBjb250YWluaW5nICcwJyBvciAnMScuXG4gIHN0YXRpYyBmcm9tU3RyaW5nKHM6IHN0cmluZyk6IEJpdEFycmF5IHtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVNlcShzLmxlbmd0aCwgKGk6IG51bWJlcikgPT4gcy5jaGFyQXQoaSkgPT0gJzEnKTtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0sIGJhc2VkIG9uIGxlbmd0aCBbX2xlbmd0aF0gYW5kIGJ5dGUgYXJyYXkgW19kYXRhXS5cbiAgc3RhdGljIGZyb21VaW50MzJBcnJheShfbGVuZ3RoOiBudW1iZXIsIF9kYXRhOiBVaW50MzJBcnJheSk6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KF9sZW5ndGgpO1xuICAgIHRlbXAuX2RhdGEgPSBfZGF0YTtcbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQml0U2V0XSBmcm9tIFtieXRlc10uXG4gIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkobGVuICogOCk7XG4gICAgdGVtcC5fZGF0YSA9IG5ldyBVaW50MzJBcnJheShNYXRoLmZsb29yKChsZW4gKyAzKSAvIDQpKTtcbiAgICB0ZW1wLl9sZW5ndGggPSBsZW4gKiA4O1xuICAgIGxldCBudW0xID0gMDtcbiAgICBsZXQgbnVtMiA9IDA7XG5cbiAgICB3aGlsZSAoKGxlbiAtIG51bTIpID49IDQpIHtcbiAgICAgIHRlbXAuX2RhdGFbbnVtMSsrXSA9IChcbiAgICAgICAgKChieXRlc1tudW0yXSAmIDB4ZmYpIHwgKChieXRlc1tudW0yICsgMV0gJiAweGZmKSA8PCA4KSkgfFxuICAgICAgICAoKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTApXG4gICAgICApIHwgKChieXRlc1tudW0yICsgM10gJiAweGZmKSA8PCAweDE4KTtcblxuICAgICAgbnVtMiArPSA0O1xuICAgIH1cblxuICAgIGlmIChsZW4gLSBudW0yID09IDMpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdID0gKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTA7XG5cbiAgICBpZiAobGVuIC0gbnVtMiA9PSAyKVxuICAgICAgdGVtcC5fZGF0YVtudW0xXSB8PSAoYnl0ZXNbbnVtMiArIDFdICYgMHhmZikgPDwgODtcblxuICAgIGlmIChsZW4gLSBudW0yID09IDEpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdIHw9IGJ5dGVzW251bTJdICYgMHhmZjtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fbGVuZ3RofSBiaXRzLCAke3RoaXMuY291bnRCaXRzKHRydWUpfSBzZXRgO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIGRlZXAgY29tcGFyaXNvbiBvZiB0d28gYml0c2V0cy5cbiAgZXF1YWxzKG90aGVyOiBCaXRBcnJheSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gb3RoZXIuX2xlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoIC0gMTsgaSsrKVxuICAgICAgaWYgKHRoaXMuX2RhdGFbaV0gIT0gb3RoZXIuX2RhdGFbaV0pIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAobGV0IGkgPSAodGhpcy5fZGF0YS5sZW5ndGggLSAxKSAqIDg7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGkpICE9IG90aGVyLmdldEJpdChpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBDbG9uZXMgYSBiaXRzZXQuICovXG4gIGNsb25lKCk6IEJpdEFycmF5IHtcbiAgICBjb25zdCBiaXRBcnJheSA9IG5ldyBCaXRBcnJheSgwLCBmYWxzZSk7XG4gICAgYml0QXJyYXkuX2RhdGEgPSBVaW50MzJBcnJheS5mcm9tKHRoaXMuX2RhdGEpOyAvLyBlZmZlY3RpdmUgbGVuZ3RoOiAobGVuZ3RoSW5JbnRzKVxuICAgIGJpdEFycmF5Ll9sZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgYml0QXJyYXkuX3ZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xuICAgIHJldHVybiBiaXRBcnJheTtcbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplcyBhIGJpdHNldC4gKi9cbiAgaW5pdChmbGFnOiBGdW5jdGlvbiwgbm90aWZ5OiBib29sZWFuKTogQml0QXJyYXkge1xuICAgIHRoaXMuc2V0QWxsKGZhbHNlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZmxhZyhpKSlcbiAgICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYSBiaXRzZXQuXG4gIGludmVydChub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSBePSAtMTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYWxsIGJpdHMgdG8gW3ZhbHVlXSwgb3B0aW9uYWxseSBzdXBwcmVzc2luZyBub3RpZmljYXRpb25zLlxuICBzZXRBbGwodmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgZmxhZ3MgPSB2YWx1ZSA/IC0xIDogMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIC8vdG9kbzogb3B0aW1pemVcbiAgICAgIHRoaXMuX2RhdGFbaV0gPSBmbGFncztcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYml0cyBhdCBbaW5kZXhlc10gcG9zaXRpb24gdG8gW3ZhbHVlXS5cbiAgLy8vIENsZWFycyB0aGUgYml0c2V0IGlmIFtjbGVhcl0gZmxhZyBpcyB0cnVlLlxuICAvLy8gQ2hhbmdlIG5vdGlmaWNhdGlvbiBpcyByYWlzZWQgd2hlbiBbbm90aWZ5XSBpcyB0cnVlLlxuICBzZXRJbmRleGVzKGluZGV4ZXM6IEFycmF5PG51bWJlcj4sIHZhbHVlID0gdHJ1ZSwgY2xlYXIgPSB0cnVlLCBub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKGNsZWFyKVxuICAgICAgdGhpcy5zZXRBbGwoIXZhbHVlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kZXhlcylcbiAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGV2ZXJ5SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpICE9IHZhbHVlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYW55SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpID09IHZhbHVlKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2V0V2hlcmUoY2hlY2s6IEZ1bmN0aW9uLCB2YWx1ZSA9IHRydWUsIGNsZWFyID0gdHJ1ZSwgbm90aWZ5ID0gdHJ1ZSwgYWxsb3dDbGVhciA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoY2xlYXIgJiYgYWxsb3dDbGVhcilcbiAgICAgIHRoaXMuc2V0QWxsKCF2YWx1ZSwgZmFsc2UpO1xuXG4gICAgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoZWNrKGkpKVxuICAgICAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHRoaXMuc2V0RmFzdChpLCBjaGVjayhpKSA/IHZhbHVlIDogIXZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGdldFJhbmdlKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBBcnJheTxib29sZWFuPiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87ICsraSlcbiAgICAgIGFyci5wdXNoKHRoaXMuZ2V0Qml0KGkpKTtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVZhbHVlcyhhcnIpO1xuICB9XG5cbiAgZ2V0UmFuZ2VBc0xpc3QoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogYm9vbGVhbltdIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyArK2kpXG4gICAgICBhcnIucHVzaCh0aGlzLmdldEJpdChpKSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG5cbiAgc2V0UmFuZ2UoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5ID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCAtIDEsICd0bycpO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihmcm9tLCB0byk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5tYXgoZnJvbSwgdG8pO1xuXG4gICAgLy90b2RvOiBvcHRpbWl6ZVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKVxuICAgICAgICB0aGlzLnNldFRydWUoaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKylcbiAgICAgICAgdGhpcy5zZXRGYWxzZShpKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTZXRzIG4gcmFuZG9tbHkgY2hvc2VuIGJpdHMgdG8gdmFsdWUsIHJlbWFpbmluZyBiaXRzIHRvICF2YWx1ZS5cbiAgc2V0UmFuZG9tKG46IG51bWJlciwgdmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAobiA8IDAgfHwgbiA+IHRoaXMuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBtdXN0IGJlID49IDAgJiYgPD0gQ291bnQnKTtcblxuICAgIGlmIChuID4gdGhpcy5fbGVuZ3RoIC8gMilcbiAgICAgIHRoaXMuc2V0UmFuZG9tKHRoaXMuX2xlbmd0aCAtIG4sICF2YWx1ZSk7XG5cbiAgICB0aGlzLnNldEFsbCghdmFsdWUpO1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOykge1xuICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuX2xlbmd0aCk7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgPT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5zZXRGYXN0KGksIHZhbHVlKTtcbiAgICAgIGsrKztcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIC8vLyBNb2RpZmllcyBjdXJyZW50IGJpdHNldCBieSBwZXJmb3JtaW5nIHRoZSBiaXR3aXNlIEFORCBvcGVyYXRpb24gYWdhaW5zdCB0aGVcbiAgLy8vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSAmPSB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIEFORCBOT1Qgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZE5vdCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgIGZvciAobGV0IG51bTIgPSAwOyBudW0yIDwgbGVuOyBudW0yKyspXG4gICAgICB0aGlzLl9kYXRhW251bTJdICY9IH52YWx1ZS5fZGF0YVtudW0yXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIE5PVCBBTkQgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG5vdEFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9ICh+dGhpcy5fZGF0YVtpXSkgJiB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYWxsIGJpdCB2YWx1ZXMgaW4gdGhlIGN1cnJlbnQgYml0c2V0XG4gIG5vdChub3RpZnkgPSB0cnVlKTogQml0QXJyYXkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9IH50aGlzLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG9yKHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5ID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKylcbiAgICAgIHRoaXMuX2RhdGFbaV0gfD0gdmFsdWUuX2RhdGFbaV07XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyB0aGUgYml0d2lzZSBleGNsdXNpdmUgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIHhvcih2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldIF49IHZhbHVlLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gSW5zZXJ0cyBuIDAtYml0cyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIGJpdHMgYXBwcm9wcmlhdGVseS5cbiAgaW5zZXJ0QXQocG9zOiBudW1iZXIsIG46IG51bWJlciwgZmxhZyA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHBvcywgMCwgdGhpcy5fbGVuZ3RoLCAncG9zJyk7XG5cbiAgICBpZiAobiA9PSAwKSByZXR1cm47XG5cbiAgICAvL1RPRE86IG9wdGltaXplXG4gICAgLy90aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuXG4gICAgLy8gYmVnaW5VcGRhdGUoKTtcbiAgICBjb25zdCBvbGRsZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgdGhpcy5zZXRMZW5ndGgodGhpcy5fbGVuZ3RoICsgbik7XG5cbiAgICAvL2lmICghY29udGFpbnMoIWZsYWcpKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG9cblxuICAgIGZvciAobGV0IGkgPSBvbGRsZW5ndGggLSAxOyBpID49IHBvczsgaS0tKVxuICAgICAgdGhpcy5zZXRCaXQoaSArIG4sIHRoaXMuZ2V0Qml0KGkpKTtcblxuICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBwb3MgKyBuOyBpKyspXG4gICAgICB0aGlzLnNldEJpdChpLCBmbGFnKTtcblxuICAgIC8vIGVuZFVwZGF0ZSgpO1xuICB9XG5cbiAgLy8vIERlbGV0ZXMgbiBiaXRzIGJlZ2lubmluZyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIHJlbWFpbmluZ1xuICAvLy8gYml0cyBhcHByb3ByaWF0ZWx5LlxuICByZW1vdmVBdChwb3M6IG51bWJlciwgbiA9IDEpOiB2b2lkIHtcbiAgICAvLyB0aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuICAgIGlmIChuIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcblxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShwb3MsIDAsIHRoaXMuX2xlbmd0aCAtIG4sICdwb3MnKTtcblxuICAgIGlmICh0aGlzLmNvbnRhaW5zKHRydWUpKSB7XG4gICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgdGhpcy5fbGVuZ3RoIC0gbjsgaSsrKVxuICAgICAgICB0aGlzLnNldEJpdChpLCB0aGlzLmdldEJpdChpICsgbikpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0TGVuZ3RoKHRoaXMuX2xlbmd0aCAtIG4pO1xuICB9XG5cbiAgcmVtb3ZlQnlNYXNrKG1hc2s6IEJpdEFycmF5LCBmbGFnID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG1hc2subGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsZW5ndGggIT0gbWFzay5sZW5ndGgnKTtcblxuICAgIGlmIChtYXNrID09IHRoaXMpIHsgLy8gbm8gbmVlZCB0byBpdGVyYXRlXG4gICAgICB0aGlzLnNldExlbmd0aChtYXNrLmNvdW50Qml0cyghZmxhZykpO1xuICAgICAgdGhpcy5zZXRBbGwoIWZsYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZHN0SWR4ID0gMDtcblxuICAgICAgZm9yIChsZXQgc3JjSWR4ID0gLTE7IChzcmNJZHggPSBtYXNrLmZpbmROZXh0KHNyY0lkeCwgIWZsYWcpKSAhPSAtMTspXG4gICAgICAgIHRoaXMuc2V0RmFzdChkc3RJZHgrKywgdGhpcy5nZXRCaXQoc3JjSWR4KSk7XG5cbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRzdElkeDtcbiAgICAgIHRoaXMuX3ZlcnNpb24rKztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgZ2V0Qml0KHBvczogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9kYXRhW01hdGguZmxvb3IocG9zIC8gMHgyMCldICYgKDEgPDwgKHBvcyAmIDB4MWYpKSkgIT0gMDtcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgc2V0Qml0KHBvczogbnVtYmVyLCBiaXQ6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpIHtcbiAgICB0aGlzLnNldEZhc3QocG9zLCBiaXQpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICB0aGlzLl92ZXJzaW9uKys7XG4gICAgZWxzZVxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgLy8vIFNldHMgW2ldLXRoIGJpdCB0byBbdmFsdWVdLCBkb2VzIG5vdCBjaGVjayBib3VuZHMsIGRvZXMgbm90IGluY3JlbWVudCB2ZXJzaW9uXG4gIHNldEZhc3QoaTogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSlcbiAgICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihpIC8gMHgyMCldIHw9IDEgPDwgKGkgJiAweDFmKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSAmPSB+KDEgPDwgKGkgJiAweDFmKSk7XG4gIH1cblxuICBzZXRUcnVlKHBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSB8PSAxIDw8IChwb3MgJiAweDFmKTtcbiAgfVxuXG4gIHNldEZhbHNlKHBvczogbnVtYmVyKSB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSAmPSB+KDEgPDwgKHBvcyAmIDB4MWYpKTtcbiAgfVxuXG4gIHRydWVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKTtcbiAgfVxuXG4gIGZhbHNlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpO1xuICB9XG5cbiAgLy8vIENvdW50cyBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gIGNvdW50Qml0cyh2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCA9PSAwKSByZXR1cm4gMDtcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgayA9IHRoaXMuX2RhdGFbaV07IGsgIT0gMDsgayA+Pj49IDgpIHsgLy90b2RvOiBjYXN0IGRhdGFbaV0gdG8gdWludFxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBsYXN0IGludC5cbiAgICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkgLyogaWYgcmVtYWluaW5nQml0cyA9PSAwLCB0aGUgbGFzdCBpbnQgaXMgZnVsbHkgdXNlZCBhbmQgQUxMIGJpdHMgc2hvdWxkIGJlIGxlZnQgYXMgaXMgKi9cbiAgICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcblxuICAgICAgZm9yICg7IGsgIT0gMDsgayA+Pj49IDgpXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuXG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuICh2YWx1ZSA/IHRoaXMuX3NlbGVjdGVkQ291bnQgOiB0aGlzLl9sZW5ndGggLSB0aGlzLl9zZWxlY3RlZENvdW50KTtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIGEgbnVtYmVyIG9mIHNldCBiaXRzIHdoZXJlIGFsc28gW2NoZWNrXSBpcyB0cnVlXG4gIGNvdW50V2hlcmUoY2hlY2s6IEZ1bmN0aW9uKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBpZiAodGhpcy50cnVlQ291bnQoKSA9PSB0aGlzLl9sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHJlc3VsdCArPSBjaGVjayhpKSA/IDEgOiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gLTE7IChpID0gdGhpcy5maW5kTmV4dChpLCB0cnVlKSkgIT0gLTE7KVxuICAgICAgICByZXN1bHQgKz0gY2hlY2soaSkgPyAxIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyBiaXQgXCJhbmRcIiBhbmQgY291bnRzIGJpdHMgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgd2l0aG91dCBiaXRzZXQgbW9kaWZpY2F0aW9uLlxuICBhbmRXaXRoQ291bnRCaXRzKHNlY29uZDogQml0QXJyYXksIHZhbHVlOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiAwO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGsgPSB0aGlzLl9kYXRhW2ldICYgc2Vjb25kLl9kYXRhW2ldOyBrICE9IDA7IGsgPj4+PSA4KVxuICAgICAgICBjb3VudCArPSBCaXRBcnJheS5fb25CaXRDb3VudFtrICYgMHhmZl07XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhc3QgaW50LlxuICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTtcbiAgICBjb25zdCByZW1haW5pbmdCaXRzID0gdGhpcy5fbGVuZ3RoICYgMHgxZjtcbiAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKVxuICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcbiAgICBmb3IgKDsgayAhPSAwOyBrID4+Pj0gOClcbiAgICAgIGNvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcblxuICAgIHJldHVybiAodmFsdWUgPyBjb3VudCA6IHRoaXMuX2xlbmd0aCAtIGNvdW50KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TGVuZ3RoKDApO1xuICB9XG5cbiAgY29udGFpbnModmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maW5kTmV4dCgtMSwgdmFsdWUpID49IDA7XG4gIH1cblxuICBnZXQgYWxsVHJ1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHModHJ1ZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFsbEZhbHNlKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFueVRydWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpID4gMDtcbiAgfVxuXG4gIGdldCBhbnlGYWxzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpID4gMDtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLlxuICAvLy8gUmV0dXJucyAtMSwgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggYml0cy5cbiAgZmluZE5leHQoaW5kZXg6IG51bWJlciwgdmFsdWUgPSB0cnVlKTogbnVtYmVyIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoaW5kZXgsIC0xLCB0aGlzLl9sZW5ndGgsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4ID49IHRoaXMuX2xlbmd0aCAtIDEpIHJldHVybiAtMTtcbiAgICBpbmRleCA9IGluZGV4IDwgMCA/IDAgOiBpbmRleCArIDE7IC8vIHNraXAgc3RhcnRcbiAgICBsZXQgdW51c2VkQml0cyA9IGluZGV4ICYgMHgxZjtcbiAgICBjb25zdCBudW1JbnRzID0gdGhpcy5sZW5ndGhJbkludHM7XG5cbiAgICBmb3IgKGxldCBpID0gTWF0aC5mbG9vcihpbmRleCAvIDMyKTsgaSA8IG51bUludHM7IGkrKykge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyB1aW50IGNhc3RcbiAgICAgIGlmICh1bnVzZWRCaXRzICE9IDApIHtcbiAgICAgICAgayAmPSAoKDB4ZmZmZmZmZmYgPDwgdW51c2VkQml0cykgJiAweGZmZmZmZmZmKTtcbiAgICAgICAgdW51c2VkQml0cyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiBrID09IC00Mjk0OTY3Mjk2KSAvKiBsb29raW5nIGZvciBmYWxzZSwgYWxsIGJpdHMgYXJlIHNldCAqL3tcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBrICE9IDA7IGogKz0gOCwgayA+Pj49IDgpIHtcbiAgICAgICAgY29uc3QgcCA9IEJpdEFycmF5Ll9maXJzdE9uQml0W2sgJiAweGZmXTtcbiAgICAgICAgaWYgKHAgPj0gMCkge1xuICAgICAgICAgIGluZGV4ID0gcCArIChpICogMzIpICsgajtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoKSByZXR1cm4gLTE7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vLyBGaW5kcyBwcmV2aW91cyBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGUgYml0c2V0LlxuICBmaW5kUHJldihpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xuICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gLTE7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKGluZGV4LCAtMSwgdGhpcy5fbGVuZ3RoLCAnaW5kZXgnKTtcblxuICAgIGluZGV4ID0gaW5kZXggPCAwID8gdGhpcy5fbGVuZ3RoIC0gMSA6IGluZGV4IC0gMTsgLy8gc2tpcCBzdGFydFxuXG4gICAgY29uc3QgbGFzdEludElkeCA9IE1hdGguZmxvb3IoaW5kZXggLyAweDIwKTtcbiAgICBsZXQgcmVtYWluaW5nQml0cyA9IChpbmRleCArIDEpICYgMHgxZjtcblxuICAgIGZvciAobGV0IGkgPSBsYXN0SW50SWR4OyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyBjYXN0XG4gICAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKSB7XG4gICAgICAgIGsgJj0gfigoNDI5NDk2NzI5NSkgPDwgcmVtYWluaW5nQml0cyk7XG4gICAgICAgIHJlbWFpbmluZ0JpdHMgPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaiA9IDI0OyBrICE9IDA7IGogLT0gOCwgayA8PD0gOCkge1xuICAgICAgICBjb25zdCBwID0gQml0QXJyYXkuX2xhc3RPbkJpdFtrID4+PiAweDE4XTtcbiAgICAgICAgaWYgKHAgPj0gMClcbiAgICAgICAgICByZXR1cm4gcCArIChpICogMzIpICsgajtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=","// Linear regression tools\n\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {_fitLinearRegressionParamsWithDataNormalizing} from '../wasm/EDAAPI';\nimport {getPlsAnalysis} from './pls/pls-tools';\n\n// Linear regression computations limits\nconst FATURES_COUNT_LIMIT = 1000;\nconst SAMPLES_COUNT_LIMIT = 1000000;\n\n// Default PLS components count\nconst PLS_COMPONENTS_COUNT = 10;\n\n// Wasm computations specific constants (see https://eigen.tuxfamily.org/dox/classEigen_1_1LDLT.html)\nconst BYTES_PER_VALUE = 4; // wasm computations operates 4-byte floats\nconst MEMORY_SCALE = 2; // due to the features of the Eigen lib decomposition\nconst BUFFERS_COUNT = 1; // due to the features of the Eigen lib decomposition\nconst WASM_MEMORY = 268435456; // wasm buffer size specified in '../scripts/module.json'\n\n/** Compute coefficients of linear regression */\nexport async function getLinearRegressionParams(features: DG.ColumnList, targets: DG.Column): Promise<Float32Array> {\n const featuresCount = features.length;\n const samplesCount = targets.length;\n\n const yAvg = targets.stats.avg;\n const yStdev = targets.stats.stdev;\n\n const params = new Float32Array(featuresCount + 1).fill(0);\n params[featuresCount] = yAvg;\n\n // The trivial case\n if ((yStdev === 0) || (samplesCount === 1))\n return params;\n\n try {\n // Analyze inputs sizes\n const inputsAnalysis = getInputsAnalysis(featuresCount, samplesCount);\n\n if (inputsAnalysis.toApplyPLS) {\n // Apply the PLS method\n const paramsByPLS = await getLinearRegressionParamsUsingPLS(features, targets, inputsAnalysis.components);\n\n let tmpSum = 0;\n\n // Compute bias (due to the centering feature of PLS)\n for (let i = 0; i < featuresCount; ++i) {\n params[i] = paramsByPLS[i];\n tmpSum += paramsByPLS[i] * features.byIndex(i).stats.avg;\n }\n\n params[featuresCount] -= tmpSum;\n\n return params;\n }\n\n // Non-constant columns data\n const nonConstFeatureColsIndeces: number[] = [];\n const nonConstFeatureCols: DG.Column[] = [];\n const nonConstFeatureAvgs = new Float32Array(featuresCount);\n const nonConstFeatureStdevs = new Float32Array(featuresCount);\n\n let idx = 0;\n let nonConstFeaturesCount = 0;\n\n // Extract non-constant columns data\n for (const col of features) {\n const stats = col.stats;\n\n if (stats.stdev > 0) {\n nonConstFeatureColsIndeces.push(idx);\n nonConstFeatureCols.push(col);\n nonConstFeatureAvgs[nonConstFeaturesCount] = stats.avg;\n nonConstFeatureStdevs[nonConstFeaturesCount] = stats.stdev;\n ++nonConstFeaturesCount;\n }\n\n ++idx;\n }\n\n // The trivial case\n if (nonConstFeaturesCount === 0)\n return params;\n\n // Compute parameters of linear regression\n const tempParams = _fitLinearRegressionParamsWithDataNormalizing(\n DG.DataFrame.fromColumns(nonConstFeatureCols).columns,\n DG.Column.fromFloat32Array('xAvgs', nonConstFeatureAvgs, nonConstFeaturesCount),\n DG.Column.fromFloat32Array('xStdevs', nonConstFeatureStdevs, nonConstFeaturesCount),\n targets,\n yAvg,\n yStdev,\n nonConstFeaturesCount + 1,\n ).getRawData();\n\n // Extract params taking into account non-constant columns\n for (let i = 0; i < nonConstFeaturesCount; ++i)\n params[nonConstFeatureColsIndeces[i]] = tempParams[i];\n\n params[featuresCount] = tempParams[nonConstFeaturesCount];\n } catch (e) {\n grok.shell.error(`Fitted the trivial model: ${e instanceof Error ? e.message : 'due to the platform issue'}`);\n }\n\n return params;\n} // computeLinRegressionCoefs\n\n/** Return prediction of linear regression model */\nexport function getPredictionByLinearRegression(features: DG.ColumnList, params: Float32Array): DG.Column {\n const featuresCount = features.length;\n if (featuresCount !== params.length - 1)\n throw new Error('Incorrect parameters count');\n\n const col = features.byIndex(0);\n const samplesCount = col.length;\n const prediction = new Float32Array(samplesCount);\n\n let rawData = col.getRawData();\n const bias = params[featuresCount];\n let weight = params[0];\n\n for (let i = 0; i < samplesCount; ++i)\n prediction[i] = bias + weight * rawData[i];\n\n for (let j = 1; j < featuresCount; ++j) {\n rawData = features.byIndex(j).getRawData();\n weight = params[j];\n\n for (let i = 0; i < samplesCount; ++i)\n prediction[i] += weight * rawData[i];\n }\n\n return DG.Column.fromFloat32Array(\n features.getUnusedName('prediction'),\n prediction,\n samplesCount,\n );\n} // getPredictionByLinearRegression\n\n/** Generate test dataset */\nexport function getTestDatasetForLinearRegression(rowCount: number, colCount: number,\n featuresScale: number, featuresBias: number, paramsScale: number, paramsBias: number): DG.DataFrame {\n const df = grok.data.demo.randomWalk(rowCount, colCount + 1);\n const cols = df.columns;\n const noiseCol = cols.byIndex(colCount);\n noiseCol.name = 'y (noisy)';\n const yNoisy = noiseCol.getRawData();\n const y = new Float32Array(rowCount).fill(paramsBias);\n\n let idx = 0;\n let scale = 0;\n let bias = 0;\n let weight = 0;\n\n for (const col of cols) {\n col.name = `x${idx}`;\n scale = Math.random() * featuresScale;\n bias = Math.random() * featuresBias;\n const arr = col.getRawData();\n weight = Math.random() * paramsScale;\n\n for (let j = 0; j < rowCount; ++j) {\n arr[j] = scale * arr[j] + bias;\n y[j] += arr[j] * weight;\n }\n\n ++idx;\n\n if (idx === colCount)\n break;\n }\n\n scale = Math.random() * featuresScale;\n bias = Math.random() * featuresBias;\n\n for (let j = 0; j < rowCount; ++j)\n yNoisy[j] = scale * yNoisy[j] + y[j];\n\n cols.add(DG.Column.fromFloat32Array('y', y, rowCount));\n\n return df;\n} // getTestDatasetForLinearRegression\n\n/** Reteurn linear regression params using the PLS method */\nasync function getLinearRegressionParamsUsingPLS(features: DG.ColumnList,\n targets: DG.Column, components: number): Promise<Float32Array> {\n const plsAnalysis = await getPlsAnalysis({\n table: DG.DataFrame.fromColumns([targets]),\n features: features,\n predict: targets,\n components: components,\n names: null,\n });\n\n return plsAnalysis.regressionCoefficients.getRawData() as Float32Array;\n}\n\n/** Check wasm-buffer overflow */\nconst wasmBufferOverflow = (featuresCount: number, samplesCount: number) => {\n return MEMORY_SCALE * BYTES_PER_VALUE * samplesCount * (featuresCount + BUFFERS_COUNT) >= WASM_MEMORY;\n};\n\n/** Check whether to apply the PLS method & how many components to use */\nconst getInputsAnalysis = (featuresCount: number, samplesCount: number) => {\n if (wasmBufferOverflow(featuresCount, samplesCount) || (featuresCount >= FATURES_COUNT_LIMIT)) {\n return {\n toApplyPLS: true,\n components: PLS_COMPONENTS_COUNT,\n };\n }\n\n if (samplesCount >= SAMPLES_COUNT_LIMIT) {\n return {\n toApplyPLS: true,\n components: Math.min(PLS_COMPONENTS_COUNT, featuresCount),\n };\n }\n\n if (samplesCount <= featuresCount) {\n return {\n toApplyPLS: true,\n components: Math.min(PLS_COMPONENTS_COUNT, samplesCount),\n };\n }\n\n return {\n toApplyPLS: false,\n components: PLS_COMPONENTS_COUNT,\n };\n}; // getInputsAnalysis\n","/* eslint-disable camelcase */\n/* eslint-disable max-len */\n/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {_initEDAAPI} from '../wasm/EDAAPI';\nimport {computePCA} from './eda-tools';\nimport {addPrefixToEachColumnName, addOneWayAnovaVizualization} from './eda-ui';\nimport {testDataForBinaryClassification} from './data-generators';\nimport {LINEAR, RBF, POLYNOMIAL, SIGMOID,\n getTrainedModel, getPrediction, isApplicableSVM, isInteractiveSVM, showTrainReport, getPackedModel} from './svm';\n\nimport {PLS_ANALYSIS} from './pls/pls-constants';\nimport {runMVA, runDemoMVA, getPlsAnalysis, PlsOutput} from './pls/pls-tools';\n\nimport {oneWayAnova} from './stat-tools';\nimport {getDbscanWorker} from '@datagrok-libraries/math';\n\nimport {DistanceAggregationMethod, DistanceAggregationMethods} from '@datagrok-libraries/ml/src/distance-matrix/types';\nimport {MultiColumnDimReductionEditor} from\n '@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/multi-column-dim-reduction-editor';\nimport {multiColReduceDimensionality} from\n '@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/reduce-dimensionality';\nimport {KnownMetrics} from '@datagrok-libraries/ml/src/typed-metrics';\nimport {DimReductionMethods} from '@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/types';\n\nimport {runKNNImputer} from './missing-values-imputation/ui';\nimport {MCLEditor} from '@datagrok-libraries/ml/src/MCL/mcl-editor';\nimport {markovCluster} from '@datagrok-libraries/ml/src/MCL/clustering-view';\nimport {MCL_OPTIONS_TAG, MCLSerializableOptions} from '@datagrok-libraries/ml/src/MCL';\n\nimport {getLinearRegressionParams, getPredictionByLinearRegression, getTestDatasetForLinearRegression} from './regression';\n\nexport const _package = new DG.Package();\n\n//name: info\nexport function info() {\n grok.shell.info(_package.webRoot);\n}\n\n//tags: init\nexport async function init(): Promise<void> {\n await _initEDAAPI();\n}\n\n//top-menu: ML | Cluster | DBSCAN...\n//name: DBSCAN\n//description: Density-based spatial clustering of applications with noise (DBSCAN)\n//input: dataframe df\n//input: column xCol {type: numerical}\n//input: column yCol {type: numerical}\n//input: double epsilon = 0.02 {caption: Epsilon} [The maximum distance between two samples for them to be considered as in the same neighborhood.]\n//input: int minPts = 4 {caption: Minimum points} [The number of samples (or total weight) in a neighborhood for a point to be considered as a core point.]\n//output: column cluster\nexport async function dbScan(df: DG.DataFrame, xCol: DG.Column, yCol: DG.Column, epsilon: number, minPts: number) {\n const x = xCol.getRawData() as Float32Array;\n const y = yCol.getRawData() as Float32Array;\n const res = await getDbscanWorker(x, y, epsilon, minPts);\n const clusterColName = df.columns.getUnusedName('Cluster (DBSCAN)');\n const cluster = DG.Column.fromInt32Array(clusterColName, res);\n df.columns.add(cluster);\n return cluster;\n}\n\n//top-menu: ML | Analyze | PCA...\n//name: PCA\n//description: Principal component analysis (PCA)\n//input: dataframe table\n//input: column_list features {type: numerical}\n//input: int components = 2 {caption: Components} [Number of components.]\n//input: bool center = false [Indicating whether the variables should be shifted to be zero centered.]\n//input: bool scale = false [Indicating whether the variables should be scaled to have unit variance.]\nexport async function PCA(table: DG.DataFrame, features: DG.ColumnList, components: number, center: boolean, scale: boolean): Promise<void> {\n const pcaTable = await computePCA(table, features, components, center, scale);\n addPrefixToEachColumnName('PC', pcaTable.columns);\n\n if (table.id === null) // table is loaded from a local file\n grok.shell.addTableView(pcaTable);\n else {\n const cols = table.columns;\n\n for (const col of pcaTable.columns) {\n col.name = cols.getUnusedName(col.name);\n cols.add(col);\n }\n }\n}\n\n//name: DBSCAN clustering\n//tags: dim-red-postprocessing-function\n//meta.defaultPostProcessingFunction: true\n//input: column col1\n//input: column col2\n//input: double epsilon = 0.01 {default: 0.01}[Minimum distance between two points to be considered as in the same neighborhood.]\n//input: int minimumPoints = 5 {default: 5}[Minimum number of points to form a dense region.]\nexport async function dbscanPostProcessingFunction(col1: DG.Column, col2: DG.Column, epsilon: number, minimumPoints: number) {\n const df = col1.dataFrame;\n if (df === null)\n return;\n const resCol = await dbScan(df, col1, col2, epsilon, minimumPoints);\n df.changeColumnType(resCol, 'string');\n const colNames = [col1.name, col2.name];\n const tv = grok.shell.tableView(df.name);\n if (!tv)\n return;\n // find the correct scatterPlotViewer and set the colorColumnName\n for (const v of tv.viewers) {\n if (v instanceof DG.ScatterPlotViewer && colNames.includes(v.props.xColumnName) && colNames.includes(v.props.yColumnName)) {\n v.props.colorColumnName = resCol.name;\n return;\n }\n }\n}\n\n//name: None (number)\n//tags: dim-red-preprocessing-function\n//meta.supportedTypes: int,float,double,qnum\n//meta.supportedDistanceFunctions: Difference\n//input: column col\n//input: string _metric {optional: true}\n//output: object result\nexport function numberPreprocessingFunction(col: DG.Column, _metric: string) {\n const range = col.stats.max - col.stats.min;\n const entries = col.toList();\n return {entries, options: {range}};\n}\n\n//name: None (string)\n//tags: dim-red-preprocessing-function\n//meta.supportedTypes: string\n//meta.supportedDistanceFunctions: One-Hot,Levenshtein,Hamming\n//input: column col\n//input: string _metric {optional: true}\n//output: object result\nexport function stringPreprocessingFunction(col: DG.Column, _metric: string) {\n const entries = col.toList();\n return {entries, options: {}};\n}\n\n//top-menu: ML | Reduce Dimensionality...\n//name: Multi Column Dimensionality Reduction\nexport async function reduceDimensionality(): Promise<void> {\n const editor = new MultiColumnDimReductionEditor();\n const dialog = ui.dialog('Dimensionality reduction')\n .add(editor.getEditor())\n .onOK(async () => {\n const params = editor.getParams();\n if (params.columns.length === 0)\n return;\n await multiColReduceDimensionality(params.table, params.columns, params.methodName as DimReductionMethods,\n params.distanceMetrics as KnownMetrics[],\n params.weights, params.preprocessingFunctions, params.aggreaggregationMethod as DistanceAggregationMethods,\n !!params.plotEmbeddings, !!params.clusterEmbeddings, params.options, {\n fastRowCount: 10000,\n }, params.postProcessingFunction, params.postProcessingFunctionArgs);\n }).show();\n dialog.helpUrl = 'https://datagrok.ai/help/explore/dim-reduction.md';\n const validate = () => {\n const cols = editor.columnsInput.value;\n const okButton = dialog.getButton('OK');\n if (!okButton)\n return;\n const isDisabled = !cols || cols.length === 0;\n if (isDisabled)\n okButton.classList.add('disabled');\n else\n okButton.classList.remove('disabled');\n };\n editor.onColumnsChanged.subscribe(() => {\n try {\n validate();\n } catch (e) {\n console.error(e);\n }\n });\n validate();\n}\n\n//name: GetMCLEditor\n//tags: editor\n//input: funccall call\nexport function GetMCLEditor(call: DG.FuncCall): void {\n try {\n const funcEditor = new MCLEditor();\n ui.dialog('Markov clustering')\n .add(funcEditor.getEditor())\n .onOK(async () => {\n const params = funcEditor.params;\n return call.func.prepare({\n df: params.table, cols: params.columns, metrics: params.distanceMetrics,\n weights: params.weights, aggregationMethod: params.aggreaggregationMethod, preprocessingFuncs: params.preprocessingFunctions,\n preprocessingFuncArgs: params.preprocessingFuncArgs, threshold: params.threshold, maxIterations: params.maxIterations,\n useWebGPU: params.useWebGPU, inflate: params.inflateFactor,\n }).call(true);\n }).show();\n } catch (err: any) {\n const errMsg = err instanceof Error ? err.message : err.toString();\n const errStack = err instanceof Error ? err.stack : undefined;\n grok.shell.error(`Get region editor error: ${errMsg}`);\n _package.logger.error(errMsg, undefined, errStack);\n }\n}\n\n\n//top-menu: ML | Cluster | MCL...\n//name: MCL\n//description: Markov clustering (MCL) is an unsupervised clustering algorithm for graphs based on simulation of stochastic flow.\n//input: dataframe df\n//input: list<column> cols\n//input: list<string> metrics\n//input: list<double> weights\n//input: string aggregationMethod\n//input: list<func> preprocessingFuncs\n//input: object preprocessingFuncArgs\n//input: int threshold = 80\n//input: int maxIterations = 10\n//input: bool useWebGPU = false\n//input: double inflate = 2\n//editor: EDA: GetMCLEditor\nexport async function MCL(df: DG.DataFrame, cols: DG.Column[], metrics: KnownMetrics[],\n weights: number[], aggregationMethod: DistanceAggregationMethod, preprocessingFuncs: (DG.Func | null | undefined)[],\n preprocessingFuncArgs: any[], threshold: number = 80, maxIterations: number = 10, useWebGPU: boolean = false, inflate: number = 0,\n): Promise< DG.ScatterPlotViewer | undefined> {\n const tv = grok.shell.tableView(df.name) ?? grok.shell.addTableView(df);\n const serializedOptions: string = JSON.stringify({\n cols: cols.map((col) => col.name),\n metrics: metrics,\n weights: weights,\n aggregationMethod: aggregationMethod,\n preprocessingFuncs: preprocessingFuncs.map((func) => func?.name ?? null),\n preprocessingFuncArgs: preprocessingFuncArgs,\n threshold: threshold,\n maxIterations: maxIterations,\n useWebGPU: useWebGPU,\n inflate: inflate,\n } satisfies MCLSerializableOptions);\n df.setTag(MCL_OPTIONS_TAG, serializedOptions);\n\n const sc = tv.addViewer(DG.VIEWER.SCATTER_PLOT, {title: 'MCL', initializationFunction: 'EDA:MCLInitializationFunction'}) as DG.ScatterPlotViewer;\n return sc;\n}\n\n//name: MCLInitializationFunction\n//input: viewer sc\nexport async function MCLInitializationFunction(sc: DG.ScatterPlotViewer) {\n const df = sc.dataFrame;\n if (df === null)\n throw new Error('Data frame of the scatter plot is null');\n const mclTag = df.getTag(MCL_OPTIONS_TAG);\n if (!mclTag)\n throw new Error('MCL options tag on the dataFrame is not found');\n const options: MCLSerializableOptions = JSON.parse(mclTag);\n const cols = options.cols.map((colName) => df.columns.byName(colName));\n const preprocessingFuncs = options.preprocessingFuncs.map((funcName) => funcName ? DG.Func.byName(funcName) : null);\n const res = await markovCluster(df, cols, options.metrics, options.weights,\n options.aggregationMethod, preprocessingFuncs, options.preprocessingFuncArgs, options.threshold,\n options.maxIterations, options.useWebGPU, options.inflate, sc);\n return res?.sc;\n}\n\n//name: PLS\n//description: Compute partial least squares (PLS) regression analysis components: prediction, regression coefficients, T- & U-scores, X-loadings.\n//input: dataframe table\n//input: column_list features {type: numerical}\n//input: column predict {type: numerical}\n//input: int components = 3\n//input: column names {type: string}\n//output: object plsResults\nexport async function PLS(table: DG.DataFrame, features: DG.ColumnList, predict: DG.Column, components: number, names: DG.Column): Promise<PlsOutput> {\n return await getPlsAnalysis({\n table: table,\n features: features,\n predict: predict,\n components: components,\n names: names,\n });\n}\n\n//top-menu: ML | Analyze | PLS...\n//name: topMenuPLS\n//description: Compute partial least squares (PLS) regression components. They maximally summarize the variation of the predictors while maximizing correlation with the response variable.\nexport async function topMenuPLS(): Promise<void> {\n await runMVA(PLS_ANALYSIS.COMPUTE_COMPONENTS);\n}\n\n//top-menu: ML | Analyze | Multivariate Analysis...\n//name: multivariateAnalysis\n//description: Multidimensional data analysis using partial least squares (PLS) regression.\nexport async function MVA(): Promise<void> {\n await runMVA(PLS_ANALYSIS.PERFORM_MVA);\n}\n\n//name: MVA demo\n//description: Multidimensional data analysis using partial least squares (PLS) regression. It identifies latent factors and constructs a linear model based on them.\n//meta.demoPath: Compute | Multivariate analysis\nexport async function demoMultivariateAnalysis(): Promise<any> {\n runDemoMVA();\n}\n\n//name: Generate linear separable dataset\n//description: Generates linear separble dataset for testing binary classificators\n//input: string name = 'Data' {caption: name; category: Dataset}\n//input: int samplesCount = 1000 {caption: samples; category: Size}\n//input: int featuresCount = 2 {caption: features; category: Size}\n//input: double min = -39 {caption: min; category: Range}\n//input: double max = 173 {caption: max; category: Range}\n//input: double violatorsPercentage = 5 {caption: violators; units: %; category: Dataset}\n//output: dataframe df\nexport async function testDataLinearSeparable(name: string, samplesCount: number, featuresCount: number,\n min: number, max: number, violatorsPercentage: number): Promise<DG.DataFrame> {\n return await testDataForBinaryClassification(LINEAR, [0, 0], name, samplesCount, featuresCount,\n min, max, violatorsPercentage);\n}\n\n//name: Generate linear non-separable dataset\n//description: Generates linear non-separble dataset for testing binary classificators\n//input: string name = 'Data' {caption: name; category: Dataset}\n//input: double sigma = 90 {caption: sigma; category: Hyperparameters} [RBF-kernel paramater]\n//input: int samplesCount = 1000 {caption: samples; category: Size}\n//input: int featuresCount = 2 {caption: features; category: Size}\n//input: double min = -39 {caption: min; category: Range}\n//input: double max = 173 {caption: max; category: Range}\n//input: double violatorsPercentage = 5 {caption: violators; units: %; category: Dataset}\n//output: dataframe df\nexport async function testDataLinearNonSeparable(name: string, sigma: number, samplesCount: number,\n featuresCount: number, min: number, max: number, violatorsPercentage: number): Promise<DG.DataFrame> {\n return await testDataForBinaryClassification(RBF, [sigma, 0], name, samplesCount, featuresCount,\n min, max, violatorsPercentage);\n}\n\n//name: trainLinearKernelSVM\n//meta.mlname: linear kernel LS-SVM\n//meta.mlrole: train\n//input: dataframe df\n//input: column predictColumn\n//input: double gamma = 1.0 {category: Hyperparameters}\n//output: dynamic model\nexport async function trainLinearKernelSVM(df: DG.DataFrame, predictColumn: DG.Column,\n gamma: number): Promise<any> {\n const trainedModel = await getTrainedModel({gamma: gamma, kernel: LINEAR}, df, predictColumn);\n return getPackedModel(trainedModel);\n}\n\n//name: applyLinearKernelSVM\n//meta.mlname: linear kernel LS-SVM\n//meta.mlrole: apply\n//input: dataframe df\n//input: dynamic model\n//output: dataframe table\nexport async function applyLinearKernelSVM(df: DG.DataFrame, model: any): Promise<DG.DataFrame> {\n return await getPrediction(df, model);\n}\n\n//name: isApplicableLinearKernelSVM\n//meta.mlname: linear kernel LS-SVM\n//meta.mlrole: isApplicable\n//input: dataframe df\n//input: column predictColumn\n//output: bool result\nexport async function isApplicableLinearKernelSVM(df: DG.DataFrame, predictColumn: DG.Column): Promise<boolean> {\n return isApplicableSVM(df, predictColumn);\n}\n\n//name: isInteractiveLinearKernelSVM\n//meta.mlname: linear kernel LS-SVM\n//meta.mlrole: isInteractive\n//input: dataframe df\n//input: column predictColumn\n//output: bool result\nexport async function isInteractiveLinearKernelSVM(df: DG.DataFrame, predictColumn: DG.Column): Promise<boolean> {\n return isInteractiveSVM(df, predictColumn);\n}\n\n//name: visualizeLinearKernelSVM\n//meta.mlname: linear kernel LS-SVM\n//meta.mlrole: visualize\n//input: dataframe df\n//input: column targetColumn\n//input: column predictColumn\n//input: dynamic model\n//output: dynamic widget\nexport async function visualizeLinearKernelSVM(df: DG.DataFrame, targetColumn: DG.Column, predictColumn: DG.Column, model: any): Promise<any> {\n return showTrainReport(df, model);\n}\n\n\n//name: trainRBFkernelSVM\n//meta.mlname: RBF-kernel LS-SVM\n//meta.mlrole: train\n//input: dataframe df\n//input: column predictColumn\n//input: double gamma = 1.0 {category: Hyperparameters}\n//input: double sigma = 1.5 {category: Hyperparameters}\n//output: dynamic model\nexport async function trainRBFkernelSVM(df: DG.DataFrame, predictColumn: DG.Column,\n gamma: number, sigma: number): Promise<any> {\n const trainedModel = await getTrainedModel(\n {gamma: gamma, kernel: RBF, sigma: sigma},\n df, predictColumn);\n\n return getPackedModel(trainedModel);\n}\n\n//name: applyRBFkernelSVM\n//meta.mlname: RBF-kernel LS-SVM\n//meta.mlrole: apply\n//input: dataframe df\n//input: dynamic model\n//output: dataframe table\nexport async function applyRBFkernelSVM(df: DG.DataFrame, model: any): Promise<DG.DataFrame> {\n return await getPrediction(df, model);\n}\n\n//name: isApplicableRBFkernelSVM\n//meta.mlname: RBF-kernel LS-SVM\n//meta.mlrole: isApplicable\n//input: dataframe df\n//input: column predictColumn\n//output: bool result\nexport async function isApplicableRBFkernelSVM(df: DG.DataFrame, predictColumn: DG.Column): Promise<boolean> {\n return isApplicableSVM(df, predictColumn);\n}\n\n//name: isInteractiveRBFkernelSVM\n//meta.mlname: RBF-kernel LS-SVM\n//meta.mlrole: isInteractive\n//input: dataframe df\n//input: column predictColumn\n//output: bool result\nexport async function isInteractiveRBFkernelSVM(df: DG.DataFrame, predictColumn: DG.Column): Promise<boolean> {\n return isInteractiveSVM(df, predictColumn);\n}\n\n\n//name: visualizeRBFkernelSVM\n//meta.mlname: RBF-kernel LS-SVM\n//meta.mlrole: visualize\n//input: dataframe df\n//input: column targetColumn\n//input: column predictColumn\n//input: dynamic model\n//output: dynamic widget\nexport async function visualizeRBFkernelSVM(df: DG.DataFrame, targetColumn: DG.Column, predictColumn: DG.Column, model: any): Promise<any> {\n return showTrainReport(df, model);\n}\n\n//name: trainPolynomialKernelSVM\n//meta.mlname: polynomial kernel LS-SVM\n//meta.mlrole: train\n//input: dataframe df\n//input: column predictColumn\n//input: double gamma = 1.0 {category: Hyperparameters}\n//input: double c = 1 {category: Hyperparameters}\n//input: double d = 2 {category: Hyperparameters}\n//output: dynamic model\nexport async function trainPolynomialKernelSVM(df: DG.DataFrame, predictColumn: DG.Column,\n gamma: number, c: number, d: number): Promise<any> {\n const trainedModel = await getTrainedModel(\n {gamma: gamma, kernel: POLYNOMIAL, cParam: c, dParam: d},\n df, predictColumn);\n\n return getPackedModel(trainedModel);\n} // trainPolynomialKernelSVM\n\n//name: applyPolynomialKernelSVM\n//meta.mlname: polynomial kernel LS-SVM\n//meta.mlrole: apply\n//input: dataframe df\n//input: dynamic model\n//output: dataframe table\nexport async function applyPolynomialKernelSVM(df: DG.DataFrame, model: any): Promise<DG.DataFrame> {\n return await getPrediction(df, model);\n}\n\n//name: isApplicablePolynomialKernelSVM\n//meta.mlname: polynomial kernel LS-SVM\n//meta.mlrole: isApplicable\n//input: dataframe df\n//input: column predictColumn\n//output: bool result\nexport async function isApplicablePolynomialKernelSVM(df: DG.DataFrame, predictColumn: DG.Column): Promise<boolean> {\n return isApplicableSVM(df, predictColumn);\n}\n\n//name: isInteractivePolynomialKernelSVM\n//meta.mlname: polynomial kernel LS-SVM\n//meta.mlrole: isInteractive\n//input: dataframe df\n//input: column predictColumn\n//output: bool result\nexport async function isInteractivePolynomialKernelSVM(df: DG.DataFrame, predictColumn: DG.Column): Promise<boolean> {\n return isInteractiveSVM(df, predictColumn);\n}\n\n//name: visualizePolynomialKernelSVM\n//meta.mlname: polynomial kernel LS-SVM\n//meta.mlrole: visualize\n//input: dataframe df\n//input: column targetColumn\n//input: column predictColumn\n//input: dynamic model\n//output: dynamic widget\nexport async function visualizePolynomialKernelSVM(df: DG.DataFrame, targetColumn: DG.Column, predictColumn: DG.Column, model: any): Promise<any> {\n return showTrainReport(df, model);\n}\n\n//name: trainSigmoidKernelSVM\n//meta.mlname: sigmoid kernel LS-SVM\n//meta.mlrole: train\n//input: dataframe df\n//input: column predictColumn\n//input: double gamma = 1.0 {category: Hyperparameters}\n//input: double kappa = 1 {category: Hyperparameters}\n//input: double theta = 1 {category: Hyperparameters}\n//output: dynamic model\nexport async function trainSigmoidKernelSVM(df: DG.DataFrame, predictColumn: DG.Column,\n gamma: number, kappa: number, theta: number): Promise<any> {\n const trainedModel = await getTrainedModel(\n {gamma: gamma, kernel: SIGMOID, kappa: kappa, theta: theta},\n df, predictColumn);\n\n return getPackedModel(trainedModel);\n} // trainSigmoidKernelSVM\n\n//name: applySigmoidKernelSVM\n//meta.mlname: sigmoid kernel LS-SVM\n//meta.mlrole: apply\n//input: dataframe df\n//input: dynamic model\n//output: dataframe table\nexport async function applySigmoidKernelSVM(df: DG.DataFrame, model: any): Promise<DG.DataFrame> {\n return await getPrediction(df, model);\n}\n\n//name: isApplicableSigmoidKernelSVM\n//meta.mlname: sigmoid kernel LS-SVM\n//meta.mlrole: isApplicable\n//input: dataframe df\n//input: column predictColumn\n//output: bool result\nexport async function isApplicableSigmoidKernelSVM(df: DG.DataFrame, predictColumn: DG.Column): Promise<boolean> {\n return isApplicableSVM(df, predictColumn);\n}\n\n//name: isInteractiveSigmoidKernelSVM\n//meta.mlname: sigmoid kernel LS-SVM\n//meta.mlrole: isInteractive\n//input: dataframe df\n//input: column predictColumn\n//output: bool result\nexport async function isInteractiveSigmoidKernelSVM(df: DG.DataFrame, predictColumn: DG.Column): Promise<boolean> {\n return isInteractiveSVM(df, predictColumn);\n}\n\n//name: visualizeSigmoidKernelSVM\n//meta.mlname: sigmoid kernel LS-SVM\n//meta.mlrole: visualize\n//input: dataframe df\n//input: column targetColumn\n//input: column predictColumn\n//input: dynamic model\n//output: dynamic widget\nexport async function visualizeSigmoidKernelSVM(df: DG.DataFrame, targetColumn: DG.Column, predictColumn: DG.Column, model: any): Promise<any> {\n return showTrainReport(df, model);\n}\n\n//top-menu: ML | Analyze | ANOVA...\n//name: ANOVA\n//description: One-way analysis of variances (ANOVA) determines whether the examined factor has a significant impact on the studied feature.\n//input: dataframe table\n//input: column factor {type: categorical}\n//input: column feature {type: numerical}\n//input: double significance = 0.05 [The significance level is a value from the interval (0, 1) specifying the criterion used for rejecting the null hypothesis.]\n//input: bool validate = false [Indicates whether the normality of distribution and an eqaulity of varainces should be checked.]\nexport function anova(table: DG.DataFrame, factor: DG.Column, feature: DG.Column, significance: number, validate: boolean) {\n const res = oneWayAnova(factor, feature, significance, validate);\n addOneWayAnovaVizualization(table, factor, feature, res);\n}\n\n//top-menu: ML | Missing Values Imputation ...\n//name: KNN impute\n//desription: Missing values imputation using the k-nearest neighbors method\nexport function kNNImputation() {\n runKNNImputer();\n}\n\n//name: KNN imputation for a table\n//desription: Missing values imputation using the k-nearest neighbors method for a given table\n//input: dataframe table\nexport async function kNNImputationForTable(table: DG.DataFrame) {\n await runKNNImputer(table);\n}\n\n//name: linearRegression\n//description: Linear Regression demo\n//input: dataframe table\n//input: column_list features {type: numerical}\n//input: column target {type: numerical}\n//input: bool plot = true {caption: plot}\nexport async function linearRegression(table: DG.DataFrame, features: DG.ColumnList, target: DG.Column, plot: boolean): Promise<void> {\n const t1 = performance.now();\n const params = await getLinearRegressionParams(features, target);\n const t2 = performance.now();\n console.log(`Fit: ${t2 - t1} ms.`);\n const prediction = getPredictionByLinearRegression(features, params);\n console.log(`Predict: ${performance.now() - t2} ms.`);\n\n prediction.name = table.columns.getUnusedName(prediction.name);\n\n table.columns.add(prediction);\n\n if (plot) {\n const view = grok.shell.tableView(table.name);\n view.addViewer(DG.VIEWER.SCATTER_PLOT, {\n xColumnName: target.name,\n yColumnName: prediction.name,\n showRegressionLine: true,\n });\n }\n}\n\n//name: generateDatasetForLinearRegressionTest\n//description: Create demo dataset for linear regression\n//input: int rowCount = 10000 {min: 1000; max: 10000000; step: 10000}\n//input: int colCount = 10 {min: 1; max: 1000; step: 10}\n//input: double featuresScale = 10 {min: -1000; max: 1000; step: 10}\n//input: double featuresBias = 10 {min: -1000; max: 1000; step: 10}\n//input: double paramsScale = 10 {min: -1000; max: 1000; step: 10}\n//input: double paramsBias = 10 {min: -1000; max: 1000; step: 10}\n//output: dataframe table\nexport function generateDatasetForLinearRegressionTest(rowCount: number, colCount: number,\n featuresScale: number, featuresBias: number, paramsScale: number, paramsBias: number): DG.DataFrame {\n return getTestDatasetForLinearRegression(rowCount, colCount, featuresScale, featuresBias, paramsScale, paramsBias);\n}\n\n//name: trainLinearRegression\n//meta.mlname: Linear Regression\n//meta.mlrole: train\n//input: dataframe df\n//input: column predictColumn\n//output: dynamic model\nexport async function trainLinearRegression(df: DG.DataFrame, predictColumn: DG.Column): Promise<Uint8Array> {\n const features = df.columns;\n const params = await getLinearRegressionParams(features, predictColumn);\n\n return new Uint8Array(params.buffer);\n}\n\n//name: applyLinearRegression\n//meta.mlname: Linear Regression\n//meta.mlrole: apply\n//input: dataframe df\n//input: dynamic model\n//output: dataframe table\nexport function applyLinearRegression(df: DG.DataFrame, model: any): DG.DataFrame {\n const features = df.columns;\n const params = new Float32Array((model as Uint8Array).buffer);\n return DG.DataFrame.fromColumns([getPredictionByLinearRegression(features, params)]);\n}\n\n//name: isApplicableLinearRegression\n//meta.mlname: Linear Regression\n//meta.mlrole: isApplicable\n//input: dataframe df\n//input: column predictColumn\n//output: bool result\nexport function isApplicableLinearRegression(df: DG.DataFrame, predictColumn: DG.Column): boolean {\n for (const col of df.columns) {\n if (!col.matches('numerical'))\n return false;\n }\n if (!predictColumn.matches('numerical'))\n return false;\n\n return true;\n}\n\n//name: isInteractiveLinearRegression\n//meta.mlname: Linear Regression\n//meta.mlrole: isInteractive\n//input: dataframe df\n//input: column predictColumn\n//output: bool result\nexport function isInteractiveLinearRegression(df: DG.DataFrame, predictColumn: DG.Column): boolean {\n return df.rowCount <= 100000;\n}\n","// Exploratory data analysis (EDA) tools\n\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {_principalComponentAnalysisInWebWorker,\n _partialLeastSquareRegressionInWebWorker} from '../wasm/EDAAPI';\n\nimport {checkWasmDimensionReducerInputs, checkUMAPinputs, checkTSNEinputs,\n getRowsOfNumericalColumnns} from './utils';\n\n// Principal components analysis (PCA)\nexport async function computePCA(table: DG.DataFrame, features: DG.ColumnList, components: number,\n center: boolean, scale: boolean): Promise<DG.DataFrame> {\n checkWasmDimensionReducerInputs(features, components);\n\n const centerNum = center ? 1 : 0;\n const scaleNum = scale ? 1 : 0;\n\n return await _principalComponentAnalysisInWebWorker(table, features, components, centerNum, scaleNum);\n}\n\n// Partial least square regression (PLS): TO REMOVE\nexport async function computePLS(\n table: DG.DataFrame, features: DG.ColumnList, predict: DG.Column, components: number,\n): Promise<any> {\n // Inputs are checked in the same manner as in PCA, since the same computations are applied.\n checkWasmDimensionReducerInputs(features, components);\n\n return await _partialLeastSquareRegressionInWebWorker(table, features, predict, components);\n}\n\n// Uniform Manifold Approximation and Projection (UMAP)\nexport async function computeUMAP(features: DG.ColumnList, components: number, epochs: number,\n neighbors: number, minDist: number, spread: number): Promise<DG.DataFrame> {\n // check inputs\n checkUMAPinputs(features, components, epochs, neighbors, minDist, spread);\n\n // get row-by-row data\n const data = getRowsOfNumericalColumnns(features);\n\n let workerOutput: any;\n\n // UMAP in webworker\n const promise = new Promise((resolve, _reject) => {\n const worker = new Worker(new URL('workers/umap-worker.ts', import.meta.url));\n\n worker.postMessage({\n data: data,\n options: {\n nComponents: components,\n nEpochs: epochs,\n nNeighbors: neighbors,\n minDist: minDist,\n spread: spread,\n }});\n\n worker.onmessage = function(e) {\n worker.terminate();\n resolve(e.data.embeddings);\n };\n });\n\n await promise.then(\n (result) => {workerOutput = result;},\n (_error) => {throw new Error('applying UMAP fails.');},\n );\n\n const embeddings = workerOutput as number[][];\n const rowCount = embeddings.length;\n const range = [...Array(components).keys()];\n\n // Create output\n\n // columns data\n const umapColumnsData = range.map((_) => new Float32Array(rowCount));\n\n // perform transponation\n for (let i = 0; i < rowCount; ++i) {\n for (let j = 0; j < components; ++j)\n umapColumnsData[j][i] = embeddings[i][j];\n }\n\n return DG.DataFrame.fromColumns(range.map((i) =>\n DG.Column.fromFloat32Array('UMAP' + i.toString(), umapColumnsData[i]),\n ));\n} // computeUMAP\n\n// t-distributed stochastic neighbor embedding (t-SNE)\nexport async function computeTSNE(features: DG.ColumnList, components: number,\n learningRate: number, perplexity: number, iterations: number): Promise<DG.DataFrame> {\n // check inputs\n checkTSNEinputs(features, components, learningRate, perplexity, iterations);\n\n // get row-by-row data\n const data = getRowsOfNumericalColumnns(features);\n\n let workerOutput: any;\n\n // t-SNE in webworker\n const promise = new Promise((resolve, _reject) => {\n const worker = new Worker(new URL('workers/tsne-worker.ts', import.meta.url));\n\n worker.postMessage({\n data: data,\n options: {\n learningRate: learningRate,\n perplexity: perplexity,\n components: components,\n iterations: iterations,\n }});\n\n worker.onmessage = function(e) {\n worker.terminate();\n resolve(e.data.embeddings);\n };\n });\n\n await promise.then(\n (result) => {workerOutput = result;},\n (_error) => {throw new Error('applying t-SNE fails.');},\n );\n\n const embeddings = workerOutput as any[];\n\n const rowCount = embeddings.length;\n const range = [...Array(components).keys()];\n\n // Create output\n\n // columns data\n const umapColumnsData = range.map((_) => new Float32Array(rowCount));\n\n // perform transponation\n for (let i = 0; i < rowCount; ++i) {\n for (let j = 0; j < components; ++j)\n umapColumnsData[j][i] = embeddings[i][j];\n }\n\n return DG.DataFrame.fromColumns(range.map((i) =>\n DG.Column.fromFloat32Array('tSNE' + i.toString(), umapColumnsData[i]),\n ));\n} // computeTSNE\n","// Custom UI for Exploratory data analysis (EDA) tools\n\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\n// Rename PCA columns\nexport function renamePCAcolumns(pcaTable: DG.DataFrame): DG.DataFrame {\n for (const col of pcaTable.columns.toList())\n col.name = 'PCA' + col.name;\n\n return pcaTable;\n}\n\n// Adds prefix to each column name\nexport function addPrefixToEachColumnName(prefix: string, columns: DG.ColumnList): void {\n for (const col of columns.toList())\n col.name = prefix + col.name;\n}\n\n// Predicted vs Reference scatter plot\nexport function predictedVersusReferenceScatterPlot(\n samplesNames: DG.Column, reference: DG.Column, prediction: DG.Column,\n): DG.Viewer {\n prediction.name = reference.name + '(predicted)';\n\n const dfReferencePrediction = DG.DataFrame.fromColumns([samplesNames, reference, prediction]);\n dfReferencePrediction.name = 'Reference vs. Predicted';\n\n return DG.Viewer.scatterPlot(dfReferencePrediction,\n {title: dfReferencePrediction.name,\n x: reference.name,\n y: prediction.name,\n showRegressionLine: true,\n markerType: 'circle',\n labels: samplesNames.name,\n });\n}\n\n// Regression Coefficients Bar Chart\nexport function regressionCoefficientsBarChart(features: DG.ColumnList, regressionCoeffs: DG.Column): DG.Viewer {\n regressionCoeffs.name = 'regression coefficient';\n\n const namesOfPredictors = [];\n for (const col of features)\n namesOfPredictors.push(col.name);\n\n const predictorNamesColumn = DG.Column.fromStrings('feature', namesOfPredictors);\n\n const dfRegrCoefs = DG.DataFrame.fromColumns([predictorNamesColumn, regressionCoeffs]);\n dfRegrCoefs.name = 'Regression Coefficients';\n\n return DG.Viewer.barChart(dfRegrCoefs,\n {title: dfRegrCoefs.name, split: 'feature',\n value: 'regression coefficient', valueAggrType: 'avg'});\n}\n\n// Scores Scatter Plot\nexport function scoresScatterPlot(\n samplesNames: DG.Column, xScores: Array<DG.Column>, yScores: Array<DG.Column>,\n): DG.Viewer {\n const scoresColumns = [samplesNames];\n\n for (let i = 0; i < xScores.length; i++) {\n xScores[i].name = `x.score.t${i+1}`;\n scoresColumns.push(xScores[i]);\n }\n\n for (let i = 0; i < yScores.length; i++) {\n yScores[i].name = `y.score.u${i+1}`;\n scoresColumns.push(yScores[i]);\n }\n\n const scores = DG.DataFrame.fromColumns(scoresColumns);\n scores.name = 'Scores';\n //grok.shell.addTableView(scores);\n\n const index = xScores.length > 1 ? 1 : 0;\n\n return DG.Viewer.scatterPlot(scores,\n {title: scores.name,\n x: xScores[0].name,\n y: xScores[index].name,\n markerType: 'circle',\n labels: samplesNames.name,\n });\n}\n\n// Loading Scatter Plot\nexport function loadingScatterPlot(features: DG.ColumnList, xLoadings: Array<DG.Column>): DG.Viewer {\n const loadingCols = [];\n\n const loadingLabels = [];\n for (const col of features)\n loadingLabels.push(col.name);\n\n loadingCols.push(DG.Column.fromStrings('labels', loadingLabels));\n\n for (let i = 0; i < xLoadings.length; i++) {\n xLoadings[i].name = `x.loading.p${i+1}`;\n loadingCols.push(xLoadings[i]);\n }\n\n const dfLoadings = DG.DataFrame.fromColumns(loadingCols);\n dfLoadings.name = 'Loadings';\n\n return DG.Viewer.scatterPlot(dfLoadings,\n {title: dfLoadings.name,\n x: xLoadings[0].name,\n y: xLoadings[xLoadings.length - 1].name,\n markerType: 'circle',\n labels: 'labels',\n });\n}\n\n// Add PLS visualization\nexport function addPLSvisualization(\n table: DG.DataFrame, samplesNames: DG.Column, features: DG.ColumnList, predict: DG.Column, plsOutput: any,\n): void {\n const view = (table.id !== null) ? grok.shell.getTableView(table.name) : grok.shell.addTableView(table);\n\n // 1. Predicted vs Reference scatter plot\n view.addViewer(predictedVersusReferenceScatterPlot(samplesNames, predict, plsOutput[0]));\n\n // 2. Regression Coefficients Bar Chart\n view.addViewer(regressionCoefficientsBarChart(features, plsOutput[1]));\n\n // 3. Loading Scatter Plot\n view.addViewer(loadingScatterPlot(features, plsOutput[4]));\n\n // 4. Scores Scatter Plot\n view.addViewer(scoresScatterPlot(samplesNames, plsOutput[2], plsOutput[3]));\n}\n\n// Add one-way ANOVA results\nexport function addOneWayAnovaVizualization(\n table: DG.DataFrame, factors: DG.Column, values: DG.Column, anova: DG.DataFrame,\n) {\n const view = grok.shell.getTableView(table.name);\n view.addViewer(DG.Viewer.boxPlot(DG.DataFrame.fromColumns([factors, values])));\n view.addViewer(DG.Viewer.grid(anova));\n}\n","import { createMultiDimRedWorker } from './multi-dim-red-worker-creator';\nimport { normalize } from '@datagrok-libraries/utils/src/vector-operations';\nexport async function getNormalizedEmbeddings(dataCols, methodName, distanceMetrics, weights, distanceAggregation, options, progressFunc) {\n let dimensionalityReduceRes = await createMultiDimRedWorker(dataCols, distanceMetrics, methodName, weights, distanceAggregation, options, progressFunc);\n dimensionalityReduceRes = dimensionalityReduceRes.map((it) => normalize(it));\n return dimensionalityReduceRes;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWRkaW5ncy1zcGFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImVtYmVkZGluZ3Mtc3BhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBSTFFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLFFBQXNCLEVBQ3RCLFVBQStCLEVBQy9CLGVBQStCLEVBQy9CLE9BQWlCLEVBQ2pCLG1CQUE4QyxFQUM5QyxPQUFZLEVBQUUsWUFBbUY7SUFFakcsSUFBSSx1QkFBdUIsR0FDbkIsTUFBTSx1QkFBdUIsQ0FDM0IsUUFBUSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxZQUFZLENBQzNGLENBQUM7SUFFVix1QkFBdUIsR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sdUJBQXVCLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQge2NyZWF0ZU11bHRpRGltUmVkV29ya2VyfSBmcm9tICcuL211bHRpLWRpbS1yZWQtd29ya2VyLWNyZWF0b3InO1xuaW1wb3J0IHtEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kfSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvdHlwZXMnO1xuaW1wb3J0IHtub3JtYWxpemV9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3ZlY3Rvci1vcGVyYXRpb25zJztcbmltcG9ydCB7RGltUmVkdWN0aW9uTWV0aG9kc30gZnJvbSAnLi90eXBlcyc7XG5cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE5vcm1hbGl6ZWRFbWJlZGRpbmdzKFxuICBkYXRhQ29sczogQXJyYXk8YW55W10+LFxuICBtZXRob2ROYW1lOiBEaW1SZWR1Y3Rpb25NZXRob2RzLFxuICBkaXN0YW5jZU1ldHJpY3M6IEtub3duTWV0cmljc1tdLFxuICB3ZWlnaHRzOiBudW1iZXJbXSxcbiAgZGlzdGFuY2VBZ2dyZWdhdGlvbjogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCxcbiAgb3B0aW9uczogYW55LCBwcm9ncmVzc0Z1bmM/OiAoZXBvY2g6IG51bWJlciwgZXBvY2hzTGVuZ3RoOiBudW1iZXIsIGVtYmVkZGluZzogbnVtYmVyW11bXSkgPT4gdm9pZFxuKTogUHJvbWlzZTxNYXRyaXg+IHtcbiAgbGV0IGRpbWVuc2lvbmFsaXR5UmVkdWNlUmVzOiBNYXRyaXggPVxuICAgICAgICAgIGF3YWl0IGNyZWF0ZU11bHRpRGltUmVkV29ya2VyKFxuICAgICAgICAgICAgZGF0YUNvbHMsIGRpc3RhbmNlTWV0cmljcywgbWV0aG9kTmFtZSwgd2VpZ2h0cywgZGlzdGFuY2VBZ2dyZWdhdGlvbiwgb3B0aW9ucywgcHJvZ3Jlc3NGdW5jXG4gICAgICAgICAgKTtcblxuICBkaW1lbnNpb25hbGl0eVJlZHVjZVJlcyA9IGRpbWVuc2lvbmFsaXR5UmVkdWNlUmVzLm1hcCgoaXQpID0+IG5vcm1hbGl6ZShpdCkpO1xuICByZXR1cm4gZGltZW5zaW9uYWxpdHlSZWR1Y2VSZXM7XG59XG5cbiJdfQ==","import * as grok from 'datagrok-api/grok';\nimport { DIMENSIONALITY_REDUCER_TERMINATE_EVENT } from './consts';\nimport { isNil } from '../distance-matrix/utils';\nexport async function createMultiDimRedWorker(data, metrics, method, weights, aggregationMethod, options, progressFunc) {\n if (!options.distanceFnArgs)\n throw new Error('options.distanceFnArgs must be defined');\n if (data.length !== metrics.length || data.length !== options.distanceFnArgs.length || data.length !== weights.length)\n throw new Error('data, metrics and options and weights must have the same length');\n return new Promise(function (resolve, reject) {\n const worker = new Worker(new URL('./mulit-column-dim-reducer-worker', import.meta.url));\n worker.postMessage({\n columnsData: data,\n distanceMetrics: metrics,\n method: method,\n options: options,\n weights: weights,\n aggregationMethod: aggregationMethod,\n });\n const terminateSub = grok.events.onCustomEvent(DIMENSIONALITY_REDUCER_TERMINATE_EVENT).subscribe(() => {\n try {\n worker?.terminate();\n }\n finally {\n terminateSub.unsubscribe();\n }\n });\n worker.onmessage = ({ data: { error, embedding, epochNum, epochsLength } }) => {\n if (!isNil(epochNum) && !isNil(epochsLength)) {\n progressFunc && progressFunc(epochNum, epochsLength, embedding);\n return;\n }\n terminateSub.unsubscribe();\n if (error)\n reject(error);\n else\n resolve(embedding);\n // terminate the worker after some time. immidiate termination causes crashes.\n setTimeout(() => worker.terminate(), 100);\n };\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktZGltLXJlZC13b3JrZXItY3JlYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm11bHRpLWRpbS1yZWQtd29ya2VyLWNyZWF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsc0NBQXNDLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFJaEUsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRS9DLE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQUMsSUFBa0IsRUFBRSxPQUF1QixFQUFFLE1BQTJCLEVBQ3BILE9BQWlCLEVBQUUsaUJBQTRDLEVBQy9ELE9BQVksRUFBRSxZQUFtRjtJQUVqRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWM7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQzVELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsTUFBTTtRQUNuSCxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7SUFDckYsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFTLE9BQU8sRUFBRSxNQUFNO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLG1DQUFtQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6RixNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGVBQWUsRUFBRSxPQUFPO1lBQ3hCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsaUJBQWlCLEVBQUUsaUJBQWlCO1NBQ3JDLENBQUMsQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLHNDQUFzQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNwRyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFDLEVBQUMsRUFBRSxFQUFFO1lBQ3hFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsWUFBWSxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRSxPQUFPO1lBQ1QsQ0FBQztZQUNELFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMzQixJQUFJLEtBQUs7Z0JBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDOztnQkFFZCxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckIsOEVBQThFO1lBQzlFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtLbm93bk1ldHJpY3N9IGZyb20gJy4uL3R5cGVkLW1ldHJpY3MvdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCB7RElNRU5TSU9OQUxJVFlfUkVEVUNFUl9URVJNSU5BVEVfRVZFTlR9IGZyb20gJy4vY29uc3RzJztcbmltcG9ydCB7TWF0cml4fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge0RpbVJlZHVjdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kfSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvdHlwZXMnO1xuaW1wb3J0IHtpc05pbH0gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4L3V0aWxzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU11bHRpRGltUmVkV29ya2VyKGRhdGE6IEFycmF5PGFueVtdPiwgbWV0cmljczogS25vd25NZXRyaWNzW10sIG1ldGhvZDogRGltUmVkdWN0aW9uTWV0aG9kcyxcbiAgd2VpZ2h0czogbnVtYmVyW10sIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLFxuICBvcHRpb25zOiBhbnksIHByb2dyZXNzRnVuYz86IChlcG9jaDogbnVtYmVyLCBlcG9jaHNMZW5ndGg6IG51bWJlciwgZW1iZWRkaW5nOiBudW1iZXJbXVtdKSA9PiB2b2lkXG4pOiBQcm9taXNlPE1hdHJpeD4ge1xuICBpZiAoIW9wdGlvbnMuZGlzdGFuY2VGbkFyZ3MpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zLmRpc3RhbmNlRm5BcmdzIG11c3QgYmUgZGVmaW5lZCcpO1xuICBpZiAoZGF0YS5sZW5ndGggIT09IG1ldHJpY3MubGVuZ3RoIHx8IGRhdGEubGVuZ3RoICE9PSBvcHRpb25zLmRpc3RhbmNlRm5BcmdzLmxlbmd0aCB8fCBkYXRhLmxlbmd0aCAhPT0gd2VpZ2h0cy5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdkYXRhLCBtZXRyaWNzIGFuZCBvcHRpb25zIGFuZCB3ZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9tdWxpdC1jb2x1bW4tZGltLXJlZHVjZXItd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSk7XG4gICAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgIGNvbHVtbnNEYXRhOiBkYXRhLFxuICAgICAgZGlzdGFuY2VNZXRyaWNzOiBtZXRyaWNzLFxuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgd2VpZ2h0czogd2VpZ2h0cyxcbiAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBhZ2dyZWdhdGlvbk1ldGhvZCxcbiAgICB9KTtcbiAgICBjb25zdCB0ZXJtaW5hdGVTdWIgPSBncm9rLmV2ZW50cy5vbkN1c3RvbUV2ZW50KERJTUVOU0lPTkFMSVRZX1JFRFVDRVJfVEVSTUlOQVRFX0VWRU5UKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgd29ya2VyPy50ZXJtaW5hdGUoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRlcm1pbmF0ZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHdvcmtlci5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwgZW1iZWRkaW5nLCBlcG9jaE51bSwgZXBvY2hzTGVuZ3RofX0pID0+IHtcbiAgICAgIGlmICghaXNOaWwoZXBvY2hOdW0pICYmICFpc05pbChlcG9jaHNMZW5ndGgpKSB7XG4gICAgICAgIHByb2dyZXNzRnVuYyAmJiBwcm9ncmVzc0Z1bmMoZXBvY2hOdW0sIGVwb2Noc0xlbmd0aCwgZW1iZWRkaW5nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGVybWluYXRlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAoZXJyb3IpXG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICBlbHNlXG4gICAgICAgIHJlc29sdmUoZW1iZWRkaW5nKTtcbiAgICAgIC8vIHRlcm1pbmF0ZSB0aGUgd29ya2VyIGFmdGVyIHNvbWUgdGltZS4gaW1taWRpYXRlIHRlcm1pbmF0aW9uIGNhdXNlcyBjcmFzaGVzLlxuICAgICAgc2V0VGltZW91dCgoKSA9PiB3b3JrZXIudGVybWluYXRlKCksIDEwMCk7XG4gICAgfTtcbiAgfSk7XG59XG4iXX0=","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n let result = 0;\n const len = p.length;\n if (len !== q.length)\n throw new Error('The dimensionality of the vectors must match');\n for (let i = 0; i < len; ++i)\n result += Math.pow((p[i] - q[i]), 2);\n return Math.sqrt(result);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcNormalizedDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n let max = Number.MIN_VALUE;\n let min = Number.MAX_VALUE;\n for (let i = 0; i < nItems; ++i) {\n for (let j = i; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null || i === j) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n if (d > max)\n max = d;\n if (d < min)\n min = d;\n }\n }\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j)\n matrix[i][j] = matrix[j][i] = (matrix[i][j] - min) / (max - min);\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector.\n *\n * @export\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n const len = data.length;\n let sum = 0;\n let sumOfSquares = 0;\n for (let i = 0; i < len; ++i) {\n sum += data[i];\n sumOfSquares += Math.pow(data[i], 2);\n }\n const mean = sum / len;\n const stdDevInverse = 1.0 / Math.sqrt(sumOfSquares / len - Math.pow(mean, 2));\n for (let i = 0; i < len; ++i)\n data[i] = (data[i] - mean) * stdDevInverse;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0IsRUFBRSxVQUFrQixFQUFFLE9BQWUsQ0FBQztJQUN0RixPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFjO0lBQzVDLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDdkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEYsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLGFBQXFCLENBQUM7SUFDcEUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUV4QixNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUUzRCxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDL0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXRDLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxRQUFRLENBQUMsQ0FBUztJQUN6QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDL0IsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsWUFBWSxDQUFDLENBQVM7SUFDN0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN4QixNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDL0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFekIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxDQUFTO0lBQ3BDLElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztJQUN2QixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFDdkMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsRUFBVSxFQUFFLEVBQVU7SUFDckQsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxNQUFNO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUNsRSxJQUFJLElBQUksR0FBVyxDQUFDLENBQUM7SUFDckIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQ3hDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxRQUFnQixFQUFFO0lBQ3pGLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3JDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDN0QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUVyQixJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTTtRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFFbEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLFNBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUksQ0FBQyxDQUFBLENBQUM7SUFFL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQWEsRUFBRSxRQUF3QjtJQUN4RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzNCLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWxELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbkMsTUFBTSxDQUFDLEdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNqQztLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQUMsSUFBYSxFQUFFLFFBQXdCO0lBQ2xGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUMzQixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUMvQixNQUFNLENBQUMsR0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLEdBQUcsR0FBRztnQkFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUc7Z0JBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUN0QjtLQUNGO0lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDakMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztLQUNwRTtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLFlBQVksR0FBRyxLQUFLO0lBQ3ZFLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDN0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFeEIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLE1BQWEsRUFBRSxPQUFPLEdBQUcsS0FBSztJQUNwRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUSxFQUFFLENBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUSxFQUFFLENBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkcsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFNLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtJQUNsRSxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0lBQ3ZELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBVSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBYyxFQUFFLENBQVMsRUFBRSxJQUF3QztJQUNsRyxTQUFTLEtBQUssQ0FBQyxNQUFnQyxFQUFFLE9BQThCO1FBQzdFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFdEIsS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLEVBQUU7WUFDNUIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxjQUFjLEdBQUcsVUFBVSxFQUFFO2dCQUNyRCxRQUFRLEdBQUcsT0FBTyxDQUFDO2dCQUNuQixVQUFVLEdBQUcsY0FBYyxDQUFDO2FBQzdCO1NBQ0Y7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUU3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNyQixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3JCO0lBRUQsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN4QixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQ2YsVUFBVSxDQUFDLE1BQU0sRUFBOEIsRUFDL0MsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVMsR0FBRyxFQUFFLEtBQUs7WUFDeEQsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNQLElBQUksR0FBRyxFQUFFO1lBQ1AsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQVk7SUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN4QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDWixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7SUFFckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUM1QixHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsWUFBWSxJQUFJLFNBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFJLENBQUMsQ0FBQSxDQUFDO0tBQzlCO0lBRUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUN2QixNQUFNLGFBQWEsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxHQUFHLFNBQUEsSUFBSSxFQUFJLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFFdEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQztJQUU3QyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsQ0FBUSxFQUFFLENBQVE7SUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXRyaXgsIFZlY3RvciwgQ29vcmRpbmF0ZXMsIFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICcuL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7cmFuZG9tRmxvYXQsIHJhbmRvbUludH0gZnJvbSAnLi9yYW5kb20nO1xuXG4vKipcbiAqIEFzc2VydHMgYSBjb25kaXRpb24gYnkgdGhyb3dpbmcgYW4gRXJyb3IuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtib29sZWFufSBbY29uZGl0aW9uPWZhbHNlXSBDb25kaXRpb24gdG8gYXNzZXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPSdBc3NlcnRpb24gZXJyb3IuJ10gTWVzc2FnZSB0byBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb246IGJvb2xlYW4gPSBmYWxzZSwgbWVzc2FnZTogc3RyaW5nID0gJ0Fzc2VydGlvbiBlcnJvci4nKSB7XG4gIGlmICghY29uZGl0aW9uKVxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG5ldyB0d28tZGltZW5zaW9uYWwgYXJyYXkgYW5kIGZpbGxzIGl0IHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24xIFRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2Ygcm93cykuXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiBjb2x1bW5zKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbD0wXSBBIHZhbHVlIHRvIGZpbGwgdGhlIGNvb3JkaW5hdGVzIHdpdGguXG4gKiBAcmV0dXJuIHtDb29yZGluYXRlc30gQSB0d28tZGltZW5zaW9uYWwgZmlsbGVkIHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgcmVzdWx0ID0gMDtcbiAgY29uc3QgbGVuID0gcC5sZW5ndGg7XG5cbiAgaWYgKGxlbiAhPT0gcS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIHZlY3RvcnMgbXVzdCBtYXRjaCcpO1xuICBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICByZXN1bHQgKz0gKHBbaV0gLSBxW2ldKSAqKiAyO1xuICBcbiAgcmV0dXJuIE1hdGguc3FydChyZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY0Rpc3RhbmNlTWF0cml4KGRhdGE6IFZlY3RvcnMsIGRpc3RhbmNlOiBEaXN0YW5jZU1ldHJpYyk6IE1hdHJpeCB7XG4gIGNvbnN0IG5JdGVtcyA9IGRhdGEubGVuZ3RoO1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMobkl0ZW1zLCBuSXRlbXMsIDApO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCkgPyAwIDogZGlzdGFuY2UoZGF0YVtpXSwgZGF0YVtqXSk7XG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSBkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0cml4O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY05vcm1hbGl6ZWREaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcbiAgbGV0IG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gIGxldCBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCB8fCBpID09PSBqKSA/IDAgOiBkaXN0YW5jZShkYXRhW2ldLCBkYXRhW2pdKTtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IGQ7XG4gICAgICBpZiAoZCA+IG1heCkgbWF4ID0gZDtcbiAgICAgIGlmIChkIDwgbWluKSBtaW4gPSBkO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opXG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSAobWF0cml4W2ldW2pdIC0gbWluKSAvIChtYXggLSBtaW4pO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKiBHZW5lcmF0ZXMgYXJyYXkgZnJvbSBhIHJhbmdlIFtiZWdpbjsgZW5kXSBvciBbYmVnaW47IGVuZCkgaWYgZW5kRXhjbHVzaXZlLiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5SYW5nZShiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlciwgZW5kRXhjbHVzaXZlID0gZmFsc2UpOiBJbnQzMkFycmF5IHtcbiAgY29uc3Qgbkl0ZW1zID0gZW5kIC0gYmVnaW4gKyAoZW5kRXhjbHVzaXZlID8gMCA6IDEpO1xuICBjb25zdCBzZXJpZXMgPSBuZXcgSW50MzJBcnJheShuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpXG4gICAgc2VyaWVzW2ldID0gYmVnaW4gKyBpO1xuXG4gIHJldHVybiBzZXJpZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBvcmRlciBvZiB2YWx1ZXMgYXMgaWYgdGhleSBhcmUgc29ydGVkLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7YW55W119IHZhbHVlcyBJbnB1dCBhcnJheS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHJldmVyc2VkIG9yZGVyLlxuICogQHJldHVybiB7bnVtYmVyW119IFRoZSBvcmRlciBjb21wdXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ1NvcnQodmFsdWVzOiBhbnlbXSwgcmV2ZXJzZSA9IGZhbHNlKTogbnVtYmVyW10ge1xuICBjb25zdCBzb3J0Zm4gPSByZXZlcnNlID8gKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGJbMF0gLSBhWzBdKSA6IChhOiBhbnlbXSwgYjogYW55W10pID0+IChhWzBdIC0gYlswXSk7XG4gIGNvbnN0IGRlY29yID0gKHY6IGFueSwgaTogbnVtYmVyKSA9PiBbdiwgaV07IC8vIHNldCBpbmRleCB0byB2YWx1ZVxuICBjb25zdCB1bmRlY29yID0gKGE6IGFueVtdKSA9PiBhWzFdOyAvLyBsZWF2ZSBvbmx5IGluZGV4XG4gIGNvbnN0IF9hcmdzb3J0ID0gKGFycjogYW55W10pID0+IGFyci5tYXAoZGVjb3IpLnNvcnQoc29ydGZuKS5tYXAodW5kZWNvcik7XG4gIHJldHVybiBfYXJnc29ydCh2YWx1ZXMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4ZXMgb2YgdGhlIG1vc3QgZGl2ZXJzZSBvYmplY3RzIGFjY29yZGluZyB0byB0aGUgZGlzdCBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0c1xuICogQHBhcmFtIHtudW1iZXJ9IG4gbnVtYmVyIG9mIGRpdmVyc2UgZWxlbWVudHMgdG8gZmluZFxuICogQHBhcmFtIHsoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyfSBkaXN0IGEgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyBkaXN0YW5jZSBiZXR3ZWVuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIG9iamVjdHMgdXNpbmcgdGhlaXIgaW5kZXhlc1xuICogQHJldHVybnMge251bWJlcltdfSBUaGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpdmVyc2VTdWJzZXQobGVuZ3RoOiBudW1iZXIsIG46IG51bWJlciwgZGlzdDogKGkxOiBudW1iZXIsIGkyOiBudW1iZXIpID0+IG51bWJlcik6IG51bWJlcltdIHtcbiAgZnVuY3Rpb24gbWF4QnkodmFsdWVzOiBJdGVyYWJsZUl0ZXJhdG9yPG51bWJlcj4sIG9yZGVyQnk6IChpOiBudW1iZXIpID0+IG51bWJlcikge1xuICAgIGxldCBtYXhWYWx1ZSA9IG51bGw7XG4gICAgbGV0IG1heE9yZGVyQnkgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlcykge1xuICAgICAgY29uc3QgZWxlbWVudE9yZGVyQnkgPSBvcmRlckJ5KGVsZW1lbnQpO1xuICAgICAgaWYgKG1heE9yZGVyQnkgPT0gbnVsbCB8fCBlbGVtZW50T3JkZXJCeSA+IG1heE9yZGVyQnkpIHtcbiAgICAgICAgbWF4VmFsdWUgPSBlbGVtZW50O1xuICAgICAgICBtYXhPcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhWYWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHN1YnNldCA9IFtyYW5kb21JbnQobGVuZ3RoIC0gMSldO1xuICBjb25zdCBjb21wbGVtZW50ID0gbmV3IFNldCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIXN1YnNldC5pbmNsdWRlcyhpKSlcbiAgICAgIGNvbXBsZW1lbnQuYWRkKGkpO1xuICB9XG5cbiAgd2hpbGUgKHN1YnNldC5sZW5ndGggPCBuKSB7XG4gICAgY29uc3QgaWR4ID0gbWF4QnkoXG4gICAgICBjb21wbGVtZW50LnZhbHVlcygpIGFzIEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPixcbiAgICAgIChpKSA9PiBNYXRoLm1pbi5hcHBseShNYXRoLCBzdWJzZXQubWFwKGZ1bmN0aW9uKHZhbCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGRpc3QoaSwgdmFsKTtcbiAgICAgIH0pKSk7XG4gICAgaWYgKGlkeCkge1xuICAgICAgc3Vic2V0LnB1c2goaWR4KTtcbiAgICAgIGNvbXBsZW1lbnQuZGVsZXRlKGlkeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWJzZXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBub3JtYWxpemVkIHZlY3Rvci5cbiAqIFxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3J9IGRhdGEgbnVtZXJpY2FsIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoZGF0YTogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gIGxldCBzdW0gPSAwO1xuICBsZXQgc3VtT2ZTcXVhcmVzID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgc3VtICs9IGRhdGFbaV07XG4gICAgc3VtT2ZTcXVhcmVzICs9IGRhdGFbaV0gKiogMjtcbiAgfVxuXG4gIGNvbnN0IG1lYW4gPSBzdW0gLyBsZW47XG4gIGNvbnN0IHN0ZERldkludmVyc2UgPSAxLjAgLyBNYXRoLnNxcnQoc3VtT2ZTcXVhcmVzIC8gbGVuIC0gbWVhbiAqKiAyKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pICogc3RkRGV2SW52ZXJzZTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBGaW5kcyBzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cy5cbiAqIEBwYXJhbSB7YW55W119IGEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge2FueVtdfSBiIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge2FueVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGlmZmVyZW5jZShhOiBhbnlbXSwgYjogYW55W10pOiBhbnlbXSB7XG4gIGNvbnN0IGJTZXQgPSBuZXcgU2V0KGIpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGEuZmlsdGVyKCh4KSA9PiAhYlNldC5oYXMoeCkpKS52YWx1ZXMoKSk7XG59XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport { createMCLWorker } from './index';\nimport { ScatterPlotCurrentLineStyle, ScatterPlotLinesRenderer } from '@datagrok-libraries/utils/src/render-lines-on-sp';\nexport async function markovCluster(df, cols, metrics, weights, aggregationMethod, preprocessingFuncs, preprocessingFuncArgs, threshold = 80, maxIterations = 10, useWebGPU = false, inflate = 2, scp) {\n const scatterPlotProps = {\n showXAxis: false,\n showYAxis: false,\n showXSelector: false,\n showYSelector: false,\n };\n const tv = grok.shell.tableView(df.name) ?? grok.shell.addTableView(df);\n const sc = scp ?? tv.scatterPlot({ ...scatterPlotProps, title: 'MCL' });\n ui.setUpdateIndicator(sc.root, true);\n const distanceFnArgs = [];\n const encodedColEntries = [];\n for (let i = 0; i < preprocessingFuncs.length; ++i) {\n const pf = preprocessingFuncs[i];\n if (pf) {\n const colInputName = pf.inputs[0].name;\n const metricInputName = pf.inputs[1].name;\n const { entries, options } = await pf.apply({ [colInputName]: cols[i], [metricInputName]: metrics[i],\n ...(preprocessingFuncArgs[i] ?? {}) });\n encodedColEntries.push({ entries, options });\n distanceFnArgs.push(options ?? {});\n }\n else {\n const entries = cols[i].toList();\n const options = {};\n encodedColEntries.push({ entries, options });\n distanceFnArgs.push(options);\n }\n }\n const mclWorker = createMCLWorker(encodedColEntries.map((it) => it.entries), threshold, weights, aggregationMethod, metrics, distanceFnArgs, maxIterations, useWebGPU, inflate);\n const terminateSub = grok.events.onViewerClosed.subscribe((args) => {\n if (args.args.viewer?.props?.title === sc.props.title && sc.type === args.args?.viewer?.type) {\n terminateSub.unsubscribe();\n mclWorker.terminate();\n }\n });\n const res = await mclWorker.promise;\n if (!res)\n return;\n const clusterColName = df.columns.getUnusedName('Cluster (MCL)');\n const emberdXColName = df.columns.getUnusedName('EmbedX (MCL)');\n const emberdYColName = df.columns.getUnusedName('EmbedY (MCL)');\n const clustersCounter = {};\n res.clusters.forEach((c) => {\n if (!clustersCounter[c])\n clustersCounter[c] = 0;\n clustersCounter[c]++;\n });\n const connectivity = new Uint32Array(res.embedX.length);\n for (let i = 0; i < res.is.length; i++) {\n connectivity[res.is[i]]++;\n connectivity[res.js[i]]++;\n }\n const clusterCounterColName = df.columns.getUnusedName('Cluster size (MCL)');\n const connectivityColName = df.columns.getUnusedName('Connectivity (MCL)');\n const embedXCol = df.columns.addNewFloat(emberdXColName);\n embedXCol.init((i) => res.embedX[i]);\n const embedYCol = df.columns.addNewFloat(emberdYColName);\n embedYCol.init((i) => res.embedY[i]);\n const clusterCol = df.columns.addNewString(clusterColName);\n clusterCol.init((i) => res.clusters[i].toString());\n const clusterCounterCol = df.columns.addNewInt(clusterCounterColName);\n clusterCounterCol.init((i) => clustersCounter[res.clusters[i]]);\n const connectivityCol = df.columns.addNewInt(connectivityColName);\n connectivityCol.init((i) => connectivity[i]);\n // df.columns.addNewFloat(emberdXColName).init((i) => res.embedX[i]);\n // df.columns.addNewFloat(emberdYColName).init((i) => res.embedY[i]);\n // df.columns.addNewInt(clusterCounterColName).init((i) => clustersCounter[res.clusters[i]]);\n // df.columns.addNewString(clusterColName).init((i) => res.clusters[i].toString());\n sc.props.xColumnName = emberdXColName;\n sc.props.yColumnName = emberdYColName;\n sc.props.colorColumnName = clusterColName;\n sc.props.markerDefaultSize = 5;\n terminateSub.unsubscribe();\n // const sc = tv.scatterPlot({x: emberdXColName, y: emberdYColName});\n // sc.props.colorColumnName = clusterColName;\n // sc.props.markerDefaultSize = 5;\n const _scLines = new ScatterPlotLinesRenderer(sc, emberdXColName, emberdYColName, { from: res.is, to: res.js, drawArrows: false, opacity: 0.3, skipMultiLineCalculation: true }, ScatterPlotCurrentLineStyle.none);\n ui.setUpdateIndicator(sc.root, false);\n // sc.close();\n // const scLinesViewer = new ScatterPlotWithLines(sc, res.is, res.js, emberdXColName, emberdYColName);\n // tv.addViewer(scLinesViewer);\n return { sc, embedXCol, embedYCol, clusterCol, clusterCounterCol, connectivityCol };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3RlcmluZy12aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2x1c3RlcmluZy12aWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd0QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3hDLE9BQU8sRUFBQywyQkFBMkIsRUFBRSx3QkFBd0IsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBZ0J2SCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FDakMsRUFBZ0IsRUFBRSxJQUFpQixFQUFFLE9BQXVCLEVBQzVELE9BQWlCLEVBQUUsaUJBQTRDLEVBQUUsa0JBQWtELEVBQ25ILHFCQUE0QixFQUFFLFlBQW9CLEVBQUUsRUFBRSxnQkFBd0IsRUFBRSxFQUNoRixZQUFxQixLQUFLLEVBQUUsVUFBa0IsQ0FBQyxFQUFFLEdBQTBCO0lBRTNFLE1BQU0sZ0JBQWdCLEdBQUc7UUFDdkIsU0FBUyxFQUFFLEtBQUs7UUFDaEIsU0FBUyxFQUFFLEtBQUs7UUFDaEIsYUFBYSxFQUFFLEtBQUs7UUFDcEIsYUFBYSxFQUFFLEtBQUs7S0FDckIsQ0FBQztJQUNGLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV4RSxNQUFNLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFDLEdBQUcsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7SUFFdEUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckMsTUFBTSxjQUFjLEdB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QUUsR0FBRyxDQUFDLEVBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFDLEVBQ3pHLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLGNBQWM7SUFDZCxzR0FBc0c7SUFDdEcsK0JBQStCO0lBQy9CLE9BQU8sRUFBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFDLENBQUM7QUFDcEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB7Y3JlYXRlTUNMV29ya2VyfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7U2NhdHRlclBsb3RDdXJyZW50TGluZVN0eWxlLCBTY2F0dGVyUGxvdExpbmVzUmVuZGVyZXJ9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3JlbmRlci1saW5lcy1vbi1zcCc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge1ByZXByb2Nlc3NGdW5jdGlvblJldHVyblR5cGV9IGZyb20gJy4uL2Z1bmN0aW9uRWRpdG9ycy9kaW1lbnNpb25hbGl0eS1yZWR1Y3Rpb24tZWRpdG9yJztcbmltcG9ydCB7T3B0aW9uc30gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuXG5cbmV4cG9ydCB0eXBlIE1DTENsdXN0ZXJWaWV3ZXJSZXN1bHQgPSB7XG4gIHNjOiBERy5TY2F0dGVyUGxvdFZpZXdlcjtcbiAgZW1iZWRYQ29sOiBERy5Db2x1bW47XG4gIGVtYmVkWUNvbDogREcuQ29sdW1uO1xuICBjbHVzdGVyQ29sOiBERy5Db2x1bW47XG4gIGNsdXN0ZXJDb3VudGVyQ29sOiBERy5Db2x1bW47XG4gIGNvbm5lY3Rpdml0eUNvbDogREcuQ29sdW1uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFya292Q2x1c3RlcihcbiAgZGY6IERHLkRhdGFGcmFtZSwgY29sczogREcuQ29sdW1uW10sIG1ldHJpY3M6IEtub3duTWV0cmljc1tdLFxuICB3ZWlnaHRzOiBudW1iZXJbXSwgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIHByZXByb2Nlc3NpbmdGdW5jczogKERHLkZ1bmMgfCBudWxsIHwgdW5kZWZpbmVkKVtdLFxuICBwcmVwcm9jZXNzaW5nRnVuY0FyZ3M6IGFueVtdLCB0aHJlc2hvbGQ6IG51bWJlciA9IDgwLCBtYXhJdGVyYXRpb25zOiBudW1iZXIgPSAxMCxcbiAgdXNlV2ViR1BVOiBib29sZWFuID0gZmFsc2UsIGluZmxhdGU6IG51bWJlciA9IDIsIHNjcD86IERHLlNjYXR0ZXJQbG90Vmlld2VyXG4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IE1DTENsdXN0ZXJWaWV3ZXJSZXN1bHQ+IHtcbiAgY29uc3Qgc2NhdHRlclBsb3RQcm9wcyA9IHtcbiAgICBzaG93WEF4aXM6IGZhbHNlLFxuICAgIHNob3dZQXhpczogZmFsc2UsXG4gICAgc2hvd1hTZWxlY3RvcjogZmFsc2UsXG4gICAgc2hvd1lTZWxlY3RvcjogZmFsc2UsXG4gIH07XG4gIGNvbnN0IHR2ID0gZ3Jvay5zaGVsbC50YWJsZVZpZXcoZGYubmFtZSkgPz8gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuXG4gIGNvbnN0IHNjID0gc2NwID8/IHR2LnNjYXR0ZXJQbG90KHsuLi5zY2F0dGVyUGxvdFByb3BzLCB0aXRsZTogJ01DTCd9KTtcblxuICB1aS5zZXRVcGRhdGVJbmRpY2F0b3Ioc2Mucm9vdCwgdHJ1ZSk7XG4gIGNvbnN0IGRpc3RhbmNlRm5BcmdzOiBPcHRpb25zW10gPSBbXTtcbiAgY29uc3QgZW5jb2RlZENvbEVudHJpZXM6IFByZXByb2Nlc3NGdW5jdGlvblJldHVyblR5cGVbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXByb2Nlc3NpbmdGdW5jcy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IHBmID0gcHJlcHJvY2Vzc2luZ0Z1bmNzW2ldO1xuICAgIGlmIChwZikge1xuICAgICAgY29uc3QgY29sSW5wdXROYW1lID0gcGYuaW5wdXRzWzBdLm5hbWU7XG4gICAgICBjb25zdCBtZXRyaWNJbnB1dE5hbWUgPSBwZi5pbnB1dHNbMV0ubmFtZTtcbiAgICAgIGNvbnN0IHtlbnRyaWVzLCBvcHRpb25zfTogUHJlcHJvY2Vzc0Z1bmN0aW9uUmV0dXJuVHlwZSA9XG4gICAgICAgICAgICAgICAgYXdhaXQgcGYuYXBwbHkoe1tjb2xJbnB1dE5hbWVdOiBjb2xzW2ldLCBbbWV0cmljSW5wdXROYW1lXTogbWV0cmljc1tpXSxcbiAgICAgICAgICAgICAgICAgIC4uLihwcmVwcm9jZXNzaW5nRnVuY0FyZ3NbaV0gPz8ge30pfSk7XG4gICAgICBlbmNvZGVkQ29sRW50cmllcy5wdXNoKHtlbnRyaWVzLCBvcHRpb25zfSk7XG4gICAgICBkaXN0YW5jZUZuQXJncy5wdXNoKG9wdGlvbnMgPz8ge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gY29sc1tpXS50b0xpc3QoKTtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcbiAgICAgIGVuY29kZWRDb2xFbnRyaWVzLnB1c2goe2VudHJpZXMsIG9wdGlvbnN9KTtcbiAgICAgIGRpc3RhbmNlRm5BcmdzLnB1c2gob3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWNsV29ya2VyID0gY3JlYXRlTUNMV29ya2VyKGVuY29kZWRDb2xFbnRyaWVzLm1hcCgoaXQpID0+IGl0LmVudHJpZXMpLFxuICAgIHRocmVzaG9sZCwgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QsIG1ldHJpY3MsIGRpc3RhbmNlRm5BcmdzLCBtYXhJdGVyYXRpb25zLCB1c2VXZWJHUFUsIGluZmxhdGUpO1xuXG4gIGNvbnN0IHRlcm1pbmF0ZVN1YiA9IGdyb2suZXZlbnRzLm9uVmlld2VyQ2xvc2VkLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgIGlmIChhcmdzLmFyZ3Mudmlld2VyPy5wcm9wcz8udGl0bGUgPT09IHNjLnByb3BzLnRpdGxlICYmIHNjLnR5cGUgPT09IGFyZ3MuYXJncz8udmlld2VyPy50eXBlKSB7XG4gICAgICB0ZXJtaW5hdGVTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIG1jbFdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCByZXMgPSBhd2FpdCBtY2xXb3JrZXIucHJvbWlzZTtcbiAgaWYgKCFyZXMpXG4gICAgcmV0dXJuO1xuICBjb25zdCBjbHVzdGVyQ29sTmFtZSA9IGRmLmNvbHVtbnMuZ2V0VW51c2VkTmFtZSgnQ2x1c3RlciAoTUNMKScpO1xuICBjb25zdCBlbWJlcmRYQ29sTmFtZSA9IGRmLmNvbHVtbnMuZ2V0VW51c2VkTmFtZSgnRW1iZWRYIChNQ0wpJyk7XG4gIGNvbnN0IGVtYmVyZFlDb2xOYW1lID0gZGYuY29sdW1ucy5nZXRVbnVzZWROYW1lKCdFbWJlZFkgKE1DTCknKTtcbiAgY29uc3QgY2x1c3RlcnNDb3VudGVyOiB7W186IG51bWJlcl06IG51bWJlcn0gPSB7fTtcbiAgcmVzLmNsdXN0ZXJzLmZvckVhY2goKGMpID0+IHtcbiAgICBpZiAoIWNsdXN0ZXJzQ291bnRlcltjXSkgY2x1c3RlcnNDb3VudGVyW2NdID0gMDtcbiAgICBjbHVzdGVyc0NvdW50ZXJbY10rKztcbiAgfSk7XG4gIGNvbnN0IGNvbm5lY3Rpdml0eSA9IG5ldyBVaW50MzJBcnJheShyZXMuZW1iZWRYLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLmlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29ubmVjdGl2aXR5W3Jlcy5pc1tpXV0rKztcbiAgICBjb25uZWN0aXZpdHlbcmVzLmpzW2ldXSsrO1xuICB9XG4gIGNvbnN0IGNsdXN0ZXJDb3VudGVyQ29sTmFtZSA9IGRmLmNvbHVtbnMuZ2V0VW51c2VkTmFtZSgnQ2x1c3RlciBzaXplIChNQ0wpJyk7XG4gIGNvbnN0IGNvbm5lY3Rpdml0eUNvbE5hbWUgPSBkZi5jb2x1bW5zLmdldFVudXNlZE5hbWUoJ0Nvbm5lY3Rpdml0eSAoTUNMKScpO1xuXG4gIGNvbnN0IGVtYmVkWENvbCA9IGRmLmNvbHVtbnMuYWRkTmV3RmxvYXQoZW1iZXJkWENvbE5hbWUpO1xuICBlbWJlZFhDb2wuaW5pdCgoaSkgPT4gcmVzLmVtYmVkWFtpXSk7XG4gIGNvbnN0IGVtYmVkWUNvbCA9IGRmLmNvbHVtbnMuYWRkTmV3RmxvYXQoZW1iZXJkWUNvbE5hbWUpO1xuICBlbWJlZFlDb2wuaW5pdCgoaSkgPT4gcmVzLmVtYmVkWVtpXSk7XG4gIGNvbnN0IGNsdXN0ZXJDb2wgPSBkZi5jb2x1bW5zLmFkZE5ld1N0cmluZyhjbHVzdGVyQ29sTmFtZSk7XG4gIGNsdXN0ZXJDb2wuaW5pdCgoaSkgPT4gcmVzLmNsdXN0ZXJzW2ldLnRvU3RyaW5nKCkpO1xuICBjb25zdCBjbHVzdGVyQ291bnRlckNvbCA9IGRmLmNvbHVtbnMuYWRkTmV3SW50KGNsdXN0ZXJDb3VudGVyQ29sTmFtZSk7XG4gIGNsdXN0ZXJDb3VudGVyQ29sLmluaXQoKGkpID0+IGNsdXN0ZXJzQ291bnRlcltyZXMuY2x1c3RlcnNbaV1dKTtcbiAgY29uc3QgY29ubmVjdGl2aXR5Q29sID0gZGYuY29sdW1ucy5hZGROZXdJbnQoY29ubmVjdGl2aXR5Q29sTmFtZSk7XG4gIGNvbm5lY3Rpdml0eUNvbC5pbml0KChpKSA9PiBjb25uZWN0aXZpdHlbaV0pO1xuXG4gIC8vIGRmLmNvbHVtbnMuYWRkTmV3RmxvYXQoZW1iZXJkWENvbE5hbWUpLmluaXQoKGkpID0+IHJlcy5lbWJlZFhbaV0pO1xuICAvLyBkZi5jb2x1bW5zLmFkZE5ld0Zsb2F0KGVtYmVyZFlDb2xOYW1lKS5pbml0KChpKSA9PiByZXMuZW1iZWRZW2ldKTtcbiAgLy8gZGYuY29sdW1ucy5hZGROZXdJbnQoY2x1c3RlckNvdW50ZXJDb2xOYW1lKS5pbml0KChpKSA9PiBjbHVzdGVyc0NvdW50ZXJbcmVzLmNsdXN0ZXJzW2ldXSk7XG4gIC8vIGRmLmNvbHVtbnMuYWRkTmV3U3RyaW5nKGNsdXN0ZXJDb2xOYW1lKS5pbml0KChpKSA9PiByZXMuY2x1c3RlcnNbaV0udG9TdHJpbmcoKSk7XG4gIHNjLnByb3BzLnhDb2x1bW5OYW1lID0gZW1iZXJkWENvbE5hbWU7XG4gIHNjLnByb3BzLnlDb2x1bW5OYW1lID0gZW1iZXJkWUNvbE5hbWU7XG4gIHNjLnByb3BzLmNvbG9yQ29sdW1uTmFtZSA9IGNsdXN0ZXJDb2xOYW1lO1xuICBzYy5wcm9wcy5tYXJrZXJEZWZhdWx0U2l6ZSA9IDU7XG4gIHRlcm1pbmF0ZVN1Yi51bnN1YnNjcmliZSgpO1xuICAvLyBjb25zdCBzYyA9IHR2LnNjYXR0ZXJQbG90KHt4OiBlbWJlcmRYQ29sTmFtZSwgeTogZW1iZXJkWUNvbE5hbWV9KTtcbiAgLy8gc2MucHJvcHMuY29sb3JDb2x1bW5OYW1lID0gY2x1c3RlckNvbE5hbWU7XG4gIC8vIHNjLnByb3BzLm1hcmtlckRlZmF1bHRTaXplID0gNTtcbiAgY29uc3QgX3NjTGluZXMgPSBuZXcgU2NhdHRlclBsb3RMaW5lc1JlbmRlcmVyKHNjLCBlbWJlcmRYQ29sTmFtZSwgZW1iZXJkWUNvbE5hbWUsXG4gICAge2Zyb206IHJlcy5pcyBhcyBhbnksIHRvOiByZXMuanMgYXMgYW55LCBkcmF3QXJyb3dzOiBmYWxzZSwgb3BhY2l0eTogMC4zLCBza2lwTXVsdGlMaW5lQ2FsY3VsYXRpb246IHRydWV9LFxuICAgIFNjYXR0ZXJQbG90Q3VycmVudExpbmVTdHlsZS5ub25lKTtcbiAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHNjLnJvb3QsIGZhbHNlKTtcbiAgLy8gc2MuY2xvc2UoKTtcbiAgLy8gY29uc3Qgc2NMaW5lc1ZpZXdlciA9IG5ldyBTY2F0dGVyUGxvdFdpdGhMaW5lcyhzYywgcmVzLmlzLCByZXMuanMsIGVtYmVyZFhDb2xOYW1lLCBlbWJlcmRZQ29sTmFtZSk7XG4gIC8vIHR2LmFkZFZpZXdlcihzY0xpbmVzVmlld2VyKTtcbiAgcmV0dXJuIHtzYywgZW1iZWRYQ29sLCBlbWJlZFlDb2wsIGNsdXN0ZXJDb2wsIGNsdXN0ZXJDb3VudGVyQ29sLCBjb25uZWN0aXZpdHlDb2x9O1xufVxuXG4iXX0=","export * from './marcov-cluster';\nexport * from './types';\nexport function createMCLWorker(data, threshold, weights, aggregationMethod, distanceFns, distanceFnArgs, maxIterations = 10, useWebGPU = false, inflate = 2) {\n const worker = new Worker(new URL('mcl-worker', import.meta.url));\n worker.postMessage({ data, threshold, weights, aggregationMethod, distanceFns,\n distanceFnArgs, maxIterations, useWebGPU, inflate });\n let resolveF;\n const promise = new Promise((resolve, reject) => {\n resolveF = resolve;\n worker.onmessage = (event) => {\n setTimeout(() => worker.terminate(), 100);\n resolve(event.data.res);\n };\n worker.onerror = (event) => {\n setTimeout(() => worker.terminate(), 100);\n reject(event);\n };\n });\n const terminate = () => {\n try {\n resolveF(null);\n worker.terminate();\n }\n catch (e) {\n console.error(e);\n }\n };\n return { promise, terminate };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsU0FBUyxDQUFDO0FBRXhCLE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBYSxFQUFFLFNBQWlCLEVBQzlELE9BQWlCLEVBQUUsaUJBQTRDLEVBQy9ELFdBQTJCLEVBQUUsY0FBcUIsRUFBRSxnQkFBd0IsRUFBRSxFQUM5RSxZQUFxQixLQUFLLEVBQUUsVUFBa0IsQ0FBQztJQUMvQyxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXO1FBQzFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFDdEQsSUFBSSxRQUFrQixDQUFDO0lBQ3ZCLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUd0QixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQixRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMzQixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN6QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRTtRQUNyQixJQUFJLENBQUM7WUFDSCxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixPQUFPLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBQyxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbWFyY292LWNsdXN0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNQ0xXb3JrZXIoZGF0YTogYW55W11bXSwgdGhyZXNob2xkOiBudW1iZXIsXG4gIHdlaWdodHM6IG51bWJlcltdLCBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCxcbiAgZGlzdGFuY2VGbnM6IEtub3duTWV0cmljc1tdLCBkaXN0YW5jZUZuQXJnczogYW55W10sIG1heEl0ZXJhdGlvbnM6IG51bWJlciA9IDEwLFxuICB1c2VXZWJHUFU6IGJvb2xlYW4gPSBmYWxzZSwgaW5mbGF0ZTogbnVtYmVyID0gMikge1xuICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKG5ldyBVUkwoJ21jbC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKTtcbiAgd29ya2VyLnBvc3RNZXNzYWdlKHtkYXRhLCB0aHJlc2hvbGQsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCBkaXN0YW5jZUZucyxcbiAgICBkaXN0YW5jZUZuQXJncywgbWF4SXRlcmF0aW9ucywgdXNlV2ViR1BVLCBpbmZsYXRlfSk7XG4gIGxldCByZXNvbHZlRjogRnVuY3Rpb247XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTx7XG4gICAgY2x1c3RlcnM6IG51bWJlcltdLCBlbWJlZFg6IEZsb2F0MzJBcnJheSwgZW1iZWRZOiBGbG9hdDMyQXJyYXksXG4gICAgIGlzOiBVaW50MzJBcnJheSwganM6IFVpbnQzMkFycmF5XG4gICAgfT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVzb2x2ZUYgPSByZXNvbHZlO1xuICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHdvcmtlci50ZXJtaW5hdGUoKSwgMTAwKTtcbiAgICAgICAgcmVzb2x2ZShldmVudC5kYXRhLnJlcyk7XG4gICAgICB9O1xuICAgICAgd29ya2VyLm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB3b3JrZXIudGVybWluYXRlKCksIDEwMCk7XG4gICAgICAgIHJlamVjdChldmVudCk7XG4gICAgICB9O1xuICAgIH0pO1xuICBjb25zdCB0ZXJtaW5hdGUgPSAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc29sdmVGKG51bGwpO1xuICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4ge3Byb21pc2UsIHRlcm1pbmF0ZX07XG59XG4iXX0="],"names":["_scriptDir","exportCppDbscanLib","document","currentScript","src","undefined","readyPromiseResolve","readyPromiseReject","Module","Promise","resolve","reject","readBinary","moduleOverrides","Object","assign","ENVIRONMENT_IS_WEB","window","ENVIRONMENT_IS_WORKER","importScripts","scriptDirectory","process","versions","node","self","location","href","indexOf","substr","replace","lastIndexOf","url","xhr","XMLHttpRequest","open","responseType","send","Uint8Array","console","log","bind","wasmBinary","wasmMemory","err","warn","WebAssembly","abort","HEAP8","HEAPU8","HEAPU32","ABORT","updateMemoryViews","b","buffer","Int8Array","Int16Array","Int32Array","Uint16Array","Uint32Array","Float32Array","Float64Array","__ATPRERUN__","__ATINIT__","__ATPOSTRUN__","runDependencies","runDependencyWatcher","dependenciesFulfilled","what","e","RuntimeError","wasmBinaryFile","path","isDataURI","filename","startsWith","getBinary","file","instantiateArrayBuffer","binaryFile","imports","receiver","fetch","then","credentials","response","catch","getBinaryPromise","binary","instantiate","instance","reason","callRuntimeCallbacks","callbacks","length","shift","ExceptionInfo","excPtr","this","ptr","set_type","type","get_type","set_destructor","destructor","get_destructor","set_caught","caught","get_caught","set_rethrown","rethrown","get_rethrown","init","set_adjusted_ptr","adjustedPtr","get_adjusted_ptr","get_exception_ptr","___cxa_is_pointer_type","adjusted","emscripten_realloc_buffer","size","grow","byteLength","getCFunc","ident","UTF8Decoder","TextDecoder","ccall","returnType","argTypes","args","opts","toC","str","ret","len","i","c","charCodeAt","lengthBytesUTF8","stackAlloc","outPtr","maxBytesToWrite","heap","outIdx","endIdx","u","stringToUTF8Array","stringToUTF8","stringToUTF8OnStack","arr","array","set","func","cArgs","stack","converter","stackSave","apply","stackRestore","heapOrArray","idx","maxBytesToRead","endPtr","decode","subarray","u0","u1","u2","String","fromCharCode","ch","UTF8ArrayToString","Boolean","convertReturnValue","onDone","calledRun","wasmImports","dest","num","copyWithin","requestedSize","x","oldSize","maxHeapSize","cutDown","overGrownHeapSize","Math","min","max","callback","info","receiveInstance","module","cb","exports","unshift","clearInterval","removeRunDependency","result","instantiateStreaming","createWasm","arguments","run","doRun","postRun","preRun","setTimeout","numericArgs","every","runCaller","pop","ready","define","___CSS_LOADER_EXPORT___","push","id","cssWithMappingToString","list","toString","map","item","content","needLayer","concat","join","modules","media","dedupe","supports","layer","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","jStat","Array","prototype","slice","calcRdx","n","m","val","pow","LOG10E","isArray","arg","call","isFunction","isNumber","_init","retZero","retOne","retIdent","j","fn","seq","toArray","constructor","utils","toVector","_random_fn","random","setRandom","TypeError","extend","obj","rows","cols","dimensions","row","index","rowa","col","submat","arange","forEach","ind","column","cola","a","diag","nrow","res","antidiag","transpose","objArr","toAlter","ncol","cumreduce","alter","create","zeros","ones","rand","identity","symmetric","clear","cnt","hival","step","current","start","end","rl","_slice","copy","rcSlice","colSlice","rowSlice","sliceAssign","A","B","nl","ml","diagonal","diagArray","mat","t","jProto","sort","splice","funcs","passfunc","results","split","ascNum","clip","sum","sumsqrd","sumsqerr","tmp","mean","sumrow","product","prod","low","high","unique","hash","_arr","meansqerr","geomean","logs","meanOfLogs","exp","median","arrlen","cumsum","cumprod","diff","diffs","arrLen","rank","distinctNumbers","numberCounts","number","sortedDistinctNumbers","numberRanks","currentRank","count","mode","maxCount","numMaxCount","mode_arr","range","variance","flag","pooledvariance","reduce","samples","deviation","dev","stdev","sqrt","pooledstdev","meandev","abs","meddev","coeffvar","quartiles","round","quantiles","quantilesArray","alphap","betap","p","aleph","gamma","sortedArray","quantileVals","floor","percentile","exclusive","realIndex","parseInt","frac","percentileOfScore","score","kind","value","counter","strict","histogram","binCnt","first","binWidth","bins","covariance","arr1","arr2","v","arr1Len","sq_dev","corrcoeff","spearmancoeff","stanMoment","mu","sigma","skewSum","skewness","kurtosis","fullbool","tmpthis","callbackFunction","argsToPass","curriedFunction","vector","gammaln","xx","y","cof","ser","loggam","x0","x2","xp","gl","gl0","PI","gammafn","z","yi","q","fact","xden","xnum","Infinity","sin","gammap","lowRegGamma","an","aln","ap","del","d","h","ITMAX","NaN","factorialln","factorial","combination","combinationln","permutation","betafn","betaln","betacf","m2","aa","fpmin","qab","qap","qam","gammapinv","pp","lna1","afac","a1","gln","erf","ty","isneg","dd","erfc","erfcinv","ibetainv","lna","lnb","al","w","b1","ibeta","bt","randn","randg","shape","a2","oalph","betinc","eps","c9","a0","b0","m9","tukeyWprob","rr","cc","xleg","aleg","qsqz","wincr","pr_w","normal","cdf","blb","binc","bub","einsum","cc1","wi","elsum","jj","ac","qexpo","rinsum","f","_a","_b","_c","newthis","sample","vals","fnfunc","beta","pdf","alpha","inv","centralF","df1","df2","binomial","cauchy","local","scale","atan","tan","chisquare","dof","exponential","rate","invgamma","kumaraswamy","Error","lognormal","noncentralt","ncp","studentt","tol","flip","prob","lastvalue","std","pareto","SQRT2","dof2","weibull","uniform","betacdf","s","negbin","r","hypgeom","N","scaledPDF","samplesDone","scaledCDF","factor","poisson","l","sumarr","sampleSmall","L","sampleLarge","U","V","slam","loglam","invalpha","vr","us","lam","triangular","arcsine","asin","cos","laplace","tukey","nmeans","df","xlegq","alegq","Number","isFinite","ulen","f2","f2lf","f21","ff4","ans","otsum","twa1","t1","x1","ps","tukeyQinv","valx0","valx1","iter","isUsable","add","subtract","divide","multiply","nrescols","rescols","outer","dot","left","right","norm","nnorm","isNaN","angle","acos","aug","newarr","gauss_jordan","det","determinant","submatrix","sign","gauss_elimination","maug","pivot","temp","y2","maxrow","triaUpSolve","parts","matrix_mode","triaLowSolve","lu","R","cholesky","T","gauss_jacobi","xv","xk","gauss_seidel","SOR","householder","QR","lstsq","array_mode","Q","attrs","Q1","RI","I","Aj","cAi","Ij","cIi","R_I","Q2","jacobi","maxim","theta","condition","ev","rungekutta","t_j","u_j","order","k1","k2","k3","romberg","h1","g","richardson","X","pos","y1","h_min","simpson","hermite","F","dF","dl","lagrange","cubic_spline","sq","gauss_quadrature","PCA","temp1","Bt","D","temp2","Y","C","Vt","differenceOfProportions","p1","n1","p2","n2","pooled","zscore","ztest","sides","tscore","ttest","anovafscore","expVar","sampMean","sampSampMean","tmpargs","unexpVar","anovaftest","ftest","fscore","anovaftes","qscore","mean1","mean2","sd","qtest","tukeyhsd","arrays","means","normalci","change","tci","significant","pvalue","oneSidedDifferenceOfProportions","twoSidedDifferenceOfProportions","models","ols","endog","exog","nobs","df_model","df_resid","coef","predict","resid","ybar","SSE","SSR","SST","R2","t_test","model","var_count","subModelList","endog_index","exog_index","filter","sigmaHat","seBetaHat","mod","tStatistic","pValue","leftppf","interval95","se","F_statistic","F_test","adjust_R2","buildxmatrix","matrixRows","builddxmatrix","buildjxmatrix","jMat","pass","buildymatrix","buildjymatrix","matrixmult","regress","jMatX","jMatY","innerinv","xtranspxinv","xtransp","next","regresst","compile","jMatYBar","yBar","yAverage","anova","residuals","ssr","msr","sse","mse","sst","mst","r2","fratio","rmse","r2adj","stats","sds","ts","covar","xtranspx","inner","matrixsubtract","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","options","idCountMap","identifiers","base","indexByIdentifier","css","sourceMap","references","updater","addElementStyle","byIndex","api","domAPI","update","newObj","remove","lastIdentifiers","newList","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","querySelector","HTMLIFrameElement","contentDocument","head","getTarget","appendChild","element","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","amdO","getter","__esModule","definition","key","o","defineProperty","enumerable","get","chunkId","globalThis","Function","hmd","children","prop","hasOwnProperty","Symbol","toStringTag","scriptUrl","scripts","getElementsByTagName","test","baseURI","nc","grok","ui","DG","heapMap","typeMap","shiftMap","typeToColumnCreatorMap","Column","fromInt32Array","fromFloat32Array","Arg","complementArrOfParams","arrOfParams","complementArrOfTypes","arrOfTypes","allocateMemoryForBuffer","isMemoryForBufferAllocated","putDataToBuffer","getDataFromBuffer","freeBuffer","ArgColumn","targetType","toUpdate","super","buf","numOfRows","_malloc","BYTES_PER_ELEMENT","getRawData","bytes","_free","ArgNewColumn","columnCreator","ArgColumns","numOfColumns","numOfBytes","numOfCols","colData","ArgNewColumns","Param","intColumn","newIntColumn","intColumns","columns","toList","newIntColumns","floatColumn","newFloatColumn","floatColumns","newFloatColumns","int","Return","tableFromColumns","argColumns","DataFrame","fromColumns","double","argColumn","NUM_TYPE","FLOAT_COLUMN_TYPE","INT_COLUMN_TYPE","FLOAT_COLUMNS_TYPE","NEW_FLOAT_COLUMNS_TYPE","INT_COLUMNS_TYPE","NEW_INT_COLUMNS_TYPE","NEW_FLOAT_COLUMN_TYPE","NEW_INT_COLUMN_TYPE","COLUMN","CALL_RESULT","NUM_OF_ROWS","NUM_OF_COLUMNS","REF","VALUE","TABLE_OF_COLUMNS","OBJECTS","INT_TYPE","DOUBLE_TYPE","argsSpecification","inputVals","ref","cppFuncInput","val1","val2","funcSpecification","dataFromWebWorker","_callResult","callResult","funcSpecificationArgs","argsAfterWasmCall","name","names","extractNewlyCreatedData","outPut","output","typeToDataFieldMap","source","arrayToReturn","getOutput","clearNewlyCreatedData","COMP_MIN","SAMPLES_COUNT_MIN","FEATURES_COUNT_MIN","PERCENTAGE_MIN","PERCENTAGE_MAX","MAX_ELEMENTS_COUNT","COMP_POSITVE_MES","COMP_EXCESS","INCORERRECT_MIN_MAX_MES","INCORERRECT_FEATURES_MES","INCORERRECT_SAMPLES_MES","INCORERRECT_PERCENTAGE_MES","DATAFRAME_IS_TOO_BIG_MES","UNSUPPORTED_COLUMN_TYPE_MES","checkColumnType","FLOAT","INT","checkMissingVals","missingValueCount","features","components","checkDimensionReducerInputs","SVM_GEN_FEATURES_INDEX","SVM_GEN_LABELS_INDEX","SVM_FEATURE_NAME","SVM_LABEL_NAME","testDataForBinaryClassification","kernel","kernelParams","samplesCount","featuresCount","violatorsPercentage","checkGeneratorSVMinputs","kernelParamsCol","fromList","_output","_promise","async","worker","Worker","URL","postMessage","EDA","onmessage","terminate","_generateDatasetInWebWorker","_result","_error","LINEAR","POLYNOMIAL","RBF","SIGMOID","CONFUSION_MATR_SIZE","NORMALIZED_DATA_INDEX","MEANS_INDEX","STD_DEVS_INDEX","MODEL_PARAMS_INDEX","MODEL_WEIGHTS_INDEX","PREDICTED_LABELS_INDEX","CORRECTNESS_INDEX","CONFUSION_MATRIX_INDEX","TRUE_POSITIVE_INDEX","FALSE_NEGATIVE_INDEX","FALSE_POSITIVE_INDEX","TRUE_NEGATIVE_INDEX","RBF_SIGMA_INDEX","POLYNOMIAL_C_INDEX","POLYNOMIAL_D_INDEX","SIGMOID_KAPPA_INDEX","SIGMOID_THETA_INDEX","GAMMA_INFIMUM_LIMIT","RBF_SIGMA_INFIMUM_LIMIT","POLYNOMIAL_C_INFIMUM_LIMIT","POLYNOMIAL_D_INFIMUM_LIMIT","WRONG_GAMMA_MESSAGE","WRONG_RBF_SIGMA_MESSAGE","WRONG_POLYNOMIAL_C_MESSAGE","WRONG_POLYNOMIAL_D_MESSAGE","WRONG_KERNEL_MESSAGE","WRONG_LABELS_MESSAGE","LABELS","PREDICTED","CORRECTNESS","CONFUSION_MATRIX_NAME","MEAN","STD_DEV","MODEL_PARAMS_NAME","MODEL_WEIGHTS_NAME","GAMMA","KERNEL","KERNEL_PARAMS","KERNEL_PARAM_1","KERNEL_PARAM_2","FEATURES_COUNT_NAME","TRAIN_SAMPLES_COUNT_NAME","TRAIN_ERROR","KERNEL_TYPE_TO_NAME_MAP","SENSITIVITY","SPECIFICITY","BALANCED_ACCURACY","POSITIVE_PREDICTIVE_VALUE","NEGATIVE_PREDICTIVE_VALUE","PREDICTION","BYTES","INTS_COUNT","KER_PARAMS_COUNT","MODEL_KERNEL_INDEX","SAMPLES_COUNT_INDEX","FEATURES_COUNT_INDEX","INIT_VALUE","LS_SVM_ADD_CONST","getTrainedModel","hyperparameters","labels","categories","labelNumeric","float","dataset","cParam","dParam","checkHyperparameters","kernelParamsArray","kappa","trainCols","modelParamsCount","precomputedWeightsCount","confusionMatrixElementsCount","_trainAndAnalyzeLSSVMInWebWorker","trainGamma","kernelType","trainLabels","normalizedTrainData","stdDevs","modelParams","modelWeights","predictedLabels","correctness","confusionMatrix","trainError","trainSamplesCount","TP","TN","FP","FN","P","TPR","TNR","PPV","NPV","ACC","BA","sensitivity","specificity","balancedAccuracy","positivePredicitveValue","negativePredicitveValue","evaluateAccuracy","trainAndAnalyzeModel","realLabels","showTrainReport","packedModel","getUnpackedModel","form","modelInfo","showNavigation","root","getPackedModel","dataCols","realLabelsBuffer","toByteArray","realLabelsSize","modelInfoBuffer","fromStrings","getModelInfo","modelInfoSize","offset","ints","floats","modelBytes","header","labelsCount","labelsBytesCount","fromByteArray","modelInfoBytesSize","getPrediction","resNumeric","normalizedData","precomputedWeights","targetData","_predictByLSSVMInWebWorker","string","isApplicableSVM","matches","isInteractiveSVM","rowCount","PLS_ANALYSIS","ERROR_MSG","TITLE","HINT","LINK","COMPONENTS","RESULT_NAMES","WASM_OUTPUT_IDX","TIMEOUT","RADIUS","LINE_WIDTH","X_COORD","Y_COORD","COLOR","DEMO_INTRO_MD","DEMO_RESULTS","caption","MODEL","text","SCORES","LOADINGS","REGR_COEFS","EXPL_VAR","DEMO_RESULTS_MD","MVA","getPlsAnalysis","input","table","componentsCount","prediction","regressionCoefficients","REGR_COEFFS","tScores","T_SCORES","uScores","U_SCORES","xLoadings","X_LOADINGS","yLoadings","Y_LOADINGS","runMVA","analysisType","warning","NO_DF","EMPTY_DF","numColNames","numCols","strCols","isValidNumeric","STRING","NO_COLS","ONE_COL","predictInput","PREDICT","onValueChanged","updateIputs","setTooltip","featuresInput","USING","available","onInput","FEATURES","DEFAULT","componentsInput","forProperty","fromOptions","inputType","defaultValue","showPlusMinus","MIN","dlgTitle","dlgHelpUrl","dlgRunBtnTooltip","COMPUTE_COMPONENTS","PLS","dlg","getButton","RUN","disabled","namesInputs","NAMES","hidden","title","helpUrl","addButton","close","plsCols","featuresNames","prefix","PREFIX","XSCORE","getUnusedName","view","tableView","FEATURE","XLOADING","pred","SUFFIX","predictVsReferScatter","addViewer","scatterPlot","xColumnName","yColumnName","showRegressionLine","markerType","CIRCLE","help","regrCoeffsBar","barChart","splitColumnName","valueColumnName","valueAggrType","AVG","COEFFS","showValueSelector","showStackSelector","loadingsScatter","scoreNames","YSCORE","scoresScatter","showViewerFormulaLines","lines","addLine","formula","radius","width","visible","color","xName","AXIS","yName","meta","formulaLines","addAll","yExplVars","compNames","xExplVars","COMP","comp","COMPS","explVarsDF","explVarsBar","EXPL_VARS","showCategorySelector","DEMO","pages","viewer","showNextTo","addTextHint","EXPLORE","windows","showHelp","performMVA","show","append","checkSignificanceLevel","INCORRECT_SIGNIFICANCE_LEVEL","getVariance","INCORRECT_SAMPLE_SIZE","sumOfSquares","areVarsEqual","xData","yData","xVar","yVar","FactorizedData","values","checkNormality","isNormDistrib","NON_EQUAL_FACTORS_VALUES_SIZE","setStats","isNormal","K","catCount","sums","sumsOfSquares","subSampleSizes","getOneWayAnova","ANOVA_FAILED_JUST_ONE_CAT","ssTot","ssBn","ssWn","dfBn","dfWn","msBn","msWn","fStat","dfTot","_checkNormality","_alpha","cats","fill","UNSUPPORTED_COLUMN_TYPE","thisArg","_arguments","generator","fulfilled","rejected","done","getDbscanWorker","embedX","embedY","epsilon","minPts","error","clusters","gpuAdapter","getGPUAdapterDescription","navigator","gpu","requestAdapter","requestAdapterInfo","replaceEmptyString","description","vendor","replacement","WEBGSLAGGREGATION","WEBGPUDISTANCE","MatrixMatrixOpType","MatrixOpType","MatrixScalarOpType","DimReductionMethods","EUCLIDEAN","MANHATTAN","HAMMING","TANIMOTO","LEVENSTEIN","NEEDLEMAN_WUNSCH","MONOMER_CHEMICAL_DISTANCE","SOKAL","COSINE","ASYMMETRIC","Difference","OneHot","Set","defaultMCLOptions","MCL_OPTIONS_TAG","MOLECULE","MACROMOLECULE","DBScanOptions","uiName","tooltip","BYPASS_LARGE_DATA_WARNING","SHOW_SCATTERPLOT_PROGRESS","DistanceAggregationMethods","rxjs","locals","learningRate","nEpochs","nNeighbors","spread","minDist","randomSeed","useWebGPU","disableTooltip","desc","disable","perplexity","MultiColumnDimReductionEditor","editorSettings","columnOptEditors","columnOptEditorsRoot","columnParamsEditorRoot","weightsEditorRoot","columnFunctionsMap","methodsParams","UMAP","T_SNE","dbScanParams","methodSettingsDivs","supportedFunctions","methodSettingsAnchor","plotEmbeddingsInput","aggregationMethodInput","onColumnsChanged","Subject","columnParamsEditorAccordion","find","tags","semTypes","friendlyName","types","units","distanceFunctions","semtype","includes","postProcessingEditor","PostProcessingFuncEditor","tableInput","tv","dataFrame","tables","onTableInputChanged","settingsOpened","methodInput","createAlgorithmSettingsDiv","methodSettingsIcon","settings","it","classList","prepend","addPane","display","keys","funcName","semTypeSupported","semType","typeSuported","unitsSupported","getTag","UNITS","supportedColNames","columnsInput","DimReductionColumnEditor","editorsRoot","maxHeight","overflow","editor","accordionDiv","doubledColEditors","_","colOptEditors","preprocessingFuncSettingsDiv","parentElement","setProperty","fireChanged","columnsInputRoot","from","params","anchor","parent","param","enabled","insertBefore","algorithmOptions","algorithmParams","dbScanOptions","dbScanEpsilon","dbScanMinPts","getEditor","minWidth","classes","getParams","methodName","preprocessingFunctions","preProcessingFunction","distanceMetrics","similarityMetricInput","weights","weight","preprocessingFuncArgs","preprocessingFunctionSettings","plotEmbeddings","clusterEmbeddings","postProcessingFunction","postProcessingFunctionArgs","aggreaggregationMethod","editorDiv","hasExtraSettings","functionsMap","needsConfiguration","weightInput","getFuncName","preprocessingFunctionInput","inputs","supF","getSimilarityMetricInput","preprocessingFuncSettingsIcon","createSettingsDiv","columnTitle","similarityMetricInputRoot","distanceOptionsDiv","preFunc","paramsForm","fc","prepare","buildEditor","fInput","inputParams","inp","property","onChanged","marginBottom","postProcessingFunctionsMap","_root","_postProcessingArgs","_argsElement","_settingsOpened","_settingsIcon","defaultPostProcessingFunc","postProcessingFunctionInput","onFunctionChanged","nullable","DIMENSIONALITY_REDUCER_TERMINATE_EVENT","isNil","getEmbeddingViewerName","method","COPY_SUFFIX","KNN_IMPUTER","SUPPORTED_COLUMN_TYPES","DATE_TIME","QNUM","getNullValue","METRIC_TYPE","DISTANCE_TYPE","MIN_NEIGHBORS","areThereFails","targetColNames","featureColNames","misValsInds","has","indices","FAILS_TO_PREDICT_IMPUTATION_FAILS","failToImpute","feature","featureInds","ScatterPlotCurrentLineStyle","runKNNImputer","NO_DATAFRAME","colsWithMissingVals","availableTargetColsNames","availableFeatureColsNames","Map","nullValue","getMissingValsIndices","NO_MISSING_VALUES","ONE_AVAILABLE_FEATURE","inPlace","IN_PLACE","inPlaceInput","bool","keepEmpty","KEEP_EMPTY","keepEmptyInput","neighbors","NEIGHBORS","neighborsInput","distType","distTypeInput","choice","DISTANCE","items","targetColInput","COLUMNS","checkApplicability","checked","TARGET","selectedFeatureColNames","metricInfoInputs","div","hideWidgets","distDiv","metricsDiv","ONE_FEATURE_SELECTED","featuresMetrics","defaultWeight","WEIGHT","defaultMetric","ONE_HOT","availableMetrics","DIFFERENCE","getFeatureInputSettings","distInfo","METRIC","settingsIcon","METRIC_SETTINGS","okClicked","promise","rej","onOK","delete","failedToImpute","missingValsIndices","distance","INCORRECT_NEIGHBORS","KNN_NOT_ENOUGH_OF_ROWS","KNN_NO_TARGET_COLUMNS","KNN_NO_FEATURE_COLUMNS","KNN_FAILS","WRONG_PREDICTIONS","byName","getCol","frequencies","featureSource","featureNullVal","metricFunc","failedToImputeIndices","metricInfo","properIndices","bufferVector","properIndicesCount","nearestItems","nearestItemsCount","maxInd","maxDist","fillValue","computeBufferVector","cur","properIndex","dist","canItemBeUsed","getFillValue","getProperIndeces","KNN_IMPOSSIBLE_IMPUTATION","curDist","maxFreq","maxFreqIdx","mostFrequentOfTheNearestItems","CORE_ISSUE","clone","copyName","contains","copySource","impute","colName","fillVal","raw","EMPTY_COLUMN","getFirstNonNull","avg","getDefaultFillValue","imputeFailed","message","onClose","subscribe","MCLEditor","similarityThresholdInput","maxIterationsInput","useWebGPUInput","inflateInput","threshold","maxIterations","inflateFactor","BitArray","_length","_version","_updateLevel","_selectedCount","_selectedCountVersion","_selectedIndexesVersion","_versionedName","_versionedNameVersion","SHRINK_THRESHOLD","buff","_createBuffer","_data","assureGoez","argName","assureInRange","dst","copyFrom","other","lengthInInts","version","incrementVersion","notify","versionedName","setLength","nIntsNeeded","newData","fromAnd","set1","set2","fromValues","fromSeq","setBit","fromString","charAt","fromUint32Array","fromBytes","num1","num2","countBits","equals","getBit","bitArray","setAll","invert","flags","setIndexes","indexes","setFast","everyIndex","anyIndex","setWhere","check","allowClear","getRange","to","getRangeAsList","setRange","setTrue","setFalse","and","andNot","notAnd","not","or","xor","insertAt","oldlength","removeAt","removeByMask","mask","dstIdx","srcIdx","findNext","bit","trueCount","falseCount","_onBitCount","remainingBits","countWhere","andWithCountBits","second","allTrue","allFalse","anyTrue","anyFalse","unusedBits","numInts","_firstOnBit","findPrev","_lastOnBit","ScatterPlotLinesRenderer","currentLineId","_currentLineIdx","sp","render","ctx","linesToRender","updateLines","linesVisibility","visibility","xAxis","yAxis","currentLineStyle","none","lineClicked","lineHover","mouseOverLineId","arrowWidth","xAxisCol","yAxisCol","canvas","getInfo","getContext","arrowSize","onmousedown","event","clientX","clientY","onmousemove","checkCoordsOnLine","offsetX","offsetY","onEvent","renderLines","multipleLinesCounts","skipMultiLineCalculation","createMultiLinesIndices","_d","_e","_f","_g","_h","_j","_l","_m","_o","spLook","getOptions","look","individualLineStyles","colors","opacities","drawArrowsArr","lineWidth","strokeStyle","opacity","markerSizeCol","lineLen","sizeFrom","sizeTo","getMarkersSizes","pointFrom","worldToScreen","aX","aY","pointTo","bX","bY","minAxis","viewBox","height","beginPath","hypot","widths","toggleCurrentLineStyle","multiLines","controlPoint","getLineLength","startPointWithMarker","getPointOnDistance","endtPointWithMarker","findControlPoint","moveTo","quadraticCurveTo","lineTo","drawArrows","arrowPoint","arrowCPX","arrowCPY","canvasArrow","stroke","closePath","fillLeftBottomRect","bold","dashed","setLineDash","markerMinSize","markerMaxSize","markerDefaultSize","rect","Path2D","yAxisBox","minX","maxY","xAxisBox","fillStyle","arrayIdxsBitArray","firstLineIdx","linesPerPair","pointToCompare1","pointToCompare2","candidateIdx","pFrom","pTo","fromMarker","toMarker","calculateDistToCurveLine","calculateDistToStraightLine","xMin","xMax","yMin","yMax","distToStraightLineSegment","pc","calculateDistToCurveInRect","p0","stepsNum","deltaT","arrX","arrY","maxHW","minSumHW","candidateIdxs","xOnCurve","yOnCurve","rectW","rectH","sumHW","p1x","p1y","p2x","p2y","p3x","p3y","midX","midY","dx","dy","perpendicularLen","ceil","arrowEndX","arrowEndY","quadX","quadY","arrowAngle","atan2","getLinearRegressionParams","targets","yAvg","yStdev","inputsAnalysis","getInputsAnalysis","toApplyPLS","paramsByPLS","getLinearRegressionParamsUsingPLS","tmpSum","nonConstFeatureColsIndeces","nonConstFeatureCols","nonConstFeatureAvgs","nonConstFeatureStdevs","nonConstFeaturesCount","tempParams","featureAvgs","featureStdDevs","targetsAvg","targetsStdDev","paramsCount","cFuncName","isEnoughOfMemoryAllocated","extendedTypeOfReturn","cppFuncWrapper","_fitLinearRegressionParamsWithDataNormalizing","getPredictionByLinearRegression","rawData","bias","MEMORY_SCALE","wasmBufferOverflow","_package","webRoot","initEDA","_initEDAAPI","dbScan","xCol","yCol","clusterColName","cluster","center","pcaTable","centerNum","scaleNum","_principalComponentAnalysisInWebWorker","computePCA","addPrefixToEachColumnName","addTableView","dbscanPostProcessingFunction","col1","col2","minimumPoints","resCol","changeColumnType","colNames","viewers","props","colorColumnName","numberPreprocessingFunction","_metric","entries","stringPreprocessingFunction","reduceDimensionality","dialog","metrics","aggregationMethod","dimRedOptions","uiOptions","postProcessingFunc","postProcFuncArgs","scatterPlotProps","showXAxis","showYAxis","showXSelector","showYSelector","doReduce","pg","scatterPlotName","embedColsNames","axes","colNameInd","getEmbeddingColsNames","progressFunc","_nEpoch","epochsLength","embeddings","embedXCol","embedYCol","progress","toFixed","getDimRed","resolveF","sub","onViewerClosed","fireCustomEvent","unsubscribe","dimRedResPromise","encodedColEntries","pf","distanceFnArgs","colInputName","metricInputName","distanceAggregation","dimensionalityReduceRes","columnsData","terminateSub","onCustomEvent","embedding","epochNum","createMultiDimRedWorker","stdDevInverse","normalize","getNormalizedEmbeddings","clusterPg","clusterRes","addNewString","col1InputName","col2InputName","fastRowCount","onCancel","multiColReduceDimensionality","validate","okButton","GetMCLEditor","funcEditor","preprocessingFuncs","inflate","errMsg","errStack","logger","MCL","serializedOptions","setTag","SCATTER_PLOT","initializationFunction","MCLInitializationFunction","sc","mclTag","parse","scp","mclWorker","distanceFns","onerror","createMCLWorker","emberdXColName","emberdYColName","clustersCounter","connectivity","is","js","clusterCounterColName","connectivityColName","addNewFloat","clusterCol","clusterCounterCol","addNewInt","connectivityCol","markovCluster","topMenuPLS","PERFORM_MVA","demoMultivariateAnalysis","showContextPanel","showProperties","runDemoMVA","testDataLinearSeparable","testDataLinearNonSeparable","trainLinearKernelSVM","predictColumn","applyLinearKernelSVM","isApplicableLinearKernelSVM","isInteractiveLinearKernelSVM","visualizeLinearKernelSVM","targetColumn","trainRBFkernelSVM","applyRBFkernelSVM","isApplicableRBFkernelSVM","isInteractiveRBFkernelSVM","visualizeRBFkernelSVM","trainPolynomialKernelSVM","applyPolynomialKernelSVM","isApplicablePolynomialKernelSVM","isInteractivePolynomialKernelSVM","visualizePolynomialKernelSVM","trainSigmoidKernelSVM","applySigmoidKernelSVM","isApplicableSigmoidKernelSVM","isInteractiveSigmoidKernelSVM","visualizeSigmoidKernelSVM","significance","factors","getTableView","boxPlot","grid","addOneWayAnovaVizualization","categores","factorized","NON_EQUAL_VARIANCES","NON_NORMAL_DISTRIB","fCrit","fCritical","hypothesis","testResult","getOneWayAnovaDF","oneWayAnova","kNNImputation","kNNImputationForTable","linearRegression","plot","performance","now","t2","generateDatasetForLinearRegressionTest","colCount","featuresScale","featuresBias","paramsScale","paramsBias","demo","randomWalk","noiseCol","yNoisy","getTestDatasetForLinearRegression","trainLinearRegression","applyLinearRegression","isApplicableLinearRegression","isInteractiveLinearRegression"],"sourceRoot":""}