@kaspernj/api-maker 1.0.2160 → 1.0.2161

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 (524) hide show
  1. package/build/api.d.ts +46 -34
  2. package/build/api.d.ts.map +1 -1
  3. package/build/api.js +32 -25
  4. package/build/attribute-not-loaded-error.d.ts.map +1 -1
  5. package/build/attribute-not-loaded-error.js +2 -1
  6. package/build/base-error.d.ts +49 -60
  7. package/build/base-error.d.ts.map +1 -1
  8. package/build/base-error.js +3 -2
  9. package/build/base-model/column.d.ts +2 -2
  10. package/build/base-model/column.d.ts.map +1 -1
  11. package/build/base-model/column.js +3 -2
  12. package/build/base-model/reflection.d.ts +8 -3
  13. package/build/base-model/reflection.d.ts.map +1 -1
  14. package/build/base-model/reflection.js +8 -3
  15. package/build/base-model/scope.d.ts +1 -1
  16. package/build/base-model/scope.d.ts.map +1 -1
  17. package/build/base-model/scope.js +3 -2
  18. package/build/base-model.d.ts +3801 -117
  19. package/build/base-model.d.ts.map +1 -1
  20. package/build/base-model.js +271 -143
  21. package/build/bootstrap/attribute-row.d.ts +12 -0
  22. package/build/bootstrap/attribute-row.d.ts.map +1 -1
  23. package/build/bootstrap/attribute-row.js +23 -5
  24. package/build/bootstrap/attribute-rows.d.ts +8 -0
  25. package/build/bootstrap/attribute-rows.d.ts.map +1 -1
  26. package/build/bootstrap/attribute-rows.js +14 -5
  27. package/build/bootstrap/card.d.ts +17 -0
  28. package/build/bootstrap/card.d.ts.map +1 -1
  29. package/build/bootstrap/card.js +30 -10
  30. package/build/bootstrap/checkbox.d.ts +16 -0
  31. package/build/bootstrap/checkbox.d.ts.map +1 -1
  32. package/build/bootstrap/checkbox.js +20 -2
  33. package/build/bootstrap/checkboxes.d.ts +31 -0
  34. package/build/bootstrap/checkboxes.d.ts.map +1 -1
  35. package/build/bootstrap/checkboxes.js +35 -3
  36. package/build/bootstrap/index.js +2 -1
  37. package/build/bootstrap/input.d.ts +24 -0
  38. package/build/bootstrap/input.d.ts.map +1 -1
  39. package/build/bootstrap/input.js +27 -2
  40. package/build/bootstrap/invalid-feedback.d.ts.map +1 -1
  41. package/build/bootstrap/invalid-feedback.js +2 -1
  42. package/build/bootstrap/paginate.d.ts +5 -0
  43. package/build/bootstrap/paginate.d.ts.map +1 -1
  44. package/build/bootstrap/paginate.js +9 -4
  45. package/build/bootstrap/radio-buttons.js +2 -1
  46. package/build/bootstrap/select.js +2 -1
  47. package/build/bootstrap/sort-link.d.ts +10 -0
  48. package/build/bootstrap/sort-link.d.ts.map +1 -1
  49. package/build/bootstrap/sort-link.js +15 -4
  50. package/build/cable-connection-pool.d.ts +201 -24
  51. package/build/cable-connection-pool.d.ts.map +1 -1
  52. package/build/cable-connection-pool.js +76 -16
  53. package/build/cable-subscription-pool.d.ts +186 -20
  54. package/build/cable-subscription-pool.d.ts.map +1 -1
  55. package/build/cable-subscription-pool.js +61 -22
  56. package/build/cable-subscription.d.ts.map +1 -1
  57. package/build/cable-subscription.js +3 -2
  58. package/build/cache-key-generator.d.ts +194 -20
  59. package/build/cache-key-generator.d.ts.map +1 -1
  60. package/build/cache-key-generator.js +63 -12
  61. package/build/can-can.d.ts +146 -29
  62. package/build/can-can.d.ts.map +1 -1
  63. package/build/can-can.js +105 -19
  64. package/build/channels-consumer.d.ts +23 -1
  65. package/build/channels-consumer.d.ts.map +1 -1
  66. package/build/channels-consumer.js +26 -8
  67. package/build/collection-loader.js +2 -1
  68. package/build/collection.d.ts +361 -370
  69. package/build/collection.d.ts.map +1 -1
  70. package/build/collection.js +59 -19
  71. package/build/command-execution.d.ts +50 -26
  72. package/build/command-execution.d.ts.map +1 -1
  73. package/build/command-execution.js +31 -13
  74. package/build/command-submit-data.d.ts +50 -37
  75. package/build/command-submit-data.d.ts.map +1 -1
  76. package/build/command-submit-data.js +35 -22
  77. package/build/commands-pool.d.ts +65 -27
  78. package/build/commands-pool.d.ts.map +1 -1
  79. package/build/commands-pool.js +67 -20
  80. package/build/compose.d.ts +8 -2
  81. package/build/compose.d.ts.map +1 -1
  82. package/build/compose.js +9 -2
  83. package/build/config.d.ts +31 -15
  84. package/build/config.d.ts.map +1 -1
  85. package/build/config.js +60 -23
  86. package/build/custom-error.d.ts.map +1 -1
  87. package/build/custom-error.js +2 -1
  88. package/build/data-set-to-attributes.d.ts +14 -2
  89. package/build/data-set-to-attributes.d.ts.map +1 -1
  90. package/build/data-set-to-attributes.js +12 -3
  91. package/build/deserializer.d.ts +116 -2
  92. package/build/deserializer.d.ts.map +1 -1
  93. package/build/deserializer.js +13 -2
  94. package/build/destroy-error.d.ts.map +1 -1
  95. package/build/destroy-error.js +2 -1
  96. package/build/devise.d.ts +638 -39
  97. package/build/devise.d.ts.map +1 -1
  98. package/build/devise.js +97 -28
  99. package/build/draggable-sort/controller.d.ts +126 -35
  100. package/build/draggable-sort/controller.d.ts.map +1 -1
  101. package/build/draggable-sort/controller.js +100 -28
  102. package/build/draggable-sort/index.d.ts +55 -0
  103. package/build/draggable-sort/index.d.ts.map +1 -1
  104. package/build/draggable-sort/index.js +71 -3
  105. package/build/draggable-sort/item.d.ts +54 -0
  106. package/build/draggable-sort/item.d.ts.map +1 -1
  107. package/build/draggable-sort/item.js +94 -6
  108. package/build/error-logger.d.ts +30 -14
  109. package/build/error-logger.d.ts.map +1 -1
  110. package/build/error-logger.js +22 -11
  111. package/build/event-connection.d.ts.map +1 -1
  112. package/build/event-connection.js +3 -2
  113. package/build/event-emitter-listener.d.ts.map +1 -1
  114. package/build/event-emitter-listener.js +2 -1
  115. package/build/event-model-class.d.ts.map +1 -1
  116. package/build/event-model-class.js +2 -1
  117. package/build/events.d.ts.map +1 -1
  118. package/build/events.js +2 -1
  119. package/build/form.d.ts +23 -0
  120. package/build/form.d.ts.map +1 -1
  121. package/build/form.js +16 -4
  122. package/build/history-expo.d.ts +6 -2
  123. package/build/history-expo.d.ts.map +1 -1
  124. package/build/history-expo.js +5 -2
  125. package/build/history-react-native.d.ts +6 -2
  126. package/build/history-react-native.d.ts.map +1 -1
  127. package/build/history-react-native.js +5 -2
  128. package/build/history.js +2 -1
  129. package/build/index.d.ts.map +1 -1
  130. package/build/index.js +2 -1
  131. package/build/inputs/attachment.d.ts +11 -0
  132. package/build/inputs/attachment.d.ts.map +1 -1
  133. package/build/inputs/attachment.js +17 -4
  134. package/build/inputs/auto-submit.d.ts +41 -13
  135. package/build/inputs/auto-submit.d.ts.map +1 -1
  136. package/build/inputs/auto-submit.js +16 -4
  137. package/build/inputs/checkbox.d.ts +15 -0
  138. package/build/inputs/checkbox.d.ts.map +1 -1
  139. package/build/inputs/checkbox.js +22 -6
  140. package/build/inputs/checkboxes.d.ts +16 -0
  141. package/build/inputs/checkboxes.d.ts.map +1 -1
  142. package/build/inputs/checkboxes.js +20 -4
  143. package/build/inputs/id-for-component.d.ts +21 -2
  144. package/build/inputs/id-for-component.d.ts.map +1 -1
  145. package/build/inputs/id-for-component.js +9 -2
  146. package/build/inputs/input-wrapper.d.ts.map +1 -1
  147. package/build/inputs/input-wrapper.js +2 -1
  148. package/build/inputs/input.d.ts +36 -0
  149. package/build/inputs/input.d.ts.map +1 -1
  150. package/build/inputs/input.js +26 -7
  151. package/build/inputs/money.d.ts +2 -0
  152. package/build/inputs/money.d.ts.map +1 -1
  153. package/build/inputs/money.js +6 -3
  154. package/build/inputs/name-for-component.d.ts +21 -2
  155. package/build/inputs/name-for-component.d.ts.map +1 -1
  156. package/build/inputs/name-for-component.js +9 -2
  157. package/build/inputs/select.d.ts +33 -0
  158. package/build/inputs/select.d.ts.map +1 -1
  159. package/build/inputs/select.js +21 -4
  160. package/build/instance-of-class-name.d.ts +7 -2
  161. package/build/instance-of-class-name.d.ts.map +1 -1
  162. package/build/instance-of-class-name.js +8 -4
  163. package/build/is-expo.d.ts.map +1 -1
  164. package/build/is-expo.js +2 -1
  165. package/build/key-value-store.d.ts +24 -14
  166. package/build/key-value-store.d.ts.map +1 -1
  167. package/build/key-value-store.js +22 -12
  168. package/build/link.d.ts +30 -0
  169. package/build/link.d.ts.map +1 -1
  170. package/build/link.js +76 -30
  171. package/build/logger.d.ts +10 -6
  172. package/build/logger.d.ts.map +1 -1
  173. package/build/logger.js +7 -4
  174. package/build/merge-styles.d.ts +10 -2
  175. package/build/merge-styles.d.ts.map +1 -1
  176. package/build/merge-styles.js +10 -3
  177. package/build/modal.d.ts +2 -0
  178. package/build/modal.d.ts.map +1 -1
  179. package/build/modal.js +6 -4
  180. package/build/model-class-require.d.ts +4 -2
  181. package/build/model-class-require.d.ts.map +1 -1
  182. package/build/model-class-require.js +4 -2
  183. package/build/model-events.d.ts +139 -346
  184. package/build/model-events.d.ts.map +1 -1
  185. package/build/model-events.js +21 -9
  186. package/build/model-name.d.ts +21 -7
  187. package/build/model-name.d.ts.map +1 -1
  188. package/build/model-name.js +12 -2
  189. package/build/model-prop-type.d.ts +533 -26
  190. package/build/model-prop-type.d.ts.map +1 -1
  191. package/build/model-prop-type.js +69 -11
  192. package/build/model-recipes-loader.d.ts +7 -3
  193. package/build/model-recipes-loader.d.ts.map +1 -1
  194. package/build/model-recipes-loader.js +4 -2
  195. package/build/model-recipes-model-loader.d.ts +189 -1493
  196. package/build/model-recipes-model-loader.d.ts.map +1 -1
  197. package/build/model-recipes-model-loader.js +119 -17
  198. package/build/models-response-reader.d.ts +600 -195
  199. package/build/models-response-reader.d.ts.map +1 -1
  200. package/build/models-response-reader.js +12 -4
  201. package/build/models.d.ts +438 -1
  202. package/build/models.d.ts.map +1 -1
  203. package/build/models.js +2 -1
  204. package/build/money-formatter.d.ts +25 -31
  205. package/build/money-formatter.d.ts.map +1 -1
  206. package/build/money-formatter.js +11 -8
  207. package/build/not-loaded-error.d.ts.map +1 -1
  208. package/build/not-loaded-error.js +2 -1
  209. package/build/params.d.ts +25 -17
  210. package/build/params.d.ts.map +1 -1
  211. package/build/params.js +19 -15
  212. package/build/preloaded.d.ts +61 -64
  213. package/build/preloaded.d.ts.map +1 -1
  214. package/build/preloaded.js +10 -4
  215. package/build/reset-realtime-runtime-state.d.ts.map +1 -1
  216. package/build/reset-realtime-runtime-state.js +2 -1
  217. package/build/resize-observer.d.ts.map +1 -1
  218. package/build/resize-observer.js +2 -1
  219. package/build/rest-props-validator.d.ts +2 -2
  220. package/build/rest-props-validator.d.ts.map +1 -1
  221. package/build/rest-props-validator.js +3 -2
  222. package/build/result.d.ts +142 -175
  223. package/build/result.d.ts.map +1 -1
  224. package/build/result.js +3 -2
  225. package/build/router/route.d.ts +50 -0
  226. package/build/router/route.d.ts.map +1 -1
  227. package/build/router/route.js +39 -10
  228. package/build/router/switch.d.ts +37 -1
  229. package/build/router/switch.d.ts.map +1 -1
  230. package/build/router/switch.js +29 -7
  231. package/build/router.d.ts +20 -0
  232. package/build/router.d.ts.map +1 -1
  233. package/build/router.js +15 -4
  234. package/build/routes-native.d.ts +13 -13
  235. package/build/routes-native.d.ts.map +1 -1
  236. package/build/routes-native.js +23 -11
  237. package/build/routes.d.ts +17 -9
  238. package/build/routes.d.ts.map +1 -1
  239. package/build/routes.js +7 -2
  240. package/build/run-last.d.ts.map +1 -1
  241. package/build/run-last.js +2 -1
  242. package/build/serializer.d.ts +44 -12
  243. package/build/serializer.d.ts.map +1 -1
  244. package/build/serializer.js +36 -7
  245. package/build/services.d.ts +29 -4
  246. package/build/services.d.ts.map +1 -1
  247. package/build/services.js +16 -4
  248. package/build/session-status-updater.d.ts +73 -25
  249. package/build/session-status-updater.d.ts.map +1 -1
  250. package/build/session-status-updater.js +52 -14
  251. package/build/source-maps-loader.d.ts +88 -33
  252. package/build/source-maps-loader.d.ts.map +1 -1
  253. package/build/source-maps-loader.js +74 -18
  254. package/build/super-admin/config-reader.d.ts.map +1 -1
  255. package/build/super-admin/config-reader.js +11 -16
  256. package/build/super-admin/edit-page/edit-attribute-checkbox.d.ts +10 -0
  257. package/build/super-admin/edit-page/edit-attribute-checkbox.d.ts.map +1 -1
  258. package/build/super-admin/edit-page/edit-attribute-checkbox.js +16 -4
  259. package/build/super-admin/edit-page/edit-attribute-content.d.ts +9 -0
  260. package/build/super-admin/edit-page/edit-attribute-content.d.ts.map +1 -1
  261. package/build/super-admin/edit-page/edit-attribute-content.js +15 -4
  262. package/build/super-admin/edit-page/edit-attribute-input.d.ts +8 -0
  263. package/build/super-admin/edit-page/edit-attribute-input.d.ts.map +1 -1
  264. package/build/super-admin/edit-page/edit-attribute-input.js +13 -4
  265. package/build/super-admin/edit-page/edit-attribute.d.ts +6 -0
  266. package/build/super-admin/edit-page/edit-attribute.d.ts.map +1 -1
  267. package/build/super-admin/edit-page/edit-attribute.js +11 -4
  268. package/build/super-admin/edit-page.d.ts +5 -0
  269. package/build/super-admin/edit-page.d.ts.map +1 -1
  270. package/build/super-admin/edit-page.js +11 -5
  271. package/build/super-admin/has-edit-config.d.ts.map +1 -1
  272. package/build/super-admin/has-edit-config.js +2 -1
  273. package/build/super-admin/index-page.d.ts +4 -0
  274. package/build/super-admin/index-page.d.ts.map +1 -1
  275. package/build/super-admin/index-page.js +9 -4
  276. package/build/super-admin/index.d.ts +4 -0
  277. package/build/super-admin/index.d.ts.map +1 -1
  278. package/build/super-admin/index.js +12 -6
  279. package/build/super-admin/layout/header/index.d.ts +4 -0
  280. package/build/super-admin/layout/header/index.d.ts.map +1 -1
  281. package/build/super-admin/layout/header/index.js +13 -8
  282. package/build/super-admin/layout/index.d.ts +24 -0
  283. package/build/super-admin/layout/index.d.ts.map +1 -1
  284. package/build/super-admin/layout/index.js +33 -5
  285. package/build/super-admin/layout/menu/index.d.ts +2 -0
  286. package/build/super-admin/layout/menu/index.d.ts.map +1 -1
  287. package/build/super-admin/layout/menu/index.js +8 -6
  288. package/build/super-admin/layout/menu/menu-content.d.ts +2 -0
  289. package/build/super-admin/layout/menu/menu-content.d.ts.map +1 -1
  290. package/build/super-admin/layout/menu/menu-content.js +6 -4
  291. package/build/super-admin/layout/menu/menu-item.d.ts +9 -0
  292. package/build/super-admin/layout/menu/menu-item.d.ts.map +1 -1
  293. package/build/super-admin/layout/menu/menu-item.js +15 -4
  294. package/build/super-admin/layout/no-access.d.ts +2 -0
  295. package/build/super-admin/layout/no-access.d.ts.map +1 -1
  296. package/build/super-admin/layout/no-access.js +7 -5
  297. package/build/super-admin/model-class-table.d.ts +4 -0
  298. package/build/super-admin/model-class-table.d.ts.map +1 -1
  299. package/build/super-admin/model-class-table.js +9 -4
  300. package/build/super-admin/models.d.ts.map +1 -1
  301. package/build/super-admin/models.js +2 -1
  302. package/build/super-admin/show-nav.d.ts +2 -0
  303. package/build/super-admin/show-nav.d.ts.map +1 -1
  304. package/build/super-admin/show-nav.js +6 -4
  305. package/build/super-admin/show-page/belongs-to-attribute-row.d.ts +17 -1
  306. package/build/super-admin/show-page/belongs-to-attribute-row.d.ts.map +1 -1
  307. package/build/super-admin/show-page/belongs-to-attribute-row.js +14 -5
  308. package/build/super-admin/show-page/index.d.ts +4 -0
  309. package/build/super-admin/show-page/index.d.ts.map +1 -1
  310. package/build/super-admin/show-page/index.js +9 -4
  311. package/build/super-admin/show-reflection-actions.d.ts +6 -0
  312. package/build/super-admin/show-reflection-actions.d.ts.map +1 -1
  313. package/build/super-admin/show-reflection-actions.js +11 -4
  314. package/build/super-admin/show-reflection-link.d.ts +4 -0
  315. package/build/super-admin/show-reflection-link.d.ts.map +1 -1
  316. package/build/super-admin/show-reflection-link.js +9 -4
  317. package/build/super-admin/show-reflection-page.d.ts +5 -0
  318. package/build/super-admin/show-reflection-page.d.ts.map +1 -1
  319. package/build/super-admin/show-reflection-page.js +10 -4
  320. package/build/table/column-content.d.ts +155 -19
  321. package/build/table/column-content.d.ts.map +1 -1
  322. package/build/table/column-content.js +55 -12
  323. package/build/table/column-identifier.d.ts +11 -2
  324. package/build/table/column-identifier.d.ts.map +1 -1
  325. package/build/table/column-identifier.js +7 -2
  326. package/build/table/column-visible.d.ts +11 -2
  327. package/build/table/column-visible.d.ts.map +1 -1
  328. package/build/table/column-visible.js +8 -2
  329. package/build/table/components/column.d.ts +2 -0
  330. package/build/table/components/column.d.ts.map +1 -1
  331. package/build/table/components/column.js +6 -4
  332. package/build/table/components/flat-list.d.ts +2 -0
  333. package/build/table/components/flat-list.d.ts.map +1 -1
  334. package/build/table/components/flat-list.js +6 -4
  335. package/build/table/components/header.d.ts +2 -0
  336. package/build/table/components/header.d.ts.map +1 -1
  337. package/build/table/components/header.js +6 -4
  338. package/build/table/components/row.d.ts +2 -0
  339. package/build/table/components/row.d.ts.map +1 -1
  340. package/build/table/components/row.js +6 -4
  341. package/build/table/filters/attribute-element.d.ts +2 -0
  342. package/build/table/filters/attribute-element.d.ts.map +1 -1
  343. package/build/table/filters/attribute-element.js +7 -7
  344. package/build/table/filters/filter-form.d.ts +58 -0
  345. package/build/table/filters/filter-form.d.ts.map +1 -1
  346. package/build/table/filters/filter-form.js +72 -9
  347. package/build/table/filters/filter.d.ts +2 -0
  348. package/build/table/filters/filter.d.ts.map +1 -1
  349. package/build/table/filters/filter.js +6 -4
  350. package/build/table/filters/index.d.ts +127 -0
  351. package/build/table/filters/index.d.ts.map +1 -1
  352. package/build/table/filters/index.js +21 -4
  353. package/build/table/filters/load-search-modal.d.ts +130 -0
  354. package/build/table/filters/load-search-modal.d.ts.map +1 -1
  355. package/build/table/filters/load-search-modal.js +28 -6
  356. package/build/table/filters/reflection-element.d.ts +2 -0
  357. package/build/table/filters/reflection-element.d.ts.map +1 -1
  358. package/build/table/filters/reflection-element.js +6 -4
  359. package/build/table/filters/save-search-modal.d.ts +134 -0
  360. package/build/table/filters/save-search-modal.d.ts.map +1 -1
  361. package/build/table/filters/save-search-modal.js +36 -5
  362. package/build/table/filters/scope-element.d.ts +6 -0
  363. package/build/table/filters/scope-element.d.ts.map +1 -1
  364. package/build/table/filters/scope-element.js +13 -8
  365. package/build/table/header-column-content.d.ts +7 -0
  366. package/build/table/header-column-content.d.ts.map +1 -1
  367. package/build/table/header-column-content.js +12 -4
  368. package/build/table/header-column.d.ts +50 -0
  369. package/build/table/header-column.d.ts.map +1 -1
  370. package/build/table/header-column.js +32 -5
  371. package/build/table/header-select.d.ts +18 -0
  372. package/build/table/header-select.d.ts.map +1 -1
  373. package/build/table/header-select.js +19 -4
  374. package/build/table/model-callback-args.d.ts +116 -3
  375. package/build/table/model-callback-args.d.ts.map +1 -1
  376. package/build/table/model-callback-args.js +10 -3
  377. package/build/table/model-column.d.ts +136 -0
  378. package/build/table/model-column.d.ts.map +1 -1
  379. package/build/table/model-column.js +27 -4
  380. package/build/table/model-row.d.ts +19 -0
  381. package/build/table/model-row.d.ts.map +1 -1
  382. package/build/table/model-row.js +24 -4
  383. package/build/table/select-calculator.d.ts +37 -2
  384. package/build/table/select-calculator.d.ts.map +1 -1
  385. package/build/table/select-calculator.js +29 -6
  386. package/build/table/settings/column-row.d.ts +6 -0
  387. package/build/table/settings/column-row.d.ts.map +1 -1
  388. package/build/table/settings/column-row.js +13 -12
  389. package/build/table/settings/download-action.d.ts +5 -0
  390. package/build/table/settings/download-action.d.ts.map +1 -1
  391. package/build/table/settings/download-action.js +10 -4
  392. package/build/table/settings/index.d.ts +5 -0
  393. package/build/table/settings/index.d.ts.map +1 -1
  394. package/build/table/settings/index.js +10 -4
  395. package/build/table/should-render-loading-content.d.ts +2 -2
  396. package/build/table/should-render-loading-content.d.ts.map +1 -1
  397. package/build/table/should-render-loading-content.js +3 -2
  398. package/build/table/table-settings.d.ts +236 -43
  399. package/build/table/table-settings.d.ts.map +1 -1
  400. package/build/table/table-settings.js +104 -20
  401. package/build/table/table.d.ts +271 -0
  402. package/build/table/table.d.ts.map +1 -1
  403. package/build/table/table.js +167 -16
  404. package/build/table/use-sorting.d.ts +10 -8
  405. package/build/table/use-sorting.d.ts.map +1 -1
  406. package/build/table/use-sorting.js +16 -8
  407. package/build/table/widths.d.ts +55 -8
  408. package/build/table/widths.d.ts.map +1 -1
  409. package/build/table/widths.js +25 -2
  410. package/build/table/worker-plugins-check-all-checkbox.d.ts +18 -0
  411. package/build/table/worker-plugins-check-all-checkbox.d.ts.map +1 -1
  412. package/build/table/worker-plugins-check-all-checkbox.js +25 -5
  413. package/build/table/worker-plugins-checkbox.d.ts +5 -0
  414. package/build/table/worker-plugins-checkbox.d.ts.map +1 -1
  415. package/build/table/worker-plugins-checkbox.js +10 -4
  416. package/build/translated-attributes.d.ts +7 -2
  417. package/build/translated-attributes.d.ts.map +1 -1
  418. package/build/translated-attributes.js +8 -2
  419. package/build/translated-collections.d.ts +11 -2
  420. package/build/translated-collections.d.ts.map +1 -1
  421. package/build/translated-collections.js +9 -3
  422. package/build/updated-attribute.d.ts.map +1 -1
  423. package/build/updated-attribute.js +2 -1
  424. package/build/url-encode.d.ts.map +1 -1
  425. package/build/url-encode.js +2 -1
  426. package/build/use-can-can.d.ts +2 -2
  427. package/build/use-can-can.d.ts.map +1 -1
  428. package/build/use-can-can.js +27 -12
  429. package/build/use-collection.d.ts +167 -121
  430. package/build/use-collection.d.ts.map +1 -1
  431. package/build/use-collection.js +113 -44
  432. package/build/use-created-event.d.ts +120 -11
  433. package/build/use-created-event.d.ts.map +1 -1
  434. package/build/use-created-event.js +10 -7
  435. package/build/use-current-user-context.d.ts +2 -2
  436. package/build/use-current-user-context.d.ts.map +1 -1
  437. package/build/use-current-user-context.js +3 -2
  438. package/build/use-current-user.d.ts +86 -70
  439. package/build/use-current-user.d.ts.map +1 -1
  440. package/build/use-current-user.js +36 -8
  441. package/build/use-destroyed-event.d.ts +117 -8
  442. package/build/use-destroyed-event.d.ts.map +1 -1
  443. package/build/use-destroyed-event.js +29 -22
  444. package/build/use-input.d.ts +74 -12
  445. package/build/use-input.d.ts.map +1 -1
  446. package/build/use-input.js +33 -5
  447. package/build/use-model-class-event.d.ts +124 -10
  448. package/build/use-model-class-event.d.ts.map +1 -1
  449. package/build/use-model-class-event.js +26 -16
  450. package/build/use-model-event.d.ts +121 -8
  451. package/build/use-model-event.d.ts.map +1 -1
  452. package/build/use-model-event.js +24 -19
  453. package/build/use-model.d.ts +162 -244
  454. package/build/use-model.d.ts.map +1 -1
  455. package/build/use-model.js +85 -32
  456. package/build/use-resize-observer.d.ts.map +1 -1
  457. package/build/use-resize-observer.js +2 -1
  458. package/build/use-router.d.ts.map +1 -1
  459. package/build/use-router.js +2 -1
  460. package/build/use-screen-layout.d.ts +7 -2
  461. package/build/use-screen-layout.d.ts.map +1 -1
  462. package/build/use-screen-layout.js +8 -5
  463. package/build/use-shape.js +2 -1
  464. package/build/use-styles.d.ts +11 -5
  465. package/build/use-styles.d.ts.map +1 -1
  466. package/build/use-styles.js +16 -9
  467. package/build/use-updated-event.d.ts +66 -182
  468. package/build/use-updated-event.d.ts.map +1 -1
  469. package/build/use-updated-event.js +22 -18
  470. package/build/use-validation-errors.d.ts.map +1 -1
  471. package/build/use-validation-errors.js +2 -1
  472. package/build/utils/button.d.ts +14 -0
  473. package/build/utils/button.d.ts.map +1 -1
  474. package/build/utils/button.js +24 -7
  475. package/build/utils/card.d.ts +9 -0
  476. package/build/utils/card.d.ts.map +1 -1
  477. package/build/utils/card.js +13 -2
  478. package/build/utils/checkbox.d.ts +12 -0
  479. package/build/utils/checkbox.d.ts.map +1 -1
  480. package/build/utils/checkbox.js +18 -4
  481. package/build/utils/checkboxes.d.ts +25 -0
  482. package/build/utils/checkboxes.d.ts.map +1 -1
  483. package/build/utils/checkboxes.js +29 -3
  484. package/build/utils/default-style.d.ts +10 -4
  485. package/build/utils/default-style.d.ts.map +1 -1
  486. package/build/utils/default-style.js +12 -4
  487. package/build/utils/header.d.ts +6 -1
  488. package/build/utils/header.d.ts.map +1 -1
  489. package/build/utils/header.js +4 -2
  490. package/build/utils/icon.d.ts +7 -6
  491. package/build/utils/icon.d.ts.map +1 -1
  492. package/build/utils/icon.js +12 -11
  493. package/build/utils/invalid-feedback.d.ts +4 -0
  494. package/build/utils/invalid-feedback.d.ts.map +1 -1
  495. package/build/utils/invalid-feedback.js +8 -2
  496. package/build/utils/modal.d.ts +2 -0
  497. package/build/utils/modal.d.ts.map +1 -1
  498. package/build/utils/modal.js +9 -7
  499. package/build/utils/text.d.ts +8 -1
  500. package/build/utils/text.d.ts.map +1 -1
  501. package/build/utils/text.js +9 -2
  502. package/build/validation-error.d.ts +5 -2
  503. package/build/validation-error.d.ts.map +1 -1
  504. package/build/validation-error.js +5 -2
  505. package/build/validation-errors.d.ts +57 -15
  506. package/build/validation-errors.d.ts.map +1 -1
  507. package/build/validation-errors.js +37 -8
  508. package/build/websocket-request-client.d.ts +61 -15
  509. package/build/websocket-request-client.d.ts.map +1 -1
  510. package/build/websocket-request-client.js +35 -9
  511. package/build/with-api-maker.d.ts.map +1 -1
  512. package/build/with-api-maker.js +2 -1
  513. package/build/with-collection.d.ts.map +1 -1
  514. package/build/with-collection.js +2 -1
  515. package/build/with-current-user.d.ts.map +1 -1
  516. package/build/with-current-user.js +2 -1
  517. package/build/with-model.d.ts.map +1 -1
  518. package/build/with-model.js +2 -1
  519. package/build/with-router.d.ts.map +1 -1
  520. package/build/with-router.js +2 -1
  521. package/package.json +4 -3
  522. package/build/base-component.d.ts +0 -5
  523. package/build/base-component.d.ts.map +0 -1
  524. package/build/base-component.js +0 -4
