lakutata 0.0.1

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 (594) hide show
  1. package/.idea/codeStyles/Project.xml +18 -0
  2. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  3. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  4. package/.idea/lakutata.iml +13 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/vcs.xml +6 -0
  7. package/LICENSE +21 -0
  8. package/README.md +1 -0
  9. package/build/Application-78a416de.d.ts +387 -0
  10. package/build/Application-b5e19e08.d.ts +387 -0
  11. package/build/Components.cjs +55 -0
  12. package/build/Components.d.cts +9 -0
  13. package/build/Components.d.ts +9 -0
  14. package/build/Components.js +44 -0
  15. package/build/Core.cjs +148 -0
  16. package/build/Core.d.cts +33 -0
  17. package/build/Core.d.ts +33 -0
  18. package/build/Core.js +71 -0
  19. package/build/Crypto.cjs +96 -0
  20. package/build/Crypto.d.cts +19 -0
  21. package/build/Crypto.d.ts +19 -0
  22. package/build/Crypto.js +41 -0
  23. package/build/Decorators.cjs +100 -0
  24. package/build/Decorators.d.cts +23 -0
  25. package/build/Decorators.d.ts +23 -0
  26. package/build/Decorators.js +45 -0
  27. package/build/DependencyInjectionContainer-871a6c03.d.ts +340 -0
  28. package/build/DependencyInjectionContainer-f037ac36.d.ts +340 -0
  29. package/build/Exceptions.cjs +144 -0
  30. package/build/Exceptions.d.cts +28 -0
  31. package/build/Exceptions.d.ts +28 -0
  32. package/build/Exceptions.js +37 -0
  33. package/build/Hash.cjs +223 -0
  34. package/build/Hash.d.cts +535 -0
  35. package/build/Hash.d.ts +535 -0
  36. package/build/Hash.js +10 -0
  37. package/build/Time.cjs +14 -0
  38. package/build/Time.d.cts +5 -0
  39. package/build/Time.d.ts +5 -0
  40. package/build/Time.js +5 -0
  41. package/build/TimeInput-24fced42.d.ts +243 -0
  42. package/build/TimeInput-4401fc58.d.ts +243 -0
  43. package/build/Utilities.cjs +100 -0
  44. package/build/Utilities.d.cts +212 -0
  45. package/build/Utilities.d.ts +212 -0
  46. package/build/Utilities.js +7 -0
  47. package/build/Validator.cjs +24 -0
  48. package/build/Validator.d.cts +1851 -0
  49. package/build/Validator.d.ts +1851 -0
  50. package/build/Validator.js +11 -0
  51. package/build/chunk-26TQI22I.js +196 -0
  52. package/build/chunk-27OFA7C3.js +16 -0
  53. package/build/chunk-2C2UILFN.js +23 -0
  54. package/build/chunk-2CHYQHWR.cjs +16 -0
  55. package/build/chunk-2DN35UQB.cjs +10947 -0
  56. package/build/chunk-2E4TF6LU.cjs +16 -0
  57. package/build/chunk-2PLJEW2R.js +14 -0
  58. package/build/chunk-2RW3VMNS.js +45 -0
  59. package/build/chunk-2T6JU2UH.js +14 -0
  60. package/build/chunk-3CX3GCQF.js +32 -0
  61. package/build/chunk-3JIQCDQG.cjs +25 -0
  62. package/build/chunk-3KLEN3PR.js +14 -0
  63. package/build/chunk-3LZRQPJ5.js +14 -0
  64. package/build/chunk-3NHHHZFR.cjs +870 -0
  65. package/build/chunk-4332C5BW.js +30 -0
  66. package/build/chunk-46V7GHKE.cjs +25 -0
  67. package/build/chunk-4EPPSZ7L.js +14 -0
  68. package/build/chunk-4FEEQIQ4.js +23 -0
  69. package/build/chunk-4G2ZCUBN.js +5570 -0
  70. package/build/chunk-4KTVY73U.js +15 -0
  71. package/build/chunk-4MQXSUTL.cjs +14 -0
  72. package/build/chunk-4OHSPWRQ.js +34 -0
  73. package/build/chunk-4PK4TGU4.cjs +16 -0
  74. package/build/chunk-4YXUEJSO.js +23 -0
  75. package/build/chunk-5475IFR4.cjs +16 -0
  76. package/build/chunk-5B5Z4GCR.cjs +17 -0
  77. package/build/chunk-5FPTDIKI.cjs +16 -0
  78. package/build/chunk-5NK7E2HA.js +69 -0
  79. package/build/chunk-67F5WP5Z.cjs +8 -0
  80. package/build/chunk-6BJTKEXZ.cjs +25 -0
  81. package/build/chunk-6WNLPTDY.cjs +8 -0
  82. package/build/chunk-7G7FCNEG.cjs +8 -0
  83. package/build/chunk-7IVNTVYK.cjs +16 -0
  84. package/build/chunk-7MJAWOWL.js +22896 -0
  85. package/build/chunk-7MTOK62N.js +767 -0
  86. package/build/chunk-7PADGZPI.cjs +129 -0
  87. package/build/chunk-7ZUM53G6.js +14 -0
  88. package/build/chunk-A4BYNKYF.js +42 -0
  89. package/build/chunk-A7F6LCRA.cjs +16 -0
  90. package/build/chunk-AFV3VN3X.cjs +8 -0
  91. package/build/chunk-AGHMOCC3.cjs +16 -0
  92. package/build/chunk-AHUH4FWQ.cjs +29 -0
  93. package/build/chunk-AM4YMG2S.js +6 -0
  94. package/build/chunk-ANDEVIKJ.cjs +16 -0
  95. package/build/chunk-APETX7ZT.cjs +16 -0
  96. package/build/chunk-ASMC7EUP.js +6 -0
  97. package/build/chunk-BDCRHGKN.js +6 -0
  98. package/build/chunk-BDJXMO44.js +2920 -0
  99. package/build/chunk-BE7ICF5R.js +32 -0
  100. package/build/chunk-BEDKPRVX.cjs +17 -0
  101. package/build/chunk-BFE66ADZ.cjs +34 -0
  102. package/build/chunk-BKCT2HSQ.js +178 -0
  103. package/build/chunk-BMNC4W46.js +20 -0
  104. package/build/chunk-BO7Y6HNS.cjs +176 -0
  105. package/build/chunk-D4H35ART.cjs +53 -0
  106. package/build/chunk-D5DE7Z4J.js +29 -0
  107. package/build/chunk-DHSSJJMD.cjs +25 -0
  108. package/build/chunk-DIMOR6NE.cjs +8 -0
  109. package/build/chunk-DN5TSX6S.cjs +244 -0
  110. package/build/chunk-EEH5LCBP.cjs +16 -0
  111. package/build/chunk-EFYDUUXT.cjs +92 -0
  112. package/build/chunk-ENJSEFE4.js +14 -0
  113. package/build/chunk-EPYJVQHQ.js +6 -0
  114. package/build/chunk-EUVLTNDV.js +32 -0
  115. package/build/chunk-EXQVCESB.cjs +20 -0
  116. package/build/chunk-EYPPC6HP.js +18 -0
  117. package/build/chunk-F5NKGQDL.cjs +16 -0
  118. package/build/chunk-F7RNH2H2.js +266 -0
  119. package/build/chunk-FCTV4OB7.cjs +50 -0
  120. package/build/chunk-FHEXUE67.js +29 -0
  121. package/build/chunk-FJP3KNXK.js +23 -0
  122. package/build/chunk-FJQSLRIP.js +14 -0
  123. package/build/chunk-FSFWPTIC.js +6 -0
  124. package/build/chunk-FTKFMQHJ.cjs +16 -0
  125. package/build/chunk-FW26MPE4.js +69 -0
  126. package/build/chunk-FZNRGZGE.js +6372 -0
  127. package/build/chunk-G7EDOLQ7.cjs +100 -0
  128. package/build/chunk-GGY7LCMQ.cjs +73 -0
  129. package/build/chunk-GLWUJIMW.cjs +8 -0
  130. package/build/chunk-GZ5KN2PE.js +6 -0
  131. package/build/chunk-HBPRX3WA.cjs +202 -0
  132. package/build/chunk-HJAQ6WJM.cjs +288 -0
  133. package/build/chunk-HJSJA5CF.js +14 -0
  134. package/build/chunk-HKAY7FWM.js +28 -0
  135. package/build/chunk-HMKTNRQF.js +14 -0
  136. package/build/chunk-HODDA5D5.js +199 -0
  137. package/build/chunk-HPKJUFTM.js +14 -0
  138. package/build/chunk-HWCTWIVZ.cjs +30 -0
  139. package/build/chunk-HXWC4YN6.cjs +22908 -0
  140. package/build/chunk-HZJ7XFHQ.cjs +8 -0
  141. package/build/chunk-I5TGKTX6.js +18 -0
  142. package/build/chunk-I7J6V3EU.cjs +34 -0
  143. package/build/chunk-IKWXYUGY.js +14 -0
  144. package/build/chunk-IYGGR65W.cjs +16 -0
  145. package/build/chunk-J6RXNX2K.js +174 -0
  146. package/build/chunk-JAEEMFEZ.cjs +24 -0
  147. package/build/chunk-JFOMNL5I.cjs +22 -0
  148. package/build/chunk-JPV2PUHF.cjs +8 -0
  149. package/build/chunk-JR726PDZ.cjs +70 -0
  150. package/build/chunk-JTKOYDJB.js +5914 -0
  151. package/build/chunk-JU53NOVA.cjs +31 -0
  152. package/build/chunk-JVSBYHUY.js +10944 -0
  153. package/build/chunk-JYBISTRN.cjs +25 -0
  154. package/build/chunk-K2ALA7QI.js +12 -0
  155. package/build/chunk-KG6DPM4B.js +14 -0
  156. package/build/chunk-KNSBLLL2.cjs +32 -0
  157. package/build/chunk-KNTGBUSY.js +6 -0
  158. package/build/chunk-KWOHVRRL.js +6 -0
  159. package/build/chunk-L3IVYIVA.js +23 -0
  160. package/build/chunk-LBL5XNWX.js +221 -0
  161. package/build/chunk-LBOBUFWZ.js +6 -0
  162. package/build/chunk-LEJXJUBE.js +6 -0
  163. package/build/chunk-LJTCXKC4.js +242 -0
  164. package/build/chunk-MBKTJ3KM.cjs +118 -0
  165. package/build/chunk-MDE5SRLT.cjs +16 -0
  166. package/build/chunk-MEKICSEL.js +22 -0
  167. package/build/chunk-MNDBRDT2.cjs +608 -0
  168. package/build/chunk-MSWZLYS7.cjs +5916 -0
  169. package/build/chunk-MT2OB376.js +14 -0
  170. package/build/chunk-MVWB4XDJ.js +14 -0
  171. package/build/chunk-MXAAAL2S.js +53 -0
  172. package/build/chunk-N37KV2VV.cjs +199 -0
  173. package/build/chunk-NZ5IZMM5.cjs +2922 -0
  174. package/build/chunk-O2NOYN65.js +54 -0
  175. package/build/chunk-OAD22QZQ.js +6 -0
  176. package/build/chunk-OIFILR4I.js +125 -0
  177. package/build/chunk-OJGBPS2B.cjs +16 -0
  178. package/build/chunk-OMPATIMZ.cjs +71 -0
  179. package/build/chunk-P3Z7ZEGJ.cjs +18 -0
  180. package/build/chunk-P6BBXCBD.cjs +6425 -0
  181. package/build/chunk-PE4C2TIO.cjs +16 -0
  182. package/build/chunk-PF2WAZLH.cjs +52 -0
  183. package/build/chunk-PFFTGOAR.cjs +25 -0
  184. package/build/chunk-PFUZLHWJ.cjs +25 -0
  185. package/build/chunk-POE7A7NF.cjs +180 -0
  186. package/build/chunk-PQSDA5BN.js +50 -0
  187. package/build/chunk-PR5TPAGH.js +14 -0
  188. package/build/chunk-PXMWVOKK.cjs +16 -0
  189. package/build/chunk-PZ5OJC4I.cjs +16 -0
  190. package/build/chunk-Q4LNTPEI.cjs +34 -0
  191. package/build/chunk-QCA5YGYV.js +14 -0
  192. package/build/chunk-QGGML4PP.js +17 -0
  193. package/build/chunk-QHW273SN.js +32 -0
  194. package/build/chunk-QJJRQMA6.cjs +8 -0
  195. package/build/chunk-QKB76MIV.cjs +769 -0
  196. package/build/chunk-QKVPGRI5.cjs +8 -0
  197. package/build/chunk-QME47CJL.cjs +8 -0
  198. package/build/chunk-QNJ6XBYQ.js +14 -0
  199. package/build/chunk-QWYKUNU5.js +14 -0
  200. package/build/chunk-QXTBP6TW.js +116 -0
  201. package/build/chunk-RH3LAIQS.js +32 -0
  202. package/build/chunk-RMAXG5F7.js +118 -0
  203. package/build/chunk-RUHAPGDE.js +14 -0
  204. package/build/chunk-S4KA3ZGO.js +6 -0
  205. package/build/chunk-SAGMV3YX.cjs +16 -0
  206. package/build/chunk-SCWEQ5JA.cjs +34 -0
  207. package/build/chunk-SEKBDIJH.cjs +16 -0
  208. package/build/chunk-SGWWTKLW.cjs +16 -0
  209. package/build/chunk-SWCU6OID.cjs +61 -0
  210. package/build/chunk-T4C7UJEZ.js +29 -0
  211. package/build/chunk-TBWIKIS3.cjs +8 -0
  212. package/build/chunk-TS74DN3N.cjs +229 -0
  213. package/build/chunk-TXTNUC7S.cjs +16 -0
  214. package/build/chunk-UEGDBJEG.cjs +127 -0
  215. package/build/chunk-UR2ZK7MI.cjs +16 -0
  216. package/build/chunk-VAOR6JOP.js +14 -0
  217. package/build/chunk-VELZ3KJY.cjs +45 -0
  218. package/build/chunk-VHTAHAD6.cjs +34 -0
  219. package/build/chunk-VISA22LF.js +14 -0
  220. package/build/chunk-VOFRWVGM.js +23 -0
  221. package/build/chunk-VPRNM6FU.cjs +118 -0
  222. package/build/chunk-VTFNEUOF.js +14 -0
  223. package/build/chunk-VVNU27G2.js +868 -0
  224. package/build/chunk-W3TQER3B.cjs +31 -0
  225. package/build/chunk-WINISBV4.js +70 -0
  226. package/build/chunk-WSEZ7DZV.js +14 -0
  227. package/build/chunk-WW57G6RG.js +124 -0
  228. package/build/chunk-WYJCE3KY.cjs +5593 -0
  229. package/build/chunk-WZI5UPER.cjs +61 -0
  230. package/build/chunk-WZZF2IEV.js +14 -0
  231. package/build/chunk-X4AIZSIY.cjs +47 -0
  232. package/build/chunk-XO6M5AYN.js +585 -0
  233. package/build/chunk-XWP76C6E.js +25 -0
  234. package/build/chunk-Y7O5SCF6.cjs +16 -0
  235. package/build/chunk-YEBPQG7X.js +96 -0
  236. package/build/chunk-YT4CYDJ3.js +14 -0
  237. package/build/chunk-ZG3PHRVQ.cjs +20 -0
  238. package/build/chunk-ZG7QF5S2.cjs +16 -0
  239. package/build/chunk-ZJYLWSBE.js +90 -0
  240. package/build/chunk-ZYBMNLGI.js +48 -0
  241. package/build/constants/DefaultValue.cjs +14 -0
  242. package/build/constants/DefaultValue.d.cts +9 -0
  243. package/build/constants/DefaultValue.d.ts +9 -0
  244. package/build/constants/DefaultValue.js +5 -0
  245. package/build/constants/MetadataKey.cjs +114 -0
  246. package/build/constants/MetadataKey.d.cts +30 -0
  247. package/build/constants/MetadataKey.d.ts +30 -0
  248. package/build/constants/MetadataKey.js +5 -0
  249. package/build/decorators/ControllerDecorators.cjs +21 -0
  250. package/build/decorators/ControllerDecorators.d.cts +32 -0
  251. package/build/decorators/ControllerDecorators.d.ts +32 -0
  252. package/build/decorators/ControllerDecorators.js +12 -0
  253. package/build/decorators/DependencyInjectionDecorators.cjs +78 -0
  254. package/build/decorators/DependencyInjectionDecorators.d.cts +75 -0
  255. package/build/decorators/DependencyInjectionDecorators.d.ts +75 -0
  256. package/build/decorators/DependencyInjectionDecorators.js +41 -0
  257. package/build/decorators/ValidationDecorators.cjs +35 -0
  258. package/build/decorators/ValidationDecorators.d.cts +36 -0
  259. package/build/decorators/ValidationDecorators.d.ts +36 -0
  260. package/build/decorators/ValidationDecorators.js +14 -0
  261. package/build/exceptions/DependencyInjectionException.cjs +18 -0
  262. package/build/exceptions/DependencyInjectionException.d.cts +8 -0
  263. package/build/exceptions/DependencyInjectionException.d.ts +8 -0
  264. package/build/exceptions/DependencyInjectionException.js +9 -0
  265. package/build/exceptions/InvalidConfigurableValueException.cjs +18 -0
  266. package/build/exceptions/InvalidConfigurableValueException.d.cts +8 -0
  267. package/build/exceptions/InvalidConfigurableValueException.d.ts +8 -0
  268. package/build/exceptions/InvalidConfigurableValueException.js +9 -0
  269. package/build/exceptions/InvalidDTOValueException.cjs +18 -0
  270. package/build/exceptions/InvalidDTOValueException.d.cts +8 -0
  271. package/build/exceptions/InvalidDTOValueException.d.ts +8 -0
  272. package/build/exceptions/InvalidDTOValueException.js +9 -0
  273. package/build/exceptions/InvalidGlobStringException.cjs +18 -0
  274. package/build/exceptions/InvalidGlobStringException.d.cts +8 -0
  275. package/build/exceptions/InvalidGlobStringException.d.ts +8 -0
  276. package/build/exceptions/InvalidGlobStringException.js +9 -0
  277. package/build/exceptions/MethodNotFoundException.cjs +18 -0
  278. package/build/exceptions/MethodNotFoundException.d.cts +8 -0
  279. package/build/exceptions/MethodNotFoundException.d.ts +8 -0
  280. package/build/exceptions/MethodNotFoundException.js +9 -0
  281. package/build/exceptions/NotSupportHashException.cjs +18 -0
  282. package/build/exceptions/NotSupportHashException.d.cts +8 -0
  283. package/build/exceptions/NotSupportHashException.d.ts +8 -0
  284. package/build/exceptions/NotSupportHashException.js +9 -0
  285. package/build/exceptions/controller/DuplicateControllerActionPatternException.cjs +18 -0
  286. package/build/exceptions/controller/DuplicateControllerActionPatternException.d.cts +8 -0
  287. package/build/exceptions/controller/DuplicateControllerActionPatternException.d.ts +8 -0
  288. package/build/exceptions/controller/DuplicateControllerActionPatternException.js +9 -0
  289. package/build/exceptions/controller/DynamicRegisterControllerNotAllowException.cjs +18 -0
  290. package/build/exceptions/controller/DynamicRegisterControllerNotAllowException.d.cts +8 -0
  291. package/build/exceptions/controller/DynamicRegisterControllerNotAllowException.d.ts +8 -0
  292. package/build/exceptions/controller/DynamicRegisterControllerNotAllowException.js +9 -0
  293. package/build/exceptions/controller/NoMatchedControllerActionPatternException.cjs +18 -0
  294. package/build/exceptions/controller/NoMatchedControllerActionPatternException.d.cts +8 -0
  295. package/build/exceptions/controller/NoMatchedControllerActionPatternException.d.ts +8 -0
  296. package/build/exceptions/controller/NoMatchedControllerActionPatternException.js +9 -0
  297. package/build/exceptions/crypto/asymmetric/AsymmetricDecryptException.cjs +18 -0
  298. package/build/exceptions/crypto/asymmetric/AsymmetricDecryptException.d.cts +8 -0
  299. package/build/exceptions/crypto/asymmetric/AsymmetricDecryptException.d.ts +8 -0
  300. package/build/exceptions/crypto/asymmetric/AsymmetricDecryptException.js +9 -0
  301. package/build/exceptions/crypto/asymmetric/AsymmetricEncryptException.cjs +18 -0
  302. package/build/exceptions/crypto/asymmetric/AsymmetricEncryptException.d.cts +8 -0
  303. package/build/exceptions/crypto/asymmetric/AsymmetricEncryptException.d.ts +8 -0
  304. package/build/exceptions/crypto/asymmetric/AsymmetricEncryptException.js +9 -0
  305. package/build/exceptions/crypto/asymmetric/AsymmetricSignException.cjs +18 -0
  306. package/build/exceptions/crypto/asymmetric/AsymmetricSignException.d.cts +8 -0
  307. package/build/exceptions/crypto/asymmetric/AsymmetricSignException.d.ts +8 -0
  308. package/build/exceptions/crypto/asymmetric/AsymmetricSignException.js +9 -0
  309. package/build/exceptions/crypto/asymmetric/AsymmetricVerifyException.cjs +18 -0
  310. package/build/exceptions/crypto/asymmetric/AsymmetricVerifyException.d.cts +8 -0
  311. package/build/exceptions/crypto/asymmetric/AsymmetricVerifyException.d.ts +8 -0
  312. package/build/exceptions/crypto/asymmetric/AsymmetricVerifyException.js +9 -0
  313. package/build/exceptions/crypto/asymmetric/InvalidAsymmetricEncryptKeyPairException.cjs +18 -0
  314. package/build/exceptions/crypto/asymmetric/InvalidAsymmetricEncryptKeyPairException.d.cts +8 -0
  315. package/build/exceptions/crypto/asymmetric/InvalidAsymmetricEncryptKeyPairException.d.ts +8 -0
  316. package/build/exceptions/crypto/asymmetric/InvalidAsymmetricEncryptKeyPairException.js +9 -0
  317. package/build/exceptions/crypto/asymmetric/InvalidAsymmetricEncryptPrivateKeyException.cjs +18 -0
  318. package/build/exceptions/crypto/asymmetric/InvalidAsymmetricEncryptPrivateKeyException.d.cts +8 -0
  319. package/build/exceptions/crypto/asymmetric/InvalidAsymmetricEncryptPrivateKeyException.d.ts +8 -0
  320. package/build/exceptions/crypto/asymmetric/InvalidAsymmetricEncryptPrivateKeyException.js +9 -0
  321. package/build/exceptions/crypto/asymmetric/InvalidAsymmetricEncryptPublicKeyException.cjs +18 -0
  322. package/build/exceptions/crypto/asymmetric/InvalidAsymmetricEncryptPublicKeyException.d.cts +8 -0
  323. package/build/exceptions/crypto/asymmetric/InvalidAsymmetricEncryptPublicKeyException.d.ts +8 -0
  324. package/build/exceptions/crypto/asymmetric/InvalidAsymmetricEncryptPublicKeyException.js +9 -0
  325. package/build/exceptions/crypto/asymmetric/NoAsymmetricEncryptPrivateKeyException.cjs +18 -0
  326. package/build/exceptions/crypto/asymmetric/NoAsymmetricEncryptPrivateKeyException.d.cts +8 -0
  327. package/build/exceptions/crypto/asymmetric/NoAsymmetricEncryptPrivateKeyException.d.ts +8 -0
  328. package/build/exceptions/crypto/asymmetric/NoAsymmetricEncryptPrivateKeyException.js +9 -0
  329. package/build/exceptions/crypto/asymmetric/NoAsymmetricEncryptPublicKeyException.cjs +18 -0
  330. package/build/exceptions/crypto/asymmetric/NoAsymmetricEncryptPublicKeyException.d.cts +8 -0
  331. package/build/exceptions/crypto/asymmetric/NoAsymmetricEncryptPublicKeyException.d.ts +8 -0
  332. package/build/exceptions/crypto/asymmetric/NoAsymmetricEncryptPublicKeyException.js +9 -0
  333. package/build/exceptions/crypto/symmetric/InvalidSymmetricCipherIVLengthException.cjs +18 -0
  334. package/build/exceptions/crypto/symmetric/InvalidSymmetricCipherIVLengthException.d.cts +8 -0
  335. package/build/exceptions/crypto/symmetric/InvalidSymmetricCipherIVLengthException.d.ts +8 -0
  336. package/build/exceptions/crypto/symmetric/InvalidSymmetricCipherIVLengthException.js +9 -0
  337. package/build/exceptions/crypto/symmetric/InvalidSymmetricCipherKeyLengthException.cjs +18 -0
  338. package/build/exceptions/crypto/symmetric/InvalidSymmetricCipherKeyLengthException.d.cts +8 -0
  339. package/build/exceptions/crypto/symmetric/InvalidSymmetricCipherKeyLengthException.d.ts +8 -0
  340. package/build/exceptions/crypto/symmetric/InvalidSymmetricCipherKeyLengthException.js +9 -0
  341. package/build/exceptions/crypto/symmetric/NotSupportCipherException.cjs +18 -0
  342. package/build/exceptions/crypto/symmetric/NotSupportCipherException.d.cts +8 -0
  343. package/build/exceptions/crypto/symmetric/NotSupportCipherException.d.ts +8 -0
  344. package/build/exceptions/crypto/symmetric/NotSupportCipherException.js +9 -0
  345. package/build/exceptions/crypto/symmetric/SymmetricDecryptException.cjs +18 -0
  346. package/build/exceptions/crypto/symmetric/SymmetricDecryptException.d.cts +8 -0
  347. package/build/exceptions/crypto/symmetric/SymmetricDecryptException.d.ts +8 -0
  348. package/build/exceptions/crypto/symmetric/SymmetricDecryptException.js +9 -0
  349. package/build/exceptions/crypto/symmetric/SymmetricEncryptException.cjs +18 -0
  350. package/build/exceptions/crypto/symmetric/SymmetricEncryptException.d.cts +8 -0
  351. package/build/exceptions/crypto/symmetric/SymmetricEncryptException.d.ts +8 -0
  352. package/build/exceptions/crypto/symmetric/SymmetricEncryptException.js +9 -0
  353. package/build/exceptions/validation/InvalidMethodAcceptException.cjs +18 -0
  354. package/build/exceptions/validation/InvalidMethodAcceptException.d.cts +8 -0
  355. package/build/exceptions/validation/InvalidMethodAcceptException.d.ts +8 -0
  356. package/build/exceptions/validation/InvalidMethodAcceptException.js +9 -0
  357. package/build/exceptions/validation/InvalidMethodReturnException.cjs +18 -0
  358. package/build/exceptions/validation/InvalidMethodReturnException.d.cts +8 -0
  359. package/build/exceptions/validation/InvalidMethodReturnException.d.ts +8 -0
  360. package/build/exceptions/validation/InvalidMethodReturnException.js +9 -0
  361. package/build/exceptions/validation/InvalidValueException.cjs +18 -0
  362. package/build/exceptions/validation/InvalidValueException.d.cts +8 -0
  363. package/build/exceptions/validation/InvalidValueException.d.ts +8 -0
  364. package/build/exceptions/validation/InvalidValueException.js +9 -0
  365. package/build/index.d-e5279fea.d.ts +872 -0
  366. package/build/interfaces/IConstructor.cjs +7 -0
  367. package/build/interfaces/IConstructor.d.cts +6 -0
  368. package/build/interfaces/IConstructor.d.ts +6 -0
  369. package/build/interfaces/IConstructor.js +4 -0
  370. package/build/interfaces/ILogger.cjs +7 -0
  371. package/build/interfaces/ILogger.d.cts +22 -0
  372. package/build/interfaces/ILogger.d.ts +22 -0
  373. package/build/interfaces/ILogger.js +4 -0
  374. package/build/interfaces/IPatRun.cjs +7 -0
  375. package/build/interfaces/IPatRun.d.cts +12 -0
  376. package/build/interfaces/IPatRun.d.ts +12 -0
  377. package/build/interfaces/IPatRun.js +4 -0
  378. package/build/interfaces/ISortArrayOptions.cjs +7 -0
  379. package/build/interfaces/ISortArrayOptions.d.cts +12 -0
  380. package/build/interfaces/ISortArrayOptions.d.ts +12 -0
  381. package/build/interfaces/ISortArrayOptions.js +4 -0
  382. package/build/interfaces/ISortObjectOptions.cjs +7 -0
  383. package/build/interfaces/ISortObjectOptions.d.cts +6 -0
  384. package/build/interfaces/ISortObjectOptions.d.ts +6 -0
  385. package/build/interfaces/ISortObjectOptions.js +4 -0
  386. package/build/lib/Application.cjs +50 -0
  387. package/build/lib/Application.d.cts +20 -0
  388. package/build/lib/Application.d.ts +20 -0
  389. package/build/lib/Application.js +41 -0
  390. package/build/lib/base/BaseObject.cjs +50 -0
  391. package/build/lib/base/BaseObject.d.cts +112 -0
  392. package/build/lib/base/BaseObject.d.ts +112 -0
  393. package/build/lib/base/BaseObject.js +41 -0
  394. package/build/lib/base/Component.cjs +50 -0
  395. package/build/lib/base/Component.d.cts +116 -0
  396. package/build/lib/base/Component.d.ts +116 -0
  397. package/build/lib/base/Component.js +41 -0
  398. package/build/lib/base/Container.cjs +50 -0
  399. package/build/lib/base/Container.d.cts +20 -0
  400. package/build/lib/base/Container.d.ts +20 -0
  401. package/build/lib/base/Container.js +41 -0
  402. package/build/lib/base/Controller.cjs +50 -0
  403. package/build/lib/base/Controller.d.cts +20 -0
  404. package/build/lib/base/Controller.d.ts +20 -0
  405. package/build/lib/base/Controller.js +41 -0
  406. package/build/lib/base/DTO.cjs +23 -0
  407. package/build/lib/base/DTO.d.cts +59 -0
  408. package/build/lib/base/DTO.d.ts +59 -0
  409. package/build/lib/base/DTO.js +14 -0
  410. package/build/lib/base/Model.cjs +51 -0
  411. package/build/lib/base/Model.d.cts +30 -0
  412. package/build/lib/base/Model.d.ts +30 -0
  413. package/build/lib/base/Model.js +42 -0
  414. package/build/lib/base/Module.cjs +50 -0
  415. package/build/lib/base/Module.d.cts +20 -0
  416. package/build/lib/base/Module.d.ts +20 -0
  417. package/build/lib/base/Module.js +41 -0
  418. package/build/lib/base/abstracts/AsymmetricEncryption.cjs +27 -0
  419. package/build/lib/base/abstracts/AsymmetricEncryption.d.cts +172 -0
  420. package/build/lib/base/abstracts/AsymmetricEncryption.d.ts +172 -0
  421. package/build/lib/base/abstracts/AsymmetricEncryption.js +18 -0
  422. package/build/lib/base/abstracts/Exception.cjs +17 -0
  423. package/build/lib/base/abstracts/Exception.d.cts +23 -0
  424. package/build/lib/base/abstracts/Exception.d.ts +23 -0
  425. package/build/lib/base/abstracts/Exception.js +8 -0
  426. package/build/lib/base/abstracts/Interval.cjs +51 -0
  427. package/build/lib/base/abstracts/Interval.d.cts +76 -0
  428. package/build/lib/base/abstracts/Interval.d.ts +76 -0
  429. package/build/lib/base/abstracts/Interval.js +42 -0
  430. package/build/lib/base/abstracts/SymmetricEncryption.cjs +23 -0
  431. package/build/lib/base/abstracts/SymmetricEncryption.d.cts +149 -0
  432. package/build/lib/base/abstracts/SymmetricEncryption.d.ts +149 -0
  433. package/build/lib/base/abstracts/SymmetricEncryption.js +14 -0
  434. package/build/lib/base/async-constructor/Append.cjs +14 -0
  435. package/build/lib/base/async-constructor/Append.d.cts +5 -0
  436. package/build/lib/base/async-constructor/Append.d.ts +5 -0
  437. package/build/lib/base/async-constructor/Append.js +5 -0
  438. package/build/lib/base/async-constructor/AsyncConstructor.cjs +15 -0
  439. package/build/lib/base/async-constructor/AsyncConstructor.d.cts +7 -0
  440. package/build/lib/base/async-constructor/AsyncConstructor.d.ts +7 -0
  441. package/build/lib/base/async-constructor/AsyncConstructor.js +6 -0
  442. package/build/lib/components/Formatter.cjs +50 -0
  443. package/build/lib/components/Formatter.d.cts +203 -0
  444. package/build/lib/components/Formatter.d.ts +203 -0
  445. package/build/lib/components/Formatter.js +41 -0
  446. package/build/lib/components/Logger.cjs +50 -0
  447. package/build/lib/components/Logger.d.cts +61 -0
  448. package/build/lib/components/Logger.d.ts +61 -0
  449. package/build/lib/components/Logger.js +41 -0
  450. package/build/lib/crypto/RSA.cjs +28 -0
  451. package/build/lib/crypto/RSA.d.cts +61 -0
  452. package/build/lib/crypto/RSA.d.ts +61 -0
  453. package/build/lib/crypto/RSA.js +19 -0
  454. package/build/lib/crypto/SM2.cjs +28 -0
  455. package/build/lib/crypto/SM2.d.cts +47 -0
  456. package/build/lib/crypto/SM2.d.ts +47 -0
  457. package/build/lib/crypto/SM2.js +19 -0
  458. package/build/lib/crypto/aes/AES128.cjs +25 -0
  459. package/build/lib/crypto/aes/AES128.d.cts +14 -0
  460. package/build/lib/crypto/aes/AES128.d.ts +14 -0
  461. package/build/lib/crypto/aes/AES128.js +16 -0
  462. package/build/lib/crypto/aes/AES192.cjs +25 -0
  463. package/build/lib/crypto/aes/AES192.d.cts +14 -0
  464. package/build/lib/crypto/aes/AES192.d.ts +14 -0
  465. package/build/lib/crypto/aes/AES192.js +16 -0
  466. package/build/lib/crypto/aes/AES256.cjs +25 -0
  467. package/build/lib/crypto/aes/AES256.d.cts +14 -0
  468. package/build/lib/crypto/aes/AES256.d.ts +14 -0
  469. package/build/lib/crypto/aes/AES256.js +16 -0
  470. package/build/lib/crypto/aria/ARIA128.cjs +24 -0
  471. package/build/lib/crypto/aria/ARIA128.d.cts +13 -0
  472. package/build/lib/crypto/aria/ARIA128.d.ts +13 -0
  473. package/build/lib/crypto/aria/ARIA128.js +15 -0
  474. package/build/lib/crypto/aria/ARIA192.cjs +24 -0
  475. package/build/lib/crypto/aria/ARIA192.d.cts +13 -0
  476. package/build/lib/crypto/aria/ARIA192.d.ts +13 -0
  477. package/build/lib/crypto/aria/ARIA192.js +15 -0
  478. package/build/lib/crypto/aria/ARIA256.cjs +24 -0
  479. package/build/lib/crypto/aria/ARIA256.d.cts +13 -0
  480. package/build/lib/crypto/aria/ARIA256.d.ts +13 -0
  481. package/build/lib/crypto/aria/ARIA256.js +15 -0
  482. package/build/lib/crypto/camellia/CAMELLIA128.cjs +24 -0
  483. package/build/lib/crypto/camellia/CAMELLIA128.d.cts +13 -0
  484. package/build/lib/crypto/camellia/CAMELLIA128.d.ts +13 -0
  485. package/build/lib/crypto/camellia/CAMELLIA128.js +15 -0
  486. package/build/lib/crypto/camellia/CAMELLIA192.cjs +24 -0
  487. package/build/lib/crypto/camellia/CAMELLIA192.d.cts +13 -0
  488. package/build/lib/crypto/camellia/CAMELLIA192.d.ts +13 -0
  489. package/build/lib/crypto/camellia/CAMELLIA192.js +15 -0
  490. package/build/lib/crypto/camellia/CAMELLIA256.cjs +24 -0
  491. package/build/lib/crypto/camellia/CAMELLIA256.d.cts +13 -0
  492. package/build/lib/crypto/camellia/CAMELLIA256.d.ts +13 -0
  493. package/build/lib/crypto/camellia/CAMELLIA256.js +15 -0
  494. package/build/lib/crypto/des/DES.cjs +25 -0
  495. package/build/lib/crypto/des/DES.d.cts +14 -0
  496. package/build/lib/crypto/des/DES.d.ts +14 -0
  497. package/build/lib/crypto/des/DES.js +16 -0
  498. package/build/lib/crypto/des/TripleDES.cjs +25 -0
  499. package/build/lib/crypto/des/TripleDES.d.cts +14 -0
  500. package/build/lib/crypto/des/TripleDES.d.ts +14 -0
  501. package/build/lib/crypto/des/TripleDES.js +16 -0
  502. package/build/lib/ioc/DependencyInjectionContainer.cjs +29 -0
  503. package/build/lib/ioc/DependencyInjectionContainer.d.cts +4 -0
  504. package/build/lib/ioc/DependencyInjectionContainer.d.ts +4 -0
  505. package/build/lib/ioc/DependencyInjectionContainer.js +20 -0
  506. package/build/lib/ioc/Errors.cjs +27 -0
  507. package/build/lib/ioc/Errors.d.cts +53 -0
  508. package/build/lib/ioc/Errors.d.ts +53 -0
  509. package/build/lib/ioc/Errors.js +10 -0
  510. package/build/lib/ioc/FunctionTokenizer.cjs +18 -0
  511. package/build/lib/ioc/FunctionTokenizer.d.cts +33 -0
  512. package/build/lib/ioc/FunctionTokenizer.d.ts +33 -0
  513. package/build/lib/ioc/FunctionTokenizer.js +5 -0
  514. package/build/lib/ioc/InjectionMode.cjs +14 -0
  515. package/build/lib/ioc/InjectionMode.d.cts +12 -0
  516. package/build/lib/ioc/InjectionMode.d.ts +12 -0
  517. package/build/lib/ioc/InjectionMode.js +5 -0
  518. package/build/lib/ioc/Lifetime.cjs +14 -0
  519. package/build/lib/ioc/Lifetime.d.cts +12 -0
  520. package/build/lib/ioc/Lifetime.d.ts +12 -0
  521. package/build/lib/ioc/Lifetime.js +5 -0
  522. package/build/lib/ioc/ListModules.cjs +17 -0
  523. package/build/lib/ioc/ListModules.d.cts +4 -0
  524. package/build/lib/ioc/ListModules.d.ts +4 -0
  525. package/build/lib/ioc/ListModules.js +8 -0
  526. package/build/lib/ioc/LoadModuleNative.cjs +14 -0
  527. package/build/lib/ioc/LoadModuleNative.d.cts +9 -0
  528. package/build/lib/ioc/LoadModuleNative.d.ts +9 -0
  529. package/build/lib/ioc/LoadModuleNative.js +5 -0
  530. package/build/lib/ioc/LoadModules.cjs +26 -0
  531. package/build/lib/ioc/LoadModules.d.cts +4 -0
  532. package/build/lib/ioc/LoadModules.d.ts +4 -0
  533. package/build/lib/ioc/LoadModules.js +17 -0
  534. package/build/lib/ioc/ParamParser.cjs +15 -0
  535. package/build/lib/ioc/ParamParser.d.cts +25 -0
  536. package/build/lib/ioc/ParamParser.d.ts +25 -0
  537. package/build/lib/ioc/ParamParser.js +6 -0
  538. package/build/lib/ioc/Resolvers.cjs +49 -0
  539. package/build/lib/ioc/Resolvers.d.cts +4 -0
  540. package/build/lib/ioc/Resolvers.d.ts +4 -0
  541. package/build/lib/ioc/Resolvers.js +16 -0
  542. package/build/lib/ioc/Utils.cjs +35 -0
  543. package/build/lib/ioc/Utils.d.cts +38 -0
  544. package/build/lib/ioc/Utils.d.ts +38 -0
  545. package/build/lib/ioc/Utils.js +6 -0
  546. package/build/options/ApplicationOptions.cjs +50 -0
  547. package/build/options/ApplicationOptions.d.cts +20 -0
  548. package/build/options/ApplicationOptions.d.ts +20 -0
  549. package/build/options/ApplicationOptions.js +41 -0
  550. package/build/options/LoadComponentOptions.cjs +50 -0
  551. package/build/options/LoadComponentOptions.d.cts +22 -0
  552. package/build/options/LoadComponentOptions.d.ts +22 -0
  553. package/build/options/LoadComponentOptions.js +41 -0
  554. package/build/options/LoadEntryClassOptions.cjs +50 -0
  555. package/build/options/LoadEntryClassOptions.d.cts +16 -0
  556. package/build/options/LoadEntryClassOptions.d.ts +16 -0
  557. package/build/options/LoadEntryClassOptions.js +41 -0
  558. package/build/options/LoadEntryCommonOptions.cjs +27 -0
  559. package/build/options/LoadEntryCommonOptions.d.cts +13 -0
  560. package/build/options/LoadEntryCommonOptions.d.ts +13 -0
  561. package/build/options/LoadEntryCommonOptions.js +18 -0
  562. package/build/options/LoadModuleOptions.cjs +50 -0
  563. package/build/options/LoadModuleOptions.d.cts +20 -0
  564. package/build/options/LoadModuleOptions.d.ts +20 -0
  565. package/build/options/LoadModuleOptions.js +41 -0
  566. package/build/options/ModuleOptions.cjs +50 -0
  567. package/build/options/ModuleOptions.d.cts +20 -0
  568. package/build/options/ModuleOptions.d.ts +20 -0
  569. package/build/options/ModuleOptions.js +41 -0
  570. package/build/types/AsyncFunction.cjs +7 -0
  571. package/build/types/AsyncFunction.d.cts +3 -0
  572. package/build/types/AsyncFunction.d.ts +3 -0
  573. package/build/types/AsyncFunction.js +4 -0
  574. package/build/types/ControllerActionMapItem.cjs +7 -0
  575. package/build/types/ControllerActionMapItem.d.cts +20 -0
  576. package/build/types/ControllerActionMapItem.d.ts +20 -0
  577. package/build/types/ControllerActionMapItem.js +4 -0
  578. package/build/types/InjectionProperties.cjs +7 -0
  579. package/build/types/InjectionProperties.d.cts +3 -0
  580. package/build/types/InjectionProperties.d.ts +3 -0
  581. package/build/types/InjectionProperties.js +4 -0
  582. package/build/types/TimeInput.cjs +7 -0
  583. package/build/types/TimeInput.d.cts +5 -0
  584. package/build/types/TimeInput.d.ts +5 -0
  585. package/build/types/TimeInput.js +4 -0
  586. package/build/types/TimeObject.cjs +7 -0
  587. package/build/types/TimeObject.d.cts +11 -0
  588. package/build/types/TimeObject.d.ts +11 -0
  589. package/build/types/TimeObject.js +4 -0
  590. package/build/types/UnitOfTime.cjs +7 -0
  591. package/build/types/UnitOfTime.d.cts +14 -0
  592. package/build/types/UnitOfTime.d.ts +14 -0
  593. package/build/types/UnitOfTime.js +4 -0
  594. package/package.json +145 -0
