@piserve-tech/form-submission 1.3.317 → 1.3.319

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 (442) hide show
  1. package/environment/environment.d.ts +5 -0
  2. package/esm2022/environment/environment.mjs +6 -0
  3. package/esm2022/form-fields/aggregate-function/aggregate-function.component.mjs +146 -0
  4. package/esm2022/form-fields/check-box-fields/check-box-fields.component.mjs +473 -0
  5. package/esm2022/form-fields/currency-fields/currency-fields.component.mjs +502 -0
  6. package/esm2022/form-fields/date-time-fields/date-time-fields.component.mjs +608 -0
  7. package/esm2022/form-fields/drop-down-fields/drop-down-fields.component.mjs +585 -0
  8. package/esm2022/form-fields/file-picker-fields/file-picker-fields.component.mjs +224 -0
  9. package/esm2022/form-fields/form-fields.module.mjs +174 -0
  10. package/esm2022/form-fields/hidden-field/hidden-field.component.mjs +137 -0
  11. package/esm2022/form-fields/iframe-fields/iframe-fields.component.mjs +198 -0
  12. package/esm2022/form-fields/location-fields/location-fields.component.mjs +85 -0
  13. package/esm2022/form-fields/mail-fields/mail-fields.component.mjs +131 -0
  14. package/esm2022/form-fields/mobile-fields/mobile-fields.component.mjs +270 -0
  15. package/esm2022/form-fields/number-fields/number-fields.component.mjs +242 -0
  16. package/esm2022/form-fields/password-fields/password-fields.component.mjs +257 -0
  17. package/esm2022/form-fields/radio-button-fields/radio-button-fields.component.mjs +346 -0
  18. package/esm2022/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.mjs +148 -0
  19. package/esm2022/form-fields/section-fields/section-fields.component.mjs +29 -0
  20. package/esm2022/form-fields/selection-matrix-fields/selection-matrix-fields.component.mjs +158 -0
  21. package/esm2022/form-fields/signature-fields/signature-fields.component.mjs +32 -0
  22. package/esm2022/form-fields/slider-fields/slider-fields.component.mjs +73 -0
  23. package/esm2022/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.mjs +66 -0
  24. package/esm2022/form-fields/text-area-fields/text-area-fields.component.mjs +159 -0
  25. package/esm2022/form-fields/text-fields/text-fields.component.mjs +245 -0
  26. package/esm2022/form-fields/toggle-switch-fields/toggle-switch-fields.component.mjs +85 -0
  27. package/esm2022/form-fields/url-fields/url-fields.component.mjs +124 -0
  28. package/esm2022/form-submission/form-submission.module.mjs +64 -0
  29. package/esm2022/form-submission/header/header.component.mjs +20 -0
  30. package/esm2022/form-submission/navigation-tabs/navigation-tabs.component.mjs +171 -0
  31. package/esm2022/form-submission/next-prev-navigation/next-prev-navigation.component.mjs +124 -0
  32. package/esm2022/form-submission/save-as-draft/saveDraftModalComponent .mjs +50 -0
  33. package/esm2022/form-submission/submission-container/submission-container.component.mjs +17 -0
  34. package/esm2022/form-submission/submit-form/submit-form.component.mjs +1610 -0
  35. package/esm2022/lib/form-submission.component.mjs +113 -0
  36. package/esm2022/lib/form-submission.module.mjs +56 -0
  37. package/esm2022/lib/form-submission.service.mjs +14 -0
  38. package/esm2022/models/aggregate.model.mjs +2 -0
  39. package/esm2022/models/answer.model.mjs +2 -0
  40. package/esm2022/models/appearance.model.mjs +2 -0
  41. package/esm2022/models/attachment.model.mjs +2 -0
  42. package/esm2022/models/defaultAnswerEntry.model.mjs +2 -0
  43. package/esm2022/models/defaultAnswersModel.model.mjs +2 -0
  44. package/esm2022/models/defaultQuestionAnswer.model.mjs +2 -0
  45. package/esm2022/models/elementOptionAPI.model.mjs +2 -0
  46. package/esm2022/models/elementOptionAPIData.model.mjs +2 -0
  47. package/esm2022/models/elementOptionDB.model.mjs +2 -0
  48. package/esm2022/models/elementOptionDBCriteria.model.mjs +2 -0
  49. package/esm2022/models/emitters.model.mjs +2 -0
  50. package/esm2022/models/enum/condition.enum.mjs +18 -0
  51. package/esm2022/models/enum/elementType .enum.mjs +24 -0
  52. package/esm2022/models/enum/entityType.enum.mjs +12 -0
  53. package/esm2022/models/formConfiguration.model.mjs +2 -0
  54. package/esm2022/models/formElement.model.mjs +2 -0
  55. package/esm2022/models/formElementType.model.mjs +2 -0
  56. package/esm2022/models/grid.model.mjs +2 -0
  57. package/esm2022/models/hiddenField.model.mjs +2 -0
  58. package/esm2022/models/iFrameProperties.model.mjs +2 -0
  59. package/esm2022/models/logic.model.mjs +2 -0
  60. package/esm2022/models/multifields.model.mjs +2 -0
  61. package/esm2022/models/option.model.mjs +2 -0
  62. package/esm2022/models/page.model.mjs +2 -0
  63. package/esm2022/models/publicForm.model.mjs +2 -0
  64. package/esm2022/models/question.model.mjs +2 -0
  65. package/esm2022/models/questionAnswer.model.mjs +2 -0
  66. package/esm2022/models/questionGroup.model.mjs +2 -0
  67. package/esm2022/models/row.model.mjs +2 -0
  68. package/esm2022/models/scoring.model.mjs +2 -0
  69. package/esm2022/models/section.model.mjs +2 -0
  70. package/esm2022/models/subForm.model.mjs +2 -0
  71. package/esm2022/models/subformConfiguration.model.mjs +2 -0
  72. package/esm2022/models/subformPropery.model.mjs +2 -0
  73. package/esm2022/models/submission.model.mjs +2 -0
  74. package/esm2022/models/submissionCopyConfig.mopdel.mjs +2 -0
  75. package/esm2022/models/terms&condition.model.mjs +2 -0
  76. package/esm2022/models/validation.model.mjs +2 -0
  77. package/esm2022/models/whenClause.model.mjs +2 -0
  78. package/esm2022/models/whenClauseCondition.model.mjs +2 -0
  79. package/esm2022/models/whenClauseElements.model.mjs +2 -0
  80. package/esm2022/piserve-tech-form-submission.mjs +5 -0
  81. package/esm2022/public-api.mjs +7 -0
  82. package/esm2022/question/card-subform/card-subform.component.mjs +354 -0
  83. package/esm2022/question/confirm-dialog/confirm-dialog.component.mjs +27 -0
  84. package/esm2022/question/form-elements/form-elements.component.mjs +62 -0
  85. package/esm2022/question/inline-multiple-subform/inline-multiple-subform.component.mjs +384 -0
  86. package/esm2022/question/multifields/multifields.component.mjs +54 -0
  87. package/esm2022/question/multiple-subform/multiple-subform.component.mjs +413 -0
  88. package/esm2022/question/question/question.component.mjs +145 -0
  89. package/esm2022/question/question-group/question-group.component.mjs +102 -0
  90. package/esm2022/question/recursive-logic/recursive-logic.component.mjs +49 -0
  91. package/esm2022/question/sub-form/sub-form.component.mjs +355 -0
  92. package/esm2022/services/aggregate.service.mjs +139 -0
  93. package/esm2022/services/countryService.mjs +89 -0
  94. package/esm2022/services/data.service.mjs +36 -0
  95. package/esm2022/services/element-tracker.service.mjs +27 -0
  96. package/esm2022/services/form-validation.service.mjs +128 -0
  97. package/esm2022/services/form.service.mjs +332 -0
  98. package/esm2022/services/mapper.service.mjs +519 -0
  99. package/esm2022/services/recaptcha.service.mjs +136 -0
  100. package/esm2022/services/score.service.mjs +268 -0
  101. package/esm2022/services/subform-copy.service.mjs +122 -0
  102. package/esm2022/services/validation.service.mjs +35 -0
  103. package/esm2022/services/whenClause.service.mjs +423 -0
  104. package/esm2022/shared/shared.module.mjs +97 -0
  105. package/esm2022/sub-form/submission-modal/submission-modal.component.mjs +133 -0
  106. package/fesm2022/piserve-tech-form-submission.mjs +11661 -0
  107. package/fesm2022/piserve-tech-form-submission.mjs.map +1 -0
  108. package/form-fields/aggregate-function/aggregate-function.component.d.ts +43 -0
  109. package/form-fields/check-box-fields/check-box-fields.component.d.ts +73 -0
  110. package/form-fields/currency-fields/currency-fields.component.d.ts +62 -0
  111. package/form-fields/date-time-fields/date-time-fields.component.d.ts +96 -0
  112. package/form-fields/drop-down-fields/drop-down-fields.component.d.ts +88 -0
  113. package/form-fields/file-picker-fields/file-picker-fields.component.d.ts +72 -0
  114. package/form-fields/form-fields.module.d.ts +40 -0
  115. package/form-fields/hidden-field/hidden-field.component.d.ts +38 -0
  116. package/form-fields/iframe-fields/iframe-fields.component.d.ts +35 -0
  117. package/form-fields/location-fields/location-fields.component.d.ts +29 -0
  118. package/form-fields/mail-fields/mail-fields.component.d.ts +41 -0
  119. package/form-fields/mobile-fields/mobile-fields.component.d.ts +71 -0
  120. package/form-fields/number-fields/number-fields.component.d.ts +53 -0
  121. package/form-fields/password-fields/password-fields.component.d.ts +57 -0
  122. package/form-fields/radio-button-fields/radio-button-fields.component.d.ts +70 -0
  123. package/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.d.ts +46 -0
  124. package/form-fields/section-fields/section-fields.component.d.ts +10 -0
  125. package/form-fields/selection-matrix-fields/selection-matrix-fields.component.d.ts +45 -0
  126. package/form-fields/signature-fields/signature-fields.component.d.ts +13 -0
  127. package/form-fields/slider-fields/slider-fields.component.d.ts +32 -0
  128. package/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.d.ts +26 -0
  129. package/form-fields/text-area-fields/text-area-fields.component.d.ts +49 -0
  130. package/form-fields/text-fields/text-fields.component.d.ts +49 -0
  131. package/form-fields/toggle-switch-fields/toggle-switch-fields.component.d.ts +29 -0
  132. package/form-fields/url-fields/url-fields.component.d.ts +41 -0
  133. package/form-submission/form-submission.module.d.ts +20 -0
  134. package/form-submission/header/header.component.d.ts +7 -0
  135. package/form-submission/navigation-tabs/navigation-tabs.component.d.ts +57 -0
  136. package/form-submission/next-prev-navigation/next-prev-navigation.component.d.ts +46 -0
  137. package/form-submission/save-as-draft/saveDraftModalComponent .d.ts +17 -0
  138. package/form-submission/submission-container/submission-container.component.d.ts +7 -0
  139. package/form-submission/submit-form/submit-form.component.d.ts +237 -0
  140. package/index.d.ts +5 -0
  141. package/lib/form-submission.component.d.ts +30 -0
  142. package/lib/form-submission.module.d.ts +16 -0
  143. package/lib/form-submission.service.d.ts +6 -0
  144. package/models/aggregate.model.d.ts +4 -0
  145. package/{src/models/answer.model.ts → models/answer.model.d.ts} +23 -25
  146. package/models/appearance.model.d.ts +64 -0
  147. package/{src/models/attachment.model.ts → models/attachment.model.d.ts} +6 -6
  148. package/{src/models/defaultAnswerEntry.model.ts → models/defaultAnswerEntry.model.d.ts} +5 -7
  149. package/{src/models/defaultAnswersModel.model.ts → models/defaultAnswersModel.model.d.ts} +4 -5
  150. package/{src/models/defaultQuestionAnswer.model.ts → models/defaultQuestionAnswer.model.d.ts} +6 -6
  151. package/models/elementOptionAPI.model.d.ts +12 -0
  152. package/models/elementOptionAPIData.model.d.ts +5 -0
  153. package/models/elementOptionDB.model.d.ts +8 -0
  154. package/models/elementOptionDBCriteria.model.d.ts +7 -0
  155. package/{src/models/emitters.model.ts → models/emitters.model.d.ts} +8 -8
  156. package/{src/models/enum/condition.enum.ts → models/enum/condition.enum.d.ts} +2 -2
  157. package/models/enum/elementType .enum.d.ts +22 -0
  158. package/models/enum/entityType.enum.d.ts +10 -0
  159. package/{src/models/formConfiguration.model.ts → models/formConfiguration.model.d.ts} +2 -2
  160. package/{src/models/formElement.model.ts → models/formElement.model.d.ts} +22 -22
  161. package/{src/models/formElementType.model.ts → models/formElementType.model.d.ts} +2 -3
  162. package/{src/models/grid.model.ts → models/grid.model.d.ts} +13 -14
  163. package/{src/models/hiddenField.model.ts → models/hiddenField.model.d.ts} +5 -5
  164. package/{src/models/iFrameProperties.model.ts → models/iFrameProperties.model.d.ts} +13 -13
  165. package/models/logic.model.d.ts +9 -0
  166. package/models/multifields.model.d.ts +11 -0
  167. package/{src/models/option.model.ts → models/option.model.d.ts} +5 -5
  168. package/models/page.model.d.ts +6 -0
  169. package/models/publicForm.model.d.ts +18 -0
  170. package/models/question.model.d.ts +26 -0
  171. package/models/questionAnswer.model.d.ts +7 -0
  172. package/models/questionGroup.model.d.ts +11 -0
  173. package/{src/models/row.model.ts → models/row.model.d.ts} +1 -2
  174. package/models/scoring.model.d.ts +10 -0
  175. package/models/section.model.d.ts +6 -0
  176. package/models/subForm.model.d.ts +24 -0
  177. package/models/subformConfiguration.model.d.ts +4 -0
  178. package/models/subformPropery.model.d.ts +7 -0
  179. package/{src/models/submission.model.ts → models/submission.model.d.ts} +14 -16
  180. package/{src/models/submissionCopyConfig.mopdel.ts → models/submissionCopyConfig.mopdel.d.ts} +4 -4
  181. package/{src/models/terms&condition.model.ts → models/terms&condition.model.d.ts} +1 -1
  182. package/models/validation.model.d.ts +48 -0
  183. package/models/whenClause.model.d.ts +6 -0
  184. package/{src/models/whenClauseCondition.model.ts → models/whenClauseCondition.model.d.ts} +6 -6
  185. package/{src/models/whenClauseElements.model.ts → models/whenClauseElements.model.d.ts} +5 -6
  186. package/package.json +46 -33
  187. package/{src/public-api.ts → public-api.d.ts} +0 -4
  188. package/question/card-subform/card-subform.component.d.ts +44 -0
  189. package/question/confirm-dialog/confirm-dialog.component.d.ts +12 -0
  190. package/question/form-elements/form-elements.component.d.ts +20 -0
  191. package/question/inline-multiple-subform/inline-multiple-subform.component.d.ts +47 -0
  192. package/question/multifields/multifields.component.d.ts +11 -0
  193. package/question/multiple-subform/multiple-subform.component.d.ts +39 -0
  194. package/question/question/question.component.d.ts +30 -0
  195. package/question/question-group/question-group.component.d.ts +29 -0
  196. package/question/recursive-logic/recursive-logic.component.d.ts +19 -0
  197. package/question/sub-form/sub-form.component.d.ts +70 -0
  198. package/services/aggregate.service.d.ts +29 -0
  199. package/services/countryService.d.ts +21 -0
  200. package/services/data.service.d.ts +19 -0
  201. package/services/element-tracker.service.d.ts +10 -0
  202. package/services/form-validation.service.d.ts +16 -0
  203. package/services/form.service.d.ts +27 -0
  204. package/services/mapper.service.d.ts +31 -0
  205. package/services/recaptcha.service.d.ts +46 -0
  206. package/services/score.service.d.ts +27 -0
  207. package/services/subform-copy.service.d.ts +10 -0
  208. package/services/validation.service.d.ts +14 -0
  209. package/services/whenClause.service.d.ts +45 -0
  210. package/shared/shared.module.d.ts +25 -0
  211. package/sub-form/submission-modal/submission-modal.component.d.ts +31 -0
  212. package/ng-package.json +0 -30
  213. package/src/environment/environment.ts +0 -6
  214. package/src/form-fields/aggregate-function/aggregate-function.component.html +0 -63
  215. package/src/form-fields/aggregate-function/aggregate-function.component.scss +0 -1
  216. package/src/form-fields/aggregate-function/aggregate-function.component.spec.ts +0 -21
  217. package/src/form-fields/aggregate-function/aggregate-function.component.ts +0 -148
  218. package/src/form-fields/check-box-fields/check-box-fields.component.html +0 -81
  219. package/src/form-fields/check-box-fields/check-box-fields.component.scss +0 -28
  220. package/src/form-fields/check-box-fields/check-box-fields.component.spec.ts +0 -21
  221. package/src/form-fields/check-box-fields/check-box-fields.component.ts +0 -538
  222. package/src/form-fields/currency-fields/currency-fields.component.html +0 -85
  223. package/src/form-fields/currency-fields/currency-fields.component.scss +0 -48
  224. package/src/form-fields/currency-fields/currency-fields.component.spec.ts +0 -21
  225. package/src/form-fields/currency-fields/currency-fields.component.ts +0 -589
  226. package/src/form-fields/date-time-fields/date-time-fields.component.html +0 -268
  227. package/src/form-fields/date-time-fields/date-time-fields.component.scss +0 -88
  228. package/src/form-fields/date-time-fields/date-time-fields.component.spec.ts +0 -21
  229. package/src/form-fields/date-time-fields/date-time-fields.component.ts +0 -693
  230. package/src/form-fields/drop-down-fields/drop-down-fields.component.html +0 -77
  231. package/src/form-fields/drop-down-fields/drop-down-fields.component.scss +0 -12
  232. package/src/form-fields/drop-down-fields/drop-down-fields.component.spec.ts +0 -21
  233. package/src/form-fields/drop-down-fields/drop-down-fields.component.ts +0 -698
  234. package/src/form-fields/file-picker-fields/file-picker-fields.component.html +0 -72
  235. package/src/form-fields/file-picker-fields/file-picker-fields.component.scss +0 -33
  236. package/src/form-fields/file-picker-fields/file-picker-fields.component.spec.ts +0 -21
  237. package/src/form-fields/file-picker-fields/file-picker-fields.component.ts +0 -256
  238. package/src/form-fields/form-fields.module.ts +0 -110
  239. package/src/form-fields/hidden-field/hidden-field.component.scss +0 -0
  240. package/src/form-fields/hidden-field/hidden-field.component.spec.ts +0 -21
  241. package/src/form-fields/hidden-field/hidden-field.component.ts +0 -156
  242. package/src/form-fields/iframe-fields/iframe-fields.component.html +0 -31
  243. package/src/form-fields/iframe-fields/iframe-fields.component.scss +0 -0
  244. package/src/form-fields/iframe-fields/iframe-fields.component.spec.ts +0 -21
  245. package/src/form-fields/iframe-fields/iframe-fields.component.ts +0 -225
  246. package/src/form-fields/location-fields/location-fields.component.html +0 -54
  247. package/src/form-fields/location-fields/location-fields.component.scss +0 -22
  248. package/src/form-fields/location-fields/location-fields.component.spec.ts +0 -21
  249. package/src/form-fields/location-fields/location-fields.component.ts +0 -83
  250. package/src/form-fields/mail-fields/mail-fields.component.html +0 -66
  251. package/src/form-fields/mail-fields/mail-fields.component.scss +0 -10
  252. package/src/form-fields/mail-fields/mail-fields.component.spec.ts +0 -21
  253. package/src/form-fields/mail-fields/mail-fields.component.ts +0 -127
  254. package/src/form-fields/mobile-fields/mobile-fields.component.html +0 -97
  255. package/src/form-fields/mobile-fields/mobile-fields.component.scss +0 -52
  256. package/src/form-fields/mobile-fields/mobile-fields.component.spec.ts +0 -21
  257. package/src/form-fields/mobile-fields/mobile-fields.component.ts +0 -310
  258. package/src/form-fields/number-fields/number-fields.component.html +0 -70
  259. package/src/form-fields/number-fields/number-fields.component.scss +0 -17
  260. package/src/form-fields/number-fields/number-fields.component.spec.ts +0 -21
  261. package/src/form-fields/number-fields/number-fields.component.ts +0 -256
  262. package/src/form-fields/password-fields/password-fields.component.html +0 -113
  263. package/src/form-fields/password-fields/password-fields.component.scss +0 -61
  264. package/src/form-fields/password-fields/password-fields.component.spec.ts +0 -21
  265. package/src/form-fields/password-fields/password-fields.component.ts +0 -273
  266. package/src/form-fields/radio-button-fields/radio-button-fields.component.html +0 -82
  267. package/src/form-fields/radio-button-fields/radio-button-fields.component.scss +0 -28
  268. package/src/form-fields/radio-button-fields/radio-button-fields.component.spec.ts +0 -21
  269. package/src/form-fields/radio-button-fields/radio-button-fields.component.ts +0 -391
  270. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.html +0 -67
  271. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.scss +0 -23
  272. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.spec.ts +0 -21
  273. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.ts +0 -145
  274. package/src/form-fields/section-fields/section-fields.component.html +0 -4
  275. package/src/form-fields/section-fields/section-fields.component.scss +0 -37
  276. package/src/form-fields/section-fields/section-fields.component.spec.ts +0 -21
  277. package/src/form-fields/section-fields/section-fields.component.ts +0 -25
  278. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.html +0 -93
  279. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.scss +0 -52
  280. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.spec.ts +0 -21
  281. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.ts +0 -155
  282. package/src/form-fields/signature-fields/signature-fields.component.html +0 -43
  283. package/src/form-fields/signature-fields/signature-fields.component.scss +0 -10
  284. package/src/form-fields/signature-fields/signature-fields.component.spec.ts +0 -21
  285. package/src/form-fields/signature-fields/signature-fields.component.ts +0 -25
  286. package/src/form-fields/slider-fields/slider-fields.component.html +0 -67
  287. package/src/form-fields/slider-fields/slider-fields.component.scss +0 -55
  288. package/src/form-fields/slider-fields/slider-fields.component.spec.ts +0 -21
  289. package/src/form-fields/slider-fields/slider-fields.component.ts +0 -63
  290. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.html +0 -52
  291. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.scss +0 -85
  292. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.spec.ts +0 -21
  293. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.ts +0 -62
  294. package/src/form-fields/text-area-fields/text-area-fields.component.html +0 -68
  295. package/src/form-fields/text-area-fields/text-area-fields.component.scss +0 -19
  296. package/src/form-fields/text-area-fields/text-area-fields.component.spec.ts +0 -21
  297. package/src/form-fields/text-area-fields/text-area-fields.component.ts +0 -166
  298. package/src/form-fields/text-fields/text-fields.component.html +0 -67
  299. package/src/form-fields/text-fields/text-fields.component.scss +0 -26
  300. package/src/form-fields/text-fields/text-fields.component.spec.ts +0 -21
  301. package/src/form-fields/text-fields/text-fields.component.ts +0 -248
  302. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.html +0 -70
  303. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.scss +0 -112
  304. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.spec.ts +0 -21
  305. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.ts +0 -74
  306. package/src/form-fields/url-fields/url-fields.component.html +0 -109
  307. package/src/form-fields/url-fields/url-fields.component.scss +0 -22
  308. package/src/form-fields/url-fields/url-fields.component.spec.ts +0 -21
  309. package/src/form-fields/url-fields/url-fields.component.ts +0 -123
  310. package/src/form-submission/form-submission.module.ts +0 -40
  311. package/src/form-submission/header/header.component.html +0 -6
  312. package/src/form-submission/header/header.component.scss +0 -26
  313. package/src/form-submission/header/header.component.spec.ts +0 -21
  314. package/src/form-submission/header/header.component.ts +0 -12
  315. package/src/form-submission/navigation-tabs/navigation-tabs.component.html +0 -134
  316. package/src/form-submission/navigation-tabs/navigation-tabs.component.scss +0 -200
  317. package/src/form-submission/navigation-tabs/navigation-tabs.component.spec.ts +0 -21
  318. package/src/form-submission/navigation-tabs/navigation-tabs.component.ts +0 -134
  319. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.html +0 -207
  320. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.scss +0 -208
  321. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.spec.ts +0 -21
  322. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.ts +0 -74
  323. package/src/form-submission/save-as-draft/saveDraftModalComponent .ts +0 -60
  324. package/src/form-submission/save-as-draft/saveDraftModalComponent.html +0 -33
  325. package/src/form-submission/save-as-draft/saveDraftModalComponent.scss +0 -195
  326. package/src/form-submission/submission-container/submission-container.component.html +0 -30
  327. package/src/form-submission/submission-container/submission-container.component.scss +0 -67
  328. package/src/form-submission/submission-container/submission-container.component.spec.ts +0 -21
  329. package/src/form-submission/submission-container/submission-container.component.ts +0 -14
  330. package/src/form-submission/submit-form/submit-form.component.html +0 -76
  331. package/src/form-submission/submit-form/submit-form.component.scss +0 -88
  332. package/src/form-submission/submit-form/submit-form.component.spec.ts +0 -21
  333. package/src/form-submission/submit-form/submit-form.component.ts +0 -1953
  334. package/src/lib/form-submission.component.html +0 -15
  335. package/src/lib/form-submission.component.scss +0 -1
  336. package/src/lib/form-submission.component.ts +0 -120
  337. package/src/lib/form-submission.module.ts +0 -31
  338. package/src/lib/form-submission.service.spec.ts +0 -16
  339. package/src/lib/form-submission.service.ts +0 -9
  340. package/src/models/aggregate.model.ts +0 -4
  341. package/src/models/appearance.model.ts +0 -64
  342. package/src/models/elementOptionAPI.model.ts +0 -13
  343. package/src/models/elementOptionAPIData.model.ts +0 -5
  344. package/src/models/elementOptionDB.model.ts +0 -9
  345. package/src/models/elementOptionDBCriteria.model.ts +0 -7
  346. package/src/models/enum/elementType .enum.ts +0 -22
  347. package/src/models/enum/entityType.enum.ts +0 -10
  348. package/src/models/logic.model.ts +0 -11
  349. package/src/models/multifields.model.ts +0 -12
  350. package/src/models/page.model.ts +0 -7
  351. package/src/models/publicForm.model.ts +0 -19
  352. package/src/models/question.model.ts +0 -27
  353. package/src/models/questionAnswer.model.ts +0 -8
  354. package/src/models/questionGroup.model.ts +0 -12
  355. package/src/models/response.model.ts +0 -9
  356. package/src/models/result.model.ts +0 -5
  357. package/src/models/scoring.model.ts +0 -10
  358. package/src/models/section.model.ts +0 -6
  359. package/src/models/subForm.model.ts +0 -25
  360. package/src/models/subformConfiguration.model.ts +0 -4
  361. package/src/models/subformPropery.model.ts +0 -8
  362. package/src/models/validation.model.ts +0 -48
  363. package/src/models/whenClause.model.ts +0 -7
  364. package/src/question/card-subform/card-subform.component.html +0 -282
  365. package/src/question/card-subform/card-subform.component.scss +0 -49
  366. package/src/question/card-subform/card-subform.component.spec.ts +0 -21
  367. package/src/question/card-subform/card-subform.component.ts +0 -407
  368. package/src/question/confirm-dialog/confirm-dialog.component.html +0 -32
  369. package/src/question/confirm-dialog/confirm-dialog.component.scss +0 -109
  370. package/src/question/confirm-dialog/confirm-dialog.component.spec.ts +0 -21
  371. package/src/question/confirm-dialog/confirm-dialog.component.ts +0 -24
  372. package/src/question/form-elements/form-elements.component.html +0 -28
  373. package/src/question/form-elements/form-elements.component.scss +0 -0
  374. package/src/question/form-elements/form-elements.component.spec.ts +0 -21
  375. package/src/question/form-elements/form-elements.component.ts +0 -41
  376. package/src/question/inline-multiple-subform/inline-multiple-subform.component.html +0 -321
  377. package/src/question/inline-multiple-subform/inline-multiple-subform.component.scss +0 -78
  378. package/src/question/inline-multiple-subform/inline-multiple-subform.component.spec.ts +0 -21
  379. package/src/question/inline-multiple-subform/inline-multiple-subform.component.ts +0 -425
  380. package/src/question/multifields/multifields.component.html +0 -78
  381. package/src/question/multifields/multifields.component.scss +0 -6
  382. package/src/question/multifields/multifields.component.spec.ts +0 -21
  383. package/src/question/multifields/multifields.component.ts +0 -27
  384. package/src/question/multiple-subform/multiple-subform.component.html +0 -185
  385. package/src/question/multiple-subform/multiple-subform.component.scss +0 -52
  386. package/src/question/multiple-subform/multiple-subform.component.spec.ts +0 -21
  387. package/src/question/multiple-subform/multiple-subform.component.ts +0 -481
  388. package/src/question/question/question.component.html +0 -51
  389. package/src/question/question/question.component.scss +0 -0
  390. package/src/question/question/question.component.spec.ts +0 -21
  391. package/src/question/question/question.component.ts +0 -129
  392. package/src/question/question-group/question-group.component.html +0 -147
  393. package/src/question/question-group/question-group.component.scss +0 -36
  394. package/src/question/question-group/question-group.component.spec.ts +0 -21
  395. package/src/question/question-group/question-group.component.ts +0 -94
  396. package/src/question/question.module.ts +0 -22
  397. package/src/question/recursive-logic/recursive-logic.component.html +0 -33
  398. package/src/question/recursive-logic/recursive-logic.component.scss +0 -0
  399. package/src/question/recursive-logic/recursive-logic.component.spec.ts +0 -21
  400. package/src/question/recursive-logic/recursive-logic.component.ts +0 -29
  401. package/src/question/sub-form/sub-form.component.html +0 -254
  402. package/src/question/sub-form/sub-form.component.scss +0 -83
  403. package/src/question/sub-form/sub-form.component.spec.ts +0 -21
  404. package/src/question/sub-form/sub-form.component.ts +0 -421
  405. package/src/services/aggregate.service.ts +0 -148
  406. package/src/services/countryService.ts +0 -92
  407. package/src/services/data.service.ts +0 -36
  408. package/src/services/element-tracker.service.spec.ts +0 -16
  409. package/src/services/element-tracker.service.ts +0 -24
  410. package/src/services/form-validation.service.ts +0 -151
  411. package/src/services/form.service.spec.ts +0 -16
  412. package/src/services/form.service.ts +0 -407
  413. package/src/services/mapper.service.ts +0 -625
  414. package/src/services/recaptcha.service.spec.ts +0 -16
  415. package/src/services/recaptcha.service.ts +0 -179
  416. package/src/services/score.service.ts +0 -352
  417. package/src/services/subform-copy.service.ts +0 -148
  418. package/src/services/validation.service.spec.ts +0 -16
  419. package/src/services/validation.service.ts +0 -33
  420. package/src/services/whenClause.service.ts +0 -502
  421. package/src/shared/shared.module.ts +0 -58
  422. package/src/styles/shared-style.scss +0 -86
  423. package/src/sub-form/sub-form.module.ts +0 -24
  424. package/src/sub-form/submission-modal/submission-modal.component.html +0 -160
  425. package/src/sub-form/submission-modal/submission-modal.component.scss +0 -54
  426. package/src/sub-form/submission-modal/submission-modal.component.spec.ts +0 -21
  427. package/src/sub-form/submission-modal/submission-modal.component.ts +0 -127
  428. package/tsconfig.lib.json +0 -14
  429. package/tsconfig.lib.prod.json +0 -10
  430. package/tsconfig.spec.json +0 -14
  431. /package/{src/assets → assets}/fonts/Garamond.woff2 +0 -0
  432. /package/{src/assets → assets}/fonts/Georgia.woff2 +0 -0
  433. /package/{src/assets → assets}/fonts/Poppins.woff2 +0 -0
  434. /package/{src/assets → assets}/fonts/Tahoma.woff2 +0 -0
  435. /package/{src/assets → assets}/fonts/Tajawal.woff2 +0 -0
  436. /package/{src/assets → assets}/fonts/Verdana.woff2 +0 -0
  437. /package/{src/assets → assets}/icons/close-sidebar-mark-icon.svg +0 -0
  438. /package/{src/assets → assets}/icons/copy-icon.svg +0 -0
  439. /package/{src/assets → assets}/icons/delete-icon.svg +0 -0
  440. /package/{src/assets → assets}/icons/delete-no-outline-icon.svg +0 -0
  441. /package/{src/assets → assets}/icons/left_arrow.svg +0 -0
  442. /package/{src/assets → assets}/icons/right_arrow.svg +0 -0
