@delon/abc 15.2.1 → 16.0.0

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 (462) hide show
  1. package/auto-focus/auto-focus.directive.d.ts +1 -1
  2. package/avatar-list/avatar-list-item.component.d.ts +1 -1
  3. package/avatar-list/avatar-list.component.d.ts +1 -1
  4. package/count-down/count-down.component.d.ts +1 -1
  5. package/date-picker/range.directive.d.ts +1 -1
  6. package/down-file/down-file.directive.d.ts +1 -1
  7. package/ellipsis/ellipsis.component.d.ts +1 -1
  8. package/error-collect/error-collect.component.d.ts +1 -1
  9. package/esm2022/auto-focus/auto-focus.directive.mjs +51 -0
  10. package/esm2022/auto-focus/auto-focus.module.mjs +18 -0
  11. package/esm2022/avatar-list/avatar-list-item.component.mjs +27 -0
  12. package/esm2022/avatar-list/avatar-list.component.mjs +89 -0
  13. package/esm2022/avatar-list/avatar-list.module.mjs +23 -0
  14. package/esm2022/count-down/count-down.component.mjs +46 -0
  15. package/esm2022/count-down/count-down.module.mjs +21 -0
  16. package/esm2022/date-picker/date-picker.module.mjs +23 -0
  17. package/esm2022/date-picker/range-shortcut.component.mjs +41 -0
  18. package/esm2022/date-picker/range.directive.mjs +174 -0
  19. package/esm2022/down-file/down-file.directive.mjs +115 -0
  20. package/esm2022/down-file/down-file.module.mjs +21 -0
  21. package/esm2022/ellipsis/ellipsis.component.mjs +233 -0
  22. package/esm2022/ellipsis/ellipsis.module.mjs +22 -0
  23. package/esm2022/error-collect/error-collect.component.mjs +122 -0
  24. package/esm2022/error-collect/error-collect.module.mjs +21 -0
  25. package/esm2022/exception/exception.component.mjs +109 -0
  26. package/esm2022/exception/exception.module.mjs +24 -0
  27. package/esm2022/footer-toolbar/footer-toolbar.component.mjs +45 -0
  28. package/esm2022/footer-toolbar/footer-toolbar.module.mjs +22 -0
  29. package/esm2022/full-content/full-content-toggle.directive.mjs +25 -0
  30. package/esm2022/full-content/full-content.component.mjs +140 -0
  31. package/esm2022/full-content/full-content.module.mjs +21 -0
  32. package/esm2022/full-content/full-content.service.mjs +23 -0
  33. package/esm2022/global-footer/global-footer-item.component.mjs +31 -0
  34. package/esm2022/global-footer/global-footer.component.mjs +73 -0
  35. package/esm2022/global-footer/global-footer.module.mjs +22 -0
  36. package/esm2022/hotkey/hotkey.directive.mjs +37 -0
  37. package/esm2022/hotkey/hotkey.module.mjs +18 -0
  38. package/esm2022/let/let.directive.mjs +38 -0
  39. package/esm2022/let/let.module.mjs +18 -0
  40. package/esm2022/loading/loading.component.mjs +27 -0
  41. package/esm2022/loading/loading.module.mjs +24 -0
  42. package/esm2022/loading/loading.service.mjs +91 -0
  43. package/esm2022/lodop/lodop.module.mjs +13 -0
  44. package/esm2022/lodop/lodop.service.mjs +223 -0
  45. package/esm2022/media/media.component.mjs +118 -0
  46. package/esm2022/media/media.module.mjs +20 -0
  47. package/esm2022/media/media.service.mjs +47 -0
  48. package/esm2022/notice-icon/notice-icon-tab.component.mjs +35 -0
  49. package/esm2022/notice-icon/notice-icon.component.mjs +90 -0
  50. package/esm2022/notice-icon/notice-icon.module.mjs +59 -0
  51. package/esm2022/observers/observer-size.mjs +119 -0
  52. package/esm2022/onboarding/onboarding.component.mjs +135 -0
  53. package/esm2022/onboarding/onboarding.module.mjs +27 -0
  54. package/esm2022/onboarding/onboarding.service.mjs +186 -0
  55. package/esm2022/page-header/page-header.component.mjs +247 -0
  56. package/esm2022/page-header/page-header.module.mjs +25 -0
  57. package/esm2022/pdf/pdf.component.mjs +474 -0
  58. package/{esm2020 → esm2022}/pdf/pdf.config.mjs +2 -2
  59. package/esm2022/pdf/pdf.module.mjs +21 -0
  60. package/esm2022/qr/qr.component.mjs +137 -0
  61. package/esm2022/qr/qr.module.mjs +20 -0
  62. package/esm2022/quick-menu/quick-menu.component.mjs +90 -0
  63. package/esm2022/quick-menu/quick-menu.module.mjs +22 -0
  64. package/esm2022/result/result.component.mjs +61 -0
  65. package/esm2022/result/result.module.mjs +22 -0
  66. package/esm2022/reuse-tab/reuse-tab-context-menu.component.mjs +77 -0
  67. package/esm2022/reuse-tab/reuse-tab-context.component.mjs +34 -0
  68. package/esm2022/reuse-tab/reuse-tab-context.directive.mjs +36 -0
  69. package/esm2022/reuse-tab/reuse-tab-context.service.mjs +56 -0
  70. package/esm2022/reuse-tab/reuse-tab.component.mjs +368 -0
  71. package/esm2022/reuse-tab/reuse-tab.module.mjs +50 -0
  72. package/esm2022/reuse-tab/reuse-tab.service.mjs +559 -0
  73. package/esm2022/se/se-container.component.mjs +174 -0
  74. package/esm2022/se/se.component.mjs +235 -0
  75. package/esm2022/se/se.module.mjs +24 -0
  76. package/esm2022/sg/sg-container.component.mjs +53 -0
  77. package/esm2022/sg/sg.component.mjs +68 -0
  78. package/esm2022/sg/sg.module.mjs +21 -0
  79. package/esm2022/st/st-column-source.mjs +493 -0
  80. package/esm2022/st/st-data-source.mjs +480 -0
  81. package/esm2022/st/st-export.mjs +90 -0
  82. package/{esm2020 → esm2022}/st/st-filter.component.mjs +8 -7
  83. package/esm2022/st/st-row.directive.mjs +47 -0
  84. package/esm2022/st/st-widget-host.directive.mjs +32 -0
  85. package/esm2022/st/st-widget.mjs +27 -0
  86. package/esm2022/st/st.component.mjs +1004 -0
  87. package/esm2022/st/st.module.mjs +97 -0
  88. package/esm2022/sv/sv-container.component.mjs +127 -0
  89. package/esm2022/sv/sv-value.component.mjs +45 -0
  90. package/esm2022/sv/sv.component.mjs +120 -0
  91. package/esm2022/sv/sv.module.mjs +26 -0
  92. package/esm2022/tag-select/tag-select.component.mjs +64 -0
  93. package/esm2022/tag-select/tag-select.module.mjs +22 -0
  94. package/esm2022/xlsx/xlsx.directive.mjs +28 -0
  95. package/esm2022/xlsx/xlsx.module.mjs +20 -0
  96. package/esm2022/xlsx/xlsx.service.mjs +129 -0
  97. package/esm2022/zip/zip.module.mjs +16 -0
  98. package/esm2022/zip/zip.service.mjs +117 -0
  99. package/exception/exception.component.d.ts +1 -1
  100. package/{fesm2015 → fesm2022}/auto-focus.mjs +7 -7
  101. package/{fesm2015 → fesm2022}/auto-focus.mjs.map +1 -1
  102. package/{fesm2020 → fesm2022}/avatar-list.mjs +10 -10
  103. package/fesm2022/avatar-list.mjs.map +1 -0
  104. package/{fesm2020 → fesm2022}/chart-observer-size.mjs +10 -10
  105. package/fesm2022/chart-observer-size.mjs.map +1 -0
  106. package/{fesm2020 → fesm2022}/count-down.mjs +7 -7
  107. package/fesm2022/count-down.mjs.map +1 -0
  108. package/{fesm2020 → fesm2022}/date-picker.mjs +14 -13
  109. package/fesm2022/date-picker.mjs.map +1 -0
  110. package/{fesm2020 → fesm2022}/down-file.mjs +8 -8
  111. package/fesm2022/down-file.mjs.map +1 -0
  112. package/{fesm2020 → fesm2022}/ellipsis.mjs +7 -7
  113. package/fesm2022/ellipsis.mjs.map +1 -0
  114. package/{fesm2020 → fesm2022}/error-collect.mjs +9 -9
  115. package/fesm2022/error-collect.mjs.map +1 -0
  116. package/{fesm2020 → fesm2022}/exception.mjs +7 -7
  117. package/fesm2022/exception.mjs.map +1 -0
  118. package/{fesm2020 → fesm2022}/footer-toolbar.mjs +7 -7
  119. package/fesm2022/footer-toolbar.mjs.map +1 -0
  120. package/{fesm2020 → fesm2022}/full-content.mjs +13 -13
  121. package/fesm2022/full-content.mjs.map +1 -0
  122. package/{fesm2020 → fesm2022}/global-footer.mjs +10 -10
  123. package/fesm2022/global-footer.mjs.map +1 -0
  124. package/{fesm2020 → fesm2022}/hotkey.mjs +7 -7
  125. package/{fesm2015 → fesm2022}/hotkey.mjs.map +1 -1
  126. package/{fesm2020 → fesm2022}/let.mjs +9 -8
  127. package/fesm2022/let.mjs.map +1 -0
  128. package/{fesm2020 → fesm2022}/loading.mjs +10 -11
  129. package/fesm2022/loading.mjs.map +1 -0
  130. package/{fesm2020 → fesm2022}/lodop.mjs +7 -7
  131. package/{fesm2020 → fesm2022}/lodop.mjs.map +1 -1
  132. package/{fesm2020 → fesm2022}/media.mjs +10 -10
  133. package/fesm2022/media.mjs.map +1 -0
  134. package/fesm2022/notice-icon.mjs +180 -0
  135. package/fesm2022/notice-icon.mjs.map +1 -0
  136. package/{fesm2020 → fesm2022}/onboarding.mjs +10 -11
  137. package/{fesm2020 → fesm2022}/onboarding.mjs.map +1 -1
  138. package/{fesm2020 → fesm2022}/page-header.mjs +7 -7
  139. package/{fesm2015 → fesm2022}/page-header.mjs.map +1 -1
  140. package/{fesm2020 → fesm2022}/pdf.mjs +10 -10
  141. package/fesm2022/pdf.mjs.map +1 -0
  142. package/{fesm2015 → fesm2022}/qr.mjs +7 -7
  143. package/{fesm2020 → fesm2022}/qr.mjs.map +1 -1
  144. package/{fesm2020 → fesm2022}/quick-menu.mjs +7 -7
  145. package/fesm2022/quick-menu.mjs.map +1 -0
  146. package/{fesm2020 → fesm2022}/result.mjs +7 -7
  147. package/{fesm2020 → fesm2022}/result.mjs.map +1 -1
  148. package/{fesm2020 → fesm2022}/reuse-tab.mjs +31 -31
  149. package/{fesm2015 → fesm2022}/reuse-tab.mjs.map +1 -1
  150. package/{fesm2020 → fesm2022}/se.mjs +15 -15
  151. package/fesm2022/se.mjs.map +1 -0
  152. package/{fesm2020 → fesm2022}/sg.mjs +10 -10
  153. package/fesm2022/sg.mjs.map +1 -0
  154. package/{fesm2020 → fesm2022}/st.mjs +72 -72
  155. package/fesm2022/st.mjs.map +1 -0
  156. package/{fesm2020 → fesm2022}/sv.mjs +20 -20
  157. package/fesm2022/sv.mjs.map +1 -0
  158. package/{fesm2020 → fesm2022}/tag-select.mjs +7 -7
  159. package/fesm2022/tag-select.mjs.map +1 -0
  160. package/{fesm2020 → fesm2022}/xlsx.mjs +10 -10
  161. package/fesm2022/xlsx.mjs.map +1 -0
  162. package/{fesm2020 → fesm2022}/zip.mjs +7 -7
  163. package/{fesm2015 → fesm2022}/zip.mjs.map +1 -1
  164. package/footer-toolbar/footer-toolbar.component.d.ts +1 -1
  165. package/full-content/full-content.component.d.ts +1 -1
  166. package/global-footer/global-footer-item.component.d.ts +1 -1
  167. package/global-footer/global-footer.component.d.ts +1 -1
  168. package/hotkey/hotkey.directive.d.ts +1 -1
  169. package/let/let.directive.d.ts +1 -1
  170. package/loading/style/index.less +1 -4
  171. package/media/media.component.d.ts +1 -1
  172. package/notice-icon/notice-icon-tab.component.d.ts +1 -1
  173. package/notice-icon/notice-icon.component.d.ts +1 -1
  174. package/onboarding/style/index.less +1 -4
  175. package/package.json +106 -176
  176. package/page-header/page-header.component.d.ts +1 -1
  177. package/pdf/pdf.component.d.ts +1 -1
  178. package/qr/qr.component.d.ts +1 -1
  179. package/quick-menu/quick-menu.component.d.ts +1 -1
  180. package/result/result.component.d.ts +1 -1
  181. package/reuse-tab/reuse-tab-context-menu.component.d.ts +1 -1
  182. package/reuse-tab/reuse-tab-context.component.d.ts +1 -1
  183. package/reuse-tab/reuse-tab-context.directive.d.ts +1 -1
  184. package/reuse-tab/reuse-tab.component.d.ts +1 -1
  185. package/se/se-container.component.d.ts +1 -1
  186. package/se/se.component.d.ts +1 -1
  187. package/sg/sg-container.component.d.ts +1 -1
  188. package/sg/sg.component.d.ts +1 -1
  189. package/st/st-filter.component.d.ts +1 -1
  190. package/st/st-row.directive.d.ts +1 -1
  191. package/st/st-widget-host.directive.d.ts +1 -1
  192. package/st/st.component.d.ts +9 -5
  193. package/st/style/index.less +6 -2
  194. package/sv/sv-container.component.d.ts +1 -1
  195. package/sv/sv-value.component.d.ts +1 -1
  196. package/sv/sv.component.d.ts +1 -1
  197. package/tag-select/tag-select.component.d.ts +1 -1
  198. package/xlsx/xlsx.directive.d.ts +1 -1
  199. package/esm2020/auto-focus/auto-focus.directive.mjs +0 -50
  200. package/esm2020/auto-focus/auto-focus.module.mjs +0 -17
  201. package/esm2020/avatar-list/avatar-list-item.component.mjs +0 -26
  202. package/esm2020/avatar-list/avatar-list.component.mjs +0 -88
  203. package/esm2020/avatar-list/avatar-list.module.mjs +0 -22
  204. package/esm2020/count-down/count-down.component.mjs +0 -45
  205. package/esm2020/count-down/count-down.module.mjs +0 -20
  206. package/esm2020/date-picker/date-picker.module.mjs +0 -22
  207. package/esm2020/date-picker/range-shortcut.component.mjs +0 -40
  208. package/esm2020/date-picker/range.directive.mjs +0 -172
  209. package/esm2020/down-file/down-file.directive.mjs +0 -114
  210. package/esm2020/down-file/down-file.module.mjs +0 -20
  211. package/esm2020/ellipsis/ellipsis.component.mjs +0 -232
  212. package/esm2020/ellipsis/ellipsis.module.mjs +0 -21
  213. package/esm2020/error-collect/error-collect.component.mjs +0 -121
  214. package/esm2020/error-collect/error-collect.module.mjs +0 -20
  215. package/esm2020/exception/exception.component.mjs +0 -108
  216. package/esm2020/exception/exception.module.mjs +0 -23
  217. package/esm2020/footer-toolbar/footer-toolbar.component.mjs +0 -44
  218. package/esm2020/footer-toolbar/footer-toolbar.module.mjs +0 -21
  219. package/esm2020/full-content/full-content-toggle.directive.mjs +0 -24
  220. package/esm2020/full-content/full-content.component.mjs +0 -139
  221. package/esm2020/full-content/full-content.module.mjs +0 -20
  222. package/esm2020/full-content/full-content.service.mjs +0 -22
  223. package/esm2020/global-footer/global-footer-item.component.mjs +0 -30
  224. package/esm2020/global-footer/global-footer.component.mjs +0 -72
  225. package/esm2020/global-footer/global-footer.module.mjs +0 -21
  226. package/esm2020/hotkey/hotkey.directive.mjs +0 -36
  227. package/esm2020/hotkey/hotkey.module.mjs +0 -17
  228. package/esm2020/let/let.directive.mjs +0 -36
  229. package/esm2020/let/let.module.mjs +0 -17
  230. package/esm2020/loading/loading.component.mjs +0 -26
  231. package/esm2020/loading/loading.module.mjs +0 -24
  232. package/esm2020/loading/loading.service.mjs +0 -90
  233. package/esm2020/lodop/lodop.module.mjs +0 -12
  234. package/esm2020/lodop/lodop.service.mjs +0 -222
  235. package/esm2020/media/media.component.mjs +0 -117
  236. package/esm2020/media/media.module.mjs +0 -19
  237. package/esm2020/media/media.service.mjs +0 -46
  238. package/esm2020/notice-icon/notice-icon-tab.component.mjs +0 -34
  239. package/esm2020/notice-icon/notice-icon.component.mjs +0 -89
  240. package/esm2020/notice-icon/notice-icon.module.mjs +0 -58
  241. package/esm2020/observers/observer-size.mjs +0 -116
  242. package/esm2020/onboarding/onboarding.component.mjs +0 -134
  243. package/esm2020/onboarding/onboarding.module.mjs +0 -27
  244. package/esm2020/onboarding/onboarding.service.mjs +0 -185
  245. package/esm2020/page-header/page-header.component.mjs +0 -246
  246. package/esm2020/page-header/page-header.module.mjs +0 -24
  247. package/esm2020/pdf/pdf.component.mjs +0 -473
  248. package/esm2020/pdf/pdf.module.mjs +0 -20
  249. package/esm2020/qr/qr.component.mjs +0 -136
  250. package/esm2020/qr/qr.module.mjs +0 -19
  251. package/esm2020/quick-menu/quick-menu.component.mjs +0 -89
  252. package/esm2020/quick-menu/quick-menu.module.mjs +0 -21
  253. package/esm2020/result/result.component.mjs +0 -60
  254. package/esm2020/result/result.module.mjs +0 -21
  255. package/esm2020/reuse-tab/reuse-tab-context-menu.component.mjs +0 -76
  256. package/esm2020/reuse-tab/reuse-tab-context.component.mjs +0 -33
  257. package/esm2020/reuse-tab/reuse-tab-context.directive.mjs +0 -35
  258. package/esm2020/reuse-tab/reuse-tab-context.service.mjs +0 -55
  259. package/esm2020/reuse-tab/reuse-tab.component.mjs +0 -367
  260. package/esm2020/reuse-tab/reuse-tab.module.mjs +0 -49
  261. package/esm2020/reuse-tab/reuse-tab.service.mjs +0 -558
  262. package/esm2020/se/se-container.component.mjs +0 -172
  263. package/esm2020/se/se.component.mjs +0 -234
  264. package/esm2020/se/se.module.mjs +0 -23
  265. package/esm2020/sg/sg-container.component.mjs +0 -52
  266. package/esm2020/sg/sg.component.mjs +0 -67
  267. package/esm2020/sg/sg.module.mjs +0 -20
  268. package/esm2020/st/st-column-source.mjs +0 -492
  269. package/esm2020/st/st-data-source.mjs +0 -479
  270. package/esm2020/st/st-export.mjs +0 -89
  271. package/esm2020/st/st-row.directive.mjs +0 -45
  272. package/esm2020/st/st-widget-host.directive.mjs +0 -31
  273. package/esm2020/st/st-widget.mjs +0 -26
  274. package/esm2020/st/st.component.mjs +0 -1002
  275. package/esm2020/st/st.module.mjs +0 -96
  276. package/esm2020/sv/sv-container.component.mjs +0 -125
  277. package/esm2020/sv/sv-value.component.mjs +0 -44
  278. package/esm2020/sv/sv.component.mjs +0 -119
  279. package/esm2020/sv/sv.module.mjs +0 -25
  280. package/esm2020/tag-select/tag-select.component.mjs +0 -63
  281. package/esm2020/tag-select/tag-select.module.mjs +0 -21
  282. package/esm2020/xlsx/xlsx.directive.mjs +0 -27
  283. package/esm2020/xlsx/xlsx.module.mjs +0 -19
  284. package/esm2020/xlsx/xlsx.service.mjs +0 -128
  285. package/esm2020/zip/zip.module.mjs +0 -15
  286. package/esm2020/zip/zip.service.mjs +0 -116
  287. package/fesm2015/avatar-list.mjs +0 -139
  288. package/fesm2015/avatar-list.mjs.map +0 -1
  289. package/fesm2015/chart-observer-size.mjs +0 -124
  290. package/fesm2015/chart-observer-size.mjs.map +0 -1
  291. package/fesm2015/count-down.mjs +0 -69
  292. package/fesm2015/count-down.mjs.map +0 -1
  293. package/fesm2015/date-picker.mjs +0 -236
  294. package/fesm2015/date-picker.mjs.map +0 -1
  295. package/fesm2015/down-file.mjs +0 -141
  296. package/fesm2015/down-file.mjs.map +0 -1
  297. package/fesm2015/ellipsis.mjs +0 -258
  298. package/fesm2015/ellipsis.mjs.map +0 -1
  299. package/fesm2015/error-collect.mjs +0 -147
  300. package/fesm2015/error-collect.mjs.map +0 -1
  301. package/fesm2015/exception.mjs +0 -138
  302. package/fesm2015/exception.mjs.map +0 -1
  303. package/fesm2015/footer-toolbar.mjs +0 -70
  304. package/fesm2015/footer-toolbar.mjs.map +0 -1
  305. package/fesm2015/full-content.mjs +0 -202
  306. package/fesm2015/full-content.mjs.map +0 -1
  307. package/fesm2015/global-footer.mjs +0 -126
  308. package/fesm2015/global-footer.mjs.map +0 -1
  309. package/fesm2015/hotkey.mjs +0 -57
  310. package/fesm2015/let.mjs +0 -59
  311. package/fesm2015/let.mjs.map +0 -1
  312. package/fesm2015/loading.mjs +0 -142
  313. package/fesm2015/loading.mjs.map +0 -1
  314. package/fesm2015/lodop.mjs +0 -232
  315. package/fesm2015/lodop.mjs.map +0 -1
  316. package/fesm2015/media.mjs +0 -180
  317. package/fesm2015/media.mjs.map +0 -1
  318. package/fesm2015/notice-icon.mjs +0 -180
  319. package/fesm2015/notice-icon.mjs.map +0 -1
  320. package/fesm2015/onboarding.mjs +0 -336
  321. package/fesm2015/onboarding.mjs.map +0 -1
  322. package/fesm2015/page-header.mjs +0 -276
  323. package/fesm2015/pdf.mjs +0 -516
  324. package/fesm2015/pdf.mjs.map +0 -1
  325. package/fesm2015/qr.mjs.map +0 -1
  326. package/fesm2015/quick-menu.mjs +0 -114
  327. package/fesm2015/quick-menu.mjs.map +0 -1
  328. package/fesm2015/result.mjs +0 -88
  329. package/fesm2015/result.mjs.map +0 -1
  330. package/fesm2015/reuse-tab.mjs +0 -1217
  331. package/fesm2015/se.mjs +0 -444
  332. package/fesm2015/se.mjs.map +0 -1
  333. package/fesm2015/sg.mjs +0 -139
  334. package/fesm2015/sg.mjs.map +0 -1
  335. package/fesm2015/st.mjs +0 -2526
  336. package/fesm2015/st.mjs.map +0 -1
  337. package/fesm2015/sv.mjs +0 -308
  338. package/fesm2015/sv.mjs.map +0 -1
  339. package/fesm2015/tag-select.mjs +0 -91
  340. package/fesm2015/tag-select.mjs.map +0 -1
  341. package/fesm2015/xlsx.mjs +0 -172
  342. package/fesm2015/xlsx.mjs.map +0 -1
  343. package/fesm2015/zip.mjs +0 -136
  344. package/fesm2020/abc.mjs +0 -7
  345. package/fesm2020/abc.mjs.map +0 -1
  346. package/fesm2020/auto-focus.mjs +0 -71
  347. package/fesm2020/auto-focus.mjs.map +0 -1
  348. package/fesm2020/avatar-list.mjs.map +0 -1
  349. package/fesm2020/chart-observer-size.mjs.map +0 -1
  350. package/fesm2020/count-down.mjs.map +0 -1
  351. package/fesm2020/date-picker.mjs.map +0 -1
  352. package/fesm2020/down-file.mjs.map +0 -1
  353. package/fesm2020/ellipsis.mjs.map +0 -1
  354. package/fesm2020/error-collect.mjs.map +0 -1
  355. package/fesm2020/exception.mjs.map +0 -1
  356. package/fesm2020/footer-toolbar.mjs.map +0 -1
  357. package/fesm2020/full-content.mjs.map +0 -1
  358. package/fesm2020/global-footer.mjs.map +0 -1
  359. package/fesm2020/hotkey.mjs.map +0 -1
  360. package/fesm2020/let.mjs.map +0 -1
  361. package/fesm2020/loading.mjs.map +0 -1
  362. package/fesm2020/media.mjs.map +0 -1
  363. package/fesm2020/notice-icon.mjs +0 -180
  364. package/fesm2020/notice-icon.mjs.map +0 -1
  365. package/fesm2020/page-header.mjs.map +0 -1
  366. package/fesm2020/pdf.mjs.map +0 -1
  367. package/fesm2020/qr.mjs +0 -171
  368. package/fesm2020/quick-menu.mjs.map +0 -1
  369. package/fesm2020/reuse-tab.mjs.map +0 -1
  370. package/fesm2020/se.mjs.map +0 -1
  371. package/fesm2020/sg.mjs.map +0 -1
  372. package/fesm2020/st.mjs.map +0 -1
  373. package/fesm2020/sv.mjs.map +0 -1
  374. package/fesm2020/tag-select.mjs.map +0 -1
  375. package/fesm2020/xlsx.mjs.map +0 -1
  376. package/fesm2020/zip.mjs.map +0 -1
  377. /package/{esm2020 → esm2022}/abc.mjs +0 -0
  378. /package/{esm2020 → esm2022}/auto-focus/auto-focus.mjs +0 -0
  379. /package/{esm2020 → esm2022}/auto-focus/index.mjs +0 -0
  380. /package/{esm2020 → esm2022}/avatar-list/avatar-list.mjs +0 -0
  381. /package/{esm2020 → esm2022}/avatar-list/public_api.mjs +0 -0
  382. /package/{esm2020 → esm2022}/count-down/count-down.mjs +0 -0
  383. /package/{esm2020 → esm2022}/count-down/public_api.mjs +0 -0
  384. /package/{esm2020 → esm2022}/date-picker/date-picker.mjs +0 -0
  385. /package/{esm2020 → esm2022}/date-picker/public_api.mjs +0 -0
  386. /package/{esm2020 → esm2022}/down-file/down-file.mjs +0 -0
  387. /package/{esm2020 → esm2022}/down-file/public_api.mjs +0 -0
  388. /package/{esm2020 → esm2022}/ellipsis/ellipsis.mjs +0 -0
  389. /package/{esm2020 → esm2022}/ellipsis/public_api.mjs +0 -0
  390. /package/{esm2020 → esm2022}/error-collect/error-collect.mjs +0 -0
  391. /package/{esm2020 → esm2022}/error-collect/public_api.mjs +0 -0
  392. /package/{esm2020 → esm2022}/exception/exception.mjs +0 -0
  393. /package/{esm2020 → esm2022}/exception/public_api.mjs +0 -0
  394. /package/{esm2020 → esm2022}/footer-toolbar/footer-toolbar.mjs +0 -0
  395. /package/{esm2020 → esm2022}/footer-toolbar/public_api.mjs +0 -0
  396. /package/{esm2020 → esm2022}/full-content/full-content.mjs +0 -0
  397. /package/{esm2020 → esm2022}/full-content/public_api.mjs +0 -0
  398. /package/{esm2020 → esm2022}/global-footer/global-footer.mjs +0 -0
  399. /package/{esm2020 → esm2022}/global-footer/global-footer.types.mjs +0 -0
  400. /package/{esm2020 → esm2022}/global-footer/public_api.mjs +0 -0
  401. /package/{esm2020 → esm2022}/hotkey/hotkey.mjs +0 -0
  402. /package/{esm2020 → esm2022}/hotkey/public_api.mjs +0 -0
  403. /package/{esm2020 → esm2022}/let/index.mjs +0 -0
  404. /package/{esm2020 → esm2022}/let/let.mjs +0 -0
  405. /package/{esm2020 → esm2022}/loading/loading.mjs +0 -0
  406. /package/{esm2020 → esm2022}/loading/loading.types.mjs +0 -0
  407. /package/{esm2020 → esm2022}/loading/public_api.mjs +0 -0
  408. /package/{esm2020 → esm2022}/lodop/lodop.mjs +0 -0
  409. /package/{esm2020 → esm2022}/lodop/lodop.types.mjs +0 -0
  410. /package/{esm2020 → esm2022}/lodop/public_api.mjs +0 -0
  411. /package/{esm2020 → esm2022}/media/media.mjs +0 -0
  412. /package/{esm2020 → esm2022}/media/public_api.mjs +0 -0
  413. /package/{esm2020 → esm2022}/notice-icon/notice-icon.mjs +0 -0
  414. /package/{esm2020 → esm2022}/notice-icon/notice-icon.types.mjs +0 -0
  415. /package/{esm2020 → esm2022}/notice-icon/public_api.mjs +0 -0
  416. /package/{esm2020 → esm2022}/observers/chart-observer-size.mjs +0 -0
  417. /package/{esm2020 → esm2022}/observers/public-api.mjs +0 -0
  418. /package/{esm2020 → esm2022}/onboarding/onboarding.mjs +0 -0
  419. /package/{esm2020 → esm2022}/onboarding/onboarding.types.mjs +0 -0
  420. /package/{esm2020 → esm2022}/onboarding/public_api.mjs +0 -0
  421. /package/{esm2020 → esm2022}/page-header/page-header.mjs +0 -0
  422. /package/{esm2020 → esm2022}/page-header/public_api.mjs +0 -0
  423. /package/{esm2020 → esm2022}/pdf/pdf.mjs +0 -0
  424. /package/{esm2020 → esm2022}/pdf/pdf.types.mjs +0 -0
  425. /package/{esm2020 → esm2022}/pdf/public_api.mjs +0 -0
  426. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
  427. /package/{esm2020 → esm2022}/qr/public_api.mjs +0 -0
  428. /package/{esm2020 → esm2022}/qr/qr.config.mjs +0 -0
  429. /package/{esm2020 → esm2022}/qr/qr.mjs +0 -0
  430. /package/{esm2020 → esm2022}/qr/qr.types.mjs +0 -0
  431. /package/{esm2020 → esm2022}/quick-menu/public_api.mjs +0 -0
  432. /package/{esm2020 → esm2022}/quick-menu/quick-menu.mjs +0 -0
  433. /package/{esm2020 → esm2022}/result/public_api.mjs +0 -0
  434. /package/{esm2020 → esm2022}/result/result.mjs +0 -0
  435. /package/{esm2020 → esm2022}/reuse-tab/lifecycle_hooks.mjs +0 -0
  436. /package/{esm2020 → esm2022}/reuse-tab/public_api.mjs +0 -0
  437. /package/{esm2020 → esm2022}/reuse-tab/reuse-tab.interfaces.mjs +0 -0
  438. /package/{esm2020 → esm2022}/reuse-tab/reuse-tab.mjs +0 -0
  439. /package/{esm2020 → esm2022}/reuse-tab/reuse-tab.state.mjs +0 -0
  440. /package/{esm2020 → esm2022}/reuse-tab/reuse-tab.strategy.mjs +0 -0
  441. /package/{esm2020 → esm2022}/se/public_api.mjs +0 -0
  442. /package/{esm2020 → esm2022}/se/se.mjs +0 -0
  443. /package/{esm2020 → esm2022}/se/se.types.mjs +0 -0
  444. /package/{esm2020 → esm2022}/sg/public_api.mjs +0 -0
  445. /package/{esm2020 → esm2022}/sg/sg.mjs +0 -0
  446. /package/{esm2020 → esm2022}/st/public_api.mjs +0 -0
  447. /package/{esm2020 → esm2022}/st/st.config.mjs +0 -0
  448. /package/{esm2020 → esm2022}/st/st.interfaces.mjs +0 -0
  449. /package/{esm2020 → esm2022}/st/st.mjs +0 -0
  450. /package/{esm2020 → esm2022}/st/st.types.mjs +0 -0
  451. /package/{esm2020 → esm2022}/sv/public_api.mjs +0 -0
  452. /package/{esm2020 → esm2022}/sv/sv.mjs +0 -0
  453. /package/{esm2020 → esm2022}/tag-select/public_api.mjs +0 -0
  454. /package/{esm2020 → esm2022}/tag-select/tag-select.mjs +0 -0
  455. /package/{esm2020 → esm2022}/xlsx/public_api.mjs +0 -0
  456. /package/{esm2020 → esm2022}/xlsx/xlsx.mjs +0 -0
  457. /package/{esm2020 → esm2022}/xlsx/xlsx.types.mjs +0 -0
  458. /package/{esm2020 → esm2022}/zip/public_api.mjs +0 -0
  459. /package/{esm2020 → esm2022}/zip/zip.mjs +0 -0
  460. /package/{esm2020 → esm2022}/zip/zip.types.mjs +0 -0
  461. /package/{fesm2015 → fesm2022}/abc.mjs +0 -0
  462. /package/{fesm2015 → fesm2022}/abc.mjs.map +0 -0
