@pega/angular-sdk-components 24.1.10 → 24.2.12

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 (271) hide show
  1. package/esm2022/lib/_bridge/angular-pconnect.mjs +3 -3
  2. package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +6 -13
  3. package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +3 -3
  4. package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +4 -4
  5. package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +3 -3
  6. package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +4 -4
  7. package/esm2022/lib/_components/designSystemExtension/field-group/field-group.component.mjs +3 -3
  8. package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +5 -6
  9. package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +3 -3
  10. package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +13 -6
  11. package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +3 -3
  12. package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +3 -3
  13. package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +3 -3
  14. package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +4 -4
  15. package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +9 -7
  16. package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +9 -9
  17. package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +3 -3
  18. package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +3 -3
  19. package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +23 -13
  20. package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +3 -3
  21. package/esm2022/lib/_components/field/check-box/check-box.component.mjs +12 -10
  22. package/esm2022/lib/_components/field/currency/currency.component.mjs +39 -21
  23. package/esm2022/lib/_components/field/date/date.component.mjs +19 -39
  24. package/esm2022/lib/_components/field/date-time/date-time.component.mjs +32 -17
  25. package/esm2022/lib/_components/field/decimal/decimal.component.mjs +43 -23
  26. package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +133 -25
  27. package/esm2022/lib/_components/field/email/email.component.mjs +22 -7
  28. package/esm2022/lib/_components/field/group/group.component.mjs +6 -6
  29. package/esm2022/lib/_components/field/integer/integer.component.mjs +20 -7
  30. package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +8 -7
  31. package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +13 -6
  32. package/esm2022/lib/_components/field/percentage/percentage.component.mjs +39 -23
  33. package/esm2022/lib/_components/field/phone/phone.component.mjs +17 -29
  34. package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +10 -12
  35. package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +17 -11
  36. package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +7 -8
  37. package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +3 -3
  38. package/esm2022/lib/_components/field/text/text.component.mjs +12 -8
  39. package/esm2022/lib/_components/field/text-area/text-area.component.mjs +21 -9
  40. package/esm2022/lib/_components/field/text-content/text-content.component.mjs +3 -3
  41. package/esm2022/lib/_components/field/text-input/text-input.component.mjs +20 -7
  42. package/esm2022/lib/_components/field/time/time.component.mjs +31 -10
  43. package/esm2022/lib/_components/field/url/url.component.mjs +20 -7
  44. package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +102 -23
  45. package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +18 -44
  46. package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +3 -3
  47. package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +3 -3
  48. package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +5 -12
  49. package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +4 -4
  50. package/esm2022/lib/_components/infra/Containers/view-container/helper.mjs +22 -0
  51. package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +9 -16
  52. package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +5 -5
  53. package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +73 -49
  54. package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +5 -5
  55. package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +3 -3
  56. package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +10 -8
  57. package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +3 -3
  58. package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +3 -3
  59. package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +5 -5
  60. package/esm2022/lib/_components/infra/reference/reference.component.mjs +74 -81
  61. package/esm2022/lib/_components/infra/region/region.component.mjs +3 -3
  62. package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +25 -30
  63. package/esm2022/lib/_components/infra/stages/stages.component.mjs +5 -5
  64. package/esm2022/lib/_components/infra/view/view.component.mjs +22 -7
  65. package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +20 -4
  66. package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +3 -3
  67. package/esm2022/lib/_components/template/base/details-template-base.mjs +56 -0
  68. package/esm2022/lib/_components/template/base/form-template-base.mjs +16 -0
  69. package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +4 -4
  70. package/esm2022/lib/_components/template/case-view/case-view.component.mjs +11 -16
  71. package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +6 -6
  72. package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +13 -8
  73. package/esm2022/lib/_components/template/default-form/default-form.component.mjs +37 -25
  74. package/esm2022/lib/_components/template/details/details.component.mjs +12 -39
  75. package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +11 -38
  76. package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +12 -41
  77. package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +13 -40
  78. package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +12 -41
  79. package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +13 -42
  80. package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +12 -41
  81. package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +8 -7
  82. package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +3 -3
  83. package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +49 -42
  84. package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +5 -5
  85. package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +3 -3
  86. package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +5 -5
  87. package/esm2022/lib/_components/template/list-page/list-page.component.mjs +3 -3
  88. package/esm2022/lib/_components/template/list-view/list-view.component.mjs +24 -9
  89. package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +3 -3
  90. package/esm2022/lib/_components/template/list-view/utils.mjs +1 -1
  91. package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +3 -3
  92. package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +4 -4
  93. package/esm2022/lib/_components/template/one-column/one-column.component.mjs +6 -5
  94. package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +3 -3
  95. package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +4 -4
  96. package/esm2022/lib/_components/template/page/page.component.mjs +4 -4
  97. package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +4 -4
  98. package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +4 -4
  99. package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +3 -3
  100. package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +10 -9
  101. package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +61 -29
  102. package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +5 -5
  103. package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +3 -3
  104. package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +4 -4
  105. package/esm2022/lib/_components/template/three-column/three-column.component.mjs +6 -5
  106. package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +3 -3
  107. package/esm2022/lib/_components/template/two-column/two-column.component.mjs +6 -5
  108. package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +3 -3
  109. package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +4 -4
  110. package/esm2022/lib/_components/template/utils.mjs +17 -1
  111. package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +6 -5
  112. package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +4 -4
  113. package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +5 -5
  114. package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +3 -3
  115. package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +6 -8
  116. package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +3 -3
  117. package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +5 -5
  118. package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +4 -4
  119. package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +3 -3
  120. package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +3 -3
  121. package/esm2022/lib/_components/widget/todo/todo.component.mjs +79 -63
  122. package/esm2022/lib/_components/widget/utility/utility.component.mjs +3 -3
  123. package/esm2022/lib/_directives/thousand-seperator.directive.mjs +4 -4
  124. package/esm2022/lib/_helpers/createstage-utils.mjs +15 -0
  125. package/esm2022/lib/_helpers/field-group-utils.mjs +3 -3
  126. package/esm2022/lib/_helpers/filter-utils.mjs +1 -2
  127. package/esm2022/lib/_helpers/formatters/boolean.mjs +2 -2
  128. package/esm2022/lib/_helpers/formatters/common.mjs +3 -2
  129. package/esm2022/lib/_helpers/formatters/currency.mjs +2 -2
  130. package/esm2022/lib/_helpers/formatters/date.mjs +5 -5
  131. package/esm2022/lib/_helpers/formatters/format-utils.mjs +10 -2
  132. package/esm2022/lib/_helpers/formatters/index.mjs +30 -16
  133. package/esm2022/lib/_helpers/template-utils.mjs +3 -3
  134. package/esm2022/lib/_helpers/utils.mjs +44 -18
  135. package/esm2022/lib/_messages/error-messages.service.mjs +4 -4
  136. package/esm2022/lib/_messages/progress-spinner.service.mjs +3 -3
  137. package/esm2022/lib/_messages/update-worklist.service.mjs +3 -3
  138. package/esm2022/lib/_services/banner.service.mjs +35 -0
  139. package/esm2022/lib/_services/case.service.mjs +3 -3
  140. package/esm2022/lib/_services/datapage.service.mjs +3 -3
  141. package/esm2022/lib/_services/endpoints.mjs +1 -2
  142. package/esm2022/lib/_services/server-config.service.mjs +3 -3
  143. package/esm2022/public-api.mjs +16 -12
  144. package/fesm2022/pega-angular-sdk-components.mjs +1988 -1666
  145. package/fesm2022/pega-angular-sdk-components.mjs.map +1 -1
  146. package/lib/_components/designSystemExtension/banner/banner.component.d.ts +0 -1
  147. package/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.d.ts +0 -1
  148. package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +1 -1
  149. package/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.d.ts +2 -1
  150. package/lib/_components/designSystemExtension/operator/operator.component.d.ts +2 -3
  151. package/lib/_components/designSystemExtension/pulse/pulse.component.d.ts +2 -3
  152. package/lib/_components/field/auto-complete/auto-complete.component.d.ts +8 -3
  153. package/lib/_components/field/cancel-alert/cancel-alert.component.d.ts +0 -1
  154. package/lib/_components/field/check-box/check-box.component.d.ts +2 -3
  155. package/lib/_components/field/currency/currency.component.d.ts +6 -4
  156. package/lib/_components/field/date/date.component.d.ts +17 -7
  157. package/lib/_components/field/date-time/date-time.component.d.ts +10 -3
  158. package/lib/_components/field/decimal/decimal.component.d.ts +4 -4
  159. package/lib/_components/field/dropdown/dropdown.component.d.ts +14 -3
  160. package/lib/_components/field/email/email.component.d.ts +2 -1
  161. package/lib/_components/field/group/group.component.d.ts +0 -1
  162. package/lib/_components/field/integer/integer.component.d.ts +2 -1
  163. package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +1 -2
  164. package/lib/_components/field/multiselect/multiselect.component.d.ts +3 -3
  165. package/lib/_components/field/percentage/percentage.component.d.ts +6 -3
  166. package/lib/_components/field/phone/phone.component.d.ts +3 -8
  167. package/lib/_components/field/radio-buttons/radio-buttons.component.d.ts +2 -2
  168. package/lib/_components/field/rich-text/rich-text.component.d.ts +3 -2
  169. package/lib/_components/field/scalar-list/scalar-list.component.d.ts +0 -1
  170. package/lib/_components/field/semantic-link/semantic-link.component.d.ts +0 -1
  171. package/lib/_components/field/text/text.component.d.ts +3 -2
  172. package/lib/_components/field/text-area/text-area.component.d.ts +2 -1
  173. package/lib/_components/field/text-content/text-content.component.d.ts +0 -1
  174. package/lib/_components/field/text-input/text-input.component.d.ts +2 -1
  175. package/lib/_components/field/time/time.component.d.ts +3 -1
  176. package/lib/_components/field/url/url.component.d.ts +2 -1
  177. package/lib/_components/field/user-reference/user-reference.component.d.ts +7 -1
  178. package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +0 -2
  179. package/lib/_components/infra/Containers/flow-container/helpers.d.ts +1 -0
  180. package/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.d.ts +0 -1
  181. package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +1 -4
  182. package/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.d.ts +0 -1
  183. package/lib/_components/infra/Containers/view-container/helper.d.ts +2 -0
  184. package/lib/_components/infra/Containers/view-container/view-container.component.d.ts +0 -1
  185. package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +1 -1
  186. package/lib/_components/infra/assignment/assignment.component.d.ts +6 -4
  187. package/lib/_components/infra/assignment-card/assignment-card.component.d.ts +0 -1
  188. package/lib/_components/infra/dashboard-filter/dashboard-filter.component.d.ts +0 -1
  189. package/lib/_components/infra/defer-load/defer-load.component.d.ts +3 -3
  190. package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +1 -1
  191. package/lib/_components/infra/multi-step/multi-step.component.d.ts +0 -1
  192. package/lib/_components/infra/navbar/navbar.component.d.ts +2 -3
  193. package/lib/_components/infra/reference/reference.component.d.ts +23 -3
  194. package/lib/_components/infra/region/region.component.d.ts +0 -1
  195. package/lib/_components/infra/root-container/root-container.component.d.ts +3 -2
  196. package/lib/_components/infra/stages/stages.component.d.ts +0 -1
  197. package/lib/_components/infra/view/view.component.d.ts +1 -1
  198. package/lib/_components/template/app-shell/app-shell.component.d.ts +0 -1
  199. package/lib/_components/template/banner-page/banner-page.component.d.ts +0 -1
  200. package/lib/_components/template/base/details-template-base.d.ts +21 -0
  201. package/lib/_components/template/base/form-template-base.d.ts +10 -0
  202. package/lib/_components/template/case-summary/case-summary.component.d.ts +0 -1
  203. package/lib/_components/template/case-view/case-view.component.d.ts +1 -3
  204. package/lib/_components/template/confirmation/confirmation.component.d.ts +0 -1
  205. package/lib/_components/template/data-reference/data-reference.component.d.ts +0 -1
  206. package/lib/_components/template/default-form/default-form.component.d.ts +8 -7
  207. package/lib/_components/template/details/details.component.d.ts +3 -12
  208. package/lib/_components/template/details-narrow-wide/details-narrow-wide.component.d.ts +3 -12
  209. package/lib/_components/template/details-one-column/details-one-column.component.d.ts +3 -14
  210. package/lib/_components/template/details-sub-tabs/details-sub-tabs.component.d.ts +3 -14
  211. package/lib/_components/template/details-three-column/details-three-column.component.d.ts +3 -14
  212. package/lib/_components/template/details-two-column/details-two-column.component.d.ts +3 -14
  213. package/lib/_components/template/details-wide-narrow/details-wide-narrow.component.d.ts +3 -14
  214. package/lib/_components/template/dynamic-tabs/dynamic-tabs.component.d.ts +1 -1
  215. package/lib/_components/template/field-group-template/field-group-template.component.d.ts +12 -9
  216. package/lib/_components/template/inline-dashboard/inline-dashboard.component.d.ts +0 -1
  217. package/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.d.ts +0 -1
  218. package/lib/_components/template/list-page/list-page.component.d.ts +0 -1
  219. package/lib/_components/template/list-view/list-view.component.d.ts +7 -3
  220. package/lib/_components/template/list-view/listViewHelpers.d.ts +1 -1
  221. package/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.d.ts +0 -1
  222. package/lib/_components/template/narrow-wide-form/narrow-wide-form.component.d.ts +0 -1
  223. package/lib/_components/template/one-column/one-column.component.d.ts +2 -2
  224. package/lib/_components/template/one-column-page/one-column-page.component.d.ts +0 -1
  225. package/lib/_components/template/one-column-tab/one-column-tab.component.d.ts +0 -1
  226. package/lib/_components/template/page/page.component.d.ts +0 -1
  227. package/lib/_components/template/promoted-filters/promoted-filters.component.d.ts +0 -1
  228. package/lib/_components/template/repeating-structures/repeating-structures.component.d.ts +0 -1
  229. package/lib/_components/template/simple-table/simple-table.component.d.ts +0 -1
  230. package/lib/_components/template/simple-table-manual/helpers.d.ts +4 -3
  231. package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +10 -3
  232. package/lib/_components/template/simple-table-select/simple-table-select.component.d.ts +0 -1
  233. package/lib/_components/template/single-reference-readonly/single-reference-readonly.component.d.ts +0 -1
  234. package/lib/_components/template/sub-tabs/sub-tabs.component.d.ts +0 -1
  235. package/lib/_components/template/three-column/three-column.component.d.ts +2 -2
  236. package/lib/_components/template/three-column-page/three-column-page.component.d.ts +0 -1
  237. package/lib/_components/template/two-column/two-column.component.d.ts +2 -2
  238. package/lib/_components/template/two-column-page/two-column-page.component.d.ts +0 -1
  239. package/lib/_components/template/two-column-tab/two-column-tab.component.d.ts +0 -1
  240. package/lib/_components/template/utils.d.ts +7 -0
  241. package/lib/_components/template/wide-narrow-form/wide-narrow-form.component.d.ts +2 -2
  242. package/lib/_components/template/wide-narrow-page/wide-narrow-page.component.d.ts +1 -2
  243. package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +3 -4
  244. package/lib/_components/widget/app-announcement/app-announcement.component.d.ts +0 -1
  245. package/lib/_components/widget/attachment/attachment.component.d.ts +3 -4
  246. package/lib/_components/widget/case-history/case-history.component.d.ts +0 -1
  247. package/lib/_components/widget/feed-container/feed-container.component.d.ts +2 -3
  248. package/lib/_components/widget/file-utility/file-utility.component.d.ts +1 -2
  249. package/lib/_components/widget/quick-create/quick-create.component.d.ts +0 -1
  250. package/lib/_components/widget/todo/todo.component.d.ts +10 -14
  251. package/lib/_components/widget/utility/utility.component.d.ts +0 -1
  252. package/lib/_helpers/common.d.ts +1 -1
  253. package/lib/_helpers/createstage-utils.d.ts +1 -0
  254. package/lib/_helpers/formatters/boolean.d.ts +1 -2
  255. package/lib/_helpers/formatters/common.d.ts +2 -2
  256. package/lib/_helpers/formatters/currency.d.ts +1 -2
  257. package/lib/_helpers/formatters/date.d.ts +1 -2
  258. package/lib/_helpers/formatters/index.d.ts +1 -2
  259. package/lib/_helpers/utils.d.ts +8 -0
  260. package/lib/_messages/error-messages.service.d.ts +1 -1
  261. package/lib/_services/banner.service.d.ts +8 -0
  262. package/lib/_services/endpoints.d.ts +0 -1
  263. package/lib/doc/KeyReleaseUpdates.md +23 -6
  264. package/package.json +3 -3
  265. package/public-api.d.ts +15 -11
  266. package/esm2022/lib/_messages/get-login-status.service.mjs +0 -26
  267. package/esm2022/lib/_messages/oauth-response.service.mjs +0 -30
  268. package/esm2022/lib/_messages/reset-pconnect.service.mjs +0 -31
  269. package/lib/_messages/get-login-status.service.d.ts +0 -10
  270. package/lib/_messages/oauth-response.service.d.ts +0 -14
  271. package/lib/_messages/reset-pconnect.service.d.ts +0 -15
@@ -1,4 +1,3 @@
1
- /* eslint-disable max-classes-per-file */
2
1
  import { Component, Input, ViewChild, forwardRef } from '@angular/core';
3
2
  import { CommonModule } from '@angular/common';
4
3
  import { MatDatepickerModule } from '@angular/material/datepicker';
@@ -19,7 +18,7 @@ import { ComponentMapperComponent } from '../../../_bridge/component-mapper/comp
19
18
  import { getCurrencyOptions } from '../../../_helpers/currency-utils';
20
19
  import { getLocale, getSeconds } from '../../../_helpers/common';
21
20
  import { formatters } from '../../../_helpers/formatters/format-utils';
22
- import { useInit } from './listViewHelpers';
21
+ import { init } from './listViewHelpers';
23
22
  import * as i0 from "@angular/core";
24
23
  import * as i1 from "../../../_messages/progress-spinner.service";
25
24
  import * as i2 from "../../../_helpers/utils";
@@ -80,6 +79,7 @@ export class ListViewComponent {
80
79
  this.query = null;
81
80
  this.xRayApis = PCore.getDebugger().getXRayRuntime();
82
81
  this.xRayUid = this.xRayApis.startXRay();
82
+ this.label = '';
83
83
  }