@@ -0,0 +1,413 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { MatDialogConfig } from '@angular/material/dialog';
3
+ import { SubmissionModalComponent } from '../../sub-form/submission-modal/submission-modal.component';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/material/dialog";
6
+ import * as i2 from "@angular/platform-browser";
7
+ import * as i3 from "../../services/score.service";
8
+ import * as i4 from "../../services/whenClause.service";
9
+ import * as i5 from "@angular/common";
10
+ import * as i6 from "@angular/material/table";
11
+ import * as i7 from "@angular/material/menu";
12
+ import * as i8 from "@angular/material/icon";
13
+ export class MultipleSubformComponent {
14
+ constructor(dialog, sanitizer, scoreCalcService, whenClauseService) {
15
+ this.dialog = dialog;
16
+ this.sanitizer = sanitizer;
17
+ this.scoreCalcService = scoreCalcService;
18
+ this.whenClauseService = whenClauseService;
19
+ this.subForm = {};
20
+ this.subFormChange = new EventEmitter();
21
+ this.acceptedLanguage = '';
22
+ this.submissions = [];
23
+ this.deletedSubmissions = [];
24
+ this.displayedColumns = [];
25
+ this.addButtonLabel = 'Add New Submission';
26
+ }
27
+ ngOnInit() {
28
+ const { goodMax, badMax } = this.scoreCalcService.getMaxPossibleScore(this.subForm);
29
+ this.maxPossibleGoodScore = goodMax;
30
+ this.maxPossibleBadScore = badMax;
31
+ if (this.subForm?.submissions) {
32
+ this.submissions = this.subForm.submissions;
33
+ this.subForm.deletedSubmissions = [];
34
+ }
35
+ if (this.subForm?.property?.addButtonLabel) {
36
+ this.addButtonLabel = this.subForm.property.addButtonLabel;
37
+ }
38
+ this.initializeDisplayedColumns();
39
+ this.whenClauseService.addGridsFromSubform(this.subForm);
40
+ }
41
+ initializeDisplayedColumns() {
42
+ this.displayedColumns = this.subForm.rows.flatMap((item) => item.grid
43
+ .filter((gridItem) => gridItem.element?.formElement?.elementType !== 'HIDDEN_FIELD')
44
+ .map((gridItem) => gridItem.element.question));
45
+ this.displayedColumns.push('actions');
46
+ }
47
+ getAnswerByQuestionId(submission, question) {
48
+ const questionId = question.element.id;
49
+ const answerObj = submission.answers.find((answer) => answer.questionId === questionId);
50
+ if (!answerObj) {
51
+ return null;
52
+ }
53
+ let content = '';
54
+ if (answerObj.answer) {
55
+ if (Array.isArray(answerObj.answer)) {
56
+ const processedItems = answerObj.answer.map((item) => {
57
+ if (typeof item === 'string' && item.includes('|')) {
58
+ return item.split('|')[0];
59
+ }
60
+ return item;
61
+ });
62
+ content = processedItems.join(', ');
63
+ }
64
+ else if (typeof answerObj.answer === 'string') {
65
+ content = answerObj.answer.includes('|')
66
+ ? answerObj.answer.split('|')[0]
67
+ : answerObj.answer;
68
+ }
69
+ }
70
+ let currencySymbol = '';
71
+ if (question.element.formElement.elementType === 'CURRENCY') {
72
+ currencySymbol = this.fetchCurrencySymbol(question.element);
73
+ answerObj['htmlContent'] = this.sanitizer.bypassSecurityTrustHtml(currencySymbol + ' ' + content);
74
+ }
75
+ else {
76
+ answerObj['htmlContent'] = this.sanitizer.bypassSecurityTrustHtml(content);
77
+ }
78
+ return answerObj;
79
+ }
80
+ fetchCurrencySymbol(question) {
81
+ let currencySymbol = '';
82
+ if (question.formElement?.appearance?.currency) {
83
+ let userLocaleCureency = question.formElement?.appearance?.currency;
84
+ if (question.formElement.appearance.currencyOption) {
85
+ let currencyOption = question.formElement.appearance.currencyOption;
86
+ if (currencyOption == 'auto') {
87
+ if (question.formElement.appearance.limitCurrencySymbol &&
88
+ question.formElement.appearance.limitCurrencySymbol.length > 0) {
89
+ currencySymbol =
90
+ question.formElement.appearance.limitCurrencySymbol.includes(userLocaleCureency)
91
+ ? userLocaleCureency
92
+ : question.formElement?.appearance?.currencySymbol;
93
+ }
94
+ else {
95
+ currencySymbol = userLocaleCureency;
96
+ }
97
+ }
98
+ else if (currencyOption == 'specific') {
99
+ currencySymbol =
100
+ question.formElement?.appearance?.specificCurrencySymbol;
101
+ }
102
+ }
103
+ }
104
+ if (!currencySymbol &&
105
+ question.formElement?.appearance?.currencySymbol) {
106
+ currencySymbol =
107
+ question.formElement?.appearance?.currencySymbol;
108
+ }
109
+ return currencySymbol;
110
+ }
111
+ subFormSubmission(subForm) {
112
+ const processFormElements = (rows, isChild = false) => {
113
+ const answers = [];
114
+ rows.flatMap((item) => item.grid.forEach((formElement) => {
115
+ const answer = {
116
+ questionId: formElement.element.id,
117
+ answer: formElement.element?.answer || '',
118
+ files: formElement.element.formElement.elementType == 'FILE_PICKER' &&
119
+ formElement.element.answer
120
+ ? formElement.element.answer
121
+ : undefined,
122
+ isChild: isChild,
123
+ amountInWords: formElement.element.amountInWords
124
+ };
125
+ if (formElement.element.formElement.elementType == 'FILE_PICKER' &&
126
+ formElement.element.answer) {
127
+ const fileNames = formElement.element.answer.map((file) => file?._file.name);
128
+ answer.answer = fileNames;
129
+ }
130
+ answers.push(answer);
131
+ if (formElement.element.formElement &&
132
+ (formElement.element.formElement.elementType === 'DROP_DOWN' ||
133
+ formElement.element.formElement.elementType === 'RADIO_BUTTON' ||
134
+ formElement.element.formElement.elementType === 'CHECKBOX') &&
135
+ formElement.element.formElement.scoring &&
136
+ formElement.element.formElement.scoring.enableScoring) {
137
+ answers.forEach((ans) => {
138
+ if (formElement.element.id === ans.questionId) {
139
+ const scoreResult = this.scoreCalcService.calculateScoreFromAnswer(ans.answer, formElement.element);
140
+ // Save total score and individual scores
141
+ // ans.score = scoreResult?.totalScore ?? 1;
142
+ ans.scores = scoreResult?.scores;
143
+ }
144
+ });
145
+ }
146
+ if (formElement.element.childLogics) {
147
+ formElement.element.childLogics.forEach((logic) => {
148
+ if (logic.showLogic) {
149
+ answers.push(...processFormElements(logic.rows, true));
150
+ logic.showLogic = false;
151
+ }
152
+ });
153
+ }
154
+ }));
155
+ return answers;
156
+ };
157
+ const answers = processFormElements(subForm.rows);
158
+ if (answers.length > 0) {
159
+ const submission = {
160
+ submissionId: '',
161
+ answers: answers,
162
+ };
163
+ if (this.scoreCalcService.shouldCalculateScore(this.subForm, submission)) {
164
+ // Mark that this submission had all scoring questions answered at least once
165
+ submission.hasAllScoringAnsweredOnce = true;
166
+ }
167
+ if (submission.hasAllScoringAnsweredOnce) {
168
+ // Recalculate score always after once satisfied
169
+ submission.scores = this.scoreCalcService.calculateSubmissionScore(submission.answers);
170
+ }
171
+ this.submissions.push(submission);
172
+ this.submissions = [...this.submissions];
173
+ this.updateSubFormWithSubmissions();
174
+ }
175
+ // this.subForm.score = this.scoreCalcService.calculateFinalScore(this.submissions,this.maxPossibleScore);
176
+ }
177
+ editSubFormSubmission(index, submission) {
178
+ const subForm = this.bindAnswers(this.subForm, submission);
179
+ const dialogConfig = new MatDialogConfig();
180
+ dialogConfig.position = { top: '5%' };
181
+ dialogConfig.width = '100%';
182
+ dialogConfig.data = {
183
+ subForm: subForm,
184
+ acceptedLanguage: this.acceptedLanguage,
185
+ };
186
+ dialogConfig.hasBackdrop = true;
187
+ dialogConfig.disableClose = true;
188
+ dialogConfig.maxHeight = '80vh';
189
+ const dialogRef = this.dialog.open(SubmissionModalComponent, dialogConfig);
190
+ dialogRef.afterClosed().subscribe((result) => {
191
+ if (result) {
192
+ this.updateSubmission(result, index);
193
+ }
194
+ });
195
+ }
196
+ bindAnswers(subForm, submission) {
197
+ const bindElementAnswers = (rows, answers) => {
198
+ rows.forEach((row) => {
199
+ row.grid.forEach((grid) => {
200
+ const answer = answers.find((a) => a.questionId === grid.element.id);
201
+ if (answer) {
202
+ grid.element.answer =
203
+ grid.element.formElement.elementType == 'FILE_PICKER'
204
+ ? answer?.files
205
+ : answer.answer;
206
+ grid.element.amountInWords = answer?.amountInWords;
207
+ grid.element.answerId = answer.answerId;
208
+ grid.element.attachments = answer.attachments;
209
+ }
210
+ if (grid.element.childLogics) {
211
+ grid.element.childLogics.forEach((logic) => {
212
+ bindElementAnswers(logic.rows, answers);
213
+ });
214
+ }
215
+ });
216
+ });
217
+ };
218
+ const updatedSubForm = { ...subForm };
219
+ bindElementAnswers(updatedSubForm.rows, submission.answers);
220
+ return updatedSubForm;
221
+ }
222
+ deleteSubForm(index) {
223
+ const submission = this.submissions[index];
224
+ if (submission.submissionId) {
225
+ this.deletedSubmissions.push(submission.submissionId);
226
+ }
227
+ this.submissions.splice(index, 1);
228
+ this.submissions = [...this.submissions];
229
+ this.subForm.scores = this.scoreCalcService.calculateFinalScore(this.submissions, this.maxPossibleGoodScore, this.maxPossibleBadScore);
230
+ this.updateSubFormWithSubmissions();
231
+ }
232
+ addNewSubmission() {
233
+ const subForm = this.cleanCircularReferences(this.subForm);
234
+ subForm.rows.forEach((row) => {
235
+ row.grid.forEach((grid) => {
236
+ grid.element.answer = grid.element.formElement.elementType === 'FILE_PICKER' ? [] : '';
237
+ grid.element.attachments = [];
238
+ grid.element.answerId = null;
239
+ });
240
+ });
241
+ const dialogConfig = new MatDialogConfig();
242
+ dialogConfig.position = { top: '5%' };
243
+ dialogConfig.width = '100%';
244
+ dialogConfig.data = {
245
+ subForm: subForm,
246
+ acceptedLanguage: this.acceptedLanguage,
247
+ };
248
+ dialogConfig.hasBackdrop = true;
249
+ dialogConfig.disableClose = true;
250
+ dialogConfig.maxHeight = '80vh';
251
+ dialogConfig.autoFocus = false;
252
+ const dialogRef = this.dialog.open(SubmissionModalComponent, dialogConfig);
253
+ dialogRef.afterClosed().subscribe((result) => {
254
+ if (result) {
255
+ const hasData = result.rows.flatMap((item) => item.grid.some((formElement) => formElement.element.answer &&
256
+ formElement.element.answer.length > 0));
257
+ if (hasData) {
258
+ this.subFormSubmission(result);
259
+ }
260
+ }
261
+ });
262
+ }
263
+ cleanCircularReferences(obj, seen = new WeakSet()) {
264
+ if (obj === null || typeof obj !== 'object') {
265
+ return obj;
266
+ }
267
+ if (seen.has(obj)) {
268
+ return;
269
+ }
270
+ seen.add(obj);
271
+ const cleanedObj = Array.isArray(obj) ? [] : {};
272
+ for (const key in obj) {
273
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
274
+ cleanedObj[key] = this.cleanCircularReferences(obj[key], seen);
275
+ }
276
+ }
277
+ return cleanedObj;
278
+ }
279
+ updateSubmission(result, index) {
280
+ const processFormElements = (rows, answers) => {
281
+ rows.forEach((row) => {
282
+ row.grid.forEach((grid) => {
283
+ let answer = {
284
+ questionId: grid.element.id,
285
+ answerId: grid.element?.answerId || '',
286
+ attachments: grid.element.attachments || [],
287
+ answer: [],
288
+ files: [],
289
+ deleteFiles: [],
290
+ };
291
+ if (answer.attachments) {
292
+ answer.answer = answer.attachments.map((attachment) => attachment.fileName);
293
+ }
294
+ if (grid.element.formElement.elementType === 'FILE_PICKER') {
295
+ if (grid.element?.deleteFiles.length > 0) {
296
+ answer.answer = []; // Reset answer.answer only once
297
+ answer.deleteFiles = answer.deleteFiles || [];
298
+ // Collect deleted file IDs
299
+ grid.element.deleteFiles.forEach((deletedId) => {
300
+ answer.deleteFiles?.push(deletedId);
301
+ });
302
+ if (answer.attachments) {
303
+ // Filter out deleted attachments
304
+ answer.attachments = answer.attachments.filter((attachment) => {
305
+ if (!grid.element.deleteFiles.includes(attachment.fileId)) {
306
+ return true;
307
+ }
308
+ return false;
309
+ });
310
+ // Rebuild answer.answer with the remaining attachments
311
+ answer.answer = answer.attachments.map((attachment) => attachment.fileName);
312
+ }
313
+ }
314
+ if (grid.element.answer) {
315
+ answer.files = grid.element.answer;
316
+ let fileNamesArray = Array.isArray(answer.answer) ? [...answer.answer] : [];
317
+ grid.element.answer.forEach((file) => {
318
+ const fileName = file._file?.name;
319
+ if (!fileNamesArray.includes(fileName)) {
320
+ fileNamesArray.push(fileName);
321
+ }
322
+ });
323
+ answer.answer = fileNamesArray; // Append to existing array instead of overwriting
324
+ }
325
+ }
326
+ else {
327
+ answer = {
328
+ questionId: grid.element.id,
329
+ answerId: grid.element?.answerId || '',
330
+ attachments: grid.element.attachments,
331
+ answer: grid.element.answer,
332
+ maximumPossibleScore: grid.element.maxPossibleScore,
333
+ amountInWords: grid.element.amountInWords
334
+ };
335
+ }
336
+ grid.element.answer = '';
337
+ answers.push(answer);
338
+ if (grid.element.formElement &&
339
+ (grid.element.formElement.elementType === 'DROP_DOWN' ||
340
+ grid.element.formElement.elementType === 'RADIO_BUTTON' ||
341
+ grid.element.formElement.elementType === 'CHECK_BOX') &&
342
+ grid.element.formElement.scoring &&
343
+ grid.element.formElement.scoring.enableScoring) {
344
+ answers.forEach((ans) => {
345
+ if (grid.element.id === ans.questionId) {
346
+ const scoreResult = this.scoreCalcService.calculateScoreFromAnswer(ans.answer, grid.element);
347
+ // Save total score and individual scores
348
+ ans.scores = scoreResult?.scores;
349
+ }
350
+ });
351
+ }
352
+ if (grid.element.childLogics) {
353
+ grid.element.childLogics.forEach((logic) => {
354
+ if (logic.showLogic) {
355
+ processFormElements(logic.rows, answers);
356
+ }
357
+ });
358
+ }
359
+ });
360
+ });
361
+ };
362
+ this.submissions[index].answers = [];
363
+ processFormElements(result.rows, this.submissions[index].answers);
364
+ this.submissions[index].scores = this.scoreCalcService.calculateSubmissionScore(this.submissions[index].answers);
365
+ this.submissions = [...this.submissions];
366
+ const hasAnyScore = this.submissions.some(sub => sub.scores?.some(s => s.score !== null && s.score !== undefined));
367
+ if (hasAnyScore) {
368
+ this.subForm.scores = this.scoreCalcService.calculateFinalScore(this.submissions, this.maxPossibleGoodScore, this.maxPossibleBadScore);
369
+ }
370
+ else {
371
+ this.subForm.scores = null; // or 0, depending on how you want to represent "no score yet"
372
+ }
373
+ this.updateSubFormWithSubmissions();
374
+ this.clearEmptyRows();
375
+ }
376
+ updateSubFormWithSubmissions() {
377
+ this.subForm.submissions = this.submissions;
378
+ this.subForm.maxPossibleScore = {
379
+ 'good': this.maxPossibleGoodScore,
380
+ 'bad': this.maxPossibleBadScore
381
+ };
382
+ this.subForm.deletedSubmissions = this.deletedSubmissions;
383
+ this.subFormChange.emit(this.subForm);
384
+ }
385
+ clearEmptyRows() {
386
+ const nonEmptySubmissions = [];
387
+ const emptySubmissionIds = [];
388
+ this.submissions.forEach((submission) => {
389
+ if (submission.answers.some((answer) => answer.answer !== '')) {
390
+ nonEmptySubmissions.push(submission);
391
+ }
392
+ else if (submission.submissionId) {
393
+ emptySubmissionIds.push(submission.submissionId);
394
+ }
395
+ });
396
+ this.submissions = nonEmptySubmissions;
397
+ this.deletedSubmissions.push(...emptySubmissionIds);
398
+ this.updateSubFormWithSubmissions();
399
+ }
400
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultipleSubformComponent, deps: [{ token: i1.MatDialog }, { token: i2.DomSanitizer }, { token: i3.ScoreCalculationService }, { token: i4.WhenClauseService }], target: i0.ɵɵFactoryTarget.Component }); }
401
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MultipleSubformComponent, selector: "lib-multiple-subform", inputs: { subForm: "subForm", acceptedLanguage: "acceptedLanguage" }, outputs: { subFormChange: "subFormChange" }, ngImport: i0, template: "<div class=\"example-container\" tabindex=\"0\">\r\n <div class=\"table-container\">\r\n <table mat-table [dataSource]=\"submissions\" class=\"mat-elevation-z8\">\r\n <ng-container *ngFor=\"let row of subForm.rows\">\r\n <ng-container\r\n *ngFor=\"let formElement of row.grid\"\r\n [matColumnDef]=\"formElement.element.question\"\r\n >\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n class=\"border border-1 column-width\"\r\n >\r\n {{ formElement.element.question }}\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let submission\"\r\n class=\"border border-1\"\r\n [id]=\"'question-'+submission.submissionId\"\r\n [ngClass]=\"{\r\n hidden: getAnswerByQuestionId(submission, formElement)\r\n ?.isChild\r\n }\"\r\n >\r\n <div\r\n [innerHTML]=\"\r\n getAnswerByQuestionId(submission, formElement)\r\n ?.htmlContent\r\n \"\r\n ></div>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container matColumnDef=\"actions\" stickyEnd>\r\n <th mat-header-cell *matHeaderCellDef class=\"border border-1\">\r\n Actions\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let submission; let i = index\"\r\n class=\"text-center border border-1\"\r\n >\r\n <div>\r\n <button\r\n class=\"btn\"\r\n mat-icon-button\r\n [matMenuTriggerFor]=\"menu\"\r\n aria-label=\"Example icon-button with a menu\"\r\n >\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <button\r\n mat-menu-item\r\n (click)=\"editSubFormSubmission(i, submission)\"\r\n >\r\n <svg\r\n width=\"29\"\r\n height=\"28\"\r\n viewBox=\"0 0 29 28\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <rect\r\n x=\"0.5\"\r\n y=\"0.5\"\r\n width=\"28\"\r\n height=\"26.4737\"\r\n rx=\"5.5\"\r\n fill=\"white\"\r\n stroke=\"#D8D8D8\"\r\n />\r\n <path\r\n fill-rule=\"evenodd\"\r\n clip-rule=\"evenodd\"\r\n d=\"M12.0009 19.0787H9.1582V16.2361C9.1582 15.9447 9.2739 15.6653 9.47999 15.4593L16.2224 8.71686C16.4284 8.5105 16.708 8.39453 16.9995 8.39453C17.2911 8.39453 17.5707 8.5105 17.7767 8.71686L19.5201 10.4603C19.7264 10.6663 19.8424 10.9458 19.8424 11.2374C19.8424 11.529 19.7264 11.8086 19.5201 12.0145L12.7777 18.757C12.5715 18.9628 12.2922 19.0785 12.0009 19.0787Z\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M15.1704 10.3984L17.8415 13.0695\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <button mat-menu-item (click)=\"deleteSubForm(i)\">\r\n <svg\r\n width=\"29\"\r\n height=\"28\"\r\n viewBox=\"0 0 29 28\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <rect\r\n x=\"0.5\"\r\n y=\"0.5\"\r\n width=\"27.6402\"\r\n height=\"26.1328\"\r\n rx=\"5.5\"\r\n fill=\"white\"\r\n stroke=\"#D8D8D8\"\r\n />\r\n <path\r\n d=\"M8.60449 9.20637H20.0354\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M19.2189 9.20703V17.7863C19.2189 18.6482 18.4881 19.3462 17.5859 19.3462H11.0539C10.1517 19.3462 9.4209 18.6482 9.4209 17.7863V9.20703\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M16.7696 6.67122H11.8706\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M12.6871 12.3242V16.2239\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M15.9532 12.3242V16.2239\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"footer\">\r\n <div class=\"addNewBtn\" (click)=\"addNewSubmission()\">\r\n <svg\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n fill-rule=\"evenodd\"\r\n clip-rule=\"evenodd\"\r\n d=\"M12.5556 13.2778H2.44444C1.64639 13.2778 1 12.6673 1 11.9136V2.3642C1 1.61048 1.64639 1 2.44444 1H12.5556C13.3536 1 14 1.61048 14 2.3642V11.9136C14 12.6673 13.3536 13.2778 12.5556 13.2778Z\"\r\n stroke=\"#D8D8D8\"\r\n stroke-width=\"0.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M5.3335 7.50347H9.66683\"\r\n stroke=\"#084FFF\"\r\n stroke-width=\"0.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M7.50005 5.33594V9.66927\"\r\n stroke=\"#084FFF\"\r\n stroke-width=\"0.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <a class=\"ms-2 text-decoration-none\">{{addButtonLabel}}</a>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".table-container{overflow-x:auto;width:100%}.table-container .mat-table-sticky{background:#fff;z-index:1}.footer{display:flex;justify-content:flex-end;align-items:center;cursor:pointer;margin-top:15px}.hidden{display:none}.dropdown-menu{position:relative;z-index:999}::-webkit-scrollbar{width:2px;height:8px}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{background-color:#dbd9d9;border-radius:6px}::ng-deep .mat-mdc-menu-panel{min-width:65px!important}table{border-collapse:separate!important}.column-width{min-width:300px;max-width:500px;white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
402
+ }
403
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultipleSubformComponent, decorators: [{
404
+ type: Component,
405
+ args: [{ selector: 'lib-multiple-subform', template: "<div class=\"example-container\" tabindex=\"0\">\r\n <div class=\"table-container\">\r\n <table mat-table [dataSource]=\"submissions\" class=\"mat-elevation-z8\">\r\n <ng-container *ngFor=\"let row of subForm.rows\">\r\n <ng-container\r\n *ngFor=\"let formElement of row.grid\"\r\n [matColumnDef]=\"formElement.element.question\"\r\n >\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n class=\"border border-1 column-width\"\r\n >\r\n {{ formElement.element.question }}\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let submission\"\r\n class=\"border border-1\"\r\n [id]=\"'question-'+submission.submissionId\"\r\n [ngClass]=\"{\r\n hidden: getAnswerByQuestionId(submission, formElement)\r\n ?.isChild\r\n }\"\r\n >\r\n <div\r\n [innerHTML]=\"\r\n getAnswerByQuestionId(submission, formElement)\r\n ?.htmlContent\r\n \"\r\n ></div>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container matColumnDef=\"actions\" stickyEnd>\r\n <th mat-header-cell *matHeaderCellDef class=\"border border-1\">\r\n Actions\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let submission; let i = index\"\r\n class=\"text-center border border-1\"\r\n >\r\n <div>\r\n <button\r\n class=\"btn\"\r\n mat-icon-button\r\n [matMenuTriggerFor]=\"menu\"\r\n aria-label=\"Example icon-button with a menu\"\r\n >\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <button\r\n mat-menu-item\r\n (click)=\"editSubFormSubmission(i, submission)\"\r\n >\r\n <svg\r\n width=\"29\"\r\n height=\"28\"\r\n viewBox=\"0 0 29 28\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <rect\r\n x=\"0.5\"\r\n y=\"0.5\"\r\n width=\"28\"\r\n height=\"26.4737\"\r\n rx=\"5.5\"\r\n fill=\"white\"\r\n stroke=\"#D8D8D8\"\r\n />\r\n <path\r\n fill-rule=\"evenodd\"\r\n clip-rule=\"evenodd\"\r\n d=\"M12.0009 19.0787H9.1582V16.2361C9.1582 15.9447 9.2739 15.6653 9.47999 15.4593L16.2224 8.71686C16.4284 8.5105 16.708 8.39453 16.9995 8.39453C17.2911 8.39453 17.5707 8.5105 17.7767 8.71686L19.5201 10.4603C19.7264 10.6663 19.8424 10.9458 19.8424 11.2374C19.8424 11.529 19.7264 11.8086 19.5201 12.0145L12.7777 18.757C12.5715 18.9628 12.2922 19.0785 12.0009 19.0787Z\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M15.1704 10.3984L17.8415 13.0695\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <button mat-menu-item (click)=\"deleteSubForm(i)\">\r\n <svg\r\n width=\"29\"\r\n height=\"28\"\r\n viewBox=\"0 0 29 28\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <rect\r\n x=\"0.5\"\r\n y=\"0.5\"\r\n width=\"27.6402\"\r\n height=\"26.1328\"\r\n rx=\"5.5\"\r\n fill=\"white\"\r\n stroke=\"#D8D8D8\"\r\n />\r\n <path\r\n d=\"M8.60449 9.20637H20.0354\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M19.2189 9.20703V17.7863C19.2189 18.6482 18.4881 19.3462 17.5859 19.3462H11.0539C10.1517 19.3462 9.4209 18.6482 9.4209 17.7863V9.20703\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M16.7696 6.67122H11.8706\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M12.6871 12.3242V16.2239\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M15.9532 12.3242V16.2239\"\r\n stroke=\"#084FFF\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"footer\">\r\n <div class=\"addNewBtn\" (click)=\"addNewSubmission()\">\r\n <svg\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n fill-rule=\"evenodd\"\r\n clip-rule=\"evenodd\"\r\n d=\"M12.5556 13.2778H2.44444C1.64639 13.2778 1 12.6673 1 11.9136V2.3642C1 1.61048 1.64639 1 2.44444 1H12.5556C13.3536 1 14 1.61048 14 2.3642V11.9136C14 12.6673 13.3536 13.2778 12.5556 13.2778Z\"\r\n stroke=\"#D8D8D8\"\r\n stroke-width=\"0.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M5.3335 7.50347H9.66683\"\r\n stroke=\"#084FFF\"\r\n stroke-width=\"0.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M7.50005 5.33594V9.66927\"\r\n stroke=\"#084FFF\"\r\n stroke-width=\"0.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <a class=\"ms-2 text-decoration-none\">{{addButtonLabel}}</a>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".table-container{overflow-x:auto;width:100%}.table-container .mat-table-sticky{background:#fff;z-index:1}.footer{display:flex;justify-content:flex-end;align-items:center;cursor:pointer;margin-top:15px}.hidden{display:none}.dropdown-menu{position:relative;z-index:999}::-webkit-scrollbar{width:2px;height:8px}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{background-color:#dbd9d9;border-radius:6px}::ng-deep .mat-mdc-menu-panel{min-width:65px!important}table{border-collapse:separate!important}.column-width{min-width:300px;max-width:500px;white-space:nowrap}\n"] }]
406
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.DomSanitizer }, { type: i3.ScoreCalculationService }, { type: i4.WhenClauseService }]; }, propDecorators: { subForm: [{
407
+ type: Input
408
+ }], subFormChange: [{
409
+ type: Output
410
+ }], acceptedLanguage: [{
411
+ type: Input
412
+ }] } });
413
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlwbGUtc3ViZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLXN1Ym1pc3Npb24vc3JjL3F1ZXN0aW9uL211bHRpcGxlLXN1YmZvcm0vbXVsdGlwbGUtc3ViZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLXN1Ym1pc3Npb24vc3JjL3F1ZXN0aW9uL211bHRpcGxlLXN1YmZvcm0vbXVsdGlwbGUtc3ViZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBYSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQzs7Ozs7Ozs7OztBQWN0RyxNQUFNLE9BQU8sd0JBQXdCO0lBWW5DLFlBQ1MsTUFBaUIsRUFDaEIsU0FBdUIsRUFDdkIsZ0JBQXlDLEVBQ3pDLGlCQUFtQztRQUhwQyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2hCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtRQUN6QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBZnBDLFlBQU8sR0FBUSxFQUFFLENBQUM7UUFDakIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3pDLHFCQUFnQixHQUFXLEVBQUUsQ0FBQztRQUV2QyxnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0IsdUJBQWtCLEdBQWEsRUFBRSxDQUFDO1FBQ2xDLHFCQUFnQixHQUFhLEVBQUUsQ0FBQztRQUNoQyxtQkFBYyxHQUFXLG9CQUFvQixDQUFDO0lBUzNDLENBQUM7SUFFSixRQUFRO1FBQ04s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QUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7UUFDdkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7SUFDdEMsQ0FBQzsrR0E3Y1Usd0JBQXdCO21HQUF4Qix3QkFBd0IsK0tDbEJyQyxtL05BeUxBOzs0RkR2S2Esd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHNCQUFzQjtpTUFLdkIsT0FBTztzQkFBZixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0UsZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ViZm9ybVByb3BlcnR5IH0gZnJvbSAnLi8uLi8uLi9tb2RlbHMvc3ViZm9ybVByb3BlcnkubW9kZWwnO1xyXG5pbXBvcnQgeyBhZGQgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ0NvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IFN1Ym1pc3Npb25Nb2RhbENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3N1Yi1mb3JtL3N1Ym1pc3Npb24tbW9kYWwvc3VibWlzc2lvbi1tb2RhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2F0dGFjaG1lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IFNjb3JlQ2FsY3VsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2NvcmUuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1Ym1pc3Npb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvc3VibWlzc2lvbi5tb2RlbCc7XHJcbmltcG9ydCB7IEFuc3dlciB9IGZyb20gJy4uLy4uL21vZGVscy9hbnN3ZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBXaGVuQ2xhdXNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3doZW5DbGF1c2Uuc2VydmljZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbXVsdGlwbGUtc3ViZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpcGxlLXN1YmZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL211bHRpcGxlLXN1YmZvcm0uY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE11bHRpcGxlU3ViZm9ybUNvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgc3ViRm9ybTogYW55ID0ge307XHJcbiAgQE91dHB1dCgpIHN1YkZvcm1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBASW5wdXQoKSBhY2NlcHRlZExhbmd1YWdlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgc3VibWlzc2lvbnM6IFN1Ym1pc3Npb25bXSA9IFtdO1xyXG4gIGRlbGV0ZWRTdWJtaXNzaW9uczogc3RyaW5nW10gPSBbXTtcclxuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGFkZEJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnQWRkIE5ldyBTdWJtaXNzaW9uJztcclxuICBtYXhQb3NzaWJsZUdvb2RTY29yZSE6bnVtYmVyO1xyXG4gIG1heFBvc3NpYmxlQmFkU2NvcmUhOm51bWJlclxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZywgXHJcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgcHJpdmF0ZSBzY29yZUNhbGNTZXJ2aWNlOiBTY29yZUNhbGN1bGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgd2hlbkNsYXVzZVNlcnZpY2U6V2hlbkNsYXVzZVNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgY29uc3QgeyBnb29kTWF4LCBiYWRNYXggfSA9IHRoaXMuc2NvcmVDYWxjU2VydmljZS5nZXRNYXhQb3NzaWJsZVNjb3JlKHRoaXMuc3ViRm9ybSk7XHJcbiAgICB0aGlzLm1heFBvc3NpYmxlR29vZFNjb3JlID0gZ29vZE1heDtcclxuICAgIHRoaXMubWF4UG9zc2libGVCYWRTY29yZSA9IGJhZE1heDtcclxuICAgIGlmICh0aGlzLnN1YkZvcm0/LnN1Ym1pc3Npb25zKSB7XHJcbiAgICAgIHRoaXMuc3VibWlzc2lvbnMgPSB0aGlzLnN1YkZvcm0uc3VibWlzc2lvbnM7XHJcbiAgICAgIHRoaXMuc3ViRm9ybS5kZWxldGVkU3VibWlzc2lvbnMgPSBbXTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuc3ViRm9ybT8ucHJvcGVydHk/LmFkZEJ1dHRvbkxhYmVsKSB7XHJcbiAgICAgIHRoaXMuYWRkQnV0dG9uTGFiZWwgPSB0aGlzLnN1YkZvcm0ucHJvcGVydHkuYWRkQnV0dG9uTGFiZWw7XHJcbiAgICAgICAgfVxyXG4gICAgdGhpcy5pbml0aWFsaXplRGlzcGxheWVkQ29sdW1ucygpO1xyXG4gICAgdGhpcy53aGVuQ2xhdXNlU2VydmljZS5hZGRHcmlkc0Zyb21TdWJmb3JtKHRoaXMuc3ViRm9ybSk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRGlzcGxheWVkQ29sdW1ucygpIHtcclxuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuc3ViRm9ybS5yb3dzLmZsYXRNYXAoKGl0ZW06IGFueSkgPT5cclxuICAgICAgaXRlbS5ncmlkXHJcbiAgICAgICAgLmZpbHRlcigoZ3JpZEl0ZW06IGFueSkgPT4gZ3JpZEl0ZW0uZWxlbWVudD8uZm9ybUVsZW1lbnQ/LmVsZW1lbnRUeXBlICE9PSAnSElEREVOX0ZJRUxEJylcclxuICAgICAgICAubWFwKChncmlkSXRlbTogYW55KSA9PiBncmlkSXRlbS5lbGVtZW50LnF1ZXN0aW9uKVxyXG4gICAgKTtcclxuICBcclxuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5wdXNoKCdhY3Rpb25zJyk7XHJcbiAgfVxyXG5cclxuICBnZXRBbnN3ZXJCeVF1ZXN0aW9uSWQoc3VibWlzc2lvbjogU3VibWlzc2lvbiwgcXVlc3Rpb246IGFueSkge1xyXG4gICAgY29uc3QgcXVlc3Rpb25JZCA9IHF1ZXN0aW9uLmVsZW1lbnQuaWQ7XHJcbiAgICBjb25zdCBhbnN3ZXJPYmogPSBzdWJtaXNzaW9uLmFuc3dlcnMuZmluZChcclxuICAgICAgKGFuc3dlcikgPT4gYW5zd2VyLnF1ZXN0aW9uSWQgPT09IHF1ZXN0aW9uSWRcclxuICAgICk7XHJcblxyXG4gICAgaWYgKCFhbnN3ZXJPYmopIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGNvbnRlbnQ6IHN0cmluZyA9ICcnO1xyXG4gICAgXHJcbiAgICBpZiAoYW5zd2VyT2JqLmFuc3dlcikge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhbnN3ZXJPYmouYW5zd2VyKSkge1xyXG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZEl0ZW1zID0gYW5zd2VyT2JqLmFuc3dlci5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiBpdGVtLmluY2x1ZGVzKCd8JykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0uc3BsaXQoJ3wnKVswXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnRlbnQgPSBwcm9jZXNzZWRJdGVtcy5qb2luKCcsICcpO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhbnN3ZXJPYmouYW5zd2VyID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnRlbnQgPSBhbnN3ZXJPYmouYW5zd2VyLmluY2x1ZGVzKCd8JylcclxuICAgICAgICAgID8gYW5zd2VyT2JqLmFuc3dlci5zcGxpdCgnfCcpWzBdXHJcbiAgICAgICAgICA6IGFuc3dlck9iai5hbnN3ZXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBjdXJyZW5jeVN5bWJvbCA9ICcnO1xyXG4gICAgaWYocXVlc3Rpb24uZWxlbWVudC5mb3JtRWxlbWVudC5lbGVtZW50VHlwZSA9PT0gJ0NVUlJFTkNZJyl7XHJcbiAgICAgIGN1cnJlbmN5U3ltYm9sID0gdGhpcy5mZXRjaEN1cnJlbmN5U3ltYm9sKHF1ZXN0aW9uLmVsZW1lbnQpO1xyXG4gICAgICBhbnN3ZXJPYmpbJ2h0bWxDb250ZW50J10gPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChjdXJyZW5jeVN5bWJvbCArICcgJyArY29udGVudCk7XHJcbiAgICB9IGVsc2V7XHJcbiAgICAgIGFuc3dlck9ialsnaHRtbENvbnRlbnQnXSA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGNvbnRlbnQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFuc3dlck9iajtcclxuICB9XHJcblxyXG4gIGZldGNoQ3VycmVuY3lTeW1ib2wocXVlc3Rpb246YW55KXtcclxuICAgIGxldCBjdXJyZW5jeVN5bWJvbCA9ICcnO1xyXG4gICAgaWYgKHF1ZXN0aW9uLmZvcm1FbGVtZW50Py5hcHBlYXJhbmNlPy5jdXJyZW5jeSkge1xyXG4gICAgICBsZXQgdXNlckxvY2FsZUN1cmVlbmN5ID0gcXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmN1cnJlbmN5O1xyXG4gICAgICBpZiAocXVlc3Rpb24uZm9ybUVsZW1lbnQuYXBwZWFyYW5jZS5jdXJyZW5jeU9wdGlvbikge1xyXG4gICAgICAgIGxldCBjdXJyZW5jeU9wdGlvbiA9XHJcbiAgICAgICAgICBxdWVzdGlvbi5mb3JtRWxlbWVudC5hcHBlYXJhbmNlLmN1cnJlbmN5T3B0aW9uO1xyXG4gICAgICAgIGlmIChjdXJyZW5jeU9wdGlvbiA9PSAnYXV0bycpIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgcXVlc3Rpb24uZm9ybUVsZW1lbnQuYXBwZWFyYW5jZS5saW1pdEN1cnJlbmN5U3ltYm9sICYmXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uLmZvcm1FbGVtZW50LmFwcGVhcmFuY2UubGltaXRDdXJyZW5jeVN5bWJvbC5sZW5ndGggPiAwXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY3VycmVuY3lTeW1ib2wgPVxyXG4gICAgICAgICAgICAgIHF1ZXN0aW9uLmZvcm1FbGVtZW50LmFwcGVhcmFuY2UubGltaXRDdXJyZW5jeVN5bWJvbC5pbmNsdWRlcyhcclxuICAgICAgICAgICAgICAgIHVzZXJMb2NhbGVDdXJlZW5jeVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgID8gdXNlckxvY2FsZUN1cmVlbmN5XHJcbiAgICAgICAgICAgICAgICA6IHF1ZXN0aW9uLmZvcm1FbGVtZW50Py5hcHBlYXJhbmNlPy5jdXJyZW5jeVN5bWJvbDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbmN5U3ltYm9sID0gdXNlckxvY2FsZUN1cmVlbmN5O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVuY3lPcHRpb24gPT0gJ3NwZWNpZmljJykge1xyXG4gICAgICAgICAgY3VycmVuY3lTeW1ib2wgPVxyXG4gICAgICAgICAgICBxdWVzdGlvbi5mb3JtRWxlbWVudD8uYXBwZWFyYW5jZT8uc3BlY2lmaWNDdXJyZW5jeVN5bWJvbDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgIWN1cnJlbmN5U3ltYm9sICYmXHJcbiAgICAgIHF1ZXN0aW9uLmZvcm1FbGVtZW50Py5hcHBlYXJhbmNlPy5jdXJyZW5jeVN5bWJvbFxyXG4gICAgKSB7XHJcbiAgICAgIGN1cnJlbmN5U3ltYm9sID1cclxuICAgICAgICBxdWVzdGlvbi5mb3JtRWxlbWVudD8uYXBwZWFyYW5jZT8uY3VycmVuY3lTeW1ib2w7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VycmVuY3lTeW1ib2w7XHJcbiAgfVxyXG5cclxuICBzdWJGb3JtU3VibWlzc2lvbihzdWJGb3JtOiBhbnkpIHtcclxuICAgIGNvbnN0IHByb2Nlc3NGb3JtRWxlbWVudHMgPSAoXHJcbiAgICAgIHJvd3M6IGFueVtdLFxyXG4gICAgICBpc0NoaWxkOiBib29sZWFuID0gZmFsc2VcclxuICAgICk6IEFuc3dlcltdID0+IHtcclxuICAgICAgY29uc3QgYW5zd2VyczogQW5zd2VyW10gPSBbXTtcclxuXHJcbiAgICAgIHJvd3MuZmxhdE1hcCgoaXRlbTogYW55KSA9PlxyXG4gICAgICAgIGl0ZW0uZ3JpZC5mb3JFYWNoKChmb3JtRWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBhbnN3ZXI6IEFuc3dlciA9IHtcclxuICAgICAgICAgICAgcXVlc3Rpb25JZDogZm9ybUVsZW1lbnQuZWxlbWVudC5pZCxcclxuICAgICAgICAgICAgYW5zd2VyOiBmb3JtRWxlbWVudC5lbGVtZW50Py5hbnN3ZXIgfHwgJycsXHJcbiAgICAgICAgICAgIGZpbGVzOlxyXG4gICAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuZm9ybUVsZW1lbnQuZWxlbWVudFR5cGUgPT0gJ0ZJTEVfUElDS0VSJyAmJlxyXG4gICAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuYW5zd2VyXHJcbiAgICAgICAgICAgICAgICA/IGZvcm1FbGVtZW50LmVsZW1lbnQuYW5zd2VyXHJcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgaXNDaGlsZDogaXNDaGlsZCxcclxuICAgICAgICAgICAgYW1vdW50SW5Xb3JkczogZm9ybUVsZW1lbnQuZWxlbWVudC5hbW91bnRJbldvcmRzXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgZm9ybUVsZW1lbnQuZWxlbWVudC5mb3JtRWxlbWVudC5lbGVtZW50VHlwZSA9PSAnRklMRV9QSUNLRVInICYmXHJcbiAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuYW5zd2VyXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVzID0gZm9ybUVsZW1lbnQuZWxlbWVudC5hbnN3ZXIubWFwKFxyXG4gICAgICAgICAgICAgIChmaWxlOiBhbnkpID0+IGZpbGU/Ll9maWxlLm5hbWVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgYW5zd2VyLmFuc3dlciA9IGZpbGVOYW1lcztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFuc3dlcnMucHVzaChhbnN3ZXIpO1xyXG4gICAgICAgICAgaWYoXHJcbiAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuZm9ybUVsZW1lbnQgJiZcclxuICAgICAgICAgICAgKGZvcm1FbGVtZW50LmVsZW1lbnQuZm9ybUVsZW1lbnQuZWxlbWVudFR5cGUgPT09ICdEUk9QX0RPV04nIHx8XHJcbiAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuZm9ybUVsZW1lbnQuZWxlbWVudFR5cGUgPT09ICdSQURJT19CVVRUT04nIHx8XHJcbiAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuZm9ybUVsZW1lbnQuZWxlbWVudFR5cGUgPT09ICdDSEVDS0JPWCcpICYmXHJcbiAgICAgICAgICAgIGZvcm1FbGVtZW50LmVsZW1lbnQuZm9ybUVsZW1lbnQuc2NvcmluZyAmJlxyXG4gICAgICAgICAgICBmb3JtRWxlbWVudC5lbGVtZW50LmZvcm1FbGVtZW50LnNjb3JpbmcuZW5hYmxlU2NvcmluZ1xyXG4gICAgICAgICAgKXtcclxuICAgICAgICAgICAgYW5zd2Vycy5mb3JFYWNoKChhbnMpID0+IHtcclxuICAgICAgICAgICAgICBpZihmb3JtRWxlbWVudC5lbGVtZW50LmlkID09PSBhbnMucXVlc3Rpb25JZCl7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY29yZVJlc3VsdCA9IHRoaXMuc2NvcmVDYWxjU2VydmljZS5jYWxjdWxhdGVTY29yZUZyb21BbnN3ZXIoYW5zLmFuc3dlciwgZm9ybUVsZW1lbnQuZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAvLyBTYXZlIHRvdGFsIHNjb3JlIGFuZCBpbmRpdmlkdWFsIHNjb3Jlc1xyXG4gICAgICAgICAgICAgICAgLy8gYW5zLnNjb3JlID0gc2NvcmVSZXN1bHQ/LnRvdGFsU2NvcmUgPz8gMTtcclxuICAgICAgICAgICAgICAgIGFucy5zY29yZXMgPSBzY29yZVJlc3VsdD8uc2NvcmVzO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZm9ybUVsZW1lbnQuZWxlbWVudC5jaGlsZExvZ2ljcykge1xyXG4gICAgICAgICAgICBmb3JtRWxlbWVudC5lbGVtZW50LmNoaWxkTG9naWNzLmZvckVhY2goKGxvZ2ljOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAobG9naWMuc2hvd0xvZ2ljKSB7XHJcbiAgICAgICAgICAgICAgICBhbnN3ZXJzLnB1c2goLi4ucHJvY2Vzc0Zvcm1FbGVtZW50cyhsb2dpYy5yb3dzLCB0cnVlKSk7XHJcbiAgICAgICAgICAgICAgICBsb2dpYy5zaG93TG9naWMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBhbnN3ZXJzO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhbnN3ZXJzID0gcHJvY2Vzc0Zvcm1FbGVtZW50cyhzdWJGb3JtLnJvd3MpO1xyXG5cclxuICAgIGlmIChhbnN3ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3Qgc3VibWlzc2lvbjogU3VibWlzc2lvbiA9IHtcclxuICAgICAgICBzdWJtaXNzaW9uSWQ6ICcnLFxyXG4gICAgICAgIGFuc3dlcnM6IGFuc3dlcnMsXHJcbiAgICAgIH07XHJcbiAgICAgIGlmICh0aGlzLnNjb3JlQ2FsY1NlcnZpY2Uuc2hvdWxkQ2FsY3VsYXRlU2NvcmUodGhpcy5zdWJGb3JtLCBzdWJtaXNzaW9uKSkge1xyXG4gICAgICAgIC8vIE1hcmsgdGhhdCB0aGlzIHN1Ym1pc3Npb24gaGFkIGFsbCBzY29yaW5nIHF1ZXN0aW9ucyBhbnN3ZXJlZCBhdCBsZWFzdCBvbmNlXHJcbiAgICAgICAgc3VibWlzc2lvbi5oYXNBbGxTY29yaW5nQW5zd2VyZWRPbmNlID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHN1Ym1pc3Npb24uaGFzQWxsU2NvcmluZ0Fuc3dlcmVkT25jZSkge1xyXG4gICAgICAgIC8vIFJlY2FsY3VsYXRlIHNjb3JlIGFsd2F5cyBhZnRlciBvbmNlIHNhdGlzZmllZFxyXG4gICAgICAgIHN1Ym1pc3Npb24uc2NvcmVzID0gdGhpcy5zY29yZUNhbGNTZXJ2aWNlLmNhbGN1bGF0ZVN1Ym1pc3Npb25TY29yZShzdWJtaXNzaW9uLmFuc3dlcnMpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3VibWlzc2lvbnMucHVzaChzdWJtaXNzaW9uKTtcclxuICAgICAgdGhpcy5zdWJtaXNzaW9ucyA9IFsuLi50aGlzLnN1Ym1pc3Npb25zXTtcclxuICAgICAgdGhpcy51cGRhdGVTdWJGb3JtV2l0aFN1Ym1pc3Npb25zKCk7XHJcbiAgICB9XHJcbiAgICAvLyB0aGlzLnN1YkZvcm0uc2NvcmUgPSB0aGlzLnNjb3JlQ2FsY1NlcnZpY2UuY2FsY3VsYXRlRmluYWxTY29yZSh0aGlzLnN1Ym1pc3Npb25zLHRoaXMubWF4UG9zc2libGVTY29yZSk7XHJcbiAgfVxyXG5cclxuICBlZGl0U3ViRm9ybVN1Ym1pc3Npb24oaW5kZXg6IG51bWJlciwgc3VibWlzc2lvbjogU3VibWlzc2lvbikge1xyXG4gICAgY29uc3Qgc3ViRm9ybSA9IHRoaXMuYmluZEFuc3dlcnModGhpcy5zdWJGb3JtLCBzdWJtaXNzaW9uKTtcclxuICAgIGNvbnN0IGRpYWxvZ0NvbmZpZyA9IG5ldyBNYXREaWFsb2dDb25maWcoKTtcclxuICAgIGRpYWxvZ0NvbmZpZy5wb3NpdGlvbiA9IHsgdG9wOiAnNSUnIH07XHJcbiAgICBkaWFsb2dDb25maWcud2lkdGggPSAnMTAwJSc7XHJcbiAgICBkaWFsb2dDb25maWcuZGF0YSA9IHtcclxuICAgICAgc3ViRm9ybTogc3ViRm9ybSxcclxuICAgICAgYWNjZXB0ZWRMYW5ndWFnZTogdGhpcy5hY2NlcHRlZExhbmd1YWdlLFxyXG4gICAgfTtcclxuICAgIGRpYWxvZ0NvbmZpZy5oYXNCYWNrZHJvcCA9IHRydWU7XHJcbiAgICBkaWFsb2dDb25maWcuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcclxuICAgIGRpYWxvZ0NvbmZpZy5tYXhIZWlnaHQgPSAnODB2aCc7XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFN1Ym1pc3Npb25Nb2RhbENvbXBvbmVudCwgZGlhbG9nQ29uZmlnKTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVN1Ym1pc3Npb24ocmVzdWx0LCBpbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYmluZEFuc3dlcnMoc3ViRm9ybTogYW55LCBzdWJtaXNzaW9uOiBTdWJtaXNzaW9uKTogYW55IHtcclxuICAgIGNvbnN0IGJpbmRFbGVtZW50QW5zd2VycyA9IChyb3dzOiBhbnlbXSwgYW5zd2VyczogQW5zd2VyW10pID0+IHtcclxuICAgICAgcm93cy5mb3JFYWNoKChyb3c6IGFueSkgPT4ge1xyXG4gICAgICAgIHJvdy5ncmlkLmZvckVhY2goKGdyaWQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgYW5zd2VyID0gYW5zd2Vycy5maW5kKChhKSA9PiBhLnF1ZXN0aW9uSWQgPT09IGdyaWQuZWxlbWVudC5pZCk7XHJcbiAgICAgICAgICBpZiAoYW5zd2VyKSB7XHJcbiAgICAgICAgICAgIGdyaWQuZWxlbWVudC5hbnN3ZXIgPVxyXG4gICAgICAgICAgICAgIGdyaWQuZWxlbWVudC5mb3JtRWxlbWVudC5lbGVtZW50VHlwZSA9PSAnRklMRV9QSUNLRVInXHJcbiAgICAgICAgICAgICAgICA/IGFuc3dlcj8uZmlsZXNcclxuICAgICAgICAgICAgICAgIDogYW5zd2VyLmFuc3dlcjtcclxuICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmFtb3VudEluV29yZHMgPSBhbnN3ZXI/LmFtb3VudEluV29yZHM7XHJcbiAgICAgICAgICAgIGdyaWQuZWxlbWVudC5hbnN3ZXJJZCA9IGFuc3dlci5hbnN3ZXJJZDtcclxuICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmF0dGFjaG1lbnRzID0gYW5zd2VyLmF0dGFjaG1lbnRzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGdyaWQuZWxlbWVudC5jaGlsZExvZ2ljcykge1xyXG4gICAgICAgICAgICBncmlkLmVsZW1lbnQuY2hpbGRMb2dpY3MuZm9yRWFjaCgobG9naWM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGJpbmRFbGVtZW50QW5zd2Vycyhsb2dpYy5yb3dzLCBhbnN3ZXJzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVkU3ViRm9ybSA9IHsgLi4uc3ViRm9ybSB9O1xyXG4gICAgYmluZEVsZW1lbnRBbnN3ZXJzKHVwZGF0ZWRTdWJGb3JtLnJvd3MsIHN1Ym1pc3Npb24uYW5zd2Vycyk7XHJcbiAgICByZXR1cm4gdXBkYXRlZFN1YkZvcm07XHJcbiAgfVxyXG5cclxuICBkZWxldGVTdWJGb3JtKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHN1Ym1pc3Npb24gPSB0aGlzLnN1Ym1pc3Npb25zW2luZGV4XTtcclxuICAgIGlmIChzdWJtaXNzaW9uLnN1Ym1pc3Npb25JZCkge1xyXG4gICAgICB0aGlzLmRlbGV0ZWRTdWJtaXNzaW9ucy5wdXNoKHN1Ym1pc3Npb24uc3VibWlzc2lvbklkKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3VibWlzc2lvbnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIHRoaXMuc3VibWlzc2lvbnMgPSBbLi4udGhpcy5zdWJtaXNzaW9uc107XHJcbiAgICB0aGlzLnN1YkZvcm0uc2NvcmVzID0gdGhpcy5zY29yZUNhbGNTZXJ2aWNlLmNhbGN1bGF0ZUZpbmFsU2NvcmUodGhpcy5zdWJtaXNzaW9ucyx0aGlzLm1heFBvc3NpYmxlR29vZFNjb3JlLHRoaXMubWF4UG9zc2libGVCYWRTY29yZSk7XHJcbiAgICB0aGlzLnVwZGF0ZVN1YkZvcm1XaXRoU3VibWlzc2lvbnMoKTtcclxuICB9XHJcblxyXG4gIGFkZE5ld1N1Ym1pc3Npb24oKSB7XHJcbiAgICBjb25zdCBzdWJGb3JtID0gdGhpcy5jbGVhbkNpcmN1bGFyUmVmZXJlbmNlcyh0aGlzLnN1YkZvcm0pO1xyXG4gICAgc3ViRm9ybS5yb3dzLmZvckVhY2goKHJvdzogYW55KSA9PiB7XHJcbiAgICAgIHJvdy5ncmlkLmZvckVhY2goKGdyaWQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGdyaWQuZWxlbWVudC5hbnN3ZXIgPSBncmlkLmVsZW1lbnQuZm9ybUVsZW1lbnQuZWxlbWVudFR5cGUgPT09ICdGSUxFX1BJQ0tFUicgPyBbXSA6ICcnO1xyXG4gICAgICAgIGdyaWQuZWxlbWVudC5hdHRhY2htZW50cyA9IFtdO1xyXG4gICAgICAgIGdyaWQuZWxlbWVudC5hbnN3ZXJJZCA9IG51bGw7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nQ29uZmlnID0gbmV3IE1hdERpYWxvZ0NvbmZpZygpO1xyXG4gICAgZGlhbG9nQ29uZmlnLnBvc2l0aW9uID0geyB0b3A6ICc1JScgfTtcclxuICAgIGRpYWxvZ0NvbmZpZy53aWR0aCA9ICcxMDAlJztcclxuICAgIGRpYWxvZ0NvbmZpZy5kYXRhID0ge1xyXG4gICAgICBzdWJGb3JtOiBzdWJGb3JtLFxyXG4gICAgICBhY2NlcHRlZExhbmd1YWdlOiB0aGlzLmFjY2VwdGVkTGFuZ3VhZ2UsXHJcbiAgICB9O1xyXG4gICAgZGlhbG9nQ29uZmlnLmhhc0JhY2tkcm9wID0gdHJ1ZTtcclxuICAgIGRpYWxvZ0NvbmZpZy5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xyXG4gICAgZGlhbG9nQ29uZmlnLm1heEhlaWdodCA9ICc4MHZoJztcclxuICAgIGRpYWxvZ0NvbmZpZy5hdXRvRm9jdXMgPSBmYWxzZTtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU3VibWlzc2lvbk1vZGFsQ29tcG9uZW50LCBkaWFsb2dDb25maWcpO1xyXG5cclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIGNvbnN0IGhhc0RhdGEgPSByZXN1bHQucm93cy5mbGF0TWFwKChpdGVtOiBhbnkpID0+XHJcbiAgICAgICAgICBpdGVtLmdyaWQuc29tZShcclxuICAgICAgICAgICAgKGZvcm1FbGVtZW50OiBhbnkpID0+XHJcbiAgICAgICAgICAgICAgZm9ybUVsZW1lbnQuZWxlbWVudC5hbnN3ZXIgJiZcclxuICAgICAgICAgICAgICBmb3JtRWxlbWVudC5lbGVtZW50LmFuc3dlci5sZW5ndGggPiAwXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGhhc0RhdGEpIHtcclxuICAgICAgICAgIHRoaXMuc3ViRm9ybVN1Ym1pc3Npb24ocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xlYW5DaXJjdWxhclJlZmVyZW5jZXMob2JqOiBhbnksIHNlZW4gPSBuZXcgV2Vha1NldCgpKSB7XHJcbiAgICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHNlZW4uYWRkKG9iaik7XHJcblxyXG4gICAgY29uc3QgY2xlYW5lZE9iajogYW55ID0gQXJyYXkuaXNBcnJheShvYmopID8gW10gOiB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcclxuICAgICAgICBjbGVhbmVkT2JqW2tleV0gPSB0aGlzLmNsZWFuQ2lyY3VsYXJSZWZlcmVuY2VzKG9ialtrZXldLCBzZWVuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbGVhbmVkT2JqO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU3VibWlzc2lvbihyZXN1bHQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgcHJvY2Vzc0Zvcm1FbGVtZW50cyA9IChyb3dzOiBhbnlbXSwgYW5zd2VyczogQW5zd2VyW10pID0+IHtcclxuICAgICAgcm93cy5mb3JFYWNoKChyb3c6IGFueSkgPT4ge1xyXG4gICAgICAgIHJvdy5ncmlkLmZvckVhY2goKGdyaWQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGFuc3dlcjogQW5zd2VyID0ge1xyXG4gICAgICAgICAgICBxdWVzdGlvbklkOiBncmlkLmVsZW1lbnQuaWQsXHJcbiAgICAgICAgICAgIGFuc3dlcklkOiBncmlkLmVsZW1lbnQ/LmFuc3dlcklkIHx8ICcnLFxyXG4gICAgICAgICAgICBhdHRhY2htZW50czogZ3JpZC5lbGVtZW50LmF0dGFjaG1lbnRzIHx8IFtdLFxyXG4gICAgICAgICAgICBhbnN3ZXI6IFtdLFxyXG4gICAgICAgICAgICBmaWxlczogW10sXHJcbiAgICAgICAgICAgIGRlbGV0ZUZpbGVzOiBbXSxcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgaWYgKGFuc3dlci5hdHRhY2htZW50cykge1xyXG4gICAgICAgICAgICBhbnN3ZXIuYW5zd2VyID0gYW5zd2VyLmF0dGFjaG1lbnRzLm1hcChcclxuICAgICAgICAgICAgICAoYXR0YWNobWVudDogQXR0YWNobWVudCkgPT4gYXR0YWNobWVudC5maWxlTmFtZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGdyaWQuZWxlbWVudC5mb3JtRWxlbWVudC5lbGVtZW50VHlwZSA9PT0gJ0ZJTEVfUElDS0VSJykge1xyXG4gICAgICAgICAgICBpZiAoZ3JpZC5lbGVtZW50Py5kZWxldGVGaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgYW5zd2VyLmFuc3dlciA9IFtdOyAvLyBSZXNldCBhbnN3ZXIuYW5zd2VyIG9ubHkgb25jZVxyXG4gICAgICAgICAgICAgIGFuc3dlci5kZWxldGVGaWxlcyA9IGFuc3dlci5kZWxldGVGaWxlcyB8fCBbXTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gQ29sbGVjdCBkZWxldGVkIGZpbGUgSURzXHJcbiAgICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmRlbGV0ZUZpbGVzLmZvckVhY2goKGRlbGV0ZWRJZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBhbnN3ZXIuZGVsZXRlRmlsZXM/LnB1c2goZGVsZXRlZElkKTtcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGFuc3dlci5hdHRhY2htZW50cykge1xyXG4gICAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBkZWxldGVkIGF0dGFjaG1lbnRzXHJcbiAgICAgICAgICAgICAgICBhbnN3ZXIuYXR0YWNobWVudHMgPSBhbnN3ZXIuYXR0YWNobWVudHMuZmlsdGVyKChhdHRhY2htZW50OiBBdHRhY2htZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghZ3JpZC5lbGVtZW50LmRlbGV0ZUZpbGVzLmluY2x1ZGVzKGF0dGFjaG1lbnQuZmlsZUlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFJlYnVpbGQgYW5zd2VyLmFuc3dlciB3aXRoIHRoZSByZW1haW5pbmcgYXR0YWNobWVudHNcclxuICAgICAgICAgICAgICAgIGFuc3dlci5hbnN3ZXIgPSBhbnN3ZXIuYXR0YWNobWVudHMubWFwKChhdHRhY2htZW50KSA9PiBhdHRhY2htZW50LmZpbGVOYW1lKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChncmlkLmVsZW1lbnQuYW5zd2VyKSB7XHJcbiAgICAgICAgICAgICAgYW5zd2VyLmZpbGVzID0gZ3JpZC5lbGVtZW50LmFuc3dlcjtcclxuICAgICAgICAgICAgICBsZXQgZmlsZU5hbWVzQXJyYXkgPSBBcnJheS5pc0FycmF5KGFuc3dlci5hbnN3ZXIpID8gWy4uLmFuc3dlci5hbnN3ZXJdIDogW107XHJcblxyXG4gICAgICAgICAgICAgIGdyaWQuZWxlbWVudC5hbnN3ZXIuZm9yRWFjaCgoZmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGUuX2ZpbGU/Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGVOYW1lc0FycmF5LmluY2x1ZGVzKGZpbGVOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICBmaWxlTmFtZXNBcnJheS5wdXNoKGZpbGVOYW1lKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgYW5zd2VyLmFuc3dlciA9IGZpbGVOYW1lc0FycmF5OyAvLyBBcHBlbmQgdG8gZXhpc3RpbmcgYXJyYXkgaW5zdGVhZCBvZiBvdmVyd3JpdGluZ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhbnN3ZXIgPSB7XHJcbiAgICAgICAgICAgICAgcXVlc3Rpb25JZDogZ3JpZC5lbGVtZW50LmlkLFxyXG4gICAgICAgICAgICAgIGFuc3dlcklkOiBncmlkLmVsZW1lbnQ/LmFuc3dlcklkIHx8ICcnLFxyXG4gICAgICAgICAgICAgIGF0dGFjaG1lbnRzOiBncmlkLmVsZW1lbnQuYXR0YWNobWVudHMsXHJcbiAgICAgICAgICAgICAgYW5zd2VyOiBncmlkLmVsZW1lbnQuYW5zd2VyLFxyXG4gICAgICAgICAgICAgIG1heGltdW1Qb3NzaWJsZVNjb3JlOiBncmlkLmVsZW1lbnQubWF4UG9zc2libGVTY29yZSxcclxuICAgICAgICAgICAgICBhbW91bnRJbldvcmRzOiBncmlkLmVsZW1lbnQuYW1vdW50SW5Xb3Jkc1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZ3JpZC5lbGVtZW50LmFuc3dlciA9ICcnO1xyXG4gICAgICAgICAgYW5zd2Vycy5wdXNoKGFuc3dlcik7XHJcbiAgICAgICAgICBpZihcclxuICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmZvcm1FbGVtZW50ICYmXHJcbiAgICAgICAgICAgIChncmlkLmVsZW1lbnQuZm9ybUVsZW1lbnQuZWxlbWVudFR5cGUgPT09ICdEUk9QX0RPV04nIHx8XHJcbiAgICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmZvcm1FbGVtZW50LmVsZW1lbnRUeXBlID09PSAnUkFESU9fQlVUVE9OJyB8fFxyXG4gICAgICAgICAgICAgIGdyaWQuZWxlbWVudC5mb3JtRWxlbWVudC5lbGVtZW50VHlwZSA9PT0gJ0NIRUNLX0JPWCcpICYmXHJcbiAgICAgICAgICAgICAgZ3JpZC5lbGVtZW50LmZvcm1FbGVtZW50LnNjb3JpbmcgJiZcclxuICAgICAgICAgICAgICBncmlkLmVsZW1lbnQuZm9ybUVsZW1lbnQuc2NvcmluZy5lbmFibGVTY29yaW5nXHJcbiAgICAgICAgICApe1xyXG4gICAgICAgICAgICBhbnN3ZXJzLmZvckVhY2goKGFucykgPT4ge1xyXG4gICAgICAgICAgICAgIGlmKGdyaWQuZWxlbWVudC5pZCA9PT0gYW5zLnF1ZXN0aW9uSWQpe1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NvcmVSZXN1bHQgPSB0aGlzLnNjb3JlQ2FsY1NlcnZpY2UuY2FsY3VsYXRlU2NvcmVGcm9tQW5zd2VyKGFucy5hbnN3ZXIsIGdyaWQuZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAvLyBTYXZlIHRvdGFsIHNjb3JlIGFuZCBpbmRpdmlkdWFsIHNjb3Jlc1xyXG4gICAgICAgICAgICAgICAgYW5zLnNjb3JlcyA9IHNjb3JlUmVzdWx0Py5zY29yZXM7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZ3JpZC5lbGVtZW50LmNoaWxkTG9naWNzKSB7XHJcbiAgICAgICAgICAgIGdyaWQuZWxlbWVudC5jaGlsZExvZ2ljcy5mb3JFYWNoKChsb2dpYzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGxvZ2ljLnNob3dMb2dpYykge1xyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Zvcm1FbGVtZW50cyhsb2dpYy5yb3dzLCBhbnN3ZXJzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5zdWJtaXNzaW9uc1tpbmRleF0uYW5zd2VycyA9IFtdO1xyXG4gICAgcHJvY2Vzc0Zvcm1FbGVtZW50cyhyZXN1bHQucm93cywgdGhpcy5zdWJtaXNzaW9uc1tpbmRleF0uYW5zd2Vycyk7XHJcbiAgICB0aGlzLnN1Ym1pc3Npb25zW2luZGV4XS5zY29yZXMgPSB0aGlzLnNjb3JlQ2FsY1NlcnZpY2UuY2FsY3VsYXRlU3VibWlzc2lvblNjb3JlKHRoaXMuc3VibWlzc2lvbnNbaW5kZXhdLmFuc3dlcnMpO1xyXG4gICAgdGhpcy5zdWJtaXNzaW9ucyA9IFsuLi50aGlzLnN1Ym1pc3Npb25zXTtcclxuICAgIGNvbnN0IGhhc0FueVNjb3JlID0gdGhpcy5zdWJtaXNzaW9ucy5zb21lKFxyXG4gICAgICBzdWIgPT4gc3ViLnNjb3Jlcz8uc29tZShzID0+IHMuc2NvcmUgIT09IG51bGwgJiYgcy5zY29yZSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgKTtcclxuICAgIFxyXG4gICAgaWYgKGhhc0FueVNjb3JlKSB7XHJcbiAgICAgIHRoaXMuc3ViRm9ybS5zY29yZXMgPSB0aGlzLnNjb3JlQ2FsY1NlcnZpY2UuY2FsY3VsYXRlRmluYWxTY29yZSh0aGlzLnN1Ym1pc3Npb25zLHRoaXMubWF4UG9zc2libGVHb29kU2NvcmUsdGhpcy5tYXhQb3NzaWJsZUJhZFNjb3JlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3ViRm9ybS5zY29yZXMgPSBudWxsOyAvLyBvciAwLCBkZXBlbmRpbmcgb24gaG93IHlvdSB3YW50IHRvIHJlcHJlc2VudCBcIm5vIHNjb3JlIHlldFwiXHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZVN1YkZvcm1XaXRoU3VibWlzc2lvbnMoKTtcclxuICAgIHRoaXMuY2xlYXJFbXB0eVJvd3MoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVN1YkZvcm1XaXRoU3VibWlzc2lvbnMoKSB7XHJcbiAgICB0aGlzLnN1YkZvcm0uc3VibWlzc2lvbnMgPSB0aGlzLnN1Ym1pc3Npb25zO1xyXG4gICAgdGhpcy5zdWJGb3JtLm1heFBvc3NpYmxlU2NvcmUgPSB7XHJcbiAgICAgICdnb29kJzogdGhpcy5tYXhQb3NzaWJsZUdvb2RTY29yZSxcclxuICAgICAgJ2JhZCc6IHRoaXMubWF4UG9zc2libGVCYWRTY29yZVxyXG4gICAgfVxyXG4gICAgdGhpcy5zdWJGb3JtLmRlbGV0ZWRTdWJtaXNzaW9ucyA9IHRoaXMuZGVsZXRlZFN1Ym1pc3Npb25zO1xyXG4gICAgdGhpcy5zdWJGb3JtQ2hhbmdlLmVtaXQodGhpcy5zdWJGb3JtKTtcclxuICB9XHJcblxyXG4gIGNsZWFyRW1wdHlSb3dzKCkge1xyXG4gICAgY29uc3Qgbm9uRW1wdHlTdWJtaXNzaW9uczogU3VibWlzc2lvbltdID0gW107XHJcbiAgICBjb25zdCBlbXB0eVN1Ym1pc3Npb25JZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgdGhpcy5zdWJtaXNzaW9ucy5mb3JFYWNoKChzdWJtaXNzaW9uKSA9PiB7XHJcbiAgICAgIGlmIChzdWJtaXNzaW9uLmFuc3dlcnMuc29tZSgoYW5zd2VyKSA9PiBhbnN3ZXIuYW5zd2VyICE9PSAnJykpIHtcclxuICAgICAgICBub25FbXB0eVN1Ym1pc3Npb25zLnB1c2goc3VibWlzc2lvbik7XHJcbiAgICAgIH0gZWxzZSBpZiAoc3VibWlzc2lvbi5zdWJtaXNzaW9uSWQpIHtcclxuICAgICAgICBlbXB0eVN1Ym1pc3Npb25JZHMucHVzaChzdWJtaXNzaW9uLnN1Ym1pc3Npb25JZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc3VibWlzc2lvbnMgPSBub25FbXB0eVN1Ym1pc3Npb25zO1xyXG4gICAgdGhpcy5kZWxldGVkU3VibWlzc2lvbnMucHVzaCguLi5lbXB0eVN1Ym1pc3Npb25JZHMpO1xyXG4gICAgdGhpcy51cGRhdGVTdWJGb3JtV2l0aFN1Ym1pc3Npb25zKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJleGFtcGxlLWNvbnRhaW5lclwiIHRhYmluZGV4PVwiMFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIj5cclxuICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwic3VibWlzc2lvbnNcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejhcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93IG9mIHN1YkZvcm0ucm93c1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBmb3JtRWxlbWVudCBvZiByb3cuZ3JpZFwiXHJcbiAgICAgICAgICBbbWF0Q29sdW1uRGVmXT1cImZvcm1FbGVtZW50LmVsZW1lbnQucXVlc3Rpb25cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGxcclxuICAgICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcclxuICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgYm9yZGVyLTEgY29sdW1uLXdpZHRoXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZm9ybUVsZW1lbnQuZWxlbWVudC5xdWVzdGlvbiB9fVxyXG4gICAgICAgICAgPC90aD5cclxuICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICBtYXQtY2VsbFxyXG4gICAgICAgICAgICAqbWF0Q2VsbERlZj1cImxldCBzdWJtaXNzaW9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgYm9yZGVyLTFcIlxyXG4gICAgICAgICAgICBbaWRdPVwiJ3F1ZXN0aW9uLScrc3VibWlzc2lvbi5zdWJtaXNzaW9uSWRcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgaGlkZGVuOiBnZXRBbnN3ZXJCeVF1ZXN0aW9uSWQoc3VibWlzc2lvbiwgZm9ybUVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICA/LmlzQ2hpbGRcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxyXG4gICAgICAgICAgICAgICAgZ2V0QW5zd2VyQnlRdWVzdGlvbklkKHN1Ym1pc3Npb24sIGZvcm1FbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgICA/Lmh0bWxDb250ZW50XHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiIHN0aWNreUVuZD5cclxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiYm9yZGVyIGJvcmRlci0xXCI+XHJcbiAgICAgICAgICBBY3Rpb25zXHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGRcclxuICAgICAgICAgIG1hdC1jZWxsXHJcbiAgICAgICAgICAqbWF0Q2VsbERlZj1cImxldCBzdWJtaXNzaW9uOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXIgYm9yZGVyIGJvcmRlci0xXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG5cIlxyXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcclxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRXhhbXBsZSBpY29uLWJ1dHRvbiB3aXRoIGEgbWVudVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdFN1YkZvcm1TdWJtaXNzaW9uKGksIHN1Ym1pc3Npb24pXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjlcIlxyXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyOFwiXHJcbiAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjkgMjhcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8cmVjdFxyXG4gICAgICAgICAgICAgICAgICAgIHg9XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHk9XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjhcIlxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI2LjQ3MzdcIlxyXG4gICAgICAgICAgICAgICAgICAgIHJ4PVwiNS41XCJcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOEQ4RDhcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGwtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIuMDAwOSAxOS4wNzg3SDkuMTU4MlYxNi4yMzYxQzkuMTU4MiAxNS45NDQ3IDkuMjczOSAxNS42NjUzIDkuNDc5OTkgMTUuNDU5M0wxNi4yMjI0IDguNzE2ODZDMTYuNDI4NCA4LjUxMDUgMTYuNzA4IDguMzk0NTMgMTYuOTk5NSA4LjM5NDUzQzE3LjI5MTEgOC4zOTQ1MyAxNy41NzA3IDguNTEwNSAxNy43NzY3IDguNzE2ODZMMTkuNTIwMSAxMC40NjAzQzE5LjcyNjQgMTAuNjY2MyAxOS44NDI0IDEwLjk0NTggMTkuODQyNCAxMS4yMzc0QzE5Ljg0MjQgMTEuNTI5IDE5LjcyNjQgMTEuODA4NiAxOS41MjAxIDEyLjAxNDVMMTIuNzc3NyAxOC43NTdDMTIuNTcxNSAxOC45NjI4IDEyLjI5MjIgMTkuMDc4NSAxMi4wMDA5IDE5LjA3ODdaXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDg0RkZGXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xNS4xNzA0IDEwLjM5ODRMMTcuODQxNSAxMy4wNjk1XCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDg0RkZGXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImRlbGV0ZVN1YkZvcm0oaSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyOVwiXHJcbiAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI4XCJcclxuICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyOSAyOFwiXHJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxyZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgeD1cIjAuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgeT1cIjAuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyNy42NDAyXCJcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNi4xMzI4XCJcclxuICAgICAgICAgICAgICAgICAgICByeD1cIjUuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIndoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRDhEOEQ4XCJcclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTguNjA0NDkgOS4yMDYzN0gyMC4wMzU0XCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDg0RkZGXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xOS4yMTg5IDkuMjA3MDNWMTcuNzg2M0MxOS4yMTg5IDE4LjY0ODIgMTguNDg4MSAxOS4zNDYyIDE3LjU4NTkgMTkuMzQ2MkgxMS4wNTM5QzEwLjE1MTcgMTkuMzQ2MiA5LjQyMDkgMTguNjQ4MiA5LjQyMDkgMTcuNzg2M1Y5LjIwNzAzXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDg0RkZGXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xNi43Njk2IDYuNjcxMjJIMTEuODcwNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzA4NEZGRlwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIuNjg3MSAxMi4zMjQyVjE2LjIyMzlcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwODRGRkZcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE1Ljk1MzIgMTIuMzI0MlYxNi4yMjM5XCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDg0RkZGXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cclxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxyXG4gICAgPC90YWJsZT5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZvb3RlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImFkZE5ld0J0blwiIChjbGljayk9XCJhZGROZXdTdWJtaXNzaW9uKClcIj5cclxuICAgICAgPHN2Z1xyXG4gICAgICAgIHdpZHRoPVwiMTVcIlxyXG4gICAgICAgIGhlaWdodD1cIjE0XCJcclxuICAgICAgICB2aWV3Qm94PVwiMCAwIDE1IDE0XCJcclxuICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgID5cclxuICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgZmlsbC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgIGQ9XCJNMTIuNTU1NiAxMy4yNzc4SDIuNDQ0NDRDMS42NDYzOSAxMy4yNzc4IDEgMTIuNjY3MyAxIDExLjkxMzZWMi4zNjQyQzEgMS42MTA0OCAxLjY0NjM5IDEgMi40NDQ0NCAxSDEyLjU1NTZDMTMuMzUzNiAxIDE0IDEuNjEwNDggMTQgMi4zNjQyVjExLjkxMzZDMTQgMTIuNjY3MyAxMy4zNTM2IDEzLjI3NzggMTIuNTU1NiAxMy4yNzc4WlwiXHJcbiAgICAgICAgICBzdHJva2U9XCIjRDhEOEQ4XCJcclxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuOFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxwYXRoXHJcbiAgICAgICAgICBkPVwiTTUuMzMzNSA3LjUwMzQ3SDkuNjY2ODNcIlxyXG4gICAgICAgICAgc3Ryb2tlPVwiIzA4NEZGRlwiXHJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIwLjhcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgZD1cIk03LjUwMDA1IDUuMzM1OTRWOS42NjkyN1wiXHJcbiAgICAgICAgICBzdHJva2U9XCIjMDg0RkZGXCJcclxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuOFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgICAgPGEgY2xhc3M9XCJtcy0yIHRleHQtZGVjb3JhdGlvbi1ub25lXCI+e3thZGRCdXR0b25MYWJlbH19PC9hPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=