@kaspernj/api-maker 1.0.2053 → 1.0.2055

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 (948) hide show
  1. package/build/api.d.ts +19 -0
  2. package/build/api.d.ts.map +1 -0
  3. package/build/api.js +77 -109
  4. package/build/api.js.map +1 -0
  5. package/build/attribute-not-loaded-error.d.ts +3 -0
  6. package/build/attribute-not-loaded-error.d.ts.map +1 -0
  7. package/build/attribute-not-loaded-error.js +3 -2
  8. package/build/attribute-not-loaded-error.js.map +1 -0
  9. package/build/base-component.d.ts +4 -0
  10. package/build/base-component.d.ts.map +1 -0
  11. package/build/base-component.js +2 -3
  12. package/build/base-component.js.map +1 -0
  13. package/build/base-error.d.ts +31 -0
  14. package/build/base-error.d.ts.map +1 -0
  15. package/build/base-error.js +44 -26
  16. package/build/base-error.js.map +1 -0
  17. package/build/base-model/attribute.d.ts +45 -0
  18. package/build/base-model/attribute.d.ts.map +1 -0
  19. package/build/base-model/attribute.js +49 -22
  20. package/build/base-model/attribute.js.map +1 -0
  21. package/build/base-model/column.d.ts +17 -0
  22. package/build/base-model/column.d.ts.map +1 -0
  23. package/build/base-model/column.js +15 -8
  24. package/build/base-model/column.js.map +1 -0
  25. package/build/base-model/reflection.d.ts +22 -0
  26. package/build/base-model/reflection.d.ts.map +1 -0
  27. package/build/base-model/reflection.js +22 -10
  28. package/build/base-model/reflection.js.map +1 -0
  29. package/build/base-model/scope.d.ts +9 -0
  30. package/build/base-model/scope.d.ts.map +1 -0
  31. package/build/base-model/scope.js +10 -7
  32. package/build/base-model/scope.js.map +1 -0
  33. package/build/base-model.js +1020 -812
  34. package/build/base-model.js.map +1 -0
  35. package/build/bootstrap/attribute-row.d.ts +3 -0
  36. package/build/bootstrap/attribute-row.d.ts.map +1 -0
  37. package/build/bootstrap/attribute-row.js +84 -123
  38. package/build/bootstrap/attribute-row.js.map +1 -0
  39. package/build/bootstrap/attribute-rows.d.ts +3 -0
  40. package/build/bootstrap/attribute-rows.d.ts.map +1 -0
  41. package/build/bootstrap/attribute-rows.js +17 -25
  42. package/build/bootstrap/attribute-rows.js.map +1 -0
  43. package/build/bootstrap/card.d.ts +3 -0
  44. package/build/bootstrap/card.d.ts.map +1 -0
  45. package/build/bootstrap/card.js +74 -129
  46. package/build/bootstrap/card.js.map +1 -0
  47. package/build/bootstrap/checkbox.d.ts +3 -0
  48. package/build/bootstrap/checkbox.d.ts.map +1 -0
  49. package/build/bootstrap/checkbox.js +49 -90
  50. package/build/bootstrap/checkbox.js.map +1 -0
  51. package/build/bootstrap/checkboxes.d.ts +3 -0
  52. package/build/bootstrap/checkboxes.d.ts.map +1 -0
  53. package/build/bootstrap/checkboxes.js +107 -167
  54. package/build/bootstrap/checkboxes.js.map +1 -0
  55. package/build/bootstrap/index.d.ts +1 -0
  56. package/build/bootstrap/index.d.ts.map +1 -0
  57. package/build/bootstrap/index.js +1 -2
  58. package/build/bootstrap/index.js.map +1 -0
  59. package/build/bootstrap/input.d.ts +3 -0
  60. package/build/bootstrap/input.d.ts.map +1 -0
  61. package/build/bootstrap/input.js +73 -118
  62. package/build/bootstrap/input.js.map +1 -0
  63. package/build/bootstrap/invalid-feedback.d.ts +6 -0
  64. package/build/bootstrap/invalid-feedback.d.ts.map +1 -0
  65. package/build/bootstrap/invalid-feedback.js +17 -20
  66. package/build/bootstrap/invalid-feedback.js.map +1 -0
  67. package/build/bootstrap/paginate.d.ts +3 -0
  68. package/build/bootstrap/paginate.d.ts.map +1 -0
  69. package/build/bootstrap/paginate.js +88 -136
  70. package/build/bootstrap/paginate.js.map +1 -0
  71. package/build/bootstrap/radio-buttons.d.ts +3 -0
  72. package/build/bootstrap/radio-buttons.d.ts.map +1 -0
  73. package/build/bootstrap/radio-buttons.js +44 -64
  74. package/build/bootstrap/radio-buttons.js.map +1 -0
  75. package/build/bootstrap/select.d.ts +3 -0
  76. package/build/bootstrap/select.d.ts.map +1 -0
  77. package/build/bootstrap/select.js +49 -81
  78. package/build/bootstrap/select.js.map +1 -0
  79. package/build/bootstrap/sort-link.d.ts +3 -0
  80. package/build/bootstrap/sort-link.d.ts.map +1 -0
  81. package/build/bootstrap/sort-link.js +62 -121
  82. package/build/bootstrap/sort-link.js.map +1 -0
  83. package/build/cable-connection-pool.d.ts +27 -0
  84. package/build/cable-connection-pool.d.ts.map +1 -0
  85. package/build/cable-connection-pool.js +90 -117
  86. package/build/cable-connection-pool.js.map +1 -0
  87. package/build/cable-subscription-pool.d.ts +16 -0
  88. package/build/cable-subscription-pool.d.ts.map +1 -0
  89. package/build/cable-subscription-pool.js +146 -191
  90. package/build/cable-subscription-pool.js.map +1 -0
  91. package/build/cable-subscription.d.ts +7 -0
  92. package/build/cable-subscription.d.ts.map +1 -0
  93. package/build/cable-subscription.js +15 -17
  94. package/build/cable-subscription.js.map +1 -0
  95. package/build/cache-key-generator.d.ts +15 -0
  96. package/build/cache-key-generator.d.ts.map +1 -0
  97. package/build/cache-key-generator.js +69 -70
  98. package/build/cache-key-generator.js.map +1 -0
  99. package/build/can-can.d.ts +19 -0
  100. package/build/can-can.d.ts.map +1 -0
  101. package/build/can-can.js +113 -119
  102. package/build/can-can.js.map +1 -0
  103. package/build/channels-consumer.d.ts +3 -0
  104. package/build/channels-consumer.d.ts.map +1 -0
  105. package/build/channels-consumer.js +6 -6
  106. package/build/channels-consumer.js.map +1 -0
  107. package/build/collection-loader.d.ts +3 -0
  108. package/build/collection-loader.d.ts.map +1 -0
  109. package/build/collection-loader.js +46 -40
  110. package/build/collection-loader.js.map +1 -0
  111. package/build/collection.d.ts +213 -0
  112. package/build/collection.d.ts.map +1 -0
  113. package/build/collection.js +442 -303
  114. package/build/collection.js.map +1 -0
  115. package/build/command-submit-data.d.ts +54 -0
  116. package/build/command-submit-data.d.ts.map +1 -0
  117. package/build/command-submit-data.js +108 -71
  118. package/build/command-submit-data.js.map +1 -0
  119. package/build/commands-pool.d.ts +63 -0
  120. package/build/commands-pool.d.ts.map +1 -0
  121. package/build/commands-pool.js +197 -181
  122. package/build/commands-pool.js.map +1 -0
  123. package/build/compose.d.ts +2 -0
  124. package/build/compose.d.ts.map +1 -0
  125. package/build/compose.js +8 -7
  126. package/build/compose.js.map +1 -0
  127. package/build/config.d.ts +9 -0
  128. package/build/config.d.ts.map +1 -0
  129. package/build/config.js +51 -63
  130. package/build/config.js.map +1 -0
  131. package/build/custom-error.d.ts +8 -0
  132. package/build/custom-error.d.ts.map +1 -0
  133. package/build/custom-error.js +4 -3
  134. package/build/custom-error.js.map +1 -0
  135. package/build/data-set-to-attributes.d.ts +2 -0
  136. package/build/data-set-to-attributes.d.ts.map +1 -0
  137. package/build/data-set-to-attributes.js +7 -7
  138. package/build/data-set-to-attributes.js.map +1 -0
  139. package/build/deserializer.d.ts +4 -0
  140. package/build/deserializer.d.ts.map +1 -0
  141. package/build/deserializer.js +51 -49
  142. package/build/deserializer.js.map +1 -0
  143. package/build/destroy-error.d.ts +8 -0
  144. package/build/destroy-error.d.ts.map +1 -0
  145. package/build/destroy-error.js +4 -3
  146. package/build/destroy-error.js.map +1 -0
  147. package/build/devise.d.ts +20 -0
  148. package/build/devise.d.ts.map +1 -0
  149. package/build/devise.js +104 -117
  150. package/build/devise.js.map +1 -0
  151. package/build/draggable-sort/controller.d.ts +41 -0
  152. package/build/draggable-sort/controller.d.ts.map +1 -0
  153. package/build/draggable-sort/controller.js +102 -128
  154. package/build/draggable-sort/controller.js.map +1 -0
  155. package/build/draggable-sort/index.d.ts +3 -0
  156. package/build/draggable-sort/index.d.ts.map +1 -0
  157. package/build/draggable-sort/index.js +61 -102
  158. package/build/draggable-sort/index.js.map +1 -0
  159. package/build/draggable-sort/item.d.ts +3 -0
  160. package/build/draggable-sort/item.d.ts.map +1 -0
  161. package/build/draggable-sort/item.js +122 -172
  162. package/build/draggable-sort/item.js.map +1 -0
  163. package/build/error-logger.d.ts +20 -0
  164. package/build/error-logger.d.ts.map +1 -0
  165. package/build/error-logger.js +95 -88
  166. package/build/error-logger.js.map +1 -0
  167. package/build/error-messages.d.ts +18 -0
  168. package/build/error-messages.d.ts.map +1 -0
  169. package/build/error-messages.js +22 -12
  170. package/build/error-messages.js.map +1 -0
  171. package/build/event-connection.d.ts +12 -0
  172. package/build/event-connection.d.ts.map +1 -0
  173. package/build/event-connection.js +25 -25
  174. package/build/event-connection.js.map +1 -0
  175. package/build/event-emitter-listener.d.ts +8 -0
  176. package/build/event-emitter-listener.d.ts.map +1 -0
  177. package/build/event-emitter-listener.js +8 -13
  178. package/build/event-emitter-listener.js.map +1 -0
  179. package/build/event-model-class.d.ts +9 -0
  180. package/build/event-model-class.d.ts.map +1 -0
  181. package/build/event-model-class.js +18 -18
  182. package/build/event-model-class.js.map +1 -0
  183. package/build/events.d.ts +4 -0
  184. package/build/events.d.ts.map +1 -0
  185. package/build/events.js +1 -1
  186. package/build/events.js.map +1 -0
  187. package/build/form.d.ts +14 -0
  188. package/build/form.d.ts.map +1 -0
  189. package/build/form.js +70 -86
  190. package/build/form.js.map +1 -0
  191. package/build/history-expo.d.ts +6 -0
  192. package/build/history-expo.d.ts.map +1 -0
  193. package/build/history-expo.js +10 -13
  194. package/build/history-expo.js.map +1 -0
  195. package/build/history-react-native.d.ts +6 -0
  196. package/build/history-react-native.d.ts.map +1 -0
  197. package/build/history-react-native.js +11 -13
  198. package/build/history-react-native.js.map +1 -0
  199. package/build/history.d.ts +3 -0
  200. package/build/history.d.ts.map +1 -0
  201. package/build/history.js +1 -1
  202. package/build/history.js.map +1 -0
  203. package/build/index.d.ts +2 -0
  204. package/build/index.d.ts.map +1 -0
  205. package/build/index.js +1 -1
  206. package/build/index.js.map +1 -0
  207. package/build/inputs/attachment.d.ts +3 -0
  208. package/build/inputs/attachment.d.ts.map +1 -0
  209. package/build/inputs/attachment.js +67 -126
  210. package/build/inputs/attachment.js.map +1 -0
  211. package/build/inputs/auto-submit.d.ts +9 -0
  212. package/build/inputs/auto-submit.d.ts.map +1 -0
  213. package/build/inputs/auto-submit.js +27 -30
  214. package/build/inputs/auto-submit.js.map +1 -0
  215. package/build/inputs/checkbox.d.ts +3 -0
  216. package/build/inputs/checkbox.d.ts.map +1 -0
  217. package/build/inputs/checkbox.js +76 -130
  218. package/build/inputs/checkbox.js.map +1 -0
  219. package/build/inputs/checkboxes.d.ts +3 -0
  220. package/build/inputs/checkboxes.d.ts.map +1 -0
  221. package/build/inputs/checkboxes.js +67 -99
  222. package/build/inputs/checkboxes.js.map +1 -0
  223. package/build/inputs/id-for-component.d.ts +2 -0
  224. package/build/inputs/id-for-component.d.ts.map +1 -0
  225. package/build/inputs/id-for-component.js +15 -12
  226. package/build/inputs/id-for-component.js.map +1 -0
  227. package/build/inputs/input-wrapper.d.ts +3 -0
  228. package/build/inputs/input-wrapper.d.ts.map +1 -0
  229. package/build/inputs/input-wrapper.js +6 -16
  230. package/build/inputs/input-wrapper.js.map +1 -0
  231. package/build/inputs/input.d.ts +5 -0
  232. package/build/inputs/input.d.ts.map +1 -0
  233. package/build/inputs/input.js +147 -223
  234. package/build/inputs/input.js.map +1 -0
  235. package/build/inputs/money.d.ts +3 -0
  236. package/build/inputs/money.d.ts.map +1 -0
  237. package/build/inputs/money.js +116 -160
  238. package/build/inputs/money.js.map +1 -0
  239. package/build/inputs/name-for-component.d.ts +2 -0
  240. package/build/inputs/name-for-component.d.ts.map +1 -0
  241. package/build/inputs/name-for-component.js +10 -9
  242. package/build/inputs/name-for-component.js.map +1 -0
  243. package/build/inputs/select.d.ts +5 -0
  244. package/build/inputs/select.d.ts.map +1 -0
  245. package/build/inputs/select.js +62 -81
  246. package/build/inputs/select.js.map +1 -0
  247. package/build/instance-of-class-name.d.ts +3 -0
  248. package/build/instance-of-class-name.d.ts.map +1 -0
  249. package/build/instance-of-class-name.js +15 -17
  250. package/build/instance-of-class-name.js.map +1 -0
  251. package/build/is-expo.d.ts +3 -0
  252. package/build/is-expo.d.ts.map +1 -0
  253. package/build/is-expo.js +11 -17
  254. package/build/is-expo.js.map +1 -0
  255. package/build/key-value-store.d.ts +11 -0
  256. package/build/key-value-store.d.ts.map +1 -0
  257. package/build/key-value-store.js +56 -50
  258. package/build/key-value-store.js.map +1 -0
  259. package/build/link.d.ts +3 -0
  260. package/build/link.d.ts.map +1 -0
  261. package/build/link.js +49 -74
  262. package/build/link.js.map +1 -0
  263. package/build/logger.d.ts +13 -0
  264. package/build/logger.d.ts.map +1 -0
  265. package/build/logger.js +30 -26
  266. package/build/logger.js.map +1 -0
  267. package/build/merge-styles.d.ts +2 -0
  268. package/build/merge-styles.d.ts.map +1 -0
  269. package/build/merge-styles.js +10 -9
  270. package/build/merge-styles.js.map +1 -0
  271. package/build/modal.d.ts +3 -0
  272. package/build/modal.d.ts.map +1 -0
  273. package/build/modal.js +20 -34
  274. package/build/modal.js.map +1 -0
  275. package/build/model-class-require.d.ts +3 -0
  276. package/build/model-class-require.d.ts.map +1 -0
  277. package/build/model-class-require.js +10 -10
  278. package/build/model-class-require.js.map +1 -0
  279. package/build/model-events.d.ts +8 -0
  280. package/build/model-events.d.ts.map +1 -0
  281. package/build/model-events.js +27 -27
  282. package/build/model-events.js.map +1 -0
  283. package/build/model-name.d.ts +8 -0
  284. package/build/model-name.d.ts.map +1 -0
  285. package/build/model-name.js +23 -24
  286. package/build/model-name.js.map +1 -0
  287. package/build/model-prop-type.d.ts +21 -0
  288. package/build/model-prop-type.d.ts.map +1 -0
  289. package/build/model-prop-type.js +89 -91
  290. package/build/model-prop-type.js.map +1 -0
  291. package/build/model-recipes-loader.d.ts +10 -0
  292. package/build/model-recipes-loader.d.ts.map +1 -0
  293. package/build/model-recipes-loader.js +19 -28
  294. package/build/model-recipes-loader.js.map +1 -0
  295. package/build/model-recipes-model-loader.d.ts +202 -0
  296. package/build/model-recipes-model-loader.d.ts.map +1 -0
  297. package/build/model-recipes-model-loader.js +226 -344
  298. package/build/model-recipes-model-loader.js.map +1 -0
  299. package/build/models-response-reader.d.ts +9 -0
  300. package/build/models-response-reader.d.ts.map +1 -0
  301. package/build/models-response-reader.js +35 -36
  302. package/build/models-response-reader.js.map +1 -0
  303. package/build/models.d.ts +3 -0
  304. package/build/models.d.ts.map +1 -0
  305. package/build/models.js +3 -5
  306. package/build/models.js.map +1 -0
  307. package/build/money-formatter.d.ts +17 -0
  308. package/build/money-formatter.d.ts.map +1 -0
  309. package/build/money-formatter.js +74 -67
  310. package/build/money-formatter.js.map +1 -0
  311. package/build/not-loaded-error.d.ts +3 -0
  312. package/build/not-loaded-error.d.ts.map +1 -0
  313. package/build/not-loaded-error.js +3 -2
  314. package/build/not-loaded-error.js.map +1 -0
  315. package/build/params.d.ts +16 -0
  316. package/build/params.d.ts.map +1 -0
  317. package/build/params.js +58 -55
  318. package/build/params.js.map +1 -0
  319. package/build/preloaded.d.ts +8 -0
  320. package/build/preloaded.d.ts.map +1 -0
  321. package/build/preloaded.js +29 -32
  322. package/build/preloaded.js.map +1 -0
  323. package/build/resize-observer.d.ts +3 -0
  324. package/build/resize-observer.d.ts.map +1 -0
  325. package/build/resize-observer.js +6 -9
  326. package/build/resize-observer.js.map +1 -0
  327. package/build/rest-props-validator.d.ts +3 -0
  328. package/build/rest-props-validator.d.ts.map +1 -0
  329. package/build/rest-props-validator.js +6 -6
  330. package/build/rest-props-validator.js.map +1 -0
  331. package/build/result.d.ts +38 -0
  332. package/build/result.d.ts.map +1 -0
  333. package/build/result.js +37 -11
  334. package/build/result.js.map +1 -0
  335. package/build/router/route.d.ts +8 -0
  336. package/build/router/route.d.ts.map +1 -0
  337. package/build/router/route.js +174 -251
  338. package/build/router/route.js.map +1 -0
  339. package/build/router/switch.d.ts +4 -0
  340. package/build/router/switch.d.ts.map +1 -0
  341. package/build/router/switch.js +50 -62
  342. package/build/router/switch.js.map +1 -0
  343. package/build/router.d.ts +3 -0
  344. package/build/router.d.ts.map +1 -0
  345. package/build/router.js +30 -53
  346. package/build/router.js.map +1 -0
  347. package/build/routes-native.d.ts +24 -0
  348. package/build/routes-native.d.ts.map +1 -0
  349. package/build/routes-native.js +140 -189
  350. package/build/routes-native.js.map +1 -0
  351. package/build/routes.d.ts +10 -0
  352. package/build/routes.d.ts.map +1 -0
  353. package/build/routes.js +44 -44
  354. package/build/routes.js.map +1 -0
  355. package/build/run-last.d.ts +12 -0
  356. package/build/run-last.d.ts.map +1 -0
  357. package/build/run-last.js +32 -31
  358. package/build/run-last.js.map +1 -0
  359. package/build/serializer.d.ts +10 -0
  360. package/build/serializer.d.ts.map +1 -0
  361. package/build/serializer.js +64 -58
  362. package/build/serializer.js.map +1 -0
  363. package/build/services.d.ts +5 -0
  364. package/build/services.d.ts.map +1 -0
  365. package/build/services.js +18 -17
  366. package/build/services.js.map +1 -0
  367. package/build/session-status-updater.d.ts +21 -0
  368. package/build/session-status-updater.d.ts.map +1 -0
  369. package/build/session-status-updater.js +116 -118
  370. package/build/session-status-updater.js.map +1 -0
  371. package/build/source-maps-loader.d.ts +37 -0
  372. package/build/source-maps-loader.d.ts.map +1 -0
  373. package/build/source-maps-loader.js +146 -165
  374. package/build/source-maps-loader.js.map +1 -0
  375. package/build/super-admin/config-reader.d.ts +23 -0
  376. package/build/super-admin/config-reader.d.ts.map +1 -0
  377. package/build/super-admin/config-reader.js +68 -75
  378. package/build/super-admin/config-reader.js.map +1 -0
  379. package/build/super-admin/edit-page/edit-attribute-checkbox.d.ts +3 -0
  380. package/build/super-admin/edit-page/edit-attribute-checkbox.d.ts.map +1 -0
  381. package/build/super-admin/edit-page/edit-attribute-checkbox.js +45 -72
  382. package/build/super-admin/edit-page/edit-attribute-checkbox.js.map +1 -0
  383. package/build/super-admin/edit-page/edit-attribute-content.d.ts +3 -0
  384. package/build/super-admin/edit-page/edit-attribute-content.d.ts.map +1 -0
  385. package/build/super-admin/edit-page/edit-attribute-content.js +40 -46
  386. package/build/super-admin/edit-page/edit-attribute-content.js.map +1 -0
  387. package/build/super-admin/edit-page/edit-attribute-input.d.ts +3 -0
  388. package/build/super-admin/edit-page/edit-attribute-input.d.ts.map +1 -0
  389. package/build/super-admin/edit-page/edit-attribute-input.js +48 -68
  390. package/build/super-admin/edit-page/edit-attribute-input.js.map +1 -0
  391. package/build/super-admin/edit-page/edit-attribute.d.ts +3 -0
  392. package/build/super-admin/edit-page/edit-attribute.d.ts.map +1 -0
  393. package/build/super-admin/edit-page/edit-attribute.js +30 -65
  394. package/build/super-admin/edit-page/edit-attribute.js.map +1 -0
  395. package/build/super-admin/edit-page.d.ts +3 -0
  396. package/build/super-admin/edit-page.d.ts.map +1 -0
  397. package/build/super-admin/edit-page.js +75 -106
  398. package/build/super-admin/edit-page.js.map +1 -0
  399. package/build/super-admin/has-edit-config.d.ts +3 -0
  400. package/build/super-admin/has-edit-config.d.ts.map +1 -0
  401. package/build/super-admin/has-edit-config.js +10 -10
  402. package/build/super-admin/has-edit-config.js.map +1 -0
  403. package/build/super-admin/index-page.d.ts +3 -0
  404. package/build/super-admin/index-page.d.ts.map +1 -0
  405. package/build/super-admin/index-page.js +12 -19
  406. package/build/super-admin/index-page.js.map +1 -0
  407. package/build/super-admin/index.d.ts +3 -0
  408. package/build/super-admin/index.d.ts.map +1 -0
  409. package/build/super-admin/index.js +120 -173
  410. package/build/super-admin/index.js.map +1 -0
  411. package/build/super-admin/layout/header/index.d.ts +3 -0
  412. package/build/super-admin/layout/header/index.d.ts.map +1 -0
  413. package/build/super-admin/layout/header/index.js +84 -146
  414. package/build/super-admin/layout/header/index.js.map +1 -0
  415. package/build/super-admin/layout/index.d.ts +3 -0
  416. package/build/super-admin/layout/index.d.ts.map +1 -0
  417. package/build/super-admin/layout/index.js +87 -147
  418. package/build/super-admin/layout/index.js.map +1 -0
  419. package/build/super-admin/layout/menu/index.d.ts +3 -0
  420. package/build/super-admin/layout/menu/index.d.ts.map +1 -0
  421. package/build/super-admin/layout/menu/index.js +98 -186
  422. package/build/super-admin/layout/menu/index.js.map +1 -0
  423. package/build/super-admin/layout/menu/menu-content.d.ts +3 -0
  424. package/build/super-admin/layout/menu/menu-content.d.ts.map +1 -0
  425. package/build/super-admin/layout/menu/menu-content.js +19 -38
  426. package/build/super-admin/layout/menu/menu-content.js.map +1 -0
  427. package/build/super-admin/layout/menu/menu-item.d.ts +3 -0
  428. package/build/super-admin/layout/menu/menu-item.d.ts.map +1 -0
  429. package/build/super-admin/layout/menu/menu-item.js +46 -75
  430. package/build/super-admin/layout/menu/menu-item.js.map +1 -0
  431. package/build/super-admin/layout/no-access.d.ts +3 -0
  432. package/build/super-admin/layout/no-access.d.ts.map +1 -0
  433. package/build/super-admin/layout/no-access.js +15 -22
  434. package/build/super-admin/layout/no-access.js.map +1 -0
  435. package/build/super-admin/model-class-table.d.ts +3 -0
  436. package/build/super-admin/model-class-table.d.ts.map +1 -0
  437. package/build/super-admin/model-class-table.js +42 -54
  438. package/build/super-admin/model-class-table.js.map +1 -0
  439. package/build/super-admin/models.d.ts +3 -0
  440. package/build/super-admin/models.d.ts.map +1 -0
  441. package/build/super-admin/models.js +4 -4
  442. package/build/super-admin/models.js.map +1 -0
  443. package/build/super-admin/show-nav.d.ts +3 -0
  444. package/build/super-admin/show-nav.d.ts.map +1 -0
  445. package/build/super-admin/show-nav.js +19 -42
  446. package/build/super-admin/show-nav.js.map +1 -0
  447. package/build/super-admin/show-page/belongs-to-attribute-row.d.ts +3 -0
  448. package/build/super-admin/show-page/belongs-to-attribute-row.d.ts.map +1 -0
  449. package/build/super-admin/show-page/belongs-to-attribute-row.js +13 -22
  450. package/build/super-admin/show-page/belongs-to-attribute-row.js.map +1 -0
  451. package/build/super-admin/show-page/index.d.ts +3 -0
  452. package/build/super-admin/show-page/index.d.ts.map +1 -0
  453. package/build/super-admin/show-page/index.js +105 -126
  454. package/build/super-admin/show-page/index.js.map +1 -0
  455. package/build/super-admin/show-reflection-actions.d.ts +3 -0
  456. package/build/super-admin/show-reflection-actions.d.ts.map +1 -0
  457. package/build/super-admin/show-reflection-actions.js +33 -44
  458. package/build/super-admin/show-reflection-actions.js.map +1 -0
  459. package/build/super-admin/show-reflection-link.d.ts +3 -0
  460. package/build/super-admin/show-reflection-link.d.ts.map +1 -0
  461. package/build/super-admin/show-reflection-link.js +23 -41
  462. package/build/super-admin/show-reflection-link.js.map +1 -0
  463. package/build/super-admin/show-reflection-page.d.ts +3 -0
  464. package/build/super-admin/show-reflection-page.d.ts.map +1 -0
  465. package/build/super-admin/show-reflection-page.js +26 -40
  466. package/build/super-admin/show-reflection-page.js.map +1 -0
  467. package/build/table/column-content.d.ts +25 -0
  468. package/build/table/column-content.d.ts.map +1 -0
  469. package/build/table/column-content.js +101 -107
  470. package/build/table/column-content.js.map +1 -0
  471. package/build/table/column-identifier.d.ts +2 -0
  472. package/build/table/column-identifier.d.ts.map +1 -0
  473. package/build/table/column-identifier.js +17 -15
  474. package/build/table/column-identifier.js.map +1 -0
  475. package/build/table/column-visible.d.ts +2 -0
  476. package/build/table/column-visible.d.ts.map +1 -0
  477. package/build/table/column-visible.js +8 -5
  478. package/build/table/column-visible.js.map +1 -0
  479. package/build/table/components/column.d.ts +3 -0
  480. package/build/table/components/column.d.ts.map +1 -0
  481. package/build/table/components/column.js +11 -18
  482. package/build/table/components/column.js.map +1 -0
  483. package/build/table/components/flat-list.d.ts +3 -0
  484. package/build/table/components/flat-list.d.ts.map +1 -0
  485. package/build/table/components/flat-list.js +10 -17
  486. package/build/table/components/flat-list.js.map +1 -0
  487. package/build/table/components/header.d.ts +3 -0
  488. package/build/table/components/header.d.ts.map +1 -0
  489. package/build/table/components/header.js +11 -21
  490. package/build/table/components/header.js.map +1 -0
  491. package/build/table/components/row.d.ts +3 -0
  492. package/build/table/components/row.d.ts.map +1 -0
  493. package/build/table/components/row.js +14 -22
  494. package/build/table/components/row.js.map +1 -0
  495. package/build/table/filters/attribute-element.d.ts +3 -0
  496. package/build/table/filters/attribute-element.d.ts.map +1 -0
  497. package/build/table/filters/attribute-element.js +26 -35
  498. package/build/table/filters/attribute-element.js.map +1 -0
  499. package/build/table/filters/filter-form.d.ts +3 -0
  500. package/build/table/filters/filter-form.d.ts.map +1 -0
  501. package/build/table/filters/filter-form.js +261 -428
  502. package/build/table/filters/filter-form.js.map +1 -0
  503. package/build/table/filters/filter.d.ts +3 -0
  504. package/build/table/filters/filter.d.ts.map +1 -0
  505. package/build/table/filters/filter.js +38 -81
  506. package/build/table/filters/filter.js.map +1 -0
  507. package/build/table/filters/index.d.ts +3 -0
  508. package/build/table/filters/index.d.ts.map +1 -0
  509. package/build/table/filters/index.js +87 -176
  510. package/build/table/filters/index.js.map +1 -0
  511. package/build/table/filters/load-search-modal.d.ts +3 -0
  512. package/build/table/filters/load-search-modal.d.ts.map +1 -0
  513. package/build/table/filters/load-search-modal.js +79 -162
  514. package/build/table/filters/load-search-modal.js.map +1 -0
  515. package/build/table/filters/reflection-element.d.ts +3 -0
  516. package/build/table/filters/reflection-element.d.ts.map +1 -0
  517. package/build/table/filters/reflection-element.js +20 -30
  518. package/build/table/filters/reflection-element.js.map +1 -0
  519. package/build/table/filters/save-search-modal.d.ts +3 -0
  520. package/build/table/filters/save-search-modal.d.ts.map +1 -0
  521. package/build/table/filters/save-search-modal.js +36 -77
  522. package/build/table/filters/save-search-modal.js.map +1 -0
  523. package/build/table/filters/scope-element.d.ts +3 -0
  524. package/build/table/filters/scope-element.d.ts.map +1 -0
  525. package/build/table/filters/scope-element.js +24 -36
  526. package/build/table/filters/scope-element.js.map +1 -0
  527. package/build/table/header-column-content.d.ts +3 -0
  528. package/build/table/header-column-content.d.ts.map +1 -0
  529. package/build/table/header-column-content.js +24 -59
  530. package/build/table/header-column-content.js.map +1 -0
  531. package/build/table/header-column.d.ts +3 -0
  532. package/build/table/header-column.d.ts.map +1 -0
  533. package/build/table/header-column.js +80 -132
  534. package/build/table/header-column.js.map +1 -0
  535. package/build/table/header-select.d.ts +3 -0
  536. package/build/table/header-select.d.ts.map +1 -0
  537. package/build/table/header-select.js +35 -95
  538. package/build/table/header-select.js.map +1 -0
  539. package/build/table/model-callback-args.d.ts +4 -0
  540. package/build/table/model-callback-args.d.ts.map +1 -0
  541. package/build/table/model-callback-args.js +5 -7
  542. package/build/table/model-callback-args.js.map +1 -0
  543. package/build/table/model-column.d.ts +3 -0
  544. package/build/table/model-column.d.ts.map +1 -0
  545. package/build/table/model-column.js +49 -88
  546. package/build/table/model-column.js.map +1 -0
  547. package/build/table/model-row.d.ts +3 -0
  548. package/build/table/model-row.d.ts.map +1 -0
  549. package/build/table/model-row.js +60 -174
  550. package/build/table/model-row.js.map +1 -0
  551. package/build/table/select-calculator.d.ts +2 -0
  552. package/build/table/select-calculator.d.ts.map +1 -0
  553. package/build/table/select-calculator.js +46 -54
  554. package/build/table/select-calculator.js.map +1 -0
  555. package/build/table/settings/column-row.d.ts +3 -0
  556. package/build/table/settings/column-row.d.ts.map +1 -0
  557. package/build/table/settings/column-row.js +60 -87
  558. package/build/table/settings/column-row.js.map +1 -0
  559. package/build/table/settings/download-action.d.ts +3 -0
  560. package/build/table/settings/download-action.d.ts.map +1 -0
  561. package/build/table/settings/download-action.js +27 -73
  562. package/build/table/settings/download-action.js.map +1 -0
  563. package/build/table/settings/index.d.ts +3 -0
  564. package/build/table/settings/index.d.ts.map +1 -0
  565. package/build/table/settings/index.js +29 -85
  566. package/build/table/settings/index.js.map +1 -0
  567. package/build/table/table-settings.d.ts +35 -0
  568. package/build/table/table-settings.d.ts.map +1 -0
  569. package/build/table/table-settings.js +187 -195
  570. package/build/table/table-settings.js.map +1 -0
  571. package/build/table/table.d.ts +3 -0
  572. package/build/table/table.d.ts.map +1 -0
  573. package/build/table/table.js +557 -918
  574. package/build/table/table.js.map +1 -0
  575. package/build/table/use-sorting.d.ts +21 -0
  576. package/build/table/use-sorting.d.ts.map +1 -0
  577. package/build/table/use-sorting.js +40 -31
  578. package/build/table/use-sorting.js.map +1 -0
  579. package/build/table/widths.d.ts +18 -0
  580. package/build/table/widths.d.ts.map +1 -0
  581. package/build/table/widths.js +63 -68
  582. package/build/table/widths.js.map +1 -0
  583. package/build/table/worker-plugins-check-all-checkbox.d.ts +3 -0
  584. package/build/table/worker-plugins-check-all-checkbox.d.ts.map +1 -0
  585. package/build/table/worker-plugins-check-all-checkbox.js +73 -112
  586. package/build/table/worker-plugins-check-all-checkbox.js.map +1 -0
  587. package/build/table/worker-plugins-checkbox.d.ts +3 -0
  588. package/build/table/worker-plugins-checkbox.d.ts.map +1 -0
  589. package/build/table/worker-plugins-checkbox.js +66 -103
  590. package/build/table/worker-plugins-checkbox.js.map +1 -0
  591. package/build/translated-attributes.d.ts +2 -0
  592. package/build/translated-attributes.d.ts.map +1 -0
  593. package/build/translated-attributes.js +7 -7
  594. package/build/translated-attributes.js.map +1 -0
  595. package/build/translated-collections.d.ts +4 -0
  596. package/build/translated-collections.d.ts.map +1 -0
  597. package/build/translated-collections.js +8 -7
  598. package/build/translated-collections.js.map +1 -0
  599. package/build/updated-attribute.d.ts +15 -0
  600. package/build/updated-attribute.d.ts.map +1 -0
  601. package/build/updated-attribute.js +66 -67
  602. package/build/updated-attribute.js.map +1 -0
  603. package/build/url-encode.d.ts +6 -0
  604. package/build/url-encode.d.ts.map +1 -0
  605. package/build/url-encode.js +14 -11
  606. package/build/url-encode.js.map +1 -0
  607. package/build/use-breakpoint.d.ts +3 -0
  608. package/build/use-breakpoint.d.ts.map +1 -0
  609. package/build/use-breakpoint.js +71 -72
  610. package/build/use-breakpoint.js.map +1 -0
  611. package/build/use-can-can.d.ts +8 -0
  612. package/build/use-can-can.d.ts.map +1 -0
  613. package/build/use-can-can.js +45 -52
  614. package/build/use-can-can.js.map +1 -0
  615. package/build/use-collection.d.ts +73 -0
  616. package/build/use-collection.d.ts.map +1 -0
  617. package/build/use-collection.js +253 -212
  618. package/build/use-collection.js.map +1 -0
  619. package/build/use-created-event.d.ts +19 -0
  620. package/build/use-created-event.d.ts.map +1 -0
  621. package/build/use-created-event.js +50 -44
  622. package/build/use-created-event.js.map +1 -0
  623. package/build/use-current-user-context.d.ts +12 -0
  624. package/build/use-current-user-context.d.ts.map +1 -0
  625. package/build/use-current-user-context.js +94 -0
  626. package/build/use-current-user-context.js.map +1 -0
  627. package/build/use-current-user.d.ts +14 -0
  628. package/build/use-current-user.d.ts.map +1 -0
  629. package/build/use-current-user.js +21 -115
  630. package/build/use-current-user.js.map +1 -0
  631. package/build/use-destroyed-event.d.ts +16 -0
  632. package/build/use-destroyed-event.d.ts.map +1 -0
  633. package/build/use-destroyed-event.js +53 -54
  634. package/build/use-destroyed-event.js.map +1 -0
  635. package/build/use-event-emitter.d.ts +9 -0
  636. package/build/use-event-emitter.d.ts.map +1 -0
  637. package/build/use-event-emitter.js +24 -22
  638. package/build/use-event-emitter.js.map +1 -0
  639. package/build/use-event-listener.d.ts +9 -0
  640. package/build/use-event-listener.d.ts.map +1 -0
  641. package/build/use-event-listener.js +24 -18
  642. package/build/use-event-listener.js.map +1 -0
  643. package/build/use-input.d.ts +31 -0
  644. package/build/use-input.d.ts.map +1 -0
  645. package/build/use-input.js +142 -130
  646. package/build/use-input.js.map +1 -0
  647. package/build/use-model-event.d.ts +17 -0
  648. package/build/use-model-event.d.ts.map +1 -0
  649. package/build/use-model-event.js +54 -54
  650. package/build/use-model-event.js.map +1 -0
  651. package/build/use-model.d.ts +30 -0
  652. package/build/use-model.d.ts.map +1 -0
  653. package/build/use-model.js +153 -156
  654. package/build/use-model.js.map +1 -0
  655. package/build/use-resize-observer.d.ts +8 -0
  656. package/build/use-resize-observer.d.ts.map +1 -0
  657. package/build/use-resize-observer.js +22 -19
  658. package/build/use-resize-observer.js.map +1 -0
  659. package/build/use-router.d.ts +8 -0
  660. package/build/use-router.d.ts.map +1 -0
  661. package/build/use-router.js +84 -93
  662. package/build/use-router.js.map +1 -0
  663. package/build/use-screen-layout.d.ts +3 -0
  664. package/build/use-screen-layout.d.ts.map +1 -0
  665. package/build/use-screen-layout.js +41 -34
  666. package/build/use-screen-layout.js.map +1 -0
  667. package/build/use-styles.d.ts +2 -0
  668. package/build/use-styles.d.ts.map +1 -0
  669. package/build/use-styles.js +48 -47
  670. package/build/use-styles.js.map +1 -0
  671. package/build/use-updated-event.d.ts +16 -0
  672. package/build/use-updated-event.d.ts.map +1 -0
  673. package/build/use-updated-event.js +53 -54
  674. package/build/use-updated-event.js.map +1 -0
  675. package/build/use-validation-errors.d.ts +7 -0
  676. package/build/use-validation-errors.d.ts.map +1 -0
  677. package/build/use-validation-errors.js +27 -27
  678. package/build/use-validation-errors.js.map +1 -0
  679. package/build/utils/button.d.ts +3 -0
  680. package/build/utils/button.d.ts.map +1 -0
  681. package/build/utils/button.js +83 -113
  682. package/build/utils/button.js.map +1 -0
  683. package/build/utils/card.d.ts +3 -0
  684. package/build/utils/card.d.ts.map +1 -0
  685. package/build/utils/card.js +25 -48
  686. package/build/utils/card.js.map +1 -0
  687. package/build/utils/checkbox.d.ts +3 -0
  688. package/build/utils/checkbox.d.ts.map +1 -0
  689. package/build/utils/checkbox.js +44 -69
  690. package/build/utils/checkbox.js.map +1 -0
  691. package/build/utils/checkboxes.d.ts +3 -0
  692. package/build/utils/checkboxes.d.ts.map +1 -0
  693. package/build/utils/checkboxes.js +95 -143
  694. package/build/utils/checkboxes.js.map +1 -0
  695. package/build/utils/default-style.d.ts +7 -0
  696. package/build/utils/default-style.d.ts.map +1 -0
  697. package/build/utils/default-style.js +51 -58
  698. package/build/utils/default-style.js.map +1 -0
  699. package/build/utils/header.d.ts +3 -0
  700. package/build/utils/header.d.ts.map +1 -0
  701. package/build/utils/header.js +8 -17
  702. package/build/utils/header.js.map +1 -0
  703. package/build/utils/icon.d.ts +3 -0
  704. package/build/utils/icon.d.ts.map +1 -0
  705. package/build/utils/icon.js +68 -87
  706. package/build/utils/icon.js.map +1 -0
  707. package/build/utils/invalid-feedback.d.ts +3 -0
  708. package/build/utils/invalid-feedback.d.ts.map +1 -0
  709. package/build/utils/invalid-feedback.js +10 -13
  710. package/build/utils/invalid-feedback.js.map +1 -0
  711. package/build/utils/modal.d.ts +3 -0
  712. package/build/utils/modal.d.ts.map +1 -0
  713. package/build/utils/modal.js +30 -56
  714. package/build/utils/modal.js.map +1 -0
  715. package/build/utils/text.d.ts +3 -0
  716. package/build/utils/text.d.ts.map +1 -0
  717. package/build/utils/text.js +7 -17
  718. package/build/utils/text.js.map +1 -0
  719. package/build/validation-error.d.ts +18 -0
  720. package/build/validation-error.d.ts.map +1 -0
  721. package/build/validation-error.js +34 -25
  722. package/build/validation-error.js.map +1 -0
  723. package/build/validation-errors.d.ts +58 -0
  724. package/build/validation-errors.d.ts.map +1 -0
  725. package/build/validation-errors.js +107 -87
  726. package/build/validation-errors.js.map +1 -0
  727. package/build/with-api-maker.d.ts +3 -0
  728. package/build/with-api-maker.d.ts.map +1 -0
  729. package/build/with-api-maker.js +18 -24
  730. package/build/with-api-maker.js.map +1 -0
  731. package/build/with-collection.d.ts +3 -0
  732. package/build/with-collection.d.ts.map +1 -0
  733. package/build/with-collection.js +11 -10
  734. package/build/with-collection.js.map +1 -0
  735. package/build/with-current-user.d.ts +3 -0
  736. package/build/with-current-user.d.ts.map +1 -0
  737. package/build/with-current-user.js +6 -8
  738. package/build/with-current-user.js.map +1 -0
  739. package/build/with-model.d.ts +3 -0
  740. package/build/with-model.d.ts.map +1 -0
  741. package/build/with-model.js +10 -12
  742. package/build/with-model.js.map +1 -0
  743. package/build/with-router.d.ts +3 -0
  744. package/build/with-router.d.ts.map +1 -0
  745. package/build/with-router.js +7 -20
  746. package/build/with-router.js.map +1 -0
  747. package/package.json +14 -8
  748. package/.eslintrc.js +0 -357
  749. package/android/build.gradle +0 -43
  750. package/android/src/main/AndroidManifest.xml +0 -2
  751. package/android/src/main/java/expo/modules/api_maker/ApiMakerModule.kt +0 -50
  752. package/android/src/main/java/expo/modules/api_maker/ApiMakerView.kt +0 -30
  753. package/expo-module.config.json +0 -17
  754. package/ios/ApiMaker.podspec +0 -29
  755. package/ios/ApiMakerModule.swift +0 -48
  756. package/ios/ApiMakerView.swift +0 -38
  757. package/src/api.js +0 -109
  758. package/src/attribute-not-loaded-error.js +0 -1
  759. package/src/base-component.jsx +0 -5
  760. package/src/base-error.js +0 -38
  761. package/src/base-model/attribute.js +0 -33
  762. package/src/base-model/column.js +0 -13
  763. package/src/base-model/reflection.js +0 -15
  764. package/src/base-model/scope.js +0 -12
  765. package/src/base-model.js +0 -1001
  766. package/src/bootstrap/attribute-row.jsx +0 -134
  767. package/src/bootstrap/attribute-rows.jsx +0 -27
  768. package/src/bootstrap/card.jsx +0 -149
  769. package/src/bootstrap/checkbox.jsx +0 -86
  770. package/src/bootstrap/checkboxes.jsx +0 -185
  771. package/src/bootstrap/index.js +0 -0
  772. package/src/bootstrap/input.jsx +0 -173
  773. package/src/bootstrap/invalid-feedback.jsx +0 -31
  774. package/src/bootstrap/paginate.jsx +0 -187
  775. package/src/bootstrap/radio-buttons.jsx +0 -87
  776. package/src/bootstrap/select.jsx +0 -110
  777. package/src/bootstrap/sort-link.jsx +0 -106
  778. package/src/cable-connection-pool.js +0 -127
  779. package/src/cable-subscription-pool.js +0 -189
  780. package/src/cable-subscription.js +0 -23
  781. package/src/cache-key-generator.js +0 -100
  782. package/src/can-can.js +0 -158
  783. package/src/channels-consumer.js +0 -10
  784. package/src/collection-loader.jsx +0 -60
  785. package/src/collection.js +0 -346
  786. package/src/command-submit-data.js +0 -103
  787. package/src/commands-pool.js +0 -212
  788. package/src/compose.js +0 -11
  789. package/src/config.js +0 -71
  790. package/src/custom-error.js +0 -7
  791. package/src/data-set-to-attributes.js +0 -13
  792. package/src/deserializer.js +0 -60
  793. package/src/destroy-error.js +0 -7
  794. package/src/devise.js +0 -151
  795. package/src/draggable-sort/controller.js +0 -137
  796. package/src/draggable-sort/index.jsx +0 -107
  797. package/src/draggable-sort/item.jsx +0 -171
  798. package/src/error-logger.js +0 -111
  799. package/src/error-messages.js +0 -15
  800. package/src/event-connection.jsx +0 -37
  801. package/src/event-emitter-listener.jsx +0 -13
  802. package/src/event-model-class.jsx +0 -28
  803. package/src/events.js +0 -7
  804. package/src/form.jsx +0 -110
  805. package/src/history-expo.js +0 -23
  806. package/src/history-react-native.js +0 -25
  807. package/src/history.js +0 -3
  808. package/src/index.js +0 -3
  809. package/src/inputs/attachment.jsx +0 -108
  810. package/src/inputs/auto-submit.js +0 -37
  811. package/src/inputs/checkbox.jsx +0 -125
  812. package/src/inputs/checkboxes.jsx +0 -116
  813. package/src/inputs/id-for-component.js +0 -15
  814. package/src/inputs/input-wrapper.jsx +0 -16
  815. package/src/inputs/input.jsx +0 -260
  816. package/src/inputs/money.jsx +0 -179
  817. package/src/inputs/name-for-component.js +0 -15
  818. package/src/inputs/select.jsx +0 -104
  819. package/src/instance-of-class-name.js +0 -29
  820. package/src/is-expo.js +0 -18
  821. package/src/key-value-store.js +0 -68
  822. package/src/link.jsx +0 -77
  823. package/src/logger.js +0 -38
  824. package/src/merge-styles.js +0 -15
  825. package/src/modal.jsx +0 -37
  826. package/src/model-class-require.js +0 -17
  827. package/src/model-events.js +0 -39
  828. package/src/model-name.js +0 -33
  829. package/src/model-prop-type.js +0 -124
  830. package/src/model-recipes-loader.js +0 -28
  831. package/src/model-recipes-model-loader.js +0 -350
  832. package/src/models-response-reader.js +0 -48
  833. package/src/models.js +0 -7
  834. package/src/models.js.erb +0 -19
  835. package/src/money-formatter.js +0 -100
  836. package/src/not-loaded-error.js +0 -1
  837. package/src/params.js +0 -66
  838. package/src/preloaded.js +0 -43
  839. package/src/resize-observer.jsx +0 -10
  840. package/src/rest-props-validator.js +0 -9
  841. package/src/result.js +0 -13
  842. package/src/router/route.jsx +0 -246
  843. package/src/router/switch.jsx +0 -76
  844. package/src/router.jsx +0 -47
  845. package/src/routes-native.js +0 -173
  846. package/src/routes.js +0 -58
  847. package/src/run-last.js +0 -39
  848. package/src/serializer.js +0 -76
  849. package/src/services.js +0 -23
  850. package/src/session-status-updater.js +0 -172
  851. package/src/source-maps-loader.js +0 -203
  852. package/src/super-admin/config-reader.jsx +0 -93
  853. package/src/super-admin/edit-page/edit-attribute-checkbox.jsx +0 -84
  854. package/src/super-admin/edit-page/edit-attribute-content.jsx +0 -57
  855. package/src/super-admin/edit-page/edit-attribute-input.jsx +0 -79
  856. package/src/super-admin/edit-page/edit-attribute.jsx +0 -84
  857. package/src/super-admin/edit-page.jsx +0 -117
  858. package/src/super-admin/has-edit-config.js +0 -15
  859. package/src/super-admin/index-page.jsx +0 -23
  860. package/src/super-admin/index.jsx +0 -219
  861. package/src/super-admin/layout/header/index.jsx +0 -144
  862. package/src/super-admin/layout/header/style.scss +0 -45
  863. package/src/super-admin/layout/index.jsx +0 -154
  864. package/src/super-admin/layout/menu/index.jsx +0 -173
  865. package/src/super-admin/layout/menu/menu-content.jsx +0 -43
  866. package/src/super-admin/layout/menu/menu-item.jsx +0 -70
  867. package/src/super-admin/layout/menu/style.scss +0 -11
  868. package/src/super-admin/layout/no-access.jsx +0 -26
  869. package/src/super-admin/model-class-table.jsx +0 -66
  870. package/src/super-admin/models.js +0 -11
  871. package/src/super-admin/show-nav.jsx +0 -45
  872. package/src/super-admin/show-page/belongs-to-attribute-row.jsx +0 -30
  873. package/src/super-admin/show-page/index.jsx +0 -141
  874. package/src/super-admin/show-reflection-actions.jsx +0 -55
  875. package/src/super-admin/show-reflection-link.jsx +0 -40
  876. package/src/super-admin/show-reflection-page.jsx +0 -50
  877. package/src/super-admin/stylesheets/variables.scss +0 -11
  878. package/src/table/column-content.jsx +0 -122
  879. package/src/table/column-identifier.js +0 -23
  880. package/src/table/column-visible.js +0 -7
  881. package/src/table/components/column.jsx +0 -19
  882. package/src/table/components/flat-list.jsx +0 -19
  883. package/src/table/components/header.jsx +0 -21
  884. package/src/table/components/row.jsx +0 -23
  885. package/src/table/filters/attribute-element.jsx +0 -47
  886. package/src/table/filters/filter-form.jsx +0 -448
  887. package/src/table/filters/filter.jsx +0 -74
  888. package/src/table/filters/index.jsx +0 -171
  889. package/src/table/filters/load-search-modal.jsx +0 -157
  890. package/src/table/filters/reflection-element.jsx +0 -38
  891. package/src/table/filters/save-search-modal.jsx +0 -74
  892. package/src/table/filters/scope-element.jsx +0 -44
  893. package/src/table/header-column-content.jsx +0 -55
  894. package/src/table/header-column.jsx +0 -129
  895. package/src/table/header-select.jsx +0 -78
  896. package/src/table/model-callback-args.js +0 -10
  897. package/src/table/model-column.jsx +0 -86
  898. package/src/table/model-row.jsx +0 -140
  899. package/src/table/select-calculator.js +0 -65
  900. package/src/table/settings/column-row.jsx +0 -93
  901. package/src/table/settings/download-action.jsx +0 -73
  902. package/src/table/settings/index.jsx +0 -66
  903. package/src/table/table-settings.js +0 -262
  904. package/src/table/table.jsx +0 -957
  905. package/src/table/use-sorting.js +0 -35
  906. package/src/table/variables.scss +0 -11
  907. package/src/table/widths.jsx +0 -87
  908. package/src/table/worker-plugins-check-all-checkbox.jsx +0 -112
  909. package/src/table/worker-plugins-checkbox.jsx +0 -104
  910. package/src/translated-attributes.js +0 -11
  911. package/src/translated-collections-data.js.erb +0 -5
  912. package/src/translated-collections.js +0 -13
  913. package/src/updated-attribute.jsx +0 -93
  914. package/src/url-encode.js +0 -18
  915. package/src/use-breakpoint.js +0 -100
  916. package/src/use-can-can.js +0 -55
  917. package/src/use-collection.js +0 -280
  918. package/src/use-created-event.js +0 -55
  919. package/src/use-current-user.js +0 -133
  920. package/src/use-destroyed-event.js +0 -60
  921. package/src/use-event-emitter.js +0 -25
  922. package/src/use-event-listener.js +0 -23
  923. package/src/use-input.js +0 -159
  924. package/src/use-model-event.js +0 -60
  925. package/src/use-model.js +0 -189
  926. package/src/use-resize-observer.js +0 -24
  927. package/src/use-router.jsx +0 -128
  928. package/src/use-screen-layout.js +0 -49
  929. package/src/use-styles.js +0 -66
  930. package/src/use-updated-event.js +0 -60
  931. package/src/use-validation-errors.js +0 -33
  932. package/src/utils/button.jsx +0 -127
  933. package/src/utils/card.jsx +0 -58
  934. package/src/utils/checkbox.jsx +0 -73
  935. package/src/utils/checkboxes.jsx +0 -157
  936. package/src/utils/default-style.jsx +0 -80
  937. package/src/utils/header.jsx +0 -14
  938. package/src/utils/icon.jsx +0 -81
  939. package/src/utils/invalid-feedback.jsx +0 -20
  940. package/src/utils/modal.jsx +0 -64
  941. package/src/utils/text.jsx +0 -15
  942. package/src/validation-error.js +0 -35
  943. package/src/validation-errors.js +0 -121
  944. package/src/with-api-maker.jsx +0 -31
  945. package/src/with-collection.jsx +0 -17
  946. package/src/with-current-user.jsx +0 -10
  947. package/src/with-model.jsx +0 -16
  948. package/src/with-router.jsx +0 -11