@@ -1,1002 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { DecimalPipe, DOCUMENT } from '@angular/common';
3
- import { ChangeDetectionStrategy, Component, EventEmitter, Host, Inject, Input, Optional, Output, ViewChild, ViewEncapsulation } from '@angular/core';
4
- import { from, isObservable, of, Subject, filter, takeUntil } from 'rxjs';
5
- import { ALAIN_I18N_TOKEN, DatePipe, YNPipe } from '@delon/theme';
6
- import { InputBoolean, InputNumber, toBoolean } from '@delon/util/decorator';
7
- import { deepCopy, deepMergeKey } from '@delon/util/other';
8
- import { STColumnSource } from './st-column-source';
9
- import { STDataSource } from './st-data-source';
10
- import { STExport } from './st-export';
11
- import { STRowSource } from './st-row.directive';
12
- import { ST_DEFAULT_CONFIG } from './st.config';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "./st-export";
15
- import * as i2 from "./st-column-source";
16
- import * as i3 from "./st-data-source";
17
- import * as i4 from "@delon/theme";
18
- import * as i5 from "@delon/util/config";
19
- import * as i6 from "ng-zorro-antd/dropdown";
20
- import * as i7 from "@angular/common";
21
- import * as i8 from "@angular/forms";
22
- import * as i9 from "@delon/abc/let";
23
- import * as i10 from "ng-zorro-antd/table";
24
- import * as i11 from "ng-zorro-antd/icon";
25
- import * as i12 from "ng-zorro-antd/checkbox";
26
- import * as i13 from "ng-zorro-antd/menu";
27
- import * as i14 from "ng-zorro-antd/tooltip";
28
- import * as i15 from "ng-zorro-antd/resizable";
29
- import * as i16 from "./st-filter.component";
30
- import * as i17 from "@angular/router";
31
- import * as i18 from "ng-zorro-antd/popconfirm";
32
- import * as i19 from "ng-zorro-antd/badge";
33
- import * as i20 from "ng-zorro-antd/divider";
34
- import * as i21 from "ng-zorro-antd/radio";
35
- import * as i22 from "ng-zorro-antd/tag";
36
- import * as i23 from "./st-widget-host.directive";
37
- export class STComponent {
38
- get req() {
39
- return this._req;
40
- }
41
- set req(value) {
42
- this._req = deepMergeKey({}, true, this.cog.req, value);
43
- }
44
- /** 返回体配置 */
45
- get res() {
46
- return this._res;
47
- }
48
- set res(value) {
49
- const item = (this._res = deepMergeKey({}, true, this.cog.res, value));
50
- const reName = item.reName;
51
- if (typeof reName !== 'function') {
52
- if (!Array.isArray(reName.list))
53
- reName.list = reName.list.split('.');
54
- if (!Array.isArray(reName.total))
55
- reName.total = reName.total.split('.');
56
- }
57
- this._res = item;
58
- }
59
- get page() {
60
- return this._page;
61
- }
62
- set page(value) {
63
- this._page = { ...this.cog.page, ...value };
64
- this.updateTotalTpl();
65
- }
66
- get multiSort() {
67
- return this._multiSort;
68
- }
69
- set multiSort(value) {
70
- if ((typeof value === 'boolean' && !toBoolean(value)) ||
71
- (typeof value === 'object' && Object.keys(value).length === 0)) {
72
- this._multiSort = undefined;
73
- return;
74
- }
75
- this._multiSort = {
76
- ...(typeof value === 'object' ? value : {})
77
- };
78
- }
79
- set widthMode(value) {
80
- this._widthMode = { ...this.cog.widthMode, ...value };
81
- }
82
- get widthMode() {
83
- return this._widthMode;
84
- }
85
- set widthConfig(val) {
86
- this._widthConfig = val;
87
- this.customWidthConfig = val && val.length > 0;
88
- }
89
- set resizable(val) {
90
- this._resizable = typeof val === 'object' ? val : { disabled: !toBoolean(val) };
91
- }
92
- /**
93
- * Get the number of the current page
94
- */
95
- get count() {
96
- return this._data.length;
97
- }
98
- /**
99
- * Get the data of the current page
100
- */
101
- get list() {
102
- return this._data;
103
- }
104
- get noColumns() {
105
- return this.columns == null;
106
- }
107
- constructor(i18nSrv, cdr, el, exportSrv, doc, columnSource, dataSource, delonI18n, configSrv, cms) {
108
- this.cdr = cdr;
109
- this.el = el;
110
- this.exportSrv = exportSrv;
111
- this.doc = doc;
112
- this.columnSource = columnSource;
113
- this.dataSource = dataSource;
114
- this.delonI18n = delonI18n;
115
- this.cms = cms;
116
- this.destroy$ = new Subject();
117
- this.totalTpl = ``;
118
- this.customWidthConfig = false;
119
- this._widthConfig = [];
120
- this.locale = {};
121
- this._loading = false;
122
- this._data = [];
123
- this._statistical = {};
124
- this._isPagination = true;
125
- this._allChecked = false;
126
- this._allCheckedDisabled = false;
127
- this._indeterminate = false;
128
- this._headers = [];
129
- this._columns = [];
130
- this.contextmenuList = [];
131
- this.ps = 10;
132
- this.pi = 1;
133
- this.total = 0;
134
- this.loading = null;
135
- this.loadingDelay = 0;
136
- this.loadingIndicator = null;
137
- this.bordered = false;
138
- this.scroll = { x: null, y: null };
139
- this.showHeader = true;
140
- this.expandRowByClick = false;
141
- this.expandAccordion = false;
142
- this.expand = null;
143
- this.responsive = true;
144
- this.error = new EventEmitter();
145
- this.change = new EventEmitter();
146
- this.virtualScroll = false;
147
- this.virtualItemSize = 54;
148
- this.virtualMaxBufferPx = 200;
149
- this.virtualMinBufferPx = 100;
150
- this.virtualForTrackBy = index => index;
151
- this.delonI18n.change.pipe(takeUntil(this.destroy$)).subscribe(() => {
152
- this.locale = this.delonI18n.getData('st');
153
- if (this._columns.length > 0) {
154
- this.updateTotalTpl();
155
- this.cd();
156
- }
157
- });
158
- i18nSrv.change
159
- .pipe(takeUntil(this.destroy$), filter(() => this._columns.length > 0))
160
- .subscribe(() => this.refreshColumns());
161
- this.setCog(configSrv.merge('st', ST_DEFAULT_CONFIG));
162
- }
163
- setCog(cog) {
164
- const copyMultiSort = { ...cog.multiSort };
165
- // Because multiSort.global will affect the result, it should be removed first, and multiSort will be operated again after processing.
166
- delete cog.multiSort;
167
- this.cog = cog;
168
- Object.assign(this, cog);
169
- if (copyMultiSort.global !== false) {
170
- this.multiSort = copyMultiSort;
171
- }
172
- this.columnSource.setCog(cog);
173
- this.dataSource.setCog(cog);
174
- }
175
- cd() {
176
- this.cdr.detectChanges();
177
- return this;
178
- }
179
- refreshData() {
180
- this._data = [...this._data];
181
- return this.cd();
182
- }
183
- renderTotal(total, range) {
184
- return this.totalTpl
185
- ? this.totalTpl.replace('{{total}}', total).replace('{{range[0]}}', range[0]).replace('{{range[1]}}', range[1])
186
- : '';
187
- }
188
- changeEmit(type, data) {
189
- const res = {
190
- type,
191
- pi: this.pi,
192
- ps: this.ps,
193
- total: this.total
194
- };
195
- if (data != null) {
196
- res[type] = data;
197
- }
198
- this.change.emit(res);
199
- }
200
- // #region data
201
- /**
202
- * 获取过滤后所有数据
203
- * - 本地数据:包含排序、过滤后不分页数据
204
- * - 远程数据:不传递 `pi`、`ps` 两个参数
205
- */
206
- get filteredData() {
207
- return this.loadData({ paginator: false }).then(res => res.list);
208
- }
209
- updateTotalTpl() {
210
- const { total } = this.page;
211
- if (typeof total === 'string' && total.length) {
212
- this.totalTpl = total;
213
- }
214
- else if (toBoolean(total)) {
215
- this.totalTpl = this.locale.total;
216
- }
217
- else {
218
- this.totalTpl = '';
219
- }
220
- }
221
- setLoading(val) {
222
- if (this.loading == null) {
223
- this._loading = val;
224
- this.cdr.detectChanges();
225
- }
226
- }
227
- loadData(options) {
228
- const { pi, ps, data, req, res, page, total, singleSort, multiSort, rowClassName } = this;
229
- return new Promise((resolvePromise, rejectPromise) => {
230
- if (this.data$) {
231
- this.data$.unsubscribe();
232
- }
233
- this.data$ = this.dataSource
234
- .process({
235
- pi,
236
- ps,
237
- total,
238
- data,
239
- req,
240
- res,
241
- page,
242
- columns: this._columns,
243
- singleSort,
244
- multiSort,
245
- rowClassName,
246
- paginator: true,
247
- customRequest: this.customRequest || this.cog.customRequest,
248
- ...options
249
- })
250
- .pipe(takeUntil(this.destroy$))
251
- .subscribe({
252
- next: result => resolvePromise(result),
253
- error: error => {
254
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
255
- console.warn('st.loadDate', error);
256
- }
257
- rejectPromise(error);
258
- }
259
- });
260
- });
261
- }
262
- async loadPageData() {
263
- this.setLoading(true);
264
- try {
265
- const result = await this.loadData();
266
- this.setLoading(false);
267
- const undefinedString = 'undefined';
268
- if (typeof result.pi !== undefinedString) {
269
- this.pi = result.pi;
270
- }
271
- if (typeof result.ps !== undefinedString) {
272
- this.ps = result.ps;
273
- }
274
- if (typeof result.total !== undefinedString) {
275
- this.total = result.total;
276
- }
277
- if (typeof result.pageShow !== undefinedString) {
278
- this._isPagination = result.pageShow;
279
- }
280
- this._data = result.list;
281
- this._statistical = result.statistical;
282
- this.changeEmit('loaded', result.list);
283
- // Should be re-render in next tike when using virtual scroll
284
- // https://github.com/ng-alain/ng-alain/issues/1836
285
- if (this.cdkVirtualScrollViewport) {
286
- Promise.resolve().then(() => this.cdkVirtualScrollViewport.checkViewportSize());
287
- }
288
- return this._refCheck();
289
- }
290
- catch (error) {
291
- this.setLoading(false);
292
- if (!this.destroy$.closed) {
293
- this.cdr.detectChanges();
294
- this.error.emit({ type: 'req', error });
295
- }
296
- return this;
297
- }
298
- }
299
- /** 清空所有数据 */
300
- clear(cleanStatus = true) {
301
- if (cleanStatus) {
302
- this.clearStatus();
303
- }
304
- this._data = [];
305
- return this.cd();
306
- }
307
- /** 清空所有状态 */
308
- clearStatus() {
309
- return this.clearCheck().clearRadio().clearFilter().clearSort();
310
- }
311
- /**
312
- * 根据页码重新加载数据
313
- *
314
- * @param pi 指定当前页码,默认:`1`
315
- * @param extraParams 重新指定 `extraParams` 值
316
- * @param options 选项
317
- */
318
- load(pi = 1, extraParams, options) {
319
- if (pi !== -1)
320
- this.pi = pi;
321
- if (typeof extraParams !== 'undefined') {
322
- this.req.params = options && options.merge ? { ...this.req.params, ...extraParams } : extraParams;
323
- }
324
- this._change('pi', options);
325
- return this;
326
- }
327
- /**
328
- * 重新刷新当前页
329
- *
330
- * @param extraParams 重新指定 `extraParams` 值
331
- */
332
- reload(extraParams, options) {
333
- return this.load(-1, extraParams, options);
334
- }
335
- /**
336
- * 重置且重新设置 `pi` 为 `1`,包含以下值:
337
- * - `check` 数据
338
- * - `radio` 数据
339
- * - `sort` 数据
340
- * - `fileter` 数据
341
- *
342
- * @param extraParams 重新指定 `extraParams` 值
343
- */
344
- reset(extraParams, options) {
345
- this.clearStatus().load(1, extraParams, options);
346
- return this;
347
- }
348
- _toTop(enforce) {
349
- if (!(enforce == null ? this.page.toTop : enforce))
350
- return;
351
- const el = this.el.nativeElement;
352
- el.scrollIntoView();
353
- // fix header height
354
- this.doc.documentElement.scrollTop -= this.page.toTopOffset;
355
- if (this.scroll) {
356
- if (this.cdkVirtualScrollViewport) {
357
- this.cdkVirtualScrollViewport.scrollTo({
358
- top: 0,
359
- left: 0
360
- });
361
- }
362
- else {
363
- el.querySelector('.ant-table-body, .ant-table-content')?.scrollTo(0, 0);
364
- }
365
- }
366
- }
367
- _change(type, options) {
368
- if (type === 'pi' || (type === 'ps' && this.pi <= Math.ceil(this.total / this.ps))) {
369
- this.loadPageData().then(() => this._toTop(options?.toTop));
370
- }
371
- this.changeEmit(type);
372
- }
373
- closeOtherExpand(item) {
374
- if (this.expandAccordion === false)
375
- return;
376
- this._data.filter(i => i !== item).forEach(i => (i.expand = false));
377
- }
378
- _rowClick(e, item, index, dbl) {
379
- const el = e.target;
380
- if (el.nodeName === 'INPUT')
381
- return;
382
- const { expand, expandRowByClick } = this;
383
- if (!!expand && item.showExpand !== false && expandRowByClick) {
384
- item.expand = !item.expand;
385
- this.closeOtherExpand(item);
386
- this.changeEmit('expand', item);
387
- return;
388
- }
389
- const data = { e, item, index };
390
- if (dbl) {
391
- this.changeEmit('dblClick', data);
392
- }
393
- else {
394
- this._clickRowClassName(el, item, index);
395
- this.changeEmit('click', data);
396
- }
397
- }
398
- _clickRowClassName(el, item, index) {
399
- const cr = this.clickRowClassName;
400
- if (cr == null)
401
- return;
402
- const config = {
403
- exclusive: false,
404
- ...(typeof cr === 'string' ? { fn: () => cr } : cr)
405
- };
406
- const className = config.fn(item, index);
407
- const trEl = el.closest('tr');
408
- if (config.exclusive) {
409
- trEl.parentElement.querySelectorAll('tr').forEach((a) => a.classList.remove(className));
410
- }
411
- if (trEl.classList.contains(className)) {
412
- trEl.classList.remove(className);
413
- }
414
- else {
415
- trEl.classList.add(className);
416
- }
417
- }
418
- _expandChange(item, expand) {
419
- item.expand = expand;
420
- this.closeOtherExpand(item);
421
- this.changeEmit('expand', item);
422
- }
423
- _stopPropagation(ev) {
424
- ev.stopPropagation();
425
- }
426
- _refColAndData() {
427
- this._columns
428
- .filter(w => w.type === 'no')
429
- .forEach(c => this._data.forEach((i, idx) => {
430
- const text = `${this.dataSource.getNoIndex(i, c, idx)}`;
431
- i._values[c.__point] = { text, _text: text, org: idx, safeType: 'text' };
432
- }));
433
- return this.refreshData();
434
- }
435
- /**
436
- * Add a rows in the table, like this:
437
- *
438
- * ```
439
- * this.st.addRow(stDataItem)
440
- * ```
441
- *
442
- * **TIPS:** Don't change the `total` value, it is recommended to use the `reload` method if needed
443
- */
444
- addRow(data, options) {
445
- if (!Array.isArray(data))
446
- data = [data];
447
- this._data.splice(options?.index ?? 0, 0, ...data);
448
- return this.optimizeData()._refColAndData();
449
- }
450
- /**
451
- * Remove a row in the table, like this:
452
- *
453
- * ```
454
- * this.st.removeRow(0)
455
- * this.st.removeRow(stDataItem)
456
- * ```
457
- *
458
- * **TIPS:** Don't change the `total` value, it is recommended to use the `reload` method if needed
459
- */
460
- removeRow(data) {
461
- if (typeof data === 'number') {
462
- this._data.splice(data, 1);
463
- }
464
- else {
465
- if (!Array.isArray(data)) {
466
- data = [data];
467
- }
468
- const curData = this._data;
469
- for (var i = curData.length; i--;) {
470
- if (data.indexOf(curData[i]) !== -1) {
471
- curData.splice(i, 1);
472
- }
473
- }
474
- }
475
- return this._refCheck()._refColAndData();
476
- }
477
- /**
478
- * Sets the row value for the `index` in the table, like this:
479
- *
480
- * - `optinos.refreshSchema` Whether to refresh of st schemas
481
- * - `optinos.emitReload` Whether to trigger a reload http request when data is url
482
- *
483
- * ```
484
- * this.st.setRow(0, { price: 100 })
485
- * this.st.setRow(0, { price: 100, name: 'asdf' })
486
- * this.st.setRow(item, { price: 100 })
487
- * ```
488
- */
489
- setRow(index, item, options) {
490
- options = { refreshSchema: false, emitReload: false, ...options };
491
- if (typeof index !== 'number') {
492
- index = this._data.indexOf(index);
493
- }
494
- this._data[index] = deepMergeKey(this._data[index], false, item);
495
- this.optimizeData();
496
- if (options.refreshSchema) {
497
- this.resetColumns({ emitReload: options.emitReload });
498
- return this;
499
- }
500
- return this.refreshData();
501
- }
502
- // #endregion
503
- // #region sort
504
- sort(col, idx, value) {
505
- if (this.multiSort) {
506
- col._sort.default = value;
507
- col._sort.tick = this.dataSource.nextSortTick;
508
- }
509
- else {
510
- this._columns.forEach((item, index) => (item._sort.default = index === idx ? value : null));
511
- }
512
- this.cdr.detectChanges();
513
- this.loadPageData();
514
- const res = {
515
- value,
516
- map: this.dataSource.getReqSortMap(this.singleSort, this.multiSort, this._columns),
517
- column: col
518
- };
519
- this.changeEmit('sort', res);
520
- }
521
- clearSort() {
522
- this._columns.forEach(item => (item._sort.default = null));
523
- return this;
524
- }
525
- // #endregion
526
- // #region filter
527
- _handleFilter(col, confirm) {
528
- if (!confirm) {
529
- this.columnSource.cleanFilter(col);
530
- }
531
- // 过滤表示一种数据的变化应重置页码为 `1`
532
- this.pi = 1;
533
- this.columnSource.updateDefault(col.filter);
534
- this.loadPageData();
535
- this.changeEmit('filter', col);
536
- }
537
- handleFilterNotify(value) {
538
- this.changeEmit('filterChange', value);
539
- }
540
- clearFilter() {
541
- this._columns.filter(w => w.filter && w.filter.default === true).forEach(col => this.columnSource.cleanFilter(col));
542
- return this;
543
- }
544
- // #endregion
545
- // #region checkbox
546
- /** 清除所有 `checkbox` */
547
- clearCheck() {
548
- return this.checkAll(false);
549
- }
550
- _refCheck() {
551
- const validData = this._data.filter(w => !w.disabled);
552
- const checkedList = validData.filter(w => w.checked === true);
553
- this._allChecked = checkedList.length > 0 && checkedList.length === validData.length;
554
- const allUnChecked = validData.every(value => !value.checked);
555
- this._indeterminate = !this._allChecked && !allUnChecked;
556
- this._allCheckedDisabled = this._data.length === this._data.filter(w => w.disabled).length;
557
- return this.cd();
558
- }
559
- checkAll(checked) {
560
- checked = typeof checked === 'undefined' ? this._allChecked : checked;
561
- this._data.filter(w => !w.disabled).forEach(i => (i.checked = checked));
562
- return this._refCheck()._checkNotify().refreshData();
563
- }
564
- _rowSelection(row) {
565
- row.select(this._data);
566
- return this._refCheck()._checkNotify();
567
- }
568
- _checkNotify() {
569
- const res = this._data.filter(w => !w.disabled && w.checked === true);
570
- this.changeEmit('checkbox', res);
571
- return this;
572
- }
573
- // #endregion
574
- // #region radio
575
- /** 清除所有 `radio` */
576
- clearRadio() {
577
- this._data.filter(w => w.checked).forEach(item => (item.checked = false));
578
- this.changeEmit('radio', null);
579
- return this.refreshData();
580
- }
581
- // #endregion
582
- _handleTd(ev) {
583
- switch (ev.type) {
584
- case 'checkbox':
585
- this._refCheck()._checkNotify();
586
- break;
587
- case 'radio':
588
- this.changeEmit('radio', ev.item);
589
- this.refreshData();
590
- break;
591
- }
592
- }
593
- // #region export
594
- /**
595
- * 导出当前页,确保已经注册 `XlsxModule`
596
- *
597
- * @param newData 重新指定数据;若为 `true` 表示使用 `filteredData` 数据
598
- * @param opt 额外参数
599
- */
600
- export(newData, opt) {
601
- const data = Array.isArray(newData)
602
- ? this.dataSource.optimizeData({ columns: this._columns, result: newData })
603
- : this._data;
604
- (newData === true ? from(this.filteredData) : of(data)).subscribe((res) => this.exportSrv.export({
605
- columens: this._columns,
606
- ...opt,
607
- data: res
608
- }));
609
- }
610
- // #endregion
611
- // #region resizable
612
- colResize({ width }, column) {
613
- column.width = `${width}px`;
614
- this.changeEmit('resize', column);
615
- }
616
- // #endregion
617
- // #region contextmenu
618
- onContextmenu(event) {
619
- if (!this.contextmenu) {
620
- return;
621
- }
622
- event.preventDefault();
623
- event.stopPropagation();
624
- const colEl = event.target.closest('[data-col-index]');
625
- if (!colEl) {
626
- return;
627
- }
628
- const colIndex = Number(colEl.dataset.colIndex);
629
- const rowIndex = Number(colEl.closest('tr').dataset.index);
630
- const isTitle = isNaN(rowIndex);
631
- const obs$ = this.contextmenu({
632
- event,
633
- type: isTitle ? 'head' : 'body',
634
- rowIndex: isTitle ? null : rowIndex,
635
- colIndex,
636
- data: isTitle ? null : this.list[rowIndex],
637
- column: this._columns[colIndex]
638
- });
639
- (isObservable(obs$) ? obs$ : of(obs$))
640
- .pipe(takeUntil(this.destroy$), filter(res => res.length > 0))
641
- .subscribe(res => {
642
- this.contextmenuList = res.map(i => {
643
- if (!Array.isArray(i.children)) {
644
- i.children = [];
645
- }
646
- return i;
647
- });
648
- this.cdr.detectChanges();
649
- this.cms.create(event, this.contextmenuTpl);
650
- });
651
- }
652
- // #endregion
653
- get cdkVirtualScrollViewport() {
654
- return this.orgTable.cdkVirtualScrollViewport;
655
- }
656
- resetColumns(options) {
657
- options = { emitReload: true, preClearData: false, ...options };
658
- if (typeof options.columns !== 'undefined') {
659
- this.columns = options.columns;
660
- }
661
- if (typeof options.pi !== 'undefined') {
662
- this.pi = options.pi;
663
- }
664
- if (typeof options.ps !== 'undefined') {
665
- this.ps = options.ps;
666
- }
667
- if (options.emitReload) {
668
- // Should clean data, Because of changing columns may cause inaccurate data
669
- options.preClearData = true;
670
- }
671
- if (options.preClearData) {
672
- this._data = [];
673
- }
674
- this.refreshColumns();
675
- if (options.emitReload) {
676
- return this.loadPageData();
677
- }
678
- else {
679
- this.cd();
680
- return Promise.resolve(this);
681
- }
682
- }
683
- refreshColumns() {
684
- const res = this.columnSource.process(this.columns, {
685
- widthMode: this.widthMode,
686
- resizable: this._resizable,
687
- safeType: this.cog.safeType
688
- });
689
- this._columns = res.columns;
690
- this._headers = res.headers;
691
- if (this.customWidthConfig === false && res.headerWidths != null) {
692
- this._widthConfig = res.headerWidths;
693
- }
694
- return this;
695
- }
696
- optimizeData() {
697
- this._data = this.dataSource.optimizeData({
698
- columns: this._columns,
699
- result: this._data,
700
- rowClassName: this.rowClassName
701
- });
702
- return this;
703
- }
704
- /**
705
- * Return pure data, `st` internally maintains a set of data for caching, this part of data may affect the backend
706
- *
707
- * 返回纯净数据,`st` 内部会维护一组用于缓存的数据,这部分数据可能会影响后端
708
- */
709
- pureItem(itemOrIndex) {
710
- if (typeof itemOrIndex === 'number') {
711
- itemOrIndex = this._data[itemOrIndex];
712
- }
713
- if (!itemOrIndex) {
714
- return null;
715
- }
716
- const copyItem = deepCopy(itemOrIndex);
717
- ['_values', '_rowClassName'].forEach(key => delete copyItem[key]);
718
- return copyItem;
719
- }
720
- ngAfterViewInit() {
721
- this.columnSource.restoreAllRender(this._columns);
722
- }
723
- ngOnChanges(changes) {
724
- if (changes.columns) {
725
- this.refreshColumns().optimizeData();
726
- }
727
- const changeData = changes.data;
728
- if (changeData && changeData.currentValue && !(this.req.lazyLoad && changeData.firstChange)) {
729
- this.loadPageData();
730
- }
731
- if (changes.loading) {
732
- this._loading = changes.loading.currentValue;
733
- }
734
- }
735
- ngOnDestroy() {
736
- this.destroy$.next();
737
- this.destroy$.complete();
738
- }
739
- }
740
- STComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: STComponent, deps: [{ token: ALAIN_I18N_TOKEN, optional: true }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.STExport }, { token: DOCUMENT }, { token: i2.STColumnSource }, { token: i3.STDataSource }, { token: i4.DelonLocaleService }, { token: i5.AlainConfigService }, { token: i6.NzContextMenuService }], target: i0.ɵɵFactoryTarget.Component });
741
- STComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: STComponent, selector: "st", inputs: { req: "req", res: "res", page: "page", data: "data", columns: "columns", contextmenu: "contextmenu", ps: "ps", pi: "pi", total: "total", loading: "loading", loadingDelay: "loadingDelay", loadingIndicator: "loadingIndicator", bordered: "bordered", size: "size", scroll: "scroll", singleSort: "singleSort", multiSort: "multiSort", rowClassName: "rowClassName", clickRowClassName: "clickRowClassName", widthMode: "widthMode", widthConfig: "widthConfig", resizable: "resizable", header: "header", showHeader: "showHeader", footer: "footer", bodyHeader: "bodyHeader", body: "body", expandRowByClick: "expandRowByClick", expandAccordion: "expandAccordion", expand: "expand", noResult: "noResult", responsive: "responsive", responsiveHideHeaderFooter: "responsiveHideHeaderFooter", virtualScroll: "virtualScroll", virtualItemSize: "virtualItemSize", virtualMaxBufferPx: "virtualMaxBufferPx", virtualMinBufferPx: "virtualMinBufferPx", customRequest: "customRequest", virtualForTrackBy: "virtualForTrackBy" }, outputs: { error: "error", change: "change" }, host: { properties: { "class.st": "true", "class.st__p-left": "page.placement === 'left'", "class.st__p-center": "page.placement === 'center'", "class.st__width-strict": "widthMode.type === 'strict'", "class.st__row-class": "rowClassName", "class.ant-table-rep": "responsive", "class.ant-table-rep__hide-header-footer": "responsiveHideHeaderFooter" } }, providers: [STDataSource, STRowSource, STColumnSource, STExport, DatePipe, YNPipe, DecimalPipe], viewQueries: [{ propertyName: "orgTable", first: true, predicate: ["table"], descendants: true }, { propertyName: "contextmenuTpl", first: true, predicate: ["contextmenuTpl"], descendants: true }], exportAs: ["st"], usesOnChanges: true, ngImport: i0, template: "<ng-template #titleTpl let-i>\n <span [innerHTML]=\"i._text\"></span>\n <small *ngIf=\"i.optional\" class=\"st__head-optional\" [innerHTML]=\"i.optional\"></small>\n <i\n *ngIf=\"i.optionalHelp\"\n class=\"st__head-tip\"\n nz-tooltip\n [nzTooltipTitle]=\"i.optionalHelp\"\n nz-icon\n nzType=\"question-circle\"\n ></i>\n</ng-template>\n<ng-template #chkAllTpl let-custom>\n <label\n nz-checkbox\n class=\"st__checkall\"\n [nzDisabled]=\"_allCheckedDisabled\"\n [(ngModel)]=\"_allChecked\"\n [nzIndeterminate]=\"_indeterminate\"\n (ngModelChange)=\"checkAll()\"\n [class.ant-table-selection-select-all-custom]=\"custom\"\n ></label>\n</ng-template>\n<nz-table\n #table\n [nzData]=\"_data\"\n [(nzPageIndex)]=\"pi\"\n (nzPageIndexChange)=\"_change('pi')\"\n [(nzPageSize)]=\"ps\"\n (nzPageSizeChange)=\"_change('ps')\"\n [nzTotal]=\"total\"\n [nzShowPagination]=\"_isPagination\"\n [nzFrontPagination]=\"false\"\n [nzBordered]=\"bordered\"\n [nzSize]=\"size\"\n [nzLoading]=\"noColumns || _loading\"\n [nzLoadingDelay]=\"loadingDelay\"\n [nzLoadingIndicator]=\"loadingIndicator\"\n [nzTitle]=\"header!\"\n [nzFooter]=\"footer!\"\n [nzScroll]=\"scroll\"\n [nzVirtualItemSize]=\"virtualItemSize\"\n [nzVirtualMaxBufferPx]=\"virtualMaxBufferPx\"\n [nzVirtualMinBufferPx]=\"virtualMinBufferPx\"\n [nzVirtualForTrackBy]=\"virtualForTrackBy\"\n [nzNoResult]=\"noResult!\"\n [nzPageSizeOptions]=\"page.pageSizes!\"\n [nzShowQuickJumper]=\"page.showQuickJumper\"\n [nzShowSizeChanger]=\"page.showSize\"\n [nzPaginationPosition]=\"page.position!\"\n [nzPaginationType]=\"page.type!\"\n [nzItemRender]=\"page.itemRender!\"\n [nzSimple]=\"page.simple\"\n [nzShowTotal]=\"totalTpl\"\n [nzWidthConfig]=\"_widthConfig\"\n (contextmenu)=\"onContextmenu($event)\"\n [class.st__no-column]=\"noColumns\"\n>\n <thead *ngIf=\"showHeader\">\n <tr *ngFor=\"let row of _headers; let rowFirst = first\">\n <th *ngIf=\"rowFirst && expand\" nzWidth=\"50px\" [rowSpan]=\"_headers.length\"></th>\n <ng-container *ngFor=\"let h of row; let index = index; let last = last\">\n <th\n *let=\"h.column as _c\"\n [colSpan]=\"h.colSpan\"\n [rowSpan]=\"h.rowSpan\"\n [nzWidth]=\"$any(_c).width\"\n [nzLeft]=\"_c._left!\"\n [nzRight]=\"_c._right!\"\n [ngClass]=\"_c._className\"\n [attr.data-col]=\"_c.indexKey\"\n [attr.data-col-index]=\"index\"\n [nzShowSort]=\"_c._sort.enabled\"\n [nzSortOrder]=\"$any(_c)._sort.default\"\n (nzSortOrderChange)=\"sort(_c, index, $event)\"\n [nzCustomFilter]=\"!!_c.filter\"\n [class.st__has-filter]=\"_c.filter\"\n nz-resizable\n [nzDisabled]=\"last || $any(_c).resizable.disabled\"\n [nzMaxWidth]=\"$any(_c).resizable.maxWidth\"\n [nzMinWidth]=\"$any(_c).resizable.minWidth\"\n [nzBounds]=\"$any(_c).resizable.bounds\"\n [nzPreview]=\"$any(_c).resizable.preview\"\n (nzResizeEnd)=\"colResize($event, _c)\"\n >\n <nz-resize-handle *ngIf=\"$any(!last && !$any(_c).resizable.disabled)\" nzDirection=\"right\">\n <i></i>\n </nz-resize-handle>\n <ng-template\n #renderTitle\n [ngTemplateOutlet]=\"_c.__renderTitle!\"\n [ngTemplateOutletContext]=\"{ $implicit: h.column, index: index }\"\n ></ng-template>\n <ng-container *ngIf=\"!_c.__renderTitle; else renderTitle\">\n <ng-container [ngSwitch]=\"_c.type\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <ng-container *ngIf=\"_c.selections!.length === 0\">\n <ng-template [ngTemplateOutlet]=\"chkAllTpl\" [ngTemplateOutletContext]=\"{ $implicit: false }\">\n </ng-template>\n </ng-container>\n <div *ngIf=\"_c.selections!.length > 0\" class=\"ant-table-selection\">\n <ng-template [ngTemplateOutlet]=\"chkAllTpl\" [ngTemplateOutletContext]=\"{ $implicit: true }\">\n </ng-template>\n <div *ngIf=\"_c.selections!.length\" class=\"ant-table-selection-extra\">\n <div\n nz-dropdown\n nzPlacement=\"bottomLeft\"\n [nzDropdownMenu]=\"selectionMenu\"\n class=\"ant-table-selection-down st__checkall-selection\"\n >\n <i nz-icon nzType=\"down\"></i>\n </div>\n </div>\n <nz-dropdown-menu #selectionMenu=\"nzDropdownMenu\">\n <ul nz-menu class=\"ant-table-selection-menu\">\n <li\n nz-menu-item\n *ngFor=\"let rw of _c.selections\"\n (click)=\"_rowSelection(rw)\"\n [innerHTML]=\"rw.text\"\n ></li>\n </ul>\n </nz-dropdown-menu>\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-template\n [ngTemplateOutlet]=\"titleTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: _c.title }\"\n ></ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"_c.filter\">\n <st-filter\n nz-th-extra\n [col]=\"h.column\"\n [f]=\"_c.filter\"\n [locale]=\"locale\"\n (n)=\"handleFilterNotify($event)\"\n (handle)=\"_handleFilter(_c, $event)\"\n ></st-filter>\n </ng-container>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody class=\"st__body\">\n <ng-container *ngIf=\"!_loading\">\n <ng-template\n [ngTemplateOutlet]=\"bodyHeader!\"\n [ngTemplateOutletContext]=\"{ $implicit: _statistical }\"\n ></ng-template>\n </ng-container>\n <ng-template #bodyTpl let-i let-index=\"index\">\n <tr\n [attr.data-index]=\"index\"\n (click)=\"_rowClick($event, i, index, false)\"\n (dblclick)=\"_rowClick($event, i, index, true)\"\n [ngClass]=\"i._rowClassName\"\n >\n <td\n *ngIf=\"expand\"\n [nzShowExpand]=\"expand && i.showExpand !== false\"\n [nzExpand]=\"i.expand\"\n (nzExpandChange)=\"_expandChange(i, $event)\"\n (click)=\"_stopPropagation($event)\"\n nzWidth=\"50px\"\n ></td>\n <td\n *ngFor=\"let c of _columns; let cIdx = index\"\n [nzLeft]=\"!!c._left\"\n [nzRight]=\"!!c._right\"\n [attr.data-col-index]=\"cIdx\"\n [ngClass]=\"c._className\"\n [attr.colspan]=\"c.colSpan\"\n >\n <span *ngIf=\"responsive\" class=\"ant-table-rep__title\">\n <ng-template [ngTemplateOutlet]=\"titleTpl\" [ngTemplateOutletContext]=\"{ $implicit: c.title }\"></ng-template>\n </span>\n <st-td [data]=\"_data\" [i]=\"i\" [index]=\"index\" [c]=\"c\" [cIdx]=\"cIdx\" (n)=\"_handleTd($event)\"></st-td>\n </td>\n </tr>\n <tr [nzExpand]=\"i.expand\">\n <ng-template\n [ngTemplateOutlet]=\"expand\"\n [ngTemplateOutletContext]=\"{ $implicit: i, index: index }\"\n ></ng-template>\n </tr>\n </ng-template>\n <ng-container *ngIf=\"!virtualScroll\">\n <ng-container *ngFor=\"let i of _data; let index = index\">\n <ng-template [ngTemplateOutlet]=\"bodyTpl\" [ngTemplateOutletContext]=\"{ $implicit: i, index: index }\">\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"virtualScroll\">\n <ng-template nz-virtual-scroll let-i let-index=\"index\">\n <ng-template [ngTemplateOutlet]=\"bodyTpl\" [ngTemplateOutletContext]=\"{ $implicit: i, index: index }\">\n </ng-template>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!_loading\">\n <ng-template [ngTemplateOutlet]=\"body!\" [ngTemplateOutletContext]=\"{ $implicit: _statistical }\"></ng-template>\n </ng-container>\n </tbody>\n <ng-template #totalTpl let-range=\"range\" let-total>{{ renderTotal(total, range) }}</ng-template>\n</nz-table>\n<nz-dropdown-menu #contextmenuTpl=\"nzDropdownMenu\">\n <ul nz-menu class=\"st__contextmenu\">\n <ng-container *ngFor=\"let i of contextmenuList\">\n <li nz-menu-item *ngIf=\"i.children!.length === 0\" (click)=\"i.fn!(i)\" [innerHTML]=\"i.text\"></li>\n <li nz-submenu *ngIf=\"i.children!.length > 0\" [nzTitle]=\"i.text\">\n <ul>\n <li nz-menu-item *ngFor=\"let ci of i.children\" (click)=\"ci.fn!(ci)\" [innerHTML]=\"ci.text\"></li>\n </ul>\n </li>\n </ng-container>\n </ul>\n</nz-dropdown-menu>\n", dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i7.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgTemplateOutlet; }), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgSwitch; }), selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgSwitchCase; }), selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgSwitchDefault; }), selector: "[ngSwitchDefault]" }, { kind: "directive", type: i0.forwardRef(function () { return i8.NgControlStatus; }), selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i0.forwardRef(function () { return i8.NgModel; }), selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i0.forwardRef(function () { return i9.LetDirective; }), selector: "[let]", inputs: ["let"] }, { kind: "component", type: i0.forwardRef(function () { return i10.NzTableComponent; }), selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzPaginationPosition", "nzScroll", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange"], exportAs: ["nzTable"] }, { kind: "component", type: i0.forwardRef(function () { return i10.NzThAddOnComponent; }), selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i0.forwardRef(function () { return i10.NzTableCellDirective; }), selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i0.forwardRef(function () { return i10.NzThMeasureDirective; }), selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i0.forwardRef(function () { return i10.NzTdAddOnComponent; }), selector: "td[nzChecked], td[nzDisabled], td[nzIndeterminate], td[nzIndentSize], td[nzExpand], td[nzShowExpand], td[nzShowCheckbox]", inputs: ["nzChecked", "nzDisabled", "nzIndeterminate", "nzIndentSize", "nzShowExpand", "nzShowCheckbox", "nzExpand"], outputs: ["nzCheckedChange", "nzExpandChange"] }, { kind: "component", type: i0.forwardRef(function () { return i10.NzTheadComponent; }), selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i0.forwardRef(function () { return i10.NzTbodyComponent; }), selector: "tbody" }, { kind: "directive", type: i0.forwardRef(function () { return i10.NzTrDirective; }), selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i0.forwardRef(function () { return i10.NzTableVirtualScrollDirective; }), selector: "[nz-virtual-scroll]", exportAs: ["nzVirtualScroll"] }, { kind: "directive", type: i0.forwardRef(function () { return i10.NzCellFixedDirective; }), selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "directive", type: i0.forwardRef(function () { return i10.NzTrExpandDirective; }), selector: "tr[nzExpand]", inputs: ["nzExpand"] }, { kind: "component", type: i0.forwardRef(function () { return i10.NzTableFixedRowComponent; }), selector: "tr[nz-table-fixed-row], tr[nzExpand]" }, { kind: "directive", type: i0.forwardRef(function () { return i11.NzIconDirective; }), selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i0.forwardRef(function () { return i12.NzCheckboxComponent; }), selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "directive", type: i0.forwardRef(function () { return i13.NzMenuDirective; }), selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "directive", type: i0.forwardRef(function () { return i13.NzMenuItemDirective; }), selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "component", type: i0.forwardRef(function () { return i13.NzSubMenuComponent; }), selector: "[nz-submenu]", inputs: ["nzMenuClassName", "nzPaddingLeft", "nzTitle", "nzIcon", "nzOpen", "nzDisabled", "nzPlacement"], outputs: ["nzOpenChange"], exportAs: ["nzSubmenu"] }, { kind: "directive", type: i0.forwardRef(function () { return i6.NzDropDownDirective; }), selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i0.forwardRef(function () { return i6.NzDropdownMenuComponent; }), selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "directive", type: i0.forwardRef(function () { return i14.NzTooltipDirective; }), selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "directive", type: i0.forwardRef(function () { return i15.NzResizableDirective; }), selector: "[nz-resizable]", inputs: ["nzBounds", "nzMaxHeight", "nzMaxWidth", "nzMinHeight", "nzMinWidth", "nzGridColumnCount", "nzMaxColumn", "nzMinColumn", "nzLockAspectRatio", "nzPreview", "nzDisabled"], outputs: ["nzResize", "nzResizeEnd", "nzResizeStart"], exportAs: ["nzResizable"] }, { kind: "component", type: i0.forwardRef(function () { return i15.NzResizeHandleComponent; }), selector: "nz-resize-handle, [nz-resize-handle]", inputs: ["nzDirection"], outputs: ["nzMouseDown"], exportAs: ["nzResizeHandle"] }, { kind: "component", type: i0.forwardRef(function () { return i16.STFilterComponent; }), selector: "st-filter", inputs: ["col", "locale", "f"], outputs: ["n", "handle"] }, { kind: "component", type: i0.forwardRef(function () { return STTdComponent; }), selector: "st-td", inputs: ["c", "cIdx", "data", "i", "index"], outputs: ["n"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
742
- __decorate([
743
- InputNumber()
744
- ], STComponent.prototype, "ps", void 0);
745
- __decorate([
746
- InputNumber()
747
- ], STComponent.prototype, "pi", void 0);
748
- __decorate([
749
- InputNumber()
750
- ], STComponent.prototype, "total", void 0);
751
- __decorate([
752
- InputNumber()
753
- ], STComponent.prototype, "loadingDelay", void 0);
754
- __decorate([
755
- InputBoolean()
756
- ], STComponent.prototype, "bordered", void 0);
757
- __decorate([
758
- InputBoolean()
759
- ], STComponent.prototype, "showHeader", void 0);
760
- __decorate([
761
- InputBoolean()
762
- ], STComponent.prototype, "expandRowByClick", void 0);
763
- __decorate([
764
- InputBoolean()
765
- ], STComponent.prototype, "expandAccordion", void 0);
766
- __decorate([
767
- InputBoolean()
768
- ], STComponent.prototype, "responsive", void 0);
769
- __decorate([
770
- InputBoolean()
771
- ], STComponent.prototype, "responsiveHideHeaderFooter", void 0);
772
- __decorate([
773
- InputBoolean()
774
- ], STComponent.prototype, "virtualScroll", void 0);
775
- __decorate([
776
- InputNumber()
777
- ], STComponent.prototype, "virtualItemSize", void 0);
778
- __decorate([
779
- InputNumber()
780
- ], STComponent.prototype, "virtualMaxBufferPx", void 0);
781
- __decorate([
782
- InputNumber()
783
- ], STComponent.prototype, "virtualMinBufferPx", void 0);
784
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: STComponent, decorators: [{
785
- type: Component,
786
- args: [{ selector: 'st', exportAs: 'st', providers: [STDataSource, STRowSource, STColumnSource, STExport, DatePipe, YNPipe, DecimalPipe], host: {
787
- '[class.st]': `true`,
788
- '[class.st__p-left]': `page.placement === 'left'`,
789
- '[class.st__p-center]': `page.placement === 'center'`,
790
- '[class.st__width-strict]': `widthMode.type === 'strict'`,
791
- '[class.st__row-class]': `rowClassName`,
792
- '[class.ant-table-rep]': `responsive`,
793
- '[class.ant-table-rep__hide-header-footer]': `responsiveHideHeaderFooter`
794
- }, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<ng-template #titleTpl let-i>\n <span [innerHTML]=\"i._text\"></span>\n <small *ngIf=\"i.optional\" class=\"st__head-optional\" [innerHTML]=\"i.optional\"></small>\n <i\n *ngIf=\"i.optionalHelp\"\n class=\"st__head-tip\"\n nz-tooltip\n [nzTooltipTitle]=\"i.optionalHelp\"\n nz-icon\n nzType=\"question-circle\"\n ></i>\n</ng-template>\n<ng-template #chkAllTpl let-custom>\n <label\n nz-checkbox\n class=\"st__checkall\"\n [nzDisabled]=\"_allCheckedDisabled\"\n [(ngModel)]=\"_allChecked\"\n [nzIndeterminate]=\"_indeterminate\"\n (ngModelChange)=\"checkAll()\"\n [class.ant-table-selection-select-all-custom]=\"custom\"\n ></label>\n</ng-template>\n<nz-table\n #table\n [nzData]=\"_data\"\n [(nzPageIndex)]=\"pi\"\n (nzPageIndexChange)=\"_change('pi')\"\n [(nzPageSize)]=\"ps\"\n (nzPageSizeChange)=\"_change('ps')\"\n [nzTotal]=\"total\"\n [nzShowPagination]=\"_isPagination\"\n [nzFrontPagination]=\"false\"\n [nzBordered]=\"bordered\"\n [nzSize]=\"size\"\n [nzLoading]=\"noColumns || _loading\"\n [nzLoadingDelay]=\"loadingDelay\"\n [nzLoadingIndicator]=\"loadingIndicator\"\n [nzTitle]=\"header!\"\n [nzFooter]=\"footer!\"\n [nzScroll]=\"scroll\"\n [nzVirtualItemSize]=\"virtualItemSize\"\n [nzVirtualMaxBufferPx]=\"virtualMaxBufferPx\"\n [nzVirtualMinBufferPx]=\"virtualMinBufferPx\"\n [nzVirtualForTrackBy]=\"virtualForTrackBy\"\n [nzNoResult]=\"noResult!\"\n [nzPageSizeOptions]=\"page.pageSizes!\"\n [nzShowQuickJumper]=\"page.showQuickJumper\"\n [nzShowSizeChanger]=\"page.showSize\"\n [nzPaginationPosition]=\"page.position!\"\n [nzPaginationType]=\"page.type!\"\n [nzItemRender]=\"page.itemRender!\"\n [nzSimple]=\"page.simple\"\n [nzShowTotal]=\"totalTpl\"\n [nzWidthConfig]=\"_widthConfig\"\n (contextmenu)=\"onContextmenu($event)\"\n [class.st__no-column]=\"noColumns\"\n>\n <thead *ngIf=\"showHeader\">\n <tr *ngFor=\"let row of _headers; let rowFirst = first\">\n <th *ngIf=\"rowFirst && expand\" nzWidth=\"50px\" [rowSpan]=\"_headers.length\"></th>\n <ng-container *ngFor=\"let h of row; let index = index; let last = last\">\n <th\n *let=\"h.column as _c\"\n [colSpan]=\"h.colSpan\"\n [rowSpan]=\"h.rowSpan\"\n [nzWidth]=\"$any(_c).width\"\n [nzLeft]=\"_c._left!\"\n [nzRight]=\"_c._right!\"\n [ngClass]=\"_c._className\"\n [attr.data-col]=\"_c.indexKey\"\n [attr.data-col-index]=\"index\"\n [nzShowSort]=\"_c._sort.enabled\"\n [nzSortOrder]=\"$any(_c)._sort.default\"\n (nzSortOrderChange)=\"sort(_c, index, $event)\"\n [nzCustomFilter]=\"!!_c.filter\"\n [class.st__has-filter]=\"_c.filter\"\n nz-resizable\n [nzDisabled]=\"last || $any(_c).resizable.disabled\"\n [nzMaxWidth]=\"$any(_c).resizable.maxWidth\"\n [nzMinWidth]=\"$any(_c).resizable.minWidth\"\n [nzBounds]=\"$any(_c).resizable.bounds\"\n [nzPreview]=\"$any(_c).resizable.preview\"\n (nzResizeEnd)=\"colResize($event, _c)\"\n >\n <nz-resize-handle *ngIf=\"$any(!last && !$any(_c).resizable.disabled)\" nzDirection=\"right\">\n <i></i>\n </nz-resize-handle>\n <ng-template\n #renderTitle\n [ngTemplateOutlet]=\"_c.__renderTitle!\"\n [ngTemplateOutletContext]=\"{ $implicit: h.column, index: index }\"\n ></ng-template>\n <ng-container *ngIf=\"!_c.__renderTitle; else renderTitle\">\n <ng-container [ngSwitch]=\"_c.type\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <ng-container *ngIf=\"_c.selections!.length === 0\">\n <ng-template [ngTemplateOutlet]=\"chkAllTpl\" [ngTemplateOutletContext]=\"{ $implicit: false }\">\n </ng-template>\n </ng-container>\n <div *ngIf=\"_c.selections!.length > 0\" class=\"ant-table-selection\">\n <ng-template [ngTemplateOutlet]=\"chkAllTpl\" [ngTemplateOutletContext]=\"{ $implicit: true }\">\n </ng-template>\n <div *ngIf=\"_c.selections!.length\" class=\"ant-table-selection-extra\">\n <div\n nz-dropdown\n nzPlacement=\"bottomLeft\"\n [nzDropdownMenu]=\"selectionMenu\"\n class=\"ant-table-selection-down st__checkall-selection\"\n >\n <i nz-icon nzType=\"down\"></i>\n </div>\n </div>\n <nz-dropdown-menu #selectionMenu=\"nzDropdownMenu\">\n <ul nz-menu class=\"ant-table-selection-menu\">\n <li\n nz-menu-item\n *ngFor=\"let rw of _c.selections\"\n (click)=\"_rowSelection(rw)\"\n [innerHTML]=\"rw.text\"\n ></li>\n </ul>\n </nz-dropdown-menu>\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-template\n [ngTemplateOutlet]=\"titleTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: _c.title }\"\n ></ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"_c.filter\">\n <st-filter\n nz-th-extra\n [col]=\"h.column\"\n [f]=\"_c.filter\"\n [locale]=\"locale\"\n (n)=\"handleFilterNotify($event)\"\n (handle)=\"_handleFilter(_c, $event)\"\n ></st-filter>\n </ng-container>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody class=\"st__body\">\n <ng-container *ngIf=\"!_loading\">\n <ng-template\n [ngTemplateOutlet]=\"bodyHeader!\"\n [ngTemplateOutletContext]=\"{ $implicit: _statistical }\"\n ></ng-template>\n </ng-container>\n <ng-template #bodyTpl let-i let-index=\"index\">\n <tr\n [attr.data-index]=\"index\"\n (click)=\"_rowClick($event, i, index, false)\"\n (dblclick)=\"_rowClick($event, i, index, true)\"\n [ngClass]=\"i._rowClassName\"\n >\n <td\n *ngIf=\"expand\"\n [nzShowExpand]=\"expand && i.showExpand !== false\"\n [nzExpand]=\"i.expand\"\n (nzExpandChange)=\"_expandChange(i, $event)\"\n (click)=\"_stopPropagation($event)\"\n nzWidth=\"50px\"\n ></td>\n <td\n *ngFor=\"let c of _columns; let cIdx = index\"\n [nzLeft]=\"!!c._left\"\n [nzRight]=\"!!c._right\"\n [attr.data-col-index]=\"cIdx\"\n [ngClass]=\"c._className\"\n [attr.colspan]=\"c.colSpan\"\n >\n <span *ngIf=\"responsive\" class=\"ant-table-rep__title\">\n <ng-template [ngTemplateOutlet]=\"titleTpl\" [ngTemplateOutletContext]=\"{ $implicit: c.title }\"></ng-template>\n </span>\n <st-td [data]=\"_data\" [i]=\"i\" [index]=\"index\" [c]=\"c\" [cIdx]=\"cIdx\" (n)=\"_handleTd($event)\"></st-td>\n </td>\n </tr>\n <tr [nzExpand]=\"i.expand\">\n <ng-template\n [ngTemplateOutlet]=\"expand\"\n [ngTemplateOutletContext]=\"{ $implicit: i, index: index }\"\n ></ng-template>\n </tr>\n </ng-template>\n <ng-container *ngIf=\"!virtualScroll\">\n <ng-container *ngFor=\"let i of _data; let index = index\">\n <ng-template [ngTemplateOutlet]=\"bodyTpl\" [ngTemplateOutletContext]=\"{ $implicit: i, index: index }\">\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"virtualScroll\">\n <ng-template nz-virtual-scroll let-i let-index=\"index\">\n <ng-template [ngTemplateOutlet]=\"bodyTpl\" [ngTemplateOutletContext]=\"{ $implicit: i, index: index }\">\n </ng-template>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!_loading\">\n <ng-template [ngTemplateOutlet]=\"body!\" [ngTemplateOutletContext]=\"{ $implicit: _statistical }\"></ng-template>\n </ng-container>\n </tbody>\n <ng-template #totalTpl let-range=\"range\" let-total>{{ renderTotal(total, range) }}</ng-template>\n</nz-table>\n<nz-dropdown-menu #contextmenuTpl=\"nzDropdownMenu\">\n <ul nz-menu class=\"st__contextmenu\">\n <ng-container *ngFor=\"let i of contextmenuList\">\n <li nz-menu-item *ngIf=\"i.children!.length === 0\" (click)=\"i.fn!(i)\" [innerHTML]=\"i.text\"></li>\n <li nz-submenu *ngIf=\"i.children!.length > 0\" [nzTitle]=\"i.text\">\n <ul>\n <li nz-menu-item *ngFor=\"let ci of i.children\" (click)=\"ci.fn!(ci)\" [innerHTML]=\"ci.text\"></li>\n </ul>\n </li>\n </ng-container>\n </ul>\n</nz-dropdown-menu>\n" }]
795
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
796
- type: Optional
797
- }, {
798
- type: Inject,
799
- args: [ALAIN_I18N_TOKEN]
800
- }] }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.STExport }, { type: undefined, decorators: [{
801
- type: Inject,
802
- args: [DOCUMENT]
803
- }] }, { type: i2.STColumnSource }, { type: i3.STDataSource }, { type: i4.DelonLocaleService }, { type: i5.AlainConfigService }, { type: i6.NzContextMenuService }]; }, propDecorators: { orgTable: [{
804
- type: ViewChild,
805
- args: ['table']
806
- }], contextmenuTpl: [{
807
- type: ViewChild,
808
- args: ['contextmenuTpl']
809
- }], req: [{
810
- type: Input
811
- }], res: [{
812
- type: Input
813
- }], page: [{
814
- type: Input
815
- }], data: [{
816
- type: Input
817
- }], columns: [{
818
- type: Input
819
- }], contextmenu: [{
820
- type: Input
821
- }], ps: [{
822
- type: Input
823
- }], pi: [{
824
- type: Input
825
- }], total: [{
826
- type: Input
827
- }], loading: [{
828
- type: Input
829
- }], loadingDelay: [{
830
- type: Input
831
- }], loadingIndicator: [{
832
- type: Input
833
- }], bordered: [{
834
- type: Input
835
- }], size: [{
836
- type: Input
837
- }], scroll: [{
838
- type: Input
839
- }], singleSort: [{
840
- type: Input
841
- }], multiSort: [{
842
- type: Input
843
- }], rowClassName: [{
844
- type: Input
845
- }], clickRowClassName: [{
846
- type: Input
847
- }], widthMode: [{
848
- type: Input
849
- }], widthConfig: [{
850
- type: Input
851
- }], resizable: [{
852
- type: Input
853
- }], header: [{
854
- type: Input
855
- }], showHeader: [{
856
- type: Input
857
- }], footer: [{
858
- type: Input
859
- }], bodyHeader: [{
860
- type: Input
861
- }], body: [{
862
- type: Input
863
- }], expandRowByClick: [{
864
- type: Input
865
- }], expandAccordion: [{
866
- type: Input
867
- }], expand: [{
868
- type: Input
869
- }], noResult: [{
870
- type: Input
871
- }], responsive: [{
872
- type: Input
873
- }], responsiveHideHeaderFooter: [{
874
- type: Input
875
- }], error: [{
876
- type: Output
877
- }], change: [{
878
- type: Output
879
- }], virtualScroll: [{
880
- type: Input
881
- }], virtualItemSize: [{
882
- type: Input
883
- }], virtualMaxBufferPx: [{
884
- type: Input
885
- }], virtualMinBufferPx: [{
886
- type: Input
887
- }], customRequest: [{
888
- type: Input
889
- }], virtualForTrackBy: [{
890
- type: Input
891
- }] } });
892
- export class STTdComponent {
893
- get routerState() {
894
- const { pi, ps, total } = this.stComp;
895
- return { pi, ps, total };
896
- }
897
- constructor(stComp, router, modalHelper, drawerHelper) {
898
- this.stComp = stComp;
899
- this.router = router;
900
- this.modalHelper = modalHelper;
901
- this.drawerHelper = drawerHelper;
902
- this.n = new EventEmitter();
903
- }
904
- report(type) {
905
- this.n.emit({ type, item: this.i, col: this.c });
906
- }
907
- _checkbox(value) {
908
- this.i.checked = value;
909
- this.report('checkbox');
910
- }
911
- _radio() {
912
- this.data.filter(w => !w.disabled).forEach(i => (i.checked = false));
913
- this.i.checked = true;
914
- this.report('radio');
915
- }
916
- _link(e) {
917
- this._stopPropagation(e);
918
- const res = this.c.click(this.i, this.stComp);
919
- if (typeof res === 'string') {
920
- this.router.navigateByUrl(res, { state: this.routerState });
921
- }
922
- return false;
923
- }
924
- _stopPropagation(ev) {
925
- ev.preventDefault();
926
- ev.stopPropagation();
927
- }
928
- _btn(btn, ev) {
929
- ev?.stopPropagation();
930
- const cog = this.stComp.cog;
931
- let record = this.i;
932
- if (btn.type === 'modal' || btn.type === 'static') {
933
- if (cog.modal.pureRecoard === true) {
934
- record = this.stComp.pureItem(record);
935
- }
936
- const modal = btn.modal;
937
- const obj = { [modal.paramsName]: record };
938
- this.modalHelper[btn.type === 'modal' ? 'create' : 'createStatic'](modal.component, { ...obj, ...(modal.params && modal.params(record)) }, deepMergeKey({}, true, cog.modal, modal))
939
- .pipe(filter(w => typeof w !== 'undefined'))
940
- .subscribe((res) => this.btnCallback(record, btn, res));
941
- return;
942
- }
943
- else if (btn.type === 'drawer') {
944
- if (cog.drawer.pureRecoard === true) {
945
- record = this.stComp.pureItem(record);
946
- }
947
- const drawer = btn.drawer;
948
- const obj = { [drawer.paramsName]: record };
949
- this.drawerHelper
950
- .create(drawer.title, drawer.component, { ...obj, ...(drawer.params && drawer.params(record)) }, deepMergeKey({}, true, cog.drawer, drawer))
951
- .pipe(filter(w => typeof w !== 'undefined'))
952
- .subscribe(res => this.btnCallback(record, btn, res));
953
- return;
954
- }
955
- else if (btn.type === 'link') {
956
- const clickRes = this.btnCallback(record, btn);
957
- if (typeof clickRes === 'string') {
958
- this.router.navigateByUrl(clickRes, { state: this.routerState });
959
- }
960
- return;
961
- }
962
- this.btnCallback(record, btn);
963
- }
964
- btnCallback(record, btn, modal) {
965
- if (!btn.click)
966
- return;
967
- if (typeof btn.click === 'string') {
968
- switch (btn.click) {
969
- case 'load':
970
- this.stComp.load();
971
- break;
972
- case 'reload':
973
- this.stComp.reload();
974
- break;
975
- }
976
- }
977
- else {
978
- return btn.click(record, modal, this.stComp);
979
- }
980
- }
981
- }
982
- STTdComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: STTdComponent, deps: [{ token: STComponent, host: true }, { token: i17.Router }, { token: i4.ModalHelper }, { token: i4.DrawerHelper }], target: i0.ɵɵFactoryTarget.Component });
983
- STTdComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: STTdComponent, selector: "st-td", inputs: { c: "c", cIdx: "cIdx", data: "data", i: "i", index: "index" }, outputs: { n: "n" }, ngImport: i0, template: "<ng-template #btnTpl let-i let-child=\"child\">\n <ng-container *ngIf=\"!i.tooltip\">\n <ng-template [ngTemplateOutlet]=\"btnItemTpl\" [ngTemplateOutletContext]=\"{ $implicit: i }\"></ng-template>\n </ng-container>\n <span *ngIf=\"i.tooltip\" nz-tooltip [nzTooltipTitle]=\"i.tooltip\" [class.d-block]=\"child\" [class.width-100]=\"child\">\n <ng-template [ngTemplateOutlet]=\"btnItemTpl\" [ngTemplateOutletContext]=\"{ $implicit: i }\"></ng-template>\n </span>\n</ng-template>\n<ng-template #btnItemTpl let-i>\n <a\n *ngIf=\"i.pop\"\n nz-popconfirm\n [nzPopconfirmTitle]=\"i.pop.title\"\n [nzIcon]=\"i.pop.icon\"\n [nzCondition]=\"i.pop.condition(i)\"\n [nzCancelText]=\"i.pop.cancelText\"\n [nzOkText]=\"i.pop.okText\"\n [nzOkType]=\"i.pop.okType\"\n (nzOnConfirm)=\"_btn(i)\"\n class=\"st__btn-text\"\n [ngClass]=\"i.className\"\n (click)=\"_stopPropagation($event)\"\n >\n <ng-template [ngTemplateOutlet]=\"btnTextTpl\" [ngTemplateOutletContext]=\"{ $implicit: i }\"></ng-template>\n </a>\n <a *ngIf=\"!i.pop\" (click)=\"_btn(i, $event)\" class=\"st__btn-text\" [ngClass]=\"i.className\">\n <ng-template [ngTemplateOutlet]=\"btnTextTpl\" [ngTemplateOutletContext]=\"{ $implicit: i }\"></ng-template>\n </a>\n</ng-template>\n<ng-template #btnTextTpl let-i>\n <ng-container *ngIf=\"i.icon\">\n <i\n *ngIf=\"!i.icon.iconfont\"\n nz-icon\n [nzType]=\"i.icon.type\"\n [nzTheme]=\"i.icon.theme\"\n [nzSpin]=\"i.icon.spin\"\n [nzTwotoneColor]=\"i.icon.twoToneColor\"\n ></i>\n <i *ngIf=\"i.icon.iconfont\" nz-icon [nzIconfont]=\"i.icon.iconfont\"></i>\n </ng-container>\n <span [innerHTML]=\"i._text\" [ngClass]=\"{ 'pl-xs': i.icon }\"></span>\n</ng-template>\n<ng-template\n #render\n [ngTemplateOutlet]=\"c.__render!\"\n [ngTemplateOutletContext]=\"{ $implicit: i, index: index, column: c }\"\n></ng-template>\n<ng-container *ngIf=\"!c.__render; else render\">\n <ng-container [ngSwitch]=\"c.type\">\n <label\n *ngSwitchCase=\"'checkbox'\"\n nz-checkbox\n [nzDisabled]=\"i.disabled\"\n [ngModel]=\"i.checked\"\n (ngModelChange)=\"_checkbox($event)\"\n ></label>\n <label\n *ngSwitchCase=\"'radio'\"\n nz-radio\n [nzDisabled]=\"i.disabled\"\n [ngModel]=\"i.checked\"\n (ngModelChange)=\"_radio()\"\n ></label>\n <a\n *ngSwitchCase=\"'link'\"\n (click)=\"_link($event)\"\n [innerHTML]=\"i._values[cIdx]._text\"\n [attr.title]=\"i._values[cIdx].text\"\n ></a>\n <ng-container *ngIf=\"i._values[cIdx].text\">\n <nz-tag *ngSwitchCase=\"'tag'\" [nzColor]=\"i._values[cIdx].color\">\n <span [innerHTML]=\"i._values[cIdx]._text\"></span>\n </nz-tag>\n <nz-badge *ngSwitchCase=\"'badge'\" [nzStatus]=\"i._values[cIdx].color\" [nzText]=\"i._values[cIdx].text\"></nz-badge>\n </ng-container>\n <ng-template *ngSwitchCase=\"'widget'\" st-widget-host [record]=\"i\" [column]=\"c\"></ng-template\n ><ng-container *ngSwitchDefault>\n <span\n *ngIf=\"c.safeType !== 'text'\"\n [innerHTML]=\"i._values[cIdx]._text\"\n [attr.title]=\"c._isTruncate ? i._values[cIdx].text : null\"\n ></span>\n <span\n *ngIf=\"c.safeType === 'text'\"\n [innerText]=\"i._values[cIdx]._text\"\n [attr.title]=\"c._isTruncate ? i._values[cIdx].text : null\"\n ></span>\n </ng-container>\n </ng-container>\n <ng-container *ngFor=\"let btn of i._values[cIdx].buttons; let last = last\">\n <a *ngIf=\"btn.children!.length > 0\" nz-dropdown [nzDropdownMenu]=\"btnMenu\" nzOverlayClassName=\"st__btn-sub\">\n <span [innerHTML]=\"btn._text\"></span>\n <i nz-icon nzType=\"down\"></i>\n </a>\n <nz-dropdown-menu #btnMenu=\"nzDropdownMenu\">\n <ul nz-menu>\n <ng-container *ngFor=\"let subBtn of btn.children!\">\n <li *ngIf=\"subBtn.type !== 'divider'\" nz-menu-item [class.st__btn-disabled]=\"subBtn._disabled\">\n <ng-template [ngTemplateOutlet]=\"btnTpl\" [ngTemplateOutletContext]=\"{ $implicit: subBtn, child: true }\">\n </ng-template>\n </li>\n <li *ngIf=\"subBtn.type === 'divider'\" nz-menu-divider></li>\n </ng-container>\n </ul>\n </nz-dropdown-menu>\n <span *ngIf=\"btn.children!.length === 0\" [class.st__btn-disabled]=\"btn._disabled\">\n <ng-template [ngTemplateOutlet]=\"btnTpl\" [ngTemplateOutletContext]=\"{ $implicit: btn, child: false }\">\n </ng-template>\n </span>\n <nz-divider *ngIf=\"!last\" nzType=\"vertical\"></nz-divider>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i18.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nz-popconfirm", "nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDanger", "nzCancelText", "nzBeforeConfirm", "nzIcon", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { kind: "directive", type: i11.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i19.NzBadgeComponent, selector: "nz-badge", inputs: ["nzShowZero", "nzShowDot", "nzStandalone", "nzDot", "nzOverflowCount", "nzColor", "nzStyle", "nzText", "nzTitle", "nzStatus", "nzCount", "nzOffset", "nzSize"], exportAs: ["nzBadge"] }, { kind: "component", type: i12.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "component", type: i20.NzDividerComponent, selector: "nz-divider", inputs: ["nzText", "nzType", "nzOrientation", "nzDashed", "nzPlain"], exportAs: ["nzDivider"] }, { kind: "directive", type: i13.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "directive", type: i13.NzMenuItemDirective, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "directive", type: i13.NzMenuDividerDirective, selector: "[nz-menu-divider]", exportAs: ["nzMenuDivider"] }, { kind: "directive", type: i6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "directive", type: i6.NzDropDownADirective, selector: "a[nz-dropdown]" }, { kind: "component", type: i6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "component", type: i21.NzRadioComponent, selector: "[nz-radio],[nz-radio-button]", inputs: ["nzValue", "nzDisabled", "nzAutoFocus"], exportAs: ["nzRadio"] }, { kind: "component", type: i22.NzTagComponent, selector: "nz-tag", inputs: ["nzMode", "nzColor", "nzChecked"], outputs: ["nzOnClose", "nzCheckedChange"], exportAs: ["nzTag"] }, { kind: "directive", type: i14.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "directive", type: i23.STWidgetHostDirective, selector: "[st-widget-host]", inputs: ["record", "column"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
984
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: STTdComponent, decorators: [{
985
- type: Component,
986
- args: [{ selector: 'st-td', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<ng-template #btnTpl let-i let-child=\"child\">\n <ng-container *ngIf=\"!i.tooltip\">\n <ng-template [ngTemplateOutlet]=\"btnItemTpl\" [ngTemplateOutletContext]=\"{ $implicit: i }\"></ng-template>\n </ng-container>\n <span *ngIf=\"i.tooltip\" nz-tooltip [nzTooltipTitle]=\"i.tooltip\" [class.d-block]=\"child\" [class.width-100]=\"child\">\n <ng-template [ngTemplateOutlet]=\"btnItemTpl\" [ngTemplateOutletContext]=\"{ $implicit: i }\"></ng-template>\n </span>\n</ng-template>\n<ng-template #btnItemTpl let-i>\n <a\n *ngIf=\"i.pop\"\n nz-popconfirm\n [nzPopconfirmTitle]=\"i.pop.title\"\n [nzIcon]=\"i.pop.icon\"\n [nzCondition]=\"i.pop.condition(i)\"\n [nzCancelText]=\"i.pop.cancelText\"\n [nzOkText]=\"i.pop.okText\"\n [nzOkType]=\"i.pop.okType\"\n (nzOnConfirm)=\"_btn(i)\"\n class=\"st__btn-text\"\n [ngClass]=\"i.className\"\n (click)=\"_stopPropagation($event)\"\n >\n <ng-template [ngTemplateOutlet]=\"btnTextTpl\" [ngTemplateOutletContext]=\"{ $implicit: i }\"></ng-template>\n </a>\n <a *ngIf=\"!i.pop\" (click)=\"_btn(i, $event)\" class=\"st__btn-text\" [ngClass]=\"i.className\">\n <ng-template [ngTemplateOutlet]=\"btnTextTpl\" [ngTemplateOutletContext]=\"{ $implicit: i }\"></ng-template>\n </a>\n</ng-template>\n<ng-template #btnTextTpl let-i>\n <ng-container *ngIf=\"i.icon\">\n <i\n *ngIf=\"!i.icon.iconfont\"\n nz-icon\n [nzType]=\"i.icon.type\"\n [nzTheme]=\"i.icon.theme\"\n [nzSpin]=\"i.icon.spin\"\n [nzTwotoneColor]=\"i.icon.twoToneColor\"\n ></i>\n <i *ngIf=\"i.icon.iconfont\" nz-icon [nzIconfont]=\"i.icon.iconfont\"></i>\n </ng-container>\n <span [innerHTML]=\"i._text\" [ngClass]=\"{ 'pl-xs': i.icon }\"></span>\n</ng-template>\n<ng-template\n #render\n [ngTemplateOutlet]=\"c.__render!\"\n [ngTemplateOutletContext]=\"{ $implicit: i, index: index, column: c }\"\n></ng-template>\n<ng-container *ngIf=\"!c.__render; else render\">\n <ng-container [ngSwitch]=\"c.type\">\n <label\n *ngSwitchCase=\"'checkbox'\"\n nz-checkbox\n [nzDisabled]=\"i.disabled\"\n [ngModel]=\"i.checked\"\n (ngModelChange)=\"_checkbox($event)\"\n ></label>\n <label\n *ngSwitchCase=\"'radio'\"\n nz-radio\n [nzDisabled]=\"i.disabled\"\n [ngModel]=\"i.checked\"\n (ngModelChange)=\"_radio()\"\n ></label>\n <a\n *ngSwitchCase=\"'link'\"\n (click)=\"_link($event)\"\n [innerHTML]=\"i._values[cIdx]._text\"\n [attr.title]=\"i._values[cIdx].text\"\n ></a>\n <ng-container *ngIf=\"i._values[cIdx].text\">\n <nz-tag *ngSwitchCase=\"'tag'\" [nzColor]=\"i._values[cIdx].color\">\n <span [innerHTML]=\"i._values[cIdx]._text\"></span>\n </nz-tag>\n <nz-badge *ngSwitchCase=\"'badge'\" [nzStatus]=\"i._values[cIdx].color\" [nzText]=\"i._values[cIdx].text\"></nz-badge>\n </ng-container>\n <ng-template *ngSwitchCase=\"'widget'\" st-widget-host [record]=\"i\" [column]=\"c\"></ng-template\n ><ng-container *ngSwitchDefault>\n <span\n *ngIf=\"c.safeType !== 'text'\"\n [innerHTML]=\"i._values[cIdx]._text\"\n [attr.title]=\"c._isTruncate ? i._values[cIdx].text : null\"\n ></span>\n <span\n *ngIf=\"c.safeType === 'text'\"\n [innerText]=\"i._values[cIdx]._text\"\n [attr.title]=\"c._isTruncate ? i._values[cIdx].text : null\"\n ></span>\n </ng-container>\n </ng-container>\n <ng-container *ngFor=\"let btn of i._values[cIdx].buttons; let last = last\">\n <a *ngIf=\"btn.children!.length > 0\" nz-dropdown [nzDropdownMenu]=\"btnMenu\" nzOverlayClassName=\"st__btn-sub\">\n <span [innerHTML]=\"btn._text\"></span>\n <i nz-icon nzType=\"down\"></i>\n </a>\n <nz-dropdown-menu #btnMenu=\"nzDropdownMenu\">\n <ul nz-menu>\n <ng-container *ngFor=\"let subBtn of btn.children!\">\n <li *ngIf=\"subBtn.type !== 'divider'\" nz-menu-item [class.st__btn-disabled]=\"subBtn._disabled\">\n <ng-template [ngTemplateOutlet]=\"btnTpl\" [ngTemplateOutletContext]=\"{ $implicit: subBtn, child: true }\">\n </ng-template>\n </li>\n <li *ngIf=\"subBtn.type === 'divider'\" nz-menu-divider></li>\n </ng-container>\n </ul>\n </nz-dropdown-menu>\n <span *ngIf=\"btn.children!.length === 0\" [class.st__btn-disabled]=\"btn._disabled\">\n <ng-template [ngTemplateOutlet]=\"btnTpl\" [ngTemplateOutletContext]=\"{ $implicit: btn, child: false }\">\n </ng-template>\n </span>\n <nz-divider *ngIf=\"!last\" nzType=\"vertical\"></nz-divider>\n </ng-container>\n</ng-container>\n" }]
987
- }], ctorParameters: function () { return [{ type: STComponent, decorators: [{
988
- type: Host
989
- }] }, { type: i17.Router }, { type: i4.ModalHelper }, { type: i4.DrawerHelper }]; }, propDecorators: { c: [{
990
- type: Input
991
- }], cIdx: [{
992
- type: Input
993
- }], data: [{
994
- type: Input
995
- }], i: [{
996
- type: Input
997
- }], index: [{
998
- type: Input
999
- }], n: [{
1000
- type: Output
1001
- }] } });
1002
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYWJjL3N0L3N0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FiYy9zdC9zdC5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FiYy9zdC9zdC10ZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osSUFBSSxFQUNKLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFLTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEcsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixRQUFRLEVBS1IsTUFBTSxFQUNQLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBZ0IsWUFBWSxFQUFFLFdBQVcsRUFBZSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RyxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTTNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUEyQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIs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dHVhbFNjcm9sbFZpZXdwb3J0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBEZWNpbWFsUGlwZSwgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdCxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZSxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFRyYWNrQnlGdW5jdGlvbixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBmcm9tLCBpc09ic2VydmFibGUsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIEFsYWluSTE4TlNlcnZpY2UsXG4gIEFMQUlOX0kxOE5fVE9LRU4sXG4gIERhdGVQaXBlLFxuICBEZWxvbkxvY2FsZVNlcnZpY2UsXG4gIERyYXdlckhlbHBlcixcbiAgTG9jYWxlRGF0YSxcbiAgTW9kYWxIZWxwZXIsXG4gIFlOUGlwZVxufSBmcm9tICdAZGVsb24vdGhlbWUnO1xuaW1wb3J0IHsgQWxhaW5Db25maWdTZXJ2aWNlLCBBbGFpblNUQ29uZmlnIH0gZnJvbSAnQGRlbG9uL3V0aWwvY29uZmlnJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgSW5wdXRCb29sZWFuLCBJbnB1dE51bWJlciwgTnVtYmVySW5wdXQsIHRvQm9vbGVhbiB9IGZyb20gJ0BkZWxvbi91dGlsL2RlY29yYXRvcic7XG5pbXBvcnQgeyBkZWVwQ29weSwgZGVlcE1lcmdlS2V5IH0gZnJvbSAnQGRlbG9uL3V0aWwvb3RoZXInO1xuaW1wb3J0IHR5cGUgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgTnpDb250ZXh0TWVudVNlcnZpY2UsIE56RHJvcGRvd25NZW51Q29tcG9uZW50IH0gZnJvbSAnbmctem9ycm8tYW50ZC9kcm9wZG93bic7XG5pbXBvcnQgeyBOelJlc2l6ZUV2ZW50IH0gZnJvbSAnbmctem9ycm8tYW50ZC9yZXNpemFibGUnO1xuaW1wb3J0IHsgTnpUYWJsZUNvbXBvbmVudCB9IGZyb20gJ25nLXpvcnJvLWFudGQvdGFibGUnO1xuXG5pbXBvcnQgeyBTVENvbHVtblNvdXJjZSB9IGZyb20gJy4vc3QtY29sdW1uLXNvdXJjZSc7XG5pbXBvcnQgeyBTVERhdGFTb3VyY2UsIFNURGF0YVNvdXJjZU9wdGlvbnMsIFNURGF0YVNvdXJjZVJlc3VsdCB9IGZyb20gJy4vc3QtZGF0YS1zb3VyY2UnO1xuaW1wb3J0IHsgU1RFeHBvcnQgfSBmcm9tICcuL3N0LWV4cG9ydCc7XG5pbXBvcnQgeyBTVFJvd1NvdXJjZSB9IGZyb20gJy4vc3Qtcm93LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTVF9ERUZBVUxUX0NPTkZJRyB9IGZyb20gJy4vc3QuY29uZmlnJztcbmltcG9ydCB7XG4gIFNUQ2hhbmdlLFxuICBTVENoYW5nZVR5cGUsXG4gIFNUQ2xpY2tSb3dDbGFzc05hbWUsXG4gIFNUQ2xpY2tSb3dDbGFzc05hbWVUeXBlLFxuICBTVENvbHVtbixcbiAgU1RDb2x1bW5CdXR0b24sXG4gIFNUQ29sdW1uU2FmZVR5cGUsXG4gIFNUQ29sdW1uU2VsZWN0aW9uLFxuICBTVENvbnRleHRtZW51Rm4sXG4gIFNUQ29udGV4dG1lbnVJdGVtLFxuICBTVEN1c3RvbVJlcXVlc3RPcHRpb25zLFxuICBTVERhdGEsXG4gIFNURXJyb3IsXG4gIFNURXhwb3J0T3B0aW9ucyxcbiAgU1RMb2FkT3B0aW9ucyxcbiAgU1RNdWx0aVNvcnQsXG4gIFNUUGFnZSxcbiAgU1RSZXEsXG4gIFNUUmVzLFxuICBTVFJlc2V0Q29sdW1uc09wdGlvbixcbiAgU1RSZXNpemFibGUsXG4gIFNUUm93Q2xhc3NOYW1lLFxuICBTVFNpbmdsZVNvcnQsXG4gIFNUU3RhdGlzdGljYWxSZXN1bHRzLFxuICBTVFdpZHRoTW9kZVxufSBmcm9tICcuL3N0LmludGVyZmFjZXMnO1xuaW1wb3J0IHsgX1NUQ29sdW1uLCBfU1REYXRhVmFsdWUsIF9TVEhlYWRlciwgX1NUVGROb3RpZnksIF9TVFRkTm90aWZ5VHlwZSB9IGZyb20gJy4vc3QudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdCcsXG4gIGV4cG9ydEFzOiAnc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3QuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtTVERhdGFTb3VyY2UsIFNUUm93U291cmNlLCBTVENvbHVtblNvdXJjZSwgU1RFeHBvcnQsIERhdGVQaXBlLCBZTlBpcGUsIERlY2ltYWxQaXBlXSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Muc3RdJzogYHRydWVgLFxuICAgICdbY2xhc3Muc3RfX3AtbGVmdF0nOiBgcGFnZS5wbGFjZW1lbnQgPT09ICdsZWZ0J2AsXG4gICAgJ1tjbGFzcy5zdF9fcC1jZW50ZXJdJzogYHBhZ2UucGxhY2VtZW50ID09PSAnY2VudGVyJ2AsXG4gICAgJ1tjbGFzcy5zdF9fd2lkdGgtc3RyaWN0XSc6IGB3aWR0aE1vZGUudHlwZSA9PT0gJ3N0cmljdCdgLFxuICAgICdbY2xhc3Muc3RfX3Jvdy1jbGFzc10nOiBgcm93Q2xhc3NOYW1lYCxcbiAgICAnW2NsYXNzLmFudC10YWJsZS1yZXBdJzogYHJlc3BvbnNpdmVgLFxuICAgICdbY2xhc3MuYW50LXRhYmxlLXJlcF9faGlkZS1oZWFkZXItZm9vdGVyXSc6IGByZXNwb25zaXZlSGlkZUhlYWRlckZvb3RlcmBcbiAgfSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFNUQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfcHM6IE51bWJlcklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfcGk6IE51bWJlcklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfdG90YWw6IE51bWJlcklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbG9hZGluZ0RlbGF5OiBOdW1iZXJJbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2JvcmRlcmVkOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9leHBhbmRSb3dCeUNsaWNrOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9leHBhbmRBY2NvcmRpb246IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3Jlc3BvbnNpdmU6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3Jlc3BvbnNpdmVIaWRlSGVhZGVyRm9vdGVyOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV92aXJ0dWFsU2Nyb2xsOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV92aXJ0dWFsSXRlbVNpemU6IE51bWJlcklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfdmlydHVhbE1heEJ1ZmZlclB4OiBOdW1iZXJJbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3ZpcnR1YWxNaW5CdWZmZXJQeDogTnVtYmVySW5wdXQ7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgZGF0YSQ/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgdG90YWxUcGwgPSBgYDtcbiAgY29nITogQWxhaW5TVENvbmZpZztcbiAgcHJpdmF0ZSBfcmVxITogU1RSZXE7XG4gIHByaXZhdGUgX3JlcyE6IFNUUmVzO1xuICBwcml2YXRlIF9wYWdlITogU1RQYWdlO1xuICBwcml2YXRlIF93aWR0aE1vZGUhOiBTVFdpZHRoTW9kZTtcbiAgcHJpdmF0ZSBjdXN0b21XaWR0aENvbmZpZzogYm9vbGVhbiA9IGZhbHNlO1xuICBfd2lkdGhDb25maWc6IHN0cmluZ1tdID0gW107XG4gIGxvY2FsZTogTG9jYWxlRGF0YSA9IHt9O1xuICBfbG9hZGluZyA9IGZhbHNlO1xuICBfZGF0YTogU1REYXRhW10gPSBbXTtcbiAgX3N0YXRpc3RpY2FsOiBTVFN0YXRpc3RpY2FsUmVzdWx0cyA9IHt9O1xuICBfaXNQYWdpbmF0aW9uID0gdHJ1ZTtcbiAgX2FsbENoZWNrZWQgPSBmYWxzZTtcbiAgX2FsbENoZWNrZWREaXNhYmxlZCA9IGZhbHNlO1xuICBfaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICBfaGVhZGVyczogX1NUSGVhZGVyW11bXSA9IFtdO1xuICBfY29sdW1uczogX1NUQ29sdW1uW10gPSBbXTtcbiAgY29udGV4dG1lbnVMaXN0OiBTVENvbnRleHRtZW51SXRlbVtdID0gW107XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlJykgcmVhZG9ubHkgb3JnVGFibGUhOiBOelRhYmxlQ29tcG9uZW50PFNURGF0YT47XG4gIEBWaWV3Q2hpbGQoJ2NvbnRleHRtZW51VHBsJykgcmVhZG9ubHkgY29udGV4dG1lbnVUcGwhOiBOekRyb3Bkb3duTWVudUNvbXBvbmVudDtcblxuICBASW5wdXQoKVxuICBnZXQgcmVxKCk6IFNUUmVxIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxO1xuICB9XG4gIHNldCByZXEodmFsdWU6IFNUUmVxKSB7XG4gICAgdGhpcy5fcmVxID0gZGVlcE1lcmdlS2V5KHt9LCB0cnVlLCB0aGlzLmNvZy5yZXEsIHZhbHVlKTtcbiAgfVxuICAvKiog6L+U5Zue5L2T6YWN572uICovXG4gIEBJbnB1dCgpXG4gIGdldCByZXMoKTogU1RSZXMge1xuICAgIHJldHVybiB0aGlzLl9yZXM7XG4gIH1cbiAgc2V0IHJlcyh2YWx1ZTogU1RSZXMpIHtcbiAgICBjb25zdCBpdGVtID0gKHRoaXMuX3JlcyA9IGRlZXBNZXJnZUtleSh7fSwgdHJ1ZSwgdGhpcy5jb2cucmVzLCB2YWx1ZSkpO1xuICAgIGNvbnN0IHJlTmFtZSA9IGl0ZW0ucmVOYW1lITtcbiAgICBpZiAodHlwZW9mIHJlTmFtZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlTmFtZS5saXN0KSkgcmVOYW1lLmxpc3QgPSByZU5hbWUubGlzdCEuc3BsaXQoJy4nKTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZU5hbWUudG90YWwpKSByZU5hbWUudG90YWwgPSByZU5hbWUudG90YWwhLnNwbGl0KCcuJyk7XG4gICAgfVxuICAgIHRoaXMuX3JlcyA9IGl0ZW07XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHBhZ2UoKTogU1RQYWdlIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgfVxuICBzZXQgcGFnZSh2YWx1ZTogU1RQYWdlKSB7XG4gICAgdGhpcy5fcGFnZSA9IHsgLi4udGhpcy5jb2cucGFnZSwgLi4udmFsdWUgfTtcbiAgICB0aGlzLnVwZGF0ZVRvdGFsVHBsKCk7XG4gIH1cbiAgQElucHV0KCkgZGF0YSE6IHN0cmluZyB8IFNURGF0YVtdIHwgT2JzZXJ2YWJsZTxTVERhdGFbXT47XG4gIEBJbnB1dCgpIGNvbHVtbnM/OiBTVENvbHVtbltdIHwgbnVsbDtcbiAgQElucHV0KCkgY29udGV4dG1lbnU/OiBTVENvbnRleHRtZW51Rm4gfCBudWxsO1xuICBASW5wdXQoKSBASW5wdXROdW1iZXIoKSBwcyA9IDEwO1xuICBASW5wdXQoKSBASW5wdXROdW1iZXIoKSBwaSA9IDE7XG4gIEBJbnB1dCgpIEBJbnB1dE51bWJlcigpIHRvdGFsID0gMDtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBASW5wdXROdW1iZXIoKSBsb2FkaW5nRGVsYXkgPSAwO1xuICBASW5wdXQoKSBsb2FkaW5nSW5kaWNhdG9yOiBUZW1wbGF0ZVJlZjx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgYm9yZGVyZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgc2l6ZSE6ICdzbWFsbCcgfCAnbWlkZGxlJyB8ICdkZWZhdWx0JztcbiAgQElucHV0KCkgc2Nyb2xsOiB7IHg/OiBzdHJpbmcgfCBudWxsOyB5Pzogc3RyaW5nIHwgbnVsbCB9ID0geyB4OiBudWxsLCB5OiBudWxsIH07XG4gIEBJbnB1dCgpIHNpbmdsZVNvcnQ/OiBTVFNpbmdsZVNvcnQgfCBudWxsO1xuICBwcml2YXRlIF9tdWx0aVNvcnQ/OiBTVE11bHRpU29ydDtcbiAgQElucHV0KClcbiAgZ2V0IG11bHRpU29ydCgpOiBOelNhZmVBbnkge1xuICAgIHJldHVybiB0aGlzLl9tdWx0aVNvcnQ7XG4gIH1cbiAgc2V0IG11bHRpU29ydCh2YWx1ZTogTnpTYWZlQW55KSB7XG4gICAgaWYgKFxuICAgICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmICF0b0Jvb2xlYW4odmFsdWUpKSB8fFxuICAgICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMClcbiAgICApIHtcbiAgICAgIHRoaXMuX211bHRpU29ydCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbXVsdGlTb3J0ID0ge1xuICAgICAgLi4uKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyB2YWx1ZSA6IHt9KVxuICAgIH07XG4gIH1cbiAgQElucHV0KCkgcm93Q2xhc3NOYW1lPzogU1RSb3dDbGFzc05hbWUgfCBudWxsO1xuICBASW5wdXQoKSBjbGlja1Jvd0NsYXNzTmFtZT86IFNUQ2xpY2tSb3dDbGFzc05hbWUgfCBudWxsO1xuICBASW5wdXQoKVxuICBzZXQgd2lkdGhNb2RlKHZhbHVlOiBTVFdpZHRoTW9kZSkge1xuICAgIHRoaXMuX3dpZHRoTW9kZSA9IHsgLi4udGhpcy5jb2cud2lkdGhNb2RlLCAuLi52YWx1ZSB9O1xuICB9XG4gIGdldCB3aWR0aE1vZGUoKTogU1RXaWR0aE1vZGUge1xuICAgIHJldHVybiB0aGlzLl93aWR0aE1vZGU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHdpZHRoQ29uZmlnKHZhbDogc3RyaW5nW10pIHtcbiAgICB0aGlzLl93aWR0aENvbmZpZyA9IHZhbDtcbiAgICB0aGlzLmN1c3RvbVdpZHRoQ29uZmlnID0gdmFsICYmIHZhbC5sZW5ndGggPiAwO1xuICB9XG4gIHByaXZhdGUgX3Jlc2l6YWJsZT86IFNUUmVzaXphYmxlO1xuICBASW5wdXQoKVxuICBzZXQgcmVzaXphYmxlKHZhbDogU1RSZXNpemFibGUgfCBib29sZWFuIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVzaXphYmxlID0gdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgPyB2YWwgOiB7IGRpc2FibGVkOiAhdG9Cb29sZWFuKHZhbCkgfTtcbiAgfVxuICBASW5wdXQoKSBoZWFkZXI/OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx2b2lkPiB8IG51bGw7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93SGVhZGVyID0gdHJ1ZTtcbiAgQElucHV0KCkgZm9vdGVyPzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsO1xuICBASW5wdXQoKSBib2R5SGVhZGVyPzogVGVtcGxhdGVSZWY8U1RTdGF0aXN0aWNhbFJlc3VsdHM+IHwgbnVsbDtcbiAgQElucHV0KCkgYm9keT86IFRlbXBsYXRlUmVmPFNUU3RhdGlzdGljYWxSZXN1bHRzPiB8IG51bGw7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBleHBhbmRSb3dCeUNsaWNrID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBleHBhbmRBY2NvcmRpb24gPSBmYWxzZTtcbiAgQElucHV0KCkgZXhwYW5kOiBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogTnpTYWZlQW55OyBjb2x1bW46IFNUQ29sdW1uIH0+IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG5vUmVzdWx0Pzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgcmVzcG9uc2l2ZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSByZXNwb25zaXZlSGlkZUhlYWRlckZvb3Rlcj86IGJvb2xlYW47XG4gIEBPdXRwdXQoKSByZWFkb25seSBlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8U1RFcnJvcj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U1RDaGFuZ2U+KCk7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB2aXJ0dWFsU2Nyb2xsID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dE51bWJlcigpIHZpcnR1YWxJdGVtU2l6ZSA9IDU0O1xuICBASW5wdXQoKSBASW5wdXROdW1iZXIoKSB2aXJ0dWFsTWF4QnVmZmVyUHggPSAyMDA7XG4gIEBJbnB1dCgpIEBJbnB1dE51bWJlcigpIHZpcnR1YWxNaW5CdWZmZXJQeCA9IDEwMDtcbiAgQElucHV0KCkgY3VzdG9tUmVxdWVzdD86IChvcHRpb25zOiBTVEN1c3RvbVJlcXVlc3RPcHRpb25zKSA9PiBPYnNlcnZhYmxlPE56U2FmZUFueT47XG4gIEBJbnB1dCgpIHZpcnR1YWxGb3JUcmFja0J5OiBUcmFja0J5RnVuY3Rpb248U1REYXRhPiA9IGluZGV4ID0+IGluZGV4O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiB0aGUgY3VycmVudCBwYWdlXG4gICAqL1xuICBnZXQgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkYXRhIG9mIHRoZSBjdXJyZW50IHBhZ2VcbiAgICovXG4gIGdldCBsaXN0KCk6IFNURGF0YVtdIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIGdldCBub0NvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucyA9PSBudWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBTEFJTl9JMThOX1RPS0VOKSBpMThuU3J2OiBBbGFpbkkxOE5TZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgZXhwb3J0U3J2OiBTVEV4cG9ydCxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvYzogTnpTYWZlQW55LFxuICAgIHByaXZhdGUgY29sdW1uU291cmNlOiBTVENvbHVtblNvdXJjZSxcbiAgICBwcml2YXRlIGRhdGFTb3VyY2U6IFNURGF0YVNvdXJjZSxcbiAgICBwcml2YXRlIGRlbG9uSTE4bjogRGVsb25Mb2NhbGVTZXJ2aWNlLFxuICAgIGNvbmZpZ1NydjogQWxhaW5Db25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY21zOiBOekNvbnRleHRNZW51U2VydmljZVxuICApIHtcbiAgICB0aGlzLmRlbG9uSTE4bi5jaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmxvY2FsZSA9IHRoaXMuZGVsb25JMThuLmdldERhdGEoJ3N0Jyk7XG4gICAgICBpZiAodGhpcy5fY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVG90YWxUcGwoKTtcbiAgICAgICAgdGhpcy5jZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaTE4blNydi5jaGFuZ2VcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9jb2x1bW5zLmxlbmd0aCA+IDApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVmcmVzaENvbHVtbnMoKSk7XG5cbiAgICB0aGlzLnNldENvZyhjb25maWdTcnYubWVyZ2UoJ3N0JywgU1RfREVGQVVMVF9DT05GSUcpISk7XG4gIH1cblxuICBwcml2YXRlIHNldENvZyhjb2c6IEFsYWluU1RDb25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBjb3B5TXVsdGlTb3J0ID0geyAuLi5jb2cubXVsdGlTb3J0IH07XG4gICAgLy8gQmVjYXVzZSBtdWx0aVNvcnQuZ2xvYmFsIHdpbGwgYWZmZWN0IHRoZSByZXN1bHQsIGl0IHNob3VsZCBiZSByZW1vdmVkIGZpcnN0LCBhbmQgbXVsdGlTb3J0IHdpbGwgYmUgb3BlcmF0ZWQgYWdhaW4gYWZ0ZXIgcHJvY2Vzc2luZy5cbiAgICBkZWxldGUgY29nLm11bHRpU29ydDtcbiAgICB0aGlzLmNvZyA9IGNvZztcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIGNvZyk7XG5cbiAgICBpZiAoY29weU11bHRpU29ydC5nbG9iYWwgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm11bHRpU29ydCA9IGNvcHlNdWx0aVNvcnQ7XG4gICAgfVxuICAgIHRoaXMuY29sdW1uU291cmNlLnNldENvZyhjb2cpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zZXRDb2coY29nKTtcbiAgfVxuXG4gIGNkKCk6IHRoaXMge1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaERhdGEoKTogdGhpcyB7XG4gICAgdGhpcy5fZGF0YSA9IFsuLi50aGlzLl9kYXRhXTtcbiAgICByZXR1cm4gdGhpcy5jZCgpO1xuICB9XG5cbiAgcmVuZGVyVG90YWwodG90YWw6IHN0cmluZywgcmFuZ2U6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b3RhbFRwbFxuICAgICAgPyB0aGlzLnRvdGFsVHBsLnJlcGxhY2UoJ3t7dG90YWx9fScsIHRvdGFsKS5yZXBsYWNlKCd7e3JhbmdlWzBdfX0nLCByYW5nZVswXSkucmVwbGFjZSgne3tyYW5nZVsxXX19JywgcmFuZ2VbMV0pXG4gICAgICA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VFbWl0KHR5cGU6IFNUQ2hhbmdlVHlwZSwgZGF0YT86IE56U2FmZUFueSk6IHZvaWQge1xuICAgIGNvbnN0IHJlczogU1RDaGFuZ2UgPSB7XG4gICAgICB0eXBlLFxuICAgICAgcGk6IHRoaXMucGksXG4gICAgICBwczogdGhpcy5wcyxcbiAgICAgIHRvdGFsOiB0aGlzLnRvdGFsXG4gICAgfTtcbiAgICBpZiAoZGF0YSAhPSBudWxsKSB7XG4gICAgICByZXNbdHlwZV0gPSBkYXRhO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZS5lbWl0KHJlcyk7XG4gIH1cblxuICAvLyAjcmVnaW9uIGRhdGFcblxuICAvKipcbiAgICog6I635Y+W6L+H5ruk5ZCO5omA5pyJ5pWw5o2uXG4gICAqIC0g5pys5Zyw5pWw5o2u77ya5YyF5ZCr5o6S5bqP44CB6L+H5ruk5ZCO5LiN5YiG6aG15pWw5o2uXG4gICAqIC0g6L+c56iL5pWw5o2u77ya5LiN5Lyg6YCSIGBwaWDjgIFgcHNgIOS4pOS4quWPguaVsFxuICAgKi9cbiAgZ2V0IGZpbHRlcmVkRGF0YSgpOiBQcm9taXNlPFNURGF0YVtdPiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZERhdGEoeyBwYWdpbmF0b3I6IGZhbHNlIH0gYXMgTnpTYWZlQW55KS50aGVuKHJlcyA9PiByZXMubGlzdCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvdGFsVHBsKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgdG90YWwgfSA9IHRoaXMucGFnZTtcbiAgICBpZiAodHlwZW9mIHRvdGFsID09PSAnc3RyaW5nJyAmJiB0b3RhbC5sZW5ndGgpIHtcbiAgICAgIHRoaXMudG90YWxUcGwgPSB0b3RhbDtcbiAgICB9IGVsc2UgaWYgKHRvQm9vbGVhbih0b3RhbCkpIHtcbiAgICAgIHRoaXMudG90YWxUcGwgPSB0aGlzLmxvY2FsZS50b3RhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b3RhbFRwbCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0TG9hZGluZyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nID09IG51bGwpIHtcbiAgICAgIHRoaXMuX2xvYWRpbmcgPSB2YWw7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRGF0YShvcHRpb25zPzogU1REYXRhU291cmNlT3B0aW9ucyk6IFByb21pc2U8U1REYXRhU291cmNlUmVzdWx0PiB7XG4gICAgY29uc3QgeyBwaSwgcHMsIGRhdGEsIHJlcSwgcmVzLCBwYWdlLCB0b3RhbCwgc2luZ2xlU29ydCwgbXVsdGlTb3J0LCByb3dDbGFzc05hbWUgfSA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlUHJvbWlzZSwgcmVqZWN0UHJvbWlzZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGF0YSQpIHtcbiAgICAgICAgdGhpcy5kYXRhJC51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRhdGEkID0gdGhpcy5kYXRhU291cmNlXG4gICAgICAgIC5wcm9jZXNzKHtcbiAgICAgICAgICBwaSxcbiAgICAgICAgICBwcyxcbiAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIHJlcSxcbiAgICAgICAgICByZXMsXG4gICAgICAgICAgcGFnZSxcbiAgICAgICAgICBjb2x1bW5zOiB0aGlzLl9jb2x1bW5zLFxuICAgICAgICAgIHNpbmdsZVNvcnQsXG4gICAgICAgICAgbXVsdGlTb3J0LFxuICAgICAgICAgIHJvd0NsYXNzTmFtZSxcbiAgICAgICAgICBwYWdpbmF0b3I6IHRydWUsXG4gICAgICAgICAgY3VzdG9tUmVxdWVzdDogdGhpcy5jdXN0b21SZXF1ZXN0IHx8IHRoaXMuY29nLmN1c3RvbVJlcXVlc3QsXG4gICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9KVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IHJlc3VsdCA9PiByZXNvbHZlUHJvbWlzZShyZXN1bHQpLFxuICAgICAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2Fybignc3QubG9hZERhdGUnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWplY3RQcm9taXNlKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUGFnZURhdGEoKTogUHJvbWlzZTx0aGlzPiB7XG4gICAgdGhpcy5zZXRMb2FkaW5nKHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XG4gICAgICB0aGlzLnNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgY29uc3QgdW5kZWZpbmVkU3RyaW5nID0gJ3VuZGVmaW5lZCc7XG4gICAgICBpZiAodHlwZW9mIHJlc3VsdC5waSAhPT0gdW5kZWZpbmVkU3RyaW5nKSB7XG4gICAgICAgIHRoaXMucGkgPSByZXN1bHQucGk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlc3VsdC5wcyAhPT0gdW5kZWZpbmVkU3RyaW5nKSB7XG4gICAgICAgIHRoaXMucHMgPSByZXN1bHQucHM7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlc3VsdC50b3RhbCAhPT0gdW5kZWZpbmVkU3RyaW5nKSB7XG4gICAgICAgIHRoaXMudG90YWwgPSByZXN1bHQudG90YWw7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlc3VsdC5wYWdlU2hvdyAhPT0gdW5kZWZpbmVkU3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2lzUGFnaW5hdGlvbiA9IHJlc3VsdC5wYWdlU2hvdztcbiAgICAgIH1cbiAgICAgIHRoaXMuX2RhdGEgPSByZXN1bHQubGlzdDtcbiAgICAgIHRoaXMuX3N0YXRpc3RpY2FsID0gcmVzdWx0LnN0YXRpc3RpY2FsIGFzIFNUU3RhdGlzdGljYWxSZXN1bHRzO1xuICAgICAgdGhpcy5jaGFuZ2VFbWl0KCdsb2FkZWQnLCByZXN1bHQubGlzdCk7XG4gICAgICAvLyBTaG91bGQgYmUgcmUtcmVuZGVyIGluIG5leHQgdGlrZSB3aGVuIHVzaW5nIHZpcnR1YWwgc2Nyb2xsXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbmctYWxhaW4vbmctYWxhaW4vaXNzdWVzLzE4MzZcbiAgICAgIGlmICh0aGlzLmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3JlZkNoZWNrKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICBpZiAoIXRoaXMuZGVzdHJveSQuY2xvc2VkKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5lcnJvci5lbWl0KHsgdHlwZTogJ3JlcScsIGVycm9yIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgLyoqIOa4heepuuaJgOacieaVsOaNriAqL1xuICBjbGVhcihjbGVhblN0YXR1czogYm9vbGVhbiA9IHRydWUpOiB0aGlzIHtcbiAgICBpZiAoY2xlYW5TdGF0dXMpIHtcbiAgICAgIHRoaXMuY2xlYXJTdGF0dXMoKTtcbiAgICB9XG4gICAgdGhpcy5fZGF0YSA9IFtdO1xuICAgIHJldHVybiB0aGlzLmNkKCk7XG4gIH1cblxuICAvKiog5riF56m65omA5pyJ54q25oCBICovXG4gIGNsZWFyU3RhdHVzKCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmNsZWFyQ2hlY2soKS5jbGVhclJhZGlvKCkuY2xlYXJGaWx0ZXIoKS5jbGVhclNvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7pobXnoIHph43mlrDliqDovb3mlbDmja5cbiAgICpcbiAgICogQHBhcmFtIHBpIOaMh+WumuW9k+WJjemhteegge+8jOm7mOiupO+8mmAxYFxuICAgKiBAcGFyYW0gZXh0cmFQYXJhbXMg6YeN5paw5oyH5a6aIGBleHRyYVBhcmFtc2Ag5YC8XG4gICAqIEBwYXJhbSBvcHRpb25zIOmAiemhuVxuICAgKi9cbiAgbG9hZChwaTogbnVtYmVyID0gMSwgZXh0cmFQYXJhbXM/OiBOelNhZmVBbnksIG9wdGlvbnM/OiBTVExvYWRPcHRpb25zKTogdGhpcyB7XG4gICAgaWYgKHBpICE9PSAtMSkgdGhpcy5waSA9IHBpO1xuICAgIGlmICh0eXBlb2YgZXh0cmFQYXJhbXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnJlcS5wYXJhbXMgPSBvcHRpb25zICYmIG9wdGlvbnMubWVyZ2UgPyB7IC4uLnRoaXMucmVxLnBhcmFtcywgLi4uZXh0cmFQYXJhbXMgfSA6IGV4dHJhUGFyYW1zO1xuICAgIH1cbiAgICB0aGlzLl9jaGFuZ2UoJ3BpJywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6YeN5paw5Yi35paw5b2T5YmN6aG1XG4gICAqXG4gICAqIEBwYXJhbSBleHRyYVBhcmFtcyDph43mlrDmjIflrpogYGV4dHJhUGFyYW1zYCDlgLxcbiAgICovXG4gIHJlbG9hZChleHRyYVBhcmFtcz86IE56U2FmZUFueSwgb3B0aW9ucz86IFNUTG9hZE9wdGlvbnMpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkKC0xLCBleHRyYVBhcmFtcywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog6YeN572u5LiU6YeN5paw6K6+572uIGBwaWAg5Li6IGAxYO+8jOWMheWQq+S7peS4i+WAvO+8mlxuICAgKiAtIGBjaGVja2Ag5pWw5o2uXG4gICAqIC0gYHJhZGlvYCDmlbDmja5cbiAgICogLSBgc29ydGAg5pWw5o2uXG4gICAqIC0gYGZpbGV0ZXJgIOaVsOaNrlxuICAgKlxuICAgKiBAcGFyYW0gZXh0cmFQYXJhbXMg6YeN5paw5oyH5a6aIGBleHRyYVBhcmFtc2Ag5YC8XG4gICAqL1xuICByZXNldChleHRyYVBhcmFtcz86IE56U2FmZUFueSwgb3B0aW9ucz86IFNUTG9hZE9wdGlvbnMpOiB0aGlzIHtcbiAgICB0aGlzLmNsZWFyU3RhdHVzKCkubG9hZCgxLCBleHRyYVBhcmFtcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIF90b1RvcChlbmZvcmNlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghKGVuZm9yY2UgPT0gbnVsbCA/IHRoaXMucGFnZS50b1RvcCA6IGVuZm9yY2UpKSByZXR1cm47XG4gICAgY29uc3QgZWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWwuc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAvLyBmaXggaGVhZGVyIGhlaWdodFxuICAgIHRoaXMuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgLT0gdGhpcy5wYWdlLnRvVG9wT2Zmc2V0ITtcbiAgICBpZiAodGhpcy5zY3JvbGwpIHtcbiAgICAgIGlmICh0aGlzLmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkge1xuICAgICAgICB0aGlzLmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydC5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIGxlZnQ6IDBcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbC5xdWVyeVNlbGVjdG9yKCcuYW50LXRhYmxlLWJvZHksIC5hbnQtdGFibGUtY29udGVudCcpPy5zY3JvbGxUbygwLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfY2hhbmdlKHR5cGU6ICdwaScgfCAncHMnLCBvcHRpb25zPzogU1RMb2FkT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAncGknIHx8ICh0eXBlID09PSAncHMnICYmIHRoaXMucGkgPD0gTWF0aC5jZWlsKHRoaXMudG90YWwgLyB0aGlzLnBzKSkpIHtcbiAgICAgIHRoaXMubG9hZFBhZ2VEYXRhKCkudGhlbigoKSA9PiB0aGlzLl90b1RvcChvcHRpb25zPy50b1RvcCkpO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlRW1pdCh0eXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VPdGhlckV4cGFuZChpdGVtOiBTVERhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leHBhbmRBY2NvcmRpb24gPT09IGZhbHNlKSByZXR1cm47XG4gICAgdGhpcy5fZGF0YS5maWx0ZXIoaSA9PiBpICE9PSBpdGVtKS5mb3JFYWNoKGkgPT4gKGkuZXhwYW5kID0gZmFsc2UpKTtcbiAgfVxuXG4gIF9yb3dDbGljayhlOiBFdmVudCwgaXRlbTogU1REYXRhLCBpbmRleDogbnVtYmVyLCBkYmw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gJ0lOUFVUJykgcmV0dXJuO1xuICAgIGNvbnN0IHsgZXhwYW5kLCBleHBhbmRSb3dCeUNsaWNrIH0gPSB0aGlzO1xuICAgIGlmICghIWV4cGFuZCAmJiBpdGVtLnNob3dFeHBhbmQgIT09IGZhbHNlICYmIGV4cGFuZFJvd0J5Q2xpY2spIHtcbiAgICAgIGl0ZW0uZXhwYW5kID0gIWl0ZW0uZXhwYW5kO1xuICAgICAgdGhpcy5jbG9zZU90aGVyRXhwYW5kKGl0ZW0pO1xuICAgICAgdGhpcy5jaGFuZ2VFbWl0KCdleHBhbmQnLCBpdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0geyBlLCBpdGVtLCBpbmRleCB9O1xuICAgIGlmIChkYmwpIHtcbiAgICAgIHRoaXMuY2hhbmdlRW1pdCgnZGJsQ2xpY2snLCBkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2xpY2tSb3dDbGFzc05hbWUoZWwsIGl0ZW0sIGluZGV4KTtcbiAgICAgIHRoaXMuY2hhbmdlRW1pdCgnY2xpY2snLCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbGlja1Jvd0NsYXNzTmFtZShlbDogSFRNTEVsZW1lbnQsIGl0ZW06IFNURGF0YSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNyID0gdGhpcy5jbGlja1Jvd0NsYXNzTmFtZTtcbiAgICBpZiAoY3IgPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgICAuLi4odHlwZW9mIGNyID09PSAnc3RyaW5nJyA/IHsgZm46ICgpID0+IGNyIH0gOiBjcilcbiAgICB9IGFzIFNUQ2xpY2tSb3dDbGFzc05hbWVUeXBlO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNvbmZpZy5mbihpdGVtLCBpbmRleCk7XG4gICAgY29uc3QgdHJFbCA9IGVsLmNsb3Nlc3QoJ3RyJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKGNvbmZpZy5leGNsdXNpdmUpIHtcbiAgICAgIHRyRWwucGFyZW50RWxlbWVudCEhLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykuZm9yRWFjaCgoYTogSFRNTEVsZW1lbnQpID0+IGEuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpKTtcbiAgICB9XG4gICAgaWYgKHRyRWwuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHtcbiAgICAgIHRyRWwuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ckVsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICB9XG4gIH1cblxuICBfZXhwYW5kQ2hhbmdlKGl0ZW06IFNURGF0YSwgZXhwYW5kOiBib29sZWFuKTogdm9pZCB7XG4gICAgaXRlbS5leHBhbmQgPSBleHBhbmQ7XG4gICAgdGhpcy5jbG9zZU90aGVyRXhwYW5kKGl0ZW0pO1xuICAgIHRoaXMuY2hhbmdlRW1pdCgnZXhwYW5kJywgaXRlbSk7XG4gIH1cblxuICBfc3RvcFByb3BhZ2F0aW9uKGV2OiBFdmVudCk6IHZvaWQge1xuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmQ29sQW5kRGF0YSgpOiB0aGlzIHtcbiAgICB0aGlzLl9jb2x1bW5zXG4gICAgICAuZmlsdGVyKHcgPT4gdy50eXBlID09PSAnbm8nKVxuICAgICAgLmZvckVhY2goYyA9PlxuICAgICAgICB0aGlzLl9kYXRhLmZvckVhY2goKGksIGlkeCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRleHQgPSBgJHt0aGlzLmRhdGFTb3VyY2UuZ2V0Tm9JbmRleChpLCBjLCBpZHgpfWA7XG4gICAgICAgICAgaS5fdmFsdWVzIVtjLl9fcG9pbnQhXSA9IHsgdGV4dCwgX3RleHQ6IHRleHQsIG9yZzogaWR4LCBzYWZlVHlwZTogJ3RleHQnIH0gYXMgX1NURGF0YVZhbHVlO1xuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgIHJldHVybiB0aGlzLnJlZnJlc2hEYXRhKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcm93cyBpbiB0aGUgdGFibGUsIGxpa2UgdGhpczpcbiAgICpcbiAgICogYGBgXG4gICAqIHRoaXMuc3QuYWRkUm93KHN0RGF0YUl0ZW0pXG4gICAqIGBgYFxuICAgKlxuICAgKiAqKlRJUFM6KiogRG9uJ3QgY2hhbmdlIHRoZSBgdG90YWxgIHZhbHVlLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIGByZWxvYWRgIG1ldGhvZCBpZiBuZWVkZWRcbiAgICovXG4gIGFkZFJvdyhkYXRhOiBTVERhdGEgfCBTVERhdGFbXSwgb3B0aW9ucz86IHsgaW5kZXg/OiBudW1iZXIgfSk6IHRoaXMge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkgZGF0YSA9IFtkYXRhXTtcbiAgICB0aGlzLl9kYXRhLnNwbGljZShvcHRpb25zPy5pbmRleCA/PyAwLCAwLCAuLi4oZGF0YSBhcyBTVERhdGFbXSkpO1xuICAgIHJldHVybiB0aGlzLm9wdGltaXplRGF0YSgpLl9yZWZDb2xBbmREYXRhKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgcm93IGluIHRoZSB0YWJsZSwgbGlrZSB0aGlzOlxuICAgKlxuICAgKiBgYGBcbiAgICogdGhpcy5zdC5yZW1vdmVSb3coMClcbiAgICogdGhpcy5zdC5yZW1vdmVSb3coc3REYXRhSXRlbSlcbiAgICogYGBgXG4gICAqXG4gICAqICoqVElQUzoqKiBEb24ndCBjaGFuZ2UgdGhlIGB0b3RhbGAgdmFsdWUsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgYHJlbG9hZGAgbWV0aG9kIGlmIG5lZWRlZFxuICAgKi9cbiAgcmVtb3ZlUm93KGRhdGE6IFNURGF0YSB8IFNURGF0YVtdIHwgbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5fZGF0YS5zcGxpY2UoZGF0YSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBkYXRhID0gW2RhdGFdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJEYXRhID0gdGhpcy5fZGF0YTtcbiAgICAgIGZvciAodmFyIGkgPSBjdXJEYXRhLmxlbmd0aDsgaS0tOyApIHtcbiAgICAgICAgaWYgKGRhdGEuaW5kZXhPZihjdXJEYXRhW2ldKSAhPT0gLTEpIHtcbiAgICAgICAgICBjdXJEYXRhLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVmQ2hlY2soKS5fcmVmQ29sQW5kRGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJvdyB2YWx1ZSBmb3IgdGhlIGBpbmRleGAgaW4gdGhlIHRhYmxlLCBsaWtlIHRoaXM6XG4gICAqXG4gICAqIC0gYG9wdGlub3MucmVmcmVzaFNjaGVtYWAgV2hldGhlciB0byByZWZyZXNoIG9mIHN0IHNjaGVtYXNcbiAgICogLSBgb3B0aW5vcy5lbWl0UmVsb2FkYCBXaGV0aGVyIHRvIHRyaWdnZXIgYSByZWxvYWQgaHR0cCByZXF1ZXN0IHdoZW4gZGF0YSBpcyB1cmxcbiAgICpcbiAgICogYGBgXG4gICAqIHRoaXMuc3Quc2V0Um93KDAsIHsgcHJpY2U6IDEwMCB9KVxuICAgKiB0aGlzLnN0LnNldFJvdygwLCB7IHByaWNlOiAxMDAsIG5hbWU6ICdhc2RmJyB9KVxuICAgKiB0aGlzLnN0LnNldFJvdyhpdGVtLCB7IHByaWNlOiAxMDAgfSlcbiAgICogYGBgXG4gICAqL1xuICBzZXRSb3coaW5kZXg6IG51bWJlciB8IFNURGF0YSwgaXRlbTogU1REYXRhLCBvcHRpb25zPzogeyByZWZyZXNoU2NoZW1hPzogYm9vbGVhbjsgZW1pdFJlbG9hZD86IGJvb2xlYW4gfSk6IHRoaXMge1xuICAgIG9wdGlvbnMgPSB7IHJlZnJlc2hTY2hlbWE6IGZhbHNlLCBlbWl0UmVsb2FkOiBmYWxzZSwgLi4ub3B0aW9ucyB9O1xuICAgIGlmICh0eXBlb2YgaW5kZXggIT09ICdudW1iZXInKSB7XG4gICAgICBpbmRleCA9IHRoaXMuX2RhdGEuaW5kZXhPZihpbmRleCk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGFbaW5kZXhdID0gZGVlcE1lcmdlS2V5KHRoaXMuX2RhdGFbaW5kZXhdLCBmYWxzZSwgaXRlbSk7XG4gICAgdGhpcy5vcHRpbWl6ZURhdGEoKTtcbiAgICBpZiAob3B0aW9ucy5yZWZyZXNoU2NoZW1hKSB7XG4gICAgICB0aGlzLnJlc2V0Q29sdW1ucyh7IGVtaXRSZWxvYWQ6IG9wdGlvbnMuZW1pdFJlbG9hZCB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoRGF0YSgpO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gc29ydFxuXG4gIHNvcnQoY29sOiBfU1RDb2x1bW4sIGlkeDogbnVtYmVyLCB2YWx1ZTogTnpTYWZlQW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXVsdGlTb3J0KSB7XG4gICAgICBjb2wuX3NvcnQuZGVmYXVsdCA9IHZhbHVlO1xuICAgICAgY29sLl9zb3J0LnRpY2sgPSB0aGlzLmRhdGFTb3VyY2UubmV4dFNvcnRUaWNrO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb2x1bW5zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiAoaXRlbS5fc29ydC5kZWZhdWx0ID0gaW5kZXggPT09IGlkeCA/IHZhbHVlIDogbnVsbCkpO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5sb2FkUGFnZURhdGEoKTtcbiAgICBjb25zdCByZXMgPSB7XG4gICAgICB2YWx1ZSxcbiAgICAgIG1hcDogdGhpcy5kYXRhU291cmNlLmdldFJlcVNvcnRNYXAodGhpcy5zaW5nbGVTb3J0LCB0aGlzLm11bHRpU29ydCwgdGhpcy5fY29sdW1ucyksXG4gICAgICBjb2x1bW46IGNvbFxuICAgIH07XG4gICAgdGhpcy5jaGFuZ2VFbWl0KCdzb3J0JywgcmVzKTtcbiAgfVxuXG4gIGNsZWFyU29ydCgpOiB0aGlzIHtcbiAgICB0aGlzLl9jb2x1bW5zLmZvckVhY2goaXRlbSA9PiAoaXRlbS5fc29ydC5kZWZhdWx0ID0gbnVsbCkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gZmlsdGVyXG5cbiAgX2hhbmRsZUZpbHRlcihjb2w6IF9TVENvbHVtbiwgY29uZmlybTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghY29uZmlybSkge1xuICAgICAgdGhpcy5jb2x1bW5Tb3VyY2UuY2xlYW5GaWx0ZXIoY29sKTtcbiAgICB9XG4gICAgLy8g6L+H5ruk6KGo56S65LiA56eN5pWw5o2u55qE5Y+Y5YyW5bqU6YeN572u6aG156CB5Li6IGAxYFxuICAgIHRoaXMucGkgPSAxO1xuICAgIHRoaXMuY29sdW1uU291cmNlLnVwZGF0ZURlZmF1bHQoY29sLmZpbHRlciEpO1xuICAgIHRoaXMubG9hZFBhZ2VEYXRhKCk7XG4gICAgdGhpcy5jaGFuZ2VFbWl0KCdmaWx0ZXInLCBjb2wpO1xuICB9XG5cbiAgaGFuZGxlRmlsdGVyTm90aWZ5KHZhbHVlPzogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlRW1pdCgnZmlsdGVyQ2hhbmdlJywgdmFsdWUpO1xuICB9XG5cbiAgY2xlYXJGaWx0ZXIoKTogdGhpcyB7XG4gICAgdGhpcy5fY29sdW1ucy5maWx0ZXIodyA9PiB3LmZpbHRlciAmJiB3LmZpbHRlci5kZWZhdWx0ID09PSB0cnVlKS5mb3JFYWNoKGNvbCA9PiB0aGlzLmNvbHVtblNvdXJjZS5jbGVhbkZpbHRlcihjb2wpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBjaGVja2JveFxuXG4gIC8qKiDmuIXpmaTmiYDmnIkgYGNoZWNrYm94YCAqL1xuICBjbGVhckNoZWNrKCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmNoZWNrQWxsKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZkNoZWNrKCk6IHRoaXMge1xuICAgIGNvbnN0IHZhbGlkRGF0YSA9IHRoaXMuX2RhdGEuZmlsdGVyKHcgPT4gIXcuZGlzYWJsZWQpO1xuICAgIGNvbnN0IGNoZWNrZWRMaXN0ID0gdmFsaWREYXRhLmZpbHRlcih3ID0+IHcuY2hlY2tlZCA9PT0gdHJ1ZSk7XG4gICAgdGhpcy5fYWxsQ2hlY2tlZCA9IGNoZWNrZWRMaXN0Lmxlbmd0aCA+IDAgJiYgY2hlY2tlZExpc3QubGVuZ3RoID09PSB2YWxpZERhdGEubGVuZ3RoO1xuICAgIGNvbnN0IGFsbFVuQ2hlY2tlZCA9IHZhbGlkRGF0YS5ldmVyeSh2YWx1ZSA9PiAhdmFsdWUuY2hlY2tlZCk7XG4gICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9ICF0aGlzLl9hbGxDaGVja2VkICYmICFhbGxVbkNoZWNrZWQ7XG4gICAgdGhpcy5fYWxsQ2hlY2tlZERpc2FibGVkID0gdGhpcy5fZGF0YS5sZW5ndGggPT09IHRoaXMuX2RhdGEuZmlsdGVyKHcgPT4gdy5kaXNhYmxlZCkubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLmNkKCk7XG4gIH1cblxuICBjaGVja0FsbChjaGVja2VkPzogYm9vbGVhbik6IHRoaXMge1xuICAgIGNoZWNrZWQgPSB0eXBlb2YgY2hlY2tlZCA9PT0gJ3VuZGVmaW5lZCcgPyB0aGlzLl9hbGxDaGVja2VkIDogY2hlY2tlZDtcbiAgICB0aGlzLl9kYXRhLmZpbHRlcih3ID0+ICF3LmRpc2FibGVkKS5mb3JFYWNoKGkgPT4gKGkuY2hlY2tlZCA9IGNoZWNrZWQpKTtcbiAgICByZXR1cm4gdGhpcy5fcmVmQ2hlY2soKS5fY2hlY2tOb3RpZnkoKS5yZWZyZXNoRGF0YSgpO1xuICB9XG5cbiAgX3Jvd1NlbGVjdGlvbihyb3c6IFNUQ29sdW1uU2VsZWN0aW9uKTogdGhpcyB7XG4gICAgcm93LnNlbGVjdCh0aGlzLl9kYXRhKTtcbiAgICByZXR1cm4gdGhpcy5fcmVmQ2hlY2soKS5fY2hlY2tOb3RpZnkoKTtcbiAgfVxuXG4gIF9jaGVja05vdGlmeSgpOiB0aGlzIHtcbiAgICBjb25zdCByZXMgPSB0aGlzLl9kYXRhLmZpbHRlcih3ID0+ICF3LmRpc2FibGVkICYmIHcuY2hlY2tlZCA9PT0gdHJ1ZSk7XG4gICAgdGhpcy5jaGFuZ2VFbWl0KCdjaGVja2JveCcsIHJlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiByYWRpb1xuXG4gIC8qKiDmuIXpmaTmiYDmnIkgYHJhZGlvYCAqL1xuICBjbGVhclJhZGlvKCk6IHRoaXMge1xuICAgIHRoaXMuX2RhdGEuZmlsdGVyKHcgPT4gdy5jaGVja2VkKS5mb3JFYWNoKGl0ZW0gPT4gKGl0ZW0uY2hlY2tlZCA9IGZhbHNlKSk7XG4gICAgdGhpcy5jaGFuZ2VFbWl0KCdyYWRpbycsIG51bGwpO1xuICAgIHJldHVybiB0aGlzLnJlZnJlc2hEYXRhKCk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgX2hhbmRsZVRkKGV2OiBfU1RUZE5vdGlmeSk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXYudHlwZSkge1xuICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICB0aGlzLl9yZWZDaGVjaygpLl9jaGVja05vdGlmeSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JhZGlvJzpcbiAgICAgICAgdGhpcy5jaGFuZ2VFbWl0KCdyYWRpbycsIGV2Lml0ZW0pO1xuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vICNyZWdpb24gZXhwb3J0XG5cbiAgLyoqXG4gICAqIOWvvOWHuuW9k+WJjemhte+8jOehruS/neW3sue7j+azqOWGjCBgWGxzeE1vZHVsZWBcbiAgICpcbiAgICogQHBhcmFtIG5ld0RhdGEg6YeN5paw5oyH5a6a5pWw5o2u77yb6Iul5Li6IGB0cnVlYCDooajnpLrkvb/nlKggYGZpbHRlcmVkRGF0YWAg5pWw5o2uXG4gICAqIEBwYXJhbSBvcHQg6aKd5aSW5Y+C5pWwXG4gICAqL1xuICBleHBvcnQobmV3RGF0YT86IFNURGF0YVtdIHwgdHJ1ZSwgb3B0PzogU1RFeHBvcnRPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YSA9IEFycmF5LmlzQXJyYXkobmV3RGF0YSlcbiAgICAgID8gdGhpcy5kYXRhU291cmNlLm9wdGltaXplRGF0YSh7IGNvbHVtbnM6IHRoaXMuX2NvbHVtbnMsIHJlc3VsdDogbmV3RGF0YSB9KVxuICAgICAgOiB0aGlzLl9kYXRhO1xuICAgIChuZXdEYXRhID09PSB0cnVlID8gZnJvbSh0aGlzLmZpbHRlcmVkRGF0YSkgOiBvZihkYXRhKSkuc3Vic2NyaWJlKChyZXM6IFNURGF0YVtdKSA9PlxuICAgICAgdGhpcy5leHBvcnRTcnYuZXhwb3J0KHtcbiAgICAgICAgY29sdW1lbnM6IHRoaXMuX2NvbHVtbnMsXG4gICAgICAgIC4uLm9wdCxcbiAgICAgICAgZGF0YTogcmVzXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiByZXNpemFibGVcblxuICBjb2xSZXNpemUoeyB3aWR0aCB9OiBOelJlc2l6ZUV2ZW50LCBjb2x1bW46IF9TVENvbHVtbik6IHZvaWQge1xuICAgIGNvbHVtbi53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICB0aGlzLmNoYW5nZUVtaXQoJ3Jlc2l6ZScsIGNvbHVtbik7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBjb250ZXh0bWVudVxuICBvbkNvbnRleHRtZW51KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHRtZW51KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgY29sRWwgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCdbZGF0YS1jb2wtaW5kZXhdJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFjb2xFbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb2xJbmRleCA9IE51bWJlcihjb2xFbC5kYXRhc2V0LmNvbEluZGV4KTtcbiAgICBjb25zdCByb3dJbmRleCA9IE51bWJlcigoY29sRWwuY2xvc2VzdCgndHInKSBhcyBIVE1MRWxlbWVudCkuZGF0YXNldC5pbmRleCk7XG4gICAgY29uc3QgaXNUaXRsZSA9IGlzTmFOKHJvd0luZGV4KTtcbiAgICBjb25zdCBvYnMkID0gdGhpcy5jb250ZXh0bWVudSh7XG4gICAgICBldmVudCxcbiAgICAgIHR5cGU6IGlzVGl0bGUgPyAnaGVhZCcgOiAnYm9keScsXG4gICAgICByb3dJbmRleDogaXNUaXRsZSA/IG51bGwgOiByb3dJbmRleCxcbiAgICAgIGNvbEluZGV4LFxuICAgICAgZGF0YTogaXNUaXRsZSA/IG51bGwgOiB0aGlzLmxpc3Rbcm93SW5kZXhdLFxuICAgICAgY29sdW1uOiB0aGlzLl9jb2x1bW5zW2NvbEluZGV4XVxuICAgIH0pO1xuICAgIChpc09ic2VydmFibGUob2JzJCkgPyBvYnMkIDogb2Yob2JzJCkpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIocmVzID0+IHJlcy5sZW5ndGggPiAwKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICB0aGlzLmNvbnRleHRtZW51TGlzdCA9IHJlcy5tYXAoaSA9PiB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGkuY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICBpLmNoaWxkcmVuID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLmNtcy5jcmVhdGUoZXZlbnQsIHRoaXMuY29udGV4dG1lbnVUcGwpO1xuICAgICAgfSk7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGdldCBjZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQoKTogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IHtcbiAgICByZXR1cm4gdGhpcy5vcmdUYWJsZS5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQhO1xuICB9XG5cbiAgcmVzZXRDb2x1bW5zKG9wdGlvbnM/OiBTVFJlc2V0Q29sdW1uc09wdGlvbik6IFByb21pc2U8dGhpcz4ge1xuICAgIG9wdGlvbnMgPSB7IGVtaXRSZWxvYWQ6IHRydWUsIHByZUNsZWFyRGF0YTogZmFsc2UsIC4uLm9wdGlvbnMgfTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuY29sdW1ucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY29sdW1ucyA9IG9wdGlvbnMuY29sdW1ucztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnBpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5waSA9IG9wdGlvbnMucGk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5wcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMucHMgPSBvcHRpb25zLnBzO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5lbWl0UmVsb2FkKSB7XG4gICAgICAvLyBTaG91bGQgY2xlYW4gZGF0YSwgQmVjYXVzZSBvZiBjaGFuZ2luZyBjb2x1bW5zIG1heSBjYXVzZSBpbmFjY3VyYXRlIGRhdGFcbiAgICAgIG9wdGlvbnMucHJlQ2xlYXJEYXRhID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucHJlQ2xlYXJEYXRhKSB7XG4gICAgICB0aGlzLl9kYXRhID0gW107XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaENvbHVtbnMoKTtcbiAgICBpZiAob3B0aW9ucy5lbWl0UmVsb2FkKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkUGFnZURhdGEoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jZCgpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hDb2x1bW5zKCk6IHRoaXMge1xuICAgIGNvbnN0IHJlcyA9IHRoaXMuY29sdW1uU291cmNlLnByb2Nlc3ModGhpcy5jb2x1bW5zIGFzIF9TVENvbHVtbltdLCB7XG4gICAgICB3aWR0aE1vZGU6IHRoaXMud2lkdGhNb2RlLFxuICAgICAgcmVzaXphYmxlOiB0aGlzLl9yZXNpemFibGUsXG4gICAgICBzYWZlVHlwZTogdGhpcy5jb2cuc2FmZVR5cGUgYXMgU1RDb2x1bW5TYWZlVHlwZVxuICAgIH0pO1xuICAgIHRoaXMuX2NvbHVtbnMgPSByZXMuY29sdW1ucztcbiAgICB0aGlzLl9oZWFkZXJzID0gcmVzLmhlYWRlcnM7XG4gICAgaWYgKHRoaXMuY3VzdG9tV2lkdGhDb25maWcgPT09IGZhbHNlICYmIHJlcy5oZWFkZXJXaWR0aHMgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fd2lkdGhDb25maWcgPSByZXMuaGVhZGVyV2lkdGhzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgb3B0aW1pemVEYXRhKCk6IHRoaXMge1xuICAgIHRoaXMuX2RhdGEgPSB0aGlzLmRhdGFTb3VyY2Uub3B0aW1pemVEYXRhKHtcbiAgICAgIGNvbHVtbnM6IHRoaXMuX2NvbHVtbnMsXG4gICAgICByZXN1bHQ6IHRoaXMuX2RhdGEsXG4gICAgICByb3dDbGFzc05hbWU6IHRoaXMucm93Q2xhc3NOYW1lXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHB1cmUgZGF0YSwgYHN0YCBpbnRlcm5hbGx5IG1haW50YWlucyBhIHNldCBvZiBkYXRhIGZvciBjYWNoaW5nLCB0aGlzIHBhcnQgb2YgZGF0YSBtYXkgYWZmZWN0IHRoZSBiYWNrZW5kXG4gICAqXG4gICAqIOi/lOWbnue6r+WHgOaVsOaNru+8jGBzdGAg5YaF6YOo5Lya57u05oqk5LiA57uE55So5LqO57yT5a2Y55qE5pWw5o2u77yM6L+Z6YOo5YiG5pWw5o2u5Y+v6IO95Lya5b2x5ZON5ZCO56uvXG4gICAqL1xuICBwdXJlSXRlbShpdGVtT3JJbmRleDogU1REYXRhIHwgbnVtYmVyKTogU1REYXRhIHwgbnVsbCB7XG4gICAgaWYgKHR5cGVvZiBpdGVtT3JJbmRleCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGl0ZW1PckluZGV4ID0gdGhpcy5fZGF0YVtpdGVtT3JJbmRleF07XG4gICAgfVxuICAgIGlmICghaXRlbU9ySW5kZXgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb3B5SXRlbSA9IGRlZXBDb3B5KGl0ZW1PckluZGV4KTtcbiAgICBbJ192YWx1ZXMnLCAnX3Jvd0NsYXNzTmFtZSddLmZvckVhY2goa2V5ID0+IGRlbGV0ZSBjb3B5SXRlbVtrZXldKTtcbiAgICByZXR1cm4gY29weUl0ZW07XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb2x1bW5Tb3VyY2UucmVzdG9yZUFsbFJlbmRlcih0aGlzLl9jb2x1bW5zKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW1AgaW4ga2V5b2YgdGhpc10/OiBTaW1wbGVDaGFuZ2UgfSAmIFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5jb2x1bW5zKSB7XG4gICAgICB0aGlzLnJlZnJlc2hDb2x1bW5zKCkub3B0aW1pemVEYXRhKCk7XG4gICAgfVxuICAgIGNvbnN0IGNoYW5nZURhdGEgPSBjaGFuZ2VzLmRhdGE7XG4gICAgaWYgKGNoYW5nZURhdGEgJiYgY2hhbmdlRGF0YS5jdXJyZW50VmFsdWUgJiYgISh0aGlzLnJlcS5sYXp5TG9hZCAmJiBjaGFuZ2VEYXRhLmZpcnN0Q2hhbmdlKSkge1xuICAgICAgdGhpcy5sb2FkUGFnZURhdGEoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubG9hZGluZykge1xuICAgICAgdGhpcy5fbG9hZGluZyA9IGNoYW5nZXMubG9hZGluZy5jdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0LXRkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0LXRkLmNvbXBvbmVudC5odG1sJyxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFNUVGRDb21wb25lbnQge1xuICBASW5wdXQoKSBjITogX1NUQ29sdW1uO1xuICBASW5wdXQoKSBjSWR4ITogbnVtYmVyO1xuICBASW5wdXQoKSBkYXRhITogU1REYXRhW107XG4gIEBJbnB1dCgpIGkhOiBTVERhdGE7XG4gIEBJbnB1dCgpIGluZGV4ITogbnVtYmVyO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbiA9IG5ldyBFdmVudEVtaXR0ZXI8X1NUVGROb3RpZnk+KCk7XG5cbiAgcHJpdmF0ZSBnZXQgcm91dGVyU3RhdGUoKTogeyBwaTogbnVtYmVyOyBwczogbnVtYmVyOyB0b3RhbDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHsgcGksIHBzLCB0b3RhbCB9ID0gdGhpcy5zdENvbXA7XG4gICAgcmV0dXJuIHsgcGksIHBzLCB0b3RhbCB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEhvc3QoKSBwcml2YXRlIHN0Q29tcDogU1RDb21wb25lbnQsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIG1vZGFsSGVscGVyOiBNb2RhbEhlbHBlcixcbiAgICBwcml2YXRlIGRyYXdlckhlbHBlcjogRHJhd2VySGVscGVyXG4gICkge31cblxuICBwcml2YXRlIHJlcG9ydCh0eXBlOiBfU1RUZE5vdGlmeVR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLm4uZW1pdCh7IHR5cGUsIGl0ZW06IHRoaXMuaSwgY29sOiB0aGlzLmMgfSk7XG4gIH1cblxuICBfY2hlY2tib3godmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmkuY2hlY2tlZCA9IHZhbHVlO1xuICAgIHRoaXMucmVwb3J0KCdjaGVja2JveCcpO1xuICB9XG5cbiAgX3JhZGlvKCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5maWx0ZXIodyA9PiAhdy5kaXNhYmxlZCkuZm9yRWFjaChpID0+IChpLmNoZWNrZWQgPSBmYWxzZSkpO1xuICAgIHRoaXMuaS5jaGVja2VkID0gdHJ1ZTtcbiAgICB0aGlzLnJlcG9ydCgncmFkaW8nKTtcbiAgfVxuXG4gIF9saW5rKGU6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgdGhpcy5fc3RvcFByb3BhZ2F0aW9uKGUpO1xuICAgIGNvbnN0IHJlcyA9IHRoaXMuYy5jbGljayEodGhpcy5pLCB0aGlzLnN0Q29tcCk7XG4gICAgaWYgKHR5cGVvZiByZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHJlcywgeyBzdGF0ZTogdGhpcy5yb3V0ZXJTdGF0ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX3N0b3BQcm9wYWdhdGlvbihldjogRXZlbnQpOiB2b2lkIHtcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgX2J0bihidG46IFNUQ29sdW1uQnV0dG9uLCBldj86IEV2ZW50KTogdm9pZCB7XG4gICAgZXY/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGNvZyA9IHRoaXMuc3RDb21wLmNvZztcbiAgICBsZXQgcmVjb3JkID0gdGhpcy5pO1xuICAgIGlmIChidG4udHlwZSA9PT0gJ21vZGFsJyB8fCBidG4udHlwZSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIGlmIChjb2cubW9kYWwhLnB1cmVSZWNvYXJkID09PSB0cnVlKSB7XG4gICAgICAgIHJlY29yZCA9IHRoaXMuc3RDb21wLnB1cmVJdGVtKHJlY29yZCkhO1xuICAgICAgfVxuICAgICAgY29uc3QgbW9kYWwgPSBidG4ubW9kYWwhO1xuICAgICAgY29uc3Qgb2JqID0geyBbbW9kYWwucGFyYW1zTmFtZSFdOiByZWNvcmQgfTtcbiAgICAgICh0aGlzLm1vZGFsSGVscGVyW2J0bi50eXBlID09PSAnbW9kYWwnID8gJ2NyZWF0ZScgOiAnY3JlYXRlU3RhdGljJ10gYXMgTnpTYWZlQW55KShcbiAgICAgICAgbW9kYWwuY29tcG9uZW50LFxuICAgICAgICB7IC4uLm9iaiwgLi4uKG1vZGFsLnBhcmFtcyAmJiBtb2RhbC5wYXJhbXMocmVjb3JkKSkgfSxcbiAgICAgICAgZGVlcE1lcmdlS2V5KHt9LCB0cnVlLCBjb2cubW9kYWwsIG1vZGFsKVxuICAgICAgKVxuICAgICAgICAucGlwZShmaWx0ZXIodyA9PiB0eXBlb2YgdyAhPT0gJ3VuZGVmaW5lZCcpKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXM6IE56U2FmZUFueSkgPT4gdGhpcy5idG5DYWxsYmFjayhyZWNvcmQsIGJ0biwgcmVzKSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChidG4udHlwZSA9PT0gJ2RyYXdlcicpIHtcbiAgICAgIGlmIChjb2cuZHJhd2VyIS5wdXJlUmVjb2FyZCA9PT0gdHJ1ZSkge1xuICAgICAgICByZWNvcmQgPSB0aGlzLnN0Q29tcC5wdXJlSXRlbShyZWNvcmQpITtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRyYXdlciA9IGJ0bi5kcmF3ZXIhO1xuICAgICAgY29uc3Qgb2JqID0geyBbZHJhd2VyLnBhcmFtc05hbWUhXTogcmVjb3JkIH07XG4gICAgICB0aGlzLmRyYXdlckhlbHBlclxuICAgICAgICAuY3JlYXRlKFxuICAgICAgICAgIGRyYXdlci50aXRsZSEsXG4gICAgICAgICAgZHJhd2VyLmNvbXBvbmVudCxcbiAgICAgICAgICB7IC4uLm9iaiwgLi4uKGRyYXdlci5wYXJhbXMgJiYgZHJhd2VyLnBhcmFtcyhyZWNvcmQpKSB9LFxuICAgICAgICAgIGRlZXBNZXJnZUtleSh7fSwgdHJ1ZSwgY29nLmRyYXdlciwgZHJhd2VyKVxuICAgICAgICApXG4gICAgICAgIC5waXBlKGZpbHRlcih3ID0+IHR5cGVvZiB3ICE9PSAndW5kZWZpbmVkJykpXG4gICAgICAgIC5zdWJzY3JpYmUocmVzID0+IHRoaXMuYnRuQ2FsbGJhY2socmVjb3JkLCBidG4sIHJlcykpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoYnRuLnR5cGUgPT09ICdsaW5rJykge1xuICAgICAgY29uc3QgY2xpY2tSZXMgPSB0aGlzLmJ0bkNhbGxiYWNrKHJlY29yZCwgYnRuKTtcbiAgICAgIGlmICh0eXBlb2YgY2xpY2tSZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoY2xpY2tSZXMsIHsgc3RhdGU6IHRoaXMucm91dGVyU3RhdGUgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYnRuQ2FsbGJhY2socmVjb3JkLCBidG4pO1xuICB9XG5cbiAgcHJpdmF0ZSBidG5DYWxsYmFjayhyZWNvcmQ6IFNURGF0YSwgYnRuOiBTVENvbHVtbkJ1dHRvbiwgbW9kYWw/OiBOelNhZmVBbnkpOiBOelNhZmVBbnkge1xuICAgIGlmICghYnRuLmNsaWNrKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBidG4uY2xpY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzd2l0Y2ggKGJ0bi5jbGljaykge1xuICAgICAgICBjYXNlICdsb2FkJzpcbiAgICAgICAgICB0aGlzLnN0Q29tcC5sb2FkKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JlbG9hZCc6XG4gICAgICAgICAgdGhpcy5zdENvbXAucmVsb2FkKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidG4uY2xpY2socmVjb3JkLCBtb2RhbCwgdGhpcy5zdENvbXApO1xuICAgIH1cbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICN0aXRsZVRwbCBsZXQtaT5cbiAgPHNwYW4gW2lubmVySFRNTF09XCJpLl90ZXh0XCI+PC9zcGFuPlxuICA8c21hbGwgKm5nSWY9XCJpLm9wdGlvbmFsXCIgY2xhc3M9XCJzdF9faGVhZC1vcHRpb25hbFwiIFtpbm5lckhUTUxdPVwiaS5vcHRpb25hbFwiPjwvc21hbGw+XG4gIDxpXG4gICAgKm5nSWY9XCJpLm9wdGlvbmFsSGVscFwiXG4gICAgY2xhc3M9XCJzdF9faGVhZC10aXBcIlxuICAgIG56LXRvb2x0aXBcbiAgICBbbnpUb29sdGlwVGl0bGVdPVwiaS5vcHRpb25hbEhlbHBcIlxuICAgIG56LWljb25cbiAgICBuelR5cGU9XCJxdWVzdGlvbi1jaXJjbGVcIlxuICA+PC9pPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjY2hrQWxsVHBsIGxldC1jdXN0b20+XG4gIDxsYWJlbFxuICAgIG56LWNoZWNrYm94XG4gICAgY2xhc3M9XCJzdF9fY2hlY2thbGxcIlxuICAgIFtuekRpc2FibGVkXT1cIl9hbGxDaGVja2VkRGlzYWJsZWRcIlxuICAgIFsobmdNb2RlbCldPVwiX2FsbENoZWNrZWRcIlxuICAgIFtuekluZGV0ZXJtaW5hdGVdPVwiX2luZGV0ZXJtaW5hdGVcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrQWxsKClcIlxuICAgIFtjbGFzcy5hbnQtdGFibGUtc2VsZWN0aW9uLXNlbGVjdC1hbGwtY3VzdG9tXT1cImN1c3RvbVwiXG4gID48L2xhYmVsPlxuPC9uZy10ZW1wbGF0ZT5cbjxuei10YWJsZVxuICAjdGFibGVcbiAgW256RGF0YV09XCJfZGF0YVwiXG4gIFsobnpQYWdlSW5kZXgpXT1cInBpXCJcbiAgKG56UGFnZUluZGV4Q2hhbmdlKT1cIl9jaGFuZ2UoJ3BpJylcIlxuICBbKG56UGFnZVNpemUpXT1cInBzXCJcbiAgKG56UGFnZVNpemVDaGFuZ2UpPVwiX2NoYW5nZSgncHMnKVwiXG4gIFtuelRvdGFsXT1cInRvdGFsXCJcbiAgW256U2hvd1BhZ2luYXRpb25dPVwiX2lzUGFnaW5hdGlvblwiXG4gIFtuekZyb250UGFnaW5hdGlvbl09XCJmYWxzZVwiXG4gIFtuekJvcmRlcmVkXT1cImJvcmRlcmVkXCJcbiAgW256U2l6ZV09XCJzaXplXCJcbiAgW256TG9hZGluZ109XCJub0NvbHVtbnMgfHwgX2xvYWRpbmdcIlxuICBbbnpMb2FkaW5nRGVsYXldPVwibG9hZGluZ0RlbGF5XCJcbiAgW256TG9hZGluZ0luZGljYXRvcl09XCJsb2FkaW5nSW5kaWNhdG9yXCJcbiAgW256VGl0bGVdPVwiaGVhZGVyIVwiXG4gIFtuekZvb3Rlcl09XCJmb290ZXIhXCJcbiAgW256U2Nyb2xsXT1cInNjcm9sbFwiXG4gIFtuelZpcnR1YWxJdGVtU2l6ZV09XCJ2aXJ0dWFsSXRlbVNpemVcIlxuICBbbnpWaXJ0dWFsTWF4QnVmZmVyUHhdPVwidmlydHVhbE1heEJ1ZmZlclB4XCJcbiAgW256VmlydHVhbE1pbkJ1ZmZlclB4XT1cInZpcnR1YWxNaW5CdWZmZXJQeFwiXG4gIFtuelZpcnR1YWxGb3JUcmFja0J5XT1cInZpcnR1YWxGb3JUcmFja0J5XCJcbiAgW256Tm9SZXN1bHRdPVwibm9SZXN1bHQhXCJcbiAgW256UGFnZVNpemVPcHRpb25zXT1cInBhZ2UucGFnZVNpemVzIVwiXG4gIFtuelNob3dRdWlja0p1bXBlcl09XCJwYWdlLnNob3dRdWlja0p1bXBlclwiXG4gIFtuelNob3dTaXplQ2hhbmdlcl09XCJwYWdlLnNob3dTaXplXCJcbiAgW256UGFnaW5hdGlvblBvc2l0aW9uXT1cInBhZ2UucG9zaXRpb24hXCJcbiAgW256UGFnaW5hdGlvblR5cGVdPVwicGFnZS50eXBlIVwiXG4gIFtuekl0ZW1SZW5kZXJdPVwicGFnZS5pdGVtUmVuZGVyIVwiXG4gIFtuelNpbXBsZV09XCJwYWdlLnNpbXBsZVwiXG4gIFtuelNob3dUb3RhbF09XCJ0b3RhbFRwbFwiXG4gIFtueldpZHRoQ29uZmlnXT1cIl93aWR0aENvbmZpZ1wiXG4gIChjb250ZXh0bWVudSk9XCJvbkNvbnRleHRtZW51KCRldmVudClcIlxuICBbY2xhc3Muc3RfX25vLWNvbHVtbl09XCJub0NvbHVtbnNcIlxuPlxuICA8dGhlYWQgKm5nSWY9XCJzaG93SGVhZGVyXCI+XG4gICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgX2hlYWRlcnM7IGxldCByb3dGaXJzdCA9IGZpcnN0XCI+XG4gICAgICA8dGggKm5nSWY9XCJyb3dGaXJzdCAmJiBleHBhbmRcIiBueldpZHRoPVwiNTBweFwiIFtyb3dTcGFuXT1cIl9oZWFkZXJzLmxlbmd0aFwiPjwvdGg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoIG9mIHJvdzsgbGV0IGluZGV4ID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxuICAgICAgICA8dGhcbiAgICAgICAgICAqbGV0PVwiaC5jb2x1bW4gYXMgX2NcIlxuICAgICAgICAgIFtjb2xTcGFuXT1cImguY29sU3BhblwiXG4gICAgICAgICAgW3Jvd1NwYW5dPVwiaC5yb3dTcGFuXCJcbiAgICAgICAgICBbbnpXaWR0aF09XCIkYW55KF9jKS53aWR0aFwiXG4gICAgICAgICAgW256TGVmdF09XCJfYy5fbGVmdCFcIlxuICAgICAgICAgIFtuelJpZ2h0XT1cIl9jLl9yaWdodCFcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIl9jLl9jbGFzc05hbWVcIlxuICAgICAgICAgIFthdHRyLmRhdGEtY29sXT1cIl9jLmluZGV4S2V5XCJcbiAgICAgICAgICBbYXR0ci5kYXRhLWNvbC1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgW256U2hvd1NvcnRdPVwiX2MuX3NvcnQuZW5hYmxlZFwiXG4gICAgICAgICAgW256U29ydE9yZGVyXT1cIiRhbnkoX2MpLl9zb3J0LmRlZmF1bHRcIlxuICAgICAgICAgIChuelNvcnRPcmRlckNoYW5nZSk9XCJzb3J0KF9jLCBpbmRleCwgJGV2ZW50KVwiXG4gICAgICAgICAgW256Q3VzdG9tRmlsdGVyXT1cIiEhX2MuZmlsdGVyXCJcbiAgICAgICAgICBbY2xhc3Muc3RfX2hhcy1maWx0ZXJdPVwiX2MuZmlsdGVyXCJcbiAgICAgICAgICBuei1yZXNpemFibGVcbiAgICAgICAgICBbbnpEaXNhYmxlZF09XCJsYXN0IHx8ICRhbnkoX2MpLnJlc2l6YWJsZS5kaXNhYmxlZFwiXG4gICAgICAgICAgW256TWF4V2lkdGhdPVwiJGFueShfYykucmVzaXphYmxlLm1heFdpZHRoXCJcbiAgICAgICAgICBbbnpNaW5XaWR0aF09XCIkYW55KF9jKS5yZXNpemFibGUubWluV2lkdGhcIlxuICAgICAgICAgIFtuekJvdW5kc109XCIkYW55KF9jKS5yZXNpemFibGUuYm91bmRzXCJcbiAgICAgICAgICBbbnpQcmV2aWV3XT1cIiRhbnkoX2MpLnJlc2l6YWJsZS5wcmV2aWV3XCJcbiAgICAgICAgICAobnpSZXNpemVFbmQpPVwiY29sUmVzaXplKCRldmVudCwgX2MpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuei1yZXNpemUtaGFuZGxlICpuZ0lmPVwiJGFueSghbGFzdCAmJiAhJGFueShfYykucmVzaXphYmxlLmRpc2FibGVkKVwiIG56RGlyZWN0aW9uPVwicmlnaHRcIj5cbiAgICAgICAgICAgIDxpPjwvaT5cbiAgICAgICAgICA8L256LXJlc2l6ZS1oYW5kbGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjcmVuZGVyVGl0bGVcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIl9jLl9fcmVuZGVyVGl0bGUhXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaC5jb2x1bW4sIGluZGV4OiBpbmRleCB9XCJcbiAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIV9jLl9fcmVuZGVyVGl0bGU7IGVsc2UgcmVuZGVyVGl0bGVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIl9jLnR5cGVcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJfYy5zZWxlY3Rpb25zIS5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGtBbGxUcGxcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGZhbHNlIH1cIj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIl9jLnNlbGVjdGlvbnMhLmxlbmd0aCA+IDBcIiBjbGFzcz1cImFudC10YWJsZS1zZWxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGtBbGxUcGxcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHRydWUgfVwiPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJfYy5zZWxlY3Rpb25zIS5sZW5ndGhcIiBjbGFzcz1cImFudC10YWJsZS1zZWxlY3Rpb24tZXh0cmFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIG56LWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgbnpQbGFjZW1lbnQ9XCJib3R0b21MZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbnpEcm9wZG93bk1lbnVdPVwic2VsZWN0aW9uTWVudVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbnQtdGFibGUtc2VsZWN0aW9uLWRvd24gc3RfX2NoZWNrYWxsLXNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIG56VHlwZT1cImRvd25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8bnotZHJvcGRvd24tbWVudSAjc2VsZWN0aW9uTWVudT1cIm56RHJvcGRvd25NZW51XCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBuei1tZW51IGNsYXNzPVwiYW50LXRhYmxlLXNlbGVjdGlvbi1tZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICBuei1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBydyBvZiBfYy5zZWxlY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfcm93U2VsZWN0aW9uKHJ3KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInJ3LnRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgPC9uei1kcm9wZG93bi1tZW51PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGl0bGVUcGxcIlxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBfYy50aXRsZSB9XCJcbiAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiX2MuZmlsdGVyXCI+XG4gICAgICAgICAgICA8c3QtZmlsdGVyXG4gICAgICAgICAgICAgIG56LXRoLWV4dHJhXG4gICAgICAgICAgICAgIFtjb2xdPVwiaC5jb2x1bW5cIlxuICAgICAgICAgICAgICBbZl09XCJfYy5maWx0ZXJcIlxuICAgICAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgICAgIChuKT1cImhhbmRsZUZpbHRlck5vdGlmeSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGhhbmRsZSk9XCJfaGFuZGxlRmlsdGVyKF9jLCAkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3N0LWZpbHRlcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90aD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdHI+XG4gIDwvdGhlYWQ+XG4gIDx0Ym9keSBjbGFzcz1cInN0X19ib2R5XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFfbG9hZGluZ1wiPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJvZHlIZWFkZXIhXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBfc3RhdGlzdGljYWwgfVwiXG4gICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2JvZHlUcGwgbGV0LWkgbGV0LWluZGV4PVwiaW5kZXhcIj5cbiAgICAgIDx0clxuICAgICAgICBbYXR0ci5kYXRhLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgKGNsaWNrKT1cIl9yb3dDbGljaygkZXZlbnQsIGksIGluZGV4LCBmYWxzZSlcIlxuICAgICAgICAoZGJsY2xpY2spPVwiX3Jvd0NsaWNrKCRldmVudCwgaSwgaW5kZXgsIHRydWUpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiaS5fcm93Q2xhc3NOYW1lXCJcbiAgICAgID5cbiAgICAgICAgPHRkXG4gICAgICAgICAgKm5nSWY9XCJleHBhbmRcIlxuICAgICAgICAgIFtuelNob3dFeHBhbmRdPVwiZXhwYW5kICYmIGkuc2hvd0V4cGFuZCAhPT0gZmFsc2VcIlxuICAgICAgICAgIFtuekV4cGFuZF09XCJpLmV4cGFuZFwiXG4gICAgICAgICAgKG56RXhwYW5kQ2hhbmdlKT1cIl9leHBhbmRDaGFuZ2UoaSwgJGV2ZW50KVwiXG4gICAgICAgICAgKGNsaWNrKT1cIl9zdG9wUHJvcGFnYXRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgbnpXaWR0aD1cIjUwcHhcIlxuICAgICAgICA+PC90ZD5cbiAgICAgICAgPHRkXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGMgb2YgX2NvbHVtbnM7IGxldCBjSWR4ID0gaW5kZXhcIlxuICAgICAgICAgIFtuekxlZnRdPVwiISFjLl9sZWZ0XCJcbiAgICAgICAgICBbbnpSaWdodF09XCIhIWMuX3JpZ2h0XCJcbiAgICAgICAgICBbYXR0ci5kYXRhLWNvbC1pbmRleF09XCJjSWR4XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJjLl9jbGFzc05hbWVcIlxuICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiYy5jb2xTcGFuXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwicmVzcG9uc2l2ZVwiIGNsYXNzPVwiYW50LXRhYmxlLXJlcF9fdGl0bGVcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aXRsZVRwbFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogYy50aXRsZSB9XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHN0LXRkIFtkYXRhXT1cIl9kYXRhXCIgW2ldPVwiaVwiIFtpbmRleF09XCJpbmRleFwiIFtjXT1cImNcIiBbY0lkeF09XCJjSWR4XCIgKG4pPVwiX2hhbmRsZVRkKCRldmVudClcIj48L3N0LXRkPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICAgIDx0ciBbbnpFeHBhbmRdPVwiaS5leHBhbmRcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZXhwYW5kXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGksIGluZGV4OiBpbmRleCB9XCJcbiAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF2aXJ0dWFsU2Nyb2xsXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpIG9mIF9kYXRhOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiYm9keVRwbFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaSwgaW5kZXg6IGluZGV4IH1cIj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2aXJ0dWFsU2Nyb2xsXCI+XG4gICAgICA8bmctdGVtcGxhdGUgbnotdmlydHVhbC1zY3JvbGwgbGV0LWkgbGV0LWluZGV4PVwiaW5kZXhcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJvZHlUcGxcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGksIGluZGV4OiBpbmRleCB9XCI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhX2xvYWRpbmdcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJib2R5IVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogX3N0YXRpc3RpY2FsIH1cIj48L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3Rib2R5PlxuICA8bmctdGVtcGxhdGUgI3RvdGFsVHBsIGxldC1yYW5nZT1cInJhbmdlXCIgbGV0LXRvdGFsPnt7IHJlbmRlclRvdGFsKHRvdGFsLCByYW5nZSkgfX08L25nLXRlbXBsYXRlPlxuPC9uei10YWJsZT5cbjxuei1kcm9wZG93bi1tZW51ICNjb250ZXh0bWVudVRwbD1cIm56RHJvcGRvd25NZW51XCI+XG4gIDx1bCBuei1tZW51IGNsYXNzPVwic3RfX2NvbnRleHRtZW51XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaSBvZiBjb250ZXh0bWVudUxpc3RcIj5cbiAgICAgIDxsaSBuei1tZW51LWl0ZW0gKm5nSWY9XCJpLmNoaWxkcmVuIS5sZW5ndGggPT09IDBcIiAoY2xpY2spPVwiaS5mbiEoaSlcIiBbaW5uZXJIVE1MXT1cImkudGV4dFwiPjwvbGk+XG4gICAgICA8bGkgbnotc3VibWVudSAqbmdJZj1cImkuY2hpbGRyZW4hLmxlbmd0aCA+IDBcIiBbbnpUaXRsZV09XCJpLnRleHRcIj5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaSBuei1tZW51LWl0ZW0gKm5nRm9yPVwibGV0IGNpIG9mIGkuY2hpbGRyZW5cIiAoY2xpY2spPVwiY2kuZm4hKGNpKVwiIFtpbm5lckhUTUxdPVwiY2kudGV4dFwiPjwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2xpPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3VsPlxuPC9uei1kcm9wZG93bi1tZW51PlxuIiwiPG5nLXRlbXBsYXRlICNidG5UcGwgbGV0LWkgbGV0LWNoaWxkPVwiY2hpbGRcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpLnRvb2x0aXBcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiYnRuSXRlbVRwbFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaSB9XCI+PC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxzcGFuICpuZ0lmPVwiaS50b29sdGlwXCIgbnotdG9vbHRpcCBbbnpUb29sdGlwVGl0bGVdPVwiaS50b29sdGlwXCIgW2NsYXNzLmQtYmxvY2tdPVwiY2hpbGRcIiBbY2xhc3Mud2lkdGgtMTAwXT1cImNoaWxkXCI+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ0bkl0ZW1UcGxcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGkgfVwiPjwvbmctdGVtcGxhdGU+XG4gIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2J0bkl0ZW1UcGwgbGV0LWk+XG4gIDxhXG4gICAgKm5nSWY9XCJpLnBvcFwiXG4gICAgbnotcG9wY29uZmlybVxuICAgIFtuelBvcGNvbmZpcm1UaXRsZV09XCJpLnBvcC50aXRsZVwiXG4gICAgW256SWNvbl09XCJpLnBvcC5pY29uXCJcbiAgICBbbnpDb25kaXRpb25dPVwiaS5wb3AuY29uZGl0aW9uKGkpXCJcbiAgICBbbnpDYW5jZWxUZXh0XT1cImkucG9wLmNhbmNlbFRleHRcIlxuICAgIFtuek9rVGV4dF09XCJpLnBvcC5va1RleHRcIlxuICAgIFtuek9rVHlwZV09XCJpLnBvcC5va1R5cGVcIlxuICAgIChuek9uQ29uZmlybSk9XCJfYnRuKGkpXCJcbiAgICBjbGFzcz1cInN0X19idG4tdGV4dFwiXG4gICAgW25nQ2xhc3NdPVwiaS5jbGFzc05hbWVcIlxuICAgIChjbGljayk9XCJfc3RvcFByb3BhZ2F0aW9uKCRldmVudClcIlxuICA+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ0blRleHRUcGxcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGkgfVwiPjwvbmctdGVtcGxhdGU+XG4gIDwvYT5cbiAgPGEgKm5nSWY9XCIhaS5wb3BcIiAoY2xpY2spPVwiX2J0bihpLCAkZXZlbnQpXCIgY2xhc3M9XCJzdF9fYnRuLXRleHRcIiBbbmdDbGFzc109XCJpLmNsYXNzTmFtZVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJidG5UZXh0VHBsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBpIH1cIj48L25nLXRlbXBsYXRlPlxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNidG5UZXh0VHBsIGxldC1pPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaS5pY29uXCI+XG4gICAgPGlcbiAgICAgICpuZ0lmPVwiIWkuaWNvbi5pY29uZm9udFwiXG4gICAgICBuei1pY29uXG4gICAgICBbbnpUeXBlXT1cImkuaWNvbi50eXBlXCJcbiAgICAgIFtuelRoZW1lXT1cImkuaWNvbi50aGVtZVwiXG4gICAgICBbbnpTcGluXT1cImkuaWNvbi5zcGluXCJcbiAgICAgIFtuelR3b3RvbmVDb2xvcl09XCJpLmljb24udHdvVG9uZUNvbG9yXCJcbiAgICA+PC9pPlxuICAgIDxpICpuZ0lmPVwiaS5pY29uLmljb25mb250XCIgbnotaWNvbiBbbnpJY29uZm9udF09XCJpLmljb24uaWNvbmZvbnRcIj48L2k+XG4gIDwvbmctY29udGFpbmVyPlxuICA8c3BhbiBbaW5uZXJIVE1MXT1cImkuX3RleHRcIiBbbmdDbGFzc109XCJ7ICdwbC14cyc6IGkuaWNvbiB9XCI+PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZVxuICAjcmVuZGVyXG4gIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImMuX19yZW5kZXIhXCJcbiAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBpLCBpbmRleDogaW5kZXgsIGNvbHVtbjogYyB9XCJcbj48L25nLXRlbXBsYXRlPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjLl9fcmVuZGVyOyBlbHNlIHJlbmRlclwiPlxuICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjLnR5cGVcIj5cbiAgICA8bGFiZWxcbiAgICAgICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCJcbiAgICAgIG56LWNoZWNrYm94XG4gICAgICBbbnpEaXNhYmxlZF09XCJpLmRpc2FibGVkXCJcbiAgICAgIFtuZ01vZGVsXT1cImkuY2hlY2tlZFwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJfY2hlY2tib3goJGV2ZW50KVwiXG4gICAgPjwvbGFiZWw+XG4gICAgPGxhYmVsXG4gICAgICAqbmdTd2l0Y2hDYXNlPVwiJ3JhZGlvJ1wiXG4gICAgICBuei1yYWRpb1xuICAgICAgW256RGlzYWJsZWRdPVwiaS5kaXNhYmxlZFwiXG4gICAgICBbbmdNb2RlbF09XCJpLmNoZWNrZWRcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiX3JhZGlvKClcIlxuICAgID48L2xhYmVsPlxuICAgIDxhXG4gICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2xpbmsnXCJcbiAgICAgIChjbGljayk9XCJfbGluaygkZXZlbnQpXCJcbiAgICAgIFtpbm5lckhUTUxdPVwiaS5fdmFsdWVzW2NJZHhdLl90ZXh0XCJcbiAgICAgIFthdHRyLnRpdGxlXT1cImkuX3ZhbHVlc1tjSWR4XS50ZXh0XCJcbiAgICA+PC9hPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpLl92YWx1ZXNbY0lkeF0udGV4dFwiPlxuICAgICAgPG56LXRhZyAqbmdTd2l0Y2hDYXNlPVwiJ3RhZydcIiBbbnpDb2xvcl09XCJpLl92YWx1ZXNbY0lkeF0uY29sb3JcIj5cbiAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJpLl92YWx1ZXNbY0lkeF0uX3RleHRcIj48L3NwYW4+XG4gICAgICA8L256LXRhZz5cbiAgICAgIDxuei1iYWRnZSAqbmdTd2l0Y2hDYXNlPVwiJ2JhZGdlJ1wiIFtuelN0YXR1c109XCJpLl92YWx1ZXNbY0lkeF0uY29sb3JcIiBbbnpUZXh0XT1cImkuX3ZhbHVlc1tjSWR4XS50ZXh0XCI+PC9uei1iYWRnZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgKm5nU3dpdGNoQ2FzZT1cIid3aWRnZXQnXCIgc3Qtd2lkZ2V0LWhvc3QgW3JlY29yZF09XCJpXCIgW2NvbHVtbl09XCJjXCI+PC9uZy10ZW1wbGF0ZVxuICAgID48bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICA8c3BhblxuICAgICAgICAqbmdJZj1cImMuc2FmZVR5cGUgIT09ICd0ZXh0J1wiXG4gICAgICAgIFtpbm5lckhUTUxdPVwiaS5fdmFsdWVzW2NJZHhdLl90ZXh0XCJcbiAgICAgICAgW2F0dHIudGl0bGVdPVwiYy5faXNUcnVuY2F0ZSA/IGkuX3ZhbHVlc1tjSWR4XS50ZXh0IDogbnVsbFwiXG4gICAgICA+PC9zcGFuPlxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nSWY9XCJjLnNhZmVUeXBlID09PSAndGV4dCdcIlxuICAgICAgICBbaW5uZXJUZXh0XT1cImkuX3ZhbHVlc1tjSWR4XS5fdGV4dFwiXG4gICAgICAgIFthdHRyLnRpdGxlXT1cImMuX2lzVHJ1bmNhdGUgPyBpLl92YWx1ZXNbY0lkeF0udGV4dCA6IG51bGxcIlxuICAgICAgPjwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBpLl92YWx1ZXNbY0lkeF0uYnV0dG9uczsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgPGEgKm5nSWY9XCJidG4uY2hpbGRyZW4hLmxlbmd0aCA+IDBcIiBuei1kcm9wZG93biBbbnpEcm9wZG93bk1lbnVdPVwiYnRuTWVudVwiIG56T3ZlcmxheUNsYXNzTmFtZT1cInN0X19idG4tc3ViXCI+XG4gICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImJ0bi5fdGV4dFwiPjwvc3Bhbj5cbiAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiZG93blwiPjwvaT5cbiAgICA8L2E+XG4gICAgPG56LWRyb3Bkb3duLW1lbnUgI2J0bk1lbnU9XCJuekRyb3Bkb3duTWVudVwiPlxuICAgICAgPHVsIG56LW1lbnU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YkJ0biBvZiBidG4uY2hpbGRyZW4hXCI+XG4gICAgICAgICAgPGxpICpuZ0lmPVwic3ViQnRuLnR5cGUgIT09ICdkaXZpZGVyJ1wiIG56LW1lbnUtaXRlbSBbY2xhc3Muc3RfX2J0bi1kaXNhYmxlZF09XCJzdWJCdG4uX2Rpc2FibGVkXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiYnRuVHBsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBzdWJCdG4sIGNoaWxkOiB0cnVlIH1cIj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgICA8bGkgKm5nSWY9XCJzdWJCdG4udHlwZSA9PT0gJ2RpdmlkZXInXCIgbnotbWVudS1kaXZpZGVyPjwvbGk+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC91bD5cbiAgICA8L256LWRyb3Bkb3duLW1lbnU+XG4gICAgPHNwYW4gKm5nSWY9XCJidG4uY2hpbGRyZW4hLmxlbmd0aCA9PT0gMFwiIFtjbGFzcy5zdF9fYnRuLWRpc2FibGVkXT1cImJ0bi5fZGlzYWJsZWRcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJidG5UcGxcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGJ0biwgY2hpbGQ6IGZhbHNlIH1cIj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9zcGFuPlxuICAgIDxuei1kaXZpZGVyICpuZ0lmPVwiIWxhc3RcIiBuelR5cGU9XCJ2ZXJ0aWNhbFwiPjwvbnotZGl2aWRlcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==