84
84
  ngOnInit() {
85
85
  this.configProps$ = this.pConn$.getConfigProps();
@@ -102,6 +102,17 @@ export class ListViewComponent {
102
102
  this.checkBoxValue = this.configProps$.value;
103
103
  this.arFilterMainButtons$.push({ actionID: 'submit', jsAction: 'submit', name: 'Submit' });
104
104
  this.arFilterSecondaryButtons$.push({ actionID: 'cancel', jsAction: 'cancel', name: 'Cancel' });
105
+ let title = this.configProps$?.title || this.configProps$?.label || 'List';
106
+ const inheritedProps = this.configProps$?.inheritedProps;
107
+ if (title === 'List' && inheritedProps) {
108
+ for (const inheritedProp of inheritedProps) {
109
+ if (inheritedProp?.prop === 'label') {
110
+ title = inheritedProp?.value;
111
+ break;
112
+ }
113
+ }
114
+ }
115
+ this.label = title;
105
116
  this.searchIcon$ = this.utils.getImageSrc('search', this.utils.getSDKStaticContentUrl());
106
117
  setTimeout(() => {
107
118
  PCore.getPubSubUtils().subscribe(PCore.getConstants().PUB_SUB_EVENTS.EVENT_DASHBOARD_FILTER_CHANGE, data => {
@@ -116,7 +127,7 @@ export class ListViewComponent {
116
127
  if (!this.payload) {
117
128
  this.payload = { referenceList: this.configProps$.referenceList };
118
129
  }
119
- useInit({
130
+ init({
120
131
  pConn$: this.pConn$,
121
132
  bInForm$: this.bInForm$,
122
133
  ...this.payload,
@@ -766,7 +777,7 @@ export class ListViewComponent {
766
777
  }
767
778
  filterDataWithDate(item, filterObj, filterValue) {
768
779
  let bKeep;
769
- let value = item[filterObj.ref] != null ?? item[filterObj.ref] != '' ? getSeconds(item[filterObj.ref]) : null;
780
+ let value = item[filterObj.ref] != null || item[filterObj.ref] != '' ? getSeconds(item[filterObj.ref]) : null;
770
781
  filterValue = filterObj.containsFilterValue != null && filterObj.containsFilterValue != '' ? getSeconds(filterObj.containsFilterValue) : null;
771
782
  switch (filterObj.containsFilter) {
772
783
  case 'notequal':
@@ -1134,6 +1145,10 @@ export class ListViewComponent {
1134
1145
  });
1135
1146
  return listFields;
1136
1147
  }
1148
+ getResultsText() {
1149
+ const recordsCount = this.repeatList$?.paginator?.length || 0;
1150
+ return `${recordsCount || 0} result${recordsCount > 1 ? 's' : ''}`;
1151
+ }
1137
1152
  getField(fieldDefs, columnId) {
1138
1153
  const fieldsMap = this.getFieldsMap(fieldDefs);
1139
1154
  return fieldsMap.get(columnId);
@@ -1161,10 +1176,10 @@ export class ListViewComponent {
1161
1176
  }
1162
1177
  return select;
1163
1178
  }
1164
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListViewComponent, deps: [{ token: i1.ProgressSpinnerService }, { token: i2.Utils }], target: i0.ɵɵFactoryTarget.Component }); }
1165
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ListViewComponent, isStandalone: true, selector: "app-list-view", inputs: { pConn$: "pConn$", bInForm$: "bInForm$", payload: "payload" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0, template: "<div class=\"psdk-list-header\">\n <div>\n <mat-form-field class=\"psdk-search\" *ngIf=\"bShowSearch$\">\n <mat-label><img class=\"psdk-icon-search\" src=\"{{ searchIcon$ }}\" /> <span class=\"psdk-search-label\">Search</span> </mat-label>\n <input matInput id=\"search\" (keyup)=\"applySearch($event)\" placeholder=\"\" />\n </mat-form-field>\n\n <div *ngIf=\"!bInForm$\" class=\"psdk-outer-div-in-form\">\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"bColumnReorder$\">\n <div>\n <table\n mat-table\n id=\"list-view\"\n [dataSource]=\"repeatList$\"\n matSort\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\" cdkDrag>\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"!bColumnReorder$\">\n <div>\n <table mat-table id=\"list-view\" [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n </div>\n <div *ngIf=\"bInForm$\">\n <div>\n <div class=\"psdk-inner-div-in-form\">\n <table id=\"list-view\" *ngIf=\"repeatListData.length > 0\" mat-table [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngIf=\"singleSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-radio-button [value]=\"row[rowID]\" [checked]=\"row[rowID] === checkBoxValue\" (change)=\"fieldOnChange(row)\"></mat-radio-button>\n </td>\n </ng-container>\n <ng-container *ngIf=\"multiSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox [value]=\"row[rowID]\" [checked]=\"isChecked(row)\" (change)=\"onCheckboxClick(row, $event)\"></mat-checkbox>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n </table>\n <div *ngIf=\"repeatListData?.length === 0\">\n <table id=\"list-view\" *ngIf=\"repeatListData?.length === 0\" mat-table [dataSource]=\"repeatList$\">\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef>{{ dCol.config.label }}</th>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n </table>\n </div>\n <div class=\"psdk-no-records\" *ngIf=\"repeatListData?.length === 0\">No Records Found.</div>\n </div>\n </div>\n </div>\n\n <mat-paginator id=\"pagination\" *ngIf=\"bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500, 1000]\" showFirstLastButtons></mat-paginator>\n <mat-paginator id=\"pagination\" *ngIf=\"!bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500]\" showFirstLastButtons></mat-paginator>\n </div>\n\n <!-- pop overs for filters-->\n <div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-list-header{background-color:var(--app-form-color);padding:1rem;margin:.5rem;border-radius:.6125rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:nowrap}::ng-deep td.mat-mdc-cell{white-space:nowrap}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding:0rem .188rem}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:nowrap;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem;padding-right:.625rem}.psdk-icon-search{vertical-align:sub;padding:.125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{padding:1rem;overflow:hidden}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none}.psdk-table-field-link{color:var(--app-primary-color);padding:0;cursor:pointer;border:0;background-color:transparent;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i3.NgForOf), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatFormFieldModule) }, { kind: "component", type: i0.forwardRef(() => i4.MatFormField), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(() => i4.MatLabel), selector: "mat-label" }, { kind: "directive", type: i0.forwardRef(() => i4.MatSuffix), selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatInputModule) }, { kind: "directive", type: i0.forwardRef(() => i5.MatInput), selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatTableModule) }, { kind: "component", type: i0.forwardRef(() => i6.MatTable), selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatHeaderCellDef), selector: "[matHeaderCellDef]" }, { kind: "directive", type: i0.forwardRef(() => i6.MatHeaderRowDef), selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatColumnDef), selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatCellDef), selector: "[matCellDef]" }, { kind: "directive", type: i0.forwardRef(() => i6.MatRowDef), selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatHeaderCell), selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i0.forwardRef(() => i6.MatCell), selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i0.forwardRef(() => i6.MatHeaderRow), selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i0.forwardRef(() => i6.MatRow), selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatSortModule) }, { kind: "directive", type: i0.forwardRef(() => i7.MatSort), selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i0.forwardRef(() => i7.MatSortHeader), selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: i0.forwardRef(() => DragDropModule) }, { kind: "directive", type: i0.forwardRef(() => i8.CdkDropList), selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i0.forwardRef(() => i8.CdkDrag), selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatButtonModule) }, { kind: "component", type: i0.forwardRef(() => i9.MatButton), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(() => i9.MatIconButton), selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatMenuModule) }, { kind: "component", type: i0.forwardRef(() => i10.MatMenu), selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i0.forwardRef(() => i10.MatMenuItem), selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i0.forwardRef(() => i10.MatMenuTrigger), selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatIconModule) }, { kind: "component", type: i0.forwardRef(() => i11.MatIcon), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatRadioModule) }, { kind: "component", type: i0.forwardRef(() => i12.MatRadioButton), selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatCheckboxModule) }, { kind: "component", type: i0.forwardRef(() => i13.MatCheckbox), selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatPaginatorModule) }, { kind: "component", type: i0.forwardRef(() => i14.MatPaginator), selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatSelectModule) }, { kind: "component", type: i0.forwardRef(() => i15.MatSelect), selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i0.forwardRef(() => i16.MatOption), selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatOptionModule) }, { kind: "ngmodule", type: i0.forwardRef(() => MatDatepickerModule) }, { kind: "component", type: i0.forwardRef(() => i17.MatDatepicker), selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i0.forwardRef(() => i17.MatDatepickerInput), selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i0.forwardRef(() => i17.MatDatepickerToggle), selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i0.forwardRef(() => ComponentMapperComponent), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
1179
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ListViewComponent, deps: [{ token: i1.ProgressSpinnerService }, { token: i2.Utils }], target: i0.ɵɵFactoryTarget.Component }); }
1180
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ListViewComponent, isStandalone: true, selector: "app-list-view", inputs: { pConn$: "pConn$", bInForm$: "bInForm$", payload: "payload" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0, template: "<div class=\"psdk-list-header\">\n <div>\n <h3 *ngIf=\"label\" class=\"label\" style=\"font-weight: bold\">\n {{ label }} <span class=\"results-count\">{{ getResultsText() }}</span>\n </h3>\n <mat-form-field class=\"psdk-search\" *ngIf=\"bShowSearch$\">\n <mat-label><img class=\"psdk-icon-search\" src=\"{{ searchIcon$ }}\" /> <span class=\"psdk-search-label\">Search</span> </mat-label>\n <input matInput id=\"search\" (keyup)=\"applySearch($event)\" placeholder=\"\" />\n </mat-form-field>\n\n <div *ngIf=\"!bInForm$\" class=\"psdk-outer-div-in-form\">\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"bColumnReorder$\">\n <div>\n <table\n mat-table\n id=\"list-view\"\n [dataSource]=\"repeatList$\"\n matSort\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\" cdkDrag>\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"!bColumnReorder$\">\n <div>\n <table mat-table id=\"list-view\" [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n </div>\n <div *ngIf=\"bInForm$\">\n <div>\n <div class=\"psdk-inner-div-in-form\">\n <table id=\"list-view\" *ngIf=\"repeatListData.length > 0\" mat-table [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngIf=\"singleSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-radio-button [value]=\"row[rowID]\" [checked]=\"row[rowID] === checkBoxValue\" (change)=\"fieldOnChange(row)\"></mat-radio-button>\n </td>\n </ng-container>\n <ng-container *ngIf=\"multiSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox [value]=\"row[rowID]\" [checked]=\"isChecked(row)\" (change)=\"onCheckboxClick(row, $event)\"></mat-checkbox>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n </table>\n <div *ngIf=\"repeatListData?.length === 0\">\n <table id=\"list-view\" *ngIf=\"repeatListData?.length === 0\" mat-table [dataSource]=\"repeatList$\">\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef>{{ dCol.config.label }}</th>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n </table>\n </div>\n <div class=\"psdk-no-records\" *ngIf=\"repeatListData?.length === 0\">\n {{ utils.getGenericFieldsLocalizedValue('CosmosFields.fields.lists', 'No records found.') }}\n </div>\n </div>\n </div>\n </div>\n\n <mat-paginator id=\"pagination\" *ngIf=\"bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500, 1000]\" showFirstLastButtons></mat-paginator>\n <mat-paginator id=\"pagination\" *ngIf=\"!bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500]\" showFirstLastButtons></mat-paginator>\n </div>\n\n <!-- pop overs for filters-->\n <div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-list-header{background-color:var(--app-form-color);padding:1rem;margin:.5rem;border-radius:.6125rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:nowrap}::ng-deep td.mat-mdc-cell{white-space:nowrap}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding:0rem .188rem}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:nowrap;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem;padding-right:.625rem}.psdk-icon-search{vertical-align:sub;padding:.125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{padding:1rem;overflow:hidden}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none}.psdk-table-field-link{color:var(--app-primary-color);padding:0;cursor:pointer;border:0;background-color:transparent;align-items:center}.results-count{opacity:.7;font-size:.8rem;font-weight:700;margin-inline-start:.625rem}.label{margin:8px}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i3.NgForOf), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatFormFieldModule) }, { kind: "component", type: i0.forwardRef(() => i4.MatFormField), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(() => i4.MatLabel), selector: "mat-label" }, { kind: "directive", type: i0.forwardRef(() => i4.MatSuffix), selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatInputModule) }, { kind: "directive", type: i0.forwardRef(() => i5.MatInput), selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatTableModule) }, { kind: "component", type: i0.forwardRef(() => i6.MatTable), selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatHeaderCellDef), selector: "[matHeaderCellDef]" }, { kind: "directive", type: i0.forwardRef(() => i6.MatHeaderRowDef), selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatColumnDef), selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatCellDef), selector: "[matCellDef]" }, { kind: "directive", type: i0.forwardRef(() => i6.MatRowDef), selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatHeaderCell), selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i0.forwardRef(() => i6.MatCell), selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i0.forwardRef(() => i6.MatHeaderRow), selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i0.forwardRef(() => i6.MatRow), selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatSortModule) }, { kind: "directive", type: i0.forwardRef(() => i7.MatSort), selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i0.forwardRef(() => i7.MatSortHeader), selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: i0.forwardRef(() => DragDropModule) }, { kind: "directive", type: i0.forwardRef(() => i8.CdkDropList), selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i0.forwardRef(() => i8.CdkDrag), selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatButtonModule) }, { kind: "component", type: i0.forwardRef(() => i9.MatButton), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(() => i9.MatIconButton), selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatMenuModule) }, { kind: "component", type: i0.forwardRef(() => i10.MatMenu), selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i0.forwardRef(() => i10.MatMenuItem), selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i0.forwardRef(() => i10.MatMenuTrigger), selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatIconModule) }, { kind: "component", type: i0.forwardRef(() => i11.MatIcon), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatRadioModule) }, { kind: "component", type: i0.forwardRef(() => i12.MatRadioButton), selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatCheckboxModule) }, { kind: "component", type: i0.forwardRef(() => i13.MatCheckbox), selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatPaginatorModule) }, { kind: "component", type: i0.forwardRef(() => i14.MatPaginator), selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatSelectModule) }, { kind: "component", type: i0.forwardRef(() => i15.MatSelect), selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i0.forwardRef(() => i16.MatOption), selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatOptionModule) }, { kind: "ngmodule", type: i0.forwardRef(() => MatDatepickerModule) }, { kind: "component", type: i0.forwardRef(() => i17.MatDatepicker), selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i0.forwardRef(() => i17.MatDatepickerInput), selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i0.forwardRef(() => i17.MatDatepickerToggle), selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i0.forwardRef(() => ComponentMapperComponent), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
1166
1181
  }
1167
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListViewComponent, decorators: [{
1182
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ListViewComponent, decorators: [{
1168
1183
  type: Component,
1169
1184
  args: [{ selector: 'app-list-view', standalone: true, imports: [
1170
1185
  CommonModule,
@@ -1185,7 +1200,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1185
1200
  MatOptionModule,
1186
1201
  MatDatepickerModule,
1187
1202
  forwardRef(() => ComponentMapperComponent)
1188
- ], template: "<div class=\"psdk-list-header\">\n <div>\n <mat-form-field class=\"psdk-search\" *ngIf=\"bShowSearch$\">\n <mat-label><img class=\"psdk-icon-search\" src=\"{{ searchIcon$ }}\" /> <span class=\"psdk-search-label\">Search</span> </mat-label>\n <input matInput id=\"search\" (keyup)=\"applySearch($event)\" placeholder=\"\" />\n </mat-form-field>\n\n <div *ngIf=\"!bInForm$\" class=\"psdk-outer-div-in-form\">\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"bColumnReorder$\">\n <div>\n <table\n mat-table\n id=\"list-view\"\n [dataSource]=\"repeatList$\"\n matSort\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\" cdkDrag>\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"!bColumnReorder$\">\n <div>\n <table mat-table id=\"list-view\" [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n </div>\n <div *ngIf=\"bInForm$\">\n <div>\n <div class=\"psdk-inner-div-in-form\">\n <table id=\"list-view\" *ngIf=\"repeatListData.length > 0\" mat-table [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngIf=\"singleSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-radio-button [value]=\"row[rowID]\" [checked]=\"row[rowID] === checkBoxValue\" (change)=\"fieldOnChange(row)\"></mat-radio-button>\n </td>\n </ng-container>\n <ng-container *ngIf=\"multiSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox [value]=\"row[rowID]\" [checked]=\"isChecked(row)\" (change)=\"onCheckboxClick(row, $event)\"></mat-checkbox>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n </table>\n <div *ngIf=\"repeatListData?.length === 0\">\n <table id=\"list-view\" *ngIf=\"repeatListData?.length === 0\" mat-table [dataSource]=\"repeatList$\">\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef>{{ dCol.config.label }}</th>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n </table>\n </div>\n <div class=\"psdk-no-records\" *ngIf=\"repeatListData?.length === 0\">No Records Found.</div>\n </div>\n </div>\n </div>\n\n <mat-paginator id=\"pagination\" *ngIf=\"bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500, 1000]\" showFirstLastButtons></mat-paginator>\n <mat-paginator id=\"pagination\" *ngIf=\"!bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500]\" showFirstLastButtons></mat-paginator>\n </div>\n\n <!-- pop overs for filters-->\n <div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-list-header{background-color:var(--app-form-color);padding:1rem;margin:.5rem;border-radius:.6125rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:nowrap}::ng-deep td.mat-mdc-cell{white-space:nowrap}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding:0rem .188rem}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:nowrap;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem;padding-right:.625rem}.psdk-icon-search{vertical-align:sub;padding:.125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{padding:1rem;overflow:hidden}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none}.psdk-table-field-link{color:var(--app-primary-color);padding:0;cursor:pointer;border:0;background-color:transparent;align-items:center}\n"] }]
1203
+ ], template: "<div class=\"psdk-list-header\">\n <div>\n <h3 *ngIf=\"label\" class=\"label\" style=\"font-weight: bold\">\n {{ label }} <span class=\"results-count\">{{ getResultsText() }}</span>\n </h3>\n <mat-form-field class=\"psdk-search\" *ngIf=\"bShowSearch$\">\n <mat-label><img class=\"psdk-icon-search\" src=\"{{ searchIcon$ }}\" /> <span class=\"psdk-search-label\">Search</span> </mat-label>\n <input matInput id=\"search\" (keyup)=\"applySearch($event)\" placeholder=\"\" />\n </mat-form-field>\n\n <div *ngIf=\"!bInForm$\" class=\"psdk-outer-div-in-form\">\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"bColumnReorder$\">\n <div>\n <table\n mat-table\n id=\"list-view\"\n [dataSource]=\"repeatList$\"\n matSort\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\" cdkDrag>\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"!bColumnReorder$\">\n <div>\n <table mat-table id=\"list-view\" [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n </div>\n <div *ngIf=\"bInForm$\">\n <div>\n <div class=\"psdk-inner-div-in-form\">\n <table id=\"list-view\" *ngIf=\"repeatListData.length > 0\" mat-table [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngIf=\"singleSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-radio-button [value]=\"row[rowID]\" [checked]=\"row[rowID] === checkBoxValue\" (change)=\"fieldOnChange(row)\"></mat-radio-button>\n </td>\n </ng-container>\n <ng-container *ngIf=\"multiSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox [value]=\"row[rowID]\" [checked]=\"isChecked(row)\" (change)=\"onCheckboxClick(row, $event)\"></mat-checkbox>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n </table>\n <div *ngIf=\"repeatListData?.length === 0\">\n <table id=\"list-view\" *ngIf=\"repeatListData?.length === 0\" mat-table [dataSource]=\"repeatList$\">\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef>{{ dCol.config.label }}</th>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n </table>\n </div>\n <div class=\"psdk-no-records\" *ngIf=\"repeatListData?.length === 0\">\n {{ utils.getGenericFieldsLocalizedValue('CosmosFields.fields.lists', 'No records found.') }}\n </div>\n </div>\n </div>\n </div>\n\n <mat-paginator id=\"pagination\" *ngIf=\"bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500, 1000]\" showFirstLastButtons></mat-paginator>\n <mat-paginator id=\"pagination\" *ngIf=\"!bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500]\" showFirstLastButtons></mat-paginator>\n </div>\n\n <!-- pop overs for filters-->\n <div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-list-header{background-color:var(--app-form-color);padding:1rem;margin:.5rem;border-radius:.6125rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:nowrap}::ng-deep td.mat-mdc-cell{white-space:nowrap}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding:0rem .188rem}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:nowrap;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem;padding-right:.625rem}.psdk-icon-search{vertical-align:sub;padding:.125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{padding:1rem;overflow:hidden}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none}.psdk-table-field-link{color:var(--app-primary-color);padding:0;cursor:pointer;border:0;background-color:transparent;align-items:center}.results-count{opacity:.7;font-size:.8rem;font-weight:700;margin-inline-start:.625rem}.label{margin:8px}\n"] }]
1189
1204
  }], ctorParameters: () => [{ type: i1.ProgressSpinnerService }, { type: i2.Utils }], propDecorators: { paginator: [{
1190
1205
  type: ViewChild,
1191
1206
  args: [MatPaginator]
@@ -1199,4 +1214,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1199
1214
  }], payload: [{
1200
1215
  type: Input
1201
1216
  }] } });
1202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9saXN0LXZpZXcvbGlzdC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9saXN0LXZpZXcvbGlzdC12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlDQUF5QztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxjQUFjLEVBQWUsZUFBZSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUc1RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUN4RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUV2RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJNUMsTUFBTSxjQUFjLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztBQWtCNUQsTUFBTSxPQUFPLEtBQUs7SUFBbEI7UUFDRSxVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBRVYsYUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixnQkFBVyxHQUFHLENBQUMsQ0FBQztJQUlsQixDQUFDO0lBSEMsSUFBSSxPQUFPO1FBQ1QsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7Q0FDRjtBQTRCRCxNQUFNLE9BQU8saUJBQWlCO0lBZ0Y1QixZQUNVLFNBQWlDLEVBQ2pDLEtBQVk7UUFEWixjQUFTLEdBQVQsU0FBUyxDQUF3QjtRQUNqQyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBN0ViLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFNekIsc0JBQWlCLEdBQUcsS0FBSyxFQUFPLENBQUM7UUFDakMsb0JBQWUsR0FBYSxFQUFFLENBQUM7UUFNL0IsbUJBQWMsR0FBVSxFQUFFLENBQUM7UUFJM0IsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQU1uQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQVVuQixtQkFBYyxHQUFHLE1BQU0sQ0FBQztRQUV4QixvQkFBZSxHQUFVLEVBQUUsQ0FBQztRQUM1Qix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRW5CLHlCQUFvQixHQUFHLEVBQUUsQ0FBQztRQUMxQix3QkFBbUIsR0FBRyxVQUFVLENBQUM7UUFHakMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBS2pCLHlCQUFvQixHQUFVLEVBQUUsQ0FBQztRQUNqQyw4QkFBeUIsR0FBVSxFQUFFLENBQUM7UUFRdEMsWUFBTyxHQUFRLEVBQUUsQ0FBQztRQUNsQixnQkFBVyxHQUFVLEVBQUUsQ0FBQztRQUV4QixRQUFHLEdBQVEsRUFBRSxDQUFDO1FBRWQsZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFDdEIsVUFBSyxHQUFRLElBQUksQ0FBQztRQUdsQixhQUFRLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hELFlBQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBTWpDLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBbUIsQ0FBQztRQUNsRSw2RkFBNkY7UUFDN0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUNqRix1RkFBdUY7UUFDdkYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQztRQUN0RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDdkcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDOUksSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztRQUU5RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBQ25HLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBRS9GLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFDakcsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFFMUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztRQUVyRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBRTdDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUVoRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztRQUN6RixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLFNBQVMsQ0FDOUIsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsRUFDakUsSUFBSSxDQUFDLEVBQUU7Z0JBQ0wsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLENBQUMsRUFDRCx1QkFBdUIsSUFBSSxFQUFFLEVBQzdCLEtBQUssRUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUM3QixDQUFDO1lBQ0YsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLFNBQVMsQ0FDOUIsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLGNBQWMsQ0FBQyxnQ0FBZ0MsRUFDcEUsR0FBRyxFQUFFO2dCQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixDQUFDLEVBQ0QsdUJBQXVCLElBQUksRUFBRSxFQUM3QixLQUFLLEVBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FDN0IsQ0FBQztRQUNKLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNOLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNwRSxDQUFDO1lBQ0QsT0FBTyxDQUFDO2dCQUNOLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixHQUFHLElBQUksQ0FBQyxPQUFPO2dCQUNmLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7Z0JBQ3pDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO2dCQUNuQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7YUFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFNBQVMsR0FBRyxLQUFLO1FBQzFDLElBQUksVUFBVSxDQUFDO1FBQ2YsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLFVBQVUsR0FBRyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ25ELENBQUM7YUFBTSxDQUFDO1lBQ04sVUFBVSxHQUFHLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxtQkFBbUIsQ0FBQyxJQUFJO1FBQ3RCLE1BQU0sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDNUMsSUFBSSxzQkFBc0IsR0FBUTtZQUNoQyxLQUFLLEVBQUU7Z0JBQ0wsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsTUFBTSxFQUFFLEVBQUU7YUFDWDtTQUNGLENBQUM7UUFFRixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLGdCQUFnQixDQUFDO1FBQzFDLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDO1FBQy9DLG1HQUFtRztRQUNuRyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUM7UUFFM0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sV0FBVyxHQUFVLEVBQUUsQ0FBQztRQUM5QixtRkFBbUY7UUFDbkYsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNwQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNmLEtBQUssRUFBRSxHQUFHO2FBQ1gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCwrREFBK0Q7UUFDL0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25ILE9BQU87UUFDVCxDQUFDO1FBQ0QsNEdBQTRHO1FBQzVHLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV4QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxxRkFBcUY7UUFDckYsTUFBTSxVQUFVLEdBQVUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQVUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEQsS0FBSyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUUsV0FBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN6RSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekMsd0RBQXdEO1lBQ3hELElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNwQix1Q0FBdUM7Z0JBQ3ZDLFNBQVM7WUFDWCxDQUFDO1lBRUQsZ0RBQWdEO1lBQ2hELFdBQVcsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztZQUM1QixLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztZQUVyRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqRix1Q0FBdUM7Z0JBQ3ZDLFNBQVM7WUFDWCxDQUFDO1lBQ0Qsd0ZBQXdGO1lBQ3hGLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDbkI7O2VBRUc7WUFDSCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixzQkFBc0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekgsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEdBQUc7b0JBQ3JELEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0I7b0JBQ3ZELENBQUMsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtpQkFDM0QsQ0FBQztnQkFFRixJQUFJLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQzlDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksWUFBWSxLQUFLLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM5RCxDQUFDO2dCQUVELHNCQUFzQixDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDO1FBRUQsbUZBQW1GO1FBQ25GLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixzQkFBc0IsR0FBRyxTQUFTLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsc0JBQXNCLENBQUM7UUFDNUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLO1FBQ3JGLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDcEQsc0JBQXNCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRztZQUNyRCxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZ0JBQWdCO1lBQ3ZELENBQUMsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7WUFDekQsQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTtTQUMxRCxDQUFDO1FBQ0YsSUFBSSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksWUFBWSxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksZ0JBQWdCLEtBQ3pJLEtBQUssR0FBRyxDQUNWLEdBQUcsQ0FBQztRQUNOLENBQUM7YUFBTSxDQUFDO1lBQ04sc0JBQXNCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLEdBQUcsQ0FBQyxJQUFJLFlBQVksS0FBSyxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDOUYsQ0FBQztRQUVELHNCQUFzQixDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBRWxELE9BQU8sc0JBQXNCLENBQUM7SUFDaEMsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGlCQUFpQixDQUFDLE9BQU87UUFDdkIsbUdBQW1HO1FBQ25HLE9BQU8sS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3pELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztZQUNoRCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5RCxvQkFBb0I7WUFDcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztZQUN6RCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBRW5ELE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUTtnQkFDeEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztnQkFDbkQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFlBQVksQ0FDbkMsT0FBTyxFQUNQLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQzVCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFDNUUsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7WUFFTixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBRWpDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWpDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2lCQUN0RCxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQkFDckIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRWhDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDakUsb0dBQW9HO2dCQUNwRyxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBRXJFLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztnQkFFckYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDcEYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ3pDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQztnQkFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLGNBQWMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3BGLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzFDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7Z0JBQ2xDLENBQUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLGNBQWMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzFGLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7Z0JBQ2pDLENBQUM7Z0JBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFekUsaUZBQWlGO2dCQUNqRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUVwRCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDVixPQUFPLENBQUMsS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUN2RSxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEgsVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2xHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ2xDLENBQUM7YUFBTSxJQUFJLFVBQVUsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkUsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUc7b0JBQ1gsTUFBTSxFQUFFLFVBQVU7b0JBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNO2lCQUMxQyxDQUFDO1lBQ0osQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBQ0QseUJBQXlCO0lBQ3pCLHNDQUFzQztJQUN0QywrREFBK0Q7SUFDL0QsaUVBQWlFO0lBQ2pFLHNEQUFzRDtJQUN0RCw0QkFBNEI7SUFDNUIsUUFBUTtJQUNSLE1BQU07SUFDTixJQUFJO0lBRUosV0FBVztRQUNULEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxXQUFXLENBQ2hDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxjQUFjLENBQUMsNkJBQTZCLEVBQ2pFLHVCQUF1QixJQUFJLEVBQUUsRUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FDN0IsQ0FBQztRQUNGLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxXQUFXLENBQ2hDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxjQUFjLENBQUMsZ0NBQWdDLEVBQ3BFLHVCQUF1QixJQUFJLEVBQUUsRUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsZ0RBQWdEO0lBQ2hELDhDQUE4QztJQUM5Qyw2Q0FBNkM7SUFDN0Msb0RBQW9EO0lBQ3BELDBDQUEwQztJQUMxQyxJQUFJO0lBRUosSUFBSSxDQUFDLEtBQTRCO1FBQy9CLGVBQWUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELFlBQVksQ0FBQyxRQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU07UUFDN0MsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzFCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFZO1FBQ3RCLE1BQU0sV0FBVyxHQUFJLEtBQUssQ0FBQyxNQUEyQixDQUFDLEtBQUssQ0FBQztRQUM3RCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVyRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQWUsQ0FBQyxDQUFDO1lBQzlHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUV6RSxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzVDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUM5QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQUs7UUFDYixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUNyRSxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxhQUFhLENBQUMsR0FBRztRQUNmLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ25DLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsZUFBZSxDQUFDLEdBQUcsRUFBRSxLQUFLO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLE9BQU8sQ0FBQztRQUMvQixNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUM7WUFDaEYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDbkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QyxDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO1FBQzdCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDM0IsTUFBTSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLEVBQUUsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGdEQUFnRDtJQUNoRCw2QkFBNkI7SUFDN0IsMENBQTBDO0lBQzFDLGtDQUFrQztJQUNsQyxlQUFlO0lBQ2YsTUFBTTtJQUNOLElBQUk7SUFFSixhQUFhLENBQUMsS0FBSztRQUNqQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQyxNQUFNLEVBQUUsQ0FBQztRQUNULE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDYixPQUFPLEdBQUcsaUJBQWlCLE1BQU0sNEJBQTRCLENBQUM7UUFFOUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELGFBQWEsQ0FBQyxTQUFTO1FBQ3JCLEtBQUssSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ3hFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdkMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRztRQUNuQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDcEIsTUFBTSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDM0QsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssYUFBYTtnQkFDaEIsSUFBSSxnQkFBZ0IsSUFBSSxFQUFFLElBQUksUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUM3QyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixDQUFDO2dCQUNELE1BQU07WUFDUixLQUFLLG9CQUFvQjtnQkFDdkIsSUFBSSxnQkFBZ0IsSUFBSSxFQUFFLElBQUksY0FBYyxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNuRCxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixDQUFDO2dCQUNELE1BQU07WUFDUjtnQkFDRSxNQUFNO1FBQ1YsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUc7UUFDeEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN2QixJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsR0FBRyxDQUFDO1lBQzNCLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLENBQUM7WUFDdkIsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0MsUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixXQUFXLENBQUMsQ0FBQztZQUNwRCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRTtvQkFDL0QsYUFBYSxFQUFFLFNBQVM7b0JBQ3hCLFdBQVcsRUFBRSxFQUFFO2lCQUNULENBQUMsQ0FBQztZQUNaLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNyRSxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixRQUFRLElBQUksRUFBRSxDQUFDO2dCQUNiLEtBQUssYUFBYTtvQkFDaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDekIsTUFBTTtnQkFDUixLQUFLLG9CQUFvQjtvQkFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbkIsTUFBTTtnQkFDUjtvQkFDRSxNQUFNO1lBQ1YsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFVBQVU7UUFDaEMseUNBQXlDO1FBRXpDLHFGQUFxRjtRQUNyRixvRUFBb0U7UUFDcEUsb0RBQW9EO1FBRXBELDBDQUEwQztRQUUxQyx1QkFBdUI7UUFDdkIsZUFBZTtRQUNmLCtDQUErQztRQUMvQyxnREFBZ0Q7UUFDaEQsYUFBYTtRQUNiLGlCQUFpQjtRQUNqQiwyQkFBMkI7UUFDM0IsZ0RBQWdEO1FBQ2hELGFBQWE7UUFDYixhQUFhO1FBQ2IsNkNBQTZDO1FBQzdDLDhDQUE4QztRQUM5QyxhQUFhO1FBQ2IsSUFBSTtRQUVKLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3pDLDBEQUEwRDtRQUMxRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUVuRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLHNDQUFzQztJQUN0QyxpRkFBaUY7SUFFakYsdUNBQXVDO0lBQ3ZDLG9DQUFvQztJQUNwQyxvREFBb0Q7SUFDcEQsbUJBQW1CO0lBQ25CLDBEQUEwRDtJQUMxRCxvRUFBb0U7SUFDcEUsa0RBQWtEO0lBQ2xELDZCQUE2QjtJQUM3QixVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixJQUFJO0lBRUosV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWhDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNqRSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVCLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1lBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdEUsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBRUQsUUFBUSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDNUIsS0FBSyxJQUFJO2dCQUNQLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDO29CQUMvQixPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNaLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7b0JBQy9CLE9BQU8sQ0FBQyxDQUFDO2dCQUNYLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQztvQkFDL0IsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDWixDQUFDO2dCQUNELElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDO29CQUMvQixPQUFPLENBQUMsQ0FBQztnQkFDWCxDQUFDO2dCQUNELE1BQU07WUFDUjtnQkFDRSxNQUFNO1FBQ1YsQ0FBQztRQUVELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGlDQUFpQyxDQUFDLE1BQU0sRUFBRSxNQUFNO1FBQzlDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxRQUFRLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1QixLQUFLLElBQUk7Z0JBQ1AsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzlCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQzt3QkFBRSxPQUFPLENBQUMsQ0FBQztvQkFDdEMsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsQ0FBQztnQkFDRCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsS0FBSyxNQUFNO2dCQUNULElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUM5QixJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO3dCQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ3ZDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ3RDLE9BQU8sQ0FBQyxDQUFDO2dCQUNYLENBQUM7Z0JBQ0QsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDO2dCQUNFLE1BQU07UUFDVixDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQUk7UUFDdEIsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssTUFBTTtnQkFDVCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLE1BQU07WUFDUixLQUFLLFVBQVU7Z0JBQ2IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2dCQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDckIsTUFBTTtZQUNSO2dCQUNFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDdEIsTUFBTTtRQUNWLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVO1FBQ3ZCLHlCQUF5QjtRQUN6QixNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFL0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFVBQVUsQ0FBQztRQUN2QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFFcEQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFMUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTdDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXJCLDZFQUE2RTtRQUM3RSx5QkFBeUI7UUFDekIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUM3QixLQUFLLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQ2xFLElBQ0UsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxxQkFBcUI7Z0JBQ3ZELFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLElBQUksUUFBUTtnQkFDeEMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxZQUFZO2dCQUM1QyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxJQUFJLFdBQVcsRUFDM0MsQ0FBQztnQkFDRCxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNoQixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxvQ0FBb0M7WUFFcEMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBSztRQUN2QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBSztRQUN4QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDakQsQ0FBQztJQUVELHdCQUF3QixDQUFDLEtBQUssRUFBRSxLQUFLO1FBQ25DLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVELDRCQUE0QixDQUFDLEtBQUs7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2pELENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxLQUFLO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNqRCxDQUFDO0lBRUQsMEJBQTBCLENBQUMsS0FBVTtRQUNuQyxnQkFBZ0I7UUFDaEIsUUFBUSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckIsS0FBSyxRQUFRO2dCQUNYLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7Z0JBQy9CLE1BQU07WUFDUixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUN6QixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTTtRQUNWLENBQUM7UUFFRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRWpDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM3QyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDNUQsU0FBUyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDO2dCQUNoRCxTQUFTLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztnQkFDcEQsU0FBUyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztnQkFFMUQsTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDZCxNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixTQUFTO1lBQ1QsTUFBTSxTQUFTLEdBQVEsRUFBRSxDQUFDO1lBQzFCLFNBQVMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDdEQsU0FBUyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDO1lBQ2hELFNBQVMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBQ3BELFNBQVMsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFFMUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELG1EQUFtRDtRQUNuRCxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM3QyxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztZQUMxRCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDO1lBQ2hELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFDaEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5RCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDL0QsTUFBTSxTQUFTLEdBQVEsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hELElBQUksbUJBQW1CLElBQUksRUFBRSxJQUFJLGNBQWMsSUFBSSxNQUFNLElBQUksY0FBYyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUN6RixhQUFhO2dCQUNiLFNBQVMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixZQUFZO2dCQUNaLFNBQVMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELDJCQUEyQixDQUFDLFVBQVU7UUFDcEMsZ0VBQWdFO1FBRWhFLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM3QyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUMsbUJBQW1CLENBQUM7Z0JBRTFELE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ2QsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssTUFBTSxDQUFDO2dCQUNaLEtBQUssVUFBVSxDQUFDO2dCQUNoQixLQUFLLE1BQU07b0JBQ1QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQztvQkFDdEMsTUFBTTtnQkFDUjtvQkFDRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDO29CQUN0QyxNQUFNO1lBQ1YsQ0FBQztZQUVELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsSUFBUztRQUNsQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDN0MsSUFBSSxTQUFTLENBQUMsbUJBQW1CLElBQUksRUFBRSxJQUFJLFNBQVMsQ0FBQyxjQUFjLElBQUksTUFBTSxJQUFJLFNBQVMsQ0FBQyxjQUFjLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ3ZILElBQUksV0FBZ0IsQ0FBQztnQkFFckIsUUFBUSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3ZCLEtBQUssTUFBTSxDQUFDO29CQUNaLEtBQUssVUFBVSxDQUFDO29CQUNoQixLQUFLLE1BQU07d0JBQ1QsS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO3dCQUM5RCxNQUFNO29CQUNSO3dCQUNFLEtBQUssR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQzt3QkFDckUsTUFBTTtnQkFDVixDQUFDO1lBQ0gsQ0FBQztZQUVELCtCQUErQjtZQUMvQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXO1FBQzdDLElBQUksS0FBSyxDQUFDO1FBQ1YsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM5RyxXQUFXLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixJQUFJLElBQUksSUFBSSxTQUFTLENBQUMsbUJBQW1CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUU5SSxRQUFRLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNqQyxLQUFLLFVBQVU7Z0JBQ2IsaUZBQWlGO2dCQUNqRixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUN6Qyx5QkFBeUI7b0JBQ3pCLEtBQUssSUFBSSxJQUFJLENBQUM7b0JBQ2QsV0FBVyxJQUFJLElBQUksQ0FBQztvQkFFcEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxHQUFHLFdBQVcsQ0FBQztvQkFDakMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQzt3QkFDM0IsS0FBSyxHQUFHLEtBQUssQ0FBQztvQkFDaEIsQ0FBQztnQkFDSCxDQUFDO2dCQUNELE1BQU07WUFDUixLQUFLLE9BQU87Z0JBQ1YsSUFBSSxLQUFLLEdBQUcsV0FBVyxFQUFFLENBQUM7b0JBQ3hCLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2hCLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxJQUFJLEtBQUssR0FBRyxXQUFXLEVBQUUsQ0FBQztvQkFDeEIsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDaEIsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNsQixLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUNoQixDQUFDO2dCQUNELE1BQU07WUFDUixLQUFLLFNBQVM7Z0JBQ1osSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ2xCLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2hCLENBQUM7Z0JBQ0QsTUFBTTtZQUNSO2dCQUNFLE1BQU07UUFDVixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQseUJBQXlCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXO1FBQ3BELElBQUksS0FBSyxDQUFDO1FBQ1YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoRCxXQUFXLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTFELFFBQVEsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2pDLEtBQUssVUFBVTtnQkFDYixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ25DLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2hCLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxJQUFJLEtBQUssSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDekIsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDaEIsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsS0FBSyxZQUFZO2dCQUNmLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDaEIsQ0FBQztnQkFDRCxNQUFNO1lBQ1I7Z0JBQ0UsTUFBTTtRQUNWLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxpQkFBaUI7UUFDZix3QkFBd0I7UUFDeEIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUxQyxvQ0FBb0M7UUFDcEMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVyRCxrQ0FBa0M7UUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTFDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVsRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFFM0MsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUM5QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUU3QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFFRCxFQUFFO0lBQ0YseUNBQXlDO0lBQ3pDLGtFQUFrRTtJQUNsRSxFQUFFO0lBRUYsY0FBYyxDQUFDLFVBQVU7UUFDdkIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkMsSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBVTtRQUN4QixJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFLLEVBQUUsVUFBVTtRQUMxQiwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXZELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsR0FBRztRQUMzQixJQUFJLEtBQUssR0FBa0IsSUFBSSxDQUFDO1FBQ2hDLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFDLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNyQixLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVcsRUFBRSxjQUF3QjtRQUM3QyxNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzlCLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQVcsRUFBRSxLQUFhLEVBQUUsY0FBd0IsRUFBRSxNQUFhO1FBQzdFLElBQUksS0FBSyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDekIsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsRUFDRixJQUFJLENBQUMsU0FBUyxDQUNmLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsSUFBSSxTQUFTLEdBQVUsRUFBRSxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDckIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUNwRixLQUFLLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakYsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUc7UUFDYixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7UUFDaEIsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQixtRUFBbUU7WUFDbkUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSTtRQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEdBQUc7UUFDbkIsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDN0IsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDNUMsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxxQkFBcUIsQ0FBQyxJQUFpQixFQUFFLE1BQWM7UUFDckQsT0FBTyxJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFTO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuRCxJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDbEUsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDaEIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFVLENBQUM7UUFDckMsT0FBTyxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDM0MsQ0FBQztJQUVELDJCQUEyQixDQUFDLElBQUksRUFBRSxNQUFNO1FBQ3RDLDZDQUE2QztRQUM3QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUMsSUFBSSxRQUFRLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxFQUFFLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwRSxnQ0FBZ0M7WUFFaEMscUNBQXFDO1lBQ3JDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDakIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDekMsdUJBQXVCO2dCQUN2QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUN6RSxRQUFRLEdBQUcsSUFBSSxDQUFDO29CQUNoQixNQUFNO2dCQUNSLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxVQUFVLENBQUMsUUFBZSxFQUFFLFNBQWdCO1FBQzFDLE1BQU0sVUFBVSxHQUFVLElBQUksS0FBSyxFQUFPLENBQUM7UUFDM0MsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNyQixPQUFPO1lBQ1AsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFaEQsS0FBSyxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUUsVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQztnQkFDckUsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDNUMsSUFBSSxTQUFTLENBQUM7Z0JBQ2QsSUFBSSxhQUFhLENBQUM7Z0JBQ2xCLElBQUksUUFBUSxDQUFDO2dCQUNiLElBQUksa0JBQWtCLENBQUM7Z0JBRXZCLFFBQVEsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNuQyxLQUFLLE1BQU07d0JBQ1QsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7d0JBQ3hCLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO3dCQUM1QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7NEJBQ2QsUUFBUSxHQUFHLE1BQU0sQ0FBQzt3QkFDcEIsQ0FBQzt3QkFDRCxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dCQUV0RSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsYUFBYSxDQUFDO3dCQUNuQyxNQUFNO29CQUNSLEtBQUssVUFBVTt3QkFDYixTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQzt3QkFDeEIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7d0JBQzVCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs0QkFDZCxRQUFRLEdBQUcsZUFBZSxDQUFDO3dCQUM3QixDQUFDO3dCQUNELGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQzt3QkFFMUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLGFBQWEsQ0FBQzt3QkFDbkMsTUFBTTtvQkFDUixLQUFLLFVBQVU7d0JBQ2IsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7d0JBQ3hCLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsRUFBWSxDQUFDLENBQUM7d0JBQzFGLGdEQUFnRDt3QkFDaEQsTUFBTSxjQUFjLEdBQUc7NEJBQ3JCLE1BQU0sRUFBRSxTQUFTLEVBQUU7NEJBQ25CLFFBQVEsRUFBRSxRQUFROzRCQUNsQixTQUFTLEVBQUUsQ0FBQzt5QkFDYixDQUFDO3dCQUNGLGdEQUFnRDt3QkFDaEQsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLGNBQWMsRUFBRSxHQUFHLGtCQUFrQixFQUFFLENBQUM7d0JBQzVELE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQzt3QkFDckUsd0RBQXdEO3dCQUN4RCxNQUFNO29CQUNSO3dCQUNFLE1BQU07Z0JBQ1YsQ0FBQztZQUNILENBQUM7WUFDRCxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFHO1FBQ2hCLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sT0FBTyxHQUFRLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQUc7UUFDVixNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDL0IsSUFBSSxnQkFBZ0IsS0FBSyxFQUFFLElBQUksY0FBYyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDakYsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7WUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBSztRQUNYLE1BQU0sRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNwQyxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQzlCLElBQUksVUFBVSxLQUFLLFVBQVUsSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDdkQsa0ZBQWtGO1lBQ2xGLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBTSxHQUFHLEVBQUU7UUFDM0IsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELEdBQUcsS0FBSztZQUNSLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN6QixJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNyQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN0QyxFQUFFLEVBQUUsZ0JBQWdCO1lBQ3BCLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsUUFBUSxFQUFFLEVBQUU7WUFDWixZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDaEUsTUFBTSxFQUFFLElBQUk7U0FDYixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxjQUFjLENBQUMsU0FBUyxFQUFFLE1BQU07UUFDOUIsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDbkUsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3pDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakYsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUM7WUFDaEUsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFDakQsTUFBTSxTQUFTLEdBQVEsRUFBRSxDQUFDO1lBQzFCLFNBQVMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxTQUFTLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDNUIsU0FBUyxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDeEMsU0FBUyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxLQUFLLENBQUM7WUFDOUksU0FBUyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDakMsU0FBUyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3RDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xCLFNBQVMsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUMvQyxDQUFDO1lBQ0QsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsU0FBUyxDQUFDLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNFLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUNqQyxDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixHQUFHLEVBQUUsRUFBRSxhQUFhLEdBQUcsRUFBRTtRQUNyRSxNQUFNLFVBQVUsR0FBUSxFQUFFLENBQUM7UUFDM0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO2FBQ2xCLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sOEZBQThGO1lBQzlGLDBGQUEwRjtZQUMxRixTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2xELFVBQVUsQ0FBQyxJQUFJLENBQUM7d0JBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO3FCQUNsQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDekMsVUFBVSxDQUFDLElBQUksQ0FBQzt3QkFDZCxLQUFLLEVBQUUsQ0FBQztxQkFDVCxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQ2QsS0FBSyxFQUFFLENBQUM7aUJBQ1QsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELFFBQVEsQ0FBQyxTQUFTLEVBQUUsUUFBUTtRQUMxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQVM7UUFDcEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM1QixTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhO1FBQzFELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXZELElBQ0UsT0FBTztZQUNQLENBQUMsWUFBWTtZQUNiLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxhQUFhLEtBQUssSUFBSSxJQUFJLGFBQWEsRUFBRSxNQUFNLENBQUM7WUFDbEQsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsRUFDMUMsQ0FBQztZQUNELE9BQU87Z0JBQ0wsR0FBRyxNQUFNO2dCQUNUO29CQUNFLEtBQUssRUFBRSxPQUFPO2lCQUNmO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOytHQXB6Q1UsaUJBQWlCO21HQUFqQixpQkFBaUIsNExBQ2pCLFlBQVksdUVBQ1osT0FBTyxnRENwRnBCLHF5YUE2UEEseXZFRC9MSSxZQUFZLDhUQUNaLGtCQUFrQiwrZkFDbEIsY0FBYyxvWkFDZCxjQUFjLDZ1Q0FDZCxhQUFhLGdoQkFDYixjQUFjLDRnQ0FHZCxlQUFlLHVZQUNmLGFBQWEsbzFCQUNiLGFBQWEsOE5BQ2IsY0FBYywwWEFDZCxpQkFBaUIsd1pBQ2pCLGtCQUFrQiw4VUFDbEIsZUFBZSxvdkJBQ2YsZUFBZSxtREFDZixtQkFBbUIseWxCQUNGLHdCQUF3Qjs7NEZBR2hDLGlCQUFpQjtrQkExQjdCLFNBQVM7K0JBQ0UsZUFBZSxjQUdiLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxXQUFXO3dCQUNYLE9BQU87d0JBQ1AsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxpQkFBaUI7d0JBQ2pCLGtCQUFrQjt3QkFDbEIsZUFBZTt3QkFDZixlQUFlO3dCQUNmLG1CQUFtQjt3QkFDbkIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO3FCQUMzQzsrR0FHd0IsU0FBUztzQkFBakMsU0FBUzt1QkFBQyxZQUFZO2dCQUNILElBQUk7c0JBQXZCLFNBQVM7dUJBQUMsT0FBTztnQkFFVCxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIGZvcndhcmRSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTWF0UmFkaW9Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNvcnQsIE1hdFNvcnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBEcmFnRHJvcE1vZHVsZSwgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSwgQ2RrRHJvcExpc3QsIENka0RyYWcgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IFByb2dyZXNzU3Bpbm5lclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fbWVzc2FnZXMvcHJvZ3Jlc3Mtc3Bpbm5lci5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vX2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50TWFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vX2JyaWRnZS9jb21wb25lbnQtbWFwcGVyL2NvbXBvbmVudC1tYXBwZXIuY29tcG9uZW50JztcbmltcG9ydCB7IGdldEN1cnJlbmN5T3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL2N1cnJlbmN5LXV0aWxzJztcbmltcG9ydCB7IGdldExvY2FsZSwgZ2V0U2Vjb25kcyB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL2NvbW1vbic7XG5pbXBvcnQgeyBmb3JtYXR0ZXJzIH0gZnJvbSAnLi4vLi4vLi4vX2hlbHBlcnMvZm9ybWF0dGVycy9mb3JtYXQtdXRpbHMnO1xuXG5pbXBvcnQgeyB1c2VJbml0IH0gZnJvbSAnLi9saXN0Vmlld0hlbHBlcnMnO1xuXG5kZWNsYXJlIGNvbnN0IHdpbmRvdzogYW55O1xuXG5jb25zdCBTRUxFQ1RJT05fTU9ERSA9IHsgU0lOR0xFOiAnc2luZ2xlJywgTVVMVEk6ICdtdWx0aScgfTtcblxuaW50ZXJmYWNlIExpc3RWaWV3UHJvcHMge1xuICAvLyBJZiBhbnksIGVudGVyIGFkZGl0aW9uYWwgcHJvcHMgdGhhdCBvbmx5IGV4aXN0IG9uIHRoaXMgY29tcG9uZW50XG4gIGdsb2JhbFNlYXJjaD86IGJvb2xlYW47XG4gIHJlZmVyZW5jZUxpc3Q/OiBhbnk7XG4gIHJvd0NsaWNrQWN0aW9uPzogYW55O1xuICBzZWxlY3Rpb25Nb2RlPzogc3RyaW5nO1xuICByZWZlcmVuY2VUeXBlPzogc3RyaW5nO1xuICBjb21wb3NpdGVLZXlzPzogYW55O1xuICBzaG93RHluYW1pY0ZpZWxkcz86IGJvb2xlYW47XG4gIHByZXNldHM/OiBhbnk7XG4gIHJlb3JkZXJGaWVsZHM6IHN0cmluZyB8IGJvb2xlYW47XG4gIGdyb3VwaW5nOiBzdHJpbmcgfCBib29sZWFuO1xuICB2YWx1ZTogYW55O1xuICByZWFkb25seUNvbnRleHRMaXN0OiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBHcm91cCB7XG4gIGxldmVsID0gMDtcbiAgcGFyZW50OiBHcm91cDtcbiAgZXhwYW5kZWQgPSB0cnVlO1xuICB0b3RhbENvdW50cyA9IDA7XG4gIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5wYXJlbnQgfHwgKHRoaXMucGFyZW50LnZpc2libGUgJiYgdGhpcy5wYXJlbnQuZXhwYW5kZWQpO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1saXN0LXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGlzdC12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGlzdC12aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdElucHV0TW9kdWxlLFxuICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgIE1hdFNvcnRNb2R1bGUsXG4gICAgRHJhZ0Ryb3BNb2R1bGUsXG4gICAgQ2RrRHJvcExpc3QsXG4gICAgQ2RrRHJhZyxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0TWVudU1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdFJhZGlvTW9kdWxlLFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcbiAgICBNYXRTZWxlY3RNb2R1bGUsXG4gICAgTWF0T3B0aW9uTW9kdWxlLFxuICAgIE1hdERhdGVwaWNrZXJNb2R1bGUsXG4gICAgZm9yd2FyZFJlZigoKSA9PiBDb21wb25lbnRNYXBwZXJDb21wb25lbnQpXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTGlzdFZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKSBwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcbiAgQFZpZXdDaGlsZChNYXRTb3J0KSBzb3J0OiBNYXRTb3J0O1xuXG4gIEBJbnB1dCgpIHBDb25uJDogdHlwZW9mIFBDb25uZWN0O1xuICBASW5wdXQoKSBiSW5Gb3JtJCA9IHRydWU7XG4gIEBJbnB1dCgpIHBheWxvYWQ7XG5cbiAgcmVwZWF0TGlzdCQ6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xuICBmaWVsZHMkOiBhbnlbXTtcblxuICBkaXNwbGF5ZWRDb2x1bW5zJCA9IEFycmF5PGFueT4oKTtcbiAgZ3JvdXBCeUNvbHVtbnMkOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbmZpZ1Byb3BzJDogTGlzdFZpZXdQcm9wcztcblxuICB1cGRhdGVkUmVmTGlzdDogYW55O1xuXG4gIHJlcGVhdExpc3REYXRhOiBhbnlbXSA9IFtdO1xuXG4gIHNlYXJjaEljb24kOiBzdHJpbmc7XG5cbiAgYlNob3dTZWFyY2gkID0gZmFsc2U7XG4gIGJDb2x1bW5SZW9yZGVyJCA9IGZhbHNlO1xuICBiR3JvdXBpbmckID0gZmFsc2U7XG5cbiAgcGVyZkZpbHRlcjogc3RyaW5nO1xuICBzZWFyY2hGaWx0ZXI6IHN0cmluZztcblxuICBtZW51U3ZnSWNvbiQ6IHN0cmluZztcbiAgYXJyb3dTdmdJY29uJCA9ICcnO1xuICBhcnJvd0Rvd25TdmdJY29uJDogc3RyaW5nO1xuICBhcnJvd1VwU3ZnSWNvbiQ6IHN0cmluZztcblxuICBmaWx0ZXJTdmdJY29uJDogc3RyaW5nO1xuICBmaWx0ZXJPblN2Z0ljb24kOiBzdHJpbmc7XG4gIGdyb3VwQnlTdmdJY29uJDogc3RyaW5nO1xuXG4gIGNvbXBhcmVUeXBlOiBzdHJpbmc7XG4gIGNvbXBhcmVSZWY6IHN0cmluZztcbiAgYXJyb3dEaXJlY3Rpb24gPSAnZG93bic7XG5cbiAgZmlsdGVyQnlDb2x1bW5zOiBhbnlbXSA9IFtdO1xuICBiU2hvd0ZpbHRlclBvcG92ZXIkID0gZmFsc2U7XG4gIGJDb250YWlucyQgPSB0cnVlO1xuICBiRGF0ZVRpbWUkID0gZmFsc2U7XG5cbiAgZmlsdGVyQ29udGFpbnNMYWJlbCQgPSAnJztcbiAgZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdjb250YWlucyc7XG4gIGZpbHRlckNvbnRhaW5zVmFsdWUkOiBhbnk7XG5cbiAgYklzRGF0ZSQgPSBmYWxzZTtcbiAgYklzRGF0ZVRpbWUkID0gZmFsc2U7XG4gIGJJc1RpbWUkID0gZmFsc2U7XG5cbiAgY3VycmVudEZpbHRlclJlZkRhdGE6IGFueTtcbiAgY3VycmVudEZpbHRlckltYWdlRWw6IGFueTtcblxuICBhckZpbHRlck1haW5CdXR0b25zJDogYW55W10gPSBbXTtcbiAgYXJGaWx0ZXJTZWNvbmRhcnlCdXR0b25zJDogYW55W10gPSBbXTtcbiAgc2VsZWN0aW9uTW9kZT86IHN0cmluZztcbiAgc2luZ2xlU2VsZWN0aW9uTW9kZTogYm9vbGVhbjtcbiAgbXVsdGlTZWxlY3Rpb25Nb2RlOiBib29sZWFuO1xuICByb3dJRDogYW55O1xuICByZXNwb25zZTogYW55O1xuICBjb21wb3NpdGVLZXlzOiBhbnk7XG4gIHNob3dEeW5hbWljRmllbGRzOiBhbnk7XG4gIGZpbHRlcnM6IGFueSA9IHt9O1xuICBzZWxlY3RQYXJhbTogYW55W10gPSBbXTtcbiAgZmlsdGVyUGF5bG9hZDogYW55O1xuICByZWY6IGFueSA9IHt9O1xuICBjb3Ntb3NUYWJsZVJlZjogYW55O1xuICBsaXN0Q29udGV4dDogYW55ID0ge307XG4gIHF1ZXJ5OiBhbnkgPSBudWxsO1xuICBwYWdpbmc6IGFueTtcbiAgZmllbGREZWZzOiBhbnk7XG4gIHhSYXlBcGlzID0gUENvcmUuZ2V0RGVidWdnZXIoKS5nZXRYUmF5UnVudGltZSgpO1xuICB4UmF5VWlkID0gdGhpcy54UmF5QXBpcy5zdGFydFhSYXkoKTtcbiAgY2hlY2tCb3hWYWx1ZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcHNTZXJ2aWNlOiBQcm9ncmVzc1NwaW5uZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbHM6IFV0aWxzXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ1Byb3BzJCA9IHRoaXMucENvbm4kLmdldENvbmZpZ1Byb3BzKCkgYXMgTGlzdFZpZXdQcm9wcztcbiAgICAvKiogQnkgZGVmYXVsdCwgcHlHVUlEIGlzIHVzZWQgZm9yIERhdGEgY2xhc3NlcyBhbmQgcHlJRCBpcyBmb3IgV29yayBjbGFzc2VzIGFzIHJvdy1pZC9rZXkgKi9cbiAgICBjb25zdCBkZWZSb3dJRCA9IHRoaXMuY29uZmlnUHJvcHMkPy5yZWZlcmVuY2VUeXBlID09PSAnQ2FzZScgPyAncHlJRCcgOiAncHlHVUlEJztcbiAgICAvKiogSWYgY29tcG9zaXRlS2V5cyBpcyBkZWZpbmVkLCB1c2UgZHluYW1pYyB2YWx1ZSwgZWxzZSBmYWxsYmFjayB0byBweUlEIG9yIHB5R1VJRC4gKi9cbiAgICB0aGlzLmNvbXBvc2l0ZUtleXMgPSB0aGlzLmNvbmZpZ1Byb3BzJD8uY29tcG9zaXRlS2V5cztcbiAgICB0aGlzLnJvd0lEID0gdGhpcy5jb21wb3NpdGVLZXlzICYmIHRoaXMuY29tcG9zaXRlS2V5cz8ubGVuZ3RoID09PSAxID8gdGhpcy5jb21wb3NpdGVLZXlzWzBdIDogZGVmUm93SUQ7XG4gICAgdGhpcy5iU2hvd1NlYXJjaCQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZSh0aGlzLmNvbmZpZ1Byb3BzJD8uZ2xvYmFsU2VhcmNoID8gdGhpcy5jb25maWdQcm9wcyQuZ2xvYmFsU2VhcmNoIDogdGhpcy5wYXlsb2FkPy5nbG9iYWxTZWFyY2gpO1xuICAgIHRoaXMuYkNvbHVtblJlb3JkZXIkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUodGhpcy5jb25maWdQcm9wcyQucmVvcmRlckZpZWxkcyk7XG4gICAgdGhpcy5iR3JvdXBpbmckID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUodGhpcy5jb25maWdQcm9wcyQuZ3JvdXBpbmcpO1xuICAgIHRoaXMuc2hvd0R5bmFtaWNGaWVsZHMgPSB0aGlzLmNvbmZpZ1Byb3BzJD8uc2hvd0R5bmFtaWNGaWVsZHM7XG5cbiAgICB0aGlzLm1lbnVTdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ21vcmUnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5hcnJvd0Rvd25TdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ2Fycm93LWRvd24nLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5hcnJvd1VwU3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdhcnJvdy11cCcsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcblxuICAgIHRoaXMuZmlsdGVyU3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdmaWx0ZXInLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5maWx0ZXJPblN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnZmlsdGVyLW9uJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuZ3JvdXBCeVN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygncm93JywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gdGhpcy5jb25maWdQcm9wcyQuc2VsZWN0aW9uTW9kZTtcblxuICAgIHRoaXMuY2hlY2tCb3hWYWx1ZSA9IHRoaXMuY29uZmlnUHJvcHMkLnZhbHVlO1xuXG4gICAgdGhpcy5hckZpbHRlck1haW5CdXR0b25zJC5wdXNoKHsgYWN0aW9uSUQ6ICdzdWJtaXQnLCBqc0FjdGlvbjogJ3N1Ym1pdCcsIG5hbWU6ICdTdWJtaXQnIH0pO1xuICAgIHRoaXMuYXJGaWx0ZXJTZWNvbmRhcnlCdXR0b25zJC5wdXNoKHsgYWN0aW9uSUQ6ICdjYW5jZWwnLCBqc0FjdGlvbjogJ2NhbmNlbCcsIG5hbWU6ICdDYW5jZWwnIH0pO1xuXG4gICAgdGhpcy5zZWFyY2hJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ3NlYXJjaCcsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkuc3Vic2NyaWJlKFxuICAgICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5FVkVOVF9EQVNIQk9BUkRfRklMVEVSX0NIQU5HRSxcbiAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzRmlsdGVyQ2hhbmdlKGRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICBgZGFzaGJvYXJkLWNvbXBvbmVudC0keydpZCd9YCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKClcbiAgICAgICk7XG4gICAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnN1YnNjcmliZShcbiAgICAgICAgUENvcmUuZ2V0Q29uc3RhbnRzKCkuUFVCX1NVQl9FVkVOVFMuRVZFTlRfREFTSEJPQVJEX0ZJTFRFUl9DTEVBUl9BTEwsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmZpbHRlcnMgPSB7fTtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NGaWx0ZXJDbGVhcigpO1xuICAgICAgICB9LFxuICAgICAgICBgZGFzaGJvYXJkLWNvbXBvbmVudC0keydpZCd9YCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKClcbiAgICAgICk7XG4gICAgfSwgMCk7XG4gICAgaWYgKHRoaXMuY29uZmlnUHJvcHMkKSB7XG4gICAgICBpZiAoIXRoaXMucGF5bG9hZCkge1xuICAgICAgICB0aGlzLnBheWxvYWQgPSB7IHJlZmVyZW5jZUxpc3Q6IHRoaXMuY29uZmlnUHJvcHMkLnJlZmVyZW5jZUxpc3QgfTtcbiAgICAgIH1cbiAgICAgIHVzZUluaXQoe1xuICAgICAgICBwQ29ubiQ6IHRoaXMucENvbm4kLFxuICAgICAgICBiSW5Gb3JtJDogdGhpcy5iSW5Gb3JtJCxcbiAgICAgICAgLi4udGhpcy5wYXlsb2FkLFxuICAgICAgICBsaXN0Q29udGV4dDogdGhpcy5saXN0Q29udGV4dCxcbiAgICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgICAgc2hvd0R5bmFtaWNGaWVsZHM6IHRoaXMuc2hvd0R5bmFtaWNGaWVsZHMsXG4gICAgICAgIHhSYXlVaWQ6IHRoaXMueFJheVVpZCxcbiAgICAgICAgY29zbW9zVGFibGVSZWY6IHRoaXMuY29zbW9zVGFibGVSZWYsXG4gICAgICAgIHNlbGVjdGlvbk1vZGU6IHRoaXMuc2VsZWN0aW9uTW9kZVxuICAgICAgfSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIHRoaXMubGlzdENvbnRleHQgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5nZXRMaXN0RGF0YSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RmllbGRGcm9tRmlsdGVyKGZpbHRlciwgZGF0ZVJhbmdlID0gZmFsc2UpIHtcbiAgICBsZXQgZmllbGRWYWx1ZTtcbiAgICBpZiAoZGF0ZVJhbmdlKSB7XG4gICAgICBmaWVsZFZhbHVlID0gZmlsdGVyPy5BTkRbMF0/LmNvbmRpdGlvbi5saHMuZmllbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkVmFsdWUgPSBmaWx0ZXI/LmNvbmRpdGlvbi5saHMuZmllbGQ7XG4gICAgfVxuICAgIHJldHVybiBmaWVsZFZhbHVlO1xuICB9XG5cbiAgLy8gV2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiBFVkVOVF9EQVNIQk9BUkRfRklMVEVSX0NIQU5HRSBmaXJlc1xuICBwcm9jZXNzRmlsdGVyQ2hhbmdlKGRhdGEpIHtcbiAgICBjb25zdCB7IGZpbHRlcklkLCBmaWx0ZXJFeHByZXNzaW9uIH0gPSBkYXRhO1xuICAgIGxldCBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkOiBhbnkgPSB7XG4gICAgICBxdWVyeToge1xuICAgICAgICBmaWx0ZXI6IHt9LFxuICAgICAgICBzZWxlY3Q6IFtdXG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZmlsdGVyc1tmaWx0ZXJJZF0gPSBmaWx0ZXJFeHByZXNzaW9uO1xuICAgIGxldCBpc0RhdGVSYW5nZSA9ICEhZGF0YS5maWx0ZXJFeHByZXNzaW9uPy5BTkQ7XG4gICAgLy8gV2lsbCBiZSBBTkQgYnkgZGVmYXVsdCBidXQgbWFraW5nIGl0IGR5bmFtaWMgaW4gY2FzZSB3ZSBzdXBwb3J0IGR5bmFtaWMgcmVsYXRpb25hbCBvcHMgaW4gZnV0dXJlXG4gICAgY29uc3QgcmVsYXRpb25hbE9wID0gJ0FORCc7XG5cbiAgICBsZXQgZmllbGQgPSB0aGlzLmdldEZpZWxkRnJvbUZpbHRlcihmaWx0ZXJFeHByZXNzaW9uLCBpc0RhdGVSYW5nZSk7XG4gICAgY29uc3Qgc2VsZWN0UGFyYW06IGFueVtdID0gW107XG4gICAgLy8gQ29uc3RydWN0aW5nIHRoZSBzZWxlY3QgcGFyYW1ldGVycyBsaXN0ICh3aWxsIGJlIHNlbnQgaW4gZGFzaGJvYXJkRmlsdGVyUGF5bG9hZClcbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMkPy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICBzZWxlY3RQYXJhbS5wdXNoKHtcbiAgICAgICAgZmllbGQ6IGNvbFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBDaGVja2luZyBpZiB0aGUgdHJpZ2dlcmVkIGZpbHRlciBpcyBhcHBsaWNhYmxlIGZvciB0aGlzIGxpc3RcbiAgICBpZiAoZGF0YS5maWx0ZXJFeHByZXNzaW9uICE9PSBudWxsICYmICEodGhpcy5kaXNwbGF5ZWRDb2x1bW5zJD8ubGVuZ3RoICYmIHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/LmluY2x1ZGVzKGZpZWxkKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhpcyBpcyBhIGZsYWcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlc2V0IGRhc2hib2FyZEZpbHRlclBheWxvYWQgaW4gY2FzZSB3ZSBkb24ndCBmaW5kIGFueSB2YWxpZCBmaWx0ZXJzXG4gICAgbGV0IHZhbGlkRmlsdGVyID0gZmFsc2U7XG5cbiAgICBsZXQgaW5kZXggPSAxO1xuICAgIC8vIEl0ZXJhdGluZyBvdmVyIHRoZSBjdXJyZW50IGZpbHRlcnMgbGlzdCB0byBjcmVhdGUgZmlsdGVyIGRhdGEgd2hpY2ggd2lsbCBiZSBQT1NUZWRcbiAgICBjb25zdCBmaWx0ZXJLZXlzOiBhbnlbXSA9IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycyk7XG4gICAgY29uc3QgZmlsdGVyVmFsdWVzOiBhbnlbXSA9IE9iamVjdC52YWx1ZXModGhpcy5maWx0ZXJzKTtcbiAgICBmb3IgKGxldCBmaWx0ZXJJbmRleCA9IDA7IGZpbHRlckluZGV4IDwgZmlsdGVyS2V5cy5sZW5ndGg7IGZpbHRlckluZGV4KyspIHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IGZpbHRlclZhbHVlc1tmaWx0ZXJJbmRleF07XG4gICAgICAvLyBJZiB0aGUgZmlsdGVyIGlzIG51bGwgdGhlbiB3ZSBjYW4gc2tpcCB0aGlzIGl0ZXJhdGlvblxuICAgICAgaWYgKGZpbHRlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNraW5nIGlmIHRoZSBmaWx0ZXIgaXMgb2YgdHlwZS0gRGF0ZSBSYW5nZVxuICAgICAgaXNEYXRlUmFuZ2UgPSAhIWZpbHRlcj8uQU5EO1xuICAgICAgZmllbGQgPSB0aGlzLmdldEZpZWxkRnJvbUZpbHRlcihmaWx0ZXIsIGlzRGF0ZVJhbmdlKTtcblxuICAgICAgaWYgKCEodGhpcy5kaXNwbGF5ZWRDb2x1bW5zJD8ubGVuZ3RoICYmIHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/LmluY2x1ZGVzKGZpZWxkKSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gSWYgd2UgcmVhY2ggaGVyZSB0aGF0IGltcGxpZXMgd2UndmUgYXQgbGVhc3Qgb25lIHZhbGlkIGZpbHRlciwgaGVuY2Ugc2V0dGluZyB0aGUgZmxhZ1xuICAgICAgdmFsaWRGaWx0ZXIgPSB0cnVlO1xuICAgICAgLyoqIEJlbG93IGFyZSB0aGUgMiBjYXNlcyBmb3ItIFRleHQgJiBEYXRlLVJhbmdlIGZpbHRlciB0eXBlcyB3aGVyZSB3ZSdsbCBjb25zdHJ1Y3QgZmlsdGVyIGRhdGEgd2hpY2ggd2lsbCBiZSBzZW50IGluIHRoZSBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkXG4gICAgICAgKiBJbiBDb25zdGVsbGF0aW9uIERYIENvbXBvbmVudHMsIHRocm91Z2ggUmVwZWF0aW5nIFN0cnVjdHVyZXMgdGhleSBtaWdodCBiZSB1c2luZyBzZXZlcmFsIEFQSXMgdG8gZG8gaXQuIFdlJ3JlIGRvaW5nIGl0IGhlcmVcbiAgICAgICAqL1xuICAgICAgaWYgKGlzRGF0ZVJhbmdlKSB7XG4gICAgICAgIGRhc2hib2FyZEZpbHRlclBheWxvYWQgPSB0aGlzLmZpbHRlckJhc2VkT25EYXRlUmFuZ2UoZGFzaGJvYXJkRmlsdGVyUGF5bG9hZCwgZmlsdGVyLCByZWxhdGlvbmFsT3AsIHNlbGVjdFBhcmFtLCBpbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5maWx0ZXJDb25kaXRpb25zID0ge1xuICAgICAgICAgIC4uLmRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmZpbHRlckNvbmRpdGlvbnMsXG4gICAgICAgICAgW2BUJHtpbmRleCsrfWBdOiB7IC4uLmZpbHRlci5jb25kaXRpb24sIGlnbm9yZUNhc2U6IHRydWUgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpYykge1xuICAgICAgICAgIGRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmxvZ2ljID0gYCR7ZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWN9ICR7cmVsYXRpb25hbE9wfSBUJHtpbmRleCAtIDF9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpYyA9IGBUJHtpbmRleCAtIDF9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuc2VsZWN0ID0gc2VsZWN0UGFyYW07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgdGhlIGRhc2hib2FyZEZpbHRlclBheWxvYWQgaWYgd2UgZW5kIHVwIHdpdGggbm8gdmFsaWQgZmlsdGVycyBmb3IgdGhlIGxpc3RcbiAgICBpZiAoIXZhbGlkRmlsdGVyKSB7XG4gICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlclBheWxvYWQgPSBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkO1xuICAgIHRoaXMuZ2V0TGlzdERhdGEoKTtcbiAgfVxuXG4gIGZpbHRlckJhc2VkT25EYXRlUmFuZ2UoZGFzaGJvYXJkRmlsdGVyUGF5bG9hZCwgZmlsdGVyLCByZWxhdGlvbmFsT3AsIHNlbGVjdFBhcmFtLCBpbmRleCkge1xuICAgIGNvbnN0IGRhdGVSZWxhdGlvbmFsT3AgPSBmaWx0ZXI/LkFORCA/ICdBTkQnIDogJ09SJztcbiAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5maWx0ZXJDb25kaXRpb25zID0ge1xuICAgICAgLi4uZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIuZmlsdGVyQ29uZGl0aW9ucyxcbiAgICAgIFtgVCR7aW5kZXgrK31gXTogeyAuLi5maWx0ZXJbcmVsYXRpb25hbE9wXVswXS5jb25kaXRpb24gfSxcbiAgICAgIFtgVCR7aW5kZXgrK31gXTogeyAuLi5maWx0ZXJbcmVsYXRpb25hbE9wXVsxXS5jb25kaXRpb24gfVxuICAgIH07XG4gICAgaWYgKGRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmxvZ2ljKSB7XG4gICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpYyA9IGAke2Rhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmxvZ2ljfSAke3JlbGF0aW9uYWxPcH0gKFQke2luZGV4IC0gMn0gJHtkYXRlUmVsYXRpb25hbE9wfSBUJHtcbiAgICAgICAgaW5kZXggLSAxXG4gICAgICB9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmxvZ2ljID0gYChUJHtpbmRleCAtIDJ9ICR7cmVsYXRpb25hbE9wfSBUJHtpbmRleCAtIDF9KWA7XG4gICAgfVxuXG4gICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5zZWxlY3QgPSBzZWxlY3RQYXJhbTtcblxuICAgIHJldHVybiBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkO1xuICB9XG5cbiAgcHJvY2Vzc0ZpbHRlckNsZWFyKCkge1xuICAgIHRoaXMuZmlsdGVyUGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmdldExpc3REYXRhKCk7XG4gIH1cblxuICBnZXRGaWVsZHNNZXRhZGF0YShyZWZMaXN0KSB7XG4gICAgLy8gQHRzLWlnbm9yZSAtIDNyZCBwYXJhbWV0ZXIgXCJhc3NvY2lhdGlvbkZpbHRlclwiIHNob3VsZCBiZSBvcHRpb25hbCBmb3IgZ2V0RGF0YVZpZXdNZXRhZGF0YSBtZXRob2RcbiAgICByZXR1cm4gUENvcmUuZ2V0QW5hbHl0aWNzVXRpbHMoKS5nZXREYXRhVmlld01ldGFkYXRhKHJlZkxpc3QsIHRoaXMuc2hvd0R5bmFtaWNGaWVsZHMpO1xuICB9XG5cbiAgZ2V0TGlzdERhdGEoKSB7XG4gICAgY29uc3QgY29tcG9uZW50Q29uZmlnID0gdGhpcy5wQ29ubiQuZ2V0Q29tcG9uZW50Q29uZmlnKCk7XG4gICAgaWYgKHRoaXMuY29uZmlnUHJvcHMkKSB7XG4gICAgICB0aGlzLnByZXBhcmVQYXlsb2FkKCk7XG4gICAgICBjb25zdCByZWZMaXN0ID0gdGhpcy5jb25maWdQcm9wcyQucmVmZXJlbmNlTGlzdDtcbiAgICAgIGNvbnN0IGZpZWxkc01ldGFEYXRhUHJvbWlzZSA9IHRoaXMuZ2V0RmllbGRzTWV0YWRhdGEocmVmTGlzdCk7XG4gICAgICAvLyByZXR1cm5zIGEgcHJvbWlzZVxuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMucGF5bG9hZCB8fCB0aGlzLmZpbHRlclBheWxvYWQgfHwge307XG4gICAgICBjb25zdCBkYXRhVmlld1BhcmFtZXRlcnMgPSB0aGlzLnBheWxvYWQucGFyYW1ldGVycztcblxuICAgICAgY29uc3Qgd29ya0xpc3REYXRhUHJvbWlzZSA9ICF0aGlzLmJJbkZvcm0kXG4gICAgICAgID8gUENvcmUuZ2V0RGF0YUFwaVV0aWxzKCkuZ2V0RGF0YShyZWZMaXN0LCBwYXlsb2FkKVxuICAgICAgICA6IFBDb3JlLmdldERhdGFQYWdlVXRpbHMoKS5nZXREYXRhQXN5bmMoXG4gICAgICAgICAgICByZWZMaXN0LFxuICAgICAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSxcbiAgICAgICAgICAgIHBheWxvYWQuZGF0YVZpZXdQYXJhbWV0ZXJzID8gcGF5bG9hZC5kYXRhVmlld1BhcmFtZXRlcnMgOiBkYXRhVmlld1BhcmFtZXRlcnMsXG4gICAgICAgICAgICB0aGlzLnBhZ2luZyxcbiAgICAgICAgICAgIHRoaXMucXVlcnlcbiAgICAgICAgICApO1xuXG4gICAgICB0aGlzLmJTaG93RmlsdGVyUG9wb3ZlciQgPSBmYWxzZTtcblxuICAgICAgdGhpcy5wc1NlcnZpY2Uuc2VuZE1lc3NhZ2UodHJ1ZSk7XG5cbiAgICAgIFByb21pc2UuYWxsKFtmaWVsZHNNZXRhRGF0YVByb21pc2UsIHdvcmtMaXN0RGF0YVByb21pc2VdKVxuICAgICAgICAudGhlbigocmVzdWx0czogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZmllbGRzTWV0YURhdGEgPSByZXN1bHRzWzBdO1xuICAgICAgICAgIGNvbnN0IHdvcmtMaXN0RGF0YSA9IHJlc3VsdHNbMV07XG5cbiAgICAgICAgICB0aGlzLmZpZWxkcyQgPSB0aGlzLmNvbmZpZ1Byb3BzJC5wcmVzZXRzWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuO1xuICAgICAgICAgIC8vIHRoaXMgaXMgYW4gdW5yZXNvdmxlZCB2ZXJzaW9uIG9mIHRoaXMuZmllbGRzJCwgbmVlZCB1bnJlc29sdmVkLCBzbyBjYW4gZ2V0IHRoZSBwcm9wZXJ0eSByZWZlcmVuY2VcbiAgICAgICAgICBjb25zdCBjb2x1bW5GaWVsZHMgPSBjb21wb25lbnRDb25maWcucHJlc2V0c1swXS5jaGlsZHJlblswXS5jaGlsZHJlbjtcblxuICAgICAgICAgIGNvbnN0IHRhYmxlRGF0YVJlc3VsdHMgPSAhdGhpcy5iSW5Gb3JtJCA/IHdvcmtMaXN0RGF0YS5kYXRhLmRhdGEgOiB3b3JrTGlzdERhdGEuZGF0YTtcblxuICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEhlYWRlckNlbGxzKGNvbHVtbkZpZWxkcywgdGhpcy5maWVsZERlZnMpO1xuICAgICAgICAgIHRoaXMuZmllbGRzJCA9IHRoaXMudXBkYXRlRmllbGRzKHRoaXMuZmllbGRzJCwgZmllbGRzTWV0YURhdGEuZGF0YS5maWVsZHMsIGNvbHVtbnMpO1xuICAgICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyQgPSBjb2x1bW5zLm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbC5pZDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gdGFibGVEYXRhUmVzdWx0cztcbiAgICAgICAgICB0aGlzLnVwZGF0ZWRSZWZMaXN0ID0gdGhpcy51cGRhdGVEYXRhKHRhYmxlRGF0YVJlc3VsdHMsIHRoaXMuZmllbGRzJCk7XG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gU0VMRUNUSU9OX01PREUuU0lOR0xFICYmIHRoaXMudXBkYXRlZFJlZkxpc3Q/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/LnVuc2hpZnQoJ3NlbGVjdCcpO1xuICAgICAgICAgICAgdGhpcy5zaW5nbGVTZWxlY3Rpb25Nb2RlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gU0VMRUNUSU9OX01PREUuTVVMVEkgJiYgdGhpcy51cGRhdGVkUmVmTGlzdD8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zJD8udW5zaGlmdCgnc2VsZWN0Jyk7XG4gICAgICAgICAgICB0aGlzLm11bHRpU2VsZWN0aW9uTW9kZSA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5yZXBlYXRMaXN0JCA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy51cGRhdGVkUmVmTGlzdCk7XG4gICAgICAgICAgdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXJQcmVkaWNhdGUgPSB0aGlzLmN1c3RvbUZpbHRlclByZWRpY2F0ZS5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgLy8ga2VlcGluZyBhbiBvcmlnaW5hbCBjb3B5IHRvIGdldCBiYWNrIGFmdGVyIHBvc3NpYmxlIHNvcnRzLCBmaWx0ZXJzIGFuZCBncm91cEJ5XG4gICAgICAgICAgdGhpcy5yZXBlYXRMaXN0RGF0YSA9IHRoaXMucmVwZWF0TGlzdCQuZGF0YS5zbGljZSgpO1xuXG4gICAgICAgICAgdGhpcy5yZXBlYXRMaXN0JC5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgICAgICB0aGlzLnJlcGVhdExpc3QkLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgICAgICAgdGhpcy5wc1NlcnZpY2Uuc2VuZE1lc3NhZ2UoZmFsc2UpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZG4ndCBmZXRjaCBlaXRoZXIgdGhlIGZpZWxkc01ldGFEYXRhIG9yIHdvcmtMaXN0RGF0YVwiKTtcbiAgICAgICAgICB0aGlzLnBzU2VydmljZS5zZW5kTWVzc2FnZShmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVQYXlsb2FkKCkge1xuICAgIGNvbnN0IHsgZmllbGREZWZzLCBpdGVtS2V5LCBwYXRjaFF1ZXJ5RmllbGRzIH0gPSB0aGlzLmxpc3RDb250ZXh0Lm1ldGE7XG4gICAgdGhpcy5maWVsZERlZnMgPSBmaWVsZERlZnM7XG4gICAgbGV0IGxpc3RGaWVsZHMgPSBmaWVsZERlZnMgPyB0aGlzLmJ1aWxkU2VsZWN0KGZpZWxkRGVmcywgdW5kZWZpbmVkLCBwYXRjaFF1ZXJ5RmllbGRzLCB0aGlzLnBheWxvYWQ/LmNvbXBvc2l0ZUtleXMpIDogW107XG4gICAgbGlzdEZpZWxkcyA9IHRoaXMuYWRkSXRlbUtleUluU2VsZWN0KGZpZWxkRGVmcywgaXRlbUtleSwgbGlzdEZpZWxkcywgdGhpcy5wYXlsb2FkPy5jb21wb3NpdGVLZXlzKTtcbiAgICBpZiAodGhpcy5wYXlsb2FkLnF1ZXJ5KSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5wYXlsb2FkLnF1ZXJ5O1xuICAgIH0gZWxzZSBpZiAobGlzdEZpZWxkcz8ubGVuZ3RoICYmIHRoaXMubGlzdENvbnRleHQubWV0YS5pc1F1ZXJ5YWJsZSkge1xuICAgICAgaWYgKHRoaXMuZmlsdGVyUGF5bG9hZCkge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0ge1xuICAgICAgICAgIHNlbGVjdDogbGlzdEZpZWxkcyxcbiAgICAgICAgICBmaWx0ZXI6IHRoaXMuZmlsdGVyUGF5bG9hZD8ucXVlcnk/LmZpbHRlclxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHsgc2VsZWN0OiBsaXN0RmllbGRzIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmZpbHRlclBheWxvYWQpIHtcbiAgICAgIHRoaXMucXVlcnkgPSB0aGlzLmZpbHRlclBheWxvYWQ/LnF1ZXJ5O1xuICAgIH1cbiAgfVxuICAvLyBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gIC8vICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5wYXlsb2FkKSB7XG4gIC8vICAgICBjb25zdCBjdXJyZW50UGF5bG9hZFZhbCA9IGNoYW5nZXMucGF5bG9hZD8uY3VycmVudFZhbHVlO1xuICAvLyAgICAgY29uc3QgcHJldmlvdXNQYXlsb2FkVmFsID0gY2hhbmdlcy5wYXlsb2FkPy5wcmV2aW91c1ZhbHVlO1xuICAvLyAgICAgaWYgKGN1cnJlbnRQYXlsb2FkVmFsICE9PSBwcmV2aW91c1BheWxvYWRWYWwpIHtcbiAgLy8gICAgICAgdGhpcy5nZXRMaXN0RGF0YSgpO1xuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkudW5zdWJzY3JpYmUoXG4gICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5FVkVOVF9EQVNIQk9BUkRfRklMVEVSX0NIQU5HRSxcbiAgICAgIGBkYXNoYm9hcmQtY29tcG9uZW50LSR7J2lkJ31gLFxuICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICk7XG4gICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS51bnN1YnNjcmliZShcbiAgICAgIFBDb3JlLmdldENvbnN0YW50cygpLlBVQl9TVUJfRVZFTlRTLkVWRU5UX0RBU0hCT0FSRF9GSUxURVJfQ0xFQVJfQUxMLFxuICAgICAgYGRhc2hib2FyZC1jb21wb25lbnQtJHsnaWQnfWAsXG4gICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgKTtcbiAgfVxuXG4gIC8vIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgLy8gICAvLyBwYWdpbmF0b3IgaGFzIHRvIGV4aXN0IGZvciB0aGlzIHRvIHdvcmssXG4gIC8vICAgLy8gc28gY2FsbGVkIGFmdGVyIGluaXQgKHBhZ2luYXRvciBkcmF3bilcbiAgLy8gICAvLyBDYWxscyBhcmUgbm93IGluIHdvcmtMaXN0RGF0YSBwcm9taXNlXG4gIC8vICAgLy8gdGhpcy5yZXBlYXRMaXN0JC5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgLy8gICAvLyB0aGlzLnJlcGVhdExpc3QkLnNvcnQgPSB0aGlzLnNvcnQ7XG4gIC8vIH1cblxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pIHtcbiAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5kaXNwbGF5ZWRDb2x1bW5zJCwgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgfVxuXG4gIHVwZGF0ZUZpZWxkcyhhckZpZWxkczogYW55W10sIGFyQ29sdW1ucywgZmllbGRzKTogYW55W10ge1xuICAgIGNvbnN0IGFyUmV0dXJuID0gYXJGaWVsZHM7XG4gICAgYXJSZXR1cm4uZm9yRWFjaCgoZmllbGQsIGkpID0+IHtcbiAgICAgIGZpZWxkLmNvbmZpZyA9IHsgLi4uZmllbGQuY29uZmlnLCAuLi5maWVsZHNbaV0sIG5hbWU6IGZpZWxkc1tpXS5pZCB9O1xuICAgIH0pO1xuICAgIHJldHVybiBhclJldHVybjtcbiAgfVxuXG4gIGFwcGx5U2VhcmNoKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGZpbHRlclZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLnNlYXJjaEZpbHRlciA9IGZpbHRlclZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKHRoaXMuZ3JvdXBCeUNvbHVtbnMkLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZGF0YSA9IHRoaXMucmVwZWF0TGlzdERhdGEuc2xpY2UoKTtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gdGhpcy5zZWFyY2hGaWx0ZXI7XG4gICAgICBjb25zdCByZXBlYXREYXRhID0gdGhpcy5yZXBlYXRMaXN0JC5zb3J0RGF0YSh0aGlzLnJlcGVhdExpc3QkLmZpbHRlcmVkRGF0YSwgdGhpcy5yZXBlYXRMaXN0JC5zb3J0IGFzIE1hdFNvcnQpO1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5kYXRhID0gdGhpcy5hZGRHcm91cHMocmVwZWF0RGF0YSwgdGhpcy5ncm91cEJ5Q29sdW1ucyQpO1xuXG4gICAgICB0aGlzLnBlcmZGaWx0ZXIgPSBwZXJmb3JtYW5jZS5ub3coKS50b1N0cmluZygpO1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSB0aGlzLnBlcmZGaWx0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gdGhpcy5zZWFyY2hGaWx0ZXI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVwZWF0TGlzdCQucGFnaW5hdG9yKSB7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICB9XG4gIH1cblxuICBpc0NoZWNrZWQocm93SW4pOiBhbnkge1xuICAgIGNvbnN0IGluaXRpYWxWYWwgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5jb25maWdQcm9wcyQ/LnJlYWRvbmx5Q29udGV4dExpc3Q/LnJlZHVjZSgoYWNjLCBjdXJyUm93KSA9PiB7XG4gICAgICByZXR1cm4gYWNjIHx8IHJvd0luW3RoaXMucm93SURdID09PSBjdXJyUm93W3RoaXMucm93SURdO1xuICAgIH0sIGluaXRpYWxWYWwpO1xuICB9XG5cbiAgZmllbGRPbkNoYW5nZShyb3cpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvd1t0aGlzLnJvd0lEXTtcbiAgICBjb25zdCByZXFPYmogPSB7fTtcbiAgICBpZiAodGhpcy5jb21wb3NpdGVLZXlzPy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMucmVzcG9uc2UuZmluZEluZGV4KGVsZW1lbnQgPT4gZWxlbWVudFt0aGlzLnJvd0lEXSA9PT0gdmFsdWUpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRSb3cgPSB0aGlzLnJlc3BvbnNlW2luZGV4XTtcbiAgICAgIHRoaXMuY29tcG9zaXRlS2V5cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICByZXFPYmpbZWxlbWVudF0gPSBzZWxlY3RlZFJvd1tlbGVtZW50XTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXFPYmpbdGhpcy5yb3dJRF0gPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5jaGVja0JveFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5wQ29ubiQ/LmdldExpc3RBY3Rpb25zPy4oKT8uc2V0U2VsZWN0ZWRSb3dzKFtyZXFPYmpdKTtcbiAgfVxuXG4gIG9uQ2hlY2tib3hDbGljayhyb3csIGV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSByb3dbdGhpcy5yb3dJRF07XG4gICAgY29uc3QgY2hlY2tlZCA9IGV2ZW50Py5jaGVja2VkO1xuICAgIGNvbnN0IHJlcU9iajogYW55ID0ge307XG4gICAgaWYgKHRoaXMuY29tcG9zaXRlS2V5cz8ubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlc3BvbnNlLmZpbmRJbmRleChlbGVtZW50ID0+IGVsZW1lbnRbdGhpcy5yb3dJRF0gPT09IHZhbHVlKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUm93ID0gdGhpcy5yZXNwb25zZVtpbmRleF07XG4gICAgICB0aGlzLmNvbXBvc2l0ZUtleXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgcmVxT2JqW2VsZW1lbnRdID0gc2VsZWN0ZWRSb3dbZWxlbWVudF07XG4gICAgICB9KTtcbiAgICAgIHJlcU9iai4kc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXFPYmpbdGhpcy5yb3dJRF0gPSB2YWx1ZTtcbiAgICAgIHJlcU9iai4kc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIH1cbiAgICB0aGlzLnBDb25uJD8uZ2V0TGlzdEFjdGlvbnMoKT8uc2V0U2VsZWN0ZWRSb3dzKFtyZXFPYmpdKTtcbiAgfVxuXG4gIC8vIHJvd0NsaWNrKHJvdykge1xuICAvLyAgIHN3aXRjaCAodGhpcy5jb25maWdQcm9wcyQucm93Q2xpY2tBY3Rpb24pIHtcbiAgLy8gICAgIGNhc2UgJ29wZW5Bc3NpZ25tZW50JzpcbiAgLy8gICAgICAgdGhpcy5wc1NlcnZpY2Uuc2VuZE1lc3NhZ2UodHJ1ZSk7XG4gIC8vICAgICAgIHRoaXMub3BlbkFzc2lnbm1lbnQocm93KTtcbiAgLy8gICAgICAgYnJlYWs7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgX2dldEljb25TdHlsZShsZXZlbCk6IHN0cmluZyB7XG4gICAgbGV0IHNSZXR1cm4gPSAnJztcbiAgICBsZXQgbkxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICBuTGV2ZWwtLTtcbiAgICBuTGV2ZWwgKj0gMTU7XG4gICAgc1JldHVybiA9IGBwYWRkaW5nLWxlZnQ6ICR7bkxldmVsfXB4OyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlYDtcblxuICAgIHJldHVybiBzUmV0dXJuO1xuICB9XG5cbiAgX2dldEdyb3VwTmFtZShmaWVsZE5hbWUpIHtcbiAgICBmb3IgKGxldCBmaWVsZEluZGV4ID0gMDsgZmllbGRJbmRleCA8IHRoaXMuZmllbGRzJC5sZW5ndGg7IGZpZWxkSW5kZXgrKykge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcyRbZmllbGRJbmRleF07XG4gICAgICBpZiAoZmllbGQuY29uZmlnLm5hbWUgPT0gZmllbGROYW1lKSB7XG4gICAgICAgIHJldHVybiBmaWVsZC5jb25maWcubGFiZWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIF9zaG93QnV0dG9uKG5hbWUsIHJvdykge1xuICAgIGxldCBiUmV0dXJuID0gZmFsc2U7XG4gICAgY29uc3QgeyBweFJlZk9iamVjdENsYXNzLCBwekluc0tleSwgcHhSZWZPYmplY3RLZXkgfSA9IHJvdztcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ3B4VGFza0xhYmVsJzpcbiAgICAgICAgaWYgKHB4UmVmT2JqZWN0Q2xhc3MgIT0gJycgJiYgcHpJbnNLZXkgIT0gJycpIHtcbiAgICAgICAgICBiUmV0dXJuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3B4UmVmT2JqZWN0SW5zTmFtZSc6XG4gICAgICAgIGlmIChweFJlZk9iamVjdENsYXNzICE9ICcnICYmIHB4UmVmT2JqZWN0S2V5ICE9ICcnKSB7XG4gICAgICAgICAgYlJldHVybiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gYlJldHVybjtcbiAgfVxuXG4gIF9saXN0Vmlld0NsaWNrKGNvbHVtbiwgcm93KSB7XG4gICAgY29uc3QgbmFtZSA9IGNvbHVtbi5pZDtcbiAgICBpZiAoY29sdW1uLmRpc3BsYXlBc0xpbmspIHtcbiAgICAgIGNvbnN0IHsgcHhPYmpDbGFzcyB9ID0gcm93O1xuICAgICAgbGV0IHsgcHpJbnNLZXkgfSA9IHJvdztcbiAgICAgIGlmIChjb2x1bW4uaXNBc3NvY2lhdGlvbikge1xuICAgICAgICBjb25zdCBhc3NvY2lhdGlvbkNhdGVnb3J5ID0gbmFtZS5zcGxpdCgnOicpWzBdO1xuICAgICAgICBwekluc0tleSA9IHJvd1tgJHthc3NvY2lhdGlvbkNhdGVnb3J5fTpwekluc0tleWBdO1xuICAgICAgfVxuICAgICAgaWYgKGNvbHVtbi5pc0Fzc2lnbm1lbnRMaW5rKSB7XG4gICAgICAgIHRoaXMucENvbm4kLmdldEFjdGlvbnNBcGkoKS5vcGVuQXNzaWdubWVudChwekluc0tleSwgcHhPYmpDbGFzcywge1xuICAgICAgICAgIGNvbnRhaW5lck5hbWU6ICdwcmltYXJ5JyxcbiAgICAgICAgICBjaGFubmVsTmFtZTogJydcbiAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wQ29ubiQuZ2V0QWN0aW9uc0FwaSgpLm9wZW5Xb3JrQnlIYW5kbGUocHpJbnNLZXksIHB4T2JqQ2xhc3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSAncHhUYXNrTGFiZWwnOlxuICAgICAgICAgIHRoaXMub3BlbkFzc2lnbm1lbnQocm93KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncHhSZWZPYmplY3RJbnNOYW1lJzpcbiAgICAgICAgICB0aGlzLm9wZW5Xb3JrKHJvdyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2hlYWRlclNvcnRDbGljayhldmVudCwgY29sdW1uRGF0YSkge1xuICAgIC8vIGltYWdlcyAwIC0gZmlsdGVyLCAxIC0gYXJyb3csIDIgLSBtb3JlXG5cbiAgICAvKiogQ29tbWVudGluZyB0aGlzIGNvZGUgZm9yIG5vdyBhcyBpdCBpcyBnaXZpbmcgZXJyb3JzIG5vdCBzdXJlIGlmIGl0IGV2ZXIgd29ya2VkICovXG4gICAgLy8gbGV0IGFycm93SW1hZ2UgPSBldmVudC5zcmNFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKVsxXTtcbiAgICAvLyBsZXQgYXJyb3dBdHRyID0gYXJyb3dJbWFnZS5nZXRBdHRyaWJ1dGUoJ2Fycm93Jyk7XG5cbiAgICAvLyB0aGlzLmNsZWFyT3V0QXJyb3dzKGV2ZW50LCBjb2x1bW5EYXRhKTtcblxuICAgIC8vIHN3aXRjaCAoYXJyb3dBdHRyKSB7XG4gICAgLy8gICBjYXNlICd1cCc6XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc3JjID0gdGhpcy5hcnJvd0Rvd25TdmdJY29uJDtcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zZXRBdHRyaWJ1dGUoJ2Fycm93JywgJ2Rvd24nKTtcbiAgICAvLyAgICAgYnJlYWs7XG4gICAgLy8gICBjYXNlICdkb3duJzpcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zcmMgPSAnJztcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zZXRBdHRyaWJ1dGUoJ2Fycm93JywgJ25vbmUnKTtcbiAgICAvLyAgICAgYnJlYWs7XG4gICAgLy8gICBkZWZhdWx0OlxuICAgIC8vICAgICBhcnJvd0ltYWdlLnNyYyA9IHRoaXMuYXJyb3dVcFN2Z0ljb24kO1xuICAgIC8vICAgICBhcnJvd0ltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAndXAnKTtcbiAgICAvLyAgICAgYnJlYWs7XG4gICAgLy8gfVxuXG4gICAgdGhpcy5jb21wYXJlVHlwZSA9IGNvbHVtbkRhdGEudHlwZTtcbiAgICB0aGlzLmNvbXBhcmVSZWYgPSBjb2x1bW5EYXRhLmNvbmZpZy5uYW1lO1xuICAgIC8vIHRoaXMuYXJyb3dEaXJlY3Rpb24gPSBhcnJvd0ltYWdlLmdldEF0dHJpYnV0ZSgnYXJyb3cnKTtcbiAgICB0aGlzLmFycm93RGlyZWN0aW9uID0gdGhpcy5hcnJvd0RpcmVjdGlvbiA9PT0gJ3VwJyA/ICdkb3duJyA6ICd1cCc7XG5cbiAgICB0aGlzLmZpbHRlclNvcnRHcm91cEJ5KCk7XG4gIH1cblxuICAvLyBDb21tZW50aW5nIGJlbG93IG1ldGhvZCwgc2luY2UgdGhlIGNvZGUgd2hpY2ggaXMgdXNpbmcgaXQsIGlzIGFscmVhZHkgY29tbWVudGVkXG4gIC8vIGNsZWFyT3V0QXJyb3dzKGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gIC8vICAgY29uc3QgYXJJbWFnZXMgPSBldmVudC5zcmNFbGVtZW50LnBhcmVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpO1xuXG4gIC8vICAgZm9yIChjb25zdCB0aGVJbWFnZSBvZiBhckltYWdlcykge1xuICAvLyAgICAgLy8gbGV0IHRoZUltYWdlID0gYXJJbWFnZXNbaV1cbiAgLy8gICAgIGNvbnN0IGFycm93ID0gdGhlSW1hZ2UuZ2V0QXR0cmlidXRlKCdhcnJvdycpO1xuICAvLyAgICAgaWYgKGFycm93KSB7XG4gIC8vICAgICAgIGNvbnN0IGFycm93SWQgPSB0aGVJbWFnZS5nZXRBdHRyaWJ1dGUoJ2Fycm93aWQnKTtcbiAgLy8gICAgICAgaWYgKGFycm93ICE9ICdub25lJyAmJiBhcnJvd0lkICE9IGNvbHVtbkRhdGEuY29uZmlnLm5hbWUpIHtcbiAgLy8gICAgICAgICB0aGVJbWFnZS5zZXRBdHRyaWJ1dGUoJ2Fycm93JywgJ25vbmUnKTtcbiAgLy8gICAgICAgICB0aGVJbWFnZS5zcmMgPSAnJztcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIHNvcnRDb21wYXJlKGEsIGIpOiBudW1iZXIge1xuICAgIGxldCBhVmFsdWUgPSBhW3RoaXMuY29tcGFyZVJlZl07XG4gICAgbGV0IGJWYWx1ZSA9IGJbdGhpcy5jb21wYXJlUmVmXTtcblxuICAgIGlmICh0aGlzLmNvbXBhcmVUeXBlID09ICdEYXRlJyB8fCB0aGlzLmNvbXBhcmVUeXBlID09ICdEYXRlVGltZScpIHtcbiAgICAgIGFWYWx1ZSA9IGdldFNlY29uZHMoYVZhbHVlKTtcbiAgICAgIGJWYWx1ZSA9IGdldFNlY29uZHMoYlZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb21wYXJlUmVmID09ICdweFJlZk9iamVjdEluc05hbWUnKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbXBhcmVCeUNvbHVtblB4UmVmT2JqZWN0SW5zTmFtZShhVmFsdWUsIGJWYWx1ZSk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMuYXJyb3dEaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgaWYgKCFhVmFsdWUgfHwgYVZhbHVlIDwgYlZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYlZhbHVlIHx8IGFWYWx1ZSA+IGJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgIGlmICghYlZhbHVlIHx8IGFWYWx1ZSA+IGJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFWYWx1ZSB8fCBhVmFsdWUgPCBiVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29tcGFyZUJ5Q29sdW1uUHhSZWZPYmplY3RJbnNOYW1lKGFWYWx1ZSwgYlZhbHVlKSB7XG4gICAgY29uc3QgcHJlZml4WCA9IGFWYWx1ZS5zcGxpdCgnLScpO1xuICAgIGNvbnN0IHByZWZpeFkgPSBiVmFsdWUuc3BsaXQoJy0nKTtcbiAgICBzd2l0Y2ggKHRoaXMuYXJyb3dEaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgaWYgKHByZWZpeFhbMF0gIT09IHByZWZpeFlbMF0pIHtcbiAgICAgICAgICBpZiAocHJlZml4WFswXSA8IHByZWZpeFlbMF0pIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAocHJlZml4WFswXSA+IHByZWZpeFlbMF0pIHJldHVybiAxO1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVmaXhYWzFdIC0gcHJlZml4WVsxXTtcbiAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICBpZiAocHJlZml4WFswXSAhPT0gcHJlZml4WVswXSkge1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdID4gcHJlZml4WVswXSkgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdIDwgcHJlZml4WVswXSkgcmV0dXJuIDE7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZWZpeFlbMV0gLSBwcmVmaXhYWzFdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlckRpc3BsYXkodHlwZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdub3RlcXVhbCc7XG4gICAgICAgIHRoaXMuYkNvbnRhaW5zJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJEYXRlVGltZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc0RhdGUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc1RpbWUkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVGltZSc6XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdub3RlcXVhbCc7XG4gICAgICAgIHRoaXMuYkNvbnRhaW5zJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJEYXRlVGltZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc0RhdGUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzRGF0ZVRpbWUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzVGltZSQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdjb250YWlucyc7XG4gICAgICAgIHRoaXMuYkNvbnRhaW5zJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc0RhdGUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzRGF0ZVRpbWUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzVGltZSQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgX2ZpbHRlcihldmVudCwgY29sdW1uRGF0YSkge1xuICAgIC8vIGFkZCBjbGlja0F3YXkgbGlzdGVuZXJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEgPSBjb2x1bW5EYXRhO1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNMYWJlbCQgPSBjb2x1bW5EYXRhLmNvbmZpZy5sYWJlbDtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJEaXNwbGF5KGNvbHVtbkRhdGEudHlwZSk7XG5cbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyVmFyc1dpdGhDdXJyZW50KGNvbHVtbkRhdGEpO1xuXG4gICAgICB0aGlzLmJTaG93RmlsdGVyUG9wb3ZlciQgPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgX2NsaWNrQXdheShldmVudDogYW55KSB7XG4gICAgbGV0IGJJblBvcFVwID0gZmFsc2U7XG5cbiAgICAvLyBydW4gdGhyb3VnaCBsaXN0IG9mIGVsZW1lbnRzIGluIHBhdGgsIGlmIG1lbnUgbm90IGluIHRoIHBhdGgsIHRoZW4gd2FudCB0b1xuICAgIC8vIGhpZGUgKHRvZ2dsZSkgdGhlIG1lbnVcbiAgICBjb25zdCBldmVudFBhdGggPSBldmVudC5wYXRoO1xuICAgIGZvciAobGV0IHBhdGhJbmRleCA9IDA7IHBhdGhJbmRleCA8IGV2ZW50UGF0aC5sZW5ndGg7IHBhdGhJbmRleCsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGV2ZW50UGF0aFtwYXRoSW5kZXhdLmNsYXNzTmFtZSA9PSAncHNkay1tb2RhbC1maWxlLXRvcCcgfHxcbiAgICAgICAgZXZlbnRQYXRoW3BhdGhJbmRleF0udGFnTmFtZSA9PSAnQlVUVE9OJyB8fFxuICAgICAgICBldmVudFBhdGhbcGF0aEluZGV4XS50YWdOYW1lID09ICdNQVQtT1BUSU9OJyB8fFxuICAgICAgICBldmVudFBhdGhbcGF0aEluZGV4XS50YWdOYW1lID09ICdNQVQtSU5QVVQnXG4gICAgICApIHtcbiAgICAgICAgYkluUG9wVXAgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFiSW5Qb3BVcCkge1xuICAgICAgLy8gdGhpcy5iU2hvd0ZpbHRlclBvcG92ZXIkID0gZmFsc2U7XG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIF9maWx0ZXJDb250YWluc1R5cGUoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSBldmVudC52YWx1ZTtcbiAgfVxuXG4gIF9maWx0ZXJDb250YWluc1ZhbHVlKGV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuXG4gIF9maWx0ZXJDb250YWluc0RhdGVWYWx1ZShldmVudCwgdmFsdWUpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gdmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNEYXRlVGltZVZhbHVlKGV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuXG4gIF9maWx0ZXJDb250YWluc1RpbWVWYWx1ZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH1cblxuICBfb25GaWx0ZXJBY3Rpb25CdXR0b25DbGljayhldmVudDogYW55KSB7XG4gICAgLy8gbW9kYWwgYnV0dG9uc1xuICAgIHN3aXRjaCAoZXZlbnQuYWN0aW9uKSB7XG4gICAgICBjYXNlICdjYW5jZWwnOlxuICAgICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhID0gW107XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3VibWl0JzpcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJXaXRoSW5mbygpO1xuICAgICAgICB0aGlzLmZpbHRlclNvcnRHcm91cEJ5KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5iU2hvd0ZpbHRlclBvcG92ZXIkID0gZmFsc2U7XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcldpdGhJbmZvKCkge1xuICAgIGxldCBiRm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGZpbHRlck9iaiBvZiB0aGlzLmZpbHRlckJ5Q29sdW1ucykge1xuICAgICAgaWYgKGZpbHRlck9iai5yZWYgPT09IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEuY29uZmlnLm5hbWUpIHtcbiAgICAgICAgZmlsdGVyT2JqLnR5cGUgPSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLnR5cGU7XG4gICAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlciA9IHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJDtcbiAgICAgICAgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUgPSB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkO1xuXG4gICAgICAgIGJGb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYkZvdW5kKSB7XG4gICAgICAvLyBhZGQgaW5cbiAgICAgIGNvbnN0IGZpbHRlck9iajogYW55ID0ge307XG4gICAgICBmaWx0ZXJPYmoucmVmID0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS5jb25maWcubmFtZTtcbiAgICAgIGZpbHRlck9iai50eXBlID0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS50eXBlO1xuICAgICAgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyID0gdGhpcy5maWx0ZXJDb250YWluc1R5cGUkO1xuICAgICAgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUgPSB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkO1xuXG4gICAgICB0aGlzLmZpbHRlckJ5Q29sdW1ucy5wdXNoKGZpbHRlck9iaik7XG4gICAgfVxuXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGZpbHRlcnMgYW5kIHVwZGF0ZSBmaWx0ZXJPbiBpY29uXG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5zRmlsdGVyVmFsdWUgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZTtcbiAgICAgIGNvbnN0IGNvbnRhaW5zRmlsdGVyID0gZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyO1xuICAgICAgY29uc3QgZmlsdGVyUmVmID0gZmlsdGVyT2JqLnJlZjtcbiAgICAgIGNvbnN0IGZpbHRlckluZGV4ID0gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zJC5pbmRleE9mKGZpbHRlclJlZik7XG4gICAgICBjb25zdCBhckZpbHRlckltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdmaWx0ZXJPbkljb24nKTtcbiAgICAgIGNvbnN0IGZpbHRlckltZzogYW55ID0gYXJGaWx0ZXJJbWdbZmlsdGVySW5kZXhdO1xuICAgICAgaWYgKGNvbnRhaW5zRmlsdGVyVmFsdWUgPT0gJycgJiYgY29udGFpbnNGaWx0ZXIgIT0gJ251bGwnICYmIGNvbnRhaW5zRmlsdGVyICE9ICdub3RudWxsJykge1xuICAgICAgICAvLyBjbGVhciBpY29uXG4gICAgICAgIGZpbHRlckltZy5zcmMgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNob3cgaWNvblxuICAgICAgICBmaWx0ZXJJbWcuc3JjID0gdGhpcy5maWx0ZXJPblN2Z0ljb24kO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUZpbHRlclZhcnNXaXRoQ3VycmVudChjb2x1bW5EYXRhKSB7XG4gICAgLy8gZmluZCBjdXJyZW50IHJlZiwgaWYgZXhpc3RzLCBtb3ZlIGRhdGEgdG8gdmFyaWFibGUgdG8gZGlzcGxheVxuXG4gICAgbGV0IGJGb3VuZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBpZiAoZmlsdGVyT2JqLnJlZiA9PT0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS5jb25maWcubmFtZSkge1xuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXI7XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZTtcblxuICAgICAgICBiRm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWJGb3VuZCkge1xuICAgICAgc3dpdGNoIChjb2x1bW5EYXRhLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgY2FzZSAnVGltZSc6XG4gICAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnY29udGFpbnMnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gJyc7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyRGF0YShpdGVtOiBhbnkpIHtcbiAgICBsZXQgYktlZXAgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBpZiAoZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUgIT0gJycgfHwgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyID09ICdudWxsJyB8fCBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPT0gJ25vdG51bGwnKSB7XG4gICAgICAgIGxldCBmaWx0ZXJWYWx1ZTogYW55O1xuXG4gICAgICAgIHN3aXRjaCAoZmlsdGVyT2JqLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgICAgICAgY2FzZSAnVGltZSc6XG4gICAgICAgICAgICBiS2VlcCA9IHRoaXMuZmlsdGVyRGF0YVdpdGhEYXRlKGl0ZW0sIGZpbHRlck9iaiwgZmlsdGVyVmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJLZWVwID0gdGhpcy5maWx0ZXJEYXRhV2l0aENvbW1vblR5cGVzKGl0ZW0sIGZpbHRlck9iaiwgZmlsdGVyVmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaWYgZG9uJ3Qga2VlcCBzdG9wIGZpbHRlcmluZ1xuICAgICAgaWYgKCFiS2VlcCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYktlZXA7XG4gIH1cblxuICBmaWx0ZXJEYXRhV2l0aERhdGUoaXRlbSwgZmlsdGVyT2JqLCBmaWx0ZXJWYWx1ZSkge1xuICAgIGxldCBiS2VlcDtcbiAgICBsZXQgdmFsdWUgPSBpdGVtW2ZpbHRlck9iai5yZWZdICE9IG51bGwgPz8gaXRlbVtmaWx0ZXJPYmoucmVmXSAhPSAnJyA/IGdldFNlY29uZHMoaXRlbVtmaWx0ZXJPYmoucmVmXSkgOiBudWxsO1xuICAgIGZpbHRlclZhbHVlID0gZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUgIT0gbnVsbCAmJiBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSAhPSAnJyA/IGdldFNlY29uZHMoZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUpIDogbnVsbDtcblxuICAgIHN3aXRjaCAoZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyKSB7XG4gICAgICBjYXNlICdub3RlcXVhbCc6XG4gICAgICAgIC8vIGJlY2FzdWUgZmlsdGVyVmFsdWUgaXMgaW4gbWludXRlcywgbmVlZCB0byBoYXZlIGEgcmFuZ2Ugb2YgbGVzcyB0aGFuIDYwIHNlY29uc1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBmaWx0ZXJWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gZ2V0IHJpZCBvZiBtaWxsaXNlY29uc1xuICAgICAgICAgIHZhbHVlIC89IDEwMDA7XG4gICAgICAgICAgZmlsdGVyVmFsdWUgLz0gMTAwMDtcblxuICAgICAgICAgIGNvbnN0IGRpZmYgPSB2YWx1ZSAtIGZpbHRlclZhbHVlO1xuICAgICAgICAgIGlmIChkaWZmID49IDAgJiYgZGlmZiA8IDYwKSB7XG4gICAgICAgICAgICBiS2VlcCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2FmdGVyJzpcbiAgICAgICAgaWYgKHZhbHVlIDwgZmlsdGVyVmFsdWUpIHtcbiAgICAgICAgICBiS2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYmVmb3JlJzpcbiAgICAgICAgaWYgKHZhbHVlID4gZmlsdGVyVmFsdWUpIHtcbiAgICAgICAgICBiS2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgYktlZXAgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vdG51bGwnOlxuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gYktlZXA7XG4gIH1cblxuICBmaWx0ZXJEYXRhV2l0aENvbW1vblR5cGVzKGl0ZW0sIGZpbHRlck9iaiwgZmlsdGVyVmFsdWUpIHtcbiAgICBsZXQgYktlZXA7XG4gICAgY29uc3QgdmFsdWUgPSBpdGVtW2ZpbHRlck9iai5yZWZdLnRvTG93ZXJDYXNlKCk7XG4gICAgZmlsdGVyVmFsdWUgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgc3dpdGNoIChmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIpIHtcbiAgICAgIGNhc2UgJ2NvbnRhaW5zJzpcbiAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoZmlsdGVyVmFsdWUpIDwgMCkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlcXVhbHMnOlxuICAgICAgICBpZiAodmFsdWUgIT0gZmlsdGVyVmFsdWUpIHtcbiAgICAgICAgICBiS2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RhcnRzd2l0aCc6XG4gICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKGZpbHRlclZhbHVlKSAhPSAwKSB7XG4gICAgICAgICAgYktlZXAgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBiS2VlcDtcbiAgfVxuXG4gIGZpbHRlclNvcnRHcm91cEJ5KCkge1xuICAgIC8vIGdldCBvcmlnaW5hbCBkYXRhIHNldFxuICAgIGxldCB0aGVEYXRhID0gdGhpcy5yZXBlYXRMaXN0RGF0YS5zbGljZSgpO1xuXG4gICAgLy8gbGFzdCBmaWx0ZXIgY29uZmlnIGRhdGEgaXMgZ2xvYmFsXG4gICAgdGhlRGF0YSA9IHRoZURhdGEuZmlsdGVyKHRoaXMuZmlsdGVyRGF0YS5iaW5kKHRoaXMpKTtcblxuICAgIC8vIGxhc3Qgc29ydCBjb25maWcgZGF0YSBpcyBnbG9iYWxcbiAgICB0aGVEYXRhLnNvcnQodGhpcy5zb3J0Q29tcGFyZS5iaW5kKHRoaXMpKTtcblxuICAgIGNvbnN0IHJlR3JvdXBEYXRhID0gdGhpcy5hZGRHcm91cHModGhlRGF0YSwgdGhpcy5ncm91cEJ5Q29sdW1ucyQpO1xuXG4gICAgdGhpcy5yZXBlYXRMaXN0JC5kYXRhID0gW107XG4gICAgdGhpcy5yZXBlYXRMaXN0JC5kYXRhLnB1c2goLi4ucmVHcm91cERhdGEpO1xuXG4gICAgaWYgKHRoaXMuc2VhcmNoRmlsdGVyICYmIHRoaXMuc2VhcmNoRmlsdGVyICE9ICcnKSB7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IHRoaXMuc2VhcmNoRmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBlcmZGaWx0ZXIgPSBwZXJmb3JtYW5jZS5ub3coKS50b1N0cmluZygpO1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSB0aGlzLnBlcmZGaWx0ZXI7XG4gICAgfVxuICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gJyc7XG5cbiAgICBpZiAodGhpcy5yZXBlYXRMaXN0JC5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQucGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIC8vIEdyb3VwaW5nIGNvZGUgaW5zcGlyZWQgYnkgdGhpcyBleGFtcGxlXG4gIC8vIGh0dHBzOi8vc3RhY2tibGl0ei5jb20vZWRpdC9hbmd1bGFyLW1hdGVyaWFsLXRhYmxlLXJvdy1ncm91cGluZ1xuICAvL1xuXG4gIF9zaG93VW5Hcm91cEJ5KGNvbHVtbkRhdGEpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLmdyb3VwQnlDb2x1bW5zJCkge1xuICAgICAgaWYgKHZhbCA9PSBjb2x1bW5EYXRhLmNvbmZpZy5uYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIF9ncm91cEJ5KGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gICAgdGhpcy5jaGVja0dyb3VwQnlDb2x1bW4oY29sdW1uRGF0YS5jb25maWcubmFtZSwgdHJ1ZSk7XG5cbiAgICB0aGlzLmZpbHRlclNvcnRHcm91cEJ5KCk7XG4gIH1cblxuICBfdW5Hcm91cEJ5KGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gICAgLy8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5jaGVja0dyb3VwQnlDb2x1bW4oY29sdW1uRGF0YS5jb25maWcubmFtZSwgZmFsc2UpO1xuXG4gICAgdGhpcy5maWx0ZXJTb3J0R3JvdXBCeSgpO1xuICB9XG5cbiAgY2hlY2tHcm91cEJ5Q29sdW1uKGZpZWxkLCBhZGQpIHtcbiAgICBsZXQgZm91bmQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuZ3JvdXBCeUNvbHVtbnMkKSB7XG4gICAgICBpZiAoY29sdW1uID09PSBmaWVsZCkge1xuICAgICAgICBmb3VuZCA9IHRoaXMuZ3JvdXBCeUNvbHVtbnMkLmluZGV4T2YoY29sdW1uLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZvdW5kICE9IG51bGwgJiYgZm91bmQgPj0gMCkge1xuICAgICAgaWYgKCFhZGQpIHtcbiAgICAgICAgdGhpcy5ncm91cEJ5Q29sdW1ucyQuc3BsaWNlKGZvdW5kLCAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFkZCkge1xuICAgICAgdGhpcy5ncm91cEJ5Q29sdW1ucyQucHVzaChmaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgYWRkR3JvdXBzKGRhdGE6IGFueVtdLCBncm91cEJ5Q29sdW1uczogc3RyaW5nW10pOiBhbnlbXSB7XG4gICAgY29uc3Qgcm9vdEdyb3VwID0gbmV3IEdyb3VwKCk7XG4gICAgcm9vdEdyb3VwLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJsZXZlbChkYXRhLCAwLCBncm91cEJ5Q29sdW1ucywgcm9vdEdyb3VwKTtcbiAgfVxuXG4gIGdldFN1YmxldmVsKGRhdGE6IGFueVtdLCBsZXZlbDogbnVtYmVyLCBncm91cEJ5Q29sdW1uczogc3RyaW5nW10sIHBhcmVudDogR3JvdXApOiBhbnlbXSB7XG4gICAgaWYgKGxldmVsID49IGdyb3VwQnlDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMudW5pcXVlQnkoXG4gICAgICBkYXRhLm1hcChyb3cgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgR3JvdXAoKTtcbiAgICAgICAgcmVzdWx0LmxldmVsID0gbGV2ZWwgKyAxO1xuICAgICAgICByZXN1bHQucGFyZW50ID0gcGFyZW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBsZXZlbDsgaSsrKSB7XG4gICAgICAgICAgcmVzdWx0W2dyb3VwQnlDb2x1bW5zW2ldXSA9IHJvd1tncm91cEJ5Q29sdW1uc1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pLFxuICAgICAgSlNPTi5zdHJpbmdpZnlcbiAgICApO1xuXG4gICAgY29uc3QgY3VycmVudENvbHVtbiA9IGdyb3VwQnlDb2x1bW5zW2xldmVsXTtcbiAgICBsZXQgc3ViR3JvdXBzOiBhbnlbXSA9IFtdO1xuICAgIGdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgIGNvbnN0IHJvd3NJbkdyb3VwID0gZGF0YS5maWx0ZXIocm93ID0+IGdyb3VwW2N1cnJlbnRDb2x1bW5dID09PSByb3dbY3VycmVudENvbHVtbl0pO1xuICAgICAgZ3JvdXAudG90YWxDb3VudHMgPSByb3dzSW5Hcm91cC5sZW5ndGg7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IHRoaXMuZ2V0U3VibGV2ZWwocm93c0luR3JvdXAsIGxldmVsICsgMSwgZ3JvdXBCeUNvbHVtbnMsIGdyb3VwKTtcbiAgICAgIHN1Ykdyb3VwLnVuc2hpZnQoZ3JvdXApO1xuICAgICAgc3ViR3JvdXBzID0gc3ViR3JvdXBzLmNvbmNhdChzdWJHcm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1Ykdyb3VwcztcbiAgfVxuXG4gIHVuaXF1ZUJ5KGEsIGtleSkge1xuICAgIGNvbnN0IHNlZW4gPSB7fTtcbiAgICByZXR1cm4gYS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCBrID0ga2V5KGl0ZW0pO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJldHVybi1hc3NpZ24sIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgcmV0dXJuIHNlZW4uaGFzT3duUHJvcGVydHkoaykgPyBmYWxzZSA6IChzZWVuW2tdID0gdHJ1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpc0dyb3VwKGluZGV4LCBpdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGl0ZW0ubGV2ZWw7XG4gIH1cblxuICBfZ3JvdXBIZWFkZXJDbGljayhyb3cpIHtcbiAgICByb3cuZXhwYW5kZWQgPSAhcm93LmV4cGFuZGVkO1xuICAgIC8vIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gXCJcIjtcbiAgICB0aGlzLnBlcmZGaWx0ZXIgPSBwZXJmb3JtYW5jZS5ub3coKS50b1N0cmluZygpO1xuICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gdGhpcy5wZXJmRmlsdGVyO1xuICB9XG5cbiAgLy8gYmVsb3cgaXMgZm9yIGdyaWQgcm93IGdyb3VwaW5nXG4gIGN1c3RvbUZpbHRlclByZWRpY2F0ZShkYXRhOiBhbnkgfCBHcm91cCwgZmlsdGVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGF0YSBpbnN0YW5jZW9mIEdyb3VwID8gZGF0YS52aXNpYmxlIDogdGhpcy5nZXREYXRhUm93VmlzaWJsZVdpdGhGaWx0ZXIoZGF0YSwgZmlsdGVyKTtcbiAgfVxuXG4gIGdldERhdGFSb3dWaXNpYmxlKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGdyb3VwUm93cyA9IHRoaXMucmVwZWF0TGlzdCQuZGF0YS5maWx0ZXIocm93ID0+IHtcbiAgICAgIGlmICghKHJvdyBpbnN0YW5jZW9mIEdyb3VwKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBsZXQgbWF0Y2ggPSB0cnVlO1xuICAgICAgdGhpcy5ncm91cEJ5Q29sdW1ucyQuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICBpZiAoIXJvd1tjb2x1bW5dIHx8ICFkYXRhW2NvbHVtbl0gfHwgcm93W2NvbHVtbl0gIT09IGRhdGFbY29sdW1uXSkge1xuICAgICAgICAgIG1hdGNoID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuXG4gICAgaWYgKGdyb3VwUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBncm91cFJvd3NbMF0gYXMgR3JvdXA7XG4gICAgcmV0dXJuIHBhcmVudC52aXNpYmxlICYmIHBhcmVudC5leHBhbmRlZDtcbiAgfVxuXG4gIGdldERhdGFSb3dWaXNpYmxlV2l0aEZpbHRlcihkYXRhLCBmaWx0ZXIpIHtcbiAgICAvLyBmaXN0IGNoZWNrIGlmIHJvdyBpcyB2aXNpYmxlIHdpdGggZ3JvdXBpbmdcbiAgICBsZXQgYlZpc2libGUgPSB0aGlzLmdldERhdGFSb3dWaXNpYmxlKGRhdGEpO1xuXG4gICAgaWYgKGJWaXNpYmxlICYmIGZpbHRlciAmJiBmaWx0ZXIgIT0gJycgJiYgZmlsdGVyICE9IHRoaXMucGVyZkZpbHRlcikge1xuICAgICAgLy8gbm93IGNoZWNrIGlmIHJvdyBpcyBmaWx0ZXJlZC5cblxuICAgICAgLy8gYXNzdW1lIG5vdCB0aGVyZSB1bmxlc3Mgd2UgZmluZCBpdFxuICAgICAgYlZpc2libGUgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuZGlzcGxheWVkQ29sdW1ucyQpIHtcbiAgICAgICAgLy8gZmlsdGVyIGlzIGxvd2VyIGNhc2VcbiAgICAgICAgaWYgKGRhdGFbY29sXSAmJiBkYXRhW2NvbF0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZmlsdGVyKSA+PSAwKSB7XG4gICAgICAgICAgYlZpc2libGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJWaXNpYmxlO1xuICB9XG5cbiAgdXBkYXRlRGF0YShsaXN0RGF0YTogYW55W10sIGZpZWxkRGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgY29uc3QgcmV0dXJuTGlzdDogYW55W10gPSBuZXcgQXJyYXk8YW55PigpO1xuICAgIGxpc3REYXRhLmZvckVhY2gocm93ID0+IHtcbiAgICAgIC8vIGNvcHlcbiAgICAgIGNvbnN0IHJvd0RhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJvdykpO1xuXG4gICAgICBmb3IgKGxldCBmaWVsZEluZGV4ID0gMDsgZmllbGRJbmRleCA8IGZpZWxkRGF0YS5sZW5ndGg7IGZpZWxkSW5kZXgrKykge1xuICAgICAgICBjb25zdCBjb25maWcgPSBmaWVsZERhdGFbZmllbGRJbmRleF0uY29uZmlnO1xuICAgICAgICBsZXQgZmllbGROYW1lO1xuICAgICAgICBsZXQgZm9ybWF0dGVkRGF0ZTtcbiAgICAgICAgbGV0IG15Rm9ybWF0O1xuICAgICAgICBsZXQgdGhlQ3VycmVuY3lPcHRpb25zO1xuXG4gICAgICAgIHN3aXRjaCAoZmllbGREYXRhW2ZpZWxkSW5kZXhdLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgIGZpZWxkTmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICAgICAgbXlGb3JtYXQgPSBjb25maWcuZm9ybWF0dGVyO1xuICAgICAgICAgICAgaWYgKCFteUZvcm1hdCkge1xuICAgICAgICAgICAgICBteUZvcm1hdCA9ICdEYXRlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvcm1hdHRlZERhdGUgPSB0aGlzLnV0aWxzLmdlbmVyYXRlRGF0ZShyb3dEYXRhW2ZpZWxkTmFtZV0sIG15Rm9ybWF0KTtcblxuICAgICAgICAgICAgcm93RGF0YVtmaWVsZE5hbWVdID0gZm9ybWF0dGVkRGF0ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgICAgIGZpZWxkTmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICAgICAgbXlGb3JtYXQgPSBjb25maWcuZm9ybWF0dGVyO1xuICAgICAgICAgICAgaWYgKCFteUZvcm1hdCkge1xuICAgICAgICAgICAgICBteUZvcm1hdCA9ICdEYXRlVGltZS1Mb25nJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvcm1hdHRlZERhdGUgPSB0aGlzLnV0aWxzLmdlbmVyYXRlRGF0ZVRpbWUocm93RGF0YVtmaWVsZE5hbWVdLCBteUZvcm1hdCk7XG5cbiAgICAgICAgICAgIHJvd0RhdGFbZmllbGROYW1lXSA9IGZvcm1hdHRlZERhdGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdDdXJyZW5jeSc6XG4gICAgICAgICAgICBmaWVsZE5hbWUgPSBjb25maWcubmFtZTtcbiAgICAgICAgICAgIHRoZUN1cnJlbmN5T3B0aW9ucyA9IGdldEN1cnJlbmN5T3B0aW9ucyhQQ29yZS5nZXRFbnZpcm9ubWVudEluZm8oKS5nZXRMb2NhbGUoKSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNhc2UtZGVjbGFyYXRpb25zXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgbG9jYWxlOiBnZXRMb2NhbGUoKSxcbiAgICAgICAgICAgICAgcG9zaXRpb246ICdiZWZvcmUnLFxuICAgICAgICAgICAgICBkZWNQbGFjZXM6IDJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHsgLi4uZGVmYXVsdE9wdGlvbnMsIC4uLnRoZUN1cnJlbmN5T3B0aW9ucyB9O1xuICAgICAgICAgICAgcm93RGF0YVtmaWVsZE5hbWVdID0gZm9ybWF0dGVycy5DdXJyZW5jeShyb3dEYXRhW2ZpZWxkTmFtZV0sIHBhcmFtcyk7XG4gICAgICAgICAgICAvLyB2YWwgPSBmb3JtYXQodmFsdWUsIGNvbHVtbi50eXBlLCB0aGVDdXJyZW5jeU9wdGlvbnMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm5MaXN0LnB1c2gocm93RGF0YSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmV0dXJuTGlzdDtcbiAgfVxuXG4gIG9wZW5Bc3NpZ25tZW50KHJvdykge1xuICAgIGNvbnN0IHsgcHhSZWZPYmplY3RDbGFzcywgcHpJbnNLZXkgfSA9IHJvdztcbiAgICBjb25zdCBzVGFyZ2V0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGFpbmVyTmFtZSgpO1xuICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHsgY29udGFpbmVyTmFtZTogc1RhcmdldCB9O1xuICAgIHRoaXMucENvbm4kLmdldEFjdGlvbnNBcGkoKS5vcGVuQXNzaWdubWVudChwekluc0tleSwgcHhSZWZPYmplY3RDbGFzcywgb3B0aW9ucyk7XG4gIH1cblxuICBvcGVuV29yayhyb3cpIHtcbiAgICBjb25zdCBweFJlZk9iamVjdENsYXNzID0gcm93LnB4UmVmT2JqZWN0Q2xhc3MgfHwgcm93LnB4T2JqQ2xhc3M7XG4gICAgY29uc3QgeyBweFJlZk9iamVjdEtleSB9ID0gcm93O1xuICAgIGlmIChweFJlZk9iamVjdENsYXNzICE9PSAnJyAmJiBweFJlZk9iamVjdEtleSAhPT0gJycpIHtcbiAgICAgIHRoaXMucENvbm4kLmdldEFjdGlvbnNBcGkoKS5vcGVuV29ya0J5SGFuZGxlKHB4UmVmT2JqZWN0S2V5LCBweFJlZk9iamVjdENsYXNzKTtcbiAgICB9XG4gIH1cblxuICBpbml0aWFsaXplRGF0YShkYXRhKSB7XG4gICAgZGF0YS5mb3JFYWNoKChpdGVtLCBpZHgpID0+IHtcbiAgICAgIGl0ZW0uX19vcmlnaW5hbF9pbmRleCA9IGlkeDtcbiAgICAgIGl0ZW0uX19sZXZlbCA9IDE7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGdldFR5cGUoZmllbGQpIHtcbiAgICBjb25zdCB7IGNvbmZpZyA9IHt9LCB0eXBlIH0gPSBmaWVsZDtcbiAgICBjb25zdCB7IGZvcm1hdFR5cGUgfSA9IGNvbmZpZztcbiAgICBpZiAoZm9ybWF0VHlwZSA9PT0gJ2RhdGV0aW1lJyB8fCBmb3JtYXRUeXBlID09PSAnZGF0ZScpIHtcbiAgICAgIC8vIGN1cnJlbnRseSBjb3Ntb3MgaGFzIG9ubHkgc3VwcG9ydCBmb3IgZGF0ZSAuLi4gaXQgYWxzbyBuZWVkIHRvIHN1cHBvcnQgZGF0ZVRpbWVcbiAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIGluaXRpYWxpemVDb2x1bW5zKGZpZWxkcyA9IFtdKSB7XG4gICAgcmV0dXJuIGZpZWxkcy5tYXAoKGZpZWxkOiBhbnksIG9yaWdpbmFsQ29sSW5kZXgpID0+ICh7XG4gICAgICAuLi5maWVsZCxcbiAgICAgIHR5cGU6IHRoaXMuZ2V0VHlwZShmaWVsZCksXG4gICAgICBuYW1lOiBmaWVsZC5jb25maWcudmFsdWUuc3Vic3RyaW5nKDQpLFxuICAgICAgbGFiZWw6IGZpZWxkLmNvbmZpZy5sYWJlbC5zdWJzdHJpbmcoMyksXG4gICAgICBpZDogb3JpZ2luYWxDb2xJbmRleCxcbiAgICAgIGdyb3VwaW5nRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGdyb3VwZWQ6IGZhbHNlLFxuICAgICAgbWluV2lkdGg6IDUwLFxuICAgICAgY2VsbFJlbmRlcmVyOiB0aGlzLmdldFR5cGUoZmllbGQpID09PSAndGV4dCcgPyBudWxsIDogZmllbGQudHlwZSxcbiAgICAgIGZpbHRlcjogdHJ1ZVxuICAgIH0pKTtcbiAgfVxuXG4gIGdldEhlYWRlckNlbGxzKGNvbEZpZWxkcywgZmllbGRzKSB7XG4gICAgY29uc3QgQXNzaWduRGFzaE9iamVjdHMgPSBbJ0Fzc2lnbi1Xb3JrbGlzdCcsICdBc3NpZ24tV29ya0Jhc2tldCddO1xuICAgIHJldHVybiBjb2xGaWVsZHMubWFwKChmaWVsZDogYW55LCBpbmRleCkgPT4ge1xuICAgICAgbGV0IHRoZUZpZWxkID0gZmllbGQuY29uZmlnLnZhbHVlLnN1YnN0cmluZyhmaWVsZC5jb25maWcudmFsdWUuaW5kZXhPZignICcpICsgMSk7XG4gICAgICBpZiAodGhlRmllbGQuaW5kZXhPZignLicpID09PSAwKSB7XG4gICAgICAgIHRoZUZpZWxkID0gdGhlRmllbGQuc3Vic3RyaW5nKDEpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sSW5kZXggPSBmaWVsZHMuZmluZEluZGV4KGVsZSA9PiBlbGUubmFtZSA9PT0gdGhlRmllbGQpO1xuICAgICAgY29uc3QgZGlzcGxheUFzTGluayA9IGZpZWxkLmNvbmZpZy5kaXNwbGF5QXNMaW5rO1xuICAgICAgY29uc3QgaGVhZGVyUm93OiBhbnkgPSB7fTtcbiAgICAgIGhlYWRlclJvdy5pZCA9IGZpZWxkc1tpbmRleF0uaWQ7XG4gICAgICBoZWFkZXJSb3cudHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgICBoZWFkZXJSb3cuZGlzcGxheUFzTGluayA9IGRpc3BsYXlBc0xpbms7XG4gICAgICBoZWFkZXJSb3cubnVtZXJpYyA9IGZpZWxkLnR5cGUgPT09ICdEZWNpbWFsJyB8fCBmaWVsZC50eXBlID09PSAnSW50ZWdlcicgfHwgZmllbGQudHlwZSA9PT0gJ1BlcmNlbnRhZ2UnIHx8IGZpZWxkLnR5cGUgPT09ICdDdXJyZW5jeScgfHwgZmFsc2U7XG4gICAgICBoZWFkZXJSb3cuZGlzYWJsZVBhZGRpbmcgPSBmYWxzZTtcbiAgICAgIGhlYWRlclJvdy5sYWJlbCA9IGZpZWxkc1tpbmRleF0ubGFiZWw7XG4gICAgICBpZiAoY29sSW5kZXggPiAtMSkge1xuICAgICAgICBoZWFkZXJSb3cuY2xhc3NJRCA9IGZpZWxkc1tjb2xJbmRleF0uY2xhc3NJRDtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNwbGF5QXNMaW5rKSB7XG4gICAgICAgIGhlYWRlclJvdy5pc0Fzc2lnbm1lbnRMaW5rID0gQXNzaWduRGFzaE9iamVjdHMuaW5jbHVkZXMoaGVhZGVyUm93LmNsYXNzSUQpO1xuICAgICAgICBpZiAoZmllbGQuY29uZmlnLnZhbHVlPy5zdGFydHNXaXRoKCdAQ0EnKSkge1xuICAgICAgICAgIGhlYWRlclJvdy5pc0Fzc29jaWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGhlYWRlclJvdztcbiAgICB9KTtcbiAgfVxuXG4gIGJ1aWxkU2VsZWN0KGZpZWxkRGVmcywgY29sSWQsIHBhdGNoUXVlcnlGaWVsZHMgPSBbXSwgY29tcG9zaXRlS2V5cyA9IFtdKSB7XG4gICAgY29uc3QgbGlzdEZpZWxkczogYW55ID0gW107XG4gICAgaWYgKGNvbElkKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2V0RmllbGQoZmllbGREZWZzLCBjb2xJZCk7XG4gICAgICBsaXN0RmllbGRzLnB1c2goe1xuICAgICAgICBmaWVsZDogZmllbGQubmFtZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5PVEU6IElmIHdlIGV2ZXIgZGVjaWRlIHRvIG5vdCBzZXQgdXAgYWxsIHRoZSBgZmllbGREZWZzYCBvbiBzZWxlY3QsIGVuc3VyZSB0aGF0IHRoZSBmaWVsZHNcbiAgICAgIC8vICBjb3JyZXNwb25kaW5nIHRvIGBzdGF0ZS5ncm91cHNgIGFyZSBzZXQgdXAuIE5lZWRlZCBpbiBDbGllbnQtbW9kZSBncm91cGluZy9wYWdpbmF0aW9uLlxuICAgICAgZmllbGREZWZzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICBpZiAoIWxpc3RGaWVsZHMuZmluZChmID0+IGYuZmllbGQgPT09IGZpZWxkLm5hbWUpKSB7XG4gICAgICAgICAgbGlzdEZpZWxkcy5wdXNoKHtcbiAgICAgICAgICAgIGZpZWxkOiBmaWVsZC5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcGF0Y2hRdWVyeUZpZWxkcy5mb3JFYWNoKGsgPT4ge1xuICAgICAgICBpZiAoIWxpc3RGaWVsZHMuZmluZChmID0+IGYuZmllbGQgPT09IGspKSB7XG4gICAgICAgICAgbGlzdEZpZWxkcy5wdXNoKHtcbiAgICAgICAgICAgIGZpZWxkOiBrXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbXBvc2l0ZUtleXMuZm9yRWFjaChrID0+IHtcbiAgICAgIGlmICghbGlzdEZpZWxkcy5maW5kKGYgPT4gZi5maWVsZCA9PT0gaykpIHtcbiAgICAgICAgbGlzdEZpZWxkcy5wdXNoKHtcbiAgICAgICAgICBmaWVsZDoga1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbGlzdEZpZWxkcztcbiAgfVxuXG4gIGdldEZpZWxkKGZpZWxkRGVmcywgY29sdW1uSWQpIHtcbiAgICBjb25zdCBmaWVsZHNNYXAgPSB0aGlzLmdldEZpZWxkc01hcChmaWVsZERlZnMpO1xuICAgIHJldHVybiBmaWVsZHNNYXAuZ2V0KGNvbHVtbklkKTtcbiAgfVxuXG4gIGdldEZpZWxkc01hcChmaWVsZERlZnMpIHtcbiAgICBjb25zdCBmaWVsZHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgZmllbGREZWZzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBmaWVsZHNNYXAuc2V0KGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWVsZHNNYXA7XG4gIH1cblxuICBhZGRJdGVtS2V5SW5TZWxlY3QoZmllbGREZWZzLCBpdGVtS2V5LCBzZWxlY3QsIGNvbXBvc2l0ZUtleXMpIHtcbiAgICBjb25zdCBlbGVtZW50Rm91bmQgPSB0aGlzLmdldEZpZWxkKGZpZWxkRGVmcywgaXRlbUtleSk7XG5cbiAgICBpZiAoXG4gICAgICBpdGVtS2V5ICYmXG4gICAgICAhZWxlbWVudEZvdW5kICYmXG4gICAgICBBcnJheS5pc0FycmF5KHNlbGVjdCkgJiZcbiAgICAgICEoY29tcG9zaXRlS2V5cyAhPT0gbnVsbCAmJiBjb21wb3NpdGVLZXlzPy5sZW5ndGgpICYmXG4gICAgICAhc2VsZWN0LmZpbmQoc2VsID0+IHNlbC5maWVsZCA9PT0gaXRlbUtleSlcbiAgICApIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAge1xuICAgICAgICAgIGZpZWxkOiBpdGVtS2V5XG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInBzZGstbGlzdC1oZWFkZXJcIj5cbiAgPGRpdj5cbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLXNlYXJjaFwiICpuZ0lmPVwiYlNob3dTZWFyY2gkXCI+XG4gICAgICA8bWF0LWxhYmVsPjxpbWcgY2xhc3M9XCJwc2RrLWljb24tc2VhcmNoXCIgc3JjPVwie3sgc2VhcmNoSWNvbiQgfX1cIiAvPiA8c3BhbiBjbGFzcz1cInBzZGstc2VhcmNoLWxhYmVsXCI+U2VhcmNoPC9zcGFuPiA8L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBpZD1cInNlYXJjaFwiIChrZXl1cCk9XCJhcHBseVNlYXJjaCgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJcIiAvPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWJJbkZvcm0kXCIgY2xhc3M9XCJwc2RrLW91dGVyLWRpdi1pbi1mb3JtXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicHNkay1pbm5lci1kaXYtaW4tZm9ybVwiICpuZ0lmPVwiYkNvbHVtblJlb3JkZXIkXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHRhYmxlXG4gICAgICAgICAgICBtYXQtdGFibGVcbiAgICAgICAgICAgIGlkPVwibGlzdC12aWV3XCJcbiAgICAgICAgICAgIFtkYXRhU291cmNlXT1cInJlcGVhdExpc3QkXCJcbiAgICAgICAgICAgIG1hdFNvcnRcbiAgICAgICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgICAgICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZENvbCBvZiBmaWVsZHMkXCIgW21hdENvbHVtbkRlZl09XCJkQ29sLmNvbmZpZy5uYW1lXCIgc3RpY2t5PVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicHNkay1tYXQtaGVhZGVyXCIgKGNsaWNrKT1cIl9oZWFkZXJTb3J0Q2xpY2soJGV2ZW50LCBkQ29sKVwiIGFycm93UG9zaXRpb249XCJiZWZvcmVcIiBjZGtEcmFnPlxuICAgICAgICAgICAgICAgIHt7IGRDb2wuY29uZmlnLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbWF0LWhlYWRlci1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWZpbHRlci1zdmctaWNvblwiIG5hbWU9XCJmaWx0ZXJPbkljb25cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXItYXJyb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWFycm93LXN2Zy1pY29uXCIgYXJyb3c9XCJub25lXCIgW2F0dHIuYXJyb3dpZF09XCJkQ29sLmNvbmZpZy5uYW1lXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tYXQtaGVhZGVyLWJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJncm91cE1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgbWVudVN2Z0ljb24kIH19XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNncm91cE1lbnU+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhX3Nob3dVbkdyb3VwQnkoZENvbCkgJiYgYkdyb3VwaW5nJFwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl9ncm91cEJ5KCRldmVudCwgZENvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBncm91cEJ5U3ZnSWNvbiQgfX1cIiAvPjxzcGFuPkdyb3VwIEJ5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIl9zaG93VW5Hcm91cEJ5KGRDb2wpICYmIGJHcm91cGluZyRcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJfdW5Hcm91cEJ5KCRldmVudCwgZENvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBncm91cEJ5U3ZnSWNvbiQgfX1cIiAvPjxzcGFuPlVuZ3JvdXA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl9maWx0ZXIoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGZpbHRlclN2Z0ljb24kIH19XCIgLz48c3Bhbj5GaWx0ZXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGluZGV4IGFzIGlcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIl9zaG93QnV0dG9uKGRDb2wuY29uZmlnLm5hbWUsIGRDb2wpOyBlbHNlIHJlZ3VsYXJcIlxuICAgICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfbGlzdFZpZXdDbGljayhkQ29sLmNvbmZpZywgZWxlbWVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbZENvbC5jb25maWcubmFtZV0gfHwgJy0tLScgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JlZ3VsYXI+XG4gICAgICAgICAgICAgICAgICB7eyBlbGVtZW50W2RDb2wuY29uZmlnLm5hbWVdIHx8ICctLS0nIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnMkOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnMkXCI+PC90cj5cblxuICAgICAgICAgICAgPCEtLSBHcm91cCBoZWFkZXIgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImdyb3VwSGVhZGVyXCI+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjb2xzcGFuPVwiOTk5XCIgKm1hdENlbGxEZWY9XCJsZXQgZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJncm91cC5leHBhbmRlZFwiIFthdHRyLnN0eWxlXT1cIl9nZXRJY29uU3R5bGUoZ3JvdXAubGV2ZWwpXCI+ZXhwYW5kX2xlc3M8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFncm91cC5leHBhbmRlZFwiIFthdHRyLnN0eWxlXT1cIl9nZXRJY29uU3R5bGUoZ3JvdXAubGV2ZWwpXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxzdHJvbmdcbiAgICAgICAgICAgICAgICAgID57eyBfZ2V0R3JvdXBOYW1lKGdyb3VwQnlDb2x1bW5zJFtncm91cC5sZXZlbCAtIDFdKSB9fToge3sgZ3JvdXBbZ3JvdXBCeUNvbHVtbnMkW2dyb3VwLmxldmVsIC0gMV1dIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICBncm91cC50b3RhbENvdW50c1xuICAgICAgICAgICAgICAgICAgfX0pPC9zdHJvbmdcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZ3JvdXBIZWFkZXInXTsgd2hlbjogaXNHcm91cFwiIChjbGljayk9XCJfZ3JvdXBIZWFkZXJDbGljayhyb3cpXCI+PC90cj5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInBzZGstaW5uZXItZGl2LWluLWZvcm1cIiAqbmdJZj1cIiFiQ29sdW1uUmVvcmRlciRcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8dGFibGUgbWF0LXRhYmxlIGlkPVwibGlzdC12aWV3XCIgW2RhdGFTb3VyY2VdPVwicmVwZWF0TGlzdCRcIiBtYXRTb3J0PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZENvbCBvZiBmaWVsZHMkXCIgW21hdENvbHVtbkRlZl09XCJkQ29sLmNvbmZpZy5uYW1lXCIgc3RpY2t5PVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicHNkay1tYXQtaGVhZGVyXCIgKGNsaWNrKT1cIl9oZWFkZXJTb3J0Q2xpY2soJGV2ZW50LCBkQ29sKVwiIGFycm93UG9zaXRpb249XCJiZWZvcmVcIj5cbiAgICAgICAgICAgICAgICB7eyBkQ29sLmNvbmZpZy5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXItZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1maWx0ZXItc3ZnLWljb25cIiBuYW1lPVwiZmlsdGVyT25JY29uXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tYXQtaGVhZGVyLWFycm93XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1hcnJvdy1zdmctaWNvblwiIGFycm93PVwibm9uZVwiIFthdHRyLmFycm93aWRdPVwiZENvbC5jb25maWcubmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbWF0LWhlYWRlci1idXR0b25cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZ3JvdXBNZW51XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IG1lbnVTdmdJY29uJCB9fVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjZ3JvdXBNZW51PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIV9zaG93VW5Hcm91cEJ5KGRDb2wpICYmIGJHcm91cGluZyRcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJfZ3JvdXBCeSgkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZ3JvdXBCeVN2Z0ljb24kIH19XCIgLz48c3Bhbj5Hcm91cCBCeTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJfc2hvd1VuR3JvdXBCeShkQ29sKSAmJiBiR3JvdXBpbmckXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX3VuR3JvdXBCeSgkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZ3JvdXBCeVN2Z0ljb24kIH19XCIgLz48c3Bhbj5Vbmdyb3VwPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJfZmlsdGVyKCRldmVudCwgZENvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBmaWx0ZXJTdmdJY29uJCB9fVwiIC8+PHNwYW4+RmlsdGVyPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBpbmRleCBhcyBpXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJfc2hvd0J1dHRvbihkQ29sLmNvbmZpZy5uYW1lLCBkQ29sKTsgZWxzZSByZWd1bGFyXCJcbiAgICAgICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiX2xpc3RWaWV3Q2xpY2soZENvbC5jb25maWcsIGVsZW1lbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBlbGVtZW50W2RDb2wuY29uZmlnLm5hbWVdIHx8ICctLS0nIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyZWd1bGFyPlxuICAgICAgICAgICAgICAgICAge3sgZWxlbWVudFtkQ29sLmNvbmZpZy5uYW1lXSB8fCAnLS0tJyB9fVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zJDsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zJFwiPjwvdHI+XG5cbiAgICAgICAgICAgIDwhLS0gR3JvdXAgaGVhZGVyIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJncm91cEhlYWRlclwiPlxuICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY29sc3Bhbj1cIjk5OVwiICptYXRDZWxsRGVmPVwibGV0IGdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZ3JvdXAuZXhwYW5kZWRcIiBbYXR0ci5zdHlsZV09XCJfZ2V0SWNvblN0eWxlKGdyb3VwLmxldmVsKVwiPmV4cGFuZF9sZXNzPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhZ3JvdXAuZXhwYW5kZWRcIiBbYXR0ci5zdHlsZV09XCJfZ2V0SWNvblN0eWxlKGdyb3VwLmxldmVsKVwiPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nXG4gICAgICAgICAgICAgICAgICA+e3sgX2dldEdyb3VwTmFtZShncm91cEJ5Q29sdW1ucyRbZ3JvdXAubGV2ZWwgLSAxXSkgfX06IHt7IGdyb3VwW2dyb3VwQnlDb2x1bW5zJFtncm91cC5sZXZlbCAtIDFdXSB9fSAoe3tcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAudG90YWxDb3VudHNcbiAgICAgICAgICAgICAgICAgIH19KTwvc3Ryb25nXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2dyb3VwSGVhZGVyJ107IHdoZW46IGlzR3JvdXBcIiAoY2xpY2spPVwiX2dyb3VwSGVhZGVyQ2xpY2socm93KVwiPjwvdHI+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiYkluRm9ybSRcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLWlubmVyLWRpdi1pbi1mb3JtXCI+XG4gICAgICAgICAgPHRhYmxlIGlkPVwibGlzdC12aWV3XCIgKm5nSWY9XCJyZXBlYXRMaXN0RGF0YS5sZW5ndGggPiAwXCIgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInJlcGVhdExpc3QkXCIgbWF0U29ydD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaW5nbGVTZWxlY3Rpb25Nb2RlXCIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG4gICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+PC90aD5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFt2YWx1ZV09XCJyb3dbcm93SURdXCIgW2NoZWNrZWRdPVwicm93W3Jvd0lEXSA9PT0gY2hlY2tCb3hWYWx1ZVwiIChjaGFuZ2UpPVwiZmllbGRPbkNoYW5nZShyb3cpXCI+PC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibXVsdGlTZWxlY3Rpb25Nb2RlXCIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG4gICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+PC90aD5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW3ZhbHVlXT1cInJvd1tyb3dJRF1cIiBbY2hlY2tlZF09XCJpc0NoZWNrZWQocm93KVwiIChjaGFuZ2UpPVwib25DaGVja2JveENsaWNrKHJvdywgJGV2ZW50KVwiPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkcyRcIiBbbWF0Q29sdW1uRGVmXT1cImRDb2wuY29uZmlnLm5hbWVcIj5cbiAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXIgKGNsaWNrKT1cIl9oZWFkZXJTb3J0Q2xpY2soJGV2ZW50LCBkQ29sKVwiIGFycm93UG9zaXRpb249XCJiZWZvcmVcIj5cbiAgICAgICAgICAgICAgICB7eyBkQ29sLmNvbmZpZy5sYWJlbCB9fVxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnRbZENvbC5jb25maWcubmFtZV0gfHwgJy0tLScgfX08L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1ucyRcIj48L3RyPlxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnMkXCI+PC90cj5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJyZXBlYXRMaXN0RGF0YT8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICA8dGFibGUgaWQ9XCJsaXN0LXZpZXdcIiAqbmdJZj1cInJlcGVhdExpc3REYXRhPy5sZW5ndGggPT09IDBcIiBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwicmVwZWF0TGlzdCRcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZENvbCBvZiBmaWVsZHMkXCIgW21hdENvbHVtbkRlZl09XCJkQ29sLmNvbmZpZy5uYW1lXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj57eyBkQ29sLmNvbmZpZy5sYWJlbCB9fTwvdGg+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnMkXCI+PC90cj5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbm8tcmVjb3Jkc1wiICpuZ0lmPVwicmVwZWF0TGlzdERhdGE/Lmxlbmd0aCA9PT0gMFwiPk5vIFJlY29yZHMgRm91bmQuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bWF0LXBhZ2luYXRvciBpZD1cInBhZ2luYXRpb25cIiAqbmdJZj1cImJJbkZvcm0kXCIgW3BhZ2VTaXplT3B0aW9uc109XCJbMTAsIDIwLCA1MCwgMTAwLCA1MDAsIDEwMDBdXCIgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM+PC9tYXQtcGFnaW5hdG9yPlxuICAgIDxtYXQtcGFnaW5hdG9yIGlkPVwicGFnaW5hdGlvblwiICpuZ0lmPVwiIWJJbkZvcm0kXCIgW3BhZ2VTaXplT3B0aW9uc109XCJbMTAsIDIwLCA1MCwgMTAwLCA1MDBdXCIgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM+PC9tYXQtcGFnaW5hdG9yPlxuICA8L2Rpdj5cblxuICA8IS0tIHBvcCBvdmVycyBmb3IgZmlsdGVycy0tPlxuICA8ZGl2ICpuZ0lmPVwiYlNob3dGaWx0ZXJQb3BvdmVyJFwiIGNsYXNzPVwicHNkay1kaWFsb2ctYmFja2dyb3VuZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWZpbGUtdG9wXCI+XG4gICAgICA8aDQ+XG4gICAgICAgIEZpbHRlcjo8Yj4ge3sgZmlsdGVyQ29udGFpbnNMYWJlbCQgfX08L2I+XG4gICAgICA8L2g0PlxuICAgICAgPGRpdiAqbmdJZj1cImJDb250YWlucyRcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1zZWxlY3QgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVHlwZSRcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIl9maWx0ZXJDb250YWluc1R5cGUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjb250YWluc1wiPkNvbnRhaW5zPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJlcXVhbHNcIj5FcXVhbHM8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cInN0YXJ0c3dpdGhcIj5TdGFydHMgd2l0aDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCIgKGNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNWYWx1ZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiYkRhdGVUaW1lJFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8bWF0LXNlbGVjdCBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNUeXBlJFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVHlwZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm5vdGVxdWFsXCI+aXMgbm90IGVxdWFsIHRvPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJhZnRlclwiPmFmdGVyPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJiZWZvcmVcIj5iZWZvcmU8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm51bGxcIj5pcyBudWxsPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJub3RudWxsXCI+aXMgbm90IG51bGw8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImJJc0RhdGUkICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT09ICdudWxsJyAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9ICdub3RudWxsJ1wiIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD5EYXRlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgI2RhdGVJbnB1dFxuICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGVnYWRhdGVcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCJcbiAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIl9maWx0ZXJDb250YWluc0RhdGVWYWx1ZSgkZXZlbnQsIGRhdGVJbnB1dC52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwZWdhZGF0ZVwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGVnYWRhdGUgW3N0YXJ0QXRdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIj48L21hdC1kYXRlcGlja2VyPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImJJc0RhdGVUaW1lJCAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9PSAnbnVsbCcgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPSAnbm90bnVsbCdcIiBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+RGF0ZSB0aW1lPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiIChjaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zRGF0ZVRpbWVWYWx1ZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJiSXNUaW1lJCAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9PSAnbnVsbCcgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPSAnbm90bnVsbCdcIiBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+VGltZTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGltZVwiIFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiIChjaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVGltZVZhbHVlKCRldmVudClcIiAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxjb21wb25lbnQtbWFwcGVyXG4gICAgICAgIG5hbWU9XCJBY3Rpb25CdXR0b25zXCJcbiAgICAgICAgW3Byb3BzXT1cInsgYXJNYWluQnV0dG9ucyQ6IGFyRmlsdGVyTWFpbkJ1dHRvbnMkLCBhclNlY29uZGFyeUJ1dHRvbnMkOiBhckZpbHRlclNlY29uZGFyeUJ1dHRvbnMkIH1cIlxuICAgICAgICBbcGFyZW50XT1cInRoaXNcIlxuICAgICAgICBbb3V0cHV0RXZlbnRzXT1cInsgYWN0aW9uQnV0dG9uQ2xpY2s6IF9vbkZpbHRlckFjdGlvbkJ1dHRvbkNsaWNrIH1cIlxuICAgICAgPjwvY29tcG9uZW50LW1hcHBlcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
1217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9saXN0LXZpZXcvbGlzdC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9saXN0LXZpZXcvbGlzdC12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFB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QUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsbUJBQW1CO3dCQUNuQixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7cUJBQzNDOytHQUd3QixTQUFTO3NCQUFqQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ0gsSUFBSTtzQkFBdkIsU0FBUzt1QkFBQyxPQUFPO2dCQUVULE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBmb3J3YXJkUmVmLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdFJhZGlvTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIE1hdFBhZ2luYXRvck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BNb2R1bGUsIENka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXksIENka0Ryb3BMaXN0LCBDZGtEcmFnIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBQcm9ncmVzc1NwaW5uZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX21lc3NhZ2VzL3Byb2dyZXNzLXNwaW5uZXIuc2VydmljZSc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7IENvbXBvbmVudE1hcHBlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL19icmlkZ2UvY29tcG9uZW50LW1hcHBlci9jb21wb25lbnQtbWFwcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBnZXRDdXJyZW5jeU9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy9jdXJyZW5jeS11dGlscyc7XG5pbXBvcnQgeyBnZXRMb2NhbGUsIGdldFNlY29uZHMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy9jb21tb24nO1xuaW1wb3J0IHsgZm9ybWF0dGVycyB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL2Zvcm1hdHRlcnMvZm9ybWF0LXV0aWxzJztcblxuaW1wb3J0IHsgaW5pdCB9IGZyb20gJy4vbGlzdFZpZXdIZWxwZXJzJztcblxuY29uc3QgU0VMRUNUSU9OX01PREUgPSB7IFNJTkdMRTogJ3NpbmdsZScsIE1VTFRJOiAnbXVsdGknIH07XG5cbmludGVyZmFjZSBMaXN0Vmlld1Byb3BzIHtcbiAgaW5oZXJpdGVkUHJvcHM6IGFueTtcbiAgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLy8gSWYgYW55LCBlbnRlciBhZGRpdGlvbmFsIHByb3BzIHRoYXQgb25seSBleGlzdCBvbiB0aGlzIGNvbXBvbmVudFxuICBnbG9iYWxTZWFyY2g/OiBib29sZWFuO1xuICByZWZlcmVuY2VMaXN0PzogYW55O1xuICByb3dDbGlja0FjdGlvbj86IGFueTtcbiAgc2VsZWN0aW9uTW9kZT86IHN0cmluZztcbiAgcmVmZXJlbmNlVHlwZT86IHN0cmluZztcbiAgY29tcG9zaXRlS2V5cz86IGFueTtcbiAgc2hvd0R5bmFtaWNGaWVsZHM/OiBib29sZWFuO1xuICBwcmVzZXRzPzogYW55O1xuICByZW9yZGVyRmllbGRzOiBzdHJpbmcgfCBib29sZWFuO1xuICBncm91cGluZzogc3RyaW5nIHwgYm9vbGVhbjtcbiAgdmFsdWU6IGFueTtcbiAgcmVhZG9ubHlDb250ZXh0TGlzdDogYW55O1xuICBsYWJlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEdyb3VwIHtcbiAgbGV2ZWwgPSAwO1xuICBwYXJlbnQ6IEdyb3VwO1xuICBleHBhbmRlZCA9IHRydWU7XG4gIHRvdGFsQ291bnRzID0gMDtcbiAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnBhcmVudCB8fCAodGhpcy5wYXJlbnQudmlzaWJsZSAmJiB0aGlzLnBhcmVudC5leHBhbmRlZCk7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWxpc3QtdmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9saXN0LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LXZpZXcuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgTWF0U29ydE1vZHVsZSxcbiAgICBEcmFnRHJvcE1vZHVsZSxcbiAgICBDZGtEcm9wTGlzdCxcbiAgICBDZGtEcmFnLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0UmFkaW9Nb2R1bGUsXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXG4gICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxuICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICBNYXRPcHRpb25Nb2R1bGUsXG4gICAgTWF0RGF0ZXBpY2tlck1vZHVsZSxcbiAgICBmb3J3YXJkUmVmKCgpID0+IENvbXBvbmVudE1hcHBlckNvbXBvbmVudClcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0Vmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuICBAVmlld0NoaWxkKE1hdFNvcnQpIHNvcnQ6IE1hdFNvcnQ7XG5cbiAgQElucHV0KCkgcENvbm4kOiB0eXBlb2YgUENvbm5lY3Q7XG4gIEBJbnB1dCgpIGJJbkZvcm0kID0gdHJ1ZTtcbiAgQElucHV0KCkgcGF5bG9hZDtcblxuICByZXBlYXRMaXN0JDogTWF0VGFibGVEYXRhU291cmNlPGFueT47XG4gIGZpZWxkcyQ6IGFueVtdO1xuXG4gIGRpc3BsYXllZENvbHVtbnMkID0gQXJyYXk8YW55PigpO1xuICBncm91cEJ5Q29sdW1ucyQ6IHN0cmluZ1tdID0gW107XG5cbiAgY29uZmlnUHJvcHMkOiBMaXN0Vmlld1Byb3BzO1xuXG4gIHVwZGF0ZWRSZWZMaXN0OiBhbnk7XG5cbiAgcmVwZWF0TGlzdERhdGE6IGFueVtdID0gW107XG5cbiAgc2VhcmNoSWNvbiQ6IHN0cmluZztcblxuICBiU2hvd1NlYXJjaCQgPSBmYWxzZTtcbiAgYkNvbHVtblJlb3JkZXIkID0gZmFsc2U7XG4gIGJHcm91cGluZyQgPSBmYWxzZTtcblxuICBwZXJmRmlsdGVyOiBzdHJpbmc7XG4gIHNlYXJjaEZpbHRlcjogc3RyaW5nO1xuXG4gIG1lbnVTdmdJY29uJDogc3RyaW5nO1xuICBhcnJvd1N2Z0ljb24kID0gJyc7XG4gIGFycm93RG93blN2Z0ljb24kOiBzdHJpbmc7XG4gIGFycm93VXBTdmdJY29uJDogc3RyaW5nO1xuXG4gIGZpbHRlclN2Z0ljb24kOiBzdHJpbmc7XG4gIGZpbHRlck9uU3ZnSWNvbiQ6IHN0cmluZztcbiAgZ3JvdXBCeVN2Z0ljb24kOiBzdHJpbmc7XG5cbiAgY29tcGFyZVR5cGU6IHN0cmluZztcbiAgY29tcGFyZVJlZjogc3RyaW5nO1xuICBhcnJvd0RpcmVjdGlvbiA9ICdkb3duJztcblxuICBmaWx0ZXJCeUNvbHVtbnM6IGFueVtdID0gW107XG4gIGJTaG93RmlsdGVyUG9wb3ZlciQgPSBmYWxzZTtcbiAgYkNvbnRhaW5zJCA9IHRydWU7XG4gIGJEYXRlVGltZSQgPSBmYWxzZTtcblxuICBmaWx0ZXJDb250YWluc0xhYmVsJCA9ICcnO1xuICBmaWx0ZXJDb250YWluc1R5cGUkID0gJ2NvbnRhaW5zJztcbiAgZmlsdGVyQ29udGFpbnNWYWx1ZSQ6IGFueTtcblxuICBiSXNEYXRlJCA9IGZhbHNlO1xuICBiSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgYklzVGltZSQgPSBmYWxzZTtcblxuICBjdXJyZW50RmlsdGVyUmVmRGF0YTogYW55O1xuICBjdXJyZW50RmlsdGVySW1hZ2VFbDogYW55O1xuXG4gIGFyRmlsdGVyTWFpbkJ1dHRvbnMkOiBhbnlbXSA9IFtdO1xuICBhckZpbHRlclNlY29uZGFyeUJ1dHRvbnMkOiBhbnlbXSA9IFtdO1xuICBzZWxlY3Rpb25Nb2RlPzogc3RyaW5nO1xuICBzaW5nbGVTZWxlY3Rpb25Nb2RlOiBib29sZWFuO1xuICBtdWx0aVNlbGVjdGlvbk1vZGU6IGJvb2xlYW47XG4gIHJvd0lEOiBhbnk7XG4gIHJlc3BvbnNlOiBhbnk7XG4gIGNvbXBvc2l0ZUtleXM6IGFueTtcbiAgc2hvd0R5bmFtaWNGaWVsZHM6IGFueTtcbiAgZmlsdGVyczogYW55ID0ge307XG4gIHNlbGVjdFBhcmFtOiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJQYXlsb2FkOiBhbnk7XG4gIHJlZjogYW55ID0ge307XG4gIGNvc21vc1RhYmxlUmVmOiBhbnk7XG4gIGxpc3RDb250ZXh0OiBhbnkgPSB7fTtcbiAgcXVlcnk6IGFueSA9IG51bGw7XG4gIHBhZ2luZzogYW55O1xuICBmaWVsZERlZnM6IGFueTtcbiAgeFJheUFwaXMgPSBQQ29yZS5nZXREZWJ1Z2dlcigpLmdldFhSYXlSdW50aW1lKCk7XG4gIHhSYXlVaWQgPSB0aGlzLnhSYXlBcGlzLnN0YXJ0WFJheSgpO1xuICBjaGVja0JveFZhbHVlOiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwc1NlcnZpY2U6IFByb2dyZXNzU3Bpbm5lclNlcnZpY2UsXG4gICAgcHVibGljIHV0aWxzOiBVdGlsc1xuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWdQcm9wcyQgPSB0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpIGFzIExpc3RWaWV3UHJvcHM7XG4gICAgLyoqIEJ5IGRlZmF1bHQsIHB5R1VJRCBpcyB1c2VkIGZvciBEYXRhIGNsYXNzZXMgYW5kIHB5SUQgaXMgZm9yIFdvcmsgY2xhc3NlcyBhcyByb3ctaWQva2V5ICovXG4gICAgY29uc3QgZGVmUm93SUQgPSB0aGlzLmNvbmZpZ1Byb3BzJD8ucmVmZXJlbmNlVHlwZSA9PT0gJ0Nhc2UnID8gJ3B5SUQnIDogJ3B5R1VJRCc7XG4gICAgLyoqIElmIGNvbXBvc2l0ZUtleXMgaXMgZGVmaW5lZCwgdXNlIGR5bmFtaWMgdmFsdWUsIGVsc2UgZmFsbGJhY2sgdG8gcHlJRCBvciBweUdVSUQuICovXG4gICAgdGhpcy5jb21wb3NpdGVLZXlzID0gdGhpcy5jb25maWdQcm9wcyQ/LmNvbXBvc2l0ZUtleXM7XG4gICAgdGhpcy5yb3dJRCA9IHRoaXMuY29tcG9zaXRlS2V5cyAmJiB0aGlzLmNvbXBvc2l0ZUtleXM/Lmxlbmd0aCA9PT0gMSA/IHRoaXMuY29tcG9zaXRlS2V5c1swXSA6IGRlZlJvd0lEO1xuICAgIHRoaXMuYlNob3dTZWFyY2gkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUodGhpcy5jb25maWdQcm9wcyQ/Lmdsb2JhbFNlYXJjaCA/IHRoaXMuY29uZmlnUHJvcHMkLmdsb2JhbFNlYXJjaCA6IHRoaXMucGF5bG9hZD8uZ2xvYmFsU2VhcmNoKTtcbiAgICB0aGlzLmJDb2x1bW5SZW9yZGVyJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKHRoaXMuY29uZmlnUHJvcHMkLnJlb3JkZXJGaWVsZHMpO1xuICAgIHRoaXMuYkdyb3VwaW5nJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKHRoaXMuY29uZmlnUHJvcHMkLmdyb3VwaW5nKTtcbiAgICB0aGlzLnNob3dEeW5hbWljRmllbGRzID0gdGhpcy5jb25maWdQcm9wcyQ/LnNob3dEeW5hbWljRmllbGRzO1xuXG4gICAgdGhpcy5tZW51U3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdtb3JlJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuYXJyb3dEb3duU3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdhcnJvdy1kb3duJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuYXJyb3dVcFN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnYXJyb3ctdXAnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG5cbiAgICB0aGlzLmZpbHRlclN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnZmlsdGVyJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuZmlsdGVyT25TdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ2ZpbHRlci1vbicsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgICB0aGlzLmdyb3VwQnlTdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ3JvdycsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcblxuICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IHRoaXMuY29uZmlnUHJvcHMkLnNlbGVjdGlvbk1vZGU7XG5cbiAgICB0aGlzLmNoZWNrQm94VmFsdWUgPSB0aGlzLmNvbmZpZ1Byb3BzJC52YWx1ZTtcblxuICAgIHRoaXMuYXJGaWx0ZXJNYWluQnV0dG9ucyQucHVzaCh7IGFjdGlvbklEOiAnc3VibWl0JywganNBY3Rpb246ICdzdWJtaXQnLCBuYW1lOiAnU3VibWl0JyB9KTtcbiAgICB0aGlzLmFyRmlsdGVyU2Vjb25kYXJ5QnV0dG9ucyQucHVzaCh7IGFjdGlvbklEOiAnY2FuY2VsJywganNBY3Rpb246ICdjYW5jZWwnLCBuYW1lOiAnQ2FuY2VsJyB9KTtcblxuICAgIGxldCB0aXRsZSA9IHRoaXMuY29uZmlnUHJvcHMkPy50aXRsZSB8fCB0aGlzLmNvbmZpZ1Byb3BzJD8ubGFiZWwgfHwgJ0xpc3QnO1xuICAgIGNvbnN0IGluaGVyaXRlZFByb3BzID0gdGhpcy5jb25maWdQcm9wcyQ/LmluaGVyaXRlZFByb3BzO1xuICAgIGlmICh0aXRsZSA9PT0gJ0xpc3QnICYmIGluaGVyaXRlZFByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IGluaGVyaXRlZFByb3Agb2YgaW5oZXJpdGVkUHJvcHMpIHtcbiAgICAgICAgaWYgKGluaGVyaXRlZFByb3A/LnByb3AgPT09ICdsYWJlbCcpIHtcbiAgICAgICAgICB0aXRsZSA9IGluaGVyaXRlZFByb3A/LnZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubGFiZWwgPSB0aXRsZTtcblxuICAgIHRoaXMuc2VhcmNoSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdzZWFyY2gnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnN1YnNjcmliZShcbiAgICAgICAgUENvcmUuZ2V0Q29uc3RhbnRzKCkuUFVCX1NVQl9FVkVOVFMuRVZFTlRfREFTSEJPQVJEX0ZJTFRFUl9DSEFOR0UsXG4gICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlckNoYW5nZShkYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgYGRhc2hib2FyZC1jb21wb25lbnQtJHsnaWQnfWAsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgICApO1xuICAgICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS5zdWJzY3JpYmUoXG4gICAgICAgIFBDb3JlLmdldENvbnN0YW50cygpLlBVQl9TVUJfRVZFTlRTLkVWRU5UX0RBU0hCT0FSRF9GSUxURVJfQ0xFQVJfQUxMLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJzID0ge307XG4gICAgICAgICAgdGhpcy5wcm9jZXNzRmlsdGVyQ2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgYGRhc2hib2FyZC1jb21wb25lbnQtJHsnaWQnfWAsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgICApO1xuICAgIH0sIDApO1xuICAgIGlmICh0aGlzLmNvbmZpZ1Byb3BzJCkge1xuICAgICAgaWYgKCF0aGlzLnBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0geyByZWZlcmVuY2VMaXN0OiB0aGlzLmNvbmZpZ1Byb3BzJC5yZWZlcmVuY2VMaXN0IH07XG4gICAgICB9XG4gICAgICBpbml0KHtcbiAgICAgICAgcENvbm4kOiB0aGlzLnBDb25uJCxcbiAgICAgICAgYkluRm9ybSQ6IHRoaXMuYkluRm9ybSQsXG4gICAgICAgIC4uLnRoaXMucGF5bG9hZCxcbiAgICAgICAgbGlzdENvbnRleHQ6IHRoaXMubGlzdENvbnRleHQsXG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHNob3dEeW5hbWljRmllbGRzOiB0aGlzLnNob3dEeW5hbWljRmllbGRzLFxuICAgICAgICB4UmF5VWlkOiB0aGlzLnhSYXlVaWQsXG4gICAgICAgIGNvc21vc1RhYmxlUmVmOiB0aGlzLmNvc21vc1RhYmxlUmVmLFxuICAgICAgICBzZWxlY3Rpb25Nb2RlOiB0aGlzLnNlbGVjdGlvbk1vZGVcbiAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICB0aGlzLmxpc3RDb250ZXh0ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuZ2V0TGlzdERhdGEoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEZpZWxkRnJvbUZpbHRlcihmaWx0ZXIsIGRhdGVSYW5nZSA9IGZhbHNlKSB7XG4gICAgbGV0IGZpZWxkVmFsdWU7XG4gICAgaWYgKGRhdGVSYW5nZSkge1xuICAgICAgZmllbGRWYWx1ZSA9IGZpbHRlcj8uQU5EWzBdPy5jb25kaXRpb24ubGhzLmZpZWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZFZhbHVlID0gZmlsdGVyPy5jb25kaXRpb24ubGhzLmZpZWxkO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRWYWx1ZTtcbiAgfVxuXG4gIC8vIFdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gRVZFTlRfREFTSEJPQVJEX0ZJTFRFUl9DSEFOR0UgZmlyZXNcbiAgcHJvY2Vzc0ZpbHRlckNoYW5nZShkYXRhKSB7XG4gICAgY29uc3QgeyBmaWx0ZXJJZCwgZmlsdGVyRXhwcmVzc2lvbiB9ID0gZGF0YTtcbiAgICBsZXQgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZDogYW55ID0ge1xuICAgICAgcXVlcnk6IHtcbiAgICAgICAgZmlsdGVyOiB7fSxcbiAgICAgICAgc2VsZWN0OiBbXVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmZpbHRlcnNbZmlsdGVySWRdID0gZmlsdGVyRXhwcmVzc2lvbjtcbiAgICBsZXQgaXNEYXRlUmFuZ2UgPSAhIWRhdGEuZmlsdGVyRXhwcmVzc2lvbj8uQU5EO1xuICAgIC8vIFdpbGwgYmUgQU5EIGJ5IGRlZmF1bHQgYnV0IG1ha2luZyBpdCBkeW5hbWljIGluIGNhc2Ugd2Ugc3VwcG9ydCBkeW5hbWljIHJlbGF0aW9uYWwgb3BzIGluIGZ1dHVyZVxuICAgIGNvbnN0IHJlbGF0aW9uYWxPcCA9ICdBTkQnO1xuXG4gICAgbGV0IGZpZWxkID0gdGhpcy5nZXRGaWVsZEZyb21GaWx0ZXIoZmlsdGVyRXhwcmVzc2lvbiwgaXNEYXRlUmFuZ2UpO1xuICAgIGNvbnN0IHNlbGVjdFBhcmFtOiBhbnlbXSA9IFtdO1xuICAgIC8vIENvbnN0cnVjdGluZyB0aGUgc2VsZWN0IHBhcmFtZXRlcnMgbGlzdCAod2lsbCBiZSBzZW50IGluIGRhc2hib2FyZEZpbHRlclBheWxvYWQpXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zJD8uZm9yRWFjaChjb2wgPT4ge1xuICAgICAgc2VsZWN0UGFyYW0ucHVzaCh7XG4gICAgICAgIGZpZWxkOiBjb2xcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHRyaWdnZXJlZCBmaWx0ZXIgaXMgYXBwbGljYWJsZSBmb3IgdGhpcyBsaXN0XG4gICAgaWYgKGRhdGEuZmlsdGVyRXhwcmVzc2lvbiAhPT0gbnVsbCAmJiAhKHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/Lmxlbmd0aCAmJiB0aGlzLmRpc3BsYXllZENvbHVtbnMkPy5pbmNsdWRlcyhmaWVsZCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgYSBmbGFnIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXNldCBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkIGluIGNhc2Ugd2UgZG9uJ3QgZmluZCBhbnkgdmFsaWQgZmlsdGVyc1xuICAgIGxldCB2YWxpZEZpbHRlciA9IGZhbHNlO1xuXG4gICAgbGV0IGluZGV4ID0gMTtcbiAgICAvLyBJdGVyYXRpbmcgb3ZlciB0aGUgY3VycmVudCBmaWx0ZXJzIGxpc3QgdG8gY3JlYXRlIGZpbHRlciBkYXRhIHdoaWNoIHdpbGwgYmUgUE9TVGVkXG4gICAgY29uc3QgZmlsdGVyS2V5czogYW55W10gPSBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpO1xuICAgIGNvbnN0IGZpbHRlclZhbHVlczogYW55W10gPSBPYmplY3QudmFsdWVzKHRoaXMuZmlsdGVycyk7XG4gICAgZm9yIChsZXQgZmlsdGVySW5kZXggPSAwOyBmaWx0ZXJJbmRleCA8IGZpbHRlcktleXMubGVuZ3RoOyBmaWx0ZXJJbmRleCsrKSB7XG4gICAgICBjb25zdCBmaWx0ZXIgPSBmaWx0ZXJWYWx1ZXNbZmlsdGVySW5kZXhdO1xuICAgICAgLy8gSWYgdGhlIGZpbHRlciBpcyBudWxsIHRoZW4gd2UgY2FuIHNraXAgdGhpcyBpdGVyYXRpb25cbiAgICAgIGlmIChmaWx0ZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVja2luZyBpZiB0aGUgZmlsdGVyIGlzIG9mIHR5cGUtIERhdGUgUmFuZ2VcbiAgICAgIGlzRGF0ZVJhbmdlID0gISFmaWx0ZXI/LkFORDtcbiAgICAgIGZpZWxkID0gdGhpcy5nZXRGaWVsZEZyb21GaWx0ZXIoZmlsdGVyLCBpc0RhdGVSYW5nZSk7XG5cbiAgICAgIGlmICghKHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/Lmxlbmd0aCAmJiB0aGlzLmRpc3BsYXllZENvbHVtbnMkPy5pbmNsdWRlcyhmaWVsZCkpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIElmIHdlIHJlYWNoIGhlcmUgdGhhdCBpbXBsaWVzIHdlJ3ZlIGF0IGxlYXN0IG9uZSB2YWxpZCBmaWx0ZXIsIGhlbmNlIHNldHRpbmcgdGhlIGZsYWdcbiAgICAgIHZhbGlkRmlsdGVyID0gdHJ1ZTtcbiAgICAgIC8qKiBCZWxvdyBhcmUgdGhlIDIgY2FzZXMgZm9yLSBUZXh0ICYgRGF0ZS1SYW5nZSBmaWx0ZXIgdHlwZXMgd2hlcmUgd2UnbGwgY29uc3RydWN0IGZpbHRlciBkYXRhIHdoaWNoIHdpbGwgYmUgc2VudCBpbiB0aGUgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZFxuICAgICAgICogSW4gQ29uc3RlbGxhdGlvbiBEWCBDb21wb25lbnRzLCB0aHJvdWdoIFJlcGVhdGluZyBTdHJ1Y3R1cmVzIHRoZXkgbWlnaHQgYmUgdXNpbmcgc2V2ZXJhbCBBUElzIHRvIGRvIGl0LiBXZSdyZSBkb2luZyBpdCBoZXJlXG4gICAgICAgKi9cbiAgICAgIGlmIChpc0RhdGVSYW5nZSkge1xuICAgICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkID0gdGhpcy5maWx0ZXJCYXNlZE9uRGF0ZVJhbmdlKGRhc2hib2FyZEZpbHRlclBheWxvYWQsIGZpbHRlciwgcmVsYXRpb25hbE9wLCBzZWxlY3RQYXJhbSwgaW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIuZmlsdGVyQ29uZGl0aW9ucyA9IHtcbiAgICAgICAgICAuLi5kYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5maWx0ZXJDb25kaXRpb25zLFxuICAgICAgICAgIFtgVCR7aW5kZXgrK31gXTogeyAuLi5maWx0ZXIuY29uZGl0aW9uLCBpZ25vcmVDYXNlOiB0cnVlIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWMpIHtcbiAgICAgICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpYyA9IGAke2Rhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmxvZ2ljfSAke3JlbGF0aW9uYWxPcH0gVCR7aW5kZXggLSAxfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWMgPSBgVCR7aW5kZXggLSAxfWA7XG4gICAgICAgIH1cblxuICAgICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LnNlbGVjdCA9IHNlbGVjdFBhcmFtO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc2V0IHRoZSBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkIGlmIHdlIGVuZCB1cCB3aXRoIG5vIHZhbGlkIGZpbHRlcnMgZm9yIHRoZSBsaXN0XG4gICAgaWYgKCF2YWxpZEZpbHRlcikge1xuICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJQYXlsb2FkID0gZGFzaGJvYXJkRmlsdGVyUGF5bG9hZDtcbiAgICB0aGlzLmdldExpc3REYXRhKCk7XG4gIH1cblxuICBmaWx0ZXJCYXNlZE9uRGF0ZVJhbmdlKGRhc2hib2FyZEZpbHRlclBheWxvYWQsIGZpbHRlciwgcmVsYXRpb25hbE9wLCBzZWxlY3RQYXJhbSwgaW5kZXgpIHtcbiAgICBjb25zdCBkYXRlUmVsYXRpb25hbE9wID0gZmlsdGVyPy5BTkQgPyAnQU5EJyA6ICdPUic7XG4gICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIuZmlsdGVyQ29uZGl0aW9ucyA9IHtcbiAgICAgIC4uLmRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmZpbHRlckNvbmRpdGlvbnMsXG4gICAgICBbYFQke2luZGV4Kyt9YF06IHsgLi4uZmlsdGVyW3JlbGF0aW9uYWxPcF1bMF0uY29uZGl0aW9uIH0sXG4gICAgICBbYFQke2luZGV4Kyt9YF06IHsgLi4uZmlsdGVyW3JlbGF0aW9uYWxPcF1bMV0uY29uZGl0aW9uIH1cbiAgICB9O1xuICAgIGlmIChkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpYykge1xuICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWMgPSBgJHtkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpY30gJHtyZWxhdGlvbmFsT3B9IChUJHtpbmRleCAtIDJ9ICR7ZGF0ZVJlbGF0aW9uYWxPcH0gVCR7XG4gICAgICAgIGluZGV4IC0gMVxuICAgICAgfSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpYyA9IGAoVCR7aW5kZXggLSAyfSAke3JlbGF0aW9uYWxPcH0gVCR7aW5kZXggLSAxfSlgO1xuICAgIH1cblxuICAgIGRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuc2VsZWN0ID0gc2VsZWN0UGFyYW07XG5cbiAgICByZXR1cm4gZGFzaGJvYXJkRmlsdGVyUGF5bG9hZDtcbiAgfVxuXG4gIHByb2Nlc3NGaWx0ZXJDbGVhcigpIHtcbiAgICB0aGlzLmZpbHRlclBheWxvYWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5nZXRMaXN0RGF0YSgpO1xuICB9XG5cbiAgZ2V0RmllbGRzTWV0YWRhdGEocmVmTGlzdCkge1xuICAgIC8vIEB0cy1pZ25vcmUgLSAzcmQgcGFyYW1ldGVyIFwiYXNzb2NpYXRpb25GaWx0ZXJcIiBzaG91bGQgYmUgb3B0aW9uYWwgZm9yIGdldERhdGFWaWV3TWV0YWRhdGEgbWV0aG9kXG4gICAgcmV0dXJuIFBDb3JlLmdldEFuYWx5dGljc1V0aWxzKCkuZ2V0RGF0YVZpZXdNZXRhZGF0YShyZWZMaXN0LCB0aGlzLnNob3dEeW5hbWljRmllbGRzKTtcbiAgfVxuXG4gIGdldExpc3REYXRhKCkge1xuICAgIGNvbnN0IGNvbXBvbmVudENvbmZpZyA9IHRoaXMucENvbm4kLmdldENvbXBvbmVudENvbmZpZygpO1xuICAgIGlmICh0aGlzLmNvbmZpZ1Byb3BzJCkge1xuICAgICAgdGhpcy5wcmVwYXJlUGF5bG9hZCgpO1xuICAgICAgY29uc3QgcmVmTGlzdCA9IHRoaXMuY29uZmlnUHJvcHMkLnJlZmVyZW5jZUxpc3Q7XG4gICAgICBjb25zdCBmaWVsZHNNZXRhRGF0YVByb21pc2UgPSB0aGlzLmdldEZpZWxkc01ldGFkYXRhKHJlZkxpc3QpO1xuICAgICAgLy8gcmV0dXJucyBhIHByb21pc2VcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnBheWxvYWQgfHwgdGhpcy5maWx0ZXJQYXlsb2FkIHx8IHt9O1xuICAgICAgY29uc3QgZGF0YVZpZXdQYXJhbWV0ZXJzID0gdGhpcy5wYXlsb2FkLnBhcmFtZXRlcnM7XG5cbiAgICAgIGNvbnN0IHdvcmtMaXN0RGF0YVByb21pc2UgPSAhdGhpcy5iSW5Gb3JtJFxuICAgICAgICA/IFBDb3JlLmdldERhdGFBcGlVdGlscygpLmdldERhdGEocmVmTGlzdCwgcGF5bG9hZClcbiAgICAgICAgOiBQQ29yZS5nZXREYXRhUGFnZVV0aWxzKCkuZ2V0RGF0YUFzeW5jKFxuICAgICAgICAgICAgcmVmTGlzdCxcbiAgICAgICAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCksXG4gICAgICAgICAgICBwYXlsb2FkLmRhdGFWaWV3UGFyYW1ldGVycyA/IHBheWxvYWQuZGF0YVZpZXdQYXJhbWV0ZXJzIDogZGF0YVZpZXdQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgdGhpcy5wYWdpbmcsXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5XG4gICAgICAgICAgKTtcblxuICAgICAgdGhpcy5iU2hvd0ZpbHRlclBvcG92ZXIkID0gZmFsc2U7XG5cbiAgICAgIHRoaXMucHNTZXJ2aWNlLnNlbmRNZXNzYWdlKHRydWUpO1xuXG4gICAgICBQcm9taXNlLmFsbChbZmllbGRzTWV0YURhdGFQcm9taXNlLCB3b3JrTGlzdERhdGFQcm9taXNlXSlcbiAgICAgICAgLnRoZW4oKHJlc3VsdHM6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpZWxkc01ldGFEYXRhID0gcmVzdWx0c1swXTtcbiAgICAgICAgICBjb25zdCB3b3JrTGlzdERhdGEgPSByZXN1bHRzWzFdO1xuXG4gICAgICAgICAgdGhpcy5maWVsZHMkID0gdGhpcy5jb25maWdQcm9wcyQucHJlc2V0c1swXS5jaGlsZHJlblswXS5jaGlsZHJlbjtcbiAgICAgICAgICAvLyB0aGlzIGlzIGFuIHVucmVzb3ZsZWQgdmVyc2lvbiBvZiB0aGlzLmZpZWxkcyQsIG5lZWQgdW5yZXNvbHZlZCwgc28gY2FuIGdldCB0aGUgcHJvcGVydHkgcmVmZXJlbmNlXG4gICAgICAgICAgY29uc3QgY29sdW1uRmllbGRzID0gY29tcG9uZW50Q29uZmlnLnByZXNldHNbMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW47XG5cbiAgICAgICAgICBjb25zdCB0YWJsZURhdGFSZXN1bHRzID0gIXRoaXMuYkluRm9ybSQgPyB3b3JrTGlzdERhdGEuZGF0YS5kYXRhIDogd29ya0xpc3REYXRhLmRhdGE7XG5cbiAgICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRIZWFkZXJDZWxscyhjb2x1bW5GaWVsZHMsIHRoaXMuZmllbGREZWZzKTtcbiAgICAgICAgICB0aGlzLmZpZWxkcyQgPSB0aGlzLnVwZGF0ZUZpZWxkcyh0aGlzLmZpZWxkcyQsIGZpZWxkc01ldGFEYXRhLmRhdGEuZmllbGRzLCBjb2x1bW5zKTtcbiAgICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMkID0gY29sdW1ucy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjb2wuaWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHRhYmxlRGF0YVJlc3VsdHM7XG4gICAgICAgICAgdGhpcy51cGRhdGVkUmVmTGlzdCA9IHRoaXMudXBkYXRlRGF0YSh0YWJsZURhdGFSZXN1bHRzLCB0aGlzLmZpZWxkcyQpO1xuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IFNFTEVDVElPTl9NT0RFLlNJTkdMRSAmJiB0aGlzLnVwZGF0ZWRSZWZMaXN0Py5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMkPy51bnNoaWZ0KCdzZWxlY3QnKTtcbiAgICAgICAgICAgIHRoaXMuc2luZ2xlU2VsZWN0aW9uTW9kZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IFNFTEVDVElPTl9NT0RFLk1VTFRJICYmIHRoaXMudXBkYXRlZFJlZkxpc3Q/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/LnVuc2hpZnQoJ3NlbGVjdCcpO1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdGlvbk1vZGUgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdCQgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMudXBkYXRlZFJlZkxpc3QpO1xuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyUHJlZGljYXRlID0gdGhpcy5jdXN0b21GaWx0ZXJQcmVkaWNhdGUuYmluZCh0aGlzKTtcblxuICAgICAgICAgIC8vIGtlZXBpbmcgYW4gb3JpZ2luYWwgY29weSB0byBnZXQgYmFjayBhZnRlciBwb3NzaWJsZSBzb3J0cywgZmlsdGVycyBhbmQgZ3JvdXBCeVxuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdERhdGEgPSB0aGlzLnJlcGVhdExpc3QkLmRhdGEuc2xpY2UoKTtcblxuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdCQucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICAgICAgdGhpcy5yZXBlYXRMaXN0JC5zb3J0ID0gdGhpcy5zb3J0O1xuICAgICAgICAgIHRoaXMucHNTZXJ2aWNlLnNlbmRNZXNzYWdlKGZhbHNlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGRuJ3QgZmV0Y2ggZWl0aGVyIHRoZSBmaWVsZHNNZXRhRGF0YSBvciB3b3JrTGlzdERhdGFcIik7XG4gICAgICAgICAgdGhpcy5wc1NlcnZpY2Uuc2VuZE1lc3NhZ2UoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcmVwYXJlUGF5bG9hZCgpIHtcbiAgICBjb25zdCB7IGZpZWxkRGVmcywgaXRlbUtleSwgcGF0Y2hRdWVyeUZpZWxkcyB9ID0gdGhpcy5saXN0Q29udGV4dC5tZXRhO1xuICAgIHRoaXMuZmllbGREZWZzID0gZmllbGREZWZzO1xuICAgIGxldCBsaXN0RmllbGRzID0gZmllbGREZWZzID8gdGhpcy5idWlsZFNlbGVjdChmaWVsZERlZnMsIHVuZGVmaW5lZCwgcGF0Y2hRdWVyeUZpZWxkcywgdGhpcy5wYXlsb2FkPy5jb21wb3NpdGVLZXlzKSA6IFtdO1xuICAgIGxpc3RGaWVsZHMgPSB0aGlzLmFkZEl0ZW1LZXlJblNlbGVjdChmaWVsZERlZnMsIGl0ZW1LZXksIGxpc3RGaWVsZHMsIHRoaXMucGF5bG9hZD8uY29tcG9zaXRlS2V5cyk7XG4gICAgaWYgKHRoaXMucGF5bG9hZC5xdWVyeSkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMucGF5bG9hZC5xdWVyeTtcbiAgICB9IGVsc2UgaWYgKGxpc3RGaWVsZHM/Lmxlbmd0aCAmJiB0aGlzLmxpc3RDb250ZXh0Lm1ldGEuaXNRdWVyeWFibGUpIHtcbiAgICAgIGlmICh0aGlzLmZpbHRlclBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHtcbiAgICAgICAgICBzZWxlY3Q6IGxpc3RGaWVsZHMsXG4gICAgICAgICAgZmlsdGVyOiB0aGlzLmZpbHRlclBheWxvYWQ/LnF1ZXJ5Py5maWx0ZXJcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB7IHNlbGVjdDogbGlzdEZpZWxkcyB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJQYXlsb2FkKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5maWx0ZXJQYXlsb2FkPy5xdWVyeTtcbiAgICB9XG4gIH1cbiAgLy8gbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAvLyAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMucGF5bG9hZCkge1xuICAvLyAgICAgY29uc3QgY3VycmVudFBheWxvYWRWYWwgPSBjaGFuZ2VzLnBheWxvYWQ/LmN1cnJlbnRWYWx1ZTtcbiAgLy8gICAgIGNvbnN0IHByZXZpb3VzUGF5bG9hZFZhbCA9IGNoYW5nZXMucGF5bG9hZD8ucHJldmlvdXNWYWx1ZTtcbiAgLy8gICAgIGlmIChjdXJyZW50UGF5bG9hZFZhbCAhPT0gcHJldmlvdXNQYXlsb2FkVmFsKSB7XG4gIC8vICAgICAgIHRoaXMuZ2V0TGlzdERhdGEoKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnVuc3Vic2NyaWJlKFxuICAgICAgUENvcmUuZ2V0Q29uc3RhbnRzKCkuUFVCX1NVQl9FVkVOVFMuRVZFTlRfREFTSEJPQVJEX0ZJTFRFUl9DSEFOR0UsXG4gICAgICBgZGFzaGJvYXJkLWNvbXBvbmVudC0keydpZCd9YCxcbiAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKClcbiAgICApO1xuICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkudW5zdWJzY3JpYmUoXG4gICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5FVkVOVF9EQVNIQk9BUkRfRklMVEVSX0NMRUFSX0FMTCxcbiAgICAgIGBkYXNoYm9hcmQtY29tcG9uZW50LSR7J2lkJ31gLFxuICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICk7XG4gIH1cblxuICAvLyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gIC8vICAgLy8gcGFnaW5hdG9yIGhhcyB0byBleGlzdCBmb3IgdGhpcyB0byB3b3JrLFxuICAvLyAgIC8vIHNvIGNhbGxlZCBhZnRlciBpbml0IChwYWdpbmF0b3IgZHJhd24pXG4gIC8vICAgLy8gQ2FsbHMgYXJlIG5vdyBpbiB3b3JrTGlzdERhdGEgcHJvbWlzZVxuICAvLyAgIC8vIHRoaXMucmVwZWF0TGlzdCQucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gIC8vICAgLy8gdGhpcy5yZXBlYXRMaXN0JC5zb3J0ID0gdGhpcy5zb3J0O1xuICAvLyB9XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuZGlzcGxheWVkQ29sdW1ucyQsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gIH1cblxuICB1cGRhdGVGaWVsZHMoYXJGaWVsZHM6IGFueVtdLCBhckNvbHVtbnMsIGZpZWxkcyk6IGFueVtdIHtcbiAgICBjb25zdCBhclJldHVybiA9IGFyRmllbGRzO1xuICAgIGFyUmV0dXJuLmZvckVhY2goKGZpZWxkLCBpKSA9PiB7XG4gICAgICBmaWVsZC5jb25maWcgPSB7IC4uLmZpZWxkLmNvbmZpZywgLi4uZmllbGRzW2ldLCBuYW1lOiBmaWVsZHNbaV0uaWQgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXJSZXR1cm47XG4gIH1cblxuICBhcHBseVNlYXJjaChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hGaWx0ZXIgPSBmaWx0ZXJWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICh0aGlzLmdyb3VwQnlDb2x1bW5zJC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmRhdGEgPSB0aGlzLnJlcGVhdExpc3REYXRhLnNsaWNlKCk7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IHRoaXMuc2VhcmNoRmlsdGVyO1xuICAgICAgY29uc3QgcmVwZWF0RGF0YSA9IHRoaXMucmVwZWF0TGlzdCQuc29ydERhdGEodGhpcy5yZXBlYXRMaXN0JC5maWx0ZXJlZERhdGEsIHRoaXMucmVwZWF0TGlzdCQuc29ydCBhcyBNYXRTb3J0KTtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZGF0YSA9IHRoaXMuYWRkR3JvdXBzKHJlcGVhdERhdGEsIHRoaXMuZ3JvdXBCeUNvbHVtbnMkKTtcblxuICAgICAgdGhpcy5wZXJmRmlsdGVyID0gcGVyZm9ybWFuY2Uubm93KCkudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gdGhpcy5wZXJmRmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IHRoaXMuc2VhcmNoRmlsdGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlcGVhdExpc3QkLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgaXNDaGVja2VkKHJvd0luKTogYW55IHtcbiAgICBjb25zdCBpbml0aWFsVmFsID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnUHJvcHMkPy5yZWFkb25seUNvbnRleHRMaXN0Py5yZWR1Y2UoKGFjYywgY3VyclJvdykgPT4ge1xuICAgICAgcmV0dXJuIGFjYyB8fCByb3dJblt0aGlzLnJvd0lEXSA9PT0gY3VyclJvd1t0aGlzLnJvd0lEXTtcbiAgICB9LCBpbml0aWFsVmFsKTtcbiAgfVxuXG4gIGZpZWxkT25DaGFuZ2Uocm93KSB7XG4gICAgY29uc3QgdmFsdWUgPSByb3dbdGhpcy5yb3dJRF07XG4gICAgY29uc3QgcmVxT2JqID0ge307XG4gICAgaWYgKHRoaXMuY29tcG9zaXRlS2V5cz8ubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlc3BvbnNlLmZpbmRJbmRleChlbGVtZW50ID0+IGVsZW1lbnRbdGhpcy5yb3dJRF0gPT09IHZhbHVlKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUm93ID0gdGhpcy5yZXNwb25zZVtpbmRleF07XG4gICAgICB0aGlzLmNvbXBvc2l0ZUtleXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgcmVxT2JqW2VsZW1lbnRdID0gc2VsZWN0ZWRSb3dbZWxlbWVudF07XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxT2JqW3RoaXMucm93SURdID0gdmFsdWU7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tCb3hWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMucENvbm4kPy5nZXRMaXN0QWN0aW9ucz8uKCk/LnNldFNlbGVjdGVkUm93cyhbcmVxT2JqXSk7XG4gIH1cblxuICBvbkNoZWNrYm94Q2xpY2socm93LCBldmVudCkge1xuICAgIGNvbnN0IHZhbHVlID0gcm93W3RoaXMucm93SURdO1xuICAgIGNvbnN0IGNoZWNrZWQgPSBldmVudD8uY2hlY2tlZDtcbiAgICBjb25zdCByZXFPYmo6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLmNvbXBvc2l0ZUtleXM/Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNwb25zZS5maW5kSW5kZXgoZWxlbWVudCA9PiBlbGVtZW50W3RoaXMucm93SURdID09PSB2YWx1ZSk7XG4gICAgICBjb25zdCBzZWxlY3RlZFJvdyA9IHRoaXMucmVzcG9uc2VbaW5kZXhdO1xuICAgICAgdGhpcy5jb21wb3NpdGVLZXlzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIHJlcU9ialtlbGVtZW50XSA9IHNlbGVjdGVkUm93W2VsZW1lbnRdO1xuICAgICAgfSk7XG4gICAgICByZXFPYmouJHNlbGVjdGVkID0gY2hlY2tlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxT2JqW3RoaXMucm93SURdID0gdmFsdWU7XG4gICAgICByZXFPYmouJHNlbGVjdGVkID0gY2hlY2tlZDtcbiAgICB9XG4gICAgdGhpcy5wQ29ubiQ/LmdldExpc3RBY3Rpb25zKCk/LnNldFNlbGVjdGVkUm93cyhbcmVxT2JqXSk7XG4gIH1cblxuICAvLyByb3dDbGljayhyb3cpIHtcbiAgLy8gICBzd2l0Y2ggKHRoaXMuY29uZmlnUHJvcHMkLnJvd0NsaWNrQWN0aW9uKSB7XG4gIC8vICAgICBjYXNlICdvcGVuQXNzaWdubWVudCc6XG4gIC8vICAgICAgIHRoaXMucHNTZXJ2aWNlLnNlbmRNZXNzYWdlKHRydWUpO1xuICAvLyAgICAgICB0aGlzLm9wZW5Bc3NpZ25tZW50KHJvdyk7XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIF9nZXRJY29uU3R5bGUobGV2ZWwpOiBzdHJpbmcge1xuICAgIGxldCBzUmV0dXJuID0gJyc7XG4gICAgbGV0IG5MZXZlbCA9IHBhcnNlSW50KGxldmVsLCAxMCk7XG4gICAgbkxldmVsLS07XG4gICAgbkxldmVsICo9IDE1O1xuICAgIHNSZXR1cm4gPSBgcGFkZGluZy1sZWZ0OiAke25MZXZlbH1weDsgdmVydGljYWwtYWxpZ246IG1pZGRsZWA7XG5cbiAgICByZXR1cm4gc1JldHVybjtcbiAgfVxuXG4gIF9nZXRHcm91cE5hbWUoZmllbGROYW1lKSB7XG4gICAgZm9yIChsZXQgZmllbGRJbmRleCA9IDA7IGZpZWxkSW5kZXggPCB0aGlzLmZpZWxkcyQubGVuZ3RoOyBmaWVsZEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMkW2ZpZWxkSW5kZXhdO1xuICAgICAgaWYgKGZpZWxkLmNvbmZpZy5uYW1lID09IGZpZWxkTmFtZSkge1xuICAgICAgICByZXR1cm4gZmllbGQuY29uZmlnLmxhYmVsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBfc2hvd0J1dHRvbihuYW1lLCByb3cpIHtcbiAgICBsZXQgYlJldHVybiA9IGZhbHNlO1xuICAgIGNvbnN0IHsgcHhSZWZPYmplY3RDbGFzcywgcHpJbnNLZXksIHB4UmVmT2JqZWN0S2V5IH0gPSByb3c7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdweFRhc2tMYWJlbCc6XG4gICAgICAgIGlmIChweFJlZk9iamVjdENsYXNzICE9ICcnICYmIHB6SW5zS2V5ICE9ICcnKSB7XG4gICAgICAgICAgYlJldHVybiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdweFJlZk9iamVjdEluc05hbWUnOlxuICAgICAgICBpZiAocHhSZWZPYmplY3RDbGFzcyAhPSAnJyAmJiBweFJlZk9iamVjdEtleSAhPSAnJykge1xuICAgICAgICAgIGJSZXR1cm4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJSZXR1cm47XG4gIH1cblxuICBfbGlzdFZpZXdDbGljayhjb2x1bW4sIHJvdykge1xuICAgIGNvbnN0IG5hbWUgPSBjb2x1bW4uaWQ7XG4gICAgaWYgKGNvbHVtbi5kaXNwbGF5QXNMaW5rKSB7XG4gICAgICBjb25zdCB7IHB4T2JqQ2xhc3MgfSA9IHJvdztcbiAgICAgIGxldCB7IHB6SW5zS2V5IH0gPSByb3c7XG4gICAgICBpZiAoY29sdW1uLmlzQXNzb2NpYXRpb24pIHtcbiAgICAgICAgY29uc3QgYXNzb2NpYXRpb25DYXRlZ29yeSA9IG5hbWUuc3BsaXQoJzonKVswXTtcbiAgICAgICAgcHpJbnNLZXkgPSByb3dbYCR7YXNzb2NpYXRpb25DYXRlZ29yeX06cHpJbnNLZXlgXTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2x1bW4uaXNBc3NpZ25tZW50TGluaykge1xuICAgICAgICB0aGlzLnBDb25uJC5nZXRBY3Rpb25zQXBpKCkub3BlbkFzc2lnbm1lbnQocHpJbnNLZXksIHB4T2JqQ2xhc3MsIHtcbiAgICAgICAgICBjb250YWluZXJOYW1lOiAncHJpbWFyeScsXG4gICAgICAgICAgY2hhbm5lbE5hbWU6ICcnXG4gICAgICAgIH0gYXMgYW55KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucENvbm4kLmdldEFjdGlvbnNBcGkoKS5vcGVuV29ya0J5SGFuZGxlKHB6SW5zS2V5LCBweE9iakNsYXNzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIGNhc2UgJ3B4VGFza0xhYmVsJzpcbiAgICAgICAgICB0aGlzLm9wZW5Bc3NpZ25tZW50KHJvdyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3B4UmVmT2JqZWN0SW5zTmFtZSc6XG4gICAgICAgICAgdGhpcy5vcGVuV29yayhyb3cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9oZWFkZXJTb3J0Q2xpY2soZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICAvLyBpbWFnZXMgMCAtIGZpbHRlciwgMSAtIGFycm93LCAyIC0gbW9yZVxuXG4gICAgLyoqIENvbW1lbnRpbmcgdGhpcyBjb2RlIGZvciBub3cgYXMgaXQgaXMgZ2l2aW5nIGVycm9ycyBub3Qgc3VyZSBpZiBpdCBldmVyIHdvcmtlZCAqL1xuICAgIC8vIGxldCBhcnJvd0ltYWdlID0gZXZlbnQuc3JjRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJylbMV07XG4gICAgLy8gbGV0IGFycm93QXR0ciA9IGFycm93SW1hZ2UuZ2V0QXR0cmlidXRlKCdhcnJvdycpO1xuXG4gICAgLy8gdGhpcy5jbGVhck91dEFycm93cyhldmVudCwgY29sdW1uRGF0YSk7XG5cbiAgICAvLyBzd2l0Y2ggKGFycm93QXR0cikge1xuICAgIC8vICAgY2FzZSAndXAnOlxuICAgIC8vICAgICBhcnJvd0ltYWdlLnNyYyA9IHRoaXMuYXJyb3dEb3duU3ZnSWNvbiQ7XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc2V0QXR0cmlidXRlKCdhcnJvdycsICdkb3duJyk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vICAgY2FzZSAnZG93bic6XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc3JjID0gJyc7XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc2V0QXR0cmlidXRlKCdhcnJvdycsICdub25lJyk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vICAgZGVmYXVsdDpcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zcmMgPSB0aGlzLmFycm93VXBTdmdJY29uJDtcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zZXRBdHRyaWJ1dGUoJ2Fycm93JywgJ3VwJyk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vIH1cblxuICAgIHRoaXMuY29tcGFyZVR5cGUgPSBjb2x1bW5EYXRhLnR5cGU7XG4gICAgdGhpcy5jb21wYXJlUmVmID0gY29sdW1uRGF0YS5jb25maWcubmFtZTtcbiAgICAvLyB0aGlzLmFycm93RGlyZWN0aW9uID0gYXJyb3dJbWFnZS5nZXRBdHRyaWJ1dGUoJ2Fycm93Jyk7XG4gICAgdGhpcy5hcnJvd0RpcmVjdGlvbiA9IHRoaXMuYXJyb3dEaXJlY3Rpb24gPT09ICd1cCcgPyAnZG93bicgOiAndXAnO1xuXG4gICAgdGhpcy5maWx0ZXJTb3J0R3JvdXBCeSgpO1xuICB9XG5cbiAgLy8gQ29tbWVudGluZyBiZWxvdyBtZXRob2QsIHNpbmNlIHRoZSBjb2RlIHdoaWNoIGlzIHVzaW5nIGl0LCBpcyBhbHJlYWR5IGNvbW1lbnRlZFxuICAvLyBjbGVhck91dEFycm93cyhldmVudCwgY29sdW1uRGF0YSkge1xuICAvLyAgIGNvbnN0IGFySW1hZ2VzID0gZXZlbnQuc3JjRWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTtcblxuICAvLyAgIGZvciAoY29uc3QgdGhlSW1hZ2Ugb2YgYXJJbWFnZXMpIHtcbiAgLy8gICAgIC8vIGxldCB0aGVJbWFnZSA9IGFySW1hZ2VzW2ldXG4gIC8vICAgICBjb25zdCBhcnJvdyA9IHRoZUltYWdlLmdldEF0dHJpYnV0ZSgnYXJyb3cnKTtcbiAgLy8gICAgIGlmIChhcnJvdykge1xuICAvLyAgICAgICBjb25zdCBhcnJvd0lkID0gdGhlSW1hZ2UuZ2V0QXR0cmlidXRlKCdhcnJvd2lkJyk7XG4gIC8vICAgICAgIGlmIChhcnJvdyAhPSAnbm9uZScgJiYgYXJyb3dJZCAhPSBjb2x1bW5EYXRhLmNvbmZpZy5uYW1lKSB7XG4gIC8vICAgICAgICAgdGhlSW1hZ2Uuc2V0QXR0cmlidXRlKCdhcnJvdycsICdub25lJyk7XG4gIC8vICAgICAgICAgdGhlSW1hZ2Uuc3JjID0gJyc7XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cblxuICBzb3J0Q29tcGFyZShhLCBiKTogbnVtYmVyIHtcbiAgICBsZXQgYVZhbHVlID0gYVt0aGlzLmNvbXBhcmVSZWZdO1xuICAgIGxldCBiVmFsdWUgPSBiW3RoaXMuY29tcGFyZVJlZl07XG5cbiAgICBpZiAodGhpcy5jb21wYXJlVHlwZSA9PSAnRGF0ZScgfHwgdGhpcy5jb21wYXJlVHlwZSA9PSAnRGF0ZVRpbWUnKSB7XG4gICAgICBhVmFsdWUgPSBnZXRTZWNvbmRzKGFWYWx1ZSk7XG4gICAgICBiVmFsdWUgPSBnZXRTZWNvbmRzKGJWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29tcGFyZVJlZiA9PSAncHhSZWZPYmplY3RJbnNOYW1lJykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb21wYXJlQnlDb2x1bW5QeFJlZk9iamVjdEluc05hbWUoYVZhbHVlLCBiVmFsdWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLmFycm93RGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICd1cCc6XG4gICAgICAgIGlmICghYVZhbHVlIHx8IGFWYWx1ZSA8IGJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWJWYWx1ZSB8fCBhVmFsdWUgPiBiVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICBpZiAoIWJWYWx1ZSB8fCBhVmFsdWUgPiBiVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhVmFsdWUgfHwgYVZhbHVlIDwgYlZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbXBhcmVCeUNvbHVtblB4UmVmT2JqZWN0SW5zTmFtZShhVmFsdWUsIGJWYWx1ZSkge1xuICAgIGNvbnN0IHByZWZpeFggPSBhVmFsdWUuc3BsaXQoJy0nKTtcbiAgICBjb25zdCBwcmVmaXhZID0gYlZhbHVlLnNwbGl0KCctJyk7XG4gICAgc3dpdGNoICh0aGlzLmFycm93RGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICd1cCc6XG4gICAgICAgIGlmIChwcmVmaXhYWzBdICE9PSBwcmVmaXhZWzBdKSB7XG4gICAgICAgICAgaWYgKHByZWZpeFhbMF0gPCBwcmVmaXhZWzBdKSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYgKHByZWZpeFhbMF0gPiBwcmVmaXhZWzBdKSByZXR1cm4gMTtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlZml4WFsxXSAtIHByZWZpeFlbMV07XG4gICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgaWYgKHByZWZpeFhbMF0gIT09IHByZWZpeFlbMF0pIHtcbiAgICAgICAgICBpZiAocHJlZml4WFswXSA+IHByZWZpeFlbMF0pIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAocHJlZml4WFswXSA8IHByZWZpeFlbMF0pIHJldHVybiAxO1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVmaXhZWzFdIC0gcHJlZml4WFsxXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJEaXNwbGF5KHR5cGUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnbm90ZXF1YWwnO1xuICAgICAgICB0aGlzLmJDb250YWlucyQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iRGF0ZVRpbWUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZVRpbWUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzVGltZSQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdub3RlcXVhbCc7XG4gICAgICAgIHRoaXMuYkNvbnRhaW5zJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJEYXRlVGltZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc0RhdGUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzRGF0ZVRpbWUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RpbWUnOlxuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnbm90ZXF1YWwnO1xuICAgICAgICB0aGlzLmJDb250YWlucyQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iRGF0ZVRpbWUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc0RhdGVUaW1lJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc1RpbWUkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnY29udGFpbnMnO1xuICAgICAgICB0aGlzLmJDb250YWlucyQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc0RhdGVUaW1lJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc1RpbWUkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIF9maWx0ZXIoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICAvLyBhZGQgY2xpY2tBd2F5IGxpc3RlbmVyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9jbGlja0F3YXkuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhID0gY29sdW1uRGF0YTtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zTGFiZWwkID0gY29sdW1uRGF0YS5jb25maWcubGFiZWw7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyRGlzcGxheShjb2x1bW5EYXRhLnR5cGUpO1xuXG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlclZhcnNXaXRoQ3VycmVudChjb2x1bW5EYXRhKTtcblxuICAgICAgdGhpcy5iU2hvd0ZpbHRlclBvcG92ZXIkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jbGlja0F3YXkoZXZlbnQ6IGFueSkge1xuICAgIGxldCBiSW5Qb3BVcCA9IGZhbHNlO1xuXG4gICAgLy8gcnVuIHRocm91Z2ggbGlzdCBvZiBlbGVtZW50cyBpbiBwYXRoLCBpZiBtZW51IG5vdCBpbiB0aCBwYXRoLCB0aGVuIHdhbnQgdG9cbiAgICAvLyBoaWRlICh0b2dnbGUpIHRoZSBtZW51XG4gICAgY29uc3QgZXZlbnRQYXRoID0gZXZlbnQucGF0aDtcbiAgICBmb3IgKGxldCBwYXRoSW5kZXggPSAwOyBwYXRoSW5kZXggPCBldmVudFBhdGgubGVuZ3RoOyBwYXRoSW5kZXgrKykge1xuICAgICAgaWYgKFxuICAgICAgICBldmVudFBhdGhbcGF0aEluZGV4XS5jbGFzc05hbWUgPT0gJ3BzZGstbW9kYWwtZmlsZS10b3AnIHx8XG4gICAgICAgIGV2ZW50UGF0aFtwYXRoSW5kZXhdLnRhZ05hbWUgPT0gJ0JVVFRPTicgfHxcbiAgICAgICAgZXZlbnRQYXRoW3BhdGhJbmRleF0udGFnTmFtZSA9PSAnTUFULU9QVElPTicgfHxcbiAgICAgICAgZXZlbnRQYXRoW3BhdGhJbmRleF0udGFnTmFtZSA9PSAnTUFULUlOUFVUJ1xuICAgICAgKSB7XG4gICAgICAgIGJJblBvcFVwID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYkluUG9wVXApIHtcbiAgICAgIC8vIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IGZhbHNlO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNUeXBlKGV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gZXZlbnQudmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNWYWx1ZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNEYXRlVmFsdWUoZXZlbnQsIHZhbHVlKSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IHZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zRGF0ZVRpbWVWYWx1ZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNUaW1lVmFsdWUoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgX29uRmlsdGVyQWN0aW9uQnV0dG9uQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIC8vIG1vZGFsIGJ1dHRvbnNcbiAgICBzd2l0Y2ggKGV2ZW50LmFjdGlvbikge1xuICAgICAgY2FzZSAnY2FuY2VsJzpcbiAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YSA9IFtdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyV2l0aEluZm8oKTtcbiAgICAgICAgdGhpcy5maWx0ZXJTb3J0R3JvdXBCeSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IGZhbHNlO1xuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9jbGlja0F3YXkuYmluZCh0aGlzKSk7XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJXaXRoSW5mbygpIHtcbiAgICBsZXQgYkZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmoucmVmID09PSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLmNvbmZpZy5uYW1lKSB7XG4gICAgICAgIGZpbHRlck9iai50eXBlID0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS50eXBlO1xuICAgICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPSB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQ7XG4gICAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJDtcblxuICAgICAgICBiRm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWJGb3VuZCkge1xuICAgICAgLy8gYWRkIGluXG4gICAgICBjb25zdCBmaWx0ZXJPYmo6IGFueSA9IHt9O1xuICAgICAgZmlsdGVyT2JqLnJlZiA9IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEuY29uZmlnLm5hbWU7XG4gICAgICBmaWx0ZXJPYmoudHlwZSA9IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEudHlwZTtcbiAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlciA9IHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJDtcbiAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJDtcblxuICAgICAgdGhpcy5maWx0ZXJCeUNvbHVtbnMucHVzaChmaWx0ZXJPYmopO1xuICAgIH1cblxuICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBmaWx0ZXJzIGFuZCB1cGRhdGUgZmlsdGVyT24gaWNvblxuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBjb25zdCBjb250YWluc0ZpbHRlclZhbHVlID0gZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWU7XG4gICAgICBjb25zdCBjb250YWluc0ZpbHRlciA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlcjtcbiAgICAgIGNvbnN0IGZpbHRlclJlZiA9IGZpbHRlck9iai5yZWY7XG4gICAgICBjb25zdCBmaWx0ZXJJbmRleCA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucyQuaW5kZXhPZihmaWx0ZXJSZWYpO1xuICAgICAgY29uc3QgYXJGaWx0ZXJJbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnZmlsdGVyT25JY29uJyk7XG4gICAgICBjb25zdCBmaWx0ZXJJbWc6IGFueSA9IGFyRmlsdGVySW1nW2ZpbHRlckluZGV4XTtcbiAgICAgIGlmIChjb250YWluc0ZpbHRlclZhbHVlID09ICcnICYmIGNvbnRhaW5zRmlsdGVyICE9ICdudWxsJyAmJiBjb250YWluc0ZpbHRlciAhPSAnbm90bnVsbCcpIHtcbiAgICAgICAgLy8gY2xlYXIgaWNvblxuICAgICAgICBmaWx0ZXJJbWcuc3JjID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzaG93IGljb25cbiAgICAgICAgZmlsdGVySW1nLnNyYyA9IHRoaXMuZmlsdGVyT25TdmdJY29uJDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJWYXJzV2l0aEN1cnJlbnQoY29sdW1uRGF0YSkge1xuICAgIC8vIGZpbmQgY3VycmVudCByZWYsIGlmIGV4aXN0cywgbW92ZSBkYXRhIHRvIHZhcmlhYmxlIHRvIGRpc3BsYXlcblxuICAgIGxldCBiRm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGZpbHRlck9iaiBvZiB0aGlzLmZpbHRlckJ5Q29sdW1ucykge1xuICAgICAgaWYgKGZpbHRlck9iai5yZWYgPT09IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEuY29uZmlnLm5hbWUpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyO1xuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWU7XG5cbiAgICAgICAgYkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFiRm91bmQpIHtcbiAgICAgIHN3aXRjaCAoY29sdW1uRGF0YS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgICAgIGNhc2UgJ1RpbWUnOlxuICAgICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdub3RlcXVhbCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ2NvbnRhaW5zJztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGZpbHRlckRhdGEoaXRlbTogYW55KSB7XG4gICAgbGV0IGJLZWVwID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGZpbHRlck9iaiBvZiB0aGlzLmZpbHRlckJ5Q29sdW1ucykge1xuICAgICAgaWYgKGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlICE9ICcnIHx8IGZpbHRlck9iai5jb250YWluc0ZpbHRlciA9PSAnbnVsbCcgfHwgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyID09ICdub3RudWxsJykge1xuICAgICAgICBsZXQgZmlsdGVyVmFsdWU6IGFueTtcblxuICAgICAgICBzd2l0Y2ggKGZpbHRlck9iai50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICAgIGNhc2UgJ1RpbWUnOlxuICAgICAgICAgICAgYktlZXAgPSB0aGlzLmZpbHRlckRhdGFXaXRoRGF0ZShpdGVtLCBmaWx0ZXJPYmosIGZpbHRlclZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBiS2VlcCA9IHRoaXMuZmlsdGVyRGF0YVdpdGhDb21tb25UeXBlcyhpdGVtLCBmaWx0ZXJPYmosIGZpbHRlclZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIGRvbid0IGtlZXAgc3RvcCBmaWx0ZXJpbmdcbiAgICAgIGlmICghYktlZXApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJLZWVwO1xuICB9XG5cbiAgZmlsdGVyRGF0YVdpdGhEYXRlKGl0ZW0sIGZpbHRlck9iaiwgZmlsdGVyVmFsdWUpIHtcbiAgICBsZXQgYktlZXA7XG4gICAgbGV0IHZhbHVlID0gaXRlbVtmaWx0ZXJPYmoucmVmXSAhPSBudWxsIHx8IGl0ZW1bZmlsdGVyT2JqLnJlZl0gIT0gJycgPyBnZXRTZWNvbmRzKGl0ZW1bZmlsdGVyT2JqLnJlZl0pIDogbnVsbDtcbiAgICBmaWx0ZXJWYWx1ZSA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlICE9IG51bGwgJiYgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUgIT0gJycgPyBnZXRTZWNvbmRzKGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlKSA6IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpbHRlck9iai5jb250YWluc0ZpbHRlcikge1xuICAgICAgY2FzZSAnbm90ZXF1YWwnOlxuICAgICAgICAvLyBiZWNhc3VlIGZpbHRlclZhbHVlIGlzIGluIG1pbnV0ZXMsIG5lZWQgdG8gaGF2ZSBhIHJhbmdlIG9mIGxlc3MgdGhhbiA2MCBzZWNvbnNcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgZmlsdGVyVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIGdldCByaWQgb2YgbWlsbGlzZWNvbnNcbiAgICAgICAgICB2YWx1ZSAvPSAxMDAwO1xuICAgICAgICAgIGZpbHRlclZhbHVlIC89IDEwMDA7XG5cbiAgICAgICAgICBjb25zdCBkaWZmID0gdmFsdWUgLSBmaWx0ZXJWYWx1ZTtcbiAgICAgICAgICBpZiAoZGlmZiA+PSAwICYmIGRpZmYgPCA2MCkge1xuICAgICAgICAgICAgYktlZXAgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhZnRlcic6XG4gICAgICAgIGlmICh2YWx1ZSA8IGZpbHRlclZhbHVlKSB7XG4gICAgICAgICAgYktlZXAgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JlZm9yZSc6XG4gICAgICAgIGlmICh2YWx1ZSA+IGZpbHRlclZhbHVlKSB7XG4gICAgICAgICAgYktlZXAgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdub3RudWxsJzpcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICBiS2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJLZWVwO1xuICB9XG5cbiAgZmlsdGVyRGF0YVdpdGhDb21tb25UeXBlcyhpdGVtLCBmaWx0ZXJPYmosIGZpbHRlclZhbHVlKSB7XG4gICAgbGV0IGJLZWVwO1xuICAgIGNvbnN0IHZhbHVlID0gaXRlbVtmaWx0ZXJPYmoucmVmXS50b0xvd2VyQ2FzZSgpO1xuICAgIGZpbHRlclZhbHVlID0gZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgIHN3aXRjaCAoZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyKSB7XG4gICAgICBjYXNlICdjb250YWlucyc6XG4gICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKGZpbHRlclZhbHVlKSA8IDApIHtcbiAgICAgICAgICBiS2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXF1YWxzJzpcbiAgICAgICAgaWYgKHZhbHVlICE9IGZpbHRlclZhbHVlKSB7XG4gICAgICAgICAgYktlZXAgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0YXJ0c3dpdGgnOlxuICAgICAgICBpZiAodmFsdWUuaW5kZXhPZihmaWx0ZXJWYWx1ZSkgIT0gMCkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gYktlZXA7XG4gIH1cblxuICBmaWx0ZXJTb3J0R3JvdXBCeSgpIHtcbiAgICAvLyBnZXQgb3JpZ2luYWwgZGF0YSBzZXRcbiAgICBsZXQgdGhlRGF0YSA9IHRoaXMucmVwZWF0TGlzdERhdGEuc2xpY2UoKTtcblxuICAgIC8vIGxhc3QgZmlsdGVyIGNvbmZpZyBkYXRhIGlzIGdsb2JhbFxuICAgIHRoZURhdGEgPSB0aGVEYXRhLmZpbHRlcih0aGlzLmZpbHRlckRhdGEuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBsYXN0IHNvcnQgY29uZmlnIGRhdGEgaXMgZ2xvYmFsXG4gICAgdGhlRGF0YS5zb3J0KHRoaXMuc29ydENvbXBhcmUuYmluZCh0aGlzKSk7XG5cbiAgICBjb25zdCByZUdyb3VwRGF0YSA9IHRoaXMuYWRkR3JvdXBzKHRoZURhdGEsIHRoaXMuZ3JvdXBCeUNvbHVtbnMkKTtcblxuICAgIHRoaXMucmVwZWF0TGlzdCQuZGF0YSA9IFtdO1xuICAgIHRoaXMucmVwZWF0TGlzdCQuZGF0YS5wdXNoKC4uLnJlR3JvdXBEYXRhKTtcblxuICAgIGlmICh0aGlzLnNlYXJjaEZpbHRlciAmJiB0aGlzLnNlYXJjaEZpbHRlciAhPSAnJykge1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSB0aGlzLnNlYXJjaEZpbHRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wZXJmRmlsdGVyID0gcGVyZm9ybWFuY2Uubm93KCkudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gdGhpcy5wZXJmRmlsdGVyO1xuICAgIH1cbiAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9ICcnO1xuXG4gICAgaWYgKHRoaXMucmVwZWF0TGlzdCQucGFnaW5hdG9yKSB7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICB9XG4gIH1cblxuICAvL1xuICAvLyBHcm91cGluZyBjb2RlIGluc3BpcmVkIGJ5IHRoaXMgZXhhbXBsZVxuICAvLyBodHRwczovL3N0YWNrYmxpdHouY29tL2VkaXQvYW5ndWxhci1tYXRlcmlhbC10YWJsZS1yb3ctZ3JvdXBpbmdcbiAgLy9cblxuICBfc2hvd1VuR3JvdXBCeShjb2x1bW5EYXRhKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5ncm91cEJ5Q29sdW1ucyQpIHtcbiAgICAgIGlmICh2YWwgPT0gY29sdW1uRGF0YS5jb25maWcubmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBfZ3JvdXBCeShldmVudCwgY29sdW1uRGF0YSkge1xuICAgIHRoaXMuY2hlY2tHcm91cEJ5Q29sdW1uKGNvbHVtbkRhdGEuY29uZmlnLm5hbWUsIHRydWUpO1xuXG4gICAgdGhpcy5maWx0ZXJTb3J0R3JvdXBCeSgpO1xuICB9XG5cbiAgX3VuR3JvdXBCeShldmVudCwgY29sdW1uRGF0YSkge1xuICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuY2hlY2tHcm91cEJ5Q29sdW1uKGNvbHVtbkRhdGEuY29uZmlnLm5hbWUsIGZhbHNlKTtcblxuICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgfVxuXG4gIGNoZWNrR3JvdXBCeUNvbHVtbihmaWVsZCwgYWRkKSB7XG4gICAgbGV0IGZvdW5kOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLmdyb3VwQnlDb2x1bW5zJCkge1xuICAgICAgaWYgKGNvbHVtbiA9PT0gZmllbGQpIHtcbiAgICAgICAgZm91bmQgPSB0aGlzLmdyb3VwQnlDb2x1bW5zJC5pbmRleE9mKGNvbHVtbiwgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb3VuZCAhPSBudWxsICYmIGZvdW5kID49IDApIHtcbiAgICAgIGlmICghYWRkKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBCeUNvbHVtbnMkLnNwbGljZShmb3VuZCwgMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhZGQpIHtcbiAgICAgIHRoaXMuZ3JvdXBCeUNvbHVtbnMkLnB1c2goZmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIGFkZEdyb3VwcyhkYXRhOiBhbnlbXSwgZ3JvdXBCeUNvbHVtbnM6IHN0cmluZ1tdKTogYW55W10ge1xuICAgIGNvbnN0IHJvb3RHcm91cCA9IG5ldyBHcm91cCgpO1xuICAgIHJvb3RHcm91cC5leHBhbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3VibGV2ZWwoZGF0YSwgMCwgZ3JvdXBCeUNvbHVtbnMsIHJvb3RHcm91cCk7XG4gIH1cblxuICBnZXRTdWJsZXZlbChkYXRhOiBhbnlbXSwgbGV2ZWw6IG51bWJlciwgZ3JvdXBCeUNvbHVtbnM6IHN0cmluZ1tdLCBwYXJlbnQ6IEdyb3VwKTogYW55W10ge1xuICAgIGlmIChsZXZlbCA+PSBncm91cEJ5Q29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBjb25zdCBncm91cHMgPSB0aGlzLnVuaXF1ZUJ5KFxuICAgICAgZGF0YS5tYXAocm93ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEdyb3VwKCk7XG4gICAgICAgIHJlc3VsdC5sZXZlbCA9IGxldmVsICsgMTtcbiAgICAgICAgcmVzdWx0LnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbGV2ZWw7IGkrKykge1xuICAgICAgICAgIHJlc3VsdFtncm91cEJ5Q29sdW1uc1tpXV0gPSByb3dbZ3JvdXBCeUNvbHVtbnNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KSxcbiAgICAgIEpTT04uc3RyaW5naWZ5XG4gICAgKTtcblxuICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSBncm91cEJ5Q29sdW1uc1tsZXZlbF07XG4gICAgbGV0IHN1Ykdyb3VwczogYW55W10gPSBbXTtcbiAgICBncm91cHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICBjb25zdCByb3dzSW5Hcm91cCA9IGRhdGEuZmlsdGVyKHJvdyA9PiBncm91cFtjdXJyZW50Q29sdW1uXSA9PT0gcm93W2N1cnJlbnRDb2x1bW5dKTtcbiAgICAgIGdyb3VwLnRvdGFsQ291bnRzID0gcm93c0luR3JvdXAubGVuZ3RoO1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSB0aGlzLmdldFN1YmxldmVsKHJvd3NJbkdyb3VwLCBsZXZlbCArIDEsIGdyb3VwQnlDb2x1bW5zLCBncm91cCk7XG4gICAgICBzdWJHcm91cC51bnNoaWZ0KGdyb3VwKTtcbiAgICAgIHN1Ykdyb3VwcyA9IHN1Ykdyb3Vwcy5jb25jYXQoc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiBzdWJHcm91cHM7XG4gIH1cblxuICB1bmlxdWVCeShhLCBrZXkpIHtcbiAgICBjb25zdCBzZWVuID0ge307XG4gICAgcmV0dXJuIGEuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgayA9IGtleShpdGVtKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXR1cm4tYXNzaWduLCBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIHJldHVybiBzZWVuLmhhc093blByb3BlcnR5KGspID8gZmFsc2UgOiAoc2VlbltrXSA9IHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgaXNHcm91cChpbmRleCwgaXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpdGVtLmxldmVsO1xuICB9XG5cbiAgX2dyb3VwSGVhZGVyQ2xpY2socm93KSB7XG4gICAgcm93LmV4cGFuZGVkID0gIXJvdy5leHBhbmRlZDtcbiAgICAvLyB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IFwiXCI7XG4gICAgdGhpcy5wZXJmRmlsdGVyID0gcGVyZm9ybWFuY2Uubm93KCkudG9TdHJpbmcoKTtcbiAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IHRoaXMucGVyZkZpbHRlcjtcbiAgfVxuXG4gIC8vIGJlbG93IGlzIGZvciBncmlkIHJvdyBncm91cGluZ1xuICBjdXN0b21GaWx0ZXJQcmVkaWNhdGUoZGF0YTogYW55IHwgR3JvdXAsIGZpbHRlcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGRhdGEgaW5zdGFuY2VvZiBHcm91cCA/IGRhdGEudmlzaWJsZSA6IHRoaXMuZ2V0RGF0YVJvd1Zpc2libGVXaXRoRmlsdGVyKGRhdGEsIGZpbHRlcik7XG4gIH1cblxuICBnZXREYXRhUm93VmlzaWJsZShkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBncm91cFJvd3MgPSB0aGlzLnJlcGVhdExpc3QkLmRhdGEuZmlsdGVyKHJvdyA9PiB7XG4gICAgICBpZiAoIShyb3cgaW5zdGFuY2VvZiBHcm91cCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgbGV0IG1hdGNoID0gdHJ1ZTtcbiAgICAgIHRoaXMuZ3JvdXBCeUNvbHVtbnMkLmZvckVhY2goY29sdW1uID0+IHtcbiAgICAgICAgaWYgKCFyb3dbY29sdW1uXSB8fCAhZGF0YVtjb2x1bW5dIHx8IHJvd1tjb2x1bW5dICE9PSBkYXRhW2NvbHVtbl0pIHtcbiAgICAgICAgICBtYXRjaCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcblxuICAgIGlmIChncm91cFJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gZ3JvdXBSb3dzWzBdIGFzIEdyb3VwO1xuICAgIHJldHVybiBwYXJlbnQudmlzaWJsZSAmJiBwYXJlbnQuZXhwYW5kZWQ7XG4gIH1cblxuICBnZXREYXRhUm93VmlzaWJsZVdpdGhGaWx0ZXIoZGF0YSwgZmlsdGVyKSB7XG4gICAgLy8gZmlzdCBjaGVjayBpZiByb3cgaXMgdmlzaWJsZSB3aXRoIGdyb3VwaW5nXG4gICAgbGV0IGJWaXNpYmxlID0gdGhpcy5nZXREYXRhUm93VmlzaWJsZShkYXRhKTtcblxuICAgIGlmIChiVmlzaWJsZSAmJiBmaWx0ZXIgJiYgZmlsdGVyICE9ICcnICYmIGZpbHRlciAhPSB0aGlzLnBlcmZGaWx0ZXIpIHtcbiAgICAgIC8vIG5vdyBjaGVjayBpZiByb3cgaXMgZmlsdGVyZWQuXG5cbiAgICAgIC8vIGFzc3VtZSBub3QgdGhlcmUgdW5sZXNzIHdlIGZpbmQgaXRcbiAgICAgIGJWaXNpYmxlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLmRpc3BsYXllZENvbHVtbnMkKSB7XG4gICAgICAgIC8vIGZpbHRlciBpcyBsb3dlciBjYXNlXG4gICAgICAgIGlmIChkYXRhW2NvbF0gJiYgZGF0YVtjb2xdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGZpbHRlcikgPj0gMCkge1xuICAgICAgICAgIGJWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiVmlzaWJsZTtcbiAgfVxuXG4gIHVwZGF0ZURhdGEobGlzdERhdGE6IGFueVtdLCBmaWVsZERhdGE6IGFueVtdKTogYW55W10ge1xuICAgIGNvbnN0IHJldHVybkxpc3Q6IGFueVtdID0gbmV3IEFycmF5PGFueT4oKTtcbiAgICBsaXN0RGF0YS5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAvLyBjb3B5XG4gICAgICBjb25zdCByb3dEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyb3cpKTtcblxuICAgICAgZm9yIChsZXQgZmllbGRJbmRleCA9IDA7IGZpZWxkSW5kZXggPCBmaWVsZERhdGEubGVuZ3RoOyBmaWVsZEluZGV4KyspIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gZmllbGREYXRhW2ZpZWxkSW5kZXhdLmNvbmZpZztcbiAgICAgICAgbGV0IGZpZWxkTmFtZTtcbiAgICAgICAgbGV0IGZvcm1hdHRlZERhdGU7XG4gICAgICAgIGxldCBteUZvcm1hdDtcbiAgICAgICAgbGV0IHRoZUN1cnJlbmN5T3B0aW9ucztcblxuICAgICAgICBzd2l0Y2ggKGZpZWxkRGF0YVtmaWVsZEluZGV4XS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgICAgICBmaWVsZE5hbWUgPSBjb25maWcubmFtZTtcbiAgICAgICAgICAgIG15Rm9ybWF0ID0gY29uZmlnLmZvcm1hdHRlcjtcbiAgICAgICAgICAgIGlmICghbXlGb3JtYXQpIHtcbiAgICAgICAgICAgICAgbXlGb3JtYXQgPSAnRGF0ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtYXR0ZWREYXRlID0gdGhpcy51dGlscy5nZW5lcmF0ZURhdGUocm93RGF0YVtmaWVsZE5hbWVdLCBteUZvcm1hdCk7XG5cbiAgICAgICAgICAgIHJvd0RhdGFbZmllbGROYW1lXSA9IGZvcm1hdHRlZERhdGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgICAgICAgICBmaWVsZE5hbWUgPSBjb25maWcubmFtZTtcbiAgICAgICAgICAgIG15Rm9ybWF0ID0gY29uZmlnLmZvcm1hdHRlcjtcbiAgICAgICAgICAgIGlmICghbXlGb3JtYXQpIHtcbiAgICAgICAgICAgICAgbXlGb3JtYXQgPSAnRGF0ZVRpbWUtTG9uZyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtYXR0ZWREYXRlID0gdGhpcy51dGlscy5nZW5lcmF0ZURhdGVUaW1lKHJvd0RhdGFbZmllbGROYW1lXSwgbXlGb3JtYXQpO1xuXG4gICAgICAgICAgICByb3dEYXRhW2ZpZWxkTmFtZV0gPSBmb3JtYXR0ZWREYXRlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnQ3VycmVuY3knOlxuICAgICAgICAgICAgZmllbGROYW1lID0gY29uZmlnLm5hbWU7XG4gICAgICAgICAgICB0aGVDdXJyZW5jeU9wdGlvbnMgPSBnZXRDdXJyZW5jeU9wdGlvbnMoUENvcmUuZ2V0RW52aXJvbm1lbnRJbmZvKCkuZ2V0TG9jYWxlKCkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jYXNlLWRlY2xhcmF0aW9uc1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIGxvY2FsZTogZ2V0TG9jYWxlKCksXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiAnYmVmb3JlJyxcbiAgICAgICAgICAgICAgZGVjUGxhY2VzOiAyXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNhc2UtZGVjbGFyYXRpb25zXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCAuLi50aGVDdXJyZW5jeU9wdGlvbnMgfTtcbiAgICAgICAgICAgIHJvd0RhdGFbZmllbGROYW1lXSA9IGZvcm1hdHRlcnMuQ3VycmVuY3kocm93RGF0YVtmaWVsZE5hbWVdLCBwYXJhbXMpO1xuICAgICAgICAgICAgLy8gdmFsID0gZm9ybWF0KHZhbHVlLCBjb2x1bW4udHlwZSwgdGhlQ3VycmVuY3lPcHRpb25zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuTGlzdC5wdXNoKHJvd0RhdGEpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJldHVybkxpc3Q7XG4gIH1cblxuICBvcGVuQXNzaWdubWVudChyb3cpIHtcbiAgICBjb25zdCB7IHB4UmVmT2JqZWN0Q2xhc3MsIHB6SW5zS2V5IH0gPSByb3c7XG4gICAgY29uc3Qgc1RhcmdldCA9IHRoaXMucENvbm4kLmdldENvbnRhaW5lck5hbWUoKTtcbiAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7IGNvbnRhaW5lck5hbWU6IHNUYXJnZXQgfTtcbiAgICB0aGlzLnBDb25uJC5nZXRBY3Rpb25zQXBpKCkub3BlbkFzc2lnbm1lbnQocHpJbnNLZXksIHB4UmVmT2JqZWN0Q2xhc3MsIG9wdGlvbnMpO1xuICB9XG5cbiAgb3Blbldvcmsocm93KSB7XG4gICAgY29uc3QgcHhSZWZPYmplY3RDbGFzcyA9IHJvdy5weFJlZk9iamVjdENsYXNzIHx8IHJvdy5weE9iakNsYXNzO1xuICAgIGNvbnN0IHsgcHhSZWZPYmplY3RLZXkgfSA9IHJvdztcbiAgICBpZiAocHhSZWZPYmplY3RDbGFzcyAhPT0gJycgJiYgcHhSZWZPYmplY3RLZXkgIT09ICcnKSB7XG4gICAgICB0aGlzLnBDb25uJC5nZXRBY3Rpb25zQXBpKCkub3BlbldvcmtCeUhhbmRsZShweFJlZk9iamVjdEtleSwgcHhSZWZPYmplY3RDbGFzcyk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6ZURhdGEoZGF0YSkge1xuICAgIGRhdGEuZm9yRWFjaCgoaXRlbSwgaWR4KSA9PiB7XG4gICAgICBpdGVtLl9fb3JpZ2luYWxfaW5kZXggPSBpZHg7XG4gICAgICBpdGVtLl9fbGV2ZWwgPSAxO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBnZXRUeXBlKGZpZWxkKSB7XG4gICAgY29uc3QgeyBjb25maWcgPSB7fSwgdHlwZSB9ID0gZmllbGQ7XG4gICAgY29uc3QgeyBmb3JtYXRUeXBlIH0gPSBjb25maWc7XG4gICAgaWYgKGZvcm1hdFR5cGUgPT09ICdkYXRldGltZScgfHwgZm9ybWF0VHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICAvLyBjdXJyZW50bHkgY29zbW9zIGhhcyBvbmx5IHN1cHBvcnQgZm9yIGRhdGUgLi4uIGl0IGFsc28gbmVlZCB0byBzdXBwb3J0IGRhdGVUaW1lXG4gICAgICByZXR1cm4gJ2RhdGUnO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBpbml0aWFsaXplQ29sdW1ucyhmaWVsZHMgPSBbXSkge1xuICAgIHJldHVybiBmaWVsZHMubWFwKChmaWVsZDogYW55LCBvcmlnaW5hbENvbEluZGV4KSA9PiAoe1xuICAgICAgLi4uZmllbGQsXG4gICAgICB0eXBlOiB0aGlzLmdldFR5cGUoZmllbGQpLFxuICAgICAgbmFtZTogZmllbGQuY29uZmlnLnZhbHVlLnN1YnN0cmluZyg0KSxcbiAgICAgIGxhYmVsOiBmaWVsZC5jb25maWcubGFiZWwuc3Vic3RyaW5nKDMpLFxuICAgICAgaWQ6IG9yaWdpbmFsQ29sSW5kZXgsXG4gICAgICBncm91cGluZ0VuYWJsZWQ6IHRydWUsXG4gICAgICBncm91cGVkOiBmYWxzZSxcbiAgICAgIG1pbldpZHRoOiA1MCxcbiAgICAgIGNlbGxSZW5kZXJlcjogdGhpcy5nZXRUeXBlKGZpZWxkKSA9PT0gJ3RleHQnID8gbnVsbCA6IGZpZWxkLnR5cGUsXG4gICAgICBmaWx0ZXI6IHRydWVcbiAgICB9KSk7XG4gIH1cblxuICBnZXRIZWFkZXJDZWxscyhjb2xGaWVsZHMsIGZpZWxkcykge1xuICAgIGNvbnN0IEFzc2lnbkRhc2hPYmplY3RzID0gWydBc3NpZ24tV29ya2xpc3QnLCAnQXNzaWduLVdvcmtCYXNrZXQnXTtcbiAgICByZXR1cm4gY29sRmllbGRzLm1hcCgoZmllbGQ6IGFueSwgaW5kZXgpID0+IHtcbiAgICAgIGxldCB0aGVGaWVsZCA9IGZpZWxkLmNvbmZpZy52YWx1ZS5zdWJzdHJpbmcoZmllbGQuY29uZmlnLnZhbHVlLmluZGV4T2YoJyAnKSArIDEpO1xuICAgICAgaWYgKHRoZUZpZWxkLmluZGV4T2YoJy4nKSA9PT0gMCkge1xuICAgICAgICB0aGVGaWVsZCA9IHRoZUZpZWxkLnN1YnN0cmluZygxKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbEluZGV4ID0gZmllbGRzLmZpbmRJbmRleChlbGUgPT4gZWxlLm5hbWUgPT09IHRoZUZpZWxkKTtcbiAgICAgIGNvbnN0IGRpc3BsYXlBc0xpbmsgPSBmaWVsZC5jb25maWcuZGlzcGxheUFzTGluaztcbiAgICAgIGNvbnN0IGhlYWRlclJvdzogYW55ID0ge307XG4gICAgICBoZWFkZXJSb3cuaWQgPSBmaWVsZHNbaW5kZXhdLmlkO1xuICAgICAgaGVhZGVyUm93LnR5cGUgPSBmaWVsZC50eXBlO1xuICAgICAgaGVhZGVyUm93LmRpc3BsYXlBc0xpbmsgPSBkaXNwbGF5QXNMaW5rO1xuICAgICAgaGVhZGVyUm93Lm51bWVyaWMgPSBmaWVsZC50eXBlID09PSAnRGVjaW1hbCcgfHwgZmllbGQudHlwZSA9PT0gJ0ludGVnZXInIHx8IGZpZWxkLnR5cGUgPT09ICdQZXJjZW50YWdlJyB8fCBmaWVsZC50eXBlID09PSAnQ3VycmVuY3knIHx8IGZhbHNlO1xuICAgICAgaGVhZGVyUm93LmRpc2FibGVQYWRkaW5nID0gZmFsc2U7XG4gICAgICBoZWFkZXJSb3cubGFiZWwgPSBmaWVsZHNbaW5kZXhdLmxhYmVsO1xuICAgICAgaWYgKGNvbEluZGV4ID4gLTEpIHtcbiAgICAgICAgaGVhZGVyUm93LmNsYXNzSUQgPSBmaWVsZHNbY29sSW5kZXhdLmNsYXNzSUQ7XG4gICAgICB9XG4gICAgICBpZiAoZGlzcGxheUFzTGluaykge1xuICAgICAgICBoZWFkZXJSb3cuaXNBc3NpZ25tZW50TGluayA9IEFzc2lnbkRhc2hPYmplY3RzLmluY2x1ZGVzKGhlYWRlclJvdy5jbGFzc0lEKTtcbiAgICAgICAgaWYgKGZpZWxkLmNvbmZpZy52YWx1ZT8uc3RhcnRzV2l0aCgnQENBJykpIHtcbiAgICAgICAgICBoZWFkZXJSb3cuaXNBc3NvY2lhdGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBoZWFkZXJSb3c7XG4gICAgfSk7XG4gIH1cblxuICBidWlsZFNlbGVjdChmaWVsZERlZnMsIGNvbElkLCBwYXRjaFF1ZXJ5RmllbGRzID0gW10sIGNvbXBvc2l0ZUtleXMgPSBbXSkge1xuICAgIGNvbnN0IGxpc3RGaWVsZHM6IGFueSA9IFtdO1xuICAgIGlmIChjb2xJZCkge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdldEZpZWxkKGZpZWxkRGVmcywgY29sSWQpO1xuICAgICAgbGlzdEZpZWxkcy5wdXNoKHtcbiAgICAgICAgZmllbGQ6IGZpZWxkLm5hbWVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOT1RFOiBJZiB3ZSBldmVyIGRlY2lkZSB0byBub3Qgc2V0IHVwIGFsbCB0aGUgYGZpZWxkRGVmc2Agb24gc2VsZWN0LCBlbnN1cmUgdGhhdCB0aGUgZmllbGRzXG4gICAgICAvLyAgY29ycmVzcG9uZGluZyB0byBgc3RhdGUuZ3JvdXBzYCBhcmUgc2V0IHVwLiBOZWVkZWQgaW4gQ2xpZW50LW1vZGUgZ3JvdXBpbmcvcGFnaW5hdGlvbi5cbiAgICAgIGZpZWxkRGVmcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgaWYgKCFsaXN0RmllbGRzLmZpbmQoZiA9PiBmLmZpZWxkID09PSBmaWVsZC5uYW1lKSkge1xuICAgICAgICAgIGxpc3RGaWVsZHMucHVzaCh7XG4gICAgICAgICAgICBmaWVsZDogZmllbGQubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHBhdGNoUXVlcnlGaWVsZHMuZm9yRWFjaChrID0+IHtcbiAgICAgICAgaWYgKCFsaXN0RmllbGRzLmZpbmQoZiA9PiBmLmZpZWxkID09PSBrKSkge1xuICAgICAgICAgIGxpc3RGaWVsZHMucHVzaCh7XG4gICAgICAgICAgICBmaWVsZDoga1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb21wb3NpdGVLZXlzLmZvckVhY2goayA9PiB7XG4gICAgICBpZiAoIWxpc3RGaWVsZHMuZmluZChmID0+IGYuZmllbGQgPT09IGspKSB7XG4gICAgICAgIGxpc3RGaWVsZHMucHVzaCh7XG4gICAgICAgICAgZmllbGQ6IGtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGxpc3RGaWVsZHM7XG4gIH1cblxuICBnZXRSZXN1bHRzVGV4dCgpIHtcbiAgICBjb25zdCByZWNvcmRzQ291bnQgPSB0aGlzLnJlcGVhdExpc3QkPy5wYWdpbmF0b3I/Lmxlbmd0aCB8fCAwO1xuICAgIHJldHVybiBgJHtyZWNvcmRzQ291bnQgfHwgMH0gcmVzdWx0JHtyZWNvcmRzQ291bnQgPiAxID8gJ3MnIDogJyd9YDtcbiAgfVxuXG4gIGdldEZpZWxkKGZpZWxkRGVmcywgY29sdW1uSWQpIHtcbiAgICBjb25zdCBmaWVsZHNNYXAgPSB0aGlzLmdldEZpZWxkc01hcChmaWVsZERlZnMpO1xuICAgIHJldHVybiBmaWVsZHNNYXAuZ2V0KGNvbHVtbklkKTtcbiAgfVxuXG4gIGdldEZpZWxkc01hcChmaWVsZERlZnMpIHtcbiAgICBjb25zdCBmaWVsZHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgZmllbGREZWZzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBmaWVsZHNNYXAuc2V0KGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWVsZHNNYXA7XG4gIH1cblxuICBhZGRJdGVtS2V5SW5TZWxlY3QoZmllbGREZWZzLCBpdGVtS2V5LCBzZWxlY3QsIGNvbXBvc2l0ZUtleXMpIHtcbiAgICBjb25zdCBlbGVtZW50Rm91bmQgPSB0aGlzLmdldEZpZWxkKGZpZWxkRGVmcywgaXRlbUtleSk7XG5cbiAgICBpZiAoXG4gICAgICBpdGVtS2V5ICYmXG4gICAgICAhZWxlbWVudEZvdW5kICYmXG4gICAgICBBcnJheS5pc0FycmF5KHNlbGVjdCkgJiZcbiAgICAgICEoY29tcG9zaXRlS2V5cyAhPT0gbnVsbCAmJiBjb21wb3NpdGVLZXlzPy5sZW5ndGgpICYmXG4gICAgICAhc2VsZWN0LmZpbmQoc2VsID0+IHNlbC5maWVsZCA9PT0gaXRlbUtleSlcbiAgICApIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAge1xuICAgICAgICAgIGZpZWxkOiBpdGVtS2V5XG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInBzZGstbGlzdC1oZWFkZXJcIj5cbiAgPGRpdj5cbiAgICA8aDMgKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwibGFiZWxcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkXCI+XG4gICAgICB7eyBsYWJlbCB9fSA8c3BhbiBjbGFzcz1cInJlc3VsdHMtY291bnRcIj57eyBnZXRSZXN1bHRzVGV4dCgpIH19PC9zcGFuPlxuICAgIDwvaDM+XG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicHNkay1zZWFyY2hcIiAqbmdJZj1cImJTaG93U2VhcmNoJFwiPlxuICAgICAgPG1hdC1sYWJlbD48aW1nIGNsYXNzPVwicHNkay1pY29uLXNlYXJjaFwiIHNyYz1cInt7IHNlYXJjaEljb24kIH19XCIgLz4gPHNwYW4gY2xhc3M9XCJwc2RrLXNlYXJjaC1sYWJlbFwiPlNlYXJjaDwvc3Bhbj4gPC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXQgbWF0SW5wdXQgaWQ9XCJzZWFyY2hcIiAoa2V5dXApPVwiYXBwbHlTZWFyY2goJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiXCIgLz5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgPGRpdiAqbmdJZj1cIiFiSW5Gb3JtJFwiIGNsYXNzPVwicHNkay1vdXRlci1kaXYtaW4tZm9ybVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBzZGstaW5uZXItZGl2LWluLWZvcm1cIiAqbmdJZj1cImJDb2x1bW5SZW9yZGVyJFwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDx0YWJsZVxuICAgICAgICAgICAgbWF0LXRhYmxlXG4gICAgICAgICAgICBpZD1cImxpc3Qtdmlld1wiXG4gICAgICAgICAgICBbZGF0YVNvdXJjZV09XCJyZXBlYXRMaXN0JFwiXG4gICAgICAgICAgICBtYXRTb3J0XG4gICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgY2RrRHJvcExpc3RPcmllbnRhdGlvbj1cImhvcml6b250YWxcIlxuICAgICAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRDb2wgb2YgZmllbGRzJFwiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5jb25maWcubmFtZVwiIHN0aWNreT1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInBzZGstbWF0LWhlYWRlclwiIChjbGljayk9XCJfaGVhZGVyU29ydENsaWNrKCRldmVudCwgZENvbClcIiBhcnJvd1Bvc2l0aW9uPVwiYmVmb3JlXCIgY2RrRHJhZz5cbiAgICAgICAgICAgICAgICB7eyBkQ29sLmNvbmZpZy5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXItZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1maWx0ZXItc3ZnLWljb25cIiBuYW1lPVwiZmlsdGVyT25JY29uXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tYXQtaGVhZGVyLWFycm93XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1hcnJvdy1zdmctaWNvblwiIGFycm93PVwibm9uZVwiIFthdHRyLmFycm93aWRdPVwiZENvbC5jb25maWcubmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbWF0LWhlYWRlci1idXR0b25cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZ3JvdXBNZW51XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IG1lbnVTdmdJY29uJCB9fVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjZ3JvdXBNZW51PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIV9zaG93VW5Hcm91cEJ5KGRDb2wpICYmIGJHcm91cGluZyRcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJfZ3JvdXBCeSgkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZ3JvdXBCeVN2Z0ljb24kIH19XCIgLz48c3Bhbj5Hcm91cCBCeTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJfc2hvd1VuR3JvdXBCeShkQ29sKSAmJiBiR3JvdXBpbmckXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX3VuR3JvdXBCeSgkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZ3JvdXBCeVN2Z0ljb24kIH19XCIgLz48c3Bhbj5Vbmdyb3VwPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJfZmlsdGVyKCRldmVudCwgZENvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBmaWx0ZXJTdmdJY29uJCB9fVwiIC8+PHNwYW4+RmlsdGVyPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBpbmRleCBhcyBpXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJfc2hvd0J1dHRvbihkQ29sLmNvbmZpZy5uYW1lLCBkQ29sKTsgZWxzZSByZWd1bGFyXCJcbiAgICAgICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiX2xpc3RWaWV3Q2xpY2soZENvbC5jb25maWcsIGVsZW1lbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBlbGVtZW50W2RDb2wuY29uZmlnLm5hbWVdIHx8ICctLS0nIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyZWd1bGFyPlxuICAgICAgICAgICAgICAgICAge3sgZWxlbWVudFtkQ29sLmNvbmZpZy5uYW1lXSB8fCAnLS0tJyB9fVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zJDsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zJFwiPjwvdHI+XG5cbiAgICAgICAgICAgIDwhLS0gR3JvdXAgaGVhZGVyIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJncm91cEhlYWRlclwiPlxuICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY29sc3Bhbj1cIjk5OVwiICptYXRDZWxsRGVmPVwibGV0IGdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZ3JvdXAuZXhwYW5kZWRcIiBbYXR0ci5zdHlsZV09XCJfZ2V0SWNvblN0eWxlKGdyb3VwLmxldmVsKVwiPmV4cGFuZF9sZXNzPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhZ3JvdXAuZXhwYW5kZWRcIiBbYXR0ci5zdHlsZV09XCJfZ2V0SWNvblN0eWxlKGdyb3VwLmxldmVsKVwiPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nXG4gICAgICAgICAgICAgICAgICA+e3sgX2dldEdyb3VwTmFtZShncm91cEJ5Q29sdW1ucyRbZ3JvdXAubGV2ZWwgLSAxXSkgfX06IHt7IGdyb3VwW2dyb3VwQnlDb2x1bW5zJFtncm91cC5sZXZlbCAtIDFdXSB9fSAoe3tcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAudG90YWxDb3VudHNcbiAgICAgICAgICAgICAgICAgIH19KTwvc3Ryb25nXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2dyb3VwSGVhZGVyJ107IHdoZW46IGlzR3JvdXBcIiAoY2xpY2spPVwiX2dyb3VwSGVhZGVyQ2xpY2socm93KVwiPjwvdHI+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLWlubmVyLWRpdi1pbi1mb3JtXCIgKm5nSWY9XCIhYkNvbHVtblJlb3JkZXIkXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHRhYmxlIG1hdC10YWJsZSBpZD1cImxpc3Qtdmlld1wiIFtkYXRhU291cmNlXT1cInJlcGVhdExpc3QkXCIgbWF0U29ydD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRDb2wgb2YgZmllbGRzJFwiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5jb25maWcubmFtZVwiIHN0aWNreT1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInBzZGstbWF0LWhlYWRlclwiIChjbGljayk9XCJfaGVhZGVyU29ydENsaWNrKCRldmVudCwgZENvbClcIiBhcnJvd1Bvc2l0aW9uPVwiYmVmb3JlXCI+XG4gICAgICAgICAgICAgICAge3sgZENvbC5jb25maWcubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tYXQtaGVhZGVyLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstZmlsdGVyLXN2Zy1pY29uXCIgbmFtZT1cImZpbHRlck9uSWNvblwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbWF0LWhlYWRlci1hcnJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstYXJyb3ctc3ZnLWljb25cIiBhcnJvdz1cIm5vbmVcIiBbYXR0ci5hcnJvd2lkXT1cImRDb2wuY29uZmlnLm5hbWVcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXItYnV0dG9uXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImdyb3VwTWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBtZW51U3ZnSWNvbiQgfX1cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI2dyb3VwTWVudT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFfc2hvd1VuR3JvdXBCeShkQ29sKSAmJiBiR3JvdXBpbmckXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX2dyb3VwQnkoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGdyb3VwQnlTdmdJY29uJCB9fVwiIC8+PHNwYW4+R3JvdXAgQnk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiX3Nob3dVbkdyb3VwQnkoZENvbCkgJiYgYkdyb3VwaW5nJFwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl91bkdyb3VwQnkoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGdyb3VwQnlTdmdJY29uJCB9fVwiIC8+PHNwYW4+VW5ncm91cDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX2ZpbHRlcigkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZmlsdGVyU3ZnSWNvbiQgfX1cIiAvPjxzcGFuPkZpbHRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgaW5kZXggYXMgaVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiX3Nob3dCdXR0b24oZENvbC5jb25maWcubmFtZSwgZENvbCk7IGVsc2UgcmVndWxhclwiXG4gICAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9saXN0Vmlld0NsaWNrKGRDb2wuY29uZmlnLCBlbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgZWxlbWVudFtkQ29sLmNvbmZpZy5uYW1lXSB8fCAnLS0tJyB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVndWxhcj5cbiAgICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbZENvbC5jb25maWcubmFtZV0gfHwgJy0tLScgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1ucyQ7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyRcIj48L3RyPlxuXG4gICAgICAgICAgICA8IS0tIEdyb3VwIGhlYWRlciAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZ3JvdXBIZWFkZXJcIj5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNvbHNwYW49XCI5OTlcIiAqbWF0Q2VsbERlZj1cImxldCBncm91cFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImdyb3VwLmV4cGFuZGVkXCIgW2F0dHIuc3R5bGVdPVwiX2dldEljb25TdHlsZShncm91cC5sZXZlbClcIj5leHBhbmRfbGVzczwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWdyb3VwLmV4cGFuZGVkXCIgW2F0dHIuc3R5bGVdPVwiX2dldEljb25TdHlsZShncm91cC5sZXZlbClcIj5leHBhbmRfbW9yZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHN0cm9uZ1xuICAgICAgICAgICAgICAgICAgPnt7IF9nZXRHcm91cE5hbWUoZ3JvdXBCeUNvbHVtbnMkW2dyb3VwLmxldmVsIC0gMV0pIH19OiB7eyBncm91cFtncm91cEJ5Q29sdW1ucyRbZ3JvdXAubGV2ZWwgLSAxXV0gfX0gKHt7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLnRvdGFsQ291bnRzXG4gICAgICAgICAgICAgICAgICB9fSk8L3N0cm9uZ1xuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydncm91cEhlYWRlciddOyB3aGVuOiBpc0dyb3VwXCIgKGNsaWNrKT1cIl9ncm91cEhlYWRlckNsaWNrKHJvdylcIj48L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImJJbkZvcm0kXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1pbm5lci1kaXYtaW4tZm9ybVwiPlxuICAgICAgICAgIDx0YWJsZSBpZD1cImxpc3Qtdmlld1wiICpuZ0lmPVwicmVwZWF0TGlzdERhdGEubGVuZ3RoID4gMFwiIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJyZXBlYXRMaXN0JFwiIG1hdFNvcnQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2luZ2xlU2VsZWN0aW9uTW9kZVwiIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxuICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBbdmFsdWVdPVwicm93W3Jvd0lEXVwiIFtjaGVja2VkXT1cInJvd1tyb3dJRF0gPT09IGNoZWNrQm94VmFsdWVcIiAoY2hhbmdlKT1cImZpZWxkT25DaGFuZ2Uocm93KVwiPjwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm11bHRpU2VsZWN0aW9uTW9kZVwiIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxuICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFt2YWx1ZV09XCJyb3dbcm93SURdXCIgW2NoZWNrZWRdPVwiaXNDaGVja2VkKHJvdylcIiAoY2hhbmdlKT1cIm9uQ2hlY2tib3hDbGljayhyb3csICRldmVudClcIj48L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZENvbCBvZiBmaWVsZHMkXCIgW21hdENvbHVtbkRlZl09XCJkQ29sLmNvbmZpZy5uYW1lXCI+XG4gICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyIChjbGljayk9XCJfaGVhZGVyU29ydENsaWNrKCRldmVudCwgZENvbClcIiBhcnJvd1Bvc2l0aW9uPVwiYmVmb3JlXCI+XG4gICAgICAgICAgICAgICAge3sgZENvbC5jb25maWcubGFiZWwgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57eyBlbGVtZW50W2RDb2wuY29uZmlnLm5hbWVdIHx8ICctLS0nIH19PC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnMkXCI+PC90cj5cbiAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zJFwiPjwvdHI+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVwZWF0TGlzdERhdGE/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgPHRhYmxlIGlkPVwibGlzdC12aWV3XCIgKm5nSWY9XCJyZXBlYXRMaXN0RGF0YT8ubGVuZ3RoID09PSAwXCIgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInJlcGVhdExpc3QkXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRDb2wgb2YgZmllbGRzJFwiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5jb25maWcubmFtZVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+e3sgZENvbC5jb25maWcubGFiZWwgfX08L3RoPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zJFwiPjwvdHI+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW5vLXJlY29yZHNcIiAqbmdJZj1cInJlcGVhdExpc3REYXRhPy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgIHt7IHV0aWxzLmdldEdlbmVyaWNGaWVsZHNMb2NhbGl6ZWRWYWx1ZSgnQ29zbW9zRmllbGRzLmZpZWxkcy5saXN0cycsICdObyByZWNvcmRzIGZvdW5kLicpIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bWF0LXBhZ2luYXRvciBpZD1cInBhZ2luYXRpb25cIiAqbmdJZj1cImJJbkZvcm0kXCIgW3BhZ2VTaXplT3B0aW9uc109XCJbMTAsIDIwLCA1MCwgMTAwLCA1MDAsIDEwMDBdXCIgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM+PC9tYXQtcGFnaW5hdG9yPlxuICAgIDxtYXQtcGFnaW5hdG9yIGlkPVwicGFnaW5hdGlvblwiICpuZ0lmPVwiIWJJbkZvcm0kXCIgW3BhZ2VTaXplT3B0aW9uc109XCJbMTAsIDIwLCA1MCwgMTAwLCA1MDBdXCIgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM+PC9tYXQtcGFnaW5hdG9yPlxuICA8L2Rpdj5cblxuICA8IS0tIHBvcCBvdmVycyBmb3IgZmlsdGVycy0tPlxuICA8ZGl2ICpuZ0lmPVwiYlNob3dGaWx0ZXJQb3BvdmVyJFwiIGNsYXNzPVwicHNkay1kaWFsb2ctYmFja2dyb3VuZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWZpbGUtdG9wXCI+XG4gICAgICA8aDQ+XG4gICAgICAgIEZpbHRlcjo8Yj4ge3sgZmlsdGVyQ29udGFpbnNMYWJlbCQgfX08L2I+XG4gICAgICA8L2g0PlxuICAgICAgPGRpdiAqbmdJZj1cImJDb250YWlucyRcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1zZWxlY3QgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVHlwZSRcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIl9maWx0ZXJDb250YWluc1R5cGUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjb250YWluc1wiPkNvbnRhaW5zPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJlcXVhbHNcIj5FcXVhbHM8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cInN0YXJ0c3dpdGhcIj5TdGFydHMgd2l0aDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCIgKGNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNWYWx1ZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiYkRhdGVUaW1lJFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8bWF0LXNlbGVjdCBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNUeXBlJFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVHlwZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm5vdGVxdWFsXCI+aXMgbm90IGVxdWFsIHRvPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJhZnRlclwiPmFmdGVyPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJiZWZvcmVcIj5iZWZvcmU8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm51bGxcIj5pcyBudWxsPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJub3RudWxsXCI+aXMgbm90IG51bGw8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImJJc0RhdGUkICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT09ICdudWxsJyAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9ICdub3RudWxsJ1wiIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD5EYXRlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgI2RhdGVJbnB1dFxuICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGVnYWRhdGVcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCJcbiAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIl9maWx0ZXJDb250YWluc0RhdGVWYWx1ZSgkZXZlbnQsIGRhdGVJbnB1dC52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwZWdhZGF0ZVwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGVnYWRhdGUgW3N0YXJ0QXRdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIj48L21hdC1kYXRlcGlja2VyPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImJJc0RhdGVUaW1lJCAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9PSAnbnVsbCcgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPSAnbm90bnVsbCdcIiBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+RGF0ZSB0aW1lPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiIChjaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zRGF0ZVRpbWVWYWx1ZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJiSXNUaW1lJCAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9PSAnbnVsbCcgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPSAnbm90bnVsbCdcIiBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+VGltZTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGltZVwiIFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiIChjaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVGltZVZhbHVlKCRldmVudClcIiAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxjb21wb25lbnQtbWFwcGVyXG4gICAgICAgIG5hbWU9XCJBY3Rpb25CdXR0b25zXCJcbiAgICAgICAgW3Byb3BzXT1cInsgYXJNYWluQnV0dG9ucyQ6IGFyRmlsdGVyTWFpbkJ1dHRvbnMkLCBhclNlY29uZGFyeUJ1dHRvbnMkOiBhckZpbHRlclNlY29uZGFyeUJ1dHRvbnMkIH1cIlxuICAgICAgICBbcGFyZW50XT1cInRoaXNcIlxuICAgICAgICBbb3V0cHV0RXZlbnRzXT1cInsgYWN0aW9uQnV0dG9uQ2xpY2s6IF9vbkZpbHRlckFjdGlvbkJ1dHRvbkNsaWNrIH1cIlxuICAgICAgPjwvY29tcG9uZW50LW1hcHBlcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==