@ajf/material 13.0.0-next.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 (350) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +6 -0
  3. package/barcode/_barcode.scss +0 -0
  4. package/barcode/barcode-module.d.ts +23 -0
  5. package/barcode/barcode.d.ts +30 -0
  6. package/barcode/index.d.ts +4 -0
  7. package/barcode/index.metadata.json +1 -0
  8. package/barcode/package.json +9 -0
  9. package/barcode/public-api.d.ts +23 -0
  10. package/bundles/material-barcode.umd.js +433 -0
  11. package/bundles/material-barcode.umd.js.map +1 -0
  12. package/bundles/material-calendar.umd.js +435 -0
  13. package/bundles/material-calendar.umd.js.map +1 -0
  14. package/bundles/material-checkbox-group.umd.js +432 -0
  15. package/bundles/material-checkbox-group.umd.js.map +1 -0
  16. package/bundles/material-form-builder.umd.js +3558 -0
  17. package/bundles/material-form-builder.umd.js.map +1 -0
  18. package/bundles/material-forms.umd.js +968 -0
  19. package/bundles/material-forms.umd.js.map +1 -0
  20. package/bundles/material-image.umd.js +420 -0
  21. package/bundles/material-image.umd.js.map +1 -0
  22. package/bundles/material-monaco-editor.umd.js +755 -0
  23. package/bundles/material-monaco-editor.umd.js.map +1 -0
  24. package/bundles/material-node-icon.umd.js +415 -0
  25. package/bundles/material-node-icon.umd.js.map +1 -0
  26. package/bundles/material-page-slider.umd.js +424 -0
  27. package/bundles/material-page-slider.umd.js.map +1 -0
  28. package/bundles/material-report-builder.umd.js +5814 -0
  29. package/bundles/material-report-builder.umd.js.map +1 -0
  30. package/bundles/material-reports.umd.js +731 -0
  31. package/bundles/material-reports.umd.js.map +1 -0
  32. package/bundles/material-time.umd.js +424 -0
  33. package/bundles/material-time.umd.js.map +1 -0
  34. package/bundles/material.umd.js +40 -0
  35. package/bundles/material.umd.js.map +1 -0
  36. package/calendar/_calendar.scss +0 -0
  37. package/calendar/calendar-module.d.ts +23 -0
  38. package/calendar/calendar.d.ts +30 -0
  39. package/calendar/index.d.ts +4 -0
  40. package/calendar/index.metadata.json +1 -0
  41. package/calendar/package.json +9 -0
  42. package/calendar/public-api.d.ts +23 -0
  43. package/checkbox-group/_checkbox-group.scss +0 -0
  44. package/checkbox-group/checkbox-group-item.d.ts +25 -0
  45. package/checkbox-group/checkbox-group-module.d.ts +23 -0
  46. package/checkbox-group/index.d.ts +4 -0
  47. package/checkbox-group/index.metadata.json +1 -0
  48. package/checkbox-group/package.json +9 -0
  49. package/checkbox-group/public-api.d.ts +23 -0
  50. package/esm2015/barcode/barcode-module.js +50 -0
  51. package/esm2015/barcode/barcode.externs.js +6 -0
  52. package/esm2015/barcode/barcode.js +52 -0
  53. package/esm2015/barcode/index.js +5 -0
  54. package/esm2015/barcode/public-api.js +24 -0
  55. package/esm2015/calendar/calendar-module.js +48 -0
  56. package/esm2015/calendar/calendar.externs.js +6 -0
  57. package/esm2015/calendar/calendar.js +55 -0
  58. package/esm2015/calendar/index.js +5 -0
  59. package/esm2015/calendar/public-api.js +24 -0
  60. package/esm2015/checkbox-group/checkbox-group-item.js +51 -0
  61. package/esm2015/checkbox-group/checkbox-group-module.js +47 -0
  62. package/esm2015/checkbox-group/checkbox-group.externs.js +6 -0
  63. package/esm2015/checkbox-group/index.js +5 -0
  64. package/esm2015/checkbox-group/public-api.js +24 -0
  65. package/esm2015/form-builder/branch-line.js +73 -0
  66. package/esm2015/form-builder/choices-origin-data-source.js +38 -0
  67. package/esm2015/form-builder/choices-origin-editor-dialog.js +57 -0
  68. package/esm2015/form-builder/choices-origin-editor.js +78 -0
  69. package/esm2015/form-builder/condition-editor-dialog.js +59 -0
  70. package/esm2015/form-builder/condition-editor.js +143 -0
  71. package/esm2015/form-builder/form-builder-module.js +96 -0
  72. package/esm2015/form-builder/form-builder-service.js +764 -0
  73. package/esm2015/form-builder/form-builder-utils.js +63 -0
  74. package/esm2015/form-builder/form-builder.externs.js +6 -0
  75. package/esm2015/form-builder/form-builder.js +187 -0
  76. package/esm2015/form-builder/index.js +16 -0
  77. package/esm2015/form-builder/node-entry.js +245 -0
  78. package/esm2015/form-builder/node-properties.js +968 -0
  79. package/esm2015/form-builder/node-type-entry.js +50 -0
  80. package/esm2015/form-builder/operations.js +23 -0
  81. package/esm2015/form-builder/public-api.js +26 -0
  82. package/esm2015/form-builder/string-identifier-dialog.js +94 -0
  83. package/esm2015/form-builder/validation-condition-editor-dialog.js +59 -0
  84. package/esm2015/form-builder/warning-condition-editor-dialog.js +59 -0
  85. package/esm2015/forms/barcode-field.js +43 -0
  86. package/esm2015/forms/boolean-field.js +43 -0
  87. package/esm2015/forms/date-field.js +43 -0
  88. package/esm2015/forms/date-input-field.js +65 -0
  89. package/esm2015/forms/empty-field.js +43 -0
  90. package/esm2015/forms/field-service.js +115 -0
  91. package/esm2015/forms/field-warning-dialog.js +32 -0
  92. package/esm2015/forms/field.js +45 -0
  93. package/esm2015/forms/form.js +46 -0
  94. package/esm2015/forms/forms-module.js +107 -0
  95. package/esm2015/forms/forms.externs.js +6 -0
  96. package/esm2015/forms/index.js +9 -0
  97. package/esm2015/forms/input-field.js +43 -0
  98. package/esm2015/forms/multiple-choice-field.js +44 -0
  99. package/esm2015/forms/public-api.js +37 -0
  100. package/esm2015/forms/range-field.js +45 -0
  101. package/esm2015/forms/single-choice-field.js +44 -0
  102. package/esm2015/forms/table-field.js +43 -0
  103. package/esm2015/forms/text-field.js +43 -0
  104. package/esm2015/forms/time-field.js +43 -0
  105. package/esm2015/forms/video-url-field.js +47 -0
  106. package/esm2015/forms/warning-alert-service.js +42 -0
  107. package/esm2015/image/image-module.js +42 -0
  108. package/esm2015/image/image.externs.js +6 -0
  109. package/esm2015/image/image.js +44 -0
  110. package/esm2015/image/index.js +5 -0
  111. package/esm2015/image/public-api.js +24 -0
  112. package/esm2015/index.js +28 -0
  113. package/esm2015/material.externs.js +0 -0
  114. package/esm2015/monaco-editor/auto-complete-item-model.js +44 -0
  115. package/esm2015/monaco-editor/autocomplete-singleton-model.js +134 -0
  116. package/esm2015/monaco-editor/editor-language-model.js +60 -0
  117. package/esm2015/monaco-editor/editor-options-model.js +27 -0
  118. package/esm2015/monaco-editor/editor-scrollbar-options.js +23 -0
  119. package/esm2015/monaco-editor/editor-theme.js +30 -0
  120. package/esm2015/monaco-editor/index.js +5 -0
  121. package/esm2015/monaco-editor/monaco-editor-module.js +36 -0
  122. package/esm2015/monaco-editor/monaco-editor.externs.js +6 -0
  123. package/esm2015/monaco-editor/monaco-editor.js +389 -0
  124. package/esm2015/monaco-editor/public-api.js +24 -0
  125. package/esm2015/node-icon/index.js +5 -0
  126. package/esm2015/node-icon/node-icon-module.js +42 -0
  127. package/esm2015/node-icon/node-icon.externs.js +6 -0
  128. package/esm2015/node-icon/node-icon.js +35 -0
  129. package/esm2015/node-icon/public-api.js +24 -0
  130. package/esm2015/page-slider/index.js +5 -0
  131. package/esm2015/page-slider/page-slider-module.js +49 -0
  132. package/esm2015/page-slider/page-slider.externs.js +6 -0
  133. package/esm2015/page-slider/page-slider.js +44 -0
  134. package/esm2015/page-slider/public-api.js +24 -0
  135. package/esm2015/report-builder/column.js +97 -0
  136. package/esm2015/report-builder/condition-editor.js +159 -0
  137. package/esm2015/report-builder/content.js +255 -0
  138. package/esm2015/report-builder/custom-widget-dialog.js +51 -0
  139. package/esm2015/report-builder/custom-widget-toolbar-button.js +70 -0
  140. package/esm2015/report-builder/custom-widgets-toolbar.js +124 -0
  141. package/esm2015/report-builder/forms-analyzer-dialog.js +315 -0
  142. package/esm2015/report-builder/forms-analyzer.js +264 -0
  143. package/esm2015/report-builder/image-filter.js +32 -0
  144. package/esm2015/report-builder/image-group.js +106 -0
  145. package/esm2015/report-builder/index.js +25 -0
  146. package/esm2015/report-builder/models.js +23 -0
  147. package/esm2015/report-builder/operations.js +23 -0
  148. package/esm2015/report-builder/properties.js +765 -0
  149. package/esm2015/report-builder/public-api.js +26 -0
  150. package/esm2015/report-builder/quill-editor.js +299 -0
  151. package/esm2015/report-builder/renderer-widget.js +238 -0
  152. package/esm2015/report-builder/report-builder-drag-data.js +23 -0
  153. package/esm2015/report-builder/report-builder-module.js +114 -0
  154. package/esm2015/report-builder/report-builder-service.js +1685 -0
  155. package/esm2015/report-builder/report-builder.externs.js +6 -0
  156. package/esm2015/report-builder/report-builder.js +69 -0
  157. package/esm2015/report-builder/theme-color-dialog.js +90 -0
  158. package/esm2015/report-builder/theme-color.js +215 -0
  159. package/esm2015/report-builder/tokens.js +24 -0
  160. package/esm2015/report-builder/toolbar-dialog.js +56 -0
  161. package/esm2015/report-builder/toolbar.js +90 -0
  162. package/esm2015/report-builder/utils.js +48 -0
  163. package/esm2015/report-builder/widget-toolbar-button.js +47 -0
  164. package/esm2015/report-builder/widgets-row-buttons.js +133 -0
  165. package/esm2015/report-builder/widgets-toolbar.js +79 -0
  166. package/esm2015/reports/chart-widget.js +41 -0
  167. package/esm2015/reports/formula-widget.js +41 -0
  168. package/esm2015/reports/image-container-widget.js +43 -0
  169. package/esm2015/reports/image-widget.js +41 -0
  170. package/esm2015/reports/index.js +5 -0
  171. package/esm2015/reports/layout-widget.js +22 -0
  172. package/esm2015/reports/map-widget.js +41 -0
  173. package/esm2015/reports/page-break-widget.js +41 -0
  174. package/esm2015/reports/public-api.js +33 -0
  175. package/esm2015/reports/report.js +41 -0
  176. package/esm2015/reports/reports-module.js +79 -0
  177. package/esm2015/reports/reports.externs.js +6 -0
  178. package/esm2015/reports/table-widget.js +41 -0
  179. package/esm2015/reports/text-widget.js +41 -0
  180. package/esm2015/reports/widget.js +120 -0
  181. package/esm2015/time/index.js +5 -0
  182. package/esm2015/time/public-api.js +24 -0
  183. package/esm2015/time/time-module.js +44 -0
  184. package/esm2015/time/time.externs.js +6 -0
  185. package/esm2015/time/time.js +46 -0
  186. package/fesm2015/barcode.js +129 -0
  187. package/fesm2015/barcode.js.map +1 -0
  188. package/fesm2015/calendar.js +128 -0
  189. package/fesm2015/calendar.js.map +1 -0
  190. package/fesm2015/checkbox-group.js +124 -0
  191. package/fesm2015/checkbox-group.js.map +1 -0
  192. package/fesm2015/form-builder.js +2987 -0
  193. package/fesm2015/form-builder.js.map +1 -0
  194. package/fesm2015/forms.js +923 -0
  195. package/fesm2015/forms.js.map +1 -0
  196. package/fesm2015/image.js +113 -0
  197. package/fesm2015/image.js.map +1 -0
  198. package/fesm2015/material.js +30 -0
  199. package/fesm2015/material.js.map +1 -0
  200. package/fesm2015/monaco-editor.js +741 -0
  201. package/fesm2015/monaco-editor.js.map +1 -0
  202. package/fesm2015/node-icon.js +104 -0
  203. package/fesm2015/node-icon.js.map +1 -0
  204. package/fesm2015/page-slider.js +119 -0
  205. package/fesm2015/page-slider.js.map +1 -0
  206. package/fesm2015/report-builder.js +5332 -0
  207. package/fesm2015/report-builder.js.map +1 -0
  208. package/fesm2015/reports.js +560 -0
  209. package/fesm2015/reports.js.map +1 -0
  210. package/fesm2015/time.js +116 -0
  211. package/fesm2015/time.js.map +1 -0
  212. package/form-builder/_form-builder.scss +0 -0
  213. package/form-builder/branch-line.d.ts +36 -0
  214. package/form-builder/choices-origin-data-source.d.ts +35 -0
  215. package/form-builder/choices-origin-editor-dialog.d.ts +34 -0
  216. package/form-builder/choices-origin-editor.d.ts +43 -0
  217. package/form-builder/condition-editor-dialog.d.ts +35 -0
  218. package/form-builder/condition-editor.d.ts +37 -0
  219. package/form-builder/form-builder-module.d.ts +23 -0
  220. package/form-builder/form-builder-service.d.ts +191 -0
  221. package/form-builder/form-builder-utils.d.ts +41 -0
  222. package/form-builder/form-builder.d.ts +78 -0
  223. package/form-builder/index.d.ts +15 -0
  224. package/form-builder/index.metadata.json +1 -0
  225. package/form-builder/node-entry.d.ts +93 -0
  226. package/form-builder/node-properties.d.ts +184 -0
  227. package/form-builder/node-type-entry.d.ts +30 -0
  228. package/form-builder/operations.d.ts +31 -0
  229. package/form-builder/package.json +9 -0
  230. package/form-builder/public-api.d.ts +25 -0
  231. package/form-builder/string-identifier-dialog.d.ts +45 -0
  232. package/form-builder/validation-condition-editor-dialog.d.ts +36 -0
  233. package/form-builder/warning-condition-editor-dialog.d.ts +36 -0
  234. package/forms/_forms.scss +0 -0
  235. package/forms/barcode-field.d.ts +27 -0
  236. package/forms/boolean-field.d.ts +27 -0
  237. package/forms/date-field.d.ts +27 -0
  238. package/forms/date-input-field.d.ts +34 -0
  239. package/forms/empty-field.d.ts +27 -0
  240. package/forms/field-service.d.ts +25 -0
  241. package/forms/field-warning-dialog.d.ts +24 -0
  242. package/forms/field.d.ts +30 -0
  243. package/forms/form.d.ts +36 -0
  244. package/forms/forms-module.d.ts +25 -0
  245. package/forms/index.d.ts +8 -0
  246. package/forms/index.metadata.json +1 -0
  247. package/forms/input-field.d.ts +27 -0
  248. package/forms/multiple-choice-field.d.ts +27 -0
  249. package/forms/package.json +9 -0
  250. package/forms/public-api.d.ts +36 -0
  251. package/forms/range-field.d.ts +28 -0
  252. package/forms/single-choice-field.d.ts +27 -0
  253. package/forms/table-field.d.ts +27 -0
  254. package/forms/text-field.d.ts +27 -0
  255. package/forms/time-field.d.ts +27 -0
  256. package/forms/video-url-field.d.ts +29 -0
  257. package/forms/warning-alert-service.d.ts +29 -0
  258. package/image/_image.scss +0 -0
  259. package/image/image-module.d.ts +23 -0
  260. package/image/image.d.ts +27 -0
  261. package/image/index.d.ts +4 -0
  262. package/image/index.metadata.json +1 -0
  263. package/image/package.json +9 -0
  264. package/image/public-api.d.ts +23 -0
  265. package/index.d.ts +22 -0
  266. package/monaco-editor/_monaco-editor.scss +0 -0
  267. package/monaco-editor/auto-complete-item-model.d.ts +35 -0
  268. package/monaco-editor/autocomplete-singleton-model.d.ts +55 -0
  269. package/monaco-editor/editor-language-model.d.ts +59 -0
  270. package/monaco-editor/editor-options-model.d.ts +334 -0
  271. package/monaco-editor/editor-scrollbar-options.d.ts +83 -0
  272. package/monaco-editor/editor-theme.d.ts +29 -0
  273. package/monaco-editor/index.d.ts +4 -0
  274. package/monaco-editor/index.metadata.json +1 -0
  275. package/monaco-editor/monaco-editor-module.d.ts +23 -0
  276. package/monaco-editor/monaco-editor.d.ts +152 -0
  277. package/monaco-editor/package.json +9 -0
  278. package/monaco-editor/public-api.d.ts +23 -0
  279. package/node-icon/_node-icon.scss +0 -0
  280. package/node-icon/index.d.ts +4 -0
  281. package/node-icon/index.metadata.json +1 -0
  282. package/node-icon/node-icon-module.d.ts +23 -0
  283. package/node-icon/node-icon.d.ts +24 -0
  284. package/node-icon/package.json +9 -0
  285. package/node-icon/public-api.d.ts +23 -0
  286. package/package.json +38 -0
  287. package/page-slider/_page-slider.scss +0 -0
  288. package/page-slider/index.d.ts +4 -0
  289. package/page-slider/index.metadata.json +1 -0
  290. package/page-slider/package.json +9 -0
  291. package/page-slider/page-slider-module.d.ts +23 -0
  292. package/page-slider/page-slider.d.ts +30 -0
  293. package/page-slider/public-api.d.ts +23 -0
  294. package/report-builder/_report-builder.scss +0 -0
  295. package/report-builder/column.d.ts +63 -0
  296. package/report-builder/condition-editor.d.ts +67 -0
  297. package/report-builder/content.d.ts +142 -0
  298. package/report-builder/custom-widget-dialog.d.ts +31 -0
  299. package/report-builder/custom-widget-toolbar-button.d.ts +45 -0
  300. package/report-builder/custom-widgets-toolbar.d.ts +71 -0
  301. package/report-builder/forms-analyzer-dialog.d.ts +91 -0
  302. package/report-builder/forms-analyzer.d.ts +102 -0
  303. package/report-builder/image-filter.d.ts +25 -0
  304. package/report-builder/image-group.d.ts +69 -0
  305. package/report-builder/index.d.ts +24 -0
  306. package/report-builder/index.metadata.json +1 -0
  307. package/report-builder/models.d.ts +43 -0
  308. package/report-builder/operations.d.ts +45 -0
  309. package/report-builder/package.json +9 -0
  310. package/report-builder/properties.d.ts +365 -0
  311. package/report-builder/public-api.d.ts +26 -0
  312. package/report-builder/quill-editor.d.ts +113 -0
  313. package/report-builder/renderer-widget.d.ts +80 -0
  314. package/report-builder/report-builder-drag-data.d.ts +32 -0
  315. package/report-builder/report-builder-module.d.ts +23 -0
  316. package/report-builder/report-builder-service.d.ts +722 -0
  317. package/report-builder/report-builder.d.ts +36 -0
  318. package/report-builder/theme-color-dialog.d.ts +42 -0
  319. package/report-builder/theme-color.d.ts +108 -0
  320. package/report-builder/tokens.d.ts +24 -0
  321. package/report-builder/toolbar-dialog.d.ts +30 -0
  322. package/report-builder/toolbar.d.ts +48 -0
  323. package/report-builder/utils.d.ts +29 -0
  324. package/report-builder/widget-toolbar-button.d.ts +28 -0
  325. package/report-builder/widgets-row-buttons.d.ts +57 -0
  326. package/report-builder/widgets-toolbar.d.ts +44 -0
  327. package/reports/_reports.scss +0 -0
  328. package/reports/chart-widget.d.ts +26 -0
  329. package/reports/formula-widget.d.ts +26 -0
  330. package/reports/image-container-widget.d.ts +28 -0
  331. package/reports/image-widget.d.ts +26 -0
  332. package/reports/index.d.ts +4 -0
  333. package/reports/index.metadata.json +1 -0
  334. package/reports/layout-widget.d.ts +21 -0
  335. package/reports/map-widget.d.ts +26 -0
  336. package/reports/package.json +9 -0
  337. package/reports/page-break-widget.d.ts +26 -0
  338. package/reports/public-api.d.ts +32 -0
  339. package/reports/report.d.ts +26 -0
  340. package/reports/reports-module.d.ts +23 -0
  341. package/reports/table-widget.d.ts +26 -0
  342. package/reports/text-widget.d.ts +26 -0
  343. package/reports/widget.d.ts +40 -0
  344. package/time/_time.scss +0 -0
  345. package/time/index.d.ts +4 -0
  346. package/time/index.metadata.json +1 -0
  347. package/time/package.json +9 -0
  348. package/time/public-api.d.ts +23 -0
  349. package/time/time-module.d.ts +23 -0
  350. package/time/time.d.ts +28 -0
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @license
3
+ * Copyright (C) Gnucoop soc. coop.
4
+ *
5
+ * This file is part of the Advanced JSON forms (ajf).
6
+ *
7
+ * Advanced JSON forms (ajf) is free software: you can redistribute it and/or
8
+ * modify it under the terms of the GNU Affero General Public License as
9
+ * published by the Free Software Foundation, either version 3 of the License,
10
+ * or (at your option) any later version.
11
+ *
12
+ * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
15
+ * General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Affero General Public License
18
+ * along with Advanced JSON forms (ajf).
19
+ * If not, see http://www.gnu.org/licenses/.
20
+ *
21
+ */
22
+ export * from './report-builder-module';
23
+ export * from './report-builder-service';
24
+ export * from './report-builder';
25
+ export * from './tokens';
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC9yZXBvcnQtYnVpbGRlci9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUdILGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChDKSBHbnVjb29wIHNvYy4gY29vcC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzXG4gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSxcbiAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKiBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLlxuICpcbiAqL1xuXG5leHBvcnQge0FqZlJlcG9ydHNDb25maWd9IGZyb20gJy4vbW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVwb3J0LWJ1aWxkZXItbW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vcmVwb3J0LWJ1aWxkZXItc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3JlcG9ydC1idWlsZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdG9rZW5zJztcbiJdfQ==
@@ -0,0 +1,299 @@
1
+ /**
2
+ * @license
3
+ * Copyright (C) Gnucoop soc. coop.
4
+ *
5
+ * This file is part of the Advanced JSON forms (ajf).
6
+ *
7
+ * Advanced JSON forms (ajf) is free software: you can redistribute it and/or
8
+ * modify it under the terms of the GNU Affero General Public License as
9
+ * published by the Free Software Foundation, either version 3 of the License,
10
+ * or (at your option) any later version.
11
+ *
12
+ * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
15
+ * General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Affero General Public License
18
+ * along with Advanced JSON forms (ajf).
19
+ * If not, see http://www.gnu.org/licenses/.
20
+ *
21
+ */
22
+ import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, forwardRef, Input, Output, Renderer2, ViewEncapsulation } from '@angular/core';
23
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
24
+ import { default as Quill } from 'quill';
25
+ import { Subscription } from 'rxjs';
26
+ import { AjfReportBuilderService } from './report-builder-service';
27
+ export class AjfQuillEditor {
28
+ constructor(_elementRef, _renderer, _service) {
29
+ this._elementRef = _elementRef;
30
+ this._renderer = _renderer;
31
+ this._service = _service;
32
+ this.emptyArray = [];
33
+ this._init = false;
34
+ this.dateFormats = [
35
+ {
36
+ 'label': 'June 23rd 2017, 12:39:12 pm',
37
+ 'value': 'MMMM Do YYYY, h:mm:ss a',
38
+ 'validator': 'MMMMDoYYYYhmmssa'
39
+ },
40
+ { 'label': 'Friday', 'value': 'dddd', 'validator': 'dddd' },
41
+ { 'label': 'Jun 23rd 17', 'value': 'MMM Do YY', 'validator': 'MMMDoYY' }
42
+ ];
43
+ this.fonts = [
44
+ false, 'blackr', 'black-italic', 'bold', 'bold-condensed', 'bold-condensed-italic',
45
+ 'bold-italic', 'condensed', 'condensed-italic', 'italic', 'light', 'light-italic', 'medium',
46
+ 'medium-italic', 'thinr', 'thin-italic'
47
+ ];
48
+ this.defaultModules = {
49
+ formula: true,
50
+ toolbar: [
51
+ ['formula'], ['bold', 'italic', 'underline', 'strike'],
52
+ // ['blockquote', 'code-block'],
53
+ [{ 'header': 1 }, { 'header': 2 }],
54
+ [{ 'list': 'ordered' }, { 'list': 'bullet' }],
55
+ [{ 'script': 'sub' }, { 'script': 'super' }],
56
+ // [{ 'indent': '-1'}, { 'indent': '+1' }], // outdent/indent
57
+ // [{ 'direction': 'rtl' }], // text direction
58
+ [{ 'size': ['small', false, 'large', 'huge'] }],
59
+ [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
60
+ [
61
+ { 'color': this.emptyArray.slice() }, { 'background': this.emptyArray.slice() }
62
+ ],
63
+ [{ 'font': this.fonts }], [{ 'align': this.emptyArray.slice() }],
64
+ ['clean'], // remove formatting button
65
+ // ['link', 'image', 'video'] // link and image, video
66
+ ]
67
+ };
68
+ this.font = Quill.import('formats/font');
69
+ this.editorCreated = new EventEmitter();
70
+ this.contentChanged = new EventEmitter();
71
+ this.selectionChanged = new EventEmitter();
72
+ /**
73
+ * this event is fired when the user click on formula button on quill editor rool barƒ
74
+ *
75
+ * @memberof QuillEditorComponent
76
+ */
77
+ this.formulaClick = new EventEmitter();
78
+ this.onModelChange = () => { };
79
+ this.onModelTouched = () => { };
80
+ this._formulas = [];
81
+ this._formulaTextSub = Subscription.EMPTY;
82
+ this.font.whitelist = this.fonts;
83
+ this.font.whitelist.push('regular');
84
+ this._formulaTextSub = this._service.getFormulaToHtmlEvent().subscribe((event) => {
85
+ // reference is defined only when the user want to edit the formula
86
+ if (event.reference !== undefined) {
87
+ event.reference.innerHTML = event.formula;
88
+ this._renderer.setAttribute(event.reference, 'formula', event.formula);
89
+ const efs = this._formulas.filter(f => f.formula === event.reference);
90
+ let formulaEntry;
91
+ let unlisten;
92
+ if (efs.length > 0) {
93
+ formulaEntry = efs[0];
94
+ unlisten = formulaEntry.unlisten;
95
+ if (unlisten != null) {
96
+ unlisten();
97
+ }
98
+ }
99
+ else {
100
+ formulaEntry = { formula: event.reference, unlisten: null };
101
+ this._formulas.push(formulaEntry);
102
+ }
103
+ formulaEntry.unlisten = this._renderer.listen(event.reference, 'click', () => {
104
+ let obj = { 'formula': event.formula, 'reference': event.reference };
105
+ this.formulaClick.emit(obj);
106
+ });
107
+ }
108
+ else {
109
+ const quillEditor = this._elementRef.nativeElement.querySelector('.ajf-ql-editor');
110
+ const link = this._renderer.createElement('a');
111
+ this._renderer.setAttribute(link, 'href', 'javascript:void(0)');
112
+ this._renderer.setStyle(link, 'cursor', 'pointer');
113
+ this._renderer.setAttribute(link, 'formula', this.check(event.formula));
114
+ const linkLabel = this._renderer.createText(event.formula);
115
+ this._renderer.appendChild(link, linkLabel);
116
+ // add listener related on the click event of the new formula
117
+ const unlisten = this._renderer.listen(link, 'click', (_) => {
118
+ let obj = { 'formula': this.check(event.formula), 'reference': link };
119
+ this.formulaClick.emit(obj);
120
+ });
121
+ this._renderer.appendChild(quillEditor, link);
122
+ this._formulas.push({ unlisten, formula: link });
123
+ }
124
+ });
125
+ }
126
+ check(value) {
127
+ for (let i = 0; i < this.dateFormats.length; i++) {
128
+ if (this.dateFormats[i].value == value) {
129
+ return this.dateFormats[i].validator;
130
+ }
131
+ }
132
+ return value;
133
+ }
134
+ /**
135
+ * this function search fomulas inside the init text
136
+ * and allocate the related listener on click event
137
+ *
138
+ * @memberof QuillEditorComponent
139
+ */
140
+ setHTML() {
141
+ this.writeValue(this.initHTML);
142
+ }
143
+ ngAfterViewInit() {
144
+ const toolbarElem = this._elementRef.nativeElement.querySelector('[ajf-quill-editor-toolbar]');
145
+ let modules = this.modules || this.defaultModules;
146
+ Quill.register(this.font, true);
147
+ if (toolbarElem) {
148
+ modules['toolbar'] = toolbarElem;
149
+ modules['formula'] = true;
150
+ }
151
+ this._elementRef.nativeElement.insertAdjacentHTML('beforeend', '<div quill-editor-element></div>');
152
+ this.editorElem = this._elementRef.nativeElement.querySelector('[quill-editor-element]');
153
+ this.quillEditor = new Quill(this.editorElem, {
154
+ modules: modules,
155
+ placeholder: this.placeholder || 'Insert text here ...',
156
+ readOnly: this.readOnly || false,
157
+ theme: this.theme || 'snow',
158
+ formats: this.formats
159
+ });
160
+ this.editorCreated.emit(this.quillEditor);
161
+ this.setHTML();
162
+ // mark model as touched if editor lost focus
163
+ this.quillEditor.on('selection-change', (range, oldRange, source) => {
164
+ this.selectionChanged.emit({ editor: this.quillEditor, range: range, oldRange: oldRange, source: source });
165
+ if (!range) {
166
+ this.onModelTouched();
167
+ }
168
+ });
169
+ // update model if text changes
170
+ this.quillEditor.on('text-change', (delta, oldDelta, source) => {
171
+ let html = this.editorElem.children[0].innerHTML;
172
+ const text = this.quillEditor.getText();
173
+ if (html === '<p><br></p>') {
174
+ html = null;
175
+ }
176
+ this.onModelChange(html);
177
+ this.contentChanged.emit({
178
+ editor: this.quillEditor,
179
+ html: html,
180
+ text: text,
181
+ delta: delta,
182
+ oldDelta: oldDelta,
183
+ source: source
184
+ });
185
+ });
186
+ let elem = this._elementRef.nativeElement.querySelector('.ajf-ql-formula');
187
+ this.listenFunc = this._renderer.listen(elem, 'click', (_) => {
188
+ this.formulaClick.emit();
189
+ });
190
+ }
191
+ writeValue(currentValue) {
192
+ this.content = currentValue;
193
+ if (this.quillEditor) {
194
+ if (currentValue) {
195
+ if (currentValue == this.initHTML && !this._init) {
196
+ let editor = this._elementRef.nativeElement.querySelector('.ajf-ql-editor');
197
+ editor.innerHTML = this.initHTML;
198
+ let allFormulas = this._elementRef.nativeElement.querySelectorAll('[formula]');
199
+ allFormulas.forEach((elem) => {
200
+ const unlisten = this._renderer.listen(elem, 'click', (_) => {
201
+ let obj = { 'formula': this.check(elem.innerText), 'reference': elem };
202
+ this.formulaClick.emit(obj);
203
+ });
204
+ this._renderer.setStyle(elem, 'cursor', 'pointer');
205
+ this._formulas.push({ unlisten, formula: elem });
206
+ this._init = true;
207
+ });
208
+ }
209
+ else if (currentValue != this.initHTML) {
210
+ this.quillEditor.pasteHTML(currentValue);
211
+ }
212
+ return;
213
+ }
214
+ this.quillEditor.setText('');
215
+ }
216
+ }
217
+ registerOnChange(fn) {
218
+ this.onModelChange = fn;
219
+ }
220
+ registerOnTouched(fn) {
221
+ this.onModelTouched = fn;
222
+ }
223
+ validate(_c) {
224
+ if (!this.quillEditor) {
225
+ return null;
226
+ }
227
+ let err = {}, valid = true;
228
+ const textLength = this.quillEditor.getText().trim().length;
229
+ if (this.minLength) {
230
+ err.minLengthError = { given: textLength, minLength: this.minLength };
231
+ valid = textLength >= this.minLength || !textLength;
232
+ }
233
+ if (this.maxLength) {
234
+ err.maxLengthError = { given: textLength, maxLength: this.maxLength };
235
+ valid = textLength <= this.maxLength && valid;
236
+ }
237
+ return valid ? null : err;
238
+ }
239
+ ngOnChanges(changes) {
240
+ if (changes['readOnly'] && this.quillEditor) {
241
+ this.quillEditor.enable(!changes['readOnly'].currentValue);
242
+ }
243
+ if (changes['modules'] && this.quillEditor) {
244
+ Quill.register(this.font, true);
245
+ this.quillEditor = new Quill(this.editorElem, {
246
+ modules: changes['modules']['currentValue'],
247
+ placeholder: this.placeholder || 'Insert text here ...',
248
+ readOnly: this.readOnly || false,
249
+ theme: this.theme || 'snow',
250
+ formats: this.formats
251
+ });
252
+ this._elementRef.nativeElement.children[0].remove();
253
+ }
254
+ }
255
+ ngOnDestroy() {
256
+ for (let i = 0; i < this._formulas.length; i++) {
257
+ let unlisten = this._formulas[i].unlisten;
258
+ if (unlisten != null) {
259
+ unlisten();
260
+ }
261
+ }
262
+ this._formulaTextSub.unsubscribe();
263
+ }
264
+ }
265
+ AjfQuillEditor.decorators = [
266
+ { type: Component, args: [{
267
+ selector: 'ajf-quill-editor',
268
+ template: `
269
+ <ng-content select="[ajf-quill-editor-toolbar]"></ng-content>
270
+ `,
271
+ providers: [
272
+ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AjfQuillEditor), multi: true },
273
+ { provide: NG_VALIDATORS, useExisting: forwardRef(() => AjfQuillEditor), multi: true }
274
+ ],
275
+ encapsulation: ViewEncapsulation.None,
276
+ changeDetection: ChangeDetectionStrategy.OnPush,
277
+ styles: ["ajf-quill-editor .ajf-ql-container .ajf-ql-editor{min-height:200px;width:500px !important;padding-bottom:50px}\n"]
278
+ },] }
279
+ ];
280
+ AjfQuillEditor.ctorParameters = () => [
281
+ { type: ElementRef },
282
+ { type: Renderer2 },
283
+ { type: AjfReportBuilderService }
284
+ ];
285
+ AjfQuillEditor.propDecorators = {
286
+ theme: [{ type: Input }],
287
+ modules: [{ type: Input }],
288
+ readOnly: [{ type: Input }],
289
+ placeholder: [{ type: Input }],
290
+ maxLength: [{ type: Input }],
291
+ minLength: [{ type: Input }],
292
+ formats: [{ type: Input }],
293
+ initHTML: [{ type: Input }],
294
+ editorCreated: [{ type: Output }],
295
+ contentChanged: [{ type: Output }],
296
+ selectionChanged: [{ type: Output }],
297
+ formulaClick: [{ type: Output }]
298
+ };
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpbGwtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21hdGVyaWFsL3JlcG9ydC1idWlsZGVyL3F1aWxsLWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFFVCxpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGFBQWEsRUFDYixpQkFBaUIsRUFFbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUMsT0FBTyxJQUFJLEtBQUssRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUN2QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRWxDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBZ0JqRSxNQUFNLE9BQU8sY0FBYztJQXVGekIsWUFDWSxXQUF1QixFQUFVLFNBQW9CLEVBQ3JELFFBQWlDO1FBRGpDLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNyRCxhQUFRLEdBQVIsUUFBUSxDQUF5QjtRQXJGN0MsZUFBVSxHQUFVLEVBQUUsQ0FBQztRQU1mLFVBQUssR0FBWSxLQUFLLENBQUM7UUFFL0IsZ0JBQVcsR0FBRztZQUNaO2dCQUNFLE9BQU8sRUFBRSw2QkFBNkI7Z0JBQ3RDLE9BQU8sRUFBRSx5QkFBeUI7Z0JBQ2xDLFdBQVcsRUFBRSxrQkFBa0I7YUFDaEM7WUFDRCxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFDO1lBQ3pELEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUM7U0FDdkUsQ0FBQztRQUdGLFVBQUssR0FBRztZQUNOLEtBQUssRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUI7WUFDbEYsYUFBYSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRO1lBQzNGLGVBQWUsRUFBRSxPQUFPLEVBQUUsYUFBYTtTQUN4QyxDQUFDO1FBRUYsbUJBQWMsR0FBRztZQUNmLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUNIO2dCQUNFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUM7Z0JBQ3RELGdDQUFnQztnQkFFaEMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUMsRUFBRSxFQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUMsQ0FBQztnQkFDOUIsQ0FBQyxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUMsRUFBRSxFQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUMsQ0FBQztnQkFDekMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUMsQ0FBQztnQkFDeEMsc0VBQXNFO2dCQUN0RSxzRUFBc0U7Z0JBRXRFLENBQUMsRUFBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBQyxDQUFDO2dCQUM3QyxDQUFDLEVBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUMsQ0FBQztnQkFFdkM7b0JBQ0UsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBQyxFQUFFLEVBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUM7aUJBQzVFO2dCQUNELENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFDLENBQUM7Z0JBRTVELENBQUMsT0FBTyxDQUFDLEVBQUcsMkJBQTJCO2dCQUV2Qyw4RUFBOEU7YUFDL0U7U0FDTixDQUFDO1FBRUYsU0FBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFZakIsa0JBQWEsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN0RCxtQkFBYyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3ZELHFCQUFnQixHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRzVFOzs7O1dBSUc7UUFDZ0IsaUJBQVksR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUc3RSxrQkFBYSxHQUFhLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUNuQyxtQkFBYyxHQUFhLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUU1QixjQUFTLEdBQThDLEVBQUUsQ0FBQztRQUMxRCxvQkFBZSxHQUFpQixZQUFZLENBQUMsS0FBSyxDQUFDO1FBS3pELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXBDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ3BGLG1FQUFtRTtZQUNuRSxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO2dCQUNqQyxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3RFLElBQUksWUFBWSxDQUFDO2dCQUNqQixJQUFJLFFBQVEsQ0FBQztnQkFDYixJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNsQixZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN0QixRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztvQkFDakMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO3dCQUNwQixRQUFRLEVBQUUsQ0FBQztxQkFDWjtpQkFDRjtxQkFBTTtvQkFDTCxZQUFZLEdBQUcsRUFBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFDLENBQUM7b0JBQzFELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNuQztnQkFDRCxZQUFZLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRTtvQkFDM0UsSUFBSSxHQUFHLEdBQUcsRUFBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBQyxDQUFDO29CQUNuRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDbkYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDNUMsNkRBQTZEO2dCQUM3RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQzFELElBQUksR0FBRyxHQUFHLEVBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUMsQ0FBQztvQkFDcEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7YUFDaEQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBYTtRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUU7Z0JBQ3RDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7YUFDdEM7U0FDRjtRQUNELE9BQWUsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNILE9BQU87UUFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQy9GLElBQUksT0FBTyxHQUFRLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUV2RCxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFaEMsSUFBSSxXQUFXLEVBQUU7WUFDZixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsV0FBVyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDM0I7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FDN0MsV0FBVyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUV6RixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDNUMsT0FBTyxFQUFFLE9BQU87WUFDaEIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksc0JBQXNCO1lBQ3ZELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUs7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTTtZQUMzQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQyxDQUFDO1FBR0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVmLDZDQUE2QztRQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEtBQVUsRUFBRSxRQUFhLEVBQUUsTUFBYyxFQUFFLEVBQUU7WUFDcEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FDdEIsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7WUFFbEYsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDVixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDdkI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILCtCQUErQjtRQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFVLEVBQUUsUUFBYSxFQUFFLE1BQWMsRUFBRSxFQUFFO1lBQy9FLElBQUksSUFBSSxHQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRXhDLElBQUksSUFBSSxLQUFLLGFBQWEsRUFBRTtnQkFDMUIsSUFBSSxHQUFHLElBQUksQ0FBQzthQUNiO1lBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV6QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUN4QixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsSUFBSTtnQkFDVixLQUFLLEVBQUUsS0FBSztnQkFDWixRQUFRLEVBQUUsUUFBUTtnQkFDbEIsTUFBTSxFQUFFLE1BQU07YUFDZixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVSxDQUFDLFlBQWlCO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO1FBRTVCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLFlBQVksRUFBRTtnQkFDaEIsSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ2hELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUM1RSxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ2pDLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMvRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7d0JBQ2hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTs0QkFDMUQsSUFBSSxHQUFHLEdBQUcsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBQyxDQUFDOzRCQUNyRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDOUIsQ0FBQyxDQUFDLENBQUM7d0JBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7d0JBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO29CQUNwQixDQUFDLENBQUMsQ0FBQztpQkFDSjtxQkFBTSxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDMUM7Z0JBQ0QsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBWTtRQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBWTtRQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsUUFBUSxDQUFDLEVBQWU7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksR0FBRyxHQUdILEVBQUUsRUFDUixLQUFLLEdBQUcsSUFBSSxDQUFDO1FBRVgsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFFNUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLEdBQUcsQ0FBQyxjQUFjLEdBQUcsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFDLENBQUM7WUFFcEUsS0FBSyxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ3JEO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLEdBQUcsQ0FBQyxjQUFjLEdBQUcsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFDLENBQUM7WUFFcEUsS0FBSyxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztTQUMvQztRQUVELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUM1QixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDNUQ7UUFDRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQzFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQzVDLE9BQU8sRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBYyxDQUFDO2dCQUMzQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxzQkFBc0I7Z0JBQ3ZELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUs7Z0JBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU07Z0JBQzNCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTzthQUN0QixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDckQ7SUFDSCxDQUFDO0lBQ0QsV0FBVztRQUNULEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUMxQyxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCLFFBQVEsRUFBRSxDQUFDO2FBQ1o7U0FDRjtRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckMsQ0FBQzs7O1lBNVRGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixRQUFRLEVBQUU7O0dBRVQ7Z0JBQ0QsU0FBUyxFQUFFO29CQUNULEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztvQkFDeEYsRUFBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztpQkFDckY7Z0JBRUQsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7Z0JBQ3JDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOzthQUNoRDs7O1lBcENDLFVBQVU7WUFPVixTQUFTO1lBY0gsdUJBQXVCOzs7b0JBMkU1QixLQUFLO3NCQUNMLEtBQUs7dUJBQ0wsS0FBSzswQkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSztzQkFDTCxLQUFLO3VCQUNMLEtBQUs7NEJBRUwsTUFBTTs2QkFDTixNQUFNOytCQUNOLE1BQU07MkJBUU4sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoQykgR251Y29vcCBzb2MuIGNvb3AuXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhc1xuICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsXG4gKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICogSWYgbm90LCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy5cbiAqXG4gKi9cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCxcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRvclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2RlZmF1bHQgYXMgUXVpbGx9IGZyb20gJ3F1aWxsJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtBamZSZXBvcnRCdWlsZGVyU2VydmljZX0gZnJvbSAnLi9yZXBvcnQtYnVpbGRlci1zZXJ2aWNlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhamYtcXVpbGwtZWRpdG9yJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYWpmLXF1aWxsLWVkaXRvci10b29sYmFyXVwiPjwvbmctY29udGVudD5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge3Byb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBamZRdWlsbEVkaXRvciksIG11bHRpOiB0cnVlfSxcbiAgICB7cHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQWpmUXVpbGxFZGl0b3IpLCBtdWx0aTogdHJ1ZX1cbiAgXSxcbiAgc3R5bGVVcmxzOiBbJ3F1aWxsLWVkaXRvci5jc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQWpmUXVpbGxFZGl0b3IgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3Ige1xuICBxdWlsbEVkaXRvcjogYW55O1xuICBlZGl0b3JFbGVtOiBIVE1MRWxlbWVudDtcbiAgZW1wdHlBcnJheTogYW55W10gPSBbXTtcbiAgY29udGVudDogYW55O1xuXG4gIGxpc3RlbkZ1bmM6IEZ1bmN0aW9uO1xuXG4gIHByZXZpZXdFbGVtRm9ybXVsYTogYW55O1xuICBwcml2YXRlIF9pbml0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgZGF0ZUZvcm1hdHMgPSBbXG4gICAge1xuICAgICAgJ2xhYmVsJzogJ0p1bmUgMjNyZCAyMDE3LCAxMjozOToxMiBwbScsXG4gICAgICAndmFsdWUnOiAnTU1NTSBEbyBZWVlZLCBoOm1tOnNzIGEnLFxuICAgICAgJ3ZhbGlkYXRvcic6ICdNTU1NRG9ZWVlZaG1tc3NhJ1xuICAgIH0sXG4gICAgeydsYWJlbCc6ICdGcmlkYXknLCAndmFsdWUnOiAnZGRkZCcsICd2YWxpZGF0b3InOiAnZGRkZCd9LFxuICAgIHsnbGFiZWwnOiAnSnVuIDIzcmQgMTcnLCAndmFsdWUnOiAnTU1NIERvIFlZJywgJ3ZhbGlkYXRvcic6ICdNTU1Eb1lZJ31cbiAgXTtcblxuXG4gIGZvbnRzID0gW1xuICAgIGZhbHNlLCAnYmxhY2tyJywgJ2JsYWNrLWl0YWxpYycsICdib2xkJywgJ2JvbGQtY29uZGVuc2VkJywgJ2JvbGQtY29uZGVuc2VkLWl0YWxpYycsXG4gICAgJ2JvbGQtaXRhbGljJywgJ2NvbmRlbnNlZCcsICdjb25kZW5zZWQtaXRhbGljJywgJ2l0YWxpYycsICdsaWdodCcsICdsaWdodC1pdGFsaWMnLCAnbWVkaXVtJyxcbiAgICAnbWVkaXVtLWl0YWxpYycsICd0aGlucicsICd0aGluLWl0YWxpYydcbiAgXTtcblxuICBkZWZhdWx0TW9kdWxlcyA9IHtcbiAgICBmb3JtdWxhOiB0cnVlLFxuICAgIHRvb2xiYXI6XG4gICAgICAgIFtcbiAgICAgICAgICBbJ2Zvcm11bGEnXSwgWydib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnc3RyaWtlJ10sICAvLyB0b2dnbGVkIGJ1dHRvbnNcbiAgICAgICAgICAvLyBbJ2Jsb2NrcXVvdGUnLCAnY29kZS1ibG9jayddLFxuXG4gICAgICAgICAgW3snaGVhZGVyJzogMX0sIHsnaGVhZGVyJzogMn1dLCAgLy8gY3VzdG9tIGJ1dHRvbiB2YWx1ZXNcbiAgICAgICAgICBbeydsaXN0JzogJ29yZGVyZWQnfSwgeydsaXN0JzogJ2J1bGxldCd9XSxcbiAgICAgICAgICBbeydzY3JpcHQnOiAnc3ViJ30sIHsnc2NyaXB0JzogJ3N1cGVyJ31dLCAgLy8gc3VwZXJzY3JpcHQvc3Vic2NyaXB0XG4gICAgICAgICAgLy8gW3sgJ2luZGVudCc6ICctMSd9LCB7ICdpbmRlbnQnOiAnKzEnIH1dLCAgICAgICAgICAvLyBvdXRkZW50L2luZGVudFxuICAgICAgICAgIC8vIFt7ICdkaXJlY3Rpb24nOiAncnRsJyB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGV4dCBkaXJlY3Rpb25cblxuICAgICAgICAgIFt7J3NpemUnOiBbJ3NtYWxsJywgZmFsc2UsICdsYXJnZScsICdodWdlJ119XSwgIC8vIGN1c3RvbSBkcm9wZG93blxuICAgICAgICAgIFt7J2hlYWRlcic6IFsxLCAyLCAzLCA0LCA1LCA2LCBmYWxzZV19XSxcblxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsnY29sb3InOiB0aGlzLmVtcHR5QXJyYXkuc2xpY2UoKX0sIHsnYmFja2dyb3VuZCc6IHRoaXMuZW1wdHlBcnJheS5zbGljZSgpfVxuICAgICAgICAgIF0sICAvLyBkcm9wZG93biB3aXRoIGRlZmF1bHRzIGZyb20gdGhlbWVcbiAgICAgICAgICBbeydmb250JzogdGhpcy5mb250c31dLCBbeydhbGlnbic6IHRoaXMuZW1wdHlBcnJheS5zbGljZSgpfV0sXG5cbiAgICAgICAgICBbJ2NsZWFuJ10sICAvLyByZW1vdmUgZm9ybWF0dGluZyBidXR0b25cblxuICAgICAgICAgIC8vIFsnbGluaycsICdpbWFnZScsICd2aWRlbyddICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmsgYW5kIGltYWdlLCB2aWRlb1xuICAgICAgICBdXG4gIH07XG5cbiAgZm9udCA9IFF1aWxsLmltcG9ydCgnZm9ybWF0cy9mb250Jyk7XG5cblxuICBASW5wdXQoKSB0aGVtZTogc3RyaW5nO1xuICBASW5wdXQoKSBtb2R1bGVzOiBPYmplY3Q7XG4gIEBJbnB1dCgpIHJlYWRPbmx5OiBib29sZWFuO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhMZW5ndGg6IG51bWJlcjtcbiAgQElucHV0KCkgbWluTGVuZ3RoOiBudW1iZXI7XG4gIEBJbnB1dCgpIGZvcm1hdHM6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBpbml0SFRNTDogc3RyaW5nO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBlZGl0b3JDcmVhdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNvbnRlbnRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cbiAgLyoqXG4gICAqIHRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgdXNlciBjbGljayBvbiBmb3JtdWxhIGJ1dHRvbiBvbiBxdWlsbCBlZGl0b3Igcm9vbCBiYXLGklxuICAgKlxuICAgKiBAbWVtYmVyb2YgUXVpbGxFZGl0b3JDb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBmb3JtdWxhQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cblxuICBvbk1vZGVsQ2hhbmdlOiBGdW5jdGlvbiA9ICgpID0+IHt9O1xuICBvbk1vZGVsVG91Y2hlZDogRnVuY3Rpb24gPSAoKSA9PiB7fTtcblxuICBwcml2YXRlIF9mb3JtdWxhczoge2Zvcm11bGE6IGFueSwgdW5saXN0ZW46IEZ1bmN0aW9ufG51bGx9W10gPSBbXTtcbiAgcHJpdmF0ZSBfZm9ybXVsYVRleHRTdWI6IFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICBwcml2YXRlIF9zZXJ2aWNlOiBBamZSZXBvcnRCdWlsZGVyU2VydmljZSkge1xuICAgIHRoaXMuZm9udC53aGl0ZWxpc3QgPSB0aGlzLmZvbnRzO1xuICAgIHRoaXMuZm9udC53aGl0ZWxpc3QucHVzaCgncmVndWxhcicpO1xuXG4gICAgdGhpcy5fZm9ybXVsYVRleHRTdWIgPSB0aGlzLl9zZXJ2aWNlLmdldEZvcm11bGFUb0h0bWxFdmVudCgpLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgLy8gcmVmZXJlbmNlIGlzIGRlZmluZWQgb25seSB3aGVuIHRoZSB1c2VyIHdhbnQgdG8gZWRpdCB0aGUgZm9ybXVsYVxuICAgICAgaWYgKGV2ZW50LnJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV2ZW50LnJlZmVyZW5jZS5pbm5lckhUTUwgPSBldmVudC5mb3JtdWxhO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZXZlbnQucmVmZXJlbmNlLCAnZm9ybXVsYScsIGV2ZW50LmZvcm11bGEpO1xuICAgICAgICBjb25zdCBlZnMgPSB0aGlzLl9mb3JtdWxhcy5maWx0ZXIoZiA9PiBmLmZvcm11bGEgPT09IGV2ZW50LnJlZmVyZW5jZSk7XG4gICAgICAgIGxldCBmb3JtdWxhRW50cnk7XG4gICAgICAgIGxldCB1bmxpc3RlbjtcbiAgICAgICAgaWYgKGVmcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZm9ybXVsYUVudHJ5ID0gZWZzWzBdO1xuICAgICAgICAgIHVubGlzdGVuID0gZm9ybXVsYUVudHJ5LnVubGlzdGVuO1xuICAgICAgICAgIGlmICh1bmxpc3RlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtdWxhRW50cnkgPSB7Zm9ybXVsYTogZXZlbnQucmVmZXJlbmNlLCB1bmxpc3RlbjogbnVsbH07XG4gICAgICAgICAgdGhpcy5fZm9ybXVsYXMucHVzaChmb3JtdWxhRW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGZvcm11bGFFbnRyeS51bmxpc3RlbiA9IHRoaXMuX3JlbmRlcmVyLmxpc3RlbihldmVudC5yZWZlcmVuY2UsICdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBsZXQgb2JqID0geydmb3JtdWxhJzogZXZlbnQuZm9ybXVsYSwgJ3JlZmVyZW5jZSc6IGV2ZW50LnJlZmVyZW5jZX07XG4gICAgICAgICAgdGhpcy5mb3JtdWxhQ2xpY2suZW1pdChvYmopO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHF1aWxsRWRpdG9yID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hamYtcWwtZWRpdG9yJyk7XG4gICAgICAgIGNvbnN0IGxpbmsgPSB0aGlzLl9yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEF0dHJpYnV0ZShsaW5rLCAnaHJlZicsICdqYXZhc2NyaXB0OnZvaWQoMCknKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUobGluaywgJ2N1cnNvcicsICdwb2ludGVyJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEF0dHJpYnV0ZShsaW5rLCAnZm9ybXVsYScsIHRoaXMuY2hlY2soZXZlbnQuZm9ybXVsYSkpO1xuICAgICAgICBjb25zdCBsaW5rTGFiZWwgPSB0aGlzLl9yZW5kZXJlci5jcmVhdGVUZXh0KGV2ZW50LmZvcm11bGEpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5hcHBlbmRDaGlsZChsaW5rLCBsaW5rTGFiZWwpO1xuICAgICAgICAvLyBhZGQgbGlzdGVuZXIgcmVsYXRlZCBvbiB0aGUgY2xpY2sgZXZlbnQgb2YgdGhlIG5ldyBmb3JtdWxhXG4gICAgICAgIGNvbnN0IHVubGlzdGVuID0gdGhpcy5fcmVuZGVyZXIubGlzdGVuKGxpbmssICdjbGljaycsIChfKSA9PiB7XG4gICAgICAgICAgbGV0IG9iaiA9IHsnZm9ybXVsYSc6IHRoaXMuY2hlY2soZXZlbnQuZm9ybXVsYSksICdyZWZlcmVuY2UnOiBsaW5rfTtcbiAgICAgICAgICB0aGlzLmZvcm11bGFDbGljay5lbWl0KG9iaik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5hcHBlbmRDaGlsZChxdWlsbEVkaXRvciwgbGluayk7XG4gICAgICAgIHRoaXMuX2Zvcm11bGFzLnB1c2goe3VubGlzdGVuLCBmb3JtdWxhOiBsaW5rfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjaGVjayh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0ZUZvcm1hdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmRhdGVGb3JtYXRzW2ldLnZhbHVlID09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVGb3JtYXRzW2ldLnZhbGlkYXRvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDxzdHJpbmc+dmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIHRoaXMgZnVuY3Rpb24gc2VhcmNoIGZvbXVsYXMgaW5zaWRlIHRoZSBpbml0IHRleHRcbiAgICogYW5kIGFsbG9jYXRlIHRoZSByZWxhdGVkIGxpc3RlbmVyIG9uIGNsaWNrIGV2ZW50XG4gICAqXG4gICAqIEBtZW1iZXJvZiBRdWlsbEVkaXRvckNvbXBvbmVudFxuICAgKi9cbiAgc2V0SFRNTCgpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5pbml0SFRNTCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29uc3QgdG9vbGJhckVsZW0gPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignW2FqZi1xdWlsbC1lZGl0b3ItdG9vbGJhcl0nKTtcbiAgICBsZXQgbW9kdWxlczogYW55ID0gdGhpcy5tb2R1bGVzIHx8IHRoaXMuZGVmYXVsdE1vZHVsZXM7XG5cbiAgICBRdWlsbC5yZWdpc3Rlcih0aGlzLmZvbnQsIHRydWUpO1xuXG4gICAgaWYgKHRvb2xiYXJFbGVtKSB7XG4gICAgICBtb2R1bGVzWyd0b29sYmFyJ10gPSB0b29sYmFyRWxlbTtcbiAgICAgIG1vZHVsZXNbJ2Zvcm11bGEnXSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgICAgICdiZWZvcmVlbmQnLCAnPGRpdiBxdWlsbC1lZGl0b3ItZWxlbWVudD48L2Rpdj4nKTtcblxuICAgIHRoaXMuZWRpdG9yRWxlbSA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbcXVpbGwtZWRpdG9yLWVsZW1lbnRdJyk7XG5cbiAgICB0aGlzLnF1aWxsRWRpdG9yID0gbmV3IFF1aWxsKHRoaXMuZWRpdG9yRWxlbSwge1xuICAgICAgbW9kdWxlczogbW9kdWxlcyxcbiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyIHx8ICdJbnNlcnQgdGV4dCBoZXJlIC4uLicsXG4gICAgICByZWFkT25seTogdGhpcy5yZWFkT25seSB8fCBmYWxzZSxcbiAgICAgIHRoZW1lOiB0aGlzLnRoZW1lIHx8ICdzbm93JyxcbiAgICAgIGZvcm1hdHM6IHRoaXMuZm9ybWF0c1xuICAgIH0pO1xuXG5cbiAgICB0aGlzLmVkaXRvckNyZWF0ZWQuZW1pdCh0aGlzLnF1aWxsRWRpdG9yKTtcbiAgICB0aGlzLnNldEhUTUwoKTtcblxuICAgIC8vIG1hcmsgbW9kZWwgYXMgdG91Y2hlZCBpZiBlZGl0b3IgbG9zdCBmb2N1c1xuICAgIHRoaXMucXVpbGxFZGl0b3Iub24oJ3NlbGVjdGlvbi1jaGFuZ2UnLCAocmFuZ2U6IGFueSwgb2xkUmFuZ2U6IGFueSwgc291cmNlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KFxuICAgICAgICAgIHtlZGl0b3I6IHRoaXMucXVpbGxFZGl0b3IsIHJhbmdlOiByYW5nZSwgb2xkUmFuZ2U6IG9sZFJhbmdlLCBzb3VyY2U6IHNvdXJjZX0pO1xuXG4gICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgIHRoaXMub25Nb2RlbFRvdWNoZWQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZSBtb2RlbCBpZiB0ZXh0IGNoYW5nZXNcbiAgICB0aGlzLnF1aWxsRWRpdG9yLm9uKCd0ZXh0LWNoYW5nZScsIChkZWx0YTogYW55LCBvbGREZWx0YTogYW55LCBzb3VyY2U6IHN0cmluZykgPT4ge1xuICAgICAgbGV0IGh0bWw6IGFueSA9IHRoaXMuZWRpdG9yRWxlbS5jaGlsZHJlblswXS5pbm5lckhUTUw7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5xdWlsbEVkaXRvci5nZXRUZXh0KCk7XG5cbiAgICAgIGlmIChodG1sID09PSAnPHA+PGJyPjwvcD4nKSB7XG4gICAgICAgIGh0bWwgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UoaHRtbCk7XG5cbiAgICAgIHRoaXMuY29udGVudENoYW5nZWQuZW1pdCh7XG4gICAgICAgIGVkaXRvcjogdGhpcy5xdWlsbEVkaXRvcixcbiAgICAgICAgaHRtbDogaHRtbCxcbiAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgZGVsdGE6IGRlbHRhLFxuICAgICAgICBvbGREZWx0YTogb2xkRGVsdGEsXG4gICAgICAgIHNvdXJjZTogc291cmNlXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGxldCBlbGVtID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hamYtcWwtZm9ybXVsYScpO1xuICAgIHRoaXMubGlzdGVuRnVuYyA9IHRoaXMuX3JlbmRlcmVyLmxpc3RlbihlbGVtLCAnY2xpY2snLCAoXykgPT4ge1xuICAgICAgdGhpcy5mb3JtdWxhQ2xpY2suZW1pdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgd3JpdGVWYWx1ZShjdXJyZW50VmFsdWU6IGFueSkge1xuICAgIHRoaXMuY29udGVudCA9IGN1cnJlbnRWYWx1ZTtcblxuICAgIGlmICh0aGlzLnF1aWxsRWRpdG9yKSB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlKSB7XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gdGhpcy5pbml0SFRNTCAmJiAhdGhpcy5faW5pdCkge1xuICAgICAgICAgIGxldCBlZGl0b3IgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmFqZi1xbC1lZGl0b3InKTtcbiAgICAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gdGhpcy5pbml0SFRNTDtcbiAgICAgICAgICBsZXQgYWxsRm9ybXVsYXMgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2Zvcm11bGFdJyk7XG4gICAgICAgICAgYWxsRm9ybXVsYXMuZm9yRWFjaCgoZWxlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1bmxpc3RlbiA9IHRoaXMuX3JlbmRlcmVyLmxpc3RlbihlbGVtLCAnY2xpY2snLCAoXykgPT4ge1xuICAgICAgICAgICAgICBsZXQgb2JqID0geydmb3JtdWxhJzogdGhpcy5jaGVjayhlbGVtLmlubmVyVGV4dCksICdyZWZlcmVuY2UnOiBlbGVtfTtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtdWxhQ2xpY2suZW1pdChvYmopO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShlbGVtLCAnY3Vyc29yJywgJ3BvaW50ZXInKTtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm11bGFzLnB1c2goe3VubGlzdGVuLCBmb3JtdWxhOiBlbGVtfSk7XG4gICAgICAgICAgICB0aGlzLl9pbml0ID0gdHJ1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUgIT0gdGhpcy5pbml0SFRNTCkge1xuICAgICAgICAgIHRoaXMucXVpbGxFZGl0b3IucGFzdGVIVE1MKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5xdWlsbEVkaXRvci5zZXRUZXh0KCcnKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMub25Nb2RlbENoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5vbk1vZGVsVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgdmFsaWRhdGUoX2M6IEZvcm1Db250cm9sKSB7XG4gICAgaWYgKCF0aGlzLnF1aWxsRWRpdG9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgZXJyOiB7XG4gICAgICBtaW5MZW5ndGhFcnJvcj86IHtnaXZlbjogbnVtYmVyLCBtaW5MZW5ndGg6IG51bWJlcn07XG4gICAgICBtYXhMZW5ndGhFcnJvcj86IHtnaXZlbjogbnVtYmVyLCBtYXhMZW5ndGg6IG51bWJlcn07XG4gICAgfSA9IHt9LFxuICB2YWxpZCA9IHRydWU7XG5cbiAgICBjb25zdCB0ZXh0TGVuZ3RoID0gdGhpcy5xdWlsbEVkaXRvci5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aDtcblxuICAgIGlmICh0aGlzLm1pbkxlbmd0aCkge1xuICAgICAgZXJyLm1pbkxlbmd0aEVycm9yID0ge2dpdmVuOiB0ZXh0TGVuZ3RoLCBtaW5MZW5ndGg6IHRoaXMubWluTGVuZ3RofTtcblxuICAgICAgdmFsaWQgPSB0ZXh0TGVuZ3RoID49IHRoaXMubWluTGVuZ3RoIHx8ICF0ZXh0TGVuZ3RoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1heExlbmd0aCkge1xuICAgICAgZXJyLm1heExlbmd0aEVycm9yID0ge2dpdmVuOiB0ZXh0TGVuZ3RoLCBtYXhMZW5ndGg6IHRoaXMubWF4TGVuZ3RofTtcblxuICAgICAgdmFsaWQgPSB0ZXh0TGVuZ3RoIDw9IHRoaXMubWF4TGVuZ3RoICYmIHZhbGlkO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZCA/IG51bGwgOiBlcnI7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ3JlYWRPbmx5J10gJiYgdGhpcy5xdWlsbEVkaXRvcikge1xuICAgICAgdGhpcy5xdWlsbEVkaXRvci5lbmFibGUoIWNoYW5nZXNbJ3JlYWRPbmx5J10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ21vZHVsZXMnXSAmJiB0aGlzLnF1aWxsRWRpdG9yKSB7XG4gICAgICBRdWlsbC5yZWdpc3Rlcih0aGlzLmZvbnQsIHRydWUpO1xuICAgICAgdGhpcy5xdWlsbEVkaXRvciA9IG5ldyBRdWlsbCh0aGlzLmVkaXRvckVsZW0sIHtcbiAgICAgICAgbW9kdWxlczogY2hhbmdlc1snbW9kdWxlcyddWydjdXJyZW50VmFsdWUnXSxcbiAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIgfHwgJ0luc2VydCB0ZXh0IGhlcmUgLi4uJyxcbiAgICAgICAgcmVhZE9ubHk6IHRoaXMucmVhZE9ubHkgfHwgZmFsc2UsXG4gICAgICAgIHRoZW1lOiB0aGlzLnRoZW1lIHx8ICdzbm93JyxcbiAgICAgICAgZm9ybWF0czogdGhpcy5mb3JtYXRzXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jaGlsZHJlblswXS5yZW1vdmUoKTtcbiAgICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9mb3JtdWxhcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHVubGlzdGVuID0gdGhpcy5fZm9ybXVsYXNbaV0udW5saXN0ZW47XG4gICAgICBpZiAodW5saXN0ZW4gIT0gbnVsbCkge1xuICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9mb3JtdWxhVGV4dFN1Yi51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=