@@ -0,0 +1,868 @@
1
+ import { init_esm_shims, __name } from './chunk-5NK7E2HA.js';
2
+
3
+ // node_modules/reflect-metadata/Reflect.js
4
+ init_esm_shims();
5
+ var Reflect;
6
+ (function(Reflect2) {
7
+ (function(factory) {
8
+ var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : Function("return this;")();
9
+ var exporter = makeExporter(Reflect2);
10
+ if (typeof root.Reflect === "undefined") {
11
+ root.Reflect = Reflect2;
12
+ } else {
13
+ exporter = makeExporter(root.Reflect, exporter);
14
+ }
15
+ factory(exporter);
16
+ function makeExporter(target, previous) {
17
+ return function(key, value) {
18
+ if (typeof target[key] !== "function") {
19
+ Object.defineProperty(target, key, { configurable: true, writable: true, value });
20
+ }
21
+ if (previous)
22
+ previous(key, value);
23
+ };
24
+ }
25
+ __name(makeExporter, "makeExporter");
26
+ })(function(exporter) {
27
+ var hasOwn = Object.prototype.hasOwnProperty;
28
+ var supportsSymbol = typeof Symbol === "function";
29
+ var toPrimitiveSymbol = supportsSymbol && typeof Symbol.toPrimitive !== "undefined" ? Symbol.toPrimitive : "@@toPrimitive";
30
+ var iteratorSymbol = supportsSymbol && typeof Symbol.iterator !== "undefined" ? Symbol.iterator : "@@iterator";
31
+ var supportsCreate = typeof Object.create === "function";
32
+ var supportsProto = { __proto__: [] } instanceof Array;
33
+ var downLevel = !supportsCreate && !supportsProto;
34
+ var HashMap = {
35
+ // create an object in dictionary mode (a.k.a. "slow" mode in v8)
36
+ create: supportsCreate ? function() {
37
+ return MakeDictionary(/* @__PURE__ */ Object.create(null));
38
+ } : supportsProto ? function() {
39
+ return MakeDictionary({ __proto__: null });
40
+ } : function() {
41
+ return MakeDictionary({});
42
+ },
43
+ has: downLevel ? function(map, key) {
44
+ return hasOwn.call(map, key);
45
+ } : function(map, key) {
46
+ return key in map;
47
+ },
48
+ get: downLevel ? function(map, key) {
49
+ return hasOwn.call(map, key) ? map[key] : void 0;
50
+ } : function(map, key) {
51
+ return map[key];
52
+ }
53
+ };
54
+ var functionPrototype = Object.getPrototypeOf(Function);
55
+ var usePolyfill = typeof process === "object" && process.env && process.env["REFLECT_METADATA_USE_MAP_POLYFILL"] === "true";
56
+ var _Map = !usePolyfill && typeof Map === "function" && typeof Map.prototype.entries === "function" ? Map : CreateMapPolyfill();
57
+ var _Set = !usePolyfill && typeof Set === "function" && typeof Set.prototype.entries === "function" ? Set : CreateSetPolyfill();
58
+ var _WeakMap = !usePolyfill && typeof WeakMap === "function" ? WeakMap : CreateWeakMapPolyfill();
59
+ var Metadata = new _WeakMap();
60
+ function decorate(decorators, target, propertyKey, attributes) {
61
+ if (!IsUndefined(propertyKey)) {
62
+ if (!IsArray(decorators))
63
+ throw new TypeError();
64
+ if (!IsObject(target))
65
+ throw new TypeError();
66
+ if (!IsObject(attributes) && !IsUndefined(attributes) && !IsNull(attributes))
67
+ throw new TypeError();
68
+ if (IsNull(attributes))
69
+ attributes = void 0;
70
+ propertyKey = ToPropertyKey(propertyKey);
71
+ return DecorateProperty(decorators, target, propertyKey, attributes);
72
+ } else {
73
+ if (!IsArray(decorators))
74
+ throw new TypeError();
75
+ if (!IsConstructor(target))
76
+ throw new TypeError();
77
+ return DecorateConstructor(decorators, target);
78
+ }
79
+ }
80
+ __name(decorate, "decorate");
81
+ exporter("decorate", decorate);
82
+ function metadata(metadataKey, metadataValue) {
83
+ function decorator(target, propertyKey) {
84
+ if (!IsObject(target))
85
+ throw new TypeError();
86
+ if (!IsUndefined(propertyKey) && !IsPropertyKey(propertyKey))
87
+ throw new TypeError();
88
+ OrdinaryDefineOwnMetadata(metadataKey, metadataValue, target, propertyKey);
89
+ }
90
+ __name(decorator, "decorator");
91
+ return decorator;
92
+ }
93
+ __name(metadata, "metadata");
94
+ exporter("metadata", metadata);
95
+ function defineMetadata(metadataKey, metadataValue, target, propertyKey) {
96
+ if (!IsObject(target))
97
+ throw new TypeError();
98
+ if (!IsUndefined(propertyKey))
99
+ propertyKey = ToPropertyKey(propertyKey);
100
+ return OrdinaryDefineOwnMetadata(metadataKey, metadataValue, target, propertyKey);
101
+ }
102
+ __name(defineMetadata, "defineMetadata");
103
+ exporter("defineMetadata", defineMetadata);
104
+ function hasMetadata(metadataKey, target, propertyKey) {
105
+ if (!IsObject(target))
106
+ throw new TypeError();
107
+ if (!IsUndefined(propertyKey))
108
+ propertyKey = ToPropertyKey(propertyKey);
109
+ return OrdinaryHasMetadata(metadataKey, target, propertyKey);
110
+ }
111
+ __name(hasMetadata, "hasMetadata");
112
+ exporter("hasMetadata", hasMetadata);
113
+ function hasOwnMetadata(metadataKey, target, propertyKey) {
114
+ if (!IsObject(target))
115
+ throw new TypeError();
116
+ if (!IsUndefined(propertyKey))
117
+ propertyKey = ToPropertyKey(propertyKey);
118
+ return OrdinaryHasOwnMetadata(metadataKey, target, propertyKey);
119
+ }
120
+ __name(hasOwnMetadata, "hasOwnMetadata");
121
+ exporter("hasOwnMetadata", hasOwnMetadata);
122
+ function getMetadata(metadataKey, target, propertyKey) {
123
+ if (!IsObject(target))
124
+ throw new TypeError();
125
+ if (!IsUndefined(propertyKey))
126
+ propertyKey = ToPropertyKey(propertyKey);
127
+ return OrdinaryGetMetadata(metadataKey, target, propertyKey);
128
+ }
129
+ __name(getMetadata, "getMetadata");
130
+ exporter("getMetadata", getMetadata);
131
+ function getOwnMetadata(metadataKey, target, propertyKey) {
132
+ if (!IsObject(target))
133
+ throw new TypeError();
134
+ if (!IsUndefined(propertyKey))
135
+ propertyKey = ToPropertyKey(propertyKey);
136
+ return OrdinaryGetOwnMetadata(metadataKey, target, propertyKey);
137
+ }
138
+ __name(getOwnMetadata, "getOwnMetadata");
139
+ exporter("getOwnMetadata", getOwnMetadata);
140
+ function getMetadataKeys(target, propertyKey) {
141
+ if (!IsObject(target))
142
+ throw new TypeError();
143
+ if (!IsUndefined(propertyKey))
144
+ propertyKey = ToPropertyKey(propertyKey);
145
+ return OrdinaryMetadataKeys(target, propertyKey);
146
+ }
147
+ __name(getMetadataKeys, "getMetadataKeys");
148
+ exporter("getMetadataKeys", getMetadataKeys);
149
+ function getOwnMetadataKeys(target, propertyKey) {
150
+ if (!IsObject(target))
151
+ throw new TypeError();
152
+ if (!IsUndefined(propertyKey))
153
+ propertyKey = ToPropertyKey(propertyKey);
154
+ return OrdinaryOwnMetadataKeys(target, propertyKey);
155
+ }
156
+ __name(getOwnMetadataKeys, "getOwnMetadataKeys");
157
+ exporter("getOwnMetadataKeys", getOwnMetadataKeys);
158
+ function deleteMetadata(metadataKey, target, propertyKey) {
159
+ if (!IsObject(target))
160
+ throw new TypeError();
161
+ if (!IsUndefined(propertyKey))
162
+ propertyKey = ToPropertyKey(propertyKey);
163
+ var metadataMap = GetOrCreateMetadataMap(
164
+ target,
165
+ propertyKey,
166
+ /*Create*/
167
+ false
168
+ );
169
+ if (IsUndefined(metadataMap))
170
+ return false;
171
+ if (!metadataMap.delete(metadataKey))
172
+ return false;
173
+ if (metadataMap.size > 0)
174
+ return true;
175
+ var targetMetadata = Metadata.get(target);
176
+ targetMetadata.delete(propertyKey);
177
+ if (targetMetadata.size > 0)
178
+ return true;
179
+ Metadata.delete(target);
180
+ return true;
181
+ }
182
+ __name(deleteMetadata, "deleteMetadata");
183
+ exporter("deleteMetadata", deleteMetadata);
184
+ function DecorateConstructor(decorators, target) {
185
+ for (var i = decorators.length - 1; i >= 0; --i) {
186
+ var decorator = decorators[i];
187
+ var decorated = decorator(target);
188
+ if (!IsUndefined(decorated) && !IsNull(decorated)) {
189
+ if (!IsConstructor(decorated))
190
+ throw new TypeError();
191
+ target = decorated;
192
+ }
193
+ }
194
+ return target;
195
+ }
196
+ __name(DecorateConstructor, "DecorateConstructor");
197
+ function DecorateProperty(decorators, target, propertyKey, descriptor) {
198
+ for (var i = decorators.length - 1; i >= 0; --i) {
199
+ var decorator = decorators[i];
200
+ var decorated = decorator(target, propertyKey, descriptor);
201
+ if (!IsUndefined(decorated) && !IsNull(decorated)) {
202
+ if (!IsObject(decorated))
203
+ throw new TypeError();
204
+ descriptor = decorated;
205
+ }
206
+ }
207
+ return descriptor;
208
+ }
209
+ __name(DecorateProperty, "DecorateProperty");
210
+ function GetOrCreateMetadataMap(O, P, Create) {
211
+ var targetMetadata = Metadata.get(O);
212
+ if (IsUndefined(targetMetadata)) {
213
+ if (!Create)
214
+ return void 0;
215
+ targetMetadata = new _Map();
216
+ Metadata.set(O, targetMetadata);
217
+ }
218
+ var metadataMap = targetMetadata.get(P);
219
+ if (IsUndefined(metadataMap)) {
220
+ if (!Create)
221
+ return void 0;
222
+ metadataMap = new _Map();
223
+ targetMetadata.set(P, metadataMap);
224
+ }
225
+ return metadataMap;
226
+ }
227
+ __name(GetOrCreateMetadataMap, "GetOrCreateMetadataMap");
228
+ function OrdinaryHasMetadata(MetadataKey, O, P) {
229
+ var hasOwn2 = OrdinaryHasOwnMetadata(MetadataKey, O, P);
230
+ if (hasOwn2)
231
+ return true;
232
+ var parent = OrdinaryGetPrototypeOf(O);
233
+ if (!IsNull(parent))
234
+ return OrdinaryHasMetadata(MetadataKey, parent, P);
235
+ return false;
236
+ }
237
+ __name(OrdinaryHasMetadata, "OrdinaryHasMetadata");
238
+ function OrdinaryHasOwnMetadata(MetadataKey, O, P) {
239
+ var metadataMap = GetOrCreateMetadataMap(
240
+ O,
241
+ P,
242
+ /*Create*/
243
+ false
244
+ );
245
+ if (IsUndefined(metadataMap))
246
+ return false;
247
+ return ToBoolean(metadataMap.has(MetadataKey));
248
+ }
249
+ __name(OrdinaryHasOwnMetadata, "OrdinaryHasOwnMetadata");
250
+ function OrdinaryGetMetadata(MetadataKey, O, P) {
251
+ var hasOwn2 = OrdinaryHasOwnMetadata(MetadataKey, O, P);
252
+ if (hasOwn2)
253
+ return OrdinaryGetOwnMetadata(MetadataKey, O, P);
254
+ var parent = OrdinaryGetPrototypeOf(O);
255
+ if (!IsNull(parent))
256
+ return OrdinaryGetMetadata(MetadataKey, parent, P);
257
+ return void 0;
258
+ }
259
+ __name(OrdinaryGetMetadata, "OrdinaryGetMetadata");
260
+ function OrdinaryGetOwnMetadata(MetadataKey, O, P) {
261
+ var metadataMap = GetOrCreateMetadataMap(
262
+ O,
263
+ P,
264
+ /*Create*/
265
+ false
266
+ );
267
+ if (IsUndefined(metadataMap))
268
+ return void 0;
269
+ return metadataMap.get(MetadataKey);
270
+ }
271
+ __name(OrdinaryGetOwnMetadata, "OrdinaryGetOwnMetadata");
272
+ function OrdinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P) {
273
+ var metadataMap = GetOrCreateMetadataMap(
274
+ O,
275
+ P,
276
+ /*Create*/
277
+ true
278
+ );
279
+ metadataMap.set(MetadataKey, MetadataValue);
280
+ }
281
+ __name(OrdinaryDefineOwnMetadata, "OrdinaryDefineOwnMetadata");
282
+ function OrdinaryMetadataKeys(O, P) {
283
+ var ownKeys = OrdinaryOwnMetadataKeys(O, P);
284
+ var parent = OrdinaryGetPrototypeOf(O);
285
+ if (parent === null)
286
+ return ownKeys;
287
+ var parentKeys = OrdinaryMetadataKeys(parent, P);
288
+ if (parentKeys.length <= 0)
289
+ return ownKeys;
290
+ if (ownKeys.length <= 0)
291
+ return parentKeys;
292
+ var set = new _Set();
293
+ var keys = [];
294
+ for (var _i = 0, ownKeys_1 = ownKeys; _i < ownKeys_1.length; _i++) {
295
+ var key = ownKeys_1[_i];
296
+ var hasKey = set.has(key);
297
+ if (!hasKey) {
298
+ set.add(key);
299
+ keys.push(key);
300
+ }
301
+ }
302
+ for (var _a = 0, parentKeys_1 = parentKeys; _a < parentKeys_1.length; _a++) {
303
+ var key = parentKeys_1[_a];
304
+ var hasKey = set.has(key);
305
+ if (!hasKey) {
306
+ set.add(key);
307
+ keys.push(key);
308
+ }
309
+ }
310
+ return keys;
311
+ }
312
+ __name(OrdinaryMetadataKeys, "OrdinaryMetadataKeys");
313
+ function OrdinaryOwnMetadataKeys(O, P) {
314
+ var keys = [];
315
+ var metadataMap = GetOrCreateMetadataMap(
316
+ O,
317
+ P,
318
+ /*Create*/
319
+ false
320
+ );
321
+ if (IsUndefined(metadataMap))
322
+ return keys;
323
+ var keysObj = metadataMap.keys();
324
+ var iterator = GetIterator(keysObj);
325
+ var k = 0;
326
+ while (true) {
327
+ var next = IteratorStep(iterator);
328
+ if (!next) {
329
+ keys.length = k;
330
+ return keys;
331
+ }
332
+ var nextValue = IteratorValue(next);
333
+ try {
334
+ keys[k] = nextValue;
335
+ } catch (e) {
336
+ try {
337
+ IteratorClose(iterator);
338
+ } finally {
339
+ throw e;
340
+ }
341
+ }
342
+ k++;
343
+ }
344
+ }
345
+ __name(OrdinaryOwnMetadataKeys, "OrdinaryOwnMetadataKeys");
346
+ function Type(x) {
347
+ if (x === null)
348
+ return 1;
349
+ switch (typeof x) {
350
+ case "undefined":
351
+ return 0;
352
+ case "boolean":
353
+ return 2;
354
+ case "string":
355
+ return 3;
356
+ case "symbol":
357
+ return 4;
358
+ case "number":
359
+ return 5;
360
+ case "object":
361
+ return x === null ? 1 : 6;
362
+ default:
363
+ return 6;
364
+ }
365
+ }
366
+ __name(Type, "Type");
367
+ function IsUndefined(x) {
368
+ return x === void 0;
369
+ }
370
+ __name(IsUndefined, "IsUndefined");
371
+ function IsNull(x) {
372
+ return x === null;
373
+ }
374
+ __name(IsNull, "IsNull");
375
+ function IsSymbol(x) {
376
+ return typeof x === "symbol";
377
+ }
378
+ __name(IsSymbol, "IsSymbol");
379
+ function IsObject(x) {
380
+ return typeof x === "object" ? x !== null : typeof x === "function";
381
+ }
382
+ __name(IsObject, "IsObject");
383
+ function ToPrimitive(input, PreferredType) {
384
+ switch (Type(input)) {
385
+ case 0:
386
+ return input;
387
+ case 1:
388
+ return input;
389
+ case 2:
390
+ return input;
391
+ case 3:
392
+ return input;
393
+ case 4:
394
+ return input;
395
+ case 5:
396
+ return input;
397
+ }
398
+ var hint = PreferredType === 3 ? "string" : PreferredType === 5 ? "number" : "default";
399
+ var exoticToPrim = GetMethod(input, toPrimitiveSymbol);
400
+ if (exoticToPrim !== void 0) {
401
+ var result = exoticToPrim.call(input, hint);
402
+ if (IsObject(result))
403
+ throw new TypeError();
404
+ return result;
405
+ }
406
+ return OrdinaryToPrimitive(input, hint === "default" ? "number" : hint);
407
+ }
408
+ __name(ToPrimitive, "ToPrimitive");
409
+ function OrdinaryToPrimitive(O, hint) {
410
+ if (hint === "string") {
411
+ var toString_1 = O.toString;
412
+ if (IsCallable(toString_1)) {
413
+ var result = toString_1.call(O);
414
+ if (!IsObject(result))
415
+ return result;
416
+ }
417
+ var valueOf = O.valueOf;
418
+ if (IsCallable(valueOf)) {
419
+ var result = valueOf.call(O);
420
+ if (!IsObject(result))
421
+ return result;
422
+ }
423
+ } else {
424
+ var valueOf = O.valueOf;
425
+ if (IsCallable(valueOf)) {
426
+ var result = valueOf.call(O);
427
+ if (!IsObject(result))
428
+ return result;
429
+ }
430
+ var toString_2 = O.toString;
431
+ if (IsCallable(toString_2)) {
432
+ var result = toString_2.call(O);
433
+ if (!IsObject(result))
434
+ return result;
435
+ }
436
+ }
437
+ throw new TypeError();
438
+ }
439
+ __name(OrdinaryToPrimitive, "OrdinaryToPrimitive");
440
+ function ToBoolean(argument) {
441
+ return !!argument;
442
+ }
443
+ __name(ToBoolean, "ToBoolean");
444
+ function ToString(argument) {
445
+ return "" + argument;
446
+ }
447
+ __name(ToString, "ToString");
448
+ function ToPropertyKey(argument) {
449
+ var key = ToPrimitive(
450
+ argument,
451
+ 3
452
+ /* String */
453
+ );
454
+ if (IsSymbol(key))
455
+ return key;
456
+ return ToString(key);
457
+ }
458
+ __name(ToPropertyKey, "ToPropertyKey");
459
+ function IsArray(argument) {
460
+ return Array.isArray ? Array.isArray(argument) : argument instanceof Object ? argument instanceof Array : Object.prototype.toString.call(argument) === "[object Array]";
461
+ }
462
+ __name(IsArray, "IsArray");
463
+ function IsCallable(argument) {
464
+ return typeof argument === "function";
465
+ }
466
+ __name(IsCallable, "IsCallable");
467
+ function IsConstructor(argument) {
468
+ return typeof argument === "function";
469
+ }
470
+ __name(IsConstructor, "IsConstructor");
471
+ function IsPropertyKey(argument) {
472
+ switch (Type(argument)) {
473
+ case 3:
474
+ return true;
475
+ case 4:
476
+ return true;
477
+ default:
478
+ return false;
479
+ }
480
+ }
481
+ __name(IsPropertyKey, "IsPropertyKey");
482
+ function GetMethod(V, P) {
483
+ var func = V[P];
484
+ if (func === void 0 || func === null)
485
+ return void 0;
486
+ if (!IsCallable(func))
487
+ throw new TypeError();
488
+ return func;
489
+ }
490
+ __name(GetMethod, "GetMethod");
491
+ function GetIterator(obj) {
492
+ var method = GetMethod(obj, iteratorSymbol);
493
+ if (!IsCallable(method))
494
+ throw new TypeError();
495
+ var iterator = method.call(obj);
496
+ if (!IsObject(iterator))
497
+ throw new TypeError();
498
+ return iterator;
499
+ }
500
+ __name(GetIterator, "GetIterator");
501
+ function IteratorValue(iterResult) {
502
+ return iterResult.value;
503
+ }
504
+ __name(IteratorValue, "IteratorValue");
505
+ function IteratorStep(iterator) {
506
+ var result = iterator.next();
507
+ return result.done ? false : result;
508
+ }
509
+ __name(IteratorStep, "IteratorStep");
510
+ function IteratorClose(iterator) {
511
+ var f = iterator["return"];
512
+ if (f)
513
+ f.call(iterator);
514
+ }
515
+ __name(IteratorClose, "IteratorClose");
516
+ function OrdinaryGetPrototypeOf(O) {
517
+ var proto = Object.getPrototypeOf(O);
518
+ if (typeof O !== "function" || O === functionPrototype)
519
+ return proto;
520
+ if (proto !== functionPrototype)
521
+ return proto;
522
+ var prototype = O.prototype;
523
+ var prototypeProto = prototype && Object.getPrototypeOf(prototype);
524
+ if (prototypeProto == null || prototypeProto === Object.prototype)
525
+ return proto;
526
+ var constructor = prototypeProto.constructor;
527
+ if (typeof constructor !== "function")
528
+ return proto;
529
+ if (constructor === O)
530
+ return proto;
531
+ return constructor;
532
+ }
533
+ __name(OrdinaryGetPrototypeOf, "OrdinaryGetPrototypeOf");
534
+ function CreateMapPolyfill() {
535
+ var cacheSentinel = {};
536
+ var arraySentinel = [];
537
+ var MapIterator = (
538
+ /** @class */
539
+ function() {
540
+ function MapIterator2(keys, values, selector) {
541
+ this._index = 0;
542
+ this._keys = keys;
543
+ this._values = values;
544
+ this._selector = selector;
545
+ }
546
+ __name(MapIterator2, "MapIterator");
547
+ MapIterator2.prototype["@@iterator"] = function() {
548
+ return this;
549
+ };
550
+ MapIterator2.prototype[iteratorSymbol] = function() {
551
+ return this;
552
+ };
553
+ MapIterator2.prototype.next = function() {
554
+ var index = this._index;
555
+ if (index >= 0 && index < this._keys.length) {
556
+ var result = this._selector(this._keys[index], this._values[index]);
557
+ if (index + 1 >= this._keys.length) {
558
+ this._index = -1;
559
+ this._keys = arraySentinel;
560
+ this._values = arraySentinel;
561
+ } else {
562
+ this._index++;
563
+ }
564
+ return { value: result, done: false };
565
+ }
566
+ return { value: void 0, done: true };
567
+ };
568
+ MapIterator2.prototype.throw = function(error) {
569
+ if (this._index >= 0) {
570
+ this._index = -1;
571
+ this._keys = arraySentinel;
572
+ this._values = arraySentinel;
573
+ }
574
+ throw error;
575
+ };
576
+ MapIterator2.prototype.return = function(value) {
577
+ if (this._index >= 0) {
578
+ this._index = -1;
579
+ this._keys = arraySentinel;
580
+ this._values = arraySentinel;
581
+ }
582
+ return { value, done: true };
583
+ };
584
+ return MapIterator2;
585
+ }()
586
+ );
587
+ return (
588
+ /** @class */
589
+ function() {
590
+ function Map2() {
591
+ this._keys = [];
592
+ this._values = [];
593
+ this._cacheKey = cacheSentinel;
594
+ this._cacheIndex = -2;
595
+ }
596
+ __name(Map2, "Map");
597
+ Object.defineProperty(Map2.prototype, "size", {
598
+ get: function() {
599
+ return this._keys.length;
600
+ },
601
+ enumerable: true,
602
+ configurable: true
603
+ });
604
+ Map2.prototype.has = function(key) {
605
+ return this._find(
606
+ key,
607
+ /*insert*/
608
+ false
609
+ ) >= 0;
610
+ };
611
+ Map2.prototype.get = function(key) {
612
+ var index = this._find(
613
+ key,
614
+ /*insert*/
615
+ false
616
+ );
617
+ return index >= 0 ? this._values[index] : void 0;
618
+ };
619
+ Map2.prototype.set = function(key, value) {
620
+ var index = this._find(
621
+ key,
622
+ /*insert*/
623
+ true
624
+ );
625
+ this._values[index] = value;
626
+ return this;
627
+ };
628
+ Map2.prototype.delete = function(key) {
629
+ var index = this._find(
630
+ key,
631
+ /*insert*/
632
+ false
633
+ );
634
+ if (index >= 0) {
635
+ var size = this._keys.length;
636
+ for (var i = index + 1; i < size; i++) {
637
+ this._keys[i - 1] = this._keys[i];
638
+ this._values[i - 1] = this._values[i];
639
+ }
640
+ this._keys.length--;
641
+ this._values.length--;
642
+ if (key === this._cacheKey) {
643
+ this._cacheKey = cacheSentinel;
644
+ this._cacheIndex = -2;
645
+ }
646
+ return true;
647
+ }
648
+ return false;
649
+ };
650
+ Map2.prototype.clear = function() {
651
+ this._keys.length = 0;
652
+ this._values.length = 0;
653
+ this._cacheKey = cacheSentinel;
654
+ this._cacheIndex = -2;
655
+ };
656
+ Map2.prototype.keys = function() {
657
+ return new MapIterator(this._keys, this._values, getKey);
658
+ };
659
+ Map2.prototype.values = function() {
660
+ return new MapIterator(this._keys, this._values, getValue);
661
+ };
662
+ Map2.prototype.entries = function() {
663
+ return new MapIterator(this._keys, this._values, getEntry);
664
+ };
665
+ Map2.prototype["@@iterator"] = function() {
666
+ return this.entries();
667
+ };
668
+ Map2.prototype[iteratorSymbol] = function() {
669
+ return this.entries();
670
+ };
671
+ Map2.prototype._find = function(key, insert) {
672
+ if (this._cacheKey !== key) {
673
+ this._cacheIndex = this._keys.indexOf(this._cacheKey = key);
674
+ }
675
+ if (this._cacheIndex < 0 && insert) {
676
+ this._cacheIndex = this._keys.length;
677
+ this._keys.push(key);
678
+ this._values.push(void 0);
679
+ }
680
+ return this._cacheIndex;
681
+ };
682
+ return Map2;
683
+ }()
684
+ );
685
+ function getKey(key, _) {
686
+ return key;
687
+ }
688
+ function getValue(_, value) {
689
+ return value;
690
+ }
691
+ function getEntry(key, value) {
692
+ return [key, value];
693
+ }
694
+ }
695
+ __name(CreateMapPolyfill, "CreateMapPolyfill");
696
+ function CreateSetPolyfill() {
697
+ return (
698
+ /** @class */
699
+ function() {
700
+ function Set2() {
701
+ this._map = new _Map();
702
+ }
703
+ __name(Set2, "Set");
704
+ Object.defineProperty(Set2.prototype, "size", {
705
+ get: function() {
706
+ return this._map.size;
707
+ },
708
+ enumerable: true,
709
+ configurable: true
710
+ });
711
+ Set2.prototype.has = function(value) {
712
+ return this._map.has(value);
713
+ };
714
+ Set2.prototype.add = function(value) {
715
+ return this._map.set(value, value), this;
716
+ };
717
+ Set2.prototype.delete = function(value) {
718
+ return this._map.delete(value);
719
+ };
720
+ Set2.prototype.clear = function() {
721
+ this._map.clear();
722
+ };
723
+ Set2.prototype.keys = function() {
724
+ return this._map.keys();
725
+ };
726
+ Set2.prototype.values = function() {
727
+ return this._map.values();
728
+ };
729
+ Set2.prototype.entries = function() {
730
+ return this._map.entries();
731
+ };
732
+ Set2.prototype["@@iterator"] = function() {
733
+ return this.keys();
734
+ };
735
+ Set2.prototype[iteratorSymbol] = function() {
736
+ return this.keys();
737
+ };
738
+ return Set2;
739
+ }()
740
+ );
741
+ }
742
+ __name(CreateSetPolyfill, "CreateSetPolyfill");
743
+ function CreateWeakMapPolyfill() {
744
+ var UUID_SIZE = 16;
745
+ var keys = HashMap.create();
746
+ var rootKey = CreateUniqueKey();
747
+ return (
748
+ /** @class */
749
+ function() {
750
+ function WeakMap2() {
751
+ this._key = CreateUniqueKey();
752
+ }
753
+ __name(WeakMap2, "WeakMap");
754
+ WeakMap2.prototype.has = function(target) {
755
+ var table = GetOrCreateWeakMapTable(
756
+ target,
757
+ /*create*/
758
+ false
759
+ );
760
+ return table !== void 0 ? HashMap.has(table, this._key) : false;
761
+ };
762
+ WeakMap2.prototype.get = function(target) {
763
+ var table = GetOrCreateWeakMapTable(
764
+ target,
765
+ /*create*/
766
+ false
767
+ );
768
+ return table !== void 0 ? HashMap.get(table, this._key) : void 0;
769
+ };
770
+ WeakMap2.prototype.set = function(target, value) {
771
+ var table = GetOrCreateWeakMapTable(
772
+ target,
773
+ /*create*/
774
+ true
775
+ );
776
+ table[this._key] = value;
777
+ return this;
778
+ };
779
+ WeakMap2.prototype.delete = function(target) {
780
+ var table = GetOrCreateWeakMapTable(
781
+ target,
782
+ /*create*/
783
+ false
784
+ );
785
+ return table !== void 0 ? delete table[this._key] : false;
786
+ };
787
+ WeakMap2.prototype.clear = function() {
788
+ this._key = CreateUniqueKey();
789
+ };
790
+ return WeakMap2;
791
+ }()
792
+ );
793
+ function CreateUniqueKey() {
794
+ var key;
795
+ do
796
+ key = "@@WeakMap@@" + CreateUUID();
797
+ while (HashMap.has(keys, key));
798
+ keys[key] = true;
799
+ return key;
800
+ }
801
+ function GetOrCreateWeakMapTable(target, create) {
802
+ if (!hasOwn.call(target, rootKey)) {
803
+ if (!create)
804
+ return void 0;
805
+ Object.defineProperty(target, rootKey, { value: HashMap.create() });
806
+ }
807
+ return target[rootKey];
808
+ }
809
+ function FillRandomBytes(buffer, size) {
810
+ for (var i = 0; i < size; ++i)
811
+ buffer[i] = Math.random() * 255 | 0;
812
+ return buffer;
813
+ }
814
+ function GenRandomBytes(size) {
815
+ if (typeof Uint8Array === "function") {
816
+ if (typeof crypto !== "undefined")
817
+ return crypto.getRandomValues(new Uint8Array(size));
818
+ if (typeof msCrypto !== "undefined")
819
+ return msCrypto.getRandomValues(new Uint8Array(size));
820
+ return FillRandomBytes(new Uint8Array(size), size);
821
+ }
822
+ return FillRandomBytes(new Array(size), size);
823
+ }
824
+ function CreateUUID() {
825
+ var data = GenRandomBytes(UUID_SIZE);
826
+ data[6] = data[6] & 79 | 64;
827
+ data[8] = data[8] & 191 | 128;
828
+ var result = "";
829
+ for (var offset = 0; offset < UUID_SIZE; ++offset) {
830
+ var byte = data[offset];
831
+ if (offset === 4 || offset === 6 || offset === 8)
832
+ result += "-";
833
+ if (byte < 16)
834
+ result += "0";
835
+ result += byte.toString(16).toLowerCase();
836
+ }
837
+ return result;
838
+ }
839
+ }
840
+ __name(CreateWeakMapPolyfill, "CreateWeakMapPolyfill");
841
+ function MakeDictionary(obj) {
842
+ obj.__ = void 0;
843
+ delete obj.__;
844
+ return obj;
845
+ }
846
+ __name(MakeDictionary, "MakeDictionary");
847
+ });
848
+ })(Reflect || (Reflect = {}));
849
+ /*! Bundled license information:
850
+
851
+ reflect-metadata/Reflect.js:
852
+ (*! *****************************************************************************
853
+ Copyright (C) Microsoft. All rights reserved.
854
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
855
+ this file except in compliance with the License. You may obtain a copy of the
856
+ License at http://www.apache.org/licenses/LICENSE-2.0
857
+
858
+ THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
859
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
860
+ WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
861
+ MERCHANTABLITY OR NON-INFRINGEMENT.
862
+
863
+ See the Apache Version 2.0 License for specific language governing permissions
864
+ and limitations under the License.
865
+ ***************************************************************************** *)
866
+ */
867
+ //# sourceMappingURL=out.js.map
868
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9yZWZsZWN0LW1ldGFkYXRhL1JlZmxlY3QuanMiXSwibmFtZXMiOlsiUmVmbGVjdCIsImhhc093biIsIk1hcEl0ZXJhdG9yIiwiTWFwIiwiU2V0IiwiV2Vha01hcCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFjQSxJQUFJO0FBQUEsQ0FDSCxTQUFVQSxVQUFTO0FBR2hCLEdBQUMsU0FBVSxTQUFTO0FBQ2hCLFFBQUksT0FBTyxPQUFPLFdBQVcsV0FBVyxTQUNwQyxPQUFPLFNBQVMsV0FBVyxPQUN2QixPQUFPLFNBQVMsV0FBVyxPQUN2QixTQUFTLGNBQWMsRUFBRTtBQUNyQyxRQUFJLFdBQVcsYUFBYUEsUUFBTztBQUNuQyxRQUFJLE9BQU8sS0FBSyxZQUFZLGFBQWE7QUFDckMsV0FBSyxVQUFVQTtBQUFBLElBQ25CLE9BQ0s7QUFDRCxpQkFBVyxhQUFhLEtBQUssU0FBUyxRQUFRO0FBQUEsSUFDbEQ7QUFDQSxZQUFRLFFBQVE7QUFDaEIsYUFBUyxhQUFhLFFBQVEsVUFBVTtBQUNwQyxhQUFPLFNBQVUsS0FBSyxPQUFPO0FBQ3pCLFlBQUksT0FBTyxPQUFPLEdBQUcsTUFBTSxZQUFZO0FBQ25DLGlCQUFPLGVBQWUsUUFBUSxLQUFLLEVBQUUsY0FBYyxNQUFNLFVBQVUsTUFBTSxNQUFhLENBQUM7QUFBQSxRQUMzRjtBQUNBLFlBQUk7QUFDQSxtQkFBUyxLQUFLLEtBQUs7QUFBQSxNQUMzQjtBQUFBLElBQ0o7QUFSUztBQUFBLEVBU2IsR0FBRyxTQUFVLFVBQVU7QUFDbkIsUUFBSSxTQUFTLE9BQU8sVUFBVTtBQUU5QixRQUFJLGlCQUFpQixPQUFPLFdBQVc7QUFDdkMsUUFBSSxvQkFBb0Isa0JBQWtCLE9BQU8sT0FBTyxnQkFBZ0IsY0FBYyxPQUFPLGNBQWM7QUFDM0csUUFBSSxpQkFBaUIsa0JBQWtCLE9BQU8sT0FBTyxhQUFhLGNBQWMsT0FBTyxXQUFXO0FBQ2xHLFFBQUksaUJBQWlCLE9BQU8sT0FBTyxXQUFXO0FBQzlD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QUksT0FBTyxhQUFhO0FBQ3BCLG1CQUFPLFNBQVMsZ0JBQWdCLElBQUksV0FBVyxJQUFJLENBQUM7QUFDeEQsaUJBQU8sZ0JBQWdCLElBQUksV0FBVyxJQUFJLEdBQUcsSUFBSTtBQUFBLFFBQ3JEO0FBQ0EsZUFBTyxnQkFBZ0IsSUFBSSxNQUFNLElBQUksR0FBRyxJQUFJO0FBQUEsTUFDaEQ7QUFUUztBQVVULGVBQVMsYUFBYTtBQUNsQixZQUFJLE9BQU8sZUFBZSxTQUFTO0FBRW5DLGFBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQU87QUFDM0IsYUFBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksTUFBTztBQUMzQixZQUFJLFNBQVM7QUFDYixpQkFBUyxTQUFTLEdBQUcsU0FBUyxXQUFXLEVBQUUsUUFBUTtBQUMvQyxjQUFJLE9BQU8sS0FBSyxNQUFNO0FBQ3RCLGNBQUksV0FBVyxLQUFLLFdBQVcsS0FBSyxXQUFXO0FBQzNDLHNCQUFVO0FBQ2QsY0FBSSxPQUFPO0FBQ1Asc0JBQVU7QUFDZCxvQkFBVSxLQUFLLFNBQVMsRUFBRSxFQUFFLFlBQVk7QUFBQSxRQUM1QztBQUNBLGVBQU87QUFBQSxNQUNYO0FBZlM7QUFBQSxJQWdCYjtBQTlFUztBQWdGVCxhQUFTLGVBQWUsS0FBSztBQUN6QixVQUFJLEtBQUs7QUFDVCxhQUFPLElBQUk7QUFDWCxhQUFPO0FBQUEsSUFDWDtBQUpTO0FBQUEsRUFLYixDQUFDO0FBQ0wsR0FBRyxZQUFZLFVBQVUsQ0FBQyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKEMpIE1pY3Jvc29mdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG52YXIgUmVmbGVjdDtcbihmdW5jdGlvbiAoUmVmbGVjdCkge1xuICAgIC8vIE1ldGFkYXRhIFByb3Bvc2FsXG4gICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS9cbiAgICAoZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICAgICAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsID09PSBcIm9iamVjdFwiID8gZ2xvYmFsIDpcbiAgICAgICAgICAgIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6XG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMgPT09IFwib2JqZWN0XCIgPyB0aGlzIDpcbiAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24oXCJyZXR1cm4gdGhpcztcIikoKTtcbiAgICAgICAgdmFyIGV4cG9ydGVyID0gbWFrZUV4cG9ydGVyKFJlZmxlY3QpO1xuICAgICAgICBpZiAodHlwZW9mIHJvb3QuUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcm9vdC5SZWZsZWN0ID0gUmVmbGVjdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9ydGVyID0gbWFrZUV4cG9ydGVyKHJvb3QuUmVmbGVjdCwgZXhwb3J0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZhY3RvcnkoZXhwb3J0ZXIpO1xuICAgICAgICBmdW5jdGlvbiBtYWtlRXhwb3J0ZXIodGFyZ2V0LCBwcmV2aW91cykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgeyBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91cylcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSkoZnVuY3Rpb24gKGV4cG9ydGVyKSB7XG4gICAgICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICAgICAgICAvLyBmZWF0dXJlIHRlc3QgZm9yIFN5bWJvbCBzdXBwb3J0XG4gICAgICAgIHZhciBzdXBwb3J0c1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgdmFyIHRvUHJpbWl0aXZlU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC50b1ByaW1pdGl2ZSAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC50b1ByaW1pdGl2ZSA6IFwiQEB0b1ByaW1pdGl2ZVwiO1xuICAgICAgICB2YXIgaXRlcmF0b3JTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gU3ltYm9sLml0ZXJhdG9yIDogXCJAQGl0ZXJhdG9yXCI7XG4gICAgICAgIHZhciBzdXBwb3J0c0NyZWF0ZSA9IHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSBcImZ1bmN0aW9uXCI7IC8vIGZlYXR1cmUgdGVzdCBmb3IgT2JqZWN0LmNyZWF0ZSBzdXBwb3J0XG4gICAgICAgIHZhciBzdXBwb3J0c1Byb3RvID0geyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheTsgLy8gZmVhdHVyZSB0ZXN0IGZvciBfX3Byb3RvX18gc3VwcG9ydFxuICAgICAgICB2YXIgZG93bkxldmVsID0gIXN1cHBvcnRzQ3JlYXRlICYmICFzdXBwb3J0c1Byb3RvO1xuICAgICAgICB2YXIgSGFzaE1hcCA9IHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBvYmplY3QgaW4gZGljdGlvbmFyeSBtb2RlIChhLmsuYS4gXCJzbG93XCIgbW9kZSBpbiB2OClcbiAgICAgICAgICAgIGNyZWF0ZTogc3VwcG9ydHNDcmVhdGVcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KE9iamVjdC5jcmVhdGUobnVsbCkpOyB9XG4gICAgICAgICAgICAgICAgOiBzdXBwb3J0c1Byb3RvXG4gICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoeyBfX3Byb3RvX186IG51bGwgfSk7IH1cbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeSh7fSk7IH0sXG4gICAgICAgICAgICBoYXM6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSk7IH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4ga2V5IGluIG1hcDsgfSxcbiAgICAgICAgICAgIGdldDogZG93bkxldmVsXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGhhc093bi5jYWxsKG1hcCwga2V5KSA/IG1hcFtrZXldIDogdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIG1hcFtrZXldOyB9LFxuICAgICAgICB9O1xuICAgICAgICAvLyBMb2FkIGdsb2JhbCBvciBzaGltIHZlcnNpb25zIG9mIE1hcCwgU2V0LCBhbmQgV2Vha01hcFxuICAgICAgICB2YXIgZnVuY3Rpb25Qcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRnVuY3Rpb24pO1xuICAgICAgICB2YXIgdXNlUG9seWZpbGwgPSB0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudltcIlJFRkxFQ1RfTUVUQURBVEFfVVNFX01BUF9QT0xZRklMTFwiXSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgIHZhciBfTWFwID0gIXVzZVBvbHlmaWxsICYmIHR5cGVvZiBNYXAgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgTWFwLnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBNYXAgOiBDcmVhdGVNYXBQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1NldCA9ICF1c2VQb2x5ZmlsbCAmJiB0eXBlb2YgU2V0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gU2V0IDogQ3JlYXRlU2V0UG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9XZWFrTWFwID0gIXVzZVBvbHlmaWxsICYmIHR5cGVvZiBXZWFrTWFwID09PSBcImZ1bmN0aW9uXCIgPyBXZWFrTWFwIDogQ3JlYXRlV2Vha01hcFBvbHlmaWxsKCk7XG4gICAgICAgIC8vIFtbTWV0YWRhdGFdXSBpbnRlcm5hbCBzbG90XG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICB2YXIgTWV0YWRhdGEgPSBuZXcgX1dlYWtNYXAoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFwcGxpZXMgYSBzZXQgb2YgZGVjb3JhdG9ycyB0byBhIHByb3BlcnR5IG9mIGEgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIGRlY29yYXRvcnMgQW4gYXJyYXkgb2YgZGVjb3JhdG9ycy5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSB0byBkZWNvcmF0ZS5cbiAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCBrZXkuXG4gICAgICAgICAqIEByZW1hcmtzIERlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgRXhhbXBsZSA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGF0dHJpYnV0ZXMpICYmICFJc1VuZGVmaW5lZChhdHRyaWJ1dGVzKSAmJiAhSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKElzTnVsbChhdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0FycmF5KGRlY29yYXRvcnMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0NvbnN0cnVjdG9yKHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGVDb25zdHJ1Y3RvcihkZWNvcmF0b3JzLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVjb3JhdGVcIiwgZGVjb3JhdGUpO1xuICAgICAgICAvLyA0LjEuMiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNyZWZsZWN0Lm1ldGFkYXRhXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGRlZmF1bHQgbWV0YWRhdGEgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCBvbiBhIGNsYXNzLCBjbGFzcyBtZW1iZXIsIG9yIHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhVmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEgZW50cnkuXG4gICAgICAgICAqIEByZXR1cm5zIEEgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiBgbWV0YWRhdGFLZXlgIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhlIHRhcmdldCBhbmQgdGFyZ2V0IGtleSwgdGhlXG4gICAgICAgICAqIG1ldGFkYXRhVmFsdWUgZm9yIHRoYXQga2V5IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yLCBUeXBlU2NyaXB0IG9ubHkpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgcHJvcGVydHk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBtZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICAgICAgICAgICAgZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSAmJiAhSXNQcm9wZXJ0eUtleShwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWNvcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJtZXRhZGF0YVwiLCBtZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmUgYSB1bmlxdWUgbWV0YWRhdGEgZW50cnkgb24gdGhlIHRhcmdldC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBBIHZhbHVlIHRoYXQgY29udGFpbnMgYXR0YWNoZWQgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdG8gZGVmaW5lIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gZGVjb3JhdG9yIGZhY3RvcnkgYXMgbWV0YWRhdGEtcHJvZHVjaW5nIGFubm90YXRpb24uXG4gICAgICAgICAqICAgICBmdW5jdGlvbiBNeUFubm90YXRpb24ob3B0aW9ucyk6IERlY29yYXRvciB7XG4gICAgICAgICAqICAgICAgICAgcmV0dXJuICh0YXJnZXQsIGtleT8pID0+IFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCB0YXJnZXQsIGtleSk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWZpbmVNZXRhZGF0YVwiLCBkZWZpbmVNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4gaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluOyBvdGhlcndpc2UsIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJoYXNNZXRhZGF0YVwiLCBoYXNNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IGhhcyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtZXRhZGF0YSBrZXkgd2FzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Q7IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc093bk1ldGFkYXRhXCIsIGhhc093bk1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFcIiwgZ2V0TWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFcIiwgZ2V0T3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHVuaXF1ZSBtZXRhZGF0YSBrZXlzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeU1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImdldE1ldGFkYXRhS2V5c1wiLCBnZXRNZXRhZGF0YUtleXMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIG1ldGFkYXRhIGtleXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFLZXlzXCIsIGdldE93bk1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWxldGVzIHRoZSBtZXRhZGF0YSBlbnRyeSBmcm9tIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIHByb3ZpZGVkIGtleS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGVudHJ5IHdhcyBmb3VuZCBhbmQgZGVsZXRlZDsgb3RoZXJ3aXNlLCBmYWxzZS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlbGV0ZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICghbWV0YWRhdGFNYXAuZGVsZXRlKG1ldGFkYXRhS2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGFNYXAuc2l6ZSA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQodGFyZ2V0KTtcbiAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLmRlbGV0ZShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICBpZiAodGFyZ2V0TWV0YWRhdGEuc2l6ZSA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBNZXRhZGF0YS5kZWxldGUodGFyZ2V0KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVsZXRlTWV0YWRhdGFcIiwgZGVsZXRlTWV0YWRhdGEpO1xuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9yID0gZGVjb3JhdG9yc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZGVjb3JhdGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gRGVjb3JhdGVQcm9wZXJ0eShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGRlY29yYXRlZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBDcmVhdGUpIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IE1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZCh0YXJnZXRNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YSA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgTWV0YWRhdGEuc2V0KE8sIHRhcmdldE1ldGFkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IHRhcmdldE1ldGFkYXRhLmdldChQKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuc2V0KFAsIG1ldGFkYXRhTWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YU1hcDtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMS4xIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzbWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIGhhc093biA9IE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgaWYgKGhhc093bilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMi4xIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIFRvQm9vbGVhbihtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMy4xIE9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5Z2V0bWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIGhhc093biA9IE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgaWYgKGhhc093bilcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICghSXNOdWxsKHBhcmVudCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS40LjEgT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRvd25tZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwLmdldChNZXRhZGF0YUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjUuMSBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWRlZmluZW93bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgIG1ldGFkYXRhTWFwLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjYuMSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgb3duS2V5cyA9IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAocGFyZW50ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBvd25LZXlzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEtleXMgPSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhwYXJlbnQsIFApO1xuICAgICAgICAgICAgaWYgKHBhcmVudEtleXMubGVuZ3RoIDw9IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICBpZiAob3duS2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50S2V5cztcbiAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgb3duS2V5c18xID0gb3duS2V5czsgX2kgPCBvd25LZXlzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IG93bktleXNfMVtfaV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIF9hID0gMCwgcGFyZW50S2V5c18xID0gcGFyZW50S2V5czsgX2EgPCBwYXJlbnRLZXlzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IHBhcmVudEtleXNfMVtfYV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS43LjEgT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICAgICAgdmFyIGtleXNPYmogPSBtZXRhZGF0YU1hcC5rZXlzKCk7XG4gICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBHZXRJdGVyYXRvcihrZXlzT2JqKTtcbiAgICAgICAgICAgIHZhciBrID0gMDtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5leHQgPSBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgIGlmICghbmV4dCkge1xuICAgICAgICAgICAgICAgICAgICBrZXlzLmxlbmd0aCA9IGs7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBrZXlzW2tdID0gbmV4dFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGsrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyA2IEVDTUFTY3JpcHQgRGF0YSBUeXAwZXMgYW5kIFZhbHVlc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWRhdGEtdHlwZXMtYW5kLXZhbHVlc1xuICAgICAgICBmdW5jdGlvbiBUeXBlKHgpIHtcbiAgICAgICAgICAgIGlmICh4ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIE51bGwgKi87XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOiByZXR1cm4gMCAvKiBVbmRlZmluZWQgKi87XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjogcmV0dXJuIDIgLyogQm9vbGVhbiAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6IHJldHVybiAzIC8qIFN0cmluZyAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6IHJldHVybiA0IC8qIFN5bWJvbCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHJldHVybiA1IC8qIE51bWJlciAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHJldHVybiB4ID09PSBudWxsID8gMSAvKiBOdWxsICovIDogNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDYgLyogT2JqZWN0ICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS4xIFRoZSBVbmRlZmluZWQgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLXVuZGVmaW5lZC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzVW5kZWZpbmVkKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjIgVGhlIE51bGwgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLW51bGwtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc051bGwoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjUgVGhlIFN5bWJvbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtc3ltYm9sLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNTeW1ib2woeCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS43IFRoZSBPYmplY3QgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc09iamVjdCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgPyB4ICE9PSBudWxsIDogdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEgVHlwZSBDb252ZXJzaW9uXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGUtY29udmVyc2lvblxuICAgICAgICAvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQsIFByZWZlcnJlZFR5cGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoVHlwZShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDAgLyogVW5kZWZpbmVkICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAxIC8qIE51bGwgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDIgLyogQm9vbGVhbiAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDQgLyogU3ltYm9sICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSA1IC8qIE51bWJlciAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGhpbnQgPSBQcmVmZXJyZWRUeXBlID09PSAzIC8qIFN0cmluZyAqLyA/IFwic3RyaW5nXCIgOiBQcmVmZXJyZWRUeXBlID09PSA1IC8qIE51bWJlciAqLyA/IFwibnVtYmVyXCIgOiBcImRlZmF1bHRcIjtcbiAgICAgICAgICAgIHZhciBleG90aWNUb1ByaW0gPSBHZXRNZXRob2QoaW5wdXQsIHRvUHJpbWl0aXZlU3ltYm9sKTtcbiAgICAgICAgICAgIGlmIChleG90aWNUb1ByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBleG90aWNUb1ByaW0uY2FsbChpbnB1dCwgaGludCk7XG4gICAgICAgICAgICAgICAgaWYgKElzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIGhpbnQgPT09IFwiZGVmYXVsdFwiID8gXCJudW1iZXJcIiA6IGhpbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xLjEgT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeXRvcHJpbWl0aXZlXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5VG9QcmltaXRpdmUoTywgaGludCkge1xuICAgICAgICAgICAgaWYgKGhpbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMSA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzEuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlT2YgPSBPLnZhbHVlT2Y7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodmFsdWVPZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlT2YuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMiA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzIuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjIgVG9Cb29sZWFuKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvMjAxNi8jc2VjLXRvYm9vbGVhblxuICAgICAgICBmdW5jdGlvbiBUb0Jvb2xlYW4oYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAhIWFyZ3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xMiBUb1N0cmluZyhhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9zdHJpbmdcbiAgICAgICAgZnVuY3Rpb24gVG9TdHJpbmcoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjE0IFRvUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gVG9Qcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgdmFyIGtleSA9IFRvUHJpbWl0aXZlKGFyZ3VtZW50LCAzIC8qIFN0cmluZyAqLyk7XG4gICAgICAgICAgICBpZiAoSXNTeW1ib2woa2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yIFRlc3RpbmcgYW5kIENvbXBhcmlzb24gT3BlcmF0aW9uc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10ZXN0aW5nLWFuZC1jb21wYXJpc29uLW9wZXJhdGlvbnNcbiAgICAgICAgLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNhcnJheVxuICAgICAgICBmdW5jdGlvbiBJc0FycmF5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheVxuICAgICAgICAgICAgICAgID8gQXJyYXkuaXNBcnJheShhcmd1bWVudClcbiAgICAgICAgICAgICAgICA6IGFyZ3VtZW50IGluc3RhbmNlb2YgT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgID8gYXJndW1lbnQgaW5zdGFuY2VvZiBBcnJheVxuICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCkgPT09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuMyBJc0NhbGxhYmxlKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NhbGxhYmxlXG4gICAgICAgIGZ1bmN0aW9uIElzQ2FsbGFibGUoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuNCBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG4gICAgICAgIGZ1bmN0aW9uIElzQ29uc3RydWN0b3IoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi43IElzUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gSXNQcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGFyZ3VtZW50KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyA3LjMgT3BlcmF0aW9ucyBvbiBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24tb2JqZWN0c1xuICAgICAgICAvLyA3LjMuOSBHZXRNZXRob2QoViwgUClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG4gICAgICAgIGZ1bmN0aW9uIEdldE1ldGhvZChWLCBQKSB7XG4gICAgICAgICAgICB2YXIgZnVuYyA9IFZbUF07XG4gICAgICAgICAgICBpZiAoZnVuYyA9PT0gdW5kZWZpbmVkIHx8IGZ1bmMgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQgT3BlcmF0aW9ucyBvbiBJdGVyYXRvciBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24taXRlcmF0b3Itb2JqZWN0c1xuICAgICAgICBmdW5jdGlvbiBHZXRJdGVyYXRvcihvYmopIHtcbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBHZXRNZXRob2Qob2JqLCBpdGVyYXRvclN5bWJvbCk7XG4gICAgICAgICAgICBpZiAoIUlzQ2FsbGFibGUobWV0aG9kKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIGZyb20gQ2FsbFxuICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbWV0aG9kLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QoaXRlcmF0b3IpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQuNCBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtaXRlcmF0b3J2YWx1ZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVyUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC41IEl0ZXJhdG9yU3RlcChpdGVyYXRvcilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JzdGVwXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yU3RlcChpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IGZhbHNlIDogcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yY2xvc2VcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JDbG9zZShpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIGYgPSBpdGVyYXRvcltcInJldHVyblwiXTtcbiAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgIGYuY2FsbChpdGVyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gOS4xIE9yZGluYXJ5IE9iamVjdCBJbnRlcm5hbCBNZXRob2RzIGFuZCBJbnRlcm5hbCBTbG90c1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgLy8gOS4xLjEuMSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5Z2V0cHJvdG90eXBlb2ZcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKSB7XG4gICAgICAgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIE8gIT09IFwiZnVuY3Rpb25cIiB8fCBPID09PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3Qgc2V0IF9fcHJvdG9fXyBpbiBFUzUsIGFzIGl0J3Mgbm9uLXN0YW5kYXJkLlxuICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4gQ29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgICAgIC8vIG11c3QgZWl0aGVyIHNldCBfX3Byb3RvX18gb24gYSBzdWJjbGFzcyBjb25zdHJ1Y3RvciB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIC8vIG9yIGVuc3VyZSBlYWNoIGNsYXNzIGhhcyBhIHZhbGlkIGBjb25zdHJ1Y3RvcmAgcHJvcGVydHkgb24gaXRzIHByb3RvdHlwZSB0aGF0XG4gICAgICAgICAgICAvLyBwb2ludHMgYmFjayB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBGdW5jdGlvbi5bW1Byb3RvdHlwZV1dLCB0aGVuIHRoaXMgaXMgZGVmaW5hdGVseSBpbmhlcml0ZWQuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gaW4gRVM2IG9yIHdoZW4gdXNpbmcgX19wcm90b19fIGluIGEgY29tcGF0aWJsZSBicm93c2VyLlxuICAgICAgICAgICAgaWYgKHByb3RvICE9PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB0aGUgc3VwZXIgcHJvdG90eXBlIGlzIE9iamVjdC5wcm90b3R5cGUsIG51bGwsIG9yIHVuZGVmaW5lZCwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBPLnByb3RvdHlwZTtcbiAgICAgICAgICAgIHZhciBwcm90b3R5cGVQcm90byA9IHByb3RvdHlwZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICAgICAgICAgIGlmIChwcm90b3R5cGVQcm90byA9PSBudWxsIHx8IHByb3RvdHlwZVByb3RvID09PSBPYmplY3QucHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciB3YXMgbm90IGEgZnVuY3Rpb24sIHRoZW4gd2UgY2Fubm90IGRldGVybWluZSB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90b3R5cGVQcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHNvbWUga2luZCBvZiBzZWxmLXJlZmVyZW5jZSwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciA9PT0gTylcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Vlc3MgYXQgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIE1hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1hcFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlU2VudGluZWwgPSB7fTtcbiAgICAgICAgICAgIHZhciBhcnJheVNlbnRpbmVsID0gW107XG4gICAgICAgICAgICB2YXIgTWFwSXRlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwSXRlcmF0b3Ioa2V5cywgdmFsdWVzLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX3NlbGVjdG9yKHRoaXMuX2tleXNbaW5kZXhdLCB0aGlzLl92YWx1ZXNbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gdGhpcy5fa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUucmV0dXJuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcEl0ZXJhdG9yO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHJldHVybiAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpID49IDA7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyB0aGlzLl92YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4ICsgMTsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXNbaSAtIDFdID0gdGhpcy5fa2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaSAtIDFdID0gdGhpcy5fdmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IHRoaXMuX2NhY2hlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0S2V5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldFZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRFbnRyeSk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuX2ZpbmQgPSBmdW5jdGlvbiAoa2V5LCBpbnNlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlS2V5ICE9PSBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSB0aGlzLl9rZXlzLmluZGV4T2YodGhpcy5fY2FjaGVLZXkgPSBrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZUluZGV4IDwgMCAmJiBpbnNlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSB0aGlzLl9rZXlzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVJbmRleDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXA7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0S2V5KGtleSwgXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRWYWx1ZShfLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudHJ5KGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFNldCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVNldFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTZXQucHJvdG90eXBlLCBcInNpemVcIiwge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5zaXplOyB9LFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmhhcyh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRoaXMuX21hcC5zZXQodmFsdWUsIHZhbHVlKSwgdGhpczsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fbWFwLmNsZWFyKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC52YWx1ZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbXCJAQGl0ZXJhdG9yXCJdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBuYWl2ZSBXZWFrTWFwIHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlV2Vha01hcFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIFVVSURfU0laRSA9IDE2O1xuICAgICAgICAgICAgdmFyIGtleXMgPSBIYXNoTWFwLmNyZWF0ZSgpO1xuICAgICAgICAgICAgdmFyIHJvb3RLZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgIHJldHVybiAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gV2Vha01hcCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBIYXNoTWFwLmhhcyh0YWJsZSwgdGhpcy5fa2V5KSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuZ2V0KHRhYmxlLCB0aGlzLl9rZXkpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHRhcmdldCwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0YWJsZVt0aGlzLl9rZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IGRlbGV0ZSB0YWJsZVt0aGlzLl9rZXldIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogbm90IGEgcmVhbCBjbGVhciwganVzdCBtYWtlcyB0aGUgcHJldmlvdXMgZGF0YSB1bnJlYWNoYWJsZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBXZWFrTWFwO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIENyZWF0ZVVuaXF1ZUtleSgpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5O1xuICAgICAgICAgICAgICAgIGRvXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IFwiQEBXZWFrTWFwQEBcIiArIENyZWF0ZVVVSUQoKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoSGFzaE1hcC5oYXMoa2V5cywga2V5KSk7XG4gICAgICAgICAgICAgICAga2V5c1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCBjcmVhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc093bi5jYWxsKHRhcmdldCwgcm9vdEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCByb290S2V5LCB7IHZhbHVlOiBIYXNoTWFwLmNyZWF0ZSgpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Jvb3RLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gRmlsbFJhbmRvbUJ5dGVzKGJ1ZmZlciwgc2l6ZSkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKVxuICAgICAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSBNYXRoLnJhbmRvbSgpICogMHhmZiB8IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIEdlblJhbmRvbUJ5dGVzKHNpemUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KHNpemUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtc0NyeXB0byAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoc2l6ZSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmlsbFJhbmRvbUJ5dGVzKG5ldyBVaW50OEFycmF5KHNpemUpLCBzaXplKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGxSYW5kb21CeXRlcyhuZXcgQXJyYXkoc2l6ZSksIHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVVVJRCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEdlblJhbmRvbUJ5dGVzKFVVSURfU0laRSk7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBhcyByYW5kb20gLSBSRkMgNDEyMiDCpyA0LjRcbiAgICAgICAgICAgICAgICBkYXRhWzZdID0gZGF0YVs2XSAmIDB4NGYgfCAweDQwO1xuICAgICAgICAgICAgICAgIGRhdGFbOF0gPSBkYXRhWzhdICYgMHhiZiB8IDB4ODA7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgVVVJRF9TSVpFOyArK29mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZSA9IGRhdGFbb2Zmc2V0XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PT0gNCB8fCBvZmZzZXQgPT09IDYgfHwgb2Zmc2V0ID09PSA4KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiLVwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA8IDE2KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gYnl0ZS50b1N0cmluZygxNikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB1c2VzIGEgaGV1cmlzdGljIHVzZWQgYnkgdjggYW5kIGNoYWtyYSB0byBmb3JjZSBhbiBvYmplY3QgaW50byBkaWN0aW9uYXJ5IG1vZGUuXG4gICAgICAgIGZ1bmN0aW9uIE1ha2VEaWN0aW9uYXJ5KG9iaikge1xuICAgICAgICAgICAgb2JqLl9fID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZGVsZXRlIG9iai5fXztcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pKFJlZmxlY3QgfHwgKFJlZmxlY3QgPSB7fSkpO1xuIl19