@sumaris-net/ngx-components 4.0.0-rc8 → 18.0.0-rc1

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 (555) hide show
  1. package/README.md +5 -3
  2. package/doc/changelog.md +522 -280
  3. package/esm2022/public_api.mjs +38 -19
  4. package/esm2022/src/app/admin/admin-routing.module.mjs +10 -17
  5. package/esm2022/src/app/admin/admin.module.mjs +7 -9
  6. package/esm2022/src/app/admin/services/filter/person.filter.mjs +3 -3
  7. package/esm2022/src/app/admin/services/person.service.mjs +31 -31
  8. package/esm2022/src/app/admin/services/validator/person.validator.mjs +10 -10
  9. package/esm2022/src/app/admin/users/users.mjs +22 -19
  10. package/esm2022/src/app/admin/users/users.module.mjs +8 -10
  11. package/esm2022/src/app/core/about/about.modal.mjs +7 -7
  12. package/esm2022/src/app/core/about/about.module.mjs +8 -21
  13. package/esm2022/src/app/core/account/account.module.mjs +28 -18
  14. package/esm2022/src/app/core/account/account.page.mjs +19 -5
  15. package/esm2022/src/app/core/account/new-token.form.mjs +106 -0
  16. package/esm2022/src/app/core/account/new-token.modal.mjs +27 -86
  17. package/esm2022/src/app/core/account/password/change-password.form.mjs +60 -0
  18. package/esm2022/src/app/core/account/password/change-password.module.mjs +22 -0
  19. package/esm2022/src/app/core/account/password/change-password.page.mjs +144 -0
  20. package/esm2022/src/app/core/account/token.table.mjs +47 -35
  21. package/esm2022/src/app/core/auth/auth.form.mjs +47 -28
  22. package/esm2022/src/app/core/auth/auth.modal.mjs +6 -6
  23. package/esm2022/src/app/core/auth/auth.module.mjs +22 -13
  24. package/esm2022/src/app/core/auth/reset-password.modal.mjs +77 -0
  25. package/esm2022/src/app/core/core.module.mjs +28 -61
  26. package/esm2022/src/app/core/core.testing.module.mjs +34 -20
  27. package/esm2022/src/app/core/form/array/form-array.mjs +325 -0
  28. package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +23 -0
  29. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +94 -0
  30. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +24 -25
  31. package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +9 -13
  32. package/esm2022/src/app/core/form/entity/editor.class.mjs +64 -517
  33. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +26 -42
  34. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +42 -41
  35. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +5 -5
  36. package/esm2022/src/app/core/form/entity/entity.module.mjs +8 -14
  37. package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +194 -0
  38. package/esm2022/src/app/core/form/form-container.class.mjs +327 -0
  39. package/esm2022/src/app/core/form/form.class.mjs +39 -56
  40. package/esm2022/src/app/core/form/form.module.mjs +14 -10
  41. package/esm2022/src/app/core/form/form.utils.mjs +23 -306
  42. package/esm2022/src/app/core/form/list/list.form.mjs +16 -14
  43. package/esm2022/src/app/core/form/list/list.module.mjs +8 -12
  44. package/esm2022/src/app/core/form/properties/properties.form.mjs +139 -57
  45. package/esm2022/src/app/core/form/properties/properties.module.mjs +9 -15
  46. package/esm2022/src/app/core/form/properties/properties.table.mjs +27 -28
  47. package/esm2022/src/app/core/form/properties/properties.utils.mjs +60 -0
  48. package/esm2022/src/app/core/form/properties/property.validator.mjs +23 -9
  49. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +18 -18
  50. package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +8 -24
  51. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +15 -15
  52. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +10 -25
  53. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +7 -7
  54. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +9 -13
  55. package/esm2022/src/app/core/form/username/username.form.mjs +52 -0
  56. package/esm2022/src/app/core/form/username/username.module.mjs +20 -0
  57. package/esm2022/src/app/core/graphql/graphql.module.mjs +8 -16
  58. package/esm2022/src/app/core/graphql/graphql.service.mjs +101 -109
  59. package/esm2022/src/app/core/graphql/graphql.utils.mjs +12 -11
  60. package/esm2022/src/app/core/home/home.mjs +81 -52
  61. package/esm2022/src/app/core/home/home.module.mjs +10 -19
  62. package/esm2022/src/app/core/icon/icon.component.mjs +5 -5
  63. package/esm2022/src/app/core/icon/icon.module.mjs +8 -17
  64. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +33 -37
  65. package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +9 -13
  66. package/esm2022/src/app/core/menu/menu.component.mjs +5 -6
  67. package/esm2022/src/app/core/menu/menu.model.mjs +21 -18
  68. package/esm2022/src/app/core/menu/menu.module.mjs +7 -12
  69. package/esm2022/src/app/core/menu/menu.service.mjs +44 -60
  70. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +4 -4
  71. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +7 -6
  72. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +43 -8
  73. package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +8 -27
  74. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +6 -7
  75. package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +9 -13
  76. package/esm2022/src/app/core/peer/select-peer.modal.mjs +31 -21
  77. package/esm2022/src/app/core/peer/select-peer.module.mjs +11 -23
  78. package/esm2022/src/app/core/register/register-confirm.page.mjs +18 -16
  79. package/esm2022/src/app/core/register/register.form.mjs +7 -7
  80. package/esm2022/src/app/core/register/register.modal.mjs +6 -6
  81. package/esm2022/src/app/core/register/register.module.mjs +8 -29
  82. package/esm2022/src/app/core/services/account.service.mjs +272 -170
  83. package/esm2022/src/app/core/services/auth-guard.service.mjs +13 -15
  84. package/esm2022/src/app/core/services/base-entity-service.class.mjs +55 -64
  85. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +39 -33
  86. package/esm2022/src/app/core/services/base58.mjs +8 -4
  87. package/esm2022/src/app/core/services/config/core.config.mjs +88 -37
  88. package/esm2022/src/app/core/services/config.service.mjs +81 -62
  89. package/esm2022/src/app/core/services/crypto.service.mjs +11 -11
  90. package/esm2022/src/app/core/services/errors.mjs +6 -5
  91. package/esm2022/src/app/core/services/local-settings.service.mjs +58 -44
  92. package/esm2022/src/app/core/services/model/account.model.mjs +12 -17
  93. package/esm2022/src/app/core/services/model/config.model.mjs +7 -7
  94. package/esm2022/src/app/core/services/model/department.model.mjs +3 -2
  95. package/esm2022/src/app/core/services/model/entity.decorators.mjs +6 -6
  96. package/esm2022/src/app/core/services/model/entity.model.mjs +27 -31
  97. package/esm2022/src/app/core/services/model/filter.model.mjs +12 -15
  98. package/esm2022/src/app/core/services/model/history.model.mjs +1 -1
  99. package/esm2022/src/app/core/services/model/model.enum.mjs +2 -2
  100. package/esm2022/src/app/core/services/model/peer.model.mjs +19 -9
  101. package/esm2022/src/app/core/services/model/person.model.mjs +26 -22
  102. package/esm2022/src/app/core/services/model/referential.model.mjs +36 -23
  103. package/esm2022/src/app/core/services/model/settings.model.mjs +2 -1
  104. package/esm2022/src/app/core/services/model/token.model.mjs +7 -3
  105. package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +3 -7
  106. package/esm2022/src/app/core/services/network.service.mjs +99 -76
  107. package/esm2022/src/app/core/services/network.types.mjs +1 -1
  108. package/esm2022/src/app/core/services/network.utils.mjs +3 -3
  109. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +11 -11
  110. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +6 -6
  111. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +9 -9
  112. package/esm2022/src/app/core/services/pipes/pipes.module.mjs +54 -0
  113. package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +21 -0
  114. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +11 -11
  115. package/esm2022/src/app/core/services/platform.service.mjs +102 -69
  116. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +32 -39
  117. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +36 -45
  118. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +1 -1
  119. package/esm2022/src/app/core/services/testing/referential.validator.mjs +14 -14
  120. package/esm2022/src/app/core/services/validator/account.validator.mjs +5 -5
  121. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +5 -5
  122. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +34 -20
  123. package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +5 -5
  124. package/esm2022/src/app/core/services/validator/user-token.validator.mjs +12 -9
  125. package/esm2022/src/app/core/settings/settings.module.mjs +9 -21
  126. package/esm2022/src/app/core/settings/settings.page.mjs +76 -63
  127. package/esm2022/src/app/core/table/async-table.class.mjs +219 -201
  128. package/esm2022/src/app/core/table/column/actions-column.component.mjs +127 -0
  129. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +117 -0
  130. package/esm2022/src/app/core/table/column/row-field.component.mjs +116 -0
  131. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +31 -33
  132. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +36 -36
  133. package/esm2022/src/app/core/table/memory-table.class.mjs +5 -5
  134. package/esm2022/src/app/core/table/table-select-columns.component.mjs +8 -8
  135. package/esm2022/src/app/core/table/table.class.mjs +193 -152
  136. package/esm2022/src/app/core/table/table.model.mjs +1 -1
  137. package/esm2022/src/app/core/table/table.module.mjs +35 -24
  138. package/esm2022/src/app/core/table/table.pipes.mjs +77 -0
  139. package/esm2022/src/app/core/table/table.utils.mjs +2 -4
  140. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +9 -5
  141. package/esm2022/src/app/core/table/testing/table.testing.mjs +116 -78
  142. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +8 -33
  143. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +4 -4
  144. package/esm2022/src/app/core/table/testing/table2.testing.mjs +68 -45
  145. package/esm2022/src/app/shared/alerts.mjs +49 -45
  146. package/esm2022/src/app/shared/audio/audio.mjs +25 -27
  147. package/esm2022/src/app/shared/audio/audio.testing.mjs +5 -5
  148. package/esm2022/src/app/shared/audio/audio.testing.module.mjs +10 -25
  149. package/esm2022/src/app/shared/capacitor/keyboard.mjs +5 -5
  150. package/esm2022/src/app/shared/capacitor/plugins.mjs +1 -1
  151. package/esm2022/src/app/shared/constants.mjs +9 -4
  152. package/esm2022/src/app/shared/dates.mjs +18 -16
  153. package/esm2022/src/app/shared/debug/debug-service.class.mjs +1 -1
  154. package/esm2022/src/app/shared/debug/debug.component.mjs +5 -5
  155. package/esm2022/src/app/shared/debug/debug.module.mjs +8 -29
  156. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +8 -15
  157. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +4 -4
  158. package/esm2022/src/app/shared/directives/directives.module.mjs +8 -29
  159. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +4 -4
  160. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +4 -4
  161. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +4 -4
  162. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +4 -4
  163. package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +4 -4
  164. package/esm2022/src/app/shared/events.mjs +6 -8
  165. package/esm2022/src/app/shared/file/csv.utils.mjs +38 -18
  166. package/esm2022/src/app/shared/file/file.service.mjs +11 -15
  167. package/esm2022/src/app/shared/file/file.utils.mjs +13 -11
  168. package/esm2022/src/app/shared/file/images.utils.mjs +29 -4
  169. package/esm2022/src/app/shared/file/json.utils.mjs +11 -4
  170. package/esm2022/src/app/shared/file/uri.utils.mjs +1 -1
  171. package/esm2022/src/app/shared/focusable.mjs +1 -1
  172. package/esm2022/src/app/shared/form/field.component.mjs +69 -43
  173. package/esm2022/src/app/shared/form/field.model.mjs +4 -4
  174. package/esm2022/src/app/shared/form/loading-spinner.mjs +5 -5
  175. package/esm2022/src/app/shared/forms.mjs +116 -43
  176. package/esm2022/src/app/shared/functions.mjs +139 -71
  177. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +14 -14
  178. package/esm2022/src/app/shared/gesture/gesture-config.mjs +10 -10
  179. package/esm2022/src/app/shared/gesture/hammer.utils.mjs +1 -1
  180. package/esm2022/src/app/shared/graph/colors.utils.mjs +14 -18
  181. package/esm2022/src/app/shared/graph/graph-colors.mjs +23 -29
  182. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +4 -4
  183. package/esm2022/src/app/shared/help/help.modal.mjs +6 -6
  184. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +5 -5
  185. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +44 -17
  186. package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +9 -27
  187. package/esm2022/src/app/shared/http/http.utils.mjs +15 -11
  188. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +27 -27
  189. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +13 -10
  190. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +1 -1
  191. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +14 -17
  192. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +9 -13
  193. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +14 -11
  194. package/esm2022/src/app/shared/image/image.model.mjs +1 -1
  195. package/esm2022/src/app/shared/image/image.module.mjs +8 -13
  196. package/esm2022/src/app/shared/image/image.service.mjs +14 -12
  197. package/esm2022/src/app/shared/inputs.mjs +52 -20
  198. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +2 -3
  199. package/esm2022/src/app/shared/logging/log-level.model.mjs +1 -1
  200. package/esm2022/src/app/shared/logging/logger.model.mjs +2 -2
  201. package/esm2022/src/app/shared/logging/logging-service.class.mjs +17 -20
  202. package/esm2022/src/app/shared/logging/logging-service.module.mjs +6 -6
  203. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +7 -10
  204. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +348 -238
  205. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +13 -16
  206. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +5 -4
  207. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +51 -37
  208. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +99 -57
  209. package/esm2022/src/app/shared/material/badge/badge.module.mjs +8 -20
  210. package/esm2022/src/app/shared/material/badge/badge.test.mjs +5 -5
  211. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +19 -20
  212. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +209 -104
  213. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +15 -8
  214. package/esm2022/src/app/shared/material/chips/chips.module.mjs +12 -13
  215. package/esm2022/src/app/shared/material/chips/material.chips.mjs +228 -168
  216. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +20 -21
  217. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +12 -27
  218. package/esm2022/src/app/shared/material/datetime/material.date.mjs +167 -92
  219. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +128 -77
  220. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +297 -165
  221. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +34 -30
  222. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +31 -27
  223. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +26 -23
  224. package/esm2022/src/app/shared/material/duration/duration.module.mjs +11 -16
  225. package/esm2022/src/app/shared/material/duration/duration.utils.mjs +3 -6
  226. package/esm2022/src/app/shared/material/duration/material.duration.mjs +35 -34
  227. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +23 -22
  228. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +217 -170
  229. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +182 -241
  230. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +10 -15
  231. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +19 -14
  232. package/esm2022/src/app/shared/material/material.animations.mjs +22 -22
  233. package/esm2022/src/app/shared/material/material.config.mjs +3 -0
  234. package/esm2022/src/app/shared/material/material.module.mjs +16 -16
  235. package/esm2022/src/app/shared/material/material.testing.module.mjs +50 -37
  236. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +12 -9
  237. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +4 -4
  238. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +26 -19
  239. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +7 -11
  240. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +8 -8
  241. package/esm2022/src/app/shared/material/testing/common.test.mjs +30 -24
  242. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +30 -19
  243. package/esm2022/src/app/shared/material/text/text-form.component.mjs +128 -21
  244. package/esm2022/src/app/shared/material/text/text-form.module.mjs +8 -8
  245. package/esm2022/src/app/shared/modules.mjs +1 -1
  246. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +118 -37
  247. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +1 -1
  248. package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +5 -5
  249. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +8 -8
  250. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +74 -0
  251. package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +28 -0
  252. package/esm2022/src/app/shared/observables.mjs +14 -18
  253. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +53 -38
  254. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +24 -0
  255. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +8 -6
  256. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +8 -10
  257. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +15 -15
  258. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +6 -6
  259. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +6 -6
  260. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +6 -13
  261. package/esm2022/src/app/shared/pipes/form.pipes.mjs +72 -47
  262. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +15 -15
  263. package/esm2022/src/app/shared/pipes/html.pipes.mjs +52 -0
  264. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +14 -14
  265. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +17 -17
  266. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +37 -88
  267. package/esm2022/src/app/shared/pipes/math.pipes.mjs +16 -16
  268. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +5 -5
  269. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +6 -6
  270. package/esm2022/src/app/shared/pipes/pipes.module.mjs +117 -137
  271. package/esm2022/src/app/shared/pipes/property.pipes.mjs +86 -47
  272. package/esm2022/src/app/shared/pipes/selection.pipes.mjs +179 -0
  273. package/esm2022/src/app/shared/pipes/string.pipes.mjs +50 -49
  274. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +11 -11
  275. package/esm2022/src/app/shared/pipes/types.pipes.mjs +33 -17
  276. package/esm2022/src/app/shared/platforms.mjs +7 -5
  277. package/esm2022/src/app/shared/rx-state.module.mjs +7 -11
  278. package/esm2022/src/app/shared/services/entity-service.class.mjs +2 -2
  279. package/esm2022/src/app/shared/services/job.utils.mjs +7 -7
  280. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +43 -41
  281. package/esm2022/src/app/shared/services/progress-bar.service.mjs +4 -4
  282. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +11 -14
  283. package/esm2022/src/app/shared/services/startable-service.class.mjs +11 -17
  284. package/esm2022/src/app/shared/services/translate-context.service.mjs +18 -15
  285. package/esm2022/src/app/shared/services/validator-service.class.mjs +1 -1
  286. package/esm2022/src/app/shared/services.mjs +12 -12
  287. package/esm2022/src/app/shared/shared-routing.module.mjs +19 -18
  288. package/esm2022/src/app/shared/shared.module.mjs +29 -28
  289. package/esm2022/src/app/shared/shared.testing.module.mjs +18 -10
  290. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +39 -46
  291. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +8 -12
  292. package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +9 -17
  293. package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +10 -18
  294. package/esm2022/src/app/shared/storage/storage.service.mjs +4 -4
  295. package/esm2022/src/app/shared/storage/storage.utils.mjs +2 -2
  296. package/esm2022/src/app/shared/testing/maskito.test.mjs +41 -0
  297. package/esm2022/src/app/shared/testing/observable.test.mjs +11 -13
  298. package/esm2022/src/app/shared/testing/tests.page.mjs +6 -6
  299. package/esm2022/src/app/shared/toast/toast.testing.mjs +11 -11
  300. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +10 -25
  301. package/esm2022/src/app/shared/toast/toasts.mjs +9 -9
  302. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +10 -8
  303. package/esm2022/src/app/shared/toolbar/toolbar.mjs +31 -32
  304. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +8 -39
  305. package/esm2022/src/app/shared/types.mjs +1 -1
  306. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +12 -12
  307. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +10 -25
  308. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +7 -8
  309. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +21 -19
  310. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +2 -3
  311. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +64 -56
  312. package/esm2022/src/app/shared/validator/validators.mjs +60 -39
  313. package/esm2022/src/app/shared/version/versions.mjs +2 -2
  314. package/esm2022/src/app/social/job/job.module.mjs +8 -27
  315. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +9 -9
  316. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +49 -46
  317. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +10 -13
  318. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +1 -1
  319. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +39 -21
  320. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +6 -11
  321. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +11 -30
  322. package/esm2022/src/app/social/job/testing/job.testing.module.mjs +8 -21
  323. package/esm2022/src/app/social/message/message.form.mjs +5 -5
  324. package/esm2022/src/app/social/message/message.modal.mjs +8 -8
  325. package/esm2022/src/app/social/message/message.model.mjs +8 -8
  326. package/esm2022/src/app/social/message/message.module.mjs +4 -4
  327. package/esm2022/src/app/social/message/message.service.mjs +7 -7
  328. package/esm2022/src/app/social/social.errors.mjs +2 -2
  329. package/esm2022/src/app/social/social.module.mjs +7 -32
  330. package/esm2022/src/app/social/social.testing.module.mjs +9 -20
  331. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +27 -23
  332. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +19 -22
  333. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +47 -23
  334. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +8 -8
  335. package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +8 -21
  336. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +27 -15
  337. package/esm2022/src/app/social/user-event/user-event.model.mjs +1 -1
  338. package/esm2022/src/app/social/user-event/user-event.module.mjs +8 -28
  339. package/esm2022/src/app/social/user-event/user-event.service.mjs +61 -64
  340. package/esm2022/src/environments/environment.class.mjs +9 -1
  341. package/esm2022/src/environments/environment.loader.mjs +5 -11
  342. package/esm2022/src/environments/environment.mjs +19 -11
  343. package/fesm2022/sumaris-net.ngx-components.mjs +16117 -14592
  344. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  345. package/package.json +36 -18
  346. package/public_api.d.ts +30 -22
  347. package/src/app/admin/services/filter/person.filter.d.ts +1 -1
  348. package/src/app/admin/users/users.d.ts +5 -6
  349. package/src/app/core/account/account.module.d.ts +10 -8
  350. package/src/app/core/account/account.page.d.ts +25 -15
  351. package/src/app/core/account/new-token.form.d.ts +29 -0
  352. package/src/app/core/account/new-token.modal.d.ts +9 -21
  353. package/src/app/core/account/password/change-password.form.d.ts +19 -0
  354. package/src/app/core/account/password/change-password.module.d.ts +11 -0
  355. package/src/app/core/account/password/change-password.page.d.ts +36 -0
  356. package/src/app/core/account/token.table.d.ts +7 -5
  357. package/src/app/core/auth/auth.form.d.ts +11 -9
  358. package/src/app/core/auth/auth.module.d.ts +6 -4
  359. package/src/app/core/auth/reset-password.modal.d.ts +26 -0
  360. package/src/app/core/core.module.d.ts +21 -24
  361. package/src/app/core/core.testing.module.d.ts +2 -1
  362. package/src/app/core/form/array/form-array.d.ts +136 -0
  363. package/src/app/core/form/array/testing/form-array-test.module.d.ts +12 -0
  364. package/src/app/core/form/array/testing/form-array.test.d.ts +26 -0
  365. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +2 -3
  366. package/src/app/core/form/entity/editor.class.d.ts +19 -179
  367. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +10 -13
  368. package/src/app/core/form/entity/entity-editor.class.d.ts +12 -17
  369. package/src/app/core/form/entity/entity-metadata.component.d.ts +1 -1
  370. package/src/app/core/form/entity/tab-editor.class.d.ts +70 -0
  371. package/src/app/core/form/form-container.class.d.ts +126 -0
  372. package/src/app/core/form/form.class.d.ts +13 -26
  373. package/src/app/core/form/form.module.d.ts +2 -1
  374. package/src/app/core/form/form.utils.d.ts +60 -145
  375. package/src/app/core/form/list/list.form.d.ts +2 -2
  376. package/src/app/core/form/properties/properties.form.d.ts +34 -12
  377. package/src/app/core/form/properties/properties.table.d.ts +2 -2
  378. package/src/app/core/form/properties/properties.utils.d.ts +27 -0
  379. package/src/app/core/form/properties/property.validator.d.ts +9 -3
  380. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +3 -1
  381. package/src/app/core/form/username/username.form.d.ts +19 -0
  382. package/src/app/core/form/username/username.module.d.ts +9 -0
  383. package/src/app/core/graphql/graphql.module.d.ts +1 -2
  384. package/src/app/core/graphql/graphql.service.d.ts +2 -4
  385. package/src/app/core/home/home.d.ts +26 -6
  386. package/src/app/core/menu/testing/menu-other.testing.d.ts +1 -1
  387. package/src/app/core/menu/testing/menu.testing.d.ts +11 -3
  388. package/src/app/core/peer/select-peer.modal.d.ts +13 -7
  389. package/src/app/core/peer/select-peer.module.d.ts +3 -4
  390. package/src/app/core/services/account.service.d.ts +9 -0
  391. package/src/app/core/services/base-entity-service.class.d.ts +1 -1
  392. package/src/app/core/services/config/core.config.d.ts +12 -1
  393. package/src/app/core/services/config.service.d.ts +4 -3
  394. package/src/app/core/services/errors.d.ts +11 -0
  395. package/src/app/core/services/local-settings.service.d.ts +8 -4
  396. package/src/app/core/services/model/entity.model.d.ts +6 -5
  397. package/src/app/core/services/model/filter.model.d.ts +1 -1
  398. package/src/app/core/services/model/peer.model.d.ts +1 -0
  399. package/src/app/core/services/model/person.model.d.ts +6 -2
  400. package/src/app/core/services/model/referential.model.d.ts +8 -3
  401. package/src/app/core/services/model/settings.model.d.ts +4 -2
  402. package/src/app/core/services/model/token.model.d.ts +1 -0
  403. package/src/app/core/services/model/tree-item-entity.model.d.ts +1 -1
  404. package/src/app/core/services/network.service.d.ts +11 -7
  405. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +1 -1
  406. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +3 -1
  407. package/src/app/core/services/pipes/pipes.module.d.ts +11 -0
  408. package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +13 -0
  409. package/src/app/core/services/platform.service.d.ts +8 -3
  410. package/src/app/core/services/testing/referential-filter.model.d.ts +1 -1
  411. package/src/app/core/services/validator/local-settings.validator.d.ts +6 -2
  412. package/src/app/core/settings/settings.module.d.ts +2 -1
  413. package/src/app/core/settings/settings.page.d.ts +34 -21
  414. package/src/app/core/table/async-table.class.d.ts +22 -17
  415. package/src/app/core/table/column/actions-column.component.d.ts +59 -0
  416. package/src/app/core/table/column/nav-actions-column.component.d.ts +46 -0
  417. package/src/app/core/table/column/row-field.component.d.ts +40 -0
  418. package/src/app/core/table/entities-async-table-datasource.class.d.ts +1 -0
  419. package/src/app/core/table/entities-table-datasource.class.d.ts +1 -0
  420. package/src/app/core/table/table.class.d.ts +14 -11
  421. package/src/app/core/table/table.module.d.ts +8 -4
  422. package/src/app/core/table/table.pipes.d.ts +28 -0
  423. package/src/app/core/table/testing/table.testing.d.ts +12 -13
  424. package/src/app/core/table/testing/table2.testing.d.ts +13 -10
  425. package/src/app/shared/alerts.d.ts +4 -2
  426. package/src/app/shared/constants.d.ts +5 -0
  427. package/src/app/shared/dates.d.ts +12 -5
  428. package/src/app/shared/directives/autofocus.directive.d.ts +0 -1
  429. package/src/app/shared/events.d.ts +1 -1
  430. package/src/app/shared/file/csv.utils.d.ts +5 -0
  431. package/src/app/shared/file/images.utils.d.ts +17 -0
  432. package/src/app/shared/file/json.utils.d.ts +3 -0
  433. package/src/app/shared/form/field.component.d.ts +6 -3
  434. package/src/app/shared/forms.d.ts +32 -0
  435. package/src/app/shared/functions.d.ts +27 -8
  436. package/src/app/shared/graph/graph-colors.d.ts +1 -1
  437. package/src/app/shared/guard/component-dirty.guard.d.ts +1 -6
  438. package/src/app/shared/hotkeys/hotkeys.service.d.ts +17 -3
  439. package/src/app/shared/http/http.utils.d.ts +1 -0
  440. package/src/app/shared/image/gallery/image-gallery.component.d.ts +10 -10
  441. package/src/app/shared/image/gallery/image-gallery.module.d.ts +2 -1
  442. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +2 -2
  443. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +2 -1
  444. package/src/app/shared/inputs.d.ts +8 -6
  445. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +20 -1
  446. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +56 -16
  447. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +1 -1
  448. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +2 -1
  449. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +3 -2
  450. package/src/app/shared/material/badge/badge.directive.d.ts +10 -4
  451. package/src/app/shared/material/boolean/boolean.module.d.ts +15 -14
  452. package/src/app/shared/material/boolean/material.boolean.d.ts +51 -25
  453. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +1 -0
  454. package/src/app/shared/material/chips/chips.module.d.ts +2 -1
  455. package/src/app/shared/material/chips/material.chips.d.ts +46 -21
  456. package/src/app/shared/material/chips/testing/chips.test.d.ts +1 -0
  457. package/src/app/shared/material/datetime/datetime.module.d.ts +1 -1
  458. package/src/app/shared/material/datetime/material.date.d.ts +33 -18
  459. package/src/app/shared/material/datetime/material.dateshort.d.ts +29 -16
  460. package/src/app/shared/material/datetime/material.datetime.d.ts +41 -28
  461. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +3 -3
  462. package/src/app/shared/material/duration/duration.module.d.ts +1 -1
  463. package/src/app/shared/material/duration/material.duration.d.ts +1 -1
  464. package/src/app/shared/material/latlong/latlong.utils.d.ts +9 -1
  465. package/src/app/shared/material/latlong/material.latlong.d.ts +29 -32
  466. package/src/app/shared/material/latlong/material.latlong.module.d.ts +1 -1
  467. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +5 -1
  468. package/src/app/shared/material/material.config.d.ts +3 -0
  469. package/src/app/shared/material/material.module.d.ts +5 -6
  470. package/src/app/shared/material/material.testing.module.d.ts +8 -7
  471. package/src/app/shared/material/swipe/material.swipe.d.ts +4 -3
  472. package/src/app/shared/material/text/testing/text-form.testing.d.ts +10 -4
  473. package/src/app/shared/material/text/text-form.component.d.ts +42 -8
  474. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +30 -14
  475. package/src/app/shared/named-filter/named-filter.service.d.ts +12 -6
  476. package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +34 -0
  477. package/src/app/shared/named-filter/testing/named-filter.testing.module.d.ts +10 -0
  478. package/src/app/shared/pipes/arrays.pipe.d.ts +5 -0
  479. package/src/app/shared/pipes/badge.pipes.d.ts +7 -0
  480. package/src/app/shared/pipes/date-format.pipe.d.ts +3 -2
  481. package/src/app/shared/pipes/form.pipes.d.ts +18 -8
  482. package/src/app/shared/pipes/html.pipes.d.ts +15 -0
  483. package/src/app/shared/pipes/maps.pipe.d.ts +4 -4
  484. package/src/app/shared/pipes/maskito.pipe.d.ts +7 -9
  485. package/src/app/shared/pipes/pipes.module.d.ts +7 -4
  486. package/src/app/shared/pipes/property.pipes.d.ts +24 -3
  487. package/src/app/shared/pipes/selection.pipes.d.ts +62 -0
  488. package/src/app/shared/pipes/string.pipes.d.ts +6 -6
  489. package/src/app/shared/pipes/types.pipes.d.ts +6 -1
  490. package/src/app/shared/services/entity-service.class.d.ts +0 -2
  491. package/src/app/shared/services/memory-entity-service.class.d.ts +6 -3
  492. package/src/app/shared/services.d.ts +1 -0
  493. package/src/app/shared/shared.testing.module.d.ts +2 -1
  494. package/src/app/shared/storage/storage-explorer.component.d.ts +4 -3
  495. package/src/app/shared/testing/maskito.test.d.ts +10 -0
  496. package/src/app/shared/toolbar/toolbar.d.ts +7 -2
  497. package/src/app/shared/types.d.ts +5 -0
  498. package/src/app/shared/upload-file/upload-file.component.d.ts +1 -0
  499. package/src/app/shared/validator/form-error-adapter.class.d.ts +17 -11
  500. package/src/app/shared/validator/validators.d.ts +20 -9
  501. package/src/app/social/job/progression/job-progression.icon.d.ts +4 -5
  502. package/src/app/social/job/progression/job-progression.list.d.ts +1 -3
  503. package/src/app/social/job/progression/job-progression.service.d.ts +3 -4
  504. package/src/app/social/job/testing/job-progression.testing.d.ts +0 -1
  505. package/src/app/social/job/testing/job-progression.testing.service.d.ts +3 -11
  506. package/src/app/social/message/message.modal.d.ts +2 -2
  507. package/src/app/social/message/message.model.d.ts +1 -1
  508. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -4
  509. package/src/app/social/user-event/testing/user-event.testing.d.ts +1 -0
  510. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +2 -3
  511. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +1 -0
  512. package/src/assets/i18n/en-US.json +48 -19
  513. package/src/assets/i18n/en.json +48 -20
  514. package/src/assets/i18n/fr.json +50 -20
  515. package/src/assets/manifest.json +1 -1
  516. package/src/environments/environment.class.d.ts +10 -0
  517. package/src/environments/environment.d.ts +0 -1
  518. package/src/environments/environment.loader.d.ts +0 -2
  519. package/src/theme/_functions.scss +15 -0
  520. package/src/theme/_icons.scss +1 -1
  521. package/src/theme/_ionic.globals.scss +8 -2
  522. package/src/theme/_ionic.scss +10 -10
  523. package/src/theme/_material.globals.scss +16 -43
  524. package/src/theme/_material.scss +45 -32
  525. package/src/theme/_mixins.scss +99 -18
  526. package/src/theme/_ngx-components.forms.scss +354 -0
  527. package/src/theme/_ngx-components.globals.scss +20 -10
  528. package/src/theme/_ngx-components.scss +194 -400
  529. package/src/theme/_ngx-components.table.scss +200 -207
  530. package/src/theme/_ngx-components.tabs.scss +54 -0
  531. package/src/theme/_responsive.scss +0 -31
  532. package/src/theme/_theme.scss +2 -0
  533. package/src/theme/_theme.variables.scss +172 -0
  534. package/esm2022/src/app/core/table/actions-column.component.mjs +0 -115
  535. package/esm2022/src/app/shared/material/boolean/material-boolean2.mjs +0 -266
  536. package/esm2022/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +0 -104
  537. package/esm2022/src/app/shared/material/numpad/numpad.component.mjs +0 -83
  538. package/esm2022/src/app/shared/material/numpad/numpad.container.mjs +0 -203
  539. package/esm2022/src/app/shared/material/numpad/numpad.content.mjs +0 -19
  540. package/esm2022/src/app/shared/material/numpad/numpad.directive.mjs +0 -168
  541. package/esm2022/src/app/shared/material/numpad/numpad.dom-service.mjs +0 -36
  542. package/esm2022/src/app/shared/material/numpad/numpad.model.mjs +0 -16
  543. package/esm2022/src/app/shared/material/numpad/numpad.module.mjs +0 -60
  544. package/esm2022/src/app/shared/material/numpad/testing/numpad.test.mjs +0 -48
  545. package/src/app/core/table/actions-column.component.d.ts +0 -48
  546. package/src/app/shared/material/boolean/material-boolean2.d.ts +0 -66
  547. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +0 -22
  548. package/src/app/shared/material/numpad/numpad.component.d.ts +0 -26
  549. package/src/app/shared/material/numpad/numpad.container.d.ts +0 -40
  550. package/src/app/shared/material/numpad/numpad.content.d.ts +0 -7
  551. package/src/app/shared/material/numpad/numpad.directive.d.ts +0 -35
  552. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +0 -16
  553. package/src/app/shared/material/numpad/numpad.model.d.ts +0 -30
  554. package/src/app/shared/material/numpad/numpad.module.d.ts +0 -16
  555. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +0 -13
@@ -15,6 +15,7 @@ import { fromDateISOString } from '../../shared/dates';
15
15
  import { firstNotNilPromise } from '../../shared/observables';
16
16
  import { debounceTime, filter, map, switchMap } from 'rxjs/operators';
17
17
  import { Toasts } from '../../shared/toast/toasts';
18
+ import { UserToken } from './model/token.model';
18
19
  import * as i0 from "@angular/core";
19
20
  import * as i1 from "./network.service";
20
21
  import * as i2 from "../graphql/graphql.service";
@@ -57,113 +58,144 @@ const Fragments = {
57
58
  __typename
58
59
  }
59
60
  __typename
60
- }`,
61
- settings: gql `fragment UserSettingsFragment on UserSettingsVO {
62
- id
63
- locale
64
- latLongFormat
65
- content
66
- nonce
67
- updateDate
68
- __typename
69
- }`,
70
- token: gql `fragment UserTokenFragment on UserTokenVO {
71
- id
72
- pubkey
73
- token
74
- name
75
- flags
76
- expirationDate
77
- lastUsedDate
78
- creationDate
79
- updateDate
80
- __typename
81
- }`
61
+ }
62
+ `,
63
+ settings: gql `
64
+ fragment UserSettingsFragment on UserSettingsVO {
65
+ id
66
+ locale
67
+ latLongFormat
68
+ content
69
+ nonce
70
+ updateDate
71
+ __typename
72
+ }
73
+ `,
74
+ token: gql `
75
+ fragment UserTokenFragment on UserTokenVO {
76
+ id
77
+ pubkey
78
+ name
79
+ flags
80
+ expirationDate
81
+ lastUsedDate
82
+ creationDate
83
+ updateDate
84
+ __typename
85
+ }
86
+ `,
82
87
  };
83
88
  // Account queries