@@ -1,10 +1,10 @@
1
1
  import Attribute from "./base-model/attribute";
2
2
  import AttributeNotLoadedError from "./attribute-not-loaded-error";
3
3
  import CacheKeyGenerator from "./cache-key-generator";
4
- import Collection from "./collection";
5
- import CommandsPool from "./commands-pool";
6
- import Config from "./config";
7
- import CustomError from "./custom-error";
4
+ import Collection from "./collection.js";
5
+ import CommandsPool from "./commands-pool.js";
6
+ import Config from "./config.js";
7
+ import CustomError from "./custom-error.js";
8
8
  import { digg } from "diggerize";
9
9
  import FormDataObjectizer from "form-data-objectizer";
10
10
  import * as inflection from "inflection";
@@ -13,816 +13,1024 @@ import NotLoadedError from "./not-loaded-error";
13
13
  import objectToFormData from "object-to-formdata";
14
14
  import Reflection from "./base-model/reflection";
15
15
  import Scope from "./base-model/scope";
16
- import Services from "./services";
17
- import ValidationError from "./validation-error";
18
- import { ValidationErrors } from "./validation-errors";
19
- const objectToUnderscore = object => {
20
- const newObject = {};
21
- for (const key in object) {
22
- const underscoreKey = inflection.underscore(key);
23
- newObject[underscoreKey] = object[key];
24
- }
25
- return newObject;
26
- };
16
+ import Services from "./services.js";
17
+ import ValidationError from "./validation-error.js";
18
+ import { ValidationErrors } from "./validation-errors.js";
19
+ /**
20
+ * @typedef {object} ModelClassDataType
21
+ * @property {import("./base-model/attribute.js").AttributeArgType[]} attributes
22
+ * @property {string} collectionName
23
+ * @property {string} name
24
+ * @property {string} paramKey
25
+ * @property {string} primaryKey
26
+ * @property {object} ransackable_attributes
27
+ */
28
+ /**
29
+ * @typedef {object} ParseValidationErrorsOptions
30
+ * @property {object} [form]
31
+ * @property {boolean} [throwValidationError]
32
+ */
33
+ function objectToUnderscore(object) {
34
+ const newObject = {};
35
+ for (const key in object) {
36
+ const underscoreKey = inflection.underscore(key);
37
+ newObject[underscoreKey] = object[key];
38
+ }
39
+ return newObject;
40
+ }
27
41
  export default class BaseModel {
28
- static apiMakerType = "BaseModel";
29
- static attributes() {
30
- const attributes = digg(this.modelClassData(), "attributes");
31
- const result = [];
32
- for (const attributeKey in attributes) {
33
- const attributeData = attributes[attributeKey];
34
- const attribute = new Attribute(attributeData);
35
- result.push(attribute);
36
- }
37
- return result;
38
- }
39
- static hasAttribute(attributeName) {
40
- const attributes = digg(this.modelClassData(), "attributes");
41
- const lowerCaseAttributeName = inflection.underscore(attributeName);
42
- if (lowerCaseAttributeName in attributes) return true;
43
- return false;
44
- }
45
- static modelClassData() {
46
- throw new Error("modelClassData should be overriden by child");
47
- }
48
- static newCustomEvent = validationErrors => {
49
- return new CustomEvent("validation-errors", {
50
- detail: validationErrors
51
- });
52
- };
53
- static sendValidationErrorsEvent = (validationErrors, options) => {
54
- if (options && options.form) {
55
- const event = BaseModel.newCustomEvent(validationErrors);
56
- options.form.dispatchEvent(event);
57
- }
58
- };
59
- static async find(id) {
60
- const query = {};
61
- query[`${this.primaryKey()}_eq`] = id;
62
- const model = await this.ransack(query).first();
63
- if (model) {
64
- return model;
65
- } else {
66
- throw new CustomError("Record not found");
67
- }
68
- }
69
- static async findOrCreateBy(findOrCreateByArgs, args = {}) {
70
- const result = await Services.current().sendRequest("Models::FindOrCreateBy", {
71
- additional_data: args.additionalData,
72
- find_or_create_by_args: findOrCreateByArgs,
73
- resource_name: digg(this.modelClassData(), "name")
74
- });
75
- const model = digg(result, "model");
76
- return model;
77
- }
78
- static modelName() {
79
- return new ModelName({
80
- modelClassData: this.modelClassData()
81
- });
82
- }
83
- static primaryKey() {
84
- return digg(this.modelClassData(), "primaryKey");
85
- }
86
- static ransack(query = {}) {
87
- return new Collection({
88
- modelClass: this
89
- }, {
90
- ransack: query
91
- });
92
- }
93
- static select(select) {
94
- return this.ransack().select(select);
95
- }
96
- static ransackableAssociations() {
97
- const relationships = digg(this.modelClassData(), "ransackable_associations");
98
- const reflections = [];
99
- for (const relationshipData of relationships) {
100
- reflections.push(new Reflection(relationshipData));
101
- }
102
- return reflections;
103
- }
104
- static ransackableAttributes() {
105
- const attributes = digg(this.modelClassData(), "ransackable_attributes");
106
- const result = [];
107
- for (const attributeData of attributes) {
108
- result.push(new Attribute(attributeData));
109
- }
110
- return result;
111
- }
112
- static ransackableScopes() {
113
- const ransackableScopes = digg(this.modelClassData(), "ransackable_scopes");
114
- const result = [];
115
- for (const scopeData of ransackableScopes) {
116
- const scope = new Scope(scopeData);
117
- result.push(scope);
118
- }
119
- return result;
120
- }
121
- static reflections() {
122
- const relationships = digg(this.modelClassData(), "relationships");
123
- const reflections = [];
124
- for (const relationshipData of relationships) {
125
- const reflection = new Reflection(relationshipData);
126
- reflections.push(reflection);
127
- }
128
- return reflections;
129
- }
130
- static reflection(name) {
131
- const foundReflection = this.reflections().find(reflection => reflection.name() == name);
132
- if (!foundReflection) {
133
- throw new Error(`No such reflection: ${name} in ${this.reflections().map(reflection => reflection.name()).join(", ")}`);
134
- }
135
- return foundReflection;
136
- }
137
- static _token() {
138
- const csrfTokenElement = document.querySelector("meta[name='csrf-token']");
139
- if (csrfTokenElement) {
140
- return csrfTokenElement.getAttribute("content");
141
- }
142
- }
143
- constructor(args = {}) {
144
- this.changes = {};
145
- this.newRecord = args.isNewRecord;
146
- this.relationshipsCache = {};
147
- this.relationships = {};
148
- if (args && args.data && args.data.a) {
149
- this._readModelDataFromArgs(args);
150
- } else if (args.a) {
151
- this.abilities = args.b || {};
152
- this.modelData = objectToUnderscore(args.a);
153
- } else if (args) {
154
- this.abilities = {};
155
- this.modelData = objectToUnderscore(args);
156
- } else {
157
- this.abilities = {};
158
- this.modelData = {};
159
- }
160
- }
161
- assignAttributes(newAttributes) {
162
- for (const key in newAttributes) {
163
- const newValue = newAttributes[key];
164
- const attributeUnderscore = inflection.underscore(key);
165
- let applyChange = true;
166
- let deleteChange = false;
167
- if (this.isAttributeLoaded(key)) {
168
- const oldValue = this.readAttribute(key);
169
- const originalValue = this.modelData[attributeUnderscore];
170
- if (newValue == oldValue) {
171
- applyChange = false;
172
- } else if (newValue == originalValue) {
173
- applyChange = false;
174
- deleteChange = true;
175
- }
176
- }
177
- if (applyChange) {
178
- this.changes[attributeUnderscore] = newValue;
179
- } else if (deleteChange) {
180
- delete this.changes[attributeUnderscore];
181
- }
182
- }
183
- }
184
- attributes() {
185
- const result = {};
186
- for (const key in this.modelData) {
187
- result[key] = this.modelData[key];
188
- }
189
- for (const key in this.changes) {
190
- result[key] = this.changes[key];
191
- }
192
- return result;
193
- }
194
- can(givenAbilityName) {
195
- const abilityName = inflection.underscore(givenAbilityName);
196
- if (!(abilityName in this.abilities)) {
197
- throw new Error(`Ability ${abilityName} hasn't been loaded for ${digg(this.modelClassData(), "name")}`);
198
- }
199
- return this.abilities[abilityName];
200
- }
201
- clone() {
202
- const clone = new this.constructor();
203
- clone.abilities = {
204
- ...this.abilities
205
- };
206
- clone.modelData = {
207
- ...this.modelData
208
- };
209
- clone.relationships = {
210
- ...this.relationships
211
- };
212
- clone.relationshipsCache = {
213
- ...this.relationshipsCache
214
- };
215
- return clone;
216
- }
217
- cacheKey() {
218
- if (this.isPersisted()) {
219
- const keyParts = [this.modelClassData().paramKey, this.primaryKey()];
220
- if ("updated_at" in this.modelData) {
221
- const updatedAt = this.updatedAt();
222
- if (typeof updatedAt != "object") {
223
- throw new Error(`updatedAt wasn't an object: ${typeof updatedAt}`);
224
- } else if (!("getTime" in updatedAt)) {
225
- throw new Error(`updatedAt didn't support getTime with class: ${updatedAt.constructor && updatedAt.constructor.name}`);
226
- }
227
- keyParts.push(`updatedAt-${this.updatedAt().getTime()}`);
228
- }
229
- return keyParts.join("-");
230
- } else {
231
- return this.uniqueKey();
232
- }
233
- }
234
- localCacheKey() {
235
- const cacheKeyGenerator = new CacheKeyGenerator(this);
236
- return cacheKeyGenerator.local();
237
- }
238
- fullCacheKey() {
239
- const cacheKeyGenerator = new CacheKeyGenerator(this);
240
- return cacheKeyGenerator.cacheKey();
241
- }
242
- static all() {
243
- return this.ransack();
244
- }
245
- async create(attributes, options) {
246
- if (attributes) this.assignAttributes(attributes);
247
- const paramKey = this.modelClassData().paramKey;
248
- const modelData = this.getAttributes();
249
- const dataToUse = {};
250
- dataToUse[paramKey] = modelData;
251
- let response;
252
- try {
253
- response = await CommandsPool.addCommand({
254
- args: {
255
- save: dataToUse
256
- },
257
- command: `${this.modelClassData().collectionName}-create`,
258
- collectionName: this.modelClassData().collectionName,
259
- primaryKey: this.primaryKey(),
260
- type: "create"
261
- }, {});
262
- } catch (error) {
263
- BaseModel.parseValidationErrors({
264
- error,
265
- model: this,
266
- options
267
- });
268
- throw error;
269
- }
270
- if (response.model) {
271
- this._refreshModelFromResponse(response);
272
- this.changes = {};
273
- }
274
- return {
275
- model: this,
276
- response
277
- };
278
- }
279
- async createRaw(rawData, options = {}) {
280
- const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
281
- let response;
282
- try {
283
- response = await CommandsPool.addCommand({
284
- args: {
285
- save: objectData
286
- },
287
- command: `${this.modelClassData().collectionName}-create`,
288
- collectionName: this.modelClassData().collectionName,
289
- primaryKey: this.primaryKey(),
290
- type: "create"
291
- }, {});
292
- } catch (error) {
293
- BaseModel.parseValidationErrors({
294
- error,
295
- model: this,
296
- options
297
- });
298
- throw error;
299
- }
300
- if (response.model) {
301
- this._refreshModelDataFromResponse(response);
302
- this.changes = {};
303
- }
304
- return {
305
- model: this,
306
- response
42
+ static apiMakerType = "BaseModel";
43
+ /** @returns {Attribute[]} */
44
+ static attributes() {
45
+ const attributes = this.modelClassData().attributes;
46
+ const result = [];
47
+ for (const attributeKey in attributes) {
48
+ const attributeData = attributes[attributeKey];
49
+ const attribute = new Attribute(attributeData);
50
+ result.push(attribute);
51
+ }
52
+ return result;
53
+ }
54
+ /** @returns {boolean} */
55
+ static hasAttribute(attributeName) {
56
+ const attributes = digg(this.modelClassData(), "attributes");
57
+ const lowerCaseAttributeName = inflection.underscore(attributeName);
58
+ if (lowerCaseAttributeName in attributes)
59
+ return true;
60
+ return false;
61
+ }
62
+ /**
63
+ * @interface
64
+ * @returns {ModelClassDataType}
65
+ */
66
+ static modelClassData() {
67
+ throw new Error("modelClassData should be overriden by child");
68
+ }
69
+ /**
70
+ * @param {ValidationErrors} validationErrors
71
+ * @returns {CustomEvent}
72
+ */
73
+ static newCustomEvent = (validationErrors) => {
74
+ return new CustomEvent("validation-errors", { detail: validationErrors });
307
75
  };
308
- }
309
- async destroy() {
310
- const response = await CommandsPool.addCommand({
311
- args: {
312
- query_params: this.collection && this.collection.params()
313
- },
314
- command: `${this.modelClassData().collectionName}-destroy`,
315
- collectionName: this.modelClassData().collectionName,
316
- primaryKey: this.primaryKey(),
317
- type: "destroy"
318
- }, {});
319
- if (response.success) {
320
- if (response.model) {
321
- this._refreshModelDataFromResponse(response);
76
+ /**
77
+ * @param {ValidationErrors} validationErrors
78
+ * @param {object} [options]
79
+ * @param {object} [options.form]
80
+ * @param {boolean} [options.throwValidationError]
81
+ */
82
+ static sendValidationErrorsEvent(validationErrors, options) {
83
+ if (options && options.form) {
84
+ const event = BaseModel.newCustomEvent(validationErrors);
85
+ options.form.dispatchEvent(event);
86
+ }
87
+ }
88
+ /**
89
+ * @template {typeof BaseModel} T
90
+ * @this {T}
91
+ * @param {number | string} id
92
+ * @returns {Promise<InstanceType<T>>}
93
+ */
94
+ static async find(id) {
95
+ /** @type {Record<string, any>} */
96
+ const query = {};
97
+ query[`${this.primaryKey()}_eq`] = id;
98
+ const model = /** @type {InstanceType<T>} */ (await this.ransack(query).first());
99
+ if (model) {
100
+ return model;
101
+ }
102
+ else {
103
+ throw new CustomError("Record not found");
104
+ }
105
+ }
106
+ /**
107
+ * @template {typeof BaseModel} T
108
+ * @this {T}
109
+ * @param {Record<string, any>} findOrCreateByArgs
110
+ * @returns {Promise<InstanceType<T>>}
111
+ */
112
+ static async findOrCreateBy(findOrCreateByArgs, args = {}) {
113
+ const result = await Services.current().sendRequest("Models::FindOrCreateBy", {
114
+ additional_data: args.additionalData,
115
+ find_or_create_by_args: findOrCreateByArgs,
116
+ resource_name: digg(this.modelClassData(), "name")
117
+ });
118
+ const model = /** @type {InstanceType<T>} */ (digg(result, "model"));
119
+ return model;
120
+ }
121
+ /** @returns {ModelName} */
122
+ static modelName() {
123
+ return new ModelName({ modelClassData: this.modelClassData() });
124
+ }
125
+ /** @returns {string} */
126
+ static primaryKey() {
127
+ return digg(this.modelClassData(), "primaryKey");
128
+ }
129
+ /**
130
+ * @template {typeof BaseModel} MC
131
+ * @this {MC}
132
+ * @param {Record<string, any>} [query]
133
+ * @returns {import("./collection.js").default<MC>}
134
+ */
135
+ static ransack(query = {}) {
136
+ const ModelClass = /** @type {MC} */ (this);
137
+ return new Collection({ modelClass: ModelClass }, { ransack: query });
138
+ }
139
+ /**
140
+ * @template {typeof BaseModel} MC
141
+ * @this {MC}
142
+ * @param {Record<string, any>} [select]
143
+ * @returns {import("./collection.js").default<MC>}
144
+ */
145
+ static select(select) {
146
+ return this.ransack().select(select);
147
+ }
148
+ /** @returns {Reflection[]} */
149
+ static ransackableAssociations() {
150
+ const relationships = digg(this.modelClassData(), "ransackable_associations");
151
+ const reflections = [];
152
+ for (const relationshipData of relationships) {
153
+ reflections.push(new Reflection(relationshipData));
154
+ }
155
+ return reflections;
156
+ }
157
+ /** @returns {Attribute[]} */
158
+ static ransackableAttributes() {
159
+ const attributes = this.modelClassData().ransackable_attributes;
160
+ const result = [];
161
+ for (const attributeData of attributes) {
162
+ result.push(new Attribute(attributeData));
163
+ }
164
+ return result;
165
+ }
166
+ /** @returns {Scope[]} */
167
+ static ransackableScopes() {
168
+ const ransackableScopes = digg(this.modelClassData(), "ransackable_scopes");
169
+ const result = [];
170
+ for (const scopeData of ransackableScopes) {
171
+ const scope = new Scope(scopeData);
172
+ result.push(scope);
173
+ }
174
+ return result;
175
+ }
176
+ /** @returns {Reflection[]} */
177
+ static reflections() {
178
+ const relationships = digg(this.modelClassData(), "relationships");
179
+ const reflections = [];
180
+ for (const relationshipData of relationships) {
181
+ const reflection = new Reflection(relationshipData);
182
+ reflections.push(reflection);
183
+ }
184
+ return reflections;
185
+ }
186
+ /** @returns {Reflection} */
187
+ static reflection(name) {
188
+ const foundReflection = this.reflections().find((reflection) => reflection.name() == name);
189
+ if (!foundReflection) {
190
+ throw new Error(`No such reflection: ${name} in ${this.reflections().map((reflection) => reflection.name()).join(", ")}`);
191
+ }
192
+ return foundReflection;
193
+ }
194
+ /**
195
+ * @returns {string}
196
+ */
197
+ static _token() {
198
+ const csrfTokenElement = document.querySelector("meta[name='csrf-token']");
199
+ if (csrfTokenElement) {
200
+ return csrfTokenElement.getAttribute("content");
201
+ }
202
+ }
203
+ constructor(args = {}) {
322
204
  this.changes = {};
323
- }
324
- return {
325
- model: this,
326
- response
327
- };
328
- } else {
329
- this.handleResponseError(response);
330
- }
331
- }
332
- async ensureAbilities(listOfAbilities) {
333
- // Populate an array with a list of abilities currently not loaded
334
- const abilitiesToLoad = [];
335
- for (const abilityInList of listOfAbilities) {
336
- if (!(abilityInList in this.abilities)) {
337
- abilitiesToLoad.push(abilityInList);
338
- }
339
- }
340
-
341
- // Load the missing abilities if any
342
- if (abilitiesToLoad.length > 0) {
343
- const primaryKeyName = this.constructor.primaryKey();
344
- const ransackParams = {};
345
- ransackParams[`${primaryKeyName}_eq`] = this.primaryKey();
346
- const abilitiesParams = {};
347
- abilitiesParams[digg(this.modelClassData(), "name")] = abilitiesToLoad;
348
- const anotherModel = await this.constructor.ransack(ransackParams).abilities(abilitiesParams).first();
349
- if (!anotherModel) {
350
- throw new Error(`Could not look up the same model ${this.primaryKey()} with abilities: ${abilitiesToLoad.join(", ")}`);
351
- }
352
- const newAbilities = anotherModel.abilities;
353
- for (const newAbility in newAbilities) {
354
- this.abilities[newAbility] = newAbilities[newAbility];
355
- }
356
- }
357
- }
358
- getAttributes = () => Object.assign(this.modelData, this.changes);
359
- handleResponseError(response) {
360
- BaseModel.parseValidationErrors({
361
- model: this,
362
- response
363
- });
364
- throw new new CustomError("Response wasn't successful", {
365
- model: this,
366
- response
367
- })();
368
- }
369
- identifierKey() {
370
- if (!this._identifierKey) this._identifierKey = this.isPersisted() ? this.primaryKey() : this.uniqueKey();
371
- return this._identifierKey;
372
- }
373
- isAssociationLoaded = associationName => this.isAssociationLoadedUnderscore(inflection.underscore(associationName));
374
- isAssociationLoadedUnderscore(associationNameUnderscore) {
375
- if (associationNameUnderscore in this.relationshipsCache) return true;
376
- return false;
377
- }
378
- isAssociationPresent(associationName) {
379
- if (this.isAssociationLoaded(associationName)) return true;
380
- if (associationName in this.relationships) return true;
381
- return false;
382
- }
383
- static parseValidationErrors({
384
- error,
385
- model,
386
- options
387
- }) {
388
- if (!(error instanceof ValidationError)) return;
389
- if (!error.args.response.validation_errors) return;
390
- const validationErrors = new ValidationErrors({
391
- model,
392
- validationErrors: digg(error, "args", "response", "validation_errors")
393
- });
394
- BaseModel.sendValidationErrorsEvent(validationErrors, options);
395
- if (!options || options.throwValidationError != false) {
396
- throw error;
397
- }
398
- }
399
- static humanAttributeName(attributeName) {
400
- const keyName = digg(this.modelClassData(), "i18nKey");
401
- const i18n = Config.getI18n();
402
- if (i18n) return i18n.t(`activerecord.attributes.${keyName}.${BaseModel.snakeCase(attributeName)}`, {
403
- defaultValue: attributeName
404
- });
405
- return inflection.humanize(attributeName);
406
- }
407
- isAttributeChanged(attributeName) {
408
- const attributeNameUnderscore = inflection.underscore(attributeName);
409
- const attributeData = this.modelClassData().attributes.find(attribute => digg(attribute, "name") == attributeNameUnderscore);
410
- if (!attributeData) {
411
- const attributeNames = this.modelClassData().attributes.map(attribute => digg(attribute, "name"));
412
- throw new Error(`Couldn't find an attribute by that name: "${attributeName}" in: ${attributeNames.join(", ")}`);
413
- }
414
- if (!(attributeNameUnderscore in this.changes)) return false;
415
- const oldValue = this.modelData[attributeNameUnderscore];
416
- const newValue = this.changes[attributeNameUnderscore];
417
- const changedMethod = this[`_is${inflection.camelize(attributeData.type, true)}Changed`];
418
- if (!changedMethod) throw new Error(`Don't know how to handle type: ${attributeData.type}`);
419
- return changedMethod(oldValue, newValue);
420
- }
421
- isChanged() {
422
- const keys = Object.keys(this.changes);
423
- if (keys.length > 0) {
424
- return true;
425
- } else {
426
- return false;
427
- }
428
- }
429
- isNewRecord() {
430
- if (this.newRecord !== undefined) {
431
- return this.newRecord;
432
- } else if ("id" in this.modelData && this.modelData.id) {
433
- return false;
434
- } else {
435
- return true;
436
- }
437
- }
438
- isPersisted = () => !this.isNewRecord();
439
- static snakeCase = string => inflection.underscore(string);
440
- savedChangeToAttribute(attributeName) {
441
- if (!this.previousModelData) return false;
442
- const attributeNameUnderscore = inflection.underscore(attributeName);
443
- const attributeData = this.modelClassData().attributes.find(attribute => attribute.name == attributeNameUnderscore);
444
- if (!attributeData) {
445
- const attributeNames = this.modelClassData().attributes.map(attribute => attribute.name);
446
- throw new Error(`Couldn't find an attribute by that name: "${attributeName}" in: ${attributeNames.join(", ")}`);
447
- }
448
- if (!(attributeNameUnderscore in this.previousModelData)) return true;
449
- const oldValue = this.previousModelData[attributeNameUnderscore];
450
- const newValue = this.modelData[attributeNameUnderscore];
451
- const changedMethodName = `_is${inflection.camelize(attributeData.type)}Changed`;
452
- const changedMethod = this[changedMethodName];
453
- if (!changedMethod) throw new Error(`Don't know how to handle type: ${attributeData.type}`);
454
- return changedMethod(oldValue, newValue);
455
- }
456
- setNewModel(model) {
457
- this.setNewModelData(model);
458
- for (const relationshipName in model.relationships) {
459
- this.relationships[relationshipName] = model.relationships[relationshipName];
460
- }
461
- for (const relationshipCacheName in model.relationshipsCache) {
462
- this.relationshipsCache[relationshipCacheName] = model.relationshipsCache[name];
463
- }
464
- }
465
- setNewModelData(model) {
466
- if (!("modelData" in model)) throw new Error(`No modelData in model: ${JSON.stringify(model)}`);
467
- this.previousModelData = Object.assign({}, digg(this, "modelData"));
468
- for (const attributeName in model.modelData) {
469
- this.modelData[attributeName] = model.modelData[attributeName];
470
- }
471
- }
472
- _isDateChanged(oldValue, newValue) {
473
- if (Date.parse(oldValue) != Date.parse(newValue)) return true;
474
- }
475
- _isIntegerChanged(oldValue, newValue) {
476
- if (parseInt(oldValue, 10) != parseInt(newValue, 10)) return true;
477
- }
478
- _isStringChanged(oldValue, newValue) {
479
- const oldConvertedValue = `${oldValue}`;
480
- const newConvertedValue = `${newValue}`;
481
- if (oldConvertedValue != newConvertedValue) return true;
482
- }
483
- modelClassData = () => this.constructor.modelClassData();
484
- async reload() {
485
- const params = this.collection && this.collection.params();
486
- const ransackParams = {};
487
- ransackParams[`${this.constructor.primaryKey()}_eq`] = this.primaryKey();
488
- let query = this.constructor.ransack(ransackParams);
489
- if (params) {
490
- if (params.preload) {
491
- query.queryArgs.preload = params.preload;
492
- }
493
- if (params.select) {
494
- query.queryArgs.select = params.select;
495
- }
496
- if (params.select_columns) {
497
- query.queryArgs.selectColumns = params.select_columns;
498
- }
499
- }
500
- const model = await query.first();
501
- this.setNewModel(model);
502
- this.changes = {};
503
- }
504
- save() {
505
- if (this.isNewRecord()) {
506
- return this.create();
507
- } else {
508
- return this.update();
509
- }
510
- }
511
- saveRaw(rawData, options = {}) {
512
- if (this.isNewRecord()) {
513
- return this.createRaw(rawData, options);
514
- } else {
515
- return this.updateRaw(rawData, options);
516
- }
517
- }
518
- async update(newAttributes, options) {
519
- if (newAttributes) {
520
- this.assignAttributes(newAttributes);
521
- }
522
- if (Object.keys(this.changes).length == 0) {
523
- return {
524
- model: this
525
- };
526
- }
527
- const paramKey = this.modelClassData().paramKey;
528
- const modelData = this.changes;
529
- const dataToUse = {};
530
- dataToUse[paramKey] = modelData;
531
- let response;
532
- try {
533
- response = await CommandsPool.addCommand({
534
- args: {
535
- query_params: this.collection && this.collection.params(),
536
- save: dataToUse
537
- },
538
- command: `${this.modelClassData().collectionName}-update`,
539
- collectionName: this.modelClassData().collectionName,
540
- primaryKey: this.primaryKey(),
541
- type: "update"
542
- }, {});
543
- } catch (error) {
544
- BaseModel.parseValidationErrors({
545
- error,
546
- model: this,
547
- options
548
- });
549
- throw error;
550
- }
551
- if (response.success) {
552
- if (response.model) {
553
- this._refreshModelFromResponse(response);
205
+ this.newRecord = args.isNewRecord;
206
+ this.relationshipsCache = {};
207
+ this.relationships = {};
208
+ if (args && args.data && args.data.a) {
209
+ this._readModelDataFromArgs(args);
210
+ }
211
+ else if (args.a) {
212
+ this.abilities = args.b || {};
213
+ this.modelData = objectToUnderscore(args.a);
214
+ }
215
+ else if (args) {
216
+ this.abilities = {};
217
+ this.modelData = objectToUnderscore(args);
218
+ }
219
+ else {
220
+ this.abilities = {};
221
+ this.modelData = {};
222
+ }
223
+ }
224
+ /**
225
+ * @param {Record<string, any>} newAttributes
226
+ * @returns {void}
227
+ */
228
+ assignAttributes(newAttributes) {
229
+ for (const key in newAttributes) {
230
+ const newValue = newAttributes[key];
231
+ const attributeUnderscore = inflection.underscore(key);
232
+ let applyChange = true;
233
+ let deleteChange = false;
234
+ if (this.isAttributeLoaded(key)) {
235
+ const oldValue = this.readAttribute(key);
236
+ const originalValue = this.modelData[attributeUnderscore];
237
+ if (newValue == oldValue) {
238
+ applyChange = false;
239
+ }
240
+ else if (newValue == originalValue) {
241
+ applyChange = false;
242
+ deleteChange = true;
243
+ }
244
+ }
245
+ if (applyChange) {
246
+ this.changes[attributeUnderscore] = newValue;
247
+ }
248
+ else if (deleteChange) {
249
+ delete this.changes[attributeUnderscore];
250
+ }
251
+ }
252
+ }
253
+ /** @returns {Record<string, any>} */
254
+ attributes() {
255
+ const result = {};
256
+ for (const key in this.modelData) {
257
+ result[key] = this.modelData[key];
258
+ }
259
+ for (const key in this.changes) {
260
+ result[key] = this.changes[key];
261
+ }
262
+ return result;
263
+ }
264
+ /**
265
+ * @param {string} givenAbilityName
266
+ * @returns {boolean}
267
+ */
268
+ can(givenAbilityName) {
269
+ const abilityName = inflection.underscore(givenAbilityName);
270
+ if (!(abilityName in this.abilities)) {
271
+ throw new Error(`Ability ${abilityName} hasn't been loaded for ${digg(this.modelClassData(), "name")}`);
272
+ }
273
+ return this.abilities[abilityName];
274
+ }
275
+ /**
276
+ * @template {BaseModel} Self
277
+ * @this {Self}
278
+ * @returns {Self}
279
+ */
280
+ clone() {
281
+ const ModelClass = /** @type {new (...args: any[]) => Self} */ (this.constructor);
282
+ const clone = new ModelClass();
283
+ clone.abilities = { ...this.abilities };
284
+ clone.modelData = { ...this.modelData };
285
+ clone.relationships = { ...this.relationships };
286
+ clone.relationshipsCache = { ...this.relationshipsCache };
287
+ return clone;
288
+ }
289
+ /** @returns {number | string} */
290
+ cacheKey() {
291
+ if (this.isPersisted()) {
292
+ const keyParts = [
293
+ this.modelClassData().paramKey,
294
+ this.primaryKey()
295
+ ];
296
+ if ("updated_at" in this.modelData) {
297
+ // @ts-expect-error
298
+ const updatedAt = this.updatedAt();
299
+ if (typeof updatedAt != "object") {
300
+ throw new Error(`updatedAt wasn't an object: ${typeof updatedAt}`);
301
+ }
302
+ else if (!("getTime" in updatedAt)) {
303
+ throw new Error(`updatedAt didn't support getTime with class: ${updatedAt.constructor && updatedAt.constructor.name}`);
304
+ }
305
+ // @ts-expect-error
306
+ keyParts.push(`updatedAt-${this.updatedAt().getTime()}`);
307
+ }
308
+ return keyParts.join("-");
309
+ }
310
+ else {
311
+ return this.uniqueKey();
312
+ }
313
+ }
314
+ /** @returns {string} */
315
+ localCacheKey() {
316
+ const cacheKeyGenerator = new CacheKeyGenerator(this);
317
+ return cacheKeyGenerator.local();
318
+ }
319
+ /** @returns {string} */
320
+ fullCacheKey() {
321
+ const cacheKeyGenerator = new CacheKeyGenerator(this);
322
+ return cacheKeyGenerator.cacheKey();
323
+ }
324
+ /**
325
+ * @template {typeof BaseModel} MC
326
+ * @this {MC}
327
+ * @returns {Collection<MC>}
328
+ */
329
+ static all() {
330
+ return this.ransack();
331
+ }
332
+ /**
333
+ * @param {Record<string, any>} [attributes]
334
+ * @param {object} [options]
335
+ * @returns {Promise<{
336
+ * model: BaseModel,
337
+ * response: object
338
+ * }>}
339
+ */
340
+ async create(attributes, options) {
341
+ if (attributes)
342
+ this.assignAttributes(attributes);
343
+ const paramKey = this.modelClassData().paramKey;
344
+ const modelData = this.getAttributes();
345
+ const dataToUse = {};
346
+ dataToUse[paramKey] = modelData;
347
+ let response;
348
+ try {
349
+ response = await CommandsPool.addCommand({
350
+ args: {
351
+ save: dataToUse
352
+ },
353
+ command: `${this.modelClassData().collectionName}-create`,
354
+ collectionName: this.modelClassData().collectionName,
355
+ primaryKey: this.primaryKey(),
356
+ type: "create"
357
+ }, {});
358
+ }
359
+ catch (error) {
360
+ BaseModel.parseValidationErrors({ error, model: this, options });
361
+ throw error;
362
+ }
363
+ if (response.model) {
364
+ this._refreshModelFromResponse(response);
365
+ this.changes = {};
366
+ }
367
+ return { model: this, response };
368
+ }
369
+ /**
370
+ * @param {FormData | Record<string, any>} rawData
371
+ * @param {object} [options]
372
+ */
373
+ async createRaw(rawData, options = {}) {
374
+ const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
375
+ let response;
376
+ try {
377
+ response = await CommandsPool.addCommand({
378
+ args: {
379
+ save: objectData
380
+ },
381
+ command: `${this.modelClassData().collectionName}-create`,
382
+ collectionName: this.modelClassData().collectionName,
383
+ primaryKey: this.primaryKey(),
384
+ type: "create"
385
+ }, {});
386
+ }
387
+ catch (error) {
388
+ BaseModel.parseValidationErrors({ error, model: this, options });
389
+ throw error;
390
+ }
391
+ if (response.model) {
392
+ this._refreshModelDataFromResponse(response);
393
+ this.changes = {};
394
+ }
395
+ return { model: this, response };
396
+ }
397
+ /** @returns {Promise<{model: BaseModel, response: object}>} */
398
+ async destroy() {
399
+ const response = await CommandsPool.addCommand({
400
+ args: { query_params: this.collection && this.collection.params() },
401
+ command: `${this.modelClassData().collectionName}-destroy`,
402
+ collectionName: this.modelClassData().collectionName,
403
+ primaryKey: this.primaryKey(),
404
+ type: "destroy"
405
+ }, {});
406
+ if (response.success) {
407
+ if (response.model) {
408
+ this._refreshModelDataFromResponse(response);
409
+ this.changes = {};
410
+ }
411
+ return { model: this, response };
412
+ }
413
+ else {
414
+ this.handleResponseError(response);
415
+ }
416
+ }
417
+ async ensureAbilities(listOfAbilities) {
418
+ // Populate an array with a list of abilities currently not loaded
419
+ const abilitiesToLoad = [];
420
+ for (const abilityInList of listOfAbilities) {
421
+ if (!(abilityInList in this.abilities)) {
422
+ abilitiesToLoad.push(abilityInList);
423
+ }
424
+ }
425
+ // Load the missing abilities if any
426
+ if (abilitiesToLoad.length > 0) {
427
+ const primaryKeyName = this.modelClass().primaryKey();
428
+ const ransackParams = {};
429
+ ransackParams[`${primaryKeyName}_eq`] = this.primaryKey();
430
+ const abilitiesParams = {};
431
+ abilitiesParams[digg(this.modelClassData(), "name")] = abilitiesToLoad;
432
+ const anotherModel = await this.modelClass()
433
+ .ransack(ransackParams)
434
+ .abilities(abilitiesParams)
435
+ .first();
436
+ if (!anotherModel) {
437
+ throw new Error(`Could not look up the same model ${this.primaryKey()} with abilities: ${abilitiesToLoad.join(", ")}`);
438
+ }
439
+ const newAbilities = anotherModel.abilities;
440
+ for (const newAbility in newAbilities) {
441
+ this.abilities[newAbility] = newAbilities[newAbility];
442
+ }
443
+ }
444
+ }
445
+ /**
446
+ * @returns {Record<string, any>}
447
+ */
448
+ getAttributes() { return Object.assign(this.modelData, this.changes); }
449
+ asd;
450
+ handleResponseError(response) {
451
+ // @ts-expect-error
452
+ BaseModel.parseValidationErrors({ model: this, response });
453
+ throw new CustomError("Response wasn't successful", { model: this, response });
454
+ }
455
+ /**
456
+ * @returns {number | string}
457
+ */
458
+ identifierKey() {
459
+ if (!this._identifierKey)
460
+ this._identifierKey = this.isPersisted() ? this.primaryKey() : this.uniqueKey();
461
+ return this._identifierKey;
462
+ }
463
+ /**
464
+ * @returns {boolean}
465
+ */
466
+ isAssociationLoaded(associationName) { return this.isAssociationLoadedUnderscore(inflection.underscore(associationName)); }
467
+ /**
468
+ * @returns {boolean}
469
+ */
470
+ isAssociationLoadedUnderscore(associationNameUnderscore) {
471
+ if (associationNameUnderscore in this.relationshipsCache)
472
+ return true;
473
+ return false;
474
+ }
475
+ /**
476
+ * @returns {boolean}
477
+ */
478
+ isAssociationPresent(associationName) {
479
+ if (this.isAssociationLoaded(associationName))
480
+ return true;
481
+ if (associationName in this.relationships)
482
+ return true;
483
+ return false;
484
+ }
485
+ /**
486
+ * @param {object} args
487
+ * @param {any} args.error
488
+ * @param {BaseModel} [args.model]
489
+ * @param {ParseValidationErrorsOptions} args.options
490
+ */
491
+ static parseValidationErrors({ error, model, options }) {
492
+ if (!(error instanceof ValidationError))
493
+ return;
494
+ if (!error.args.response.validation_errors)
495
+ return;
496
+ const validationErrors = new ValidationErrors({
497
+ model,
498
+ validationErrors: digg(error, "args", "response", "validation_errors")
499
+ });
500
+ BaseModel.sendValidationErrorsEvent(validationErrors, options);
501
+ if (!options || options.throwValidationError != false) {
502
+ throw error;
503
+ }
504
+ }
505
+ static humanAttributeName(attributeName) {
506
+ const keyName = digg(this.modelClassData(), "i18nKey");
507
+ // @ts-expect-error
508
+ const i18n = Config.getI18n();
509
+ if (i18n)
510
+ return i18n.t(`activerecord.attributes.${keyName}.${BaseModel.snakeCase(attributeName)}`, { defaultValue: attributeName });
511
+ return inflection.humanize(attributeName);
512
+ }
513
+ /**
514
+ * @param {string} attributeName
515
+ * @returns {boolean}
516
+ */
517
+ isAttributeChanged(attributeName) {
518
+ const attributeNameUnderscore = inflection.underscore(attributeName);
519
+ const attributeData = this.modelClassData().attributes.find((attribute) => digg(attribute, "name") == attributeNameUnderscore);
520
+ if (!attributeData) {
521
+ const attributeNames = this.modelClassData().attributes.map((attribute) => digg(attribute, "name"));
522
+ throw new Error(`Couldn't find an attribute by that name: "${attributeName}" in: ${attributeNames.join(", ")}`);
523
+ }
524
+ if (!(attributeNameUnderscore in this.changes))
525
+ return false;
526
+ const oldValue = this.modelData[attributeNameUnderscore];
527
+ const newValue = this.changes[attributeNameUnderscore];
528
+ const changedMethod = this[`_is${inflection.camelize(attributeData.type, true)}Changed`];
529
+ if (!changedMethod)
530
+ throw new Error(`Don't know how to handle type: ${attributeData.type}`);
531
+ return changedMethod(oldValue, newValue);
532
+ }
533
+ /**
534
+ * @returns {boolean}
535
+ */
536
+ isChanged() {
537
+ const keys = Object.keys(this.changes);
538
+ if (keys.length > 0) {
539
+ return true;
540
+ }
541
+ else {
542
+ return false;
543
+ }
544
+ }
545
+ /**
546
+ * @returns {boolean}
547
+ */
548
+ isNewRecord() {
549
+ if (this.newRecord !== undefined) {
550
+ return this.newRecord;
551
+ }
552
+ else if ("id" in this.modelData && this.modelData.id) {
553
+ return false;
554
+ }
555
+ else {
556
+ return true;
557
+ }
558
+ }
559
+ /**
560
+ * @returns {boolean}
561
+ */
562
+ isPersisted() { return !this.isNewRecord(); }
563
+ /**
564
+ * @param {string} string
565
+ * @returns {string}
566
+ */
567
+ static snakeCase(string) { return inflection.underscore(string); }
568
+ /**
569
+ * @param {string} attributeName
570
+ * @returns {boolean}
571
+ */
572
+ savedChangeToAttribute(attributeName) {
573
+ if (!this.previousModelData)
574
+ return false;
575
+ const attributeNameUnderscore = inflection.underscore(attributeName);
576
+ const attributeData = this.modelClassData().attributes.find((attribute) => attribute.name == attributeNameUnderscore);
577
+ if (!attributeData) {
578
+ const attributeNames = this.modelClassData().attributes.map((attribute) => attribute.name);
579
+ throw new Error(`Couldn't find an attribute by that name: "${attributeName}" in: ${attributeNames.join(", ")}`);
580
+ }
581
+ if (!(attributeNameUnderscore in this.previousModelData))
582
+ return true;
583
+ const oldValue = this.previousModelData[attributeNameUnderscore];
584
+ const newValue = this.modelData[attributeNameUnderscore];
585
+ const changedMethodName = `_is${inflection.camelize(attributeData.type)}Changed`;
586
+ const changedMethod = this[changedMethodName];
587
+ if (!changedMethod)
588
+ throw new Error(`Don't know how to handle type: ${attributeData.type}`);
589
+ return changedMethod(oldValue, newValue);
590
+ }
591
+ /**
592
+ * @param {BaseModel} model
593
+ * @returns {void}
594
+ */
595
+ setNewModel(model) {
596
+ this.setNewModelData(model);
597
+ for (const relationshipName in model.relationships) {
598
+ this.relationships[relationshipName] = model.relationships[relationshipName];
599
+ }
600
+ for (const relationshipCacheName in model.relationshipsCache) {
601
+ this.relationshipsCache[relationshipCacheName] = model.relationshipsCache[name];
602
+ }
603
+ }
604
+ setNewModelData(model) {
605
+ if (!("modelData" in model))
606
+ throw new Error(`No modelData in model: ${JSON.stringify(model)}`);
607
+ this.previousModelData = Object.assign({}, digg(this, "modelData"));
608
+ for (const attributeName in model.modelData) {
609
+ this.modelData[attributeName] = model.modelData[attributeName];
610
+ }
611
+ }
612
+ _isDateChanged(oldValue, newValue) {
613
+ if (Date.parse(oldValue) != Date.parse(newValue))
614
+ return true;
615
+ }
616
+ _isIntegerChanged(oldValue, newValue) {
617
+ if (parseInt(oldValue, 10) != parseInt(newValue, 10))
618
+ return true;
619
+ }
620
+ _isStringChanged(oldValue, newValue) {
621
+ const oldConvertedValue = `${oldValue}`;
622
+ const newConvertedValue = `${newValue}`;
623
+ if (oldConvertedValue != newConvertedValue)
624
+ return true;
625
+ }
626
+ /** @returns {ModelClassDataType} */
627
+ modelClassData() { return this.modelClass().modelClassData(); }
628
+ /**
629
+ * @returns {Promise<void>}
630
+ */
631
+ async reload() {
632
+ const params = this.collection && this.collection.params();
633
+ const ransackParams = {};
634
+ ransackParams[`${this.modelClass().primaryKey()}_eq`] = this.primaryKey();
635
+ let query = this.modelClass().ransack(ransackParams);
636
+ if (params) {
637
+ if (params.preload) {
638
+ query.queryArgs.preload = params.preload;
639
+ }
640
+ if (params.select) {
641
+ query.queryArgs.select = params.select;
642
+ }
643
+ if (params.select_columns) {
644
+ query.queryArgs.selectColumns = params.select_columns;
645
+ }
646
+ }
647
+ const model = await query.first();
648
+ this.setNewModel(model);
554
649
  this.changes = {};
555
- }
556
- return {
557
- response,
558
- model: this
559
- };
560
- } else {
561
- this.handleResponseError(response);
562
- }
563
- }
564
- _refreshModelFromResponse(response) {
565
- let newModel = digg(response, "model");
566
- if (Array.isArray(newModel)) newModel = newModel[0];
567
- this.setNewModel(newModel);
568
- }
569
- _refreshModelDataFromResponse(response) {
570
- let newModel = digg(response, "model");
571
- if (Array.isArray(newModel)) newModel = newModel[0];
572
- this.setNewModelData(newModel);
573
- }
574
- static _objectDataFromGivenRawData(rawData, options) {
575
- if (rawData instanceof FormData || rawData.nodeName == "FORM") {
576
- const formData = FormDataObjectizer.formDataFromObject(rawData, options);
577
- return FormDataObjectizer.toObject(formData);
578
- }
579
- return rawData;
580
- }
581
- async updateRaw(rawData, options = {}) {
582
- const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
583
- let response;
584
- try {
585
- response = await CommandsPool.addCommand({
586
- args: {
587
- query_params: this.collection && this.collection.params(),
588
- save: objectData,
589
- simple_model_errors: options?.simpleModelErrors
590
- },
591
- command: `${this.modelClassData().collectionName}-update`,
592
- collectionName: this.modelClassData().collectionName,
593
- primaryKey: this.primaryKey(),
594
- type: "update"
595
- }, {});
596
- } catch (error) {
597
- BaseModel.parseValidationErrors({
598
- error,
599
- model: this,
600
- options
601
- });
602
- throw error;
603
- }
604
- if (response.model) {
605
- this._refreshModelFromResponse(response);
606
- this.changes = {};
607
- }
608
- return {
609
- response,
610
- model: this
611
- };
612
- }
613
- isValid() {
614
- throw new Error("Not implemented yet");
615
- }
616
- async isValidOnServer() {
617
- const modelData = this.getAttributes();
618
- const paramKey = this.modelClassData().paramKey;
619
- const dataToUse = {};
620
- dataToUse[paramKey] = modelData;
621
- const response = await CommandsPool.addCommand({
622
- args: {
623
- save: dataToUse
624
- },
625
- command: `${this.modelClassData().collectionName}-valid`,
626
- collectionName: this.modelClassData().collectionName,
627
- primaryKey: this.primaryKey(),
628
- type: "valid"
629
- }, {});
630
- return {
631
- valid: response.valid,
632
- errors: response.errors
633
- };
634
- }
635
- modelClass = () => this.constructor;
636
- preloadRelationship(relationshipName, model) {
637
- this.relationshipsCache[BaseModel.snakeCase(relationshipName)] = model;
638
- this.relationships[BaseModel.snakeCase(relationshipName)] = model;
639
- }
640
- markForDestruction() {
641
- this._markedForDestruction = true;
642
- }
643
- markedForDestruction = () => this._markedForDestruction;
644
- uniqueKey() {
645
- if (!this.uniqueKeyValue) {
646
- const min = 5000000000000000;
647
- const max = 9007199254740991;
648
- const randomBetween = Math.floor(Math.random() * (max - min + 1) + min);
649
- this.uniqueKeyValue = randomBetween;
650
- }
651
- return this.uniqueKeyValue;
652
- }
653
- static async _callCollectionCommand(args, commandArgs) {
654
- const formOrDataObject = args.args;
655
- try {
656
- return await CommandsPool.addCommand(args, commandArgs);
657
- } catch (error) {
658
- let form;
659
- if (commandArgs.form) {
660
- form = commandArgs.form;
661
- } else if (formOrDataObject?.nodeName == "FORM") {
662
- form = formOrDataObject;
663
- }
664
- if (form) BaseModel.parseValidationErrors({
665
- error,
666
- options: {
667
- form
668
- }
669
- });
670
- throw error;
671
- }
672
- }
673
- _callMemberCommand = (args, commandArgs) => CommandsPool.addCommand(args, commandArgs);
674
- static _postDataFromArgs(args) {
675
- let postData;
676
- if (args) {
677
- if (args instanceof FormData) {
678
- postData = args;
679
- } else {
680
- postData = objectToFormData.serialize(args, {}, null, "args");
681
- }
682
- } else {
683
- postData = new FormData();
684
- }
685
- return postData;
686
- }
687
- readAttribute(attributeName) {
688
- const attributeNameUnderscore = inflection.underscore(attributeName);
689
- return this.readAttributeUnderscore(attributeNameUnderscore);
690
- }
691
- readAttributeUnderscore(attributeName) {
692
- if (attributeName in this.changes) {
693
- return this.changes[attributeName];
694
- } else if (attributeName in this.modelData) {
695
- return this.modelData[attributeName];
696
- } else if (this.isNewRecord()) {
697
- // Return null if this is a new record and the attribute name is a recognized attribute
698
- const attributes = digg(this.modelClassData(), "attributes");
699
- if (attributeName in attributes) return null;
700
- }
701
- if (this.isPersisted()) {
702
- throw new AttributeNotLoadedError(`No such attribute: ${digg(this.modelClassData(), "name")}#${attributeName}: ${JSON.stringify(this.modelData)}`);
703
- }
704
- }
705
- isAttributeLoaded(attributeName) {
706
- const attributeNameUnderscore = inflection.underscore(attributeName);
707
- if (attributeNameUnderscore in this.changes) return true;
708
- if (attributeNameUnderscore in this.modelData) return true;
709
- return false;
710
- }
711
- _isPresent(value) {
712
- if (!value) {
713
- return false;
714
- } else if (typeof value == "string" && value.match(/^\s*$/)) {
715
- return false;
716
- }
717
- return true;
718
- }
719
- async _loadBelongsToReflection(args, queryArgs = {}) {
720
- if (args.reflectionName in this.relationships) {
721
- return this.relationships[args.reflectionName];
722
- } else if (args.reflectionName in this.relationshipsCache) {
723
- return this.relationshipsCache[args.reflectionName];
724
- } else {
725
- const collection = new Collection(args, queryArgs);
726
- const model = await collection.first();
727
- this.relationshipsCache[args.reflectionName] = model;
728
- return model;
729
- }
730
- }
731
- _readBelongsToReflection({
732
- reflectionName
733
- }) {
734
- if (reflectionName in this.relationships) {
735
- return this.relationships[reflectionName];
736
- } else if (reflectionName in this.relationshipsCache) {
737
- return this.relationshipsCache[reflectionName];
738
- }
739
- if (this.isNewRecord()) return null;
740
- const loadedRelationships = Object.keys(this.relationshipsCache);
741
- const modelClassName = digg(this.modelClassData(), "name");
742
- throw new NotLoadedError(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
743
- }
744
- async _loadHasManyReflection(args, queryArgs = {}) {
745
- if (args.reflectionName in this.relationships) {
746
- return this.relationships[args.reflectionName];
747
- } else if (args.reflectionName in this.relationshipsCache) {
748
- return this.relationshipsCache[args.reflectionName];
749
- }
750
- const collection = new Collection(args, queryArgs);
751
- const models = await collection.toArray();
752
- this.relationshipsCache[args.reflectionName] = models;
753
- return models;
754
- }
755
- async _loadHasOneReflection(args, queryArgs = {}) {
756
- if (args.reflectionName in this.relationships) {
757
- return this.relationships[args.reflectionName];
758
- } else if (args.reflectionName in this.relationshipsCache) {
759
- return this.relationshipsCache[args.reflectionName];
760
- } else {
761
- const collection = new Collection(args, queryArgs);
762
- const model = await collection.first();
763
- this.relationshipsCache[args.reflectionName] = model;
764
- return model;
765
- }
766
- }
767
- _readHasOneReflection({
768
- reflectionName
769
- }) {
770
- if (reflectionName in this.relationships) {
771
- return this.relationships[reflectionName];
772
- } else if (reflectionName in this.relationshipsCache) {
773
- return this.relationshipsCache[reflectionName];
774
- }
775
- if (this.isNewRecord()) {
776
- return null;
777
- }
778
- const loadedRelationships = Object.keys(this.relationshipsCache);
779
- const modelClassName = digg(this.modelClassData(), "name");
780
- throw new NotLoadedError(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
781
- }
782
- _readModelDataFromArgs(args) {
783
- this.abilities = args.data.b || {};
784
- this.collection = args.collection;
785
- this.modelData = objectToUnderscore(args.data.a);
786
- this.preloadedRelationships = args.data.r;
787
- }
788
- _readPreloadedRelationships(preloaded) {
789
- if (!this.preloadedRelationships) {
790
- return;
791
- }
792
- const relationships = digg(this.modelClassData(), "relationships");
793
- for (const relationshipName in this.preloadedRelationships) {
794
- const relationshipData = this.preloadedRelationships[relationshipName];
795
- const relationshipClassData = relationships.find(relationship => digg(relationship, "name") == relationshipName);
796
- if (!relationshipClassData) {
797
- const modelName = digg(this.modelClassData(), "name");
798
- const relationshipsList = relationships.map(relationship => relationship.name).join(", ");
799
- throw new Error(`Could not find the relation ${relationshipName} on the ${modelName} model: ${relationshipsList}`);
800
- }
801
- const relationshipType = digg(relationshipClassData, "collectionName");
802
- if (relationshipName in this.relationshipsCache) {
803
- throw new Error(`${relationshipName} has already been loaded`);
804
- }
805
- if (!relationshipClassData) {
806
- throw new Error(`No relationship on ${digg(this.modelClassData(), "name")} by that name: ${relationshipName}`);
807
- }
808
- if (!relationshipData) {
809
- this.relationshipsCache[relationshipName] = null;
810
- this.relationships[relationshipName] = null;
811
- } else if (Array.isArray(relationshipData)) {
812
- this.relationshipsCache[relationshipName] = [];
813
- this.relationships[relationshipName] = [];
814
- for (const relationshipId of relationshipData) {
815
- const model = preloaded.getModel(relationshipType, relationshipId);
816
- this.relationshipsCache[relationshipName].push(model);
817
- this.relationships[relationshipName].push(model);
818
- }
819
- } else {
820
- const model = preloaded.getModel(relationshipType, relationshipData);
821
- this.relationshipsCache[relationshipName] = model;
822
- this.relationships[relationshipName] = model;
823
- }
824
- }
825
- }
826
- primaryKey = () => this.readAttributeUnderscore(this.constructor.primaryKey());
650
+ }
651
+ /**
652
+ * @returns {Promise<{model: BaseModel, response?: object}>}
653
+ */
654
+ save() {
655
+ if (this.isNewRecord()) {
656
+ return this.create();
657
+ }
658
+ else {
659
+ return this.update();
660
+ }
661
+ }
662
+ /**
663
+ * @returns {Promise<{model: BaseModel, response: object}>}
664
+ */
665
+ saveRaw(rawData, options = {}) {
666
+ if (this.isNewRecord()) {
667
+ return this.createRaw(rawData, options);
668
+ }
669
+ else {
670
+ return this.updateRaw(rawData, options);
671
+ }
672
+ }
673
+ /**
674
+ * @param {Record<string, any>} [newAttributes]
675
+ * @param {ParseValidationErrorsOptions} [options]
676
+ * @returns {Promise<{
677
+ * model: BaseModel,
678
+ * response?: object
679
+ * }>}
680
+ */
681
+ async update(newAttributes, options) {
682
+ if (newAttributes) {
683
+ this.assignAttributes(newAttributes);
684
+ }
685
+ if (Object.keys(this.changes).length == 0) {
686
+ return { model: this };
687
+ }
688
+ const paramKey = this.modelClassData().paramKey;
689
+ const modelData = this.changes;
690
+ const dataToUse = {};
691
+ dataToUse[paramKey] = modelData;
692
+ let response;
693
+ try {
694
+ response = await CommandsPool.addCommand({
695
+ args: {
696
+ query_params: this.collection && this.collection.params(),
697
+ save: dataToUse
698
+ },
699
+ command: `${this.modelClassData().collectionName}-update`,
700
+ collectionName: this.modelClassData().collectionName,
701
+ primaryKey: this.primaryKey(),
702
+ type: "update"
703
+ }, {});
704
+ }
705
+ catch (error) {
706
+ BaseModel.parseValidationErrors({ error, model: this, options });
707
+ throw error;
708
+ }
709
+ if (response.success) {
710
+ if (response.model) {
711
+ this._refreshModelFromResponse(response);
712
+ this.changes = {};
713
+ }
714
+ return { response, model: this };
715
+ }
716
+ else {
717
+ this.handleResponseError(response);
718
+ }
719
+ }
720
+ _refreshModelFromResponse(response) {
721
+ let newModel = digg(response, "model");
722
+ if (Array.isArray(newModel))
723
+ newModel = newModel[0];
724
+ this.setNewModel(newModel);
725
+ }
726
+ _refreshModelDataFromResponse(response) {
727
+ let newModel = digg(response, "model");
728
+ if (Array.isArray(newModel))
729
+ newModel = newModel[0];
730
+ this.setNewModelData(newModel);
731
+ }
732
+ /**
733
+ * @param {FormData | Record<string, any>} rawData
734
+ * @param {object} options
735
+ * @returns {Record<string, any>}
736
+ */
737
+ static _objectDataFromGivenRawData(rawData, options) {
738
+ if (rawData instanceof FormData || rawData.nodeName == "FORM") {
739
+ const formData = FormDataObjectizer.formDataFromObject(rawData, options);
740
+ return FormDataObjectizer.toObject(formData);
741
+ }
742
+ return rawData;
743
+ }
744
+ async updateRaw(rawData, options = {}) {
745
+ const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
746
+ let response;
747
+ try {
748
+ response = await CommandsPool.addCommand({
749
+ args: {
750
+ query_params: this.collection && this.collection.params(),
751
+ save: objectData,
752
+ simple_model_errors: options?.simpleModelErrors
753
+ },
754
+ command: `${this.modelClassData().collectionName}-update`,
755
+ collectionName: this.modelClassData().collectionName,
756
+ primaryKey: this.primaryKey(),
757
+ type: "update"
758
+ }, {});
759
+ }
760
+ catch (error) {
761
+ BaseModel.parseValidationErrors({ error, model: this, options });
762
+ throw error;
763
+ }
764
+ if (response.model) {
765
+ this._refreshModelFromResponse(response);
766
+ this.changes = {};
767
+ }
768
+ return { response, model: this };
769
+ }
770
+ isValid() {
771
+ throw new Error("Not implemented yet");
772
+ }
773
+ async isValidOnServer() {
774
+ const modelData = this.getAttributes();
775
+ const paramKey = this.modelClassData().paramKey;
776
+ const dataToUse = {};
777
+ dataToUse[paramKey] = modelData;
778
+ const response = await CommandsPool.addCommand({
779
+ args: {
780
+ save: dataToUse
781
+ },
782
+ command: `${this.modelClassData().collectionName}-valid`,
783
+ collectionName: this.modelClassData().collectionName,
784
+ primaryKey: this.primaryKey(),
785
+ type: "valid"
786
+ }, {});
787
+ return { valid: response.valid, errors: response.errors };
788
+ }
789
+ /**
790
+ * @template {BaseModel} Self
791
+ * @this {Self}
792
+ * @returns {typeof BaseModel & (new (...args: any[]) => Self)}
793
+ */
794
+ modelClass() {
795
+ return /** @type {any} */ (this.constructor);
796
+ }
797
+ preloadRelationship(relationshipName, model) {
798
+ this.relationshipsCache[BaseModel.snakeCase(relationshipName)] = model;
799
+ this.relationships[BaseModel.snakeCase(relationshipName)] = model;
800
+ }
801
+ /**
802
+ * @returns {void}
803
+ */
804
+ markForDestruction() {
805
+ this._markedForDestruction = true;
806
+ }
807
+ /**
808
+ * @returns {boolean}
809
+ */
810
+ markedForDestruction() { return this._markedForDestruction || false; }
811
+ /**
812
+ * @returns {number}
813
+ */
814
+ uniqueKey() {
815
+ if (!this.uniqueKeyValue) {
816
+ const min = 5000000000000000;
817
+ const max = 9007199254740991;
818
+ const randomBetween = Math.floor(Math.random() * (max - min + 1) + min);
819
+ this.uniqueKeyValue = randomBetween;
820
+ }
821
+ return this.uniqueKeyValue;
822
+ }
823
+ static async _callCollectionCommand(args, commandArgs) {
824
+ const formOrDataObject = args.args;
825
+ try {
826
+ return await CommandsPool.addCommand(args, commandArgs);
827
+ }
828
+ catch (error) {
829
+ let form;
830
+ if (commandArgs.form) {
831
+ form = commandArgs.form;
832
+ }
833
+ else if (formOrDataObject?.nodeName == "FORM") {
834
+ form = formOrDataObject;
835
+ }
836
+ if (form)
837
+ BaseModel.parseValidationErrors({ error, options: { form } });
838
+ throw error;
839
+ }
840
+ }
841
+ _callMemberCommand = (args, commandArgs) => CommandsPool.addCommand(args, commandArgs);
842
+ static _postDataFromArgs(args) {
843
+ let postData;
844
+ if (args) {
845
+ if (args instanceof FormData) {
846
+ postData = args;
847
+ }
848
+ else {
849
+ postData = objectToFormData.serialize(args, {}, null, "args");
850
+ }
851
+ }
852
+ else {
853
+ postData = new FormData();
854
+ }
855
+ return postData;
856
+ }
857
+ /**
858
+ * @param {string} attributeName
859
+ * @returns {any}
860
+ */
861
+ readAttribute(attributeName) {
862
+ const attributeNameUnderscore = inflection.underscore(attributeName);
863
+ return this.readAttributeUnderscore(attributeNameUnderscore);
864
+ }
865
+ /**
866
+ * @param {string} attributeName
867
+ * @returns {any}
868
+ */
869
+ readAttributeUnderscore(attributeName) {
870
+ if (attributeName in this.changes) {
871
+ return this.changes[attributeName];
872
+ }
873
+ else if (attributeName in this.modelData) {
874
+ return this.modelData[attributeName];
875
+ }
876
+ else if (this.isNewRecord()) {
877
+ // Return null if this is a new record and the attribute name is a recognized attribute
878
+ const attributes = digg(this.modelClassData(), "attributes");
879
+ if (attributeName in attributes)
880
+ return null;
881
+ }
882
+ if (this.isPersisted()) {
883
+ throw new AttributeNotLoadedError(`No such attribute: ${digg(this.modelClassData(), "name")}#${attributeName}: ${JSON.stringify(this.modelData)}`);
884
+ }
885
+ }
886
+ /**
887
+ * @returns {boolean}
888
+ */
889
+ isAttributeLoaded(attributeName) {
890
+ const attributeNameUnderscore = inflection.underscore(attributeName);
891
+ if (attributeNameUnderscore in this.changes)
892
+ return true;
893
+ if (attributeNameUnderscore in this.modelData)
894
+ return true;
895
+ return false;
896
+ }
897
+ _isPresent(value) {
898
+ if (!value) {
899
+ return false;
900
+ }
901
+ else if (typeof value == "string" && value.match(/^\s*$/)) {
902
+ return false;
903
+ }
904
+ return true;
905
+ }
906
+ async _loadBelongsToReflection(args, queryArgs = {}) {
907
+ if (args.reflectionName in this.relationships) {
908
+ return this.relationships[args.reflectionName];
909
+ }
910
+ else if (args.reflectionName in this.relationshipsCache) {
911
+ return this.relationshipsCache[args.reflectionName];
912
+ }
913
+ else {
914
+ const collection = new Collection(args, queryArgs);
915
+ const model = await collection.first();
916
+ this.relationshipsCache[args.reflectionName] = model;
917
+ return model;
918
+ }
919
+ }
920
+ _readBelongsToReflection({ reflectionName }) {
921
+ if (reflectionName in this.relationships) {
922
+ return this.relationships[reflectionName];
923
+ }
924
+ else if (reflectionName in this.relationshipsCache) {
925
+ return this.relationshipsCache[reflectionName];
926
+ }
927
+ if (this.isNewRecord())
928
+ return null;
929
+ const loadedRelationships = Object.keys(this.relationshipsCache);
930
+ const modelClassName = digg(this.modelClassData(), "name");
931
+ throw new NotLoadedError(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
932
+ }
933
+ /**
934
+ * @template {typeof import("./base-model.js").default} AssocMC
935
+ * @param {import("./collection.js").CollectionArgsType<AssocMC>} args
936
+ * @param {import("./collection.js").QueryArgsType} queryArgs
937
+ * @returns {Promise<Array<InstanceType<AssocMC>>>}
938
+ */
939
+ async _loadHasManyReflection(args, queryArgs = {}) {
940
+ if (args.reflectionName in this.relationships) {
941
+ return this.relationships[args.reflectionName];
942
+ }
943
+ else if (args.reflectionName in this.relationshipsCache) {
944
+ return this.relationshipsCache[args.reflectionName];
945
+ }
946
+ const collection = new Collection(args, queryArgs);
947
+ const models = await collection.toArray();
948
+ this.relationshipsCache[args.reflectionName] = models;
949
+ return models;
950
+ }
951
+ /**
952
+ * @template {typeof import("./base-model.js").default} AssocMC
953
+ * @param {import("./collection.js").CollectionArgsType<AssocMC>} args
954
+ * @param {import("./collection.js").QueryArgsType} queryArgs
955
+ * @returns {Promise<InstanceType<AssocMC>>}
956
+ */
957
+ async _loadHasOneReflection(args, queryArgs = {}) {
958
+ if (args.reflectionName in this.relationships) {
959
+ return this.relationships[args.reflectionName];
960
+ }
961
+ else if (args.reflectionName in this.relationshipsCache) {
962
+ return this.relationshipsCache[args.reflectionName];
963
+ }
964
+ else {
965
+ const collection = new Collection(args, queryArgs);
966
+ const model = await collection.first();
967
+ this.relationshipsCache[args.reflectionName] = model;
968
+ return model;
969
+ }
970
+ }
971
+ _readHasOneReflection({ reflectionName }) {
972
+ if (reflectionName in this.relationships) {
973
+ return this.relationships[reflectionName];
974
+ }
975
+ else if (reflectionName in this.relationshipsCache) {
976
+ return this.relationshipsCache[reflectionName];
977
+ }
978
+ if (this.isNewRecord()) {
979
+ return null;
980
+ }
981
+ const loadedRelationships = Object.keys(this.relationshipsCache);
982
+ const modelClassName = digg(this.modelClassData(), "name");
983
+ throw new NotLoadedError(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
984
+ }
985
+ _readModelDataFromArgs(args) {
986
+ this.abilities = args.data.b || {};
987
+ this.collection = args.collection;
988
+ this.modelData = objectToUnderscore(args.data.a);
989
+ this.preloadedRelationships = args.data.r;
990
+ }
991
+ _readPreloadedRelationships(preloaded) {
992
+ if (!this.preloadedRelationships) {
993
+ return;
994
+ }
995
+ const relationships = digg(this.modelClassData(), "relationships");
996
+ for (const relationshipName in this.preloadedRelationships) {
997
+ const relationshipData = this.preloadedRelationships[relationshipName];
998
+ const relationshipClassData = relationships.find((relationship) => digg(relationship, "name") == relationshipName);
999
+ if (!relationshipClassData) {
1000
+ const modelName = digg(this.modelClassData(), "name");
1001
+ const relationshipsList = relationships.map((relationship) => relationship.name).join(", ");
1002
+ throw new Error(`Could not find the relation ${relationshipName} on the ${modelName} model: ${relationshipsList}`);
1003
+ }
1004
+ const relationshipType = digg(relationshipClassData, "collectionName");
1005
+ if (relationshipName in this.relationshipsCache) {
1006
+ throw new Error(`${relationshipName} has already been loaded`);
1007
+ }
1008
+ if (!relationshipClassData) {
1009
+ throw new Error(`No relationship on ${digg(this.modelClassData(), "name")} by that name: ${relationshipName}`);
1010
+ }
1011
+ if (!relationshipData) {
1012
+ this.relationshipsCache[relationshipName] = null;
1013
+ this.relationships[relationshipName] = null;
1014
+ }
1015
+ else if (Array.isArray(relationshipData)) {
1016
+ this.relationshipsCache[relationshipName] = [];
1017
+ this.relationships[relationshipName] = [];
1018
+ for (const relationshipId of relationshipData) {
1019
+ const model = preloaded.getModel(relationshipType, relationshipId);
1020
+ this.relationshipsCache[relationshipName].push(model);
1021
+ this.relationships[relationshipName].push(model);
1022
+ }
1023
+ }
1024
+ else {
1025
+ const model = preloaded.getModel(relationshipType, relationshipData);
1026
+ this.relationshipsCache[relationshipName] = model;
1027
+ this.relationships[relationshipName] = model;
1028
+ }
1029
+ }
1030
+ }
1031
+ /**
1032
+ * @returns {number|string}
1033
+ */
1034
+ primaryKey() { return this.readAttributeUnderscore(this.modelClass().primaryKey()); }
827
1035
  }
828
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBdHRyaWJ1dGUiLCJBdHRyaWJ1dGVOb3RMb2FkZWRFcnJvciIsIkNhY2hlS2V5R2VuZXJhdG9yIiwiQ29sbGVjdGlvbiIsIkNvbW1hbmRzUG9vbCIsIkNvbmZpZyIsIkN1c3RvbUVycm9yIiwiZGlnZyIsIkZvcm1EYXRhT2JqZWN0aXplciIsImluZmxlY3Rpb24iLCJNb2RlbE5hbWUiLCJOb3RMb2FkZWRFcnJvciIsIm9iamVjdFRvRm9ybURhdGEiLCJSZWZsZWN0aW9uIiwiU2NvcGUiLCJTZXJ2aWNlcyIsIlZhbGlkYXRpb25FcnJvciIsIlZhbGlkYXRpb25FcnJvcnMiLCJvYmplY3RUb1VuZGVyc2NvcmUiLCJvYmplY3QiLCJuZXdPYmplY3QiLCJrZXkiLCJ1bmRlcnNjb3JlS2V5IiwidW5kZXJzY29yZSIsIkJhc2VNb2RlbCIsImFwaU1ha2VyVHlwZSIsImF0dHJpYnV0ZXMiLCJtb2RlbENsYXNzRGF0YSIsInJlc3VsdCIsImF0dHJpYnV0ZUtleSIsImF0dHJpYnV0ZURhdGEiLCJhdHRyaWJ1dGUiLCJwdXNoIiwiaGFzQXR0cmlidXRlIiwiYXR0cmlidXRlTmFtZSIsImxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWUiLCJFcnJvciIsIm5ld0N1c3RvbUV2ZW50IiwidmFsaWRhdGlvbkVycm9ycyIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwic2VuZFZhbGlkYXRpb25FcnJvcnNFdmVudCIsIm9wdGlvbnMiLCJmb3JtIiwiZXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiZmluZCIsImlkIiwicXVlcnkiLCJwcmltYXJ5S2V5IiwibW9kZWwiLCJyYW5zYWNrIiwiZmlyc3QiLCJmaW5kT3JDcmVhdGVCeSIsImZpbmRPckNyZWF0ZUJ5QXJncyIsImFyZ3MiLCJjdXJyZW50Iiwic2VuZFJlcXVlc3QiLCJhZGRpdGlvbmFsX2RhdGEiLCJhZGRpdGlvbmFsRGF0YSIsImZpbmRfb3JfY3JlYXRlX2J5X2FyZ3MiLCJyZXNvdXJjZV9uYW1lIiwibW9kZWxOYW1lIiwibW9kZWxDbGFzcyIsInNlbGVjdCIsInJhbnNhY2thYmxlQXNzb2NpYXRpb25zIiwicmVsYXRpb25zaGlwcyIsInJlZmxlY3Rpb25zIiwicmVsYXRpb25zaGlwRGF0YSIsInJhbnNhY2thYmxlQXR0cmlidXRlcyIsInJhbnNhY2thYmxlU2NvcGVzIiwic2NvcGVEYXRhIiwic2NvcGUiLCJyZWZsZWN0aW9uIiwibmFtZSIsImZvdW5kUmVmbGVjdGlvbiIsIm1hcCIsImpvaW4iLCJfdG9rZW4iLCJjc3JmVG9rZW5FbGVtZW50IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiZ2V0QXR0cmlidXRlIiwiY29uc3RydWN0b3IiLCJjaGFuZ2VzIiwibmV3UmVjb3JkIiwiaXNOZXdSZWNvcmQiLCJyZWxhdGlvbnNoaXBzQ2FjaGUiLCJkYXRhIiwiYSIsIl9yZWFkTW9kZWxEYXRhRnJvbUFyZ3MiLCJhYmlsaXRpZXMiLCJiIiwibW9kZWxEYXRhIiwiYXNzaWduQXR0cmlidXRlcyIsIm5ld0F0dHJpYnV0ZXMiLCJuZXdWYWx1ZSIsImF0dHJpYnV0ZVVuZGVyc2NvcmUiLCJhcHBseUNoYW5nZSIsImRlbGV0ZUNoYW5nZSIsImlzQXR0cmlidXRlTG9hZGVkIiwib2xkVmFsdWUiLCJyZWFkQXR0cmlidXRlIiwib3JpZ2luYWxWYWx1ZSIsImNhbiIsImdpdmVuQWJpbGl0eU5hbWUiLCJhYmlsaXR5TmFtZSIsImNsb25lIiwiY2FjaGVLZXkiLCJpc1BlcnNpc3RlZCIsImtleVBhcnRzIiwicGFyYW1LZXkiLCJ1cGRhdGVkQXQiLCJnZXRUaW1lIiwidW5pcXVlS2V5IiwibG9jYWxDYWNoZUtleSIsImNhY2hlS2V5R2VuZXJhdG9yIiwibG9jYWwiLCJmdWxsQ2FjaGVLZXkiLCJhbGwiLCJjcmVhdGUiLCJnZXRBdHRyaWJ1dGVzIiwiZGF0YVRvVXNlIiwicmVzcG9uc2UiLCJhZGRDb21tYW5kIiwic2F2ZSIsImNvbW1hbmQiLCJjb2xsZWN0aW9uTmFtZSIsInR5cGUiLCJlcnJvciIsInBhcnNlVmFsaWRhdGlvbkVycm9ycyIsIl9yZWZyZXNoTW9kZWxGcm9tUmVzcG9uc2UiLCJjcmVhdGVSYXciLCJyYXdEYXRhIiwib2JqZWN0RGF0YSIsIl9vYmplY3REYXRhRnJvbUdpdmVuUmF3RGF0YSIsIl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlIiwiZGVzdHJveSIsInF1ZXJ5X3BhcmFtcyIsImNvbGxlY3Rpb24iLCJwYXJhbXMiLCJzdWNjZXNzIiwiaGFuZGxlUmVzcG9uc2VFcnJvciIsImVuc3VyZUFiaWxpdGllcyIsImxpc3RPZkFiaWxpdGllcyIsImFiaWxpdGllc1RvTG9hZCIsImFiaWxpdHlJbkxpc3QiLCJsZW5ndGgiLCJwcmltYXJ5S2V5TmFtZSIsInJhbnNhY2tQYXJhbXMiLCJhYmlsaXRpZXNQYXJhbXMiLCJhbm90aGVyTW9kZWwiLCJuZXdBYmlsaXRpZXMiLCJuZXdBYmlsaXR5IiwiT2JqZWN0IiwiYXNzaWduIiwiaWRlbnRpZmllcktleSIsIl9pZGVudGlmaWVyS2V5IiwiaXNBc3NvY2lhdGlvbkxvYWRlZCIsImFzc29jaWF0aW9uTmFtZSIsImlzQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlIiwiYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSIsImlzQXNzb2NpYXRpb25QcmVzZW50IiwidmFsaWRhdGlvbl9lcnJvcnMiLCJ0aHJvd1ZhbGlkYXRpb25FcnJvciIsImh1bWFuQXR0cmlidXRlTmFtZSIsImtleU5hbWUiLCJpMThuIiwiZ2V0STE4biIsInQiLCJzbmFrZUNhc2UiLCJkZWZhdWx0VmFsdWUiLCJodW1hbml6ZSIsImlzQXR0cmlidXRlQ2hhbmdlZCIsImF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlIiwiYXR0cmlidXRlTmFtZXMiLCJjaGFuZ2VkTWV0aG9kIiwiY2FtZWxpemUiLCJpc0NoYW5nZWQiLCJrZXlzIiwidW5kZWZpbmVkIiwic3RyaW5nIiwic2F2ZWRDaGFuZ2VUb0F0dHJpYnV0ZSIsInByZXZpb3VzTW9kZWxEYXRhIiwiY2hhbmdlZE1ldGhvZE5hbWUiLCJzZXROZXdNb2RlbCIsInNldE5ld01vZGVsRGF0YSIsInJlbGF0aW9uc2hpcE5hbWUiLCJyZWxhdGlvbnNoaXBDYWNoZU5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwiX2lzRGF0ZUNoYW5nZWQiLCJEYXRlIiwicGFyc2UiLCJfaXNJbnRlZ2VyQ2hhbmdlZCIsInBhcnNlSW50IiwiX2lzU3RyaW5nQ2hhbmdlZCIsIm9sZENvbnZlcnRlZFZhbHVlIiwibmV3Q29udmVydGVkVmFsdWUiLCJyZWxvYWQiLCJwcmVsb2FkIiwicXVlcnlBcmdzIiwic2VsZWN0X2NvbHVtbnMiLCJzZWxlY3RDb2x1bW5zIiwidXBkYXRlIiwic2F2ZVJhdyIsInVwZGF0ZVJhdyIsIm5ld01vZGVsIiwiQXJyYXkiLCJpc0FycmF5IiwiRm9ybURhdGEiLCJub2RlTmFtZSIsImZvcm1EYXRhIiwiZm9ybURhdGFGcm9tT2JqZWN0IiwidG9PYmplY3QiLCJzaW1wbGVfbW9kZWxfZXJyb3JzIiwic2ltcGxlTW9kZWxFcnJvcnMiLCJpc1ZhbGlkIiwiaXNWYWxpZE9uU2VydmVyIiwidmFsaWQiLCJlcnJvcnMiLCJwcmVsb2FkUmVsYXRpb25zaGlwIiwibWFya0ZvckRlc3RydWN0aW9uIiwiX21hcmtlZEZvckRlc3RydWN0aW9uIiwibWFya2VkRm9yRGVzdHJ1Y3Rpb24iLCJ1bmlxdWVLZXlWYWx1ZSIsIm1pbiIsIm1heCIsInJhbmRvbUJldHdlZW4iLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJfY2FsbENvbGxlY3Rpb25Db21tYW5kIiwiY29tbWFuZEFyZ3MiLCJmb3JtT3JEYXRhT2JqZWN0IiwiX2NhbGxNZW1iZXJDb21tYW5kIiwiX3Bvc3REYXRhRnJvbUFyZ3MiLCJwb3N0RGF0YSIsInNlcmlhbGl6ZSIsInJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlIiwiX2lzUHJlc2VudCIsInZhbHVlIiwibWF0Y2giLCJfbG9hZEJlbG9uZ3NUb1JlZmxlY3Rpb24iLCJyZWZsZWN0aW9uTmFtZSIsIl9yZWFkQmVsb25nc1RvUmVmbGVjdGlvbiIsImxvYWRlZFJlbGF0aW9uc2hpcHMiLCJtb2RlbENsYXNzTmFtZSIsIl9sb2FkSGFzTWFueVJlZmxlY3Rpb24iLCJtb2RlbHMiLCJ0b0FycmF5IiwiX2xvYWRIYXNPbmVSZWZsZWN0aW9uIiwiX3JlYWRIYXNPbmVSZWZsZWN0aW9uIiwicHJlbG9hZGVkUmVsYXRpb25zaGlwcyIsInIiLCJfcmVhZFByZWxvYWRlZFJlbGF0aW9uc2hpcHMiLCJwcmVsb2FkZWQiLCJyZWxhdGlvbnNoaXBDbGFzc0RhdGEiLCJyZWxhdGlvbnNoaXAiLCJyZWxhdGlvbnNoaXBzTGlzdCIsInJlbGF0aW9uc2hpcFR5cGUiLCJyZWxhdGlvbnNoaXBJZCIsImdldE1vZGVsIl0sInNvdXJjZXMiOlsiLi4vc3JjL2Jhc2UtbW9kZWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEF0dHJpYnV0ZSBmcm9tIFwiLi9iYXNlLW1vZGVsL2F0dHJpYnV0ZVwiXG5pbXBvcnQgQXR0cmlidXRlTm90TG9hZGVkRXJyb3IgZnJvbSBcIi4vYXR0cmlidXRlLW5vdC1sb2FkZWQtZXJyb3JcIlxuaW1wb3J0IENhY2hlS2V5R2VuZXJhdG9yIGZyb20gXCIuL2NhY2hlLWtleS1nZW5lcmF0b3JcIlxuaW1wb3J0IENvbGxlY3Rpb24gZnJvbSBcIi4vY29sbGVjdGlvblwiXG5pbXBvcnQgQ29tbWFuZHNQb29sIGZyb20gXCIuL2NvbW1hbmRzLXBvb2xcIlxuaW1wb3J0IENvbmZpZyBmcm9tIFwiLi9jb25maWdcIlxuaW1wb3J0IEN1c3RvbUVycm9yIGZyb20gXCIuL2N1c3RvbS1lcnJvclwiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IEZvcm1EYXRhT2JqZWN0aXplciBmcm9tIFwiZm9ybS1kYXRhLW9iamVjdGl6ZXJcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTW9kZWxOYW1lIGZyb20gXCIuL21vZGVsLW5hbWVcIlxuaW1wb3J0IE5vdExvYWRlZEVycm9yIGZyb20gXCIuL25vdC1sb2FkZWQtZXJyb3JcIlxuaW1wb3J0IG9iamVjdFRvRm9ybURhdGEgZnJvbSBcIm9iamVjdC10by1mb3JtZGF0YVwiXG5pbXBvcnQgUmVmbGVjdGlvbiBmcm9tIFwiLi9iYXNlLW1vZGVsL3JlZmxlY3Rpb25cIlxuaW1wb3J0IFNjb3BlIGZyb20gXCIuL2Jhc2UtbW9kZWwvc2NvcGVcIlxuaW1wb3J0IFNlcnZpY2VzIGZyb20gXCIuL3NlcnZpY2VzXCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSBcIi4vdmFsaWRhdGlvbi1lcnJvclwiXG5pbXBvcnQge1ZhbGlkYXRpb25FcnJvcnN9IGZyb20gXCIuL3ZhbGlkYXRpb24tZXJyb3JzXCJcblxuY29uc3Qgb2JqZWN0VG9VbmRlcnNjb3JlID0gKG9iamVjdCkgPT4ge1xuICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIGNvbnN0IHVuZGVyc2NvcmVLZXkgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoa2V5KVxuXG4gICAgbmV3T2JqZWN0W3VuZGVyc2NvcmVLZXldID0gb2JqZWN0W2tleV1cbiAgfVxuXG4gIHJldHVybiBuZXdPYmplY3Rcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZU1vZGVsIHtcbiAgc3RhdGljIGFwaU1ha2VyVHlwZSA9IFwiQmFzZU1vZGVsXCJcblxuICBzdGF0aWMgYXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwiYXR0cmlidXRlc1wiKVxuICAgIGNvbnN0IHJlc3VsdCA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZUtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVEYXRhID0gYXR0cmlidXRlc1thdHRyaWJ1dGVLZXldXG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZURhdGEpXG5cbiAgICAgIHJlc3VsdC5wdXNoKGF0dHJpYnV0ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBzdGF0aWMgaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwiYXR0cmlidXRlc1wiKVxuICAgIGNvbnN0IGxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcblxuICAgIGlmIChsb3dlckNhc2VBdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHN0YXRpYyBtb2RlbENsYXNzRGF0YSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJtb2RlbENsYXNzRGF0YSBzaG91bGQgYmUgb3ZlcnJpZGVuIGJ5IGNoaWxkXCIpXG4gIH1cblxuICBzdGF0aWMgbmV3Q3VzdG9tRXZlbnQgPSAodmFsaWRhdGlvbkVycm9ycykgPT4ge1xuICAgIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQoXCJ2YWxpZGF0aW9uLWVycm9yc1wiLCB7ZGV0YWlsOiB2YWxpZGF0aW9uRXJyb3JzfSlcbiAgfVxuXG4gIHN0YXRpYyBzZW5kVmFsaWRhdGlvbkVycm9yc0V2ZW50ID0gKHZhbGlkYXRpb25FcnJvcnMsIG9wdGlvbnMpID0+IHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZvcm0pIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gQmFzZU1vZGVsLm5ld0N1c3RvbUV2ZW50KHZhbGlkYXRpb25FcnJvcnMpXG4gICAgICBvcHRpb25zLmZvcm0uZGlzcGF0Y2hFdmVudChldmVudClcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZmluZChpZCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0ge31cblxuICAgIHF1ZXJ5W2Ake3RoaXMucHJpbWFyeUtleSgpfV9lcWBdID0gaWRcblxuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5yYW5zYWNrKHF1ZXJ5KS5maXJzdCgpXG5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIHJldHVybiBtb2RlbFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQ3VzdG9tRXJyb3IoXCJSZWNvcmQgbm90IGZvdW5kXCIpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGZpbmRPckNyZWF0ZUJ5KGZpbmRPckNyZWF0ZUJ5QXJncywgYXJncyA9IHt9KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgU2VydmljZXMuY3VycmVudCgpLnNlbmRSZXF1ZXN0KFwiTW9kZWxzOjpGaW5kT3JDcmVhdGVCeVwiLCB7XG4gICAgICBhZGRpdGlvbmFsX2RhdGE6IGFyZ3MuYWRkaXRpb25hbERhdGEsXG4gICAgICBmaW5kX29yX2NyZWF0ZV9ieV9hcmdzOiBmaW5kT3JDcmVhdGVCeUFyZ3MsXG4gICAgICByZXNvdXJjZV9uYW1lOiBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG4gICAgfSlcbiAgICBjb25zdCBtb2RlbCA9IGRpZ2cocmVzdWx0LCBcIm1vZGVsXCIpXG5cbiAgICByZXR1cm4gbW9kZWxcbiAgfVxuXG4gIHN0YXRpYyBtb2RlbE5hbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbE5hbWUoe21vZGVsQ2xhc3NEYXRhOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCl9KVxuICB9XG5cbiAgc3RhdGljIHByaW1hcnlLZXkoKSB7XG4gICAgcmV0dXJuIGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInByaW1hcnlLZXlcIilcbiAgfVxuXG4gIHN0YXRpYyByYW5zYWNrKHF1ZXJ5ID0ge30pIHtcbiAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24oe21vZGVsQ2xhc3M6IHRoaXN9LCB7cmFuc2FjazogcXVlcnl9KVxuICB9XG5cbiAgc3RhdGljIHNlbGVjdChzZWxlY3QpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5zYWNrKCkuc2VsZWN0KHNlbGVjdClcbiAgfVxuXG4gIHN0YXRpYyByYW5zYWNrYWJsZUFzc29jaWF0aW9ucygpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmFuc2Fja2FibGVfYXNzb2NpYXRpb25zXCIpXG4gICAgY29uc3QgcmVmbGVjdGlvbnMgPSBbXVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBEYXRhIG9mIHJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJlZmxlY3Rpb25zLnB1c2gobmV3IFJlZmxlY3Rpb24ocmVsYXRpb25zaGlwRGF0YSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmxlY3Rpb25zXG4gIH1cblxuICBzdGF0aWMgcmFuc2Fja2FibGVBdHRyaWJ1dGVzKCkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyYW5zYWNrYWJsZV9hdHRyaWJ1dGVzXCIpXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlRGF0YSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICByZXN1bHQucHVzaChuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZURhdGEpKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHN0YXRpYyByYW5zYWNrYWJsZVNjb3BlcygpIHtcbiAgICBjb25zdCByYW5zYWNrYWJsZVNjb3BlcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJhbnNhY2thYmxlX3Njb3Blc1wiKVxuICAgIGNvbnN0IHJlc3VsdCA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHNjb3BlRGF0YSBvZiByYW5zYWNrYWJsZVNjb3Blcykge1xuICAgICAgY29uc3Qgc2NvcGUgPSBuZXcgU2NvcGUoc2NvcGVEYXRhKVxuXG4gICAgICByZXN1bHQucHVzaChzY29wZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBzdGF0aWMgcmVmbGVjdGlvbnMoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJlbGF0aW9uc2hpcHNcIilcbiAgICBjb25zdCByZWZsZWN0aW9ucyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcERhdGEgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVmbGVjdGlvbiA9IG5ldyBSZWZsZWN0aW9uKHJlbGF0aW9uc2hpcERhdGEpXG5cbiAgICAgIHJlZmxlY3Rpb25zLnB1c2gocmVmbGVjdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmbGVjdGlvbnNcbiAgfVxuXG4gIHN0YXRpYyByZWZsZWN0aW9uKG5hbWUpIHtcbiAgICBjb25zdCBmb3VuZFJlZmxlY3Rpb24gPSB0aGlzLnJlZmxlY3Rpb25zKCkuZmluZCgocmVmbGVjdGlvbikgPT4gcmVmbGVjdGlvbi5uYW1lKCkgPT0gbmFtZSlcblxuICAgIGlmICghZm91bmRSZWZsZWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggcmVmbGVjdGlvbjogJHtuYW1lfSBpbiAke3RoaXMucmVmbGVjdGlvbnMoKS5tYXAoKHJlZmxlY3Rpb24pID0+IHJlZmxlY3Rpb24ubmFtZSgpKS5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmRSZWZsZWN0aW9uXG4gIH1cblxuICBzdGF0aWMgX3Rva2VuKCkge1xuICAgIGNvbnN0IGNzcmZUb2tlbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcblxuICAgIGlmIChjc3JmVG9rZW5FbGVtZW50KSB7XG4gICAgICByZXR1cm4gY3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoYXJncyA9IHt9KSB7XG4gICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB0aGlzLm5ld1JlY29yZCA9IGFyZ3MuaXNOZXdSZWNvcmRcbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSA9IHt9XG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzID0ge31cblxuICAgIGlmIChhcmdzICYmIGFyZ3MuZGF0YSAmJiBhcmdzLmRhdGEuYSkge1xuICAgICAgdGhpcy5fcmVhZE1vZGVsRGF0YUZyb21BcmdzKGFyZ3MpXG4gICAgfSBlbHNlIGlmIChhcmdzLmEpIHtcbiAgICAgIHRoaXMuYWJpbGl0aWVzID0gYXJncy5iIHx8IHt9XG4gICAgICB0aGlzLm1vZGVsRGF0YSA9IG9iamVjdFRvVW5kZXJzY29yZShhcmdzLmEpXG4gICAgfSBlbHNlIGlmIChhcmdzKSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IHt9XG4gICAgICB0aGlzLm1vZGVsRGF0YSA9IG9iamVjdFRvVW5kZXJzY29yZShhcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IHt9XG4gICAgICB0aGlzLm1vZGVsRGF0YSA9IHt9XG4gICAgfVxuICB9XG5cbiAgYXNzaWduQXR0cmlidXRlcyhuZXdBdHRyaWJ1dGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV3QXR0cmlidXRlcykge1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBuZXdBdHRyaWJ1dGVzW2tleV1cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoa2V5KVxuXG4gICAgICBsZXQgYXBwbHlDaGFuZ2UgPSB0cnVlXG4gICAgICBsZXQgZGVsZXRlQ2hhbmdlID0gZmFsc2VcblxuICAgICAgaWYgKHRoaXMuaXNBdHRyaWJ1dGVMb2FkZWQoa2V5KSkge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMucmVhZEF0dHJpYnV0ZShrZXkpXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVVbmRlcnNjb3JlXVxuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PSBvbGRWYWx1ZSkge1xuICAgICAgICAgIGFwcGx5Q2hhbmdlID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIGlmIChuZXdWYWx1ZSA9PSBvcmlnaW5hbFZhbHVlKSB7XG4gICAgICAgICAgYXBwbHlDaGFuZ2UgPSBmYWxzZVxuICAgICAgICAgIGRlbGV0ZUNoYW5nZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYXBwbHlDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VzW2F0dHJpYnV0ZVVuZGVyc2NvcmVdID0gbmV3VmFsdWVcbiAgICAgIH0gZWxzZSBpZiAoZGVsZXRlQ2hhbmdlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNoYW5nZXNbYXR0cmlidXRlVW5kZXJzY29yZV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhdHRyaWJ1dGVzKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLm1vZGVsRGF0YSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLm1vZGVsRGF0YVtrZXldXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5jaGFuZ2VzKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHRoaXMuY2hhbmdlc1trZXldXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY2FuKGdpdmVuQWJpbGl0eU5hbWUpIHtcbiAgICBjb25zdCBhYmlsaXR5TmFtZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShnaXZlbkFiaWxpdHlOYW1lKVxuXG4gICAgaWYgKCEoYWJpbGl0eU5hbWUgaW4gdGhpcy5hYmlsaXRpZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFiaWxpdHkgJHthYmlsaXR5TmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIGZvciAke2RpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIil9YClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hYmlsaXRpZXNbYWJpbGl0eU5hbWVdXG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICBjb25zdCBjbG9uZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKClcblxuICAgIGNsb25lLmFiaWxpdGllcyA9IHsuLi50aGlzLmFiaWxpdGllc31cbiAgICBjbG9uZS5tb2RlbERhdGEgPSB7Li4udGhpcy5tb2RlbERhdGF9XG4gICAgY2xvbmUucmVsYXRpb25zaGlwcyA9IHsuLi50aGlzLnJlbGF0aW9uc2hpcHN9XG4gICAgY2xvbmUucmVsYXRpb25zaGlwc0NhY2hlID0gey4uLnRoaXMucmVsYXRpb25zaGlwc0NhY2hlfVxuXG4gICAgcmV0dXJuIGNsb25lXG4gIH1cblxuICBjYWNoZUtleSgpIHtcbiAgICBpZiAodGhpcy5pc1BlcnNpc3RlZCgpKSB7XG4gICAgICBjb25zdCBrZXlQYXJ0cyA9IFtcbiAgICAgICAgdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5LFxuICAgICAgICB0aGlzLnByaW1hcnlLZXkoKVxuICAgICAgXVxuXG4gICAgICBpZiAoXCJ1cGRhdGVkX2F0XCIgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZEF0ID0gdGhpcy51cGRhdGVkQXQoKVxuXG4gICAgICAgIGlmICh0eXBlb2YgdXBkYXRlZEF0ICE9IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwZGF0ZWRBdCB3YXNuJ3QgYW4gb2JqZWN0OiAke3R5cGVvZiB1cGRhdGVkQXR9YClcbiAgICAgICAgfSBlbHNlIGlmICghKFwiZ2V0VGltZVwiIGluIHVwZGF0ZWRBdCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwZGF0ZWRBdCBkaWRuJ3Qgc3VwcG9ydCBnZXRUaW1lIHdpdGggY2xhc3M6ICR7dXBkYXRlZEF0LmNvbnN0cnVjdG9yICYmIHVwZGF0ZWRBdC5jb25zdHJ1Y3Rvci5uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBrZXlQYXJ0cy5wdXNoKGB1cGRhdGVkQXQtJHt0aGlzLnVwZGF0ZWRBdCgpLmdldFRpbWUoKX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5UGFydHMuam9pbihcIi1cIilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudW5pcXVlS2V5KClcbiAgICB9XG4gIH1cblxuICBsb2NhbENhY2hlS2V5KCkge1xuICAgIGNvbnN0IGNhY2hlS2V5R2VuZXJhdG9yID0gbmV3IENhY2hlS2V5R2VuZXJhdG9yKHRoaXMpXG5cbiAgICByZXR1cm4gY2FjaGVLZXlHZW5lcmF0b3IubG9jYWwoKVxuICB9XG5cbiAgZnVsbENhY2hlS2V5KCkge1xuICAgIGNvbnN0IGNhY2hlS2V5R2VuZXJhdG9yID0gbmV3IENhY2hlS2V5R2VuZXJhdG9yKHRoaXMpXG5cbiAgICByZXR1cm4gY2FjaGVLZXlHZW5lcmF0b3IuY2FjaGVLZXkoKVxuICB9XG5cbiAgc3RhdGljIGFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5zYWNrKClcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShhdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG4gICAgaWYgKGF0dHJpYnV0ZXMpIHRoaXMuYXNzaWduQXR0cmlidXRlcyhhdHRyaWJ1dGVzKVxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgbW9kZWxEYXRhID0gdGhpcy5nZXRBdHRyaWJ1dGVzKClcbiAgICBjb25zdCBkYXRhVG9Vc2UgPSB7fVxuICAgIGRhdGFUb1VzZVtwYXJhbUtleV0gPSBtb2RlbERhdGFcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LWNyZWF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcImNyZWF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVJhdyhyYXdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBvYmplY3REYXRhID0gQmFzZU1vZGVsLl9vYmplY3REYXRhRnJvbUdpdmVuUmF3RGF0YShyYXdEYXRhLCBvcHRpb25zKVxuXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgIHtcbiAgICAgICAgYXJnczoge3F1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKX0sXG4gICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tZGVzdHJveWAsXG4gICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICB0eXBlOiBcImRlc3Ryb3lcIlxuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKVxuXG4gICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgICB0aGlzLl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlc3BvbnNlKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGVuc3VyZUFiaWxpdGllcyhsaXN0T2ZBYmlsaXRpZXMpIHtcbiAgICAvLyBQb3B1bGF0ZSBhbiBhcnJheSB3aXRoIGEgbGlzdCBvZiBhYmlsaXRpZXMgY3VycmVudGx5IG5vdCBsb2FkZWRcbiAgICBjb25zdCBhYmlsaXRpZXNUb0xvYWQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhYmlsaXR5SW5MaXN0IG9mIGxpc3RPZkFiaWxpdGllcykge1xuICAgICAgaWYgKCEoYWJpbGl0eUluTGlzdCBpbiB0aGlzLmFiaWxpdGllcykpIHtcbiAgICAgICAgYWJpbGl0aWVzVG9Mb2FkLnB1c2goYWJpbGl0eUluTGlzdClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2FkIHRoZSBtaXNzaW5nIGFiaWxpdGllcyBpZiBhbnlcbiAgICBpZiAoYWJpbGl0aWVzVG9Mb2FkLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHByaW1hcnlLZXlOYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5wcmltYXJ5S2V5KClcbiAgICAgIGNvbnN0IHJhbnNhY2tQYXJhbXMgPSB7fVxuICAgICAgcmFuc2Fja1BhcmFtc1tgJHtwcmltYXJ5S2V5TmFtZX1fZXFgXSA9IHRoaXMucHJpbWFyeUtleSgpXG5cbiAgICAgIGNvbnN0IGFiaWxpdGllc1BhcmFtcyA9IHt9XG4gICAgICBhYmlsaXRpZXNQYXJhbXNbZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKV0gPSBhYmlsaXRpZXNUb0xvYWRcblxuICAgICAgY29uc3QgYW5vdGhlck1vZGVsID0gYXdhaXQgdGhpcy5jb25zdHJ1Y3RvclxuICAgICAgICAucmFuc2FjayhyYW5zYWNrUGFyYW1zKVxuICAgICAgICAuYWJpbGl0aWVzKGFiaWxpdGllc1BhcmFtcylcbiAgICAgICAgLmZpcnN0KClcblxuICAgICAgaWYgKCFhbm90aGVyTW9kZWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9vayB1cCB0aGUgc2FtZSBtb2RlbCAke3RoaXMucHJpbWFyeUtleSgpfSB3aXRoIGFiaWxpdGllczogJHthYmlsaXRpZXNUb0xvYWQuam9pbihcIiwgXCIpfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0FiaWxpdGllcyA9IGFub3RoZXJNb2RlbC5hYmlsaXRpZXNcbiAgICAgIGZvciAoY29uc3QgbmV3QWJpbGl0eSBpbiBuZXdBYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy5hYmlsaXRpZXNbbmV3QWJpbGl0eV0gPSBuZXdBYmlsaXRpZXNbbmV3QWJpbGl0eV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRBdHRyaWJ1dGVzID0gKCkgPT4gT2JqZWN0LmFzc2lnbih0aGlzLm1vZGVsRGF0YSwgdGhpcy5jaGFuZ2VzKVxuXG4gIGhhbmRsZVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpIHtcbiAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHttb2RlbDogdGhpcywgcmVzcG9uc2V9KVxuICAgIHRocm93IG5ldyBuZXcgQ3VzdG9tRXJyb3IoXCJSZXNwb25zZSB3YXNuJ3Qgc3VjY2Vzc2Z1bFwiLCB7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfSlcbiAgfVxuXG4gIGlkZW50aWZpZXJLZXkoKSB7XG4gICAgaWYgKCF0aGlzLl9pZGVudGlmaWVyS2V5KSB0aGlzLl9pZGVudGlmaWVyS2V5ID0gdGhpcy5pc1BlcnNpc3RlZCgpID8gdGhpcy5wcmltYXJ5S2V5KCkgOiB0aGlzLnVuaXF1ZUtleSgpXG5cbiAgICByZXR1cm4gdGhpcy5faWRlbnRpZmllcktleVxuICB9XG5cbiAgaXNBc3NvY2lhdGlvbkxvYWRlZCA9IChhc3NvY2lhdGlvbk5hbWUpID0+IHRoaXMuaXNBc3NvY2lhdGlvbkxvYWRlZFVuZGVyc2NvcmUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGFzc29jaWF0aW9uTmFtZSkpXG4gIGlzQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlIChhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlKSB7XG4gICAgaWYgKGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpc0Fzc29jaWF0aW9uUHJlc2VudChhc3NvY2lhdGlvbk5hbWUpIHtcbiAgICBpZiAodGhpcy5pc0Fzc29jaWF0aW9uTG9hZGVkKGFzc29jaWF0aW9uTmFtZSkpIHJldHVybiB0cnVlXG4gICAgaWYgKGFzc29jaWF0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBzdGF0aWMgcGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWwsIG9wdGlvbnN9KSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSByZXR1cm5cbiAgICBpZiAoIWVycm9yLmFyZ3MucmVzcG9uc2UudmFsaWRhdGlvbl9lcnJvcnMpIHJldHVyblxuXG4gICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IG5ldyBWYWxpZGF0aW9uRXJyb3JzKHtcbiAgICAgIG1vZGVsLFxuICAgICAgdmFsaWRhdGlvbkVycm9yczogZGlnZyhlcnJvciwgXCJhcmdzXCIsIFwicmVzcG9uc2VcIiwgXCJ2YWxpZGF0aW9uX2Vycm9yc1wiKVxuICAgIH0pXG5cbiAgICBCYXNlTW9kZWwuc2VuZFZhbGlkYXRpb25FcnJvcnNFdmVudCh2YWxpZGF0aW9uRXJyb3JzLCBvcHRpb25zKVxuXG4gICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudGhyb3dWYWxpZGF0aW9uRXJyb3IgIT0gZmFsc2UpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGh1bWFuQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3Qga2V5TmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcImkxOG5LZXlcIilcbiAgICBjb25zdCBpMThuID0gQ29uZmlnLmdldEkxOG4oKVxuXG4gICAgaWYgKGkxOG4pIHJldHVybiBpMThuLnQoYGFjdGl2ZXJlY29yZC5hdHRyaWJ1dGVzLiR7a2V5TmFtZX0uJHtCYXNlTW9kZWwuc25ha2VDYXNlKGF0dHJpYnV0ZU5hbWUpfWAsIHtkZWZhdWx0VmFsdWU6IGF0dHJpYnV0ZU5hbWV9KVxuXG4gICAgcmV0dXJuIGluZmxlY3Rpb24uaHVtYW5pemUoYXR0cmlidXRlTmFtZSlcbiAgfVxuXG4gIGlzQXR0cmlidXRlQ2hhbmdlZChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBhdHRyaWJ1dGVEYXRhID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBkaWdnKGF0dHJpYnV0ZSwgXCJuYW1lXCIpID09IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlKVxuXG4gICAgaWYgKCFhdHRyaWJ1dGVEYXRhKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBkaWdnKGF0dHJpYnV0ZSwgXCJuYW1lXCIpKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZTogXCIke2F0dHJpYnV0ZU5hbWV9XCIgaW46ICR7YXR0cmlidXRlTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKCEoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5jaGFuZ2VzKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kID0gdGhpc1tgX2lzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZURhdGEudHlwZSwgdHJ1ZSl9Q2hhbmdlZGBdXG5cbiAgICBpZiAoIWNoYW5nZWRNZXRob2QpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0eXBlOiAke2F0dHJpYnV0ZURhdGEudHlwZX1gKVxuXG4gICAgcmV0dXJuIGNoYW5nZWRNZXRob2Qob2xkVmFsdWUsIG5ld1ZhbHVlKVxuICB9XG5cbiAgaXNDaGFuZ2VkKCkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpXG5cbiAgICBpZiAoa2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBpc05ld1JlY29yZCgpIHtcbiAgICBpZiAodGhpcy5uZXdSZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMubmV3UmVjb3JkXG4gICAgfSBlbHNlIGlmIChcImlkXCIgaW4gdGhpcy5tb2RlbERhdGEgJiYgdGhpcy5tb2RlbERhdGEuaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGlzUGVyc2lzdGVkID0gKCkgPT4gIXRoaXMuaXNOZXdSZWNvcmQoKVxuXG4gIHN0YXRpYyBzbmFrZUNhc2UgPSAoc3RyaW5nKSA9PiBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoc3RyaW5nKVxuXG4gIHNhdmVkQ2hhbmdlVG9BdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkge1xuICAgIGlmICghdGhpcy5wcmV2aW91c01vZGVsRGF0YSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBhdHRyaWJ1dGVEYXRhID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSA9PSBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSlcblxuICAgIGlmICghYXR0cmlidXRlRGF0YSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZTogXCIke2F0dHJpYnV0ZU5hbWV9XCIgaW46ICR7YXR0cmlidXRlTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKCEoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5wcmV2aW91c01vZGVsRGF0YSkpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnByZXZpb3VzTW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlXVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5tb2RlbERhdGFbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgY2hhbmdlZE1ldGhvZE5hbWUgPSBgX2lzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZURhdGEudHlwZSl9Q2hhbmdlZGBcbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kID0gdGhpc1tjaGFuZ2VkTWV0aG9kTmFtZV1cblxuICAgIGlmICghY2hhbmdlZE1ldGhvZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHR5cGU6ICR7YXR0cmlidXRlRGF0YS50eXBlfWApXG5cbiAgICByZXR1cm4gY2hhbmdlZE1ldGhvZChvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gIH1cblxuICBzZXROZXdNb2RlbChtb2RlbCkge1xuICAgIHRoaXMuc2V0TmV3TW9kZWxEYXRhKG1vZGVsKVxuXG4gICAgZm9yKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gbW9kZWwucmVsYXRpb25zaGlwcykge1xuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWwucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuICAgIH1cblxuICAgIGZvcihjb25zdCByZWxhdGlvbnNoaXBDYWNoZU5hbWUgaW4gbW9kZWwucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBDYWNoZU5hbWVdID0gbW9kZWwucmVsYXRpb25zaGlwc0NhY2hlW25hbWVdXG4gICAgfVxuICB9XG5cbiAgc2V0TmV3TW9kZWxEYXRhKG1vZGVsKSB7XG4gICAgaWYgKCEoXCJtb2RlbERhdGFcIiBpbiBtb2RlbCkpIHRocm93IG5ldyBFcnJvcihgTm8gbW9kZWxEYXRhIGluIG1vZGVsOiAke0pTT04uc3RyaW5naWZ5KG1vZGVsKX1gKVxuXG4gICAgdGhpcy5wcmV2aW91c01vZGVsRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRpZ2codGhpcywgXCJtb2RlbERhdGFcIikpXG5cbiAgICBmb3IoY29uc3QgYXR0cmlidXRlTmFtZSBpbiBtb2RlbC5tb2RlbERhdGEpIHtcbiAgICAgIHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdID0gbW9kZWwubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdXG4gICAgfVxuICB9XG5cbiAgX2lzRGF0ZUNoYW5nZWQob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgaWYgKERhdGUucGFyc2Uob2xkVmFsdWUpICE9IERhdGUucGFyc2UobmV3VmFsdWUpKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIF9pc0ludGVnZXJDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgIGlmIChwYXJzZUludChvbGRWYWx1ZSwgMTApICE9IHBhcnNlSW50KG5ld1ZhbHVlLCAxMCkpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX2lzU3RyaW5nQ2hhbmdlZCAob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgY29uc3Qgb2xkQ29udmVydGVkVmFsdWUgPSBgJHtvbGRWYWx1ZX1gXG4gICAgY29uc3QgbmV3Q29udmVydGVkVmFsdWUgPSBgJHtuZXdWYWx1ZX1gXG5cbiAgICBpZiAob2xkQ29udmVydGVkVmFsdWUgIT0gbmV3Q29udmVydGVkVmFsdWUpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgbW9kZWxDbGFzc0RhdGEgPSAoKSA9PiB0aGlzLmNvbnN0cnVjdG9yLm1vZGVsQ2xhc3NEYXRhKClcblxuICBhc3luYyByZWxvYWQoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKVxuICAgIGNvbnN0IHJhbnNhY2tQYXJhbXMgPSB7fVxuICAgIHJhbnNhY2tQYXJhbXNbYCR7dGhpcy5jb25zdHJ1Y3Rvci5wcmltYXJ5S2V5KCl9X2VxYF0gPSB0aGlzLnByaW1hcnlLZXkoKVxuXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5jb25zdHJ1Y3Rvci5yYW5zYWNrKHJhbnNhY2tQYXJhbXMpXG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBpZiAocGFyYW1zLnByZWxvYWQpIHtcbiAgICAgICAgcXVlcnkucXVlcnlBcmdzLnByZWxvYWQgPSBwYXJhbXMucHJlbG9hZFxuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNlbGVjdCkge1xuICAgICAgICBxdWVyeS5xdWVyeUFyZ3Muc2VsZWN0ID0gcGFyYW1zLnNlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNlbGVjdF9jb2x1bW5zKSB7XG4gICAgICAgIHF1ZXJ5LnF1ZXJ5QXJncy5zZWxlY3RDb2x1bW5zID0gcGFyYW1zLnNlbGVjdF9jb2x1bW5zXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCBxdWVyeS5maXJzdCgpXG4gICAgdGhpcy5zZXROZXdNb2RlbChtb2RlbClcbiAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICB9XG5cbiAgc2F2ZSgpIHtcbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGUoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIHNhdmVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVJhdyhyYXdEYXRhLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShuZXdBdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG4gICAgaWYgKG5ld0F0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuYXNzaWduQXR0cmlidXRlcyhuZXdBdHRyaWJ1dGVzKVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4ge21vZGVsOiB0aGlzfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgbW9kZWxEYXRhID0gdGhpcy5jaGFuZ2VzXG4gICAgY29uc3QgZGF0YVRvVXNlID0ge31cbiAgICBkYXRhVG9Vc2VbcGFyYW1LZXldID0gbW9kZWxEYXRhXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHF1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKSxcbiAgICAgICAgICAgIHNhdmU6IGRhdGFUb1VzZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS11cGRhdGVgLFxuICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIlxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWw6IHRoaXMsIG9wdGlvbnN9KVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hNb2RlbEZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtyZXNwb25zZSwgbW9kZWw6IHRoaXN9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICBfcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgbGV0IG5ld01vZGVsID0gZGlnZyhyZXNwb25zZSwgXCJtb2RlbFwiKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3TW9kZWwpKSBuZXdNb2RlbCA9IG5ld01vZGVsWzBdXG5cbiAgICB0aGlzLnNldE5ld01vZGVsKG5ld01vZGVsKVxuICB9XG5cbiAgX3JlZnJlc2hNb2RlbERhdGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBsZXQgbmV3TW9kZWwgPSBkaWdnKHJlc3BvbnNlLCBcIm1vZGVsXCIpXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdNb2RlbCkpIG5ld01vZGVsID0gbmV3TW9kZWxbMF1cblxuICAgIHRoaXMuc2V0TmV3TW9kZWxEYXRhKG5ld01vZGVsKVxuICB9XG5cbiAgc3RhdGljIF9vYmplY3REYXRhRnJvbUdpdmVuUmF3RGF0YShyYXdEYXRhLCBvcHRpb25zKSB7XG4gICAgaWYgKHJhd0RhdGEgaW5zdGFuY2VvZiBGb3JtRGF0YSB8fCByYXdEYXRhLm5vZGVOYW1lID09IFwiRk9STVwiKSB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IEZvcm1EYXRhT2JqZWN0aXplci5mb3JtRGF0YUZyb21PYmplY3QocmF3RGF0YSwgb3B0aW9ucylcblxuICAgICAgcmV0dXJuIEZvcm1EYXRhT2JqZWN0aXplci50b09iamVjdChmb3JtRGF0YSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmF3RGF0YVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IG9iamVjdERhdGEgPSBCYXNlTW9kZWwuX29iamVjdERhdGFGcm9tR2l2ZW5SYXdEYXRhKHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHF1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKSxcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGEsXG4gICAgICAgICAgICBzaW1wbGVfbW9kZWxfZXJyb3JzOiBvcHRpb25zPy5zaW1wbGVNb2RlbEVycm9yc1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS11cGRhdGVgLFxuICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIlxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWw6IHRoaXMsIG9wdGlvbnN9KVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2UubW9kZWwpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hNb2RlbEZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtyZXNwb25zZSwgbW9kZWw6IHRoaXN9XG4gIH1cblxuICBpc1ZhbGlkKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZCB5ZXRcIilcbiAgfVxuXG4gIGFzeW5jIGlzVmFsaWRPblNlcnZlcigpIHtcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmdldEF0dHJpYnV0ZXMoKVxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgZGF0YVRvVXNlID0ge31cbiAgICBkYXRhVG9Vc2VbcGFyYW1LZXldID0gbW9kZWxEYXRhXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAge1xuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgIH0sXG4gICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tdmFsaWRgLFxuICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgdHlwZTogXCJ2YWxpZFwiXG4gICAgICB9LFxuICAgICAge31cbiAgICApXG5cbiAgICByZXR1cm4ge3ZhbGlkOiByZXNwb25zZS52YWxpZCwgZXJyb3JzOiByZXNwb25zZS5lcnJvcnN9XG4gIH1cblxuICBtb2RlbENsYXNzID0gKCkgPT4gdGhpcy5jb25zdHJ1Y3RvclxuXG4gIHByZWxvYWRSZWxhdGlvbnNoaXAocmVsYXRpb25zaGlwTmFtZSwgbW9kZWwpIHtcbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtCYXNlTW9kZWwuc25ha2VDYXNlKHJlbGF0aW9uc2hpcE5hbWUpXSA9IG1vZGVsXG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzW0Jhc2VNb2RlbC5zbmFrZUNhc2UocmVsYXRpb25zaGlwTmFtZSldID0gbW9kZWxcbiAgfVxuXG4gIG1hcmtGb3JEZXN0cnVjdGlvbigpIHtcbiAgICB0aGlzLl9tYXJrZWRGb3JEZXN0cnVjdGlvbiA9IHRydWVcbiAgfVxuXG4gIG1hcmtlZEZvckRlc3RydWN0aW9uID0gKCkgPT4gdGhpcy5fbWFya2VkRm9yRGVzdHJ1Y3Rpb25cblxuICB1bmlxdWVLZXkoKSB7XG4gICAgaWYgKCF0aGlzLnVuaXF1ZUtleVZhbHVlKSB7XG4gICAgICBjb25zdCBtaW4gPSA1MDAwMDAwMDAwMDAwMDAwXG4gICAgICBjb25zdCBtYXggPSA5MDA3MTk5MjU0NzQwOTkxXG4gICAgICBjb25zdCByYW5kb21CZXR3ZWVuID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluKVxuICAgICAgdGhpcy51bmlxdWVLZXlWYWx1ZSA9IHJhbmRvbUJldHdlZW5cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51bmlxdWVLZXlWYWx1ZVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIF9jYWxsQ29sbGVjdGlvbkNvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpIHtcbiAgICBjb25zdCBmb3JtT3JEYXRhT2JqZWN0ID0gYXJncy5hcmdzXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKGFyZ3MsIGNvbW1hbmRBcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsZXQgZm9ybVxuXG4gICAgICBpZiAoY29tbWFuZEFyZ3MuZm9ybSkge1xuICAgICAgICBmb3JtID0gY29tbWFuZEFyZ3MuZm9ybVxuICAgICAgfSBlbHNlIGlmIChmb3JtT3JEYXRhT2JqZWN0Py5ub2RlTmFtZSA9PSBcIkZPUk1cIikge1xuICAgICAgICBmb3JtID0gZm9ybU9yRGF0YU9iamVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybSkgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG9wdGlvbnM6IHtmb3JtfX0pXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgX2NhbGxNZW1iZXJDb21tYW5kID0gKGFyZ3MsIGNvbW1hbmRBcmdzKSA9PiBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChhcmdzLCBjb21tYW5kQXJncylcblxuICBzdGF0aWMgX3Bvc3REYXRhRnJvbUFyZ3MoYXJncykge1xuICAgIGxldCBwb3N0RGF0YVxuXG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgIGlmIChhcmdzIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgcG9zdERhdGEgPSBhcmdzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3N0RGF0YSA9IG9iamVjdFRvRm9ybURhdGEuc2VyaWFsaXplKGFyZ3MsIHt9LCBudWxsLCBcImFyZ3NcIilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcG9zdERhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIH1cblxuICAgIHJldHVybiBwb3N0RGF0YVxuICB9XG5cbiAgcmVhZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcblxuICAgIHJldHVybiB0aGlzLnJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlKVxuICB9XG5cbiAgcmVhZEF0dHJpYnV0ZVVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSkge1xuICAgIGlmIChhdHRyaWJ1dGVOYW1lIGluIHRoaXMuY2hhbmdlcykge1xuICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVOYW1lXVxuICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZSBpbiB0aGlzLm1vZGVsRGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdXG4gICAgfSBlbHNlIGlmICh0aGlzLmlzTmV3UmVjb3JkKCkpIHtcbiAgICAgIC8vIFJldHVybiBudWxsIGlmIHRoaXMgaXMgYSBuZXcgcmVjb3JkIGFuZCB0aGUgYXR0cmlidXRlIG5hbWUgaXMgYSByZWNvZ25pemVkIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcImF0dHJpYnV0ZXNcIilcblxuICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1BlcnNpc3RlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgQXR0cmlidXRlTm90TG9hZGVkRXJyb3IoYE5vIHN1Y2ggYXR0cmlidXRlOiAke2RpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIil9IyR7YXR0cmlidXRlTmFtZX06ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbERhdGEpfWApXG4gICAgfVxuICB9XG5cbiAgaXNBdHRyaWJ1dGVMb2FkZWQoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICBpZiAoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5jaGFuZ2VzKSByZXR1cm4gdHJ1ZVxuICAgIGlmIChhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSBpbiB0aGlzLm1vZGVsRGF0YSkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIF9pc1ByZXNlbnQodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiICYmIHZhbHVlLm1hdGNoKC9eXFxzKiQvKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGFzeW5jIF9sb2FkQmVsb25nc1RvUmVmbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MgPSB7fSkge1xuICAgIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1thcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MpXG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IGNvbGxlY3Rpb24uZmlyc3QoKVxuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0gPSBtb2RlbFxuICAgICAgcmV0dXJuIG1vZGVsXG4gICAgfVxuICB9XG5cbiAgX3JlYWRCZWxvbmdzVG9SZWZsZWN0aW9uKHtyZWZsZWN0aW9uTmFtZX0pIHtcbiAgICBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW3JlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWZsZWN0aW9uTmFtZV1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgbG9hZGVkUmVsYXRpb25zaGlwcyA9IE9iamVjdC5rZXlzKHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKVxuICAgIGNvbnN0IG1vZGVsQ2xhc3NOYW1lID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKVxuXG4gICAgdGhyb3cgbmV3IE5vdExvYWRlZEVycm9yKGAke21vZGVsQ2xhc3NOYW1lfSMke3JlZmxlY3Rpb25OYW1lfSBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0LiBPbmx5IHRoZXNlIHdlcmUgbG9hZGVkOiAke2xvYWRlZFJlbGF0aW9uc2hpcHMuam9pbihcIiwgXCIpfWApXG4gIH1cblxuICBhc3luYyBfbG9hZEhhc01hbnlSZWZsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncyA9IHt9KSB7XG4gICAgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9XG5cbiAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IENvbGxlY3Rpb24oYXJncywgcXVlcnlBcmdzKVxuICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IGNvbGxlY3Rpb24udG9BcnJheSgpXG5cbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXSA9IG1vZGVsc1xuXG4gICAgcmV0dXJuIG1vZGVsc1xuICB9XG5cbiAgYXN5bmMgX2xvYWRIYXNPbmVSZWZsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncyA9IHt9KSB7XG4gICAgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncylcbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgY29sbGVjdGlvbi5maXJzdCgpXG5cbiAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxcblxuICAgICAgcmV0dXJuIG1vZGVsXG4gICAgfVxuICB9XG5cbiAgX3JlYWRIYXNPbmVSZWZsZWN0aW9uKHtyZWZsZWN0aW9uTmFtZX0pIHtcbiAgICBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW3JlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWZsZWN0aW9uTmFtZV1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZFJlbGF0aW9uc2hpcHMgPSBPYmplY3Qua2V5cyh0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSlcbiAgICBjb25zdCBtb2RlbENsYXNzTmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcblxuICAgIHRocm93IG5ldyBOb3RMb2FkZWRFcnJvcihgJHttb2RlbENsYXNzTmFtZX0jJHtyZWZsZWN0aW9uTmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIHlldC4gT25seSB0aGVzZSB3ZXJlIGxvYWRlZDogJHtsb2FkZWRSZWxhdGlvbnNoaXBzLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgX3JlYWRNb2RlbERhdGFGcm9tQXJncyhhcmdzKSB7XG4gICAgdGhpcy5hYmlsaXRpZXMgPSBhcmdzLmRhdGEuYiB8fCB7fVxuICAgIHRoaXMuY29sbGVjdGlvbiA9IGFyZ3MuY29sbGVjdGlvblxuICAgIHRoaXMubW9kZWxEYXRhID0gb2JqZWN0VG9VbmRlcnNjb3JlKGFyZ3MuZGF0YS5hKVxuICAgIHRoaXMucHJlbG9hZGVkUmVsYXRpb25zaGlwcyA9IGFyZ3MuZGF0YS5yXG4gIH1cblxuICBfcmVhZFByZWxvYWRlZFJlbGF0aW9uc2hpcHMocHJlbG9hZGVkKSB7XG4gICAgaWYgKCF0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyZWxhdGlvbnNoaXBzXCIpXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBEYXRhID0gdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBDbGFzc0RhdGEgPSByZWxhdGlvbnNoaXBzLmZpbmQoKHJlbGF0aW9uc2hpcCkgPT4gZGlnZyhyZWxhdGlvbnNoaXAsIFwibmFtZVwiKSA9PSByZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcENsYXNzRGF0YSkge1xuICAgICAgICBjb25zdCBtb2RlbE5hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcHNMaXN0ID0gcmVsYXRpb25zaGlwcy5tYXAoKHJlbGF0aW9uc2hpcCkgPT4gcmVsYXRpb25zaGlwLm5hbWUpLmpvaW4oXCIsIFwiKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIHJlbGF0aW9uICR7cmVsYXRpb25zaGlwTmFtZX0gb24gdGhlICR7bW9kZWxOYW1lfSBtb2RlbDogJHtyZWxhdGlvbnNoaXBzTGlzdH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBUeXBlID0gZGlnZyhyZWxhdGlvbnNoaXBDbGFzc0RhdGEsIFwiY29sbGVjdGlvbk5hbWVcIilcblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0aW9uc2hpcE5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkYClcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXBDbGFzc0RhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyByZWxhdGlvbnNoaXAgb24gJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfSBieSB0aGF0IG5hbWU6ICR7cmVsYXRpb25zaGlwTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcERhdGEpIHtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwTmFtZV0gPSBudWxsXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBEYXRhKSkge1xuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXSA9IFtdXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBJZCBvZiByZWxhdGlvbnNoaXBEYXRhKSB7XG4gICAgICAgICAgY29uc3QgbW9kZWwgPSBwcmVsb2FkZWQuZ2V0TW9kZWwocmVsYXRpb25zaGlwVHlwZSwgcmVsYXRpb25zaGlwSWQpXG5cbiAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXS5wdXNoKG1vZGVsKVxuICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXS5wdXNoKG1vZGVsKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHByZWxvYWRlZC5nZXRNb2RlbChyZWxhdGlvbnNoaXBUeXBlLCByZWxhdGlvbnNoaXBEYXRhKVxuXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWxcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcmltYXJ5S2V5ID0gKCkgPT4gdGhpcy5yZWFkQXR0cmlidXRlVW5kZXJzY29yZSh0aGlzLmNvbnN0cnVjdG9yLnByaW1hcnlLZXkoKSlcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsU0FBUyxNQUFNLHdCQUF3QjtBQUM5QyxPQUFPQyx1QkFBdUIsTUFBTSw4QkFBOEI7QUFDbEUsT0FBT0MsaUJBQWlCLE1BQU0sdUJBQXVCO0FBQ3JELE9BQU9DLFVBQVUsTUFBTSxjQUFjO0FBQ3JDLE9BQU9DLFlBQVksTUFBTSxpQkFBaUI7QUFDMUMsT0FBT0MsTUFBTSxNQUFNLFVBQVU7QUFDN0IsT0FBT0MsV0FBVyxNQUFNLGdCQUFnQjtBQUN4QyxTQUFRQyxJQUFJLFFBQU8sV0FBVztBQUM5QixPQUFPQyxrQkFBa0IsTUFBTSxzQkFBc0I7QUFDckQsT0FBTyxLQUFLQyxVQUFVLE1BQU0sWUFBWTtBQUN4QyxPQUFPQyxTQUFTLE1BQU0sY0FBYztBQUNwQyxPQUFPQyxjQUFjLE1BQU0sb0JBQW9CO0FBQy9DLE9BQU9DLGdCQUFnQixNQUFNLG9CQUFvQjtBQUNqRCxPQUFPQyxVQUFVLE1BQU0seUJBQXlCO0FBQ2hELE9BQU9DLEtBQUssTUFBTSxvQkFBb0I7QUFDdEMsT0FBT0MsUUFBUSxNQUFNLFlBQVk7QUFDakMsT0FBT0MsZUFBZSxNQUFNLG9CQUFvQjtBQUNoRCxTQUFRQyxnQkFBZ0IsUUFBTyxxQkFBcUI7QUFFcEQsTUFBTUMsa0JBQWtCLEdBQUlDLE1BQU0sSUFBSztFQUNyQyxNQUFNQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0VBRXBCLEtBQUssTUFBTUMsR0FB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
1036
+ //# sourceMappingURL=base-model.js.map