@@ -1,3 +1,4 @@
1
+ // @ts-check
1
2
  import * as inflection from "inflection";
2
3
  import { ValidationErrors } from "./validation-errors.js";
3
4
  import { digg } from "diggerize";
@@ -16,6 +17,33 @@ import Scope from "./base-model/scope.js";
16
17
  import Services from "./services.js";
17
18
  import ValidationError from "./validation-error.js";
18
19
  import objectToFormData from "object-to-formdata";
20
+ /** @typedef {string | number} ModelIdentifier */
21
+ /** @typedef {string | number | boolean | null | undefined | Date | File | Blob} ModelScalarValue */
22
+ /** @typedef {{[key: string]: ModelValue}} ModelValueMap */
23
+ /** @typedef {Array<ModelValue>} ModelValueArray */
24
+ /** @typedef {ModelScalarValue | ModelValueMap | ModelValueArray} ModelValue */
25
+ /** @typedef {Record<string, ModelValue>} ModelDataMap */
26
+ /** @typedef {Record<string, boolean>} ModelAbilityMap */
27
+ /** @typedef {ModelIdentifier | ModelIdentifier[] | null} PreloadedRelationshipValue */
28
+ /** @typedef {Record<string, PreloadedRelationshipValue>} PreloadedRelationshipMap */
29
+ /** @typedef {BaseModel | BaseModel[] | null} LoadedRelationshipValue */
30
+ /** @typedef {Record<string, LoadedRelationshipValue>} LoadedRelationshipMap */
31
+ /** @typedef {import("./base-model/reflection.js").ReflectionMacro} ReflectionMacro */
32
+ /** @typedef {FormData | HTMLFormElement | ModelDataMap} RawDataInput */
33
+ /** @typedef {Record<string, string | string[] | undefined>} ValidationResponseErrors */
34
+ /**
35
+ * @typedef {object} RelationshipDataType
36
+ * @property {string} collectionName
37
+ * @property {string} [foreignKey]
38
+ * @property {ReflectionMacro} macro
39
+ * @property {string} name
40
+ * @property {string} resource_name
41
+ * @property {string} [through]
42
+ */
43
+ /**
44
+ * @typedef {object} ScopeDataType
45
+ * @property {string} name
46
+ */
19
47
  /**
20
48
  * @typedef {object} ModelClassDataType
21
49
  * @property {Record<string, import("./base-model/attribute.js").AttributeArgType>} attributes
@@ -29,19 +57,96 @@ import objectToFormData from "object-to-formdata";
29
57
  * @property {string} paramKey
30
58
  * @property {string} pluralName
31
59
  * @property {string} primaryKey
32
- * @property {Array<Record<string, any>>} ransackable_associations
60
+ * @property {RelationshipDataType[]} ransackable_associations
33
61
  * @property {import("./base-model/attribute.js").AttributeArgType[]} ransackable_attributes
34
- * @property {Array<Record<string, any>>} ransackable_scopes
35
- * @property {Array<Record<string, any>>} relationships
62
+ * @property {ScopeDataType[]} ransackable_scopes
63
+ * @property {RelationshipDataType[]} relationships
36
64
  */
37
65
  /**
38
66
  * @typedef {object} ParseValidationErrorsOptions
39
- * @property {object} [form]
67
+ * @property {HTMLFormElement} [form]
40
68
  * @property {boolean} [throwValidationError]
41
69
  */
