@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,470 @@
1
+ const globalEval = eval;
2
+ const allowedResultTypes = ["value", "path", "pointer", "parent", "parentProperty", "all"];
3
+ const { hasOwnProperty: hasOwnProp } = Object.prototype;
4
+ const moveToAnotherArray = function(source, target, conditionCb) {
5
+ const il = source.length;
6
+ for (let i = 0; i < il; i++) {
7
+ const item = source[i];
8
+ if (conditionCb(item)) {
9
+ target.push(source.splice(i--, 1)[0]);
10
+ }
11
+ }
12
+ };
13
+ const vm = {
14
+ /**
15
+ * @param {string} expr Expression to evaluate
16
+ * @param {Object} context Object whose items will be added to evaluation
17
+ * @returns {*} Result of evaluated code
18
+ */
19
+ runInNewContext(expr, context) {
20
+ const keys = Object.keys(context);
21
+ const funcs = [];
22
+ moveToAnotherArray(keys, funcs, (key) => {
23
+ return typeof context[key] === "function";
24
+ });
25
+ const code = funcs.reduce((s, func) => {
26
+ let fString = context[func].toString();
27
+ if (!/function/.exec(fString)) {
28
+ fString = "function " + fString;
29
+ }
30
+ return "var " + func + "=" + fString + ";" + s;
31
+ }, "") + keys.reduce((s, vr) => {
32
+ return "var " + vr + "=" + JSON.stringify(context[vr]).replace(
33
+ // http://www.thespanner.co.uk/2011/07/25/the-json-specification-is-now-wrong/
34
+ /\u2028|\u2029/g,
35
+ (m) => {
36
+ return "\\u202" + (m === "\u2028" ? "8" : "9");
37
+ }
38
+ ) + ";" + s;
39
+ }, expr);
40
+ return globalEval(code);
41
+ }
42
+ };
43
+ function push(arr, item) {
44
+ arr = arr.slice();
45
+ arr.push(item);
46
+ return arr;
47
+ }
48
+ function unshift(item, arr) {
49
+ arr = arr.slice();
50
+ arr.unshift(item);
51
+ return arr;
52
+ }
53
+ var NewError = function(value) {
54
+ const error = Error.call(this, 'JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)');
55
+ this.message = error.message;
56
+ this.stack = error.stack;
57
+ this.avoidNew = true;
58
+ this.value = value;
59
+ this.name = "NewError";
60
+ };
61
+ NewError.prototype = Object.create(Error.prototype);
62
+ NewError.prototype.constructor = NewError;
63
+ function JSONPath(opts, expr, obj, callback, otherTypeCallback) {
64
+ if (!(this instanceof JSONPath)) {
65
+ try {
66
+ return new JSONPath(opts, expr, obj, callback, otherTypeCallback);
67
+ } catch (e) {
68
+ if (!e.avoidNew) {
69
+ throw e;
70
+ }
71
+ return e.value;
72
+ }
73
+ }
74
+ if (typeof opts === "string") {
75
+ otherTypeCallback = callback;
76
+ callback = obj;
77
+ obj = expr;
78
+ expr = opts;
79
+ opts = {};
80
+ }
81
+ opts = opts || {};
82
+ const objArgs = hasOwnProp.call(opts, "json") && hasOwnProp.call(opts, "path");
83
+ this.json = opts.json || obj;
84
+ this.path = opts.path || expr;
85
+ this.resultType = opts.resultType && opts.resultType.toLowerCase() || "value";
86
+ this.flatten = opts.flatten || false;
87
+ this.wrap = hasOwnProp.call(opts, "wrap") ? opts.wrap : true;
88
+ this.sandbox = opts.sandbox || {};
89
+ this.preventEval = opts.preventEval || false;
90
+ this.parent = opts.parent || null;
91
+ this.parentProperty = opts.parentProperty || null;
92
+ this.callback = opts.callback || callback || null;
93
+ this.otherTypeCallback = opts.otherTypeCallback || otherTypeCallback || function() {
94
+ throw new Error("You must supply an otherTypeCallback callback option with the @other() operator.");
95
+ };
96
+ if (opts.autostart !== false) {
97
+ const ret = this.evaluate({
98
+ path: objArgs ? opts.path : expr,
99
+ json: objArgs ? opts.json : obj
100
+ });
101
+ if (!ret || typeof ret !== "object") {
102
+ throw new NewError(ret);
103
+ }
104
+ return ret;
105
+ }
106
+ }
107
+ JSONPath.prototype = Object.create(Object.prototype);
108
+ JSONPath.prototype.constructor = JSONPath;
109
+ JSONPath.prototype.evaluate = function(expr, json, callback, otherTypeCallback) {
110
+ const that = this;
111
+ let currParent = this.parent, currParentProperty = this.parentProperty;
112
+ let { flatten, wrap } = this;
113
+ this.currResultType = this.resultType;
114
+ this.currPreventEval = this.preventEval;
115
+ this.currSandbox = this.sandbox;
116
+ callback = callback || this.callback;
117
+ this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback;
118
+ json = json || this.json;
119
+ expr = expr || this.path;
120
+ if (expr && typeof expr === "object") {
121
+ if (!expr.path) {
122
+ throw new Error('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');
123
+ }
124
+ json = hasOwnProp.call(expr, "json") ? expr.json : json;
125
+ flatten = hasOwnProp.call(expr, "flatten") ? expr.flatten : flatten;
126
+ this.currResultType = hasOwnProp.call(expr, "resultType") ? expr.resultType : this.currResultType;
127
+ this.currSandbox = hasOwnProp.call(expr, "sandbox") ? expr.sandbox : this.currSandbox;
128
+ wrap = hasOwnProp.call(expr, "wrap") ? expr.wrap : wrap;
129
+ this.currPreventEval = hasOwnProp.call(expr, "preventEval") ? expr.preventEval : this.currPreventEval;
130
+ callback = hasOwnProp.call(expr, "callback") ? expr.callback : callback;
131
+ this.currOtherTypeCallback = hasOwnProp.call(expr, "otherTypeCallback") ? expr.otherTypeCallback : this.currOtherTypeCallback;
132
+ currParent = hasOwnProp.call(expr, "parent") ? expr.parent : currParent;
133
+ currParentProperty = hasOwnProp.call(expr, "parentProperty") ? expr.parentProperty : currParentProperty;
134
+ expr = expr.path;
135
+ }
136
+ currParent = currParent || null;
137
+ currParentProperty = currParentProperty || null;
138
+ if (Array.isArray(expr)) {
139
+ expr = JSONPath.toPathString(expr);
140
+ }
141
+ if (!expr || !json || allowedResultTypes.indexOf(this.currResultType) < 0) {
142
+ return void 0;
143
+ }
144
+ this._obj = json;
145
+ const exprList = JSONPath.toPathArray(expr);
146
+ if (exprList[0] === "$" && exprList.length > 1) {
147
+ exprList.shift();
148
+ }
149
+ this._hasParentSelector = null;
150
+ const result = this._trace(exprList, json, ["$"], currParent, currParentProperty, callback).filter(function(ea) {
151
+ return ea && !ea.isParentSelector;
152
+ });
153
+ if (!result.length) {
154
+ return wrap ? [] : void 0;
155
+ }
156
+ if (result.length === 1 && !wrap && !Array.isArray(result[0].value)) {
157
+ return this._getPreferredOutput(result[0]);
158
+ }
159
+ return result.reduce(function(rslt, ea) {
160
+ const valOrPath = that._getPreferredOutput(ea);
161
+ if (flatten && Array.isArray(valOrPath)) {
162
+ rslt = rslt.concat(valOrPath);
163
+ } else {
164
+ rslt.push(valOrPath);
165
+ }
166
+ return rslt;
167
+ }, []);
168
+ };
169
+ JSONPath.prototype._getPreferredOutput = function(ea) {
170
+ const resultType = this.currResultType;
171
+ switch (resultType) {
172
+ default:
173
+ throw new TypeError("Unknown result type");
174
+ case "all":
175
+ ea.pointer = JSONPath.toPointer(ea.path);
176
+ ea.path = typeof ea.path === "string" ? ea.path : JSONPath.toPathString(ea.path);
177
+ return ea;
178
+ case "value":
179
+ case "parent":
180
+ case "parentProperty":
181
+ return ea[resultType];
182
+ case "path":
183
+ return JSONPath.toPathString(ea[resultType]);
184
+ case "pointer":
185
+ return JSONPath.toPointer(ea.path);
186
+ }
187
+ };
188
+ JSONPath.prototype._handleCallback = function(fullRetObj, callback, type) {
189
+ if (callback) {
190
+ const preferredOutput = this._getPreferredOutput(fullRetObj);
191
+ fullRetObj.path = typeof fullRetObj.path === "string" ? fullRetObj.path : JSONPath.toPathString(fullRetObj.path);
192
+ callback(preferredOutput, type, fullRetObj);
193
+ }
194
+ };
195
+ JSONPath.prototype._trace = function(expr, val, path, parent, parentPropName, callback, literalPriority) {
196
+ let retObj;
197
+ const that = this;
198
+ if (!expr.length) {
199
+ retObj = { path, value: val, parent, parentProperty: parentPropName };
200
+ this._handleCallback(retObj, callback, "value");
201
+ return retObj;
202
+ }
203
+ const loc = expr[0], x = expr.slice(1);
204
+ const ret = [];
205
+ function addRet(elems) {
206
+ if (Array.isArray(elems)) {
207
+ elems.forEach((t) => {
208
+ ret.push(t);
209
+ });
210
+ } else {
211
+ ret.push(elems);
212
+ }
213
+ }
214
+ if ((typeof loc !== "string" || literalPriority) && val && hasOwnProp.call(val, loc)) {
215
+ addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback));
216
+ } else if (loc === "*") {
217
+ this._walk(loc, x, val, path, parent, parentPropName, callback, function(m, l, x2, v, p, par, pr, cb) {
218
+ addRet(that._trace(unshift(m, x2), v, p, par, pr, cb, true));
219
+ });
220
+ } else if (loc === "..") {
221
+ addRet(this._trace(x, val, path, parent, parentPropName, callback));
222
+ this._walk(loc, x, val, path, parent, parentPropName, callback, function(m, l, x2, v, p, par, pr, cb) {
223
+ if (typeof v[m] === "object") {
224
+ addRet(that._trace(unshift(l, x2), v[m], push(p, m), v, m, cb));
225
+ }
226
+ });
227
+ } else if (loc === "^") {
228
+ this._hasParentSelector = true;
229
+ return path.length ? {
230
+ path: path.slice(0, -1),
231
+ expr: x,
232
+ isParentSelector: true
233
+ } : [];
234
+ } else if (loc === "~") {
235
+ retObj = { path: push(path, loc), value: parentPropName, parent, parentProperty: null };
236
+ this._handleCallback(retObj, callback, "property");
237
+ return retObj;
238
+ } else if (loc === "$") {
239
+ addRet(this._trace(x, val, path, null, null, callback));
240
+ } else if (/^(-?\d*):(-?\d*):?(\d*)$/.test(loc)) {
241
+ addRet(this._slice(loc, x, val, path, parent, parentPropName, callback));
242
+ } else if (loc.indexOf("?(") === 0) {
243
+ if (this.currPreventEval) {
244
+ throw new Error("Eval [?(expr)] prevented in JSONPath expression.");
245
+ }
246
+ this._walk(loc, x, val, path, parent, parentPropName, callback, function(m, l, x2, v, p, par, pr, cb) {
247
+ if (that._eval(l.replace(/^\?\((.*?)\)$/, "$1"), v[m], m, p, par, pr)) {
248
+ addRet(that._trace(unshift(m, x2), v, p, par, pr, cb));
249
+ }
250
+ });
251
+ } else if (loc[0] === "(") {
252
+ if (this.currPreventEval) {
253
+ throw new Error("Eval [(expr)] prevented in JSONPath expression.");
254
+ }
255
+ addRet(this._trace(unshift(
256
+ this._eval(loc, val, path[path.length - 1], path.slice(0, -1), parent, parentPropName),
257
+ x
258
+ ), val, path, parent, parentPropName, callback));
259
+ } else if (loc[0] === "@") {
260
+ let addType = false;
261
+ const valueType = loc.slice(1, -2);
262
+ switch (valueType) {
263
+ default:
264
+ throw new TypeError("Unknown value type " + valueType);
265
+ case "scalar":
266
+ if (!val || ["object", "function"].indexOf(typeof val) < 0) {
267
+ addType = true;
268
+ }
269
+ break;
270
+ case "boolean":
271
+ case "string":
272
+ case "undefined":
273
+ case "function":
274
+ if (typeof val === valueType) {
275
+ addType = true;
276
+ }
277
+ break;
278
+ case "number":
279
+ if (typeof val === valueType && isFinite(val)) {
280
+ addType = true;
281
+ }
282
+ break;
283
+ case "nonFinite":
284
+ if (typeof val === "number" && !isFinite(val)) {
285
+ addType = true;
286
+ }
287
+ break;
288
+ case "object":
289
+ if (val && typeof val === valueType) {
290
+ addType = true;
291
+ }
292
+ break;
293
+ case "array":
294
+ if (Array.isArray(val)) {
295
+ addType = true;
296
+ }
297
+ break;
298
+ case "other":
299
+ addType = this.currOtherTypeCallback(val, path, parent, parentPropName);
300
+ break;
301
+ case "integer":
302
+ if (val === Number(val) && isFinite(val) && !(val % 1)) {
303
+ addType = true;
304
+ }
305
+ break;
306
+ case "null":
307
+ if (val === null) {
308
+ addType = true;
309
+ }
310
+ break;
311
+ }
312
+ if (addType) {
313
+ retObj = { path, value: val, parent, parentProperty: parentPropName };
314
+ this._handleCallback(retObj, callback, "value");
315
+ return retObj;
316
+ }
317
+ } else if (loc[0] === "`" && val && hasOwnProp.call(val, loc.slice(1))) {
318
+ const locProp = loc.slice(1);
319
+ addRet(this._trace(x, val[locProp], push(path, locProp), val, locProp, callback, true));
320
+ } else if (loc.indexOf(",") > -1) {
321
+ const parts = loc.split(",");
322
+ parts.forEach(function(part) {
323
+ addRet(this._trace(unshift(part, x), val, path, parent, parentPropName, callback));
324
+ }.bind(this));
325
+ } else if (!literalPriority && val && hasOwnProp.call(val, loc)) {
326
+ addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, true));
327
+ }
328
+ if (this._hasParentSelector) {
329
+ for (let t = 0; t < ret.length; t++) {
330
+ const rett = ret[t];
331
+ if (rett.isParentSelector) {
332
+ const tmp = that._trace(
333
+ rett.expr,
334
+ val,
335
+ rett.path,
336
+ parent,
337
+ parentPropName,
338
+ callback
339
+ );
340
+ if (Array.isArray(tmp)) {
341
+ ret[t] = tmp[0];
342
+ const tl = tmp.length;
343
+ for (let tt = 1; tt < tl; tt++) {
344
+ t++;
345
+ ret.splice(t, 0, tmp[tt]);
346
+ }
347
+ } else {
348
+ ret[t] = tmp;
349
+ }
350
+ }
351
+ }
352
+ }
353
+ return ret;
354
+ };
355
+ JSONPath.prototype._walk = function(loc, expr, val, path, parent, parentPropName, callback, f) {
356
+ if (Array.isArray(val)) {
357
+ const n = val.length;
358
+ for (let i = 0; i < n; i++) {
359
+ f(i, loc, expr, val, path, parent, parentPropName, callback);
360
+ }
361
+ } else if (typeof val === "object") {
362
+ for (var m in val) {
363
+ if (hasOwnProp.call(val, m)) {
364
+ f(m, loc, expr, val, path, parent, parentPropName, callback);
365
+ }
366
+ }
367
+ }
368
+ };
369
+ JSONPath.prototype._slice = function(loc, expr, val, path, parent, parentPropName, callback) {
370
+ if (!Array.isArray(val)) {
371
+ return void 0;
372
+ }
373
+ const len = val.length, parts = loc.split(":"), step = parts[2] && parseInt(parts[2]) || 1;
374
+ let start = parts[0] && parseInt(parts[0]) || 0, end = parts[1] && parseInt(parts[1]) || len;
375
+ start = start < 0 ? Math.max(0, start + len) : Math.min(len, start);
376
+ end = end < 0 ? Math.max(0, end + len) : Math.min(len, end);
377
+ const ret = [];
378
+ for (let i = start; i < end; i += step) {
379
+ let tmp = this._trace(unshift(i, expr), val, path, parent, parentPropName, callback);
380
+ if (Array.isArray(tmp)) {
381
+ tmp.forEach((t) => {
382
+ ret.push(t);
383
+ });
384
+ } else {
385
+ ret.push(tmp);
386
+ }
387
+ }
388
+ return ret;
389
+ };
390
+ JSONPath.prototype._eval = function(code, _v, _vname, path, parent, parentPropName) {
391
+ if (!this._obj || !_v) {
392
+ return false;
393
+ }
394
+ if (code.indexOf("@parentProperty") > -1) {
395
+ this.currSandbox._$_parentProperty = parentPropName;
396
+ code = code.replace(/@parentProperty/g, "_$_parentProperty");
397
+ }
398
+ if (code.indexOf("@parent") > -1) {
399
+ this.currSandbox._$_parent = parent;
400
+ code = code.replace(/@parent/g, "_$_parent");
401
+ }
402
+ if (code.indexOf("@property") > -1) {
403
+ this.currSandbox._$_property = _vname;
404
+ code = code.replace(/@property/g, "_$_property");
405
+ }
406
+ if (code.indexOf("@path") > -1) {
407
+ this.currSandbox._$_path = JSONPath.toPathString(path.concat([_vname]));
408
+ code = code.replace(/@path/g, "_$_path");
409
+ }
410
+ if (code.match(/@([.\s)[])/)) {
411
+ this.currSandbox._$_v = _v;
412
+ code = code.replace(/@([.\s)[])/g, "_$_v$1");
413
+ }
414
+ try {
415
+ return vm.runInNewContext(code, this.currSandbox);
416
+ } catch (e) {
417
+ console.log(e);
418
+ throw new Error("jsonPath: " + e.message + ": " + code);
419
+ }
420
+ };
421
+ JSONPath.cache = {};
422
+ JSONPath.toPathString = function(pathArr) {
423
+ const x = pathArr, n = x.length;
424
+ let p = "$";
425
+ for (let i = 1; i < n; i++) {
426
+ if (!/^(~|\^|@.*?\(\))$/.test(x[i])) {
427
+ p += /^[0-9*]+$/.test(x[i]) ? "[" + x[i] + "]" : "['" + x[i] + "']";
428
+ }
429
+ }
430
+ return p;
431
+ };
432
+ JSONPath.toPointer = function(pointer) {
433
+ const x = pointer, n = x.length;
434
+ let p = "";
435
+ for (let i = 1; i < n; i++) {
436
+ if (!/^(~|\^|@.*?\(\))$/.test(x[i])) {
437
+ p += "/" + x[i].toString().replace(/~/g, "~0").replace(/\//g, "~1");
438
+ }
439
+ }
440
+ return p;
441
+ };
442
+ JSONPath.toPathArray = function(expr) {
443
+ const { cache } = JSONPath;
444
+ if (cache[expr]) {
445
+ return cache[expr].concat();
446
+ }
447
+ const subx = [];
448
+ const normalized = expr.replace(
449
+ /@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\(\)/g,
450
+ ";$&;"
451
+ ).replace(/[['](\??\(.*?\))[\]']/g, function($0, $1) {
452
+ return "[#" + (subx.push($1) - 1) + "]";
453
+ }).replace(/\['([^'\]]*)'\]/g, function($0, prop) {
454
+ return "['" + prop.replace(/\./g, "%@%").replace(/~/g, "%%@@%%") + "']";
455
+ }).replace(/~/g, ";~;").replace(/'?\.'?(?![^[]*\])|\['?/g, ";").replace(/%@%/g, ".").replace(/%%@@%%/g, "~").replace(/(?:;)?(\^+)(?:;)?/g, function($0, ups) {
456
+ return ";" + ups.split("").join(";") + ";";
457
+ }).replace(/;;;|;;/g, ";..;").replace(/;$|'?\]|'$/g, "");
458
+ const exprList = normalized.split(";").map(function(exp) {
459
+ const match = exp.match(/#(\d+)/);
460
+ return !match || !match[1] ? exp : subx[match[1]];
461
+ });
462
+ cache[expr] = exprList;
463
+ return cache[expr];
464
+ };
465
+ var jsonpath_default = JSONPath;
466
+ export {
467
+ JSONPath,
468
+ jsonpath_default as default
469
+ };
470
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3V0aWxzL2pzb25wYXRoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKlxuKiBGb3JrZWQgZnJvbSBzb3VyY2UgcHVibGlzaGVkIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9zM3Ugd2l0aCBNSVRcbiogbGljZW5zZSBhcyBvZiA1LzMwLzIwMTkgYW5kIGFkYXB0ZWQgZm9yIERpcmlnaWJsZVxuKiBDb250cmlidXRvcnM6XG4qICAgczN1IChodHRwczovL2dpdGh1Yi5jb20vczN1KSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuKiAgIFNBUCAtIGFkYXB0ZWQgZm9yIERpcmlnaWJsZVxuKi9cbmNvbnN0IGdsb2JhbEV2YWwgPSBldmFsO1xuY29uc3QgYWxsb3dlZFJlc3VsdFR5cGVzID0gWyd2YWx1ZScsICdwYXRoJywgJ3BvaW50ZXInLCAncGFyZW50JywgJ3BhcmVudFByb3BlcnR5JywgJ2FsbCddO1xuY29uc3Qge2hhc093blByb3BlcnR5OiBoYXNPd25Qcm9wfSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ29weSBpdGVtcyBvdXQgb2Ygb25lIGFycmF5IGludG8gYW5vdGhlci5cbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBBcnJheSB3aXRoIGl0ZW1zIHRvIGNvcHlcbiAqIEBwYXJhbSB7QXJyYXl9IHRhcmdldCBBcnJheSB0byB3aGljaCB0byBjb3B5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25kaXRpb25DYiBDYWxsYmFjayBwYXNzZWQgdGhlIGN1cnJlbnQgaXRlbTsgd2lsbCBtb3ZlXG4gKiBpdGVtIGlmIGV2YWx1YXRlcyB0byBgdHJ1ZWBcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1vdmVUb0Fub3RoZXJBcnJheSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCwgY29uZGl0aW9uQ2IpIHtcbiAgICBjb25zdCBpbCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBzb3VyY2VbaV07XG4gICAgICAgIGlmIChjb25kaXRpb25DYihpdGVtKSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlLnNwbGljZShpLS0sIDEpWzBdKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmNvbnN0IHZtID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHIgRXhwcmVzc2lvbiB0byBldmFsdWF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCBPYmplY3Qgd2hvc2UgaXRlbXMgd2lsbCBiZSBhZGRlZCB0byBldmFsdWF0aW9uXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXN1bHQgb2YgZXZhbHVhdGVkIGNvZGVcbiAgICAgICAgICovXG4gICAgICAgIHJ1bkluTmV3Q29udGV4dCAoZXhwciwgY29udGV4dCkge1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbnRleHQpO1xuICAgICAgICAgICAgY29uc3QgZnVuY3MgPSBbXTtcbiAgICAgICAgICAgIG1vdmVUb0Fub3RoZXJBcnJheShrZXlzLCBmdW5jcywgKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgY29udGV4dFtrZXldID09PSAnZnVuY3Rpb24nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gZnVuY3MucmVkdWNlKChzLCBmdW5jKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGZTdHJpbmcgPSBjb250ZXh0W2Z1bmNdLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoL2Z1bmN0aW9uLykuZXhlYyhmU3RyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICBmU3RyaW5nID0gJ2Z1bmN0aW9uICcgKyBmU3RyaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJ3ZhciAnICsgZnVuYyArICc9JyArIGZTdHJpbmcgKyAnOycgKyBzO1xuICAgICAgICAgICAgfSwgJycpICsga2V5cy5yZWR1Y2UoKHMsIHZyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd2YXIgJyArIHZyICsgJz0nICsgSlNPTi5zdHJpbmdpZnkoY29udGV4dFt2cl0pLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudGhlc3Bhbm5lci5jby51ay8yMDExLzA3LzI1L3RoZS1qc29uLXNwZWNpZmljYXRpb24taXMtbm93LXdyb25nL1xuICAgICAgICAgICAgICAgICAgICAvXFx1MjAyOHxcXHUyMDI5L2csIChtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1xcXFx1MjAyJyArIChtID09PSAnXFx1MjAyOCcgPyAnOCcgOiAnOScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKSArICc7JyArIHM7XG4gICAgICAgICAgICB9LCBleHByKTtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxFdmFsKGNvZGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuLyoqXG4gKiBDb3BpZXMgYXJyYXkgYW5kIHRoZW4gcHVzaGVzIGl0ZW0gaW50byBpdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyciBBcnJheSB0byBjb3B5IGFuZCBpbnRvIHdoaWNoIHRvIHB1c2hcbiAqIEBwYXJhbSB7Kn0gaXRlbSBBcnJheSBpdGVtIHRvIGFkZCAodG8gZW5kKVxuICogQHJldHVybnMge0FycmF5fSBDb3B5IG9mIHRoZSBvcmlnaW5hbCBhcnJheVxuICovXG5mdW5jdGlvbiBwdXNoIChhcnIsIGl0ZW0pIHtcbiAgICBhcnIgPSBhcnIuc2xpY2UoKTtcbiAgICBhcnIucHVzaChpdGVtKTtcbiAgICByZXR1cm4gYXJyO1xufVxuLyoqXG4gKiBDb3BpZXMgYXJyYXkgYW5kIHRoZW4gdW5zaGlmdHMgaXRlbSBpbnRvIGl0LlxuICogQHBhcmFtIHsqfSBpdGVtIEFycmF5IGl0ZW0gdG8gYWRkICh0byBiZWdpbm5pbmcpXG4gKiBAcGFyYW0ge0FycmF5fSBhcnIgQXJyYXkgdG8gY29weSBhbmQgaW50byB3aGljaCB0byB1bnNoaWZ0XG4gKiBAcmV0dXJucyB7QXJyYXl9IENvcHkgb2YgdGhlIG9yaWdpbmFsIGFycmF5XG4gKi9cbmZ1bmN0aW9uIHVuc2hpZnQgKGl0ZW0sIGFycikge1xuICAgIGFyciA9IGFyci5zbGljZSgpO1xuICAgIGFyci51bnNoaWZ0KGl0ZW0pO1xuICAgIHJldHVybiBhcnI7XG59XG5cbi8qKlxuICogQ2F1Z2h0IHdoZW4gSlNPTlBhdGggaXMgdXNlZCB3aXRob3V0IGBuZXdgIGJ1dCByZXRocm93biBpZiB3aXRoIGBuZXdgXG4gKiBAZXh0ZW5kcyBFcnJvclxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgZXZhbHVhdGVkIHNjYWxhciB2YWx1ZVxuICovXG52YXIgTmV3RXJyb3IgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBjb25zdCBlcnJvciA9IEVycm9yLmNhbGwodGhpcywgJ0pTT05QYXRoIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggXCJuZXdcIiAoaXQgcHJldmVudHMgcmV0dXJuIG9mICh1bndyYXBwZWQpIHNjYWxhciB2YWx1ZXMpJyk7XG4gICAgdGhpcy5tZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICB0aGlzLnN0YWNrID0gZXJyb3Iuc3RhY2s7XG4gICAgdGhpcy5hdm9pZE5ldyA9IHRydWU7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubmFtZSA9ICdOZXdFcnJvcic7XG59XG5OZXdFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5OZXdFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBOZXdFcnJvcjtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIElmIHByZXNlbnQsIG11c3QgYmUgYW4gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwciBKU09OIHBhdGggdG8gZXZhbHVhdGVcbiAqIEBwYXJhbSB7SlNPTn0gb2JqIEpTT04gb2JqZWN0IHRvIGV2YWx1YXRlIGFnYWluc3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFBhc3NlZCAzIGFyZ3VtZW50czogMSkgZGVzaXJlZCBwYXlsb2FkIHBlciBgcmVzdWx0VHlwZWAsXG4gKiAgICAgMikgYFwidmFsdWVcInxcInByb3BlcnR5XCJgLCAzKSBGdWxsIHJldHVybmVkIG9iamVjdCB3aXRoIGFsbCBwYXlsb2Fkc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gb3RoZXJUeXBlQ2FsbGJhY2sgSWYgYEBvdGhlcigpYCBpcyBhdCB0aGUgZW5kIG9mIG9uZSdzIHF1ZXJ5LCB0aGlzXG4gKiAgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBpdGVtLCBpdHMgcGF0aCwgaXRzIHBhcmVudCwgYW5kIGl0cyBwYXJlbnQnc1xuICogIHByb3BlcnR5IG5hbWUsIGFuZCBpdCBzaG91bGQgcmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHN1cHBsaWVkIHZhbHVlXG4gKiAgYmVsb25ncyB0byB0aGUgXCJvdGhlclwiIHR5cGUgb3Igbm90IChvciBpdCBtYXkgaGFuZGxlIHRyYW5zZm9ybWF0aW9ucyBhbmQgcmV0dXJuIGBmYWxzZWApLlxuICogQHJldHVybnMge0pTT05QYXRofVxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBKU09OUGF0aCAob3B0cywgZXhwciwgb2JqLCBjYWxsYmFjaywgb3RoZXJUeXBlQ2FsbGJhY2spOiB2b2lkIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSlNPTlBhdGgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEpTT05QYXRoKG9wdHMsIGV4cHIsIG9iaiwgY2FsbGJhY2ssIG90aGVyVHlwZUNhbGxiYWNrKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKCFlLmF2b2lkTmV3KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlLnZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnc3RyaW5nJykge1xuICAgICAgICBvdGhlclR5cGVDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICBjYWxsYmFjayA9IG9iajtcbiAgICAgICAgb2JqID0gZXhwcjtcbiAgICAgICAgZXhwciA9IG9wdHM7XG4gICAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgY29uc3Qgb2JqQXJncyA9IGhhc093blByb3AuY2FsbChvcHRzLCAnanNvbicpICYmIGhhc093blByb3AuY2FsbChvcHRzLCAncGF0aCcpO1xuICAgIHRoaXMuanNvbiA9IG9wdHMuanNvbiB8fCBvYmo7XG4gICAgdGhpcy5wYXRoID0gb3B0cy5wYXRoIHx8IGV4cHI7XG4gICAgdGhpcy5yZXN1bHRUeXBlID0gKG9wdHMucmVzdWx0VHlwZSAmJiBvcHRzLnJlc3VsdFR5cGUudG9Mb3dlckNhc2UoKSkgfHwgJ3ZhbHVlJztcbiAgICB0aGlzLmZsYXR0ZW4gPSBvcHRzLmZsYXR0ZW4gfHwgZmFsc2U7XG4gICAgdGhpcy53cmFwID0gaGFzT3duUHJvcC5jYWxsKG9wdHMsICd3cmFwJykgPyBvcHRzLndyYXAgOiB0cnVlO1xuICAgIHRoaXMuc2FuZGJveCA9IG9wdHMuc2FuZGJveCB8fCB7fTtcbiAgICB0aGlzLnByZXZlbnRFdmFsID0gb3B0cy5wcmV2ZW50RXZhbCB8fCBmYWxzZTtcbiAgICB0aGlzLnBhcmVudCA9IG9wdHMucGFyZW50IHx8IG51bGw7XG4gICAgdGhpcy5wYXJlbnRQcm9wZXJ0eSA9IG9wdHMucGFyZW50UHJvcGVydHkgfHwgbnVsbDtcbiAgICB0aGlzLmNhbGxiYWNrID0gb3B0cy5jYWxsYmFjayB8fCBjYWxsYmFjayB8fCBudWxsO1xuICAgIHRoaXMub3RoZXJUeXBlQ2FsbGJhY2sgPSBvcHRzLm90aGVyVHlwZUNhbGxiYWNrIHx8IG90aGVyVHlwZUNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYW4gb3RoZXJUeXBlQ2FsbGJhY2sgY2FsbGJhY2sgb3B0aW9uIHdpdGggdGhlIEBvdGhlcigpIG9wZXJhdG9yLicpO1xuICAgIH07XG5cbiAgICBpZiAob3B0cy5hdXRvc3RhcnQgIT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IHRoaXMuZXZhbHVhdGUoe1xuICAgICAgICAgICAgcGF0aDogKG9iakFyZ3MgPyBvcHRzLnBhdGggOiBleHByKSxcbiAgICAgICAgICAgIGpzb246IChvYmpBcmdzID8gb3B0cy5qc29uIDogb2JqKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXQgfHwgdHlwZW9mIHJldCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOZXdFcnJvcihyZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxufVxuSlNPTlBhdGgucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShPYmplY3QucHJvdG90eXBlKTtcbkpTT05QYXRoLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEpTT05QYXRoO1xuXG4vLyBQVUJMSUMgTUVUSE9EU1xuSlNPTlBhdGgucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKGV4cHIsIGpzb24sIGNhbGxiYWNrLCBvdGhlclR5cGVDYWxsYmFjaykge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIGxldCBjdXJyUGFyZW50ID0gdGhpcy5wYXJlbnQsXG4gICAgICAgIGN1cnJQYXJlbnRQcm9wZXJ0eSA9IHRoaXMucGFyZW50UHJvcGVydHk7XG4gICAgbGV0IHtmbGF0dGVuLCB3cmFwfSA9IHRoaXM7XG5cbiAgICB0aGlzLmN1cnJSZXN1bHRUeXBlID0gdGhpcy5yZXN1bHRUeXBlO1xuICAgIHRoaXMuY3VyclByZXZlbnRFdmFsID0gdGhpcy5wcmV2ZW50RXZhbDtcbiAgICB0aGlzLmN1cnJTYW5kYm94ID0gdGhpcy5zYW5kYm94O1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgdGhpcy5jYWxsYmFjaztcbiAgICB0aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjayA9IG90aGVyVHlwZUNhbGxiYWNrIHx8IHRoaXMub3RoZXJUeXBlQ2FsbGJhY2s7XG5cbiAgICBqc29uID0ganNvbiB8fCB0aGlzLmpzb247XG4gICAgZXhwciA9IGV4cHIgfHwgdGhpcy5wYXRoO1xuICAgIGlmIChleHByICYmIHR5cGVvZiBleHByID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoIWV4cHIucGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSBcInBhdGhcIiBwcm9wZXJ0eSB3aGVuIHByb3ZpZGluZyBhbiBvYmplY3QgYXJndW1lbnQgdG8gSlNPTlBhdGguZXZhbHVhdGUoKS4nKTtcbiAgICAgICAgfVxuICAgICAgICBqc29uID0gaGFzT3duUHJvcC5jYWxsKGV4cHIsICdqc29uJykgPyBleHByLmpzb24gOiBqc29uO1xuICAgICAgICBmbGF0dGVuID0gaGFzT3duUHJvcC5jYWxsKGV4cHIsICdmbGF0dGVuJykgPyBleHByLmZsYXR0ZW4gOiBmbGF0dGVuO1xuICAgICAgICB0aGlzLmN1cnJSZXN1bHRUeXBlID0gaGFzT3duUHJvcC5jYWxsKGV4cHIsICdyZXN1bHRUeXBlJykgPyBleHByLnJlc3VsdFR5cGUgOiB0aGlzLmN1cnJSZXN1bHRUeXBlO1xuICAgICAgICB0aGlzLmN1cnJTYW5kYm94ID0gaGFzT3duUHJvcC5jYWxsKGV4cHIsICdzYW5kYm94JykgPyBleHByLnNhbmRib3ggOiB0aGlzLmN1cnJTYW5kYm94O1xuICAgICAgICB3cmFwID0gaGFzT3duUHJvcC5jYWxsKGV4cHIsICd3cmFwJykgPyBleHByLndyYXAgOiB3cmFwO1xuICAgICAgICB0aGlzLmN1cnJQcmV2ZW50RXZhbCA9IGhhc093blByb3AuY2FsbChleHByLCAncHJldmVudEV2YWwnKSA/IGV4cHIucHJldmVudEV2YWwgOiB0aGlzLmN1cnJQcmV2ZW50RXZhbDtcbiAgICAgICAgY2FsbGJhY2sgPSBoYXNPd25Qcm9wLmNhbGwoZXhwciwgJ2NhbGxiYWNrJykgPyBleHByLmNhbGxiYWNrIDogY2FsbGJhY2s7XG4gICAgICAgIHRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrID0gaGFzT3duUHJvcC5jYWxsKGV4cHIsICdvdGhlclR5cGVDYWxsYmFjaycpID8gZXhwci5vdGhlclR5cGVDYWxsYmFjayA6IHRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrO1xuICAgICAgICBjdXJyUGFyZW50ID0gaGFzT3duUHJvcC5jYWxsKGV4cHIsICdwYXJlbnQnKSA/IGV4cHIucGFyZW50IDogY3VyclBhcmVudDtcbiAgICAgICAgY3VyclBhcmVudFByb3BlcnR5ID0gaGFzT3duUHJvcC5jYWxsKGV4cHIsICdwYXJlbnRQcm9wZXJ0eScpID8gZXhwci5wYXJlbnRQcm9wZXJ0eSA6IGN1cnJQYXJlbnRQcm9wZXJ0eTtcbiAgICAgICAgZXhwciA9IGV4cHIucGF0aDtcbiAgICB9XG4gICAgY3VyclBhcmVudCA9IGN1cnJQYXJlbnQgfHwgbnVsbDtcbiAgICBjdXJyUGFyZW50UHJvcGVydHkgPSBjdXJyUGFyZW50UHJvcGVydHkgfHwgbnVsbDtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKSB7XG4gICAgICAgIGV4cHIgPSBKU09OUGF0aC50b1BhdGhTdHJpbmcoZXhwcik7XG4gICAgfVxuICAgIGlmICghZXhwciB8fCAhanNvbiB8fCBhbGxvd2VkUmVzdWx0VHlwZXMuaW5kZXhPZih0aGlzLmN1cnJSZXN1bHRUeXBlKTwwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuX29iaiA9IGpzb247XG5cbiAgICBjb25zdCBleHByTGlzdCA9IEpTT05QYXRoLnRvUGF0aEFycmF5KGV4cHIpO1xuICAgIGlmIChleHByTGlzdFswXSA9PT0gJyQnICYmIGV4cHJMaXN0Lmxlbmd0aCA+IDEpIHsgZXhwckxpc3Quc2hpZnQoKTsgfVxuICAgIHRoaXMuX2hhc1BhcmVudFNlbGVjdG9yID0gbnVsbDtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzXG4gICAgICAgIC5fdHJhY2UoZXhwckxpc3QsIGpzb24sIFsnJCddLCBjdXJyUGFyZW50LCBjdXJyUGFyZW50UHJvcGVydHksIGNhbGxiYWNrKVxuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChlYSkgeyByZXR1cm4gZWEgJiYgIWVhLmlzUGFyZW50U2VsZWN0b3I7IH0pO1xuXG4gICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7IHJldHVybiB3cmFwID8gW10gOiB1bmRlZmluZWQ7IH1cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMSAmJiAhd3JhcCAmJiAhQXJyYXkuaXNBcnJheShyZXN1bHRbMF0udmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQcmVmZXJyZWRPdXRwdXQocmVzdWx0WzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5yZWR1Y2UoZnVuY3Rpb24gKHJzbHQsIGVhKSB7XG4gICAgICAgIGNvbnN0IHZhbE9yUGF0aCA9IHRoYXQuX2dldFByZWZlcnJlZE91dHB1dChlYSk7XG4gICAgICAgIGlmIChmbGF0dGVuICYmIEFycmF5LmlzQXJyYXkodmFsT3JQYXRoKSkge1xuICAgICAgICAgICAgcnNsdCA9IHJzbHQuY29uY2F0KHZhbE9yUGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByc2x0LnB1c2godmFsT3JQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnNsdDtcbiAgICB9LCBbXSk7XG59O1xuXG4vLyBQUklWQVRFIE1FVEhPRFNcblxuSlNPTlBhdGgucHJvdG90eXBlLl9nZXRQcmVmZXJyZWRPdXRwdXQgPSBmdW5jdGlvbiAoZWEpIHtcbiAgICBjb25zdCByZXN1bHRUeXBlID0gdGhpcy5jdXJyUmVzdWx0VHlwZTtcbiAgICBzd2l0Y2ggKHJlc3VsdFR5cGUpIHtcbiAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIHJlc3VsdCB0eXBlJyk7XG4gICAgY2FzZSAnYWxsJzpcbiAgICAgICAgZWEucG9pbnRlciA9IEpTT05QYXRoLnRvUG9pbnRlcihlYS5wYXRoKTtcbiAgICAgICAgZWEucGF0aCA9IHR5cGVvZiBlYS5wYXRoID09PSAnc3RyaW5nJyA/IGVhLnBhdGggOiBKU09OUGF0aC50b1BhdGhTdHJpbmcoZWEucGF0aCk7XG4gICAgICAgIHJldHVybiBlYTtcbiAgICBjYXNlICd2YWx1ZSc6IGNhc2UgJ3BhcmVudCc6IGNhc2UgJ3BhcmVudFByb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIGVhW3Jlc3VsdFR5cGVdO1xuICAgIGNhc2UgJ3BhdGgnOlxuICAgICAgICByZXR1cm4gSlNPTlBhdGgudG9QYXRoU3RyaW5nKGVhW3Jlc3VsdFR5cGVdKTtcbiAgICBjYXNlICdwb2ludGVyJzpcbiAgICAgICAgcmV0dXJuIEpTT05QYXRoLnRvUG9pbnRlcihlYS5wYXRoKTtcbiAgICB9XG59O1xuXG5KU09OUGF0aC5wcm90b3R5cGUuX2hhbmRsZUNhbGxiYWNrID0gZnVuY3Rpb24gKGZ1bGxSZXRPYmosIGNhbGxiYWNrLCB0eXBlKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHByZWZlcnJlZE91dHB1dCA9IHRoaXMuX2dldFByZWZlcnJlZE91dHB1dChmdWxsUmV0T2JqKTtcbiAgICAgICAgZnVsbFJldE9iai5wYXRoID0gdHlwZW9mIGZ1bGxSZXRPYmoucGF0aCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gZnVsbFJldE9iai5wYXRoXG4gICAgICAgICAgICA6IEpTT05QYXRoLnRvUGF0aFN0cmluZyhmdWxsUmV0T2JqLnBhdGgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FsbGJhY2stcmV0dXJuXG4gICAgICAgIGNhbGxiYWNrKHByZWZlcnJlZE91dHB1dCwgdHlwZSwgZnVsbFJldE9iaik7XG4gICAgfVxufTtcblxuSlNPTlBhdGgucHJvdG90eXBlLl90cmFjZSA9IGZ1bmN0aW9uIChcbiAgICBleHByLCB2YWwsIHBhdGgsIHBhcmVudCwgcGFyZW50UHJvcE5hbWUsIGNhbGxiYWNrLCBsaXRlcmFsUHJpb3JpdHlcbikge1xuICAgIC8vIE5vIGV4cHIgdG8gZm9sbG93PyByZXR1cm4gcGF0aCBhbmQgdmFsdWUgYXMgdGhlIHJlc3VsdCBvZiB0aGlzIHRyYWNlIGJyYW5jaFxuICAgIGxldCByZXRPYmo7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgaWYgKCFleHByLmxlbmd0aCkge1xuICAgICAgICByZXRPYmogPSB7cGF0aDogcGF0aCwgdmFsdWU6IHZhbCwgcGFyZW50OiBwYXJlbnQsIHBhcmVudFByb3BlcnR5OiBwYXJlbnRQcm9wTmFtZX07XG4gICAgICAgIHRoaXMuX2hhbmRsZUNhbGxiYWNrKHJldE9iaiwgY2FsbGJhY2ssICd2YWx1ZScpO1xuICAgICAgICByZXR1cm4gcmV0T2JqO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYyA9IGV4cHJbMF0sIHggPSBleHByLnNsaWNlKDEpO1xuXG4gICAgLy8gV2UgbmVlZCB0byBnYXRoZXIgdGhlIHJldHVybiB2YWx1ZSBvZiByZWN1cnNpdmUgdHJhY2UgY2FsbHMgaW4gb3JkZXIgdG9cbiAgICAvLyBkbyB0aGUgcGFyZW50IHNlbCBjb21wdXRhdGlvbi5cbiAgICBjb25zdCByZXQgPSBbXTtcbiAgICBmdW5jdGlvbiBhZGRSZXQgKGVsZW1zKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVsZW1zKSkge1xuICAgICAgICAgICAgLy8gVGhpcyB3YXMgY2F1c2luZyBleGNlc3NpdmUgc3RhY2sgc2l6ZSBpbiBOb2RlICh3aXRoIG9yIHdpdGhvdXQgQmFiZWwpIGFnYWluc3Qgb3VyIHBlcmZvcm1hbmNlIHRlc3Q6IGByZXQucHVzaCguLi5lbGVtcyk7YFxuICAgICAgICAgICAgZWxlbXMuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldC5wdXNoKHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXQucHVzaChlbGVtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKHR5cGVvZiBsb2MgIT09ICdzdHJpbmcnIHx8IGxpdGVyYWxQcmlvcml0eSkgJiYgdmFsICYmXG4gICAgICAgIGhhc093blByb3AuY2FsbCh2YWwsIGxvYylcbiAgICApIHsgLy8gc2ltcGxlIGNhc2UtLWRpcmVjdGx5IGZvbGxvdyBwcm9wZXJ0eVxuICAgICAgICBhZGRSZXQodGhpcy5fdHJhY2UoeCwgdmFsW2xvY10sIHB1c2gocGF0aCwgbG9jKSwgdmFsLCBsb2MsIGNhbGxiYWNrKSk7XG4gICAgfSBlbHNlIGlmIChsb2MgPT09ICcqJykgeyAvLyBhbGwgY2hpbGQgcHJvcGVydGllc1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgICAgIHRoaXMuX3dhbGsobG9jLCB4LCB2YWwsIHBhdGgsIHBhcmVudCwgcGFyZW50UHJvcE5hbWUsIGNhbGxiYWNrLCBmdW5jdGlvbiAobSwgbCwgeCwgdiwgcCwgcGFyLCBwciwgY2IpIHtcbiAgICAgICAgICAgIGFkZFJldCh0aGF0Ll90cmFjZSh1bnNoaWZ0KG0sIHgpLCB2LCBwLCBwYXIsIHByLCBjYiwgdHJ1ZSkpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGxvYyA9PT0gJy4uJykgeyAvLyBhbGwgZGVzY2VuZGVudCBwYXJlbnQgcHJvcGVydGllc1xuICAgICAgICBhZGRSZXQodGhpcy5fdHJhY2UoeCwgdmFsLCBwYXRoLCBwYXJlbnQsIHBhcmVudFByb3BOYW1lLCBjYWxsYmFjaykpOyAvLyBDaGVjayByZW1haW5pbmcgZXhwcmVzc2lvbiB3aXRoIHZhbCdzIGltbWVkaWF0ZSBjaGlsZHJlblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgICAgIHRoaXMuX3dhbGsobG9jLCB4LCB2YWwsIHBhdGgsIHBhcmVudCwgcGFyZW50UHJvcE5hbWUsIGNhbGxiYWNrLCBmdW5jdGlvbiAobSwgbCwgeCwgdiwgcCwgcGFyLCBwciwgY2IpIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IGpvaW4gbSBhbmQgeCBoZXJlIGJlY2F1c2Ugd2Ugb25seSB3YW50IHBhcmVudHMsIG5vdCBzY2FsYXIgdmFsdWVzXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZbbV0gPT09ICdvYmplY3QnKSB7IC8vIEtlZXAgZ29pbmcgd2l0aCByZWN1cnNpdmUgZGVzY2VudCBvbiB2YWwncyBvYmplY3QgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBhZGRSZXQodGhhdC5fdHJhY2UodW5zaGlmdChsLCB4KSwgdlttXSwgcHVzaChwLCBtKSwgdiwgbSwgY2IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgLy8gVGhlIHBhcmVudCBzZWwgY29tcHV0YXRpb24gaXMgaGFuZGxlZCBpbiB0aGUgZnJhbWUgYWJvdmUgdXNpbmcgdGhlXG4gICAgLy8gYW5jZXN0b3Igb2JqZWN0IG9mIHZhbFxuICAgIH0gZWxzZSBpZiAobG9jID09PSAnXicpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBmaW5hbCBlbmRwb2ludCwgc28gd2UgZG8gbm90IGludm9rZSB0aGUgY2FsbGJhY2sgaGVyZVxuICAgICAgICB0aGlzLl9oYXNQYXJlbnRTZWxlY3RvciA9IHRydWU7XG4gICAgICAgIHJldHVybiBwYXRoLmxlbmd0aFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgcGF0aDogcGF0aC5zbGljZSgwLCAtMSksXG4gICAgICAgICAgICAgICAgZXhwcjogeCxcbiAgICAgICAgICAgICAgICBpc1BhcmVudFNlbGVjdG9yOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IFtdO1xuICAgIH0gZWxzZSBpZiAobG9jID09PSAnficpIHsgLy8gcHJvcGVydHkgbmFtZVxuICAgICAgICByZXRPYmogPSB7cGF0aDogcHVzaChwYXRoLCBsb2MpLCB2YWx1ZTogcGFyZW50UHJvcE5hbWUsIHBhcmVudDpwYXJlbnQsIHBhcmVudFByb3BlcnR5OiBudWxsfTtcbiAgICAgICAgdGhpcy5faGFuZGxlQ2FsbGJhY2socmV0T2JqLCBjYWxsYmFjaywgJ3Byb3BlcnR5Jyk7XG4gICAgICAgIHJldHVybiByZXRPYmo7XG4gICAgfSBlbHNlIGlmIChsb2MgPT09ICckJykgeyAvLyByb290IG9ubHlcbiAgICAgICAgYWRkUmV0KHRoaXMuX3RyYWNlKHgsIHZhbCwgcGF0aCwgbnVsbCwgbnVsbCwgY2FsbGJhY2spKTtcbiAgICB9IGVsc2UgaWYgKCgvXigtP1xcZCopOigtP1xcZCopOj8oXFxkKikkLykudGVzdChsb2MpKSB7IC8vIFtzdGFydDplbmQ6c3RlcF0gIFB5dGhvbiBzbGljZSBzeW50YXhcbiAgICAgICAgYWRkUmV0KHRoaXMuX3NsaWNlKGxvYywgeCwgdmFsLCBwYXRoLCBwYXJlbnQsIHBhcmVudFByb3BOYW1lLCBjYWxsYmFjaykpO1xuICAgIH0gZWxzZSBpZiAobG9jLmluZGV4T2YoJz8oJykgPT09IDApIHsgLy8gWz8oZXhwcildIChmaWx0ZXJpbmcpXG4gICAgICAgIGlmICh0aGlzLmN1cnJQcmV2ZW50RXZhbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFdmFsIFs/KGV4cHIpXSBwcmV2ZW50ZWQgaW4gSlNPTlBhdGggZXhwcmVzc2lvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgICAgIHRoaXMuX3dhbGsobG9jLCB4LCB2YWwsIHBhdGgsIHBhcmVudCwgcGFyZW50UHJvcE5hbWUsIGNhbGxiYWNrLCBmdW5jdGlvbiAobSwgbCwgeCwgdiwgcCwgcGFyLCBwciwgY2IpIHtcbiAgICAgICAgICAgIGlmICh0aGF0Ll9ldmFsKGwucmVwbGFjZSgvXlxcP1xcKCguKj8pXFwpJC8sICckMScpLCB2W21dLCBtLCBwLCBwYXIsIHByKSkge1xuICAgICAgICAgICAgICAgIGFkZFJldCh0aGF0Ll90cmFjZSh1bnNoaWZ0KG0sIHgpLCB2LCBwLCBwYXIsIHByLCBjYikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGxvY1swXSA9PT0gJygnKSB7IC8vIFsoZXhwcildIChkeW5hbWljIHByb3BlcnR5L2luZGV4KVxuICAgICAgICBpZiAodGhpcy5jdXJyUHJldmVudEV2YWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXZhbCBbKGV4cHIpXSBwcmV2ZW50ZWQgaW4gSlNPTlBhdGggZXhwcmVzc2lvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcyB0aGlzIHdpbGwgcmVzb2x2ZSB0byBhIHByb3BlcnR5IG5hbWUgKGJ1dCB3ZSBkb24ndCBrbm93IGl0IHlldCksIHByb3BlcnR5IGFuZCBwYXJlbnQgaW5mb3JtYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBvZiB0aGUgcHJvcGVydHkgdG8gd2hpY2ggdGhpcyBleHByZXNzaW9uIHdpbGwgcmVzb2x2ZVxuICAgICAgICBhZGRSZXQodGhpcy5fdHJhY2UodW5zaGlmdChcbiAgICAgICAgICAgIHRoaXMuX2V2YWwobG9jLCB2YWwsIHBhdGhbcGF0aC5sZW5ndGggLSAxXSwgcGF0aC5zbGljZSgwLCAtMSksIHBhcmVudCwgcGFyZW50UHJvcE5hbWUpLFxuICAgICAgICAgICAgeFxuICAgICAgICApLCB2YWwsIHBhdGgsIHBhcmVudCwgcGFyZW50UHJvcE5hbWUsIGNhbGxiYWNrKSk7XG4gICAgfSBlbHNlIGlmIChsb2NbMF0gPT09ICdAJykgeyAvLyB2YWx1ZSB0eXBlOiBAYm9vbGVhbigpLCBldGMuXG4gICAgICAgIGxldCBhZGRUeXBlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGxvYy5zbGljZSgxLCAtMik7XG4gICAgICAgIHN3aXRjaCAodmFsdWVUeXBlKSB7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIHZhbHVlIHR5cGUgJyArIHZhbHVlVHlwZSk7XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgICAgICBpZiAoIXZhbCB8fCAoWydvYmplY3QnLCAnZnVuY3Rpb24nXS5pbmRleE9mKHR5cGVvZiB2YWwpPDApKSB7XG4gICAgICAgICAgICAgICAgYWRkVHlwZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6IGNhc2UgJ3N0cmluZyc6IGNhc2UgJ3VuZGVmaW5lZCc6IGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSB2YWx1ZVR5cGUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSB2YWxpZC10eXBlb2ZcbiAgICAgICAgICAgICAgICBhZGRUeXBlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IHZhbHVlVHlwZSAmJiBpc0Zpbml0ZSh2YWwpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdmFsaWQtdHlwZW9mXG4gICAgICAgICAgICAgICAgYWRkVHlwZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbm9uRmluaXRlJzpcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNGaW5pdGUodmFsKSkge1xuICAgICAgICAgICAgICAgIGFkZFR5cGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09IHZhbHVlVHlwZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHZhbGlkLXR5cGVvZlxuICAgICAgICAgICAgICAgIGFkZFR5cGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgICAgICBhZGRUeXBlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdvdGhlcic6XG4gICAgICAgICAgICBhZGRUeXBlID0gdGhpcy5jdXJyT3RoZXJUeXBlQ2FsbGJhY2sodmFsLCBwYXRoLCBwYXJlbnQsIHBhcmVudFByb3BOYW1lKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgICAgICAgIGlmICh2YWwgPT09IE51bWJlcih2YWwpICYmIGlzRmluaXRlKHZhbCkgJiYgISh2YWwgJSAxKSkge1xuICAgICAgICAgICAgICAgIGFkZFR5cGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGFkZFR5cGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFkZFR5cGUpIHtcbiAgICAgICAgICAgIHJldE9iaiA9IHtwYXRoOiBwYXRoLCB2YWx1ZTogdmFsLCBwYXJlbnQ6IHBhcmVudCwgcGFyZW50UHJvcGVydHk6IHBhcmVudFByb3BOYW1lfTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUNhbGxiYWNrKHJldE9iaiwgY2FsbGJhY2ssICd2YWx1ZScpO1xuICAgICAgICAgICAgcmV0dXJuIHJldE9iajtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAobG9jWzBdID09PSAnYCcgJiYgdmFsICYmIGhhc093blByb3AuY2FsbCh2YWwsIGxvYy5zbGljZSgxKSkpIHsgLy8gYC1lc2NhcGVkIHByb3BlcnR5XG4gICAgICAgIGNvbnN0IGxvY1Byb3AgPSBsb2Muc2xpY2UoMSk7XG4gICAgICAgIGFkZFJldCh0aGlzLl90cmFjZSh4LCB2YWxbbG9jUHJvcF0sIHB1c2gocGF0aCwgbG9jUHJvcCksIHZhbCwgbG9jUHJvcCwgY2FsbGJhY2ssIHRydWUpKTtcbiAgICB9IGVsc2UgaWYgKGxvYy5pbmRleE9mKCcsJyk+LTEpIHsgLy8gW25hbWUxLG5hbWUyLC4uLl1cbiAgICAgICAgY29uc3QgcGFydHMgPSBsb2Muc3BsaXQoJywnKTtcbiAgICAgICAgcGFydHMuZm9yRWFjaChmdW5jdGlvbihwYXJ0KXtcbiAgICAgICAgICAgIGFkZFJldCh0aGlzLl90cmFjZSh1bnNoaWZ0KHBhcnQsIHgpLCB2YWwsIHBhdGgsIHBhcmVudCwgcGFyZW50UHJvcE5hbWUsIGNhbGxiYWNrKSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICB9IGVsc2UgaWYgKCFsaXRlcmFsUHJpb3JpdHkgJiYgdmFsICYmIGhhc093blByb3AuY2FsbCh2YWwsIGxvYykpIHsgLy8gc2ltcGxlIGNhc2UtLWRpcmVjdGx5IGZvbGxvdyBwcm9wZXJ0eVxuICAgICAgICBhZGRSZXQodGhpcy5fdHJhY2UoeCwgdmFsW2xvY10sIHB1c2gocGF0aCwgbG9jKSwgdmFsLCBsb2MsIGNhbGxiYWNrLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgLy8gV2UgY2hlY2sgdGhlIHJlc3VsdGluZyB2YWx1ZXMgZm9yIHBhcmVudCBzZWxlY3Rpb25zLiBGb3IgcGFyZW50XG4gICAgLy8gc2VsZWN0aW9ucyB3ZSBkaXNjYXJkIHRoZSB2YWx1ZSBvYmplY3QgYW5kIGNvbnRpbnVlIHRoZSB0cmFjZSB3aXRoIHRoZVxuICAgIC8vIGN1cnJlbnQgdmFsIG9iamVjdFxuICAgIGlmICh0aGlzLl9oYXNQYXJlbnRTZWxlY3Rvcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1mb3ItbG9vcFxuICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHJldC5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgY29uc3QgcmV0dCA9IHJldFt0XTtcbiAgICAgICAgICAgIGlmIChyZXR0LmlzUGFyZW50U2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0bXAgPSB0aGF0Ll90cmFjZShcbiAgICAgICAgICAgICAgICAgICAgcmV0dC5leHByLCB2YWwsIHJldHQucGF0aCwgcGFyZW50LCBwYXJlbnRQcm9wTmFtZSwgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRtcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0W3RdID0gdG1wWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0bCA9IHRtcC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHR0ID0gMTsgdHQgPCB0bDsgdHQrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnNwbGljZSh0LCAwLCB0bXBbdHRdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFt0XSA9IHRtcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xufTtcblxuSlNPTlBhdGgucHJvdG90eXBlLl93YWxrID0gZnVuY3Rpb24gKGxvYywgZXhwciwgdmFsLCBwYXRoLCBwYXJlbnQsIHBhcmVudFByb3BOYW1lLCBjYWxsYmFjaywgZikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgY29uc3QgbiA9IHZhbC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBmKGksIGxvYywgZXhwciwgdmFsLCBwYXRoLCBwYXJlbnQsIHBhcmVudFByb3BOYW1lLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAodmFyIG0gaW4gdmFsKSB7IC8vIG9yaWdpbmFsbHkgbSBkZWNsYXJlZCBhcyBgY29uc3RgLCBidXQgdGhpcyBpcyBub3QgYWxsb3dlZCBpbiBSaGlub1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AuY2FsbCh2YWwsIG0pKSB7XG4gICAgICAgICAgICAgICAgZihtLCBsb2MsIGV4cHIsIHZhbCwgcGF0aCwgcGFyZW50LCBwYXJlbnRQcm9wTmFtZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuSlNPTlBhdGgucHJvdG90eXBlLl9zbGljZSA9IGZ1bmN0aW9uIChsb2MsIGV4cHIsIHZhbCwgcGF0aCwgcGFyZW50LCBwYXJlbnRQcm9wTmFtZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgY29uc3QgbGVuID0gdmFsLmxlbmd0aCwgcGFydHMgPSBsb2Muc3BsaXQoJzonKSxcbiAgICAgICAgc3RlcCA9IChwYXJ0c1syXSAmJiBwYXJzZUludChwYXJ0c1syXSkpIHx8IDE7XG4gICAgbGV0IHN0YXJ0ID0gKHBhcnRzWzBdICYmIHBhcnNlSW50KHBhcnRzWzBdKSkgfHwgMCxcbiAgICAgICAgZW5kID0gKHBhcnRzWzFdICYmIHBhcnNlSW50KHBhcnRzWzFdKSkgfHwgbGVuO1xuICAgIHN0YXJ0ID0gKHN0YXJ0IDwgMCkgPyBNYXRoLm1heCgwLCBzdGFydCArIGxlbikgOiBNYXRoLm1pbihsZW4sIHN0YXJ0KTtcbiAgICBlbmQgPSAoZW5kIDwgMCkgPyBNYXRoLm1heCgwLCBlbmQgKyBsZW4pIDogTWF0aC5taW4obGVuLCBlbmQpO1xuICAgIGNvbnN0IHJldCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBzdGVwKSB7XG4gICAgICAgIGxldCB0bXAgPSB0aGlzLl90cmFjZSh1bnNoaWZ0KGksIGV4cHIpLCB2YWwsIHBhdGgsIHBhcmVudCwgcGFyZW50UHJvcE5hbWUsIGNhbGxiYWNrKTsvLyBvcmlnaW5hbGx5IGRlY2xhcmVkIGFzIGBjb25zdGAsIHRoaXMgZG9lc24ndCB3b3JrIGluIFJoaW5vXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRtcCkpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgd2FzIGNhdXNpbmcgZXhjZXNzaXZlIHN0YWNrIHNpemUgaW4gTm9kZSAod2l0aCBvciB3aXRob3V0IEJhYmVsKSBhZ2FpbnN0IG91ciBwZXJmb3JtYW5jZSB0ZXN0OiBgcmV0LnB1c2goLi4udG1wKTtgXG4gICAgICAgICAgICB0bXAuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldC5wdXNoKHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXQucHVzaCh0bXApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59O1xuXG5KU09OUGF0aC5wcm90b3R5cGUuX2V2YWwgPSBmdW5jdGlvbiAoY29kZSwgX3YsIF92bmFtZSwgcGF0aCwgcGFyZW50LCBwYXJlbnRQcm9wTmFtZSkge1xuICAgIGlmICghdGhpcy5fb2JqIHx8ICFfdikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAoY29kZS5pbmRleE9mKCdAcGFyZW50UHJvcGVydHknKT4tMSkge1xuICAgICAgICB0aGlzLmN1cnJTYW5kYm94Ll8kX3BhcmVudFByb3BlcnR5ID0gcGFyZW50UHJvcE5hbWU7XG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoL0BwYXJlbnRQcm9wZXJ0eS9nLCAnXyRfcGFyZW50UHJvcGVydHknKTtcbiAgICB9XG4gICAgaWYgKGNvZGUuaW5kZXhPZignQHBhcmVudCcpPi0xKSB7XG4gICAgICAgIHRoaXMuY3VyclNhbmRib3guXyRfcGFyZW50ID0gcGFyZW50O1xuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlKC9AcGFyZW50L2csICdfJF9wYXJlbnQnKTtcbiAgICB9XG4gICAgaWYgKGNvZGUuaW5kZXhPZignQHByb3BlcnR5Jyk+LTEpIHtcbiAgICAgICAgdGhpcy5jdXJyU2FuZGJveC5fJF9wcm9wZXJ0eSA9IF92bmFtZTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZSgvQHByb3BlcnR5L2csICdfJF9wcm9wZXJ0eScpO1xuICAgIH1cbiAgICBpZiAoY29kZS5pbmRleE9mKCdAcGF0aCcpPi0xKSB7XG4gICAgICAgIHRoaXMuY3VyclNhbmRib3guXyRfcGF0aCA9IEpTT05QYXRoLnRvUGF0aFN0cmluZyhwYXRoLmNvbmNhdChbX3ZuYW1lXSkpO1xuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlKC9AcGF0aC9nLCAnXyRfcGF0aCcpO1xuICAgIH1cbiAgICBpZiAoY29kZS5tYXRjaCgvQChbLlxccylbXSkvKSkge1xuICAgICAgICB0aGlzLmN1cnJTYW5kYm94Ll8kX3YgPSBfdjtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZSgvQChbLlxccylbXSkvZywgJ18kX3YkMScpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gdm0ucnVuSW5OZXdDb250ZXh0KGNvZGUsIHRoaXMuY3VyclNhbmRib3gpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignanNvblBhdGg6ICcgKyBlLm1lc3NhZ2UgKyAnOiAnICsgY29kZSk7XG4gICAgfVxufTtcblxuLy8gUFVCTElDIENMQVNTIFBST1BFUlRJRVMgQU5EIE1FVEhPRFNcblxuLy8gQ291bGQgc3RvcmUgdGhlIGNhY2hlIG9iamVjdCBpdHNlbGZcbkpTT05QYXRoLmNhY2hlID0ge307XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aEFyciBBcnJheSB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcGF0aCBzdHJpbmdcbiAqL1xuSlNPTlBhdGgudG9QYXRoU3RyaW5nID0gZnVuY3Rpb24gKHBhdGhBcnIpIHtcbiAgICBjb25zdCB4ID0gcGF0aEFyciwgbiA9IHgubGVuZ3RoO1xuICAgIGxldCBwID0gJyQnO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGlmICghKC9eKH58XFxefEAuKj9cXChcXCkpJC8pLnRlc3QoeFtpXSkpIHtcbiAgICAgICAgICAgIHAgKz0gKC9eWzAtOSpdKyQvKS50ZXN0KHhbaV0pID8gKCdbJyArIHhbaV0gKyAnXScpIDogKFwiWydcIiArIHhbaV0gKyBcIiddXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcG9pbnRlciBKU09OIFBhdGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEpTT04gUG9pbnRlclxuICovXG5KU09OUGF0aC50b1BvaW50ZXIgPSBmdW5jdGlvbiAocG9pbnRlcikge1xuICAgIGNvbnN0IHggPSBwb2ludGVyLCBuID0geC5sZW5ndGg7XG4gICAgbGV0IHAgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG47IGkrKykge1xuICAgICAgICBpZiAoISgvXih+fFxcXnxALio/XFwoXFwpKSQvKS50ZXN0KHhbaV0pKSB7XG4gICAgICAgICAgICBwICs9ICcvJyArIHhbaV0udG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9+L2csICd+MCcpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnfjEnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cHIgRXhwcmVzc2lvbiB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbkpTT05QYXRoLnRvUGF0aEFycmF5ID0gZnVuY3Rpb24gKGV4cHIpIHtcbiAgICBjb25zdCB7Y2FjaGV9ID0gSlNPTlBhdGg7XG4gICAgaWYgKGNhY2hlW2V4cHJdKSB7IHJldHVybiBjYWNoZVtleHByXS5jb25jYXQoKTsgfVxuICAgIGNvbnN0IHN1YnggPSBbXTtcbiAgICBjb25zdCBub3JtYWxpemVkID0gZXhwclxuICAgICAgICAvLyBQcm9wZXJ0aWVzXG4gICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgL0AoPzpudWxsfGJvb2xlYW58bnVtYmVyfHN0cmluZ3xpbnRlZ2VyfHVuZGVmaW5lZHxub25GaW5pdGV8c2NhbGFyfGFycmF5fG9iamVjdHxmdW5jdGlvbnxvdGhlcilcXChcXCkvZyxcbiAgICAgICAgICAgICc7JCY7J1xuICAgICAgICApXG4gICAgICAgIC8vIFBhcmVudGhldGljYWwgZXZhbHVhdGlvbnMgKGZpbHRlcmluZyBhbmQgb3RoZXJ3aXNlKSwgZGlyZWN0bHlcbiAgICAgICAgLy8gICB3aXRoaW4gYnJhY2tldHMgb3Igc2luZ2xlIHF1b3Rlc1xuICAgICAgICAucmVwbGFjZSgvW1snXShcXD8/XFwoLio/XFwpKVtcXF0nXS9nLCBmdW5jdGlvbiAoJDAsICQxKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1sjJyArIChzdWJ4LnB1c2goJDEpIC0gMSkgKyAnXSc7XG4gICAgICAgIH0pXG4gICAgICAgIC8vIEVzY2FwZSBwZXJpb2RzIGFuZCB0aWxkZXMgd2l0aGluIHByb3BlcnRpZXNcbiAgICAgICAgLnJlcGxhY2UoL1xcWycoW14nXFxdXSopJ1xcXS9nLCBmdW5jdGlvbiAoJDAsIHByb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBcIlsnXCIgKyBwcm9wXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcLi9nLCAnJUAlJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvfi9nLCAnJSVAQCUlJykgK1xuICAgICAgICAgICAgICAgIFwiJ11cIjtcbiAgICAgICAgfSlcbiAgICAgICAgLy8gUHJvcGVydGllcyBvcGVyYXRvclxuICAgICAgICAucmVwbGFjZSgvfi9nLCAnO347JylcbiAgICAgICAgLy8gU3BsaXQgYnkgcHJvcGVydHkgYm91bmRhcmllc1xuICAgICAgICAucmVwbGFjZSgvJz9cXC4nPyg/IVteW10qXFxdKXxcXFsnPy9nLCAnOycpXG4gICAgICAgIC8vIFJlaW5zZXJ0IHBlcmlvZHMgd2l0aGluIHByb3BlcnRpZXNcbiAgICAgICAgLnJlcGxhY2UoLyVAJS9nLCAnLicpXG4gICAgICAgIC8vIFJlaW5zZXJ0IHRpbGRlcyB3aXRoaW4gcHJvcGVydGllc1xuICAgICAgICAucmVwbGFjZSgvJSVAQCUlL2csICd+JylcbiAgICAgICAgLy8gUGFyZW50XG4gICAgICAgIC5yZXBsYWNlKC8oPzo7KT8oXFxeKykoPzo7KT8vZywgZnVuY3Rpb24gKCQwLCB1cHMpIHtcbiAgICAgICAgICAgIHJldHVybiAnOycgKyB1cHMuc3BsaXQoJycpLmpvaW4oJzsnKSArICc7JztcbiAgICAgICAgfSlcbiAgICAgICAgLy8gRGVzY2VuZGVudHNcbiAgICAgICAgLnJlcGxhY2UoLzs7O3w7Oy9nLCAnOy4uOycpXG4gICAgICAgIC8vIFJlbW92ZSB0cmFpbGluZ1xuICAgICAgICAucmVwbGFjZSgvOyR8Jz9cXF18JyQvZywgJycpO1xuXG4gICAgY29uc3QgZXhwckxpc3QgPSBub3JtYWxpemVkLnNwbGl0KCc7JykubWFwKGZ1bmN0aW9uIChleHApIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBleHAubWF0Y2goLyMoXFxkKykvKTtcbiAgICAgICAgcmV0dXJuICFtYXRjaCB8fCAhbWF0Y2hbMV0gPyBleHAgOiBzdWJ4W21hdGNoWzFdXTtcbiAgICB9KTtcbiAgICBjYWNoZVtleHByXSA9IGV4cHJMaXN0O1xuICAgIHJldHVybiBjYWNoZVtleHByXTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEpTT05QYXRoO1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBT0EsTUFBTSxhQUFhO0FBQ25CLE1BQU0scUJBQXFCLENBQUMsU0FBUyxRQUFRLFdBQVcsVUFBVSxrQkFBa0IsS0FBSztBQUN6RixNQUFNLEVBQUMsZ0JBQWdCLFdBQVUsSUFBSSxPQUFPO0FBVTVDLE1BQU0scUJBQXFCLFNBQVUsUUFBUSxRQUFRLGFBQWE7QUFDOUQsUUFBTSxLQUFLLE9BQU87QUFDbEIsV0FBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLEtBQUs7QUFDekIsVUFBTSxPQUFPLE9BQU8sQ0FBQztBQUNyQixRQUFJLFlBQVksSUFBSSxHQUFHO0FBQ25CLGFBQU8sS0FBSyxPQUFPLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQUEsSUFDeEM7QUFBQSxFQUNKO0FBQ0o7QUFFQSxNQUFNLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNSCxnQkFBaUIsTUFBTSxTQUFTO0FBQzVCLFVBQU0sT0FBTyxPQUFPLEtBQUssT0FBTztBQUNoQyxVQUFNLFFBQVEsQ0FBQztBQUNmLHVCQUFtQixNQUFNLE9BQU8sQ0FBQyxRQUFRO0FBQ3JDLGFBQU8sT0FBTyxRQUFRLEdBQUcsTUFBTTtBQUFBLElBQ25DLENBQUM7QUFDRCxVQUFNLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxTQUFTO0FBQ25DLFVBQUksVUFBVSxRQUFRLElBQUksRUFB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
@@ -0,0 +1,22 @@
1
+ import { Bytes } from "@aerokit/sdk/io/bytes";
2
+ const QRCodeFacade = Java.type("org.eclipse.dirigible.components.api.utils.QRCodeFacade");
3
+ class QRCode {
4
+ /**
5
+ * Generates a QR code image byte array from the given text.
6
+ * The returned byte array represents the image data (e.g., PNG or JPEG format,
7
+ * depending on the native implementation's default output).
8
+ *
9
+ * @param text The string content to be encoded in the QR code.
10
+ * @returns A **JavaScript byte array (any[])** containing the raw QR code image data.
11
+ */
12
+ static generateQRCode(text) {
13
+ return Bytes.toJavaScriptBytes(QRCodeFacade.generateQRCode(text));
14
+ }
15
+ }
16
+ if (typeof module !== "undefined") {
17
+ module.exports = QRCode;
18
+ }
19
+ export {
20
+ QRCode
21
+ };
22
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3V0aWxzL3FyY29kZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQnl0ZXMgfSBmcm9tIFwiQGFlcm9raXQvc2RrL2lvL2J5dGVzXCI7XG5jb25zdCBRUkNvZGVGYWNhZGUgPSBKYXZhLnR5cGUoXCJvcmcuZWNsaXBzZS5kaXJpZ2libGUuY29tcG9uZW50cy5hcGkudXRpbHMuUVJDb2RlRmFjYWRlXCIpO1xuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZm9yIGdlbmVyYXRpbmcgUVIgY29kZXMuXG4gKiBJdCB1c2VzIHRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBKYXZhIFFSQ29kZUZhY2FkZSB0byBjb252ZXJ0IHRleHQgaW50b1xuICogYSBRUiBjb2RlIGltYWdlIHJlcHJlc2VudGVkIGFzIGEgcmF3IGJ5dGUgYXJyYXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRUkNvZGUge1xuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgUVIgY29kZSBpbWFnZSBieXRlIGFycmF5IGZyb20gdGhlIGdpdmVuIHRleHQuXG4gICAgICogVGhlIHJldHVybmVkIGJ5dGUgYXJyYXkgcmVwcmVzZW50cyB0aGUgaW1hZ2UgZGF0YSAoZS5nLiwgUE5HIG9yIEpQRUcgZm9ybWF0LFxuICAgICAqIGRlcGVuZGluZyBvbiB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uJ3MgZGVmYXVsdCBvdXRwdXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRleHQgVGhlIHN0cmluZyBjb250ZW50IHRvIGJlIGVuY29kZWQgaW4gdGhlIFFSIGNvZGUuXG4gICAgICogQHJldHVybnMgQSAqKkphdmFTY3JpcHQgYnl0ZSBhcnJheSAoYW55W10pKiogY29udGFpbmluZyB0aGUgcmF3IFFSIGNvZGUgaW1hZ2UgZGF0YS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlUVJDb2RlKHRleHQ6IHN0cmluZyk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIEJ5dGVzLnRvSmF2YVNjcmlwdEJ5dGVzKFFSQ29kZUZhY2FkZS5nZW5lcmF0ZVFSQ29kZSh0ZXh0KSk7XG4gICAgfVxufVxuXG4vLyBAdHMtaWdub3JlXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBRUkNvZGU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFBQSxTQUFTLGFBQWE7QUFDdEIsTUFBTSxlQUFlLEtBQUssS0FBSyx5REFBeUQ7QUFPakYsTUFBTSxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVWhCLE9BQWMsZUFBZSxNQUFxQjtBQUM5QyxXQUFPLE1BQU0sa0JBQWtCLGFBQWEsZUFBZSxJQUFJLENBQUM7QUFBQSxFQUNwRTtBQUNKO0FBR0EsSUFBSSxPQUFPLFdBQVcsYUFBYTtBQUUvQixTQUFPLFVBQVU7QUFDckI7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,63 @@
1
+ const UrlFacade = Java.type("org.eclipse.dirigible.components.api.utils.UrlFacade");
2
+ class URL {
3
+ /**
4
+ * URL-encodes the input string, typically used for encoding query parameter values.
5
+ *
6
+ * @param input The string to be encoded.
7
+ * @param charset The character set (e.g., 'UTF-8', 'ISO-8859-1') to use for encoding. Defaults to the system's preferred encoding if omitted.
8
+ * @returns The URL-encoded string.
9
+ */
10
+ static encode(input, charset) {
11
+ return UrlFacade.encode(input, charset);
12
+ }
13
+ /**
14
+ * URL-decodes the input string, typically used for decoding query parameter values.
15
+ *
16
+ * @param input The string to be decoded.
17
+ * @param charset The character set (e.g., 'UTF-8', 'ISO-8859-1') that was used for encoding. Defaults to the system's preferred encoding if omitted.
18
+ * @returns The URL-decoded string.
19
+ */
20
+ static decode(input, charset) {
21
+ return UrlFacade.decode(input, charset);
22
+ }
23
+ /**
24
+ * Escapes the input string using general URL escaping rules.
25
+ * This is typically equivalent to `encodeURIComponent` and is suitable for
26
+ * encoding query parameter *values*.
27
+ *
28
+ * @param input The string to escape.
29
+ * @returns The escaped string.
30
+ */
31
+ static escape(input) {
32
+ return UrlFacade.escape(input);
33
+ }
34
+ /**
35
+ * Escapes the input string specifically for use as a **URL path segment**.
36
+ * It typically preserves path delimiters like `/` that might otherwise be escaped
37
+ * in standard URL encoding.
38
+ *
39
+ * @param input The path string to escape.
40
+ * @returns The escaped path string.
41
+ */
42
+ static escapePath(input) {
43
+ return UrlFacade.escapePath(input);
44
+ }
45
+ /**
46
+ * Escapes the input string according to the rules for **HTML Form Data**
47
+ * (application/x-www-form-urlencoded). This typically replaces spaces with `+`
48
+ * instead of `%20`.
49
+ *
50
+ * @param input The form data string to escape.
51
+ * @returns The escaped form data string.
52
+ */
53
+ static escapeForm(input) {
54
+ return UrlFacade.escapeForm(input);
55
+ }
56
+ }
57
+ if (typeof module !== "undefined") {
58
+ module.exports = URL;
59
+ }
60
+ export {
61
+ URL
62
+ };
63
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3V0aWxzL3VybC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiY29uc3QgVXJsRmFjYWRlID0gSmF2YS50eXBlKFwib3JnLmVjbGlwc2UuZGlyaWdpYmxlLmNvbXBvbmVudHMuYXBpLnV0aWxzLlVybEZhY2FkZVwiKTtcblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGZvciBwZXJmb3JtaW5nIHZhcmlvdXMgZm9ybXMgb2YgVVJMIGVuY29kaW5nIGFuZCBkZWNvZGluZy5cbiAqIEl0IHdyYXBzIG5hdGl2ZSBKYXZhIFVSTCB1dGlsaXR5IG1ldGhvZHMgZm9yIGhhbmRsaW5nIHF1ZXJ5IHBhcmFtZXRlcnMsXG4gKiBwYXRoIHNlZ21lbnRzLCBhbmQgZm9ybSBkYXRhLlxuICovXG5leHBvcnQgY2xhc3MgVVJMIHtcblxuXHQvKipcblx0ICogVVJMLWVuY29kZXMgdGhlIGlucHV0IHN0cmluZywgdHlwaWNhbGx5IHVzZWQgZm9yIGVuY29kaW5nIHF1ZXJ5IHBhcmFtZXRlciB2YWx1ZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBpbnB1dCBUaGUgc3RyaW5nIHRvIGJlIGVuY29kZWQuXG5cdCAqIEBwYXJhbSBjaGFyc2V0IFRoZSBjaGFyYWN0ZXIgc2V0IChlLmcuLCAnVVRGLTgnLCAnSVNPLTg4NTktMScpIHRvIHVzZSBmb3IgZW5jb2RpbmcuIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBwcmVmZXJyZWQgZW5jb2RpbmcgaWYgb21pdHRlZC5cblx0ICogQHJldHVybnMgVGhlIFVSTC1lbmNvZGVkIHN0cmluZy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZW5jb2RlKGlucHV0OiBzdHJpbmcsIGNoYXJzZXQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBVcmxGYWNhZGUuZW5jb2RlKGlucHV0LCBjaGFyc2V0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVUkwtZGVjb2RlcyB0aGUgaW5wdXQgc3RyaW5nLCB0eXBpY2FsbHkgdXNlZCBmb3IgZGVjb2RpbmcgcXVlcnkgcGFyYW1ldGVyIHZhbHVlcy5cblx0ICpcblx0ICogQHBhcmFtIGlucHV0IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZC5cblx0ICogQHBhcmFtIGNoYXJzZXQgVGhlIGNoYXJhY3RlciBzZXQgKGUuZy4sICdVVEYtOCcsICdJU08tODg1OS0xJykgdGhhdCB3YXMgdXNlZCBmb3IgZW5jb2RpbmcuIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBwcmVmZXJyZWQgZW5jb2RpbmcgaWYgb21pdHRlZC5cblx0ICogQHJldHVybnMgVGhlIFVSTC1kZWNvZGVkIHN0cmluZy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZGVjb2RlKGlucHV0OiBzdHJpbmcsIGNoYXJzZXQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBVcmxGYWNhZGUuZGVjb2RlKGlucHV0LCBjaGFyc2V0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFc2NhcGVzIHRoZSBpbnB1dCBzdHJpbmcgdXNpbmcgZ2VuZXJhbCBVUkwgZXNjYXBpbmcgcnVsZXMuXG5cdCAqIFRoaXMgaXMgdHlwaWNhbGx5IGVxdWl2YWxlbnQgdG8gYGVuY29kZVVSSUNvbXBvbmVudGAgYW5kIGlzIHN1aXRhYmxlIGZvclxuXHQgKiBlbmNvZGluZyBxdWVyeSBwYXJhbWV0ZXIgKnZhbHVlcyouXG5cdCAqXG5cdCAqIEBwYXJhbSBpbnB1dCBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cblx0ICogQHJldHVybnMgVGhlIGVzY2FwZWQgc3RyaW5nLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBlc2NhcGUoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIFVybEZhY2FkZS5lc2NhcGUoaW5wdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVzY2FwZXMgdGhlIGlucHV0IHN0cmluZyBzcGVjaWZpY2FsbHkgZm9yIHVzZSBhcyBhICoqVVJMIHBhdGggc2VnbWVudCoqLlxuXHQgKiBJdCB0eXBpY2FsbHkgcHJlc2VydmVzIHBhdGggZGVsaW1pdGVycyBsaWtlIGAvYCB0aGF0IG1pZ2h0IG90aGVyd2lzZSBiZSBlc2NhcGVkXG5cdCAqIGluIHN0YW5kYXJkIFVSTCBlbmNvZGluZy5cblx0ICpcblx0ICogQHBhcmFtIGlucHV0IFRoZSBwYXRoIHN0cmluZyB0byBlc2NhcGUuXG5cdCAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHBhdGggc3RyaW5nLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBlc2NhcGVQYXRoKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBVcmxGYWNhZGUuZXNjYXBlUGF0aChpbnB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogRXNjYXBlcyB0aGUgaW5wdXQgc3RyaW5nIGFjY29yZGluZyB0byB0aGUgcnVsZXMgZm9yICoqSFRNTCBGb3JtIERhdGEqKlxuXHQgKiAoYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkKS4gVGhpcyB0eXBpY2FsbHkgcmVwbGFjZXMgc3BhY2VzIHdpdGggYCtgXG5cdCAqIGluc3RlYWQgb2YgYCUyMGAuXG5cdCAqXG5cdCAqIEBwYXJhbSBpbnB1dCBUaGUgZm9ybSBkYXRhIHN0cmluZyB0byBlc2NhcGUuXG5cdCAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIGZvcm0gZGF0YSBzdHJpbmcuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGVzY2FwZUZvcm0oaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIFVybEZhY2FkZS5lc2NhcGVGb3JtKGlucHV0KTtcblx0fVxufVxuXG4vLyBAdHMtaWdub3JlXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0Ly8gQHRzLWlnbm9yZVxuXHRtb2R1bGUuZXhwb3J0cyA9IFVSTDtcbn0iXSwKICAibWFwcGluZ3MiOiAiQUFBQSxNQUFNLFlBQVksS0FBSyxLQUFLLHNEQUFzRDtBQU8zRSxNQUFNLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU2hCLE9BQWMsT0FBTyxPQUFlLFNBQTBCO0FBQzdELFdBQU8sVUFBVSxPQUFPLE9BQU8sT0FBTztBQUFBLEVBQ3ZDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLE9BQWMsT0FBTyxPQUFlLFNBQTBCO0FBQzdELFdBQU8sVUFBVSxPQUFPLE9BQU8sT0FBTztBQUFBLEVBQ3ZDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVUEsT0FBYyxPQUFPLE9BQXVCO0FBQzNDLFdBQU8sVUFBVSxPQUFPLEtBQUs7QUFBQSxFQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLE9BQWMsV0FBVyxPQUF1QjtBQUMvQyxXQUFPLFVBQVUsV0FBVyxLQUFLO0FBQUEsRUFDbEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVQSxPQUFjLFdBQVcsT0FBdUI7QUFDL0MsV0FBTyxVQUFVLFdBQVcsS0FBSztBQUFBLEVBQ2xDO0FBQ0Q7QUFHQSxJQUFJLE9BQU8sV0FBVyxhQUFhO0FBRWxDLFNBQU8sVUFBVTtBQUNsQjsiLAogICJuYW1lcyI6IFtdCn0K