@aerokit/sdk 12.44.0

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 (399) hide show
  1. package/LICENSE +277 -0
  2. package/README.md +170 -0
  3. package/dist/cjs/bpm/deployer.js +57 -0
  4. package/dist/cjs/bpm/index.js +35 -0
  5. package/dist/cjs/bpm/process.js +636 -0
  6. package/dist/cjs/bpm/tasks.js +973 -0
  7. package/dist/cjs/bpm/values.js +82 -0
  8. package/dist/cjs/cache/cache.js +64 -0
  9. package/dist/cjs/cache/index.js +26 -0
  10. package/dist/cjs/cms/cmis.js +689 -0
  11. package/dist/cjs/cms/index.js +26 -0
  12. package/dist/cjs/component/decorators.js +126 -0
  13. package/dist/cjs/component/index.js +36 -0
  14. package/dist/cjs/core/configurations.js +110 -0
  15. package/dist/cjs/core/context.js +47 -0
  16. package/dist/cjs/core/env.js +45 -0
  17. package/dist/cjs/core/globals.js +54 -0
  18. package/dist/cjs/core/index.js +35 -0
  19. package/dist/cjs/db/dao.js +795 -0
  20. package/dist/cjs/db/database.js +904 -0
  21. package/dist/cjs/db/decorators.js +167 -0
  22. package/dist/cjs/db/index.js +72 -0
  23. package/dist/cjs/db/insert.js +51 -0
  24. package/dist/cjs/db/orm.js +245 -0
  25. package/dist/cjs/db/ormstatements.js +243 -0
  26. package/dist/cjs/db/procedure.js +112 -0
  27. package/dist/cjs/db/query.js +57 -0
  28. package/dist/cjs/db/repository.js +148 -0
  29. package/dist/cjs/db/sequence.js +59 -0
  30. package/dist/cjs/db/sql.js +516 -0
  31. package/dist/cjs/db/store.js +172 -0
  32. package/dist/cjs/db/translator.js +100 -0
  33. package/dist/cjs/db/update.js +43 -0
  34. package/dist/cjs/etcd/client.js +174 -0
  35. package/dist/cjs/etcd/index.js +26 -0
  36. package/dist/cjs/extensions/decorators.js +40 -0
  37. package/dist/cjs/extensions/extensions.js +108 -0
  38. package/dist/cjs/extensions/index.js +39 -0
  39. package/dist/cjs/git/client.js +277 -0
  40. package/dist/cjs/git/index.js +26 -0
  41. package/dist/cjs/http/client-async.js +224 -0
  42. package/dist/cjs/http/client.js +145 -0
  43. package/dist/cjs/http/decorators.js +76 -0
  44. package/dist/cjs/http/errors/ForbiddenError.js +41 -0
  45. package/dist/cjs/http/errors/ValidationError.js +41 -0
  46. package/dist/cjs/http/errors.js +26 -0
  47. package/dist/cjs/http/index.js +59 -0
  48. package/dist/cjs/http/request.js +281 -0
  49. package/dist/cjs/http/response.js +452 -0
  50. package/dist/cjs/http/rs/resource-common.js +32 -0
  51. package/dist/cjs/http/rs/resource-http-controller.js +306 -0
  52. package/dist/cjs/http/rs/resource-mappings.js +130 -0
  53. package/dist/cjs/http/rs/resource-method.js +218 -0
  54. package/dist/cjs/http/rs/resource.js +232 -0
  55. package/dist/cjs/http/rs.js +31 -0
  56. package/dist/cjs/http/session.js +124 -0
  57. package/dist/cjs/http/upload.js +144 -0
  58. package/dist/cjs/http/utils.js +106 -0
  59. package/dist/cjs/index.js +1 -0
  60. package/dist/cjs/indexing/index.js +29 -0
  61. package/dist/cjs/indexing/searcher.js +70 -0
  62. package/dist/cjs/indexing/writer.js +45 -0
  63. package/dist/cjs/integrations/index.js +26 -0
  64. package/dist/cjs/integrations/integrations.js +55 -0
  65. package/dist/cjs/io/bytes.js +101 -0
  66. package/dist/cjs/io/files.js +344 -0
  67. package/dist/cjs/io/image.js +43 -0
  68. package/dist/cjs/io/index.js +38 -0
  69. package/dist/cjs/io/streams.js +243 -0
  70. package/dist/cjs/io/zip.js +251 -0
  71. package/dist/cjs/job/decorators.js +40 -0
  72. package/dist/cjs/job/index.js +39 -0
  73. package/dist/cjs/job/scheduler.js +347 -0
  74. package/dist/cjs/junit/index.js +18 -0
  75. package/dist/cjs/junit/junit.js +67 -0
  76. package/dist/cjs/kafka/consumer.js +70 -0
  77. package/dist/cjs/kafka/index.js +29 -0
  78. package/dist/cjs/kafka/producer.js +70 -0
  79. package/dist/cjs/log/index.js +26 -0
  80. package/dist/cjs/log/logging.js +174 -0
  81. package/dist/cjs/mail/client.js +153 -0
  82. package/dist/cjs/mail/index.js +26 -0
  83. package/dist/cjs/messaging/consumer.js +83 -0
  84. package/dist/cjs/messaging/decorators.js +40 -0
  85. package/dist/cjs/messaging/index.js +42 -0
  86. package/dist/cjs/messaging/producer.js +81 -0
  87. package/dist/cjs/mongodb/client.js +627 -0
  88. package/dist/cjs/mongodb/dao.js +390 -0
  89. package/dist/cjs/mongodb/index.js +36 -0
  90. package/dist/cjs/net/decorators.js +40 -0
  91. package/dist/cjs/net/index.js +42 -0
  92. package/dist/cjs/net/soap.js +228 -0
  93. package/dist/cjs/net/websockets.js +151 -0
  94. package/dist/cjs/net/wrappers/onClose.js +2 -0
  95. package/dist/cjs/net/wrappers/onError.js +2 -0
  96. package/dist/cjs/net/wrappers/onMessage.js +2 -0
  97. package/dist/cjs/net/wrappers/onOpen.js +2 -0
  98. package/dist/cjs/pdf/index.js +26 -0
  99. package/dist/cjs/pdf/pdf.js +160 -0
  100. package/dist/cjs/platform/command.js +47 -0
  101. package/dist/cjs/platform/engines.js +70 -0
  102. package/dist/cjs/platform/index.js +47 -0
  103. package/dist/cjs/platform/lifecycle.js +49 -0
  104. package/dist/cjs/platform/os.js +51 -0
  105. package/dist/cjs/platform/problems.js +127 -0
  106. package/dist/cjs/platform/registry.js +319 -0
  107. package/dist/cjs/platform/repository.js +498 -0
  108. package/dist/cjs/platform/workspace.js +574 -0
  109. package/dist/cjs/qldb/index.js +26 -0
  110. package/dist/cjs/qldb/qldb.js +24 -0
  111. package/dist/cjs/rabbitmq/consumer.js +50 -0
  112. package/dist/cjs/rabbitmq/index.js +29 -0
  113. package/dist/cjs/rabbitmq/producer.js +38 -0
  114. package/dist/cjs/redis/client.js +190 -0
  115. package/dist/cjs/redis/index.js +26 -0
  116. package/dist/cjs/security/decorators.js +48 -0
  117. package/dist/cjs/security/index.js +40 -0
  118. package/dist/cjs/security/oauth.js +75 -0
  119. package/dist/cjs/security/user.js +88 -0
  120. package/dist/cjs/template/engines.js +139 -0
  121. package/dist/cjs/template/index.js +26 -0
  122. package/dist/cjs/utils/alphanumeric.js +107 -0
  123. package/dist/cjs/utils/base64.js +104 -0
  124. package/dist/cjs/utils/converter.js +78 -0
  125. package/dist/cjs/utils/digest.js +167 -0
  126. package/dist/cjs/utils/escape.js +160 -0
  127. package/dist/cjs/utils/hex.js +104 -0
  128. package/dist/cjs/utils/index.js +68 -0
  129. package/dist/cjs/utils/jsonpath.js +489 -0
  130. package/dist/cjs/utils/qrcode.js +41 -0
  131. package/dist/cjs/utils/url.js +82 -0
  132. package/dist/cjs/utils/utf8.js +61 -0
  133. package/dist/cjs/utils/uuid.js +48 -0
  134. package/dist/cjs/utils/xml.js +57 -0
  135. package/dist/dts/bpm/deployer.d.ts +29 -0
  136. package/dist/dts/bpm/index.d.ts +8 -0
  137. package/dist/dts/bpm/process.d.ts +433 -0
  138. package/dist/dts/bpm/tasks.d.ts +2022 -0
  139. package/dist/dts/bpm/values.d.ts +38 -0
  140. package/dist/dts/cache/cache.d.ts +30 -0
  141. package/dist/dts/cache/index.d.ts +2 -0
  142. package/dist/dts/cms/cmis.d.ts +413 -0
  143. package/dist/dts/cms/index.d.ts +2 -0
  144. package/dist/dts/component/decorators.d.ts +52 -0
  145. package/dist/dts/component/index.d.ts +2 -0
  146. package/dist/dts/core/configurations.d.ts +65 -0
  147. package/dist/dts/core/context.d.ts +19 -0
  148. package/dist/dts/core/env.d.ts +23 -0
  149. package/dist/dts/core/globals.d.ts +30 -0
  150. package/dist/dts/core/index.d.ts +8 -0
  151. package/dist/dts/db/dao.d.ts +8 -0
  152. package/dist/dts/db/database.d.ts +507 -0
  153. package/dist/dts/db/decorators.d.ts +89 -0
  154. package/dist/dts/db/index.d.ts +25 -0
  155. package/dist/dts/db/insert.d.ts +32 -0
  156. package/dist/dts/db/orm.d.ts +44 -0
  157. package/dist/dts/db/ormstatements.d.ts +4 -0
  158. package/dist/dts/db/procedure.d.ts +25 -0
  159. package/dist/dts/db/query.d.ts +48 -0
  160. package/dist/dts/db/repository.d.ts +64 -0
  161. package/dist/dts/db/sequence.d.ts +34 -0
  162. package/dist/dts/db/sql.d.ts +267 -0
  163. package/dist/dts/db/store.d.ts +138 -0
  164. package/dist/dts/db/translator.d.ts +26 -0
  165. package/dist/dts/db/update.d.ts +21 -0
  166. package/dist/dts/etcd/client.d.ts +92 -0
  167. package/dist/dts/etcd/index.d.ts +2 -0
  168. package/dist/dts/extensions/decorators.d.ts +11 -0
  169. package/dist/dts/extensions/extensions.d.ts +41 -0
  170. package/dist/dts/extensions/index.d.ts +4 -0
  171. package/dist/dts/git/client.d.ts +478 -0
  172. package/dist/dts/git/index.d.ts +2 -0
  173. package/dist/dts/http/client-async.d.ts +158 -0
  174. package/dist/dts/http/client.d.ts +180 -0
  175. package/dist/dts/http/decorators.d.ts +11 -0
  176. package/dist/dts/http/errors/ForbiddenError.d.ts +20 -0
  177. package/dist/dts/http/errors/ValidationError.d.ts +20 -0
  178. package/dist/dts/http/errors.d.ts +2 -0
  179. package/dist/dts/http/index.d.ts +16 -0
  180. package/dist/dts/http/request.d.ts +158 -0
  181. package/dist/dts/http/response.d.ts +281 -0
  182. package/dist/dts/http/rs/resource-common.d.ts +11 -0
  183. package/dist/dts/http/rs/resource-http-controller.d.ts +43 -0
  184. package/dist/dts/http/rs/resource-mappings.d.ts +70 -0
  185. package/dist/dts/http/rs/resource-method.d.ts +206 -0
  186. package/dist/dts/http/rs/resource.d.ts +126 -0
  187. package/dist/dts/http/rs.d.ts +4 -0
  188. package/dist/dts/http/session.d.ts +81 -0
  189. package/dist/dts/http/upload.d.ts +100 -0
  190. package/dist/dts/http/utils.d.ts +54 -0
  191. package/dist/dts/index.d.ts +0 -0
  192. package/dist/dts/indexing/index.d.ts +4 -0
  193. package/dist/dts/indexing/searcher.d.ts +47 -0
  194. package/dist/dts/indexing/writer.d.ts +22 -0
  195. package/dist/dts/integrations/index.d.ts +2 -0
  196. package/dist/dts/integrations/integrations.d.ts +118 -0
  197. package/dist/dts/io/bytes.d.ts +56 -0
  198. package/dist/dts/io/files.d.ts +261 -0
  199. package/dist/dts/io/image.d.ts +22 -0
  200. package/dist/dts/io/index.d.ts +10 -0
  201. package/dist/dts/io/streams.d.ts +172 -0
  202. package/dist/dts/io/zip.d.ts +178 -0
  203. package/dist/dts/job/decorators.d.ts +11 -0
  204. package/dist/dts/job/index.d.ts +4 -0
  205. package/dist/dts/job/scheduler.d.ts +250 -0
  206. package/dist/dts/junit/index.d.ts +1 -0
  207. package/dist/dts/junit/junit.d.ts +50 -0
  208. package/dist/dts/kafka/consumer.d.ts +48 -0
  209. package/dist/dts/kafka/index.d.ts +4 -0
  210. package/dist/dts/kafka/producer.d.ts +50 -0
  211. package/dist/dts/log/index.d.ts +2 -0
  212. package/dist/dts/log/logging.d.ts +102 -0
  213. package/dist/dts/mail/client.d.ts +90 -0
  214. package/dist/dts/mail/index.d.ts +2 -0
  215. package/dist/dts/messaging/consumer.d.ts +61 -0
  216. package/dist/dts/messaging/decorators.d.ts +11 -0
  217. package/dist/dts/messaging/index.d.ts +6 -0
  218. package/dist/dts/messaging/producer.d.ts +59 -0
  219. package/dist/dts/mongodb/client.d.ts +367 -0
  220. package/dist/dts/mongodb/dao.d.ts +24 -0
  221. package/dist/dts/mongodb/index.d.ts +2 -0
  222. package/dist/dts/net/decorators.d.ts +11 -0
  223. package/dist/dts/net/index.d.ts +6 -0
  224. package/dist/dts/net/soap.d.ts +115 -0
  225. package/dist/dts/net/websockets.d.ts +100 -0
  226. package/dist/dts/net/wrappers/onClose.d.ts +0 -0
  227. package/dist/dts/net/wrappers/onError.d.ts +0 -0
  228. package/dist/dts/net/wrappers/onMessage.d.ts +0 -0
  229. package/dist/dts/net/wrappers/onOpen.d.ts +0 -0
  230. package/dist/dts/pdf/index.d.ts +2 -0
  231. package/dist/dts/pdf/pdf.d.ts +72 -0
  232. package/dist/dts/platform/command.d.ts +41 -0
  233. package/dist/dts/platform/engines.d.ts +35 -0
  234. package/dist/dts/platform/index.d.ts +16 -0
  235. package/dist/dts/platform/lifecycle.d.ts +22 -0
  236. package/dist/dts/platform/os.d.ts +23 -0
  237. package/dist/dts/platform/problems.d.ts +114 -0
  238. package/dist/dts/platform/registry.d.ts +227 -0
  239. package/dist/dts/platform/repository.d.ts +354 -0
  240. package/dist/dts/platform/workspace.d.ts +421 -0
  241. package/dist/dts/qldb/index.d.ts +2 -0
  242. package/dist/dts/qldb/qldb.d.ts +1 -0
  243. package/dist/dts/rabbitmq/consumer.d.ts +25 -0
  244. package/dist/dts/rabbitmq/index.d.ts +4 -0
  245. package/dist/dts/rabbitmq/producer.d.ts +15 -0
  246. package/dist/dts/redis/client.d.ts +134 -0
  247. package/dist/dts/redis/index.d.ts +2 -0
  248. package/dist/dts/security/decorators.d.ts +4 -0
  249. package/dist/dts/security/index.d.ts +5 -0
  250. package/dist/dts/security/oauth.d.ts +39 -0
  251. package/dist/dts/security/user.d.ts +51 -0
  252. package/dist/dts/template/engines.d.ts +98 -0
  253. package/dist/dts/template/index.d.ts +2 -0
  254. package/dist/dts/utils/alphanumeric.d.ts +39 -0
  255. package/dist/dts/utils/base64.d.ts +48 -0
  256. package/dist/dts/utils/converter.d.ts +44 -0
  257. package/dist/dts/utils/digest.d.ts +50 -0
  258. package/dist/dts/utils/escape.d.ts +110 -0
  259. package/dist/dts/utils/hex.d.ts +48 -0
  260. package/dist/dts/utils/index.d.ts +23 -0
  261. package/dist/dts/utils/jsonpath.d.ts +22 -0
  262. package/dist/dts/utils/qrcode.d.ts +16 -0
  263. package/dist/dts/utils/url.d.ts +50 -0
  264. package/dist/dts/utils/utf8.d.ts +33 -0
  265. package/dist/dts/utils/uuid.d.ts +21 -0
  266. package/dist/dts/utils/xml.d.ts +22 -0
  267. package/dist/esm/bpm/deployer.mjs +38 -0
  268. package/dist/esm/bpm/index.mjs +15 -0
  269. package/dist/esm/bpm/process.mjs +617 -0
  270. package/dist/esm/bpm/tasks.mjs +954 -0
  271. package/dist/esm/bpm/values.mjs +63 -0
  272. package/dist/esm/cache/cache.mjs +45 -0
  273. package/dist/esm/cache/index.mjs +6 -0
  274. package/dist/esm/cms/cmis.mjs +660 -0
  275. package/dist/esm/cms/index.mjs +6 -0
  276. package/dist/esm/component/decorators.mjs +107 -0
  277. package/dist/esm/component/index.mjs +6 -0
  278. package/dist/esm/core/configurations.mjs +91 -0
  279. package/dist/esm/core/context.mjs +28 -0
  280. package/dist/esm/core/env.mjs +26 -0
  281. package/dist/esm/core/globals.mjs +35 -0
  282. package/dist/esm/core/index.mjs +15 -0
  283. package/dist/esm/db/dao.mjs +775 -0
  284. package/dist/esm/db/database.mjs +885 -0
  285. package/dist/esm/db/decorators.mjs +148 -0
  286. package/dist/esm/db/index.mjs +42 -0
  287. package/dist/esm/db/insert.mjs +32 -0
  288. package/dist/esm/db/orm.mjs +225 -0
  289. package/dist/esm/db/ormstatements.mjs +223 -0
  290. package/dist/esm/db/procedure.mjs +93 -0
  291. package/dist/esm/db/query.mjs +38 -0
  292. package/dist/esm/db/repository.mjs +129 -0
  293. package/dist/esm/db/sequence.mjs +40 -0
  294. package/dist/esm/db/sql.mjs +497 -0
  295. package/dist/esm/db/store.mjs +153 -0
  296. package/dist/esm/db/translator.mjs +81 -0
  297. package/dist/esm/db/update.mjs +24 -0
  298. package/dist/esm/etcd/client.mjs +155 -0
  299. package/dist/esm/etcd/index.mjs +6 -0
  300. package/dist/esm/extensions/decorators.mjs +21 -0
  301. package/dist/esm/extensions/extensions.mjs +89 -0
  302. package/dist/esm/extensions/index.mjs +9 -0
  303. package/dist/esm/git/client.mjs +258 -0
  304. package/dist/esm/git/index.mjs +6 -0
  305. package/dist/esm/http/client-async.mjs +205 -0
  306. package/dist/esm/http/client.mjs +126 -0
  307. package/dist/esm/http/decorators.mjs +47 -0
  308. package/dist/esm/http/errors/ForbiddenError.mjs +22 -0
  309. package/dist/esm/http/errors/ValidationError.mjs +22 -0
  310. package/dist/esm/http/errors.mjs +7 -0
  311. package/dist/esm/http/index.mjs +29 -0
  312. package/dist/esm/http/request.mjs +262 -0
  313. package/dist/esm/http/response.mjs +433 -0
  314. package/dist/esm/http/rs/resource-common.mjs +13 -0
  315. package/dist/esm/http/rs/resource-http-controller.mjs +287 -0
  316. package/dist/esm/http/rs/resource-mappings.mjs +111 -0
  317. package/dist/esm/http/rs/resource-method.mjs +199 -0
  318. package/dist/esm/http/rs/resource.mjs +213 -0
  319. package/dist/esm/http/rs.mjs +12 -0
  320. package/dist/esm/http/session.mjs +105 -0
  321. package/dist/esm/http/upload.mjs +125 -0
  322. package/dist/esm/http/utils.mjs +87 -0
  323. package/dist/esm/index.mjs +1 -0
  324. package/dist/esm/indexing/index.mjs +9 -0
  325. package/dist/esm/indexing/searcher.mjs +51 -0
  326. package/dist/esm/indexing/writer.mjs +26 -0
  327. package/dist/esm/integrations/index.mjs +6 -0
  328. package/dist/esm/integrations/integrations.mjs +36 -0
  329. package/dist/esm/io/bytes.mjs +82 -0
  330. package/dist/esm/io/files.mjs +325 -0
  331. package/dist/esm/io/image.mjs +24 -0
  332. package/dist/esm/io/index.mjs +18 -0
  333. package/dist/esm/io/streams.mjs +224 -0
  334. package/dist/esm/io/zip.mjs +232 -0
  335. package/dist/esm/job/decorators.mjs +21 -0
  336. package/dist/esm/job/index.mjs +9 -0
  337. package/dist/esm/job/scheduler.mjs +328 -0
  338. package/dist/esm/junit/index.mjs +2 -0
  339. package/dist/esm/junit/junit.mjs +48 -0
  340. package/dist/esm/kafka/consumer.mjs +51 -0
  341. package/dist/esm/kafka/index.mjs +9 -0
  342. package/dist/esm/kafka/producer.mjs +51 -0
  343. package/dist/esm/log/index.mjs +6 -0
  344. package/dist/esm/log/logging.mjs +155 -0
  345. package/dist/esm/mail/client.mjs +134 -0
  346. package/dist/esm/mail/index.mjs +6 -0
  347. package/dist/esm/messaging/consumer.mjs +64 -0
  348. package/dist/esm/messaging/decorators.mjs +21 -0
  349. package/dist/esm/messaging/index.mjs +12 -0
  350. package/dist/esm/messaging/producer.mjs +62 -0
  351. package/dist/esm/mongodb/client.mjs +608 -0
  352. package/dist/esm/mongodb/dao.mjs +360 -0
  353. package/dist/esm/mongodb/index.mjs +7 -0
  354. package/dist/esm/net/decorators.mjs +21 -0
  355. package/dist/esm/net/index.mjs +12 -0
  356. package/dist/esm/net/soap.mjs +209 -0
  357. package/dist/esm/net/websockets.mjs +132 -0
  358. package/dist/esm/net/wrappers/onClose.mjs +2 -0
  359. package/dist/esm/net/wrappers/onError.mjs +2 -0
  360. package/dist/esm/net/wrappers/onMessage.mjs +2 -0
  361. package/dist/esm/net/wrappers/onOpen.mjs +2 -0
  362. package/dist/esm/pdf/index.mjs +6 -0
  363. package/dist/esm/pdf/pdf.mjs +141 -0
  364. package/dist/esm/platform/command.mjs +28 -0
  365. package/dist/esm/platform/engines.mjs +51 -0
  366. package/dist/esm/platform/index.mjs +27 -0
  367. package/dist/esm/platform/lifecycle.mjs +30 -0
  368. package/dist/esm/platform/os.mjs +32 -0
  369. package/dist/esm/platform/problems.mjs +108 -0
  370. package/dist/esm/platform/registry.mjs +300 -0
  371. package/dist/esm/platform/repository.mjs +479 -0
  372. package/dist/esm/platform/workspace.mjs +555 -0
  373. package/dist/esm/qldb/index.mjs +6 -0
  374. package/dist/esm/qldb/qldb.mjs +5 -0
  375. package/dist/esm/rabbitmq/consumer.mjs +31 -0
  376. package/dist/esm/rabbitmq/index.mjs +9 -0
  377. package/dist/esm/rabbitmq/producer.mjs +19 -0
  378. package/dist/esm/redis/client.mjs +171 -0
  379. package/dist/esm/redis/index.mjs +6 -0
  380. package/dist/esm/security/decorators.mjs +29 -0
  381. package/dist/esm/security/index.mjs +10 -0
  382. package/dist/esm/security/oauth.mjs +56 -0
  383. package/dist/esm/security/user.mjs +69 -0
  384. package/dist/esm/template/engines.mjs +120 -0
  385. package/dist/esm/template/index.mjs +6 -0
  386. package/dist/esm/utils/alphanumeric.mjs +88 -0
  387. package/dist/esm/utils/base64.mjs +85 -0
  388. package/dist/esm/utils/converter.mjs +59 -0
  389. package/dist/esm/utils/digest.mjs +148 -0
  390. package/dist/esm/utils/escape.mjs +141 -0
  391. package/dist/esm/utils/hex.mjs +85 -0
  392. package/dist/esm/utils/index.mjs +38 -0
  393. package/dist/esm/utils/jsonpath.mjs +470 -0
  394. package/dist/esm/utils/qrcode.mjs +22 -0
  395. package/dist/esm/utils/url.mjs +63 -0
  396. package/dist/esm/utils/utf8.mjs +42 -0
  397. package/dist/esm/utils/uuid.mjs +29 -0
  398. package/dist/esm/utils/xml.mjs +38 -0
  399. package/package.json +58 -0