84
89
  const Queries = {
85
- load: gql `query Account {
86
- data: account {
87
- ...AccountFragment
90
+ load: gql `
91
+ query Account {
92
+ data: account {
93
+ ...AccountFragment
94
+ }
88
95
  }
89
- }
90
- ${Fragments.account}
91
- ${Fragments.settings}`,
92
- loadWithTokens: gql `query AccountWithToken {
93
- data: account {
94
- ...AccountFragment
95
- tokens {
96
- ...UserTokenFragment
96
+ ${Fragments.account}
97
+ ${Fragments.settings}
98
+ `,
99
+ loadWithTokens: gql `
100
+ query AccountWithToken {
101
+ data: account {
102
+ ...AccountFragment
103
+ tokens {
104
+ ...UserTokenFragment
105
+ }
97
106
  }
98
107
  }
99
- }
100
- ${Fragments.account}
101
- ${Fragments.settings}
102
- ${Fragments.token}`,
108
+ ${Fragments.account}
109
+ ${Fragments.settings}
110
+ ${Fragments.token}
111
+ `,
103
112
  };
104
113
  // Check email query
105
114
  const IsEmailExistsQuery = gql `
106
- query IsEmailExists($email: String, $hash: String){
115
+ query IsEmailExists($email: String, $hash: String) {
107
116
  isEmailExists(email: $email, hash: $hash)
108
117
  }
109
118
  `;
110
119
  // Account mutations
111
120
  const Mutations = {
112
- save: gql ` mutation SaveAccount($data:AccountVOInput){
113
- data: saveAccount(account: $data){
114
- ...AccountFragment
121
+ save: gql `
122
+ mutation SaveAccount($data: AccountVOInput) {
123
+ data: saveAccount(account: $data) {
124
+ ...AccountFragment
125
+ }
115
126
  }
116
- }
117
- ${Fragments.account}
118
- ${Fragments.settings}`,
119
- saveWithTokens: gql ` mutation SaveAccountWithTokens($data:AccountVOInput){
120
- data: saveAccount(account: $data){
121
- ...AccountFragment
122
- tokens {
123
- ...UserTokenFragment
127
+ ${Fragments.account}
128
+ ${Fragments.settings}
129
+ `,
130
+ saveWithTokens: gql `
131
+ mutation SaveAccountWithTokens($data: AccountVOInput) {
132
+ data: saveAccount(account: $data) {
133
+ ...AccountFragment
134
+ tokens {
135
+ ...UserTokenFragment
136
+ }
124
137
  }
125
138
  }
126
- }
127
- ${Fragments.account}
128
- ${Fragments.settings}
129
- ${Fragments.token}`,
130
- create: gql `mutation CreateAccount($data:AccountVOInput){
131
- data: createAccount(account: $data){
132
- ...AccountFragment
139
+ ${Fragments.account}
140
+ ${Fragments.settings}
141
+ ${Fragments.token}
142
+ `,
143
+ create: gql `
144
+ mutation CreateAccount($data: AccountVOInput) {
145
+ data: createAccount(account: $data) {
146
+ ...AccountFragment
147
+ }
133
148
  }
134
- }
135
- ${Fragments.account}
136
- ${Fragments.settings}
149
+ ${Fragments.account}
150
+ ${Fragments.settings}
137
151
  `,
138
- saveSettings: gql `mutation SaveSettings($data:UserSettingsVOInput){
139
- data: saveSettings(settings: $data){
140
- ...UserSettingsFragment
152
+ saveSettings: gql `
153
+ mutation SaveSettings($data: UserSettingsVOInput) {
154
+ data: saveSettings(settings: $data) {
155
+ ...UserSettingsFragment
156
+ }
141
157
  }
142
- }
143
- ${Fragments.settings}`
158
+ ${Fragments.settings}
159
+ `,
144
160
  };
145
161
  // Sent confirmation email
146
- const SendConfirmEmailMutation = gql `
147
- mutation sendAccountConfirmationEmail($email:String, $locale:String){
148
- sendAccountConfirmationEmail(email: $email, locale: $locale)
162
+ const SendConfirmEmailQuery = gql `
163
+ query sendAccountConfirmationEmail($email: String, $locale: String) {
164
+ data: sendAccountConfirmationEmail(email: $email, locale: $locale)
149
165
  }
150
166
  `;
151
167
  // Confirm account email
152
- const ConfirmEmailMutation = gql `
153
- mutation confirmAccountEmail($email:String, $code:String){
154
- confirmAccountEmail(email: $email, code: $code)
168
+ const ConfirmEmailQuery = gql `
169
+ query confirmAccountEmail($email: String, $code: String) {
170
+ data: confirmAccountEmail(email: $email, code: $code)
171
+ }
172
+ `;
173
+ // Send email to reset password
174
+ const SendResetPasswordEmailQuery = gql `
175
+ query SendResetPasswordEmail($username: String!, $locale: String!) {
176
+ sendResetPasswordEmail(username: $username, locale: $locale)
177
+ }
178
+ `;
179
+ const ResetAccountPubkeyQuery = gql `
180
+ query ResetPubkey($username: String!, $token: String!) {
181
+ data: resetAccountPubkey(username: $username, token: $token)
182
+ }
183
+ `;
184
+ const UpdatePubKeyQuery = gql `
185
+ query UpdateAccountPubkey($pubkey: String!) {
186
+ data: updateAccountPubkey(pubkey: $pubkey)
155
187
  }
156
188
  `;
157
189
  // Authentication query
158
190
  const AuthQuery = gql `
159
- query Auth($token: String){
191
+ query Auth($token: String) {
160
192
  authenticate(token: $token)
161
193
  }
162
194
  `;
163
195
  // New auth challenge query
164
196
  const AuthChallengeQuery = gql `
165
- query AuthChallenge{
166
- authChallenge{
197
+ query AuthChallenge {
198
+ authChallenge {
167
199
  challenge
168
200
  pubkey
169
201
  signature
@@ -171,12 +203,14 @@ const AuthChallengeQuery = gql `
171
203
  }
172
204
  `;
173
205
  const AccountSubscriptions = {
174
- listenChanges: gql `subscription updateAccount($interval: Int){
175
- data: updateAccount(interval: $interval) {
176
- id
177
- updateDate
206
+ listenChanges: gql `
207
+ subscription updateAccount($interval: Int) {
208
+ data: updateAccount(interval: $interval) {
209
+ id
210
+ updateDate
211
+ }
178
212
  }
179
- }`
213
+ `,
180
214
  };
181
215
  export class AccountService extends BaseGraphqlService {
182
216
  network;
@@ -188,6 +222,7 @@ export class AccountService extends BaseGraphqlService {
188
222
  toastController;
189
223
  environment;
190
224
  onLogin = new Subject();
225
+ onWillLogout = new Subject();
191
226
  onLogout = new Subject();
192
227
  onChange = new Subject();
193
228
  onAuthTokenChange = new BehaviorSubject(undefined);
@@ -203,7 +238,7 @@ export class AccountService extends BaseGraphqlService {
203
238
  pubkey: null,
204
239
  mainProfile: null,
205
240
  person: null,
206
- department: null
241
+ department: null,
207
242
  };
208
243
  _optionDefs;
209
244
  _$additionalFields = new BehaviorSubject([]);
@@ -254,7 +289,7 @@ export class AccountService extends BaseGraphqlService {
254
289
  this.translate = translate;
255
290
  this.toastController = toastController;
256
291
  this.environment = environment;
257
- this._enableListenChanges = (!environment.account || environment.account.enableListenChanges !== false); // True by default
292
+ this._enableListenChanges = !environment.account || environment.account.enableListenChanges !== false; // True by default
258
293
  this._listenIntervalInSeconds = toNumber(environment.account && environment.account.listenIntervalInSeconds, 0); // no timer by default
259
294
  this._debug = !environment.production;
260
295
  if (this._debug)
@@ -279,7 +314,7 @@ export class AccountService extends BaseGraphqlService {
279
314
  await Promise.all([
280
315
  this.settings.ready(),
281
316
  // Wait token type to be set
282
- firstNotNilPromise(this._tokenType$)
317
+ firstNotNilPromise(this._tokenType$, { stop: this.stopSubject }),
283
318
  ]);
284
319
  // Listen graphql start (or restart)
285
320
  this.registerSubscription(this.graphql.stopSubject.subscribe(() => {
@@ -314,8 +349,7 @@ export class AccountService extends BaseGraphqlService {
314
349
  }
315
350
  hasMinProfile(userProfile) {
316
351
  // should be login, and status ENABLE or TEMPORARY
317
- if (!this._data || !this._data.pubkey ||
318
- (this._data.statusId !== StatusIds.ENABLE && this._data.statusId !== StatusIds.TEMPORARY)) {
352
+ if (!this._data || !this._data.pubkey || (this._data.statusId !== StatusIds.ENABLE && this._data.statusId !== StatusIds.TEMPORARY)) {
319
353
  return false;
320
354
  }
321
355
  return PersonUtils.hasUpperOrEqualsProfile(this._data.profiles, userProfile);
@@ -344,8 +378,7 @@ export class AccountService extends BaseGraphqlService {
344
378
  }
345
379
  isOnlyGuest() {
346
380
  // Should be login, and status ENABLE or TEMPORARY
347
- if (!this._data || !this._data.pubkey ||
348
- (this._data.statusId !== StatusIds.ENABLE && this._data.statusId !== StatusIds.TEMPORARY))
381
+ if (!this._data || !this._data.pubkey || (this._data.statusId !== StatusIds.ENABLE && this._data.statusId !== StatusIds.TEMPORARY))
349
382
  return false;
350
383
  // Profile less then user
351
384
  return !PersonUtils.hasUpperOrEqualsProfile(this._data.profiles, 'USER');
@@ -394,7 +427,7 @@ export class AccountService extends BaseGraphqlService {
394
427
  this._cache.keypair = keypair;
395
428
  const account = await this.saveRemotely(data.account, keypair);
396
429
  // Default values
397
- account.avatar = account.avatar || (this.environment.baseUrl + DEFAULT_AVATAR_IMAGE);
430
+ account.avatar = account.avatar || this.environment.baseUrl + DEFAULT_AVATAR_IMAGE;
398
431
  this._cache.mainProfile = PersonUtils.getMainProfile(account.profiles);
399
432
  this._data = account;
400
433
  this._cache.pubkey = account.pubkey;
@@ -412,7 +445,7 @@ export class AccountService extends BaseGraphqlService {
412
445
  return this._data;
413
446
  }
414
447
  catch (error) {
415
- console.error(error && error.message || error);
448
+ console.error((error && error.message) || error);
416
449
  this.resetData();
417
450
  throw error;
418
451
  }
@@ -469,7 +502,7 @@ export class AccountService extends BaseGraphqlService {
469
502
  this._cache.keypair = keypair;
470
503
  // Try to load previous token
471
504
  let previousToken = await this.storage.get(TOKEN_STORAGE_KEY);
472
- previousToken = previousToken && previousToken.startsWith(this._cache.pubkey) && previousToken || null;
505
+ previousToken = (previousToken && previousToken.startsWith(this._cache.pubkey) && previousToken) || null;
473
506
  // Offline mode
474
507
  const offline = this.settings.hasOfflineFeature() && (this.network.offline || data.offline === true);
475
508
  if (offline) {
@@ -496,7 +529,7 @@ export class AccountService extends BaseGraphqlService {
496
529
  }
497
530
  catch (err) {
498
531
  // If account not found, check if email is valid
499
- if (err && +(err.code) === ErrorCodes.LOAD_ACCOUNT_ERROR) {
532
+ if (err && +err.code === ErrorCodes.LOAD_ACCOUNT_ERROR) {
500
533
  // Check email exists
501
534
  if (data.username.indexOf('@') !== -1) {
502
535
  let isEmailExists;
@@ -576,9 +609,12 @@ export class AccountService extends BaseGraphqlService {
576
609
  return Promise.reject('Not user account');
577
610
  account = await this.saveRemotely(account, this._cache.keypair);
578
611
  // Set defaults
579
- account.avatar = account.avatar || (this.environment.baseUrl + DEFAULT_AVATAR_IMAGE);
612
+ account.avatar = account.avatar || this.environment.baseUrl + DEFAULT_AVATAR_IMAGE;
580
613
  this._cache.mainProfile = PersonUtils.getMainProfile(account.profiles);
581
614
  this._data = account;
615
+ // Update cache
616
+ this._cache.person = account.asPerson();
617
+ this._cache.department = this._cache.person.department;
582
618
  this._cache.loaded = true;
583
619
  // Save locally (in storage)
584
620
  await this.saveLocally();
@@ -591,6 +627,8 @@ export class AccountService extends BaseGraphqlService {
591
627
  const hadAuthToken = this._cache.authToken && true;
592
628
  const hadAuthBasic = this._cache.authBasic && true;
593
629
  const pubkey = this._cache && this._cache.pubkey;
630
+ // Notify observers
631
+ this.onWillLogout.next(this.account);
594
632
  this.resetData();
595
633
  if (!this.settings.hasOfflineFeature()) {
596
634
  // Remove all data from the local storage
@@ -598,8 +636,8 @@ export class AccountService extends BaseGraphqlService {
598
636
  this.storage.remove(PUBKEY_STORAGE_KEY),
599
637
  this.storage.remove(TOKEN_STORAGE_KEY),
600
638
  this.storage.remove(ACCOUNT_STORAGE_KEY),
601
- pubkey && this.storage.remove(ACCOUNT_STORAGE_KEY + '#' + pubkey) || Promise.resolve(),
602
- this.storage.remove(SECKEY_STORAGE_KEY)
639
+ (pubkey && this.storage.remove(ACCOUNT_STORAGE_KEY + '#' + pubkey)) || Promise.resolve(),
640
+ this.storage.remove(SECKEY_STORAGE_KEY),
603
641
  ]);
604
642
  }
605
643
  // Offline features enable: need to keep some data
@@ -608,11 +646,7 @@ export class AccountService extends BaseGraphqlService {
608
646
  // But keep:
609
647
  // - account by pubkey
610
648
  // - auth token
611
- await Promise.all([
612
- this.storage.remove(PUBKEY_STORAGE_KEY),
613
- this.storage.remove(ACCOUNT_STORAGE_KEY),
614
- this.storage.remove(SECKEY_STORAGE_KEY)
615
- ]);
649
+ await Promise.all([this.storage.remove(PUBKEY_STORAGE_KEY), this.storage.remove(ACCOUNT_STORAGE_KEY), this.storage.remove(SECKEY_STORAGE_KEY)]);
616
650
  }
617
651
  // Clean page history, in local settings
618
652
  await this.settings.clearPageHistory();
@@ -635,16 +669,15 @@ export class AccountService extends BaseGraphqlService {
635
669
  console.debug(`[account] Loading account...`);
636
670
  let json;
637
671
  // Load locally
638
- const offline = this.network.offline
639
- && (!opts || (opts.fetchPolicy !== 'network-only' && opts.fetchPolicy !== 'no-cache'))
640
- || (opts && opts.offline === true);
672
+ const offline = (this.network.offline && (!opts || (opts.fetchPolicy !== 'network-only' && opts.fetchPolicy !== 'no-cache'))) ||
673
+ (opts && opts.offline === true);
641
674
  if (offline) {
642
675
  json = await this.storage.get(ACCOUNT_STORAGE_KEY);
643
- json = json && (typeof json === 'string') && JSON.parse(json) || json;
644
- json = json && this._cache.pubkey && (json.pubkey === this._cache.pubkey) && json || null;
676
+ json = (json && typeof json === 'string' && JSON.parse(json)) || json;
677
+ json = (json && this._cache.pubkey && json.pubkey === this._cache.pubkey && json) || null;
645
678
  if (!json && this._cache.pubkey) {
646
679
  json = await this.storage.get(ACCOUNT_STORAGE_KEY + '#' + this._cache.pubkey);
647
- json = json && (typeof json === 'string') && JSON.parse(json) || json;
680
+ json = (json && typeof json === 'string' && JSON.parse(json)) || json;
648
681
  }
649
682
  }
650
683
  // Load remotely
@@ -653,7 +686,7 @@ export class AccountService extends BaseGraphqlService {
653
686
  const { data } = await this.graphql.query({
654
687
  query,
655
688
  error: { code: ErrorCodes.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },
656
- fetchPolicy: opts && opts.fetchPolicy || 'no-cache' || undefined
689
+ fetchPolicy: (opts && opts.fetchPolicy) || 'no-cache' || undefined,
657
690
  });
658
691
  json = data;
659
692
  }
@@ -710,8 +743,8 @@ export class AccountService extends BaseGraphqlService {
710
743
  query: IsEmailExistsQuery,
711
744
  variables: {
712
745
  email,
713
- hash: undefined
714
- }
746
+ hash: undefined,
747
+ },
715
748
  });
716
749
  if (this._debug)
717
750
  console.debug('[account] Email exist: ' + (data && data.isEmailExists));
@@ -720,32 +753,100 @@ export class AccountService extends BaseGraphqlService {
720
753
  async sendConfirmationEmail(email, locale) {
721
754
  locale = locale || this.settings.locale;
722
755
  console.debug('[account] Sending confirmation email to {' + email + '} with locale {' + locale + '}...');
723
- return await this.graphql.mutate({
724
- mutation: SendConfirmEmailMutation,
756
+ const { data } = await this.graphql.query({
757
+ query: SendConfirmEmailQuery,
725
758
  variables: {
726
759
  email,
727
- locale
760
+ locale,
728
761
  },
729
762
  error: {
730
763
  code: ErrorCodes.SENT_CONFIRMATION_EMAIL_FAILED,
731
- message: 'ERROR.SENT_ACCOUNT_CONFIRMATION_EMAIL_FAILED'
732
- }
764
+ message: 'ERROR.SENT_ACCOUNT_CONFIRMATION_EMAIL_FAILED',
765
+ },
733
766
  });
767
+ return data;
734
768
  }
735
769
  async confirmEmail(email, code) {
736
770
  console.debug('[account] Sending confirm request for email {' + email + '} with code {' + code + '}...');
737
- const res = await this.graphql.mutate({
738
- mutation: ConfirmEmailMutation,
771
+ const { data } = await this.graphql.query({
772
+ query: ConfirmEmailQuery,
739
773
  variables: {
740
774
  email,
741
- code
775
+ code,
742
776
  },
743
777
  error: {
744
778
  code: ErrorCodes.CONFIRM_EMAIL_FAILED,
745
- message: 'ERROR.CONFIRM_ACCOUNT_EMAIL_FAILED'
746
- }
779
+ message: 'ERROR.CONFIRM_ACCOUNT_EMAIL_FAILED',
780
+ },
747
781
  });
748
- return res && res.confirmAccountEmail;
782
+ return data;
783
+ }
784
+ async sendResetPasswordEmail(username, locale) {
785
+ locale = locale || this.settings.locale;
786
+ console.debug(`[account] Sending change password email to {${username}} with locale {${locale}}...`);
787
+ const { data: isOk } = await this.graphql.query({
788
+ query: SendResetPasswordEmailQuery,
789
+ variables: {
790
+ username,
791
+ locale,
792
+ },
793
+ error: {
794
+ code: ErrorCodes.AUTH_UPDATE_PUBKEY_ERROR,
795
+ message: 'ACCOUNT.ERROR.CHANGE_PUBKEY_ERROR',
796
+ },
797
+ fetchPolicy: 'no-cache',
798
+ });
799
+ return isOk;
800
+ }
801
+ async updatePubkey(data) {
802
+ if (!data.username || !data.password)
803
+ throw new Error('Missing required username or password');
804
+ if (!this.isLogin())
805
+ throw new Error('Should be login');
806
+ const keypair = await CryptoService.scryptKeypair(data.username, data.password);
807
+ const pubkey = Base58.encode(keypair.publicKey);
808
+ console.debug(`[account] Updating account pubkey to ${pubkey} ...`);
809
+ const { data: res } = await this.graphql.query({
810
+ query: UpdatePubKeyQuery,
811
+ variables: { pubkey },
812
+ error: {
813
+ code: ErrorCodes.AUTH_UPDATE_PUBKEY_ERROR,
814
+ message: 'ERROR.ACCOUNT.UPDATE_PUBKEY_ERROR',
815
+ },
816
+ fetchPolicy: 'no-cache',
817
+ });
818
+ console.debug(`[account] Updating account pubkey response`, res);
819
+ if (res) {
820
+ await this.logout();
821
+ await this.login(data);
822
+ }
823
+ return res;
824
+ }
825
+ async resetPubkey(data, token) {
826
+ if (this.isLogin()) {
827
+ await this.logout();
828
+ }
829
+ // Parse challenge
830
+ const challenge = token.split('|', 2)[0].split(':', 2)[1];
831
+ const keypair = await CryptoService.scryptKeypair(data.username, data.password);
832
+ const pubkey = Base58.encode(keypair.publicKey);
833
+ const signature = await CryptoService.sign(challenge, keypair);
834
+ const newToken = `${pubkey}:${challenge}|${signature}`;
835
+ console.debug(`[account] Resetting account pubkey, using token: `, newToken);
836
+ const { data: res } = await this.graphql.query({
837
+ query: ResetAccountPubkeyQuery,
838
+ variables: { token: newToken, username: data.username },
839
+ error: {
840
+ code: ErrorCodes.AUTH_UPDATE_PUBKEY_ERROR,
841
+ message: 'ERROR.ACCOUNT.UPDATE_PUBKEY_ERROR',
842
+ },
843
+ fetchPolicy: 'no-cache',
844
+ });
845
+ // Login
846
+ if (res) {
847
+ await this.login(data);
848
+ }
849
+ return res;
749
850
  }
750
851
  listenChanges(opts) {
751
852
  if (this._enableListenChanges)
@@ -759,11 +860,11 @@ export class AccountService extends BaseGraphqlService {
759
860
  return this._$additionalFields.asObservable();
760
861
  }
761
862
  getAdditionalField(key) {
762
- return this._$additionalFields.getValue().find(f => f.key === key);
863
+ return this._$additionalFields.getValue().find((f) => f.key === key);
763
864
  }
764
865
  registerAdditionalField(field) {
765
866
  const values = this._$additionalFields.getValue();
766
- if (values.find(f => f.key === field.key)) {
867
+ if (values.some((f) => f.key === field.key)) {
767
868
  throw new Error(`Additional account field {key: ${field.key}} already define.`);
768
869
  }
769
870
  if (this._debug)
@@ -774,7 +875,7 @@ export class AccountService extends BaseGraphqlService {
774
875
  return this._optionDefs;
775
876
  }
776
877
  registerOption(def) {
777
- if (this._optionDefs.findIndex(f => f.key === def.key) !== -1) {
878
+ if (this._optionDefs.findIndex((f) => f.key === def.key) !== -1) {
778
879
  throw new Error(`Additional option {${def.key}} already define.`);
779
880
  }
780
881
  if (this._debug)
@@ -782,7 +883,7 @@ export class AccountService extends BaseGraphqlService {
782
883
  this._optionDefs.push(def);
783
884
  }
784
885
  registerOptions(defs) {
785
- (defs || []).forEach(def => this.registerOption(def));
886
+ (defs || []).forEach((def) => this.registerOption(def));
786
887
  }
787
888
  /* -- protected method -- */
788
889
  resetData() {
@@ -804,7 +905,7 @@ export class AccountService extends BaseGraphqlService {
804
905
  try {
805
906
  const account = (await this.load(opts)) || new Account();
806
907
  // Set defaults
807
- account.avatar = account.avatar || (this.environment.baseUrl + DEFAULT_AVATAR_IMAGE);
908
+ account.avatar = account.avatar || this.environment.baseUrl + DEFAULT_AVATAR_IMAGE;
808
909
  account.settings = account.settings || new UserSettings();
809
910
  account.settings.locale = account.settings.locale || this.settings.locale;
810
911
  account.settings.latLongFormat = account.settings.latLongFormat || this.settings.latLongFormat || 'DDMM';
@@ -823,7 +924,7 @@ export class AccountService extends BaseGraphqlService {
823
924
  if (account.settings) {
824
925
  const settings = {
825
926
  ...this.settings.settings,
826
- ...account.settings.asLocalSettings()
927
+ ...account.settings.asLocalSettings(),
827
928
  };
828
929
  await this.settings.apply(settings);
829
930
  }
@@ -836,7 +937,7 @@ export class AccountService extends BaseGraphqlService {
836
937
  console.error(error);
837
938
  throw {
838
939
  code: ErrorCodes.LOAD_ACCOUNT_ERROR,
839
- message: 'ERROR.LOAD_ACCOUNT_ERROR'
940
+ message: 'ERROR.LOAD_ACCOUNT_ERROR',
840
941
  };
841
942
  }
842
943
  }
@@ -844,14 +945,14 @@ export class AccountService extends BaseGraphqlService {
844
945
  // When settings changed: save it remotely
845
946
  this.registerSubscription(this.settings.onChange
846
947
  .pipe(debounceTime(1000), filter(() => this.isLogin() && this.network.online))
847
- .subscribe(settings => this.saveLocalSettingsRemotely(settings)));
948
+ .subscribe((settings) => this.saveLocalSettingsRemotely(settings)));
848
949
  }
849
950
  async restoreLocally() {
850
951
  // Restore from storage
851
952
  const values = await Promise.all([
852
953
  this.storage.get(PUBKEY_STORAGE_KEY),
853
954
  this.storage.get(TOKEN_STORAGE_KEY),
854
- this.storage.get(SECKEY_STORAGE_KEY)
955
+ this.storage.get(SECKEY_STORAGE_KEY),
855
956
  ]);
856
957
  let pubkey = values[0];
857
958
  let token = values[1];
@@ -872,10 +973,12 @@ export class AccountService extends BaseGraphqlService {
872
973
  console.debug(`[account] Account restoration...`);
873
974
  this._cache.authToken = token;
874
975
  this._cache.pubkey = pubkey;
875
- this._cache.keypair = seckey && {
876
- publicKey: Base58.decode(pubkey),
877
- secretKey: Base58.decode(seckey)
878
- } || null;
976
+ this._cache.keypair =
977
+ (seckey && {
978
+ publicKey: Base58.decode(pubkey),
979
+ secretKey: Base58.decode(seckey),
980
+ }) ||
981
+ null;
879
982
  // Online mode: try to connect to pod
880
983
  if (this.network.online) {
881
984
  try {
@@ -903,7 +1006,7 @@ export class AccountService extends BaseGraphqlService {
903
1006
  if (!jsonAccount) {
904
1007
  // Try using the old storage key
905
1008
  const accountStr = await this.storage.get(ACCOUNT_STORAGE_KEY);
906
- jsonAccount = accountStr && ((typeof accountStr === 'string') && JSON.parse(jsonAccount) || accountStr);
1009
+ jsonAccount = accountStr && ((typeof accountStr === 'string' && JSON.parse(jsonAccount)) || accountStr);
907
1010
  }
908
1011
  // Invalid account: do not use it
909
1012
  if (!jsonAccount || jsonAccount.pubkey !== pubkey) {
@@ -941,22 +1044,22 @@ export class AccountService extends BaseGraphqlService {
941
1044
  console.debug(`[account] Saving account {${this._cache.pubkey.substring(0, 6)}} in local storage...`);
942
1045
  // Convert account to json
943
1046
  const json = this._data.asObject({ keepTypename: true });
944
- const seckey = this._cache.keypair && this._cache.keypair.secretKey && Base58.encode(this._cache.keypair.secretKey) || null;
1047
+ const seckey = (this._cache.keypair && this._cache.keypair.secretKey && Base58.encode(this._cache.keypair.secretKey)) || null;
945
1048
  // Convert avatar URL to dataUrl (e.g. 'data:image/png:<base64 content>')
946
- const hasAvatarUrl = json.avatar && !json.avatar.endsWith(DEFAULT_AVATAR_IMAGE) &&
947
- (json.avatar.startsWith('http://') || (json.avatar.startsWith('https://')));
1049
+ const hasAvatarUrl = json.avatar && !json.avatar.endsWith(DEFAULT_AVATAR_IMAGE) && (json.avatar.startsWith('http://') || json.avatar.startsWith('https://'));
948
1050
  if (hasAvatarUrl && this.network.online) {
949
- await this.file.getImage(json.avatar, {
1051
+ await this.file
1052
+ .getImage(json.avatar, {
950
1053
  thumbnail: true,
951
- outputType: 'dataUrl'
1054
+ outputType: 'dataUrl',
952
1055
  })
953
- .then(dataUrl => {
1056
+ .then((dataUrl) => {
954
1057
  if (dataUrl && this._debug)
955
1058
  console.debug('[account] Image fetched: ', dataUrl.substring(0, 50));
956
1059
  // TODO: make sure to display Base64 image in the menu top header
957
1060
  //jsonAccount.avatar = dataUrl;
958
1061
  })
959
- .catch(err => {
1062
+ .catch((err) => {
960
1063
  console.error(`[account] Error while fetching image: ${json.avatar}: ${err}`);
961
1064
  });
962
1065
  }
@@ -966,15 +1069,15 @@ export class AccountService extends BaseGraphqlService {
966
1069
  this.storage.set(TOKEN_STORAGE_KEY, this._cache.authToken),
967
1070
  this.storage.set(`${ACCOUNT_STORAGE_KEY}#${this._cache.pubkey}`, json),
968
1071
  // Secret key (optional)
969
- seckey && this.storage.set(SECKEY_STORAGE_KEY, seckey) || this.storage.remove(SECKEY_STORAGE_KEY),
1072
+ (seckey && this.storage.set(SECKEY_STORAGE_KEY, seckey)) || this.storage.remove(SECKEY_STORAGE_KEY),
970
1073
  // Remove old storage key
971
- this.storage.remove(ACCOUNT_STORAGE_KEY)
1074
+ this.storage.remove(ACCOUNT_STORAGE_KEY),
972
1075
  ]);
973
1076
  if (this._debug)
974
1077
  console.debug('[account] Account saved in local storage');
975
1078
  }
976
1079
  catch (err) {
977
- console.error('[account] Error while saving account locally: ' + (err && err.message || err), err);
1080
+ console.error('[account] Error while saving account locally: ' + ((err && err.message) || err), err);
978
1081
  }
979
1082
  }
980
1083
  async saveLocalSettingsRemotely(source) {
@@ -1019,16 +1122,15 @@ export class AccountService extends BaseGraphqlService {
1019
1122
  const json = account.asObject(MINIFY_ENTITY_FOR_POD);
1020
1123
  // User not allow to change his profiles
1021
1124
  delete json.profiles;
1022
- const mutation = isNew ? Mutations.create :
1023
- (this._apiTokenEnabled ? Mutations.saveWithTokens : Mutations.save);
1125
+ const mutation = isNew ? Mutations.create : this._apiTokenEnabled ? Mutations.saveWithTokens : Mutations.save;
1024
1126
  // Execute mutation
1025
1127
  const { data } = await this.graphql.mutate({
1026
1128
  mutation,
1027
1129
  variables: { data: json },
1028
1130
  error: {
1029
1131
  code: ErrorCodes.SAVE_ACCOUNT_ERROR,
1030
- message: 'ERROR.SAVE_ACCOUNT_ERROR'
1031
- }
1132
+ message: 'ERROR.SAVE_ACCOUNT_ERROR',
1133
+ },
1032
1134
  });
1033
1135
  // Copy update properties
1034
1136
  this.copyIdAndUpdateDate(data, account);
@@ -1052,8 +1154,8 @@ export class AccountService extends BaseGraphqlService {
1052
1154
  variables: { data: json },
1053
1155
  error: {
1054
1156
  code: ErrorCodes.SAVE_SETTINGS_ERROR,
1055
- message: 'ERROR.SAVE_SETTINGS_ERROR'
1056
- }
1157
+ message: 'ERROR.SAVE_SETTINGS_ERROR',
1158
+ },
1057
1159
  });
1058
1160
  // Copy update properties
1059
1161
  this.copyIdAndUpdateDateSettings(data, settings);
@@ -1078,13 +1180,13 @@ export class AccountService extends BaseGraphqlService {
1078
1180
  const data = await this.graphql.query({
1079
1181
  query: AuthQuery,
1080
1182
  variables: {
1081
- token
1183
+ token,
1082
1184
  },
1083
1185
  error: {
1084
1186
  code: ErrorCodes.UNAUTHORIZED,
1085
- message: 'ERROR.UNAUTHORIZED'
1187
+ message: 'ERROR.UNAUTHORIZED',
1086
1188
  },
1087
- fetchPolicy: 'no-cache'
1189
+ fetchPolicy: 'no-cache',
1088
1190
  });
1089
1191
  // Token is accepted by the server
1090
1192
  if (data && data.authenticate) {
@@ -1107,13 +1209,13 @@ export class AccountService extends BaseGraphqlService {
1107
1209
  async getAuthChallenge() {
1108
1210
  const challengeError = {
1109
1211
  code: ErrorCodes.AUTH_CHALLENGE_ERROR,
1110
- message: 'ERROR.AUTH_CHALLENGE_ERROR'
1212
+ message: 'ERROR.AUTH_CHALLENGE_ERROR',
1111
1213
  };
1112
1214
  const { authChallenge } = await this.graphql.query({
1113
1215
  query: AuthChallengeQuery,
1114
1216
  variables: {},
1115
1217
  error: challengeError,
1116
- fetchPolicy: 'network-only'
1218
+ fetchPolicy: 'network-only',
1117
1219
  });
1118
1220
  // Check challenge
1119
1221
  if (!authChallenge)
@@ -1130,8 +1232,7 @@ export class AccountService extends BaseGraphqlService {
1130
1232
  this.stopListenRemoteChanges(); // Stop previous subscription
1131
1233
  if (this.network.offline)
1132
1234
  return new Subscription(); // Offline: skip
1133
- this._listenChangesSubscription = this.watchChanges(opts)
1134
- .subscribe({
1235
+ this._listenChangesSubscription = this.watchChanges(opts).subscribe({
1135
1236
  next: (data) => {
1136
1237
  console.debug(`[account] Remote update detected at ${data.updateDate}`);
1137
1238
  this.reload();
@@ -1148,7 +1249,7 @@ export class AccountService extends BaseGraphqlService {
1148
1249
  else {
1149
1250
  console.warn('[account] [WS] Received error:', err);
1150
1251
  }
1151
- }
1252
+ },
1152
1253
  });
1153
1254
  this._listenChangesSubscription.add(() => {
1154
1255
  console.debug(`[account] Stop watching remote changes`);
@@ -1162,30 +1263,31 @@ export class AccountService extends BaseGraphqlService {
1162
1263
  watchChanges(opts) {
1163
1264
  if (!this.started) {
1164
1265
  // Wait service ready, then loop
1165
- return from(this.ready())
1166
- .pipe(switchMap(() => this.watchChanges(opts)));
1266
+ return from(this.ready()).pipe(switchMap(() => this.watchChanges(opts)));
1167
1267
  }
1168
1268
  if (!this._cache.pubkey)
1169
1269
  throw new Error('Not logged in');
1170
1270
  if (this.network.offline)
1171
1271
  throw new Error('Cannot watch account changes: network is offline.');
1172
1272
  const variables = {
1173
- interval: toNumber(opts && opts.intervalInSeconds, this._listenIntervalInSeconds)
1273
+ interval: toNumber(opts && opts.intervalInSeconds, this._listenIntervalInSeconds),
1174
1274
  };
1175
1275
  console.debug(`[account] Watching remote changes, every ${variables.interval}s`);
1176
- return this.graphql.subscribe({
1276
+ return this.graphql
1277
+ .subscribe({
1177
1278
  query: AccountSubscriptions.listenChanges,
1178
1279
  variables,
1179
1280
  error: {
1180
1281
  code: ErrorCodes.SUBSCRIBE_ACCOUNT_ERROR,
1181
- message: 'ERROR.ACCOUNT.SUBSCRIBE_ERROR'
1182
- }
1183
- }).pipe(map(({ data }) => data),
1282
+ message: 'ERROR.ACCOUNT.SUBSCRIBE_ERROR',
1283
+ },
1284
+ })
1285
+ .pipe(map(({ data }) => data),
1184
1286
  // Keep only if newer
1185
- filter(data => {
1287
+ filter((data) => {
1186
1288
  const currentUpdateDate = fromDateISOString(this._data?.updateDate);
1187
1289
  const remoteUpdateDate = fromDateISOString(data?.updateDate);
1188
- return (remoteUpdateDate && (!currentUpdateDate || !remoteUpdateDate.isSame(currentUpdateDate, 'millisecond')));
1290
+ return remoteUpdateDate && (!currentUpdateDate || !remoteUpdateDate.isSame(currentUpdateDate, 'millisecond'));
1189
1291
  }));
1190
1292
  }
1191
1293
  copyIdAndUpdateDate(source, target) {
@@ -1209,8 +1311,8 @@ export class AccountService extends BaseGraphqlService {
1209
1311
  copyIdAndUpdateDateToken(sources, targets) {
1210
1312
  if (isEmptyArray(sources))
1211
1313
  return;
1212
- sources.forEach(source => {
1213
- const target = targets.find(value => value.id === source.id || value.name === source.name);
1314
+ sources.forEach((source) => {
1315
+ const target = targets.find((value) => UserToken.equals(value, source));
1214
1316
  if (target) {
1215
1317
  target.id = source.id || target.id;
1216
1318
  target.creationDate = source.creationDate || target.creationDate;
@@ -1222,10 +1324,10 @@ export class AccountService extends BaseGraphqlService {
1222
1324
  showToast(opts) {
1223
1325
  return Toasts.show(this.toastController, this.translate, opts);
1224
1326
  }
1225
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AccountService, deps: [{ token: i1.NetworkService }, { token: i2.GraphqlService }, { token: i3.LocalSettingsService }, { token: i4.Storage }, { token: i5.FileService }, { token: i6.TranslateService, optional: true }, { token: i7.ToastController, optional: true }, { token: ENVIRONMENT }, { token: APP_USER_SETTINGS_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
1226
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AccountService, providedIn: 'root' });
1327
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AccountService, deps: [{ token: i1.NetworkService }, { token: i2.GraphqlService }, { token: i3.LocalSettingsService }, { token: i4.Storage }, { token: i5.FileService }, { token: i6.TranslateService, optional: true }, { token: i7.ToastController, optional: true }, { token: ENVIRONMENT }, { token: APP_USER_SETTINGS_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
1328
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AccountService, providedIn: 'root' });
1227
1329
  }
1228
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AccountService, decorators: [{
1330
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AccountService, decorators: [{
1229
1331
  type: Injectable,
1230
1332
  args: [{ providedIn: 'root', deps: [ENVIRONMENT] }]
1231
1333
  }], ctorParameters: () => [{ type: i1.NetworkService }, { type: i2.GraphqlService }, { type: i3.LocalSettingsService }, { type: i4.Storage }, { type: i5.FileService }, { type: i6.TranslateService, decorators: [{
@@ -1241,4 +1343,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
1241
1343
  type: Inject,
1242
1344
  args: [APP_USER_SETTINGS_OPTIONS]
1243
1345
  }] }] });
1244
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3NlcnZpY2VzL2FjY291bnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQVcsTUFBTSxrQkFBa0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQVUsV0FBVyxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEYsT0FBTyxFQUFlLEdBQUcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBT3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBZSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVB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QUFFLENBQUUsV0FBVyxDQUFFLEVBQUM7OzBCQTJFbEQsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxXQUFXOzswQkFDbEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSwgS2V5cGFpciB9IGZyb20gJy4vY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGVwYXJ0bWVudCB9IGZyb20gJy4vbW9kZWwvZGVwYXJ0bWVudC5tb2RlbCc7XG5pbXBvcnQgeyBBY2NvdW50LCBBY2NvdW50VXRpbHMsIFVzZXJTZXR0aW5ncyB9IGZyb20gJy4vbW9kZWwvYWNjb3VudC5tb2RlbCc7XG5pbXBvcnQgeyBQZXJzb24sIFBlcnNvblV0aWxzLCBVc2VyUHJvZmlsZUxhYmVsIH0gZnJvbSAnLi9tb2RlbC9wZXJzb24ubW9kZWwnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5ncywgVXNhZ2VNb2RlIH0gZnJvbSAnLi9tb2RlbC9zZXR0aW5ncy5tb2RlbCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb20sIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRmV0Y2hQb2xpY3ksIGdxbCB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0Bpb25pYy9zdG9yYWdlLWFuZ3VsYXInO1xuXG5pbXBvcnQgeyBpc0VtcHR5QXJyYXksIGlzTmlsLCBzbGVlcCwgdG9OdW1iZXIgfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IEJhc2VHcmFwaHFsU2VydmljZSB9IGZyb20gJy4vYmFzZS1ncmFwaHFsLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgU2VydmVyRXJyb3JDb2RlcyB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IEdyYXBocWxTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JhcGhxbC9ncmFwaHFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUZpZWxkRGVmaW5pdGlvbiwgRm9ybUZpZWxkRGVmaW5pdGlvbk1hcCB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFRva2VuVHlwZSB9IGZyb20gJy4vbmV0d29yay50eXBlcyc7XG5pbXBvcnQgeyBGaWxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9maWxlL2ZpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBNSU5JRllfRU5USVRZX0ZPUl9QT0QsIFJlZmVyZW50aWFsLCBSZWZlcmVudGlhbFV0aWxzIH0gZnJvbSAnLi9tb2RlbC9yZWZlcmVudGlhbC5tb2RlbCc7XG5pbXBvcnQgeyBTdGF0dXNJZHMgfSBmcm9tICcuL21vZGVsL21vZGVsLmVudW0nO1xuaW1wb3J0IHsgQmFzZTU4IH0gZnJvbSAnLi9iYXNlNTgnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IGZyb21EYXRlSVNPU3RyaW5nIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RhdGVzJztcbmltcG9ydCB7IGZpcnN0Tm90TmlsUHJvbWlzZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCYXNlRW50aXR5R3JhcGhxbE11dGF0aW9ucywgQmFzZUVudGl0eUdyYXBocWxRdWVyaWVzLCBCYXNlRW50aXR5R3JhcGhxbFN1YnNjcmlwdGlvbnMgfSBmcm9tICcuL2Jhc2UtZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IFNob3dUb2FzdE9wdGlvbnMsIFRvYXN0cyB9IGZyb20gJy4uLy4uL3NoYXJlZC90b2FzdC90b2FzdHMnO1xuaW1wb3J0IHsgT3ZlcmxheUV2ZW50RGV0YWlsIH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHsgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgVG9rZW5TY29wZSwgVXNlclRva2VuIH0gZnJvbSAnLi9tb2RlbC90b2tlbi5tb2RlbCc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBBY2NvdW50RGV0YWlscyB7XG4gIGxvYWRlZDogYm9vbGVhbjtcbiAga2V5cGFpcjogS2V5cGFpcjtcbiAgYXV0aFRva2VuOiBzdHJpbmc7XG4gIGF1dGhCYXNpYz86IHN0cmluZztcbiAgcHVia2V5OiBzdHJpbmc7XG4gIHBlcnNvbjogUGVyc29uO1xuICBkZXBhcnRtZW50OiBEZXBhcnRtZW50O1xuICBtYWluUHJvZmlsZTogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBBdXRoRGF0YSB7XG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIHBhc3N3b3JkOiBzdHJpbmc7XG4gIG9mZmxpbmU/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRhdGEgZXh0ZW5kcyBBdXRoRGF0YSB7XG4gIGFjY291bnQ6IEFjY291bnQ7XG59XG5cbmNvbnN0IFRPS0VOX1NUT1JBR0VfS0VZID0gJ3Rva2VuJztcbmNvbnN0IFBVQktFWV9TVE9SQUdFX0tFWSA9ICdwdWJrZXknO1xuY29uc3QgU0VDS0VZX1NUT1JBR0VfS0VZID0gJ3NlY2tleSc7XG5jb25zdCBBQ0NPVU5UX1NUT1JBR0VfS0VZID0gJ2FjY291bnQnO1xuXG5jb25zdCBERUZBVUxUX0FWQVRBUl9JTUFHRSA9ICdhc3NldHMvaW1nL3BlcnNvbi5wbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJTZXR0aW5nc09wdGlvbnMge1xuICBvcHRpb25zOiBGb3JtRmllbGREZWZpbml0aW9uTWFwO1xufVxuZXhwb3J0IGNvbnN0IEFQUF9VU0VSX1NFVFRJTkdTX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48VXNlclNldHRpbmdzT3B0aW9ucz4oJ1VzZXJTZXR0aW5nc09wdGlvbnMnKTtcbmV4cG9ydCBjb25zdCBBUFBfVVNFUl9UT0tFTl9TQ09QRVMgPSBuZXcgSW5qZWN0aW9uVG9rZW48VG9rZW5TY29wZVtdPignVXNlclRva2VuU2NvcGVzJyk7XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBHcmFwaFFMIHF1ZXJpZXNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5jb25zdCBGcmFnbWVudHMgPSB7XG4gIGFjY291bnQ6IGdxbGBcbiAgICBmcmFnbWVudCBBY2NvdW50RnJhZ21lbnQgb24gQWNjb3VudFZPIHtcbiAgICAgIGlkXG4gICAgICBmaXJzdE5hbWVcbiAgICAgIGxhc3ROYW1lXG4gICAgICBlbWFpbFxuICAgICAgcHVia2V5XG4gICAgICBhdmF0YXJcbiAgICAgIHN0YXR1c0lkXG4gICAgICB1cGRhdGVEYXRlXG4gICAgICBjcmVhdGlvbkRhdGVcbiAgICAgIHByb2ZpbGVzXG4gICAgICBzZXR0aW5ncyB7XG4gICAgICAgIC4uLlVzZXJTZXR0aW5nc0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBkZXBhcnRtZW50IHtcbiAgICAgICAgaWRcbiAgICAgICAgbGFiZWxcbiAgICAgICAgbmFtZVxuICAgICAgICBfX3R5cGVuYW1lXG4gICAgICB9XG4gICAgICBfX3R5cGVuYW1lXG4gICAgfWAsXG5cbiAgc2V0dGluZ3M6IGdxbGBmcmFnbWVudCBVc2VyU2V0dGluZ3NGcmFnbWVudCBvbiBVc2VyU2V0dGluZ3NWTyB7XG4gICAgaWRcbiAgICBsb2NhbGVcbiAgICBsYXRMb25nRm9ybWF0XG4gICAgY29udGVudFxuICAgIG5vbmNlXG4gICAgdXBkYXRlRGF0ZVxuICAgIF9fdHlwZW5hbWVcbiAgfWAsXG5cbiAgdG9rZW46IGdxbGBmcmFnbWVudCBVc2VyVG9rZW5GcmFnbWVudCBvbiBVc2VyVG9rZW5WTyB7XG4gICAgaWRcbiAgICBwdWJrZXlcbiAgICB0b2tlblxuICAgIG5hbWVcbiAgICBmbGFnc1xuICAgIGV4cGlyYXRpb25EYXRlXG4gICAgbGFzdFVzZWREYXRlXG4gICAgY3JlYXRpb25EYXRlXG4gICAgdXBkYXRlRGF0ZVxuICAgIF9fdHlwZW5hbWVcbiAgfWBcbn07XG5cbi8vIEFjY291bnQgcXVlcmllc1xuY29uc3QgUXVlcmllczogUGFydGlhbDxCYXNlRW50aXR5R3JhcGhxbFF1ZXJpZXM+ICYgeyBsb2FkV2l0aFRva2VuczogYW55OyB9ID0ge1xuICBsb2FkOiBncWxgcXVlcnkgQWNjb3VudCB7XG4gICAgZGF0YTogYWNjb3VudCB7XG4gICAgICAuLi5BY2NvdW50RnJhZ21lbnRcbiAgICB9XG4gIH1cbiAgJHtGcmFnbWVudHMuYWNjb3VudH1cbiAgJHtGcmFnbWVudHMuc2V0dGluZ3N9YCxcblxuICBsb2FkV2l0aFRva2VuczogZ3FsYHF1ZXJ5IEFjY291bnRXaXRoVG9rZW4ge1xuICAgIGRhdGE6IGFjY291bnQge1xuICAgICAgLi4uQWNjb3VudEZyYWdtZW50XG4gICAgICB0b2tlbnMge1xuICAgICAgICAuLi5Vc2VyVG9rZW5GcmFnbWVudFxuICAgICAgfVxuICAgIH1cbiAgfVxuICAke0ZyYWdtZW50cy5hY2NvdW50fVxuICAke0ZyYWdtZW50cy5zZXR0aW5nc31cbiAgJHtGcmFnbWVudHMudG9rZW59YCxcbn07XG5cbi8vIENoZWNrIGVtYWlsIHF1ZXJ5XG5jb25zdCBJc0VtYWlsRXhpc3RzUXVlcnk6IGFueSA9IGdxbGBcbiAgcXVlcnkgSXNFbWFpbEV4aXN0cygkZW1haWw6IFN0cmluZywgJGhhc2g6IFN0cmluZyl7XG4gICAgaXNFbWFpbEV4aXN0cyhlbWFpbDogJGVtYWlsLCBoYXNoOiAkaGFzaClcbiAgfVxuYDtcbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJc0VtYWlsRXhpc3RzVmFyaWFibGVzIHtcbiAgZW1haWw6IHN0cmluZztcbiAgaGFzaDogc3RyaW5nO1xufVxuXG4vLyBBY2NvdW50IG11dGF0aW9uc1xuY29uc3QgTXV0YXRpb25zOiBQYXJ0aWFsPEJhc2VFbnRpdHlHcmFwaHFsTXV0YXRpb25zPiAmIHsgc2F2ZVdpdGhUb2tlbnM6IGFueSwgc2F2ZVNldHRpbmdzOiBhbnk7IGNyZWF0ZTogYW55OyAgfSA9IHtcbiAgc2F2ZTogZ3FsYCBtdXRhdGlvbiBTYXZlQWNjb3VudCgkZGF0YTpBY2NvdW50Vk9JbnB1dCl7XG4gICAgZGF0YTogc2F2ZUFjY291bnQoYWNjb3VudDogJGRhdGEpe1xuICAgICAgLi4uQWNjb3VudEZyYWdtZW50XG4gICAgfVxuICB9XG4gICR7RnJhZ21lbnRzLmFjY291bnR9XG4gICR7RnJhZ21lbnRzLnNldHRpbmdzfWAsXG5cbiAgc2F2ZVdpdGhUb2tlbnM6IGdxbGAgbXV0YXRpb24gU2F2ZUFjY291bnRXaXRoVG9rZW5zKCRkYXRhOkFjY291bnRWT0lucHV0KXtcbiAgICBkYXRhOiBzYXZlQWNjb3VudChhY2NvdW50OiAkZGF0YSl7XG4gICAgICAuLi5BY2NvdW50RnJhZ21lbnRcbiAgICAgIHRva2VucyB7XG4gICAgICAgIC4uLlVzZXJUb2tlbkZyYWdtZW50XG4gICAgICB9XG4gICAgfVxuICB9XG4gICR7RnJhZ21lbnRzLmFjY291bnR9XG4gICR7RnJhZ21lbnRzLnNldHRpbmdzfVxuICAke0ZyYWdtZW50cy50b2tlbn1gLFxuXG4gIGNyZWF0ZTogZ3FsYG11dGF0aW9uIENyZWF0ZUFjY291bnQoJGRhdGE6QWNjb3VudFZPSW5wdXQpe1xuICAgIGRhdGE6IGNyZWF0ZUFjY291bnQoYWNjb3VudDogJGRhdGEpe1xuICAgICAgLi4uQWNjb3VudEZyYWdtZW50XG4gICAgfVxuICB9XG4gICR7RnJhZ21lbnRzLmFjY291bnR9XG4gICR7RnJhZ21lbnRzLnNldHRpbmdzfVxuICBgLFxuXG4gIHNhdmVTZXR0aW5nczogZ3FsYG11dGF0aW9uIFNhdmVTZXR0aW5ncygkZGF0YTpVc2VyU2V0dGluZ3NWT0lucHV0KXtcbiAgICBkYXRhOiBzYXZlU2V0dGluZ3Moc2V0dGluZ3M6ICRkYXRhKXtcbiAgICAgIC4uLlVzZXJTZXR0aW5nc0ZyYWdtZW50XG4gICAgfVxuICB9XG4gICR7RnJhZ21lbnRzLnNldHRpbmdzfWBcbn07XG5cbi8vIFNlbnQgY29uZmlybWF0aW9uIGVtYWlsXG5jb25zdCBTZW5kQ29uZmlybUVtYWlsTXV0YXRpb246IGFueSA9IGdxbGBcbiAgbXV0YXRpb24gc2VuZEFjY291bnRDb25maXJtYXRpb25FbWFpbCgkZW1haWw6U3RyaW5nLCAkbG9jYWxlOlN0cmluZyl7XG4gICAgc2VuZEFjY291bnRDb25maXJtYXRpb25FbWFpbChlbWFpbDogJGVtYWlsLCBsb2NhbGU6ICRsb2NhbGUpXG4gIH1cbmA7XG5cbi8vIENvbmZpcm0gYWNjb3VudCBlbWFpbFxuY29uc3QgQ29uZmlybUVtYWlsTXV0YXRpb246IGFueSA9IGdxbGBcbiAgbXV0YXRpb24gY29uZmlybUFjY291bnRFbWFpbCgkZW1haWw6U3RyaW5nLCAkY29kZTpTdHJpbmcpe1xuICAgIGNvbmZpcm1BY2NvdW50RW1haWwoZW1haWw6ICRlbWFpbCwgY29kZTogJGNvZGUpXG4gIH1cbmA7XG5cbi8vIEF1dGhlbnRpY2F0aW9uICBxdWVyeVxuY29uc3QgQXV0aFF1ZXJ5OiBhbnkgPSBncWxgXG4gIHF1ZXJ5IEF1dGgoJHRva2VuOiBTdHJpbmcpe1xuICAgIGF1dGhlbnRpY2F0ZSh0b2tlbjogJHRva2VuKVxuICB9XG5gO1xuXG4vLyBOZXcgYXV0aCBjaGFsbGVuZ2UgcXVlcnlcbmNvbnN0IEF1dGhDaGFsbGVuZ2VRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBBdXRoQ2hhbGxlbmdle1xuICAgIGF1dGhDaGFsbGVuZ2V7XG4gICAgICBjaGFsbGVuZ2VcbiAgICAgIHB1YmtleVxuICAgICAgc2lnbmF0dXJlXG4gICAgfVxuICB9XG5gO1xuXG5pbnRlcmZhY2UgSUF1dGhDaGFsbGVuZ2Uge1xuICBwdWJrZXk6IHN0cmluZztcbiAgY2hhbGxlbmdlOiBzdHJpbmc7XG4gIHNpZ25hdHVyZTogc3RyaW5nO1xufVxuXG5jb25zdCBBY2NvdW50U3Vic2NyaXB0aW9uczogQmFzZUVudGl0eUdyYXBocWxTdWJzY3JpcHRpb25zID0ge1xuICBsaXN0ZW5DaGFuZ2VzOiBncWxgc3Vic2NyaXB0aW9uIHVwZGF0ZUFjY291bnQoJGludGVydmFsOiBJbnQpe1xuICAgIGRhdGE6IHVwZGF0ZUFjY291bnQoaW50ZXJ2YWw6ICRpbnRlcnZhbCkge1xuICAgICAgaWRcbiAgICAgIHVwZGF0ZURhdGVcbiAgICB9XG4gIH1gXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRXYXRjaE9wdGlvbnMge1xuICBpbnRlcnZhbEluU2Vjb25kcz86IG51bWJlcjtcbn1cblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290JywgZGVwczogWyBFTlZJUk9OTUVOVCBdfSlcbmV4cG9ydCBjbGFzcyBBY2NvdW50U2VydmljZSBleHRlbmRzIEJhc2VHcmFwaHFsU2VydmljZTxBY2NvdW50LCBhbnksIG51bWJlciwgQWNjb3VudD4ge1xuXG4gIG9uTG9naW4gPSBuZXcgU3ViamVjdDxBY2NvdW50PigpO1xuICBvbkxvZ291dCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIG9uQ2hhbmdlID0gbmV3IFN1YmplY3Q8QWNjb3VudD4oKTtcbiAgb25BdXRoVG9rZW5DaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgb25BdXRoQmFzaWNDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIF9saXN0ZW5DaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IF9lbmFibGVMaXN0ZW5DaGFuZ2VzOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IF9saXN0ZW5JbnRlcnZhbEluU2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIF9jYWNoZTogQWNjb3VudERldGFpbHMgPSB7XG4gICAgbG9hZGVkOiBmYWxzZSxcbiAgICBrZXlwYWlyOiBudWxsLFxuICAgIGF1dGhUb2tlbjogbnVsbCxcbiAgICBhdXRoQmFzaWM6IG51bGwsXG4gICAgcHVia2V5OiBudWxsLFxuICAgIG1haW5Qcm9maWxlOiBudWxsLFxuICAgIHBlcnNvbjogbnVsbCxcbiAgICBkZXBhcnRtZW50OiBudWxsXG4gIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbkRlZnM6IEZvcm1GaWVsZERlZmluaXRpb25bXTtcbiAgcHJpdmF0ZSBfJGFkZGl0aW9uYWxGaWVsZHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZvcm1GaWVsZERlZmluaXRpb25bXT4oW10pO1xuICBwcml2YXRlIF90b2tlblR5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoVG9rZW5UeXBlPih1bmRlZmluZWQpO1xuICBwcml2YXRlIF9hcGlUb2tlbkVuYWJsZWQgPSB0cnVlO1xuXG4gIGdldCBhY2NvdW50KCk6IEFjY291bnQge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZS5sb2FkZWQgPyB0aGlzLl9kYXRhIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0IHBlcnNvbigpOiBQZXJzb24ge1xuICAgIGlmICh0aGlzLl9jYWNoZS5sb2FkZWQgJiYgIXRoaXMuX2NhY2hlLnBlcnNvbikge1xuICAgICAgdGhpcy5fY2FjaGUucGVyc29uID0gdGhpcy5fY2FjaGUubG9hZGVkID8gdGhpcy5fZGF0YS5hc1BlcnNvbigpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGUucGVyc29uO1xuICB9XG5cbiAgZ2V0IGRlcGFydG1lbnQoKTogRGVwYXJ0bWVudCB7XG4gICAgaWYgKHRoaXMuX2NhY2hlLmxvYWRlZCAmJiAhdGhpcy5fY2FjaGUuZGVwYXJ0bWVudCkge1xuICAgICAgdGhpcy5fY2FjaGUuZGVwYXJ0bWVudCA9IHRoaXMuX2NhY2hlLmxvYWRlZCA/IHRoaXMuX2RhdGEuYXNQZXJzb24oKS5kZXBhcnRtZW50IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGUuZGVwYXJ0bWVudDtcbiAgfVxuXG4gIGdldCB0b2tlblR5cGUoKTogQXV0aFRva2VuVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rva2VuVHlwZSQudmFsdWU7XG4gIH1cblxuICBzZXQgdG9rZW5UeXBlKHZhbHVlOiBBdXRoVG9rZW5UeXBlKSB7XG4gICAgaWYgKHRoaXMuX3Rva2VuVHlwZSQudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1thY2NvdW50XSBVc2luZyBhdXRoZW50aWNhdGlvbiB0b2tlbiB0eXBlOiAnICsgdmFsdWUpO1xuICAgICAgdGhpcy5fdG9rZW5UeXBlJC5uZXh0KHZhbHVlKTtcbiAgICAgIC8vIFJlc2V0IHZhbHVlc1xuICAgICAgdGhpcy5fY2FjaGUuYXV0aFRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vbkF1dGhUb2tlbkNoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLl9jYWNoZS5hdXRoQmFzaWMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm9uQXV0aEJhc2ljQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgYXBpVG9rZW5FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hcGlUb2tlbkVuYWJsZWQ7XG4gIH1cblxuICBzZXQgYXBpVG9rZW5FbmFibGVkKHZhbHVlOiBib29sZWFuKXtcbiAgICB0aGlzLl9hcGlUb2tlbkVuYWJsZWQgPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBuZXR3b3JrOiBOZXR3b3JrU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZ3JhcGhxbDogR3JhcGhxbFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgc3RvcmFnZTogU3RvcmFnZSxcbiAgICBwcm90ZWN0ZWQgZmlsZTogRmlsZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB0b2FzdENvbnRyb2xsZXI6IFRvYXN0Q29udHJvbGxlcixcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX1VTRVJfU0VUVElOR1NfT1BUSU9OUykgb3B0aW9uczogVXNlclNldHRpbmdzT3B0aW9uc1xuICApIHtcbiAgICBzdXBlcihncmFwaHFsLCBlbnZpcm9ubWVudCk7XG4gICAgdGhpcy5fZW5hYmxlTGlzdGVuQ2hhbmdlcyA9ICghZW52aXJvbm1lbnQuYWNjb3VudCB8fCBlbnZpcm9ubWVudC5hY2NvdW50LmVuYWJsZUxpc3RlbkNoYW5nZXMgIT09IGZhbHNlKTsgLy8gVHJ1ZSBieSBkZWZhdWx0XG4gICAgdGhpcy5fbGlzdGVuSW50ZXJ2YWxJblNlY29uZHMgPSB0b051bWJlcihlbnZpcm9ubWVudC5hY2NvdW50ICYmIGVudmlyb25tZW50LmFjY291bnQubGlzdGVuSW50ZXJ2YWxJblNlY29uZHMsIDApOyAvLyBubyB0aW1lciBieSBkZWZhdWx0XG5cbiAgICB0aGlzLl9kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnQtc2VydmljZV0gQ3JlYXRpbmcgc2VydmljZScpO1xuICAgIHRoaXMuX29wdGlvbkRlZnMgPSBPYmplY3QudmFsdWVzKG9wdGlvbnM/Lm9wdGlvbnMgfHwge30pO1xuXG4gICAgdGhpcy5yZXNldERhdGEoKTtcblxuICAgIC8vIFNlbmQgYXV0aCB0b2tlbiB0byB0aGUgZ3JhcGhxbCBsYXllciwgd2hlbiBjaGFuZ2VkXG4gICAgdGhpcy5vbkF1dGhUb2tlbkNoYW5nZS5zdWJzY3JpYmUoKHRva2VuKSA9PiB0aGlzLmdyYXBocWwuc2V0QXV0aFRva2VuKHRva2VuKSk7XG4gICAgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5zdWJzY3JpYmUoKGJhc2ljKSA9PiB0aGlzLmdyYXBocWwuc2V0QXV0aEJhc2ljKGJhc2ljKSk7XG5cbiAgICAvLyBGb3JjZSBuZXR3b3JrIHRvIHdhaXQgYWNjb3VudCBzZXJ2aWNlLCBhZnRlciBnZXR0aW5nIGNvbm5lY3Rpb24gdG8gdGhlIHBlZXJcbiAgICB0aGlzLm5ldHdvcmsub24oJ2JlZm9yZVRyeU9ubGluZUZpbmlzaCcsIGFzeW5jIChvbmxpbmUpID0+IHtcbiAgICAgIC8vIElmIG9ubGluZSwgd2FpdCBhIGZ1bGwgcmVzdGFydCwgYmVjYXVzZSBpdCBjYW4gZm9yY2Ugb2ZmbGluZSBtb2RlXG4gICAgICBpZiAob25saW5lICYmICghdGhpcy5zdGFydGVkIHx8IHRoaXMuaXNMb2dpbigpKSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gRm9yY2UgbmV0d29ya1NlcnZpY2UudHJ5T25saW5lKCkgdG8gd2FpdCwgdGhhdCBncmFwaHFsIGFuZCBhY2NvdW50IHNlcnZpY2UgaXMgcmVzdGFydGVkLi4uJyk7XG4gICAgICAgIGF3YWl0IHNsZWVwKDUwMCk7IC8vIHdhaXQgZ3JhcGhxbCBzZXJ2aWNlIHRvIGJlIHJlc3RhcnRlZFxuICAgICAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICBhc3luYyBuZ09uU3RhcnQoKTogUHJvbWlzZTxBY2NvdW50PiB7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnNldHRpbmdzLnJlYWR5KCksXG4gICAgICAvLyBXYWl0IHRva2VuIHR5cGUgdG8gYmUgc2V0XG4gICAgICBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5fdG9rZW5UeXBlJClcbiAgICBdKTtcblxuICAgIC8vIExpc3RlbiBncmFwaHFsIHN0YXJ0IChvciByZXN0YXJ0KVxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLmdyYXBocWwuc3RvcFN1YmplY3Quc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCAmJiB0aGlzLmlzTG9naW4oKSkge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBSZXN0YXJ0aW5nLCB0byByZXRyeSB0byBhdXRoZW50aWNhdGUuLi4nKTtcbiAgICAgICAgICB0aGlzLnJlc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgYXdhaXQgdGhpcy5yZXN0b3JlTG9jYWxseSgpO1xuICAgIGF3YWl0IHRoaXMubGlzdGVuU2V0dGluZ3MoKTtcblxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG5nT25TdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhZEF1dGhUb2tlbiA9IHRoaXMuX2NhY2hlLmF1dGhUb2tlbiAmJiB0cnVlO1xuICAgIGNvbnN0IGhhZEF1dGhCYXNpYyA9IHRoaXMuX2NhY2hlLmF1dGhCYXNpYyAmJiB0cnVlO1xuICAgIGNvbnN0IGhhZEF1dGggPSBoYWRBdXRoVG9rZW4gfHwgaGFkQXV0aEJhc2ljO1xuICAgIHRoaXMucmVzZXREYXRhKCk7XG4gICAgaWYgKGhhZEF1dGgpIHtcbiAgICAgIHRoaXMub25Mb2dvdXQubmV4dCgpO1xuICAgICAgdGhpcy5vbkNoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICBpZiAoaGFkQXV0aFRva2VuKSB0aGlzLm9uQXV0aFRva2VuQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICAgIGlmIChoYWRBdXRoQmFzaWMpIHRoaXMub25BdXRoQmFzaWNDaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIGlzTG9naW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMuX2NhY2hlLnB1YmtleSAmJiB0aGlzLl9jYWNoZS5sb2FkZWQpO1xuICB9XG5cbiAgaXNBdXRoKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLl9jYWNoZS5wdWJrZXkgJiYgdGhpcy5fY2FjaGUua2V5cGFpciAmJiB0aGlzLl9jYWNoZS5rZXlwYWlyLnNlY3JldEtleSk7XG4gIH1cblxuICBoYXNNaW5Qcm9maWxlKHVzZXJQcm9maWxlOiBVc2VyUHJvZmlsZUxhYmVsKTogYm9vbGVhbiB7XG4gICAgLy8gc2hvdWxkIGJlIGxvZ2luLCBhbmQgc3RhdHVzIEVOQUJMRSBvciBURU1QT1JBUllcbiAgICBpZiAoIXRoaXMuX2RhdGEgfHwgIXRoaXMuX2RhdGEucHVia2V5IHx8XG4gICAgICAodGhpcy5fZGF0YS5zdGF0dXNJZCAhPT0gU3RhdHVzSWRzLkVOQUJMRSAmJiB0aGlzLl9kYXRhLnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuVEVNUE9SQVJZKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gUGVyc29uVXRpbHMuaGFzVXBwZXJPckVxdWFsc1Byb2ZpbGUodGhpcy5fZGF0YS5wcm9maWxlcywgdXNlclByb2ZpbGUpO1xuICB9XG5cbiAgaGFzRXhhY3RQcm9maWxlKGxhYmVsOiBVc2VyUHJvZmlsZUxhYmVsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFjY291bnRVdGlscy5oYXNFeGFjdFByb2ZpbGUodGhpcy5fZGF0YSwgbGFiZWwpO1xuICB9XG5cbiAgaGFzUHJvZmlsZUFuZElzRW5hYmxlKHVzZXJQcm9maWxlOiBVc2VyUHJvZmlsZUxhYmVsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFjY291bnRVdGlscy5oYXNQcm9maWxlQW5kSXNFbmFibGUodGhpcy5fZGF0YSwgdXNlclByb2ZpbGUpO1xuICB9XG5cbiAgaXNBZG1pbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNQcm9maWxlQW5kSXNFbmFibGUoJ0FETUlOJyk7XG4gIH1cblxuICBpc1N1cGVydmlzb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvZmlsZUFuZElzRW5hYmxlKCdTVVBFUlZJU09SJyk7XG4gIH1cblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvZmlsZUFuZElzRW5hYmxlKCdVU0VSJyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQHBhcmFtIG1vZGVcbiAgICovXG4gIGlzVXNhZ2VNb2RlKG1vZGU6IFVzYWdlTW9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmlzVXNhZ2VNb2RlKG1vZGUpO1xuICB9XG5cbiAgaXNPbmx5R3Vlc3QoKTogYm9vbGVhbiB7XG4gICAgLy8gU2hvdWxkIGJlIGxvZ2luLCBhbmQgc3RhdHVzIEVOQUJMRSBvciBURU1QT1JBUllcbiAgICBpZiAoIXRoaXMuX2RhdGEgfHwgIXRoaXMuX2RhdGEucHVia2V5IHx8XG4gICAgICAodGhpcy5fZGF0YS5zdGF0dXNJZCAhPT0gU3RhdHVzSWRzLkVOQUJMRSAmJiB0aGlzLl9kYXRhLnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuVEVNUE9SQVJZKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBQcm9maWxlIGxlc3MgdGhlbiB1c2VyXG4gICAgcmV0dXJuICFQZXJzb25VdGlscy5oYXNVcHBlck9yRXF1YWxzUHJvZmlsZSh0aGlzLl9kYXRhLnByb2ZpbGVzLCAnVVNFUicpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByZWNvcmRlckRlcGFydG1lbnRcbiAgICogQGRlcHJlY2F0ZWQgdXNlIFByb2dyYW1SZWZTZXJ2aWNlLmNhblVzZXJXcml0ZUVudGl0eSgpIGluc3RlYWRcbiAgICovXG4gIGNhblVzZXJXcml0ZURhdGFGb3JEZXBhcnRtZW50KHJlY29yZGVyRGVwYXJ0bWVudDogUmVmZXJlbnRpYWwgfCBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoUmVmZXJlbnRpYWxVdGlscy5pc0VtcHR5KHJlY29yZGVyRGVwYXJ0bWVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzQWRtaW4oKTtcbiAgICB9XG5cbiAgICAvLyBTaG91bGQgYmUgbG9naW4sIGFuZCBzdGF0dXMgRU5BQkxFXG4gICAgaWYgKCF0aGlzLl9kYXRhIHx8ICF0aGlzLl9kYXRhLnB1YmtleSB8fCB0aGlzLl9kYXRhLnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuRU5BQkxFKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuX2RhdGEuZGVwYXJ0bWVudCB8fCAhdGhpcy5fZGF0YS5kZXBhcnRtZW50LmlkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1VzZXIgYWNjb3VudCBoYXMgbm8gZGVwYXJ0bWVudCAhIFVuYWJsZSB0byBjaGVjayB3cml0ZSByaWdodCBhZ2FpbnN0IHJlY29yZGVyRGVwYXJ0bWVudCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNhbWUgcmVjb3JkZXIgZGVwYXJ0bWVudDogT0ssIHVzZXIgY2FuIHdyaXRlXG4gICAgaWYgKHRoaXMuX2RhdGEuZGVwYXJ0bWVudC5pZCA9PT0gcmVjb3JkZXJEZXBhcnRtZW50LmlkKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIENhbm5vdCB3cml0ZVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyKGRhdGE6IFJlZ2lzdGVyRGF0YSk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICh0aGlzLmlzTG9naW4oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIGFscmVhZHkgbG9naW4uIFBsZWFzZSBsb2dvdXQgYmVmb3JlIHJlZ2lzdGVyLicpO1xuICAgIH1cbiAgICBpZiAoIWRhdGEudXNlcm5hbWUgfHwgIWRhdGEucGFzc3dvcmQpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCB1c2VybmFtZSBvciBwYXNzd29yZCcpO1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gUmVnaXN0ZXIgbmV3IHVzZXIgYWNjb3VudC4uLicsIGRhdGEuYWNjb3VudCk7XG4gICAgdGhpcy5fY2FjaGUubG9hZGVkID0gZmFsc2U7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBrZXlwYWlyID0gYXdhaXQgQ3J5cHRvU2VydmljZS5zY3J5cHRLZXlwYWlyKGRhdGEudXNlcm5hbWUsIGRhdGEucGFzc3dvcmQpO1xuICAgICAgZGF0YS5hY2NvdW50LnB1YmtleSA9IEJhc2U1OC5lbmNvZGUoa2V5cGFpci5wdWJsaWNLZXkpO1xuXG4gICAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgICAgZGF0YS5hY2NvdW50LnNldHRpbmdzID0gZGF0YS5hY2NvdW50LnNldHRpbmdzIHx8IG5ldyBVc2VyU2V0dGluZ3MoKTtcbiAgICAgIGRhdGEuYWNjb3VudC5zZXR0aW5ncy5sb2NhbGUgPSB0aGlzLnNldHRpbmdzLmxvY2FsZTtcbiAgICAgIGRhdGEuYWNjb3VudC5zZXR0aW5ncy5sYXRMb25nRm9ybWF0ID0gdGhpcy5zZXR0aW5ncy5sYXRMb25nRm9ybWF0O1xuICAgICAgZGF0YS5hY2NvdW50LnNldHRpbmdzLmNvbnRlbnQgPSBkYXRhLmFjY291bnQuc2V0dGluZ3MuY29udGVudCB8fCB7fTtcbiAgICAgIGRhdGEuYWNjb3VudC5kZXBhcnRtZW50LmlkID0gZGF0YS5hY2NvdW50LmRlcGFydG1lbnQuaWQgfHwgdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0RGVwYXJ0bWVudElkO1xuXG4gICAgICB0aGlzLl9jYWNoZS5rZXlwYWlyID0ga2V5cGFpcjtcbiAgICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCB0aGlzLnNhdmVSZW1vdGVseShkYXRhLmFjY291bnQsIGtleXBhaXIpO1xuXG4gICAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgICAgYWNjb3VudC5hdmF0YXIgPSBhY2NvdW50LmF2YXRhciB8fCAodGhpcy5lbnZpcm9ubWVudC5iYXNlVXJsICsgREVGQVVMVF9BVkFUQVJfSU1BR0UpO1xuICAgICAgdGhpcy5fY2FjaGUubWFpblByb2ZpbGUgPSBQZXJzb25VdGlscy5nZXRNYWluUHJvZmlsZShhY2NvdW50LnByb2ZpbGVzKTtcblxuICAgICAgdGhpcy5fZGF0YSA9IGFjY291bnQ7XG4gICAgICB0aGlzLl9jYWNoZS5wdWJrZXkgPSBhY2NvdW50LnB1YmtleTtcblxuICAgICAgLy8gVHJ5IHRvIGF1dGggb24gcG9kXG4gICAgICBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZShkYXRhKTtcblxuICAgICAgdGhpcy5fY2FjaGUubG9hZGVkID0gdHJ1ZTtcblxuICAgICAgYXdhaXQgdGhpcy5zYXZlTG9jYWxseSgpO1xuXG4gICAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gQWNjb3VudCBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgKTtcblxuICAgICAgLy8gRW1pdCBldmVudHNcbiAgICAgIHRoaXMub25Mb2dpbi5uZXh0KHRoaXMuX2RhdGEpO1xuICAgICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEpO1xuXG4gICAgICAvLyBMaXN0ZW4gcmVtb3RlIGNoYW5nZXNcbiAgICAgIGlmICh0aGlzLl9lbmFibGVMaXN0ZW5DaGFuZ2VzKSB0aGlzLnN0YXJ0TGlzdGVuUmVtb3RlQ2hhbmdlcygpO1xuXG4gICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yICYmIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xuICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZShkYXRhPzogQXV0aERhdGEpIHtcbiAgICAvLyBXYWl0IHRoZSBhdXRoIHRva2VuLCB0aGVuIGNvbnRpbnVlXG4gICAgY29uc3QgdG9rZW5UeXBlID0gYXdhaXQgZmlyc3ROb3ROaWxQcm9taXNlKHRoaXMuX3Rva2VuVHlwZSQpO1xuXG4gICAgLy8gQmFzaWMgYXV0aFxuICAgIGlmICh0b2tlblR5cGUgPT09ICdiYXNpYycgfHwgdG9rZW5UeXBlID09PSAnYmFzaWMtYW5kLXRva2VuJykge1xuXG4gICAgICAvLyBHZW5lcmF0ZSB0aGUgYXV0aEJhc2ljLCBpZiB1c2VkXG4gICAgICBpZiAoIXRoaXMuX2NhY2hlLmF1dGhCYXNpYykge1xuICAgICAgICAvLyBTa2lwIGlmIHRva2VuIGFscmVhZHkgcHJvdmlkZWRcbiAgICAgICAgaWYgKCEodGhpcy5fY2FjaGUuYXV0aFRva2VuICYmIHRva2VuVHlwZSA9PT0gJ2Jhc2ljLWFuZC10b2tlbicpKSB7XG4gICAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLnVzZXJuYW1lIHx8ICFkYXRhLnBhc3N3b3JkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdXNlcm5hbWUgYW5kIHBhc3N3b3JkJyk7XG4gICAgICAgICAgdGhpcy5fY2FjaGUuYXV0aEJhc2ljID0gQ3J5cHRvU2VydmljZS5lbmNvZGVCYXNlNjQoYCR7ZGF0YS51c2VybmFtZX06JHtkYXRhLnBhc3N3b3JkfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLm9uQXV0aEJhc2ljQ2hhbmdlLm5leHQodGhpcy5fY2FjaGUuYXV0aEJhc2ljKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSB0aGUgYXV0aFRva2VuLCBpZiB1c2VkXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gJ3Rva2VuJyB8fCB0b2tlblR5cGUgPT09ICdiYXNpYy1hbmQtdG9rZW4nKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jYWNoZS5hdXRoVG9rZW4gPSBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZUFuZEdldFRva2VuKHRoaXMuX2NhY2hlLmF1dGhUb2tlbik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBOZXZlciBhdXRoZW50aWNhdGUsIG9yIG5vdCByZWFkeSBmb3Igb2ZmbGluZSBtb2RlID0+IGV4aXRcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIHRoaXMucmVzZXREYXRhKCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcmdldCBhdXRoQmFzaWMsIHRvIHN3aXRjaCB0byBhdXRoVG9rZW5cbiAgICBpZiAodG9rZW5UeXBlID09PSAnYmFzaWMtYW5kLXRva2VuJykge1xuICAgICAgdGhpcy5fY2FjaGUuYXV0aEJhc2ljID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9naW4oZGF0YTogQXV0aERhdGEpOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICBpZiAoIWRhdGEgfHwgIWRhdGEudXNlcm5hbWUgfHwgIWRhdGEucGFzc3dvcmQpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCB1c2VybmFtZSBvciBwYXNzd29yZCcpO1xuXG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIExvZ2luLi4uJyk7XG5cbiAgICBsZXQga2V5cGFpcjtcbiAgICB0cnkge1xuICAgICAga2V5cGFpciA9IGF3YWl0IENyeXB0b1NlcnZpY2Uuc2NyeXB0S2V5cGFpcihkYXRhLnVzZXJuYW1lLCBkYXRhLnBhc3N3b3JkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgdGhyb3cgeyBjb2RlOiBFcnJvckNvZGVzLlVOS05PV05fRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5TQ1JZUFRfRVJST1InIH07XG4gICAgfVxuXG4gICAgLy8gU3RvcmUgcHVia2V5K2tleXBhaXJcbiAgICB0aGlzLl9jYWNoZS5wdWJrZXkgPSBCYXNlNTguZW5jb2RlKGtleXBhaXIucHVibGljS2V5KTtcbiAgICB0aGlzLl9jYWNoZS5rZXlwYWlyID0ga2V5cGFpcjtcblxuICAgIC8vIFRyeSB0byBsb2FkIHByZXZpb3VzIHRva2VuXG4gICAgbGV0IHByZXZpb3VzVG9rZW46IHN0cmluZyA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoVE9LRU5fU1RPUkFHRV9LRVkpO1xuICAgIHByZXZpb3VzVG9rZW4gPSBwcmV2aW91c1Rva2VuICYmIHByZXZpb3VzVG9rZW4uc3RhcnRzV2l0aCh0aGlzLl9jYWNoZS5wdWJrZXkpICYmIHByZXZpb3VzVG9rZW4gfHwgbnVsbDtcblxuICAgIC8vIE9mZmxpbmUgbW9kZVxuICAgIGNvbnN0IG9mZmxpbmUgPSB0aGlzLnNldHRpbmdzLmhhc09mZmxpbmVGZWF0dXJlKCkgJiYgKHRoaXMubmV0d29yay5vZmZsaW5lIHx8IGRhdGEub2ZmbGluZSA9PT0gdHJ1ZSk7XG4gICAgaWYgKG9mZmxpbmUpICB7XG4gICAgICB0aGlzLl9jYWNoZS5hdXRoVG9rZW4gPSBwcmV2aW91c1Rva2VuO1xuXG4gICAgICAvLyBNYWtlIHN1cmUgbmV0d29yayBpZiBzZXQgYXMgb2ZmbGluZVxuICAgICAgdGhpcy5uZXR3b3JrLnNldEZvcmNlT2ZmbGluZSh0cnVlLCB7c2hvd1RvYXN0OiBmYWxzZX0pO1xuICAgICAgY29uc29sZS5pbmZvKGBbYWNjb3VudF0gTG9naW4gW09LXSB7cHVia2V5OiAke3RoaXMuX2NhY2hlLnB1YmtleS5zdWJzdHIoMCwgOCl9fSwge29mZmxpbmU6IHRydWV9YCk7XG4gICAgfVxuXG4gICAgLy8gT25saW5lIG1vZGU6IHRyeSB0byBhdXRoIG9uIHBvZFxuICAgIGVsc2Uge1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE5ldmVyIGF1dGhlbnRpY2F0ZSwgb3Igbm90IHJlYWR5IGZvciBvZmZsaW5lIG1vZGUgPT4gZXhpdFxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhY2NvdW50IGRhdGFcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkRGF0YSh7b2ZmbGluZSwgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknfSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIElmIGFjY291bnQgbm90IGZvdW5kLCBjaGVjayBpZiBlbWFpbCBpcyB2YWxpZFxuICAgICAgaWYgKGVyciAmJiArKGVyci5jb2RlKSA9PT0gRXJyb3JDb2Rlcy5MT0FEX0FDQ09VTlRfRVJST1IpIHtcblxuICAgICAgICAvLyBDaGVjayBlbWFpbCBleGlzdHNcbiAgICAgICAgaWYgKGRhdGEudXNlcm5hbWUuaW5kZXhPZignQCcpICE9PSAtMSkge1xuICAgICAgICAgIGxldCBpc0VtYWlsRXhpc3RzO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpc0VtYWlsRXhpc3RzID0gYXdhaXQgdGhpcy5pc0VtYWlsRXhpc3RzKGRhdGEudXNlcm5hbWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKG90aGVyRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGVycjsgLy8gcmVzZW5kIHRoZSBmaXJzdCBlcnJvclxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtYWlsIG5vdCBleGlzdHMgKG5vIGFjY291bnQpXG4gICAgICAgICAgaWYgKCFpc0VtYWlsRXhpc3RzKSB7XG4gICAgICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuVU5LTk9XTl9BQ0NPVU5UX0VNQUlMLCBtZXNzYWdlOiAnRVJST1IuVU5LTk9XTl9BQ0NPVU5UX0VNQUlMJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtYWlsIGV4aXN0cywgc28gZXJyb3IgPSAnYmFkIHBhc3N3b3JkJ1xuICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuQkFEX1BBU1NXT1JELCBtZXNzYWdlOiAnRVJST1IuQkFEX1BBU1NXT1JEJyB9O1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7IC8vIHJlc2VuZCB0aGUgZmlyc3QgZXJyb3JcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gU3RvcmUgdG8gbG9jYWwgc3RvcmFnZVxuICAgICAgYXdhaXQgdGhpcy5zYXZlTG9jYWxseSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIEVtaXQgZXZlbnQgdG8gb2JzZXJ2ZXJzXG4gICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YSk7XG4gICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEpO1xuXG4gICAgaWYgKHRoaXMuX2VuYWJsZUxpc3RlbkNoYW5nZXMpIHRoaXMuc3RhcnRMaXN0ZW5SZW1vdGVDaGFuZ2VzKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIGFzeW5jIHJlbG9hZChvcHRzPzoge3Nob3dUb2FzdD86IGJvb2xlYW59KTogUHJvbWlzZTxBY2NvdW50PiB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZS5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkJyk7XG4gICAgaWYgKHRoaXMubmV0d29yay5vZmZsaW5lKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjaGVjayBhY2NvdW50IGluIG9mZmxpbmUgbW9kZScpO1xuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gUmVsb2FkaW5nIGFjY291bnQuLi5gKTtcbiAgICBjb25zdCB3YXNMb2dpbiA9IHRoaXMuaXNMb2dpbigpO1xuXG4gICAgdHJ5IHtcblxuICAgICAgYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgYXdhaXQgdGhpcy5zYXZlTG9jYWxseSgpO1xuXG4gICAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gUmVsb2FkaW5nIGFjY291bnQgW09LXSBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgKTtcblxuICAgICAgLy8gRW1pdCBsb2dpbiBldmVudCB0byBzdWJzY3JpYmVyc1xuICAgICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlLm5leHQodGhpcy5fZGF0YSk7XG5cbiAgICAgIC8vIERpc3BsYXkgdG9hc3QgKHdpdGhvdXQgYXdhaXQsIGJlY2F1c2Ugbm90IG5lZWQgdG8gd2FpdCB0b2FzdCBjbG9zZSBldmVudClcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLnNob3dUb2FzdCAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5zaG93VG9hc3Qoe21lc3NhZ2U6ICdBQ0NPVU5ULklORk8uUkVMT0FERUQnLCB0eXBlOiAnaW5mbyd9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ2Fubm90IHJlbG9hZCBidXQgd2FzIGxvZ2luOiBmb3JjZSB0byBsb2dvdXRcbiAgICAgIGlmICh3YXNMb2dpbiAmJiAhdGhpcy5pc0xvZ2luKCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW2FjY291bnRdIFJlbG9hZGluZyBhY2NvdW50IGZhaWxlZC4gV2lsbCBmb3JjZSBsb2dvdXQuLi5gLCBlcnJvcik7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvciB1cGRhdGUgYW4gdXNlciBhY2NvdW50LCB0byB0aGUgcmVtb3RlIHN0b3JhZ2VcbiAgICpcbiAgICogQHBhcmFtIGFjY291bnRcbiAgICovXG4gIGFzeW5jIHNhdmUoYWNjb3VudDogQWNjb3VudCk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICghdGhpcy5fY2FjaGUucHVia2V5KSByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ1VzZXIgbm90IGxvZ2dlZCcpO1xuICAgIGlmICh0aGlzLl9jYWNoZS5wdWJrZXkgIT09IGFjY291bnQucHVia2V5KSByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ05vdCB1c2VyIGFjY291bnQnKTtcblxuICAgIGFjY291bnQgPSBhd2FpdCB0aGlzLnNhdmVSZW1vdGVseShhY2NvdW50LCB0aGlzLl9jYWNoZS5rZXlwYWlyKTtcblxuICAgIC8vIFNldCBkZWZhdWx0c1xuICAgIGFjY291bnQuYXZhdGFyID0gYWNjb3VudC5hdmF0YXIgfHwgKHRoaXMuZW52aXJvbm1lbnQuYmFzZVVybCArIERFRkFVTFRfQVZBVEFSX0lNQUdFKTtcbiAgICB0aGlzLl9jYWNoZS5tYWluUHJvZmlsZSA9IFBlcnNvblV0aWxzLmdldE1haW5Qcm9maWxlKGFjY291bnQucHJvZmlsZXMpO1xuXG4gICAgdGhpcy5fZGF0YSA9IGFjY291bnQ7XG4gICAgdGhpcy5fY2FjaGUubG9hZGVkID0gdHJ1ZTtcblxuICAgIC8vIFNhdmUgbG9jYWxseSAoaW4gc3RvcmFnZSlcbiAgICBhd2FpdCB0aGlzLnNhdmVMb2NhbGx5KCk7XG5cbiAgICAvLyBTZW5kIGV2ZW50XG4gICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YSk7XG4gICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBhc3luYyBsb2dvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICBjb25zdCBoYWRBdXRoVG9rZW4gPSB0aGlzLl9jYWNoZS5hdXRoVG9rZW4gJiYgdHJ1ZTtcbiAgICBjb25zdCBoYWRBdXRoQmFzaWMgPSB0aGlzLl9jYWNoZS5hdXRoQmFzaWMgJiYgdHJ1ZTtcbiAgICBjb25zdCBwdWJrZXkgPSB0aGlzLl9jYWNoZSAmJiB0aGlzLl9jYWNoZS5wdWJrZXk7XG5cbiAgICB0aGlzLnJlc2V0RGF0YSgpO1xuXG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLmhhc09mZmxpbmVGZWF0dXJlKCkpIHtcblxuICAgICAgLy8gUmVtb3ZlIGFsbCBkYXRhIGZyb20gdGhlIGxvY2FsIHN0b3JhZ2VcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShQVUJLRVlfU1RPUkFHRV9LRVkpLFxuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKFRPS0VOX1NUT1JBR0VfS0VZKSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShBQ0NPVU5UX1NUT1JBR0VfS0VZKSxcbiAgICAgICAgcHVia2V5ICYmIHRoaXMuc3RvcmFnZS5yZW1vdmUoQUNDT1VOVF9TVE9SQUdFX0tFWSArICcjJyArIHB1YmtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoU0VDS0VZX1NUT1JBR0VfS0VZKVxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gT2ZmbGluZSBmZWF0dXJlcyBlbmFibGU6IG5lZWQgdG8ga2VlcCBzb21lIGRhdGFcbiAgICBlbHNlIHtcbiAgICAgIC8vIEFsd2F5cyByZW1vdmUgb25seSBzZWNyZXQga2V5XG4gICAgICAvLyBCdXQga2VlcDpcbiAgICAgIC8vIC0gYWNjb3VudCBieSBwdWJrZXlcbiAgICAgIC8vIC0gYXV0aCB0b2tlblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKFBVQktFWV9TVE9SQUdFX0tFWSksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoQUNDT1VOVF9TVE9SQUdFX0tFWSksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoU0VDS0VZX1NUT1JBR0VfS0VZKVxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gcGFnZSBoaXN0b3J5LCBpbiBsb2NhbCBzZXR0aW5nc1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MuY2xlYXJQYWdlSGlzdG9yeSgpO1xuXG4gICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgIHRoaXMub25Mb2dvdXQubmV4dCgpO1xuICAgIGlmIChoYWRBdXRoVG9rZW4pIHRoaXMub25BdXRoVG9rZW5DaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgIGlmIChoYWRBdXRoQmFzaWMpIHRoaXMub25BdXRoQmFzaWNDaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMub25DaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBhY2NvdW50XG4gICAqXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBhc3luYyBsb2FkKG9wdHM/OiB7XG4gICAgb2ZmbGluZT86IGJvb2xlYW47XG4gICAgZmV0Y2hQb2xpY3k/OiBGZXRjaFBvbGljeTtcbiAgICBxdWVyeT86IGFueTtcbiAgfSk6IFByb21pc2U8QWNjb3VudCB8IHVuZGVmaW5lZD4ge1xuXG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBMb2FkaW5nIGFjY291bnQuLi5gKTtcbiAgICBsZXQganNvbjogYW55O1xuXG4gICAgLy8gTG9hZCBsb2NhbGx5XG4gICAgY29uc3Qgb2ZmbGluZSA9IHRoaXMubmV0d29yay5vZmZsaW5lXG4gICAgICAmJiAoIW9wdHMgfHwgKG9wdHMuZmV0Y2hQb2xpY3kgIT09ICduZXR3b3JrLW9ubHknICYmIG9wdHMuZmV0Y2hQb2xpY3kgIT09ICduby1jYWNoZScpKVxuICAgICAgfHwgKG9wdHMgJiYgb3B0cy5vZmZsaW5lID09PSB0cnVlKTtcbiAgICBpZiAob2ZmbGluZSkge1xuICAgICAganNvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoQUNDT1VOVF9TVE9SQUdFX0tFWSk7XG4gICAgICBqc29uID0ganNvbiAmJiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSAmJiBKU09OLnBhcnNlKGpzb24pIHx8IGpzb247XG4gICAgICBqc29uID0ganNvbiAmJiB0aGlzLl9jYWNoZS5wdWJrZXkgJiYgKGpzb24ucHVia2V5ID09PSB0aGlzLl9jYWNoZS5wdWJrZXkpICYmIGpzb24gfHwgbnVsbDtcbiAgICAgIGlmICghanNvbiAmJiB0aGlzLl9jYWNoZS5wdWJrZXkpIHtcbiAgICAgICAganNvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoQUNDT1VOVF9TVE9SQUdFX0tFWSArICcjJyArIHRoaXMuX2NhY2hlLnB1YmtleSk7XG4gICAgICAgIGpzb24gPSBqc29uICYmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpICYmIEpTT04ucGFyc2UoanNvbikgfHwganNvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2FkIHJlbW90ZWx5XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBxdWVyeSA9IG9wdHM/LnF1ZXJ5IHx8ICh0aGlzLmFwaVRva2VuRW5hYmxlZCA/IFF1ZXJpZXMubG9hZFdpdGhUb2tlbnMgOiBRdWVyaWVzLmxvYWQpO1xuICAgICAgY29uc3Qge2RhdGF9ID0gYXdhaXQgdGhpcy5ncmFwaHFsLnF1ZXJ5PHsgZGF0YTogYW55IH0+KHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGVycm9yOiB7IGNvZGU6IEVycm9yQ29kZXMuTE9BRF9BQ0NPVU5UX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuTE9BRF9BQ0NPVU5UX0VSUk9SJyB9LFxuICAgICAgICBmZXRjaFBvbGljeTogb3B0cyAmJiBvcHRzLmZldGNoUG9saWN5IHx8ICduby1jYWNoZScgfHwgdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIGpzb24gPSBkYXRhO1xuICAgIH1cblxuICAgIGlmIChqc29uKSB7XG4gICAgICBjb25zdCBhY2NvdW50ID0gQWNjb3VudC5mcm9tT2JqZWN0KGpzb24pO1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gQWNjb3VudCBsb2FkZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCwgYWNjb3VudCk7XG4gICAgICAgcmV0dXJuIGFjY291bnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBbYWNjb3VudF0gQWNjb3VudCBub3QgZm91bmQgIWApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZVRva2VuKGZsYWdzOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBHZW5lcmF0ZSB0b2tlbi4uLmApO1xuXG4gICAgY29uc3QgYXV0aENoYWxsZW5nZSA9IGF3YWl0IHRoaXMuZ2V0QXV0aENoYWxsZW5nZSgpO1xuICAgIC8vIEFkZCBGbGFncyB0byBjaGFsbGVuZ2VcbiAgICBjb25zdCBjaGFsbGVuZ2UgPSBgJHthdXRoQ2hhbGxlbmdlLmNoYWxsZW5nZX06JHtmbGFnc31gO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IENyeXB0b1NlcnZpY2Uuc2lnbihjaGFsbGVuZ2UsIHRoaXMuX2NhY2hlLmtleXBhaXIpO1xuICAgIGNvbnN0IG5ld1Rva2VuID0gYCR7dGhpcy5fY2FjaGUucHVia2V5fToke2NoYWxsZW5nZX18JHtzaWduYXR1cmV9YDtcblxuICAgIGlmIChuZXdUb2tlbikge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gVG9rZW4gZ2VuZXJhdGVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oYFthY2NvdW50XSBUb2tlbiBnZW5lcmF0aW9uIGZhaWxlZCAhYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld1Rva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVtYWlsIGlzIGF2YWlsYWJsZSBmb3IgbmV3IGFjY291bnQgcmVnaXN0cmF0aW9uLlxuICAgKiBUaHJvdyBhbiBlcnJvciBpZiBub3QgYXZhaWxhYmxlXG4gICAqXG4gICAqIEBwYXJhbSBlbWFpbFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFbWFpbEF2YWlsYWJsZShlbWFpbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaXNFbWFpbEV4aXN0cyA9IGF3YWl0IHRoaXMuaXNFbWFpbEV4aXN0cyhlbWFpbCk7XG4gICAgaWYgKGlzRW1haWxFeGlzdHMpIHtcbiAgICAgIHRocm93IHsgY29kZTogRXJyb3JDb2Rlcy5FTUFJTF9BTFJFQURZX1JFR0lTVEVSRUQsIG1lc3NhZ2U6ICdFUlJPUi5FTUFJTF9BTFJFQURZX1JFR0lTVEVSRUQnIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVtYWlsIGlzIGV4aXN0cyBpbiBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBlbWFpbFxuICAgKi9cbiAgYXN5bmMgaXNFbWFpbEV4aXN0cyhlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBDaGVja2luZyBpZiB7JyArIGVtYWlsICsgJ30gZXhpc3RzLi4uJyk7XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5ncmFwaHFsLnF1ZXJ5PHsgaXNFbWFpbEV4aXN0czogYm9vbGVhbiB9LCBJc0VtYWlsRXhpc3RzVmFyaWFibGVzPih7XG4gICAgICBxdWVyeTogSXNFbWFpbEV4aXN0c1F1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGVtYWlsLFxuICAgICAgICBoYXNoOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIEVtYWlsIGV4aXN0OiAnICsgKGRhdGEgJiYgZGF0YS5pc0VtYWlsRXhpc3RzKSk7XG5cbiAgICByZXR1cm4gZGF0YSAmJiBkYXRhLmlzRW1haWxFeGlzdHM7XG4gIH1cblxuICBhc3luYyBzZW5kQ29uZmlybWF0aW9uRW1haWwoZW1haWw6IHN0cmluZywgbG9jYWxlPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG5cbiAgICBsb2NhbGUgPSBsb2NhbGUgfHwgdGhpcy5zZXR0aW5ncy5sb2NhbGU7XG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFNlbmRpbmcgY29uZmlybWF0aW9uIGVtYWlsIHRvIHsnICsgZW1haWwgKyAnfSB3aXRoIGxvY2FsZSB7JyArIGxvY2FsZSArICd9Li4uJyk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ncmFwaHFsLm11dGF0ZTxib29sZWFuPih7XG4gICAgICBtdXRhdGlvbjogU2VuZENvbmZpcm1FbWFpbE11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGVtYWlsLFxuICAgICAgICBsb2NhbGVcbiAgICAgIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlNFTlRfQ09ORklSTUFUSU9OX0VNQUlMX0ZBSUxFRCxcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLlNFTlRfQUNDT1VOVF9DT05GSVJNQVRJT05fRU1BSUxfRkFJTEVEJ1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY29uZmlybUVtYWlsKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFNlbmRpbmcgY29uZmlybSByZXF1ZXN0IGZvciBlbWFpbCB7JyArIGVtYWlsICsgJ30gd2l0aCBjb2RlIHsnICsgY29kZSArICd9Li4uJyk7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdyYXBocWwubXV0YXRlPHsgY29uZmlybUFjY291bnRFbWFpbDogYm9vbGVhbiB9Pih7XG4gICAgICBtdXRhdGlvbjogQ29uZmlybUVtYWlsTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgZW1haWwsXG4gICAgICAgIGNvZGVcbiAgICAgIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkNPTkZJUk1fRU1BSUxfRkFJTEVELFxuICAgICAgICBtZXNzYWdlOiAnRVJST1IuQ09ORklSTV9BQ0NPVU5UX0VNQUlMX0ZBSUxFRCdcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzICYmIHJlcy5jb25maXJtQWNjb3VudEVtYWlsO1xuICB9XG5cbiAgbGlzdGVuQ2hhbmdlcyhvcHRzPzogQWNjb3VudFdhdGNoT3B0aW9ucyk6IFN1YnNjcmlwdGlvbiB7XG4gICAgaWYgKHRoaXMuX2VuYWJsZUxpc3RlbkNoYW5nZXMpIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKCk7IC8vIEFscmVhZHkgc3RhcnRlZDogc2tpcFxuXG4gICAgcmV0dXJuIHRoaXMuc3RhcnRMaXN0ZW5SZW1vdGVDaGFuZ2VzKG9wdHMpO1xuICB9XG5cbiAgZ2V0IGFkZGl0aW9uYWxGaWVsZHMoKTogRm9ybUZpZWxkRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fJGFkZGl0aW9uYWxGaWVsZHMuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldCAkYWRkaXRpb25hbEZpZWxkcygpOiBPYnNlcnZhYmxlPEZvcm1GaWVsZERlZmluaXRpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLl8kYWRkaXRpb25hbEZpZWxkcy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldEFkZGl0aW9uYWxGaWVsZChrZXk6IHN0cmluZyk6IEZvcm1GaWVsZERlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl8kYWRkaXRpb25hbEZpZWxkcy5nZXRWYWx1ZSgpLmZpbmQoZiA9PiBmLmtleSA9PT0ga2V5KTtcbiAgfVxuXG4gIHJlZ2lzdGVyQWRkaXRpb25hbEZpZWxkKGZpZWxkOiBGb3JtRmllbGREZWZpbml0aW9uKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5fJGFkZGl0aW9uYWxGaWVsZHMuZ2V0VmFsdWUoKTtcbiAgICBpZiAodmFsdWVzLmZpbmQoZiA9PiBmLmtleSA9PT0gZmllbGQua2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZGRpdGlvbmFsIGFjY291bnQgZmllbGQge2tleTogJHtmaWVsZC5rZXl9fSBhbHJlYWR5IGRlZmluZS5gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gRm91bmQgYWRkaXRpb25hbCBhY2NvdW50J3MgZmllbGQge2tleTogJHtmaWVsZC5rZXl9fWApO1xuICAgIHRoaXMuXyRhZGRpdGlvbmFsRmllbGRzLm5leHQodmFsdWVzLmNvbmNhdChmaWVsZCkpO1xuICB9XG5cbiAgZ2V0IG9wdGlvbkRlZnMoKTogRm9ybUZpZWxkRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uRGVmcztcbiAgfVxuXG4gIHJlZ2lzdGVyT3B0aW9uKGRlZjogRm9ybUZpZWxkRGVmaW5pdGlvbikge1xuICAgIGlmICh0aGlzLl9vcHRpb25EZWZzLmZpbmRJbmRleChmID0+IGYua2V5ID09PSBkZWYua2V5KSAhPT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWRkaXRpb25hbCBvcHRpb24geyR7ZGVmLmtleX19IGFscmVhZHkgZGVmaW5lLmApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBZGRpbmcgYWRkaXRpb25hbCBvcHRpb24geyR7ZGVmLmtleX19YCwgZGVmKTtcbiAgICB0aGlzLl9vcHRpb25EZWZzLnB1c2goZGVmKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT3B0aW9ucyhkZWZzOiBGb3JtRmllbGREZWZpbml0aW9uW10pIHtcbiAgICAoZGVmcyB8fCBbXSkuZm9yRWFjaChkZWYgPT4gdGhpcy5yZWdpc3Rlck9wdGlvbihkZWYpKTtcbiAgfVxuXG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZCAtLSAqL1xuXG4gIHByb3RlY3RlZCByZXNldERhdGEoKSB7XG4gICAgdGhpcy5zdG9wTGlzdGVuUmVtb3RlQ2hhbmdlcygpO1xuICAgIHRoaXMuX2NhY2hlLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NhY2hlLmtleXBhaXIgPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlLmF1dGhUb2tlbiA9IG51bGw7XG4gICAgdGhpcy5fY2FjaGUuYXV0aEJhc2ljID0gbnVsbDtcbiAgICB0aGlzLl9jYWNoZS5wdWJrZXkgPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlLm1haW5Qcm9maWxlID0gbnVsbDtcbiAgICB0aGlzLl9jYWNoZS5wZXJzb24gPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlLmRlcGFydG1lbnQgPSBudWxsO1xuICAgIHRoaXMuX2RhdGEgPSBuZXcgQWNjb3VudCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWREYXRhKG9wdHM/OiB7XG4gICAgb2ZmbGluZT86IGJvb2xlYW47XG4gICAgZmV0Y2hQb2xpY3k/OiBGZXRjaFBvbGljeTtcbiAgfSk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICghdGhpcy5fY2FjaGUucHVia2V5KSB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGxvZ2dlZCcpO1xuXG4gICAgdGhpcy5fY2FjaGUubG9hZGVkID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYWNjb3VudCA9IChhd2FpdCB0aGlzLmxvYWQob3B0cykpIHx8IG5ldyBBY2NvdW50KCk7XG5cbiAgICAgIC8vIFNldCBkZWZhdWx0c1xuICAgICAgYWNjb3VudC5hdmF0YXIgPSBhY2NvdW50LmF2YXRhciB8fCAodGhpcy5lbnZpcm9ubWVudC5iYXNlVXJsICsgREVGQVVMVF9BVkFUQVJfSU1BR0UpO1xuICAgICAgYWNjb3VudC5zZXR0aW5ncyA9IGFjY291bnQuc2V0dGluZ3MgfHwgbmV3IFVzZXJTZXR0aW5ncygpO1xuICAgICAgYWNjb3VudC5zZXR0aW5ncy5sb2NhbGUgPSBhY2NvdW50LnNldHRpbmdzLmxvY2FsZSB8fCB0aGlzLnNldHRpbmdzLmxvY2FsZTtcbiAgICAgIGFjY291bnQuc2V0dGluZ3MubGF0TG9uZ0Zvcm1hdCA9IGFjY291bnQuc2V0dGluZ3MubGF0TG9uZ0Zvcm1hdCB8fCB0aGlzLnNldHRpbmdzLmxhdExvbmdGb3JtYXQgfHwgJ0RETU0nO1xuICAgICAgYWNjb3VudC5zZXR0aW5ncy5jb250ZW50ID0gYWNjb3VudC5zZXR0aW5ncy5jb250ZW50IHx8IHt9O1xuXG4gICAgICAvLyBSZWFkIG1haW4gcHJvZmlsZVxuICAgICAgdGhpcy5fY2FjaGUubWFpblByb2ZpbGUgPSBQZXJzb25VdGlscy5nZXRNYWluUHJvZmlsZShhY2NvdW50LnByb2ZpbGVzKTtcblxuICAgICAgLy8gVXBkYXRlLCBpbnN0ZWFkIG9mIHJlcGxhY2UgaXRcbiAgICAgIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuZnJvbU9iamVjdChhY2NvdW50KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLl9kYXRhID0gYWNjb3VudDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhY2hlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgIC8vIEFwcGx5IHNldHRpbmdzLCBmb3VuZCBpbiByZW1vdGUgYWNjb3VudFxuICAgICAgaWYgKGFjY291bnQuc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgICAgLi4udGhpcy5zZXR0aW5ncy5zZXR0aW5ncyxcbiAgICAgICAgICAuLi5hY2NvdW50LnNldHRpbmdzLmFzTG9jYWxTZXR0aW5ncygpXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MuYXBwbHkoc2V0dGluZ3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgaWYgKGVycm9yLmNvZGUgJiYgZXJyb3IubWVzc2FnZSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhyb3cge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkxPQURfQUNDT1VOVF9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLkxPQURfQUNDT1VOVF9FUlJPUidcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGxpc3RlblNldHRpbmdzKCk6IFByb21pc2U8dm9pZD57XG4gICAgLy8gV2hlbiBzZXR0aW5ncyBjaGFuZ2VkOiBzYXZlIGl0IHJlbW90ZWx5XG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuc2V0dGluZ3Mub25DaGFuZ2VcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDEwMDApLFxuICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmlzTG9naW4oKSAmJiB0aGlzLm5ldHdvcmsub25saW5lKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoc2V0dGluZ3MgPT4gdGhpcy5zYXZlTG9jYWxTZXR0aW5nc1JlbW90ZWx5KHNldHRpbmdzKSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc3RvcmVMb2NhbGx5KCk6IFByb21pc2U8QWNjb3VudCB8IHVuZGVmaW5lZD4ge1xuXG4gICAgLy8gUmVzdG9yZSBmcm9tIHN0b3JhZ2VcbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnN0b3JhZ2UuZ2V0KFBVQktFWV9TVE9SQUdFX0tFWSksXG4gICAgICB0aGlzLnN0b3JhZ2UuZ2V0KFRPS0VOX1NUT1JBR0VfS0VZKSxcbiAgICAgIHRoaXMuc3RvcmFnZS5nZXQoU0VDS0VZX1NUT1JBR0VfS0VZKVxuICAgIF0pO1xuICAgIGxldCBwdWJrZXkgPSB2YWx1ZXNbMF07XG4gICAgbGV0IHRva2VuID0gdmFsdWVzWzFdO1xuICAgIGNvbnN0IHNlY2tleSA9IHZhbHVlc1syXTtcblxuICAgIC8vIERFViBvbmx5IC0gYXV0aCBieSB0b2tlblxuICAgIGlmICghdGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uICYmIHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdEF1dGhWYWx1ZXM/LnRva2VuKSB7XG4gICAgICB0b2tlbiA9IHRva2VuIHx8IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdEF1dGhWYWx1ZXMudG9rZW47XG4gICAgICBwdWJrZXkgPSBwdWJrZXkgfHwgdG9rZW4/LnNwbGl0KCc6JywgMilbMF07XG4gICAgfVxuXG4gICAgLy8gUXVpdCBpZiBubyBwdWJrZXkgKG5vdCBsb2dnZWQpXG4gICAgaWYgKCFwdWJrZXkpIHJldHVybjtcblxuICAgIC8vIFF1aXQgaWYgY291bGQgbm90IGF1dGggb24gcG9kXG4gICAgY29uc3QgY2FuUmVtb3RlQXV0aCA9IHRva2VuIHx8IHNlY2tleSB8fCBmYWxzZTtcbiAgICBpZiAoIWNhblJlbW90ZUF1dGgpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIEFjY291bnQgcmVzdG9yYXRpb24uLi5gKTtcblxuICAgIHRoaXMuX2NhY2hlLmF1dGhUb2tlbiA9IHRva2VuO1xuICAgIHRoaXMuX2NhY2hlLnB1YmtleSA9IHB1YmtleTtcbiAgICB0aGlzLl9jYWNoZS5rZXlwYWlyID0gc2Vja2V5ICYmIHtcbiAgICAgIHB1YmxpY0tleTogQmFzZTU4LmRlY29kZShwdWJrZXkpLFxuICAgICAgc2VjcmV0S2V5OiBCYXNlNTguZGVjb2RlKHNlY2tleSlcbiAgICB9IHx8IG51bGw7XG5cbiAgICAvLyBPbmxpbmUgbW9kZTogdHJ5IHRvIGNvbm5lY3QgdG8gcG9kXG4gICAgaWYgKHRoaXMubmV0d29yay5vbmxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKCk7XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGUuYXV0aFRva2VuICYmICF0aGlzLl9jYWNoZS5hdXRoQmFzaWMpIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkJyk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gT2ZmbGluZSBmZWF0dXJlIGFyZSBlbmFibGU6IGNvbnRpbnVlIGluIG9mZmxpbmUgbW9kZVxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5oYXNPZmZsaW5lRmVhdHVyZSgpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbYWNjb3VudF0gVW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBvbiBwb2Q6IGZvcmNpbmcgb2ZmbGluZSBtb2RlJyk7XG4gICAgICAgICAgdGhpcy5uZXR3b3JrLnNldEZvcmNlT2ZmbGluZSh0cnVlLCB7c2hvd1RvYXN0OiBmYWxzZX0pO1xuICAgICAgICAgIC8vIENvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gb2ZmbGluZSBmZWF0dXJlcyBlbmFibGUgKD1vZmZsaW5lIG1vZGUgbm90IGFsbG93ZWQpXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGFjY291bnQsIGZyb20gcHVia2V5XG4gICAgbGV0IGpzb25BY2NvdW50ID0gYXdhaXQgdGhpcy5zdG9yYWdlLmdldChgJHtBQ0NPVU5UX1NUT1JBR0VfS0VZfSMke3B1YmtleX1gKTtcbiAgICBpZiAoIWpzb25BY2NvdW50KSB7XG4gICAgICAvLyBUcnkgdXNpbmcgdGhlIG9sZCBzdG9yYWdlIGtleVxuICAgICAgY29uc3QgYWNjb3VudFN0ciA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoQUNDT1VOVF9TVE9SQUdFX0tFWSk7XG4gICAgICBqc29uQWNjb3VudCA9IGFjY291bnRTdHIgJiYgKCh0eXBlb2YgYWNjb3VudFN0ciA9PT0gJ3N0cmluZycpICYmIEpTT04ucGFyc2UoanNvbkFjY291bnQpIHx8IGFjY291bnRTdHIpO1xuICAgIH1cblxuICAgIC8vIEludmFsaWQgYWNjb3VudDogZG8gbm90IHVzZSBpdFxuICAgIGlmICghanNvbkFjY291bnQgfHwganNvbkFjY291bnQucHVia2V5ICE9PSBwdWJrZXkpIHtcblxuICAgICAgLy8gREVWIG9ubHk6IGNyZWF0ZSBhIGZha2UgYWNjb3VudCB3aXRoIGdpdmVuIHVzZXJuYW1lXG4gICAgICBpZiAoIXRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbiAmJiB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRBdXRoVmFsdWVzLnVzZXJuYW1lKSB7XG4gICAgICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0QXV0aFZhbHVlcy51c2VybmFtZTtcbiAgICAgICAganNvbkFjY291bnQgPSB7cHVia2V5LCB1c2VybmFtZSwgZmlyc3ROYW1lOiB1c2VybmFtZSwgbGFzdE5hbWU6IHVzZXJuYW1lfTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIHRvIGVudGl0eVxuICAgIGNvbnN0IGFjY291bnQgPSBBY2NvdW50LmZyb21PYmplY3QoanNvbkFjY291bnQpO1xuXG4gICAgLy8gVXBkYXRlIGRhdGFcbiAgICB0aGlzLl9kYXRhID0gYWNjb3VudDtcbiAgICB0aGlzLl9jYWNoZS5tYWluUHJvZmlsZSA9IFBlcnNvblV0aWxzLmdldE1haW5Qcm9maWxlKGFjY291bnQucHJvZmlsZXMpO1xuICAgIHRoaXMuX2NhY2hlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAvLyBFbWl0IGV2ZW50XG4gICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YSk7XG4gICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEpO1xuXG4gICAgaWYgKHRoaXMuX2VuYWJsZUxpc3RlbkNoYW5nZXMpIHRoaXMuc3RhcnRMaXN0ZW5SZW1vdGVDaGFuZ2VzKCk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBY2NvdW50IHJlc3RvcmF0aW9uIFtPS10ge3B1YmtleTogJHtwdWJrZXkuc3Vic3RyKDAsIDgpfX0sIHtwcm9maWxlOiAke3RoaXMuX2NhY2hlLm1haW5Qcm9maWxlfX1gKTtcblxuICAgIHJldHVybiBhY2NvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYWNjb3VudCBpbnRvIHRoZSBsb2NhbCBzdG9yYWdlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZUxvY2FsbHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZS5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkJyk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBTYXZpbmcgYWNjb3VudCB7JHt0aGlzLl9jYWNoZS5wdWJrZXkuc3Vic3RyaW5nKDAsIDYpfX0gaW4gbG9jYWwgc3RvcmFnZS4uLmApO1xuXG4gICAgLy8gQ29udmVydCBhY2NvdW50IHRvIGpzb25cbiAgICBjb25zdCBqc29uID0gdGhpcy5fZGF0YS5hc09iamVjdCh7a2VlcFR5cGVuYW1lOiB0cnVlfSk7XG4gICAgY29uc3Qgc2Vja2V5ID0gdGhpcy5fY2FjaGUua2V5cGFpciAmJiB0aGlzLl9jYWNoZS5rZXlwYWlyLnNlY3JldEtleSAmJiBCYXNlNTguZW5jb2RlKHRoaXMuX2NhY2hlLmtleXBhaXIuc2VjcmV0S2V5KSB8fCBudWxsO1xuXG4gICAgLy8gQ29udmVydCBhdmF0YXIgVVJMIHRvIGRhdGFVcmwgKGUuZy4gJ2RhdGE6aW1hZ2UvcG5nOjxiYXNlNjQgY29udGVudD4nKVxuICAgIGNvbnN0IGhhc0F2YXRhclVybCA9IGpzb24uYXZhdGFyICYmICFqc29uLmF2YXRhci5lbmRzV2l0aChERUZBVUxUX0FWQVRBUl9JTUFHRSkgJiZcbiAgICAgIChqc29uLmF2YXRhci5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgKGpzb24uYXZhdGFyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKTtcbiAgICBpZiAoaGFzQXZhdGFyVXJsICYmIHRoaXMubmV0d29yay5vbmxpbmUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZS5nZXRJbWFnZShqc29uLmF2YXRhciwge1xuICAgICAgICB0aHVtYm5haWw6IHRydWUsXG4gICAgICAgIG91dHB1dFR5cGU6ICdkYXRhVXJsJ1xuICAgICAgfSlcbiAgICAgICAgLnRoZW4oZGF0YVVybCA9PiB7XG4gICAgICAgICAgaWYgKGRhdGFVcmwgJiYgdGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBJbWFnZSBmZXRjaGVkOiAnLCBkYXRhVXJsLnN1YnN0cmluZygwLCA1MCkpO1xuXG4gICAgICAgICAgLy8gVE9ETzogbWFrZSBzdXJlIHRvIGRpc3BsYXkgQmFzZTY0IGltYWdlIGluIHRoZSBtZW51IHRvcCBoZWFkZXJcbiAgICAgICAgICAvL2pzb25BY2NvdW50LmF2YXRhciA9IGRhdGFVcmw7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFthY2NvdW50XSBFcnJvciB3aGlsZSBmZXRjaGluZyBpbWFnZTogJHtqc29uLmF2YXRhcn06ICR7ZXJyfWApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KFBVQktFWV9TVE9SQUdFX0tFWSwgdGhpcy5fY2FjaGUucHVia2V5KSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldChUT0tFTl9TVE9SQUdFX0tFWSwgdGhpcy5fY2FjaGUuYXV0aFRva2VuKSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldChgJHtBQ0NPVU5UX1NUT1JBR0VfS0VZfSMke3RoaXMuX2NhY2hlLnB1YmtleX1gLCBqc29uKSxcbiAgICAgICAgLy8gU2VjcmV0IGtleSAob3B0aW9uYWwpXG4gICAgICAgIHNlY2tleSAmJiB0aGlzLnN0b3JhZ2Uuc2V0KFNFQ0tFWV9TVE9SQUdFX0tFWSwgc2Vja2V5KSB8fCB0aGlzLnN0b3JhZ2UucmVtb3ZlKFNFQ0tFWV9TVE9SQUdFX0tFWSksXG4gICAgICAgIC8vIFJlbW92ZSBvbGQgc3RvcmFnZSBrZXlcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShBQ0NPVU5UX1NUT1JBR0VfS0VZKVxuICAgICAgXSk7XG5cbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIEFjY291bnQgc2F2ZWQgaW4gbG9jYWwgc3RvcmFnZScpO1xuICAgIH1cbiAgICBjYXRjaChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1thY2NvdW50XSBFcnJvciB3aGlsZSBzYXZpbmcgYWNjb3VudCBsb2NhbGx5OiAnICsgKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gICBhc3luYyBzYXZlTG9jYWxTZXR0aW5nc1JlbW90ZWx5KHNvdXJjZTogTG9jYWxTZXR0aW5ncyl7XG4gICAgIGlmICghc291cmNlIHx8ICF0aGlzLmlzTG9naW4oKSB8fCBzb3VyY2UuYWNjb3VudEluaGVyaXRhbmNlID09PSBmYWxzZSkgcmV0dXJuOyAvLyBTa2lwXG4gICAgIGNvbnN0IGFjY291bnQgPSB0aGlzLmFjY291bnQ7XG5cbiAgICAgLy8gTWVyZ2UgbG9jYWwgc2V0dGluZ3MgaW50byBhY2NvdW50J3Mgc2V0dGluZ3NcbiAgICAgY29uc3Qgc2V0dGluZ3MgPSBVc2VyU2V0dGluZ3MuZnJvbU9iamVjdChhY2NvdW50LnNldHRpbmdzKSB8fCBuZXcgVXNlclNldHRpbmdzKCk7XG4gICAgIGNvbnN0IGNoYW5nZWQgPSBzZXR0aW5ncy5tZXJnZShzb3VyY2UsIFsnbG9jYWxlJywgJ2xhdExvbmdGb3JtYXQnLCAncHJvcGVydGllcyddKTtcblxuICAgICBpZiAoIWNoYW5nZWQpIHJldHVybjsgLy8gU2tpcCBpZiB1bmNoYW5nZWRcblxuICAgICAvLyBTYXZlIHJlbW90ZWx5XG4gICAgIHRoaXMuYWNjb3VudC5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICBhd2FpdCB0aGlzLnNhdmVTZXR0aW5nc1JlbW90ZWx5KHNldHRpbmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb3IgdXBkYXRlIGFuIHVzZXIgYWNjb3VudFxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudFxuICAgKiBAcGFyYW0ga2V5UGFpclxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVSZW1vdGVseShhY2NvdW50OiBBY2NvdW50LCBrZXlQYWlyPzogS2V5cGFpcik6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGFjY291bnQucHVia2V5ID0gYWNjb3VudC5wdWJrZXkgfHwgKGtleVBhaXIgJiYgQmFzZTU4LmVuY29kZShrZXlQYWlyLnB1YmxpY0tleSkpO1xuICAgIGlmICghYWNjb3VudC5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBhY2NvdW50IHB1YmtleScpO1xuXG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBTYXZpbmcgYWNjb3VudCByZW1vdGVseS4uLmApO1xuXG4gICAgY29uc3QgaXNOZXcgPSBpc05pbChhY2NvdW50LmlkKTtcblxuICAgIC8vIElmIHRoaXMgaXMgYW4gdXBkYXRlOiBnZXQgZXhpc3RpbmcgYWNjb3VudCdzIHVwZGF0ZURhdGUsIHRvIGF2b2lkICd2ZXJzaW9uIGVycm9yJyB3aGVuIHNhdmluZ1xuICAgIGlmICghaXNOZXcpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQWNjb3VudCA9IGF3YWl0IHRoaXMubG9hZCh7IGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyB9KTtcbiAgICAgIGlmICghZXhpc3RpbmdBY2NvdW50IHx8ICFleGlzdGluZ0FjY291bnQudXBkYXRlRGF0ZSkge1xuICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuQUNDT1VOVF9OT1RfRVhJU1RTLCBtZXNzYWdlOiAnRVJST1IuQUNDT1VOVF9OT1RfRVhJU1RTJyB9O1xuICAgICAgfVxuICAgICAgdGhpcy5jb3B5SWRBbmRVcGRhdGVEYXRlKGV4aXN0aW5nQWNjb3VudCwgYWNjb3VudCk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2luZyBzZXR0aW5nc1xuICAgIGFjY291bnQuc2V0dGluZ3MuY29udGVudFsncGFnZXMnXSA9IHRoaXMuc2V0dGluZ3Muc2V0dGluZ3MucGFnZXM7XG4gICAgYWNjb3VudC5zZXR0aW5ncy5jb250ZW50WydwYWdlSGlzdG9yeSddID0gdGhpcy5zZXR0aW5ncy5zZXR0aW5ncy5wYWdlSGlzdG9yeTtcblxuICAgIC8vIENvbnZlcnQgdG8ganNvblxuICAgIGNvbnN0IGpzb24gPSBhY2NvdW50LmFzT2JqZWN0KE1JTklGWV9FTlRJVFlfRk9SX1BPRCk7XG5cbiAgICAvLyBVc2VyIG5vdCBhbGxvdyB0byBjaGFuZ2UgaGlzIHByb2ZpbGVzXG4gICAgZGVsZXRlIGpzb24ucHJvZmlsZXM7XG5cbiAgICBjb25zdCBtdXRhdGlvbiA9IGlzTmV3ID8gTXV0YXRpb25zLmNyZWF0ZSA6XG4gICAgICAodGhpcy5fYXBpVG9rZW5FbmFibGVkICA/IE11dGF0aW9ucy5zYXZlV2l0aFRva2VucyA6IE11dGF0aW9ucy5zYXZlKTtcblxuICAgIC8vIEV4ZWN1dGUgbXV0YXRpb25cbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5tdXRhdGU8eyBkYXRhOiBBY2NvdW50IH0+KHtcbiAgICAgIG11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7IGRhdGE6IGpzb24gfSxcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIGNvZGU6IEVycm9yQ29kZXMuU0FWRV9BQ0NPVU5UX0VSUk9SLFxuICAgICAgICBtZXNzYWdlOiAnRVJST1IuU0FWRV9BQ0NPVU5UX0VSUk9SJ1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ29weSB1cGRhdGUgcHJvcGVydGllc1xuICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZShkYXRhLCBhY2NvdW50KTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIEFjY291bnQgcmVtb3RlbHkgc2F2ZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG5cbiAgICByZXR1cm4gYWNjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb3IgdXBkYXRlIHVzZXIgc2V0dGluZ3NcbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZVNldHRpbmdzUmVtb3RlbHkoc2V0dGluZ3M6IFVzZXJTZXR0aW5ncykge1xuXG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBTYXZpbmcgc2V0dGluZ3MgcmVtb3RlbHkuLi5gKTtcblxuICAgIGNvbnN0IGpzb24gPSBzZXR0aW5ncy5hc09iamVjdChNSU5JRllfRU5USVRZX0ZPUl9QT0QpO1xuXG4gICAgLy8gRXhlY3V0ZSBtdXRhdGlvblxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5ncmFwaHFsLm11dGF0ZTx7IGRhdGE6IFVzZXJTZXR0aW5ncyB9Pih7XG4gICAgICBtdXRhdGlvbjogTXV0YXRpb25zLnNhdmVTZXR0aW5ncyxcbiAgICAgIHZhcmlhYmxlczogeyBkYXRhOiBqc29uIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlNBVkVfU0VUVElOR1NfRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6ICdFUlJPUi5TQVZFX1NFVFRJTkdTX0VSUk9SJ1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ29weSB1cGRhdGUgcHJvcGVydGllc1xuICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZVNldHRpbmdzKGRhdGEsIHNldHRpbmdzKTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFNldHRpbmdzIHJlbW90ZWx5IHNhdmVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgLy8gU2F2ZSBpbnRvIGFjY291bnRcbiAgICBpZiAodGhpcy5hY2NvdW50KSB0aGlzLmFjY291bnQuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhdXRoZW50aWNhdGVBbmRHZXRUb2tlbih0b2tlbj86IHN0cmluZywgY291bnRlcj86IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZS5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkJyk7XG5cbiAgICBpZiAoIWNvdW50ZXIpIGNvbnNvbGUuaW5mbygnW2FjY291bnRdIEF1dGhlbnRpY2F0aW9uIG9uIHBvZC4uLicpO1xuXG4gICAgaWYgKGNvdW50ZXIgPiA0KSB7XG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBGYWlsZWQgdG8gYXV0aGVudGljYXRpb24gb24gcG9kIChhZnRlciAke2NvdW50ZXJ9IGF0dGVtcHRzKWApO1xuICAgICAgdGhyb3cgeyBjb2RlOiBFcnJvckNvZGVzLkFVVEhfU0VSVkVSX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuQVVUSF9TRVJWRVJfRVJST1InIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdmFsaWRcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmdyYXBocWwucXVlcnk8eyBhdXRoZW50aWNhdGU6IGJvb2xlYW4gfSwgeyB0b2tlbjogc3RyaW5nIH0+KHtcbiAgICAgICAgcXVlcnk6IEF1dGhRdWVyeSxcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgdG9rZW5cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlVOQVVUSE9SSVpFRCxcbiAgICAgICAgICBtZXNzYWdlOiAnRVJST1IuVU5BVVRIT1JJWkVEJ1xuICAgICAgICB9LFxuICAgICAgICBmZXRjaFBvbGljeTogJ25vLWNhY2hlJ1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRva2VuIGlzIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXJcbiAgICAgIGlmIChkYXRhICYmIGRhdGEuYXV0aGVudGljYXRlKSB7XG4gICAgICAgIC8vIFN0b3JlIHRoZSB0b2tlblxuICAgICAgICB0aGlzLm9uQXV0aFRva2VuQ2hhbmdlLm5leHQodG9rZW4pO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgW2FjY291bnRdIEF1dGhlbnRpY2F0aW9uIG9uIHBvZCBbT0tdIHtwdWJrZXk6ICcke3RoaXMuX2NhY2hlLnB1YmtleS5zdWJzdHIoMCwgOCl9J31gKTtcbiAgICAgICAgcmV0dXJuIHRva2VuOyAvLyByZXR1cm4gdGhlIHRva2VuXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRpbnVlICh3aWxsIHJldHJ5IHdpdGggYW5vdGhlciBjaGFsbGVuZ2UpXG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgYSBuZXcgdG9rZW5cbiAgICBjb25zdCBhdXRoQ2hhbGxlbmdlID0gYXdhaXQgdGhpcy5nZXRBdXRoQ2hhbGxlbmdlKCk7XG4gICAgLy8gVE9ETzogY2hlY2sgc2VydmVyIHB1YmtleSBhcyBhIHZhbGlkIGNlcnRpZmljYXRlXG5cbiAgICAvLyBEbyB0aGUgY2hhbGxlbmdlXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgQ3J5cHRvU2VydmljZS5zaWduKGF1dGhDaGFsbGVuZ2UuY2hhbGxlbmdlLCB0aGlzLl9jYWNoZS5rZXlwYWlyKTtcbiAgICBjb25zdCBuZXdUb2tlbiA9IGAke3RoaXMuX2NhY2hlLnB1YmtleX06JHthdXRoQ2hhbGxlbmdlLmNoYWxsZW5nZX18JHtzaWduYXR1cmV9YDtcblxuICAgIC8vIGl0ZXJhdGUgd2l0aCB0aGUgbmV3IHRva2VuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlQW5kR2V0VG9rZW4obmV3VG9rZW4sIChjb3VudGVyIHx8IDEpICsgMSAvKiBpbmNyZW1lbnQgKi8pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEF1dGhDaGFsbGVuZ2UoKTogUHJvbWlzZTxJQXV0aENoYWxsZW5nZT4ge1xuICAgIGNvbnN0IGNoYWxsZW5nZUVycm9yID0ge1xuICAgICAgY29kZTogRXJyb3JDb2Rlcy5BVVRIX0NIQUxMRU5HRV9FUlJPUixcbiAgICAgIG1lc3NhZ2U6ICdFUlJPUi5BVVRIX0NIQUxMRU5HRV9FUlJPUidcbiAgICB9O1xuICAgIGNvbnN0IHsgYXV0aENoYWxsZW5nZX0gPSBhd2FpdCB0aGlzLmdyYXBocWwucXVlcnk8e1xuICAgICAgYXV0aENoYWxsZW5nZTogSUF1dGhDaGFsbGVuZ2U7XG4gICAgfT4oe1xuICAgICAgcXVlcnk6IEF1dGhDaGFsbGVuZ2VRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge30sXG4gICAgICBlcnJvcjogY2hhbGxlbmdlRXJyb3IsXG4gICAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seSdcbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGNoYWxsZW5nZVxuICAgIGlmICghYXV0aENoYWxsZW5nZSkgdGhyb3cgY2hhbGxlbmdlRXJyb3I7IC8vIFNob3VsZCBuZXZlciBvY2N1clxuXG4gICAgLy8gQ2hlY2sgc2VydmVyIHNpZ25hdHVyZVxuICAgIGNvbnN0IHNpZ25hdHVyZU9LID0gYXdhaXQgQ3J5cHRvU2VydmljZS52ZXJpZnkoXG4gICAgICBhdXRoQ2hhbGxlbmdlLmNoYWxsZW5nZSxcbiAgICAgIGF1dGhDaGFsbGVuZ2Uuc2lnbmF0dXJlLFxuICAgICAgYXV0aENoYWxsZW5nZS5wdWJrZXlcbiAgICApO1xuICAgIGlmICghc2lnbmF0dXJlT0spIHtcbiAgICAgIGNvbnNvbGUud2FybignRklYTUU6IEJhZCBwZWVyIHNpZ25hdHVyZSBvbiBhdXRoIGNoYWxsZW5nZSAhJywgYXV0aENoYWxsZW5nZSk7XG4gICAgfVxuICAgIHJldHVybiBhdXRoQ2hhbGxlbmdlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0TGlzdGVuUmVtb3RlQ2hhbmdlcyhvcHRzPzogQWNjb3VudFdhdGNoT3B0aW9ucyk6IFN1YnNjcmlwdGlvbiB7XG4gICAgaWYgKHRoaXMuX2xpc3RlbkNoYW5nZXNTdWJzY3JpcHRpb24pIHRoaXMuc3RvcExpc3RlblJlbW90ZUNoYW5nZXMoKTsgLy8gU3RvcCBwcmV2aW91cyBzdWJzY3JpcHRpb25cbiAgICBpZiAodGhpcy5uZXR3b3JrLm9mZmxpbmUpIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKCk7IC8vIE9mZmxpbmU6IHNraXBcblxuICAgIHRoaXMuX2xpc3RlbkNoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLndhdGNoQ2hhbmdlcyhvcHRzKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChkYXRhKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFJlbW90ZSB1cGRhdGUgZGV0ZWN0ZWQgYXQgJHtkYXRhLnVwZGF0ZURhdGV9YCk7XG4gICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBpZiAoZXJyICYmICtlcnIuY29kZSA9PT0gU2VydmVyRXJyb3JDb2Rlcy5OT1RfRk9VTkQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnW2FjY291bnRdIFtXU10gQWNjb3VudCBub3QgZXhpc3RzIGFueW1vcmU6IGZvcmNlIHVzZXIgdG8gbG9nb3V0Li4uJywgZXJyKTtcbiAgICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlcnIgJiYgK2Vyci5jb2RlID09PSBTZXJ2ZXJFcnJvckNvZGVzLlVOQVVUSE9SSVpFRCkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdbYWNjb3VudF0gW1dTXSBBY2NvdW50IG5vdCBhdXRob3JpemVkOiBmb3JjZSB1c2VyIHRvIGxvZ291dC4uLicsIGVycik7XG4gICAgICAgICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1thY2NvdW50XSBbV1NdIFJlY2VpdmVkIGVycm9yOicsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLl9saXN0ZW5DaGFuZ2VzU3Vic2NyaXB0aW9uLmFkZCgoKSA9PiB7XG4gICAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gU3RvcCB3YXRjaGluZyByZW1vdGUgY2hhbmdlc2ApO1xuICAgICAgdGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RlbkNoYW5nZXNTdWJzY3JpcHRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RvcExpc3RlblJlbW90ZUNoYW5nZXMoKSB7XG4gICAgdGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YXRjaENoYW5nZXMob3B0cz86IEFjY291bnRXYXRjaE9wdGlvbnMpOiBPYnNlcnZhYmxlPEFjY291bnQ+IHtcblxuICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAvLyBXYWl0IHNlcnZpY2UgcmVhZHksIHRoZW4gbG9vcFxuICAgICAgcmV0dXJuIGZyb20odGhpcy5yZWFkeSgpKVxuICAgICAgICAucGlwZShzd2l0Y2hNYXAoKCkgPT4gdGhpcy53YXRjaENoYW5nZXMob3B0cykpKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2NhY2hlLnB1YmtleSkgdGhyb3cgbmV3IEVycm9yKCdOb3QgbG9nZ2VkIGluJyk7XG4gICAgaWYgKHRoaXMubmV0d29yay5vZmZsaW5lKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB3YXRjaCBhY2NvdW50IGNoYW5nZXM6IG5ldHdvcmsgaXMgb2ZmbGluZS4nKTtcblxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHtcbiAgICAgIGludGVydmFsOiB0b051bWJlcihvcHRzICYmIG9wdHMuaW50ZXJ2YWxJblNlY29uZHMsIHRoaXMuX2xpc3RlbkludGVydmFsSW5TZWNvbmRzKVxuICAgIH07XG5cbiAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gV2F0Y2hpbmcgcmVtb3RlIGNoYW5nZXMsIGV2ZXJ5ICR7dmFyaWFibGVzLmludGVydmFsfXNgKTtcblxuICAgIHJldHVybiB0aGlzLmdyYXBocWwuc3Vic2NyaWJlPHtkYXRhOiBhbnl9Pih7XG4gICAgICBxdWVyeTogQWNjb3VudFN1YnNjcmlwdGlvbnMubGlzdGVuQ2hhbmdlcyxcbiAgICAgIHZhcmlhYmxlcyxcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIGNvZGU6IEVycm9yQ29kZXMuU1VCU0NSSUJFX0FDQ09VTlRfRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6ICdFUlJPUi5BQ0NPVU5ULlNVQlNDUklCRV9FUlJPUidcbiAgICAgIH1cbiAgICB9KS5waXBlKFxuICAgICAgICBtYXAoKHtkYXRhfSkgPT4gZGF0YSksXG4gICAgICAgIC8vIEtlZXAgb25seSBpZiBuZXdlclxuICAgICAgICBmaWx0ZXIoZGF0YSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVwZGF0ZURhdGU6IE1vbWVudCA9IGZyb21EYXRlSVNPU3RyaW5nKHRoaXMuX2RhdGE/LnVwZGF0ZURhdGUpO1xuICAgICAgICAgIGNvbnN0IHJlbW90ZVVwZGF0ZURhdGU6IE1vbWVudCA9IGZyb21EYXRlSVNPU3RyaW5nKGRhdGE/LnVwZGF0ZURhdGUpO1xuICAgICAgICAgIHJldHVybiAocmVtb3RlVXBkYXRlRGF0ZSAmJiAoIWN1cnJlbnRVcGRhdGVEYXRlIHx8ICFyZW1vdGVVcGRhdGVEYXRlLmlzU2FtZShjdXJyZW50VXBkYXRlRGF0ZSwgJ21pbGxpc2Vjb25kJykpKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29weUlkQW5kVXBkYXRlRGF0ZShzb3VyY2U6IEFjY291bnQgfCB1bmRlZmluZWQsIHRhcmdldDogQWNjb3VudCkge1xuICAgIGlmICghc291cmNlKSByZXR1cm47XG5cbiAgICB0YXJnZXQuaWQgPSBzb3VyY2UuaWQgfHwgdGFyZ2V0LmlkO1xuICAgIHRhcmdldC51cGRhdGVEYXRlID0gc291cmNlLnVwZGF0ZURhdGUgfHwgdGFyZ2V0LnVwZGF0ZURhdGU7XG5cbiAgICAvLyBVcGRhdGUgc2V0dGluZ3NcbiAgICB0aGlzLmNvcHlJZEFuZFVwZGF0ZURhdGVTZXR0aW5ncyhzb3VyY2Uuc2V0dGluZ3MsIHRhcmdldC5zZXR0aW5ncyk7XG5cbiAgICAvLyBVcGRhdGUgdG9rZW5zXG4gICAgaWYgKHRoaXMuX2FwaVRva2VuRW5hYmxlZCkge1xuICAgICAgdGhpcy5jb3B5SWRBbmRVcGRhdGVEYXRlVG9rZW4oc291cmNlLnRva2VucywgdGFyZ2V0LnRva2Vucyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNvcHlJZEFuZFVwZGF0ZURhdGVTZXR0aW5ncyhzb3VyY2U6IFVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZCwgdGFyZ2V0OiBVc2VyU2V0dGluZ3MpIHtcbiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xuXG4gICAgdGFyZ2V0LmlkID0gc291cmNlLmlkIHx8IHRhcmdldC5pZDtcbiAgICB0YXJnZXQudXBkYXRlRGF0ZSA9IHNvdXJjZS51cGRhdGVEYXRlIHx8IHRhcmdldC51cGRhdGVEYXRlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvcHlJZEFuZFVwZGF0ZURhdGVUb2tlbihzb3VyY2VzOiBVc2VyVG9rZW5bXSB8IHVuZGVmaW5lZCwgdGFyZ2V0czogVXNlclRva2VuW10pIHtcbiAgICBpZiAoaXNFbXB0eUFycmF5KHNvdXJjZXMpKSByZXR1cm47XG5cbiAgICBzb3VyY2VzLmZvckVhY2goc291cmNlID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldHMuZmluZCh2YWx1ZSA9PiB2YWx1ZS5pZCA9PT0gc291cmNlLmlkIHx8IHZhbHVlLm5hbWUgPT09IHNvdXJjZS5uYW1lKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmlkID0gc291cmNlLmlkIHx8IHRhcmdldC5pZDtcbiAgICAgICAgdGFyZ2V0LmNyZWF0aW9uRGF0ZSA9IHNvdXJjZS5jcmVhdGlvbkRhdGUgfHwgdGFyZ2V0LmNyZWF0aW9uRGF0ZTtcbiAgICAgICAgdGFyZ2V0LnVwZGF0ZURhdGUgPSBzb3VyY2UudXBkYXRlRGF0ZSB8fCB0YXJnZXQudXBkYXRlRGF0ZTtcbiAgICAgICAgdGFyZ2V0LnRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dUb2FzdDxUID0gYW55PihvcHRzOiBTaG93VG9hc3RPcHRpb25zKTogUHJvbWlzZTxPdmVybGF5RXZlbnREZXRhaWw8VD4+IHtcbiAgICByZXR1cm4gVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCBvcHRzKTtcbiAgfVxufVxuIl19
1346
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3NlcnZpY2VzL2FjY291bnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQVcsTUFBTSxrQkFBa0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQVUsV0FBVyxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEYsT0FBTyxFQUFlLEdBQUcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBT3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBZSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVB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Q0MseUJBQXlCOzJHQTdFcEMsY0FBYyxjQURELE1BQU07OzJGQUNuQixjQUFjO2tCQUQxQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRTs7MEJBMkVsRCxRQUFROzswQkFDUixRQUFROzswQkFDUixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlLCBLZXlwYWlyIH0gZnJvbSAnLi9jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQgeyBEZXBhcnRtZW50IH0gZnJvbSAnLi9tb2RlbC9kZXBhcnRtZW50Lm1vZGVsJztcbmltcG9ydCB7IEFjY291bnQsIEFjY291bnRVdGlscywgVXNlclNldHRpbmdzIH0gZnJvbSAnLi9tb2RlbC9hY2NvdW50Lm1vZGVsJztcbmltcG9ydCB7IFBlcnNvbiwgUGVyc29uVXRpbHMsIFVzZXJQcm9maWxlTGFiZWwgfSBmcm9tICcuL21vZGVsL3BlcnNvbi5tb2RlbCc7XG5pbXBvcnQgeyBMb2NhbFNldHRpbmdzLCBVc2FnZU1vZGUgfSBmcm9tICcuL21vZGVsL3NldHRpbmdzLm1vZGVsJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGZXRjaFBvbGljeSwgZ3FsIH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQgeyBTdG9yYWdlIH0gZnJvbSAnQGlvbmljL3N0b3JhZ2UtYW5ndWxhcic7XG5cbmltcG9ydCB7IGlzRW1wdHlBcnJheSwgaXNOaWwsIHNsZWVwLCB0b051bWJlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgQmFzZUdyYXBocWxTZXJ2aWNlIH0gZnJvbSAnLi9iYXNlLWdyYXBocWwtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBTZXJ2ZXJFcnJvckNvZGVzIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgR3JhcGhxbFNlcnZpY2UgfSBmcm9tICcuLi9ncmFwaHFsL2dyYXBocWwuc2VydmljZSc7XG5pbXBvcnQgeyBMb2NhbFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4vbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtRmllbGREZWZpbml0aW9uLCBGb3JtRmllbGREZWZpbml0aW9uTWFwIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Zvcm0vZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgTmV0d29ya1NlcnZpY2UgfSBmcm9tICcuL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoVG9rZW5UeXBlIH0gZnJvbSAnLi9uZXR3b3JrLnR5cGVzJztcbmltcG9ydCB7IEZpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ZpbGUvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IE1JTklGWV9FTlRJVFlfRk9SX1BPRCwgUmVmZXJlbnRpYWwsIFJlZmVyZW50aWFsVXRpbHMgfSBmcm9tICcuL21vZGVsL3JlZmVyZW50aWFsLm1vZGVsJztcbmltcG9ydCB7IFN0YXR1c0lkcyB9IGZyb20gJy4vbW9kZWwvbW9kZWwuZW51bSc7XG5pbXBvcnQgeyBCYXNlNTggfSBmcm9tICcuL2Jhc2U1OCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgZnJvbURhdGVJU09TdHJpbmcgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGF0ZXMnO1xuaW1wb3J0IHsgZmlyc3ROb3ROaWxQcm9taXNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL29ic2VydmFibGVzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEJhc2VFbnRpdHlHcmFwaHFsTXV0YXRpb25zLCBCYXNlRW50aXR5R3JhcGhxbFF1ZXJpZXMsIEJhc2VFbnRpdHlHcmFwaHFsU3Vic2NyaXB0aW9ucyB9IGZyb20gJy4vYmFzZS1lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgU2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQgeyBPdmVybGF5RXZlbnREZXRhaWwgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBUb2FzdENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBUb2tlblNjb3BlLCBVc2VyVG9rZW4gfSBmcm9tICcuL21vZGVsL3Rva2VuLm1vZGVsJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEFjY291bnREZXRhaWxzIHtcbiAgbG9hZGVkOiBib29sZWFuO1xuICBrZXlwYWlyOiBLZXlwYWlyO1xuICBhdXRoVG9rZW46IHN0cmluZztcbiAgYXV0aEJhc2ljPzogc3RyaW5nO1xuICBwdWJrZXk6IHN0cmluZztcbiAgcGVyc29uOiBQZXJzb247XG4gIGRlcGFydG1lbnQ6IERlcGFydG1lbnQ7XG4gIG1haW5Qcm9maWxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aERhdGEge1xuICB1c2VybmFtZTogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xuICBvZmZsaW5lPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRhdGEgZXh0ZW5kcyBBdXRoRGF0YSB7XG4gIGFjY291bnQ6IEFjY291bnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbmdlUGFzc3dvcmREYXRhIHtcbiAgcGFzc3dvcmQ6IHN0cmluZztcbiAgY29uZmlybVBhc3N3b3JkOiBzdHJpbmc7XG4gIGVtYWlsOiBzdHJpbmc7XG59XG5cbmNvbnN0IFRPS0VOX1NUT1JBR0VfS0VZID0gJ3Rva2VuJztcbmNvbnN0IFBVQktFWV9TVE9SQUdFX0tFWSA9ICdwdWJrZXknO1xuY29uc3QgU0VDS0VZX1NUT1JBR0VfS0VZID0gJ3NlY2tleSc7XG5jb25zdCBBQ0NPVU5UX1NUT1JBR0VfS0VZID0gJ2FjY291bnQnO1xuXG5jb25zdCBERUZBVUxUX0FWQVRBUl9JTUFHRSA9ICdhc3NldHMvaW1nL3BlcnNvbi5wbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJTZXR0aW5nc09wdGlvbnMge1xuICBvcHRpb25zOiBGb3JtRmllbGREZWZpbml0aW9uTWFwO1xufVxuXG5leHBvcnQgY29uc3QgQVBQX1VTRVJfU0VUVElOR1NfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxVc2VyU2V0dGluZ3NPcHRpb25zPignVXNlclNldHRpbmdzT3B0aW9ucycpO1xuZXhwb3J0IGNvbnN0IEFQUF9VU0VSX1RPS0VOX1NDT1BFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUb2tlblNjb3BlW10+KCdVc2VyVG9rZW5TY29wZXMnKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBHcmFwaFFMIHF1ZXJpZXNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5jb25zdCBGcmFnbWVudHMgPSB7XG4gIGFjY291bnQ6IGdxbGBcbiAgICBmcmFnbWVudCBBY2NvdW50RnJhZ21lbnQgb24gQWNjb3VudFZPIHtcbiAgICAgIGlkXG4gICAgICBmaXJzdE5hbWVcbiAgICAgIGxhc3ROYW1lXG4gICAgICBlbWFpbFxuICAgICAgcHVia2V5XG4gICAgICBhdmF0YXJcbiAgICAgIHN0YXR1c0lkXG4gICAgICB1cGRhdGVEYXRlXG4gICAgICBjcmVhdGlvbkRhdGVcbiAgICAgIHByb2ZpbGVzXG4gICAgICBzZXR0aW5ncyB7XG4gICAgICAgIC4uLlVzZXJTZXR0aW5nc0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBkZXBhcnRtZW50IHtcbiAgICAgICAgaWRcbiAgICAgICAgbGFiZWxcbiAgICAgICAgbmFtZVxuICAgICAgICBfX3R5cGVuYW1lXG4gICAgICB9XG4gICAgICBfX3R5cGVuYW1lXG4gICAgfVxuICBgLFxuXG4gIHNldHRpbmdzOiBncWxgXG4gICAgZnJhZ21lbnQgVXNlclNldHRpbmdzRnJhZ21lbnQgb24gVXNlclNldHRpbmdzVk8ge1xuICAgICAgaWRcbiAgICAgIGxvY2FsZVxuICAgICAgbGF0TG9uZ0Zvcm1hdFxuICAgICAgY29udGVudFxuICAgICAgbm9uY2VcbiAgICAgIHVwZGF0ZURhdGVcbiAgICAgIF9fdHlwZW5hbWVcbiAgICB9XG4gIGAsXG5cbiAgdG9rZW46IGdxbGBcbiAgICBmcmFnbWVudCBVc2VyVG9rZW5GcmFnbWVudCBvbiBVc2VyVG9rZW5WTyB7XG4gICAgICBpZFxuICAgICAgcHVia2V5XG4gICAgICBuYW1lXG4gICAgICBmbGFnc1xuICAgICAgZXhwaXJhdGlvbkRhdGVcbiAgICAgIGxhc3RVc2VkRGF0ZVxuICAgICAgY3JlYXRpb25EYXRlXG4gICAgICB1cGRhdGVEYXRlXG4gICAgICBfX3R5cGVuYW1lXG4gICAgfVxuICBgLFxufTtcblxuLy8gQWNjb3VudCBxdWVyaWVzXG5jb25zdCBRdWVyaWVzOiBQYXJ0aWFsPEJhc2VFbnRpdHlHcmFwaHFsUXVlcmllcz4gJiB7IGxvYWRXaXRoVG9rZW5zOiBhbnkgfSA9IHtcbiAgbG9hZDogZ3FsYFxuICAgIHF1ZXJ5IEFjY291bnQge1xuICAgICAgZGF0YTogYWNjb3VudCB7XG4gICAgICAgIC4uLkFjY291bnRGcmFnbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAke0ZyYWdtZW50cy5hY2NvdW50fVxuICAgICR7RnJhZ21lbnRzLnNldHRpbmdzfVxuICBgLFxuXG4gIGxvYWRXaXRoVG9rZW5zOiBncWxgXG4gICAgcXVlcnkgQWNjb3VudFdpdGhUb2tlbiB7XG4gICAgICBkYXRhOiBhY2NvdW50IHtcbiAgICAgICAgLi4uQWNjb3VudEZyYWdtZW50XG4gICAgICAgIHRva2VucyB7XG4gICAgICAgICAgLi4uVXNlclRva2VuRnJhZ21lbnRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAke0ZyYWdtZW50cy5hY2NvdW50fVxuICAgICR7RnJhZ21lbnRzLnNldHRpbmdzfVxuICAgICR7RnJhZ21lbnRzLnRva2VufVxuICBgLFxufTtcblxuLy8gQ2hlY2sgZW1haWwgcXVlcnlcbmNvbnN0IElzRW1haWxFeGlzdHNRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBJc0VtYWlsRXhpc3RzKCRlbWFpbDogU3RyaW5nLCAkaGFzaDogU3RyaW5nKSB7XG4gICAgaXNFbWFpbEV4aXN0cyhlbWFpbDogJGVtYWlsLCBoYXNoOiAkaGFzaClcbiAgfVxuYDtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElzRW1haWxFeGlzdHNWYXJpYWJsZXMge1xuICBlbWFpbDogc3RyaW5nO1xuICBoYXNoOiBzdHJpbmc7XG59XG5cbi8vIEFjY291bnQgbXV0YXRpb25zXG5jb25zdCBNdXRhdGlvbnM6IFBhcnRpYWw8QmFzZUVudGl0eUdyYXBocWxNdXRhdGlvbnM+ICYgeyBzYXZlV2l0aFRva2VuczogYW55OyBzYXZlU2V0dGluZ3M6IGFueTsgY3JlYXRlOiBhbnkgfSA9IHtcbiAgc2F2ZTogZ3FsYFxuICAgIG11dGF0aW9uIFNhdmVBY2NvdW50KCRkYXRhOiBBY2NvdW50Vk9JbnB1dCkge1xuICAgICAgZGF0YTogc2F2ZUFjY291bnQoYWNjb3VudDogJGRhdGEpIHtcbiAgICAgICAgLi4uQWNjb3VudEZyYWdtZW50XG4gICAgICB9XG4gICAgfVxuICAgICR7RnJhZ21lbnRzLmFjY291bnR9XG4gICAgJHtGcmFnbWVudHMuc2V0dGluZ3N9XG4gIGAsXG5cbiAgc2F2ZVdpdGhUb2tlbnM6IGdxbGBcbiAgICBtdXRhdGlvbiBTYXZlQWNjb3VudFdpdGhUb2tlbnMoJGRhdGE6IEFjY291bnRWT0lucHV0KSB7XG4gICAgICBkYXRhOiBzYXZlQWNjb3VudChhY2NvdW50OiAkZGF0YSkge1xuICAgICAgICAuLi5BY2NvdW50RnJhZ21lbnRcbiAgICAgICAgdG9rZW5zIHtcbiAgICAgICAgICAuLi5Vc2VyVG9rZW5GcmFnbWVudFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgICR7RnJhZ21lbnRzLmFjY291bnR9XG4gICAgJHtGcmFnbWVudHMuc2V0dGluZ3N9XG4gICAgJHtGcmFnbWVudHMudG9rZW59XG4gIGAsXG5cbiAgY3JlYXRlOiBncWxgXG4gICAgbXV0YXRpb24gQ3JlYXRlQWNjb3VudCgkZGF0YTogQWNjb3VudFZPSW5wdXQpIHtcbiAgICAgIGRhdGE6IGNyZWF0ZUFjY291bnQoYWNjb3VudDogJGRhdGEpIHtcbiAgICAgICAgLi4uQWNjb3VudEZyYWdtZW50XG4gICAgICB9XG4gICAgfVxuICAgICR7RnJhZ21lbnRzLmFjY291bnR9XG4gICAgJHtGcmFnbWVudHMuc2V0dGluZ3N9XG4gIGAsXG5cbiAgc2F2ZVNldHRpbmdzOiBncWxgXG4gICAgbXV0YXRpb24gU2F2ZVNldHRpbmdzKCRkYXRhOiBVc2VyU2V0dGluZ3NWT0lucHV0KSB7XG4gICAgICBkYXRhOiBzYXZlU2V0dGluZ3Moc2V0dGluZ3M6ICRkYXRhKSB7XG4gICAgICAgIC4uLlVzZXJTZXR0aW5nc0ZyYWdtZW50XG4gICAgICB9XG4gICAgfVxuICAgICR7RnJhZ21lbnRzLnNldHRpbmdzfVxuICBgLFxufTtcblxuLy8gU2VudCBjb25maXJtYXRpb24gZW1haWxcbmNvbnN0IFNlbmRDb25maXJtRW1haWxRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBzZW5kQWNjb3VudENvbmZpcm1hdGlvbkVtYWlsKCRlbWFpbDogU3RyaW5nLCAkbG9jYWxlOiBTdHJpbmcpIHtcbiAgICBkYXRhOiBzZW5kQWNjb3VudENvbmZpcm1hdGlvbkVtYWlsKGVtYWlsOiAkZW1haWwsIGxvY2FsZTogJGxvY2FsZSlcbiAgfVxuYDtcblxuLy8gQ29uZmlybSBhY2NvdW50IGVtYWlsXG5jb25zdCBDb25maXJtRW1haWxRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBjb25maXJtQWNjb3VudEVtYWlsKCRlbWFpbDogU3RyaW5nLCAkY29kZTogU3RyaW5nKSB7XG4gICAgZGF0YTogY29uZmlybUFjY291bnRFbWFpbChlbWFpbDogJGVtYWlsLCBjb2RlOiAkY29kZSlcbiAgfVxuYDtcblxuLy8gU2VuZCBlbWFpbCB0byByZXNldCBwYXNzd29yZFxuY29uc3QgU2VuZFJlc2V0UGFzc3dvcmRFbWFpbFF1ZXJ5OiBhbnkgPSBncWxgXG4gIHF1ZXJ5IFNlbmRSZXNldFBhc3N3b3JkRW1haWwoJHVzZXJuYW1lOiBTdHJpbmchLCAkbG9jYWxlOiBTdHJpbmchKSB7XG4gICAgc2VuZFJlc2V0UGFzc3dvcmRFbWFpbCh1c2VybmFtZTogJHVzZXJuYW1lLCBsb2NhbGU6ICRsb2NhbGUpXG4gIH1cbmA7XG5cbmNvbnN0IFJlc2V0QWNjb3VudFB1YmtleVF1ZXJ5OiBhbnkgPSBncWxgXG4gIHF1ZXJ5IFJlc2V0UHVia2V5KCR1c2VybmFtZTogU3RyaW5nISwgJHRva2VuOiBTdHJpbmchKSB7XG4gICAgZGF0YTogcmVzZXRBY2NvdW50UHVia2V5KHVzZXJuYW1lOiAkdXNlcm5hbWUsIHRva2VuOiAkdG9rZW4pXG4gIH1cbmA7XG5cbmNvbnN0IFVwZGF0ZVB1YktleVF1ZXJ5OiBhbnkgPSBncWxgXG4gIHF1ZXJ5IFVwZGF0ZUFjY291bnRQdWJrZXkoJHB1YmtleTogU3RyaW5nISkge1xuICAgIGRhdGE6IHVwZGF0ZUFjY291bnRQdWJrZXkocHVia2V5OiAkcHVia2V5KVxuICB9XG5gO1xuXG4vLyBBdXRoZW50aWNhdGlvbiAgcXVlcnlcbmNvbnN0IEF1dGhRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBBdXRoKCR0b2tlbjogU3RyaW5nKSB7XG4gICAgYXV0aGVudGljYXRlKHRva2VuOiAkdG9rZW4pXG4gIH1cbmA7XG5cbi8vIE5ldyBhdXRoIGNoYWxsZW5nZSBxdWVyeVxuY29uc3QgQXV0aENoYWxsZW5nZVF1ZXJ5OiBhbnkgPSBncWxgXG4gIHF1ZXJ5IEF1dGhDaGFsbGVuZ2Uge1xuICAgIGF1dGhDaGFsbGVuZ2Uge1xuICAgICAgY2hhbGxlbmdlXG4gICAgICBwdWJrZXlcbiAgICAgIHNpZ25hdHVyZVxuICAgIH1cbiAgfVxuYDtcblxuaW50ZXJmYWNlIElBdXRoQ2hhbGxlbmdlIHtcbiAgcHVia2V5OiBzdHJpbmc7XG4gIGNoYWxsZW5nZTogc3RyaW5nO1xuICBzaWduYXR1cmU6IHN0cmluZztcbn1cblxuY29uc3QgQWNjb3VudFN1YnNjcmlwdGlvbnM6IEJhc2VFbnRpdHlHcmFwaHFsU3Vic2NyaXB0aW9ucyA9IHtcbiAgbGlzdGVuQ2hhbmdlczogZ3FsYFxuICAgIHN1YnNjcmlwdGlvbiB1cGRhdGVBY2NvdW50KCRpbnRlcnZhbDogSW50KSB7XG4gICAgICBkYXRhOiB1cGRhdGVBY2NvdW50KGludGVydmFsOiAkaW50ZXJ2YWwpIHtcbiAgICAgICAgaWRcbiAgICAgICAgdXBkYXRlRGF0ZVxuICAgICAgfVxuICAgIH1cbiAgYCxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudFdhdGNoT3B0aW9ucyB7XG4gIGludGVydmFsSW5TZWNvbmRzPzogbnVtYmVyO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JywgZGVwczogW0VOVklST05NRU5UXSB9KVxuZXhwb3J0IGNsYXNzIEFjY291bnRTZXJ2aWNlIGV4dGVuZHMgQmFzZUdyYXBocWxTZXJ2aWNlPEFjY291bnQsIGFueSwgbnVtYmVyLCBBY2NvdW50PiB7XG4gIG9uTG9naW4gPSBuZXcgU3ViamVjdDxBY2NvdW50PigpO1xuICBvbldpbGxMb2dvdXQgPSBuZXcgU3ViamVjdDxBY2NvdW50PigpO1xuICBvbkxvZ291dCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIG9uQ2hhbmdlID0gbmV3IFN1YmplY3Q8QWNjb3VudD4oKTtcbiAgb25BdXRoVG9rZW5DaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgb25BdXRoQmFzaWNDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIF9saXN0ZW5DaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IF9lbmFibGVMaXN0ZW5DaGFuZ2VzOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IF9saXN0ZW5JbnRlcnZhbEluU2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIF9jYWNoZTogQWNjb3VudERldGFpbHMgPSB7XG4gICAgbG9hZGVkOiBmYWxzZSxcbiAgICBrZXlwYWlyOiBudWxsLFxuICAgIGF1dGhUb2tlbjogbnVsbCxcbiAgICBhdXRoQmFzaWM6IG51bGwsXG4gICAgcHVia2V5OiBudWxsLFxuICAgIG1haW5Qcm9maWxlOiBudWxsLFxuICAgIHBlcnNvbjogbnVsbCxcbiAgICBkZXBhcnRtZW50OiBudWxsLFxuICB9O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25EZWZzOiBGb3JtRmllbGREZWZpbml0aW9uW107XG4gIHByaXZhdGUgXyRhZGRpdGlvbmFsRmllbGRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGb3JtRmllbGREZWZpbml0aW9uW10+KFtdKTtcbiAgcHJpdmF0ZSBfdG9rZW5UeXBlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFRva2VuVHlwZT4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfYXBpVG9rZW5FbmFibGVkID0gdHJ1ZTtcblxuICBnZXQgYWNjb3VudCgpOiBBY2NvdW50IHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGUubG9hZGVkID8gdGhpcy5fZGF0YSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBwZXJzb24oKTogUGVyc29uIHtcbiAgICBpZiAodGhpcy5fY2FjaGUubG9hZGVkICYmICF0aGlzLl9jYWNoZS5wZXJzb24pIHtcbiAgICAgIHRoaXMuX2NhY2hlLnBlcnNvbiA9IHRoaXMuX2NhY2hlLmxvYWRlZCA/IHRoaXMuX2RhdGEuYXNQZXJzb24oKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlLnBlcnNvbjtcbiAgfVxuXG4gIGdldCBkZXBhcnRtZW50KCk6IERlcGFydG1lbnQge1xuICAgIGlmICh0aGlzLl9jYWNoZS5sb2FkZWQgJiYgIXRoaXMuX2NhY2hlLmRlcGFydG1lbnQpIHtcbiAgICAgIHRoaXMuX2NhY2hlLmRlcGFydG1lbnQgPSB0aGlzLl9jYWNoZS5sb2FkZWQgPyB0aGlzLl9kYXRhLmFzUGVyc29uKCkuZGVwYXJ0bWVudCA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlLmRlcGFydG1lbnQ7XG4gIH1cblxuICBnZXQgdG9rZW5UeXBlKCk6IEF1dGhUb2tlblR5cGUge1xuICAgIHJldHVybiB0aGlzLl90b2tlblR5cGUkLnZhbHVlO1xuICB9XG5cbiAgc2V0IHRva2VuVHlwZSh2YWx1ZTogQXV0aFRva2VuVHlwZSkge1xuICAgIGlmICh0aGlzLl90b2tlblR5cGUkLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgY29uc29sZS5pbmZvKCdbYWNjb3VudF0gVXNpbmcgYXV0aGVudGljYXRpb24gdG9rZW4gdHlwZTogJyArIHZhbHVlKTtcbiAgICAgIHRoaXMuX3Rva2VuVHlwZSQubmV4dCh2YWx1ZSk7XG4gICAgICAvLyBSZXNldCB2YWx1ZXNcbiAgICAgIHRoaXMuX2NhY2hlLmF1dGhUb2tlbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub25BdXRoVG9rZW5DaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5fY2FjaGUuYXV0aEJhc2ljID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFwaVRva2VuRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVG9rZW5FbmFibGVkO1xuICB9XG5cbiAgc2V0IGFwaVRva2VuRW5hYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2FwaVRva2VuRW5hYmxlZCA9IHZhbHVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBncmFwaHFsOiBHcmFwaHFsU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBzdG9yYWdlOiBTdG9yYWdlLFxuICAgIHByb3RlY3RlZCBmaWxlOiBGaWxlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfVVNFUl9TRVRUSU5HU19PUFRJT05TKSBvcHRpb25zOiBVc2VyU2V0dGluZ3NPcHRpb25zXG4gICkge1xuICAgIHN1cGVyKGdyYXBocWwsIGVudmlyb25tZW50KTtcbiAgICB0aGlzLl9lbmFibGVMaXN0ZW5DaGFuZ2VzID0gIWVudmlyb25tZW50LmFjY291bnQgfHwgZW52aXJvbm1lbnQuYWNjb3VudC5lbmFibGVMaXN0ZW5DaGFuZ2VzICE9PSBmYWxzZTsgLy8gVHJ1ZSBieSBkZWZhdWx0XG4gICAgdGhpcy5fbGlzdGVuSW50ZXJ2YWxJblNlY29uZHMgPSB0b051bWJlcihlbnZpcm9ubWVudC5hY2NvdW50ICYmIGVudmlyb25tZW50LmFjY291bnQubGlzdGVuSW50ZXJ2YWxJblNlY29uZHMsIDApOyAvLyBubyB0aW1lciBieSBkZWZhdWx0XG5cbiAgICB0aGlzLl9kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnQtc2VydmljZV0gQ3JlYXRpbmcgc2VydmljZScpO1xuICAgIHRoaXMuX29wdGlvbkRlZnMgPSBPYmplY3QudmFsdWVzKG9wdGlvbnM/Lm9wdGlvbnMgfHwge30pO1xuXG4gICAgdGhpcy5yZXNldERhdGEoKTtcblxuICAgIC8vIFNlbmQgYXV0aCB0b2tlbiB0byB0aGUgZ3JhcGhxbCBsYXllciwgd2hlbiBjaGFuZ2VkXG4gICAgdGhpcy5vbkF1dGhUb2tlbkNoYW5nZS5zdWJzY3JpYmUoKHRva2VuKSA9PiB0aGlzLmdyYXBocWwuc2V0QXV0aFRva2VuKHRva2VuKSk7XG4gICAgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5zdWJzY3JpYmUoKGJhc2ljKSA9PiB0aGlzLmdyYXBocWwuc2V0QXV0aEJhc2ljKGJhc2ljKSk7XG5cbiAgICAvLyBGb3JjZSBuZXR3b3JrIHRvIHdhaXQgYWNjb3VudCBzZXJ2aWNlLCBhZnRlciBnZXR0aW5nIGNvbm5lY3Rpb24gdG8gdGhlIHBlZXJcbiAgICB0aGlzLm5ldHdvcmsub24oJ2JlZm9yZVRyeU9ubGluZUZpbmlzaCcsIGFzeW5jIChvbmxpbmUpID0+IHtcbiAgICAgIC8vIElmIG9ubGluZSwgd2FpdCBhIGZ1bGwgcmVzdGFydCwgYmVjYXVzZSBpdCBjYW4gZm9yY2Ugb2ZmbGluZSBtb2RlXG4gICAgICBpZiAob25saW5lICYmICghdGhpcy5zdGFydGVkIHx8IHRoaXMuaXNMb2dpbigpKSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gRm9yY2UgbmV0d29ya1NlcnZpY2UudHJ5T25saW5lKCkgdG8gd2FpdCwgdGhhdCBncmFwaHFsIGFuZCBhY2NvdW50IHNlcnZpY2UgaXMgcmVzdGFydGVkLi4uJyk7XG4gICAgICAgIGF3YWl0IHNsZWVwKDUwMCk7IC8vIHdhaXQgZ3JhcGhxbCBzZXJ2aWNlIHRvIGJlIHJlc3RhcnRlZFxuICAgICAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbmdPblN0YXJ0KCk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuc2V0dGluZ3MucmVhZHkoKSxcbiAgICAgIC8vIFdhaXQgdG9rZW4gdHlwZSB0byBiZSBzZXRcbiAgICAgIGZpcnN0Tm90TmlsUHJvbWlzZSh0aGlzLl90b2tlblR5cGUkLCB7IHN0b3A6IHRoaXMuc3RvcFN1YmplY3QgfSksXG4gICAgXSk7XG5cbiAgICAvLyBMaXN0ZW4gZ3JhcGhxbCBzdGFydCAob3IgcmVzdGFydClcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5ncmFwaHFsLnN0b3BTdWJqZWN0LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0ZWQgJiYgdGhpcy5pc0xvZ2luKCkpIHtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gUmVzdGFydGluZywgdG8gcmV0cnkgdG8gYXV0aGVudGljYXRlLi4uJyk7XG4gICAgICAgICAgdGhpcy5yZXN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMucmVzdG9yZUxvY2FsbHkoKTtcbiAgICBhd2FpdCB0aGlzLmxpc3RlblNldHRpbmdzKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBuZ09uU3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoYWRBdXRoVG9rZW4gPSB0aGlzLl9jYWNoZS5hdXRoVG9rZW4gJiYgdHJ1ZTtcbiAgICBjb25zdCBoYWRBdXRoQmFzaWMgPSB0aGlzLl9jYWNoZS5hdXRoQmFzaWMgJiYgdHJ1ZTtcbiAgICBjb25zdCBoYWRBdXRoID0gaGFkQXV0aFRva2VuIHx8IGhhZEF1dGhCYXNpYztcbiAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgIGlmIChoYWRBdXRoKSB7XG4gICAgICB0aGlzLm9uTG9nb3V0Lm5leHQoKTtcbiAgICAgIHRoaXMub25DaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgICAgaWYgKGhhZEF1dGhUb2tlbikgdGhpcy5vbkF1dGhUb2tlbkNoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICBpZiAoaGFkQXV0aEJhc2ljKSB0aGlzLm9uQXV0aEJhc2ljQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBpc0xvZ2luKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLl9jYWNoZS5wdWJrZXkgJiYgdGhpcy5fY2FjaGUubG9hZGVkKTtcbiAgfVxuXG4gIGlzQXV0aCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5fY2FjaGUucHVia2V5ICYmIHRoaXMuX2NhY2hlLmtleXBhaXIgJiYgdGhpcy5fY2FjaGUua2V5cGFpci5zZWNyZXRLZXkpO1xuICB9XG5cbiAgaGFzTWluUHJvZmlsZSh1c2VyUHJvZmlsZTogVXNlclByb2ZpbGVMYWJlbCk6IGJvb2xlYW4ge1xuICAgIC8vIHNob3VsZCBiZSBsb2dpbiwgYW5kIHN0YXR1cyBFTkFCTEUgb3IgVEVNUE9SQVJZXG4gICAgaWYgKCF0aGlzLl9kYXRhIHx8ICF0aGlzLl9kYXRhLnB1YmtleSB8fCAodGhpcy5fZGF0YS5zdGF0dXNJZCAhPT0gU3RhdHVzSWRzLkVOQUJMRSAmJiB0aGlzLl9kYXRhLnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuVEVNUE9SQVJZKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gUGVyc29uVXRpbHMuaGFzVXBwZXJPckVxdWFsc1Byb2ZpbGUodGhpcy5fZGF0YS5wcm9maWxlcywgdXNlclByb2ZpbGUpO1xuICB9XG5cbiAgaGFzRXhhY3RQcm9maWxlKGxhYmVsOiBVc2VyUHJvZmlsZUxhYmVsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFjY291bnRVdGlscy5oYXNFeGFjdFByb2ZpbGUodGhpcy5fZGF0YSwgbGFiZWwpO1xuICB9XG5cbiAgaGFzUHJvZmlsZUFuZElzRW5hYmxlKHVzZXJQcm9maWxlOiBVc2VyUHJvZmlsZUxhYmVsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFjY291bnRVdGlscy5oYXNQcm9maWxlQW5kSXNFbmFibGUodGhpcy5fZGF0YSwgdXNlclByb2ZpbGUpO1xuICB9XG5cbiAgaXNBZG1pbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNQcm9maWxlQW5kSXNFbmFibGUoJ0FETUlOJyk7XG4gIH1cblxuICBpc1N1cGVydmlzb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvZmlsZUFuZElzRW5hYmxlKCdTVVBFUlZJU09SJyk7XG4gIH1cblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvZmlsZUFuZElzRW5hYmxlKCdVU0VSJyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQHBhcmFtIG1vZGVcbiAgICovXG4gIGlzVXNhZ2VNb2RlKG1vZGU6IFVzYWdlTW9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmlzVXNhZ2VNb2RlKG1vZGUpO1xuICB9XG5cbiAgaXNPbmx5R3Vlc3QoKTogYm9vbGVhbiB7XG4gICAgLy8gU2hvdWxkIGJlIGxvZ2luLCBhbmQgc3RhdHVzIEVOQUJMRSBvciBURU1QT1JBUllcbiAgICBpZiAoIXRoaXMuX2RhdGEgfHwgIXRoaXMuX2RhdGEucHVia2V5IHx8ICh0aGlzLl9kYXRhLnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuRU5BQkxFICYmIHRoaXMuX2RhdGEuc3RhdHVzSWQgIT09IFN0YXR1c0lkcy5URU1QT1JBUlkpKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gUHJvZmlsZSBsZXNzIHRoZW4gdXNlclxuICAgIHJldHVybiAhUGVyc29uVXRpbHMuaGFzVXBwZXJPckVxdWFsc1Byb2ZpbGUodGhpcy5fZGF0YS5wcm9maWxlcywgJ1VTRVInKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcmVjb3JkZXJEZXBhcnRtZW50XG4gICAqIEBkZXByZWNhdGVkIHVzZSBQcm9ncmFtUmVmU2VydmljZS5jYW5Vc2VyV3JpdGVFbnRpdHkoKSBpbnN0ZWFkXG4gICAqL1xuICBjYW5Vc2VyV3JpdGVEYXRhRm9yRGVwYXJ0bWVudChyZWNvcmRlckRlcGFydG1lbnQ6IFJlZmVyZW50aWFsIHwgYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKFJlZmVyZW50aWFsVXRpbHMuaXNFbXB0eShyZWNvcmRlckRlcGFydG1lbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0FkbWluKCk7XG4gICAgfVxuXG4gICAgLy8gU2hvdWxkIGJlIGxvZ2luLCBhbmQgc3RhdHVzIEVOQUJMRVxuICAgIGlmICghdGhpcy5fZGF0YSB8fCAhdGhpcy5fZGF0YS5wdWJrZXkgfHwgdGhpcy5fZGF0YS5zdGF0dXNJZCAhPT0gU3RhdHVzSWRzLkVOQUJMRSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLl9kYXRhLmRlcGFydG1lbnQgfHwgIXRoaXMuX2RhdGEuZGVwYXJ0bWVudC5pZCkge1xuICAgICAgY29uc29sZS53YXJuKCdVc2VyIGFjY291bnQgaGFzIG5vIGRlcGFydG1lbnQgISBVbmFibGUgdG8gY2hlY2sgd3JpdGUgcmlnaHQgYWdhaW5zdCByZWNvcmRlckRlcGFydG1lbnQnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTYW1lIHJlY29yZGVyIGRlcGFydG1lbnQ6IE9LLCB1c2VyIGNhbiB3cml0ZVxuICAgIGlmICh0aGlzLl9kYXRhLmRlcGFydG1lbnQuaWQgPT09IHJlY29yZGVyRGVwYXJ0bWVudC5pZCkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBDYW5ub3Qgd3JpdGVcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyByZWdpc3RlcihkYXRhOiBSZWdpc3RlckRhdGEpOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICBpZiAodGhpcy5pc0xvZ2luKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBhbHJlYWR5IGxvZ2luLiBQbGVhc2UgbG9nb3V0IGJlZm9yZSByZWdpc3Rlci4nKTtcbiAgICB9XG4gICAgaWYgKCFkYXRhLnVzZXJuYW1lIHx8ICFkYXRhLnBhc3N3b3JkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnKTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFJlZ2lzdGVyIG5ldyB1c2VyIGFjY291bnQuLi4nLCBkYXRhLmFjY291bnQpO1xuICAgIHRoaXMuX2NhY2hlLmxvYWRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qga2V5cGFpciA9IGF3YWl0IENyeXB0b1NlcnZpY2Uuc2NyeXB0S2V5cGFpcihkYXRhLnVzZXJuYW1lLCBkYXRhLnBhc3N3b3JkKTtcbiAgICAgIGRhdGEuYWNjb3VudC5wdWJrZXkgPSBCYXNlNTguZW5jb2RlKGtleXBhaXIucHVibGljS2V5KTtcblxuICAgICAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgICAgIGRhdGEuYWNjb3VudC5zZXR0aW5ncyA9IGRhdGEuYWNjb3VudC5zZXR0aW5ncyB8fCBuZXcgVXNlclNldHRpbmdzKCk7XG4gICAgICBkYXRhLmFjY291bnQuc2V0dGluZ3MubG9jYWxlID0gdGhpcy5zZXR0aW5ncy5sb2NhbGU7XG4gICAgICBkYXRhLmFjY291bnQuc2V0dGluZ3MubGF0TG9uZ0Zvcm1hdCA9IHRoaXMuc2V0dGluZ3MubGF0TG9uZ0Zvcm1hdDtcbiAgICAgIGRhdGEuYWNjb3VudC5zZXR0aW5ncy5jb250ZW50ID0gZGF0YS5hY2NvdW50LnNldHRpbmdzLmNvbnRlbnQgfHwge307XG4gICAgICBkYXRhLmFjY291bnQuZGVwYXJ0bWVudC5pZCA9IGRhdGEuYWNjb3VudC5kZXBhcnRtZW50LmlkIHx8IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdERlcGFydG1lbnRJZDtcblxuICAgICAgdGhpcy5fY2FjaGUua2V5cGFpciA9IGtleXBhaXI7XG4gICAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgdGhpcy5zYXZlUmVtb3RlbHkoZGF0YS5hY2NvdW50LCBrZXlwYWlyKTtcblxuICAgICAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgICAgIGFjY291bnQuYXZhdGFyID0gYWNjb3VudC5hdmF0YXIgfHwgdGhpcy5lbnZpcm9ubWVudC5iYXNlVXJsICsgREVGQVVMVF9BVkFUQVJfSU1BR0U7XG4gICAgICB0aGlzLl9jYWNoZS5tYWluUHJvZmlsZSA9IFBlcnNvblV0aWxzLmdldE1haW5Qcm9maWxlKGFjY291bnQucHJvZmlsZXMpO1xuXG4gICAgICB0aGlzLl9kYXRhID0gYWNjb3VudDtcbiAgICAgIHRoaXMuX2NhY2hlLnB1YmtleSA9IGFjY291bnQucHVia2V5O1xuXG4gICAgICAvLyBUcnkgdG8gYXV0aCBvbiBwb2RcbiAgICAgIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKGRhdGEpO1xuXG4gICAgICB0aGlzLl9jYWNoZS5sb2FkZWQgPSB0cnVlO1xuXG4gICAgICBhd2FpdCB0aGlzLnNhdmVMb2NhbGx5KCk7XG5cbiAgICAgIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBY2NvdW50IHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlLm5leHQodGhpcy5fZGF0YSk7XG5cbiAgICAgIC8vIExpc3RlbiByZW1vdGUgY2hhbmdlc1xuICAgICAgaWYgKHRoaXMuX2VuYWJsZUxpc3RlbkNoYW5nZXMpIHRoaXMuc3RhcnRMaXN0ZW5SZW1vdGVDaGFuZ2VzKCk7XG5cbiAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKChlcnJvciAmJiBlcnJvci5tZXNzYWdlKSB8fCBlcnJvcik7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXV0aGVudGljYXRlKGRhdGE/OiBBdXRoRGF0YSkge1xuICAgIC8vIFdhaXQgdGhlIGF1dGggdG9rZW4sIHRoZW4gY29udGludWVcbiAgICBjb25zdCB0b2tlblR5cGUgPSBhd2FpdCBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5fdG9rZW5UeXBlJCk7XG5cbiAgICAvLyBCYXNpYyBhdXRoXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gJ2Jhc2ljJyB8fCB0b2tlblR5cGUgPT09ICdiYXNpYy1hbmQtdG9rZW4nKSB7XG4gICAgICAvLyBHZW5lcmF0ZSB0aGUgYXV0aEJhc2ljLCBpZiB1c2VkXG4gICAgICBpZiAoIXRoaXMuX2NhY2hlLmF1dGhCYXNpYykge1xuICAgICAgICAvLyBTa2lwIGlmIHRva2VuIGFscmVhZHkgcHJvdmlkZWRcbiAgICAgICAgaWYgKCEodGhpcy5fY2FjaGUuYXV0aFRva2VuICYmIHRva2VuVHlwZSA9PT0gJ2Jhc2ljLWFuZC10b2tlbicpKSB7XG4gICAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLnVzZXJuYW1lIHx8ICFkYXRhLnBhc3N3b3JkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdXNlcm5hbWUgYW5kIHBhc3N3b3JkJyk7XG4gICAgICAgICAgdGhpcy5fY2FjaGUuYXV0aEJhc2ljID0gQ3J5cHRvU2VydmljZS5lbmNvZGVCYXNlNjQoYCR7ZGF0YS51c2VybmFtZX06JHtkYXRhLnBhc3N3b3JkfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLm9uQXV0aEJhc2ljQ2hhbmdlLm5leHQodGhpcy5fY2FjaGUuYXV0aEJhc2ljKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSB0aGUgYXV0aFRva2VuLCBpZiB1c2VkXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gJ3Rva2VuJyB8fCB0b2tlblR5cGUgPT09ICdiYXNpYy1hbmQtdG9rZW4nKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jYWNoZS5hdXRoVG9rZW4gPSBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZUFuZEdldFRva2VuKHRoaXMuX2NhY2hlLmF1dGhUb2tlbik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBOZXZlciBhdXRoZW50aWNhdGUsIG9yIG5vdCByZWFkeSBmb3Igb2ZmbGluZSBtb2RlID0+IGV4aXRcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIHRoaXMucmVzZXREYXRhKCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcmdldCBhdXRoQmFzaWMsIHRvIHN3aXRjaCB0byBhdXRoVG9rZW5cbiAgICBpZiAodG9rZW5UeXBlID09PSAnYmFzaWMtYW5kLXRva2VuJykge1xuICAgICAgdGhpcy5fY2FjaGUuYXV0aEJhc2ljID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9naW4oZGF0YTogQXV0aERhdGEpOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICBpZiAoIWRhdGEgfHwgIWRhdGEudXNlcm5hbWUgfHwgIWRhdGEucGFzc3dvcmQpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCB1c2VybmFtZSBvciBwYXNzd29yZCcpO1xuXG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIExvZ2luLi4uJyk7XG5cbiAgICBsZXQga2V5cGFpcjtcbiAgICB0cnkge1xuICAgICAga2V5cGFpciA9IGF3YWl0IENyeXB0b1NlcnZpY2Uuc2NyeXB0S2V5cGFpcihkYXRhLnVzZXJuYW1lLCBkYXRhLnBhc3N3b3JkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgdGhyb3cgeyBjb2RlOiBFcnJvckNvZGVzLlVOS05PV05fRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5TQ1JZUFRfRVJST1InIH07XG4gICAgfVxuXG4gICAgLy8gU3RvcmUgcHVia2V5K2tleXBhaXJcbiAgICB0aGlzLl9jYWNoZS5wdWJrZXkgPSBCYXNlNTguZW5jb2RlKGtleXBhaXIucHVibGljS2V5KTtcbiAgICB0aGlzLl9jYWNoZS5rZXlwYWlyID0ga2V5cGFpcjtcblxuICAgIC8vIFRyeSB0byBsb2FkIHByZXZpb3VzIHRva2VuXG4gICAgbGV0IHByZXZpb3VzVG9rZW46IHN0cmluZyA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoVE9LRU5fU1RPUkFHRV9LRVkpO1xuICAgIHByZXZpb3VzVG9rZW4gPSAocHJldmlvdXNUb2tlbiAmJiBwcmV2aW91c1Rva2VuLnN0YXJ0c1dpdGgodGhpcy5fY2FjaGUucHVia2V5KSAmJiBwcmV2aW91c1Rva2VuKSB8fCBudWxsO1xuXG4gICAgLy8gT2ZmbGluZSBtb2RlXG4gICAgY29uc3Qgb2ZmbGluZSA9IHRoaXMuc2V0dGluZ3MuaGFzT2ZmbGluZUZlYXR1cmUoKSAmJiAodGhpcy5uZXR3b3JrLm9mZmxpbmUgfHwgZGF0YS5vZmZsaW5lID09PSB0cnVlKTtcbiAgICBpZiAob2ZmbGluZSkge1xuICAgICAgdGhpcy5fY2FjaGUuYXV0aFRva2VuID0gcHJldmlvdXNUb2tlbjtcblxuICAgICAgLy8gTWFrZSBzdXJlIG5ldHdvcmsgaWYgc2V0IGFzIG9mZmxpbmVcbiAgICAgIHRoaXMubmV0d29yay5zZXRGb3JjZU9mZmxpbmUodHJ1ZSwgeyBzaG93VG9hc3Q6IGZhbHNlIH0pO1xuICAgICAgY29uc29sZS5pbmZvKGBbYWNjb3VudF0gTG9naW4gW09LXSB7cHVia2V5OiAke3RoaXMuX2NhY2hlLnB1YmtleS5zdWJzdHIoMCwgOCl9fSwge29mZmxpbmU6IHRydWV9YCk7XG4gICAgfVxuXG4gICAgLy8gT25saW5lIG1vZGU6IHRyeSB0byBhdXRoIG9uIHBvZFxuICAgIGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hdXRoZW50aWNhdGUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBOZXZlciBhdXRoZW50aWNhdGUsIG9yIG5vdCByZWFkeSBmb3Igb2ZmbGluZSBtb2RlID0+IGV4aXRcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIHRoaXMucmVzZXREYXRhKCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgYWNjb3VudCBkYXRhXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZERhdGEoeyBvZmZsaW5lLCBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBJZiBhY2NvdW50IG5vdCBmb3VuZCwgY2hlY2sgaWYgZW1haWwgaXMgdmFsaWRcbiAgICAgIGlmIChlcnIgJiYgK2Vyci5jb2RlID09PSBFcnJvckNvZGVzLkxPQURfQUNDT1VOVF9FUlJPUikge1xuICAgICAgICAvLyBDaGVjayBlbWFpbCBleGlzdHNcbiAgICAgICAgaWYgKGRhdGEudXNlcm5hbWUuaW5kZXhPZignQCcpICE9PSAtMSkge1xuICAgICAgICAgIGxldCBpc0VtYWlsRXhpc3RzO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpc0VtYWlsRXhpc3RzID0gYXdhaXQgdGhpcy5pc0VtYWlsRXhpc3RzKGRhdGEudXNlcm5hbWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKG90aGVyRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGVycjsgLy8gcmVzZW5kIHRoZSBmaXJzdCBlcnJvclxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtYWlsIG5vdCBleGlzdHMgKG5vIGFjY291bnQpXG4gICAgICAgICAgaWYgKCFpc0VtYWlsRXhpc3RzKSB7XG4gICAgICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuVU5LTk9XTl9BQ0NPVU5UX0VNQUlMLCBtZXNzYWdlOiAnRVJST1IuVU5LTk9XTl9BQ0NPVU5UX0VNQUlMJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtYWlsIGV4aXN0cywgc28gZXJyb3IgPSAnYmFkIHBhc3N3b3JkJ1xuICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuQkFEX1BBU1NXT1JELCBtZXNzYWdlOiAnRVJST1IuQkFEX1BBU1NXT1JEJyB9O1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7IC8vIHJlc2VuZCB0aGUgZmlyc3QgZXJyb3JcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gU3RvcmUgdG8gbG9jYWwgc3RvcmFnZVxuICAgICAgYXdhaXQgdGhpcy5zYXZlTG9jYWxseSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRoaXMucmVzZXREYXRhKCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGV2ZW50IHRvIG9ic2VydmVyc1xuICAgIHRoaXMub25Mb2dpbi5uZXh0KHRoaXMuX2RhdGEpO1xuICAgIHRoaXMub25DaGFuZ2UubmV4dCh0aGlzLl9kYXRhKTtcblxuICAgIGlmICh0aGlzLl9lbmFibGVMaXN0ZW5DaGFuZ2VzKSB0aGlzLnN0YXJ0TGlzdGVuUmVtb3RlQ2hhbmdlcygpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBhc3luYyByZWxvYWQob3B0cz86IHsgc2hvd1RvYXN0PzogYm9vbGVhbiB9KTogUHJvbWlzZTxBY2NvdW50PiB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZS5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkJyk7XG4gICAgaWYgKHRoaXMubmV0d29yay5vZmZsaW5lKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjaGVjayBhY2NvdW50IGluIG9mZmxpbmUgbW9kZScpO1xuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gUmVsb2FkaW5nIGFjY291bnQuLi5gKTtcbiAgICBjb25zdCB3YXNMb2dpbiA9IHRoaXMuaXNMb2dpbigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZERhdGEoKTtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZUxvY2FsbHkoKTtcblxuICAgICAgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFJlbG9hZGluZyBhY2NvdW50IFtPS10gaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG5cbiAgICAgIC8vIEVtaXQgbG9naW4gZXZlbnQgdG8gc3Vic2NyaWJlcnNcbiAgICAgIHRoaXMub25Mb2dpbi5uZXh0KHRoaXMuX2RhdGEpO1xuICAgICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEpO1xuXG4gICAgICAvLyBEaXNwbGF5IHRvYXN0ICh3aXRob3V0IGF3YWl0LCBiZWNhdXNlIG5vdCBuZWVkIHRvIHdhaXQgdG9hc3QgY2xvc2UgZXZlbnQpXG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5zaG93VG9hc3QgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHsgbWVzc2FnZTogJ0FDQ09VTlQuSU5GTy5SRUxPQURFRCcsIHR5cGU6ICdpbmZvJyB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIENhbm5vdCByZWxvYWQgYnV0IHdhcyBsb2dpbjogZm9yY2UgdG8gbG9nb3V0XG4gICAgICBpZiAod2FzTG9naW4gJiYgIXRoaXMuaXNMb2dpbigpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFthY2NvdW50XSBSZWxvYWRpbmcgYWNjb3VudCBmYWlsZWQuIFdpbGwgZm9yY2UgbG9nb3V0Li4uYCwgZXJyb3IpO1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ291dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvciB1cGRhdGUgYW4gdXNlciBhY2NvdW50LCB0byB0aGUgcmVtb3RlIHN0b3JhZ2VcbiAgICpcbiAgICogQHBhcmFtIGFjY291bnRcbiAgICovXG4gIGFzeW5jIHNhdmUoYWNjb3VudDogQWNjb3VudCk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICghdGhpcy5fY2FjaGUucHVia2V5KSByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ1VzZXIgbm90IGxvZ2dlZCcpO1xuICAgIGlmICh0aGlzLl9jYWNoZS5wdWJrZXkgIT09IGFjY291bnQucHVia2V5KSByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ05vdCB1c2VyIGFjY291bnQnKTtcblxuICAgIGFjY291bnQgPSBhd2FpdCB0aGlzLnNhdmVSZW1vdGVseShhY2NvdW50LCB0aGlzLl9jYWNoZS5rZXlwYWlyKTtcblxuICAgIC8vIFNldCBkZWZhdWx0c1xuICAgIGFjY291bnQuYXZhdGFyID0gYWNjb3VudC5hdmF0YXIgfHwgdGhpcy5lbnZpcm9ubWVudC5iYXNlVXJsICsgREVGQVVMVF9BVkFUQVJfSU1BR0U7XG4gICAgdGhpcy5fY2FjaGUubWFpblByb2ZpbGUgPSBQZXJzb25VdGlscy5nZXRNYWluUHJvZmlsZShhY2NvdW50LnByb2ZpbGVzKTtcblxuICAgIHRoaXMuX2RhdGEgPSBhY2NvdW50O1xuXG4gICAgLy8gVXBkYXRlIGNhY2hlXG4gICAgdGhpcy5fY2FjaGUucGVyc29uID0gYWNjb3VudC5hc1BlcnNvbigpO1xuICAgIHRoaXMuX2NhY2hlLmRlcGFydG1lbnQgPSB0aGlzLl9jYWNoZS5wZXJzb24uZGVwYXJ0bWVudDtcblxuICAgIHRoaXMuX2NhY2hlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAvLyBTYXZlIGxvY2FsbHkgKGluIHN0b3JhZ2UpXG4gICAgYXdhaXQgdGhpcy5zYXZlTG9jYWxseSgpO1xuXG4gICAgLy8gU2VuZCBldmVudFxuICAgIHRoaXMub25Mb2dpbi5uZXh0KHRoaXMuX2RhdGEpO1xuICAgIHRoaXMub25DaGFuZ2UubmV4dCh0aGlzLl9kYXRhKTtcblxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhZEF1dGhUb2tlbiA9IHRoaXMuX2NhY2hlLmF1dGhUb2tlbiAmJiB0cnVlO1xuICAgIGNvbnN0IGhhZEF1dGhCYXNpYyA9IHRoaXMuX2NhY2hlLmF1dGhCYXNpYyAmJiB0cnVlO1xuICAgIGNvbnN0IHB1YmtleSA9IHRoaXMuX2NhY2hlICYmIHRoaXMuX2NhY2hlLnB1YmtleTtcblxuICAgIC8vIE5vdGlmeSBvYnNlcnZlcnNcbiAgICB0aGlzLm9uV2lsbExvZ291dC5uZXh0KHRoaXMuYWNjb3VudCk7XG5cbiAgICB0aGlzLnJlc2V0RGF0YSgpO1xuXG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLmhhc09mZmxpbmVGZWF0dXJlKCkpIHtcbiAgICAgIC8vIFJlbW92ZSBhbGwgZGF0YSBmcm9tIHRoZSBsb2NhbCBzdG9yYWdlXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoUFVCS0VZX1NUT1JBR0VfS0VZKSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShUT0tFTl9TVE9SQUdFX0tFWSksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoQUNDT1VOVF9TVE9SQUdFX0tFWSksXG4gICAgICAgIChwdWJrZXkgJiYgdGhpcy5zdG9yYWdlLnJlbW92ZShBQ0NPVU5UX1NUT1JBR0VfS0VZICsgJyMnICsgcHVia2V5KSkgfHwgUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoU0VDS0VZX1NUT1JBR0VfS0VZKSxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIC8vIE9mZmxpbmUgZmVhdHVyZXMgZW5hYmxlOiBuZWVkIHRvIGtlZXAgc29tZSBkYXRhXG4gICAgZWxzZSB7XG4gICAgICAvLyBBbHdheXMgcmVtb3ZlIG9ubHkgc2VjcmV0IGtleVxuICAgICAgLy8gQnV0IGtlZXA6XG4gICAgICAvLyAtIGFjY291bnQgYnkgcHVia2V5XG4gICAgICAvLyAtIGF1dGggdG9rZW5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnN0b3JhZ2UucmVtb3ZlKFBVQktFWV9TVE9SQUdFX0tFWSksIHRoaXMuc3RvcmFnZS5yZW1vdmUoQUNDT1VOVF9TVE9SQUdFX0tFWSksIHRoaXMuc3RvcmFnZS5yZW1vdmUoU0VDS0VZX1NUT1JBR0VfS0VZKV0pO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHBhZ2UgaGlzdG9yeSwgaW4gbG9jYWwgc2V0dGluZ3NcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzLmNsZWFyUGFnZUhpc3RvcnkoKTtcblxuICAgIC8vIE5vdGlmeSBvYnNlcnZlcnNcbiAgICB0aGlzLm9uTG9nb3V0Lm5leHQoKTtcbiAgICBpZiAoaGFkQXV0aFRva2VuKSB0aGlzLm9uQXV0aFRva2VuQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICBpZiAoaGFkQXV0aEJhc2ljKSB0aGlzLm9uQXV0aEJhc2ljQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLm9uQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgYWNjb3VudFxuICAgKlxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgYXN5bmMgbG9hZChvcHRzPzogeyBvZmZsaW5lPzogYm9vbGVhbjsgZmV0Y2hQb2xpY3k/OiBGZXRjaFBvbGljeTsgcXVlcnk/OiBhbnkgfSk6IFByb21pc2U8QWNjb3VudCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG5vdyA9IHRoaXMuX2RlYnVnICYmIERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gTG9hZGluZyBhY2NvdW50Li4uYCk7XG4gICAgbGV0IGpzb246IGFueTtcblxuICAgIC8vIExvYWQgbG9jYWxseVxuICAgIGNvbnN0IG9mZmxpbmUgPVxuICAgICAgKHRoaXMubmV0d29yay5vZmZsaW5lICYmICghb3B0cyB8fCAob3B0cy5mZXRjaFBvbGljeSAhPT0gJ25ldHdvcmstb25seScgJiYgb3B0cy5mZXRjaFBvbGljeSAhPT0gJ25vLWNhY2hlJykpKSB8fFxuICAgICAgKG9wdHMgJiYgb3B0cy5vZmZsaW5lID09PSB0cnVlKTtcbiAgICBpZiAob2ZmbGluZSkge1xuICAgICAganNvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoQUNDT1VOVF9TVE9SQUdFX0tFWSk7XG4gICAgICBqc29uID0gKGpzb24gJiYgdHlwZW9mIGpzb24gPT09ICdzdHJpbmcnICYmIEpTT04ucGFyc2UoanNvbikpIHx8IGpzb247XG4gICAgICBqc29uID0gKGpzb24gJiYgdGhpcy5fY2FjaGUucHVia2V5ICYmIGpzb24ucHVia2V5ID09PSB0aGlzLl9jYWNoZS5wdWJrZXkgJiYganNvbikgfHwgbnVsbDtcbiAgICAgIGlmICghanNvbiAmJiB0aGlzLl9jYWNoZS5wdWJrZXkpIHtcbiAgICAgICAganNvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoQUNDT1VOVF9TVE9SQUdFX0tFWSArICcjJyArIHRoaXMuX2NhY2hlLnB1YmtleSk7XG4gICAgICAgIGpzb24gPSAoanNvbiAmJiB0eXBlb2YganNvbiA9PT0gJ3N0cmluZycgJiYgSlNPTi5wYXJzZShqc29uKSkgfHwganNvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2FkIHJlbW90ZWx5XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBxdWVyeSA9IG9wdHM/LnF1ZXJ5IHx8ICh0aGlzLmFwaVRva2VuRW5hYmxlZCA/IFF1ZXJpZXMubG9hZFdpdGhUb2tlbnMgOiBRdWVyaWVzLmxvYWQpO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmdyYXBocWwucXVlcnk8eyBkYXRhOiBhbnkgfT4oe1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgZXJyb3I6IHsgY29kZTogRXJyb3JDb2Rlcy5MT0FEX0FDQ09VTlRfRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5MT0FEX0FDQ09VTlRfRVJST1InIH0sXG4gICAgICAgIGZldGNoUG9saWN5OiAob3B0cyAmJiBvcHRzLmZldGNoUG9saWN5KSB8fCAnbm8tY2FjaGUnIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAganNvbiA9IGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKGpzb24pIHtcbiAgICAgIGNvbnN0IGFjY291bnQgPSBBY2NvdW50LmZyb21PYmplY3QoanNvbik7XG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBY2NvdW50IGxvYWRlZCBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgLCBhY2NvdW50KTtcbiAgICAgIHJldHVybiBhY2NvdW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oYFthY2NvdW50XSBBY2NvdW50IG5vdCBmb3VuZCAhYCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlVG9rZW4oZmxhZ3M6IG51bWJlcik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBHZW5lcmF0ZSB0b2tlbi4uLmApO1xuXG4gICAgY29uc3QgYXV0aENoYWxsZW5nZSA9IGF3YWl0IHRoaXMuZ2V0QXV0aENoYWxsZW5nZSgpO1xuICAgIC8vIEFkZCBGbGFncyB0byBjaGFsbGVuZ2VcbiAgICBjb25zdCBjaGFsbGVuZ2UgPSBgJHthdXRoQ2hhbGxlbmdlLmNoYWxsZW5nZX06JHtmbGFnc31gO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IENyeXB0b1NlcnZpY2Uuc2lnbihjaGFsbGVuZ2UsIHRoaXMuX2NhY2hlLmtleXBhaXIpO1xuICAgIGNvbnN0IG5ld1Rva2VuID0gYCR7dGhpcy5fY2FjaGUucHVia2V5fToke2NoYWxsZW5nZX18JHtzaWduYXR1cmV9YDtcblxuICAgIGlmIChuZXdUb2tlbikge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gVG9rZW4gZ2VuZXJhdGVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oYFthY2NvdW50XSBUb2tlbiBnZW5lcmF0aW9uIGZhaWxlZCAhYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld1Rva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVtYWlsIGlzIGF2YWlsYWJsZSBmb3IgbmV3IGFjY291bnQgcmVnaXN0cmF0aW9uLlxuICAgKiBUaHJvdyBhbiBlcnJvciBpZiBub3QgYXZhaWxhYmxlXG4gICAqXG4gICAqIEBwYXJhbSBlbWFpbFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFbWFpbEF2YWlsYWJsZShlbWFpbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaXNFbWFpbEV4aXN0cyA9IGF3YWl0IHRoaXMuaXNFbWFpbEV4aXN0cyhlbWFpbCk7XG4gICAgaWYgKGlzRW1haWxFeGlzdHMpIHtcbiAgICAgIHRocm93IHsgY29kZTogRXJyb3JDb2Rlcy5FTUFJTF9BTFJFQURZX1JFR0lTVEVSRUQsIG1lc3NhZ2U6ICdFUlJPUi5FTUFJTF9BTFJFQURZX1JFR0lTVEVSRUQnIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVtYWlsIGlzIGV4aXN0cyBpbiBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBlbWFpbFxuICAgKi9cbiAgYXN5bmMgaXNFbWFpbEV4aXN0cyhlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gQ2hlY2tpbmcgaWYgeycgKyBlbWFpbCArICd9IGV4aXN0cy4uLicpO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5xdWVyeTx7IGlzRW1haWxFeGlzdHM6IGJvb2xlYW4gfSwgSXNFbWFpbEV4aXN0c1ZhcmlhYmxlcz4oe1xuICAgICAgcXVlcnk6IElzRW1haWxFeGlzdHNRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBlbWFpbCxcbiAgICAgICAgaGFzaDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIEVtYWlsIGV4aXN0OiAnICsgKGRhdGEgJiYgZGF0YS5pc0VtYWlsRXhpc3RzKSk7XG5cbiAgICByZXR1cm4gZGF0YSAmJiBkYXRhLmlzRW1haWxFeGlzdHM7XG4gIH1cblxuICBhc3luYyBzZW5kQ29uZmlybWF0aW9uRW1haWwoZW1haWw6IHN0cmluZywgbG9jYWxlPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbG9jYWxlID0gbG9jYWxlIHx8IHRoaXMuc2V0dGluZ3MubG9jYWxlO1xuICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBTZW5kaW5nIGNvbmZpcm1hdGlvbiBlbWFpbCB0byB7JyArIGVtYWlsICsgJ30gd2l0aCBsb2NhbGUgeycgKyBsb2NhbGUgKyAnfS4uLicpO1xuXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmdyYXBocWwucXVlcnk8eyBkYXRhOiBib29sZWFuIH0+KHtcbiAgICAgIHF1ZXJ5OiBTZW5kQ29uZmlybUVtYWlsUXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgZW1haWwsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlNFTlRfQ09ORklSTUFUSU9OX0VNQUlMX0ZBSUxFRCxcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLlNFTlRfQUNDT1VOVF9DT05GSVJNQVRJT05fRU1BSUxfRkFJTEVEJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpcm1FbWFpbChlbWFpbDogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gU2VuZGluZyBjb25maXJtIHJlcXVlc3QgZm9yIGVtYWlsIHsnICsgZW1haWwgKyAnfSB3aXRoIGNvZGUgeycgKyBjb2RlICsgJ30uLi4nKTtcblxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5ncmFwaHFsLnF1ZXJ5PHsgZGF0YTogYm9vbGVhbiB9Pih7XG4gICAgICBxdWVyeTogQ29uZmlybUVtYWlsUXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgZW1haWwsXG4gICAgICAgIGNvZGUsXG4gICAgICB9LFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogRXJyb3JDb2Rlcy5DT05GSVJNX0VNQUlMX0ZBSUxFRCxcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLkNPTkZJUk1fQUNDT1VOVF9FTUFJTF9GQUlMRUQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRSZXNldFBhc3N3b3JkRW1haWwodXNlcm5hbWU6IHN0cmluZywgbG9jYWxlPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbG9jYWxlID0gbG9jYWxlIHx8IHRoaXMuc2V0dGluZ3MubG9jYWxlO1xuXG4gICAgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFNlbmRpbmcgY2hhbmdlIHBhc3N3b3JkIGVtYWlsIHRvIHske3VzZXJuYW1lfX0gd2l0aCBsb2NhbGUgeyR7bG9jYWxlfX0uLi5gKTtcblxuICAgIGNvbnN0IHsgZGF0YTogaXNPayB9ID0gYXdhaXQgdGhpcy5ncmFwaHFsLnF1ZXJ5PHsgZGF0YTogYm9vbGVhbiB9Pih7XG4gICAgICBxdWVyeTogU2VuZFJlc2V0UGFzc3dvcmRFbWFpbFF1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBsb2NhbGUsXG4gICAgICB9LFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogRXJyb3JDb2Rlcy5BVVRIX1VQREFURV9QVUJLRVlfRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6ICdBQ0NPVU5ULkVSUk9SLkNIQU5HRV9QVUJLRVlfRVJST1InLFxuICAgICAgfSxcbiAgICAgIGZldGNoUG9saWN5OiAnbm8tY2FjaGUnLFxuICAgIH0pO1xuICAgIHJldHVybiBpc09rO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlUHVia2V5KGRhdGE6IEF1dGhEYXRhKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFkYXRhLnVzZXJuYW1lIHx8ICFkYXRhLnBhc3N3b3JkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnKTtcbiAgICBpZiAoIXRoaXMuaXNMb2dpbigpKSB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBiZSBsb2dpbicpO1xuXG4gICAgY29uc3Qga2V5cGFpciA9IGF3YWl0IENyeXB0b1NlcnZpY2Uuc2NyeXB0S2V5cGFpcihkYXRhLnVzZXJuYW1lLCBkYXRhLnBhc3N3b3JkKTtcbiAgICBjb25zdCBwdWJrZXkgPSBCYXNlNTguZW5jb2RlKGtleXBhaXIucHVibGljS2V5KTtcblxuICAgIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBVcGRhdGluZyBhY2NvdW50IHB1YmtleSB0byAke3B1YmtleX0gLi4uYCk7XG5cbiAgICBjb25zdCB7IGRhdGE6IHJlcyB9ID0gYXdhaXQgdGhpcy5ncmFwaHFsLnF1ZXJ5PHsgZGF0YTogYm9vbGVhbiB9Pih7XG4gICAgICBxdWVyeTogVXBkYXRlUHViS2V5UXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHsgcHVia2V5IH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkFVVEhfVVBEQVRFX1BVQktFWV9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLkFDQ09VTlQuVVBEQVRFX1BVQktFWV9FUlJPUicsXG4gICAgICB9LFxuICAgICAgZmV0Y2hQb2xpY3k6ICduby1jYWNoZScsXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gVXBkYXRpbmcgYWNjb3VudCBwdWJrZXkgcmVzcG9uc2VgLCByZXMpO1xuXG4gICAgaWYgKHJlcykge1xuICAgICAgYXdhaXQgdGhpcy5sb2dvdXQoKTtcbiAgICAgIGF3YWl0IHRoaXMubG9naW4oZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGFzeW5jIHJlc2V0UHVia2V5KGRhdGE6IEF1dGhEYXRhLCB0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuaXNMb2dpbigpKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ291dCgpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGNoYWxsZW5nZVxuICAgIGNvbnN0IGNoYWxsZW5nZSA9IHRva2VuLnNwbGl0KCd8JywgMilbMF0uc3BsaXQoJzonLCAyKVsxXTtcbiAgICBjb25zdCBrZXlwYWlyID0gYXdhaXQgQ3J5cHRvU2VydmljZS5zY3J5cHRLZXlwYWlyKGRhdGEudXNlcm5hbWUsIGRhdGEucGFzc3dvcmQpO1xuICAgIGNvbnN0IHB1YmtleSA9IEJhc2U1OC5lbmNvZGUoa2V5cGFpci5wdWJsaWNLZXkpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IENyeXB0b1NlcnZpY2Uuc2lnbihjaGFsbGVuZ2UsIGtleXBhaXIpO1xuICAgIGNvbnN0IG5ld1Rva2VuID0gYCR7cHVia2V5fToke2NoYWxsZW5nZX18JHtzaWduYXR1cmV9YDtcblxuICAgIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBSZXNldHRpbmcgYWNjb3VudCBwdWJrZXksIHVzaW5nIHRva2VuOiBgLCBuZXdUb2tlbik7XG5cbiAgICBjb25zdCB7IGRhdGE6IHJlcyB9ID0gYXdhaXQgdGhpcy5ncmFwaHFsLnF1ZXJ5PHsgZGF0YTogYm9vbGVhbiB9Pih7XG4gICAgICBxdWVyeTogUmVzZXRBY2NvdW50UHVia2V5UXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHsgdG9rZW46IG5ld1Rva2VuLCB1c2VybmFtZTogZGF0YS51c2VybmFtZSB9LFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogRXJyb3JDb2Rlcy5BVVRIX1VQREFURV9QVUJLRVlfRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6ICdFUlJPUi5BQ0NPVU5ULlVQREFURV9QVUJLRVlfRVJST1InLFxuICAgICAgfSxcbiAgICAgIGZldGNoUG9saWN5OiAnbm8tY2FjaGUnLFxuICAgIH0pO1xuXG4gICAgLy8gTG9naW5cbiAgICBpZiAocmVzKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ2luKGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBsaXN0ZW5DaGFuZ2VzKG9wdHM/OiBBY2NvdW50V2F0Y2hPcHRpb25zKTogU3Vic2NyaXB0aW9uIHtcbiAgICBpZiAodGhpcy5fZW5hYmxlTGlzdGVuQ2hhbmdlcykgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oKTsgLy8gQWxyZWFkeSBzdGFydGVkOiBza2lwXG5cbiAgICByZXR1cm4gdGhpcy5zdGFydExpc3RlblJlbW90ZUNoYW5nZXMob3B0cyk7XG4gIH1cblxuICBnZXQgYWRkaXRpb25hbEZpZWxkcygpOiBGb3JtRmllbGREZWZpbml0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLl8kYWRkaXRpb25hbEZpZWxkcy5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgZ2V0ICRhZGRpdGlvbmFsRmllbGRzKCk6IE9ic2VydmFibGU8Rm9ybUZpZWxkRGVmaW5pdGlvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMuXyRhZGRpdGlvbmFsRmllbGRzLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0QWRkaXRpb25hbEZpZWxkKGtleTogc3RyaW5nKTogRm9ybUZpZWxkRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuXyRhZGRpdGlvbmFsRmllbGRzLmdldFZhbHVlKCkuZmluZCgoZikgPT4gZi5rZXkgPT09IGtleSk7XG4gIH1cblxuICByZWdpc3RlckFkZGl0aW9uYWxGaWVsZChmaWVsZDogRm9ybUZpZWxkRGVmaW5pdGlvbikge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuXyRhZGRpdGlvbmFsRmllbGRzLmdldFZhbHVlKCk7XG4gICAgaWYgKHZhbHVlcy5zb21lKChmKSA9PiBmLmtleSA9PT0gZmllbGQua2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZGRpdGlvbmFsIGFjY291bnQgZmllbGQge2tleTogJHtmaWVsZC5rZXl9fSBhbHJlYWR5IGRlZmluZS5gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gRm91bmQgYWRkaXRpb25hbCBhY2NvdW50J3MgZmllbGQge2tleTogJHtmaWVsZC5rZXl9fWApO1xuICAgIHRoaXMuXyRhZGRpdGlvbmFsRmllbGRzLm5leHQodmFsdWVzLmNvbmNhdChmaWVsZCkpO1xuICB9XG5cbiAgZ2V0IG9wdGlvbkRlZnMoKTogRm9ybUZpZWxkRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uRGVmcztcbiAgfVxuXG4gIHJlZ2lzdGVyT3B0aW9uKGRlZjogRm9ybUZpZWxkRGVmaW5pdGlvbikge1xuICAgIGlmICh0aGlzLl9vcHRpb25EZWZzLmZpbmRJbmRleCgoZikgPT4gZi5rZXkgPT09IGRlZi5rZXkpICE9PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZGRpdGlvbmFsIG9wdGlvbiB7JHtkZWYua2V5fX0gYWxyZWFkeSBkZWZpbmUuYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIEFkZGluZyBhZGRpdGlvbmFsIG9wdGlvbiB7JHtkZWYua2V5fX1gLCBkZWYpO1xuICAgIHRoaXMuX29wdGlvbkRlZnMucHVzaChkZWYpO1xuICB9XG5cbiAgcmVnaXN0ZXJPcHRpb25zKGRlZnM6IEZvcm1GaWVsZERlZmluaXRpb25bXSkge1xuICAgIChkZWZzIHx8IFtdKS5mb3JFYWNoKChkZWYpID0+IHRoaXMucmVnaXN0ZXJPcHRpb24oZGVmKSk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kIC0tICovXG5cbiAgcHJvdGVjdGVkIHJlc2V0RGF0YSgpIHtcbiAgICB0aGlzLnN0b3BMaXN0ZW5SZW1vdGVDaGFuZ2VzKCk7XG4gICAgdGhpcy5fY2FjaGUubG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fY2FjaGUua2V5cGFpciA9IG51bGw7XG4gICAgdGhpcy5fY2FjaGUuYXV0aFRva2VuID0gbnVsbDtcbiAgICB0aGlzLl9jYWNoZS5hdXRoQmFzaWMgPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlLnB1YmtleSA9IG51bGw7XG4gICAgdGhpcy5fY2FjaGUubWFpblByb2ZpbGUgPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlLnBlcnNvbiA9IG51bGw7XG4gICAgdGhpcy5fY2FjaGUuZGVwYXJ0bWVudCA9IG51bGw7XG4gICAgdGhpcy5fZGF0YSA9IG5ldyBBY2NvdW50KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZERhdGEob3B0cz86IHsgb2ZmbGluZT86IGJvb2xlYW47IGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3kgfSk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICghdGhpcy5fY2FjaGUucHVia2V5KSB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGxvZ2dlZCcpO1xuXG4gICAgdGhpcy5fY2FjaGUubG9hZGVkID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYWNjb3VudCA9IChhd2FpdCB0aGlzLmxvYWQob3B0cykpIHx8IG5ldyBBY2NvdW50KCk7XG5cbiAgICAgIC8vIFNldCBkZWZhdWx0c1xuICAgICAgYWNjb3VudC5hdmF0YXIgPSBhY2NvdW50LmF2YXRhciB8fCB0aGlzLmVudmlyb25tZW50LmJhc2VVcmwgKyBERUZBVUxUX0FWQVRBUl9JTUFHRTtcbiAgICAgIGFjY291bnQuc2V0dGluZ3MgPSBhY2NvdW50LnNldHRpbmdzIHx8IG5ldyBVc2VyU2V0dGluZ3MoKTtcbiAgICAgIGFjY291bnQuc2V0dGluZ3MubG9jYWxlID0gYWNjb3VudC5zZXR0aW5ncy5sb2NhbGUgfHwgdGhpcy5zZXR0aW5ncy5sb2NhbGU7XG4gICAgICBhY2NvdW50LnNldHRpbmdzLmxhdExvbmdGb3JtYXQgPSBhY2NvdW50LnNldHRpbmdzLmxhdExvbmdGb3JtYXQgfHwgdGhpcy5zZXR0aW5ncy5sYXRMb25nRm9ybWF0IHx8ICdERE1NJztcbiAgICAgIGFjY291bnQuc2V0dGluZ3MuY29udGVudCA9IGFjY291bnQuc2V0dGluZ3MuY29udGVudCB8fCB7fTtcblxuICAgICAgLy8gUmVhZCBtYWluIHByb2ZpbGVcbiAgICAgIHRoaXMuX2NhY2hlLm1haW5Qcm9maWxlID0gUGVyc29uVXRpbHMuZ2V0TWFpblByb2ZpbGUoYWNjb3VudC5wcm9maWxlcyk7XG5cbiAgICAgIC8vIFVwZGF0ZSwgaW5zdGVhZCBvZiByZXBsYWNlIGl0XG4gICAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgICB0aGlzLl9kYXRhLmZyb21PYmplY3QoYWNjb3VudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9kYXRhID0gYWNjb3VudDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhY2hlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgIC8vIEFwcGx5IHNldHRpbmdzLCBmb3VuZCBpbiByZW1vdGUgYWNjb3VudFxuICAgICAgaWYgKGFjY291bnQuc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgICAgLi4udGhpcy5zZXR0aW5ncy5zZXR0aW5ncyxcbiAgICAgICAgICAuLi5hY2NvdW50LnNldHRpbmdzLmFzTG9jYWxTZXR0aW5ncygpLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB0aGlzLnNldHRpbmdzLmFwcGx5KHNldHRpbmdzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMucmVzZXREYXRhKCk7XG4gICAgICBpZiAoZXJyb3IuY29kZSAmJiBlcnJvci5tZXNzYWdlKSB0aHJvdyBlcnJvcjtcblxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyB7XG4gICAgICAgIGNvZGU6IEVycm9yQ29kZXMuTE9BRF9BQ0NPVU5UX0VSUk9SLFxuICAgICAgICBtZXNzYWdlOiAnRVJST1IuTE9BRF9BQ0NPVU5UX0VSUk9SJyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGxpc3RlblNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFdoZW4gc2V0dGluZ3MgY2hhbmdlZDogc2F2ZSBpdCByZW1vdGVseVxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLnNldHRpbmdzLm9uQ2hhbmdlXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSgxMDAwKSxcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5pc0xvZ2luKCkgJiYgdGhpcy5uZXR3b3JrLm9ubGluZSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChzZXR0aW5ncykgPT4gdGhpcy5zYXZlTG9jYWxTZXR0aW5nc1JlbW90ZWx5KHNldHRpbmdzKSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc3RvcmVMb2NhbGx5KCk6IFByb21pc2U8QWNjb3VudCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIFJlc3RvcmUgZnJvbSBzdG9yYWdlXG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5zdG9yYWdlLmdldChQVUJLRVlfU1RPUkFHRV9LRVkpLFxuICAgICAgdGhpcy5zdG9yYWdlLmdldChUT0tFTl9TVE9SQUdFX0tFWSksXG4gICAgICB0aGlzLnN0b3JhZ2UuZ2V0KFNFQ0tFWV9TVE9SQUdFX0tFWSksXG4gICAgXSk7XG4gICAgbGV0IHB1YmtleSA9IHZhbHVlc1swXTtcbiAgICBsZXQgdG9rZW4gPSB2YWx1ZXNbMV07XG4gICAgY29uc3Qgc2Vja2V5ID0gdmFsdWVzWzJdO1xuXG4gICAgLy8gREVWIG9ubHkgLSBhdXRoIGJ5IHRva2VuXG4gICAgaWYgKCF0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb24gJiYgdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0QXV0aFZhbHVlcz8udG9rZW4pIHtcbiAgICAgIHRva2VuID0gdG9rZW4gfHwgdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0QXV0aFZhbHVlcy50b2tlbjtcbiAgICAgIHB1YmtleSA9IHB1YmtleSB8fCB0b2tlbj8uc3BsaXQoJzonLCAyKVswXTtcbiAgICB9XG5cbiAgICAvLyBRdWl0IGlmIG5vIHB1YmtleSAobm90IGxvZ2dlZClcbiAgICBpZiAoIXB1YmtleSkgcmV0dXJuO1xuXG4gICAgLy8gUXVpdCBpZiBjb3VsZCBub3QgYXV0aCBvbiBwb2RcbiAgICBjb25zdCBjYW5SZW1vdGVBdXRoID0gdG9rZW4gfHwgc2Vja2V5IHx8IGZhbHNlO1xuICAgIGlmICghY2FuUmVtb3RlQXV0aCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gQWNjb3VudCByZXN0b3JhdGlvbi4uLmApO1xuXG4gICAgdGhpcy5fY2FjaGUuYXV0aFRva2VuID0gdG9rZW47XG4gICAgdGhpcy5fY2FjaGUucHVia2V5ID0gcHVia2V5O1xuICAgIHRoaXMuX2NhY2hlLmtleXBhaXIgPVxuICAgICAgKHNlY2tleSAmJiB7XG4gICAgICAgIHB1YmxpY0tleTogQmFzZTU4LmRlY29kZShwdWJrZXkpLFxuICAgICAgICBzZWNyZXRLZXk6IEJhc2U1OC5kZWNvZGUoc2Vja2V5KSxcbiAgICAgIH0pIHx8XG4gICAgICBudWxsO1xuXG4gICAgLy8gT25saW5lIG1vZGU6IHRyeSB0byBjb25uZWN0IHRvIHBvZFxuICAgIGlmICh0aGlzLm5ldHdvcmsub25saW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlLmF1dGhUb2tlbiAmJiAhdGhpcy5fY2FjaGUuYXV0aEJhc2ljKSB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gT2ZmbGluZSBmZWF0dXJlIGFyZSBlbmFibGU6IGNvbnRpbnVlIGluIG9mZmxpbmUgbW9kZVxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5oYXNPZmZsaW5lRmVhdHVyZSgpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbYWNjb3VudF0gVW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBvbiBwb2Q6IGZvcmNpbmcgb2ZmbGluZSBtb2RlJyk7XG4gICAgICAgICAgdGhpcy5uZXR3b3JrLnNldEZvcmNlT2ZmbGluZSh0cnVlLCB7IHNob3dUb2FzdDogZmFsc2UgfSk7XG4gICAgICAgICAgLy8gQ29udGludWVcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBvZmZsaW5lIGZlYXR1cmVzIGVuYWJsZSAoPW9mZmxpbmUgbW9kZSBub3QgYWxsb3dlZClcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dvdXQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGFjY291bnQsIGZyb20gcHVia2V5XG4gICAgbGV0IGpzb25BY2NvdW50ID0gYXdhaXQgdGhpcy5zdG9yYWdlLmdldChgJHtBQ0NPVU5UX1NUT1JBR0VfS0VZfSMke3B1YmtleX1gKTtcbiAgICBpZiAoIWpzb25BY2NvdW50KSB7XG4gICAgICAvLyBUcnkgdXNpbmcgdGhlIG9sZCBzdG9yYWdlIGtleVxuICAgICAgY29uc3QgYWNjb3VudFN0ciA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoQUNDT1VOVF9TVE9SQUdFX0tFWSk7XG4gICAgICBqc29uQWNjb3VudCA9IGFjY291bnRTdHIgJiYgKCh0eXBlb2YgYWNjb3VudFN0ciA9PT0gJ3N0cmluZycgJiYgSlNPTi5wYXJzZShqc29uQWNjb3VudCkpIHx8IGFjY291bnRTdHIpO1xuICAgIH1cblxuICAgIC8vIEludmFsaWQgYWNjb3VudDogZG8gbm90IHVzZSBpdFxuICAgIGlmICghanNvbkFjY291bnQgfHwganNvbkFjY291bnQucHVia2V5ICE9PSBwdWJrZXkpIHtcbiAgICAgIC8vIERFViBvbmx5OiBjcmVhdGUgYSBmYWtlIGFjY291bnQgd2l0aCBnaXZlbiB1c2VybmFtZVxuICAgICAgaWYgKCF0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb24gJiYgdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0QXV0aFZhbHVlcy51c2VybmFtZSkge1xuICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdEF1dGhWYWx1ZXMudXNlcm5hbWU7XG4gICAgICAgIGpzb25BY2NvdW50ID0geyBwdWJrZXksIHVzZXJuYW1lLCBmaXJzdE5hbWU6IHVzZXJuYW1lLCBsYXN0TmFtZTogdXNlcm5hbWUgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcmFuc2Zvcm0gdG8gZW50aXR5XG4gICAgY29uc3QgYWNjb3VudCA9IEFjY291bnQuZnJvbU9iamVjdChqc29uQWNjb3VudCk7XG5cbiAgICAvLyBVcGRhdGUgZGF0YVxuICAgIHRoaXMuX2RhdGEgPSBhY2NvdW50O1xuICAgIHRoaXMuX2NhY2hlLm1haW5Qcm9maWxlID0gUGVyc29uVXRpbHMuZ2V0TWFpblByb2ZpbGUoYWNjb3VudC5wcm9maWxlcyk7XG4gICAgdGhpcy5fY2FjaGUubG9hZGVkID0gdHJ1ZTtcblxuICAgIC8vIEVtaXQgZXZlbnRcbiAgICB0aGlzLm9uTG9naW4ubmV4dCh0aGlzLl9kYXRhKTtcbiAgICB0aGlzLm9uQ2hhbmdlLm5leHQodGhpcy5fZGF0YSk7XG5cbiAgICBpZiAodGhpcy5fZW5hYmxlTGlzdGVuQ2hhbmdlcykgdGhpcy5zdGFydExpc3RlblJlbW90ZUNoYW5nZXMoKTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIEFjY291bnQgcmVzdG9yYXRpb24gW09LXSB7cHVia2V5OiAke3B1YmtleS5zdWJzdHIoMCwgOCl9fSwge3Byb2ZpbGU6ICR7dGhpcy5fY2FjaGUubWFpblByb2ZpbGV9fWApO1xuXG4gICAgcmV0dXJuIGFjY291bnQ7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhY2NvdW50IGludG8gdGhlIGxvY2FsIHN0b3JhZ2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBzYXZlTG9jYWxseSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2NhY2hlLnB1YmtleSkgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBsb2dnZWQnKTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFNhdmluZyBhY2NvdW50IHske3RoaXMuX2NhY2hlLnB1YmtleS5zdWJzdHJpbmcoMCwgNil9fSBpbiBsb2NhbCBzdG9yYWdlLi4uYCk7XG5cbiAgICAvLyBDb252ZXJ0IGFjY291bnQgdG8ganNvblxuICAgIGNvbnN0IGpzb24gPSB0aGlzLl9kYXRhLmFzT2JqZWN0KHsga2VlcFR5cGVuYW1lOiB0cnVlIH0pO1xuICAgIGNvbnN0IHNlY2tleSA9ICh0aGlzLl9jYWNoZS5rZXlwYWlyICYmIHRoaXMuX2NhY2hlLmtleXBhaXIuc2VjcmV0S2V5ICYmIEJhc2U1OC5lbmNvZGUodGhpcy5fY2FjaGUua2V5cGFpci5zZWNyZXRLZXkpKSB8fCBudWxsO1xuXG4gICAgLy8gQ29udmVydCBhdmF0YXIgVVJMIHRvIGRhdGFVcmwgKGUuZy4gJ2RhdGE6aW1hZ2UvcG5nOjxiYXNlNjQgY29udGVudD4nKVxuICAgIGNvbnN0IGhhc0F2YXRhclVybCA9XG4gICAgICBqc29uLmF2YXRhciAmJiAhanNvbi5hdmF0YXIuZW5kc1dpdGgoREVGQVVMVF9BVkFUQVJfSU1BR0UpICYmIChqc29uLmF2YXRhci5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwganNvbi5hdmF0YXIuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSk7XG4gICAgaWYgKGhhc0F2YXRhclVybCAmJiB0aGlzLm5ldHdvcmsub25saW5lKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVcbiAgICAgICAgLmdldEltYWdlKGpzb24uYXZhdGFyLCB7XG4gICAgICAgICAgdGh1bWJuYWlsOiB0cnVlLFxuICAgICAgICAgIG91dHB1dFR5cGU6ICdkYXRhVXJsJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKGRhdGFVcmwpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YVVybCAmJiB0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIEltYWdlIGZldGNoZWQ6ICcsIGRhdGFVcmwuc3Vic3RyaW5nKDAsIDUwKSk7XG5cbiAgICAgICAgICAvLyBUT0RPOiBtYWtlIHN1cmUgdG8gZGlzcGxheSBCYXNlNjQgaW1hZ2UgaW4gdGhlIG1lbnUgdG9wIGhlYWRlclxuICAgICAgICAgIC8vanNvbkFjY291bnQuYXZhdGFyID0gZGF0YVVybDtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbYWNjb3VudF0gRXJyb3Igd2hpbGUgZmV0Y2hpbmcgaW1hZ2U6ICR7anNvbi5hdmF0YXJ9OiAke2Vycn1gKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldChQVUJLRVlfU1RPUkFHRV9LRVksIHRoaXMuX2NhY2hlLnB1YmtleSksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoVE9LRU5fU1RPUkFHRV9LRVksIHRoaXMuX2NhY2hlLmF1dGhUb2tlbiksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoYCR7QUNDT1VOVF9TVE9SQUdFX0tFWX0jJHt0aGlzLl9jYWNoZS5wdWJrZXl9YCwganNvbiksXG4gICAgICAgIC8vIFNlY3JldCBrZXkgKG9wdGlvbmFsKVxuICAgICAgICAoc2Vja2V5ICYmIHRoaXMuc3RvcmFnZS5zZXQoU0VDS0VZX1NUT1JBR0VfS0VZLCBzZWNrZXkpKSB8fCB0aGlzLnN0b3JhZ2UucmVtb3ZlKFNFQ0tFWV9TVE9SQUdFX0tFWSksXG4gICAgICAgIC8vIFJlbW92ZSBvbGQgc3RvcmFnZSBrZXlcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShBQ0NPVU5UX1NUT1JBR0VfS0VZKSxcbiAgICAgIF0pO1xuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBBY2NvdW50IHNhdmVkIGluIGxvY2FsIHN0b3JhZ2UnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1thY2NvdW50XSBFcnJvciB3aGlsZSBzYXZpbmcgYWNjb3VudCBsb2NhbGx5OiAnICsgKChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8IGVyciksIGVycik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2F2ZUxvY2FsU2V0dGluZ3NSZW1vdGVseShzb3VyY2U6IExvY2FsU2V0dGluZ3MpIHtcbiAgICBpZiAoIXNvdXJjZSB8fCAhdGhpcy5pc0xvZ2luKCkgfHwgc291cmNlLmFjY291bnRJbmhlcml0YW5jZSA9PT0gZmFsc2UpIHJldHVybjsgLy8gU2tpcFxuICAgIGNvbnN0IGFjY291bnQgPSB0aGlzLmFjY291bnQ7XG5cbiAgICAvLyBNZXJnZSBsb2NhbCBzZXR0aW5ncyBpbnRvIGFjY291bnQncyBzZXR0aW5nc1xuICAgIGNvbnN0IHNldHRpbmdzID0gVXNlclNldHRpbmdzLmZyb21PYmplY3QoYWNjb3VudC5zZXR0aW5ncykgfHwgbmV3IFVzZXJTZXR0aW5ncygpO1xuICAgIGNvbnN0IGNoYW5nZWQgPSBzZXR0aW5ncy5tZXJnZShzb3VyY2UsIFsnbG9jYWxlJywgJ2xhdExvbmdGb3JtYXQnLCAncHJvcGVydGllcyddKTtcblxuICAgIGlmICghY2hhbmdlZCkgcmV0dXJuOyAvLyBTa2lwIGlmIHVuY2hhbmdlZFxuXG4gICAgLy8gU2F2ZSByZW1vdGVseVxuICAgIHRoaXMuYWNjb3VudC5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIGF3YWl0IHRoaXMuc2F2ZVNldHRpbmdzUmVtb3RlbHkoc2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvciB1cGRhdGUgYW4gdXNlciBhY2NvdW50XG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50XG4gICAqIEBwYXJhbSBrZXlQYWlyXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZVJlbW90ZWx5KGFjY291bnQ6IEFjY291bnQsIGtleVBhaXI/OiBLZXlwYWlyKTogUHJvbWlzZTxBY2NvdW50PiB7XG4gICAgYWNjb3VudC5wdWJrZXkgPSBhY2NvdW50LnB1YmtleSB8fCAoa2V5UGFpciAmJiBCYXNlNTguZW5jb2RlKGtleVBhaXIucHVibGljS2V5KSk7XG4gICAgaWYgKCFhY2NvdW50LnB1YmtleSkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGFjY291bnQgcHVia2V5Jyk7XG5cbiAgICBjb25zdCBub3cgPSB0aGlzLl9kZWJ1ZyAmJiBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFNhdmluZyBhY2NvdW50IHJlbW90ZWx5Li4uYCk7XG5cbiAgICBjb25zdCBpc05ldyA9IGlzTmlsKGFjY291bnQuaWQpO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhbiB1cGRhdGU6IGdldCBleGlzdGluZyBhY2NvdW50J3MgdXBkYXRlRGF0ZSwgdG8gYXZvaWQgJ3ZlcnNpb24gZXJyb3InIHdoZW4gc2F2aW5nXG4gICAgaWYgKCFpc05ldykge1xuICAgICAgY29uc3QgZXhpc3RpbmdBY2NvdW50ID0gYXdhaXQgdGhpcy5sb2FkKHsgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknIH0pO1xuICAgICAgaWYgKCFleGlzdGluZ0FjY291bnQgfHwgIWV4aXN0aW5nQWNjb3VudC51cGRhdGVEYXRlKSB7XG4gICAgICAgIHRocm93IHsgY29kZTogRXJyb3JDb2Rlcy5BQ0NPVU5UX05PVF9FWElTVFMsIG1lc3NhZ2U6ICdFUlJPUi5BQ0NPVU5UX05PVF9FWElTVFMnIH07XG4gICAgICB9XG4gICAgICB0aGlzLmNvcHlJZEFuZFVwZGF0ZURhdGUoZXhpc3RpbmdBY2NvdW50LCBhY2NvdW50KTtcbiAgICB9XG5cbiAgICAvLyBNZXJnaW5nIHNldHRpbmdzXG4gICAgYWNjb3VudC5zZXR0aW5ncy5jb250ZW50WydwYWdlcyddID0gdGhpcy5zZXR0aW5ncy5zZXR0aW5ncy5wYWdlcztcbiAgICBhY2NvdW50LnNldHRpbmdzLmNvbnRlbnRbJ3BhZ2VIaXN0b3J5J10gPSB0aGlzLnNldHRpbmdzLnNldHRpbmdzLnBhZ2VIaXN0b3J5O1xuXG4gICAgLy8gQ29udmVydCB0byBqc29uXG4gICAgY29uc3QganNvbiA9IGFjY291bnQuYXNPYmplY3QoTUlOSUZZX0VOVElUWV9GT1JfUE9EKTtcblxuICAgIC8vIFVzZXIgbm90IGFsbG93IHRvIGNoYW5nZSBoaXMgcHJvZmlsZXNcbiAgICBkZWxldGUganNvbi5wcm9maWxlcztcblxuICAgIGNvbnN0IG11dGF0aW9uID0gaXNOZXcgPyBNdXRhdGlvbnMuY3JlYXRlIDogdGhpcy5fYXBpVG9rZW5FbmFibGVkID8gTXV0YXRpb25zLnNhdmVXaXRoVG9rZW5zIDogTXV0YXRpb25zLnNhdmU7XG5cbiAgICAvLyBFeGVjdXRlIG11dGF0aW9uXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmdyYXBocWwubXV0YXRlPHsgZGF0YTogQWNjb3VudCB9Pih7XG4gICAgICBtdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczogeyBkYXRhOiBqc29uIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlNBVkVfQUNDT1VOVF9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLlNBVkVfQUNDT1VOVF9FUlJPUicsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQ29weSB1cGRhdGUgcHJvcGVydGllc1xuICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZShkYXRhLCBhY2NvdW50KTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIEFjY291bnQgcmVtb3RlbHkgc2F2ZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG5cbiAgICByZXR1cm4gYWNjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb3IgdXBkYXRlIHVzZXIgc2V0dGluZ3NcbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZVNldHRpbmdzUmVtb3RlbHkoc2V0dGluZ3M6IFVzZXJTZXR0aW5ncykge1xuICAgIGNvbnN0IG5vdyA9IHRoaXMuX2RlYnVnICYmIERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gU2F2aW5nIHNldHRpbmdzIHJlbW90ZWx5Li4uYCk7XG5cbiAgICBjb25zdCBqc29uID0gc2V0dGluZ3MuYXNPYmplY3QoTUlOSUZZX0VOVElUWV9GT1JfUE9EKTtcblxuICAgIC8vIEV4ZWN1dGUgbXV0YXRpb25cbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5tdXRhdGU8eyBkYXRhOiBVc2VyU2V0dGluZ3MgfT4oe1xuICAgICAgbXV0YXRpb246IE11dGF0aW9ucy5zYXZlU2V0dGluZ3MsXG4gICAgICB2YXJpYWJsZXM6IHsgZGF0YToganNvbiB9LFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogRXJyb3JDb2Rlcy5TQVZFX1NFVFRJTkdTX0VSUk9SLFxuICAgICAgICBtZXNzYWdlOiAnRVJST1IuU0FWRV9TRVRUSU5HU19FUlJPUicsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQ29weSB1cGRhdGUgcHJvcGVydGllc1xuICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZVNldHRpbmdzKGRhdGEsIHNldHRpbmdzKTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFNldHRpbmdzIHJlbW90ZWx5IHNhdmVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgLy8gU2F2ZSBpbnRvIGFjY291bnRcbiAgICBpZiAodGhpcy5hY2NvdW50KSB0aGlzLmFjY291bnQuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhdXRoZW50aWNhdGVBbmRHZXRUb2tlbih0b2tlbj86IHN0cmluZywgY291bnRlcj86IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZS5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkJyk7XG5cbiAgICBpZiAoIWNvdW50ZXIpIGNvbnNvbGUuaW5mbygnW2FjY291bnRdIEF1dGhlbnRpY2F0aW9uIG9uIHBvZC4uLicpO1xuXG4gICAgaWYgKGNvdW50ZXIgPiA0KSB7XG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBGYWlsZWQgdG8gYXV0aGVudGljYXRpb24gb24gcG9kIChhZnRlciAke2NvdW50ZXJ9IGF0dGVtcHRzKWApO1xuICAgICAgdGhyb3cgeyBjb2RlOiBFcnJvckNvZGVzLkFVVEhfU0VSVkVSX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuQVVUSF9TRVJWRVJfRVJST1InIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdmFsaWRcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmdyYXBocWwucXVlcnk8eyBhdXRoZW50aWNhdGU6IGJvb2xlYW4gfSwgeyB0b2tlbjogc3RyaW5nIH0+KHtcbiAgICAgICAgcXVlcnk6IEF1dGhRdWVyeSxcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgdG9rZW4sXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgY29kZTogRXJyb3JDb2Rlcy5VTkFVVEhPUklaRUQsXG4gICAgICAgICAgbWVzc2FnZTogJ0VSUk9SLlVOQVVUSE9SSVpFRCcsXG4gICAgICAgIH0sXG4gICAgICAgIGZldGNoUG9saWN5OiAnbm8tY2FjaGUnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFRva2VuIGlzIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXJcbiAgICAgIGlmIChkYXRhICYmIGRhdGEuYXV0aGVudGljYXRlKSB7XG4gICAgICAgIC8vIFN0b3JlIHRoZSB0b2tlblxuICAgICAgICB0aGlzLm9uQXV0aFRva2VuQ2hhbmdlLm5leHQodG9rZW4pO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgW2FjY291bnRdIEF1dGhlbnRpY2F0aW9uIG9uIHBvZCBbT0tdIHtwdWJrZXk6ICcke3RoaXMuX2NhY2hlLnB1YmtleS5zdWJzdHIoMCwgOCl9J31gKTtcbiAgICAgICAgcmV0dXJuIHRva2VuOyAvLyByZXR1cm4gdGhlIHRva2VuXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRpbnVlICh3aWxsIHJldHJ5IHdpdGggYW5vdGhlciBjaGFsbGVuZ2UpXG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgYSBuZXcgdG9rZW5cbiAgICBjb25zdCBhdXRoQ2hhbGxlbmdlID0gYXdhaXQgdGhpcy5nZXRBdXRoQ2hhbGxlbmdlKCk7XG4gICAgLy8gVE9ETzogY2hlY2sgc2VydmVyIHB1YmtleSBhcyBhIHZhbGlkIGNlcnRpZmljYXRlXG5cbiAgICAvLyBEbyB0aGUgY2hhbGxlbmdlXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgQ3J5cHRvU2VydmljZS5zaWduKGF1dGhDaGFsbGVuZ2UuY2hhbGxlbmdlLCB0aGlzLl9jYWNoZS5rZXlwYWlyKTtcbiAgICBjb25zdCBuZXdUb2tlbiA9IGAke3RoaXMuX2NhY2hlLnB1YmtleX06JHthdXRoQ2hhbGxlbmdlLmNoYWxsZW5nZX18JHtzaWduYXR1cmV9YDtcblxuICAgIC8vIGl0ZXJhdGUgd2l0aCB0aGUgbmV3IHRva2VuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlQW5kR2V0VG9rZW4obmV3VG9rZW4sIChjb3VudGVyIHx8IDEpICsgMSAvKiBpbmNyZW1lbnQgKi8pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEF1dGhDaGFsbGVuZ2UoKTogUHJvbWlzZTxJQXV0aENoYWxsZW5nZT4ge1xuICAgIGNvbnN0IGNoYWxsZW5nZUVycm9yID0ge1xuICAgICAgY29kZTogRXJyb3JDb2Rlcy5BVVRIX0NIQUxMRU5HRV9FUlJPUixcbiAgICAgIG1lc3NhZ2U6ICdFUlJPUi5BVVRIX0NIQUxMRU5HRV9FUlJPUicsXG4gICAgfTtcbiAgICBjb25zdCB7IGF1dGhDaGFsbGVuZ2UgfSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5xdWVyeTx7XG4gICAgICBhdXRoQ2hhbGxlbmdlOiBJQXV0aENoYWxsZW5nZTtcbiAgICB9Pih7XG4gICAgICBxdWVyeTogQXV0aENoYWxsZW5nZVF1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7fSxcbiAgICAgIGVycm9yOiBjaGFsbGVuZ2VFcnJvcixcbiAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGNoYWxsZW5nZVxuICAgIGlmICghYXV0aENoYWxsZW5nZSkgdGhyb3cgY2hhbGxlbmdlRXJyb3I7IC8vIFNob3VsZCBuZXZlciBvY2N1clxuXG4gICAgLy8gQ2hlY2sgc2VydmVyIHNpZ25hdHVyZVxuICAgIGNvbnN0IHNpZ25hdHVyZU9LID0gYXdhaXQgQ3J5cHRvU2VydmljZS52ZXJpZnkoYXV0aENoYWxsZW5nZS5jaGFsbGVuZ2UsIGF1dGhDaGFsbGVuZ2Uuc2lnbmF0dXJlLCBhdXRoQ2hhbGxlbmdlLnB1YmtleSk7XG4gICAgaWYgKCFzaWduYXR1cmVPSykge1xuICAgICAgY29uc29sZS53YXJuKCdGSVhNRTogQmFkIHBlZXIgc2lnbmF0dXJlIG9uIGF1dGggY2hhbGxlbmdlICEnLCBhdXRoQ2hhbGxlbmdlKTtcbiAgICB9XG4gICAgcmV0dXJuIGF1dGhDaGFsbGVuZ2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRMaXN0ZW5SZW1vdGVDaGFuZ2VzKG9wdHM/OiBBY2NvdW50V2F0Y2hPcHRpb25zKTogU3Vic2NyaXB0aW9uIHtcbiAgICBpZiAodGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbikgdGhpcy5zdG9wTGlzdGVuUmVtb3RlQ2hhbmdlcygpOyAvLyBTdG9wIHByZXZpb3VzIHN1YnNjcmlwdGlvblxuICAgIGlmICh0aGlzLm5ldHdvcmsub2ZmbGluZSkgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oKTsgLy8gT2ZmbGluZTogc2tpcFxuXG4gICAgdGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMud2F0Y2hDaGFuZ2VzKG9wdHMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YSkgPT4ge1xuICAgICAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gUmVtb3RlIHVwZGF0ZSBkZXRlY3RlZCBhdCAke2RhdGEudXBkYXRlRGF0ZX1gKTtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyICYmICtlcnIuY29kZSA9PT0gU2VydmVyRXJyb3JDb2Rlcy5OT1RfRk9VTkQpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1thY2NvdW50XSBbV1NdIEFjY291bnQgbm90IGV4aXN0cyBhbnltb3JlOiBmb3JjZSB1c2VyIHRvIGxvZ291dC4uLicsIGVycik7XG4gICAgICAgICAgdGhpcy5sb2dvdXQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnIgJiYgK2Vyci5jb2RlID09PSBTZXJ2ZXJFcnJvckNvZGVzLlVOQVVUSE9SSVpFRCkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW2FjY291bnRdIFtXU10gQWNjb3VudCBub3QgYXV0aG9yaXplZDogZm9yY2UgdXNlciB0byBsb2dvdXQuLi4nLCBlcnIpO1xuICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbYWNjb3VudF0gW1dTXSBSZWNlaXZlZCBlcnJvcjonLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuX2xpc3RlbkNoYW5nZXNTdWJzY3JpcHRpb24uYWRkKCgpID0+IHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBTdG9wIHdhdGNoaW5nIHJlbW90ZSBjaGFuZ2VzYCk7XG4gICAgICB0aGlzLl9saXN0ZW5DaGFuZ2VzU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdG9wTGlzdGVuUmVtb3RlQ2hhbmdlcygpIHtcbiAgICB0aGlzLl9saXN0ZW5DaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhdGNoQ2hhbmdlcyhvcHRzPzogQWNjb3VudFdhdGNoT3B0aW9ucyk6IE9ic2VydmFibGU8QWNjb3VudD4ge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAvLyBXYWl0IHNlcnZpY2UgcmVhZHksIHRoZW4gbG9vcFxuICAgICAgcmV0dXJuIGZyb20odGhpcy5yZWFkeSgpKS5waXBlKHN3aXRjaE1hcCgoKSA9PiB0aGlzLndhdGNoQ2hhbmdlcyhvcHRzKSkpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fY2FjaGUucHVia2V5KSB0aHJvdyBuZXcgRXJyb3IoJ05vdCBsb2dnZWQgaW4nKTtcbiAgICBpZiAodGhpcy5uZXR3b3JrLm9mZmxpbmUpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHdhdGNoIGFjY291bnQgY2hhbmdlczogbmV0d29yayBpcyBvZmZsaW5lLicpO1xuXG4gICAgY29uc3QgdmFyaWFibGVzID0ge1xuICAgICAgaW50ZXJ2YWw6IHRvTnVtYmVyKG9wdHMgJiYgb3B0cy5pbnRlcnZhbEluU2Vjb25kcywgdGhpcy5fbGlzdGVuSW50ZXJ2YWxJblNlY29uZHMpLFxuICAgIH07XG5cbiAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gV2F0Y2hpbmcgcmVtb3RlIGNoYW5nZXMsIGV2ZXJ5ICR7dmFyaWFibGVzLmludGVydmFsfXNgKTtcblxuICAgIHJldHVybiB0aGlzLmdyYXBocWxcbiAgICAgIC5zdWJzY3JpYmU8eyBkYXRhOiBhbnkgfT4oe1xuICAgICAgICBxdWVyeTogQWNjb3VudFN1YnNjcmlwdGlvbnMubGlzdGVuQ2hhbmdlcyxcbiAgICAgICAgdmFyaWFibGVzLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIGNvZGU6IEVycm9yQ29kZXMuU1VCU0NSSUJFX0FDQ09VTlRfRVJST1IsXG4gICAgICAgICAgbWVzc2FnZTogJ0VSUk9SLkFDQ09VTlQuU1VCU0NSSUJFX0VSUk9SJyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSksXG4gICAgICAgIC8vIEtlZXAgb25seSBpZiBuZXdlclxuICAgICAgICBmaWx0ZXIoKGRhdGEpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VXBkYXRlRGF0ZTogTW9tZW50ID0gZnJvbURhdGVJU09TdHJpbmcodGhpcy5fZGF0YT8udXBkYXRlRGF0ZSk7XG4gICAgICAgICAgY29uc3QgcmVtb3RlVXBkYXRlRGF0ZTogTW9tZW50ID0gZnJvbURhdGVJU09TdHJpbmcoZGF0YT8udXBkYXRlRGF0ZSk7XG4gICAgICAgICAgcmV0dXJuIHJlbW90ZVVwZGF0ZURhdGUgJiYgKCFjdXJyZW50VXBkYXRlRGF0ZSB8fCAhcmVtb3RlVXBkYXRlRGF0ZS5pc1NhbWUoY3VycmVudFVwZGF0ZURhdGUsICdtaWxsaXNlY29uZCcpKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29weUlkQW5kVXBkYXRlRGF0ZShzb3VyY2U6IEFjY291bnQgfCB1bmRlZmluZWQsIHRhcmdldDogQWNjb3VudCkge1xuICAgIGlmICghc291cmNlKSByZXR1cm47XG5cbiAgICB0YXJnZXQuaWQgPSBzb3VyY2UuaWQgfHwgdGFyZ2V0LmlkO1xuICAgIHRhcmdldC51cGRhdGVEYXRlID0gc291cmNlLnVwZGF0ZURhdGUgfHwgdGFyZ2V0LnVwZGF0ZURhdGU7XG5cbiAgICAvLyBVcGRhdGUgc2V0dGluZ3NcbiAgICB0aGlzLmNvcHlJZEFuZFVwZGF0ZURhdGVTZXR0aW5ncyhzb3VyY2Uuc2V0dGluZ3MsIHRhcmdldC5zZXR0aW5ncyk7XG5cbiAgICAvLyBVcGRhdGUgdG9rZW5zXG4gICAgaWYgKHRoaXMuX2FwaVRva2VuRW5hYmxlZCkge1xuICAgICAgdGhpcy5jb3B5SWRBbmRVcGRhdGVEYXRlVG9rZW4oc291cmNlLnRva2VucywgdGFyZ2V0LnRva2Vucyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNvcHlJZEFuZFVwZGF0ZURhdGVTZXR0aW5ncyhzb3VyY2U6IFVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZCwgdGFyZ2V0OiBVc2VyU2V0dGluZ3MpIHtcbiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xuXG4gICAgdGFyZ2V0LmlkID0gc291cmNlLmlkIHx8IHRhcmdldC5pZDtcbiAgICB0YXJnZXQudXBkYXRlRGF0ZSA9IHNvdXJjZS51cGRhdGVEYXRlIHx8IHRhcmdldC51cGRhdGVEYXRlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvcHlJZEFuZFVwZGF0ZURhdGVUb2tlbihzb3VyY2VzOiBVc2VyVG9rZW5bXSB8IHVuZGVmaW5lZCwgdGFyZ2V0czogVXNlclRva2VuW10pIHtcbiAgICBpZiAoaXNFbXB0eUFycmF5KHNvdXJjZXMpKSByZXR1cm47XG5cbiAgICBzb3VyY2VzLmZvckVhY2goKHNvdXJjZSkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0cy5maW5kKCh2YWx1ZSkgPT4gVXNlclRva2VuLmVxdWFscyh2YWx1ZSwgc291cmNlKSk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5pZCA9IHNvdXJjZS5pZCB8fCB0YXJnZXQuaWQ7XG4gICAgICAgIHRhcmdldC5jcmVhdGlvbkRhdGUgPSBzb3VyY2UuY3JlYXRpb25EYXRlIHx8IHRhcmdldC5jcmVhdGlvbkRhdGU7XG4gICAgICAgIHRhcmdldC51cGRhdGVEYXRlID0gc291cmNlLnVwZGF0ZURhdGUgfHwgdGFyZ2V0LnVwZGF0ZURhdGU7XG4gICAgICAgIHRhcmdldC50b2tlbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93VG9hc3Q8VCA9IGFueT4ob3B0czogU2hvd1RvYXN0T3B0aW9ucyk6IFByb21pc2U8T3ZlcmxheUV2ZW50RGV0YWlsPFQ+PiB7XG4gICAgcmV0dXJuIFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwgb3B0cyk7XG4gIH1cbn1cbiJdfQ==