42
- /** @typedef {{new (...args: Array<any>): BaseModel, apiMakerType: string} & Record<string, any>} BaseModelClassType */
70
+ /**
71
+ * @typedef {object} LoadedModelDataType
72
+ * @property {ModelDataMap} [a]
73
+ * @property {ModelAbilityMap} [b]
74
+ * @property {PreloadedRelationshipMap} [r]
75
+ */
76
+ /**
77
+ * @typedef {object} BaseModelArgsObject
78
+ * @property {ModelDataMap} [a]
79
+ * @property {ModelAbilityMap} [b]
80
+ * @property {import("./collection.js").default} [collection]
81
+ * @property {LoadedModelDataType} [data]
82
+ * @property {boolean} [isNewRecord]
83
+ */
84
+ /** @typedef {BaseModelArgsObject | ModelDataMap} BaseModelArgs */
85
+ /**
86
+ * @typedef {object} BaseModelStaticMethods
87
+ * @property {string} apiMakerType
88
+ * @property {() => import("./collection.js").default} all
89
+ * @property {() => Attribute[]} attributes
90
+ * @property {(id: ModelIdentifier) => Promise<BaseModel>} find
91
+ * @property {(findOrCreateByArgs: ModelDataMap, args?: {additionalData?: ModelDataMap}) => Promise<BaseModel>} findOrCreateBy
92
+ * @property {(args: ModelDataMap) => import("./command-execution.js").default} [createLink]
93
+ * @property {(args: ModelDataMap) => import("./command-execution.js").default} [destroyLinks]
94
+ * @property {(attributeName: string) => boolean} hasAttribute
95
+ * @property {(attributeName: string) => string} humanAttributeName
96
+ * @property {(args: ModelDataMap) => Promise<{link?: BaseModel | null}>} [linkFor]
97
+ * @property {() => ModelClassDataType} modelClassData
98
+ * @property {() => ModelName} modelName
99
+ * @property {() => string} primaryKey
100
+ * @property {() => Promise<{current?: BaseModel[]}>} [current]
101
+ * @property {(query?: import("./collection.js").CollectionRansackParams) => import("./collection.js").default} ransack
102
+ * @property {() => {name?: string}} [resourceData]
103
+ * @property {() => Reflection[]} reflections
104
+ * @property {(name: string) => Reflection} reflection
105
+ * @property {() => Reflection[]} ransackableAssociations
106
+ * @property {() => Attribute[]} ransackableAttributes
107
+ * @property {() => Scope[]} ransackableScopes
108
+ * @property {(select?: Record<string, string[]>) => import("./collection.js").default} select
109
+ * @property {(attributeName: string) => string} snakeCase
110
+ */
111
+ /** @typedef {typeof import("./base-model.js").default & BaseModelStaticMethods} BaseModelClassType */
112
+ /**
113
+ * @typedef {object} ModelCommandDescriptor
114
+ * @property {ModelDataMap | FormData | HTMLFormElement} [args]
115
+ * @property {string} collectionName
116
+ * @property {string} command
117
+ * @property {ModelIdentifier} [primaryKey]
118
+ * @property {string} type
119
+ */
120
+ /**
121
+ * @typedef {object} ModelCommandOptions
122
+ * @property {boolean} [cacheResponse]
123
+ * @property {boolean} [forceHttp]
124
+ * @property {HTMLFormElement} [form]
125
+ * @property {boolean} [instant]
126
+ */
127
+ /**
128
+ * @typedef {object} ModelCommandResponse
129
+ * @property {ValidationResponseErrors} [errors]
130
+ * @property {BaseModel | BaseModel[]} [model]
131
+ * @property {boolean} [success]
132
+ * @property {boolean} [valid]
133
+ */
134
+ /**
135
+ * @typedef {object} ValidationErrorWithResponse
136
+ * @property {{response?: {validation_errors?: import("./validation-errors.js").ValidationErrorEntryArgs[]}}} [args]
137
+ */
138
+ /**
139
+ * @typedef {object} RelationshipLoadArgs
140
+ * @property {BaseModel} [model]
141
+ * @property {typeof import("./base-model.js").default} [modelClass]
142
+ * @property {string} reflectionName
143
+ */
144
+ /**
145
+ * @param {ModelDataMap} object
146
+ * @returns {ModelDataMap}
147
+ */
43
148
  const objectToUnderscore = (object) => {
44
- const newObject = {};
149
+ const newObject = /** @type {ModelDataMap} */ ({});
45
150
  for (const key in object) {
46
151
  const underscoreKey = inflection.underscore(key);
47
152
  newObject[underscoreKey] = object[key];
@@ -49,7 +154,6 @@ const objectToUnderscore = (object) => {
49
154
  return newObject;
50
155
  };
51
156
  /** BaseModel. */
52
- /** @type {BaseModelClassType} */
53
157
  const BaseModel = class BaseModel {
54
158
  static apiMakerType = "BaseModel";
55
159
  /** @returns {Attribute[]} */
@@ -63,7 +167,10 @@ const BaseModel = class BaseModel {
63
167
  }
64
168
  return result;
65
169
  }
66
- /** @returns {boolean} */
170
+ /**
171
+ * @param {string} attributeName
172
+ * @returns {boolean}
173
+ */
67
174
  static hasAttribute(attributeName) {
68
175
  const attributes = digg(this.modelClassData(), "attributes");
69
176
  const lowerCaseAttributeName = inflection.underscore(attributeName);
@@ -99,10 +206,10 @@ const BaseModel = class BaseModel {
99
206
  }
100
207
  /**
101
208
  * @param {number | string} id
102
- * @returns {Promise<any>}
209
+ * @returns {Promise<BaseModel>}
103
210
  */
104
211
  static async find(id) {
105
- const query = /** @type {Record<string, any>} */ ({});
212
+ const query = /** @type {import("./collection.js").CollectionRansackParams} */ ({});
106
213
  query[`${this.primaryKey()}_eq`] = id;
107
214
  const model = await this.ransack(query).first();
108
215
  if (model) {
@@ -113,10 +220,10 @@ const BaseModel = class BaseModel {
113
220
  }
114
221
  }
115
222
  /**
116
- * @param {Record<string, any>} findOrCreateByArgs
223
+ * @param {ModelDataMap} findOrCreateByArgs
117
224
  * @param {object} [args]
118
- * @param {Record<string, any>} [args.additionalData]
119
- * @returns {Promise<any>}
225
+ * @param {ModelDataMap} [args.additionalData]
226
+ * @returns {Promise<BaseModel>}
120
227
  */
121
228
  static async findOrCreateBy(findOrCreateByArgs, args = {}) {
122
229
  const result = await Services.current().sendRequest("Models::FindOrCreateBy", {
@@ -136,15 +243,15 @@ const BaseModel = class BaseModel {
136
243
  return digg(this.modelClassData(), "primaryKey");
137
244
  }
138
245
  /**
139
- * @param {Record<string, any>} [query]
140
- * @returns {import("./collection.js").default<any>}
246
+ * @param {import("./collection.js").CollectionRansackParams} [query]
247
+ * @returns {import("./collection.js").default}
141
248
  */
142
249
  static ransack(query = {}) {
143
250
  return new Collection({ modelClass: this }, { ransack: query });
144
251
  }
145
252
  /**
146
- * @param {Record<string, any>} [select]
147
- * @returns {import("./collection.js").default<any>}
253
+ * @param {Record<string, string[]>} [select]
254
+ * @returns {import("./collection.js").default}
148
255
  */
149
256
  static select(select) {
150
257
  return this.ransack().select(select);
@@ -187,7 +294,10 @@ const BaseModel = class BaseModel {
187
294
  }
188
295
  return reflections;
189
296
  }
190
- /** @returns {Reflection} */
297
+ /**
298
+ * @param {string} name
299
+ * @returns {Reflection}
300
+ */
191
301
  static reflection(name) {
192
302
  const foundReflection = this.reflections().find((reflection) => reflection.name() == name);
193
303
  if (!foundReflection) {
@@ -198,44 +308,47 @@ const BaseModel = class BaseModel {
198
308
  }
199
309
  return foundReflection;
200
310
  }
201
- /** @returns {string} */
311
+ /** @returns {string | undefined} */
202
312
  static _token() {
203
313
  const csrfTokenElement = document.querySelector("meta[name='csrf-token']");
204
314
  if (csrfTokenElement) {
205
315
  return csrfTokenElement.getAttribute("content");
206
316
  }
317
+ return undefined;
207
318
  }
208
- /**
209
- * @param {object} [args]
210
- * @param {boolean} [args.isNewRecord]
211
- * @param {object} [args.data]
212
- * @param {Record<string, any>} [args.a]
213
- * @param {Record<string, any>} [args.b]
214
- * @param {Collection<any>} [args.collection]
215
- */
319
+ /** @param {BaseModelArgs} [args] */
216
320
  constructor(args = {}) {
217
- this.changes = {};
218
- this.newRecord = args.isNewRecord;
219
- this.relationshipsCache = {};
220
- this.relationships = {};
221
- if (args && args.data && args.data.a) {
222
- this._readModelDataFromArgs(args);
223
- }
224
- else if (args.a) {
225
- this.abilities = args.b || {};
226
- this.modelData = objectToUnderscore(args.a);
321
+ const argsObject = /** @type {BaseModelArgsObject} */ (args);
322
+ this.abilities = /** @type {ModelAbilityMap} */ ({});
323
+ this.changes = /** @type {ModelDataMap} */ ({});
324
+ this.collection = undefined;
325
+ this._identifierKey = undefined;
326
+ this._markedForDestruction = undefined;
327
+ this.modelData = /** @type {ModelDataMap} */ ({});
328
+ this.newRecord = argsObject.isNewRecord;
329
+ this.previousModelData = undefined;
330
+ this.preloadedRelationships = undefined;
331
+ this.relationshipsCache = /** @type {LoadedRelationshipMap} */ ({});
332
+ this.relationships = /** @type {LoadedRelationshipMap} */ ({});
333
+ this.uniqueKeyValue = undefined;
334
+ if (argsObject && argsObject.data && argsObject.data.a) {
335
+ this._readModelDataFromArgs(argsObject);
336
+ }
337
+ else if (argsObject.a) {
338
+ this.abilities = argsObject.b || {};
339
+ this.modelData = objectToUnderscore(argsObject.a);
227
340
  }
228
341
  else if (args) {
229
342
  this.abilities = {};
230
- this.modelData = objectToUnderscore(args);
343
+ this.modelData = objectToUnderscore(/** @type {ModelDataMap} */ (args));
231
344
  }
232
345
  else {
233
346
  this.abilities = {};
234
- this.modelData = {};
347
+ this.modelData = /** @type {ModelDataMap} */ ({});
235
348
  }
236
349
  }
237
350
  /**
238
- * @param {Record<string, any>} newAttributes
351
+ * @param {ModelDataMap} newAttributes
239
352
  * @returns {void}
240
353
  */
241
354
  assignAttributes(newAttributes) {
@@ -263,9 +376,9 @@ const BaseModel = class BaseModel {
263
376
  }
264
377
  }
265
378
  }
266
- /** @returns {Record<string, any>} */
379
+ /** @returns {ModelDataMap} */
267
380
  attributes() {
268
- const result = {};
381
+ const result = /** @type {ModelDataMap} */ ({});
269
382
  for (const key in this.modelData) {
270
383
  result[key] = this.modelData[key];
271
384
  }
@@ -287,7 +400,7 @@ const BaseModel = class BaseModel {
287
400
  }
288
401
  /** @returns {BaseModel} */
289
402
  clone() {
290
- const ModelClass = /** @type {new (...args: any[]) => BaseModel} */ (this.constructor);
403
+ const ModelClass = this.modelClass();
291
404
  const clone = new ModelClass();
292
405
  clone.abilities = { ...this.abilities };
293
406
  clone.modelData = { ...this.modelData };
@@ -330,16 +443,16 @@ const BaseModel = class BaseModel {
330
443
  const cacheKeyGenerator = new CacheKeyGenerator(this);
331
444
  return cacheKeyGenerator.cacheKey();
332
445
  }
333
- /** @returns {import("./collection.js").default<any>} */
446
+ /** @returns {import("./collection.js").default} */
334
447
  static all() {
335
448
  return this.ransack();
336
449
  }
337
450
  /**
338
- * @param {Record<string, any>} [attributes]
339
- * @param {object} [options]
451
+ * @param {ModelDataMap} [attributes]
452
+ * @param {ParseValidationErrorsOptions} [options]
340
453
  * @returns {Promise<{
341
454
  * model: BaseModel,
342
- * response: object
455
+ * response: ModelCommandResponse
343
456
  * }>}
344
457
  */
345
458
  async create(attributes, options) {
@@ -351,7 +464,7 @@ const BaseModel = class BaseModel {
351
464
  dataToUse[paramKey] = modelData;
352
465
  let response;
353
466
  try {
354
- response = await CommandsPool.addCommand({
467
+ response = /** @type {ModelCommandResponse} */ (await CommandsPool.addCommand({
355
468
  args: {
356
469
  save: dataToUse
357
470
  },
@@ -359,7 +472,7 @@ const BaseModel = class BaseModel {
359
472
  collectionName: this.modelClassData().collectionName,
360
473
  primaryKey: this.primaryKey(),
361
474
  type: "create"
362
- }, {});
475
+ }, {}));
363
476
  }
364
477
  catch (error) {
365
478
  BaseModel.parseValidationErrors({ error, model: this, options });
@@ -372,11 +485,13 @@ const BaseModel = class BaseModel {
372
485
  return { model: this, response };
373
486
  }
374
487
  /**
375
- * @param {FormData | Record<string, any>} rawData
376
- * @param {object} [options]
488
+ * @param {RawDataInput} rawData
489
+ * @param {ParseValidationErrorsOptions} [options]
490
+ * @returns {Promise<{model: BaseModel, response: ModelCommandResponse}>}
377
491
  */
378
492
  async createRaw(rawData, options = {}) {
379
493
  const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
494
+ /** @type {ModelCommandResponse} */
380
495
  let response;
381
496
  try {
382
497
  response = await CommandsPool.addCommand({
@@ -399,7 +514,7 @@ const BaseModel = class BaseModel {
399
514
  }
400
515
  return { model: this, response };
401
516
  }
402
- /** @returns {Promise<{model: BaseModel, response: object}>} */
517
+ /** @returns {Promise<{model: BaseModel, response: ModelCommandResponse}>} */
403
518
  async destroy() {
404
519
  const response = await CommandsPool.addCommand({
405
520
  args: { query_params: this.collection && this.collection.params() },
@@ -424,17 +539,15 @@ const BaseModel = class BaseModel {
424
539
  * @returns {Promise<void>}
425
540
  */
426
541
  async ensureAbilities(listOfAbilities) {
427
- // Populate an array with a list of abilities currently not loaded
428
542
  const abilitiesToLoad = [];
429
543
  for (const abilityInList of listOfAbilities) {
430
544
  if (!(abilityInList in this.abilities)) {
431
545
  abilitiesToLoad.push(abilityInList);
432
546
  }
433
547
  }
434
- // Load the missing abilities if any
435
548
  if (abilitiesToLoad.length > 0) {
436
549
  const primaryKeyName = this.modelClass().primaryKey();
437
- const ransackParams = {};
550
+ const ransackParams = /** @type {import("./collection.js").CollectionRansackParams} */ ({});
438
551
  ransackParams[`${primaryKeyName}_eq`] = this.primaryKey();
439
552
  const abilitiesParams = /** @type {Record<string, string[]>} */ ({});
440
553
  abilitiesParams[digg(this.modelClassData(), "name")] = abilitiesToLoad;
@@ -451,18 +564,19 @@ const BaseModel = class BaseModel {
451
564
  }
452
565
  }
453
566
  }
454
- /** @returns {Record<string, any>} */
567
+ /** @returns {ModelDataMap} */
455
568
  getAttributes() {
456
569
  return Object.assign(this.modelData, this.changes);
457
570
  }
458
571
  /**
459
- * @param {object} response
572
+ * @param {ModelCommandResponse} response
460
573
  * @returns {never}
461
574
  */
462
575
  handleResponseError(response) {
463
- // @ts-expect-error
464
- BaseModel.parseValidationErrors({ model: this, response });
465
- throw new CustomError("Response wasn't successful", { model: this, response });
576
+ throw new CustomError("Response wasn't successful", {
577
+ model: this,
578
+ response: /** @type {object} */ (response)
579
+ });
466
580
  }
467
581
  /** @returns {number | string} */
468
582
  identifierKey() {
@@ -497,14 +611,14 @@ const BaseModel = class BaseModel {
497
611
  }
498
612
  /**
499
613
  * @param {string} associationName
500
- * @returns {Promise<any>}
614
+ * @returns {Promise<LoadedRelationshipValue>}
501
615
  */
502
616
  async ensureAssociationLoaded(associationName) {
503
617
  return this.ensureAssociationLoadedUnderscore(inflection.underscore(associationName));
504
618
  }
505
619
  /**
506
620
  * @param {string} associationNameUnderscore
507
- * @returns {Promise<any>}
621
+ * @returns {Promise<LoadedRelationshipValue>}
508
622
  */
509
623
  async ensureAssociationLoadedUnderscore(associationNameUnderscore) {
510
624
  const reflection = this.modelClassData().relationships.find((relationship) => relationship.name == associationNameUnderscore);
@@ -519,28 +633,28 @@ const BaseModel = class BaseModel {
519
633
  if (!(loadMethodName in this))
520
634
  throw new Error(`No such association load method on ${this.modelClassData().name}: ${loadMethodName}`);
521
635
  if (this.isAssociationLoadedUnderscore(associationNameUnderscore)) {
522
- const loadedAssociation = this[methodName]();
636
+ const loadedAssociation = /** @type {LoadedRelationshipValue | {loaded(): BaseModel[]}} */ (this[methodName]());
523
637
  if (reflection.macro == "has_many") {
524
- return loadedAssociation.loaded();
638
+ return /** @type {{loaded(): BaseModel[]}} */ (loadedAssociation).loaded();
525
639
  }
526
- return loadedAssociation;
640
+ return /** @type {LoadedRelationshipValue} */ (loadedAssociation);
527
641
  }
528
642
  return this[loadMethodName]();
529
643
  }
530
644
  /**
531
645
  * @param {object} args
532
- * @param {any} args.error
646
+ * @param {ValidationError | Error | ValidationErrorWithResponse} args.error
533
647
  * @param {BaseModel} [args.model]
534
- * @param {ParseValidationErrorsOptions} args.options
648
+ * @param {ParseValidationErrorsOptions} [args.options]
535
649
  */
536
650
  static parseValidationErrors({ error, model, options }) {
537
651
  if (!(error instanceof ValidationError))
538
652
  return;
539
- if (!error.args.response.validation_errors)
653
+ if (!error.args?.response?.validation_errors)
540
654
  return;
541
655
  const validationErrors = new ValidationErrors({
542
656
  model,
543
- validationErrors: digg(error, "args", "response", "validation_errors")
657
+ validationErrors: /** @type {import("./validation-errors.js").ValidationErrorEntryArgs[]} */ (digg(error, "args", "response", "validation_errors"))
544
658
  });
545
659
  BaseModel.sendValidationErrorsEvent(validationErrors, options);
546
660
  if (!options || options.throwValidationError != false) {
@@ -643,7 +757,7 @@ const BaseModel = class BaseModel {
643
757
  this.relationships[relationshipName] = model.relationships[relationshipName];
644
758
  }
645
759
  for (const relationshipCacheName in model.relationshipsCache) {
646
- this.relationshipsCache[relationshipCacheName] = model.relationshipsCache[name];
760
+ this.relationshipsCache[relationshipCacheName] = model.relationshipsCache[relationshipCacheName];
647
761
  }
648
762
  }
649
763
  /**
@@ -659,26 +773,26 @@ const BaseModel = class BaseModel {
659
773
  }
660
774
  }
661
775
  /**
662
- * @param {any} oldValue
663
- * @param {any} newValue
776
+ * @param {ModelValue | null | undefined} oldValue
777
+ * @param {ModelValue | null | undefined} newValue
664
778
  * @returns {boolean | void}
665
779
  */
666
780
  _isDateChanged(oldValue, newValue) {
667
- if (Date.parse(oldValue) != Date.parse(newValue))
781
+ if (Date.parse(String(oldValue)) != Date.parse(String(newValue)))
668
782
  return true;
669
783
  }
670
784
  /**
671
- * @param {any} oldValue
672
- * @param {any} newValue
785
+ * @param {ModelValue | null | undefined} oldValue
786
+ * @param {ModelValue | null | undefined} newValue
673
787
  * @returns {boolean | void}
674
788
  */
675
789
  _isIntegerChanged(oldValue, newValue) {
676
- if (parseInt(oldValue, 10) != parseInt(newValue, 10))
790
+ if (parseInt(String(oldValue), 10) != parseInt(String(newValue), 10))
677
791
  return true;
678
792
  }
679
793
  /**
680
- * @param {any} oldValue
681
- * @param {any} newValue
794
+ * @param {ModelValue | null | undefined} oldValue
795
+ * @param {ModelValue | null | undefined} newValue
682
796
  * @returns {boolean | void}
683
797
  */
684
798
  _isStringChanged(oldValue, newValue) {
@@ -692,18 +806,18 @@ const BaseModel = class BaseModel {
692
806
  /** @returns {Promise<void>} */
693
807
  async reload() {
694
808
  const params = this.collection && this.collection.params();
695
- const ransackParams = {};
809
+ const ransackParams = /** @type {import("./collection.js").CollectionRansackParams} */ ({});
696
810
  ransackParams[`${this.modelClass().primaryKey()}_eq`] = this.primaryKey();
697
811
  let query = this.modelClass().ransack(ransackParams);
698
812
  if (params) {
699
813
  if (params.preload) {
700
- query.queryArgs.preload = params.preload;
814
+ query.queryArgs.preload = /** @type {import("./collection.js").PreloadValue} */ (params.preload);
701
815
  }
702
816
  if (params.select) {
703
- query.queryArgs.select = params.select;
817
+ query.queryArgs.select = /** @type {Record<string, string[]>} */ (params.select);
704
818
  }
705
819
  if (params.select_columns) {
706
- query.queryArgs.selectColumns = params.select_columns;
820
+ query.queryArgs.selectColumns = /** @type {Record<string, string[]>} */ (params.select_columns);
707
821
  }
708
822
  }
709
823
  const model = await query.first();
@@ -719,7 +833,11 @@ const BaseModel = class BaseModel {
719
833
  return this.update();
720
834
  }
721
835
  }
722
- /** @returns {Promise<{model: BaseModel, response: object}>} */
836
+ /**
837
+ * @param {RawDataInput} rawData
838
+ * @param {ParseValidationErrorsOptions & {simpleModelErrors?: boolean}} [options]
839
+ * @returns {Promise<{model: BaseModel, response: ModelCommandResponse}>}
840
+ */
723
841
  saveRaw(rawData, options = {}) {
724
842
  if (this.isNewRecord()) {
725
843
  return this.createRaw(rawData, options);
@@ -729,7 +847,7 @@ const BaseModel = class BaseModel {
729
847
  }
730
848
  }
731
849
  /**
732
- * @param {Record<string, any>} [newAttributes]
850
+ * @param {ModelDataMap} [newAttributes]
733
851
  * @param {ParseValidationErrorsOptions} [options]
734
852
  * @returns {Promise<{
735
853
  * model: BaseModel,
@@ -749,7 +867,7 @@ const BaseModel = class BaseModel {
749
867
  dataToUse[paramKey] = modelData;
750
868
  let response;
751
869
  try {
752
- response = await CommandsPool.addCommand({
870
+ response = /** @type {ModelCommandResponse} */ (await CommandsPool.addCommand({
753
871
  args: {
754
872
  query_params: this.collection && this.collection.params(),
755
873
  save: dataToUse
@@ -758,7 +876,7 @@ const BaseModel = class BaseModel {
758
876
  collectionName: this.modelClassData().collectionName,
759
877
  primaryKey: this.primaryKey(),
760
878
  type: "update"
761
- }, {});
879
+ }, {}));
762
880
  }
763
881
  catch (error) {
764
882
  BaseModel.parseValidationErrors({ error, model: this, options });
@@ -776,7 +894,7 @@ const BaseModel = class BaseModel {
776
894
  }
777
895
  }
778
896
  /**
779
- * @param {object} response
897
+ * @param {ModelCommandResponse} response
780
898
  * @returns {void}
781
899
  */
782
900
  _refreshModelFromResponse(response) {
@@ -786,7 +904,7 @@ const BaseModel = class BaseModel {
786
904
  this.setNewModel(newModel);
787
905
  }
788
906
  /**
789
- * @param {object} response
907
+ * @param {ModelCommandResponse} response
790
908
  * @returns {void}
791
909
  */
792
910
  _refreshModelDataFromResponse(response) {
@@ -796,27 +914,34 @@ const BaseModel = class BaseModel {
796
914
  this.setNewModelData(newModel);
797
915
  }
798
916
  /**
799
- * @param {FormData | Record<string, any>} rawData
917
+ * @param {RawDataInput} rawData
800
918
  * @param {object} options
801
- * @returns {Record<string, any>}
919
+ * @returns {ModelDataMap}
802
920
  */
803
921
  static _objectDataFromGivenRawData(rawData, options) {
804
- if (rawData instanceof FormData || rawData.nodeName == "FORM") {
922
+ if (rawData instanceof FormData || BaseModel._isFormElement(rawData)) {
805
923
  const formData = FormDataObjectizer.formDataFromObject(rawData, options);
806
- return FormDataObjectizer.toObject(formData);
924
+ return /** @type {ModelDataMap} */ (FormDataObjectizer.toObject(formData));
807
925
  }
808
926
  return rawData;
809
927
  }
810
928
  /**
811
- * @param {FormData | Record<string, any>} rawData
929
+ * @param {RawDataInput | ModelValue} value
930
+ * @returns {value is HTMLFormElement}
931
+ */
932
+ static _isFormElement(value) {
933
+ return typeof HTMLFormElement != "undefined" && value instanceof HTMLFormElement;
934
+ }
935
+ /**
936
+ * @param {RawDataInput} rawData
812
937
  * @param {ParseValidationErrorsOptions & {simpleModelErrors?: boolean}} [options]
813
- * @returns {Promise<{response: object, model: BaseModel}>}
938
+ * @returns {Promise<{response: ModelCommandResponse, model: BaseModel}>}
814
939
  */
815
940
  async updateRaw(rawData, options = {}) {
816
941
  const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
817
942
  let response;
818
943
  try {
819
- response = await CommandsPool.addCommand({
944
+ response = /** @type {ModelCommandResponse} */ (await CommandsPool.addCommand({
820
945
  args: {
821
946
  query_params: this.collection && this.collection.params(),
822
947
  save: objectData,
@@ -826,7 +951,7 @@ const BaseModel = class BaseModel {
826
951
  collectionName: this.modelClassData().collectionName,
827
952
  primaryKey: this.primaryKey(),
828
953
  type: "update"
829
- }, {});
954
+ }, {}));
830
955
  }
831
956
  catch (error) {
832
957
  BaseModel.parseValidationErrors({ error, model: this, options });
@@ -842,7 +967,7 @@ const BaseModel = class BaseModel {
842
967
  isValid() {
843
968
  throw new Error("Not implemented yet");
844
969
  }
845
- /** @returns {Promise<{valid: boolean, errors: Record<string, any>}>} */
970
+ /** @returns {Promise<{valid: boolean, errors: ValidationResponseErrors}>} */
846
971
  async isValidOnServer() {
847
972
  const modelData = this.getAttributes();
848
973
  const paramKey = this.modelClassData().paramKey;
@@ -859,9 +984,9 @@ const BaseModel = class BaseModel {
859
984
  }, {});
860
985
  return { valid: response.valid, errors: response.errors };
861
986
  }
862
- /** @returns {Record<string, any>} */
987
+ /** @returns {BaseModelClassType} */
863
988
  modelClass() {
864
- return /** @type {Record<string, any>} */ (this.constructor);
989
+ return /** @type {BaseModelClassType} */ (this.constructor);
865
990
  }
866
991
  /**
867
992
  * @param {string} relationshipName
@@ -889,9 +1014,9 @@ const BaseModel = class BaseModel {
889
1014
  return this.uniqueKeyValue;
890
1015
  }
891
1016
  /**
892
- * @param {{args: any}} args
893
- * @param {Record<string, any>} commandArgs
894
- * @returns {Promise<object>}
1017
+ * @param {ModelCommandDescriptor} args
1018
+ * @param {ModelCommandOptions} commandArgs
1019
+ * @returns {Promise<ModelCommandResponse>}
895
1020
  */
896
1021
  static async _callCollectionCommand(args, commandArgs) {
897
1022
  const formOrDataObject = args.args;
@@ -903,7 +1028,7 @@ const BaseModel = class BaseModel {
903
1028
  if (commandArgs.form) {
904
1029
  form = commandArgs.form;
905
1030
  }
906
- else if (formOrDataObject?.nodeName == "FORM") {
1031
+ else if (formOrDataObject && BaseModel._isFormElement(formOrDataObject)) {
907
1032
  form = formOrDataObject;
908
1033
  }
909
1034
  if (form)
@@ -912,15 +1037,15 @@ const BaseModel = class BaseModel {
912
1037
  }
913
1038
  }
914
1039
  /**
915
- * @param {Record<string, any>} args
916
- * @param {Record<string, any>} commandArgs
917
- * @returns {Promise<object>}
1040
+ * @param {ModelCommandDescriptor} args
1041
+ * @param {ModelCommandOptions} commandArgs
1042
+ * @returns {import("./command-execution.js").default}
918
1043
  */
919
1044
  _callMemberCommand(args, commandArgs) {
920
1045
  return CommandsPool.addCommand(args, commandArgs);
921
1046
  }
922
1047
  /**
923
- * @param {FormData | Record<string, any>} [args]
1048
+ * @param {FormData | ModelDataMap} [args]
924
1049
  * @returns {FormData}
925
1050
  */
926
1051
  static _postDataFromArgs(args) {
@@ -940,7 +1065,7 @@ const BaseModel = class BaseModel {
940
1065
  }
941
1066
  /**
942
1067
  * @param {string} attributeName
943
- * @returns {any}
1068
+ * @returns {ModelValue | null | undefined}
944
1069
  */
945
1070
  readAttribute(attributeName) {
946
1071
  const attributeNameUnderscore = inflection.underscore(attributeName);
@@ -948,7 +1073,7 @@ const BaseModel = class BaseModel {
948
1073
  }
949
1074
  /**
950
1075
  * @param {string} attributeName
951
- * @returns {any}
1076
+ * @returns {ModelValue | null | undefined}
952
1077
  */
953
1078
  readAttributeUnderscore(attributeName) {
954
1079
  if (attributeName in this.changes) {
@@ -967,7 +1092,10 @@ const BaseModel = class BaseModel {
967
1092
  throw new AttributeNotLoadedError(`No such attribute: ${digg(this.modelClassData(), "name")}#${attributeName}: ${JSON.stringify(this.modelData)}`);
968
1093
  }
969
1094
  }
970
- /** @returns {boolean} */
1095
+ /**
1096
+ * @param {string} attributeName
1097
+ * @returns {boolean}
1098
+ */
971
1099
  isAttributeLoaded(attributeName) {
972
1100
  const attributeNameUnderscore = inflection.underscore(attributeName);
973
1101
  if (attributeNameUnderscore in this.changes)
@@ -977,7 +1105,7 @@ const BaseModel = class BaseModel {
977
1105
  return false;
978
1106
  }
979
1107
  /**
980
- * @param {any} value
1108
+ * @param {ModelValue | null | undefined} value
981
1109
  * @returns {boolean}
982
1110
  */
983
1111
  _isPresent(value) {
@@ -991,19 +1119,20 @@ const BaseModel = class BaseModel {
991
1119
  }
992
1120
  /**
993
1121
  *
994
- * @param {import("./collection.js").CollectionArgsType<any>} args
1122
+ * @param {RelationshipLoadArgs} args
995
1123
  * @param {import("./collection.js").QueryArgsType} queryArgs
996
- * @returns {Promise<any | null>}
1124
+ * @returns {Promise<BaseModel | null>}
997
1125
  */
998
1126
  async _loadBelongsToReflection(args, queryArgs = {}) {
999
1127
  if (args.reflectionName in this.relationships) {
1000
- return this.relationships[args.reflectionName];
1128
+ return /** @type {BaseModel | null} */ (this.relationships[args.reflectionName]);
1001
1129
  }
1002
1130
  else if (args.reflectionName in this.relationshipsCache) {
1003
- return this.relationshipsCache[args.reflectionName];
1131
+ return /** @type {BaseModel | null} */ (this.relationshipsCache[args.reflectionName]);
1004
1132
  }
1005
1133
  else {
1006
- const collection = new Collection(args, queryArgs);
1134
+ const collection = new Collection(
1135
+ /** @type {import("./collection.js").CollectionArgsType<typeof BaseModel>} */ (args), queryArgs);
1007
1136
  const model = await collection.first();
1008
1137
  this.relationshipsCache[args.reflectionName] = model;
1009
1138
  return model;
@@ -1011,15 +1140,15 @@ const BaseModel = class BaseModel {
1011
1140
  }
1012
1141
  /**
1013
1142
  *
1014
- * @param {{modelClass: any, reflectionName: string}} args
1015
- * @returns {any | null}
1143
+ * @param {RelationshipLoadArgs} args
1144
+ * @returns {BaseModel | null}
1016
1145
  */
1017
1146
  _readBelongsToReflection({ reflectionName }) {
1018
1147
  if (reflectionName in this.relationships) {
1019
- return this.relationships[reflectionName];
1148
+ return /** @type {BaseModel | null} */ (this.relationships[reflectionName]);
1020
1149
  }
1021
1150
  else if (reflectionName in this.relationshipsCache) {
1022
- return this.relationshipsCache[reflectionName];
1151
+ return /** @type {BaseModel | null} */ (this.relationshipsCache[reflectionName]);
1023
1152
  }
1024
1153
  if (this.isNewRecord())
1025
1154
  return null;
@@ -1029,37 +1158,39 @@ const BaseModel = class BaseModel {
1029
1158
  }
1030
1159
  /**
1031
1160
  *
1032
- * @param {import("./collection.js").CollectionArgsType<any>} args
1161
+ * @param {RelationshipLoadArgs} args
1033
1162
  * @param {import("./collection.js").QueryArgsType} queryArgs
1034
- * @returns {Promise<Array<any>>}
1163
+ * @returns {Promise<BaseModel[]>}
1035
1164
  */
1036
1165
  async _loadHasManyReflection(args, queryArgs = {}) {
1037
1166
  if (args.reflectionName in this.relationships) {
1038
- return this.relationships[args.reflectionName];
1167
+ return /** @type {BaseModel[]} */ (this.relationships[args.reflectionName]);
1039
1168
  }
1040
1169
  else if (args.reflectionName in this.relationshipsCache) {
1041
- return this.relationshipsCache[args.reflectionName];
1170
+ return /** @type {BaseModel[]} */ (this.relationshipsCache[args.reflectionName]);
1042
1171
  }
1043
- const collection = new Collection(args, queryArgs);
1172
+ const collection = new Collection(
1173
+ /** @type {import("./collection.js").CollectionArgsType<typeof BaseModel>} */ (args), queryArgs);
1044
1174
  const models = await collection.toArray();
1045
1175
  this.relationshipsCache[args.reflectionName] = models;
1046
1176
  return models;
1047
1177
  }
1048
1178
  /**
1049
1179
  *
1050
- * @param {import("./collection.js").CollectionArgsType<any>} args
1180
+ * @param {RelationshipLoadArgs} args
1051
1181
  * @param {import("./collection.js").QueryArgsType} queryArgs
1052
- * @returns {Promise<any>}
1182
+ * @returns {Promise<BaseModel | null>}
1053
1183
  */
1054
1184
  async _loadHasOneReflection(args, queryArgs = {}) {
1055
1185
  if (args.reflectionName in this.relationships) {
1056
- return this.relationships[args.reflectionName];
1186
+ return /** @type {BaseModel | null} */ (this.relationships[args.reflectionName]);
1057
1187
  }
1058
1188
  else if (args.reflectionName in this.relationshipsCache) {
1059
- return this.relationshipsCache[args.reflectionName];
1189
+ return /** @type {BaseModel | null} */ (this.relationshipsCache[args.reflectionName]);
1060
1190
  }
1061
1191
  else {
1062
- const collection = new Collection(args, queryArgs);
1192
+ const collection = new Collection(
1193
+ /** @type {import("./collection.js").CollectionArgsType<typeof BaseModel>} */ (args), queryArgs);
1063
1194
  const model = await collection.first();
1064
1195
  this.relationshipsCache[args.reflectionName] = model;
1065
1196
  return model;
@@ -1067,15 +1198,15 @@ const BaseModel = class BaseModel {
1067
1198
  }
1068
1199
  /**
1069
1200
  *
1070
- * @param {{modelClass: any, reflectionName: string}} args
1071
- * @returns {any | null}
1201
+ * @param {RelationshipLoadArgs} args
1202
+ * @returns {BaseModel | null}
1072
1203
  */
1073
1204
  _readHasOneReflection({ reflectionName }) {
1074
1205
  if (reflectionName in this.relationships) {
1075
- return this.relationships[reflectionName];
1206
+ return /** @type {BaseModel | null} */ (this.relationships[reflectionName]);
1076
1207
  }
1077
1208
  else if (reflectionName in this.relationshipsCache) {
1078
- return this.relationshipsCache[reflectionName];
1209
+ return /** @type {BaseModel | null} */ (this.relationshipsCache[reflectionName]);
1079
1210
  }
1080
1211
  if (this.isNewRecord()) {
1081
1212
  return null;
@@ -1085,12 +1216,7 @@ const BaseModel = class BaseModel {
1085
1216
  throw new NotLoadedError(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
1086
1217
  }
1087
1218
  /**
1088
- * @param {object} [args]
1089
- * @param {object} [args.data]
1090
- * @param {Record<string, any>} [args.data.b]
1091
- * @param {Record<string, any>} [args.data.a]
1092
- * @param {any} [args.data.r]
1093
- * @param {Collection<any>} [args.collection]
1219
+ * @param {BaseModelArgsObject} [args]
1094
1220
  * @returns {void}
1095
1221
  */
1096
1222
  _readModelDataFromArgs(args) {
@@ -1143,8 +1269,10 @@ const BaseModel = class BaseModel {
1143
1269
  }
1144
1270
  }
1145
1271
  }
1146
- /** @returns {number|string} */
1147
- primaryKey() { return this.readAttributeUnderscore(this.modelClass().primaryKey()); }
1272
+ /** @returns {number | string} */
1273
+ primaryKey() {
1274
+ return /** @type {number | string} */ (this.readAttributeUnderscore(this.modelClass().primaryKey()));
1275
+ }
1148
1276
  };
1149
1277
  export default BaseModel;
1150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiYmFzZS1tb2RlbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sU0FBUyxNQUFNLDJCQUEyQixDQUFBLENBQUMsbUNBQW1DO0FBQ3JGLE9BQU8sdUJBQXVCLE1BQU0saUNBQWlDLENBQUE7QUFDckUsT0FBTyxpQkFBaUIsTUFBTSwwQkFBMEIsQ0FBQTtBQUN4RCxPQUFPLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLFlBQVksTUFBTSxvQkFBb0IsQ0FBQTtBQUM3QyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxrQkFBa0IsTUFBTSxzQkFBc0IsQ0FBQTtBQUNyRCxPQUFPLFNBQVMsTUFBTSxpQkFBaUIsQ0FBQTtBQUN2QyxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNsRCxPQUFPLFVBQVUsTUFBTSw0QkFBNEIsQ0FBQTtBQUNuRCxPQUFPLEtBQUssTUFBTSx1QkFBdUIsQ0FBQTtBQUN6QyxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUE7QUFDcEMsT0FBTyxlQUFlLE1BQU0sdUJBQXVCLENBQUE7QUFDbkQsT0FBTyxnQkFBZ0IsTUFBTSxvQkFBb0IsQ0FBQTtBQUVqRDs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFpQkU7QUFFRjs7OztHQUlHO0FBRUgsdUhBQXVIO0FBRXZILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRTtJQUNwQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7SUFFcEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN6QixNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRWhELFNBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDeEMsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUMsQ0FBQTtBQUVELGlCQUFpQjtBQUNqQixpQ0FBaUM7QUFDakMsTUFBTSxTQUFTLEdBQUcsTUFBTSxTQUFTO0lBQy9CLE1BQU0sQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFBO0lBRWpDLDZCQUE2QjtJQUM3QixNQUFNLENBQUMsVUFBVTtRQUNmLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUE7UUFDbkQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO1FBRWpCLEtBQUssTUFBTSxZQUFZLElBQUksVUFBVSxFQUFFLENBQUM7WUFDdEMsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQzlDLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBRTlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDeEIsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWE7UUFDL0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUM1RCxNQUFNLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFbkUsSUFBSSxzQkFBc0IsSUFBSSxVQUFVO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFckQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGNBQWM7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLGdCQUFnQjtRQUNwQyxPQUFPLElBQUksV0FBVyxDQUFDLG1CQUFtQixFQUFFLEVBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFDLENBQUMsQ0FBQTtJQUN6RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMseUJBQXlCLENBQUMsZ0JBQWdCLEVBQUUsT0FBTztRQUN4RCxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUIsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1lBQ3hELE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNsQixNQUFNLEtBQUssR0FBRyxrQ0FBa0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRXJELEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBRXJDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUUvQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUMzQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDdkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLHdCQUF3QixFQUFFO1lBQzVFLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYztZQUNwQyxzQkFBc0IsRUFBRSxrQkFBa0I7WUFDMUMsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxDQUFDO1NBQ25ELENBQUMsQ0FBQTtRQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFFbkMsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLE1BQU0sQ0FBQyxTQUFTO1FBQ2QsT0FBTyxJQUFJLFNBQVMsQ0FBQyxFQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsTUFBTSxDQUFDLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEVBQUU7UUFDdkIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUMsRUFBRSxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU07UUFDbEIsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFFRCw4QkFBOEI7SUFDOUIsTUFBTSxDQUFDLHVCQUF1QjtRQUM1QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLDBCQUEwQixDQUFDLENBQUE7UUFDN0UsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFBO1FBRXRCLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUM3QyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQTtRQUNwRCxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUE7SUFDcEIsQ0FBQztJQUVELDZCQUE2QjtJQUM3QixNQUFNLENBQUMscUJBQXFCO1FBQzFCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQTtRQUMvRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7UUFFakIsS0FBSyxNQUFNLGFBQWEsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7UUFDM0MsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixNQUFNLENBQUMsaUJBQWlCO1FBQ3RCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO1FBQzNFLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtRQUVqQixLQUFLLE1BQU0sU0FBUyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7WUFFbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNwQixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBRUQsOEJBQThCO0lBQzlCLE1BQU0sQ0FBQyxXQUFXO1FBQ2hCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFDbEUsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFBO1FBRXRCLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUM3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1lBRW5ELFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDOUIsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFBO0lBQ3BCLENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQ3BCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQTtRQUUxRixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRTtpQkFDdkMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUViLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLElBQUksT0FBTyxlQUFlLEVBQUUsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7UUFFRCxPQUFPLGVBQWUsQ0FBQTtJQUN4QixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLE1BQU0sQ0FBQyxNQUFNO1FBQ1gsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUE7UUFFMUUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFlBQVksSUFBSSxHQUFHLEVBQUU7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFBO1FBQ2pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUE7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUE7UUFFdkIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuQyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM3QyxDQUFDO2FBQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQTtZQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzNDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUE7WUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUE7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0IsQ0FBQyxhQUFhO1FBQzVCLEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEMsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ25DLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUV0RCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUE7WUFDdEIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFBO1lBRXhCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ3hDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtnQkFFekQsSUFBSSxRQUFRLElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ3pCLFdBQVcsR0FBRyxLQUFLLENBQUE7Z0JBQ3JCLENBQUM7cUJBQU0sSUFBSSxRQUFRLElBQUksYUFBYSxFQUFFLENBQUM7b0JBQ3JDLFdBQVcsR0FBRyxLQUFLLENBQUE7b0JBQ25CLFlBQVksR0FBRyxJQUFJLENBQUE7Z0JBQ3JCLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLFFBQVEsQ0FBQTtZQUM5QyxDQUFDO2lCQUFNLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1lBQzFDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxVQUFVO1FBQ1IsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO1FBRWpCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ25DLENBQUM7UUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNqQyxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLGdCQUFnQjtRQUNsQixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFFM0QsSUFBSSxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxXQUFXLDJCQUEyQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN6RyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsS0FBSztRQUNILE1BQU0sVUFBVSxHQUFHLGdEQUFnRCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3RGLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxFQUFFLENBQUE7UUFFOUIsS0FBSyxDQUFDLFNBQVMsR0FBRyxFQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBQyxDQUFBO1FBQ3JDLEtBQUssQ0FBQyxTQUFTLEdBQUcsRUFBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQTtRQUNyQyxLQUFLLENBQUMsYUFBYSxHQUFHLEVBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFDLENBQUE7UUFDN0MsS0FBSyxDQUFDLGtCQUFrQixHQUFHLEVBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUMsQ0FBQTtRQUV2RCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdkIsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVE7Z0JBQzlCLElBQUksQ0FBQyxVQUFVLEVBQUU7YUFDbEIsQ0FBQTtZQUVELElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkMsbUJBQW1CO2dCQUNuQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7Z0JBRWxDLElBQUksT0FBTyxTQUFTLElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLE9BQU8sU0FBUyxFQUFFLENBQUMsQ0FBQTtnQkFDcEUsQ0FBQztxQkFBTSxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQztvQkFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsU0FBUyxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7Z0JBQ3hILENBQUM7Z0JBRUQsbUJBQW1CO2dCQUNuQixRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUMxRCxDQUFDO1lBRUQsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsYUFBYTtRQUNYLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVyRCxPQUFPLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2xDLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsWUFBWTtRQUNWLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVyRCxPQUFPLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ3JDLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsTUFBTSxDQUFDLEdBQUc7UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUN2QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE9BQU87UUFDOUIsSUFBSSxVQUFVO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ2pELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUE7UUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQTtRQUNwQixTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBUyxDQUFBO1FBQy9CLElBQUksUUFBUSxDQUFBO1FBRVosSUFBSSxDQUFDO1lBQ0gsUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLFVBQVUsQ0FDdEM7Z0JBQ0UsSUFBSSxFQUFFO29CQUNKLElBQUksRUFBRSxTQUFTO2lCQUNoQjtnQkFDRCxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsY0FBYyxTQUFTO2dCQUN6RCxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLGNBQWM7Z0JBQ3BELFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUM3QixJQUFJLEVBQUUsUUFBUTthQUNmLEVBQ0QsRUFBRSxDQUNILENBQUE7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7WUFDOUQsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFBO1FBQ25CLENBQUM7UUFFRCxPQUFPLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQTtJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxHQUFHLEVBQUU7UUFDbkMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLDJCQUEyQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUUxRSxJQUFJLFFBQVEsQ0FBQTtRQUVaLElBQUksQ0FBQztZQUNILFFBQVEsR0FBRyxNQUFNLFlBQVksQ0FBQyxVQUFVLENBQ3RDO2dCQUNFLElBQUksRUFBRTtvQkFDSixJQUFJLEVBQUUsVUFBVTtpQkFDakI7Z0JBQ0QsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLGNBQWMsU0FBUztnQkFDekQsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxjQUFjO2dCQUNwRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDN0IsSUFBSSxFQUFFLFFBQVE7YUFDZixFQUNELEVBQUUsQ0FDSCxDQUFBO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixTQUFTLENBQUMscUJBQXFCLENBQUMsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO1lBQzlELE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUNuQixDQUFDO1FBRUQsT0FBTyxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUE7SUFDaEMsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLFVBQVUsQ0FDNUM7WUFDRSxJQUFJLEVBQUUsRUFBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFDO1lBQ2pFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxjQUFjLFVBQVU7WUFDMUQsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxjQUFjO1lBQ3BELFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzdCLElBQUksRUFBRSxTQUFTO1NBQ2hCLEVBQ0QsRUFBRSxDQUNILENBQUE7UUFFRCxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQixJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQTtZQUNuQixDQUFDO1lBRUQsT0FBTyxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUE7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLGVBQWU7UUFDbkMsa0VBQWtFO1FBQ2xFLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQTtRQUUxQixLQUFLLE1BQU0sYUFBYSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUNyQyxDQUFDO1FBQ0gsQ0FBQztRQUVELG9DQUFvQztRQUNwQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFBO1lBQ3JELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQTtZQUN4QixhQUFhLENBQUMsR0FBRyxjQUFjLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtZQUV6RCxNQUFNLGVBQWUsR0FBRyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ3BFLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFBO1lBRXRFLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRTtpQkFDekMsT0FBTyxDQUFDLGFBQWEsQ0FBQztpQkFDdEIsU0FBUyxDQUFDLGVBQWUsQ0FBQztpQkFDMUIsS0FBSyxFQUFFLENBQUE7WUFFVixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLElBQUksQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ3hILENBQUM7WUFFRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFBO1lBQzNDLEtBQUssTUFBTSxVQUFVLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ3ZELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxhQUFhO1FBQ1gsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSCxtQkFBbUIsQ0FBQyxRQUFRO1FBQzFCLG1CQUFtQjtRQUNuQixTQUFTLENBQUMscUJBQXFCLENBQUMsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7UUFDeEQsTUFBTSxJQUFJLFdBQVcsQ0FBQyw0QkFBNEIsRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtJQUM5RSxDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLGFBQWE7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7UUFFekcsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFBO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxtQkFBbUIsQ0FBQyxlQUFlLElBQUksT0FBTyxJQUFJLENBQUMsNkJBQTZCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUUxSDs7O09BR0c7SUFDSCw2QkFBNkIsQ0FBRSx5QkFBeUI7UUFDdEQsSUFBSSx5QkFBeUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFDckUsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsb0JBQW9CLENBQUMsZUFBZTtRQUNsQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUMxRCxJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBQ3RELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlO1FBQzNDLE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQTtJQUN2RixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLHlCQUF5QjtRQUMvRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSx5QkFBeUIsQ0FBQyxDQUFBO1FBRTdILElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFdEcsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IseUJBQXlCLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQy9JLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3ZFLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSx5QkFBeUIsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBRXJGLElBQUksQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDLENBQUE7UUFDeEgsSUFBSSxDQUFDLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUMsQ0FBQTtRQUVySSxJQUFJLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUM7WUFDbEUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQTtZQUU1QyxJQUFJLFVBQVUsQ0FBQyxLQUFLLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ25DLE9BQU8saUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUE7WUFDbkMsQ0FBQztZQUVELE9BQU8saUJBQWlCLENBQUE7UUFDMUIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUE7SUFDL0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUM7UUFDbEQsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLGVBQWUsQ0FBQztZQUFFLE9BQU07UUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQjtZQUFFLE9BQU07UUFFbEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUFDO1lBQzVDLEtBQUs7WUFDTCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsbUJBQW1CLENBQUM7U0FDdkUsQ0FBQyxDQUFBO1FBRUYsU0FBUyxDQUFDLHlCQUF5QixDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRTlELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLG9CQUFvQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3RELE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsa0JBQWtCLENBQUMsYUFBYTtRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBRXRELG1CQUFtQjtRQUNuQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFN0IsSUFBSSxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixPQUFPLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUMsWUFBWSxFQUFFLGFBQWEsRUFBQyxDQUFDLENBQUE7UUFFbEksT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxrQkFBa0IsQ0FBQyxhQUFhO1FBQzlCLE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNwRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNsRSxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLHVCQUF1QixDQUFDLENBQUE7UUFFeEcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtZQUU3RSxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxhQUFhLFNBQVMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDakgsQ0FBQztRQUVELElBQUksQ0FBQyxDQUFDLHVCQUF1QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDNUMsT0FBTyxLQUFLLENBQUE7UUFFZCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUE7UUFDeEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBQ3RELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFeEYsSUFBSSxDQUFDLGFBQWE7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFFekUsT0FBTyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzFDLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsU0FBUztRQUNQLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRXRDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixPQUFPLElBQUksQ0FBQTtRQUNiLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQTtRQUN2QixDQUFDO2FBQU0sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZELE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQTtRQUNiLENBQUM7SUFDSCxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLFdBQVcsS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBLENBQUMsQ0FBQztJQUU1Qzs7O09BR0c7SUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBRWpFOzs7T0FHRztJQUNILHNCQUFzQixDQUFDLGFBQWE7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7WUFDekIsT0FBTyxLQUFLLENBQUE7UUFFZCxNQUFNLHVCQUF1QixHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDcEUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDbEUsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSx1QkFBdUIsQ0FBQyxDQUFBO1FBRS9GLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsYUFBYSxTQUFTLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2pILENBQUM7UUFFRCxJQUFJLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDdEQsT0FBTyxJQUFJLENBQUE7UUFFYixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUE7UUFDeEQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUE7UUFDaEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFFN0MsSUFBSSxDQUFDLGFBQWE7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFFekUsT0FBTyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzFDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsS0FBSztRQUNmLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFM0IsS0FBSSxNQUFNLGdCQUFnQixJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQzlFLENBQUM7UUFFRCxLQUFJLE1BQU0scUJBQXFCLElBQUksS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2pGLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZSxDQUFDLEtBQUs7UUFDbkIsSUFBSSxDQUFDLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRS9GLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsRUFBQyxDQUFBO1FBRXJELEtBQUksTUFBTSxhQUFhLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNoRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsUUFBUSxFQUFFLFFBQVE7UUFDL0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQzlDLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsUUFBUTtRQUNsQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEQsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUFFLFFBQVEsRUFBRSxRQUFRO1FBQ2xDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxRQUFRLEVBQUUsQ0FBQTtRQUN2QyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsUUFBUSxFQUFFLENBQUE7UUFFdkMsSUFBSSxpQkFBaUIsSUFBSSxpQkFBaUI7WUFDeEMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsb0NBQW9DO0lBQ3BDLGNBQWMsS0FBSyxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFFOUQsK0JBQStCO0lBQy9CLEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQzFELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQTtRQUN4QixhQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUV6RSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXBELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQTtZQUMxQyxDQUFDO1lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUE7WUFDeEMsQ0FBQztZQUVELElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMxQixLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFBO1lBQ3ZELENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLElBQUk7UUFDRixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ3RCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLEdBQUcsRUFBRTtRQUMzQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDekMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLE9BQU87UUFDakMsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDdEMsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUE7UUFDdEIsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUE7UUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQTtRQUM5QixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7UUFDcEIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtRQUMvQixJQUFJLFFBQVEsQ0FBQTtRQUVaLElBQUksQ0FBQztZQUNILFFBQVEsR0FBRyxNQUFNLFlBQVksQ0FBQyxVQUFVLENBQ3RDO2dCQUNFLElBQUksRUFBRTtvQkFDSixZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtvQkFDekQsSUFBSSxFQUFFLFNBQVM7aUJBQ2hCO2dCQUNELE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxjQUFjLFNBQVM7Z0JBQ3pELGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsY0FBYztnQkFDcEQsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQzdCLElBQUksRUFBRSxRQUFRO2FBQ2YsRUFDRCxFQUFFLENBQ0gsQ0FBQTtRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtZQUM5RCxNQUFNLEtBQUssQ0FBQTtRQUNiLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQixJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQTtZQUNuQixDQUFDO1lBRUQsT0FBTyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUE7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCx5QkFBeUIsQ0FBQyxRQUFRO1FBQ2hDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFFdEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUFFLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFbkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsNkJBQTZCLENBQUMsUUFBUTtRQUNwQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRXRDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFBRSxRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRW5ELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsMkJBQTJCLENBQUMsT0FBTyxFQUFFLE9BQU87UUFDakQsSUFBSSxPQUFPLFlBQVksUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7WUFDOUQsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBRXhFLE9BQU8sa0JBQWtCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzlDLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxFQUFFO1FBQ25DLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDMUUsSUFBSSxRQUFRLENBQUE7UUFFWixJQUFJLENBQUM7WUFDSCxRQUFRLEdBQUcsTUFBTSxZQUFZLENBQUMsVUFBVSxDQUN0QztnQkFDRSxJQUFJLEVBQUU7b0JBQ0osWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7b0JBQ3pELElBQUksRUFBRSxVQUFVO29CQUNoQixtQkFBbUIsRUFBRSxPQUFPLEVBQUUsaUJBQWlCO2lCQUNoRDtnQkFDRCxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsY0FBYyxTQUFTO2dCQUN6RCxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLGNBQWM7Z0JBQ3BELFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUM3QixJQUFJLEVBQUUsUUFBUTthQUNmLEVBQ0QsRUFBRSxDQUNILENBQUE7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7WUFDOUQsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFBO1FBQ25CLENBQUM7UUFFRCxPQUFPLEVBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsQ0FBQTtJQUNoQyxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLE9BQU87UUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUE7SUFDeEMsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSxLQUFLLENBQUMsZUFBZTtRQUNuQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQTtRQUMvQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7UUFDcEIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtRQUUvQixNQUFNLFFBQVEsR0FBRyxNQUFNLFlBQVksQ0FBQyxVQUFVLENBQzVDO1lBQ0UsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxTQUFTO2FBQ2hCO1lBQ0QsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLGNBQWMsUUFBUTtZQUN4RCxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLGNBQWM7WUFDcEQsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDN0IsSUFBSSxFQUFFLE9BQU87U0FDZCxFQUNELEVBQUUsQ0FDSCxDQUFBO1FBRUQsT0FBTyxFQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFDLENBQUE7SUFDekQsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxVQUFVO1FBQ1IsT0FBTyxrQ0FBa0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLGdCQUFnQixFQUFFLEtBQUs7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQTtRQUN0RSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQTtJQUNuRSxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLGtCQUFrQjtRQUNoQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFBO0lBQ25DLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsb0JBQW9CLEtBQUssT0FBTyxJQUFJLENBQUMscUJBQXFCLElBQUksS0FBSyxDQUFBLENBQUMsQ0FBQztJQUVyRSx3QkFBd0I7SUFDeEIsU0FBUztRQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUE7WUFDNUIsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUE7WUFDNUIsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUE7WUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUE7UUFDL0QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQTtJQUM1QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLFdBQVc7UUFDbkQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO1FBRWxDLElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUN6RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksSUFBSSxDQUFBO1lBRVIsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFBO1lBQ3pCLENBQUM7aUJBQU0sSUFBSSxnQkFBZ0IsRUFBRSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ2hELElBQUksR0FBRyxnQkFBZ0IsQ0FBQTtZQUN6QixDQUFDO1lBRUQsSUFBSSxJQUFJO2dCQUFFLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUMsRUFBQyxDQUFDLENBQUE7WUFFbkUsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsV0FBVztRQUNsQyxPQUFPLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSTtRQUMzQixJQUFJLFFBQVEsQ0FBQTtRQUVaLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLElBQUksWUFBWSxRQUFRLEVBQUUsQ0FBQztnQkFDN0IsUUFBUSxHQUFHLElBQUksQ0FBQTtZQUNqQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sUUFBUSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtZQUMvRCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQTtRQUMzQixDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGFBQWEsQ0FBQyxhQUFhO1FBQ3pCLE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUVwRSxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRDs7O09BR0c7SUFDSCx1QkFBdUIsQ0FBQyxhQUFhO1FBQ25DLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDcEMsQ0FBQzthQUFNLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDdEMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDOUIsdUZBQXVGO1lBQ3ZGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUE7WUFFNUQsSUFBSSxhQUFhLElBQUksVUFBVTtnQkFBRSxPQUFPLElBQUksQ0FBQTtRQUM5QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksdUJBQXVCLENBQUMsc0JBQXNCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksYUFBYSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNwSixDQUFDO0lBQ0gsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixpQkFBaUIsQ0FBQyxhQUFhO1FBQzdCLE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUVwRSxJQUFJLHVCQUF1QixJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFDeEQsSUFBSSx1QkFBdUIsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFBO1FBQzFELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxLQUFLO1FBQ2QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzVELE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxTQUFTLEdBQUcsRUFBRTtRQUNqRCxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzlDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDaEQsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDckQsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7WUFDbEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDdEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxLQUFLLENBQUE7WUFDcEQsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx3QkFBd0IsQ0FBQyxFQUFDLGNBQWMsRUFBQztRQUN2QyxJQUFJLGNBQWMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQzNDLENBQUM7YUFBTSxJQUFJLGNBQWMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNyRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNoRCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFbkMsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ2hFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFFMUQsTUFBTSxJQUFJLGNBQWMsQ0FBQyxHQUFHLGNBQWMsSUFBSSxjQUFjLG9EQUFvRCxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ25KLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxHQUFHLEVBQUU7UUFDL0MsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM5QyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ2hELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ3JELENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDbEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFekMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxNQUFNLENBQUE7UUFFckQsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLFNBQVMsR0FBRyxFQUFFO1FBQzlDLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDOUMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNoRCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNyRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQTtZQUNsRCxNQUFNLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUV0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUVwRCxPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHFCQUFxQixDQUFDLEVBQUMsY0FBYyxFQUFDO1FBQ3BDLElBQUksY0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDM0MsQ0FBQzthQUFNLElBQUksY0FBYyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ2hELENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUNoRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBRTFELE1BQU0sSUFBSSxjQUFjLENBQUMsR0FBRyxjQUFjLElBQUksY0FBYyxvREFBb0QsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNuSixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxzQkFBc0IsQ0FBQyxJQUFJO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQTtRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFFRDs7O09BR0c7SUFDSCwyQkFBMkIsQ0FBQyxTQUFTO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNqQyxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFFbEUsS0FBSyxNQUFNLGdCQUFnQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLENBQUE7WUFDdEUsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUE7WUFFbEgsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQzNCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUE7Z0JBQ3JELE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFFM0YsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsZ0JBQWdCLFdBQVcsU0FBUyxXQUFXLGlCQUFpQixFQUFFLENBQUMsQ0FBQTtZQUNwSCxDQUFDO1lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtZQUV0RSxJQUFJLGdCQUFnQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsZ0JBQWdCLDBCQUEwQixDQUFDLENBQUE7WUFDaEUsQ0FBQztZQUVELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFBO1lBQ2hILENBQUM7WUFFRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFBO2dCQUNoRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFBO1lBQzdDLENBQUM7aUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFBO2dCQUM5QyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFBO2dCQUV6QyxLQUFLLE1BQU0sY0FBYyxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQzlDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUE7b0JBRWxFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDckQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDbEQsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUE7Z0JBRXBFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUssQ0FBQTtnQkFDakQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUM5QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQztDQUNyRixDQUFBO0FBRUQsZUFBZSxTQUFTLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCB7VmFsaWRhdGlvbkVycm9yc30gZnJvbSBcIi4vdmFsaWRhdGlvbi1lcnJvcnMuanNcIlxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBBdHRyaWJ1dGUgZnJvbSBcIi4vYmFzZS1tb2RlbC9hdHRyaWJ1dGUuanNcIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNvcnQtaW1wb3J0c1xuaW1wb3J0IEF0dHJpYnV0ZU5vdExvYWRlZEVycm9yIGZyb20gXCIuL2F0dHJpYnV0ZS1ub3QtbG9hZGVkLWVycm9yLmpzXCJcbmltcG9ydCBDYWNoZUtleUdlbmVyYXRvciBmcm9tIFwiLi9jYWNoZS1rZXktZ2VuZXJhdG9yLmpzXCJcbmltcG9ydCBDb2xsZWN0aW9uIGZyb20gXCIuL2NvbGxlY3Rpb24uanNcIlxuaW1wb3J0IENvbW1hbmRzUG9vbCBmcm9tIFwiLi9jb21tYW5kcy1wb29sLmpzXCJcbmltcG9ydCBDb25maWcgZnJvbSBcIi4vY29uZmlnLmpzXCJcbmltcG9ydCBDdXN0b21FcnJvciBmcm9tIFwiLi9jdXN0b20tZXJyb3IuanNcIlxuaW1wb3J0IEZvcm1EYXRhT2JqZWN0aXplciBmcm9tIFwiZm9ybS1kYXRhLW9iamVjdGl6ZXJcIlxuaW1wb3J0IE1vZGVsTmFtZSBmcm9tIFwiLi9tb2RlbC1uYW1lLmpzXCJcbmltcG9ydCBOb3RMb2FkZWRFcnJvciBmcm9tIFwiLi9ub3QtbG9hZGVkLWVycm9yLmpzXCJcbmltcG9ydCBSZWZsZWN0aW9uIGZyb20gXCIuL2Jhc2UtbW9kZWwvcmVmbGVjdGlvbi5qc1wiXG5pbXBvcnQgU2NvcGUgZnJvbSBcIi4vYmFzZS1tb2RlbC9zY29wZS5qc1wiXG5pbXBvcnQgU2VydmljZXMgZnJvbSBcIi4vc2VydmljZXMuanNcIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tIFwiLi92YWxpZGF0aW9uLWVycm9yLmpzXCJcbmltcG9ydCBvYmplY3RUb0Zvcm1EYXRhIGZyb20gXCJvYmplY3QtdG8tZm9ybWRhdGFcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1vZGVsQ2xhc3NEYXRhVHlwZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL2Jhc2UtbW9kZWwvYXR0cmlidXRlLmpzXCIpLkF0dHJpYnV0ZUFyZ1R5cGU+fSBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2FtZWxpemVkTG93ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGFzc05hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2xsZWN0aW9uS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sbGVjdGlvbk5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpMThuS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVEYXNoZXJpemVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFyYW1LZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbHVyYWxOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJpbWFyeUtleVxuICogQHByb3BlcnR5IHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gcmFuc2Fja2FibGVfYXNzb2NpYXRpb25zXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vYmFzZS1tb2RlbC9hdHRyaWJ1dGUuanNcIikuQXR0cmlidXRlQXJnVHlwZVtdfSByYW5zYWNrYWJsZV9hdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSByYW5zYWNrYWJsZV9zY29wZXNcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IHJlbGF0aW9uc2hpcHNcbiovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc1xuICogQHByb3BlcnR5IHtvYmplY3R9IFtmb3JtXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdGhyb3dWYWxpZGF0aW9uRXJyb3JdXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7bmV3ICguLi5hcmdzOiBBcnJheTxhbnk+KTogQmFzZU1vZGVsLCBhcGlNYWtlclR5cGU6IHN0cmluZ30gJiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSBCYXNlTW9kZWxDbGFzc1R5cGUgKi9cblxuY29uc3Qgb2JqZWN0VG9VbmRlcnNjb3JlID0gKG9iamVjdCkgPT4ge1xuICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIGNvbnN0IHVuZGVyc2NvcmVLZXkgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoa2V5KVxuXG4gICAgbmV3T2JqZWN0W3VuZGVyc2NvcmVLZXldID0gb2JqZWN0W2tleV1cbiAgfVxuXG4gIHJldHVybiBuZXdPYmplY3Rcbn1cblxuLyoqIEJhc2VNb2RlbC4gKi9cbi8qKiBAdHlwZSB7QmFzZU1vZGVsQ2xhc3NUeXBlfSAqL1xuY29uc3QgQmFzZU1vZGVsID0gY2xhc3MgQmFzZU1vZGVsIHtcbiAgc3RhdGljIGFwaU1ha2VyVHlwZSA9IFwiQmFzZU1vZGVsXCJcblxuICAvKiogQHJldHVybnMge0F0dHJpYnV0ZVtdfSAqL1xuICBzdGF0aWMgYXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXNcbiAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVLZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlRGF0YSA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlS2V5XVxuICAgICAgY29uc3QgYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGVEYXRhKVxuXG4gICAgICByZXN1bHQucHVzaChhdHRyaWJ1dGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBzdGF0aWMgaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwiYXR0cmlidXRlc1wiKVxuICAgIGNvbnN0IGxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcblxuICAgIGlmIChsb3dlckNhc2VBdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJmYWNlXG4gICAqIEByZXR1cm5zIHtNb2RlbENsYXNzRGF0YVR5cGV9XG4gICAqL1xuICBzdGF0aWMgbW9kZWxDbGFzc0RhdGEoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibW9kZWxDbGFzc0RhdGEgc2hvdWxkIGJlIG92ZXJyaWRlbiBieSBjaGlsZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmFsaWRhdGlvbkVycm9yc30gdmFsaWRhdGlvbkVycm9yc1xuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBzdGF0aWMgbmV3Q3VzdG9tRXZlbnQodmFsaWRhdGlvbkVycm9ycykge1xuICAgIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQoXCJ2YWxpZGF0aW9uLWVycm9yc1wiLCB7ZGV0YWlsOiB2YWxpZGF0aW9uRXJyb3JzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25FcnJvcnN9IHZhbGlkYXRpb25FcnJvcnNcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuZm9ybV1cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50aHJvd1ZhbGlkYXRpb25FcnJvcl1cbiAgICovXG4gIHN0YXRpYyBzZW5kVmFsaWRhdGlvbkVycm9yc0V2ZW50KHZhbGlkYXRpb25FcnJvcnMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZvcm0pIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gQmFzZU1vZGVsLm5ld0N1c3RvbUV2ZW50KHZhbGlkYXRpb25FcnJvcnMpXG4gICAgICBvcHRpb25zLmZvcm0uZGlzcGF0Y2hFdmVudChldmVudClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZChpZCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoe30pXG5cbiAgICBxdWVyeVtgJHt0aGlzLnByaW1hcnlLZXkoKX1fZXFgXSA9IGlkXG5cbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmFuc2FjayhxdWVyeSkuZmlyc3QoKVxuXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICByZXR1cm4gbW9kZWxcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEN1c3RvbUVycm9yKFwiUmVjb3JkIG5vdCBmb3VuZFwiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGZpbmRPckNyZWF0ZUJ5QXJnc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2FyZ3MuYWRkaXRpb25hbERhdGFdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZE9yQ3JlYXRlQnkoZmluZE9yQ3JlYXRlQnlBcmdzLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBTZXJ2aWNlcy5jdXJyZW50KCkuc2VuZFJlcXVlc3QoXCJNb2RlbHM6OkZpbmRPckNyZWF0ZUJ5XCIsIHtcbiAgICAgIGFkZGl0aW9uYWxfZGF0YTogYXJncy5hZGRpdGlvbmFsRGF0YSxcbiAgICAgIGZpbmRfb3JfY3JlYXRlX2J5X2FyZ3M6IGZpbmRPckNyZWF0ZUJ5QXJncyxcbiAgICAgIHJlc291cmNlX25hbWU6IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcbiAgICB9KVxuICAgIGNvbnN0IG1vZGVsID0gZGlnZyhyZXN1bHQsIFwibW9kZWxcIilcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtNb2RlbE5hbWV9ICovXG4gIHN0YXRpYyBtb2RlbE5hbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbE5hbWUoe21vZGVsQ2xhc3NEYXRhOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCl9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIHN0YXRpYyBwcmltYXJ5S2V5KCkge1xuICAgIHJldHVybiBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJwcmltYXJ5S2V5XCIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcXVlcnldXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdDxhbnk+fVxuICAgKi9cbiAgc3RhdGljIHJhbnNhY2socXVlcnkgPSB7fSkge1xuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih7bW9kZWxDbGFzczogdGhpc30sIHtyYW5zYWNrOiBxdWVyeX0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbc2VsZWN0XVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHQ8YW55Pn1cbiAgICovXG4gIHN0YXRpYyBzZWxlY3Qoc2VsZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMucmFuc2FjaygpLnNlbGVjdChzZWxlY3QpXG4gIH1cblxuICAvKiogQHJldHVybnMge1JlZmxlY3Rpb25bXX0gKi9cbiAgc3RhdGljIHJhbnNhY2thYmxlQXNzb2NpYXRpb25zKCkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyYW5zYWNrYWJsZV9hc3NvY2lhdGlvbnNcIilcbiAgICBjb25zdCByZWZsZWN0aW9ucyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcERhdGEgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgcmVmbGVjdGlvbnMucHVzaChuZXcgUmVmbGVjdGlvbihyZWxhdGlvbnNoaXBEYXRhKSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmbGVjdGlvbnNcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7QXR0cmlidXRlW119ICovXG4gIHN0YXRpYyByYW5zYWNrYWJsZUF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5yYW5zYWNrYWJsZV9hdHRyaWJ1dGVzXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlRGF0YSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICByZXN1bHQucHVzaChuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZURhdGEpKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7U2NvcGVbXX0gKi9cbiAgc3RhdGljIHJhbnNhY2thYmxlU2NvcGVzKCkge1xuICAgIGNvbnN0IHJhbnNhY2thYmxlU2NvcGVzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmFuc2Fja2FibGVfc2NvcGVzXCIpXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3Qgc2NvcGVEYXRhIG9mIHJhbnNhY2thYmxlU2NvcGVzKSB7XG4gICAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZShzY29wZURhdGEpXG5cbiAgICAgIHJlc3VsdC5wdXNoKHNjb3BlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVmbGVjdGlvbltdfSAqL1xuICBzdGF0aWMgcmVmbGVjdGlvbnMoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJlbGF0aW9uc2hpcHNcIilcbiAgICBjb25zdCByZWZsZWN0aW9ucyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcERhdGEgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVmbGVjdGlvbiA9IG5ldyBSZWZsZWN0aW9uKHJlbGF0aW9uc2hpcERhdGEpXG5cbiAgICAgIHJlZmxlY3Rpb25zLnB1c2gocmVmbGVjdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmbGVjdGlvbnNcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVmbGVjdGlvbn0gKi9cbiAgc3RhdGljIHJlZmxlY3Rpb24obmFtZSkge1xuICAgIGNvbnN0IGZvdW5kUmVmbGVjdGlvbiA9IHRoaXMucmVmbGVjdGlvbnMoKS5maW5kKChyZWZsZWN0aW9uKSA9PiByZWZsZWN0aW9uLm5hbWUoKSA9PSBuYW1lKVxuXG4gICAgaWYgKCFmb3VuZFJlZmxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHJlZmxlY3Rpb25OYW1lcyA9IHRoaXMucmVmbGVjdGlvbnMoKVxuICAgICAgICAubWFwKChyZWZsZWN0aW9uKSA9PiByZWZsZWN0aW9uLm5hbWUoKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggcmVmbGVjdGlvbjogJHtuYW1lfSBpbiAke3JlZmxlY3Rpb25OYW1lc31gKVxuICAgIH1cblxuICAgIHJldHVybiBmb3VuZFJlZmxlY3Rpb25cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBzdGF0aWMgX3Rva2VuKCkge1xuICAgIGNvbnN0IGNzcmZUb2tlbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcblxuICAgIGlmIChjc3JmVG9rZW5FbGVtZW50KSB7XG4gICAgICByZXR1cm4gY3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc11cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5pc05ld1JlY29yZF1cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmRhdGFdXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2FyZ3MuYV1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXJncy5iXVxuICAgKiBAcGFyYW0ge0NvbGxlY3Rpb248YW55Pn0gW2FyZ3MuY29sbGVjdGlvbl1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gICAgdGhpcy5uZXdSZWNvcmQgPSBhcmdzLmlzTmV3UmVjb3JkXG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUgPSB7fVxuICAgIHRoaXMucmVsYXRpb25zaGlwcyA9IHt9XG5cbiAgICBpZiAoYXJncyAmJiBhcmdzLmRhdGEgJiYgYXJncy5kYXRhLmEpIHtcbiAgICAgIHRoaXMuX3JlYWRNb2RlbERhdGFGcm9tQXJncyhhcmdzKVxuICAgIH0gZWxzZSBpZiAoYXJncy5hKSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IGFyZ3MuYiB8fCB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSBvYmplY3RUb1VuZGVyc2NvcmUoYXJncy5hKVxuICAgIH0gZWxzZSBpZiAoYXJncykge1xuICAgICAgdGhpcy5hYmlsaXRpZXMgPSB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSBvYmplY3RUb1VuZGVyc2NvcmUoYXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hYmlsaXRpZXMgPSB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG5ld0F0dHJpYnV0ZXNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NpZ25BdHRyaWJ1dGVzKG5ld0F0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdBdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld0F0dHJpYnV0ZXNba2V5XVxuICAgICAgY29uc3QgYXR0cmlidXRlVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShrZXkpXG5cbiAgICAgIGxldCBhcHBseUNoYW5nZSA9IHRydWVcbiAgICAgIGxldCBkZWxldGVDaGFuZ2UgPSBmYWxzZVxuXG4gICAgICBpZiAodGhpcy5pc0F0dHJpYnV0ZUxvYWRlZChrZXkpKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5yZWFkQXR0cmlidXRlKGtleSlcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZVVuZGVyc2NvcmVdXG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlID09IG9sZFZhbHVlKSB7XG4gICAgICAgICAgYXBwbHlDaGFuZ2UgPSBmYWxzZVxuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID09IG9yaWdpbmFsVmFsdWUpIHtcbiAgICAgICAgICBhcHBseUNoYW5nZSA9IGZhbHNlXG4gICAgICAgICAgZGVsZXRlQ2hhbmdlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhcHBseUNoYW5nZSkge1xuICAgICAgICB0aGlzLmNoYW5nZXNbYXR0cmlidXRlVW5kZXJzY29yZV0gPSBuZXdWYWx1ZVxuICAgICAgfSBlbHNlIGlmIChkZWxldGVDaGFuZ2UpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVVbmRlcnNjb3JlXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgYXR0cmlidXRlcygpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5tb2RlbERhdGFba2V5XVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY2hhbmdlcykge1xuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmNoYW5nZXNba2V5XVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ2l2ZW5BYmlsaXR5TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGNhbihnaXZlbkFiaWxpdHlOYW1lKSB7XG4gICAgY29uc3QgYWJpbGl0eU5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoZ2l2ZW5BYmlsaXR5TmFtZSlcblxuICAgIGlmICghKGFiaWxpdHlOYW1lIGluIHRoaXMuYWJpbGl0aWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBYmlsaXR5ICR7YWJpbGl0eU5hbWV9IGhhc24ndCBiZWVuIGxvYWRlZCBmb3IgJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWJpbGl0aWVzW2FiaWxpdHlOYW1lXVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtCYXNlTW9kZWx9ICovXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge25ldyAoLi4uYXJnczogYW55W10pID0+IEJhc2VNb2RlbH0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgY2xvbmUgPSBuZXcgTW9kZWxDbGFzcygpXG5cbiAgICBjbG9uZS5hYmlsaXRpZXMgPSB7Li4udGhpcy5hYmlsaXRpZXN9XG4gICAgY2xvbmUubW9kZWxEYXRhID0gey4uLnRoaXMubW9kZWxEYXRhfVxuICAgIGNsb25lLnJlbGF0aW9uc2hpcHMgPSB7Li4udGhpcy5yZWxhdGlvbnNoaXBzfVxuICAgIGNsb25lLnJlbGF0aW9uc2hpcHNDYWNoZSA9IHsuLi50aGlzLnJlbGF0aW9uc2hpcHNDYWNoZX1cblxuICAgIHJldHVybiBjbG9uZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXIgfCBzdHJpbmd9ICovXG4gIGNhY2hlS2V5KCkge1xuICAgIGlmICh0aGlzLmlzUGVyc2lzdGVkKCkpIHtcbiAgICAgIGNvbnN0IGtleVBhcnRzID0gW1xuICAgICAgICB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXksXG4gICAgICAgIHRoaXMucHJpbWFyeUtleSgpXG4gICAgICBdXG5cbiAgICAgIGlmIChcInVwZGF0ZWRfYXRcIiBpbiB0aGlzLm1vZGVsRGF0YSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRBdCA9IHRoaXMudXBkYXRlZEF0KClcblxuICAgICAgICBpZiAodHlwZW9mIHVwZGF0ZWRBdCAhPSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVkQXQgd2Fzbid0IGFuIG9iamVjdDogJHt0eXBlb2YgdXBkYXRlZEF0fWApXG4gICAgICAgIH0gZWxzZSBpZiAoIShcImdldFRpbWVcIiBpbiB1cGRhdGVkQXQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVkQXQgZGlkbid0IHN1cHBvcnQgZ2V0VGltZSB3aXRoIGNsYXNzOiAke3VwZGF0ZWRBdC5jb25zdHJ1Y3RvciAmJiB1cGRhdGVkQXQuY29uc3RydWN0b3IubmFtZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBrZXlQYXJ0cy5wdXNoKGB1cGRhdGVkQXQtJHt0aGlzLnVwZGF0ZWRBdCgpLmdldFRpbWUoKX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5UGFydHMuam9pbihcIi1cIilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudW5pcXVlS2V5KClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgbG9jYWxDYWNoZUtleSgpIHtcbiAgICBjb25zdCBjYWNoZUtleUdlbmVyYXRvciA9IG5ldyBDYWNoZUtleUdlbmVyYXRvcih0aGlzKVxuXG4gICAgcmV0dXJuIGNhY2hlS2V5R2VuZXJhdG9yLmxvY2FsKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBmdWxsQ2FjaGVLZXkoKSB7XG4gICAgY29uc3QgY2FjaGVLZXlHZW5lcmF0b3IgPSBuZXcgQ2FjaGVLZXlHZW5lcmF0b3IodGhpcylcblxuICAgIHJldHVybiBjYWNoZUtleUdlbmVyYXRvci5jYWNoZUtleSgpXG4gIH1cblxuICAvKiogQHJldHVybnMge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0PGFueT59ICovXG4gIHN0YXRpYyBhbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuc2FjaygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXR0cmlidXRlc11cbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7XG4gICAqICAgbW9kZWw6IEJhc2VNb2RlbCxcbiAgICogICByZXNwb25zZTogb2JqZWN0XG4gICAqIH0+fVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgICBpZiAoYXR0cmlidXRlcykgdGhpcy5hc3NpZ25BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpXG4gICAgY29uc3QgcGFyYW1LZXkgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXlcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmdldEF0dHJpYnV0ZXMoKVxuICAgIGNvbnN0IGRhdGFUb1VzZSA9IHt9XG4gICAgZGF0YVRvVXNlW3BhcmFtS2V5XSA9IG1vZGVsRGF0YVxuICAgIGxldCByZXNwb25zZVxuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICAgIHtcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBzYXZlOiBkYXRhVG9Vc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxGcm9tUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgIH1cblxuICAgIHJldHVybiB7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGEgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSByYXdEYXRhXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVJhdyhyYXdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBvYmplY3REYXRhID0gQmFzZU1vZGVsLl9vYmplY3REYXRhRnJvbUdpdmVuUmF3RGF0YShyYXdEYXRhLCBvcHRpb25zKVxuXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx7bW9kZWw6IEJhc2VNb2RlbCwgcmVzcG9uc2U6IG9iamVjdH0+fSAqL1xuICBhc3luYyBkZXN0cm95KCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICB7XG4gICAgICAgIGFyZ3M6IHtxdWVyeV9wYXJhbXM6IHRoaXMuY29sbGVjdGlvbiAmJiB0aGlzLmNvbGxlY3Rpb24ucGFyYW1zKCl9LFxuICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LWRlc3Ryb3lgLFxuICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgdHlwZTogXCJkZXN0cm95XCJcbiAgICAgIH0sXG4gICAgICB7fVxuICAgIClcblxuICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICBpZiAocmVzcG9uc2UubW9kZWwpIHtcbiAgICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHttb2RlbDogdGhpcywgcmVzcG9uc2V9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbGlzdE9mQWJpbGl0aWVzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlQWJpbGl0aWVzKGxpc3RPZkFiaWxpdGllcykge1xuICAgIC8vIFBvcHVsYXRlIGFuIGFycmF5IHdpdGggYSBsaXN0IG9mIGFiaWxpdGllcyBjdXJyZW50bHkgbm90IGxvYWRlZFxuICAgIGNvbnN0IGFiaWxpdGllc1RvTG9hZCA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGFiaWxpdHlJbkxpc3Qgb2YgbGlzdE9mQWJpbGl0aWVzKSB7XG4gICAgICBpZiAoIShhYmlsaXR5SW5MaXN0IGluIHRoaXMuYWJpbGl0aWVzKSkge1xuICAgICAgICBhYmlsaXRpZXNUb0xvYWQucHVzaChhYmlsaXR5SW5MaXN0KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgdGhlIG1pc3NpbmcgYWJpbGl0aWVzIGlmIGFueVxuICAgIGlmIChhYmlsaXRpZXNUb0xvYWQubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcHJpbWFyeUtleU5hbWUgPSB0aGlzLm1vZGVsQ2xhc3MoKS5wcmltYXJ5S2V5KClcbiAgICAgIGNvbnN0IHJhbnNhY2tQYXJhbXMgPSB7fVxuICAgICAgcmFuc2Fja1BhcmFtc1tgJHtwcmltYXJ5S2V5TmFtZX1fZXFgXSA9IHRoaXMucHJpbWFyeUtleSgpXG5cbiAgICAgIGNvbnN0IGFiaWxpdGllc1BhcmFtcyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSAqLyAoe30pXG4gICAgICBhYmlsaXRpZXNQYXJhbXNbZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKV0gPSBhYmlsaXRpZXNUb0xvYWRcblxuICAgICAgY29uc3QgYW5vdGhlck1vZGVsID0gYXdhaXQgdGhpcy5tb2RlbENsYXNzKClcbiAgICAgICAgLnJhbnNhY2socmFuc2Fja1BhcmFtcylcbiAgICAgICAgLmFiaWxpdGllcyhhYmlsaXRpZXNQYXJhbXMpXG4gICAgICAgIC5maXJzdCgpXG5cbiAgICAgIGlmICghYW5vdGhlck1vZGVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvb2sgdXAgdGhlIHNhbWUgbW9kZWwgJHt0aGlzLnByaW1hcnlLZXkoKX0gd2l0aCBhYmlsaXRpZXM6ICR7YWJpbGl0aWVzVG9Mb2FkLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdBYmlsaXRpZXMgPSBhbm90aGVyTW9kZWwuYWJpbGl0aWVzXG4gICAgICBmb3IgKGNvbnN0IG5ld0FiaWxpdHkgaW4gbmV3QWJpbGl0aWVzKSB7XG4gICAgICAgIHRoaXMuYWJpbGl0aWVzW25ld0FiaWxpdHldID0gbmV3QWJpbGl0aWVzW25ld0FiaWxpdHldXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICBnZXRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRoaXMubW9kZWxEYXRhLCB0aGlzLmNoYW5nZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlXG4gICAqIEByZXR1cm5zIHtuZXZlcn1cbiAgICovXG4gIGhhbmRsZVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfSlcbiAgICB0aHJvdyBuZXcgQ3VzdG9tRXJyb3IoXCJSZXNwb25zZSB3YXNuJ3Qgc3VjY2Vzc2Z1bFwiLCB7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyIHwgc3RyaW5nfSAqL1xuICBpZGVudGlmaWVyS2V5KCkge1xuICAgIGlmICghdGhpcy5faWRlbnRpZmllcktleSkgdGhpcy5faWRlbnRpZmllcktleSA9IHRoaXMuaXNQZXJzaXN0ZWQoKSA/IHRoaXMucHJpbWFyeUtleSgpIDogdGhpcy51bmlxdWVLZXkoKVxuXG4gICAgcmV0dXJuIHRoaXMuX2lkZW50aWZpZXJLZXlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXNzb2NpYXRpb25OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBc3NvY2lhdGlvbkxvYWRlZChhc3NvY2lhdGlvbk5hbWUpIHsgcmV0dXJuIHRoaXMuaXNBc3NvY2lhdGlvbkxvYWRlZFVuZGVyc2NvcmUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGFzc29jaWF0aW9uTmFtZSkpIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0Fzc29jaWF0aW9uTG9hZGVkVW5kZXJzY29yZSAoYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSkge1xuICAgIGlmIChhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSByZXR1cm4gdHJ1ZVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhc3NvY2lhdGlvbk5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0Fzc29jaWF0aW9uUHJlc2VudChhc3NvY2lhdGlvbk5hbWUpIHtcbiAgICBpZiAodGhpcy5pc0Fzc29jaWF0aW9uTG9hZGVkKGFzc29jaWF0aW9uTmFtZSkpIHJldHVybiB0cnVlXG4gICAgaWYgKGFzc29jaWF0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFzc29jaWF0aW9uTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlQXNzb2NpYXRpb25Mb2FkZWQoYXNzb2NpYXRpb25OYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlKGluZmxlY3Rpb24udW5kZXJzY29yZShhc3NvY2lhdGlvbk5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBlbnN1cmVBc3NvY2lhdGlvbkxvYWRlZFVuZGVyc2NvcmUoYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSkge1xuICAgIGNvbnN0IHJlZmxlY3Rpb24gPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucmVsYXRpb25zaGlwcy5maW5kKChyZWxhdGlvbnNoaXApID0+IHJlbGF0aW9uc2hpcC5uYW1lID09IGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmUpXG5cbiAgICBpZiAoIXJlZmxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcE5hbWVzID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnJlbGF0aW9uc2hpcHMubWFwKChyZWxhdGlvbnNoaXApID0+IHJlbGF0aW9uc2hpcC5uYW1lKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHRoZSByZWxhdGlvbiAke2Fzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmV9IG9uICR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLm5hbWV9OiAke3JlbGF0aW9uc2hpcE5hbWVzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmUsIHRydWUpXG4gICAgY29uc3QgbG9hZE1ldGhvZE5hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGBsb2FkXyR7YXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZX1gLCB0cnVlKVxuXG4gICAgaWYgKCEobWV0aG9kTmFtZSBpbiB0aGlzKSkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGFzc29jaWF0aW9uIG1ldGhvZCBvbiAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5uYW1lfTogJHttZXRob2ROYW1lfWApXG4gICAgaWYgKCEobG9hZE1ldGhvZE5hbWUgaW4gdGhpcykpIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBhc3NvY2lhdGlvbiBsb2FkIG1ldGhvZCBvbiAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5uYW1lfTogJHtsb2FkTWV0aG9kTmFtZX1gKVxuXG4gICAgaWYgKHRoaXMuaXNBc3NvY2lhdGlvbkxvYWRlZFVuZGVyc2NvcmUoYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSkpIHtcbiAgICAgIGNvbnN0IGxvYWRlZEFzc29jaWF0aW9uID0gdGhpc1ttZXRob2ROYW1lXSgpXG5cbiAgICAgIGlmIChyZWZsZWN0aW9uLm1hY3JvID09IFwiaGFzX21hbnlcIikge1xuICAgICAgICByZXR1cm4gbG9hZGVkQXNzb2NpYXRpb24ubG9hZGVkKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvYWRlZEFzc29jaWF0aW9uXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNbbG9hZE1ldGhvZE5hbWVdKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge2FueX0gYXJncy5lcnJvclxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbH0gW2FyZ3MubW9kZWxdXG4gICAqIEBwYXJhbSB7UGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc30gYXJncy5vcHRpb25zXG4gICAqL1xuICBzdGF0aWMgcGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWwsIG9wdGlvbnN9KSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSByZXR1cm5cbiAgICBpZiAoIWVycm9yLmFyZ3MucmVzcG9uc2UudmFsaWRhdGlvbl9lcnJvcnMpIHJldHVyblxuXG4gICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IG5ldyBWYWxpZGF0aW9uRXJyb3JzKHtcbiAgICAgIG1vZGVsLFxuICAgICAgdmFsaWRhdGlvbkVycm9yczogZGlnZyhlcnJvciwgXCJhcmdzXCIsIFwicmVzcG9uc2VcIiwgXCJ2YWxpZGF0aW9uX2Vycm9yc1wiKVxuICAgIH0pXG5cbiAgICBCYXNlTW9kZWwuc2VuZFZhbGlkYXRpb25FcnJvcnNFdmVudCh2YWxpZGF0aW9uRXJyb3JzLCBvcHRpb25zKVxuXG4gICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudGhyb3dWYWxpZGF0aW9uRXJyb3IgIT0gZmFsc2UpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgaHVtYW5BdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBrZXlOYW1lID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwiaTE4bktleVwiKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGNvbnN0IGkxOG4gPSBDb25maWcuZ2V0STE4bigpXG5cbiAgICBpZiAoaTE4bikgcmV0dXJuIGkxOG4udChgYWN0aXZlcmVjb3JkLmF0dHJpYnV0ZXMuJHtrZXlOYW1lfS4ke0Jhc2VNb2RlbC5zbmFrZUNhc2UoYXR0cmlidXRlTmFtZSl9YCwge2RlZmF1bHRWYWx1ZTogYXR0cmlidXRlTmFtZX0pXG5cbiAgICByZXR1cm4gaW5mbGVjdGlvbi5odW1hbml6ZShhdHRyaWJ1dGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBdHRyaWJ1dGVDaGFuZ2VkKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzKVxuICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEgPSBhdHRyaWJ1dGVzLmZpbmQoKGF0dHJpYnV0ZSkgPT4gZGlnZyhhdHRyaWJ1dGUsIFwibmFtZVwiKSA9PSBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSlcblxuICAgIGlmICghYXR0cmlidXRlRGF0YSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSBhdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBkaWdnKGF0dHJpYnV0ZSwgXCJuYW1lXCIpKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZTogXCIke2F0dHJpYnV0ZU5hbWV9XCIgaW46ICR7YXR0cmlidXRlTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKCEoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5jaGFuZ2VzKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kID0gdGhpc1tgX2lzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZURhdGEudHlwZSwgdHJ1ZSl9Q2hhbmdlZGBdXG5cbiAgICBpZiAoIWNoYW5nZWRNZXRob2QpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0eXBlOiAke2F0dHJpYnV0ZURhdGEudHlwZX1gKVxuXG4gICAgcmV0dXJuIGNoYW5nZWRNZXRob2Qob2xkVmFsdWUsIG5ld1ZhbHVlKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBpc0NoYW5nZWQoKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuY2hhbmdlcylcblxuICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNOZXdSZWNvcmQoKSB7XG4gICAgaWYgKHRoaXMubmV3UmVjb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5ld1JlY29yZFxuICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHRoaXMubW9kZWxEYXRhICYmIHRoaXMubW9kZWxEYXRhLmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGlzUGVyc2lzdGVkKCkgeyByZXR1cm4gIXRoaXMuaXNOZXdSZWNvcmQoKSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBzbmFrZUNhc2Uoc3RyaW5nKSB7IHJldHVybiBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoc3RyaW5nKSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2F2ZWRDaGFuZ2VUb0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgaWYgKCF0aGlzLnByZXZpb3VzTW9kZWxEYXRhKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzKVxuICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEgPSBhdHRyaWJ1dGVzLmZpbmQoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUgPT0gYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUpXG5cbiAgICBpZiAoIWF0dHJpYnV0ZURhdGEpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZTogXCIke2F0dHJpYnV0ZU5hbWV9XCIgaW46ICR7YXR0cmlidXRlTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKCEoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5wcmV2aW91c01vZGVsRGF0YSkpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnByZXZpb3VzTW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlXVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5tb2RlbERhdGFbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgY2hhbmdlZE1ldGhvZE5hbWUgPSBgX2lzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZURhdGEudHlwZSl9Q2hhbmdlZGBcbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kID0gdGhpc1tjaGFuZ2VkTWV0aG9kTmFtZV1cblxuICAgIGlmICghY2hhbmdlZE1ldGhvZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHR5cGU6ICR7YXR0cmlidXRlRGF0YS50eXBlfWApXG5cbiAgICByZXR1cm4gY2hhbmdlZE1ldGhvZChvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCYXNlTW9kZWx9IG1vZGVsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TmV3TW9kZWwobW9kZWwpIHtcbiAgICB0aGlzLnNldE5ld01vZGVsRGF0YShtb2RlbClcblxuICAgIGZvcihjb25zdCByZWxhdGlvbnNoaXBOYW1lIGluIG1vZGVsLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG1vZGVsLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cbiAgICB9XG5cbiAgICBmb3IoY29uc3QgcmVsYXRpb25zaGlwQ2FjaGVOYW1lIGluIG1vZGVsLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwQ2FjaGVOYW1lXSA9IG1vZGVsLnJlbGF0aW9uc2hpcHNDYWNoZVtuYW1lXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbH0gbW9kZWxcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXROZXdNb2RlbERhdGEobW9kZWwpIHtcbiAgICBpZiAoIShcIm1vZGVsRGF0YVwiIGluIG1vZGVsKSkgdGhyb3cgbmV3IEVycm9yKGBObyBtb2RlbERhdGEgaW4gbW9kZWw6ICR7SlNPTi5zdHJpbmdpZnkobW9kZWwpfWApXG5cbiAgICB0aGlzLnByZXZpb3VzTW9kZWxEYXRhID0gey4uLmRpZ2codGhpcywgXCJtb2RlbERhdGFcIil9XG5cbiAgICBmb3IoY29uc3QgYXR0cmlidXRlTmFtZSBpbiBtb2RlbC5tb2RlbERhdGEpIHtcbiAgICAgIHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdID0gbW9kZWwubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvbGRWYWx1ZVxuICAgKiBAcGFyYW0ge2FueX0gbmV3VmFsdWVcbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCB2b2lkfVxuICAgKi9cbiAgX2lzRGF0ZUNoYW5nZWQob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgaWYgKERhdGUucGFyc2Uob2xkVmFsdWUpICE9IERhdGUucGFyc2UobmV3VmFsdWUpKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb2xkVmFsdWVcbiAgICogQHBhcmFtIHthbnl9IG5ld1ZhbHVlXG4gICAqIEByZXR1cm5zIHtib29sZWFuIHwgdm9pZH1cbiAgICovXG4gIF9pc0ludGVnZXJDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgIGlmIChwYXJzZUludChvbGRWYWx1ZSwgMTApICE9IHBhcnNlSW50KG5ld1ZhbHVlLCAxMCkpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvbGRWYWx1ZVxuICAgKiBAcGFyYW0ge2FueX0gbmV3VmFsdWVcbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCB2b2lkfVxuICAgKi9cbiAgX2lzU3RyaW5nQ2hhbmdlZCAob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgY29uc3Qgb2xkQ29udmVydGVkVmFsdWUgPSBgJHtvbGRWYWx1ZX1gXG4gICAgY29uc3QgbmV3Q29udmVydGVkVmFsdWUgPSBgJHtuZXdWYWx1ZX1gXG5cbiAgICBpZiAob2xkQ29udmVydGVkVmFsdWUgIT0gbmV3Q29udmVydGVkVmFsdWUpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtNb2RlbENsYXNzRGF0YVR5cGV9ICovXG4gIG1vZGVsQ2xhc3NEYXRhKCkgeyByZXR1cm4gdGhpcy5tb2RlbENsYXNzKCkubW9kZWxDbGFzc0RhdGEoKSB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyByZWxvYWQoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKVxuICAgIGNvbnN0IHJhbnNhY2tQYXJhbXMgPSB7fVxuICAgIHJhbnNhY2tQYXJhbXNbYCR7dGhpcy5tb2RlbENsYXNzKCkucHJpbWFyeUtleSgpfV9lcWBdID0gdGhpcy5wcmltYXJ5S2V5KClcblxuICAgIGxldCBxdWVyeSA9IHRoaXMubW9kZWxDbGFzcygpLnJhbnNhY2socmFuc2Fja1BhcmFtcylcblxuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGlmIChwYXJhbXMucHJlbG9hZCkge1xuICAgICAgICBxdWVyeS5xdWVyeUFyZ3MucHJlbG9hZCA9IHBhcmFtcy5wcmVsb2FkXG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMuc2VsZWN0KSB7XG4gICAgICAgIHF1ZXJ5LnF1ZXJ5QXJncy5zZWxlY3QgPSBwYXJhbXMuc2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMuc2VsZWN0X2NvbHVtbnMpIHtcbiAgICAgICAgcXVlcnkucXVlcnlBcmdzLnNlbGVjdENvbHVtbnMgPSBwYXJhbXMuc2VsZWN0X2NvbHVtbnNcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHF1ZXJ5LmZpcnN0KClcbiAgICB0aGlzLnNldE5ld01vZGVsKG1vZGVsKVxuICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8e21vZGVsOiBCYXNlTW9kZWwsIHJlc3BvbnNlPzogb2JqZWN0fT59ICovXG4gIHNhdmUoKSB7XG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8e21vZGVsOiBCYXNlTW9kZWwsIHJlc3BvbnNlOiBvYmplY3R9Pn0gKi9cbiAgc2F2ZVJhdyhyYXdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVSYXcocmF3RGF0YSwgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW25ld0F0dHJpYnV0ZXNdXG4gICAqIEBwYXJhbSB7UGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc30gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtcbiAgICogICBtb2RlbDogQmFzZU1vZGVsLFxuICAgKiAgIHJlc3BvbnNlPzogb2JqZWN0XG4gICAqIH0+fVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKG5ld0F0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgICBpZiAobmV3QXR0cmlidXRlcykge1xuICAgICAgdGhpcy5hc3NpZ25BdHRyaWJ1dGVzKG5ld0F0dHJpYnV0ZXMpXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY2hhbmdlcykubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiB7bW9kZWw6IHRoaXN9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1LZXkgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXlcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmNoYW5nZXNcbiAgICBjb25zdCBkYXRhVG9Vc2UgPSB7fVxuICAgIGRhdGFUb1VzZVtwYXJhbUtleV0gPSBtb2RlbERhdGFcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgcXVlcnlfcGFyYW1zOiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpLFxuICAgICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LXVwZGF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICBpZiAocmVzcG9uc2UubW9kZWwpIHtcbiAgICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge3Jlc3BvbnNlLCBtb2RlbDogdGhpc31cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlc3BvbnNlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgbGV0IG5ld01vZGVsID0gZGlnZyhyZXNwb25zZSwgXCJtb2RlbFwiKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3TW9kZWwpKSBuZXdNb2RlbCA9IG5ld01vZGVsWzBdXG5cbiAgICB0aGlzLnNldE5ld01vZGVsKG5ld01vZGVsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgbGV0IG5ld01vZGVsID0gZGlnZyhyZXNwb25zZSwgXCJtb2RlbFwiKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3TW9kZWwpKSBuZXdNb2RlbCA9IG5ld01vZGVsWzBdXG5cbiAgICB0aGlzLnNldE5ld01vZGVsRGF0YShuZXdNb2RlbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhIHwgUmVjb3JkPHN0cmluZywgYW55Pn0gcmF3RGF0YVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn1cbiAgICovXG4gIHN0YXRpYyBfb2JqZWN0RGF0YUZyb21HaXZlblJhd0RhdGEocmF3RGF0YSwgb3B0aW9ucykge1xuICAgIGlmIChyYXdEYXRhIGluc3RhbmNlb2YgRm9ybURhdGEgfHwgcmF3RGF0YS5ub2RlTmFtZSA9PSBcIkZPUk1cIikge1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBGb3JtRGF0YU9iamVjdGl6ZXIuZm9ybURhdGFGcm9tT2JqZWN0KHJhd0RhdGEsIG9wdGlvbnMpXG5cbiAgICAgIHJldHVybiBGb3JtRGF0YU9iamVjdGl6ZXIudG9PYmplY3QoZm9ybURhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJhd0RhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhIHwgUmVjb3JkPHN0cmluZywgYW55Pn0gcmF3RGF0YVxuICAgKiBAcGFyYW0ge1BhcnNlVmFsaWRhdGlvbkVycm9yc09wdGlvbnMgJiB7c2ltcGxlTW9kZWxFcnJvcnM/OiBib29sZWFufX0gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtyZXNwb25zZTogb2JqZWN0LCBtb2RlbDogQmFzZU1vZGVsfT59XG4gICAqL1xuICBhc3luYyB1cGRhdGVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgb2JqZWN0RGF0YSA9IEJhc2VNb2RlbC5fb2JqZWN0RGF0YUZyb21HaXZlblJhd0RhdGEocmF3RGF0YSwgb3B0aW9ucylcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgcXVlcnlfcGFyYW1zOiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpLFxuICAgICAgICAgICAgc2F2ZTogb2JqZWN0RGF0YSxcbiAgICAgICAgICAgIHNpbXBsZV9tb2RlbF9lcnJvcnM6IG9wdGlvbnM/LnNpbXBsZU1vZGVsRXJyb3JzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LXVwZGF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge3Jlc3BvbnNlLCBtb2RlbDogdGhpc31cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bmV2ZXJ9ICovXG4gIGlzVmFsaWQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkIHlldFwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHt2YWxpZDogYm9vbGVhbiwgZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fT59ICovXG4gIGFzeW5jIGlzVmFsaWRPblNlcnZlcigpIHtcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmdldEF0dHJpYnV0ZXMoKVxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgZGF0YVRvVXNlID0ge31cbiAgICBkYXRhVG9Vc2VbcGFyYW1LZXldID0gbW9kZWxEYXRhXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAge1xuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgIH0sXG4gICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tdmFsaWRgLFxuICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgdHlwZTogXCJ2YWxpZFwiXG4gICAgICB9LFxuICAgICAge31cbiAgICApXG5cbiAgICByZXR1cm4ge3ZhbGlkOiByZXNwb25zZS52YWxpZCwgZXJyb3JzOiByZXNwb25zZS5lcnJvcnN9XG4gIH1cblxuICAvKiogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gIG1vZGVsQ2xhc3MoKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWVcbiAgICogQHBhcmFtIHtCYXNlTW9kZWwgfCBCYXNlTW9kZWxbXSB8IG51bGx9IG1vZGVsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHJlbG9hZFJlbGF0aW9uc2hpcChyZWxhdGlvbnNoaXBOYW1lLCBtb2RlbCkge1xuICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW0Jhc2VNb2RlbC5zbmFrZUNhc2UocmVsYXRpb25zaGlwTmFtZSldID0gbW9kZWxcbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNbQmFzZU1vZGVsLnNuYWtlQ2FzZShyZWxhdGlvbnNoaXBOYW1lKV0gPSBtb2RlbFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBtYXJrRm9yRGVzdHJ1Y3Rpb24oKSB7XG4gICAgdGhpcy5fbWFya2VkRm9yRGVzdHJ1Y3Rpb24gPSB0cnVlXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIG1hcmtlZEZvckRlc3RydWN0aW9uKCkgeyByZXR1cm4gdGhpcy5fbWFya2VkRm9yRGVzdHJ1Y3Rpb24gfHwgZmFsc2UgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICB1bmlxdWVLZXkoKSB7XG4gICAgaWYgKCF0aGlzLnVuaXF1ZUtleVZhbHVlKSB7XG4gICAgICBjb25zdCBtaW4gPSA1MDAwMDAwMDAwMDAwMDAwXG4gICAgICBjb25zdCBtYXggPSA5MDA3MTk5MjU0NzQwOTkxXG4gICAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbiArIDFcbiAgICAgIHRoaXMudW5pcXVlS2V5VmFsdWUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiByYW5nZSkgKyBtaW5cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51bmlxdWVLZXlWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e2FyZ3M6IGFueX19IGFyZ3NcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb21tYW5kQXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIF9jYWxsQ29sbGVjdGlvbkNvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpIHtcbiAgICBjb25zdCBmb3JtT3JEYXRhT2JqZWN0ID0gYXJncy5hcmdzXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKGFyZ3MsIGNvbW1hbmRBcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsZXQgZm9ybVxuXG4gICAgICBpZiAoY29tbWFuZEFyZ3MuZm9ybSkge1xuICAgICAgICBmb3JtID0gY29tbWFuZEFyZ3MuZm9ybVxuICAgICAgfSBlbHNlIGlmIChmb3JtT3JEYXRhT2JqZWN0Py5ub2RlTmFtZSA9PSBcIkZPUk1cIikge1xuICAgICAgICBmb3JtID0gZm9ybU9yRGF0YU9iamVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybSkgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG9wdGlvbnM6IHtmb3JtfX0pXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJnc1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbW1hbmRBcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59XG4gICAqL1xuICBfY2FsbE1lbWJlckNvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpIHtcbiAgICByZXR1cm4gQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YSB8IFJlY29yZDxzdHJpbmcsIGFueT59IFthcmdzXVxuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gICAqL1xuICBzdGF0aWMgX3Bvc3REYXRhRnJvbUFyZ3MoYXJncykge1xuICAgIGxldCBwb3N0RGF0YVxuXG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgIGlmIChhcmdzIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgcG9zdERhdGEgPSBhcmdzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3N0RGF0YSA9IG9iamVjdFRvRm9ybURhdGEuc2VyaWFsaXplKGFyZ3MsIHt9LCBudWxsLCBcImFyZ3NcIilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcG9zdERhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIH1cblxuICAgIHJldHVybiBwb3N0RGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICByZWFkQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgcmV0dXJuIHRoaXMucmVhZEF0dHJpYnV0ZVVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBpZiAoYXR0cmlidXRlTmFtZSBpbiB0aGlzLmNoYW5nZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZXNbYXR0cmlidXRlTmFtZV1cbiAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGlzIGlzIGEgbmV3IHJlY29yZCBhbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGEgcmVjb2duaXplZCBhdHRyaWJ1dGVcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJhdHRyaWJ1dGVzXCIpXG5cbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNQZXJzaXN0ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZU5vdExvYWRlZEVycm9yKGBObyBzdWNoIGF0dHJpYnV0ZTogJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfSMke2F0dHJpYnV0ZU5hbWV9OiAke0pTT04uc3RyaW5naWZ5KHRoaXMubW9kZWxEYXRhKX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNBdHRyaWJ1dGVMb2FkZWQoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICBpZiAoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5jaGFuZ2VzKSByZXR1cm4gdHJ1ZVxuICAgIGlmIChhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSBpbiB0aGlzLm1vZGVsRGF0YSkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBfaXNQcmVzZW50KHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5tYXRjaCgvXlxccyokLykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPGFueT59IGFyZ3NcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuUXVlcnlBcmdzVHlwZX0gcXVlcnlBcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueSB8IG51bGw+fVxuICAgKi9cbiAgYXN5bmMgX2xvYWRCZWxvbmdzVG9SZWZsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncyA9IHt9KSB7XG4gICAgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncylcbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgY29sbGVjdGlvbi5maXJzdCgpXG4gICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXSA9IG1vZGVsXG4gICAgICByZXR1cm4gbW9kZWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHt7bW9kZWxDbGFzczogYW55LCByZWZsZWN0aW9uTmFtZTogc3RyaW5nfX0gYXJnc1xuICAgKiBAcmV0dXJucyB7YW55IHwgbnVsbH1cbiAgICovXG4gIF9yZWFkQmVsb25nc1RvUmVmbGVjdGlvbih7cmVmbGVjdGlvbk5hbWV9KSB7XG4gICAgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1tyZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVmbGVjdGlvbk5hbWVdXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGxvYWRlZFJlbGF0aW9uc2hpcHMgPSBPYmplY3Qua2V5cyh0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSlcbiAgICBjb25zdCBtb2RlbENsYXNzTmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcblxuICAgIHRocm93IG5ldyBOb3RMb2FkZWRFcnJvcihgJHttb2RlbENsYXNzTmFtZX0jJHtyZWZsZWN0aW9uTmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIHlldC4gT25seSB0aGVzZSB3ZXJlIGxvYWRlZDogJHtsb2FkZWRSZWxhdGlvbnNoaXBzLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLkNvbGxlY3Rpb25BcmdzVHlwZTxhbnk+fSBhcmdzXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLlF1ZXJ5QXJnc1R5cGV9IHF1ZXJ5QXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxhbnk+Pn1cbiAgICovXG4gIGFzeW5jIF9sb2FkSGFzTWFueVJlZmxlY3Rpb24oYXJncywgcXVlcnlBcmdzID0ge30pIHtcbiAgICBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH1cblxuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MpXG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgY29sbGVjdGlvbi50b0FycmF5KClcblxuICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxzXG5cbiAgICByZXR1cm4gbW9kZWxzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPGFueT59IGFyZ3NcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuUXVlcnlBcmdzVHlwZX0gcXVlcnlBcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBfbG9hZEhhc09uZVJlZmxlY3Rpb24oYXJncywgcXVlcnlBcmdzID0ge30pIHtcbiAgICBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IENvbGxlY3Rpb24oYXJncywgcXVlcnlBcmdzKVxuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCBjb2xsZWN0aW9uLmZpcnN0KClcblxuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0gPSBtb2RlbFxuXG4gICAgICByZXR1cm4gbW9kZWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHt7bW9kZWxDbGFzczogYW55LCByZWZsZWN0aW9uTmFtZTogc3RyaW5nfX0gYXJnc1xuICAgKiBAcmV0dXJucyB7YW55IHwgbnVsbH1cbiAgICovXG4gIF9yZWFkSGFzT25lUmVmbGVjdGlvbih7cmVmbGVjdGlvbk5hbWV9KSB7XG4gICAgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1tyZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVmbGVjdGlvbk5hbWVdXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkZWRSZWxhdGlvbnNoaXBzID0gT2JqZWN0LmtleXModGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpXG4gICAgY29uc3QgbW9kZWxDbGFzc05hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG5cbiAgICB0aHJvdyBuZXcgTm90TG9hZGVkRXJyb3IoYCR7bW9kZWxDbGFzc05hbWV9IyR7cmVmbGVjdGlvbk5hbWV9IGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQuIE9ubHkgdGhlc2Ugd2VyZSBsb2FkZWQ6ICR7bG9hZGVkUmVsYXRpb25zaGlwcy5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5kYXRhXVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFthcmdzLmRhdGEuYl1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXJncy5kYXRhLmFdXG4gICAqIEBwYXJhbSB7YW55fSBbYXJncy5kYXRhLnJdXG4gICAqIEBwYXJhbSB7Q29sbGVjdGlvbjxhbnk+fSBbYXJncy5jb2xsZWN0aW9uXVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZWFkTW9kZWxEYXRhRnJvbUFyZ3MoYXJncykge1xuICAgIHRoaXMuYWJpbGl0aWVzID0gYXJncy5kYXRhLmIgfHwge31cbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBhcmdzLmNvbGxlY3Rpb25cbiAgICB0aGlzLm1vZGVsRGF0YSA9IG9iamVjdFRvVW5kZXJzY29yZShhcmdzLmRhdGEuYSlcbiAgICB0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMgPSBhcmdzLmRhdGEuclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e2dldE1vZGVsOiAocmVsYXRpb25zaGlwVHlwZTogc3RyaW5nLCByZWxhdGlvbnNoaXBJZDogbnVtYmVyIHwgc3RyaW5nKSA9PiBCYXNlTW9kZWx9fSBwcmVsb2FkZWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVhZFByZWxvYWRlZFJlbGF0aW9uc2hpcHMocHJlbG9hZGVkKSB7XG4gICAgaWYgKCF0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyZWxhdGlvbnNoaXBzXCIpXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBEYXRhID0gdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBDbGFzc0RhdGEgPSByZWxhdGlvbnNoaXBzLmZpbmQoKHJlbGF0aW9uc2hpcCkgPT4gZGlnZyhyZWxhdGlvbnNoaXAsIFwibmFtZVwiKSA9PSByZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcENsYXNzRGF0YSkge1xuICAgICAgICBjb25zdCBtb2RlbE5hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcHNMaXN0ID0gcmVsYXRpb25zaGlwcy5tYXAoKHJlbGF0aW9uc2hpcCkgPT4gcmVsYXRpb25zaGlwLm5hbWUpLmpvaW4oXCIsIFwiKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIHJlbGF0aW9uICR7cmVsYXRpb25zaGlwTmFtZX0gb24gdGhlICR7bW9kZWxOYW1lfSBtb2RlbDogJHtyZWxhdGlvbnNoaXBzTGlzdH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBUeXBlID0gZGlnZyhyZWxhdGlvbnNoaXBDbGFzc0RhdGEsIFwiY29sbGVjdGlvbk5hbWVcIilcblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0aW9uc2hpcE5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkYClcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXBDbGFzc0RhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyByZWxhdGlvbnNoaXAgb24gJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfSBieSB0aGF0IG5hbWU6ICR7cmVsYXRpb25zaGlwTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcERhdGEpIHtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwTmFtZV0gPSBudWxsXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBEYXRhKSkge1xuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXSA9IFtdXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBJZCBvZiByZWxhdGlvbnNoaXBEYXRhKSB7XG4gICAgICAgICAgY29uc3QgbW9kZWwgPSBwcmVsb2FkZWQuZ2V0TW9kZWwocmVsYXRpb25zaGlwVHlwZSwgcmVsYXRpb25zaGlwSWQpXG5cbiAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXS5wdXNoKG1vZGVsKVxuICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXS5wdXNoKG1vZGVsKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHByZWxvYWRlZC5nZXRNb2RlbChyZWxhdGlvbnNoaXBUeXBlLCByZWxhdGlvbnNoaXBEYXRhKVxuXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWxcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlcnxzdHJpbmd9ICovXG4gIHByaW1hcnlLZXkoKSB7IHJldHVybiB0aGlzLnJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlKHRoaXMubW9kZWxDbGFzcygpLnByaW1hcnlLZXkoKSkgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYXNlTW9kZWxcbiJdfQ==
1278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiYmFzZS1tb2RlbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDdkQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLFNBQVMsTUFBTSwyQkFBMkIsQ0FBQSxDQUFDLG1DQUFtQztBQUNyRixPQUFPLHVCQUF1QixNQUFNLGlDQUFpQyxDQUFBO0FBQ3JFLE9BQU8saUJBQWlCLE1BQU0sMEJBQTBCLENBQUE7QUFDeEQsT0FBTyxVQUFVLE1BQU0saUJBQWlCLENBQUE7QUFDeEMsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sV0FBVyxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sa0JBQWtCLE1BQU0sc0JBQXNCLENBQUE7QUFDckQsT0FBTyxTQUFTLE1BQU0saUJBQWlCLENBQUE7QUFDdkMsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFDbEQsT0FBTyxVQUFVLE1BQU0sNEJBQTRCLENBQUE7QUFDbkQsT0FBTyxLQUFLLE1BQU0sdUJBQXVCLENBQUE7QUFDekMsT0FBTyxRQUFRLE1BQU0sZUFBZSxDQUFBO0FBQ3BDLE9BQU8sZUFBZSxNQUFNLHVCQUF1QixDQUFBO0FBQ25ELE9BQU8sZ0JBQWdCLE1BQU0sb0JBQW9CLENBQUE7QUFFakQsaURBQWlEO0FBQ2pELG9HQUFvRztBQUNwRywyREFBMkQ7QUFDM0QsbURBQW1EO0FBQ25ELCtFQUErRTtBQUMvRSx5REFBeUQ7QUFDekQseURBQXlEO0FBQ3pELHVGQUF1RjtBQUN2RixxRkFBcUY7QUFDckYsd0VBQXdFO0FBQ3hFLCtFQUErRTtBQUMvRSxz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LENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ2xELENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO2dCQUVwRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLENBQUE7Z0JBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLENBQUE7WUFDOUMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLFVBQVU7UUFDUixPQUFPLDhCQUE4QixDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDdEcsQ0FBQztDQUNGLENBQUE7QUFFRCxlQUFlLFNBQVMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQge1ZhbGlkYXRpb25FcnJvcnN9IGZyb20gXCIuL3ZhbGlkYXRpb24tZXJyb3JzLmpzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgQXR0cmlidXRlIGZyb20gXCIuL2Jhc2UtbW9kZWwvYXR0cmlidXRlLmpzXCIgLy8gZXNsaW50LWRpc2FibGUtbGluZSBzb3J0LWltcG9ydHNcbmltcG9ydCBBdHRyaWJ1dGVOb3RMb2FkZWRFcnJvciBmcm9tIFwiLi9hdHRyaWJ1dGUtbm90LWxvYWRlZC1lcnJvci5qc1wiXG5pbXBvcnQgQ2FjaGVLZXlHZW5lcmF0b3IgZnJvbSBcIi4vY2FjaGUta2V5LWdlbmVyYXRvci5qc1wiXG5pbXBvcnQgQ29sbGVjdGlvbiBmcm9tIFwiLi9jb2xsZWN0aW9uLmpzXCJcbmltcG9ydCBDb21tYW5kc1Bvb2wgZnJvbSBcIi4vY29tbWFuZHMtcG9vbC5qc1wiXG5pbXBvcnQgQ29uZmlnIGZyb20gXCIuL2NvbmZpZy5qc1wiXG5pbXBvcnQgQ3VzdG9tRXJyb3IgZnJvbSBcIi4vY3VzdG9tLWVycm9yLmpzXCJcbmltcG9ydCBGb3JtRGF0YU9iamVjdGl6ZXIgZnJvbSBcImZvcm0tZGF0YS1vYmplY3RpemVyXCJcbmltcG9ydCBNb2RlbE5hbWUgZnJvbSBcIi4vbW9kZWwtbmFtZS5qc1wiXG5pbXBvcnQgTm90TG9hZGVkRXJyb3IgZnJvbSBcIi4vbm90LWxvYWRlZC1lcnJvci5qc1wiXG5pbXBvcnQgUmVmbGVjdGlvbiBmcm9tIFwiLi9iYXNlLW1vZGVsL3JlZmxlY3Rpb24uanNcIlxuaW1wb3J0IFNjb3BlIGZyb20gXCIuL2Jhc2UtbW9kZWwvc2NvcGUuanNcIlxuaW1wb3J0IFNlcnZpY2VzIGZyb20gXCIuL3NlcnZpY2VzLmpzXCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSBcIi4vdmFsaWRhdGlvbi1lcnJvci5qc1wiXG5pbXBvcnQgb2JqZWN0VG9Gb3JtRGF0YSBmcm9tIFwib2JqZWN0LXRvLWZvcm1kYXRhXCJcblxuLyoqIEB0eXBlZGVmIHtzdHJpbmcgfCBudW1iZXJ9IE1vZGVsSWRlbnRpZmllciAqL1xuLyoqIEB0eXBlZGVmIHtzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCB8IERhdGUgfCBGaWxlIHwgQmxvYn0gTW9kZWxTY2FsYXJWYWx1ZSAqL1xuLyoqIEB0eXBlZGVmIHt7W2tleTogc3RyaW5nXTogTW9kZWxWYWx1ZX19IE1vZGVsVmFsdWVNYXAgKi9cbi8qKiBAdHlwZWRlZiB7QXJyYXk8TW9kZWxWYWx1ZT59IE1vZGVsVmFsdWVBcnJheSAqL1xuLyoqIEB0eXBlZGVmIHtNb2RlbFNjYWxhclZhbHVlIHwgTW9kZWxWYWx1ZU1hcCB8IE1vZGVsVmFsdWVBcnJheX0gTW9kZWxWYWx1ZSAqL1xuLyoqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBNb2RlbFZhbHVlPn0gTW9kZWxEYXRhTWFwICovXG4vKiogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGJvb2xlYW4+fSBNb2RlbEFiaWxpdHlNYXAgKi9cbi8qKiBAdHlwZWRlZiB7TW9kZWxJZGVudGlmaWVyIHwgTW9kZWxJZGVudGlmaWVyW10gfCBudWxsfSBQcmVsb2FkZWRSZWxhdGlvbnNoaXBWYWx1ZSAqL1xuLyoqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBQcmVsb2FkZWRSZWxhdGlvbnNoaXBWYWx1ZT59IFByZWxvYWRlZFJlbGF0aW9uc2hpcE1hcCAqL1xuLyoqIEB0eXBlZGVmIHtCYXNlTW9kZWwgfCBCYXNlTW9kZWxbXSB8IG51bGx9IExvYWRlZFJlbGF0aW9uc2hpcFZhbHVlICovXG4vKiogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIExvYWRlZFJlbGF0aW9uc2hpcFZhbHVlPn0gTG9hZGVkUmVsYXRpb25zaGlwTWFwICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vYmFzZS1tb2RlbC9yZWZsZWN0aW9uLmpzXCIpLlJlZmxlY3Rpb25NYWNyb30gUmVmbGVjdGlvbk1hY3JvICovXG4vKiogQHR5cGVkZWYge0Zvcm1EYXRhIHwgSFRNTEZvcm1FbGVtZW50IHwgTW9kZWxEYXRhTWFwfSBSYXdEYXRhSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+fSBWYWxpZGF0aW9uUmVzcG9uc2VFcnJvcnMgKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmVsYXRpb25zaGlwRGF0YVR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2xsZWN0aW9uTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmb3JlaWduS2V5XVxuICogQHByb3BlcnR5IHtSZWZsZWN0aW9uTWFjcm99IG1hY3JvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlc291cmNlX25hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyb3VnaF1cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTY29wZURhdGFUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1vZGVsQ2xhc3NEYXRhVHlwZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL2Jhc2UtbW9kZWwvYXR0cmlidXRlLmpzXCIpLkF0dHJpYnV0ZUFyZ1R5cGU+fSBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2FtZWxpemVkTG93ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGFzc05hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2xsZWN0aW9uS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sbGVjdGlvbk5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpMThuS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVEYXNoZXJpemVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFyYW1LZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbHVyYWxOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJpbWFyeUtleVxuICogQHByb3BlcnR5IHtSZWxhdGlvbnNoaXBEYXRhVHlwZVtdfSByYW5zYWNrYWJsZV9hc3NvY2lhdGlvbnNcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9iYXNlLW1vZGVsL2F0dHJpYnV0ZS5qc1wiKS5BdHRyaWJ1dGVBcmdUeXBlW119IHJhbnNhY2thYmxlX2F0dHJpYnV0ZXNcbiAqIEBwcm9wZXJ0eSB7U2NvcGVEYXRhVHlwZVtdfSByYW5zYWNrYWJsZV9zY29wZXNcbiAqIEBwcm9wZXJ0eSB7UmVsYXRpb25zaGlwRGF0YVR5cGVbXX0gcmVsYXRpb25zaGlwc1xuKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJzZVZhbGlkYXRpb25FcnJvcnNPcHRpb25zXG4gKiBAcHJvcGVydHkge0hUTUxGb3JtRWxlbWVudH0gW2Zvcm1dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0aHJvd1ZhbGlkYXRpb25FcnJvcl1cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2FkZWRNb2RlbERhdGFUeXBlXG4gKiBAcHJvcGVydHkge01vZGVsRGF0YU1hcH0gW2FdXG4gKiBAcHJvcGVydHkge01vZGVsQWJpbGl0eU1hcH0gW2JdXG4gKiBAcHJvcGVydHkge1ByZWxvYWRlZFJlbGF0aW9uc2hpcE1hcH0gW3JdXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFzZU1vZGVsQXJnc09iamVjdFxuICogQHByb3BlcnR5IHtNb2RlbERhdGFNYXB9IFthXVxuICogQHByb3BlcnR5IHtNb2RlbEFiaWxpdHlNYXB9IFtiXVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdH0gW2NvbGxlY3Rpb25dXG4gKiBAcHJvcGVydHkge0xvYWRlZE1vZGVsRGF0YVR5cGV9IFtkYXRhXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaXNOZXdSZWNvcmRdXG4gKi9cbi8qKiBAdHlwZWRlZiB7QmFzZU1vZGVsQXJnc09iamVjdCB8IE1vZGVsRGF0YU1hcH0gQmFzZU1vZGVsQXJncyAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYXNlTW9kZWxTdGF0aWNNZXRob2RzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBpTWFrZXJUeXBlXG4gKiBAcHJvcGVydHkgeygpID0+IGltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0fSBhbGxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQXR0cmlidXRlW119IGF0dHJpYnV0ZXNcbiAqIEBwcm9wZXJ0eSB7KGlkOiBNb2RlbElkZW50aWZpZXIpID0+IFByb21pc2U8QmFzZU1vZGVsPn0gZmluZFxuICogQHByb3BlcnR5IHsoZmluZE9yQ3JlYXRlQnlBcmdzOiBNb2RlbERhdGFNYXAsIGFyZ3M/OiB7YWRkaXRpb25hbERhdGE/OiBNb2RlbERhdGFNYXB9KSA9PiBQcm9taXNlPEJhc2VNb2RlbD59IGZpbmRPckNyZWF0ZUJ5XG4gKiBAcHJvcGVydHkgeyhhcmdzOiBNb2RlbERhdGFNYXApID0+IGltcG9ydChcIi4vY29tbWFuZC1leGVjdXRpb24uanNcIikuZGVmYXVsdH0gW2NyZWF0ZUxpbmtdXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBNb2RlbERhdGFNYXApID0+IGltcG9ydChcIi4vY29tbWFuZC1leGVjdXRpb24uanNcIikuZGVmYXVsdH0gW2Rlc3Ryb3lMaW5rc11cbiAqIEBwcm9wZXJ0eSB7KGF0dHJpYnV0ZU5hbWU6IHN0cmluZykgPT4gYm9vbGVhbn0gaGFzQXR0cmlidXRlXG4gKiBAcHJvcGVydHkgeyhhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpID0+IHN0cmluZ30gaHVtYW5BdHRyaWJ1dGVOYW1lXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBNb2RlbERhdGFNYXApID0+IFByb21pc2U8e2xpbms/OiBCYXNlTW9kZWwgfCBudWxsfT59IFtsaW5rRm9yXVxuICogQHByb3BlcnR5IHsoKSA9PiBNb2RlbENsYXNzRGF0YVR5cGV9IG1vZGVsQ2xhc3NEYXRhXG4gKiBAcHJvcGVydHkgeygpID0+IE1vZGVsTmFtZX0gbW9kZWxOYW1lXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gcHJpbWFyeUtleVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHtjdXJyZW50PzogQmFzZU1vZGVsW119Pn0gW2N1cnJlbnRdXG4gKiBAcHJvcGVydHkgeyhxdWVyeT86IGltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5Db2xsZWN0aW9uUmFuc2Fja1BhcmFtcykgPT4gaW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHJhbnNhY2tcbiAqIEBwcm9wZXJ0eSB7KCkgPT4ge25hbWU/OiBzdHJpbmd9fSBbcmVzb3VyY2VEYXRhXVxuICogQHByb3BlcnR5IHsoKSA9PiBSZWZsZWN0aW9uW119IHJlZmxlY3Rpb25zXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IFJlZmxlY3Rpb259IHJlZmxlY3Rpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUmVmbGVjdGlvbltdfSByYW5zYWNrYWJsZUFzc29jaWF0aW9uc1xuICogQHByb3BlcnR5IHsoKSA9PiBBdHRyaWJ1dGVbXX0gcmFuc2Fja2FibGVBdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkgeygpID0+IFNjb3BlW119IHJhbnNhY2thYmxlU2NvcGVzXG4gKiBAcHJvcGVydHkgeyhzZWxlY3Q/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4pID0+IGltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0fSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7KGF0dHJpYnV0ZU5hbWU6IHN0cmluZykgPT4gc3RyaW5nfSBzbmFrZUNhc2VcbiAqL1xuLyoqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHQgJiBCYXNlTW9kZWxTdGF0aWNNZXRob2RzfSBCYXNlTW9kZWxDbGFzc1R5cGUgKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTW9kZWxDb21tYW5kRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtNb2RlbERhdGFNYXAgfCBGb3JtRGF0YSB8IEhUTUxGb3JtRWxlbWVudH0gW2FyZ3NdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sbGVjdGlvbk5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb21tYW5kXG4gKiBAcHJvcGVydHkge01vZGVsSWRlbnRpZmllcn0gW3ByaW1hcnlLZXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1vZGVsQ29tbWFuZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhY2hlUmVzcG9uc2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb3JjZUh0dHBdXG4gKiBAcHJvcGVydHkge0hUTUxGb3JtRWxlbWVudH0gW2Zvcm1dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpbnN0YW50XVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1vZGVsQ29tbWFuZFJlc3BvbnNlXG4gKiBAcHJvcGVydHkge1ZhbGlkYXRpb25SZXNwb25zZUVycm9yc30gW2Vycm9yc11cbiAqIEBwcm9wZXJ0eSB7QmFzZU1vZGVsIHwgQmFzZU1vZGVsW119IFttb2RlbF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt2YWxpZF1cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWYWxpZGF0aW9uRXJyb3JXaXRoUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7e3Jlc3BvbnNlPzoge3ZhbGlkYXRpb25fZXJyb3JzPzogaW1wb3J0KFwiLi92YWxpZGF0aW9uLWVycm9ycy5qc1wiKS5WYWxpZGF0aW9uRXJyb3JFbnRyeUFyZ3NbXX19fSBbYXJnc11cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZWxhdGlvbnNoaXBMb2FkQXJnc1xuICogQHByb3BlcnR5IHtCYXNlTW9kZWx9IFttb2RlbF1cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0fSBbbW9kZWxDbGFzc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWZsZWN0aW9uTmFtZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtNb2RlbERhdGFNYXB9IG9iamVjdFxuICogQHJldHVybnMge01vZGVsRGF0YU1hcH1cbiAqL1xuY29uc3Qgb2JqZWN0VG9VbmRlcnNjb3JlID0gKG9iamVjdCkgPT4ge1xuICBjb25zdCBuZXdPYmplY3QgPSAvKiogQHR5cGUge01vZGVsRGF0YU1hcH0gKi8gKHt9KVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIGNvbnN0IHVuZGVyc2NvcmVLZXkgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoa2V5KVxuXG4gICAgbmV3T2JqZWN0W3VuZGVyc2NvcmVLZXldID0gb2JqZWN0W2tleV1cbiAgfVxuXG4gIHJldHVybiBuZXdPYmplY3Rcbn1cblxuLyoqIEJhc2VNb2RlbC4gKi9cbmNvbnN0IEJhc2VNb2RlbCA9IGNsYXNzIEJhc2VNb2RlbCB7XG4gIHN0YXRpYyBhcGlNYWtlclR5cGUgPSBcIkJhc2VNb2RlbFwiXG5cbiAgLyoqIEByZXR1cm5zIHtBdHRyaWJ1dGVbXX0gKi9cbiAgc3RhdGljIGF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlS2V5IGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZUtleV1cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlRGF0YSlcblxuICAgICAgcmVzdWx0LnB1c2goYXR0cmlidXRlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBoYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJhdHRyaWJ1dGVzXCIpXG4gICAgY29uc3QgbG93ZXJDYXNlQXR0cmlidXRlTmFtZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgaWYgKGxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQHJldHVybnMge01vZGVsQ2xhc3NEYXRhVHlwZX1cbiAgICovXG4gIHN0YXRpYyBtb2RlbENsYXNzRGF0YSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJtb2RlbENsYXNzRGF0YSBzaG91bGQgYmUgb3ZlcnJpZGVuIGJ5IGNoaWxkXCIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtWYWxpZGF0aW9uRXJyb3JzfSB2YWxpZGF0aW9uRXJyb3JzXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIHN0YXRpYyBuZXdDdXN0b21FdmVudCh2YWxpZGF0aW9uRXJyb3JzKSB7XG4gICAgcmV0dXJuIG5ldyBDdXN0b21FdmVudChcInZhbGlkYXRpb24tZXJyb3JzXCIsIHtkZXRhaWw6IHZhbGlkYXRpb25FcnJvcnN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmFsaWRhdGlvbkVycm9yc30gdmFsaWRhdGlvbkVycm9yc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy5mb3JtXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRocm93VmFsaWRhdGlvbkVycm9yXVxuICAgKi9cbiAgc3RhdGljIHNlbmRWYWxpZGF0aW9uRXJyb3JzRXZlbnQodmFsaWRhdGlvbkVycm9ycywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9ybSkge1xuICAgICAgY29uc3QgZXZlbnQgPSBCYXNlTW9kZWwubmV3Q3VzdG9tRXZlbnQodmFsaWRhdGlvbkVycm9ycylcbiAgICAgIG9wdGlvbnMuZm9ybS5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QmFzZU1vZGVsPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kKGlkKSB7XG4gICAgY29uc3QgcXVlcnkgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5Db2xsZWN0aW9uUmFuc2Fja1BhcmFtc30gKi8gKHt9KVxuXG4gICAgcXVlcnlbYCR7dGhpcy5wcmltYXJ5S2V5KCl9X2VxYF0gPSBpZFxuXG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLnJhbnNhY2socXVlcnkpLmZpcnN0KClcblxuICAgIGlmIChtb2RlbCkge1xuICAgICAgcmV0dXJuIG1vZGVsXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBDdXN0b21FcnJvcihcIlJlY29yZCBub3QgZm91bmRcIilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNb2RlbERhdGFNYXB9IGZpbmRPckNyZWF0ZUJ5QXJnc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdXG4gICAqIEBwYXJhbSB7TW9kZWxEYXRhTWFwfSBbYXJncy5hZGRpdGlvbmFsRGF0YV1cbiAgICogQHJldHVybnMge1Byb21pc2U8QmFzZU1vZGVsPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kT3JDcmVhdGVCeShmaW5kT3JDcmVhdGVCeUFyZ3MsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFNlcnZpY2VzLmN1cnJlbnQoKS5zZW5kUmVxdWVzdChcIk1vZGVsczo6RmluZE9yQ3JlYXRlQnlcIiwge1xuICAgICAgYWRkaXRpb25hbF9kYXRhOiBhcmdzLmFkZGl0aW9uYWxEYXRhLFxuICAgICAgZmluZF9vcl9jcmVhdGVfYnlfYXJnczogZmluZE9yQ3JlYXRlQnlBcmdzLFxuICAgICAgcmVzb3VyY2VfbmFtZTogZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKVxuICAgIH0pXG4gICAgY29uc3QgbW9kZWwgPSBkaWdnKHJlc3VsdCwgXCJtb2RlbFwiKVxuXG4gICAgcmV0dXJuIG1vZGVsXG4gIH1cblxuICAvKiogQHJldHVybnMge01vZGVsTmFtZX0gKi9cbiAgc3RhdGljIG1vZGVsTmFtZSgpIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsTmFtZSh7bW9kZWxDbGFzc0RhdGE6IHRoaXMubW9kZWxDbGFzc0RhdGEoKX0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgc3RhdGljIHByaW1hcnlLZXkoKSB7XG4gICAgcmV0dXJuIGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInByaW1hcnlLZXlcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5Db2xsZWN0aW9uUmFuc2Fja1BhcmFtc30gW3F1ZXJ5XVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9XG4gICAqL1xuICBzdGF0aWMgcmFuc2FjayhxdWVyeSA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHttb2RlbENsYXNzOiB0aGlzfSwge3JhbnNhY2s6IHF1ZXJ5fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gW3NlbGVjdF1cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0fVxuICAgKi9cbiAgc3RhdGljIHNlbGVjdChzZWxlY3QpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5zYWNrKCkuc2VsZWN0KHNlbGVjdClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVmbGVjdGlvbltdfSAqL1xuICBzdGF0aWMgcmFuc2Fja2FibGVBc3NvY2lhdGlvbnMoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJhbnNhY2thYmxlX2Fzc29jaWF0aW9uc1wiKVxuICAgIGNvbnN0IHJlZmxlY3Rpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwRGF0YSBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZWZsZWN0aW9ucy5wdXNoKG5ldyBSZWZsZWN0aW9uKHJlbGF0aW9uc2hpcERhdGEpKVxuICAgIH1cblxuICAgIHJldHVybiByZWZsZWN0aW9uc1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtBdHRyaWJ1dGVbXX0gKi9cbiAgc3RhdGljIHJhbnNhY2thYmxlQXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnJhbnNhY2thYmxlX2F0dHJpYnV0ZXNcbiAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVEYXRhIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIHJlc3VsdC5wdXNoKG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlRGF0YSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtTY29wZVtdfSAqL1xuICBzdGF0aWMgcmFuc2Fja2FibGVTY29wZXMoKSB7XG4gICAgY29uc3QgcmFuc2Fja2FibGVTY29wZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyYW5zYWNrYWJsZV9zY29wZXNcIilcbiAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBzY29wZURhdGEgb2YgcmFuc2Fja2FibGVTY29wZXMpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKHNjb3BlRGF0YSlcblxuICAgICAgcmVzdWx0LnB1c2goc2NvcGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWZsZWN0aW9uW119ICovXG4gIHN0YXRpYyByZWZsZWN0aW9ucygpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmVsYXRpb25zaGlwc1wiKVxuICAgIGNvbnN0IHJlZmxlY3Rpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwRGF0YSBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByZWZsZWN0aW9uID0gbmV3IFJlZmxlY3Rpb24ocmVsYXRpb25zaGlwRGF0YSlcblxuICAgICAgcmVmbGVjdGlvbnMucHVzaChyZWZsZWN0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiByZWZsZWN0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtSZWZsZWN0aW9ufVxuICAgKi9cbiAgc3RhdGljIHJlZmxlY3Rpb24obmFtZSkge1xuICAgIGNvbnN0IGZvdW5kUmVmbGVjdGlvbiA9IHRoaXMucmVmbGVjdGlvbnMoKS5maW5kKChyZWZsZWN0aW9uKSA9PiByZWZsZWN0aW9uLm5hbWUoKSA9PSBuYW1lKVxuXG4gICAgaWYgKCFmb3VuZFJlZmxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHJlZmxlY3Rpb25OYW1lcyA9IHRoaXMucmVmbGVjdGlvbnMoKVxuICAgICAgICAubWFwKChyZWZsZWN0aW9uKSA9PiByZWZsZWN0aW9uLm5hbWUoKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggcmVmbGVjdGlvbjogJHtuYW1lfSBpbiAke3JlZmxlY3Rpb25OYW1lc31gKVxuICAgIH1cblxuICAgIHJldHVybiBmb3VuZFJlZmxlY3Rpb25cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICBzdGF0aWMgX3Rva2VuKCkge1xuICAgIGNvbnN0IGNzcmZUb2tlbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcblxuICAgIGlmIChjc3JmVG9rZW5FbGVtZW50KSB7XG4gICAgICByZXR1cm4gY3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqIEBwYXJhbSB7QmFzZU1vZGVsQXJnc30gW2FyZ3NdICovXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IGFyZ3NPYmplY3QgPSAvKiogQHR5cGUge0Jhc2VNb2RlbEFyZ3NPYmplY3R9ICovIChhcmdzKVxuXG4gICAgdGhpcy5hYmlsaXRpZXMgPSAvKiogQHR5cGUge01vZGVsQWJpbGl0eU1hcH0gKi8gKHt9KVxuICAgIHRoaXMuY2hhbmdlcyA9IC8qKiBAdHlwZSB7TW9kZWxEYXRhTWFwfSAqLyAoe30pXG4gICAgdGhpcy5jb2xsZWN0aW9uID0gdW5kZWZpbmVkXG4gICAgdGhpcy5faWRlbnRpZmllcktleSA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX21hcmtlZEZvckRlc3RydWN0aW9uID0gdW5kZWZpbmVkXG4gICAgdGhpcy5tb2RlbERhdGEgPSAvKiogQHR5cGUge01vZGVsRGF0YU1hcH0gKi8gKHt9KVxuICAgIHRoaXMubmV3UmVjb3JkID0gYXJnc09iamVjdC5pc05ld1JlY29yZFxuICAgIHRoaXMucHJldmlvdXNNb2RlbERhdGEgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMgPSB1bmRlZmluZWRcbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSA9IC8qKiBAdHlwZSB7TG9hZGVkUmVsYXRpb25zaGlwTWFwfSAqLyAoe30pXG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzID0gLyoqIEB0eXBlIHtMb2FkZWRSZWxhdGlvbnNoaXBNYXB9ICovICh7fSlcbiAgICB0aGlzLnVuaXF1ZUtleVZhbHVlID0gdW5kZWZpbmVkXG5cbiAgICBpZiAoYXJnc09iamVjdCAmJiBhcmdzT2JqZWN0LmRhdGEgJiYgYXJnc09iamVjdC5kYXRhLmEpIHtcbiAgICAgIHRoaXMuX3JlYWRNb2RlbERhdGFGcm9tQXJncyhhcmdzT2JqZWN0KVxuICAgIH0gZWxzZSBpZiAoYXJnc09iamVjdC5hKSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IGFyZ3NPYmplY3QuYiB8fCB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSBvYmplY3RUb1VuZGVyc2NvcmUoYXJnc09iamVjdC5hKVxuICAgIH0gZWxzZSBpZiAoYXJncykge1xuICAgICAgdGhpcy5hYmlsaXRpZXMgPSB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSBvYmplY3RUb1VuZGVyc2NvcmUoLyoqIEB0eXBlIHtNb2RlbERhdGFNYXB9ICovIChhcmdzKSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hYmlsaXRpZXMgPSB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSAvKiogQHR5cGUge01vZGVsRGF0YU1hcH0gKi8gKHt9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge01vZGVsRGF0YU1hcH0gbmV3QXR0cmlidXRlc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFzc2lnbkF0dHJpYnV0ZXMobmV3QXR0cmlidXRlcykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG5ld0F0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gbmV3QXR0cmlidXRlc1trZXldXG4gICAgICBjb25zdCBhdHRyaWJ1dGVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGtleSlcblxuICAgICAgbGV0IGFwcGx5Q2hhbmdlID0gdHJ1ZVxuICAgICAgbGV0IGRlbGV0ZUNoYW5nZSA9IGZhbHNlXG5cbiAgICAgIGlmICh0aGlzLmlzQXR0cmlidXRlTG9hZGVkKGtleSkpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnJlYWRBdHRyaWJ1dGUoa2V5KVxuICAgICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gdGhpcy5tb2RlbERhdGFbYXR0cmlidXRlVW5kZXJzY29yZV1cblxuICAgICAgICBpZiAobmV3VmFsdWUgPT0gb2xkVmFsdWUpIHtcbiAgICAgICAgICBhcHBseUNoYW5nZSA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSBpZiAobmV3VmFsdWUgPT0gb3JpZ2luYWxWYWx1ZSkge1xuICAgICAgICAgIGFwcGx5Q2hhbmdlID0gZmFsc2VcbiAgICAgICAgICBkZWxldGVDaGFuZ2UgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFwcGx5Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVVbmRlcnNjb3JlXSA9IG5ld1ZhbHVlXG4gICAgICB9IGVsc2UgaWYgKGRlbGV0ZUNoYW5nZSkge1xuICAgICAgICBkZWxldGUgdGhpcy5jaGFuZ2VzW2F0dHJpYnV0ZVVuZGVyc2NvcmVdXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtNb2RlbERhdGFNYXB9ICovXG4gIGF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gLyoqIEB0eXBlIHtNb2RlbERhdGFNYXB9ICovICh7fSlcblxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMubW9kZWxEYXRhKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHRoaXMubW9kZWxEYXRhW2tleV1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmNoYW5nZXMpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5jaGFuZ2VzW2tleV1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGdpdmVuQWJpbGl0eU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBjYW4oZ2l2ZW5BYmlsaXR5TmFtZSkge1xuICAgIGNvbnN0IGFiaWxpdHlOYW1lID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGdpdmVuQWJpbGl0eU5hbWUpXG5cbiAgICBpZiAoIShhYmlsaXR5TmFtZSBpbiB0aGlzLmFiaWxpdGllcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWJpbGl0eSAke2FiaWxpdHlOYW1lfSBoYXNuJ3QgYmVlbiBsb2FkZWQgZm9yICR7ZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKX1gKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFiaWxpdGllc1thYmlsaXR5TmFtZV1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7QmFzZU1vZGVsfSAqL1xuICBjbG9uZSgpIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gdGhpcy5tb2RlbENsYXNzKClcbiAgICBjb25zdCBjbG9uZSA9IG5ldyBNb2RlbENsYXNzKClcblxuICAgIGNsb25lLmFiaWxpdGllcyA9IHsuLi50aGlzLmFiaWxpdGllc31cbiAgICBjbG9uZS5tb2RlbERhdGEgPSB7Li4udGhpcy5tb2RlbERhdGF9XG4gICAgY2xvbmUucmVsYXRpb25zaGlwcyA9IHsuLi50aGlzLnJlbGF0aW9uc2hpcHN9XG4gICAgY2xvbmUucmVsYXRpb25zaGlwc0NhY2hlID0gey4uLnRoaXMucmVsYXRpb25zaGlwc0NhY2hlfVxuXG4gICAgcmV0dXJuIGNsb25lXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlciB8IHN0cmluZ30gKi9cbiAgY2FjaGVLZXkoKSB7XG4gICAgaWYgKHRoaXMuaXNQZXJzaXN0ZWQoKSkge1xuICAgICAgY29uc3Qga2V5UGFydHMgPSBbXG4gICAgICAgIHRoaXMubW9kZWxDbGFzc0RhdGEoKS5wYXJhbUtleSxcbiAgICAgICAgdGhpcy5wcmltYXJ5S2V5KClcbiAgICAgIF1cblxuICAgICAgaWYgKFwidXBkYXRlZF9hdFwiIGluIHRoaXMubW9kZWxEYXRhKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgY29uc3QgdXBkYXRlZEF0ID0gdGhpcy51cGRhdGVkQXQoKVxuXG4gICAgICAgIGlmICh0eXBlb2YgdXBkYXRlZEF0ICE9IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwZGF0ZWRBdCB3YXNuJ3QgYW4gb2JqZWN0OiAke3R5cGVvZiB1cGRhdGVkQXR9YClcbiAgICAgICAgfSBlbHNlIGlmICghKFwiZ2V0VGltZVwiIGluIHVwZGF0ZWRBdCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwZGF0ZWRBdCBkaWRuJ3Qgc3VwcG9ydCBnZXRUaW1lIHdpdGggY2xhc3M6ICR7dXBkYXRlZEF0LmNvbnN0cnVjdG9yICYmIHVwZGF0ZWRBdC5jb25zdHJ1Y3Rvci5uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGtleVBhcnRzLnB1c2goYHVwZGF0ZWRBdC0ke3RoaXMudXBkYXRlZEF0KCkuZ2V0VGltZSgpfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBrZXlQYXJ0cy5qb2luKFwiLVwiKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy51bmlxdWVLZXkoKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBsb2NhbENhY2hlS2V5KCkge1xuICAgIGNvbnN0IGNhY2hlS2V5R2VuZXJhdG9yID0gbmV3IENhY2hlS2V5R2VuZXJhdG9yKHRoaXMpXG5cbiAgICByZXR1cm4gY2FjaGVLZXlHZW5lcmF0b3IubG9jYWwoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIGZ1bGxDYWNoZUtleSgpIHtcbiAgICBjb25zdCBjYWNoZUtleUdlbmVyYXRvciA9IG5ldyBDYWNoZUtleUdlbmVyYXRvcih0aGlzKVxuXG4gICAgcmV0dXJuIGNhY2hlS2V5R2VuZXJhdG9yLmNhY2hlS2V5KClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9ICovXG4gIHN0YXRpYyBhbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuc2FjaygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNb2RlbERhdGFNYXB9IFthdHRyaWJ1dGVzXVxuICAgKiBAcGFyYW0ge1BhcnNlVmFsaWRhdGlvbkVycm9yc09wdGlvbnN9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7XG4gICAqICAgbW9kZWw6IEJhc2VNb2RlbCxcbiAgICogICByZXNwb25zZTogTW9kZWxDb21tYW5kUmVzcG9uc2VcbiAgICogfT59XG4gICAqL1xuICBhc3luYyBjcmVhdGUoYXR0cmlidXRlcywgb3B0aW9ucykge1xuICAgIGlmIChhdHRyaWJ1dGVzKSB0aGlzLmFzc2lnbkF0dHJpYnV0ZXMoYXR0cmlidXRlcylcbiAgICBjb25zdCBwYXJhbUtleSA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5wYXJhbUtleVxuICAgIGNvbnN0IG1vZGVsRGF0YSA9IHRoaXMuZ2V0QXR0cmlidXRlcygpXG4gICAgY29uc3QgZGF0YVRvVXNlID0ge31cbiAgICBkYXRhVG9Vc2VbcGFyYW1LZXldID0gbW9kZWxEYXRhXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSAvKiogQHR5cGUge01vZGVsQ29tbWFuZFJlc3BvbnNlfSAqLyAoYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICAgIHtcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBzYXZlOiBkYXRhVG9Vc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgICkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Jhd0RhdGFJbnB1dH0gcmF3RGF0YVxuICAgKiBAcGFyYW0ge1BhcnNlVmFsaWRhdGlvbkVycm9yc09wdGlvbnN9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7bW9kZWw6IEJhc2VNb2RlbCwgcmVzcG9uc2U6IE1vZGVsQ29tbWFuZFJlc3BvbnNlfT59XG4gICAqL1xuICBhc3luYyBjcmVhdGVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgb2JqZWN0RGF0YSA9IEJhc2VNb2RlbC5fb2JqZWN0RGF0YUZyb21HaXZlblJhd0RhdGEocmF3RGF0YSwgb3B0aW9ucylcblxuICAgIC8qKiBAdHlwZSB7TW9kZWxDb21tYW5kUmVzcG9uc2V9ICovXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx7bW9kZWw6IEJhc2VNb2RlbCwgcmVzcG9uc2U6IE1vZGVsQ29tbWFuZFJlc3BvbnNlfT59ICovXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgIHtcbiAgICAgICAgYXJnczoge3F1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKX0sXG4gICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tZGVzdHJveWAsXG4gICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICB0eXBlOiBcImRlc3Ryb3lcIlxuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKVxuXG4gICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgICB0aGlzLl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlc3BvbnNlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBsaXN0T2ZBYmlsaXRpZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBlbnN1cmVBYmlsaXRpZXMobGlzdE9mQWJpbGl0aWVzKSB7XG4gICAgY29uc3QgYWJpbGl0aWVzVG9Mb2FkID0gW11cblxuICAgIGZvciAoY29uc3QgYWJpbGl0eUluTGlzdCBvZiBsaXN0T2ZBYmlsaXRpZXMpIHtcbiAgICAgIGlmICghKGFiaWxpdHlJbkxpc3QgaW4gdGhpcy5hYmlsaXRpZXMpKSB7XG4gICAgICAgIGFiaWxpdGllc1RvTG9hZC5wdXNoKGFiaWxpdHlJbkxpc3QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFiaWxpdGllc1RvTG9hZC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwcmltYXJ5S2V5TmFtZSA9IHRoaXMubW9kZWxDbGFzcygpLnByaW1hcnlLZXkoKVxuICAgICAgY29uc3QgcmFuc2Fja1BhcmFtcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLkNvbGxlY3Rpb25SYW5zYWNrUGFyYW1zfSAqLyAoe30pXG4gICAgICByYW5zYWNrUGFyYW1zW2Ake3ByaW1hcnlLZXlOYW1lfV9lcWBdID0gdGhpcy5wcmltYXJ5S2V5KClcblxuICAgICAgY29uc3QgYWJpbGl0aWVzUGFyYW1zID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59ICovICh7fSlcbiAgICAgIGFiaWxpdGllc1BhcmFtc1tkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXSA9IGFiaWxpdGllc1RvTG9hZFxuXG4gICAgICBjb25zdCBhbm90aGVyTW9kZWwgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MoKVxuICAgICAgICAucmFuc2FjayhyYW5zYWNrUGFyYW1zKVxuICAgICAgICAuYWJpbGl0aWVzKGFiaWxpdGllc1BhcmFtcylcbiAgICAgICAgLmZpcnN0KClcblxuICAgICAgaWYgKCFhbm90aGVyTW9kZWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9vayB1cCB0aGUgc2FtZSBtb2RlbCAke3RoaXMucHJpbWFyeUtleSgpfSB3aXRoIGFiaWxpdGllczogJHthYmlsaXRpZXNUb0xvYWQuam9pbihcIiwgXCIpfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0FiaWxpdGllcyA9IGFub3RoZXJNb2RlbC5hYmlsaXRpZXNcbiAgICAgIGZvciAoY29uc3QgbmV3QWJpbGl0eSBpbiBuZXdBYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy5hYmlsaXRpZXNbbmV3QWJpbGl0eV0gPSBuZXdBYmlsaXRpZXNbbmV3QWJpbGl0eV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge01vZGVsRGF0YU1hcH0gKi9cbiAgZ2V0QXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLm1vZGVsRGF0YSwgdGhpcy5jaGFuZ2VzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TW9kZWxDb21tYW5kUmVzcG9uc2V9IHJlc3BvbnNlXG4gICAqIEByZXR1cm5zIHtuZXZlcn1cbiAgICovXG4gIGhhbmRsZVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpIHtcbiAgICB0aHJvdyBuZXcgQ3VzdG9tRXJyb3IoXG4gICAgICBcIlJlc3BvbnNlIHdhc24ndCBzdWNjZXNzZnVsXCIsXG4gICAgICB7XG4gICAgICAgIG1vZGVsOiB0aGlzLFxuICAgICAgICByZXNwb25zZTogLyoqIEB0eXBlIHtvYmplY3R9ICovIChyZXNwb25zZSlcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlciB8IHN0cmluZ30gKi9cbiAgaWRlbnRpZmllcktleSgpIHtcbiAgICBpZiAoIXRoaXMuX2lkZW50aWZpZXJLZXkpIHRoaXMuX2lkZW50aWZpZXJLZXkgPSB0aGlzLmlzUGVyc2lzdGVkKCkgPyB0aGlzLnByaW1hcnlLZXkoKSA6IHRoaXMudW5pcXVlS2V5KClcblxuICAgIHJldHVybiB0aGlzLl9pZGVudGlmaWVyS2V5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFzc29jaWF0aW9uTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXNzb2NpYXRpb25Mb2FkZWQoYXNzb2NpYXRpb25OYW1lKSB7IHJldHVybiB0aGlzLmlzQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlKGluZmxlY3Rpb24udW5kZXJzY29yZShhc3NvY2lhdGlvbk5hbWUpKSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBc3NvY2lhdGlvbkxvYWRlZFVuZGVyc2NvcmUgKGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmUpIHtcbiAgICBpZiAoYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXNzb2NpYXRpb25OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBc3NvY2lhdGlvblByZXNlbnQoYXNzb2NpYXRpb25OYW1lKSB7XG4gICAgaWYgKHRoaXMuaXNBc3NvY2lhdGlvbkxvYWRlZChhc3NvY2lhdGlvbk5hbWUpKSByZXR1cm4gdHJ1ZVxuICAgIGlmIChhc3NvY2lhdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSByZXR1cm4gdHJ1ZVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhc3NvY2lhdGlvbk5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8TG9hZGVkUmVsYXRpb25zaGlwVmFsdWU+fVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlQXNzb2NpYXRpb25Mb2FkZWQoYXNzb2NpYXRpb25OYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlKGluZmxlY3Rpb24udW5kZXJzY29yZShhc3NvY2lhdGlvbk5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvYWRlZFJlbGF0aW9uc2hpcFZhbHVlPn1cbiAgICovXG4gIGFzeW5jIGVuc3VyZUFzc29jaWF0aW9uTG9hZGVkVW5kZXJzY29yZShhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlKSB7XG4gICAgY29uc3QgcmVmbGVjdGlvbiA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5yZWxhdGlvbnNoaXBzLmZpbmQoKHJlbGF0aW9uc2hpcCkgPT4gcmVsYXRpb25zaGlwLm5hbWUgPT0gYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSlcblxuICAgIGlmICghcmVmbGVjdGlvbikge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwTmFtZXMgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucmVsYXRpb25zaGlwcy5tYXAoKHJlbGF0aW9uc2hpcCkgPT4gcmVsYXRpb25zaGlwLm5hbWUpXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIHJlbGF0aW9uICR7YXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZX0gb24gJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkubmFtZX06ICR7cmVsYXRpb25zaGlwTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSwgdHJ1ZSlcbiAgICBjb25zdCBsb2FkTWV0aG9kTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYGxvYWRfJHthc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlfWAsIHRydWUpXG5cbiAgICBpZiAoIShtZXRob2ROYW1lIGluIHRoaXMpKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggYXNzb2NpYXRpb24gbWV0aG9kIG9uICR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLm5hbWV9OiAke21ldGhvZE5hbWV9YClcbiAgICBpZiAoIShsb2FkTWV0aG9kTmFtZSBpbiB0aGlzKSkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGFzc29jaWF0aW9uIGxvYWQgbWV0aG9kIG9uICR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLm5hbWV9OiAke2xvYWRNZXRob2ROYW1lfWApXG5cbiAgICBpZiAodGhpcy5pc0Fzc29jaWF0aW9uTG9hZGVkVW5kZXJzY29yZShhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlKSkge1xuICAgICAgY29uc3QgbG9hZGVkQXNzb2NpYXRpb24gPSAvKiogQHR5cGUge0xvYWRlZFJlbGF0aW9uc2hpcFZhbHVlIHwge2xvYWRlZCgpOiBCYXNlTW9kZWxbXX19ICovICh0aGlzW21ldGhvZE5hbWVdKCkpXG5cbiAgICAgIGlmIChyZWZsZWN0aW9uLm1hY3JvID09IFwiaGFzX21hbnlcIikge1xuICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHt7bG9hZGVkKCk6IEJhc2VNb2RlbFtdfX0gKi8gKGxvYWRlZEFzc29jaWF0aW9uKS5sb2FkZWQoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtMb2FkZWRSZWxhdGlvbnNoaXBWYWx1ZX0gKi8gKGxvYWRlZEFzc29jaWF0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzW2xvYWRNZXRob2ROYW1lXSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtWYWxpZGF0aW9uRXJyb3IgfCBFcnJvciB8IFZhbGlkYXRpb25FcnJvcldpdGhSZXNwb25zZX0gYXJncy5lcnJvclxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbH0gW2FyZ3MubW9kZWxdXG4gICAqIEBwYXJhbSB7UGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc30gW2FyZ3Mub3B0aW9uc11cbiAgICovXG4gIHN0YXRpYyBwYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbCwgb3B0aW9uc30pIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikpIHJldHVyblxuICAgIGlmICghZXJyb3IuYXJncz8ucmVzcG9uc2U/LnZhbGlkYXRpb25fZXJyb3JzKSByZXR1cm5cblxuICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSBuZXcgVmFsaWRhdGlvbkVycm9ycyh7XG4gICAgICBtb2RlbCxcbiAgICAgIHZhbGlkYXRpb25FcnJvcnM6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi92YWxpZGF0aW9uLWVycm9ycy5qc1wiKS5WYWxpZGF0aW9uRXJyb3JFbnRyeUFyZ3NbXX0gKi8gKGRpZ2coZXJyb3IsIFwiYXJnc1wiLCBcInJlc3BvbnNlXCIsIFwidmFsaWRhdGlvbl9lcnJvcnNcIikpXG4gICAgfSlcblxuICAgIEJhc2VNb2RlbC5zZW5kVmFsaWRhdGlvbkVycm9yc0V2ZW50KHZhbGlkYXRpb25FcnJvcnMsIG9wdGlvbnMpXG5cbiAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy50aHJvd1ZhbGlkYXRpb25FcnJvciAhPSBmYWxzZSkge1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBodW1hbkF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGtleU5hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJpMThuS2V5XCIpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgY29uc3QgaTE4biA9IENvbmZpZy5nZXRJMThuKClcblxuICAgIGlmIChpMThuKSByZXR1cm4gaTE4bi50KGBhY3RpdmVyZWNvcmQuYXR0cmlidXRlcy4ke2tleU5hbWV9LiR7QmFzZU1vZGVsLnNuYWtlQ2FzZShhdHRyaWJ1dGVOYW1lKX1gLCB7ZGVmYXVsdFZhbHVlOiBhdHRyaWJ1dGVOYW1lfSlcblxuICAgIHJldHVybiBpbmZsZWN0aW9uLmh1bWFuaXplKGF0dHJpYnV0ZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0F0dHJpYnV0ZUNoYW5nZWQoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC52YWx1ZXModGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXMpXG4gICAgY29uc3QgYXR0cmlidXRlRGF0YSA9IGF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBkaWdnKGF0dHJpYnV0ZSwgXCJuYW1lXCIpID09IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlKVxuXG4gICAgaWYgKCFhdHRyaWJ1dGVEYXRhKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IGF0dHJpYnV0ZXMubWFwKChhdHRyaWJ1dGUpID0+IGRpZ2coYXR0cmlidXRlLCBcIm5hbWVcIikpXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lOiBcIiR7YXR0cmlidXRlTmFtZX1cIiBpbjogJHthdHRyaWJ1dGVOYW1lcy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAoIShhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSBpbiB0aGlzLmNoYW5nZXMpKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlXVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5jaGFuZ2VzW2F0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlXVxuICAgIGNvbnN0IGNoYW5nZWRNZXRob2QgPSB0aGlzW2BfaXMke2luZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlRGF0YS50eXBlLCB0cnVlKX1DaGFuZ2VkYF1cblxuICAgIGlmICghY2hhbmdlZE1ldGhvZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHR5cGU6ICR7YXR0cmlidXRlRGF0YS50eXBlfWApXG5cbiAgICByZXR1cm4gY2hhbmdlZE1ldGhvZChvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGlzQ2hhbmdlZCgpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5jaGFuZ2VzKVxuXG4gICAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBpc05ld1JlY29yZCgpIHtcbiAgICBpZiAodGhpcy5uZXdSZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMubmV3UmVjb3JkXG4gICAgfSBlbHNlIGlmIChcImlkXCIgaW4gdGhpcy5tb2RlbERhdGEgJiYgdGhpcy5tb2RlbERhdGEuaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNQZXJzaXN0ZWQoKSB7IHJldHVybiAhdGhpcy5pc05ld1JlY29yZCgpIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIHNuYWtlQ2FzZShzdHJpbmcpIHsgcmV0dXJuIGluZmxlY3Rpb24udW5kZXJzY29yZShzdHJpbmcpIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzYXZlZENoYW5nZVRvQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBpZiAoIXRoaXMucHJldmlvdXNNb2RlbERhdGEpXG4gICAgICByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC52YWx1ZXModGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXMpXG4gICAgY29uc3QgYXR0cmlidXRlRGF0YSA9IGF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSA9PSBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSlcblxuICAgIGlmICghYXR0cmlidXRlRGF0YSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSBhdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lOiBcIiR7YXR0cmlidXRlTmFtZX1cIiBpbjogJHthdHRyaWJ1dGVOYW1lcy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAoIShhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSBpbiB0aGlzLnByZXZpb3VzTW9kZWxEYXRhKSlcbiAgICAgIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMucHJldmlvdXNNb2RlbERhdGFbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kTmFtZSA9IGBfaXMke2luZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlRGF0YS50eXBlKX1DaGFuZ2VkYFxuICAgIGNvbnN0IGNoYW5nZWRNZXRob2QgPSB0aGlzW2NoYW5nZWRNZXRob2ROYW1lXVxuXG4gICAgaWYgKCFjaGFuZ2VkTWV0aG9kKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdHlwZTogJHthdHRyaWJ1dGVEYXRhLnR5cGV9YClcblxuICAgIHJldHVybiBjaGFuZ2VkTWV0aG9kKG9sZFZhbHVlLCBuZXdWYWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbH0gbW9kZWxcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXROZXdNb2RlbChtb2RlbCkge1xuICAgIHRoaXMuc2V0TmV3TW9kZWxEYXRhKG1vZGVsKVxuXG4gICAgZm9yKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gbW9kZWwucmVsYXRpb25zaGlwcykge1xuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWwucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuICAgIH1cblxuICAgIGZvcihjb25zdCByZWxhdGlvbnNoaXBDYWNoZU5hbWUgaW4gbW9kZWwucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBDYWNoZU5hbWVdID0gbW9kZWwucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcENhY2hlTmFtZV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCYXNlTW9kZWx9IG1vZGVsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TmV3TW9kZWxEYXRhKG1vZGVsKSB7XG4gICAgaWYgKCEoXCJtb2RlbERhdGFcIiBpbiBtb2RlbCkpIHRocm93IG5ldyBFcnJvcihgTm8gbW9kZWxEYXRhIGluIG1vZGVsOiAke0pTT04uc3RyaW5naWZ5KG1vZGVsKX1gKVxuXG4gICAgdGhpcy5wcmV2aW91c01vZGVsRGF0YSA9IHsuLi5kaWdnKHRoaXMsIFwibW9kZWxEYXRhXCIpfVxuXG4gICAgZm9yKGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gbW9kZWwubW9kZWxEYXRhKSB7XG4gICAgICB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXSA9IG1vZGVsLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge01vZGVsVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkfSBvbGRWYWx1ZVxuICAgKiBAcGFyYW0ge01vZGVsVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkfSBuZXdWYWx1ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbiB8IHZvaWR9XG4gICAqL1xuICBfaXNEYXRlQ2hhbmdlZChvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICBpZiAoRGF0ZS5wYXJzZShTdHJpbmcob2xkVmFsdWUpKSAhPSBEYXRlLnBhcnNlKFN0cmluZyhuZXdWYWx1ZSkpKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge01vZGVsVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkfSBvbGRWYWx1ZVxuICAgKiBAcGFyYW0ge01vZGVsVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkfSBuZXdWYWx1ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbiB8IHZvaWR9XG4gICAqL1xuICBfaXNJbnRlZ2VyQ2hhbmdlZChvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICBpZiAocGFyc2VJbnQoU3RyaW5nKG9sZFZhbHVlKSwgMTApICE9IHBhcnNlSW50KFN0cmluZyhuZXdWYWx1ZSksIDEwKSlcbiAgICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNb2RlbFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZH0gb2xkVmFsdWVcbiAgICogQHBhcmFtIHtNb2RlbFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZH0gbmV3VmFsdWVcbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCB2b2lkfVxuICAgKi9cbiAgX2lzU3RyaW5nQ2hhbmdlZCAob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgY29uc3Qgb2xkQ29udmVydGVkVmFsdWUgPSBgJHtvbGRWYWx1ZX1gXG4gICAgY29uc3QgbmV3Q29udmVydGVkVmFsdWUgPSBgJHtuZXdWYWx1ZX1gXG5cbiAgICBpZiAob2xkQ29udmVydGVkVmFsdWUgIT0gbmV3Q29udmVydGVkVmFsdWUpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtNb2RlbENsYXNzRGF0YVR5cGV9ICovXG4gIG1vZGVsQ2xhc3NEYXRhKCkgeyByZXR1cm4gdGhpcy5tb2RlbENsYXNzKCkubW9kZWxDbGFzc0RhdGEoKSB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyByZWxvYWQoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKVxuICAgIGNvbnN0IHJhbnNhY2tQYXJhbXMgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5Db2xsZWN0aW9uUmFuc2Fja1BhcmFtc30gKi8gKHt9KVxuICAgIHJhbnNhY2tQYXJhbXNbYCR7dGhpcy5tb2RlbENsYXNzKCkucHJpbWFyeUtleSgpfV9lcWBdID0gdGhpcy5wcmltYXJ5S2V5KClcblxuICAgIGxldCBxdWVyeSA9IHRoaXMubW9kZWxDbGFzcygpLnJhbnNhY2socmFuc2Fja1BhcmFtcylcblxuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGlmIChwYXJhbXMucHJlbG9hZCkge1xuICAgICAgICBxdWVyeS5xdWVyeUFyZ3MucHJlbG9hZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLlByZWxvYWRWYWx1ZX0gKi8gKHBhcmFtcy5wcmVsb2FkKVxuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNlbGVjdCkge1xuICAgICAgICBxdWVyeS5xdWVyeUFyZ3Muc2VsZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59ICovIChwYXJhbXMuc2VsZWN0KVxuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNlbGVjdF9jb2x1bW5zKSB7XG4gICAgICAgIHF1ZXJ5LnF1ZXJ5QXJncy5zZWxlY3RDb2x1bW5zID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59ICovIChwYXJhbXMuc2VsZWN0X2NvbHVtbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCBxdWVyeS5maXJzdCgpXG4gICAgdGhpcy5zZXROZXdNb2RlbChtb2RlbClcbiAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHttb2RlbDogQmFzZU1vZGVsLCByZXNwb25zZT86IG9iamVjdH0+fSAqL1xuICBzYXZlKCkge1xuICAgIGlmICh0aGlzLmlzTmV3UmVjb3JkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmF3RGF0YUlucHV0fSByYXdEYXRhXG4gICAqIEBwYXJhbSB7UGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9ucyAmIHtzaW1wbGVNb2RlbEVycm9ycz86IGJvb2xlYW59fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge1Byb21pc2U8e21vZGVsOiBCYXNlTW9kZWwsIHJlc3BvbnNlOiBNb2RlbENvbW1hbmRSZXNwb25zZX0+fVxuICAgKi9cbiAgc2F2ZVJhdyhyYXdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVSYXcocmF3RGF0YSwgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TW9kZWxEYXRhTWFwfSBbbmV3QXR0cmlidXRlc11cbiAgICogQHBhcmFtIHtQYXJzZVZhbGlkYXRpb25FcnJvcnNPcHRpb25zfSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge1Byb21pc2U8e1xuICAgKiAgIG1vZGVsOiBCYXNlTW9kZWwsXG4gICAqICAgcmVzcG9uc2U/OiBvYmplY3RcbiAgICogfT59XG4gICAqL1xuICBhc3luYyB1cGRhdGUobmV3QXR0cmlidXRlcywgb3B0aW9ucykge1xuICAgIGlmIChuZXdBdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLmFzc2lnbkF0dHJpYnV0ZXMobmV3QXR0cmlidXRlcylcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5jaGFuZ2VzKS5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIHttb2RlbDogdGhpc31cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbUtleSA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5wYXJhbUtleVxuICAgIGNvbnN0IG1vZGVsRGF0YSA9IHRoaXMuY2hhbmdlc1xuICAgIGNvbnN0IGRhdGFUb1VzZSA9IHt9XG4gICAgZGF0YVRvVXNlW3BhcmFtS2V5XSA9IG1vZGVsRGF0YVxuICAgIGxldCByZXNwb25zZVxuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gLyoqIEB0eXBlIHtNb2RlbENvbW1hbmRSZXNwb25zZX0gKi8gKGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgcXVlcnlfcGFyYW1zOiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpLFxuICAgICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LXVwZGF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWw6IHRoaXMsIG9wdGlvbnN9KVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hNb2RlbEZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtyZXNwb25zZSwgbW9kZWw6IHRoaXN9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNb2RlbENvbW1hbmRSZXNwb25zZX0gcmVzcG9uc2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgbGV0IG5ld01vZGVsID0gZGlnZyhyZXNwb25zZSwgXCJtb2RlbFwiKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3TW9kZWwpKSBuZXdNb2RlbCA9IG5ld01vZGVsWzBdXG5cbiAgICB0aGlzLnNldE5ld01vZGVsKG5ld01vZGVsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TW9kZWxDb21tYW5kUmVzcG9uc2V9IHJlc3BvbnNlXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlZnJlc2hNb2RlbERhdGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBsZXQgbmV3TW9kZWwgPSBkaWdnKHJlc3BvbnNlLCBcIm1vZGVsXCIpXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdNb2RlbCkpIG5ld01vZGVsID0gbmV3TW9kZWxbMF1cblxuICAgIHRoaXMuc2V0TmV3TW9kZWxEYXRhKG5ld01vZGVsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmF3RGF0YUlucHV0fSByYXdEYXRhXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtNb2RlbERhdGFNYXB9XG4gICAqL1xuICBzdGF0aWMgX29iamVjdERhdGFGcm9tR2l2ZW5SYXdEYXRhKHJhd0RhdGEsIG9wdGlvbnMpIHtcbiAgICBpZiAocmF3RGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8IEJhc2VNb2RlbC5faXNGb3JtRWxlbWVudChyYXdEYXRhKSkge1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBGb3JtRGF0YU9iamVjdGl6ZXIuZm9ybURhdGFGcm9tT2JqZWN0KHJhd0RhdGEsIG9wdGlvbnMpXG5cbiAgICAgIHJldHVybiAvKiogQHR5cGUge01vZGVsRGF0YU1hcH0gKi8gKEZvcm1EYXRhT2JqZWN0aXplci50b09iamVjdChmb3JtRGF0YSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJhd0RhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Jhd0RhdGFJbnB1dCB8IE1vZGVsVmFsdWV9IHZhbHVlXG4gICAqIEByZXR1cm5zIHt2YWx1ZSBpcyBIVE1MRm9ybUVsZW1lbnR9XG4gICAqL1xuICBzdGF0aWMgX2lzRm9ybUVsZW1lbnQodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIEhUTUxGb3JtRWxlbWVudCAhPSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSYXdEYXRhSW5wdXR9IHJhd0RhdGFcbiAgICogQHBhcmFtIHtQYXJzZVZhbGlkYXRpb25FcnJvcnNPcHRpb25zICYge3NpbXBsZU1vZGVsRXJyb3JzPzogYm9vbGVhbn19IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7cmVzcG9uc2U6IE1vZGVsQ29tbWFuZFJlc3BvbnNlLCBtb2RlbDogQmFzZU1vZGVsfT59XG4gICAqL1xuICBhc3luYyB1cGRhdGVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgb2JqZWN0RGF0YSA9IEJhc2VNb2RlbC5fb2JqZWN0RGF0YUZyb21HaXZlblJhd0RhdGEocmF3RGF0YSwgb3B0aW9ucylcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IC8qKiBAdHlwZSB7TW9kZWxDb21tYW5kUmVzcG9uc2V9ICovIChhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHF1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKSxcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGEsXG4gICAgICAgICAgICBzaW1wbGVfbW9kZWxfZXJyb3JzOiBvcHRpb25zPy5zaW1wbGVNb2RlbEVycm9yc1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS11cGRhdGVgLFxuICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIlxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxGcm9tUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgIH1cblxuICAgIHJldHVybiB7cmVzcG9uc2UsIG1vZGVsOiB0aGlzfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtuZXZlcn0gKi9cbiAgaXNWYWxpZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQgeWV0XCIpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8e3ZhbGlkOiBib29sZWFuLCBlcnJvcnM6IFZhbGlkYXRpb25SZXNwb25zZUVycm9yc30+fSAqL1xuICBhc3luYyBpc1ZhbGlkT25TZXJ2ZXIoKSB7XG4gICAgY29uc3QgbW9kZWxEYXRhID0gdGhpcy5nZXRBdHRyaWJ1dGVzKClcbiAgICBjb25zdCBwYXJhbUtleSA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5wYXJhbUtleVxuICAgIGNvbnN0IGRhdGFUb1VzZSA9IHt9XG4gICAgZGF0YVRvVXNlW3BhcmFtS2V5XSA9IG1vZGVsRGF0YVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgIHtcbiAgICAgICAgYXJnczoge1xuICAgICAgICAgIHNhdmU6IGRhdGFUb1VzZVxuICAgICAgICB9LFxuICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LXZhbGlkYCxcbiAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgIHR5cGU6IFwidmFsaWRcIlxuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKVxuXG4gICAgcmV0dXJuIHt2YWxpZDogcmVzcG9uc2UudmFsaWQsIGVycm9yczogcmVzcG9uc2UuZXJyb3JzfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtCYXNlTW9kZWxDbGFzc1R5cGV9ICovXG4gIG1vZGVsQ2xhc3MoKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7QmFzZU1vZGVsQ2xhc3NUeXBlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZVxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbCB8IEJhc2VNb2RlbFtdIHwgbnVsbH0gbW9kZWxcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBwcmVsb2FkUmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcE5hbWUsIG1vZGVsKSB7XG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbQmFzZU1vZGVsLnNuYWtlQ2FzZShyZWxhdGlvbnNoaXBOYW1lKV0gPSBtb2RlbFxuICAgIHRoaXMucmVsYXRpb25zaGlwc1tCYXNlTW9kZWwuc25ha2VDYXNlKHJlbGF0aW9uc2hpcE5hbWUpXSA9IG1vZGVsXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG1hcmtGb3JEZXN0cnVjdGlvbigpIHtcbiAgICB0aGlzLl9tYXJrZWRGb3JEZXN0cnVjdGlvbiA9IHRydWVcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgbWFya2VkRm9yRGVzdHJ1Y3Rpb24oKSB7IHJldHVybiB0aGlzLl9tYXJrZWRGb3JEZXN0cnVjdGlvbiB8fCBmYWxzZSB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gIHVuaXF1ZUtleSgpIHtcbiAgICBpZiAoIXRoaXMudW5pcXVlS2V5VmFsdWUpIHtcbiAgICAgIGNvbnN0IG1pbiA9IDUwMDAwMDAwMDAwMDAwMDBcbiAgICAgIGNvbnN0IG1heCA9IDkwMDcxOTkyNTQ3NDA5OTFcbiAgICAgIGNvbnN0IHJhbmdlID0gbWF4IC0gbWluICsgMVxuICAgICAgdGhpcy51bmlxdWVLZXlWYWx1ZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHJhbmdlKSArIG1pblxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVuaXF1ZUtleVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNb2RlbENvbW1hbmREZXNjcmlwdG9yfSBhcmdzXG4gICAqIEBwYXJhbSB7TW9kZWxDb21tYW5kT3B0aW9uc30gY29tbWFuZEFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxDb21tYW5kUmVzcG9uc2U+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIF9jYWxsQ29sbGVjdGlvbkNvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpIHtcbiAgICBjb25zdCBmb3JtT3JEYXRhT2JqZWN0ID0gYXJncy5hcmdzXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKGFyZ3MsIGNvbW1hbmRBcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsZXQgZm9ybVxuXG4gICAgICBpZiAoY29tbWFuZEFyZ3MuZm9ybSkge1xuICAgICAgICBmb3JtID0gY29tbWFuZEFyZ3MuZm9ybVxuICAgICAgfSBlbHNlIGlmIChmb3JtT3JEYXRhT2JqZWN0ICYmIEJhc2VNb2RlbC5faXNGb3JtRWxlbWVudChmb3JtT3JEYXRhT2JqZWN0KSkge1xuICAgICAgICBmb3JtID0gZm9ybU9yRGF0YU9iamVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybSkgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG9wdGlvbnM6IHtmb3JtfX0pXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TW9kZWxDb21tYW5kRGVzY3JpcHRvcn0gYXJnc1xuICAgKiBAcGFyYW0ge01vZGVsQ29tbWFuZE9wdGlvbnN9IGNvbW1hbmRBcmdzXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2NvbW1hbmQtZXhlY3V0aW9uLmpzXCIpLmRlZmF1bHR9XG4gICAqL1xuICBfY2FsbE1lbWJlckNvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpIHtcbiAgICByZXR1cm4gQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YSB8IE1vZGVsRGF0YU1hcH0gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAgICovXG4gIHN0YXRpYyBfcG9zdERhdGFGcm9tQXJncyhhcmdzKSB7XG4gICAgbGV0IHBvc3REYXRhXG5cbiAgICBpZiAoYXJncykge1xuICAgICAgaWYgKGFyZ3MgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgICBwb3N0RGF0YSA9IGFyZ3NcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvc3REYXRhID0gb2JqZWN0VG9Gb3JtRGF0YS5zZXJpYWxpemUoYXJncywge30sIG51bGwsIFwiYXJnc1wiKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3N0RGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3REYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge01vZGVsVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgcmVhZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcblxuICAgIHJldHVybiB0aGlzLnJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtNb2RlbFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBpZiAoYXR0cmlidXRlTmFtZSBpbiB0aGlzLmNoYW5nZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZXNbYXR0cmlidXRlTmFtZV1cbiAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGlzIGlzIGEgbmV3IHJlY29yZCBhbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGEgcmVjb2duaXplZCBhdHRyaWJ1dGVcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJhdHRyaWJ1dGVzXCIpXG5cbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNQZXJzaXN0ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZU5vdExvYWRlZEVycm9yKGBObyBzdWNoIGF0dHJpYnV0ZTogJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfSMke2F0dHJpYnV0ZU5hbWV9OiAke0pTT04uc3RyaW5naWZ5KHRoaXMubW9kZWxEYXRhKX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXR0cmlidXRlTG9hZGVkKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlIGluIHRoaXMuY2hhbmdlcykgcmV0dXJuIHRydWVcbiAgICBpZiAoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5tb2RlbERhdGEpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNb2RlbFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsdWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBfaXNQcmVzZW50KHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5tYXRjaCgvXlxccyokLykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtSZWxhdGlvbnNoaXBMb2FkQXJnc30gYXJnc1xuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5RdWVyeUFyZ3NUeXBlfSBxdWVyeUFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8QmFzZU1vZGVsIHwgbnVsbD59XG4gICAqL1xuICBhc3luYyBfbG9hZEJlbG9uZ3NUb1JlZmxlY3Rpb24oYXJncywgcXVlcnlBcmdzID0ge30pIHtcbiAgICBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge0Jhc2VNb2RlbCB8IG51bGx9ICovICh0aGlzLnJlbGF0aW9uc2hpcHNbYXJncy5yZWZsZWN0aW9uTmFtZV0pXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtCYXNlTW9kZWwgfCBudWxsfSAqLyAodGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPHR5cGVvZiBCYXNlTW9kZWw+fSAqLyAoYXJncyksXG4gICAgICAgIHF1ZXJ5QXJnc1xuICAgICAgKVxuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCBjb2xsZWN0aW9uLmZpcnN0KClcbiAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxcbiAgICAgIHJldHVybiBtb2RlbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1JlbGF0aW9uc2hpcExvYWRBcmdzfSBhcmdzXG4gICAqIEByZXR1cm5zIHtCYXNlTW9kZWwgfCBudWxsfVxuICAgKi9cbiAgX3JlYWRCZWxvbmdzVG9SZWZsZWN0aW9uKHtyZWZsZWN0aW9uTmFtZX0pIHtcbiAgICBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtCYXNlTW9kZWwgfCBudWxsfSAqLyAodGhpcy5yZWxhdGlvbnNoaXBzW3JlZmxlY3Rpb25OYW1lXSlcbiAgICB9IGVsc2UgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtCYXNlTW9kZWwgfCBudWxsfSAqLyAodGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVmbGVjdGlvbk5hbWVdKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTmV3UmVjb3JkKCkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBsb2FkZWRSZWxhdGlvbnNoaXBzID0gT2JqZWN0LmtleXModGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpXG4gICAgY29uc3QgbW9kZWxDbGFzc05hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG5cbiAgICB0aHJvdyBuZXcgTm90TG9hZGVkRXJyb3IoYCR7bW9kZWxDbGFzc05hbWV9IyR7cmVmbGVjdGlvbk5hbWV9IGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQuIE9ubHkgdGhlc2Ugd2VyZSBsb2FkZWQ6ICR7bG9hZGVkUmVsYXRpb25zaGlwcy5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1JlbGF0aW9uc2hpcExvYWRBcmdzfSBhcmdzXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLlF1ZXJ5QXJnc1R5cGV9IHF1ZXJ5QXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCYXNlTW9kZWxbXT59XG4gICAqL1xuICBhc3luYyBfbG9hZEhhc01hbnlSZWZsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncyA9IHt9KSB7XG4gICAgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtCYXNlTW9kZWxbXX0gKi8gKHRoaXMucmVsYXRpb25zaGlwc1thcmdzLnJlZmxlY3Rpb25OYW1lXSlcbiAgICB9IGVsc2UgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge0Jhc2VNb2RlbFtdfSAqLyAodGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0pXG4gICAgfVxuXG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uKFxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPHR5cGVvZiBCYXNlTW9kZWw+fSAqLyAoYXJncyksXG4gICAgICBxdWVyeUFyZ3NcbiAgICApXG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgY29sbGVjdGlvbi50b0FycmF5KClcblxuICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxzXG5cbiAgICByZXR1cm4gbW9kZWxzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtSZWxhdGlvbnNoaXBMb2FkQXJnc30gYXJnc1xuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5RdWVyeUFyZ3NUeXBlfSBxdWVyeUFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8QmFzZU1vZGVsIHwgbnVsbD59XG4gICAqL1xuICBhc3luYyBfbG9hZEhhc09uZVJlZmxlY3Rpb24oYXJncywgcXVlcnlBcmdzID0ge30pIHtcbiAgICBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge0Jhc2VNb2RlbCB8IG51bGx9ICovICh0aGlzLnJlbGF0aW9uc2hpcHNbYXJncy5yZWZsZWN0aW9uTmFtZV0pXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtCYXNlTW9kZWwgfCBudWxsfSAqLyAodGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPHR5cGVvZiBCYXNlTW9kZWw+fSAqLyAoYXJncyksXG4gICAgICAgIHF1ZXJ5QXJnc1xuICAgICAgKVxuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCBjb2xsZWN0aW9uLmZpcnN0KClcblxuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0gPSBtb2RlbFxuXG4gICAgICByZXR1cm4gbW9kZWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtSZWxhdGlvbnNoaXBMb2FkQXJnc30gYXJnc1xuICAgKiBAcmV0dXJucyB7QmFzZU1vZGVsIHwgbnVsbH1cbiAgICovXG4gIF9yZWFkSGFzT25lUmVmbGVjdGlvbih7cmVmbGVjdGlvbk5hbWV9KSB7XG4gICAgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7QmFzZU1vZGVsIHwgbnVsbH0gKi8gKHRoaXMucmVsYXRpb25zaGlwc1tyZWZsZWN0aW9uTmFtZV0pXG4gICAgfSBlbHNlIGlmIChyZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7QmFzZU1vZGVsIHwgbnVsbH0gKi8gKHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlZmxlY3Rpb25OYW1lXSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZFJlbGF0aW9uc2hpcHMgPSBPYmplY3Qua2V5cyh0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSlcbiAgICBjb25zdCBtb2RlbENsYXNzTmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcblxuICAgIHRocm93IG5ldyBOb3RMb2FkZWRFcnJvcihgJHttb2RlbENsYXNzTmFtZX0jJHtyZWZsZWN0aW9uTmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIHlldC4gT25seSB0aGVzZSB3ZXJlIGxvYWRlZDogJHtsb2FkZWRSZWxhdGlvbnNoaXBzLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QmFzZU1vZGVsQXJnc09iamVjdH0gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlYWRNb2RlbERhdGFGcm9tQXJncyhhcmdzKSB7XG4gICAgdGhpcy5hYmlsaXRpZXMgPSBhcmdzLmRhdGEuYiB8fCB7fVxuICAgIHRoaXMuY29sbGVjdGlvbiA9IGFyZ3MuY29sbGVjdGlvblxuICAgIHRoaXMubW9kZWxEYXRhID0gb2JqZWN0VG9VbmRlcnNjb3JlKGFyZ3MuZGF0YS5hKVxuICAgIHRoaXMucHJlbG9hZGVkUmVsYXRpb25zaGlwcyA9IGFyZ3MuZGF0YS5yXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7Z2V0TW9kZWw6IChyZWxhdGlvbnNoaXBUeXBlOiBzdHJpbmcsIHJlbGF0aW9uc2hpcElkOiBudW1iZXIgfCBzdHJpbmcpID0+IEJhc2VNb2RlbH19IHByZWxvYWRlZFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZWFkUHJlbG9hZGVkUmVsYXRpb25zaGlwcyhwcmVsb2FkZWQpIHtcbiAgICBpZiAoIXRoaXMucHJlbG9hZGVkUmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJlbGF0aW9uc2hpcHNcIilcblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBpbiB0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcERhdGEgPSB0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcENsYXNzRGF0YSA9IHJlbGF0aW9uc2hpcHMuZmluZCgocmVsYXRpb25zaGlwKSA9PiBkaWdnKHJlbGF0aW9uc2hpcCwgXCJuYW1lXCIpID09IHJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgICAgIGlmICghcmVsYXRpb25zaGlwQ2xhc3NEYXRhKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcbiAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwc0xpc3QgPSByZWxhdGlvbnNoaXBzLm1hcCgocmVsYXRpb25zaGlwKSA9PiByZWxhdGlvbnNoaXAubmFtZSkuam9pbihcIiwgXCIpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCB0aGUgcmVsYXRpb24gJHtyZWxhdGlvbnNoaXBOYW1lfSBvbiB0aGUgJHttb2RlbE5hbWV9IG1vZGVsOiAke3JlbGF0aW9uc2hpcHNMaXN0fWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcFR5cGUgPSBkaWdnKHJlbGF0aW9uc2hpcENsYXNzRGF0YSwgXCJjb2xsZWN0aW9uTmFtZVwiKVxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVsYXRpb25zaGlwTmFtZX0gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRgKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcENsYXNzRGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJlbGF0aW9uc2hpcCBvbiAke2RpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIil9IGJ5IHRoYXQgbmFtZTogJHtyZWxhdGlvbnNoaXBOYW1lfWApXG4gICAgICB9XG5cbiAgICAgIGlmICghcmVsYXRpb25zaGlwRGF0YSkge1xuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXSA9IG51bGxcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbnVsbFxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlbGF0aW9uc2hpcERhdGEpKSB7XG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcE5hbWVdID0gW11cbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcElkIG9mIHJlbGF0aW9uc2hpcERhdGEpIHtcbiAgICAgICAgICBjb25zdCBtb2RlbCA9IHByZWxvYWRlZC5nZXRNb2RlbChyZWxhdGlvbnNoaXBUeXBlLCByZWxhdGlvbnNoaXBJZClcblxuICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcE5hbWVdLnB1c2gobW9kZWwpXG4gICAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdLnB1c2gobW9kZWwpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gcHJlbG9hZGVkLmdldE1vZGVsKHJlbGF0aW9uc2hpcFR5cGUsIHJlbGF0aW9uc2hpcERhdGEpXG5cbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwTmFtZV0gPSBtb2RlbFxuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV0gPSBtb2RlbFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyIHwgc3RyaW5nfSAqL1xuICBwcmltYXJ5S2V5KCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge251bWJlciB8IHN0cmluZ30gKi8gKHRoaXMucmVhZEF0dHJpYnV0ZVVuZGVyc2NvcmUodGhpcy5tb2RlbENsYXNzKCkucHJpbWFyeUtleSgpKSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYXNlTW9kZWxcbiJdfQ==