@@ -0,0 +1,608 @@
1
+ const MongoDBFacade = Java.type("org.eclipse.dirigible.components.api.mongodb.MongoDBFacade");
2
+ const TimeUnit = Java.type("java.util.concurrent.TimeUnit");
3
+ import { UUID } from "@aerokit/sdk/utils/uuid";
4
+ class DBObject {
5
+ /**
6
+ * Constructs a new DBObject instance.
7
+ * @param native The native MongoDB object (e.g., com.mongodb.DBObject)
8
+ */
9
+ constructor(native) {
10
+ this.native = native;
11
+ }
12
+ /**
13
+ * Appends a key-value pair to the DBObject.
14
+ * @param key The field name.
15
+ * @param value The value to append.
16
+ * @returns The current DBObject instance for chaining.
17
+ */
18
+ append(key, value) {
19
+ this.native.append(key, value);
20
+ return this;
21
+ }
22
+ /**
23
+ * Converts the DBObject to a standard JavaScript object representation (JSON).
24
+ * @returns A plain JavaScript object.
25
+ */
26
+ toJson() {
27
+ return this.native.toJson();
28
+ }
29
+ /**
30
+ * Marks the object as a partial object (used internally by MongoDB driver).
31
+ */
32
+ markAsPartialObject() {
33
+ this.native.markAsPartialObject();
34
+ }
35
+ /**
36
+ * Checks if the object is a partial object.
37
+ * @returns True if partial, false otherwise.
38
+ */
39
+ isPartialObject() {
40
+ return this.native.isPartialObject();
41
+ }
42
+ /**
43
+ * Checks if the DBObject contains a field with the specified key.
44
+ * @param key The field name.
45
+ * @returns True if the field exists, false otherwise.
46
+ */
47
+ containsField(key) {
48
+ return this.native.containsField(key);
49
+ }
50
+ /**
51
+ * Gets the value associated with the given key.
52
+ * @param key The field name.
53
+ * @returns The field value.
54
+ */
55
+ get(key) {
56
+ return this.native.get(key);
57
+ }
58
+ /**
59
+ * Puts a key-value pair into the DBObject.
60
+ * @param key The field name.
61
+ * @param value The value to put.
62
+ * @returns The previous value associated with the key, or null.
63
+ */
64
+ put(key, value) {
65
+ return this.native.put(key, value);
66
+ }
67
+ /**
68
+ * Removes a field from the DBObject.
69
+ * @param key The field name to remove.
70
+ * @returns The removed field value.
71
+ */
72
+ removeField(key) {
73
+ return this.native.removeField(key);
74
+ }
75
+ }
76
+ function extract(dbObject) {
77
+ if (!dbObject.native) {
78
+ return {};
79
+ }
80
+ var extracted = JSON.parse(dbObject.native.toJson());
81
+ for (var propertyName in extracted) {
82
+ dbObject[propertyName] = extracted[propertyName];
83
+ }
84
+ return extracted;
85
+ }
86
+ function implicit(object) {
87
+ if (!object) {
88
+ return void 0;
89
+ }
90
+ if (object.native) {
91
+ return object;
92
+ }
93
+ var dbObject = createBasicDBObject();
94
+ for (var propertyName in object) {
95
+ dbObject.append(propertyName, object[propertyName]);
96
+ }
97
+ return dbObject;
98
+ }
99
+ function createBasicDBObject() {
100
+ const dbObject = new DBObject(MongoDBFacade.createBasicDBObject());
101
+ extract(dbObject);
102
+ return dbObject;
103
+ }
104
+ class Client {
105
+ /**
106
+ * Constructs a new MongoDB Client instance.
107
+ * @param uri The MongoDB connection URI.
108
+ * @param user The username for authentication.
109
+ * @param password The password for authentication.
110
+ */
111
+ constructor(uri, user, password) {
112
+ this.native = MongoDBFacade.getClient(uri, user, password);
113
+ }
114
+ /**
115
+ * Retrieves a database instance.
116
+ * @param name Optional name of the database. If not provided, the default database name is used.
117
+ * @returns A DB instance.
118
+ */
119
+ getDB(name) {
120
+ let native = null;
121
+ if (name) {
122
+ native = this.native.getDB(name);
123
+ } else {
124
+ const defaultDB = MongoDBFacade.getDefaultDatabaseName();
125
+ native = this.native.getDB(defaultDB);
126
+ }
127
+ return new DB(native);
128
+ }
129
+ }
130
+ class DB {
131
+ /**
132
+ * Constructs a new DB instance.
133
+ * @param native The native MongoDB DB object.
134
+ */
135
+ constructor(native) {
136
+ this.native = native;
137
+ }
138
+ /**
139
+ * Retrieves a collection instance from the database.
140
+ * @param name The name of the collection.
141
+ * @returns A DBCollection instance.
142
+ */
143
+ getCollection(name) {
144
+ const native = this.native.getCollection(name);
145
+ return new DBCollection(native);
146
+ }
147
+ }
148
+ class DBCollection {
149
+ /**
150
+ * Constructs a new DBCollection instance.
151
+ * @param native The native MongoDB DBCollection object.
152
+ */
153
+ constructor(native) {
154
+ this.native = native;
155
+ }
156
+ /**
157
+ * Inserts a document into the collection.
158
+ * @param dbObject The document to insert (can be a plain JS object or DBObject).
159
+ */
160
+ insert(dbObject) {
161
+ const dbo = implicit(dbObject);
162
+ if (dbo) {
163
+ this.native.insert(dbo.native);
164
+ }
165
+ }
166
+ /**
167
+ * Finds documents matching the query.
168
+ * @param query The query specification (can be a plain JS object or DBObject).
169
+ * @param projection The fields to include or exclude (can be a plain JS object or DBObject).
170
+ * @returns A DBCursor for iterating over results.
171
+ */
172
+ find(query, projection) {
173
+ const q = implicit(query);
174
+ const p = implicit(projection);
175
+ var native = null;
176
+ if (q) {
177
+ if (p) {
178
+ native = this.native.find(q.native, p.native);
179
+ } else {
180
+ native = this.native.find(q.native);
181
+ }
182
+ } else {
183
+ native = this.native.find();
184
+ }
185
+ return new DBCursor(native);
186
+ }
187
+ /**
188
+ * Finds a single document matching the query.
189
+ * @param query The query specification.
190
+ * @param projection The fields to include or exclude.
191
+ * @param sort The sorting specification.
192
+ * @returns The found document as a DBObject.
193
+ */
194
+ findOne(query, projection, sort) {
195
+ const q = implicit(query);
196
+ const p = implicit(projection);
197
+ const s = implicit(sort);
198
+ var dbObject = createBasicDBObject();
199
+ var native = null;
200
+ if (q) {
201
+ if (p) {
202
+ if (s) {
203
+ native = this.native.findOne(q.native, p.native, s.native);
204
+ } else {
205
+ native = this.native.findOne(q.native, p.native);
206
+ }
207
+ } else {
208
+ native = this.native.findOne(q.native);
209
+ }
210
+ } else {
211
+ native = this.native.findOne();
212
+ }
213
+ dbObject.native = native;
214
+ extract(dbObject);
215
+ return dbObject;
216
+ }
217
+ /**
218
+ * Finds a single document by its string ID.
219
+ * @param id The string ID of the document.
220
+ * @param projection The fields to include or exclude.
221
+ * @returns The found document as a DBObject.
222
+ */
223
+ findOneById(id, projection) {
224
+ const p = implicit(projection);
225
+ const dbObject = createBasicDBObject();
226
+ let native = null;
227
+ if (p) {
228
+ native = this.native.findOne(id, p.native);
229
+ } else {
230
+ native = this.native.findOne(id);
231
+ }
232
+ dbObject.native = native;
233
+ extract(dbObject);
234
+ return dbObject;
235
+ }
236
+ /**
237
+ * Counts the number of documents in the collection, optionally filtered by a query.
238
+ * @param query Optional query to filter the count.
239
+ * @returns The number of documents.
240
+ */
241
+ count(query) {
242
+ const q = implicit(query);
243
+ if (q) {
244
+ return this.native.count(q.native);
245
+ }
246
+ return this.native.count();
247
+ }
248
+ /**
249
+ * Gets the count of documents (alias for count).
250
+ * @param query Optional query to filter the count.
251
+ * @returns The number of documents.
252
+ */
253
+ getCount(query) {
254
+ const q = implicit(query);
255
+ if (q) {
256
+ return this.native.getCount(q.native);
257
+ }
258
+ return this.native.getCount();
259
+ }
260
+ /**
261
+ * Creates an index on the collection.
262
+ * @param keys The index key specification.
263
+ * @param options Optional index options.
264
+ */
265
+ createIndex(keys, options) {
266
+ const k = implicit(keys);
267
+ const o = implicit(options);
268
+ if (k) {
269
+ if (o) {
270
+ this.native.createIndex(k.native, o.native);
271
+ } else {
272
+ this.native.createIndex(k.native);
273
+ }
274
+ } else {
275
+ throw new Error("At least Keys parameter must be provided");
276
+ }
277
+ }
278
+ /**
279
+ * Creates an index on a single field by name.
280
+ * @param name The name of the field to index.
281
+ */
282
+ createIndexForField(name) {
283
+ if (name) {
284
+ this.native.createIndex(name);
285
+ } else {
286
+ throw new Error("The filed name must be provided");
287
+ }
288
+ }
289
+ /**
290
+ * Retrieves the distinct values for a specified field across a collection.
291
+ * NOTE: The signature in the original code seems slightly off compared to typical MongoDB drivers.
292
+ * This implementation follows the original structure using `keys.native` if `keys` is provided.
293
+ * @param name The field name.
294
+ * @param query Optional query to filter results.
295
+ * @param keys Optional keys to use for distinct (replaces 'name' if provided and query exists).
296
+ */
297
+ distinct(name, query, keys) {
298
+ const q = implicit(query);
299
+ const k = implicit(keys);
300
+ if (name) {
301
+ if (q) {
302
+ this.native.distinct(k ? k.native : name, q.native);
303
+ } else {
304
+ this.native.distinct(name);
305
+ }
306
+ } else {
307
+ throw new Error("At least the filed name parameter must be provided");
308
+ }
309
+ }
310
+ /**
311
+ * Drops a specified index.
312
+ * @param index The name of the index or the DBObject representing the index keys.
313
+ */
314
+ dropIndex(index) {
315
+ if (typeof index === "string") {
316
+ this.native.dropIndex(index);
317
+ } else {
318
+ const dbo = implicit(index);
319
+ if (dbo) {
320
+ this.native.dropIndex(dbo.native);
321
+ }
322
+ }
323
+ }
324
+ /**
325
+ * Drops a specified index by name.
326
+ * @param name The name of the index.
327
+ */
328
+ dropIndexByName(name) {
329
+ this.native.dropIndex(name);
330
+ }
331
+ /**
332
+ * Drops all indexes on the collection.
333
+ */
334
+ dropIndexes() {
335
+ this.native.dropIndexes();
336
+ }
337
+ /**
338
+ * Removes documents from the collection matching the query.
339
+ * @param query The deletion query specification.
340
+ */
341
+ remove(query) {
342
+ const q = implicit(query);
343
+ if (q) {
344
+ this.native.remove(q.native);
345
+ }
346
+ }
347
+ /**
348
+ * Renames the collection.
349
+ * @param newName The new name for the collection.
350
+ */
351
+ rename(newName) {
352
+ this.native.rename(newName);
353
+ }
354
+ /**
355
+ * Saves a document to the collection. If the document has an `_id`, it performs an update;
356
+ * otherwise, it performs an insert.
357
+ * @param dbObject The document to save.
358
+ */
359
+ save(dbObject) {
360
+ const dbo = implicit(dbObject);
361
+ if (dbo) {
362
+ this.native.save(dbo.native);
363
+ }
364
+ }
365
+ /**
366
+ * Updates documents in the collection matching the query.
367
+ * @param query The update query specification.
368
+ * @param update The update operation specification (e.g., {$set: {...}}).
369
+ * @param upsert If true, creates a new document if no documents match the query.
370
+ * @param multi If true, updates all documents matching the query; otherwise, only one.
371
+ */
372
+ update(query, update, upsert, multi) {
373
+ const q = implicit(query);
374
+ const u = implicit(update);
375
+ if (q) {
376
+ if (u) {
377
+ if (upsert) {
378
+ if (multi) {
379
+ this.native.update(q.native, u.native, upsert, multi);
380
+ } else {
381
+ this.native.update(q.native, u.native, upsert);
382
+ }
383
+ } else {
384
+ this.native.update(q.native, u.native);
385
+ }
386
+ } else {
387
+ throw new Error("The update parameter must be provided");
388
+ }
389
+ } else {
390
+ throw new Error("The query parameter must be provided");
391
+ }
392
+ }
393
+ /**
394
+ * Updates multiple documents in the collection matching the query.
395
+ * (Equivalent to calling `update` with `multi=true` and `upsert=true` implicitly).
396
+ * @param query The update query specification.
397
+ * @param update The update operation specification.
398
+ */
399
+ updateMulti(query, update) {
400
+ const q = implicit(query);
401
+ const u = implicit(update);
402
+ if (q) {
403
+ if (u) {
404
+ this.native.update(q.native, u.native, true, true);
405
+ } else {
406
+ throw new Error("The update parameter must be provided");
407
+ }
408
+ } else {
409
+ throw new Error("The query parameter must be provided");
410
+ }
411
+ }
412
+ /**
413
+ * Calculates the next sequential ID based on the largest existing `_id` in the collection.
414
+ * Assumes `_id` is a numeric field.
415
+ * @returns The next available sequential ID (starting at 1 if collection is empty).
416
+ */
417
+ getNextId() {
418
+ var cursor = this.find({}, { "_id": 1 }).sort({ "_id": -1 }).limit(1);
419
+ if (!cursor.hasNext()) {
420
+ return 1;
421
+ } else {
422
+ return cursor.next()["_id"] + 1;
423
+ }
424
+ }
425
+ /**
426
+ * Generates a new random UUID (Universally Unique Identifier).
427
+ * @returns A string representing the UUID.
428
+ */
429
+ generateUUID() {
430
+ return UUID.random();
431
+ }
432
+ }
433
+ class DBCursor {
434
+ /**
435
+ * Constructs a new DBCursor instance.
436
+ * @param native The native MongoDB DBCursor object.
437
+ */
438
+ constructor(native) {
439
+ this.native = native;
440
+ }
441
+ /**
442
+ * Returns the single result from the cursor.
443
+ * @returns A DBObject representing the document.
444
+ */
445
+ one() {
446
+ const dbObject = new DBObject(this.native.one());
447
+ extract(dbObject);
448
+ return dbObject;
449
+ }
450
+ /**
451
+ * Sets the batch size for the cursor.
452
+ * @param numberOfElements The batch size.
453
+ * @returns The DBCursor instance for chaining.
454
+ */
455
+ batchSize(numberOfElements) {
456
+ this.native.batchSize(numberOfElements);
457
+ return this;
458
+ }
459
+ /**
460
+ * Gets the current batch size.
461
+ * @returns The batch size.
462
+ */
463
+ getBatchSize() {
464
+ return this.native.getBatchSize();
465
+ }
466
+ /**
467
+ * Gets the collection associated with this cursor.
468
+ * @returns The DBCollection instance.
469
+ */
470
+ getCollection() {
471
+ return new DBCollection(this.native.getCollection());
472
+ }
473
+ /**
474
+ * Gets the cursor ID.
475
+ * @returns The cursor ID string.
476
+ */
477
+ getCursorId() {
478
+ return this.native.getCursorId();
479
+ }
480
+ /**
481
+ * Gets the projection object (fields wanted) used in the query.
482
+ * @returns The projection DBObject.
483
+ */
484
+ getKeysWanted() {
485
+ const dbObject = new DBObject(this.native.getKeysWanted());
486
+ extract(dbObject);
487
+ return dbObject;
488
+ }
489
+ /**
490
+ * Gets the limit set on the cursor.
491
+ * @returns The limit number.
492
+ */
493
+ getLimit() {
494
+ return this.native.getLimit();
495
+ }
496
+ /**
497
+ * Closes the cursor.
498
+ */
499
+ close() {
500
+ this.native.close();
501
+ }
502
+ /**
503
+ * Checks if there is a next document in the cursor.
504
+ * @returns True if there is a next document, false otherwise.
505
+ */
506
+ hasNext() {
507
+ return this.native.hasNext();
508
+ }
509
+ /**
510
+ * Retrieves the next document in the cursor.
511
+ * @returns The next document as a DBObject.
512
+ */
513
+ next() {
514
+ const dbObject = new DBObject(this.native.next());
515
+ extract(dbObject);
516
+ return dbObject;
517
+ }
518
+ /**
519
+ * Gets the query object used to create this cursor.
520
+ * @returns The query DBObject.
521
+ */
522
+ getQuery() {
523
+ const dbObject = new DBObject(this.native.getQuery());
524
+ extract(dbObject);
525
+ return dbObject;
526
+ }
527
+ /**
528
+ * Gets the number of documents matched by the query.
529
+ * @returns The total number of documents.
530
+ */
531
+ length() {
532
+ return this.native.length();
533
+ }
534
+ /**
535
+ * Specifies the order in which the query returns the results.
536
+ * @param orderBy The sorting specification (e.g., {field: 1} for ascending).
537
+ * @returns The DBCursor instance for chaining.
538
+ */
539
+ sort(orderBy) {
540
+ const dbo = implicit(orderBy);
541
+ if (!dbo) {
542
+ throw new Error("The orderBy parameter must be provided");
543
+ }
544
+ this.native.sort(dbo.native);
545
+ return this;
546
+ }
547
+ /**
548
+ * Limits the number of results to be returned.
549
+ * @param limit The maximum number of documents to return.
550
+ * @returns The DBCursor instance for chaining.
551
+ */
552
+ limit(limit) {
553
+ this.native.limit(limit);
554
+ return this;
555
+ }
556
+ /**
557
+ * Specifies the exclusive upper bound for a specific index.
558
+ * @param min The minimum value.
559
+ * @returns The DBCursor instance for chaining.
560
+ */
561
+ min(min) {
562
+ this.native.min(min);
563
+ return this;
564
+ }
565
+ /**
566
+ * Specifies the exclusive upper bound for a specific index.
567
+ * @param max The maximum value.
568
+ * @returns The DBCursor instance for chaining.
569
+ */
570
+ max(max) {
571
+ this.native.max(max);
572
+ return this;
573
+ }
574
+ /**
575
+ * Sets a timeout for the server to execute the query.
576
+ * @param maxTime The maximum time in milliseconds.
577
+ * @returns The DBCursor instance for chaining.
578
+ */
579
+ maxTime(maxTime) {
580
+ this.native.maxTime(maxTime, TimeUnit.MILLISECONDS);
581
+ return this;
582
+ }
583
+ /**
584
+ * Gets the size of the result set.
585
+ * @returns The size number.
586
+ */
587
+ size() {
588
+ return this.native.size();
589
+ }
590
+ /**
591
+ * Skips the specified number of documents.
592
+ * @param numberOfElements The number of documents to skip.
593
+ * @returns The DBCursor instance for chaining.
594
+ */
595
+ skip(numberOfElements) {
596
+ this.native.skip(numberOfElements);
597
+ return this;
598
+ }
599
+ }
600
+ export {
601
+ Client,
602
+ DB,
603
+ DBCollection,
604
+ DBCursor,
605
+ DBObject,
606
+ createBasicDBObject
607
+ };
608
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL21vbmdvZGIvY2xpZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBNb25nb0RCRmFjYWRlID0gSmF2YS50eXBlKFwib3JnLmVjbGlwc2UuZGlyaWdpYmxlLmNvbXBvbmVudHMuYXBpLm1vbmdvZGIuTW9uZ29EQkZhY2FkZVwiKTtcbmNvbnN0IFRpbWVVbml0ID0gSmF2YS50eXBlKFwiamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXRcIik7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSBcIkBhZXJva2l0L3Nkay91dGlscy91dWlkXCI7XG5cbi8qKlxuICogRGVmaW5lIGEgY29tbW9uIHR5cGUgZm9yIGlucHV0IHRvIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdCBlaXRoZXIgYSBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdFxuICogKHdoaWNoIHdpbGwgYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gREJPYmplY3QpIG9yIGFuIGV4aXN0aW5nIERCT2JqZWN0IHdyYXBwZXIgaW5zdGFuY2UuXG4gKi9cbnR5cGUgREJJbnB1dCA9IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBEQk9iamVjdCB8IHVuZGVmaW5lZCB8IG51bGw7XG5cbi8qKlxuICogREJPYmplY3Qgb2JqZWN0IHJlcHJlc2VudHMgYSBCU09OIGRvY3VtZW50IHVzZWQgZm9yIHF1ZXJpZXMsIGluc2VydGlvbnMsIGFuZCB1cGRhdGVzLlxuICogSXQgd3JhcHMgdGhlIHVuZGVybHlpbmcgbmF0aXZlIEphdmEgb2JqZWN0LlxuICovXG5leHBvcnQgY2xhc3MgREJPYmplY3Qge1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVuZGVybHlpbmcgbmF0aXZlIEphdmEgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgQlNPTiBkb2N1bWVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBuYXRpdmU6IGFueTtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgREJPYmplY3QgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG5hdGl2ZSBUaGUgbmF0aXZlIE1vbmdvREIgb2JqZWN0IChlLmcuLCBjb20ubW9uZ29kYi5EQk9iamVjdClcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYXRpdmU6IGFueSkge1xuICAgICAgICB0aGlzLm5hdGl2ZSA9IG5hdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBlbmRzIGEga2V5LXZhbHVlIHBhaXIgdG8gdGhlIERCT2JqZWN0LlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGZpZWxkIG5hbWUuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBhcHBlbmQuXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgREJPYmplY3QgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBhcHBlbmQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBEQk9iamVjdCB7XG4gICAgICAgIHRoaXMubmF0aXZlLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIERCT2JqZWN0IHRvIGEgc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gKEpTT04pLlxuICAgICAqIEByZXR1cm5zIEEgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHRvSnNvbigpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLnRvSnNvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcmtzIHRoZSBvYmplY3QgYXMgYSBwYXJ0aWFsIG9iamVjdCAodXNlZCBpbnRlcm5hbGx5IGJ5IE1vbmdvREIgZHJpdmVyKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgbWFya0FzUGFydGlhbE9iamVjdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uYXRpdmUubWFya0FzUGFydGlhbE9iamVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgb2JqZWN0IGlzIGEgcGFydGlhbCBvYmplY3QuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiBwYXJ0aWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGlzUGFydGlhbE9iamVjdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmlzUGFydGlhbE9iamVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgREJPYmplY3QgY29udGFpbnMgYSBmaWVsZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGZpZWxkIG5hbWUuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZmllbGQgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGNvbnRhaW5zRmllbGQoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmNvbnRhaW5zRmllbGQoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleS5cbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBmaWVsZCBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSBmaWVsZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1dHMgYSBrZXktdmFsdWUgcGFpciBpbnRvIHRoZSBEQk9iamVjdC5cbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBmaWVsZCBuYW1lLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHV0LlxuICAgICAqIEByZXR1cm5zIFRoZSBwcmV2aW91cyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSwgb3IgbnVsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHV0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLnB1dChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgZmllbGQgZnJvbSB0aGUgREJPYmplY3QuXG4gICAgICogQHBhcmFtIGtleSBUaGUgZmllbGQgbmFtZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMgVGhlIHJlbW92ZWQgZmllbGQgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUZpZWxkKGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLnJlbW92ZUZpZWxkKGtleSk7XG4gICAgfVxuXG59XG5cbi8qKlxuICogQ29waWVzIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIG5hdGl2ZSBNb25nb0RCIG9iamVjdCdzIEpTT04gcmVwcmVzZW50YXRpb25cbiAqIG9udG8gdGhlIHB1YmxpYyBwcm9wZXJ0aWVzIG9mIHRoZSBEQk9iamVjdCB3cmFwcGVyIGluc3RhbmNlLlxuICogVGhpcyBhbGxvd3MgZGlyZWN0IGFjY2VzcyBsaWtlIGBkYk9iamVjdC5maWVsZE5hbWVgLlxuICogQHBhcmFtIGRiT2JqZWN0IFRoZSBEQk9iamVjdCB3cmFwcGVyIGluc3RhbmNlLlxuICogQHJldHVybnMgVGhlIGV4dHJhY3RlZCBwcm9wZXJ0aWVzIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdChkYk9iamVjdDogREJPYmplY3QpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBpZiAoIWRiT2JqZWN0Lm5hdGl2ZSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIC8vIFBhcnNlIHRoZSBuYXRpdmUgb2JqZWN0J3MgSlNPTiByZXByZXNlbnRhdGlvblxuICAgIHZhciBleHRyYWN0ZWQgPSBKU09OLnBhcnNlKGRiT2JqZWN0Lm5hdGl2ZS50b0pzb24oKSk7XG4gICAgLy8gQ29weSBhbGwgcHJvcGVydGllcyB0byB0aGUgd3JhcHBlciBpbnN0YW5jZVxuICAgIGZvciAodmFyIHByb3BlcnR5TmFtZSBpbiBleHRyYWN0ZWQpIHtcbiAgICAgICAgZGJPYmplY3RbcHJvcGVydHlOYW1lXSA9IGV4dHJhY3RlZFtwcm9wZXJ0eU5hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gZXh0cmFjdGVkO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBpbXBsaWNpdGx5IGNvbnZlcnQgYSBwbGFpbiBKUyBvYmplY3QgdG8gYSBEQk9iamVjdCxcbiAqIG9yIHJldHVybiB0aGUgZXhpc3RpbmcgREJPYmplY3QgaW5zdGFuY2UuXG4gKiBAcGFyYW0gb2JqZWN0IElucHV0IG9iamVjdCB3aGljaCBjYW4gYmUgYSBwbGFpbiBvYmplY3QsIERCT2JqZWN0LCBvciB1bmRlZmluZWQvbnVsbC5cbiAqIEByZXR1cm5zIERCT2JqZWN0IG9yIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gaW1wbGljaXQob2JqZWN0OiBEQklucHV0KTogREJPYmplY3QgfCB1bmRlZmluZWQge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIEV4cGxpY2l0bHkgcmV0dXJuIHVuZGVmaW5lZCBpZiBpbnB1dCBpcyBmYWxzeVxuICAgIH1cbiAgICAvLyBDaGVjayBpZiBpdCBhbHJlYWR5IGhhcyB0aGUgbmF0aXZlIHByb3BlcnR5IChhc3N1bWVzIGl0J3MgYSBEQk9iamVjdCBvciBzaW1pbGFyIHdyYXBwZXIpXG4gICAgaWYgKChvYmplY3QgYXMgYW55KS5uYXRpdmUpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCBhcyBEQk9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHBsYWluIG9iamVjdCB0byBEQk9iamVjdFxuICAgIHZhciBkYk9iamVjdCA9IGNyZWF0ZUJhc2ljREJPYmplY3QoKTtcblxuICAgIGZvciAodmFyIHByb3BlcnR5TmFtZSBpbiBvYmplY3QpIHtcbiAgICAgICAgZGJPYmplY3QuYXBwZW5kKHByb3BlcnR5TmFtZSwgb2JqZWN0W3Byb3BlcnR5TmFtZV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGJPYmplY3Q7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgREJPYmplY3QgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBIG5ldyBEQk9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJhc2ljREJPYmplY3QoKTogREJPYmplY3Qge1xuICAgIGNvbnN0IGRiT2JqZWN0ID0gbmV3IERCT2JqZWN0KE1vbmdvREJGYWNhZGUuY3JlYXRlQmFzaWNEQk9iamVjdCgpKTtcbiAgICBleHRyYWN0KGRiT2JqZWN0KTtcbiAgICByZXR1cm4gZGJPYmplY3Q7XG59XG5cbi8qKlxuICogQ2xpZW50IG9iamVjdCB3cmFwcGVyIGZvciBjb25uZWN0aW5nIHRvIE1vbmdvREIuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGllbnQge1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVuZGVybHlpbmcgbmF0aXZlIE1vbmdvREIgY2xpZW50IG9iamVjdC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbmF0aXZlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE1vbmdvREIgQ2xpZW50IGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIE1vbmdvREIgY29ubmVjdGlvbiBVUkkuXG4gICAgICogQHBhcmFtIHVzZXIgVGhlIHVzZXJuYW1lIGZvciBhdXRoZW50aWNhdGlvbi5cbiAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmk6IHN0cmluZywgdXNlcjogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubmF0aXZlID0gTW9uZ29EQkZhY2FkZS5nZXRDbGllbnQodXJpLCB1c2VyLCBwYXNzd29yZClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYSBkYXRhYmFzZSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBPcHRpb25hbCBuYW1lIG9mIHRoZSBkYXRhYmFzZS4gSWYgbm90IHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBkYXRhYmFzZSBuYW1lIGlzIHVzZWQuXG4gICAgICogQHJldHVybnMgQSBEQiBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0REIobmFtZT86IHN0cmluZyk6IERCIHtcbiAgICAgICAgbGV0IG5hdGl2ZSA9IG51bGw7XG4gICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBuYXRpdmUgPSB0aGlzLm5hdGl2ZS5nZXREQihuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHREQiA9IE1vbmdvREJGYWNhZGUuZ2V0RGVmYXVsdERhdGFiYXNlTmFtZSgpO1xuICAgICAgICAgICAgbmF0aXZlID0gdGhpcy5uYXRpdmUuZ2V0REIoZGVmYXVsdERCKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgREIobmF0aXZlKTtcbiAgICB9XG59XG5cbi8qKlxuICogREIgb2JqZWN0IHdyYXBwZXIgZm9yIGEgTW9uZ29EQiBkYXRhYmFzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIERCIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBNb25nb0RCIERCIG9iamVjdC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbmF0aXZlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IERCIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBuYXRpdmUgVGhlIG5hdGl2ZSBNb25nb0RCIERCIG9iamVjdC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYXRpdmU6IGFueSkge1xuICAgICAgICB0aGlzLm5hdGl2ZSA9IG5hdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYSBjb2xsZWN0aW9uIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEByZXR1cm5zIEEgREJDb2xsZWN0aW9uIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb2xsZWN0aW9uKG5hbWU6IHN0cmluZyk6IERCQ29sbGVjdGlvbiB7XG4gICAgICAgIGNvbnN0IG5hdGl2ZSA9IHRoaXMubmF0aXZlLmdldENvbGxlY3Rpb24obmFtZSk7XG4gICAgICAgIHJldHVybiBuZXcgREJDb2xsZWN0aW9uKG5hdGl2ZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIERCQ29sbGVjdGlvbiBvYmplY3Qgd3JhcHBlciBmb3IgYSBNb25nb0RCIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBEQkNvbGxlY3Rpb24ge1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVuZGVybHlpbmcgbmF0aXZlIE1vbmdvREIgREJDb2xsZWN0aW9uIG9iamVjdC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbmF0aXZlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IERCQ29sbGVjdGlvbiBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbmF0aXZlIFRoZSBuYXRpdmUgTW9uZ29EQiBEQkNvbGxlY3Rpb24gb2JqZWN0LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hdGl2ZTogYW55KSB7XG4gICAgICAgIHRoaXMubmF0aXZlID0gbmF0aXZlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBkb2N1bWVudCBpbnRvIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBkYk9iamVjdCBUaGUgZG9jdW1lbnQgdG8gaW5zZXJ0IChjYW4gYmUgYSBwbGFpbiBKUyBvYmplY3Qgb3IgREJPYmplY3QpLlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnNlcnQoZGJPYmplY3Q6IERCSW5wdXQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGJvID0gaW1wbGljaXQoZGJPYmplY3QpO1xuICAgICAgICBpZiAoZGJvKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZS5pbnNlcnQoZGJvLm5hdGl2ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBkb2N1bWVudHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgc3BlY2lmaWNhdGlvbiAoY2FuIGJlIGEgcGxhaW4gSlMgb2JqZWN0IG9yIERCT2JqZWN0KS5cbiAgICAgKiBAcGFyYW0gcHJvamVjdGlvbiBUaGUgZmllbGRzIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSAoY2FuIGJlIGEgcGxhaW4gSlMgb2JqZWN0IG9yIERCT2JqZWN0KS5cbiAgICAgKiBAcmV0dXJucyBBIERCQ3Vyc29yIGZvciBpdGVyYXRpbmcgb3ZlciByZXN1bHRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kKHF1ZXJ5PzogREJJbnB1dCwgcHJvamVjdGlvbj86IERCSW5wdXQpOiBEQkN1cnNvciB7XG4gICAgICAgIGNvbnN0IHEgPSBpbXBsaWNpdChxdWVyeSk7XG4gICAgICAgIGNvbnN0IHAgPSBpbXBsaWNpdChwcm9qZWN0aW9uKTtcblxuICAgICAgICB2YXIgbmF0aXZlID0gbnVsbDtcbiAgICAgICAgaWYgKHEpIHtcbiAgICAgICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgICAgICAgbmF0aXZlID0gdGhpcy5uYXRpdmUuZmluZChxLm5hdGl2ZSwgcC5uYXRpdmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuYXRpdmUgPSB0aGlzLm5hdGl2ZS5maW5kKHEubmF0aXZlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5hdGl2ZSA9IHRoaXMubmF0aXZlLmZpbmQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgREJDdXJzb3IobmF0aXZlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBhIHNpbmdsZSBkb2N1bWVudCBtYXRjaGluZyB0aGUgcXVlcnkuXG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSBzcGVjaWZpY2F0aW9uLlxuICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIFRoZSBmaWVsZHMgdG8gaW5jbHVkZSBvciBleGNsdWRlLlxuICAgICAqIEBwYXJhbSBzb3J0IFRoZSBzb3J0aW5nIHNwZWNpZmljYXRpb24uXG4gICAgICogQHJldHVybnMgVGhlIGZvdW5kIGRvY3VtZW50IGFzIGEgREJPYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGZpbmRPbmUocXVlcnk6IERCSW5wdXQsIHByb2plY3Rpb246IERCSW5wdXQsIHNvcnQ6IERCSW5wdXQpOiBEQk9iamVjdCB7XG4gICAgICAgIGNvbnN0IHEgPSBpbXBsaWNpdChxdWVyeSk7XG4gICAgICAgIGNvbnN0IHAgPSBpbXBsaWNpdChwcm9qZWN0aW9uKTtcbiAgICAgICAgY29uc3QgcyA9IGltcGxpY2l0KHNvcnQpO1xuXG4gICAgICAgIHZhciBkYk9iamVjdCA9IGNyZWF0ZUJhc2ljREJPYmplY3QoKTtcbiAgICAgICAgdmFyIG5hdGl2ZSA9IG51bGw7XG4gICAgICAgIGlmIChxKSB7XG4gICAgICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZSA9IHRoaXMubmF0aXZlLmZpbmRPbmUocS5uYXRpdmUsIHAubmF0aXZlLCBzLm5hdGl2ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlID0gdGhpcy5uYXRpdmUuZmluZE9uZShxLm5hdGl2ZSwgcC5uYXRpdmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmF0aXZlID0gdGhpcy5uYXRpdmUuZmluZE9uZShxLm5hdGl2ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuYXRpdmUgPSB0aGlzLm5hdGl2ZS5maW5kT25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGJPYmplY3QubmF0aXZlID0gbmF0aXZlO1xuICAgICAgICBleHRyYWN0KGRiT2JqZWN0KTtcbiAgICAgICAgcmV0dXJuIGRiT2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGEgc2luZ2xlIGRvY3VtZW50IGJ5IGl0cyBzdHJpbmcgSUQuXG4gICAgICogQHBhcmFtIGlkIFRoZSBzdHJpbmcgSUQgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIFRoZSBmaWVsZHMgdG8gaW5jbHVkZSBvciBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIFRoZSBmb3VuZCBkb2N1bWVudCBhcyBhIERCT2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kT25lQnlJZChpZDogc3RyaW5nLCBwcm9qZWN0aW9uPzogREJJbnB1dCk6IERCT2JqZWN0IHtcbiAgICAgICAgY29uc3QgcCA9IGltcGxpY2l0KHByb2plY3Rpb24pO1xuICAgICAgICBjb25zdCBkYk9iamVjdCA9IGNyZWF0ZUJhc2ljREJPYmplY3QoKTtcbiAgICAgICAgbGV0IG5hdGl2ZSA9IG51bGw7XG4gICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgICBuYXRpdmUgPSB0aGlzLm5hdGl2ZS5maW5kT25lKGlkLCBwLm5hdGl2ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuYXRpdmUgPSB0aGlzLm5hdGl2ZS5maW5kT25lKGlkKTtcbiAgICAgICAgfVxuICAgICAgICBkYk9iamVjdC5uYXRpdmUgPSBuYXRpdmU7XG4gICAgICAgIGV4dHJhY3QoZGJPYmplY3QpO1xuICAgICAgICByZXR1cm4gZGJPYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLCBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IGEgcXVlcnkuXG4gICAgICogQHBhcmFtIHF1ZXJ5IE9wdGlvbmFsIHF1ZXJ5IHRvIGZpbHRlciB0aGUgY291bnQuXG4gICAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBkb2N1bWVudHMuXG4gICAgICovXG4gICAgcHVibGljIGNvdW50KHF1ZXJ5PzogREJJbnB1dCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHEgPSBpbXBsaWNpdChxdWVyeSk7XG4gICAgICAgIGlmIChxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmUuY291bnQocS5uYXRpdmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5jb3VudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvdW50IG9mIGRvY3VtZW50cyAoYWxpYXMgZm9yIGNvdW50KS5cbiAgICAgKiBAcGFyYW0gcXVlcnkgT3B0aW9uYWwgcXVlcnkgdG8gZmlsdGVyIHRoZSBjb3VudC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGRvY3VtZW50cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q291bnQocXVlcnk6IERCSW5wdXQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBxID0gaW1wbGljaXQocXVlcnkpO1xuICAgICAgICBpZiAocSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmdldENvdW50KHEubmF0aXZlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZ2V0Q291bnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluZGV4IG9uIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBrZXlzIFRoZSBpbmRleCBrZXkgc3BlY2lmaWNhdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBpbmRleCBvcHRpb25zLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVJbmRleChrZXlzOiBEQklucHV0LCBvcHRpb25zOiBEQklucHV0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGsgPSBpbXBsaWNpdChrZXlzKTtcbiAgICAgICAgY29uc3QgbyA9IGltcGxpY2l0KG9wdGlvbnMpO1xuICAgICAgICBpZiAoaykge1xuICAgICAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZS5jcmVhdGVJbmRleChrLm5hdGl2ZSwgby5uYXRpdmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZS5jcmVhdGVJbmRleChrLm5hdGl2ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdCBsZWFzdCBLZXlzIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbmRleCBvbiBhIHNpbmdsZSBmaWVsZCBieSBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBpbmRleC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlSW5kZXhGb3JGaWVsZChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlLmNyZWF0ZUluZGV4KG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGZpbGVkIG5hbWUgbXVzdCBiZSBwcm92aWRlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgZGlzdGluY3QgdmFsdWVzIGZvciBhIHNwZWNpZmllZCBmaWVsZCBhY3Jvc3MgYSBjb2xsZWN0aW9uLlxuICAgICAqIE5PVEU6IFRoZSBzaWduYXR1cmUgaW4gdGhlIG9yaWdpbmFsIGNvZGUgc2VlbXMgc2xpZ2h0bHkgb2ZmIGNvbXBhcmVkIHRvIHR5cGljYWwgTW9uZ29EQiBkcml2ZXJzLlxuICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gZm9sbG93cyB0aGUgb3JpZ2luYWwgc3RydWN0dXJlIHVzaW5nIGBrZXlzLm5hdGl2ZWAgaWYgYGtleXNgIGlzIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmaWVsZCBuYW1lLlxuICAgICAqIEBwYXJhbSBxdWVyeSBPcHRpb25hbCBxdWVyeSB0byBmaWx0ZXIgcmVzdWx0cy5cbiAgICAgKiBAcGFyYW0ga2V5cyBPcHRpb25hbCBrZXlzIHRvIHVzZSBmb3IgZGlzdGluY3QgKHJlcGxhY2VzICduYW1lJyBpZiBwcm92aWRlZCBhbmQgcXVlcnkgZXhpc3RzKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzdGluY3QobmFtZTogc3RyaW5nLCBxdWVyeTogREJJbnB1dCwga2V5czogREJJbnB1dCk6IHZvaWQge1xuICAgICAgICBjb25zdCBxID0gaW1wbGljaXQocXVlcnkpO1xuICAgICAgICBjb25zdCBrID0gaW1wbGljaXQoa2V5cyk7XG4gICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBpZiAocSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHF1ZXJ5IGlzIHByb3ZpZGVkLCB1c2Uga2V5cyBmb3IgdGhlIGZpZWxkIG5hbWUgaWYgayBpcyBwcmVzZW50LCBvdGhlcndpc2UgdXNlICduYW1lJ1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlLmRpc3RpbmN0KGsgPyBrLm5hdGl2ZSA6IG5hbWUsIHEubmF0aXZlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmUuZGlzdGluY3QobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdCBsZWFzdCB0aGUgZmlsZWQgbmFtZSBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyb3BzIGEgc3BlY2lmaWVkIGluZGV4LlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgbmFtZSBvZiB0aGUgaW5kZXggb3IgdGhlIERCT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgaW5kZXgga2V5cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZHJvcEluZGV4KGluZGV4OiBzdHJpbmcgfCBEQklucHV0KTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5kZXggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZS5kcm9wSW5kZXgoaW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGJvID0gaW1wbGljaXQoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKGRibykge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlLmRyb3BJbmRleChkYm8ubmF0aXZlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyb3BzIGEgc3BlY2lmaWVkIGluZGV4IGJ5IG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluZGV4LlxuICAgICAqL1xuICAgIHB1YmxpYyBkcm9wSW5kZXhCeU5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubmF0aXZlLmRyb3BJbmRleChuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcm9wcyBhbGwgaW5kZXhlcyBvbiB0aGUgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZHJvcEluZGV4ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubmF0aXZlLmRyb3BJbmRleGVzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBkb2N1bWVudHMgZnJvbSB0aGUgY29sbGVjdGlvbiBtYXRjaGluZyB0aGUgcXVlcnkuXG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBkZWxldGlvbiBxdWVyeSBzcGVjaWZpY2F0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmUocXVlcnk6IERCSW5wdXQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcSA9IGltcGxpY2l0KHF1ZXJ5KTtcbiAgICAgICAgaWYgKHEpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlLnJlbW92ZShxLm5hdGl2ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5hbWVzIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBuZXdOYW1lIFRoZSBuZXcgbmFtZSBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIHJlbmFtZShuZXdOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uYXRpdmUucmVuYW1lKG5ld05hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIGEgZG9jdW1lbnQgdG8gdGhlIGNvbGxlY3Rpb24uIElmIHRoZSBkb2N1bWVudCBoYXMgYW4gYF9pZGAsIGl0IHBlcmZvcm1zIGFuIHVwZGF0ZTtcbiAgICAgKiBvdGhlcndpc2UsIGl0IHBlcmZvcm1zIGFuIGluc2VydC5cbiAgICAgKiBAcGFyYW0gZGJPYmplY3QgVGhlIGRvY3VtZW50IHRvIHNhdmUuXG4gICAgICovXG4gICAgcHVibGljIHNhdmUoZGJPYmplY3Q6IERCSW5wdXQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGJvID0gaW1wbGljaXQoZGJPYmplY3QpO1xuICAgICAgICBpZiAoZGJvKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZS5zYXZlKGRiby5uYXRpdmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBkb2N1bWVudHMgaW4gdGhlIGNvbGxlY3Rpb24gbWF0Y2hpbmcgdGhlIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgdXBkYXRlIHF1ZXJ5IHNwZWNpZmljYXRpb24uXG4gICAgICogQHBhcmFtIHVwZGF0ZSBUaGUgdXBkYXRlIG9wZXJhdGlvbiBzcGVjaWZpY2F0aW9uIChlLmcuLCB7JHNldDogey4uLn19KS5cbiAgICAgKiBAcGFyYW0gdXBzZXJ0IElmIHRydWUsIGNyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgaWYgbm8gZG9jdW1lbnRzIG1hdGNoIHRoZSBxdWVyeS5cbiAgICAgKiBAcGFyYW0gbXVsdGkgSWYgdHJ1ZSwgdXBkYXRlcyBhbGwgZG9jdW1lbnRzIG1hdGNoaW5nIHRoZSBxdWVyeTsgb3RoZXJ3aXNlLCBvbmx5IG9uZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlKHF1ZXJ5OiBEQklucHV0LCB1cGRhdGU6IERCSW5wdXQsIHVwc2VydD86IGJvb2xlYW4sIG11bHRpPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBxID0gaW1wbGljaXQocXVlcnkpO1xuICAgICAgICBjb25zdCB1ID0gaW1wbGljaXQodXBkYXRlKTtcbiAgICAgICAgaWYgKHEpIHtcbiAgICAgICAgICAgIGlmICh1KSB7XG4gICAgICAgICAgICAgICAgaWYgKHVwc2VydCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlLnVwZGF0ZShxLm5hdGl2ZSwgdS5uYXRpdmUsIHVwc2VydCwgbXVsdGkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXRpdmUudXBkYXRlKHEubmF0aXZlLCB1Lm5hdGl2ZSwgdXBzZXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlLnVwZGF0ZShxLm5hdGl2ZSwgdS5uYXRpdmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHVwZGF0ZSBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBxdWVyeSBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uIG1hdGNoaW5nIHRoZSBxdWVyeS5cbiAgICAgKiAoRXF1aXZhbGVudCB0byBjYWxsaW5nIGB1cGRhdGVgIHdpdGggYG11bHRpPXRydWVgIGFuZCBgdXBzZXJ0PXRydWVgIGltcGxpY2l0bHkpLlxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgdXBkYXRlIHF1ZXJ5IHNwZWNpZmljYXRpb24uXG4gICAgICogQHBhcmFtIHVwZGF0ZSBUaGUgdXBkYXRlIG9wZXJhdGlvbiBzcGVjaWZpY2F0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVNdWx0aShxdWVyeTogREJJbnB1dCwgdXBkYXRlOiBEQklucHV0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHEgPSBpbXBsaWNpdChxdWVyeSk7XG4gICAgICAgIGNvbnN0IHUgPSBpbXBsaWNpdCh1cGRhdGUpO1xuICAgICAgICBpZiAocSkge1xuICAgICAgICAgICAgaWYgKHUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZS51cGRhdGUocS5uYXRpdmUsIHUubmF0aXZlLCB0cnVlLCB0cnVlKTsgLy8gQXNzdW1pbmcgdXBkYXRlTXVsdGkgbWVhbnMgdXBzZXJ0PXRydWUgYW5kIG11bHRpPXRydWVcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHVwZGF0ZSBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBxdWVyeSBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZFwiKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBuZXh0IHNlcXVlbnRpYWwgSUQgYmFzZWQgb24gdGhlIGxhcmdlc3QgZXhpc3RpbmcgYF9pZGAgaW4gdGhlIGNvbGxlY3Rpb24uXG4gICAgICogQXNzdW1lcyBgX2lkYCBpcyBhIG51bWVyaWMgZmllbGQuXG4gICAgICogQHJldHVybnMgVGhlIG5leHQgYXZhaWxhYmxlIHNlcXVlbnRpYWwgSUQgKHN0YXJ0aW5nIGF0IDEgaWYgY29sbGVjdGlvbiBpcyBlbXB0eSkuXG4gICAgICovXG4gICAgcHVibGljIGdldE5leHRJZCgpOiBudW1iZXIge1xuICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5maW5kKHt9LCB7IFwiX2lkXCI6IDEgfSkuc29ydCh7IFwiX2lkXCI6IC0xIH0pLmxpbWl0KDEpO1xuICAgICAgICBpZiAoIWN1cnNvci5oYXNOZXh0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5uZXh0KClbXCJfaWRcIl0gKyAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgbmV3IHJhbmRvbSBVVUlEIChVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllcikuXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBVVUlELlxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZVVVSUQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFVVSUQucmFuZG9tKCk7XG4gICAgfVxuXG59XG5cbi8qKlxuICogREJDdXJzb3Igb2JqZWN0IHdyYXBwZXIgZm9yIGl0ZXJhdGluZyBvdmVyIHJlc3VsdHMgb2YgYSBNb25nb0RCIHF1ZXJ5LlxuICovXG5leHBvcnQgY2xhc3MgREJDdXJzb3Ige1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVuZGVybHlpbmcgbmF0aXZlIE1vbmdvREIgREJDdXJzb3Igb2JqZWN0LlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBuYXRpdmU6IGFueTtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgREJDdXJzb3IgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG5hdGl2ZSBUaGUgbmF0aXZlIE1vbmdvREIgREJDdXJzb3Igb2JqZWN0LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hdGl2ZTogYW55KSB7XG4gICAgICAgIHRoaXMubmF0aXZlID0gbmF0aXZlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNpbmdsZSByZXN1bHQgZnJvbSB0aGUgY3Vyc29yLlxuICAgICAqIEByZXR1cm5zIEEgREJPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25lKCk6IERCT2JqZWN0IHtcbiAgICAgICAgY29uc3QgZGJPYmplY3QgPSBuZXcgREJPYmplY3QodGhpcy5uYXRpdmUub25lKCkpO1xuICAgICAgICBleHRyYWN0KGRiT2JqZWN0KTtcbiAgICAgICAgcmV0dXJuIGRiT2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGJhdGNoIHNpemUgZm9yIHRoZSBjdXJzb3IuXG4gICAgICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgVGhlIGJhdGNoIHNpemUuXG4gICAgICogQHJldHVybnMgVGhlIERCQ3Vyc29yIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYmF0Y2hTaXplKG51bWJlck9mRWxlbWVudHM6IG51bWJlcik6IERCQ3Vyc29yIHtcbiAgICAgICAgdGhpcy5uYXRpdmUuYmF0Y2hTaXplKG51bWJlck9mRWxlbWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGJhdGNoIHNpemUuXG4gICAgICogQHJldHVybnMgVGhlIGJhdGNoIHNpemUuXG4gICAgICovXG4gICAgcHVibGljIGdldEJhdGNoU2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZ2V0QmF0Y2hTaXplKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29sbGVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjdXJzb3IuXG4gICAgICogQHJldHVybnMgVGhlIERCQ29sbGVjdGlvbiBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29sbGVjdGlvbigpOiBEQkNvbGxlY3Rpb24ge1xuICAgICAgICByZXR1cm4gbmV3IERCQ29sbGVjdGlvbih0aGlzLm5hdGl2ZS5nZXRDb2xsZWN0aW9uKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnNvciBJRC5cbiAgICAgKiBAcmV0dXJucyBUaGUgY3Vyc29yIElEIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q3Vyc29ySWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmdldEN1cnNvcklkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvamVjdGlvbiBvYmplY3QgKGZpZWxkcyB3YW50ZWQpIHVzZWQgaW4gdGhlIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIFRoZSBwcm9qZWN0aW9uIERCT2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRLZXlzV2FudGVkKCk6IERCT2JqZWN0IHtcbiAgICAgICAgY29uc3QgZGJPYmplY3QgPSBuZXcgREJPYmplY3QodGhpcy5uYXRpdmUuZ2V0S2V5c1dhbnRlZCgpKTtcbiAgICAgICAgZXh0cmFjdChkYk9iamVjdCk7XG4gICAgICAgIHJldHVybiBkYk9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsaW1pdCBzZXQgb24gdGhlIGN1cnNvci5cbiAgICAgKiBAcmV0dXJucyBUaGUgbGltaXQgbnVtYmVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMaW1pdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZ2V0TGltaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGN1cnNvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubmF0aXZlLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEgbmV4dCBkb2N1bWVudCBpbiB0aGUgY3Vyc29yLlxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlcmUgaXMgYSBuZXh0IGRvY3VtZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGhhc05leHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5oYXNOZXh0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBuZXh0IGRvY3VtZW50IGluIHRoZSBjdXJzb3IuXG4gICAgICogQHJldHVybnMgVGhlIG5leHQgZG9jdW1lbnQgYXMgYSBEQk9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dCgpOiBEQk9iamVjdCB7XG4gICAgICAgIGNvbnN0IGRiT2JqZWN0ID0gbmV3IERCT2JqZWN0KHRoaXMubmF0aXZlLm5leHQoKSk7XG4gICAgICAgIGV4dHJhY3QoZGJPYmplY3QpO1xuICAgICAgICByZXR1cm4gZGJPYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcXVlcnkgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoaXMgY3Vyc29yLlxuICAgICAqIEByZXR1cm5zIFRoZSBxdWVyeSBEQk9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UXVlcnkoKTogREJPYmplY3Qge1xuICAgICAgICBjb25zdCBkYk9iamVjdCA9IG5ldyBEQk9iamVjdCh0aGlzLm5hdGl2ZS5nZXRRdWVyeSgpKTtcbiAgICAgICAgZXh0cmFjdChkYk9iamVjdCk7XG4gICAgICAgIHJldHVybiBkYk9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIG1hdGNoZWQgYnkgdGhlIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIFRoZSB0b3RhbCBudW1iZXIgb2YgZG9jdW1lbnRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmxlbmd0aCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHF1ZXJ5IHJldHVybnMgdGhlIHJlc3VsdHMuXG4gICAgICogQHBhcmFtIG9yZGVyQnkgVGhlIHNvcnRpbmcgc3BlY2lmaWNhdGlvbiAoZS5nLiwge2ZpZWxkOiAxfSBmb3IgYXNjZW5kaW5nKS5cbiAgICAgKiBAcmV0dXJucyBUaGUgREJDdXJzb3IgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBzb3J0KG9yZGVyQnk6IERCSW5wdXQpOiBEQkN1cnNvciB7XG4gICAgICAgIGNvbnN0IGRibyA9IGltcGxpY2l0KG9yZGVyQnkpO1xuICAgICAgICBpZiAoIWRibykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIG9yZGVyQnkgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uYXRpdmUuc29ydChkYm8ubmF0aXZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGltaXRzIHRoZSBudW1iZXIgb2YgcmVzdWx0cyB0byBiZSByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGRvY3VtZW50cyB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMgVGhlIERCQ3Vyc29yIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbGltaXQobGltaXQ6IG51bWJlcik6IERCQ3Vyc29yIHtcbiAgICAgICAgdGhpcy5uYXRpdmUubGltaXQobGltaXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIGV4Y2x1c2l2ZSB1cHBlciBib3VuZCBmb3IgYSBzcGVjaWZpYyBpbmRleC5cbiAgICAgKiBAcGFyYW0gbWluIFRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIFRoZSBEQkN1cnNvciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuXG4gICAgICovXG4gICAgcHVibGljIG1pbihtaW46IG51bWJlcik6IERCQ3Vyc29yIHtcbiAgICAgICAgdGhpcy5uYXRpdmUubWluKG1pbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgZXhjbHVzaXZlIHVwcGVyIGJvdW5kIGZvciBhIHNwZWNpZmljIGluZGV4LlxuICAgICAqIEBwYXJhbSBtYXggVGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQHJldHVybnMgVGhlIERCQ3Vyc29yIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbWF4KG1heDogbnVtYmVyKTogREJDdXJzb3Ige1xuICAgICAgICB0aGlzLm5hdGl2ZS5tYXgobWF4KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIHRpbWVvdXQgZm9yIHRoZSBzZXJ2ZXIgdG8gZXhlY3V0ZSB0aGUgcXVlcnkuXG4gICAgICogQHBhcmFtIG1heFRpbWUgVGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMuXG4gICAgICogQHJldHVybnMgVGhlIERCQ3Vyc29yIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbWF4VGltZShtYXhUaW1lOiBudW1iZXIpOiBEQkN1cnNvciB7XG4gICAgICAgIHRoaXMubmF0aXZlLm1heFRpbWUobWF4VGltZSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0IHNldC5cbiAgICAgKiBAcmV0dXJucyBUaGUgc2l6ZSBudW1iZXIuXG4gICAgICovXG4gICAgcHVibGljIHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLnNpemUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTa2lwcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkb2N1bWVudHMuXG4gICAgICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgVGhlIG51bWJlciBvZiBkb2N1bWVudHMgdG8gc2tpcC5cbiAgICAgKiBAcmV0dXJucyBUaGUgREJDdXJzb3IgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBza2lwKG51bWJlck9mRWxlbWVudHM6IG51bWJlcik6IERCQ3Vyc29yIHtcbiAgICAgICAgdGhpcy5uYXRpdmUuc2tpcChudW1iZXJPZkVsZW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFBQSxNQUFNLGdCQUFnQixLQUFLLEtBQUssNERBQTREO0FBQzVGLE1BQU0sV0FBVyxLQUFLLEtBQUssK0JBQStCO0FBQzFELFNBQVMsWUFBWTtBQVlkLE1BQU0sU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZbEIsWUFBWSxRQUFhO0FBQ3JCLFNBQUssU0FBUztBQUFBLEVBQ2xCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTyxPQUFPLEtBQWEsT0FBc0I7QUFDN0MsU0FBSyxPQUFPLE9BQU8sS0FBSyxLQUFLO0FBQzdCLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFNBQWlDO0FBQ3BDLFdBQU8sS0FBSyxPQUFPLE9BQU87QUFBQSxFQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sc0JBQTRCO0FBQy9CLFNBQUssT0FBTyxvQkFBb0I7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxrQkFBMkI7QUFDOUIsV0FBTyxLQUFLLE9BQU8sZ0JBQWdCO0FBQUEsRUFDdkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxjQUFjLEtBQXNCO0FBQ3ZDLFdBQU8sS0FBSyxPQUFPLGNBQWMsR0FBRztBQUFBLEVBQ3hDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sSUFBSSxLQUFrQjtBQUN6QixXQUFPLEtBQUssT0FBTyxJQUFJLEdBQUc7QUFBQSxFQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sSUFBSSxLQUFhLE9BQWlCO0FBQ3JDLFdBQU8sS0FBSyxPQUFPLElBQUksS0FBSyxLQUFLO0FBQUEsRUFD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QUFDdEIsV0FBTyxLQUFLLE9BQU8sUUFBUTtBQUFBLEVBQy9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLE9BQWlCO0FBQ3BCLFVBQU0sV0FBVyxJQUFJLFNBQVMsS0FBSyxPQUFPLEtBQUssQ0FBQztBQUNoRCxZQUFRLFFBQVE7QUFDaEIsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sV0FBcUI7QUFDeEIsVUFBTSxXQUFXLElBQUksU0FBUyxLQUFLLE9BQU8sU0FBUyxDQUFDO0FBQ3BELFlBQVEsUUFBUTtBQUNoQixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxTQUFpQjtBQUNwQixXQUFPLEtBQUssT0FBTyxPQUFPO0FBQUEsRUFDOUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxLQUFLLFNBQTRCO0FBQ3BDLFVBQU0sTUFBTSxTQUFTLE9BQU87QUFDNUIsUUFBSSxDQUFDLEtBQUs7QUFDTixZQUFNLElBQUksTUFBTSx3Q0FBd0M7QUFBQSxJQUM1RDtBQUNBLFNBQUssT0FBTyxLQUFLLElBQUksTUFBTTtBQUMzQixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLE1BQU0sT0FBeUI7QUFDbEMsU0FBSyxPQUFPLE1BQU0sS0FBSztBQUN2QixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLElBQUksS0FBdUI7QUFDOUIsU0FBSyxPQUFPLElBQUksR0FBRztBQUNuQixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLElBQUksS0FBdUI7QUFDOUIsU0FBSyxPQUFPLElBQUksR0FBRztBQUNuQixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFFBQVEsU0FBMkI7QUFDdEMsU0FBSyxPQUFPLFFBQVEsU0FBUyxTQUFTLFlBQVk7QUFDbEQsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sT0FBZTtBQUNsQixXQUFPLEtBQUssT0FBTyxLQUFLO0FBQUEsRUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxLQUFLLGtCQUFvQztBQUM1QyxTQUFLLE9BQU8sS0FBSyxnQkFBZ0I7QUFDakMsV0FBTztBQUFBLEVBQ1g7QUFFSjsiLAogICJuYW1lcyI6IFtdCn0K