@logixjs/sandbox 0.0.1 → 0.0.2

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 (248) hide show
  1. package/LICENSE +201 -0
  2. package/package.json +3 -1
  3. package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
  4. package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
  5. package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
  6. package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
  7. package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
  8. package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
  9. package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
  10. package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
  11. package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
  12. package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
  13. package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
  14. package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
  15. package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
  16. package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
  17. package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
  18. package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
  19. package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
  20. package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
  21. package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
  22. package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
  23. package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
  24. package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
  25. package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
  26. package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
  27. package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
  28. package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
  29. package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
  30. package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
  31. package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
  32. package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
  33. package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
  34. package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
  35. package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
  36. package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
  37. package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
  38. package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
  39. package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
  40. package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
  41. package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
  42. package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
  43. package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
  44. package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
  45. package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
  46. package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
  47. package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
  48. package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
  49. package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
  50. package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
  51. package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
  52. package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
  53. package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
  54. package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
  55. package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
  56. package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
  57. package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
  58. package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
  59. package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
  60. package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
  61. package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
  62. package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
  63. package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
  64. package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
  65. package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
  66. package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
  67. package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
  68. package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
  69. package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
  70. package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
  71. package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
  72. package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
  73. package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
  74. package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
  75. package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
  76. package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
  77. package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
  78. package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
  79. package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
  80. package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
  81. package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
  82. package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
  83. package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
  84. package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
  85. package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
  86. package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
  87. package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
  88. package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
  89. package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
  90. package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
  91. package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
  92. package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
  93. package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
  94. package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
  95. package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
  96. package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
  97. package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
  98. package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
  99. package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
  100. package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
  101. package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
  102. package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
  103. package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
  104. package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
  105. package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
  106. package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
  107. package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
  108. package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
  109. package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
  110. package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
  111. package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
  112. package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
  113. package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
  114. package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
  115. package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
  116. package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
  117. package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
  118. package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
  119. package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
  120. package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
  121. package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
  122. package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
  123. package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
  124. package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
  125. package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
  126. package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
  127. package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
  128. package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
  129. package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
  130. package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
  131. package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
  132. package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
  133. package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
  134. package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
  135. package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
  136. package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
  137. package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
  138. package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
  139. package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
  140. package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
  141. package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
  142. package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
  143. package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
  144. package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
  145. package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
  146. package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
  147. package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
  148. package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
  149. package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
  150. package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
  151. package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
  152. package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
  153. package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
  154. package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
  155. package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
  156. package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
  157. package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
  158. package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
  159. package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
  160. package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
  161. package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
  162. package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
  163. package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
  164. package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
  165. package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
  166. package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
  167. package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
  168. package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
  169. package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
  170. package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
  171. package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
  172. package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
  173. package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
  174. package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
  175. package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
  176. package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
  177. package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
  178. package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
  179. package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
  180. package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
  181. package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
  182. package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
  183. package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
  184. package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
  185. package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
  186. package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
  187. package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
  188. package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
  189. package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
  190. package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
  191. package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
  192. package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
  193. package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
  194. package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
  195. package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
  196. package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
  197. package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
  198. package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
  199. package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
  200. package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
  201. package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
  202. package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
  203. package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
  204. package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
  205. package/public/sandbox/logix-core/Bound.js +14 -14
  206. package/public/sandbox/logix-core/Debug.js +12 -10
  207. package/public/sandbox/logix-core/EffectOp.js +3 -4
  208. package/public/sandbox/logix-core/Env.js +5 -2
  209. package/public/sandbox/logix-core/ExternalStore.js +239 -0
  210. package/public/sandbox/logix-core/Flow.js +7 -8
  211. package/public/sandbox/logix-core/Kernel.js +7 -4
  212. package/public/sandbox/logix-core/Link.js +33 -25
  213. package/public/sandbox/logix-core/Middleware.js +13 -11
  214. package/public/sandbox/logix-core/Module.js +93 -30
  215. package/public/sandbox/logix-core/ModuleTag.js +28 -25
  216. package/public/sandbox/logix-core/Observability.js +21 -19
  217. package/public/sandbox/logix-core/Process.js +27 -22
  218. package/public/sandbox/logix-core/ReadQuery.js +7 -11
  219. package/public/sandbox/logix-core/Reflection.js +173 -53
  220. package/public/sandbox/logix-core/Resource.js +6 -3
  221. package/public/sandbox/logix-core/Root.js +7 -3
  222. package/public/sandbox/logix-core/Runtime.js +54 -40
  223. package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
  224. package/public/sandbox/logix-core/StateTrait.js +17 -14
  225. package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
  226. package/public/sandbox/logix-core/Workflow.js +332 -0
  227. package/public/sandbox/logix-core.js +11133 -6622
  228. package/public/sandbox/logix-core.manifest.json +4 -2
  229. package/public/sandbox/worker.js +3 -3
  230. package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
  231. package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
  232. package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
  233. package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
  234. package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
  235. package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
  236. package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
  237. package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
  238. package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
  239. package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
  240. package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
  241. package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
  242. package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
  243. package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
  244. package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
  245. package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
  246. package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
  247. package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
  248. package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
@@ -2649,11 +2649,11 @@ var remoteBundlePlugin = {
2649
2649
  }
2650
2650
  return { path: toAtEffectPath(pkg, subpath), external: true };
2651
2651
  });
2652
- build2.onResolve({ filter: /^@logix\/core$/ }, () => ({
2652
+ build2.onResolve({ filter: /^@logixjs\/core$/ }, () => ({
2653
2653
  path: kernelPath,
2654
2654
  external: true
2655
2655
  }));
2656
- build2.onResolve({ filter: /^@logix\/core\// }, (args) => {
2656
+ build2.onResolve({ filter: /^@logixjs\/core\// }, (args) => {
2657
2657
  const rawSubpath = args.path.slice("@logixjs/core/".length);
2658
2658
  const info = getLogixCoreSubpathInfo(rawSubpath);
2659
2659
  if (!info.normalized) {
@@ -3313,4 +3313,4 @@ self.onmessage = async (e) => {
3313
3313
  }
3314
3314
  };
3315
3315
  console.log("[Sandbox] Worker \u811A\u672C\u5DF2\u52A0\u8F7D");
3316
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2VzYnVpbGQtd2FzbUAwLjI3LjEvbm9kZV9tb2R1bGVzL2VzYnVpbGQtd2FzbS9saWIvYnJvd3Nlci5qcyIsICIuLi8uLi9zcmMvaW50ZXJuYWwvY29tcGlsZXIvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2ludGVybmFsL3dvcmtlci9zYW5kYm94Lndvcmtlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiKG1vZHVsZT0+e1xuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIF9fZ2V0T3duUHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbCkgPT4ge1xuICBmb3IgKHZhciBuYW1lIGluIGFsbClcbiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xufTtcbnZhciBfX2NvcHlQcm9wcyA9ICh0bywgZnJvbSwgZXhjZXB0LCBkZXNjKSA9PiB7XG4gIGlmIChmcm9tICYmIHR5cGVvZiBmcm9tID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBmcm9tID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBmb3IgKGxldCBrZXkgb2YgX19nZXRPd25Qcm9wTmFtZXMoZnJvbSkpXG4gICAgICBpZiAoIV9faGFzT3duUHJvcC5jYWxsKHRvLCBrZXkpICYmIGtleSAhPT0gZXhjZXB0KVxuICAgICAgICBfX2RlZlByb3AodG8sIGtleSwgeyBnZXQ6ICgpID0+IGZyb21ba2V5XSwgZW51bWVyYWJsZTogIShkZXNjID0gX19nZXRPd25Qcm9wRGVzYyhmcm9tLCBrZXkpKSB8fCBkZXNjLmVudW1lcmFibGUgfSk7XG4gIH1cbiAgcmV0dXJuIHRvO1xufTtcbnZhciBfX3RvQ29tbW9uSlMgPSAobW9kKSA9PiBfX2NvcHlQcm9wcyhfX2RlZlByb3Aoe30sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pLCBtb2QpO1xudmFyIF9fYXN5bmMgPSAoX190aGlzLCBfX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdmFyIGZ1bGZpbGxlZCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgcmVqZWN0ZWQgPSAodmFsdWUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yLnRocm93KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBzdGVwID0gKHgpID0+IHguZG9uZSA/IHJlc29sdmUoeC52YWx1ZSkgOiBQcm9taXNlLnJlc29sdmUoeC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkoX190aGlzLCBfX2FyZ3VtZW50cykpLm5leHQoKSk7XG4gIH0pO1xufTtcblxuLy8gbGliL25wbS9icm93c2VyLnRzXG52YXIgYnJvd3Nlcl9leHBvcnRzID0ge307XG5fX2V4cG9ydChicm93c2VyX2V4cG9ydHMsIHtcbiAgYW5hbHl6ZU1ldGFmaWxlOiAoKSA9PiBhbmFseXplTWV0YWZpbGUsXG4gIGFuYWx5emVNZXRhZmlsZVN5bmM6ICgpID0+IGFuYWx5emVNZXRhZmlsZVN5bmMsXG4gIGJ1aWxkOiAoKSA9PiBidWlsZCxcbiAgYnVpbGRTeW5jOiAoKSA9PiBidWlsZFN5bmMsXG4gIGNvbnRleHQ6ICgpID0+IGNvbnRleHQsXG4gIGRlZmF1bHQ6ICgpID0+IGJyb3dzZXJfZGVmYXVsdCxcbiAgZm9ybWF0TWVzc2FnZXM6ICgpID0+IGZvcm1hdE1lc3NhZ2VzLFxuICBmb3JtYXRNZXNzYWdlc1N5bmM6ICgpID0+IGZvcm1hdE1lc3NhZ2VzU3luYyxcbiAgaW5pdGlhbGl6ZTogKCkgPT4gaW5pdGlhbGl6ZSxcbiAgc3RvcDogKCkgPT4gc3RvcCxcbiAgdHJhbnNmb3JtOiAoKSA9PiB0cmFuc2Zvcm0sXG4gIHRyYW5zZm9ybVN5bmM6ICgpID0+IHRyYW5zZm9ybVN5bmMsXG4gIHZlcnNpb246ICgpID0+IHZlcnNpb25cbn0pO1xubW9kdWxlLmV4cG9ydHMgPSBfX3RvQ29tbW9uSlMoYnJvd3Nlcl9leHBvcnRzKTtcblxuLy8gbGliL3NoYXJlZC9zdGRpb19wcm90b2NvbC50c1xuZnVuY3Rpb24gZW5jb2RlUGFja2V0KHBhY2tldCkge1xuICBsZXQgdmlzaXQgPSAodmFsdWUpID0+IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGJiLndyaXRlOCgwKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGJiLndyaXRlOCgxKTtcbiAgICAgIGJiLndyaXRlOCgrdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBiYi53cml0ZTgoMik7XG4gICAgICBiYi53cml0ZTMyKHZhbHVlIHwgMCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGJiLndyaXRlOCgzKTtcbiAgICAgIGJiLndyaXRlKGVuY29kZVVURjgodmFsdWUpKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgYmIud3JpdGU4KDQpO1xuICAgICAgYmIud3JpdGUodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgYmIud3JpdGU4KDUpO1xuICAgICAgYmIud3JpdGUzMih2YWx1ZS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICB2aXNpdChpdGVtKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gICAgICBiYi53cml0ZTgoNik7XG4gICAgICBiYi53cml0ZTMyKGtleXMubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGJiLndyaXRlKGVuY29kZVVURjgoa2V5KSk7XG4gICAgICAgIHZpc2l0KHZhbHVlW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgbGV0IGJiID0gbmV3IEJ5dGVCdWZmZXIoKTtcbiAgYmIud3JpdGUzMigwKTtcbiAgYmIud3JpdGUzMihwYWNrZXQuaWQgPDwgMSB8ICshcGFja2V0LmlzUmVxdWVzdCk7XG4gIHZpc2l0KHBhY2tldC52YWx1ZSk7XG4gIHdyaXRlVUludDMyTEUoYmIuYnVmLCBiYi5sZW4gLSA0LCAwKTtcbiAgcmV0dXJuIGJiLmJ1Zi5zdWJhcnJheSgwLCBiYi5sZW4pO1xufVxuZnVuY3Rpb24gZGVjb2RlUGFja2V0KGJ5dGVzKSB7XG4gIGxldCB2aXNpdCA9ICgpID0+IHtcbiAgICBzd2l0Y2ggKGJiLnJlYWQ4KCkpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiAhIWJiLnJlYWQ4KCk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBiYi5yZWFkMzIoKTtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIGRlY29kZVVURjgoYmIucmVhZCgpKTtcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcmV0dXJuIGJiLnJlYWQoKTtcbiAgICAgIGNhc2UgNToge1xuICAgICAgICBsZXQgY291bnQgPSBiYi5yZWFkMzIoKTtcbiAgICAgICAgbGV0IHZhbHVlMiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICB2YWx1ZTIucHVzaCh2aXNpdCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUyO1xuICAgICAgfVxuICAgICAgY2FzZSA2OiB7XG4gICAgICAgIGxldCBjb3VudCA9IGJiLnJlYWQzMigpO1xuICAgICAgICBsZXQgdmFsdWUyID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgIHZhbHVlMltkZWNvZGVVVEY4KGJiLnJlYWQoKSldID0gdmlzaXQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUyO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWNrZXRcIik7XG4gICAgfVxuICB9O1xuICBsZXQgYmIgPSBuZXcgQnl0ZUJ1ZmZlcihieXRlcyk7XG4gIGxldCBpZCA9IGJiLnJlYWQzMigpO1xuICBsZXQgaXNSZXF1ZXN0ID0gKGlkICYgMSkgPT09IDA7XG4gIGlkID4+Pj0gMTtcbiAgbGV0IHZhbHVlID0gdmlzaXQoKTtcbiAgaWYgKGJiLnB0ciAhPT0gYnl0ZXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWNrZXRcIik7XG4gIH1cbiAgcmV0dXJuIHsgaWQsIGlzUmVxdWVzdCwgdmFsdWUgfTtcbn1cbnZhciBCeXRlQnVmZmVyID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihidWYgPSBuZXcgVWludDhBcnJheSgxMDI0KSkge1xuICAgIHRoaXMuYnVmID0gYnVmO1xuICAgIHRoaXMubGVuID0gMDtcbiAgICB0aGlzLnB0ciA9IDA7XG4gIH1cbiAgX3dyaXRlKGRlbHRhKSB7XG4gICAgaWYgKHRoaXMubGVuICsgZGVsdGEgPiB0aGlzLmJ1Zi5sZW5ndGgpIHtcbiAgICAgIGxldCBjbG9uZSA9IG5ldyBVaW50OEFycmF5KCh0aGlzLmxlbiArIGRlbHRhKSAqIDIpO1xuICAgICAgY2xvbmUuc2V0KHRoaXMuYnVmKTtcbiAgICAgIHRoaXMuYnVmID0gY2xvbmU7XG4gICAgfVxuICAgIHRoaXMubGVuICs9IGRlbHRhO1xuICAgIHJldHVybiB0aGlzLmxlbiAtIGRlbHRhO1xuICB9XG4gIHdyaXRlOCh2YWx1ZSkge1xuICAgIGxldCBvZmZzZXQgPSB0aGlzLl93cml0ZSgxKTtcbiAgICB0aGlzLmJ1ZltvZmZzZXRdID0gdmFsdWU7XG4gIH1cbiAgd3JpdGUzMih2YWx1ZSkge1xuICAgIGxldCBvZmZzZXQgPSB0aGlzLl93cml0ZSg0KTtcbiAgICB3cml0ZVVJbnQzMkxFKHRoaXMuYnVmLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgfVxuICB3cml0ZShieXRlcykge1xuICAgIGxldCBvZmZzZXQgPSB0aGlzLl93cml0ZSg0ICsgYnl0ZXMubGVuZ3RoKTtcbiAgICB3cml0ZVVJbnQzMkxFKHRoaXMuYnVmLCBieXRlcy5sZW5ndGgsIG9mZnNldCk7XG4gICAgdGhpcy5idWYuc2V0KGJ5dGVzLCBvZmZzZXQgKyA0KTtcbiAgfVxuICBfcmVhZChkZWx0YSkge1xuICAgIGlmICh0aGlzLnB0ciArIGRlbHRhID4gdGhpcy5idWYubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhY2tldFwiKTtcbiAgICB9XG4gICAgdGhpcy5wdHIgKz0gZGVsdGE7XG4gICAgcmV0dXJuIHRoaXMucHRyIC0gZGVsdGE7XG4gIH1cbiAgcmVhZDgoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmW3RoaXMuX3JlYWQoMSldO1xuICB9XG4gIHJlYWQzMigpIHtcbiAgICByZXR1cm4gcmVhZFVJbnQzMkxFKHRoaXMuYnVmLCB0aGlzLl9yZWFkKDQpKTtcbiAgfVxuICByZWFkKCkge1xuICAgIGxldCBsZW5ndGggPSB0aGlzLnJlYWQzMigpO1xuICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgbGV0IHB0ciA9IHRoaXMuX3JlYWQoYnl0ZXMubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQodGhpcy5idWYuc3ViYXJyYXkocHRyLCBwdHIgKyBsZW5ndGgpKTtcbiAgICByZXR1cm4gYnl0ZXM7XG4gIH1cbn07XG52YXIgZW5jb2RlVVRGODtcbnZhciBkZWNvZGVVVEY4O1xudmFyIGVuY29kZUludmFyaWFudDtcbmlmICh0eXBlb2YgVGV4dEVuY29kZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIFRleHREZWNvZGVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIGxldCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGxldCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGVuY29kZVVURjggPSAodGV4dCkgPT4gZW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gIGRlY29kZVVURjggPSAoYnl0ZXMpID0+IGRlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgZW5jb2RlSW52YXJpYW50ID0gJ25ldyBUZXh0RW5jb2RlcigpLmVuY29kZShcIlwiKSc7XG59IGVsc2UgaWYgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgZW5jb2RlVVRGOCA9ICh0ZXh0KSA9PiBCdWZmZXIuZnJvbSh0ZXh0KTtcbiAgZGVjb2RlVVRGOCA9IChieXRlcykgPT4ge1xuICAgIGxldCB7IGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCB9ID0gYnl0ZXM7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCkudG9TdHJpbmcoKTtcbiAgfTtcbiAgZW5jb2RlSW52YXJpYW50ID0gJ0J1ZmZlci5mcm9tKFwiXCIpJztcbn0gZWxzZSB7XG4gIHRocm93IG5ldyBFcnJvcihcIk5vIFVURi04IGNvZGVjIGZvdW5kXCIpO1xufVxuaWYgKCEoZW5jb2RlVVRGOChcIlwiKSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKVxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFyaWFudCB2aW9sYXRpb246IFwiJHtlbmNvZGVJbnZhcmlhbnR9IGluc3RhbmNlb2YgVWludDhBcnJheVwiIGlzIGluY29ycmVjdGx5IGZhbHNlXG5cblRoaXMgaW5kaWNhdGVzIHRoYXQgeW91ciBKYXZhU2NyaXB0IGVudmlyb25tZW50IGlzIGJyb2tlbi4gWW91IGNhbm5vdCB1c2VcbmVzYnVpbGQgaW4gdGhpcyBlbnZpcm9ubWVudCBiZWNhdXNlIGVzYnVpbGQgcmVsaWVzIG9uIHRoaXMgaW52YXJpYW50LiBUaGlzXG5pcyBub3QgYSBwcm9ibGVtIHdpdGggZXNidWlsZC4gWW91IG5lZWQgdG8gZml4IHlvdXIgZW52aXJvbm1lbnQgaW5zdGVhZC5cbmApO1xuZnVuY3Rpb24gcmVhZFVJbnQzMkxFKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiBidWZmZXJbb2Zmc2V0KytdIHwgYnVmZmVyW29mZnNldCsrXSA8PCA4IHwgYnVmZmVyW29mZnNldCsrXSA8PCAxNiB8IGJ1ZmZlcltvZmZzZXQrK10gPDwgMjQ7XG59XG5mdW5jdGlvbiB3cml0ZVVJbnQzMkxFKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICBidWZmZXJbb2Zmc2V0KytdID0gdmFsdWU7XG4gIGJ1ZmZlcltvZmZzZXQrK10gPSB2YWx1ZSA+PiA4O1xuICBidWZmZXJbb2Zmc2V0KytdID0gdmFsdWUgPj4gMTY7XG4gIGJ1ZmZlcltvZmZzZXQrK10gPSB2YWx1ZSA+PiAyNDtcbn1cblxuLy8gbGliL3NoYXJlZC9jb21tb24udHNcbnZhciBxdW90ZSA9IEpTT04uc3RyaW5naWZ5O1xudmFyIGJ1aWxkTG9nTGV2ZWxEZWZhdWx0ID0gXCJ3YXJuaW5nXCI7XG52YXIgdHJhbnNmb3JtTG9nTGV2ZWxEZWZhdWx0ID0gXCJzaWxlbnRcIjtcbmZ1bmN0aW9uIHZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KHZhbHVlcywgd2hhdCkge1xuICBjb25zdCB0b0pvaW4gPSBbXTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICB2YWxpZGF0ZVN0cmluZ1ZhbHVlKHZhbHVlLCB3aGF0KTtcbiAgICBpZiAodmFsdWUuaW5kZXhPZihcIixcIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7d2hhdH06ICR7dmFsdWV9YCk7XG4gICAgdG9Kb2luLnB1c2godmFsdWUpO1xuICB9XG4gIHJldHVybiB0b0pvaW4uam9pbihcIixcIik7XG59XG52YXIgY2FuQmVBbnl0aGluZyA9ICgpID0+IG51bGw7XG52YXIgbXVzdEJlQm9vbGVhbiA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiA/IG51bGwgOiBcImEgYm9vbGVhblwiO1xudmFyIG11c3RCZVN0cmluZyA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gbnVsbCA6IFwiYSBzdHJpbmdcIjtcbnZhciBtdXN0QmVSZWdFeHAgPSAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwID8gbnVsbCA6IFwiYSBSZWdFeHAgb2JqZWN0XCI7XG52YXIgbXVzdEJlSW50ZWdlciA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIHZhbHVlID09PSAodmFsdWUgfCAwKSA/IG51bGwgOiBcImFuIGludGVnZXJcIjtcbnZhciBtdXN0QmVWYWxpZFBvcnROdW1iZXIgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiB2YWx1ZSA9PT0gKHZhbHVlIHwgMCkgJiYgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSA2NTUzNSA/IG51bGwgOiBcImEgdmFsaWQgcG9ydCBudW1iZXJcIjtcbnZhciBtdXN0QmVGdW5jdGlvbiA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBudWxsIDogXCJhIGZ1bmN0aW9uXCI7XG52YXIgbXVzdEJlQXJyYXkgPSAodmFsdWUpID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gbnVsbCA6IFwiYW4gYXJyYXlcIjtcbnZhciBtdXN0QmVBcnJheU9mU3RyaW5ncyA9ICh2YWx1ZSkgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKHgpID0+IHR5cGVvZiB4ID09PSBcInN0cmluZ1wiKSA/IG51bGwgOiBcImFuIGFycmF5IG9mIHN0cmluZ3NcIjtcbnZhciBtdXN0QmVPYmplY3QgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBudWxsIDogXCJhbiBvYmplY3RcIjtcbnZhciBtdXN0QmVFbnRyeVBvaW50cyA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsID8gbnVsbCA6IFwiYW4gYXJyYXkgb3IgYW4gb2JqZWN0XCI7XG52YXIgbXVzdEJlV2ViQXNzZW1ibHlNb2R1bGUgPSAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlID8gbnVsbCA6IFwiYSBXZWJBc3NlbWJseS5Nb2R1bGVcIjtcbnZhciBtdXN0QmVPYmplY3RPck51bGwgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBudWxsIDogXCJhbiBvYmplY3Qgb3IgbnVsbFwiO1xudmFyIG11c3RCZVN0cmluZ09yQm9vbGVhbiA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgPyBudWxsIDogXCJhIHN0cmluZyBvciBhIGJvb2xlYW5cIjtcbnZhciBtdXN0QmVTdHJpbmdPck9iamVjdCA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBudWxsIDogXCJhIHN0cmluZyBvciBhbiBvYmplY3RcIjtcbnZhciBtdXN0QmVTdHJpbmdPckFycmF5T2ZTdHJpbmdzID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKHgpID0+IHR5cGVvZiB4ID09PSBcInN0cmluZ1wiKSA/IG51bGwgOiBcImEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3NcIjtcbnZhciBtdXN0QmVTdHJpbmdPclVpbnQ4QXJyYXkgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBudWxsIDogXCJhIHN0cmluZyBvciBhIFVpbnQ4QXJyYXlcIjtcbnZhciBtdXN0QmVTdHJpbmdPclVSTCA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlIGluc3RhbmNlb2YgVVJMID8gbnVsbCA6IFwiYSBzdHJpbmcgb3IgYSBVUkxcIjtcbmZ1bmN0aW9uIGdldEZsYWcob2JqZWN0LCBrZXlzLCBrZXksIG11c3RCZUZuKSB7XG4gIGxldCB2YWx1ZSA9IG9iamVjdFtrZXldO1xuICBrZXlzW2tleSArIFwiXCJdID0gdHJ1ZTtcbiAgaWYgKHZhbHVlID09PSB2b2lkIDApIHJldHVybiB2b2lkIDA7XG4gIGxldCBtdXN0QmUgPSBtdXN0QmVGbih2YWx1ZSk7XG4gIGlmIChtdXN0QmUgIT09IG51bGwpIHRocm93IG5ldyBFcnJvcihgJHtxdW90ZShrZXkpfSBtdXN0IGJlICR7bXVzdEJlfWApO1xuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBjaGVja0ZvckludmFsaWRGbGFncyhvYmplY3QsIGtleXMsIHdoZXJlKSB7XG4gIGZvciAobGV0IGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgaW4ga2V5cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcHRpb24gJHt3aGVyZX06ICR7cXVvdGUoa2V5KX1gKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlSW5pdGlhbGl6ZU9wdGlvbnMob3B0aW9ucykge1xuICBsZXQga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgd2FzbVVSTCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ3YXNtVVJMXCIsIG11c3RCZVN0cmluZ09yVVJMKTtcbiAgbGV0IHdhc21Nb2R1bGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwid2FzbU1vZHVsZVwiLCBtdXN0QmVXZWJBc3NlbWJseU1vZHVsZSk7XG4gIGxldCB3b3JrZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwid29ya2VyXCIsIG11c3RCZUJvb2xlYW4pO1xuICBjaGVja0ZvckludmFsaWRGbGFncyhvcHRpb25zLCBrZXlzLCBcImluIGluaXRpYWxpemUoKSBjYWxsXCIpO1xuICByZXR1cm4ge1xuICAgIHdhc21VUkwsXG4gICAgd2FzbU1vZHVsZSxcbiAgICB3b3JrZXJcbiAgfTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlTWFuZ2xlQ2FjaGUobWFuZ2xlQ2FjaGUpIHtcbiAgbGV0IHZhbGlkYXRlZDtcbiAgaWYgKG1hbmdsZUNhY2hlICE9PSB2b2lkIDApIHtcbiAgICB2YWxpZGF0ZWQgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBrZXkgaW4gbWFuZ2xlQ2FjaGUpIHtcbiAgICAgIGxldCB2YWx1ZSA9IG1hbmdsZUNhY2hlW2tleV07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICB2YWxpZGF0ZWRba2V5XSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke3F1b3RlKGtleSl9IGluIG1hbmdsZSBjYWNoZSB0byBtYXAgdG8gZWl0aGVyIGEgc3RyaW5nIG9yIGZhbHNlYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWxpZGF0ZWQ7XG59XG5mdW5jdGlvbiBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMsIGlzVFRZLCBsb2dMZXZlbERlZmF1bHQpIHtcbiAgbGV0IGNvbG9yID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImNvbG9yXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbG9nTGV2ZWwgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibG9nTGV2ZWxcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGxvZ0xpbWl0ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvZ0xpbWl0XCIsIG11c3RCZUludGVnZXIpO1xuICBpZiAoY29sb3IgIT09IHZvaWQgMCkgZmxhZ3MucHVzaChgLS1jb2xvcj0ke2NvbG9yfWApO1xuICBlbHNlIGlmIChpc1RUWSkgZmxhZ3MucHVzaChgLS1jb2xvcj10cnVlYCk7XG4gIGZsYWdzLnB1c2goYC0tbG9nLWxldmVsPSR7bG9nTGV2ZWwgfHwgbG9nTGV2ZWxEZWZhdWx0fWApO1xuICBmbGFncy5wdXNoKGAtLWxvZy1saW1pdD0ke2xvZ0xpbWl0IHx8IDB9YCk7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZ1ZhbHVlKHZhbHVlLCB3aGF0LCBrZXkpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdmFsdWUgZm9yICR7d2hhdH0ke2tleSAhPT0gdm9pZCAwID8gXCIgXCIgKyBxdW90ZShrZXkpIDogXCJcIn0gdG8gYmUgYSBzdHJpbmcsIGdvdCAke3R5cGVvZiB2YWx1ZX0gaW5zdGVhZGApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHB1c2hDb21tb25GbGFncyhmbGFncywgb3B0aW9ucywga2V5cykge1xuICBsZXQgbGVnYWxDb21tZW50cyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJsZWdhbENvbW1lbnRzXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBzb3VyY2VSb290ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInNvdXJjZVJvb3RcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IHNvdXJjZXNDb250ZW50ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInNvdXJjZXNDb250ZW50XCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgdGFyZ2V0ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInRhcmdldFwiLCBtdXN0QmVTdHJpbmdPckFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IGZvcm1hdCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJmb3JtYXRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGdsb2JhbE5hbWUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZ2xvYmFsTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgbWFuZ2xlUHJvcHMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlUHJvcHNcIiwgbXVzdEJlUmVnRXhwKTtcbiAgbGV0IHJlc2VydmVQcm9wcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJyZXNlcnZlUHJvcHNcIiwgbXVzdEJlUmVnRXhwKTtcbiAgbGV0IG1hbmdsZVF1b3RlZCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJtYW5nbGVRdW90ZWRcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBtaW5pZnkgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWluaWZ5XCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWluaWZ5U3ludGF4ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1pbmlmeVN5bnRheFwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IG1pbmlmeVdoaXRlc3BhY2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWluaWZ5V2hpdGVzcGFjZVwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IG1pbmlmeUlkZW50aWZpZXJzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1pbmlmeUlkZW50aWZpZXJzXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbGluZUxpbWl0ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxpbmVMaW1pdFwiLCBtdXN0QmVJbnRlZ2VyKTtcbiAgbGV0IGRyb3AgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZHJvcFwiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gIGxldCBkcm9wTGFiZWxzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImRyb3BMYWJlbHNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgY2hhcnNldCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJjaGFyc2V0XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCB0cmVlU2hha2luZyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ0cmVlU2hha2luZ1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGlnbm9yZUFubm90YXRpb25zID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImlnbm9yZUFubm90YXRpb25zXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQganN4ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImpzeFwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQganN4RmFjdG9yeSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hGYWN0b3J5XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBqc3hGcmFnbWVudCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hGcmFnbWVudFwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQganN4SW1wb3J0U291cmNlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImpzeEltcG9ydFNvdXJjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQganN4RGV2ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImpzeERldlwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGpzeFNpZGVFZmZlY3RzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImpzeFNpZGVFZmZlY3RzXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgZGVmaW5lID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImRlZmluZVwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgbG9nT3ZlcnJpZGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibG9nT3ZlcnJpZGVcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IHN1cHBvcnRlZCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzdXBwb3J0ZWRcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IHB1cmUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwicHVyZVwiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gIGxldCBrZWVwTmFtZXMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwia2VlcE5hbWVzXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgcGxhdGZvcm0gPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwicGxhdGZvcm1cIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IHRzY29uZmlnUmF3ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInRzY29uZmlnUmF3XCIsIG11c3RCZVN0cmluZ09yT2JqZWN0KTtcbiAgbGV0IGFic1BhdGhzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImFic1BhdGhzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgaWYgKGxlZ2FsQ29tbWVudHMpIGZsYWdzLnB1c2goYC0tbGVnYWwtY29tbWVudHM9JHtsZWdhbENvbW1lbnRzfWApO1xuICBpZiAoc291cmNlUm9vdCAhPT0gdm9pZCAwKSBmbGFncy5wdXNoKGAtLXNvdXJjZS1yb290PSR7c291cmNlUm9vdH1gKTtcbiAgaWYgKHNvdXJjZXNDb250ZW50ICE9PSB2b2lkIDApIGZsYWdzLnB1c2goYC0tc291cmNlcy1jb250ZW50PSR7c291cmNlc0NvbnRlbnR9YCk7XG4gIGlmICh0YXJnZXQpIGZsYWdzLnB1c2goYC0tdGFyZ2V0PSR7dmFsaWRhdGVBbmRKb2luU3RyaW5nQXJyYXkoQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0IDogW3RhcmdldF0sIFwidGFyZ2V0XCIpfWApO1xuICBpZiAoZm9ybWF0KSBmbGFncy5wdXNoKGAtLWZvcm1hdD0ke2Zvcm1hdH1gKTtcbiAgaWYgKGdsb2JhbE5hbWUpIGZsYWdzLnB1c2goYC0tZ2xvYmFsLW5hbWU9JHtnbG9iYWxOYW1lfWApO1xuICBpZiAocGxhdGZvcm0pIGZsYWdzLnB1c2goYC0tcGxhdGZvcm09JHtwbGF0Zm9ybX1gKTtcbiAgaWYgKHRzY29uZmlnUmF3KSBmbGFncy5wdXNoKGAtLXRzY29uZmlnLXJhdz0ke3R5cGVvZiB0c2NvbmZpZ1JhdyA9PT0gXCJzdHJpbmdcIiA/IHRzY29uZmlnUmF3IDogSlNPTi5zdHJpbmdpZnkodHNjb25maWdSYXcpfWApO1xuICBpZiAobWluaWZ5KSBmbGFncy5wdXNoKFwiLS1taW5pZnlcIik7XG4gIGlmIChtaW5pZnlTeW50YXgpIGZsYWdzLnB1c2goXCItLW1pbmlmeS1zeW50YXhcIik7XG4gIGlmIChtaW5pZnlXaGl0ZXNwYWNlKSBmbGFncy5wdXNoKFwiLS1taW5pZnktd2hpdGVzcGFjZVwiKTtcbiAgaWYgKG1pbmlmeUlkZW50aWZpZXJzKSBmbGFncy5wdXNoKFwiLS1taW5pZnktaWRlbnRpZmllcnNcIik7XG4gIGlmIChsaW5lTGltaXQpIGZsYWdzLnB1c2goYC0tbGluZS1saW1pdD0ke2xpbmVMaW1pdH1gKTtcbiAgaWYgKGNoYXJzZXQpIGZsYWdzLnB1c2goYC0tY2hhcnNldD0ke2NoYXJzZXR9YCk7XG4gIGlmICh0cmVlU2hha2luZyAhPT0gdm9pZCAwKSBmbGFncy5wdXNoKGAtLXRyZWUtc2hha2luZz0ke3RyZWVTaGFraW5nfWApO1xuICBpZiAoaWdub3JlQW5ub3RhdGlvbnMpIGZsYWdzLnB1c2goYC0taWdub3JlLWFubm90YXRpb25zYCk7XG4gIGlmIChkcm9wKSBmb3IgKGxldCB3aGF0IG9mIGRyb3ApIGZsYWdzLnB1c2goYC0tZHJvcDoke3ZhbGlkYXRlU3RyaW5nVmFsdWUod2hhdCwgXCJkcm9wXCIpfWApO1xuICBpZiAoZHJvcExhYmVscykgZmxhZ3MucHVzaChgLS1kcm9wLWxhYmVscz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KGRyb3BMYWJlbHMsIFwiZHJvcCBsYWJlbFwiKX1gKTtcbiAgaWYgKGFic1BhdGhzKSBmbGFncy5wdXNoKGAtLWFicy1wYXRocz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KGFic1BhdGhzLCBcImFicyBwYXRoc1wiKX1gKTtcbiAgaWYgKG1hbmdsZVByb3BzKSBmbGFncy5wdXNoKGAtLW1hbmdsZS1wcm9wcz0ke2pzUmVnRXhwVG9Hb1JlZ0V4cChtYW5nbGVQcm9wcyl9YCk7XG4gIGlmIChyZXNlcnZlUHJvcHMpIGZsYWdzLnB1c2goYC0tcmVzZXJ2ZS1wcm9wcz0ke2pzUmVnRXhwVG9Hb1JlZ0V4cChyZXNlcnZlUHJvcHMpfWApO1xuICBpZiAobWFuZ2xlUXVvdGVkICE9PSB2b2lkIDApIGZsYWdzLnB1c2goYC0tbWFuZ2xlLXF1b3RlZD0ke21hbmdsZVF1b3RlZH1gKTtcbiAgaWYgKGpzeCkgZmxhZ3MucHVzaChgLS1qc3g9JHtqc3h9YCk7XG4gIGlmIChqc3hGYWN0b3J5KSBmbGFncy5wdXNoKGAtLWpzeC1mYWN0b3J5PSR7anN4RmFjdG9yeX1gKTtcbiAgaWYgKGpzeEZyYWdtZW50KSBmbGFncy5wdXNoKGAtLWpzeC1mcmFnbWVudD0ke2pzeEZyYWdtZW50fWApO1xuICBpZiAoanN4SW1wb3J0U291cmNlKSBmbGFncy5wdXNoKGAtLWpzeC1pbXBvcnQtc291cmNlPSR7anN4SW1wb3J0U291cmNlfWApO1xuICBpZiAoanN4RGV2KSBmbGFncy5wdXNoKGAtLWpzeC1kZXZgKTtcbiAgaWYgKGpzeFNpZGVFZmZlY3RzKSBmbGFncy5wdXNoKGAtLWpzeC1zaWRlLWVmZmVjdHNgKTtcbiAgaWYgKGRlZmluZSkge1xuICAgIGZvciAobGV0IGtleSBpbiBkZWZpbmUpIHtcbiAgICAgIGlmIChrZXkuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlZmluZTogJHtrZXl9YCk7XG4gICAgICBmbGFncy5wdXNoKGAtLWRlZmluZToke2tleX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGRlZmluZVtrZXldLCBcImRlZmluZVwiLCBrZXkpfWApO1xuICAgIH1cbiAgfVxuICBpZiAobG9nT3ZlcnJpZGUpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gbG9nT3ZlcnJpZGUpIHtcbiAgICAgIGlmIChrZXkuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGxvZyBvdmVycmlkZTogJHtrZXl9YCk7XG4gICAgICBmbGFncy5wdXNoKGAtLWxvZy1vdmVycmlkZToke2tleX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGxvZ092ZXJyaWRlW2tleV0sIFwibG9nIG92ZXJyaWRlXCIsIGtleSl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChzdXBwb3J0ZWQpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gc3VwcG9ydGVkKSB7XG4gICAgICBpZiAoa2V5LmluZGV4T2YoXCI9XCIpID49IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzdXBwb3J0ZWQ6ICR7a2V5fWApO1xuICAgICAgY29uc3QgdmFsdWUgPSBzdXBwb3J0ZWRba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiYm9vbGVhblwiKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHZhbHVlIGZvciBzdXBwb3J0ZWQgJHtxdW90ZShrZXkpfSB0byBiZSBhIGJvb2xlYW4sIGdvdCAke3R5cGVvZiB2YWx1ZX0gaW5zdGVhZGApO1xuICAgICAgZmxhZ3MucHVzaChgLS1zdXBwb3J0ZWQ6JHtrZXl9PSR7dmFsdWV9YCk7XG4gICAgfVxuICB9XG4gIGlmIChwdXJlKSBmb3IgKGxldCBmbiBvZiBwdXJlKSBmbGFncy5wdXNoKGAtLXB1cmU6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGZuLCBcInB1cmVcIil9YCk7XG4gIGlmIChrZWVwTmFtZXMpIGZsYWdzLnB1c2goYC0ta2VlcC1uYW1lc2ApO1xufVxuZnVuY3Rpb24gZmxhZ3NGb3JCdWlsZE9wdGlvbnMoY2FsbE5hbWUsIG9wdGlvbnMsIGlzVFRZLCBsb2dMZXZlbERlZmF1bHQsIHdyaXRlRGVmYXVsdCkge1xuICB2YXIgX2E7XG4gIGxldCBmbGFncyA9IFtdO1xuICBsZXQgZW50cmllcyA9IFtdO1xuICBsZXQga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgc3RkaW5Db250ZW50cyA9IG51bGw7XG4gIGxldCBzdGRpblJlc29sdmVEaXIgPSBudWxsO1xuICBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMsIGlzVFRZLCBsb2dMZXZlbERlZmF1bHQpO1xuICBwdXNoQ29tbW9uRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMpO1xuICBsZXQgc291cmNlbWFwID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInNvdXJjZW1hcFwiLCBtdXN0QmVTdHJpbmdPckJvb2xlYW4pO1xuICBsZXQgYnVuZGxlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImJ1bmRsZVwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IHNwbGl0dGluZyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzcGxpdHRpbmdcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBwcmVzZXJ2ZVN5bWxpbmtzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInByZXNlcnZlU3ltbGlua3NcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBtZXRhZmlsZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJtZXRhZmlsZVwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IG91dGZpbGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwib3V0ZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgb3V0ZGlyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm91dGRpclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgb3V0YmFzZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJvdXRiYXNlXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCB0c2NvbmZpZyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ0c2NvbmZpZ1wiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgcmVzb2x2ZUV4dGVuc2lvbnMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwicmVzb2x2ZUV4dGVuc2lvbnNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgbm9kZVBhdGhzSW5wdXQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibm9kZVBhdGhzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IG1haW5GaWVsZHMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFpbkZpZWxkc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gIGxldCBjb25kaXRpb25zID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImNvbmRpdGlvbnNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgZXh0ZXJuYWwgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZXh0ZXJuYWxcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgcGFja2FnZXMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwicGFja2FnZXNcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGFsaWFzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImFsaWFzXCIsIG11c3RCZU9iamVjdCk7XG4gIGxldCBsb2FkZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibG9hZGVyXCIsIG11c3RCZU9iamVjdCk7XG4gIGxldCBvdXRFeHRlbnNpb24gPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwib3V0RXh0ZW5zaW9uXCIsIG11c3RCZU9iamVjdCk7XG4gIGxldCBwdWJsaWNQYXRoID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInB1YmxpY1BhdGhcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGVudHJ5TmFtZXMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZW50cnlOYW1lc1wiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgY2h1bmtOYW1lcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJjaHVua05hbWVzXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBhc3NldE5hbWVzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImFzc2V0TmFtZXNcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGluamVjdCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJpbmplY3RcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgYmFubmVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImJhbm5lclwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgZm9vdGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImZvb3RlclwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgZW50cnlQb2ludHMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZW50cnlQb2ludHNcIiwgbXVzdEJlRW50cnlQb2ludHMpO1xuICBsZXQgYWJzV29ya2luZ0RpciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJhYnNXb3JraW5nRGlyXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBzdGRpbiA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzdGRpblwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgd3JpdGUgPSAoX2EgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwid3JpdGVcIiwgbXVzdEJlQm9vbGVhbikpICE9IG51bGwgPyBfYSA6IHdyaXRlRGVmYXVsdDtcbiAgbGV0IGFsbG93T3ZlcndyaXRlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImFsbG93T3ZlcndyaXRlXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWFuZ2xlQ2FjaGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlQ2FjaGVcIiwgbXVzdEJlT2JqZWN0KTtcbiAga2V5cy5wbHVnaW5zID0gdHJ1ZTtcbiAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5cywgYGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICBpZiAoc291cmNlbWFwKSBmbGFncy5wdXNoKGAtLXNvdXJjZW1hcCR7c291cmNlbWFwID09PSB0cnVlID8gXCJcIiA6IGA9JHtzb3VyY2VtYXB9YH1gKTtcbiAgaWYgKGJ1bmRsZSkgZmxhZ3MucHVzaChcIi0tYnVuZGxlXCIpO1xuICBpZiAoYWxsb3dPdmVyd3JpdGUpIGZsYWdzLnB1c2goXCItLWFsbG93LW92ZXJ3cml0ZVwiKTtcbiAgaWYgKHNwbGl0dGluZykgZmxhZ3MucHVzaChcIi0tc3BsaXR0aW5nXCIpO1xuICBpZiAocHJlc2VydmVTeW1saW5rcykgZmxhZ3MucHVzaChcIi0tcHJlc2VydmUtc3ltbGlua3NcIik7XG4gIGlmIChtZXRhZmlsZSkgZmxhZ3MucHVzaChgLS1tZXRhZmlsZWApO1xuICBpZiAob3V0ZmlsZSkgZmxhZ3MucHVzaChgLS1vdXRmaWxlPSR7b3V0ZmlsZX1gKTtcbiAgaWYgKG91dGRpcikgZmxhZ3MucHVzaChgLS1vdXRkaXI9JHtvdXRkaXJ9YCk7XG4gIGlmIChvdXRiYXNlKSBmbGFncy5wdXNoKGAtLW91dGJhc2U9JHtvdXRiYXNlfWApO1xuICBpZiAodHNjb25maWcpIGZsYWdzLnB1c2goYC0tdHNjb25maWc9JHt0c2NvbmZpZ31gKTtcbiAgaWYgKHBhY2thZ2VzKSBmbGFncy5wdXNoKGAtLXBhY2thZ2VzPSR7cGFja2FnZXN9YCk7XG4gIGlmIChyZXNvbHZlRXh0ZW5zaW9ucykgZmxhZ3MucHVzaChgLS1yZXNvbHZlLWV4dGVuc2lvbnM9JHt2YWxpZGF0ZUFuZEpvaW5TdHJpbmdBcnJheShyZXNvbHZlRXh0ZW5zaW9ucywgXCJyZXNvbHZlIGV4dGVuc2lvblwiKX1gKTtcbiAgaWYgKHB1YmxpY1BhdGgpIGZsYWdzLnB1c2goYC0tcHVibGljLXBhdGg9JHtwdWJsaWNQYXRofWApO1xuICBpZiAoZW50cnlOYW1lcykgZmxhZ3MucHVzaChgLS1lbnRyeS1uYW1lcz0ke2VudHJ5TmFtZXN9YCk7XG4gIGlmIChjaHVua05hbWVzKSBmbGFncy5wdXNoKGAtLWNodW5rLW5hbWVzPSR7Y2h1bmtOYW1lc31gKTtcbiAgaWYgKGFzc2V0TmFtZXMpIGZsYWdzLnB1c2goYC0tYXNzZXQtbmFtZXM9JHthc3NldE5hbWVzfWApO1xuICBpZiAobWFpbkZpZWxkcykgZmxhZ3MucHVzaChgLS1tYWluLWZpZWxkcz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KG1haW5GaWVsZHMsIFwibWFpbiBmaWVsZFwiKX1gKTtcbiAgaWYgKGNvbmRpdGlvbnMpIGZsYWdzLnB1c2goYC0tY29uZGl0aW9ucz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KGNvbmRpdGlvbnMsIFwiY29uZGl0aW9uXCIpfWApO1xuICBpZiAoZXh0ZXJuYWwpIGZvciAobGV0IG5hbWUgb2YgZXh0ZXJuYWwpIGZsYWdzLnB1c2goYC0tZXh0ZXJuYWw6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKG5hbWUsIFwiZXh0ZXJuYWxcIil9YCk7XG4gIGlmIChhbGlhcykge1xuICAgIGZvciAobGV0IG9sZCBpbiBhbGlhcykge1xuICAgICAgaWYgKG9sZC5pbmRleE9mKFwiPVwiKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFja2FnZSBuYW1lIGluIGFsaWFzOiAke29sZH1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tYWxpYXM6JHtvbGR9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShhbGlhc1tvbGRdLCBcImFsaWFzXCIsIG9sZCl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChiYW5uZXIpIHtcbiAgICBmb3IgKGxldCB0eXBlIGluIGJhbm5lcikge1xuICAgICAgaWYgKHR5cGUuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGJhbm5lciBmaWxlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tYmFubmVyOiR7dHlwZX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGJhbm5lclt0eXBlXSwgXCJiYW5uZXJcIiwgdHlwZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChmb290ZXIpIHtcbiAgICBmb3IgKGxldCB0eXBlIGluIGZvb3Rlcikge1xuICAgICAgaWYgKHR5cGUuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvb3RlciBmaWxlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tZm9vdGVyOiR7dHlwZX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGZvb3Rlclt0eXBlXSwgXCJmb290ZXJcIiwgdHlwZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChpbmplY3QpIGZvciAobGV0IHBhdGggb2YgaW5qZWN0KSBmbGFncy5wdXNoKGAtLWluamVjdDoke3ZhbGlkYXRlU3RyaW5nVmFsdWUocGF0aCwgXCJpbmplY3RcIil9YCk7XG4gIGlmIChsb2FkZXIpIHtcbiAgICBmb3IgKGxldCBleHQgaW4gbG9hZGVyKSB7XG4gICAgICBpZiAoZXh0LmluZGV4T2YoXCI9XCIpID49IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb2FkZXIgZXh0ZW5zaW9uOiAke2V4dH1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tbG9hZGVyOiR7ZXh0fT0ke3ZhbGlkYXRlU3RyaW5nVmFsdWUobG9hZGVyW2V4dF0sIFwibG9hZGVyXCIsIGV4dCl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChvdXRFeHRlbnNpb24pIHtcbiAgICBmb3IgKGxldCBleHQgaW4gb3V0RXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZXh0LmluZGV4T2YoXCI9XCIpID49IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvdXQgZXh0ZW5zaW9uOiAke2V4dH1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tb3V0LWV4dGVuc2lvbjoke2V4dH09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKG91dEV4dGVuc2lvbltleHRdLCBcIm91dCBleHRlbnNpb25cIiwgZXh0KX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKGVudHJ5UG9pbnRzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZW50cnlQb2ludHMpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbiA9IGVudHJ5UG9pbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICBsZXQgZW50cnlQb2ludCA9IGVudHJ5UG9pbnRzW2ldO1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5UG9pbnQgPT09IFwib2JqZWN0XCIgJiYgZW50cnlQb2ludCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxldCBlbnRyeVBvaW50S2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGxldCBpbnB1dCA9IGdldEZsYWcoZW50cnlQb2ludCwgZW50cnlQb2ludEtleXMsIFwiaW5cIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgb3V0cHV0ID0gZ2V0RmxhZyhlbnRyeVBvaW50LCBlbnRyeVBvaW50S2V5cywgXCJvdXRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhlbnRyeVBvaW50LCBlbnRyeVBvaW50S2V5cywgXCJpbiBlbnRyeSBwb2ludCBhdCBpbmRleCBcIiArIGkpO1xuICAgICAgICAgIGlmIChpbnB1dCA9PT0gdm9pZCAwKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJvcGVydHkgXCJpblwiIGZvciBlbnRyeSBwb2ludCBhdCBpbmRleCAnICsgaSk7XG4gICAgICAgICAgaWYgKG91dHB1dCA9PT0gdm9pZCAwKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJvcGVydHkgXCJvdXRcIiBmb3IgZW50cnkgcG9pbnQgYXQgaW5kZXggJyArIGkpO1xuICAgICAgICAgIGVudHJpZXMucHVzaChbb3V0cHV0LCBpbnB1dF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudHJpZXMucHVzaChbXCJcIiwgdmFsaWRhdGVTdHJpbmdWYWx1ZShlbnRyeVBvaW50LCBcImVudHJ5IHBvaW50IGF0IGluZGV4IFwiICsgaSldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZW50cnlQb2ludHMpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKFtrZXksIHZhbGlkYXRlU3RyaW5nVmFsdWUoZW50cnlQb2ludHNba2V5XSwgXCJlbnRyeSBwb2ludFwiLCBrZXkpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChzdGRpbikge1xuICAgIGxldCBzdGRpbktleXMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgY29udGVudHMgPSBnZXRGbGFnKHN0ZGluLCBzdGRpbktleXMsIFwiY29udGVudHNcIiwgbXVzdEJlU3RyaW5nT3JVaW50OEFycmF5KTtcbiAgICBsZXQgcmVzb2x2ZURpciA9IGdldEZsYWcoc3RkaW4sIHN0ZGluS2V5cywgXCJyZXNvbHZlRGlyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IHNvdXJjZWZpbGUgPSBnZXRGbGFnKHN0ZGluLCBzdGRpbktleXMsIFwic291cmNlZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGxldCBsb2FkZXIyID0gZ2V0RmxhZyhzdGRpbiwgc3RkaW5LZXlzLCBcImxvYWRlclwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKHN0ZGluLCBzdGRpbktleXMsICdpbiBcInN0ZGluXCIgb2JqZWN0Jyk7XG4gICAgaWYgKHNvdXJjZWZpbGUpIGZsYWdzLnB1c2goYC0tc291cmNlZmlsZT0ke3NvdXJjZWZpbGV9YCk7XG4gICAgaWYgKGxvYWRlcjIpIGZsYWdzLnB1c2goYC0tbG9hZGVyPSR7bG9hZGVyMn1gKTtcbiAgICBpZiAocmVzb2x2ZURpcikgc3RkaW5SZXNvbHZlRGlyID0gcmVzb2x2ZURpcjtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnRzID09PSBcInN0cmluZ1wiKSBzdGRpbkNvbnRlbnRzID0gZW5jb2RlVVRGOChjb250ZW50cyk7XG4gICAgZWxzZSBpZiAoY29udGVudHMgaW5zdGFuY2VvZiBVaW50OEFycmF5KSBzdGRpbkNvbnRlbnRzID0gY29udGVudHM7XG4gIH1cbiAgbGV0IG5vZGVQYXRocyA9IFtdO1xuICBpZiAobm9kZVBhdGhzSW5wdXQpIHtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiBub2RlUGF0aHNJbnB1dCkge1xuICAgICAgdmFsdWUgKz0gXCJcIjtcbiAgICAgIG5vZGVQYXRocy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBlbnRyaWVzLFxuICAgIGZsYWdzLFxuICAgIHdyaXRlLFxuICAgIHN0ZGluQ29udGVudHMsXG4gICAgc3RkaW5SZXNvbHZlRGlyLFxuICAgIGFic1dvcmtpbmdEaXIsXG4gICAgbm9kZVBhdGhzLFxuICAgIG1hbmdsZUNhY2hlOiB2YWxpZGF0ZU1hbmdsZUNhY2hlKG1hbmdsZUNhY2hlKVxuICB9O1xufVxuZnVuY3Rpb24gZmxhZ3NGb3JUcmFuc2Zvcm1PcHRpb25zKGNhbGxOYW1lLCBvcHRpb25zLCBpc1RUWSwgbG9nTGV2ZWxEZWZhdWx0KSB7XG4gIGxldCBmbGFncyA9IFtdO1xuICBsZXQga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMsIGlzVFRZLCBsb2dMZXZlbERlZmF1bHQpO1xuICBwdXNoQ29tbW9uRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMpO1xuICBsZXQgc291cmNlbWFwID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInNvdXJjZW1hcFwiLCBtdXN0QmVTdHJpbmdPckJvb2xlYW4pO1xuICBsZXQgc291cmNlZmlsZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VmaWxlXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBsb2FkZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibG9hZGVyXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBiYW5uZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiYmFubmVyXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBmb290ZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZm9vdGVyXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBtYW5nbGVDYWNoZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJtYW5nbGVDYWNoZVwiLCBtdXN0QmVPYmplY3QpO1xuICBjaGVja0ZvckludmFsaWRGbGFncyhvcHRpb25zLCBrZXlzLCBgaW4gJHtjYWxsTmFtZX0oKSBjYWxsYCk7XG4gIGlmIChzb3VyY2VtYXApIGZsYWdzLnB1c2goYC0tc291cmNlbWFwPSR7c291cmNlbWFwID09PSB0cnVlID8gXCJleHRlcm5hbFwiIDogc291cmNlbWFwfWApO1xuICBpZiAoc291cmNlZmlsZSkgZmxhZ3MucHVzaChgLS1zb3VyY2VmaWxlPSR7c291cmNlZmlsZX1gKTtcbiAgaWYgKGxvYWRlcikgZmxhZ3MucHVzaChgLS1sb2FkZXI9JHtsb2FkZXJ9YCk7XG4gIGlmIChiYW5uZXIpIGZsYWdzLnB1c2goYC0tYmFubmVyPSR7YmFubmVyfWApO1xuICBpZiAoZm9vdGVyKSBmbGFncy5wdXNoKGAtLWZvb3Rlcj0ke2Zvb3Rlcn1gKTtcbiAgcmV0dXJuIHtcbiAgICBmbGFncyxcbiAgICBtYW5nbGVDYWNoZTogdmFsaWRhdGVNYW5nbGVDYWNoZShtYW5nbGVDYWNoZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNoYW5uZWwoc3RyZWFtSW4pIHtcbiAgY29uc3QgcmVxdWVzdENhbGxiYWNrc0J5S2V5ID0ge307XG4gIGNvbnN0IGNsb3NlRGF0YSA9IHsgZGlkQ2xvc2U6IGZhbHNlLCByZWFzb246IFwiXCIgfTtcbiAgbGV0IHJlc3BvbnNlQ2FsbGJhY2tzID0ge307XG4gIGxldCBuZXh0UmVxdWVzdElEID0gMDtcbiAgbGV0IG5leHRCdWlsZEtleSA9IDA7XG4gIGxldCBzdGRvdXQgPSBuZXcgVWludDhBcnJheSgxNiAqIDEwMjQpO1xuICBsZXQgc3Rkb3V0VXNlZCA9IDA7XG4gIGxldCByZWFkRnJvbVN0ZG91dCA9IChjaHVuaykgPT4ge1xuICAgIGxldCBsaW1pdCA9IHN0ZG91dFVzZWQgKyBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGxpbWl0ID4gc3Rkb3V0Lmxlbmd0aCkge1xuICAgICAgbGV0IHN3YXAgPSBuZXcgVWludDhBcnJheShsaW1pdCAqIDIpO1xuICAgICAgc3dhcC5zZXQoc3Rkb3V0KTtcbiAgICAgIHN0ZG91dCA9IHN3YXA7XG4gICAgfVxuICAgIHN0ZG91dC5zZXQoY2h1bmssIHN0ZG91dFVzZWQpO1xuICAgIHN0ZG91dFVzZWQgKz0gY2h1bmsubGVuZ3RoO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHdoaWxlIChvZmZzZXQgKyA0IDw9IHN0ZG91dFVzZWQpIHtcbiAgICAgIGxldCBsZW5ndGggPSByZWFkVUludDMyTEUoc3Rkb3V0LCBvZmZzZXQpO1xuICAgICAgaWYgKG9mZnNldCArIDQgKyBsZW5ndGggPiBzdGRvdXRVc2VkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICBoYW5kbGVJbmNvbWluZ1BhY2tldChzdGRvdXQuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKTtcbiAgICAgIG9mZnNldCArPSBsZW5ndGg7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPiAwKSB7XG4gICAgICBzdGRvdXQuY29weVdpdGhpbigwLCBvZmZzZXQsIHN0ZG91dFVzZWQpO1xuICAgICAgc3Rkb3V0VXNlZCAtPSBvZmZzZXQ7XG4gICAgfVxuICB9O1xuICBsZXQgYWZ0ZXJDbG9zZSA9IChlcnJvcikgPT4ge1xuICAgIGNsb3NlRGF0YS5kaWRDbG9zZSA9IHRydWU7XG4gICAgaWYgKGVycm9yKSBjbG9zZURhdGEucmVhc29uID0gXCI6IFwiICsgKGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xuICAgIGNvbnN0IHRleHQgPSBcIlRoZSBzZXJ2aWNlIHdhcyBzdG9wcGVkXCIgKyBjbG9zZURhdGEucmVhc29uO1xuICAgIGZvciAobGV0IGlkIGluIHJlc3BvbnNlQ2FsbGJhY2tzKSB7XG4gICAgICByZXNwb25zZUNhbGxiYWNrc1tpZF0odGV4dCwgbnVsbCk7XG4gICAgfVxuICAgIHJlc3BvbnNlQ2FsbGJhY2tzID0ge307XG4gIH07XG4gIGxldCBzZW5kUmVxdWVzdCA9IChyZWZzLCB2YWx1ZSwgY2FsbGJhY2spID0+IHtcbiAgICBpZiAoY2xvc2VEYXRhLmRpZENsb3NlKSByZXR1cm4gY2FsbGJhY2soXCJUaGUgc2VydmljZSBpcyBubyBsb25nZXIgcnVubmluZ1wiICsgY2xvc2VEYXRhLnJlYXNvbiwgbnVsbCk7XG4gICAgbGV0IGlkID0gbmV4dFJlcXVlc3RJRCsrO1xuICAgIHJlc3BvbnNlQ2FsbGJhY2tzW2lkXSA9IChlcnJvciwgcmVzcG9uc2UpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNhbGxiYWNrKGVycm9yLCByZXNwb25zZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocmVmcykgcmVmcy51bnJlZigpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHJlZnMpIHJlZnMucmVmKCk7XG4gICAgc3RyZWFtSW4ud3JpdGVUb1N0ZGluKGVuY29kZVBhY2tldCh7IGlkLCBpc1JlcXVlc3Q6IHRydWUsIHZhbHVlIH0pKTtcbiAgfTtcbiAgbGV0IHNlbmRSZXNwb25zZSA9IChpZCwgdmFsdWUpID0+IHtcbiAgICBpZiAoY2xvc2VEYXRhLmRpZENsb3NlKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc2VydmljZSBpcyBubyBsb25nZXIgcnVubmluZ1wiICsgY2xvc2VEYXRhLnJlYXNvbik7XG4gICAgc3RyZWFtSW4ud3JpdGVUb1N0ZGluKGVuY29kZVBhY2tldCh7IGlkLCBpc1JlcXVlc3Q6IGZhbHNlLCB2YWx1ZSB9KSk7XG4gIH07XG4gIGxldCBoYW5kbGVSZXF1ZXN0ID0gKGlkLCByZXF1ZXN0KSA9PiBfX2FzeW5jKG51bGwsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyZXF1ZXN0LmNvbW1hbmQgPT09IFwicGluZ1wiKSB7XG4gICAgICAgIHNlbmRSZXNwb25zZShpZCwge30pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlcXVlc3Qua2V5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RDYWxsYmFja3MgPSByZXF1ZXN0Q2FsbGJhY2tzQnlLZXlbcmVxdWVzdC5rZXldO1xuICAgICAgICBpZiAoIXJlcXVlc3RDYWxsYmFja3MpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSByZXF1ZXN0Q2FsbGJhY2tzW3JlcXVlc3QuY29tbWFuZF07XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIHlpZWxkIGNhbGxiYWNrKGlkLCByZXF1ZXN0KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb21tYW5kOiBgICsgcmVxdWVzdC5jb21tYW5kKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBbZXh0cmFjdEVycm9yTWVzc2FnZVY4KGUsIHN0cmVhbUluLCBudWxsLCB2b2lkIDAsIFwiXCIpXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlbmRSZXNwb25zZShpZCwgeyBlcnJvcnMgfSk7XG4gICAgICB9IGNhdGNoIChlMikge1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGxldCBpc0ZpcnN0UGFja2V0ID0gdHJ1ZTtcbiAgbGV0IGhhbmRsZUluY29taW5nUGFja2V0ID0gKGJ5dGVzKSA9PiB7XG4gICAgaWYgKGlzRmlyc3RQYWNrZXQpIHtcbiAgICAgIGlzRmlyc3RQYWNrZXQgPSBmYWxzZTtcbiAgICAgIGxldCBiaW5hcnlWZXJzaW9uID0gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcyk7XG4gICAgICBpZiAoYmluYXJ5VmVyc2lvbiAhPT0gXCIwLjI3LjFcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzdGFydCBzZXJ2aWNlOiBIb3N0IHZlcnNpb24gXCIke1wiMC4yNy4xXCJ9XCIgZG9lcyBub3QgbWF0Y2ggYmluYXJ5IHZlcnNpb24gJHtxdW90ZShiaW5hcnlWZXJzaW9uKX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHBhY2tldCA9IGRlY29kZVBhY2tldChieXRlcyk7XG4gICAgaWYgKHBhY2tldC5pc1JlcXVlc3QpIHtcbiAgICAgIGhhbmRsZVJlcXVlc3QocGFja2V0LmlkLCBwYWNrZXQudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2FsbGJhY2sgPSByZXNwb25zZUNhbGxiYWNrc1twYWNrZXQuaWRdO1xuICAgICAgZGVsZXRlIHJlc3BvbnNlQ2FsbGJhY2tzW3BhY2tldC5pZF07XG4gICAgICBpZiAocGFja2V0LnZhbHVlLmVycm9yKSBjYWxsYmFjayhwYWNrZXQudmFsdWUuZXJyb3IsIHt9KTtcbiAgICAgIGVsc2UgY2FsbGJhY2sobnVsbCwgcGFja2V0LnZhbHVlKTtcbiAgICB9XG4gIH07XG4gIGxldCBidWlsZE9yQ29udGV4dCA9ICh7IGNhbGxOYW1lLCByZWZzLCBvcHRpb25zLCBpc1RUWSwgZGVmYXVsdFdELCBjYWxsYmFjayB9KSA9PiB7XG4gICAgbGV0IHJlZkNvdW50ID0gMDtcbiAgICBjb25zdCBidWlsZEtleSA9IG5leHRCdWlsZEtleSsrO1xuICAgIGNvbnN0IHJlcXVlc3RDYWxsYmFja3MgPSB7fTtcbiAgICBjb25zdCBidWlsZFJlZnMgPSB7XG4gICAgICByZWYoKSB7XG4gICAgICAgIGlmICgrK3JlZkNvdW50ID09PSAxKSB7XG4gICAgICAgICAgaWYgKHJlZnMpIHJlZnMucmVmKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1bnJlZigpIHtcbiAgICAgICAgaWYgKC0tcmVmQ291bnQgPT09IDApIHtcbiAgICAgICAgICBkZWxldGUgcmVxdWVzdENhbGxiYWNrc0J5S2V5W2J1aWxkS2V5XTtcbiAgICAgICAgICBpZiAocmVmcykgcmVmcy51bnJlZigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXF1ZXN0Q2FsbGJhY2tzQnlLZXlbYnVpbGRLZXldID0gcmVxdWVzdENhbGxiYWNrcztcbiAgICBidWlsZFJlZnMucmVmKCk7XG4gICAgYnVpbGRPckNvbnRleHRJbXBsKFxuICAgICAgY2FsbE5hbWUsXG4gICAgICBidWlsZEtleSxcbiAgICAgIHNlbmRSZXF1ZXN0LFxuICAgICAgc2VuZFJlc3BvbnNlLFxuICAgICAgYnVpbGRSZWZzLFxuICAgICAgc3RyZWFtSW4sXG4gICAgICByZXF1ZXN0Q2FsbGJhY2tzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGlzVFRZLFxuICAgICAgZGVmYXVsdFdELFxuICAgICAgKGVyciwgcmVzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2FsbGJhY2soZXJyLCByZXMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGJ1aWxkUmVmcy51bnJlZigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfTtcbiAgbGV0IHRyYW5zZm9ybTIgPSAoeyBjYWxsTmFtZSwgcmVmcywgaW5wdXQsIG9wdGlvbnMsIGlzVFRZLCBmcywgY2FsbGJhY2sgfSkgPT4ge1xuICAgIGNvbnN0IGRldGFpbHMgPSBjcmVhdGVPYmplY3RTdGFzaCgpO1xuICAgIGxldCBzdGFydCA9IChpbnB1dFBhdGgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIgJiYgIShpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGlucHV0IHRvIFwidHJhbnNmb3JtXCIgbXVzdCBiZSBhIHN0cmluZyBvciBhIFVpbnQ4QXJyYXknKTtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBmbGFncyxcbiAgICAgICAgICBtYW5nbGVDYWNoZVxuICAgICAgICB9ID0gZmxhZ3NGb3JUcmFuc2Zvcm1PcHRpb25zKGNhbGxOYW1lLCBvcHRpb25zLCBpc1RUWSwgdHJhbnNmb3JtTG9nTGV2ZWxEZWZhdWx0KTtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgY29tbWFuZDogXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgICBmbGFncyxcbiAgICAgICAgICBpbnB1dEZTOiBpbnB1dFBhdGggIT09IG51bGwsXG4gICAgICAgICAgaW5wdXQ6IGlucHV0UGF0aCAhPT0gbnVsbCA/IGVuY29kZVVURjgoaW5wdXRQYXRoKSA6IHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiA/IGVuY29kZVVURjgoaW5wdXQpIDogaW5wdXRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG1hbmdsZUNhY2hlKSByZXF1ZXN0Lm1hbmdsZUNhY2hlID0gbWFuZ2xlQ2FjaGU7XG4gICAgICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QsIChlcnJvciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoZXJyb3IpLCBudWxsKTtcbiAgICAgICAgICBsZXQgZXJyb3JzID0gcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLmVycm9ycywgZGV0YWlscyk7XG4gICAgICAgICAgbGV0IHdhcm5pbmdzID0gcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLndhcm5pbmdzLCBkZXRhaWxzKTtcbiAgICAgICAgICBsZXQgb3V0c3RhbmRpbmcgPSAxO1xuICAgICAgICAgIGxldCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKC0tb3V0c3RhbmRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICB3YXJuaW5ncyxcbiAgICAgICAgICAgICAgICBjb2RlOiByZXNwb25zZS5jb2RlLFxuICAgICAgICAgICAgICAgIG1hcDogcmVzcG9uc2UubWFwLFxuICAgICAgICAgICAgICAgIG1hbmdsZUNhY2hlOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgbGVnYWxDb21tZW50czogdm9pZCAwXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGlmIChcImxlZ2FsQ29tbWVudHNcIiBpbiByZXNwb25zZSkgcmVzdWx0LmxlZ2FsQ29tbWVudHMgPSByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UubGVnYWxDb21tZW50cztcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm1hbmdsZUNhY2hlKSByZXN1bHQubWFuZ2xlQ2FjaGUgPSByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UubWFuZ2xlQ2FjaGU7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHJldHVybiBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKFwiVHJhbnNmb3JtIGZhaWxlZFwiLCBlcnJvcnMsIHdhcm5pbmdzKSwgbnVsbCk7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmNvZGVGUykge1xuICAgICAgICAgICAgb3V0c3RhbmRpbmcrKztcbiAgICAgICAgICAgIGZzLnJlYWRGaWxlKHJlc3BvbnNlLmNvZGUsIChlcnIsIGNvbnRlbnRzKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlcnIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIG51bGwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNvZGUgPSBjb250ZW50cztcbiAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzcG9uc2UubWFwRlMpIHtcbiAgICAgICAgICAgIG91dHN0YW5kaW5nKys7XG4gICAgICAgICAgICBmcy5yZWFkRmlsZShyZXNwb25zZS5tYXAsIChlcnIsIGNvbnRlbnRzKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlcnIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIG51bGwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1hcCA9IGNvbnRlbnRzO1xuICAgICAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxldCBmbGFncyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHB1c2hMb2dGbGFncyhmbGFncywgb3B0aW9ucywge30sIGlzVFRZLCB0cmFuc2Zvcm1Mb2dMZXZlbERlZmF1bHQpO1xuICAgICAgICB9IGNhdGNoIChlMikge1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVycm9yID0gZXh0cmFjdEVycm9yTWVzc2FnZVY4KGUsIHN0cmVhbUluLCBkZXRhaWxzLCB2b2lkIDAsIFwiXCIpO1xuICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCB7IGNvbW1hbmQ6IFwiZXJyb3JcIiwgZmxhZ3MsIGVycm9yIH0sICgpID0+IHtcbiAgICAgICAgICBlcnJvci5kZXRhaWwgPSBkZXRhaWxzLmxvYWQoZXJyb3IuZGV0YWlsKTtcbiAgICAgICAgICBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKFwiVHJhbnNmb3JtIGZhaWxlZFwiLCBbZXJyb3JdLCBbXSksIG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICgodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiIHx8IGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkgJiYgaW5wdXQubGVuZ3RoID4gMTAyNCAqIDEwMjQpIHtcbiAgICAgIGxldCBuZXh0ID0gc3RhcnQ7XG4gICAgICBzdGFydCA9ICgpID0+IGZzLndyaXRlRmlsZShpbnB1dCwgbmV4dCk7XG4gICAgfVxuICAgIHN0YXJ0KG51bGwpO1xuICB9O1xuICBsZXQgZm9ybWF0TWVzc2FnZXMyID0gKHsgY2FsbE5hbWUsIHJlZnMsIG1lc3NhZ2VzLCBvcHRpb25zLCBjYWxsYmFjayB9KSA9PiB7XG4gICAgaWYgKCFvcHRpb25zKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgc2Vjb25kIGFyZ3VtZW50IGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICAgIGxldCBrZXlzID0ge307XG4gICAgbGV0IGtpbmQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwia2luZFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGxldCBjb2xvciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJjb2xvclwiLCBtdXN0QmVCb29sZWFuKTtcbiAgICBsZXQgdGVybWluYWxXaWR0aCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ0ZXJtaW5hbFdpZHRoXCIsIG11c3RCZUludGVnZXIpO1xuICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMsIGBpbiAke2NhbGxOYW1lfSgpIGNhbGxgKTtcbiAgICBpZiAoa2luZCA9PT0gdm9pZCAwKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgXCJraW5kXCIgaW4gJHtjYWxsTmFtZX0oKSBjYWxsYCk7XG4gICAgaWYgKGtpbmQgIT09IFwiZXJyb3JcIiAmJiBraW5kICE9PSBcIndhcm5pbmdcIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBcImtpbmRcIiB0byBiZSBcImVycm9yXCIgb3IgXCJ3YXJuaW5nXCIgaW4gJHtjYWxsTmFtZX0oKSBjYWxsYCk7XG4gICAgbGV0IHJlcXVlc3QgPSB7XG4gICAgICBjb21tYW5kOiBcImZvcm1hdC1tc2dzXCIsXG4gICAgICBtZXNzYWdlczogc2FuaXRpemVNZXNzYWdlcyhtZXNzYWdlcywgXCJtZXNzYWdlc1wiLCBudWxsLCBcIlwiLCB0ZXJtaW5hbFdpZHRoKSxcbiAgICAgIGlzV2FybmluZzoga2luZCA9PT0gXCJ3YXJuaW5nXCJcbiAgICB9O1xuICAgIGlmIChjb2xvciAhPT0gdm9pZCAwKSByZXF1ZXN0LmNvbG9yID0gY29sb3I7XG4gICAgaWYgKHRlcm1pbmFsV2lkdGggIT09IHZvaWQgMCkgcmVxdWVzdC50ZXJtaW5hbFdpZHRoID0gdGVybWluYWxXaWR0aDtcbiAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0LCAoZXJyb3IsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoZXJyb3IpLCBudWxsKTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLm1lc3NhZ2VzKTtcbiAgICB9KTtcbiAgfTtcbiAgbGV0IGFuYWx5emVNZXRhZmlsZTIgPSAoeyBjYWxsTmFtZSwgcmVmcywgbWV0YWZpbGUsIG9wdGlvbnMsIGNhbGxiYWNrIH0pID0+IHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSBvcHRpb25zID0ge307XG4gICAgbGV0IGtleXMgPSB7fTtcbiAgICBsZXQgY29sb3IgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiY29sb3JcIiwgbXVzdEJlQm9vbGVhbik7XG4gICAgbGV0IHZlcmJvc2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwidmVyYm9zZVwiLCBtdXN0QmVCb29sZWFuKTtcbiAgICBjaGVja0ZvckludmFsaWRGbGFncyhvcHRpb25zLCBrZXlzLCBgaW4gJHtjYWxsTmFtZX0oKSBjYWxsYCk7XG4gICAgbGV0IHJlcXVlc3QgPSB7XG4gICAgICBjb21tYW5kOiBcImFuYWx5emUtbWV0YWZpbGVcIixcbiAgICAgIG1ldGFmaWxlXG4gICAgfTtcbiAgICBpZiAoY29sb3IgIT09IHZvaWQgMCkgcmVxdWVzdC5jb2xvciA9IGNvbG9yO1xuICAgIGlmICh2ZXJib3NlICE9PSB2b2lkIDApIHJlcXVlc3QudmVyYm9zZSA9IHZlcmJvc2U7XG4gICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdCwgKGVycm9yLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGVycm9yKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGVycm9yKSwgbnVsbCk7XG4gICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5yZXN1bHQpO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIHJlYWRGcm9tU3Rkb3V0LFxuICAgIGFmdGVyQ2xvc2UsXG4gICAgc2VydmljZToge1xuICAgICAgYnVpbGRPckNvbnRleHQsXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybTIsXG4gICAgICBmb3JtYXRNZXNzYWdlczogZm9ybWF0TWVzc2FnZXMyLFxuICAgICAgYW5hbHl6ZU1ldGFmaWxlOiBhbmFseXplTWV0YWZpbGUyXG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gYnVpbGRPckNvbnRleHRJbXBsKGNhbGxOYW1lLCBidWlsZEtleSwgc2VuZFJlcXVlc3QsIHNlbmRSZXNwb25zZSwgcmVmcywgc3RyZWFtSW4sIHJlcXVlc3RDYWxsYmFja3MsIG9wdGlvbnMsIGlzVFRZLCBkZWZhdWx0V0QsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGRldGFpbHMgPSBjcmVhdGVPYmplY3RTdGFzaCgpO1xuICBjb25zdCBpc0NvbnRleHQgPSBjYWxsTmFtZSA9PT0gXCJjb250ZXh0XCI7XG4gIGNvbnN0IGhhbmRsZUVycm9yID0gKGUsIHBsdWdpbk5hbWUpID0+IHtcbiAgICBjb25zdCBmbGFncyA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIHt9LCBpc1RUWSwgYnVpbGRMb2dMZXZlbERlZmF1bHQpO1xuICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBleHRyYWN0RXJyb3JNZXNzYWdlVjgoZSwgc3RyZWFtSW4sIGRldGFpbHMsIHZvaWQgMCwgcGx1Z2luTmFtZSk7XG4gICAgc2VuZFJlcXVlc3QocmVmcywgeyBjb21tYW5kOiBcImVycm9yXCIsIGZsYWdzLCBlcnJvcjogbWVzc2FnZSB9LCAoKSA9PiB7XG4gICAgICBtZXNzYWdlLmRldGFpbCA9IGRldGFpbHMubG9hZChtZXNzYWdlLmRldGFpbCk7XG4gICAgICBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKGlzQ29udGV4dCA/IFwiQ29udGV4dCBmYWlsZWRcIiA6IFwiQnVpbGQgZmFpbGVkXCIsIFttZXNzYWdlXSwgW10pLCBudWxsKTtcbiAgICB9KTtcbiAgfTtcbiAgbGV0IHBsdWdpbnM7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy5wbHVnaW5zO1xuICAgIGlmICh2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gaGFuZGxlRXJyb3IobmV3IEVycm9yKGBcInBsdWdpbnNcIiBtdXN0IGJlIGFuIGFycmF5YCksIFwiXCIpO1xuICAgICAgcGx1Z2lucyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBpZiAocGx1Z2lucyAmJiBwbHVnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc3RyZWFtSW4uaXNTeW5jKSByZXR1cm4gaGFuZGxlRXJyb3IobmV3IEVycm9yKFwiQ2Fubm90IHVzZSBwbHVnaW5zIGluIHN5bmNocm9ub3VzIEFQSSBjYWxsc1wiKSwgXCJcIik7XG4gICAgaGFuZGxlUGx1Z2lucyhcbiAgICAgIGJ1aWxkS2V5LFxuICAgICAgc2VuZFJlcXVlc3QsXG4gICAgICBzZW5kUmVzcG9uc2UsXG4gICAgICByZWZzLFxuICAgICAgc3RyZWFtSW4sXG4gICAgICByZXF1ZXN0Q2FsbGJhY2tzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHBsdWdpbnMsXG4gICAgICBkZXRhaWxzXG4gICAgKS50aGVuKFxuICAgICAgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykgcmV0dXJuIGhhbmRsZUVycm9yKHJlc3VsdC5lcnJvciwgcmVzdWx0LnBsdWdpbk5hbWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJ1aWxkT3JDb250ZXh0Q29udGludWUocmVzdWx0LnJlcXVlc3RQbHVnaW5zLCByZXN1bHQucnVuT25FbmRDYWxsYmFja3MsIHJlc3VsdC5zY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIChlKSA9PiBoYW5kbGVFcnJvcihlLCBcIlwiKVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgYnVpbGRPckNvbnRleHRDb250aW51ZShudWxsLCAocmVzdWx0LCBkb25lKSA9PiBkb25lKFtdLCBbXSksICgpID0+IHtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhhbmRsZUVycm9yKGUsIFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkT3JDb250ZXh0Q29udGludWUocmVxdWVzdFBsdWdpbnMsIHJ1bk9uRW5kQ2FsbGJhY2tzLCBzY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcykge1xuICAgIGNvbnN0IHdyaXRlRGVmYXVsdCA9IHN0cmVhbUluLmhhc0ZTO1xuICAgIGNvbnN0IHtcbiAgICAgIGVudHJpZXMsXG4gICAgICBmbGFncyxcbiAgICAgIHdyaXRlLFxuICAgICAgc3RkaW5Db250ZW50cyxcbiAgICAgIHN0ZGluUmVzb2x2ZURpcixcbiAgICAgIGFic1dvcmtpbmdEaXIsXG4gICAgICBub2RlUGF0aHMsXG4gICAgICBtYW5nbGVDYWNoZVxuICAgIH0gPSBmbGFnc0ZvckJ1aWxkT3B0aW9ucyhjYWxsTmFtZSwgb3B0aW9ucywgaXNUVFksIGJ1aWxkTG9nTGV2ZWxEZWZhdWx0LCB3cml0ZURlZmF1bHQpO1xuICAgIGlmICh3cml0ZSAmJiAhc3RyZWFtSW4uaGFzRlMpIHRocm93IG5ldyBFcnJvcihgVGhlIFwid3JpdGVcIiBvcHRpb24gaXMgdW5hdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudGApO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBjb21tYW5kOiBcImJ1aWxkXCIsXG4gICAgICBrZXk6IGJ1aWxkS2V5LFxuICAgICAgZW50cmllcyxcbiAgICAgIGZsYWdzLFxuICAgICAgd3JpdGUsXG4gICAgICBzdGRpbkNvbnRlbnRzLFxuICAgICAgc3RkaW5SZXNvbHZlRGlyLFxuICAgICAgYWJzV29ya2luZ0RpcjogYWJzV29ya2luZ0RpciB8fCBkZWZhdWx0V0QsXG4gICAgICBub2RlUGF0aHMsXG4gICAgICBjb250ZXh0OiBpc0NvbnRleHRcbiAgICB9O1xuICAgIGlmIChyZXF1ZXN0UGx1Z2lucykgcmVxdWVzdC5wbHVnaW5zID0gcmVxdWVzdFBsdWdpbnM7XG4gICAgaWYgKG1hbmdsZUNhY2hlKSByZXF1ZXN0Lm1hbmdsZUNhY2hlID0gbWFuZ2xlQ2FjaGU7XG4gICAgY29uc3QgYnVpbGRSZXNwb25zZVRvUmVzdWx0ID0gKHJlc3BvbnNlLCBjYWxsYmFjazIpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgZXJyb3JzOiByZXBsYWNlRGV0YWlsc0luTWVzc2FnZXMocmVzcG9uc2UuZXJyb3JzLCBkZXRhaWxzKSxcbiAgICAgICAgd2FybmluZ3M6IHJlcGxhY2VEZXRhaWxzSW5NZXNzYWdlcyhyZXNwb25zZS53YXJuaW5ncywgZGV0YWlscyksXG4gICAgICAgIG91dHB1dEZpbGVzOiB2b2lkIDAsXG4gICAgICAgIG1ldGFmaWxlOiB2b2lkIDAsXG4gICAgICAgIG1hbmdsZUNhY2hlOiB2b2lkIDBcbiAgICAgIH07XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9ycyA9IHJlc3VsdC5lcnJvcnMuc2xpY2UoKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsV2FybmluZ3MgPSByZXN1bHQud2FybmluZ3Muc2xpY2UoKTtcbiAgICAgIGlmIChyZXNwb25zZS5vdXRwdXRGaWxlcykgcmVzdWx0Lm91dHB1dEZpbGVzID0gcmVzcG9uc2Uub3V0cHV0RmlsZXMubWFwKGNvbnZlcnRPdXRwdXRGaWxlcyk7XG4gICAgICBpZiAocmVzcG9uc2UubWV0YWZpbGUpIHJlc3VsdC5tZXRhZmlsZSA9IEpTT04ucGFyc2UocmVzcG9uc2UubWV0YWZpbGUpO1xuICAgICAgaWYgKHJlc3BvbnNlLm1hbmdsZUNhY2hlKSByZXN1bHQubWFuZ2xlQ2FjaGUgPSByZXNwb25zZS5tYW5nbGVDYWNoZTtcbiAgICAgIGlmIChyZXNwb25zZS53cml0ZVRvU3Rkb3V0ICE9PSB2b2lkIDApIGNvbnNvbGUubG9nKGRlY29kZVVURjgocmVzcG9uc2Uud3JpdGVUb1N0ZG91dCkucmVwbGFjZSgvXFxuJC8sIFwiXCIpKTtcbiAgICAgIHJ1bk9uRW5kQ2FsbGJhY2tzKHJlc3VsdCwgKG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKSA9PiB7XG4gICAgICAgIGlmIChvcmlnaW5hbEVycm9ycy5sZW5ndGggPiAwIHx8IG9uRW5kRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IGZhaWx1cmVFcnJvcldpdGhMb2coXCJCdWlsZCBmYWlsZWRcIiwgb3JpZ2luYWxFcnJvcnMuY29uY2F0KG9uRW5kRXJyb3JzKSwgb3JpZ2luYWxXYXJuaW5ncy5jb25jYXQob25FbmRXYXJuaW5ncykpO1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjazIoZXJyb3IsIG51bGwsIG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjazIobnVsbCwgcmVzdWx0LCBvbkVuZEVycm9ycywgb25FbmRXYXJuaW5ncyk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGxldCBsYXRlc3RSZXN1bHRQcm9taXNlO1xuICAgIGxldCBwcm92aWRlTGF0ZXN0UmVzdWx0O1xuICAgIGlmIChpc0NvbnRleHQpXG4gICAgICByZXF1ZXN0Q2FsbGJhY2tzW1wib24tZW5kXCJdID0gKGlkLCByZXF1ZXN0MikgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgYnVpbGRSZXNwb25zZVRvUmVzdWx0KHJlcXVlc3QyLCAoZXJyLCByZXN1bHQsIG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgICBlcnJvcnM6IG9uRW5kRXJyb3JzLFxuICAgICAgICAgICAgd2FybmluZ3M6IG9uRW5kV2FybmluZ3NcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChwcm92aWRlTGF0ZXN0UmVzdWx0KSBwcm92aWRlTGF0ZXN0UmVzdWx0KGVyciwgcmVzdWx0KTtcbiAgICAgICAgICBsYXRlc3RSZXN1bHRQcm9taXNlID0gdm9pZCAwO1xuICAgICAgICAgIHByb3ZpZGVMYXRlc3RSZXN1bHQgPSB2b2lkIDA7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKGlkLCByZXNwb25zZSk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QsIChlcnJvciwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihlcnJvciksIG51bGwpO1xuICAgICAgaWYgKCFpc0NvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkUmVzcG9uc2VUb1Jlc3VsdChyZXNwb25zZSwgKGVyciwgcmVzKSA9PiB7XG4gICAgICAgICAgc2NoZWR1bGVPbkRpc3Bvc2VDYWxsYmFja3MoKTtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyLCByZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwb25zZS5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZmFpbHVyZUVycm9yV2l0aExvZyhcIkNvbnRleHQgZmFpbGVkXCIsIHJlc3BvbnNlLmVycm9ycywgcmVzcG9uc2Uud2FybmluZ3MpLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGxldCBkaWREaXNwb3NlID0gZmFsc2U7XG4gICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIHJlYnVpbGQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAoIWxhdGVzdFJlc3VsdFByb21pc2UpIGxhdGVzdFJlc3VsdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgc2V0dGxlUHJvbWlzZTtcbiAgICAgICAgICAgIHByb3ZpZGVMYXRlc3RSZXN1bHQgPSAoZXJyLCByZXN1bHQyKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghc2V0dGxlUHJvbWlzZSkgc2V0dGxlUHJvbWlzZSA9ICgpID0+IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShyZXN1bHQyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyQW5vdGhlckJ1aWxkID0gKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0MiA9IHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiBcInJlYnVpbGRcIixcbiAgICAgICAgICAgICAgICBrZXk6IGJ1aWxkS2V5XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QyLCAoZXJyb3IyLCByZXNwb25zZTIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IyKSB7XG4gICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGVycm9yMikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGxlUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgc2V0dGxlUHJvbWlzZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0cmlnZ2VyQW5vdGhlckJ1aWxkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0cmlnZ2VyQW5vdGhlckJ1aWxkKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGxhdGVzdFJlc3VsdFByb21pc2U7XG4gICAgICAgIH0sXG4gICAgICAgIHdhdGNoOiAob3B0aW9uczIgPSB7fSkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGlmICghc3RyZWFtSW4uaGFzRlMpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVzZSB0aGUgXCJ3YXRjaFwiIEFQSSBpbiB0aGlzIGVudmlyb25tZW50YCk7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IHt9O1xuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJkZWxheVwiLCBtdXN0QmVJbnRlZ2VyKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhvcHRpb25zMiwga2V5cywgYGluIHdhdGNoKCkgY2FsbGApO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QyID0ge1xuICAgICAgICAgICAgY29tbWFuZDogXCJ3YXRjaFwiLFxuICAgICAgICAgICAga2V5OiBidWlsZEtleVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGRlbGF5KSByZXF1ZXN0Mi5kZWxheSA9IGRlbGF5O1xuICAgICAgICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QyLCAoZXJyb3IyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IyKSByZWplY3QobmV3IEVycm9yKGVycm9yMikpO1xuICAgICAgICAgICAgZWxzZSByZXNvbHZlKHZvaWQgMCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBzZXJ2ZTogKG9wdGlvbnMyID0ge30pID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBpZiAoIXN0cmVhbUluLmhhc0ZTKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB1c2UgdGhlIFwic2VydmVcIiBBUEkgaW4gdGhpcyBlbnZpcm9ubWVudGApO1xuICAgICAgICAgIGNvbnN0IGtleXMgPSB7fTtcbiAgICAgICAgICBjb25zdCBwb3J0ID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJwb3J0XCIsIG11c3RCZVZhbGlkUG9ydE51bWJlcik7XG4gICAgICAgICAgY29uc3QgaG9zdCA9IGdldEZsYWcob3B0aW9uczIsIGtleXMsIFwiaG9zdFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IHNlcnZlZGlyID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJzZXJ2ZWRpclwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGtleWZpbGUgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcImtleWZpbGVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBjb25zdCBjZXJ0ZmlsZSA9IGdldEZsYWcob3B0aW9uczIsIGtleXMsIFwiY2VydGZpbGVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBjb25zdCBmYWxsYmFjayA9IGdldEZsYWcob3B0aW9uczIsIGtleXMsIFwiZmFsbGJhY2tcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBjb25zdCBjb3JzID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJjb3JzXCIsIG11c3RCZU9iamVjdCk7XG4gICAgICAgICAgY29uc3Qgb25SZXF1ZXN0ID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJvblJlcXVlc3RcIiwgbXVzdEJlRnVuY3Rpb24pO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMyLCBrZXlzLCBgaW4gc2VydmUoKSBjYWxsYCk7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdDIgPSB7XG4gICAgICAgICAgICBjb21tYW5kOiBcInNlcnZlXCIsXG4gICAgICAgICAgICBrZXk6IGJ1aWxkS2V5LFxuICAgICAgICAgICAgb25SZXF1ZXN0OiAhIW9uUmVxdWVzdFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHBvcnQgIT09IHZvaWQgMCkgcmVxdWVzdDIucG9ydCA9IHBvcnQ7XG4gICAgICAgICAgaWYgKGhvc3QgIT09IHZvaWQgMCkgcmVxdWVzdDIuaG9zdCA9IGhvc3Q7XG4gICAgICAgICAgaWYgKHNlcnZlZGlyICE9PSB2b2lkIDApIHJlcXVlc3QyLnNlcnZlZGlyID0gc2VydmVkaXI7XG4gICAgICAgICAgaWYgKGtleWZpbGUgIT09IHZvaWQgMCkgcmVxdWVzdDIua2V5ZmlsZSA9IGtleWZpbGU7XG4gICAgICAgICAgaWYgKGNlcnRmaWxlICE9PSB2b2lkIDApIHJlcXVlc3QyLmNlcnRmaWxlID0gY2VydGZpbGU7XG4gICAgICAgICAgaWYgKGZhbGxiYWNrICE9PSB2b2lkIDApIHJlcXVlc3QyLmZhbGxiYWNrID0gZmFsbGJhY2s7XG4gICAgICAgICAgaWYgKGNvcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvcnNLZXlzID0ge307XG4gICAgICAgICAgICBjb25zdCBvcmlnaW4gPSBnZXRGbGFnKGNvcnMsIGNvcnNLZXlzLCBcIm9yaWdpblwiLCBtdXN0QmVTdHJpbmdPckFycmF5T2ZTdHJpbmdzKTtcbiAgICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKGNvcnMsIGNvcnNLZXlzLCBgb24gXCJjb3JzXCIgb2JqZWN0YCk7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcmlnaW4pKSByZXF1ZXN0Mi5jb3JzT3JpZ2luID0gb3JpZ2luO1xuICAgICAgICAgICAgZWxzZSBpZiAob3JpZ2luICE9PSB2b2lkIDApIHJlcXVlc3QyLmNvcnNPcmlnaW4gPSBbb3JpZ2luXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdDIsIChlcnJvcjIsIHJlc3BvbnNlMikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yMikgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoZXJyb3IyKSk7XG4gICAgICAgICAgICBpZiAob25SZXF1ZXN0KSB7XG4gICAgICAgICAgICAgIHJlcXVlc3RDYWxsYmFja3NbXCJzZXJ2ZS1yZXF1ZXN0XCJdID0gKGlkLCByZXF1ZXN0MykgPT4ge1xuICAgICAgICAgICAgICAgIG9uUmVxdWVzdChyZXF1ZXN0My5hcmdzKTtcbiAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UoaWQsIHt9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhbmNlbDogKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBpZiAoZGlkRGlzcG9zZSkgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0MiA9IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiY2FuY2VsXCIsXG4gICAgICAgICAgICBrZXk6IGJ1aWxkS2V5XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0MiwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBpZiAoZGlkRGlzcG9zZSkgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICBkaWREaXNwb3NlID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0MiA9IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiZGlzcG9zZVwiLFxuICAgICAgICAgICAga2V5OiBidWlsZEtleVxuICAgICAgICAgIH07XG4gICAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdDIsICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIHNjaGVkdWxlT25EaXNwb3NlQ2FsbGJhY2tzKCk7XG4gICAgICAgICAgICByZWZzLnVucmVmKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgICAgcmVmcy5yZWYoKTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgfSk7XG4gIH1cbn1cbnZhciBoYW5kbGVQbHVnaW5zID0gKGJ1aWxkS2V5LCBzZW5kUmVxdWVzdCwgc2VuZFJlc3BvbnNlLCByZWZzLCBzdHJlYW1JbiwgcmVxdWVzdENhbGxiYWNrcywgaW5pdGlhbE9wdGlvbnMsIHBsdWdpbnMsIGRldGFpbHMpID0+IF9fYXN5bmMobnVsbCwgbnVsbCwgZnVuY3Rpb24qICgpIHtcbiAgbGV0IG9uU3RhcnRDYWxsYmFja3MgPSBbXTtcbiAgbGV0IG9uRW5kQ2FsbGJhY2tzID0gW107XG4gIGxldCBvblJlc29sdmVDYWxsYmFja3MgPSB7fTtcbiAgbGV0IG9uTG9hZENhbGxiYWNrcyA9IHt9O1xuICBsZXQgb25EaXNwb3NlQ2FsbGJhY2tzID0gW107XG4gIGxldCBuZXh0Q2FsbGJhY2tJRCA9IDA7XG4gIGxldCBpID0gMDtcbiAgbGV0IHJlcXVlc3RQbHVnaW5zID0gW107XG4gIGxldCBpc1NldHVwRG9uZSA9IGZhbHNlO1xuICBwbHVnaW5zID0gWy4uLnBsdWdpbnNdO1xuICBmb3IgKGxldCBpdGVtIG9mIHBsdWdpbnMpIHtcbiAgICBsZXQga2V5cyA9IHt9O1xuICAgIGlmICh0eXBlb2YgaXRlbSAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gYXQgaW5kZXggJHtpfSBtdXN0IGJlIGFuIG9iamVjdGApO1xuICAgIGNvbnN0IG5hbWUgPSBnZXRGbGFnKGl0ZW0sIGtleXMsIFwibmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lID09PSBcIlwiKSB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBhdCBpbmRleCAke2l9IGlzIG1pc3NpbmcgYSBuYW1lYCk7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzZXR1cCA9IGdldEZsYWcoaXRlbSwga2V5cywgXCJzZXR1cFwiLCBtdXN0QmVGdW5jdGlvbik7XG4gICAgICBpZiAodHlwZW9mIHNldHVwICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIGlzIG1pc3NpbmcgYSBzZXR1cCBmdW5jdGlvbmApO1xuICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MoaXRlbSwga2V5cywgYG9uIHBsdWdpbiAke3F1b3RlKG5hbWUpfWApO1xuICAgICAgbGV0IHBsdWdpbiA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb25TdGFydDogZmFsc2UsXG4gICAgICAgIG9uRW5kOiBmYWxzZSxcbiAgICAgICAgb25SZXNvbHZlOiBbXSxcbiAgICAgICAgb25Mb2FkOiBbXVxuICAgICAgfTtcbiAgICAgIGkrKztcbiAgICAgIGxldCByZXNvbHZlID0gKHBhdGgsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBpZiAoIWlzU2V0dXBEb25lKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIFwicmVzb2x2ZVwiIGJlZm9yZSBwbHVnaW4gc2V0dXAgaGFzIGNvbXBsZXRlZCcpO1xuICAgICAgICBpZiAodHlwZW9mIHBhdGggIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihgVGhlIHBhdGggdG8gcmVzb2x2ZSBtdXN0IGJlIGEgc3RyaW5nYCk7XG4gICAgICAgIGxldCBrZXlzMiA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgcGx1Z2luTmFtZSA9IGdldEZsYWcob3B0aW9ucywga2V5czIsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQgaW1wb3J0ZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcImltcG9ydGVyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgIGxldCBuYW1lc3BhY2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcIm5hbWVzcGFjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQgcmVzb2x2ZURpciA9IGdldEZsYWcob3B0aW9ucywga2V5czIsIFwicmVzb2x2ZURpclwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQga2luZCA9IGdldEZsYWcob3B0aW9ucywga2V5czIsIFwia2luZFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQgcGx1Z2luRGF0YSA9IGdldEZsYWcob3B0aW9ucywga2V5czIsIFwicGx1Z2luRGF0YVwiLCBjYW5CZUFueXRoaW5nKTtcbiAgICAgICAgbGV0IGltcG9ydEF0dHJpYnV0ZXMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcIndpdGhcIiwgbXVzdEJlT2JqZWN0KTtcbiAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5czIsIFwiaW4gcmVzb2x2ZSgpIGNhbGxcIik7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgICBjb21tYW5kOiBcInJlc29sdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBrZXk6IGJ1aWxkS2V5LFxuICAgICAgICAgICAgcGx1Z2luTmFtZTogbmFtZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHBsdWdpbk5hbWUgIT0gbnVsbCkgcmVxdWVzdC5wbHVnaW5OYW1lID0gcGx1Z2luTmFtZTtcbiAgICAgICAgICBpZiAoaW1wb3J0ZXIgIT0gbnVsbCkgcmVxdWVzdC5pbXBvcnRlciA9IGltcG9ydGVyO1xuICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgcmVxdWVzdC5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgaWYgKHJlc29sdmVEaXIgIT0gbnVsbCkgcmVxdWVzdC5yZXNvbHZlRGlyID0gcmVzb2x2ZURpcjtcbiAgICAgICAgICBpZiAoa2luZCAhPSBudWxsKSByZXF1ZXN0LmtpbmQgPSBraW5kO1xuICAgICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKGBNdXN0IHNwZWNpZnkgXCJraW5kXCIgd2hlbiBjYWxsaW5nIFwicmVzb2x2ZVwiYCk7XG4gICAgICAgICAgaWYgKHBsdWdpbkRhdGEgIT0gbnVsbCkgcmVxdWVzdC5wbHVnaW5EYXRhID0gZGV0YWlscy5zdG9yZShwbHVnaW5EYXRhKTtcbiAgICAgICAgICBpZiAoaW1wb3J0QXR0cmlidXRlcyAhPSBudWxsKSByZXF1ZXN0LndpdGggPSBzYW5pdGl6ZVN0cmluZ01hcChpbXBvcnRBdHRyaWJ1dGVzLCBcIndpdGhcIik7XG4gICAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdCwgKGVycm9yLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgICAgICAgICBlbHNlIHJlc29sdmUyKHtcbiAgICAgICAgICAgICAgZXJyb3JzOiByZXBsYWNlRGV0YWlsc0luTWVzc2FnZXMocmVzcG9uc2UuZXJyb3JzLCBkZXRhaWxzKSxcbiAgICAgICAgICAgICAgd2FybmluZ3M6IHJlcGxhY2VEZXRhaWxzSW5NZXNzYWdlcyhyZXNwb25zZS53YXJuaW5ncywgZGV0YWlscyksXG4gICAgICAgICAgICAgIHBhdGg6IHJlc3BvbnNlLnBhdGgsXG4gICAgICAgICAgICAgIGV4dGVybmFsOiByZXNwb25zZS5leHRlcm5hbCxcbiAgICAgICAgICAgICAgc2lkZUVmZmVjdHM6IHJlc3BvbnNlLnNpZGVFZmZlY3RzLFxuICAgICAgICAgICAgICBuYW1lc3BhY2U6IHJlc3BvbnNlLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgc3VmZml4OiByZXNwb25zZS5zdWZmaXgsXG4gICAgICAgICAgICAgIHBsdWdpbkRhdGE6IGRldGFpbHMubG9hZChyZXNwb25zZS5wbHVnaW5EYXRhKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGxldCBwcm9taXNlID0gc2V0dXAoe1xuICAgICAgICBpbml0aWFsT3B0aW9ucyxcbiAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgb25TdGFydChjYWxsYmFjaykge1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkVGV4dCA9IGBUaGlzIGVycm9yIGNhbWUgZnJvbSB0aGUgXCJvblN0YXJ0XCIgY2FsbGJhY2sgcmVnaXN0ZXJlZCBoZXJlOmA7XG4gICAgICAgICAgbGV0IHJlZ2lzdGVyZWROb3RlID0gZXh0cmFjdENhbGxlclY4KG5ldyBFcnJvcihyZWdpc3RlcmVkVGV4dCksIHN0cmVhbUluLCBcIm9uU3RhcnRcIik7XG4gICAgICAgICAgb25TdGFydENhbGxiYWNrcy5wdXNoKHsgbmFtZSwgY2FsbGJhY2ssIG5vdGU6IHJlZ2lzdGVyZWROb3RlIH0pO1xuICAgICAgICAgIHBsdWdpbi5vblN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FbmQoY2FsbGJhY2spIHtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZFRleHQgPSBgVGhpcyBlcnJvciBjYW1lIGZyb20gdGhlIFwib25FbmRcIiBjYWxsYmFjayByZWdpc3RlcmVkIGhlcmU6YDtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZE5vdGUgPSBleHRyYWN0Q2FsbGVyVjgobmV3IEVycm9yKHJlZ2lzdGVyZWRUZXh0KSwgc3RyZWFtSW4sIFwib25FbmRcIik7XG4gICAgICAgICAgb25FbmRDYWxsYmFja3MucHVzaCh7IG5hbWUsIGNhbGxiYWNrLCBub3RlOiByZWdpc3RlcmVkTm90ZSB9KTtcbiAgICAgICAgICBwbHVnaW4ub25FbmQgPSB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvblJlc29sdmUob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZFRleHQgPSBgVGhpcyBlcnJvciBjYW1lIGZyb20gdGhlIFwib25SZXNvbHZlXCIgY2FsbGJhY2sgcmVnaXN0ZXJlZCBoZXJlOmA7XG4gICAgICAgICAgbGV0IHJlZ2lzdGVyZWROb3RlID0gZXh0cmFjdENhbGxlclY4KG5ldyBFcnJvcihyZWdpc3RlcmVkVGV4dCksIHN0cmVhbUluLCBcIm9uUmVzb2x2ZVwiKTtcbiAgICAgICAgICBsZXQga2V5czIgPSB7fTtcbiAgICAgICAgICBsZXQgZmlsdGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJmaWx0ZXJcIiwgbXVzdEJlUmVnRXhwKTtcbiAgICAgICAgICBsZXQgbmFtZXNwYWNlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhvcHRpb25zLCBrZXlzMiwgYGluIG9uUmVzb2x2ZSgpIGNhbGwgZm9yIHBsdWdpbiAke3F1b3RlKG5hbWUpfWApO1xuICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGBvblJlc29sdmUoKSBjYWxsIGlzIG1pc3NpbmcgYSBmaWx0ZXJgKTtcbiAgICAgICAgICBsZXQgaWQgPSBuZXh0Q2FsbGJhY2tJRCsrO1xuICAgICAgICAgIG9uUmVzb2x2ZUNhbGxiYWNrc1tpZF0gPSB7IG5hbWUsIGNhbGxiYWNrLCBub3RlOiByZWdpc3RlcmVkTm90ZSB9O1xuICAgICAgICAgIHBsdWdpbi5vblJlc29sdmUucHVzaCh7IGlkLCBmaWx0ZXI6IGpzUmVnRXhwVG9Hb1JlZ0V4cChmaWx0ZXIpLCBuYW1lc3BhY2U6IG5hbWVzcGFjZSB8fCBcIlwiIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvbkxvYWQob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZFRleHQgPSBgVGhpcyBlcnJvciBjYW1lIGZyb20gdGhlIFwib25Mb2FkXCIgY2FsbGJhY2sgcmVnaXN0ZXJlZCBoZXJlOmA7XG4gICAgICAgICAgbGV0IHJlZ2lzdGVyZWROb3RlID0gZXh0cmFjdENhbGxlclY4KG5ldyBFcnJvcihyZWdpc3RlcmVkVGV4dCksIHN0cmVhbUluLCBcIm9uTG9hZFwiKTtcbiAgICAgICAgICBsZXQga2V5czIgPSB7fTtcbiAgICAgICAgICBsZXQgZmlsdGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJmaWx0ZXJcIiwgbXVzdEJlUmVnRXhwKTtcbiAgICAgICAgICBsZXQgbmFtZXNwYWNlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhvcHRpb25zLCBrZXlzMiwgYGluIG9uTG9hZCgpIGNhbGwgZm9yIHBsdWdpbiAke3F1b3RlKG5hbWUpfWApO1xuICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGBvbkxvYWQoKSBjYWxsIGlzIG1pc3NpbmcgYSBmaWx0ZXJgKTtcbiAgICAgICAgICBsZXQgaWQgPSBuZXh0Q2FsbGJhY2tJRCsrO1xuICAgICAgICAgIG9uTG9hZENhbGxiYWNrc1tpZF0gPSB7IG5hbWUsIGNhbGxiYWNrLCBub3RlOiByZWdpc3RlcmVkTm90ZSB9O1xuICAgICAgICAgIHBsdWdpbi5vbkxvYWQucHVzaCh7IGlkLCBmaWx0ZXI6IGpzUmVnRXhwVG9Hb1JlZ0V4cChmaWx0ZXIpLCBuYW1lc3BhY2U6IG5hbWVzcGFjZSB8fCBcIlwiIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvbkRpc3Bvc2UoY2FsbGJhY2spIHtcbiAgICAgICAgICBvbkRpc3Bvc2VDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGVzYnVpbGQ6IHN0cmVhbUluLmVzYnVpbGRcbiAgICAgIH0pO1xuICAgICAgaWYgKHByb21pc2UpIHlpZWxkIHByb21pc2U7XG4gICAgICByZXF1ZXN0UGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogZSwgcGx1Z2luTmFtZTogbmFtZSB9O1xuICAgIH1cbiAgfVxuICByZXF1ZXN0Q2FsbGJhY2tzW1wib24tc3RhcnRcIl0gPSAoaWQsIHJlcXVlc3QpID0+IF9fYXN5bmMobnVsbCwgbnVsbCwgZnVuY3Rpb24qICgpIHtcbiAgICBkZXRhaWxzLmNsZWFyKCk7XG4gICAgbGV0IHJlc3BvbnNlID0geyBlcnJvcnM6IFtdLCB3YXJuaW5nczogW10gfTtcbiAgICB5aWVsZCBQcm9taXNlLmFsbChvblN0YXJ0Q2FsbGJhY2tzLm1hcCgoXzApID0+IF9fYXN5bmMobnVsbCwgW18wXSwgZnVuY3Rpb24qICh7IG5hbWUsIGNhbGxiYWNrLCBub3RlIH0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB5aWVsZCBjYWxsYmFjaygpO1xuICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvblN0YXJ0KCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9IHRvIHJldHVybiBhbiBvYmplY3RgKTtcbiAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgIGxldCBlcnJvcnMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJlcnJvcnNcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgIGxldCB3YXJuaW5ncyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIndhcm5pbmdzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhyZXN1bHQsIGtleXMsIGBmcm9tIG9uU3RhcnQoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX1gKTtcbiAgICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpIHJlc3BvbnNlLmVycm9ycy5wdXNoKC4uLnNhbml0aXplTWVzc2FnZXMoZXJyb3JzLCBcImVycm9yc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApKTtcbiAgICAgICAgICBpZiAod2FybmluZ3MgIT0gbnVsbCkgcmVzcG9uc2Uud2FybmluZ3MucHVzaCguLi5zYW5pdGl6ZU1lc3NhZ2VzKHdhcm5pbmdzLCBcIndhcm5pbmdzXCIsIGRldGFpbHMsIG5hbWUsIHZvaWQgMCkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlc3BvbnNlLmVycm9ycy5wdXNoKGV4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgbm90ZSAmJiBub3RlKCksIG5hbWUpKTtcbiAgICAgIH1cbiAgICB9KSkpO1xuICAgIHNlbmRSZXNwb25zZShpZCwgcmVzcG9uc2UpO1xuICB9KTtcbiAgcmVxdWVzdENhbGxiYWNrc1tcIm9uLXJlc29sdmVcIl0gPSAoaWQsIHJlcXVlc3QpID0+IF9fYXN5bmMobnVsbCwgbnVsbCwgZnVuY3Rpb24qICgpIHtcbiAgICBsZXQgcmVzcG9uc2UgPSB7fSwgbmFtZSA9IFwiXCIsIGNhbGxiYWNrLCBub3RlO1xuICAgIGZvciAobGV0IGlkMiBvZiByZXF1ZXN0Lmlkcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHsgbmFtZSwgY2FsbGJhY2ssIG5vdGUgfSA9IG9uUmVzb2x2ZUNhbGxiYWNrc1tpZDJdKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIGNhbGxiYWNrKHtcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnBhdGgsXG4gICAgICAgICAgaW1wb3J0ZXI6IHJlcXVlc3QuaW1wb3J0ZXIsXG4gICAgICAgICAgbmFtZXNwYWNlOiByZXF1ZXN0Lm5hbWVzcGFjZSxcbiAgICAgICAgICByZXNvbHZlRGlyOiByZXF1ZXN0LnJlc29sdmVEaXIsXG4gICAgICAgICAga2luZDogcmVxdWVzdC5raW5kLFxuICAgICAgICAgIHBsdWdpbkRhdGE6IGRldGFpbHMubG9hZChyZXF1ZXN0LnBsdWdpbkRhdGEpLFxuICAgICAgICAgIHdpdGg6IHJlcXVlc3Qud2l0aFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb25SZXNvbHZlKCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9IHRvIHJldHVybiBhbiBvYmplY3RgKTtcbiAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgIGxldCBwbHVnaW5OYW1lID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBwYXRoID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwicGF0aFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBuYW1lc3BhY2UgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgc3VmZml4ID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwic3VmZml4XCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgbGV0IGV4dGVybmFsID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwiZXh0ZXJuYWxcIiwgbXVzdEJlQm9vbGVhbik7XG4gICAgICAgICAgbGV0IHNpZGVFZmZlY3RzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwic2lkZUVmZmVjdHNcIiwgbXVzdEJlQm9vbGVhbik7XG4gICAgICAgICAgbGV0IHBsdWdpbkRhdGEgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJwbHVnaW5EYXRhXCIsIGNhbkJlQW55dGhpbmcpO1xuICAgICAgICAgIGxldCBlcnJvcnMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJlcnJvcnNcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgIGxldCB3YXJuaW5ncyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIndhcm5pbmdzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICBsZXQgd2F0Y2hGaWxlcyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIndhdGNoRmlsZXNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICAgICAgICAgIGxldCB3YXRjaERpcnMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJ3YXRjaERpcnNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKHJlc3VsdCwga2V5cywgYGZyb20gb25SZXNvbHZlKCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICAgICAgcmVzcG9uc2UuaWQgPSBpZDI7XG4gICAgICAgICAgaWYgKHBsdWdpbk5hbWUgIT0gbnVsbCkgcmVzcG9uc2UucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWU7XG4gICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgcmVzcG9uc2UucGF0aCA9IHBhdGg7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKSByZXNwb25zZS5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgaWYgKHN1ZmZpeCAhPSBudWxsKSByZXNwb25zZS5zdWZmaXggPSBzdWZmaXg7XG4gICAgICAgICAgaWYgKGV4dGVybmFsICE9IG51bGwpIHJlc3BvbnNlLmV4dGVybmFsID0gZXh0ZXJuYWw7XG4gICAgICAgICAgaWYgKHNpZGVFZmZlY3RzICE9IG51bGwpIHJlc3BvbnNlLnNpZGVFZmZlY3RzID0gc2lkZUVmZmVjdHM7XG4gICAgICAgICAgaWYgKHBsdWdpbkRhdGEgIT0gbnVsbCkgcmVzcG9uc2UucGx1Z2luRGF0YSA9IGRldGFpbHMuc3RvcmUocGx1Z2luRGF0YSk7XG4gICAgICAgICAgaWYgKGVycm9ycyAhPSBudWxsKSByZXNwb25zZS5lcnJvcnMgPSBzYW5pdGl6ZU1lc3NhZ2VzKGVycm9ycywgXCJlcnJvcnNcIiwgZGV0YWlscywgbmFtZSwgdm9pZCAwKTtcbiAgICAgICAgICBpZiAod2FybmluZ3MgIT0gbnVsbCkgcmVzcG9uc2Uud2FybmluZ3MgPSBzYW5pdGl6ZU1lc3NhZ2VzKHdhcm5pbmdzLCBcIndhcm5pbmdzXCIsIGRldGFpbHMsIG5hbWUsIHZvaWQgMCk7XG4gICAgICAgICAgaWYgKHdhdGNoRmlsZXMgIT0gbnVsbCkgcmVzcG9uc2Uud2F0Y2hGaWxlcyA9IHNhbml0aXplU3RyaW5nQXJyYXkod2F0Y2hGaWxlcywgXCJ3YXRjaEZpbGVzXCIpO1xuICAgICAgICAgIGlmICh3YXRjaERpcnMgIT0gbnVsbCkgcmVzcG9uc2Uud2F0Y2hEaXJzID0gc2FuaXRpemVTdHJpbmdBcnJheSh3YXRjaERpcnMsIFwid2F0Y2hEaXJzXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlc3BvbnNlID0geyBpZDogaWQyLCBlcnJvcnM6IFtleHRyYWN0RXJyb3JNZXNzYWdlVjgoZSwgc3RyZWFtSW4sIGRldGFpbHMsIG5vdGUgJiYgbm90ZSgpLCBuYW1lKV0gfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHNlbmRSZXNwb25zZShpZCwgcmVzcG9uc2UpO1xuICB9KTtcbiAgcmVxdWVzdENhbGxiYWNrc1tcIm9uLWxvYWRcIl0gPSAoaWQsIHJlcXVlc3QpID0+IF9fYXN5bmMobnVsbCwgbnVsbCwgZnVuY3Rpb24qICgpIHtcbiAgICBsZXQgcmVzcG9uc2UgPSB7fSwgbmFtZSA9IFwiXCIsIGNhbGxiYWNrLCBub3RlO1xuICAgIGZvciAobGV0IGlkMiBvZiByZXF1ZXN0Lmlkcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHsgbmFtZSwgY2FsbGJhY2ssIG5vdGUgfSA9IG9uTG9hZENhbGxiYWNrc1tpZDJdKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIGNhbGxiYWNrKHtcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnBhdGgsXG4gICAgICAgICAgbmFtZXNwYWNlOiByZXF1ZXN0Lm5hbWVzcGFjZSxcbiAgICAgICAgICBzdWZmaXg6IHJlcXVlc3Quc3VmZml4LFxuICAgICAgICAgIHBsdWdpbkRhdGE6IGRldGFpbHMubG9hZChyZXF1ZXN0LnBsdWdpbkRhdGEpLFxuICAgICAgICAgIHdpdGg6IHJlcXVlc3Qud2l0aFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb25Mb2FkKCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9IHRvIHJldHVybiBhbiBvYmplY3RgKTtcbiAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgIGxldCBwbHVnaW5OYW1lID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBjb250ZW50cyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcImNvbnRlbnRzXCIsIG11c3RCZVN0cmluZ09yVWludDhBcnJheSk7XG4gICAgICAgICAgbGV0IHJlc29sdmVEaXIgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJyZXNvbHZlRGlyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgbGV0IHBsdWdpbkRhdGEgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJwbHVnaW5EYXRhXCIsIGNhbkJlQW55dGhpbmcpO1xuICAgICAgICAgIGxldCBsb2FkZXIgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJsb2FkZXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgZXJyb3JzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwiZXJyb3JzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICBsZXQgd2FybmluZ3MgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJ3YXJuaW5nc1wiLCBtdXN0QmVBcnJheSk7XG4gICAgICAgICAgbGV0IHdhdGNoRmlsZXMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJ3YXRjaEZpbGVzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgICAgICAgICBsZXQgd2F0Y2hEaXJzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwid2F0Y2hEaXJzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhyZXN1bHQsIGtleXMsIGBmcm9tIG9uTG9hZCgpIGNhbGxiYWNrIGluIHBsdWdpbiAke3F1b3RlKG5hbWUpfWApO1xuICAgICAgICAgIHJlc3BvbnNlLmlkID0gaWQyO1xuICAgICAgICAgIGlmIChwbHVnaW5OYW1lICE9IG51bGwpIHJlc3BvbnNlLnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lO1xuICAgICAgICAgIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJlc3BvbnNlLmNvbnRlbnRzID0gY29udGVudHM7XG4gICAgICAgICAgZWxzZSBpZiAoY29udGVudHMgIT0gbnVsbCkgcmVzcG9uc2UuY29udGVudHMgPSBlbmNvZGVVVEY4KGNvbnRlbnRzKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZURpciAhPSBudWxsKSByZXNwb25zZS5yZXNvbHZlRGlyID0gcmVzb2x2ZURpcjtcbiAgICAgICAgICBpZiAocGx1Z2luRGF0YSAhPSBudWxsKSByZXNwb25zZS5wbHVnaW5EYXRhID0gZGV0YWlscy5zdG9yZShwbHVnaW5EYXRhKTtcbiAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHJlc3BvbnNlLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpIHJlc3BvbnNlLmVycm9ycyA9IHNhbml0aXplTWVzc2FnZXMoZXJyb3JzLCBcImVycm9yc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApO1xuICAgICAgICAgIGlmICh3YXJuaW5ncyAhPSBudWxsKSByZXNwb25zZS53YXJuaW5ncyA9IHNhbml0aXplTWVzc2FnZXMod2FybmluZ3MsIFwid2FybmluZ3NcIiwgZGV0YWlscywgbmFtZSwgdm9pZCAwKTtcbiAgICAgICAgICBpZiAod2F0Y2hGaWxlcyAhPSBudWxsKSByZXNwb25zZS53YXRjaEZpbGVzID0gc2FuaXRpemVTdHJpbmdBcnJheSh3YXRjaEZpbGVzLCBcIndhdGNoRmlsZXNcIik7XG4gICAgICAgICAgaWYgKHdhdGNoRGlycyAhPSBudWxsKSByZXNwb25zZS53YXRjaERpcnMgPSBzYW5pdGl6ZVN0cmluZ0FycmF5KHdhdGNoRGlycywgXCJ3YXRjaERpcnNcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB7IGlkOiBpZDIsIGVycm9yczogW2V4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgbm90ZSAmJiBub3RlKCksIG5hbWUpXSB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgc2VuZFJlc3BvbnNlKGlkLCByZXNwb25zZSk7XG4gIH0pO1xuICBsZXQgcnVuT25FbmRDYWxsYmFja3MgPSAocmVzdWx0LCBkb25lKSA9PiBkb25lKFtdLCBbXSk7XG4gIGlmIChvbkVuZENhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgcnVuT25FbmRDYWxsYmFja3MgPSAocmVzdWx0LCBkb25lKSA9PiB7XG4gICAgICAoKCkgPT4gX19hc3luYyhudWxsLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBvbkVuZEVycm9ycyA9IFtdO1xuICAgICAgICBjb25zdCBvbkVuZFdhcm5pbmdzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgeyBuYW1lLCBjYWxsYmFjaywgbm90ZSB9IG9mIG9uRW5kQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgbGV0IG5ld0Vycm9ycztcbiAgICAgICAgICBsZXQgbmV3V2FybmluZ3M7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0geWllbGQgY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb25FbmQoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX0gdG8gcmV0dXJuIGFuIG9iamVjdGApO1xuICAgICAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgICAgICBsZXQgZXJyb3JzID0gZ2V0RmxhZyh2YWx1ZSwga2V5cywgXCJlcnJvcnNcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgICAgICBsZXQgd2FybmluZ3MgPSBnZXRGbGFnKHZhbHVlLCBrZXlzLCBcIndhcm5pbmdzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3ModmFsdWUsIGtleXMsIGBmcm9tIG9uRW5kKCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICAgICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkgbmV3RXJyb3JzID0gc2FuaXRpemVNZXNzYWdlcyhlcnJvcnMsIFwiZXJyb3JzXCIsIGRldGFpbHMsIG5hbWUsIHZvaWQgMCk7XG4gICAgICAgICAgICAgIGlmICh3YXJuaW5ncyAhPSBudWxsKSBuZXdXYXJuaW5ncyA9IHNhbml0aXplTWVzc2FnZXMod2FybmluZ3MsIFwid2FybmluZ3NcIiwgZGV0YWlscywgbmFtZSwgdm9pZCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBuZXdFcnJvcnMgPSBbZXh0cmFjdEVycm9yTWVzc2FnZVY4KGUsIHN0cmVhbUluLCBkZXRhaWxzLCBub3RlICYmIG5vdGUoKSwgbmFtZSldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmV3RXJyb3JzKSB7XG4gICAgICAgICAgICBvbkVuZEVycm9ycy5wdXNoKC4uLm5ld0Vycm9ycyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2goLi4ubmV3RXJyb3JzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5ld1dhcm5pbmdzKSB7XG4gICAgICAgICAgICBvbkVuZFdhcm5pbmdzLnB1c2goLi4ubmV3V2FybmluZ3MpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmVzdWx0Lndhcm5pbmdzLnB1c2goLi4ubmV3V2FybmluZ3MpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkb25lKG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKTtcbiAgICAgIH0pKSgpO1xuICAgIH07XG4gIH1cbiAgbGV0IHNjaGVkdWxlT25EaXNwb3NlQ2FsbGJhY2tzID0gKCkgPT4ge1xuICAgIGZvciAoY29uc3QgY2Igb2Ygb25EaXNwb3NlQ2FsbGJhY2tzKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGNiKCksIDApO1xuICAgIH1cbiAgfTtcbiAgaXNTZXR1cERvbmUgPSB0cnVlO1xuICByZXR1cm4ge1xuICAgIG9rOiB0cnVlLFxuICAgIHJlcXVlc3RQbHVnaW5zLFxuICAgIHJ1bk9uRW5kQ2FsbGJhY2tzLFxuICAgIHNjaGVkdWxlT25EaXNwb3NlQ2FsbGJhY2tzXG4gIH07XG59KTtcbmZ1bmN0aW9uIGNyZWF0ZU9iamVjdFN0YXNoKCkge1xuICBjb25zdCBtYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgbmV4dElEID0gMDtcbiAgcmV0dXJuIHtcbiAgICBjbGVhcigpIHtcbiAgICAgIG1hcC5jbGVhcigpO1xuICAgIH0sXG4gICAgbG9hZChpZCkge1xuICAgICAgcmV0dXJuIG1hcC5nZXQoaWQpO1xuICAgIH0sXG4gICAgc3RvcmUodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSByZXR1cm4gLTE7XG4gICAgICBjb25zdCBpZCA9IG5leHRJRCsrO1xuICAgICAgbWFwLnNldChpZCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RDYWxsZXJWOChlLCBzdHJlYW1JbiwgaWRlbnQpIHtcbiAgbGV0IG5vdGU7XG4gIGxldCB0cmllZCA9IGZhbHNlO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmICh0cmllZCkgcmV0dXJuIG5vdGU7XG4gICAgdHJpZWQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBsZXQgbGluZXMgPSAoZS5zdGFjayArIFwiXCIpLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgbGluZXMuc3BsaWNlKDEsIDEpO1xuICAgICAgbGV0IGxvY2F0aW9uMiA9IHBhcnNlU3RhY2tMaW5lc1Y4KHN0cmVhbUluLCBsaW5lcywgaWRlbnQpO1xuICAgICAgaWYgKGxvY2F0aW9uMikge1xuICAgICAgICBub3RlID0geyB0ZXh0OiBlLm1lc3NhZ2UsIGxvY2F0aW9uOiBsb2NhdGlvbjIgfTtcbiAgICAgICAgcmV0dXJuIG5vdGU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTIpIHtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBleHRyYWN0RXJyb3JNZXNzYWdlVjgoZSwgc3RyZWFtSW4sIHN0YXNoLCBub3RlLCBwbHVnaW5OYW1lKSB7XG4gIGxldCB0ZXh0ID0gXCJJbnRlcm5hbCBlcnJvclwiO1xuICBsZXQgbG9jYXRpb24yID0gbnVsbDtcbiAgdHJ5IHtcbiAgICB0ZXh0ID0gKGUgJiYgZS5tZXNzYWdlIHx8IGUpICsgXCJcIjtcbiAgfSBjYXRjaCAoZTIpIHtcbiAgfVxuICB0cnkge1xuICAgIGxvY2F0aW9uMiA9IHBhcnNlU3RhY2tMaW5lc1Y4KHN0cmVhbUluLCAoZS5zdGFjayArIFwiXCIpLnNwbGl0KFwiXFxuXCIpLCBcIlwiKTtcbiAgfSBjYXRjaCAoZTIpIHtcbiAgfVxuICByZXR1cm4geyBpZDogXCJcIiwgcGx1Z2luTmFtZSwgdGV4dCwgbG9jYXRpb246IGxvY2F0aW9uMiwgbm90ZXM6IG5vdGUgPyBbbm90ZV0gOiBbXSwgZGV0YWlsOiBzdGFzaCA/IHN0YXNoLnN0b3JlKGUpIDogLTEgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlU3RhY2tMaW5lc1Y4KHN0cmVhbUluLCBsaW5lcywgaWRlbnQpIHtcbiAgbGV0IGF0ID0gXCIgICAgYXQgXCI7XG4gIGlmIChzdHJlYW1Jbi5yZWFkRmlsZVN5bmMgJiYgIWxpbmVzWzBdLnN0YXJ0c1dpdGgoYXQpICYmIGxpbmVzWzFdLnN0YXJ0c1dpdGgoYXQpKSB7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKGF0KSkgY29udGludWU7XG4gICAgICBsaW5lID0gbGluZS5zbGljZShhdC5sZW5ndGgpO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gL14oPzpuZXcgfGFzeW5jICk/XFxTKyBcXCgoLiopXFwpJC8uZXhlYyhsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgbGluZSA9IG1hdGNoWzFdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoID0gL15ldmFsIGF0IFxcUysgXFwoKC4qKVxcKSg/OiwgXFxTKzpcXGQrOlxcZCspPyQvLmV4ZWMobGluZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGxpbmUgPSBtYXRjaFsxXTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBtYXRjaCA9IC9eKFxcUyspOihcXGQrKTooXFxkKykkLy5leGVjKGxpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsZXQgY29udGVudHM7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnRlbnRzID0gc3RyZWFtSW4ucmVhZEZpbGVTeW5jKG1hdGNoWzFdLCBcInV0ZjhcIik7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBsaW5lVGV4dCA9IGNvbnRlbnRzLnNwbGl0KC9cXHJcXG58XFxyfFxcbnxcXHUyMDI4fFxcdTIwMjkvKVsrbWF0Y2hbMl0gLSAxXSB8fCBcIlwiO1xuICAgICAgICAgIGxldCBjb2x1bW4gPSArbWF0Y2hbM10gLSAxO1xuICAgICAgICAgIGxldCBsZW5ndGggPSBsaW5lVGV4dC5zbGljZShjb2x1bW4sIGNvbHVtbiArIGlkZW50Lmxlbmd0aCkgPT09IGlkZW50ID8gaWRlbnQubGVuZ3RoIDogMDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICBuYW1lc3BhY2U6IFwiZmlsZVwiLFxuICAgICAgICAgICAgbGluZTogK21hdGNoWzJdLFxuICAgICAgICAgICAgY29sdW1uOiBlbmNvZGVVVEY4KGxpbmVUZXh0LnNsaWNlKDAsIGNvbHVtbikpLmxlbmd0aCxcbiAgICAgICAgICAgIGxlbmd0aDogZW5jb2RlVVRGOChsaW5lVGV4dC5zbGljZShjb2x1bW4sIGNvbHVtbiArIGxlbmd0aCkpLmxlbmd0aCxcbiAgICAgICAgICAgIGxpbmVUZXh0OiBsaW5lVGV4dCArIFwiXFxuXCIgKyBsaW5lcy5zbGljZSgxKS5qb2luKFwiXFxuXCIpLFxuICAgICAgICAgICAgc3VnZ2VzdGlvbjogXCJcIlxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZmFpbHVyZUVycm9yV2l0aExvZyh0ZXh0LCBlcnJvcnMsIHdhcm5pbmdzKSB7XG4gIGxldCBsaW1pdCA9IDU7XG4gIHRleHQgKz0gZXJyb3JzLmxlbmd0aCA8IDEgPyBcIlwiIDogYCB3aXRoICR7ZXJyb3JzLmxlbmd0aH0gZXJyb3Ike2Vycm9ycy5sZW5ndGggPCAyID8gXCJcIiA6IFwic1wifTpgICsgZXJyb3JzLnNsaWNlKDAsIGxpbWl0ICsgMSkubWFwKChlLCBpKSA9PiB7XG4gICAgaWYgKGkgPT09IGxpbWl0KSByZXR1cm4gXCJcXG4uLi5cIjtcbiAgICBpZiAoIWUubG9jYXRpb24pIHJldHVybiBgXG5lcnJvcjogJHtlLnRleHR9YDtcbiAgICBsZXQgeyBmaWxlLCBsaW5lLCBjb2x1bW4gfSA9IGUubG9jYXRpb247XG4gICAgbGV0IHBsdWdpblRleHQgPSBlLnBsdWdpbk5hbWUgPyBgW3BsdWdpbjogJHtlLnBsdWdpbk5hbWV9XSBgIDogXCJcIjtcbiAgICByZXR1cm4gYFxuJHtmaWxlfToke2xpbmV9OiR7Y29sdW1ufTogRVJST1I6ICR7cGx1Z2luVGV4dH0ke2UudGV4dH1gO1xuICB9KS5qb2luKFwiXCIpO1xuICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IodGV4dCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIFtbXCJlcnJvcnNcIiwgZXJyb3JzXSwgW1wid2FybmluZ3NcIiwgd2FybmluZ3NdXSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwga2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiAoKSA9PiB2YWx1ZSxcbiAgICAgIHNldDogKHZhbHVlMikgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCBrZXksIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogdmFsdWUyXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VEZXRhaWxzSW5NZXNzYWdlcyhtZXNzYWdlcywgc3Rhc2gpIHtcbiAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XG4gICAgbWVzc2FnZS5kZXRhaWwgPSBzdGFzaC5sb2FkKG1lc3NhZ2UuZGV0YWlsKTtcbiAgfVxuICByZXR1cm4gbWVzc2FnZXM7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZUxvY2F0aW9uKGxvY2F0aW9uMiwgd2hlcmUsIHRlcm1pbmFsV2lkdGgpIHtcbiAgaWYgKGxvY2F0aW9uMiA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgbGV0IGtleXMgPSB7fTtcbiAgbGV0IGZpbGUgPSBnZXRGbGFnKGxvY2F0aW9uMiwga2V5cywgXCJmaWxlXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBuYW1lc3BhY2UgPSBnZXRGbGFnKGxvY2F0aW9uMiwga2V5cywgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGxpbmUgPSBnZXRGbGFnKGxvY2F0aW9uMiwga2V5cywgXCJsaW5lXCIsIG11c3RCZUludGVnZXIpO1xuICBsZXQgY29sdW1uID0gZ2V0RmxhZyhsb2NhdGlvbjIsIGtleXMsIFwiY29sdW1uXCIsIG11c3RCZUludGVnZXIpO1xuICBsZXQgbGVuZ3RoID0gZ2V0RmxhZyhsb2NhdGlvbjIsIGtleXMsIFwibGVuZ3RoXCIsIG11c3RCZUludGVnZXIpO1xuICBsZXQgbGluZVRleHQgPSBnZXRGbGFnKGxvY2F0aW9uMiwga2V5cywgXCJsaW5lVGV4dFwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgc3VnZ2VzdGlvbiA9IGdldEZsYWcobG9jYXRpb24yLCBrZXlzLCBcInN1Z2dlc3Rpb25cIiwgbXVzdEJlU3RyaW5nKTtcbiAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MobG9jYXRpb24yLCBrZXlzLCB3aGVyZSk7XG4gIGlmIChsaW5lVGV4dCkge1xuICAgIGNvbnN0IHJlbGV2YW50QVNDSUkgPSBsaW5lVGV4dC5zbGljZShcbiAgICAgIDAsXG4gICAgICAoY29sdW1uICYmIGNvbHVtbiA+IDAgPyBjb2x1bW4gOiAwKSArIChsZW5ndGggJiYgbGVuZ3RoID4gMCA/IGxlbmd0aCA6IDApICsgKHRlcm1pbmFsV2lkdGggJiYgdGVybWluYWxXaWR0aCA+IDAgPyB0ZXJtaW5hbFdpZHRoIDogODApXG4gICAgKTtcbiAgICBpZiAoIS9bXFx4N0YtXFx1RkZGRl0vLnRlc3QocmVsZXZhbnRBU0NJSSkgJiYgIS9cXG4vLnRlc3QobGluZVRleHQpKSB7XG4gICAgICBsaW5lVGV4dCA9IHJlbGV2YW50QVNDSUk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZmlsZTogZmlsZSB8fCBcIlwiLFxuICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlIHx8IFwiXCIsXG4gICAgbGluZTogbGluZSB8fCAwLFxuICAgIGNvbHVtbjogY29sdW1uIHx8IDAsXG4gICAgbGVuZ3RoOiBsZW5ndGggfHwgMCxcbiAgICBsaW5lVGV4dDogbGluZVRleHQgfHwgXCJcIixcbiAgICBzdWdnZXN0aW9uOiBzdWdnZXN0aW9uIHx8IFwiXCJcbiAgfTtcbn1cbmZ1bmN0aW9uIHNhbml0aXplTWVzc2FnZXMobWVzc2FnZXMsIHByb3BlcnR5LCBzdGFzaCwgZmFsbGJhY2tQbHVnaW5OYW1lLCB0ZXJtaW5hbFdpZHRoKSB7XG4gIGxldCBtZXNzYWdlc0Nsb25lID0gW107XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgIGxldCBrZXlzID0ge307XG4gICAgbGV0IGlkID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcImlkXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IHBsdWdpbk5hbWUgPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGxldCB0ZXh0ID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcInRleHRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICBsZXQgbG9jYXRpb24yID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcImxvY2F0aW9uXCIsIG11c3RCZU9iamVjdE9yTnVsbCk7XG4gICAgbGV0IG5vdGVzID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcIm5vdGVzXCIsIG11c3RCZUFycmF5KTtcbiAgICBsZXQgZGV0YWlsID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcImRldGFpbFwiLCBjYW5CZUFueXRoaW5nKTtcbiAgICBsZXQgd2hlcmUgPSBgaW4gZWxlbWVudCAke2luZGV4fSBvZiBcIiR7cHJvcGVydHl9XCJgO1xuICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG1lc3NhZ2UsIGtleXMsIHdoZXJlKTtcbiAgICBsZXQgbm90ZXNDbG9uZSA9IFtdO1xuICAgIGlmIChub3Rlcykge1xuICAgICAgZm9yIChjb25zdCBub3RlIG9mIG5vdGVzKSB7XG4gICAgICAgIGxldCBub3RlS2V5cyA9IHt9O1xuICAgICAgICBsZXQgbm90ZVRleHQgPSBnZXRGbGFnKG5vdGUsIG5vdGVLZXlzLCBcInRleHRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IG5vdGVMb2NhdGlvbiA9IGdldEZsYWcobm90ZSwgbm90ZUtleXMsIFwibG9jYXRpb25cIiwgbXVzdEJlT2JqZWN0T3JOdWxsKTtcbiAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mobm90ZSwgbm90ZUtleXMsIHdoZXJlKTtcbiAgICAgICAgbm90ZXNDbG9uZS5wdXNoKHtcbiAgICAgICAgICB0ZXh0OiBub3RlVGV4dCB8fCBcIlwiLFxuICAgICAgICAgIGxvY2F0aW9uOiBzYW5pdGl6ZUxvY2F0aW9uKG5vdGVMb2NhdGlvbiwgd2hlcmUsIHRlcm1pbmFsV2lkdGgpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBtZXNzYWdlc0Nsb25lLnB1c2goe1xuICAgICAgaWQ6IGlkIHx8IFwiXCIsXG4gICAgICBwbHVnaW5OYW1lOiBwbHVnaW5OYW1lIHx8IGZhbGxiYWNrUGx1Z2luTmFtZSxcbiAgICAgIHRleHQ6IHRleHQgfHwgXCJcIixcbiAgICAgIGxvY2F0aW9uOiBzYW5pdGl6ZUxvY2F0aW9uKGxvY2F0aW9uMiwgd2hlcmUsIHRlcm1pbmFsV2lkdGgpLFxuICAgICAgbm90ZXM6IG5vdGVzQ2xvbmUsXG4gICAgICBkZXRhaWw6IHN0YXNoID8gc3Rhc2guc3RvcmUoZGV0YWlsKSA6IC0xXG4gICAgfSk7XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gbWVzc2FnZXNDbG9uZTtcbn1cbmZ1bmN0aW9uIHNhbml0aXplU3RyaW5nQXJyYXkodmFsdWVzLCBwcm9wZXJ0eSkge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoYCR7cXVvdGUocHJvcGVydHkpfSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3NgKTtcbiAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNhbml0aXplU3RyaW5nTWFwKG1hcCwgcHJvcGVydHkpIHtcbiAgY29uc3QgcmVzdWx0ID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgIGNvbnN0IHZhbHVlID0gbWFwW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKGBrZXkgJHtxdW90ZShrZXkpfSBpbiBvYmplY3QgJHtxdW90ZShwcm9wZXJ0eSl9IG11c3QgYmUgYSBzdHJpbmdgKTtcbiAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjb252ZXJ0T3V0cHV0RmlsZXMoeyBwYXRoLCBjb250ZW50cywgaGFzaCB9KSB7XG4gIGxldCB0ZXh0ID0gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBwYXRoLFxuICAgIGNvbnRlbnRzLFxuICAgIGhhc2gsXG4gICAgZ2V0IHRleHQoKSB7XG4gICAgICBjb25zdCBiaW5hcnkgPSB0aGlzLmNvbnRlbnRzO1xuICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgYmluYXJ5ICE9PSBjb250ZW50cykge1xuICAgICAgICBjb250ZW50cyA9IGJpbmFyeTtcbiAgICAgICAgdGV4dCA9IGRlY29kZVVURjgoYmluYXJ5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGpzUmVnRXhwVG9Hb1JlZ0V4cChyZWdleHApIHtcbiAgbGV0IHJlc3VsdCA9IHJlZ2V4cC5zb3VyY2U7XG4gIGlmIChyZWdleHAuZmxhZ3MpIHJlc3VsdCA9IGAoPyR7cmVnZXhwLmZsYWdzfSkke3Jlc3VsdH1gO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBsaWIvbnBtL2Jyb3dzZXIudHNcbnZhciB2ZXJzaW9uID0gXCIwLjI3LjFcIjtcbnZhciBidWlsZCA9IChvcHRpb25zKSA9PiBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCkuYnVpbGQob3B0aW9ucyk7XG52YXIgY29udGV4dCA9IChvcHRpb25zKSA9PiBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCkuY29udGV4dChvcHRpb25zKTtcbnZhciB0cmFuc2Zvcm0gPSAoaW5wdXQsIG9wdGlvbnMpID0+IGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcoKS50cmFuc2Zvcm0oaW5wdXQsIG9wdGlvbnMpO1xudmFyIGZvcm1hdE1lc3NhZ2VzID0gKG1lc3NhZ2VzLCBvcHRpb25zKSA9PiBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCkuZm9ybWF0TWVzc2FnZXMobWVzc2FnZXMsIG9wdGlvbnMpO1xudmFyIGFuYWx5emVNZXRhZmlsZSA9IChtZXRhZmlsZSwgb3B0aW9ucykgPT4gZW5zdXJlU2VydmljZUlzUnVubmluZygpLmFuYWx5emVNZXRhZmlsZShtZXRhZmlsZSwgb3B0aW9ucyk7XG52YXIgYnVpbGRTeW5jID0gKCkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcImJ1aWxkU3luY1wiIEFQSSBvbmx5IHdvcmtzIGluIG5vZGVgKTtcbn07XG52YXIgdHJhbnNmb3JtU3luYyA9ICgpID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKGBUaGUgXCJ0cmFuc2Zvcm1TeW5jXCIgQVBJIG9ubHkgd29ya3MgaW4gbm9kZWApO1xufTtcbnZhciBmb3JtYXRNZXNzYWdlc1N5bmMgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihgVGhlIFwiZm9ybWF0TWVzc2FnZXNTeW5jXCIgQVBJIG9ubHkgd29ya3MgaW4gbm9kZWApO1xufTtcbnZhciBhbmFseXplTWV0YWZpbGVTeW5jID0gKCkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcImFuYWx5emVNZXRhZmlsZVN5bmNcIiBBUEkgb25seSB3b3JrcyBpbiBub2RlYCk7XG59O1xudmFyIHN0b3AgPSAoKSA9PiB7XG4gIGlmIChzdG9wU2VydmljZSkgc3RvcFNlcnZpY2UoKTtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcbnZhciBpbml0aWFsaXplUHJvbWlzZTtcbnZhciBzdG9wU2VydmljZTtcbnZhciBsb25nTGl2ZWRTZXJ2aWNlO1xudmFyIGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcgPSAoKSA9PiB7XG4gIGlmIChsb25nTGl2ZWRTZXJ2aWNlKSByZXR1cm4gbG9uZ0xpdmVkU2VydmljZTtcbiAgaWYgKGluaXRpYWxpemVQcm9taXNlKSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gXCJpbml0aWFsaXplXCIgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcycpO1xuICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIGNhbGwgXCJpbml0aWFsaXplXCIgYmVmb3JlIGNhbGxpbmcgdGhpcycpO1xufTtcbnZhciBpbml0aWFsaXplID0gKG9wdGlvbnMpID0+IHtcbiAgb3B0aW9ucyA9IHZhbGlkYXRlSW5pdGlhbGl6ZU9wdGlvbnMob3B0aW9ucyB8fCB7fSk7XG4gIGxldCB3YXNtVVJMID0gb3B0aW9ucy53YXNtVVJMO1xuICBsZXQgd2FzbU1vZHVsZSA9IG9wdGlvbnMud2FzbU1vZHVsZTtcbiAgbGV0IHVzZVdvcmtlciA9IG9wdGlvbnMud29ya2VyICE9PSBmYWxzZTtcbiAgaWYgKCF3YXNtVVJMICYmICF3YXNtTW9kdWxlKSB0aHJvdyBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBlaXRoZXIgdGhlIFwid2FzbVVSTFwiIG9wdGlvbiBvciB0aGUgXCJ3YXNtTW9kdWxlXCIgb3B0aW9uJyk7XG4gIGlmIChpbml0aWFsaXplUHJvbWlzZSkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBcImluaXRpYWxpemVcIiBtb3JlIHRoYW4gb25jZScpO1xuICBpbml0aWFsaXplUHJvbWlzZSA9IHN0YXJ0UnVubmluZ1NlcnZpY2Uod2FzbVVSTCB8fCBcIlwiLCB3YXNtTW9kdWxlLCB1c2VXb3JrZXIpO1xuICBpbml0aWFsaXplUHJvbWlzZS5jYXRjaCgoKSA9PiB7XG4gICAgaW5pdGlhbGl6ZVByb21pc2UgPSB2b2lkIDA7XG4gIH0pO1xuICByZXR1cm4gaW5pdGlhbGl6ZVByb21pc2U7XG59O1xudmFyIHN0YXJ0UnVubmluZ1NlcnZpY2UgPSAod2FzbVVSTCwgd2FzbU1vZHVsZSwgdXNlV29ya2VyKSA9PiBfX2FzeW5jKG51bGwsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XG4gIGxldCB3b3JrZXI7XG4gIGxldCByZWplY3RBbGxXaXRoO1xuICBjb25zdCByZWplY3RBbGxQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHJlamVjdEFsbFdpdGggPSByZXNvbHZlKTtcbiAgaWYgKHVzZVdvcmtlcikge1xuICAgIGxldCBibG9iID0gbmV3IEJsb2IoW2Bvbm1lc3NhZ2U9JHsnKChwb3N0TWVzc2FnZSkgPT4ge1xcbiAgICAgIC8vIENvcHlyaWdodCAyMDE4IFRoZSBHbyBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxcbiAgICAgIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlXFxuICAgICAgLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxcbiAgICAgIHZhciBfX2FzeW5jID0gKF9fdGhpcywgX19hcmd1bWVudHMsIGdlbmVyYXRvcikgPT4ge1xcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcXG4gICAgICAgICAgdmFyIGZ1bGZpbGxlZCA9ICh2YWx1ZSkgPT4ge1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgcmVqZWN0KGUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfTtcXG4gICAgICAgICAgdmFyIHJlamVjdGVkID0gKHZhbHVlKSA9PiB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLnRocm93KHZhbHVlKSk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgcmVqZWN0KGUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfTtcXG4gICAgICAgICAgdmFyIHN0ZXAgPSAoeCkgPT4geC5kb25lID8gcmVzb2x2ZSh4LnZhbHVlKSA6IFByb21pc2UucmVzb2x2ZSh4LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xcbiAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkoX190aGlzLCBfX2FyZ3VtZW50cykpLm5leHQoKSk7XFxuICAgICAgICB9KTtcXG4gICAgICB9O1xcbiAgICAgIGxldCBvbm1lc3NhZ2U7XFxuICAgICAgbGV0IGdsb2JhbFRoaXMgPSB7fTtcXG4gICAgICBmb3IgKGxldCBvID0gc2VsZjsgbzsgbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKSlcXG4gICAgICAgIGZvciAobGV0IGsgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykpXFxuICAgICAgICAgIGlmICghKGsgaW4gZ2xvYmFsVGhpcykpXFxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIGssIHsgZ2V0OiAoKSA9PiBzZWxmW2tdIH0pO1xcbiAgICAgIFwidXNlIHN0cmljdFwiO1xcbiAgICAgICgoKSA9PiB7XFxuICAgICAgICBjb25zdCBlbm9zeXMgPSAoKSA9PiB7XFxuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcXG4gICAgICAgICAgZXJyLmNvZGUgPSBcIkVOT1NZU1wiO1xcbiAgICAgICAgICByZXR1cm4gZXJyO1xcbiAgICAgICAgfTtcXG4gICAgICAgIGlmICghZ2xvYmFsVGhpcy5mcykge1xcbiAgICAgICAgICBsZXQgb3V0cHV0QnVmID0gXCJcIjtcXG4gICAgICAgICAgZ2xvYmFsVGhpcy5mcyA9IHtcXG4gICAgICAgICAgICBjb25zdGFudHM6IHsgT19XUk9OTFk6IC0xLCBPX1JEV1I6IC0xLCBPX0NSRUFUOiAtMSwgT19UUlVOQzogLTEsIE9fQVBQRU5EOiAtMSwgT19FWENMOiAtMSwgT19ESVJFQ1RPUlk6IC0xIH0sXFxuICAgICAgICAgICAgLy8gdW51c2VkXFxuICAgICAgICAgICAgd3JpdGVTeW5jKGZkLCBidWYpIHtcXG4gICAgICAgICAgICAgIG91dHB1dEJ1ZiArPSBkZWNvZGVyLmRlY29kZShidWYpO1xcbiAgICAgICAgICAgICAgY29uc3QgbmwgPSBvdXRwdXRCdWYubGFzdEluZGV4T2YoXCJcXFxcblwiKTtcXG4gICAgICAgICAgICAgIGlmIChubCAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvdXRwdXRCdWYuc3Vic3RyaW5nKDAsIG5sKSk7XFxuICAgICAgICAgICAgICAgIG91dHB1dEJ1ZiA9IG91dHB1dEJ1Zi5zdWJzdHJpbmcobmwgKyAxKTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIHJldHVybiBidWYubGVuZ3RoO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgd3JpdGUoZmQsIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPT0gMCB8fCBsZW5ndGggIT09IGJ1Zi5sZW5ndGggfHwgcG9zaXRpb24gIT09IG51bGwpIHtcXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy53cml0ZVN5bmMoZmQsIGJ1Zik7XFxuICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBuKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGNobW9kKHBhdGgsIG1vZGUsIGNhbGxiYWNrKSB7XFxuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBjaG93bihwYXRoLCB1aWQsIGdpZCwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGNsb3NlKGZkLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZmNobW9kKGZkLCBtb2RlLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZmNob3duKGZkLCB1aWQsIGdpZCwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGZzdGF0KGZkLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZnN5bmMoZmQsIGNhbGxiYWNrKSB7XFxuICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGZ0cnVuY2F0ZShmZCwgbGVuZ3RoLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgbGNob3duKHBhdGgsIHVpZCwgZ2lkLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgbGluayhwYXRoLCBsaW5rLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgbHN0YXQocGF0aCwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIG1rZGlyKHBhdGgsIHBlcm0sIGNhbGxiYWNrKSB7XFxuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBvcGVuKHBhdGgsIGZsYWdzLCBtb2RlLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XFxuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICByZWFkZGlyKHBhdGgsIGNhbGxiYWNrKSB7XFxuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICByZWFkbGluayhwYXRoLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcmVuYW1lKGZyb20sIHRvLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcm1kaXIocGF0aCwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHN0YXQocGF0aCwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHN5bWxpbmsocGF0aCwgbGluaywgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHRydW5jYXRlKHBhdGgsIGxlbmd0aCwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHVubGluayhwYXRoLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgdXRpbWVzKHBhdGgsIGF0aW1lLCBtdGltZSwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH07XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIWdsb2JhbFRoaXMucHJvY2Vzcykge1xcbiAgICAgICAgICBnbG9iYWxUaGlzLnByb2Nlc3MgPSB7XFxuICAgICAgICAgICAgZ2V0dWlkKCkge1xcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZ2V0Z2lkKCkge1xcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZ2V0ZXVpZCgpIHtcXG4gICAgICAgICAgICAgIHJldHVybiAtMTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGdldGVnaWQoKSB7XFxuICAgICAgICAgICAgICByZXR1cm4gLTE7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBnZXRncm91cHMoKSB7XFxuICAgICAgICAgICAgICB0aHJvdyBlbm9zeXMoKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpZDogLTEsXFxuICAgICAgICAgICAgcHBpZDogLTEsXFxuICAgICAgICAgICAgdW1hc2soKSB7XFxuICAgICAgICAgICAgICB0aHJvdyBlbm9zeXMoKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGN3ZCgpIHtcXG4gICAgICAgICAgICAgIHRocm93IGVub3N5cygpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgY2hkaXIoKSB7XFxuICAgICAgICAgICAgICB0aHJvdyBlbm9zeXMoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH07XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIWdsb2JhbFRoaXMucGF0aCkge1xcbiAgICAgICAgICBnbG9iYWxUaGlzLnBhdGggPSB7XFxuICAgICAgICAgICAgcmVzb2x2ZSguLi5wYXRoU2VnbWVudHMpIHtcXG4gICAgICAgICAgICAgIHJldHVybiBwYXRoU2VnbWVudHMuam9pbihcIi9cIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9O1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCFnbG9iYWxUaGlzLmNyeXB0bykge1xcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnbG9iYWxUaGlzLmNyeXB0byBpcyBub3QgYXZhaWxhYmxlLCBwb2x5ZmlsbCByZXF1aXJlZCAoY3J5cHRvLmdldFJhbmRvbVZhbHVlcyBvbmx5KVwiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZSkge1xcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnbG9iYWxUaGlzLnBlcmZvcm1hbmNlIGlzIG5vdCBhdmFpbGFibGUsIHBvbHlmaWxsIHJlcXVpcmVkIChwZXJmb3JtYW5jZS5ub3cgb25seSlcIik7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIWdsb2JhbFRoaXMuVGV4dEVuY29kZXIpIHtcXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2xvYmFsVGhpcy5UZXh0RW5jb2RlciBpcyBub3QgYXZhaWxhYmxlLCBwb2x5ZmlsbCByZXF1aXJlZFwiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghZ2xvYmFsVGhpcy5UZXh0RGVjb2Rlcikge1xcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnbG9iYWxUaGlzLlRleHREZWNvZGVyIGlzIG5vdCBhdmFpbGFibGUsIHBvbHlmaWxsIHJlcXVpcmVkXCIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcihcInV0Zi04XCIpO1xcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO1xcbiAgICAgICAgZ2xvYmFsVGhpcy5HbyA9IGNsYXNzIHtcXG4gICAgICAgICAgY29uc3RydWN0b3IoKSB7XFxuICAgICAgICAgICAgdGhpcy5hcmd2ID0gW1wianNcIl07XFxuICAgICAgICAgICAgdGhpcy5lbnYgPSB7fTtcXG4gICAgICAgICAgICB0aGlzLmV4aXQgPSAoY29kZSkgPT4ge1xcbiAgICAgICAgICAgICAgaWYgKGNvZGUgIT09IDApIHtcXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiZXhpdCBjb2RlOlwiLCBjb2RlKTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIHRoaXMuX2V4aXRQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcXG4gICAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVFeGl0UHJvbWlzZSA9IHJlc29sdmU7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0V2ZW50ID0gbnVsbDtcXG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZWRUaW1lb3V0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XFxuICAgICAgICAgICAgdGhpcy5fbmV4dENhbGxiYWNrVGltZW91dElEID0gMTtcXG4gICAgICAgICAgICBjb25zdCBzZXRJbnQ2NCA9IChhZGRyLCB2KSA9PiB7XFxuICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50MzIoYWRkciArIDAsIHYsIHRydWUpO1xcbiAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDMyKGFkZHIgKyA0LCBNYXRoLmZsb29yKHYgLyA0Mjk0OTY3Mjk2KSwgdHJ1ZSk7XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBjb25zdCBzZXRJbnQzMiA9IChhZGRyLCB2KSA9PiB7XFxuICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50MzIoYWRkciArIDAsIHYsIHRydWUpO1xcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgY29uc3QgZ2V0SW50NjQgPSAoYWRkcikgPT4ge1xcbiAgICAgICAgICAgICAgY29uc3QgbG93ID0gdGhpcy5tZW0uZ2V0VWludDMyKGFkZHIgKyAwLCB0cnVlKTtcXG4gICAgICAgICAgICAgIGNvbnN0IGhpZ2ggPSB0aGlzLm1lbS5nZXRJbnQzMihhZGRyICsgNCwgdHJ1ZSk7XFxuICAgICAgICAgICAgICByZXR1cm4gbG93ICsgaGlnaCAqIDQyOTQ5NjcyOTY7XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBjb25zdCBsb2FkVmFsdWUgPSAoYWRkcikgPT4ge1xcbiAgICAgICAgICAgICAgY29uc3QgZiA9IHRoaXMubWVtLmdldEZsb2F0NjQoYWRkciwgdHJ1ZSk7XFxuICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgaWYgKCFpc05hTihmKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZjtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5tZW0uZ2V0VWludDMyKGFkZHIsIHRydWUpO1xcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc1tpZF07XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBjb25zdCBzdG9yZVZhbHVlID0gKGFkZHIsIHYpID0+IHtcXG4gICAgICAgICAgICAgIGNvbnN0IG5hbkhlYWQgPSAyMTQ2OTU5MzYwO1xcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiICYmIHYgIT09IDApIHtcXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHYpKSB7XFxuICAgICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDMyKGFkZHIgKyA0LCBuYW5IZWFkLCB0cnVlKTtcXG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50MzIoYWRkciwgMCwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldEZsb2F0NjQoYWRkciwgdiwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIGlmICh2ID09PSB2b2lkIDApIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0RmxvYXQ2NChhZGRyLCAwLCB0cnVlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgbGV0IGlkID0gdGhpcy5faWRzLmdldCh2KTtcXG4gICAgICAgICAgICAgIGlmIChpZCA9PT0gdm9pZCAwKSB7XFxuICAgICAgICAgICAgICAgIGlkID0gdGhpcy5faWRQb29sLnBvcCgpO1xcbiAgICAgICAgICAgICAgICBpZiAoaWQgPT09IHZvaWQgMCkge1xcbiAgICAgICAgICAgICAgICAgIGlkID0gdGhpcy5fdmFsdWVzLmxlbmd0aDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaWRdID0gdjtcXG4gICAgICAgICAgICAgICAgdGhpcy5fZ29SZWZDb3VudHNbaWRdID0gMDtcXG4gICAgICAgICAgICAgICAgdGhpcy5faWRzLnNldCh2LCBpZCk7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICB0aGlzLl9nb1JlZkNvdW50c1tpZF0rKztcXG4gICAgICAgICAgICAgIGxldCB0eXBlRmxhZyA9IDA7XFxuICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2KSB7XFxuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcXG4gICAgICAgICAgICAgICAgICBpZiAodiAhPT0gbnVsbCkge1xcbiAgICAgICAgICAgICAgICAgICAgdHlwZUZsYWcgPSAxO1xcbiAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxcbiAgICAgICAgICAgICAgICAgIHR5cGVGbGFnID0gMjtcXG4gICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxcbiAgICAgICAgICAgICAgICAgIHR5cGVGbGFnID0gMztcXG4gICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XFxuICAgICAgICAgICAgICAgICAgdHlwZUZsYWcgPSA0O1xcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDMyKGFkZHIgKyA0LCBuYW5IZWFkIHwgdHlwZUZsYWcsIHRydWUpO1xcbiAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDMyKGFkZHIsIGlkLCB0cnVlKTtcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIGNvbnN0IGxvYWRTbGljZSA9IChhZGRyKSA9PiB7XFxuICAgICAgICAgICAgICBjb25zdCBhcnJheSA9IGdldEludDY0KGFkZHIgKyAwKTtcXG4gICAgICAgICAgICAgIGNvbnN0IGxlbiA9IGdldEludDY0KGFkZHIgKyA4KTtcXG4gICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLl9pbnN0LmV4cG9ydHMubWVtLmJ1ZmZlciwgYXJyYXksIGxlbik7XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBjb25zdCBsb2FkU2xpY2VPZlZhbHVlcyA9IChhZGRyKSA9PiB7XFxuICAgICAgICAgICAgICBjb25zdCBhcnJheSA9IGdldEludDY0KGFkZHIgKyAwKTtcXG4gICAgICAgICAgICAgIGNvbnN0IGxlbiA9IGdldEludDY0KGFkZHIgKyA4KTtcXG4gICAgICAgICAgICAgIGNvbnN0IGEgPSBuZXcgQXJyYXkobGVuKTtcXG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgYVtpXSA9IGxvYWRWYWx1ZShhcnJheSArIGkgKiA4KTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIHJldHVybiBhO1xcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgY29uc3QgbG9hZFN0cmluZyA9IChhZGRyKSA9PiB7XFxuICAgICAgICAgICAgICBjb25zdCBzYWRkciA9IGdldEludDY0KGFkZHIgKyAwKTtcXG4gICAgICAgICAgICAgIGNvbnN0IGxlbiA9IGdldEludDY0KGFkZHIgKyA4KTtcXG4gICAgICAgICAgICAgIHJldHVybiBkZWNvZGVyLmRlY29kZShuZXcgRGF0YVZpZXcodGhpcy5faW5zdC5leHBvcnRzLm1lbS5idWZmZXIsIHNhZGRyLCBsZW4pKTtcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIGNvbnN0IHRlc3RDYWxsRXhwb3J0ID0gKGEsIGIpID0+IHtcXG4gICAgICAgICAgICAgIHRoaXMuX2luc3QuZXhwb3J0cy50ZXN0RXhwb3J0MCgpO1xcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc3QuZXhwb3J0cy50ZXN0RXhwb3J0KGEsIGIpO1xcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgY29uc3QgdGltZU9yaWdpbiA9IERhdGUubm93KCkgLSBwZXJmb3JtYW5jZS5ub3coKTtcXG4gICAgICAgICAgICB0aGlzLmltcG9ydE9iamVjdCA9IHtcXG4gICAgICAgICAgICAgIF9nb3Rlc3Q6IHtcXG4gICAgICAgICAgICAgICAgYWRkOiAoYSwgYikgPT4gYSArIGIsXFxuICAgICAgICAgICAgICAgIGNhbGxFeHBvcnQ6IHRlc3RDYWxsRXhwb3J0XFxuICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgZ29qczoge1xcbiAgICAgICAgICAgICAgICAvLyBHb1xcJ3MgU1AgZG9lcyBub3QgY2hhbmdlIGFzIGxvbmcgYXMgbm8gR28gY29kZSBpcyBydW5uaW5nLiBTb21lIG9wZXJhdGlvbnMgKGUuZy4gY2FsbHMsIGdldHRlcnMgYW5kIHNldHRlcnMpXFxuICAgICAgICAgICAgICAgIC8vIG1heSBzeW5jaHJvbm91c2x5IHRyaWdnZXIgYSBHbyBldmVudCBoYW5kbGVyLiBUaGlzIG1ha2VzIEdvIGNvZGUgZ2V0IGV4ZWN1dGVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIGltcG9ydGVkXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uLiBBIGdvcm91dGluZSBjYW4gc3dpdGNoIHRvIGEgbmV3IHN0YWNrIGlmIHRoZSBjdXJyZW50IHN0YWNrIGlzIHRvbyBzbWFsbCAoc2VlIG1vcmVzdGFjayBmdW5jdGlvbikuXFxuICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hhbmdlcyB0aGUgU1AsIHRodXMgd2UgaGF2ZSB0byB1cGRhdGUgdGhlIFNQIHVzZWQgYnkgdGhlIGltcG9ydGVkIGZ1bmN0aW9uLlxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHdhc21FeGl0KGNvZGUgaW50MzIpXFxuICAgICAgICAgICAgICAgIFwicnVudGltZS53YXNtRXhpdFwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHRoaXMubWVtLmdldEludDMyKHNwICsgOCwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgdGhpcy5leGl0ZWQgPSB0cnVlO1xcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9pbnN0O1xcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl92YWx1ZXM7XFxuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2dvUmVmQ291bnRzO1xcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9pZHM7XFxuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2lkUG9vbDtcXG4gICAgICAgICAgICAgICAgICB0aGlzLmV4aXQoY29kZSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgd2FzbVdyaXRlKGZkIHVpbnRwdHIsIHAgdW5zYWZlLlBvaW50ZXIsIG4gaW50MzIpXFxuICAgICAgICAgICAgICAgIFwicnVudGltZS53YXNtV3JpdGVcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZkID0gZ2V0SW50NjQoc3AgKyA4KTtcXG4gICAgICAgICAgICAgICAgICBjb25zdCBwID0gZ2V0SW50NjQoc3AgKyAxNik7XFxuICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMubWVtLmdldEludDMyKHNwICsgMjQsIHRydWUpO1xcbiAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMuZnMud3JpdGVTeW5jKGZkLCBuZXcgVWludDhBcnJheSh0aGlzLl9pbnN0LmV4cG9ydHMubWVtLmJ1ZmZlciwgcCwgbikpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHJlc2V0TWVtb3J5RGF0YVZpZXcoKVxcbiAgICAgICAgICAgICAgICBcInJ1bnRpbWUucmVzZXRNZW1vcnlEYXRhVmlld1wiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgdGhpcy5tZW0gPSBuZXcgRGF0YVZpZXcodGhpcy5faW5zdC5leHBvcnRzLm1lbS5idWZmZXIpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIG5hbm90aW1lMSgpIGludDY0XFxuICAgICAgICAgICAgICAgIFwicnVudGltZS5uYW5vdGltZTFcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIHNldEludDY0KHNwICsgOCwgKHRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSkgKiAxZTYpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHdhbGx0aW1lKCkgKHNlYyBpbnQ2NCwgbnNlYyBpbnQzMilcXG4gICAgICAgICAgICAgICAgXCJydW50aW1lLndhbGx0aW1lXCI6IChzcCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcXG4gICAgICAgICAgICAgICAgICBjb25zdCBtc2VjID0gKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XFxuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyA4LCBtc2VjIC8gMWUzKTtcXG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRJbnQzMihzcCArIDE2LCBtc2VjICUgMWUzICogMWU2LCB0cnVlKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgLy8gZnVuYyBzY2hlZHVsZVRpbWVvdXRFdmVudChkZWxheSBpbnQ2NCkgaW50MzJcXG4gICAgICAgICAgICAgICAgXCJydW50aW1lLnNjaGVkdWxlVGltZW91dEV2ZW50XCI6IChzcCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcXG4gICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuX25leHRDYWxsYmFja1RpbWVvdXRJRDtcXG4gICAgICAgICAgICAgICAgICB0aGlzLl9uZXh0Q2FsbGJhY2tUaW1lb3V0SUQrKztcXG4gICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZWRUaW1lb3V0cy5zZXQoaWQsIHNldFRpbWVvdXQoXFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc3VtZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5fc2NoZWR1bGVkVGltZW91dHMuaGFzKGlkKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcInNjaGVkdWxlVGltZW91dEV2ZW50OiBtaXNzZWQgdGltZW91dCBldmVudFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXN1bWUoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIGdldEludDY0KHNwICsgOClcXG4gICAgICAgICAgICAgICAgICApKTtcXG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRJbnQzMihzcCArIDE2LCBpZCwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgY2xlYXJUaW1lb3V0RXZlbnQoaWQgaW50MzIpXFxuICAgICAgICAgICAgICAgIFwicnVudGltZS5jbGVhclRpbWVvdXRFdmVudFwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLm1lbS5nZXRJbnQzMihzcCArIDgsIHRydWUpO1xcbiAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zY2hlZHVsZWRUaW1lb3V0cy5nZXQoaWQpKTtcXG4gICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZWRUaW1lb3V0cy5kZWxldGUoaWQpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIGdldFJhbmRvbURhdGEociBbXWJ5dGUpXFxuICAgICAgICAgICAgICAgIFwicnVudGltZS5nZXRSYW5kb21EYXRhXCI6IChzcCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcXG4gICAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGxvYWRTbGljZShzcCArIDgpKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgLy8gZnVuYyBmaW5hbGl6ZVJlZih2IHJlZilcXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLmZpbmFsaXplUmVmXCI6IChzcCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcXG4gICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMubWVtLmdldFVpbnQzMihzcCArIDgsIHRydWUpO1xcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2dvUmVmQ291bnRzW2lkXS0tO1xcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9nb1JlZkNvdW50c1tpZF0gPT09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLl92YWx1ZXNbaWRdO1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2lkXSA9IG51bGw7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pZHMuZGVsZXRlKHYpO1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faWRQb29sLnB1c2goaWQpO1xcbiAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgLy8gZnVuYyBzdHJpbmdWYWwodmFsdWUgc3RyaW5nKSByZWZcXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnN0cmluZ1ZhbFwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDI0LCBsb2FkU3RyaW5nKHNwICsgOCkpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHZhbHVlR2V0KHYgcmVmLCBwIHN0cmluZykgcmVmXFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUdldFwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQobG9hZFZhbHVlKHNwICsgOCksIGxvYWRTdHJpbmcoc3AgKyAxNikpO1xcbiAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XFxuICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDMyLCByZXN1bHQpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHZhbHVlU2V0KHYgcmVmLCBwIHN0cmluZywgeCByZWYpXFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZVNldFwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgUmVmbGVjdC5zZXQobG9hZFZhbHVlKHNwICsgOCksIGxvYWRTdHJpbmcoc3AgKyAxNiksIGxvYWRWYWx1ZShzcCArIDMyKSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVEZWxldGUodiByZWYsIHAgc3RyaW5nKVxcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMudmFsdWVEZWxldGVcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkobG9hZFZhbHVlKHNwICsgOCksIGxvYWRTdHJpbmcoc3AgKyAxNikpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHZhbHVlSW5kZXgodiByZWYsIGkgaW50KSByZWZcXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlSW5kZXhcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyAyNCwgUmVmbGVjdC5nZXQobG9hZFZhbHVlKHNwICsgOCksIGdldEludDY0KHNwICsgMTYpKSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIHZhbHVlU2V0SW5kZXgodiByZWYsIGkgaW50LCB4IHJlZilcXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlU2V0SW5kZXhcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIFJlZmxlY3Quc2V0KGxvYWRWYWx1ZShzcCArIDgpLCBnZXRJbnQ2NChzcCArIDE2KSwgbG9hZFZhbHVlKHNwICsgMjQpKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB2YWx1ZUNhbGwodiByZWYsIG0gc3RyaW5nLCBhcmdzIFtdcmVmKSAocmVmLCBib29sKVxcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMudmFsdWVDYWxsXCI6IChzcCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcXG4gICAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IGxvYWRWYWx1ZShzcCArIDgpO1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IFJlZmxlY3QuZ2V0KHYsIGxvYWRTdHJpbmcoc3AgKyAxNikpO1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IGxvYWRTbGljZU9mVmFsdWVzKHNwICsgMzIpO1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5hcHBseShtLCB2LCBhcmdzKTtcXG4gICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XFxuICAgICAgICAgICAgICAgICAgICBzdG9yZVZhbHVlKHNwICsgNTYsIHJlc3VsdCk7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDY0LCAxKTtcXG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XFxuICAgICAgICAgICAgICAgICAgICBzdG9yZVZhbHVlKHNwICsgNTYsIGVycik7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDY0LCAwKTtcXG4gICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVJbnZva2UodiByZWYsIGFyZ3MgW11yZWYpIChyZWYsIGJvb2wpXFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUludm9rZVwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBsb2FkVmFsdWUoc3AgKyA4KTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBsb2FkU2xpY2VPZlZhbHVlcyhzcCArIDE2KTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkodiwgdm9pZCAwLCBhcmdzKTtcXG4gICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XFxuICAgICAgICAgICAgICAgICAgICBzdG9yZVZhbHVlKHNwICsgNDAsIHJlc3VsdCk7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAxKTtcXG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XFxuICAgICAgICAgICAgICAgICAgICBzdG9yZVZhbHVlKHNwICsgNDAsIGVycik7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAwKTtcXG4gICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVOZXcodiByZWYsIGFyZ3MgW11yZWYpIChyZWYsIGJvb2wpXFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZU5ld1wiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBsb2FkVmFsdWUoc3AgKyA4KTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBsb2FkU2xpY2VPZlZhbHVlcyhzcCArIDE2KTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KHYsIGFyZ3MpO1xcbiAgICAgICAgICAgICAgICAgICAgc3AgPSB0aGlzLl9pbnN0LmV4cG9ydHMuZ2V0c3AoKSA+Pj4gMDtcXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyA0MCwgcmVzdWx0KTtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQ4KHNwICsgNDgsIDEpO1xcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xcbiAgICAgICAgICAgICAgICAgICAgc3AgPSB0aGlzLl9pbnN0LmV4cG9ydHMuZ2V0c3AoKSA+Pj4gMDtcXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyA0MCwgZXJyKTtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQ4KHNwICsgNDgsIDApO1xcbiAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB2YWx1ZUxlbmd0aCh2IHJlZikgaW50XFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUxlbmd0aFwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyAxNiwgcGFyc2VJbnQobG9hZFZhbHVlKHNwICsgOCkubGVuZ3RoKSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIHZhbHVlUHJlcGFyZVN0cmluZyh2IHJlZikgKHJlZiwgaW50KVxcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMudmFsdWVQcmVwYXJlU3RyaW5nXCI6IChzcCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcXG4gICAgICAgICAgICAgICAgICBjb25zdCBzdHIgPSBlbmNvZGVyLmVuY29kZShTdHJpbmcobG9hZFZhbHVlKHNwICsgOCkpKTtcXG4gICAgICAgICAgICAgICAgICBzdG9yZVZhbHVlKHNwICsgMTYsIHN0cik7XFxuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyAyNCwgc3RyLmxlbmd0aCk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIHZhbHVlTG9hZFN0cmluZyh2IHJlZiwgYiBbXWJ5dGUpXFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUxvYWRTdHJpbmdcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGxvYWRWYWx1ZShzcCArIDgpO1xcbiAgICAgICAgICAgICAgICAgIGxvYWRTbGljZShzcCArIDE2KS5zZXQoc3RyKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB2YWx1ZUluc3RhbmNlT2YodiByZWYsIHQgcmVmKSBib29sXFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUluc3RhbmNlT2ZcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQ4KHNwICsgMjQsIGxvYWRWYWx1ZShzcCArIDgpIGluc3RhbmNlb2YgbG9hZFZhbHVlKHNwICsgMTYpID8gMSA6IDApO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIGNvcHlCeXRlc1RvR28oZHN0IFtdYnl0ZSwgc3JjIHJlZikgKGludCwgYm9vbClcXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLmNvcHlCeXRlc1RvR29cIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRzdCA9IGxvYWRTbGljZShzcCArIDgpO1xcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNyYyA9IGxvYWRWYWx1ZShzcCArIDMyKTtcXG4gICAgICAgICAgICAgICAgICBpZiAoIShzcmMgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IHNyYyBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDgoc3AgKyA0OCwgMCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHRvQ29weSA9IHNyYy5zdWJhcnJheSgwLCBkc3QubGVuZ3RoKTtcXG4gICAgICAgICAgICAgICAgICBkc3Quc2V0KHRvQ29weSk7XFxuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyA0MCwgdG9Db3B5Lmxlbmd0aCk7XFxuICAgICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDgoc3AgKyA0OCwgMSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgY29weUJ5dGVzVG9KUyhkc3QgcmVmLCBzcmMgW11ieXRlKSAoaW50LCBib29sKVxcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMuY29weUJ5dGVzVG9KU1wiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgY29uc3QgZHN0ID0gbG9hZFZhbHVlKHNwICsgOCk7XFxuICAgICAgICAgICAgICAgICAgY29uc3Qgc3JjID0gbG9hZFNsaWNlKHNwICsgMTYpO1xcbiAgICAgICAgICAgICAgICAgIGlmICghKGRzdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgZHN0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAwKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgY29uc3QgdG9Db3B5ID0gc3JjLnN1YmFycmF5KDAsIGRzdC5sZW5ndGgpO1xcbiAgICAgICAgICAgICAgICAgIGRzdC5zZXQodG9Db3B5KTtcXG4gICAgICAgICAgICAgICAgICBzZXRJbnQ2NChzcCArIDQwLCB0b0NvcHkubGVuZ3RoKTtcXG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAxKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgXCJkZWJ1Z1wiOiAodmFsdWUpID0+IHtcXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHJ1bihpbnN0YW5jZSkge1xcbiAgICAgICAgICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XFxuICAgICAgICAgICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lkluc3RhbmNlKSkge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHby5ydW46IFdlYkFzc2VtYmx5Lkluc3RhbmNlIGV4cGVjdGVkXCIpO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgdGhpcy5faW5zdCA9IGluc3RhbmNlO1xcbiAgICAgICAgICAgICAgdGhpcy5tZW0gPSBuZXcgRGF0YVZpZXcodGhpcy5faW5zdC5leHBvcnRzLm1lbS5idWZmZXIpO1xcbiAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW1xcbiAgICAgICAgICAgICAgICAvLyBKUyB2YWx1ZXMgdGhhdCBHbyBjdXJyZW50bHkgaGFzIHJlZmVyZW5jZXMgdG8sIGluZGV4ZWQgYnkgcmVmZXJlbmNlIGlkXFxuICAgICAgICAgICAgICAgIE5hTixcXG4gICAgICAgICAgICAgICAgMCxcXG4gICAgICAgICAgICAgICAgbnVsbCxcXG4gICAgICAgICAgICAgICAgdHJ1ZSxcXG4gICAgICAgICAgICAgICAgZmFsc2UsXFxuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXFxuICAgICAgICAgICAgICAgIHRoaXNcXG4gICAgICAgICAgICAgIF07XFxuICAgICAgICAgICAgICB0aGlzLl9nb1JlZkNvdW50cyA9IG5ldyBBcnJheSh0aGlzLl92YWx1ZXMubGVuZ3RoKS5maWxsKEluZmluaXR5KTtcXG4gICAgICAgICAgICAgIHRoaXMuX2lkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKFtcXG4gICAgICAgICAgICAgICAgLy8gbWFwcGluZyBmcm9tIEpTIHZhbHVlcyB0byByZWZlcmVuY2UgaWRzXFxuICAgICAgICAgICAgICAgIFswLCAxXSxcXG4gICAgICAgICAgICAgICAgW251bGwsIDJdLFxcbiAgICAgICAgICAgICAgICBbdHJ1ZSwgM10sXFxuICAgICAgICAgICAgICAgIFtmYWxzZSwgNF0sXFxuICAgICAgICAgICAgICAgIFtnbG9iYWxUaGlzLCA1XSxcXG4gICAgICAgICAgICAgICAgW3RoaXMsIDZdXFxuICAgICAgICAgICAgICBdKTtcXG4gICAgICAgICAgICAgIHRoaXMuX2lkUG9vbCA9IFtdO1xcbiAgICAgICAgICAgICAgdGhpcy5leGl0ZWQgPSBmYWxzZTtcXG4gICAgICAgICAgICAgIGxldCBvZmZzZXQgPSA0MDk2O1xcbiAgICAgICAgICAgICAgY29uc3Qgc3RyUHRyID0gKHN0cikgPT4ge1xcbiAgICAgICAgICAgICAgICBjb25zdCBwdHIgPSBvZmZzZXQ7XFxuICAgICAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoc3RyICsgXCJcXFxcMFwiKTtcXG4gICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5tZW0uYnVmZmVyLCBvZmZzZXQsIGJ5dGVzLmxlbmd0aCkuc2V0KGJ5dGVzKTtcXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzLmxlbmd0aDtcXG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCAlIDggIT09IDApIHtcXG4gICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gOCAtIG9mZnNldCAlIDg7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHB0cjtcXG4gICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICBjb25zdCBhcmdjID0gdGhpcy5hcmd2Lmxlbmd0aDtcXG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3ZQdHJzID0gW107XFxuICAgICAgICAgICAgICB0aGlzLmFyZ3YuZm9yRWFjaCgoYXJnKSA9PiB7XFxuICAgICAgICAgICAgICAgIGFyZ3ZQdHJzLnB1c2goc3RyUHRyKGFyZykpO1xcbiAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICBhcmd2UHRycy5wdXNoKDApO1xcbiAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZW52KS5zb3J0KCk7XFxuICAgICAgICAgICAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICBhcmd2UHRycy5wdXNoKHN0clB0cihgJHtrZXl9PSR7dGhpcy5lbnZba2V5XX1gKSk7XFxuICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgIGFyZ3ZQdHJzLnB1c2goMCk7XFxuICAgICAgICAgICAgICBjb25zdCBhcmd2ID0gb2Zmc2V0O1xcbiAgICAgICAgICAgICAgYXJndlB0cnMuZm9yRWFjaCgocHRyKSA9PiB7XFxuICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQzMihvZmZzZXQsIHB0ciwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQzMihvZmZzZXQgKyA0LCAwLCB0cnVlKTtcXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDg7XFxuICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgIGNvbnN0IHdhc21NaW5EYXRhQWRkciA9IDQwOTYgKyA4MTkyO1xcbiAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSB3YXNtTWluRGF0YUFkZHIpIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidG90YWwgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGV4Y2VlZHMgbGltaXRcIik7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICB0aGlzLl9pbnN0LmV4cG9ydHMucnVuKGFyZ2MsIGFyZ3YpO1xcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZXhpdGVkKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVFeGl0UHJvbWlzZSgpO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgeWllbGQgdGhpcy5fZXhpdFByb21pc2U7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgX3Jlc3VtZSgpIHtcXG4gICAgICAgICAgICBpZiAodGhpcy5leGl0ZWQpIHtcXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdvIHByb2dyYW0gaGFzIGFscmVhZHkgZXhpdGVkXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLl9pbnN0LmV4cG9ydHMucmVzdW1lKCk7XFxuICAgICAgICAgICAgaWYgKHRoaXMuZXhpdGVkKSB7XFxuICAgICAgICAgICAgICB0aGlzLl9yZXNvbHZlRXhpdFByb21pc2UoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgX21ha2VGdW5jV3JhcHBlcihpZCkge1xcbiAgICAgICAgICAgIGNvbnN0IGdvID0gdGhpcztcXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IHsgaWQsIHRoaXM6IHRoaXMsIGFyZ3M6IGFyZ3VtZW50cyB9O1xcbiAgICAgICAgICAgICAgZ28uX3BlbmRpbmdFdmVudCA9IGV2ZW50O1xcbiAgICAgICAgICAgICAgZ28uX3Jlc3VtZSgpO1xcbiAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LnJlc3VsdDtcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICB9XFxuICAgICAgICB9O1xcbiAgICAgIH0pKCk7XFxuICAgICAgb25tZXNzYWdlID0gKHsgZGF0YTogd2FzbSB9KSA9PiB7XFxuICAgICAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xcbiAgICAgICAgbGV0IGZzID0gZ2xvYmFsVGhpcy5mcztcXG4gICAgICAgIGxldCBzdGRlcnIgPSBcIlwiO1xcbiAgICAgICAgZnMud3JpdGVTeW5jID0gKGZkLCBidWZmZXIpID0+IHtcXG4gICAgICAgICAgaWYgKGZkID09PSAxKSB7XFxuICAgICAgICAgICAgcG9zdE1lc3NhZ2UoYnVmZmVyKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChmZCA9PT0gMikge1xcbiAgICAgICAgICAgIHN0ZGVyciArPSBkZWNvZGVyLmRlY29kZShidWZmZXIpO1xcbiAgICAgICAgICAgIGxldCBwYXJ0cyA9IHN0ZGVyci5zcGxpdChcIlxcXFxuXCIpO1xcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSBjb25zb2xlLmxvZyhwYXJ0cy5zbGljZSgwLCAtMSkuam9pbihcIlxcXFxuXCIpKTtcXG4gICAgICAgICAgICBzdGRlcnIgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgd3JpdGVcIik7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcmV0dXJuIGJ1ZmZlci5sZW5ndGg7XFxuICAgICAgICB9O1xcbiAgICAgICAgbGV0IHN0ZGluID0gW107XFxuICAgICAgICBsZXQgcmVzdW1lU3RkaW47XFxuICAgICAgICBsZXQgc3RkaW5Qb3MgPSAwO1xcbiAgICAgICAgb25tZXNzYWdlID0gKHsgZGF0YSB9KSA9PiB7XFxuICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICBzdGRpbi5wdXNoKGRhdGEpO1xcbiAgICAgICAgICAgIGlmIChyZXN1bWVTdGRpbikgcmVzdW1lU3RkaW4oKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICByZXR1cm4gZ287XFxuICAgICAgICB9O1xcbiAgICAgICAgZnMucmVhZCA9IChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSA9PiB7XFxuICAgICAgICAgIGlmIChmZCAhPT0gMCB8fCBvZmZzZXQgIT09IDAgfHwgbGVuZ3RoICE9PSBidWZmZXIubGVuZ3RoIHx8IHBvc2l0aW9uICE9PSBudWxsKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHJlYWRcIik7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKHN0ZGluLmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgICAgIHJlc3VtZVN0ZGluID0gKCkgPT4gZnMucmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKTtcXG4gICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgbGV0IGZpcnN0ID0gc3RkaW5bMF07XFxuICAgICAgICAgIGxldCBjb3VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxlbmd0aCwgZmlyc3QubGVuZ3RoIC0gc3RkaW5Qb3MpKTtcXG4gICAgICAgICAgYnVmZmVyLnNldChmaXJzdC5zdWJhcnJheShzdGRpblBvcywgc3RkaW5Qb3MgKyBjb3VudCksIG9mZnNldCk7XFxuICAgICAgICAgIHN0ZGluUG9zICs9IGNvdW50O1xcbiAgICAgICAgICBpZiAoc3RkaW5Qb3MgPT09IGZpcnN0Lmxlbmd0aCkge1xcbiAgICAgICAgICAgIHN0ZGluLnNoaWZ0KCk7XFxuICAgICAgICAgICAgc3RkaW5Qb3MgPSAwO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGNvdW50KTtcXG4gICAgICAgIH07XFxuICAgICAgICBsZXQgZ28gPSBuZXcgZ2xvYmFsVGhpcy5HbygpO1xcbiAgICAgICAgZ28uYXJndiA9IFtcIlwiLCBgLS1zZXJ2aWNlPSR7XCIwLjI3LjFcIn1gXTtcXG4gICAgICAgIHRyeVRvSW5zdGFudGlhdGVNb2R1bGUod2FzbSwgZ28pLnRoZW4oXFxuICAgICAgICAgIChpbnN0YW5jZSkgPT4ge1xcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKG51bGwpO1xcbiAgICAgICAgICAgIGdvLnJ1bihpbnN0YW5jZSk7XFxuICAgICAgICAgIH0sXFxuICAgICAgICAgIChlcnJvcikgPT4ge1xcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKGVycm9yKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgKTtcXG4gICAgICAgIHJldHVybiBnbztcXG4gICAgICB9O1xcbiAgICAgIGZ1bmN0aW9uIHRyeVRvSW5zdGFudGlhdGVNb2R1bGUod2FzbSwgZ28pIHtcXG4gICAgICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XFxuICAgICAgICAgIGlmICh3YXNtIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc20sIGdvLmltcG9ydE9iamVjdCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgY29uc3QgcmVzID0geWllbGQgZmV0Y2god2FzbSk7XFxuICAgICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkb3dubG9hZCAke0pTT04uc3RyaW5naWZ5KHdhc20pfWApO1xcbiAgICAgICAgICBpZiAoXCJpbnN0YW50aWF0ZVN0cmVhbWluZ1wiIGluIFdlYkFzc2VtYmx5ICYmIC9eYXBwbGljYXRpb25cXFxcL3dhc20oJHw7KS9pLnRlc3QocmVzLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpIHx8IFwiXCIpKSB7XFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0MiA9IHlpZWxkIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlcywgZ28uaW1wb3J0T2JqZWN0KTtcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Mi5pbnN0YW5jZTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBjb25zdCBieXRlcyA9IHlpZWxkIHJlcy5hcnJheUJ1ZmZlcigpO1xcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShieXRlcywgZ28uaW1wb3J0T2JqZWN0KTtcXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnN0YW5jZTtcXG4gICAgICAgIH0pO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gKG0pID0+IG9ubWVzc2FnZShtKTtcXG4gICAgfSknfShwb3N0TWVzc2FnZSlgXSwgeyB0eXBlOiBcInRleHQvamF2YXNjcmlwdFwiIH0pO1xuICAgIHdvcmtlciA9IG5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IG9ubWVzc2FnZSA9ICgocG9zdE1lc3NhZ2UpID0+IHtcbiAgICAgIC8vIENvcHlyaWdodCAyMDE4IFRoZSBHbyBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICAgICAgLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGVcbiAgICAgIC8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAgICAgIHZhciBfX2FzeW5jID0gKF9fdGhpcywgX19hcmd1bWVudHMsIGdlbmVyYXRvcikgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHZhciBmdWxmaWxsZWQgPSAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgdmFyIHJlamVjdGVkID0gKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdGVwKGdlbmVyYXRvci50aHJvdyh2YWx1ZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgc3RlcCA9ICh4KSA9PiB4LmRvbmUgPyByZXNvbHZlKHgudmFsdWUpIDogUHJvbWlzZS5yZXNvbHZlKHgudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KF9fdGhpcywgX19hcmd1bWVudHMpKS5uZXh0KCkpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBsZXQgb25tZXNzYWdlO1xuICAgICAgbGV0IGdsb2JhbFRoaXMgPSB7fTtcbiAgICAgIGZvciAobGV0IG8gPSBzZWxmOyBvOyBvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pKVxuICAgICAgICBmb3IgKGxldCBrIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pKVxuICAgICAgICAgIGlmICghKGsgaW4gZ2xvYmFsVGhpcykpXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywgaywgeyBnZXQ6ICgpID0+IHNlbGZba10gfSk7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcbiAgICAgICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVub3N5cyA9ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgICAgZXJyLmNvZGUgPSBcIkVOT1NZU1wiO1xuICAgICAgICAgIHJldHVybiBlcnI7XG4gICAgICAgIH07XG4gICAgICAgIGlmICghZ2xvYmFsVGhpcy5mcykge1xuICAgICAgICAgIGxldCBvdXRwdXRCdWYgPSBcIlwiO1xuICAgICAgICAgIGdsb2JhbFRoaXMuZnMgPSB7XG4gICAgICAgICAgICBjb25zdGFudHM6IHsgT19XUk9OTFk6IC0xLCBPX1JEV1I6IC0xLCBPX0NSRUFUOiAtMSwgT19UUlVOQzogLTEsIE9fQVBQRU5EOiAtMSwgT19FWENMOiAtMSwgT19ESVJFQ1RPUlk6IC0xIH0sXG4gICAgICAgICAgICAvLyB1bnVzZWRcbiAgICAgICAgICAgIHdyaXRlU3luYyhmZCwgYnVmKSB7XG4gICAgICAgICAgICAgIG91dHB1dEJ1ZiArPSBkZWNvZGVyLmRlY29kZShidWYpO1xuICAgICAgICAgICAgICBjb25zdCBubCA9IG91dHB1dEJ1Zi5sYXN0SW5kZXhPZihcIlxcblwiKTtcbiAgICAgICAgICAgICAgaWYgKG5sICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cob3V0cHV0QnVmLnN1YnN0cmluZygwLCBubCkpO1xuICAgICAgICAgICAgICAgIG91dHB1dEJ1ZiA9IG91dHB1dEJ1Zi5zdWJzdHJpbmcobmwgKyAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYnVmLmxlbmd0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3cml0ZShmZCwgYnVmLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGlmIChvZmZzZXQgIT09IDAgfHwgbGVuZ3RoICE9PSBidWYubGVuZ3RoIHx8IHBvc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy53cml0ZVN5bmMoZmQsIGJ1Zik7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIG4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNobW9kKHBhdGgsIG1vZGUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaG93bihwYXRoLCB1aWQsIGdpZCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsb3NlKGZkLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmNobW9kKGZkLCBtb2RlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmNob3duKGZkLCB1aWQsIGdpZCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZzdGF0KGZkLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnN5bmMoZmQsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ0cnVuY2F0ZShmZCwgbGVuZ3RoLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGNob3duKHBhdGgsIHVpZCwgZ2lkLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGluayhwYXRoLCBsaW5rLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbHN0YXQocGF0aCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1rZGlyKHBhdGgsIHBlcm0sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcGVuKHBhdGgsIGZsYWdzLCBtb2RlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkZGlyKHBhdGgsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkbGluayhwYXRoLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVuYW1lKGZyb20sIHRvLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm1kaXIocGF0aCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXQocGF0aCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN5bWxpbmsocGF0aCwgbGluaywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydW5jYXRlKHBhdGgsIGxlbmd0aCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVubGluayhwYXRoLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXRpbWVzKHBhdGgsIGF0aW1lLCBtdGltZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFnbG9iYWxUaGlzLnByb2Nlc3MpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLnByb2Nlc3MgPSB7XG4gICAgICAgICAgICBnZXR1aWQoKSB7XG4gICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRnaWQoKSB7XG4gICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRldWlkKCkge1xuICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0ZWdpZCgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldGdyb3VwcygpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZW5vc3lzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGlkOiAtMSxcbiAgICAgICAgICAgIHBwaWQ6IC0xLFxuICAgICAgICAgICAgdW1hc2soKSB7XG4gICAgICAgICAgICAgIHRocm93IGVub3N5cygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN3ZCgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZW5vc3lzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hkaXIoKSB7XG4gICAgICAgICAgICAgIHRocm93IGVub3N5cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFnbG9iYWxUaGlzLnBhdGgpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLnBhdGggPSB7XG4gICAgICAgICAgICByZXNvbHZlKC4uLnBhdGhTZWdtZW50cykge1xuICAgICAgICAgICAgICByZXR1cm4gcGF0aFNlZ21lbnRzLmpvaW4oXCIvXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFnbG9iYWxUaGlzLmNyeXB0bykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdsb2JhbFRoaXMuY3J5cHRvIGlzIG5vdCBhdmFpbGFibGUsIHBvbHlmaWxsIHJlcXVpcmVkIChjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzIG9ubHkpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdsb2JhbFRoaXMucGVyZm9ybWFuY2UgaXMgbm90IGF2YWlsYWJsZSwgcG9seWZpbGwgcmVxdWlyZWQgKHBlcmZvcm1hbmNlLm5vdyBvbmx5KVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWdsb2JhbFRoaXMuVGV4dEVuY29kZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnbG9iYWxUaGlzLlRleHRFbmNvZGVyIGlzIG5vdCBhdmFpbGFibGUsIHBvbHlmaWxsIHJlcXVpcmVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZ2xvYmFsVGhpcy5UZXh0RGVjb2Rlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdsb2JhbFRoaXMuVGV4dERlY29kZXIgaXMgbm90IGF2YWlsYWJsZSwgcG9seWZpbGwgcmVxdWlyZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcihcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7XG4gICAgICAgIGdsb2JhbFRoaXMuR28gPSBjbGFzcyB7XG4gICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICB0aGlzLmFyZ3YgPSBbXCJqc1wiXTtcbiAgICAgICAgICAgIHRoaXMuZW52ID0ge307XG4gICAgICAgICAgICB0aGlzLmV4aXQgPSAoY29kZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcImV4aXQgY29kZTpcIiwgY29kZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9leGl0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVFeGl0UHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZWRUaW1lb3V0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICAgICAgICB0aGlzLl9uZXh0Q2FsbGJhY2tUaW1lb3V0SUQgPSAxO1xuICAgICAgICAgICAgY29uc3Qgc2V0SW50NjQgPSAoYWRkciwgdikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50MzIoYWRkciArIDAsIHYsIHRydWUpO1xuICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50MzIoYWRkciArIDQsIE1hdGguZmxvb3IodiAvIDQyOTQ5NjcyOTYpLCB0cnVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzZXRJbnQzMiA9IChhZGRyLCB2KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQzMihhZGRyICsgMCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZ2V0SW50NjQgPSAoYWRkcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBsb3cgPSB0aGlzLm1lbS5nZXRVaW50MzIoYWRkciArIDAsIHRydWUpO1xuICAgICAgICAgICAgICBjb25zdCBoaWdoID0gdGhpcy5tZW0uZ2V0SW50MzIoYWRkciArIDQsIHRydWUpO1xuICAgICAgICAgICAgICByZXR1cm4gbG93ICsgaGlnaCAqIDQyOTQ5NjcyOTY7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgbG9hZFZhbHVlID0gKGFkZHIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZiA9IHRoaXMubWVtLmdldEZsb2F0NjQoYWRkciwgdHJ1ZSk7XG4gICAgICAgICAgICAgIGlmIChmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWlzTmFOKGYpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLm1lbS5nZXRVaW50MzIoYWRkciwgdHJ1ZSk7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNbaWRdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlVmFsdWUgPSAoYWRkciwgdikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBuYW5IZWFkID0gMjE0Njk1OTM2MDtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiICYmIHYgIT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4odikpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQzMihhZGRyICsgNCwgbmFuSGVhZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50MzIoYWRkciwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldEZsb2F0NjQoYWRkciwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh2ID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRGbG9hdDY0KGFkZHIsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsZXQgaWQgPSB0aGlzLl9pZHMuZ2V0KHYpO1xuICAgICAgICAgICAgICBpZiAoaWQgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIGlkID0gdGhpcy5faWRQb29sLnBvcCgpO1xuICAgICAgICAgICAgICAgIGlmIChpZCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgICBpZCA9IHRoaXMuX3ZhbHVlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpZF0gPSB2O1xuICAgICAgICAgICAgICAgIHRoaXMuX2dvUmVmQ291bnRzW2lkXSA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5faWRzLnNldCh2LCBpZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fZ29SZWZDb3VudHNbaWRdKys7XG4gICAgICAgICAgICAgIGxldCB0eXBlRmxhZyA9IDA7XG4gICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHYpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICAgICAgICBpZiAodiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlRmxhZyA9IDE7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICB0eXBlRmxhZyA9IDI7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgICAgICAgICB0eXBlRmxhZyA9IDM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgIHR5cGVGbGFnID0gNDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQzMihhZGRyICsgNCwgbmFuSGVhZCB8IHR5cGVGbGFnLCB0cnVlKTtcbiAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDMyKGFkZHIsIGlkLCB0cnVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBsb2FkU2xpY2UgPSAoYWRkcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBhcnJheSA9IGdldEludDY0KGFkZHIgKyAwKTtcbiAgICAgICAgICAgICAgY29uc3QgbGVuID0gZ2V0SW50NjQoYWRkciArIDgpO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5faW5zdC5leHBvcnRzLm1lbS5idWZmZXIsIGFycmF5LCBsZW4pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRTbGljZU9mVmFsdWVzID0gKGFkZHIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgYXJyYXkgPSBnZXRJbnQ2NChhZGRyICsgMCk7XG4gICAgICAgICAgICAgIGNvbnN0IGxlbiA9IGdldEludDY0KGFkZHIgKyA4KTtcbiAgICAgICAgICAgICAgY29uc3QgYSA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGxvYWRWYWx1ZShhcnJheSArIGkgKiA4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBsb2FkU3RyaW5nID0gKGFkZHIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc2FkZHIgPSBnZXRJbnQ2NChhZGRyICsgMCk7XG4gICAgICAgICAgICAgIGNvbnN0IGxlbiA9IGdldEludDY0KGFkZHIgKyA4KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZXIuZGVjb2RlKG5ldyBEYXRhVmlldyh0aGlzLl9pbnN0LmV4cG9ydHMubWVtLmJ1ZmZlciwgc2FkZHIsIGxlbikpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RDYWxsRXhwb3J0ID0gKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5faW5zdC5leHBvcnRzLnRlc3RFeHBvcnQwKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnN0LmV4cG9ydHMudGVzdEV4cG9ydChhLCBiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB0aW1lT3JpZ2luID0gRGF0ZS5ub3coKSAtIHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgdGhpcy5pbXBvcnRPYmplY3QgPSB7XG4gICAgICAgICAgICAgIF9nb3Rlc3Q6IHtcbiAgICAgICAgICAgICAgICBhZGQ6IChhLCBiKSA9PiBhICsgYixcbiAgICAgICAgICAgICAgICBjYWxsRXhwb3J0OiB0ZXN0Q2FsbEV4cG9ydFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBnb2pzOiB7XG4gICAgICAgICAgICAgICAgLy8gR28ncyBTUCBkb2VzIG5vdCBjaGFuZ2UgYXMgbG9uZyBhcyBubyBHbyBjb2RlIGlzIHJ1bm5pbmcuIFNvbWUgb3BlcmF0aW9ucyAoZS5nLiBjYWxscywgZ2V0dGVycyBhbmQgc2V0dGVycylcbiAgICAgICAgICAgICAgICAvLyBtYXkgc3luY2hyb25vdXNseSB0cmlnZ2VyIGEgR28gZXZlbnQgaGFuZGxlci4gVGhpcyBtYWtlcyBHbyBjb2RlIGdldCBleGVjdXRlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBpbXBvcnRlZFxuICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uLiBBIGdvcm91dGluZSBjYW4gc3dpdGNoIHRvIGEgbmV3IHN0YWNrIGlmIHRoZSBjdXJyZW50IHN0YWNrIGlzIHRvbyBzbWFsbCAoc2VlIG1vcmVzdGFjayBmdW5jdGlvbikuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBjaGFuZ2VzIHRoZSBTUCwgdGh1cyB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgU1AgdXNlZCBieSB0aGUgaW1wb3J0ZWQgZnVuY3Rpb24uXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB3YXNtRXhpdChjb2RlIGludDMyKVxuICAgICAgICAgICAgICAgIFwicnVudGltZS53YXNtRXhpdFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLm1lbS5nZXRJbnQzMihzcCArIDgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5leGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2luc3Q7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2dvUmVmQ291bnRzO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2lkcztcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9pZFBvb2w7XG4gICAgICAgICAgICAgICAgICB0aGlzLmV4aXQoY29kZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHdhc21Xcml0ZShmZCB1aW50cHRyLCBwIHVuc2FmZS5Qb2ludGVyLCBuIGludDMyKVxuICAgICAgICAgICAgICAgIFwicnVudGltZS53YXNtV3JpdGVcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmZCA9IGdldEludDY0KHNwICsgOCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwID0gZ2V0SW50NjQoc3AgKyAxNik7XG4gICAgICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy5tZW0uZ2V0SW50MzIoc3AgKyAyNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLmZzLndyaXRlU3luYyhmZCwgbmV3IFVpbnQ4QXJyYXkodGhpcy5faW5zdC5leHBvcnRzLm1lbS5idWZmZXIsIHAsIG4pKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgcmVzZXRNZW1vcnlEYXRhVmlldygpXG4gICAgICAgICAgICAgICAgXCJydW50aW1lLnJlc2V0TWVtb3J5RGF0YVZpZXdcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbSA9IG5ldyBEYXRhVmlldyh0aGlzLl9pbnN0LmV4cG9ydHMubWVtLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIG5hbm90aW1lMSgpIGludDY0XG4gICAgICAgICAgICAgICAgXCJydW50aW1lLm5hbm90aW1lMVwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIHNldEludDY0KHNwICsgOCwgKHRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSkgKiAxZTYpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB3YWxsdGltZSgpIChzZWMgaW50NjQsIG5zZWMgaW50MzIpXG4gICAgICAgICAgICAgICAgXCJydW50aW1lLndhbGx0aW1lXCI6IChzcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbXNlYyA9ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyA4LCBtc2VjIC8gMWUzKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldEludDMyKHNwICsgMTYsIG1zZWMgJSAxZTMgKiAxZTYsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gZnVuYyBzY2hlZHVsZVRpbWVvdXRFdmVudChkZWxheSBpbnQ2NCkgaW50MzJcbiAgICAgICAgICAgICAgICBcInJ1bnRpbWUuc2NoZWR1bGVUaW1lb3V0RXZlbnRcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuX25leHRDYWxsYmFja1RpbWVvdXRJRDtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX25leHRDYWxsYmFja1RpbWVvdXRJRCsrO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVkVGltZW91dHMuc2V0KGlkLCBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX3NjaGVkdWxlZFRpbWVvdXRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcInNjaGVkdWxlVGltZW91dEV2ZW50OiBtaXNzZWQgdGltZW91dCBldmVudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0SW50NjQoc3AgKyA4KVxuICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRJbnQzMihzcCArIDE2LCBpZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIGNsZWFyVGltZW91dEV2ZW50KGlkIGludDMyKVxuICAgICAgICAgICAgICAgIFwicnVudGltZS5jbGVhclRpbWVvdXRFdmVudFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5tZW0uZ2V0SW50MzIoc3AgKyA4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zY2hlZHVsZWRUaW1lb3V0cy5nZXQoaWQpKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlZFRpbWVvdXRzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIGdldFJhbmRvbURhdGEociBbXWJ5dGUpXG4gICAgICAgICAgICAgICAgXCJydW50aW1lLmdldFJhbmRvbURhdGFcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGxvYWRTbGljZShzcCArIDgpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgZmluYWxpemVSZWYodiByZWYpXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLmZpbmFsaXplUmVmXCI6IChzcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLm1lbS5nZXRVaW50MzIoc3AgKyA4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2dvUmVmQ291bnRzW2lkXS0tO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2dvUmVmQ291bnRzW2lkXSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy5fdmFsdWVzW2lkXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2lkXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lkcy5kZWxldGUodik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lkUG9vbC5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgc3RyaW5nVmFsKHZhbHVlIHN0cmluZykgcmVmXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnN0cmluZ1ZhbFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyAyNCwgbG9hZFN0cmluZyhzcCArIDgpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVHZXQodiByZWYsIHAgc3RyaW5nKSByZWZcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMudmFsdWVHZXRcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldChsb2FkVmFsdWUoc3AgKyA4KSwgbG9hZFN0cmluZyhzcCArIDE2KSk7XG4gICAgICAgICAgICAgICAgICBzcCA9IHRoaXMuX2luc3QuZXhwb3J0cy5nZXRzcCgpID4+PiAwO1xuICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDMyLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB2YWx1ZVNldCh2IHJlZiwgcCBzdHJpbmcsIHggcmVmKVxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZVNldFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIFJlZmxlY3Quc2V0KGxvYWRWYWx1ZShzcCArIDgpLCBsb2FkU3RyaW5nKHNwICsgMTYpLCBsb2FkVmFsdWUoc3AgKyAzMikpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB2YWx1ZURlbGV0ZSh2IHJlZiwgcCBzdHJpbmcpXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlRGVsZXRlXCI6IChzcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xuICAgICAgICAgICAgICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShsb2FkVmFsdWUoc3AgKyA4KSwgbG9hZFN0cmluZyhzcCArIDE2KSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHZhbHVlSW5kZXgodiByZWYsIGkgaW50KSByZWZcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMudmFsdWVJbmRleFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyAyNCwgUmVmbGVjdC5nZXQobG9hZFZhbHVlKHNwICsgOCksIGdldEludDY0KHNwICsgMTYpKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZVNldEluZGV4KHYgcmVmLCBpIGludCwgeCByZWYpXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlU2V0SW5kZXhcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICBSZWZsZWN0LnNldChsb2FkVmFsdWUoc3AgKyA4KSwgZ2V0SW50NjQoc3AgKyAxNiksIGxvYWRWYWx1ZShzcCArIDI0KSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHZhbHVlQ2FsbCh2IHJlZiwgbSBzdHJpbmcsIGFyZ3MgW11yZWYpIChyZWYsIGJvb2wpXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlQ2FsbFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBsb2FkVmFsdWUoc3AgKyA4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IFJlZmxlY3QuZ2V0KHYsIGxvYWRTdHJpbmcoc3AgKyAxNikpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gbG9hZFNsaWNlT2ZWYWx1ZXMoc3AgKyAzMik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkobSwgdiwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyA1NiwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDgoc3AgKyA2NCwgMSk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3AgPSB0aGlzLl9pbnN0LmV4cG9ydHMuZ2V0c3AoKSA+Pj4gMDtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDU2LCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDY0LCAwKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVJbnZva2UodiByZWYsIGFyZ3MgW11yZWYpIChyZWYsIGJvb2wpXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlSW52b2tlXCI6IChzcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IGxvYWRWYWx1ZShzcCArIDgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gbG9hZFNsaWNlT2ZWYWx1ZXMoc3AgKyAxNik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkodiwgdm9pZCAwLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgc3AgPSB0aGlzLl9pbnN0LmV4cG9ydHMuZ2V0c3AoKSA+Pj4gMDtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDQwLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAxKTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBzcCA9IHRoaXMuX2luc3QuZXhwb3J0cy5nZXRzcCgpID4+PiAwO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZVZhbHVlKHNwICsgNDAsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQ4KHNwICsgNDgsIDApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB2YWx1ZU5ldyh2IHJlZiwgYXJncyBbXXJlZikgKHJlZiwgYm9vbClcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMudmFsdWVOZXdcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gbG9hZFZhbHVlKHNwICsgOCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBsb2FkU2xpY2VPZlZhbHVlcyhzcCArIDE2KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QodiwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyA0MCwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDgoc3AgKyA0OCwgMSk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3AgPSB0aGlzLl9pbnN0LmV4cG9ydHMuZ2V0c3AoKSA+Pj4gMDtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDQwLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAwKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVMZW5ndGgodiByZWYpIGludFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUxlbmd0aFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIHNldEludDY0KHNwICsgMTYsIHBhcnNlSW50KGxvYWRWYWx1ZShzcCArIDgpLmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gdmFsdWVQcmVwYXJlU3RyaW5nKHYgcmVmKSAocmVmLCBpbnQpXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlUHJlcGFyZVN0cmluZ1wiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGVuY29kZXIuZW5jb2RlKFN0cmluZyhsb2FkVmFsdWUoc3AgKyA4KSkpO1xuICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDE2LCBzdHIpO1xuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyAyNCwgc3RyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZUxvYWRTdHJpbmcodiByZWYsIGIgW11ieXRlKVxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUxvYWRTdHJpbmdcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzdHIgPSBsb2FkVmFsdWUoc3AgKyA4KTtcbiAgICAgICAgICAgICAgICAgIGxvYWRTbGljZShzcCArIDE2KS5zZXQoc3RyKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVJbnN0YW5jZU9mKHYgcmVmLCB0IHJlZikgYm9vbFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUluc3RhbmNlT2ZcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDI0LCBsb2FkVmFsdWUoc3AgKyA4KSBpbnN0YW5jZW9mIGxvYWRWYWx1ZShzcCArIDE2KSA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgY29weUJ5dGVzVG9Hbyhkc3QgW11ieXRlLCBzcmMgcmVmKSAoaW50LCBib29sKVxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy5jb3B5Qnl0ZXNUb0dvXCI6IChzcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZHN0ID0gbG9hZFNsaWNlKHNwICsgOCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzcmMgPSBsb2FkVmFsdWUoc3AgKyAzMik7XG4gICAgICAgICAgICAgICAgICBpZiAoIShzcmMgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IHNyYyBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29uc3QgdG9Db3B5ID0gc3JjLnN1YmFycmF5KDAsIGRzdC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgZHN0LnNldCh0b0NvcHkpO1xuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyA0MCwgdG9Db3B5Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAxKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgY29weUJ5dGVzVG9KUyhkc3QgcmVmLCBzcmMgW11ieXRlKSAoaW50LCBib29sKVxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy5jb3B5Qnl0ZXNUb0pTXCI6IChzcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZHN0ID0gbG9hZFZhbHVlKHNwICsgOCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzcmMgPSBsb2FkU2xpY2Uoc3AgKyAxNik7XG4gICAgICAgICAgICAgICAgICBpZiAoIShkc3QgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IGRzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29uc3QgdG9Db3B5ID0gc3JjLnN1YmFycmF5KDAsIGRzdC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgZHN0LnNldCh0b0NvcHkpO1xuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyA0MCwgdG9Db3B5Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAxKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGVidWdcIjogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBydW4oaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuSW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR28ucnVuOiBXZWJBc3NlbWJseS5JbnN0YW5jZSBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9pbnN0ID0gaW5zdGFuY2U7XG4gICAgICAgICAgICAgIHRoaXMubWVtID0gbmV3IERhdGFWaWV3KHRoaXMuX2luc3QuZXhwb3J0cy5tZW0uYnVmZmVyKTtcbiAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW1xuICAgICAgICAgICAgICAgIC8vIEpTIHZhbHVlcyB0aGF0IEdvIGN1cnJlbnRseSBoYXMgcmVmZXJlbmNlcyB0bywgaW5kZXhlZCBieSByZWZlcmVuY2UgaWRcbiAgICAgICAgICAgICAgICBOYU4sXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICB0aGlzXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgIHRoaXMuX2dvUmVmQ291bnRzID0gbmV3IEFycmF5KHRoaXMuX3ZhbHVlcy5sZW5ndGgpLmZpbGwoSW5maW5pdHkpO1xuICAgICAgICAgICAgICB0aGlzLl9pZHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcChbXG4gICAgICAgICAgICAgICAgLy8gbWFwcGluZyBmcm9tIEpTIHZhbHVlcyB0byByZWZlcmVuY2UgaWRzXG4gICAgICAgICAgICAgICAgWzAsIDFdLFxuICAgICAgICAgICAgICAgIFtudWxsLCAyXSxcbiAgICAgICAgICAgICAgICBbdHJ1ZSwgM10sXG4gICAgICAgICAgICAgICAgW2ZhbHNlLCA0XSxcbiAgICAgICAgICAgICAgICBbZ2xvYmFsVGhpcywgNV0sXG4gICAgICAgICAgICAgICAgW3RoaXMsIDZdXG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICB0aGlzLl9pZFBvb2wgPSBbXTtcbiAgICAgICAgICAgICAgdGhpcy5leGl0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IDQwOTY7XG4gICAgICAgICAgICAgIGNvbnN0IHN0clB0ciA9IChzdHIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwdHIgPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBlbmNvZGVyLmVuY29kZShzdHIgKyBcIlxcMFwiKTtcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSh0aGlzLm1lbS5idWZmZXIsIG9mZnNldCwgYnl0ZXMubGVuZ3RoKS5zZXQoYnl0ZXMpO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBieXRlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCAlIDggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgIG9mZnNldCArPSA4IC0gb2Zmc2V0ICUgODtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHB0cjtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgY29uc3QgYXJnYyA9IHRoaXMuYXJndi5sZW5ndGg7XG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3ZQdHJzID0gW107XG4gICAgICAgICAgICAgIHRoaXMuYXJndi5mb3JFYWNoKChhcmcpID0+IHtcbiAgICAgICAgICAgICAgICBhcmd2UHRycy5wdXNoKHN0clB0cihhcmcpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGFyZ3ZQdHJzLnB1c2goMCk7XG4gICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmVudikuc29ydCgpO1xuICAgICAgICAgICAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGFyZ3ZQdHJzLnB1c2goc3RyUHRyKGAke2tleX09JHt0aGlzLmVudltrZXldfWApKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGFyZ3ZQdHJzLnB1c2goMCk7XG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3YgPSBvZmZzZXQ7XG4gICAgICAgICAgICAgIGFyZ3ZQdHJzLmZvckVhY2goKHB0cikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQzMihvZmZzZXQsIHB0ciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDMyKG9mZnNldCArIDQsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSA4O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3Qgd2FzbU1pbkRhdGFBZGRyID0gNDA5NiArIDgxOTI7XG4gICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gd2FzbU1pbkRhdGFBZGRyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidG90YWwgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGV4Y2VlZHMgbGltaXRcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5faW5zdC5leHBvcnRzLnJ1bihhcmdjLCBhcmd2KTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZXhpdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZUV4aXRQcm9taXNlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgeWllbGQgdGhpcy5fZXhpdFByb21pc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX3Jlc3VtZSgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXRlZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHbyBwcm9ncmFtIGhhcyBhbHJlYWR5IGV4aXRlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2luc3QuZXhwb3J0cy5yZXN1bWUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXRlZCkge1xuICAgICAgICAgICAgICB0aGlzLl9yZXNvbHZlRXhpdFByb21pc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgX21ha2VGdW5jV3JhcHBlcihpZCkge1xuICAgICAgICAgICAgY29uc3QgZ28gPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IHsgaWQsIHRoaXM6IHRoaXMsIGFyZ3M6IGFyZ3VtZW50cyB9O1xuICAgICAgICAgICAgICBnby5fcGVuZGluZ0V2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICAgIGdvLl9yZXN1bWUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LnJlc3VsdDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSkoKTtcbiAgICAgIG9ubWVzc2FnZSA9ICh7IGRhdGE6IHdhc20gfSkgPT4ge1xuICAgICAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICAgICAgICBsZXQgZnMgPSBnbG9iYWxUaGlzLmZzO1xuICAgICAgICBsZXQgc3RkZXJyID0gXCJcIjtcbiAgICAgICAgZnMud3JpdGVTeW5jID0gKGZkLCBidWZmZXIpID0+IHtcbiAgICAgICAgICBpZiAoZmQgPT09IDEpIHtcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKGJ1ZmZlcik7XG4gICAgICAgICAgfSBlbHNlIGlmIChmZCA9PT0gMikge1xuICAgICAgICAgICAgc3RkZXJyICs9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlcik7XG4gICAgICAgICAgICBsZXQgcGFydHMgPSBzdGRlcnIuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkgY29uc29sZS5sb2cocGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oXCJcXG5cIikpO1xuICAgICAgICAgICAgc3RkZXJyID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCB3cml0ZVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBzdGRpbiA9IFtdO1xuICAgICAgICBsZXQgcmVzdW1lU3RkaW47XG4gICAgICAgIGxldCBzdGRpblBvcyA9IDA7XG4gICAgICAgIG9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN0ZGluLnB1c2goZGF0YSk7XG4gICAgICAgICAgICBpZiAocmVzdW1lU3RkaW4pIHJlc3VtZVN0ZGluKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBnbztcbiAgICAgICAgfTtcbiAgICAgICAgZnMucmVhZCA9IChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgaWYgKGZkICE9PSAwIHx8IG9mZnNldCAhPT0gMCB8fCBsZW5ndGggIT09IGJ1ZmZlci5sZW5ndGggfHwgcG9zaXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCByZWFkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RkaW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bWVTdGRpbiA9ICgpID0+IGZzLnJlYWQoZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjayk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBmaXJzdCA9IHN0ZGluWzBdO1xuICAgICAgICAgIGxldCBjb3VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxlbmd0aCwgZmlyc3QubGVuZ3RoIC0gc3RkaW5Qb3MpKTtcbiAgICAgICAgICBidWZmZXIuc2V0KGZpcnN0LnN1YmFycmF5KHN0ZGluUG9zLCBzdGRpblBvcyArIGNvdW50KSwgb2Zmc2V0KTtcbiAgICAgICAgICBzdGRpblBvcyArPSBjb3VudDtcbiAgICAgICAgICBpZiAoc3RkaW5Qb3MgPT09IGZpcnN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgc3RkaW4uc2hpZnQoKTtcbiAgICAgICAgICAgIHN0ZGluUG9zID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgY291bnQpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgZ28gPSBuZXcgZ2xvYmFsVGhpcy5HbygpO1xuICAgICAgICBnby5hcmd2ID0gW1wiXCIsIGAtLXNlcnZpY2U9JHtcIjAuMjcuMVwifWBdO1xuICAgICAgICB0cnlUb0luc3RhbnRpYXRlTW9kdWxlKHdhc20sIGdvKS50aGVuKFxuICAgICAgICAgIChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgcG9zdE1lc3NhZ2UobnVsbCk7XG4gICAgICAgICAgICBnby5ydW4oaW5zdGFuY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBwb3N0TWVzc2FnZShlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZ287XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gdHJ5VG9JbnN0YW50aWF0ZU1vZHVsZSh3YXNtLCBnbykge1xuICAgICAgICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgIGlmICh3YXNtIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUod2FzbSwgZ28uaW1wb3J0T2JqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzID0geWllbGQgZmV0Y2god2FzbSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRvd25sb2FkICR7SlNPTi5zdHJpbmdpZnkod2FzbSl9YCk7XG4gICAgICAgICAgaWYgKFwiaW5zdGFudGlhdGVTdHJlYW1pbmdcIiBpbiBXZWJBc3NlbWJseSAmJiAvXmFwcGxpY2F0aW9uXFwvd2FzbSgkfDspL2kudGVzdChyZXMuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIikgfHwgXCJcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDIgPSB5aWVsZCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXMsIGdvLmltcG9ydE9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Mi5pbnN0YW5jZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYnl0ZXMgPSB5aWVsZCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShieXRlcywgZ28uaW1wb3J0T2JqZWN0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0Lmluc3RhbmNlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobSkgPT4gb25tZXNzYWdlKG0pO1xuICAgIH0pKChkYXRhKSA9PiB3b3JrZXIub25tZXNzYWdlKHsgZGF0YSB9KSk7XG4gICAgbGV0IGdvO1xuICAgIHdvcmtlciA9IHtcbiAgICAgIG9ubWVzc2FnZTogbnVsbCxcbiAgICAgIHBvc3RNZXNzYWdlOiAoZGF0YSkgPT4gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZ28gPSBvbm1lc3NhZ2UoeyBkYXRhIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdEFsbFdpdGgoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgaWYgKGdvKVxuICAgICAgICAgIGZvciAobGV0IHRpbWVvdXQgb2YgZ28uX3NjaGVkdWxlZFRpbWVvdXRzLnZhbHVlcygpKVxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgbGV0IGZpcnN0TWVzc2FnZVJlc29sdmU7XG4gIGxldCBmaXJzdE1lc3NhZ2VSZWplY3Q7XG4gIGNvbnN0IGZpcnN0TWVzc2FnZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZmlyc3RNZXNzYWdlUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgZmlyc3RNZXNzYWdlUmVqZWN0ID0gcmVqZWN0O1xuICB9KTtcbiAgd29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGE6IGVycm9yIH0pID0+IHtcbiAgICB3b3JrZXIub25tZXNzYWdlID0gKHsgZGF0YSB9KSA9PiByZWFkRnJvbVN0ZG91dChkYXRhKTtcbiAgICBpZiAoZXJyb3IpIGZpcnN0TWVzc2FnZVJlamVjdChlcnJvcik7XG4gICAgZWxzZSBmaXJzdE1lc3NhZ2VSZXNvbHZlKCk7XG4gIH07XG4gIHdvcmtlci5wb3N0TWVzc2FnZSh3YXNtTW9kdWxlIHx8IG5ldyBVUkwod2FzbVVSTCwgbG9jYXRpb24uaHJlZikudG9TdHJpbmcoKSk7XG4gIGxldCB7IHJlYWRGcm9tU3Rkb3V0LCBzZXJ2aWNlIH0gPSBjcmVhdGVDaGFubmVsKHtcbiAgICB3cml0ZVRvU3RkaW4oYnl0ZXMpIHtcbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShieXRlcyk7XG4gICAgfSxcbiAgICBpc1N5bmM6IGZhbHNlLFxuICAgIGhhc0ZTOiBmYWxzZSxcbiAgICBlc2J1aWxkOiBicm93c2VyX2V4cG9ydHNcbiAgfSk7XG4gIHlpZWxkIGZpcnN0TWVzc2FnZVByb21pc2U7XG4gIHN0b3BTZXJ2aWNlID0gKCkgPT4ge1xuICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICBpbml0aWFsaXplUHJvbWlzZSA9IHZvaWQgMDtcbiAgICBzdG9wU2VydmljZSA9IHZvaWQgMDtcbiAgICBsb25nTGl2ZWRTZXJ2aWNlID0gdm9pZCAwO1xuICB9O1xuICBsb25nTGl2ZWRTZXJ2aWNlID0ge1xuICAgIGJ1aWxkOiAob3B0aW9ucykgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVqZWN0QWxsUHJvbWlzZS50aGVuKHJlamVjdCk7XG4gICAgICBzZXJ2aWNlLmJ1aWxkT3JDb250ZXh0KHtcbiAgICAgICAgY2FsbE5hbWU6IFwiYnVpbGRcIixcbiAgICAgICAgcmVmczogbnVsbCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgaXNUVFk6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0V0Q6IFwiL1wiLFxuICAgICAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUocmVzKVxuICAgICAgfSk7XG4gICAgfSksXG4gICAgY29udGV4dDogKG9wdGlvbnMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlamVjdEFsbFByb21pc2UudGhlbihyZWplY3QpO1xuICAgICAgc2VydmljZS5idWlsZE9yQ29udGV4dCh7XG4gICAgICAgIGNhbGxOYW1lOiBcImNvbnRleHRcIixcbiAgICAgICAgcmVmczogbnVsbCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgaXNUVFk6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0V0Q6IFwiL1wiLFxuICAgICAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUocmVzKVxuICAgICAgfSk7XG4gICAgfSksXG4gICAgdHJhbnNmb3JtOiAoaW5wdXQsIG9wdGlvbnMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlamVjdEFsbFByb21pc2UudGhlbihyZWplY3QpO1xuICAgICAgc2VydmljZS50cmFuc2Zvcm0oe1xuICAgICAgICBjYWxsTmFtZTogXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgcmVmczogbnVsbCxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMgfHwge30sXG4gICAgICAgIGlzVFRZOiBmYWxzZSxcbiAgICAgICAgZnM6IHtcbiAgICAgICAgICByZWFkRmlsZShfLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKFwiSW50ZXJuYWwgZXJyb3JcIiksIG51bGwpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgd3JpdGVGaWxlKF8sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGxiYWNrOiAoZXJyLCByZXMpID0+IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShyZXMpXG4gICAgICB9KTtcbiAgICB9KSxcbiAgICBmb3JtYXRNZXNzYWdlczogKG1lc3NhZ2VzLCBvcHRpb25zKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZWplY3RBbGxQcm9taXNlLnRoZW4ocmVqZWN0KTtcbiAgICAgIHNlcnZpY2UuZm9ybWF0TWVzc2FnZXMoe1xuICAgICAgICBjYWxsTmFtZTogXCJmb3JtYXRNZXNzYWdlc1wiLFxuICAgICAgICByZWZzOiBudWxsLFxuICAgICAgICBtZXNzYWdlcyxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgY2FsbGJhY2s6IChlcnIsIHJlcykgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlcylcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIGFuYWx5emVNZXRhZmlsZTogKG1ldGFmaWxlLCBvcHRpb25zKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZWplY3RBbGxQcm9taXNlLnRoZW4ocmVqZWN0KTtcbiAgICAgIHNlcnZpY2UuYW5hbHl6ZU1ldGFmaWxlKHtcbiAgICAgICAgY2FsbE5hbWU6IFwiYW5hbHl6ZU1ldGFmaWxlXCIsXG4gICAgICAgIHJlZnM6IG51bGwsXG4gICAgICAgIG1ldGFmaWxlOiB0eXBlb2YgbWV0YWZpbGUgPT09IFwic3RyaW5nXCIgPyBtZXRhZmlsZSA6IEpTT04uc3RyaW5naWZ5KG1ldGFmaWxlKSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgY2FsbGJhY2s6IChlcnIsIHJlcykgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlcylcbiAgICAgIH0pO1xuICAgIH0pXG4gIH07XG59KTtcbnZhciBicm93c2VyX2RlZmF1bHQgPSBicm93c2VyX2V4cG9ydHM7XG59KSh0eXBlb2YgbW9kdWxlPT09XCJvYmplY3RcIj9tb2R1bGU6e3NldCBleHBvcnRzKHgpeyh0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0aGlzKS5lc2J1aWxkPXh9fSk7XG4iLCAiaW1wb3J0ICogYXMgZXNidWlsZCBmcm9tICdlc2J1aWxkLXdhc20nXG5cbmxldCBpbml0aWFsaXplZCA9IGZhbHNlXG5sZXQga2VybmVsUGF0aCA9ICcvc2FuZGJveC9sb2dpeC1jb3JlLmpzJ1xubGV0IGVmZmVjdFJvb3RQYXRoID0gJy9zYW5kYm94L2VmZmVjdC5qcydcblxuY29uc3QgRVNNX1NIX09SSUdJTiA9ICdodHRwczovL2VzbS5zaCdcbmNvbnN0IEVGRkVDVF9TQ09QRV9WRVJTSU9OID0gJzAuOTQuMCdcbmNvbnN0IExPQ0FMX0FUX0VGRkVDVF9QQUNLQUdFUyA9IG5ldyBTZXQ8c3RyaW5nPihbJ3BsYXRmb3JtJ10pXG5cbmNvbnN0IHJlbW90ZU1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuXG5jb25zdCBzaW1wbGlmeU1vZHVsZUtleSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHZhbHVlLnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCAnJykudG9Mb3dlckNhc2UoKVxuXG5sZXQgbG9naXhDb3JlU3VicGF0aFNldDogU2V0PHN0cmluZz4gfCBudWxsID0gbnVsbFxubGV0IGxvZ2l4Q29yZVN1YnBhdGhLZXlUb0Nhbm9uaWNhbDogTWFwPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPSBudWxsXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2dpeENvcmVTdWJwYXRocyhzcGVjaWZpZXJzOiBSZWFkb25seUFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgbG9naXhDb3JlU3VicGF0aFNldCA9IG5ldyBTZXQoc3BlY2lmaWVycylcbiAgbG9naXhDb3JlU3VicGF0aEtleVRvQ2Fub25pY2FsID0gbmV3IE1hcCgpXG4gIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIHNwZWNpZmllcnMpIHtcbiAgICBsb2dpeENvcmVTdWJwYXRoS2V5VG9DYW5vbmljYWwuc2V0KHNpbXBsaWZ5TW9kdWxlS2V5KHNwZWNpZmllciksIHNwZWNpZmllcilcbiAgfVxufVxuXG5jb25zdCBmZXRjaFJlbW90ZU1vZHVsZSA9IGFzeW5jICh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IGNhY2hlZCA9IHJlbW90ZU1vZHVsZUNhY2hlLmdldCh1cmwpXG4gIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjYWNoZWRcbiAgfVxuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpXG4gIGlmICghcmVzLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbc2FuZGJveC5jb21waWxlcl0gZmV0Y2ggZmFpbGVkOiAke1N0cmluZyhyZXMuc3RhdHVzKX0gJHtTdHJpbmcocmVzLnN0YXR1c1RleHQpfSAoJHt1cmx9KWApXG4gIH1cbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KClcbiAgcmVtb3RlTW9kdWxlQ2FjaGUuc2V0KHVybCwgdGV4dClcbiAgcmV0dXJuIHRleHRcbn1cblxuY29uc3QgdG9BYnNvbHV0ZVVybCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh2YWx1ZSkudG9TdHJpbmcoKVxuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBiYXNlID0gKGdsb2JhbFRoaXMgYXMgYW55KS5sb2NhdGlvbj8uaHJlZlxuICAgIGlmICh0eXBlb2YgYmFzZSA9PT0gJ3N0cmluZycgJiYgYmFzZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBiYXNlVXJsID0gbmV3IFVSTChiYXNlKVxuICAgICAgY29uc3Qgb3JpZ2luID0gYmFzZVVybC5vcmlnaW4gIT09ICdudWxsJyA/IGJhc2VVcmwub3JpZ2luIDogdW5kZWZpbmVkXG4gICAgICBpZiAob3JpZ2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgVVJMKHZhbHVlLCBvcmlnaW4pLnRvU3RyaW5nKClcbiAgICAgIH1cbiAgICAgIGlmIChiYXNlVXJsLnByb3RvY29sID09PSAnaHR0cDonIHx8IGJhc2VVcmwucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICAgIHJldHVybiBuZXcgVVJMKHZhbHVlLCBiYXNlVXJsLmhyZWYpLnRvU3RyaW5nKClcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGx0aHJvdWdoXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuY29uc3QgdG9TaWJsaW5nUGF0aCA9IChiYXNlUGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICBpZiAoYmFzZVBhdGguc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGJhc2VQYXRoLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHJldHVybiBuZXcgVVJMKGAuLyR7ZmlsZU5hbWV9YCwgYmFzZVBhdGgpLnRvU3RyaW5nKClcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGx0aHJvdWdoXG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gYmFzZVBhdGguc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdXG4gIGNvbnN0IGxhc3RTbGFzaCA9IHRyaW1tZWQubGFzdEluZGV4T2YoJy8nKVxuICBpZiAobGFzdFNsYXNoID49IDApIHtcbiAgICByZXR1cm4gYCR7dHJpbW1lZC5zbGljZSgwLCBsYXN0U2xhc2gpfS8ke2ZpbGVOYW1lfWBcbiAgfVxuICByZXR1cm4gYC8ke2ZpbGVOYW1lfWBcbn1cblxuY29uc3QgcGluRWZmZWN0U2NvcGUgPSAoc3BlY2lmaWVyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXNwZWNpZmllci5zdGFydHNXaXRoKCdAZWZmZWN0LycpKSB7XG4gICAgcmV0dXJuIHNwZWNpZmllclxuICB9XG5cbiAgLy8gRXhhbXBsZXM6XG4gIC8vIC0gQGVmZmVjdC9wbGF0Zm9ybSAgICAgICAgICAtPiBAZWZmZWN0L3BsYXRmb3JtQDAuOTQuMFxuICAvLyAtIEBlZmZlY3QvcGxhdGZvcm0vUGF0aCAgICAgLT4gQGVmZmVjdC9wbGF0Zm9ybUAwLjk0LjAvUGF0aFxuICAvLyAtIEBlZmZlY3QvcGxhdGZvcm1AMC45NC4wICAgLT4gKGtlZXApXG4gIGNvbnN0IG1hdGNoID0gc3BlY2lmaWVyLm1hdGNoKC9eQGVmZmVjdFxcLyhbXkAvXSspKEBbXi9dKyk/KFxcLy4qKT8kLylcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBzcGVjaWZpZXJcbiAgfVxuICBjb25zdCBuYW1lID0gbWF0Y2hbMV1cbiAgY29uc3QgdmVyc2lvblBhcnQgPSBtYXRjaFsyXVxuICBjb25zdCByZXN0ID0gbWF0Y2hbM10gPz8gJydcbiAgaWYgKHZlcnNpb25QYXJ0KSB7XG4gICAgcmV0dXJuIHNwZWNpZmllclxuICB9XG4gIHJldHVybiBgQGVmZmVjdC8ke25hbWV9QCR7RUZGRUNUX1NDT1BFX1ZFUlNJT059JHtyZXN0fWBcbn1cblxuY29uc3QgdHJ5UGFyc2VFc21FZmZlY3RTdWJwYXRoID0gKHVybDogVVJMKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGlmICh1cmwub3JpZ2luICE9PSBFU01fU0hfT1JJR0lOKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gdXJsLnBhdGhuYW1lLm1hdGNoKC9eXFwvKD86dlxcZCtcXC8pP2VmZmVjdEBbXi9dKyg/OlxcLyguKikpPyQvKVxuICBjb25zdCByZXN0ID0gbWF0Y2g/LlsxXVxuICAvLyByb290OiAvZWZmZWN0QHggb3IgL2VmZmVjdEBeeFxuICBpZiAoIXJlc3QpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIC9lZmZlY3RAeC9lczIwMjIvQ29udGV4dC5tanMgLT4gQ29udGV4dFxuICBjb25zdCBlc01vZHVsZU1hdGNoID0gcmVzdC5tYXRjaCgvXmVzXFxkK1xcLyhbXi9dKylcXC5tanMkLylcbiAgaWYgKGVzTW9kdWxlTWF0Y2g/LlsxXSkge1xuICAgIHJldHVybiBlc01vZHVsZU1hdGNoWzFdXG4gIH1cblxuICAvLyAvZWZmZWN0QHgvQ29udGV4dCAtPiBDb250ZXh0XG4gIGlmICghcmVzdC5pbmNsdWRlcygnLycpKSB7XG4gICAgcmV0dXJuIHJlc3RcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IHRyeVBhcnNlRXNtQXRFZmZlY3RTdWJwYXRoID0gKHVybDogVVJMKTogeyBwa2c6IHN0cmluZzsgc3VicGF0aDogc3RyaW5nIH0gfCBudWxsID0+IHtcbiAgaWYgKHVybC5vcmlnaW4gIT09IEVTTV9TSF9PUklHSU4pIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gRXhhbXBsZXM6XG4gIC8vIC0gL0BlZmZlY3QvcGxhdGZvcm1AMC45NC4wICAgICAgICAgICAgICAgLT4geyBwa2c6IFwicGxhdGZvcm1cIiwgc3VicGF0aDogXCJcIiB9XG4gIC8vIC0gL0BlZmZlY3QvcGxhdGZvcm1AMC45NC4wL1BhdGggICAgICAgICAgLT4geyBwa2c6IFwicGxhdGZvcm1cIiwgc3VicGF0aDogXCJQYXRoXCIgfVxuICAvLyAtIC9AZWZmZWN0L3BsYXRmb3JtQDAuOTQuMC9lczIwMjIvUGF0aC5tanMgLT4geyBwa2c6IFwicGxhdGZvcm1cIiwgc3VicGF0aDogXCJQYXRoXCIgfVxuICBjb25zdCBtYXRjaCA9IHVybC5wYXRobmFtZS5tYXRjaCgvXlxcLyg/OnZcXGQrXFwvKT9AZWZmZWN0XFwvKFteQC9dKylAW14vXSsoPzpcXC8oLiopKT8kLylcbiAgY29uc3QgcGtnID0gbWF0Y2g/LlsxXVxuICBjb25zdCByZXN0ID0gbWF0Y2g/LlsyXVxuICBpZiAoIXBrZykge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgaWYgKCFyZXN0KSB7XG4gICAgcmV0dXJuIHsgcGtnLCBzdWJwYXRoOiAnJyB9XG4gIH1cblxuICBjb25zdCBlc01vZHVsZU1hdGNoID0gcmVzdC5tYXRjaCgvXmVzXFxkK1xcLyhbXi9dKylcXC5tanMkLylcbiAgaWYgKGVzTW9kdWxlTWF0Y2g/LlsxXSkge1xuICAgIHJldHVybiB7IHBrZywgc3VicGF0aDogZXNNb2R1bGVNYXRjaFsxXSB9XG4gIH1cblxuICBpZiAoIXJlc3QuaW5jbHVkZXMoJy8nKSkge1xuICAgIHJldHVybiB7IHBrZywgc3VicGF0aDogcmVzdC5yZXBsYWNlKC9cXC5tanMkLywgJycpIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IHRvRWZmZWN0UGF0aCA9IChzdWJwYXRoOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nID0+IHtcbiAgaWYgKCFzdWJwYXRoKSB7XG4gICAgcmV0dXJuIGVmZmVjdFJvb3RQYXRoXG4gIH1cbiAgcmV0dXJuIHRvU2libGluZ1BhdGgoa2VybmVsUGF0aCwgYGVmZmVjdC8ke3N1YnBhdGh9LmpzYClcbn1cblxuY29uc3QgdG9BdEVmZmVjdFBhdGggPSAocGtnOiBzdHJpbmcsIHN1YnBhdGg6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXN1YnBhdGgpIHtcbiAgICByZXR1cm4gdG9TaWJsaW5nUGF0aChrZXJuZWxQYXRoLCBgQGVmZmVjdC8ke3BrZ30uanNgKVxuICB9XG4gIHJldHVybiB0b1NpYmxpbmdQYXRoKGtlcm5lbFBhdGgsIGBAZWZmZWN0LyR7cGtnfS8ke3N1YnBhdGh9LmpzYClcbn1cblxudHlwZSBMb2dpeENvcmVTdWJwYXRoSW5mbyA9IHtcbiAgcmVhZG9ubHkgbm9ybWFsaXplZDogc3RyaW5nXG59XG5cbmNvbnN0IG5vcm1hbGl6ZUxvZ2l4Q29yZVN1YnBhdGggPSAoc3VicGF0aDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgbGV0IG91dCA9IHN1YnBhdGguc3BsaXQoJz8nKVswXT8uc3BsaXQoJyMnKVswXSA/PyBzdWJwYXRoXG4gIG91dCA9IG91dC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICBpZiAob3V0LmVuZHNXaXRoKCcuanMnKSkge1xuICAgIG91dCA9IG91dC5zbGljZSgwLCAtJy5qcycubGVuZ3RoKVxuICB9XG4gIGlmIChvdXQuZW5kc1dpdGgoJy9pbmRleCcpKSB7XG4gICAgb3V0ID0gb3V0LnNsaWNlKDAsIC0nL2luZGV4Jy5sZW5ndGgpXG4gIH1cbiAgY29uc3Qgc2VnbWVudHMgPSBvdXQuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgcmV0dXJuIHNlZ21lbnRzLmpvaW4oJy8nKVxufVxuXG5jb25zdCBnZXRMb2dpeENvcmVTdWJwYXRoSW5mbyA9IChyYXc6IHN0cmluZyk6IExvZ2l4Q29yZVN1YnBhdGhJbmZvID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUxvZ2l4Q29yZVN1YnBhdGgocmF3KVxuICByZXR1cm4ge1xuICAgIG5vcm1hbGl6ZWQsXG4gIH1cbn1cblxuY29uc3QgcmVtb3RlQnVuZGxlUGx1Z2luOiBlc2J1aWxkLlBsdWdpbiA9IHtcbiAgbmFtZTogJ3JlbW90ZS1idW5kbGUnLFxuICBzZXR1cChidWlsZCkge1xuICAgIGJ1aWxkLm9uUmVzb2x2ZSh7IGZpbHRlcjogL15lZmZlY3QoJHxcXC8pLyB9LCAoYXJncykgPT4ge1xuICAgICAgaWYgKGFyZ3MucGF0aCA9PT0gJ2VmZmVjdCcpIHtcbiAgICAgICAgcmV0dXJuIHsgcGF0aDogZWZmZWN0Um9vdFBhdGgsIGV4dGVybmFsOiB0cnVlIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHN1YnBhdGggPSBhcmdzLnBhdGguc2xpY2UoJ2VmZmVjdC8nLmxlbmd0aClcbiAgICAgIHJldHVybiB7IHBhdGg6IHRvRWZmZWN0UGF0aChzdWJwYXRoKSwgZXh0ZXJuYWw6IHRydWUgfVxuICAgIH0pXG5cbiAgICAvLyBQcmVmZXIgbWFwcGluZyBAZWZmZWN0L3BsYXRmb3JtIChyb290ICsgc3VicGF0aHMpIHRvIHNhbmRib3ggYnVpbHQtaW4gYXJ0aWZhY3RzIHRvIGF2b2lkIGZhbGxpbmcgYmFjayB0byBlc20uc2guXG4gICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvXkBlZmZlY3RcXC9bXi9dKyg/OkBbXi9dKyk/JC8gfSwgKGFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoID0gYXJncy5wYXRoLm1hdGNoKC9eQGVmZmVjdFxcLyhbXkAvXSspKD86QFteL10rKT8kLylcbiAgICAgIGNvbnN0IHBrZyA9IG1hdGNoPy5bMV1cbiAgICAgIGlmICghcGtnIHx8ICFMT0NBTF9BVF9FRkZFQ1RfUEFDS0FHRVMuaGFzKHBrZykpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHBhdGg6IHRvQXRFZmZlY3RQYXRoKHBrZywgbnVsbCksIGV4dGVybmFsOiB0cnVlIH1cbiAgICB9KVxuXG4gICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvXkBlZmZlY3RcXC9bXi9dKyg/OkBbXi9dKyk/XFwvLyB9LCAoYXJncykgPT4ge1xuICAgICAgY29uc3QgbWF0Y2ggPSBhcmdzLnBhdGgubWF0Y2goL15AZWZmZWN0XFwvKFteQC9dKykoPzpAW14vXSspP1xcLyguKykkLylcbiAgICAgIGNvbnN0IHBrZyA9IG1hdGNoPy5bMV1cbiAgICAgIGNvbnN0IHN1YnBhdGggPSBtYXRjaD8uWzJdID8/IG51bGxcbiAgICAgIGlmICghcGtnIHx8ICFMT0NBTF9BVF9FRkZFQ1RfUEFDS0FHRVMuaGFzKHBrZykpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHBhdGg6IHRvQXRFZmZlY3RQYXRoKHBrZywgc3VicGF0aCksIGV4dGVybmFsOiB0cnVlIH1cbiAgICB9KVxuXG4gICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvXkBsb2dpeFxcL2NvcmUkLyB9LCAoKSA9PiAoe1xuICAgICAgcGF0aDoga2VybmVsUGF0aCxcbiAgICAgIGV4dGVybmFsOiB0cnVlLFxuICAgIH0pKVxuXG4gICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvXkBsb2dpeFxcL2NvcmVcXC8vIH0sIChhcmdzKSA9PiB7XG4gICAgICBjb25zdCByYXdTdWJwYXRoID0gYXJncy5wYXRoLnNsaWNlKCdAbG9naXhqcy9jb3JlLycubGVuZ3RoKVxuICAgICAgY29uc3QgaW5mbyA9IGdldExvZ2l4Q29yZVN1YnBhdGhJbmZvKHJhd1N1YnBhdGgpXG4gICAgICBpZiAoIWluZm8ubm9ybWFsaXplZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yczogW3sgdGV4dDogYFx1OTc1RVx1NkNENVx1NzY4NCBAbG9naXhqcy9jb3JlIFx1NUI1MFx1OERFRlx1NUY4NFx1RkYxQSR7YXJncy5wYXRofWAgfV0sXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RTZWdtZW50ID0gaW5mby5ub3JtYWxpemVkLnNwbGl0KCcvJywgMSlbMF0hXG4gICAgICBpZiAoZmlyc3RTZWdtZW50LnRvTG93ZXJDYXNlKCkgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGV4dDogYFx1Nzk4MVx1NkI2Mlx1NTcyOCBTYW5kYm94IFx1NEUyRCBpbXBvcnQgXCJAbG9naXhqcy9jb3JlL2ludGVybmFsLypcIlx1RkYxQSR7YXJncy5wYXRofWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGluZm8ubm9ybWFsaXplZC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRleHQ6IGBcdTc5ODFcdTZCNjJcdTU3MjggU2FuZGJveCBcdTRFMkRcdTRGN0ZcdTc1MjggXCIuXCIgXHU1RjYyXHU1RjBGXHU3Njg0IEBsb2dpeGpzL2NvcmUgXHU1QjUwXHU4REVGXHU1Rjg0XHVGRjFBJHthcmdzLnBhdGh9XHVGRjFCXHU4QkY3XHU0RjdGXHU3NTI4IFwiL1wiIFx1NTIwNlx1OTY5NFx1RkYwOFx1NEY4Qlx1NTk4MiBcIkBsb2dpeGpzL2NvcmUvJHtpbmZvLm5vcm1hbGl6ZWQucmVwbGFjZUFsbCgnLicsICcvJyl9XCJcdUZGMDlgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghbG9naXhDb3JlU3VicGF0aFNldCB8fCAhbG9naXhDb3JlU3VicGF0aEtleVRvQ2Fub25pY2FsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRleHQ6IGBTYW5kYm94IFx1NTE4NVx1N0Y2RSBAbG9naXhqcy9jb3JlIFx1NUI1MFx1OERFRlx1NUY4NFx1NkUwNVx1NTM1NVx1NjcyQVx1NTIxRFx1NTlDQlx1NTMxNlx1RkYwQ1x1NjVFMFx1NkNENVx1ODlFM1x1Njc5MFx1RkYxQSR7YXJncy5wYXRofVx1RkYxQlx1OEJGN1x1Nzg2RVx1NEZERCAvc2FuZGJveC9sb2dpeC1jb3JlLm1hbmlmZXN0Lmpzb24gXHU1M0VGXHU4QkJGXHU5NUVFYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWxvZ2l4Q29yZVN1YnBhdGhTZXQuaGFzKGluZm8ubm9ybWFsaXplZCkpIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGxvZ2l4Q29yZVN1YnBhdGhLZXlUb0Nhbm9uaWNhbC5nZXQoc2ltcGxpZnlNb2R1bGVLZXkoaW5mby5ub3JtYWxpemVkKSlcbiAgICAgICAgaWYgKHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBgXHU3OTgxXHU2QjYyXHU1NzI4IFNhbmRib3ggXHU0RTJEXHU0RjdGXHU3NTI4XHU5NzVFXHU4OUM0XHU4MzAzIEBsb2dpeGpzL2NvcmUgXHU1QjUwXHU4REVGXHU1Rjg0XHVGRjFBJHthcmdzLnBhdGh9XHVGRjFCXHU4QkY3XHU2NTM5XHU0RTNBIFwiQGxvZ2l4anMvY29yZS8ke3N1Z2dlc3Rpb259XCJgLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGV4dDogYFx1NjcyQVx1NzdFNVx1NzY4NCBAbG9naXhqcy9jb3JlIFx1NUI1MFx1OERFRlx1NUY4NFx1RkYxQSR7YXJncy5wYXRofVx1RkYxQlx1OEJGN1x1NjUzOVx1NzUyOFx1NjgzOVx1NUJGQ1x1NTE2NVx1RkYwOFx1NEY4Qlx1NTk4MiBcImltcG9ydCAqIGFzIExvZ2l4IGZyb20gXFxcXFwiQGxvZ2l4anMvY29yZVxcXFxcIlwiXHVGRjA5XHU2MjE2XHU2OEMwXHU2N0U1IGtlcm5lbCBcdTY2MkZcdTU0MjZcdTVERjJcdTUzMDVcdTU0MkJcdThCRTVcdTVCNTBcdTZBMjFcdTU3NTdgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbm9uaWNhbEZpbGUgPSBpbmZvLm5vcm1hbGl6ZWQucmVwbGFjZUFsbCgnLycsICcuJylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGg6IHRvU2libGluZ1BhdGgoa2VybmVsUGF0aCwgYGxvZ2l4LWNvcmUvJHtjYW5vbmljYWxGaWxlfS5qc2ApLFxuICAgICAgICBleHRlcm5hbDogdHJ1ZSxcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvXmh0dHBzPzpcXC9cXC8vIH0sIChhcmdzKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGFyZ3MucGF0aClcbiAgICAgIGNvbnN0IGVmZmVjdFN1YnBhdGggPSB0cnlQYXJzZUVzbUVmZmVjdFN1YnBhdGgodXJsKVxuICAgICAgaWYgKGVmZmVjdFN1YnBhdGggIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgcGF0aDogdG9FZmZlY3RQYXRoKGVmZmVjdFN1YnBhdGgpLCBleHRlcm5hbDogdHJ1ZSB9XG4gICAgICB9XG4gICAgICBjb25zdCBhdEVmZmVjdCA9IHRyeVBhcnNlRXNtQXRFZmZlY3RTdWJwYXRoKHVybClcbiAgICAgIGlmIChhdEVmZmVjdCAhPT0gbnVsbCAmJiBMT0NBTF9BVF9FRkZFQ1RfUEFDS0FHRVMuaGFzKGF0RWZmZWN0LnBrZykpIHtcbiAgICAgICAgcmV0dXJuIHsgcGF0aDogdG9BdEVmZmVjdFBhdGgoYXRFZmZlY3QucGtnLCBhdEVmZmVjdC5zdWJwYXRoKSwgZXh0ZXJuYWw6IHRydWUgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgcGF0aDogdXJsLnRvU3RyaW5nKCksIG5hbWVzcGFjZTogJ3JlbW90ZS11cmwnIH1cbiAgICB9KVxuXG4gICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvXlxcLy8gfSwgKGFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IGJhc2UgPVxuICAgICAgICBhcmdzLmltcG9ydGVyLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCBhcmdzLmltcG9ydGVyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJylcbiAgICAgICAgICA/IGFyZ3MuaW1wb3J0ZXJcbiAgICAgICAgICA6IGAke0VTTV9TSF9PUklHSU59L2BcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYXJncy5wYXRoLCBiYXNlKVxuICAgICAgY29uc3QgZWZmZWN0U3VicGF0aCA9IHRyeVBhcnNlRXNtRWZmZWN0U3VicGF0aCh1cmwpXG4gICAgICBpZiAoZWZmZWN0U3VicGF0aCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4geyBwYXRoOiB0b0VmZmVjdFBhdGgoZWZmZWN0U3VicGF0aCksIGV4dGVybmFsOiB0cnVlIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGF0RWZmZWN0ID0gdHJ5UGFyc2VFc21BdEVmZmVjdFN1YnBhdGgodXJsKVxuICAgICAgaWYgKGF0RWZmZWN0ICE9PSBudWxsICYmIExPQ0FMX0FUX0VGRkVDVF9QQUNLQUdFUy5oYXMoYXRFZmZlY3QucGtnKSkge1xuICAgICAgICByZXR1cm4geyBwYXRoOiB0b0F0RWZmZWN0UGF0aChhdEVmZmVjdC5wa2csIGF0RWZmZWN0LnN1YnBhdGgpLCBleHRlcm5hbDogdHJ1ZSB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBwYXRoOiB1cmwudG9TdHJpbmcoKSwgbmFtZXNwYWNlOiAncmVtb3RlLXVybCcgfVxuICAgIH0pXG5cbiAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IC9eXFwuXFwuP1xcLy8gfSwgKGFyZ3MpID0+IHtcbiAgICAgIGlmICghKGFyZ3MuaW1wb3J0ZXIuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGFyZ3MuaW1wb3J0ZXIuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYXJncy5wYXRoLCBhcmdzLmltcG9ydGVyKVxuICAgICAgY29uc3QgZWZmZWN0U3VicGF0aCA9IHRyeVBhcnNlRXNtRWZmZWN0U3VicGF0aCh1cmwpXG4gICAgICBpZiAoZWZmZWN0U3VicGF0aCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4geyBwYXRoOiB0b0VmZmVjdFBhdGgoZWZmZWN0U3VicGF0aCksIGV4dGVybmFsOiB0cnVlIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGF0RWZmZWN0ID0gdHJ5UGFyc2VFc21BdEVmZmVjdFN1YnBhdGgodXJsKVxuICAgICAgaWYgKGF0RWZmZWN0ICE9PSBudWxsICYmIExPQ0FMX0FUX0VGRkVDVF9QQUNLQUdFUy5oYXMoYXRFZmZlY3QucGtnKSkge1xuICAgICAgICByZXR1cm4geyBwYXRoOiB0b0F0RWZmZWN0UGF0aChhdEVmZmVjdC5wa2csIGF0RWZmZWN0LnN1YnBhdGgpLCBleHRlcm5hbDogdHJ1ZSB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBwYXRoOiB1cmwudG9TdHJpbmcoKSwgbmFtZXNwYWNlOiAncmVtb3RlLXVybCcgfVxuICAgIH0pXG5cbiAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IC9eW14uL10vIH0sIChhcmdzKSA9PiB7XG4gICAgICBpZiAoYXJncy5wYXRoLnN0YXJ0c1dpdGgoJ2VmZmVjdCcpIHx8IGFyZ3MucGF0aC5zdGFydHNXaXRoKCdAbG9naXhqcy9jb3JlJykpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNwZWNpZmllciA9IHBpbkVmZmVjdFNjb3BlKGFyZ3MucGF0aClcbiAgICAgIHJldHVybiB7IHBhdGg6IG5ldyBVUkwoc3BlY2lmaWVyLCBgJHtFU01fU0hfT1JJR0lOfS9gKS50b1N0cmluZygpLCBuYW1lc3BhY2U6ICdyZW1vdGUtdXJsJyB9XG4gICAgfSlcblxuICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogLy4qLywgbmFtZXNwYWNlOiAncmVtb3RlLXVybCcgfSwgYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnRzID0gYXdhaXQgZmV0Y2hSZW1vdGVNb2R1bGUoYXJncy5wYXRoKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudHMsXG4gICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgIH1cbiAgICB9KVxuICB9LFxufVxuXG5leHBvcnQgdHlwZSBDb21waWxlUmVzdWx0ID0geyBzdWNjZXNzOiB0cnVlOyBidW5kbGU6IHN0cmluZyB9IHwgeyBzdWNjZXNzOiBmYWxzZTsgZXJyb3JzOiBzdHJpbmdbXSB9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0Q29tcGlsZXIod2FzbVVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChpbml0aWFsaXplZCkgcmV0dXJuXG4gIGF3YWl0IGVzYnVpbGQuaW5pdGlhbGl6ZSh7XG4gICAgd2FzbVVSTDogd2FzbVVybCxcbiAgICB3b3JrZXI6IGZhbHNlLFxuICB9KVxuICBpbml0aWFsaXplZCA9IHRydWVcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXBpbGUoY29kZTogc3RyaW5nLCBmaWxlbmFtZSA9ICdpbnB1dC50c3gnKTogUHJvbWlzZTxDb21waWxlUmVzdWx0PiB7XG4gIGlmICghaW5pdGlhbGl6ZWQpIHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3JzOiBbJ1x1N0YxNlx1OEJEMVx1NTY2OFx1NjcyQVx1NTIxRFx1NTlDQlx1NTMxNlx1RkYwQ1x1OEJGN1x1NTE0OFx1OEMwM1x1NzUyOCBpbml0Q29tcGlsZXIoKSddIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogY29kZSxcbiAgICAgICAgbG9hZGVyOiAndHN4JyxcbiAgICAgICAgcmVzb2x2ZURpcjogJy8nLFxuICAgICAgICBzb3VyY2VmaWxlOiBmaWxlbmFtZSxcbiAgICAgIH0sXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW3JlbW90ZUJ1bmRsZVBsdWdpbl0sXG4gICAgICB0YXJnZXQ6ICdlczIwMjAnLFxuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgfSlcblxuICAgIGlmIChyZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcnM6IHJlc3VsdC5lcnJvcnMubWFwKChlKSA9PiBlLnRleHQpIH1cbiAgICB9XG5cbiAgICBjb25zdCBidW5kbGUgPSByZXN1bHQub3V0cHV0RmlsZXM/LlswXT8udGV4dCA/PyAnJ1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGJ1bmRsZSB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yczogW2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKV0gfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luaXRpYWxpemVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5pdGlhbGl6ZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEtlcm5lbFBhdGgocGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB0b0Fic29sdXRlVXJsKHBhdGgpXG4gIGtlcm5lbFBhdGggPSBub3JtYWxpemVkXG4gIGVmZmVjdFJvb3RQYXRoID0gdG9TaWJsaW5nUGF0aChub3JtYWxpemVkLCAnZWZmZWN0LmpzJylcbn1cbiIsICIvKipcbiAqIFNhbmRib3ggV29ya2VyIGVudHJ5IChpbnRlcm5hbCB1c2UpLlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIFJlY2VpdmVzIEhvc3QgY29tbWFuZHMgKElOSVQvQ09NUElMRS9SVU4vVEVSTUlOQVRFKVxuICogLSBJbml0aWFsaXplcyBlc2J1aWxkLXdhc20gYW5kIHJld3JpdGVzIGRlcGVuZGVuY2llcyBiYXNlZCBvbiBrZXJuZWxVcmxcbiAqIC0gQ29tcGlsZXMgdXNlciBjb2RlIChvcHRpb25hbClcbiAqIC0gUnVucyB0aGUgY29tcGlsZWQgYnVuZGxlIGFuZCBjb2xsZWN0cyBMT0cvVFJBQ0UvRVJST1IvQ09NUExFVEUgZXZlbnRzXG4gKi9cblxuaW1wb3J0IHsgY29tcGlsZSwgaW5pdENvbXBpbGVyLCBpc0luaXRpYWxpemVkLCBzZXRLZXJuZWxQYXRoLCBzZXRMb2dpeENvcmVTdWJwYXRocyB9IGZyb20gJy4uL2NvbXBpbGVyL2luZGV4LmpzJ1xuaW1wb3J0IHR5cGUge1xuICBTYW5kYm94Q29tbWFuZCxcbiAgU2FuZGJveEV2ZW50LFxuICBMb2dFdmVudCxcbiAgVHJhY2VFdmVudCxcbiAgQ29tcGxldGVFdmVudCxcbiAgRXJyb3JFdmVudCxcbiAgUmVhZHlFdmVudCxcbiAgQ29tcGlsZVJlc3VsdEV2ZW50LFxufSBmcm9tICcuLi8uLi9Qcm90b2NvbC5qcydcbmltcG9ydCB0eXBlIHsgTG9nRW50cnksIFRyYWNlU3BhbiwgTW9ja01hbmlmZXN0LCBIdHRwTW9ja1J1bGUsIFVpSW50ZW50UGFja2V0IH0gZnJvbSAnLi4vLi4vVHlwZXMuanMnXG5cbmNvbnN0IFZFUlNJT04gPSAnMC4yLjAnXG5jb25zdCBERUZBVUxUX1dBU01fVVJMID0gJy9lc2J1aWxkLndhc20nXG5jb25zdCBERUZBVUxUX0tFUk5FTF9VUkwgPSAnL3NhbmRib3gvbG9naXgtY29yZS5qcydcbmNvbnN0IERFRkFVTFRfRUZGRUNUX1VSTCA9ICcvc2FuZGJveC9lZmZlY3QuanMnXG5cbmxldCBjb21waWxlZEJ1bmRsZTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbmxldCBjdXJyZW50UnVuSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5sZXQgcnVuU3RhcnRUaW1lID0gMFxubGV0IGN1cnJlbnRNb2NrTWFuaWZlc3Q6IE1vY2tNYW5pZmVzdCB8IHVuZGVmaW5lZFxubGV0IHVpSW50ZW50czogQXJyYXk8VWlJbnRlbnRQYWNrZXQ+ID0gW11cbmxldCBjdXJyZW50S2VybmVsVXJsID0gREVGQVVMVF9LRVJORUxfVVJMXG5sZXQgY3VycmVudEVmZmVjdFVybCA9IERFRkFVTFRfRUZGRUNUX1VSTFxuXG5jb25zdCB0b0Fic29sdXRlVXJsID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHZhbHVlKS50b1N0cmluZygpXG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGx0aHJvdWdoXG4gIH1cblxuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICBjb25zdCBiYXNlSHJlZiA9IHNlbGYubG9jYXRpb24/LmhyZWZcbiAgICBpZiAodHlwZW9mIGJhc2VIcmVmID09PSAnc3RyaW5nJyAmJiBiYXNlSHJlZi5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBiYXNlID0gbmV3IFVSTChiYXNlSHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGJhc2Uub3JpZ2luICE9PSAnbnVsbCcgPyBiYXNlLm9yaWdpbiA6IHVuZGVmaW5lZFxuICAgICAgaWYgKG9yaWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFVSTCh2YWx1ZSwgb3JpZ2luKS50b1N0cmluZygpXG4gICAgICB9XG4gICAgICBpZiAoYmFzZS5wcm90b2NvbCA9PT0gJ2h0dHA6JyB8fCBiYXNlLnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICByZXR1cm4gbmV3IFVSTCh2YWx1ZSwgYmFzZS5ocmVmKS50b1N0cmluZygpXG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICB9XG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbmNvbnN0IHRvU2libGluZ1VybCA9IChiYXNlVXJsOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBhYnNvbHV0ZUJhc2VVcmwgPSB0b0Fic29sdXRlVXJsKGJhc2VVcmwpXG4gIHRyeSB7XG4gICAgaWYgKGFic29sdXRlQmFzZVVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgYWJzb2x1dGVCYXNlVXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHJldHVybiBuZXcgVVJMKGAuLyR7ZmlsZU5hbWV9YCwgYWJzb2x1dGVCYXNlVXJsKS50b1N0cmluZygpXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICB9XG5cbiAgY29uc3QgdHJpbW1lZCA9IGFic29sdXRlQmFzZVVybC5zcGxpdCgnPycpWzBdLnNwbGl0KCcjJylbMF1cbiAgY29uc3QgbGFzdFNsYXNoID0gdHJpbW1lZC5sYXN0SW5kZXhPZignLycpXG4gIGlmIChsYXN0U2xhc2ggPj0gMCkge1xuICAgIHJldHVybiBgJHt0cmltbWVkLnNsaWNlKDAsIGxhc3RTbGFzaCl9LyR7ZmlsZU5hbWV9YFxuICB9XG4gIHJldHVybiBgLyR7ZmlsZU5hbWV9YFxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vXG4vLyBFdmVudCByZXBvcnRpbmdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy9cblxuY29uc3QgcG9zdEV2ZW50ID0gKGV2ZW50OiBTYW5kYm94RXZlbnQpOiB2b2lkID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICBzZWxmLnBvc3RNZXNzYWdlKGV2ZW50KVxufVxuXG5jb25zdCBwb3N0UmVhZHkgPSAoY29tcGlsZXJSZWFkeTogYm9vbGVhbik6IHZvaWQgPT5cbiAgcG9zdEV2ZW50KHtcbiAgICB0eXBlOiAnUkVBRFknLFxuICAgIHBheWxvYWQ6IHsgdmVyc2lvbjogVkVSU0lPTiwgY29tcGlsZXJSZWFkeSB9LFxuICB9IHNhdGlzZmllcyBSZWFkeUV2ZW50KVxuXG5jb25zdCBwb3N0Q29tcGlsZVJlc3VsdCA9IChzdWNjZXNzOiBib29sZWFuLCBidW5kbGU/OiBzdHJpbmcsIGVycm9ycz86IHN0cmluZ1tdKTogdm9pZCA9PlxuICBwb3N0RXZlbnQoe1xuICAgIHR5cGU6ICdDT01QSUxFX1JFU1VMVCcsXG4gICAgcGF5bG9hZDogeyBzdWNjZXNzLCBidW5kbGUsIGVycm9ycyB9LFxuICB9IHNhdGlzZmllcyBDb21waWxlUmVzdWx0RXZlbnQpXG5cbmNvbnN0IHBvc3RMb2cgPSAoZW50cnk6IExvZ0VudHJ5KTogdm9pZCA9PlxuICBwb3N0RXZlbnQoe1xuICAgIHR5cGU6ICdMT0cnLFxuICAgIHBheWxvYWQ6IGVudHJ5LFxuICB9IHNhdGlzZmllcyBMb2dFdmVudClcblxuY29uc3QgcG9zdFRyYWNlID0gKHNwYW46IFRyYWNlU3Bhbik6IHZvaWQgPT5cbiAgcG9zdEV2ZW50KHtcbiAgICB0eXBlOiAnVFJBQ0UnLFxuICAgIHBheWxvYWQ6IHNwYW4sXG4gIH0gc2F0aXNmaWVzIFRyYWNlRXZlbnQpXG5cbmNvbnN0IHBvc3RVaUludGVudCA9IChwYWNrZXQ6IFVpSW50ZW50UGFja2V0KTogdm9pZCA9PiB7XG4gIHVpSW50ZW50cy5wdXNoKHBhY2tldClcbiAgcG9zdEV2ZW50KHtcbiAgICB0eXBlOiAnVUlfSU5URU5UJyxcbiAgICBwYXlsb2FkOiBwYWNrZXQsXG4gIH0pXG59XG5cbmNvbnN0IHBvc3RFcnJvciA9IChcbiAgY29kZTogJ0lOSVRfRkFJTEVEJyB8ICdSVU5USU1FX0VSUk9SJyB8ICdUSU1FT1VUJyB8ICdXT1JLRVJfVEVSTUlOQVRFRCcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgc3RhY2s/OiBzdHJpbmcsXG4pOiB2b2lkID0+XG4gIHBvc3RFdmVudCh7XG4gICAgdHlwZTogJ0VSUk9SJyxcbiAgICBwYXlsb2FkOiB7IGNvZGUsIG1lc3NhZ2UsIHN0YWNrIH0sXG4gIH0gc2F0aXNmaWVzIEVycm9yRXZlbnQpXG5cbmNvbnN0IHBvc3RDb21wbGV0ZSA9IChydW5JZDogc3RyaW5nLCBkdXJhdGlvbjogbnVtYmVyLCBzdGF0ZVNuYXBzaG90PzogdW5rbm93bik6IHZvaWQgPT5cbiAgcG9zdEV2ZW50KHtcbiAgICB0eXBlOiAnQ09NUExFVEUnLFxuICAgIHBheWxvYWQ6IHsgcnVuSWQsIGR1cmF0aW9uLCBzdGF0ZVNuYXBzaG90IH0sXG4gIH0gc2F0aXNmaWVzIENvbXBsZXRlRXZlbnQpXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy9cbi8vIENvbnNvbGUgUHJveHlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy9cblxuY29uc3Qgb3JpZ2luYWxDb25zb2xlID0ge1xuICBsb2c6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksXG4gIGluZm86IGNvbnNvbGUuaW5mby5iaW5kKGNvbnNvbGUpLFxuICB3YXJuOiBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKSxcbiAgZXJyb3I6IGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKSxcbiAgZGVidWc6IGNvbnNvbGUuZGVidWcuYmluZChjb25zb2xlKSxcbn1cblxuY29uc3Qgc2VyaWFsaXplQXJnID0gKGFyZzogdW5rbm93bik6IHVua25vd24gPT4ge1xuICBpZiAoYXJnID09PSBudWxsIHx8IGFyZyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYXJnXG4gIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicpIHJldHVybiBhcmdcbiAgaWYgKGFyZyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgX190eXBlOiAnRXJyb3InLCBuYW1lOiBhcmcubmFtZSwgbWVzc2FnZTogYXJnLm1lc3NhZ2UsIHN0YWNrOiBhcmcuc3RhY2sgfVxuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYXJnKSlcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyhhcmcpXG4gIH1cbn1cblxuY29uc3Qgc2V0dXBDb25zb2xlUHJveHkgPSAoKTogdm9pZCA9PiB7XG4gIGNvbnN0IGNyZWF0ZVByb3h5ID1cbiAgICAobGV2ZWw6IExvZ0VudHJ5WydsZXZlbCddKSA9PlxuICAgICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgIG9yaWdpbmFsQ29uc29sZVtsZXZlbF0oLi4uYXJncylcbiAgICAgIHBvc3RMb2coe1xuICAgICAgICBsZXZlbCxcbiAgICAgICAgYXJnczogYXJncy5tYXAoc2VyaWFsaXplQXJnKSxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBzb3VyY2U6ICdjb25zb2xlJyxcbiAgICAgIH0pXG4gICAgfVxuXG4gIGNvbnNvbGUubG9nID0gY3JlYXRlUHJveHkoJ2luZm8nKVxuICBjb25zb2xlLmluZm8gPSBjcmVhdGVQcm94eSgnaW5mbycpXG4gIGNvbnNvbGUud2FybiA9IGNyZWF0ZVByb3h5KCd3YXJuJylcbiAgY29uc29sZS5lcnJvciA9IGNyZWF0ZVByb3h5KCdlcnJvcicpXG4gIGNvbnNvbGUuZGVidWcgPSBjcmVhdGVQcm94eSgnZGVidWcnKVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vXG4vLyBFZmZlY3QgTG9nZ2VyIC0+IExPRyBldmVudFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvL1xuXG5jb25zdCBsb2dMZXZlbFRvU3RyaW5nID0gKExvZ0xldmVsOiBhbnksIGxldmVsOiBhbnkpOiBMb2dFbnRyeVsnbGV2ZWwnXSA9PiB7XG4gIGlmIChMb2dMZXZlbC5ncmVhdGVyVGhhbkVxdWFsKGxldmVsLCBMb2dMZXZlbC5FcnJvcikpIHJldHVybiAnZXJyb3InXG4gIGlmIChMb2dMZXZlbC5ncmVhdGVyVGhhbkVxdWFsKGxldmVsLCBMb2dMZXZlbC5XYXJuaW5nKSkgcmV0dXJuICd3YXJuJ1xuICBpZiAoTG9nTGV2ZWwuZ3JlYXRlclRoYW5FcXVhbChsZXZlbCwgTG9nTGV2ZWwuSW5mbykpIHJldHVybiAnaW5mbydcbiAgcmV0dXJuICdkZWJ1Zydcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvL1xuLy8gVHJhY2UgY29sbGVjdGlvbiAoc2ltcGxpZmllZClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy9cblxubGV0IHRyYWNlSWRDb3VudGVyID0gMFxuY29uc3QgZ2VuZXJhdGVTcGFuSWQgPSAoKTogc3RyaW5nID0+IGBzcGFuLSR7Kyt0cmFjZUlkQ291bnRlcn0tJHtEYXRlLm5vdygpfWBcblxuY29uc3Qgc3RhcnRTcGFuID0gKG5hbWU6IHN0cmluZywgcGFyZW50U3BhbklkPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc3BhbklkID0gZ2VuZXJhdGVTcGFuSWQoKVxuICBwb3N0VHJhY2Uoe1xuICAgIHNwYW5JZCxcbiAgICBwYXJlbnRTcGFuSWQsXG4gICAgbmFtZSxcbiAgICBzdGFydFRpbWU6IERhdGUubm93KCksXG4gICAgc3RhdHVzOiAncnVubmluZycsXG4gIH0pXG4gIHJldHVybiBzcGFuSWRcbn1cblxuY29uc3QgZW5kU3BhbiA9IChzcGFuSWQ6IHN0cmluZywgc3RhdHVzOiAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ2NhbmNlbGxlZCcgPSAnc3VjY2VzcycpOiB2b2lkID0+IHtcbiAgcG9zdFRyYWNlKHtcbiAgICBzcGFuSWQsXG4gICAgbmFtZTogJycsXG4gICAgc3RhcnRUaW1lOiAwLFxuICAgIGVuZFRpbWU6IERhdGUubm93KCksXG4gICAgc3RhdHVzLFxuICB9KVxufVxuXG5jb25zdCByZWNvcmRIdHRwVHJhY2UgPSAoYXR0cnM6IHtcbiAgdXJsOiBzdHJpbmdcbiAgbWV0aG9kOiBzdHJpbmdcbiAgbW9kZTogJ21vY2snIHwgJ3JlYWwnXG4gIHN0YXR1cz86IG51bWJlclxuICBkZWxheU1zPzogbnVtYmVyXG4gIGR1cmF0aW9uPzogbnVtYmVyXG59KTogdm9pZCA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgcG9zdFRyYWNlKHtcbiAgICBzcGFuSWQ6IGdlbmVyYXRlU3BhbklkKCksXG4gICAgbmFtZTogYGh0dHAgJHthdHRycy5tZXRob2R9YCxcbiAgICBzdGFydFRpbWU6IG5vdyAtIChhdHRycy5kdXJhdGlvbiA/PyAwKSxcbiAgICBlbmRUaW1lOiBub3csXG4gICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgYXR0cmlidXRlczoge1xuICAgICAga2luZDogJ2h0dHAnLFxuICAgICAgdXJsOiBhdHRycy51cmwsXG4gICAgICBtZXRob2Q6IGF0dHJzLm1ldGhvZCxcbiAgICAgIG1vZGU6IGF0dHJzLm1vZGUsXG4gICAgICBzdGF0dXM6IGF0dHJzLnN0YXR1cyxcbiAgICAgIGRlbGF5TXM6IGF0dHJzLmRlbGF5TXMsXG4gICAgfSxcbiAgfSlcbn1cblxuY29uc3QgcmVjb3JkRGVidWdUcmFjZSA9IChldmVudDogdW5rbm93bik6IHZvaWQgPT4ge1xuICBwb3N0TG9nKHsgbGV2ZWw6ICdkZWJ1ZycsIHNvdXJjZTogJ2xvZ2l4JywgYXJnczogW2V2ZW50XSwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0pXG4gIGNvbnN0IGV2ZW50VHlwZSA9IChldmVudCBhcyBhbnkpPy50eXBlXG4gIGlmICh0eXBlb2YgZXZlbnRUeXBlID09PSAnc3RyaW5nJyAmJiBldmVudFR5cGUuc3RhcnRzV2l0aCgndHJhY2U6JykpIHtcbiAgICBwb3N0VHJhY2Uoe1xuICAgICAgc3BhbklkOiBnZW5lcmF0ZVNwYW5JZCgpLFxuICAgICAgbmFtZTogZXZlbnRUeXBlLFxuICAgICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgICBhdHRyaWJ1dGVzOiB7IC4uLih0eXBlb2YgZXZlbnQgPT09ICdvYmplY3QnICYmIGV2ZW50ID8gZXZlbnQgOiB7fSksIGtpbmQ6ICdsb2dpeC1kZWJ1ZycgfSxcbiAgICB9KVxuICB9XG59XG5cbmNvbnN0IHJlY29yZFNweVRyYWNlID0gKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgcG9zdFRyYWNlKHtcbiAgICBzcGFuSWQ6IGdlbmVyYXRlU3BhbklkKCksXG4gICAgbmFtZTogdHlwZW9mIHBheWxvYWQ/Lm5hbWUgPT09ICdzdHJpbmcnID8gcGF5bG9hZC5uYW1lIDogJ3NweScsXG4gICAgc3RhcnRUaW1lOiBub3csXG4gICAgZW5kVGltZTogbm93LFxuICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgIGF0dHJpYnV0ZXM6IHsga2luZDogJ3NweScsIC4uLnBheWxvYWQgfSxcbiAgfSlcbn1cblxuY29uc3QgcmVjb3JkVWlJbnRlbnRUcmFjZSA9IChwYWNrZXQ6IFVpSW50ZW50UGFja2V0KTogdm9pZCA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgcG9zdFRyYWNlKHtcbiAgICBzcGFuSWQ6IGdlbmVyYXRlU3BhbklkKCksXG4gICAgbmFtZTogYHVpOiR7cGFja2V0LmNvbXBvbmVudH06JHtwYWNrZXQuaW50ZW50fWAsXG4gICAgc3RhcnRUaW1lOiBub3csXG4gICAgZW5kVGltZTogbm93LFxuICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgIGludGVudElkOiBwYWNrZXQuaWQsXG4gICAgc3RlcElkOiBwYWNrZXQubWV0YT8uc3RlcElkLFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIGtpbmQ6ICd1aS1pbnRlbnQnLFxuICAgICAgaWQ6IHBhY2tldC5pZCxcbiAgICAgIGNvbXBvbmVudDogcGFja2V0LmNvbXBvbmVudCxcbiAgICAgIGludGVudDogcGFja2V0LmludGVudCxcbiAgICAgIHN0b3J5SWQ6IHBhY2tldC5tZXRhPy5zdG9yeUlkLFxuICAgICAgbGFiZWw6IHBhY2tldC5tZXRhPy5sYWJlbCxcbiAgICAgIHNldmVyaXR5OiBwYWNrZXQubWV0YT8uc2V2ZXJpdHksXG4gICAgICB0YWdzOiBwYWNrZXQubWV0YT8udGFncyxcbiAgICB9LFxuICB9KVxufVxuXG5sZXQgbG9naXhEZWJ1Z1NpbmtJbnN0YWxsZWQgPSBmYWxzZVxubGV0IGxvZ2l4RGVidWdTaW5rOiB7IHJlYWRvbmx5IHJlY29yZDogKGV2ZW50OiB1bmtub3duKSA9PiBhbnkgfSB8IHVuZGVmaW5lZFxuXG5jb25zdCByZXNvbHZlTG9naXhEZWJ1Z1NpbmsgPSBhc3luYyAoXG4gIEVmZmVjdFJ1bnRpbWU6ICh0eXBlb2YgaW1wb3J0KCdlZmZlY3QnKSlbJ0VmZmVjdCddLFxuKTogUHJvbWlzZTx7IGFwcGx5RGVidWc6IDxBLCBFLCBSPihlZmZlY3Q6IGFueSkgPT4gYW55IH0gfCBudWxsPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbG9naXggPSBhd2FpdCBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIGN1cnJlbnRLZXJuZWxVcmwpXG4gICAgaWYgKCFsb2dpeD8uRGVidWc/LmludGVybmFsPy5jdXJyZW50RGVidWdTaW5rcykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvLyBOT1RFOiBMb2dpeCBSdW50aW1lIGluc2lkZSBTYW5kYm94IG1heSBjcmVhdGUgYSBuZXcgcm9vdCBmaWJlciB2aWEgRWZmZWN0LnJ1blByb21pc2U7XG4gICAgLy8gRmliZXJSZWYubG9jYWxseSBkb2VzIG5vdCBhZmZlY3QgdGhvc2UgZmliZXJzLCBzbyB3ZSBuZWVkIHRvIHBhdGNoIEZpYmVyUmVmLmluaXRpYWwgaGVyZS5cbiAgICBpZiAoIWxvZ2l4RGVidWdTaW5rKSB7XG4gICAgICBsb2dpeERlYnVnU2luayA9IHtcbiAgICAgICAgcmVjb3JkOiAoZXZlbnQ6IHVua25vd24pID0+IEVmZmVjdFJ1bnRpbWUuc3luYygoKSA9PiByZWNvcmREZWJ1Z1RyYWNlKGV2ZW50KSksXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFsb2dpeERlYnVnU2lua0luc3RhbGxlZCkge1xuICAgICAgY29uc3Qgc2lua3NSZWYgPSBsb2dpeC5EZWJ1Zy5pbnRlcm5hbC5jdXJyZW50RGVidWdTaW5rcyBhcyBhbnlcbiAgICAgIGNvbnN0IGluaXRpYWxTaW5rczogdW5rbm93biA9IHNpbmtzUmVmLmluaXRpYWxcbiAgICAgIGNvbnN0IGJhc2UgPSBBcnJheS5pc0FycmF5KGluaXRpYWxTaW5rcykgPyAoaW5pdGlhbFNpbmtzIGFzIFJlYWRvbmx5QXJyYXk8dW5rbm93bj4pIDogW11cbiAgICAgIGlmICghYmFzZS5pbmNsdWRlcyhsb2dpeERlYnVnU2luaykpIHtcbiAgICAgICAgc2lua3NSZWYuaW5pdGlhbCA9IFsuLi5iYXNlLCBsb2dpeERlYnVnU2lua11cbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlhZ25vc3RpY3NSZWYgPSBsb2dpeC5EZWJ1Zy5pbnRlcm5hbC5jdXJyZW50RGlhZ25vc3RpY3NMZXZlbCBhcyBhbnlcbiAgICAgIGlmIChkaWFnbm9zdGljc1JlZi5pbml0aWFsID09PSAnb2ZmJykge1xuICAgICAgICBkaWFnbm9zdGljc1JlZi5pbml0aWFsID0gJ2xpZ2h0J1xuICAgICAgfVxuXG4gICAgICBsb2dpeERlYnVnU2lua0luc3RhbGxlZCA9IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXBwbHlEZWJ1ZzogPEEsIEUsIFI+KGVmZmVjdDogYW55KSA9PiBlZmZlY3QsXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbnR5cGUgTG9naXhTYW5kYm94QnJpZGdlID0ge1xuICByZWFkb25seSBlbWl0VWlJbnRlbnQ6IChwYWNrZXQ6IFVpSW50ZW50UGFja2V0KSA9PiB2b2lkXG4gIHJlYWRvbmx5IGVtaXRTcHk6IChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZFxufVxuXG5jb25zdCBMT0dJWF9TQU5EQk9YX0JSSURHRSA9IFN5bWJvbC5mb3IoJ0Bsb2dpeGpzL3NhbmRib3gvYnJpZGdlJylcblxuY29uc3QgZGVmaW5lSGlkZGVuID0gKHRhcmdldDogb2JqZWN0LCBrZXk6IFByb3BlcnR5S2V5LCB2YWx1ZTogdW5rbm93bik6IHZvaWQgPT4ge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICB2YWx1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICB9KVxufVxuXG4vLyBTYW5kYm94IFdvcmtlciBCcmlkZ2UgKGEgZnV0dXJlIGJpZGlyZWN0aW9uYWwgcHJvdG9jb2wgZW50cnkpOlxuLy8gLSBXb3JrZXIgZXhwb3NlcyBhIHN0YWJsZSBnbG9iYWwgYnJpZGdlIG9iamVjdCBmb3IgdXNlciBjb2RlIC8gU2VtYW50aWMgVUkgTW9jayAvIFVuaXZlcnNhbCBTcHkuXG4vLyAtIEF2b2lkIGBfXypgIG1hZ2ljIGZpZWxkcyB0byBwcmV2ZW50IGNvbmZ1c2lvbiB3aXRoIHRoZSBpbnRlcm5hbCBjb250cmFjdCBzeXN0ZW0gZnJvbSAwMjAuXG4vLyAtIEVudHJ5IHBvaW50czpcbi8vICAgLSBgZ2xvYmFsVGhpcy5sb2dpeFNhbmRib3hCcmlkZ2UuZW1pdFVpSW50ZW50KHBhY2tldClgXG4vLyAgIC0gYGdsb2JhbFRoaXMubG9naXhTYW5kYm94QnJpZGdlLmVtaXRTcHkocGF5bG9hZClgXG5jb25zdCBpbnN0YWxsU2FuZGJveEJyaWRnZSA9ICgpOiB2b2lkID0+IHtcbiAgY29uc3QgYnJpZGdlOiBMb2dpeFNhbmRib3hCcmlkZ2UgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlbWl0VWlJbnRlbnQ6IChwYWNrZXQ6IFVpSW50ZW50UGFja2V0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBwb3N0VWlJbnRlbnQocGFja2V0KVxuICAgICAgICByZWNvcmRVaUludGVudFRyYWNlKHBhY2tldClcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBpZ25vcmUgbWFsZm9ybWVkIHBhY2tldHNcbiAgICAgIH1cbiAgICB9LFxuICAgIGVtaXRTcHk6IChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVjb3JkU3B5VHJhY2UocGF5bG9hZCA/PyB7fSlcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBpZ25vcmUgbWFsZm9ybWVkIHBhY2tldHNcbiAgICAgIH1cbiAgICB9LFxuICB9KVxuXG4gIGRlZmluZUhpZGRlbihnbG9iYWxUaGlzIGFzIGFueSwgTE9HSVhfU0FOREJPWF9CUklER0UsIGJyaWRnZSlcbiAgZGVmaW5lSGlkZGVuKGdsb2JhbFRoaXMgYXMgYW55LCAnbG9naXhTYW5kYm94QnJpZGdlJywgYnJpZGdlKVxufVxuXG5pbnN0YWxsU2FuZGJveEJyaWRnZSgpXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy9cbi8vIEhUVFAgTW9jayAobWluaW1hbCk6IGludGVyY2VwdCBmZXRjaCBiYXNlZCBvbiBNb2NrTWFuaWZlc3QuaHR0cFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvL1xuXG5jb25zdCBzZXR1cEh0dHBQcm94eSA9IChtYW5pZmVzdD86IE1vY2tNYW5pZmVzdCk6IHZvaWQgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gIGNvbnN0IGdsb2JhbEZldGNoOiB0eXBlb2YgZmV0Y2ggfCB1bmRlZmluZWQgPSAoc2VsZiBhcyBhbnkpLmZldGNoXG4gIGlmICghZ2xvYmFsRmV0Y2gpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHJ1bGVzID0gbWFuaWZlc3Q/Lmh0dHBcbiAgaWYgKCFydWxlcyB8fCBydWxlcy5sZW5ndGggPT09IDApIHtcbiAgICA7KHNlbGYgYXMgYW55KS5mZXRjaCA9IGdsb2JhbEZldGNoXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBmaW5kUnVsZSA9ICh1cmw6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpOiBIdHRwTW9ja1J1bGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IHVwcGVyID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgICByZXR1cm4gcnVsZXMuZmluZCgocnVsZSkgPT4ge1xuICAgICAgY29uc3QgcnVsZU1ldGhvZCA9IHJ1bGUubWV0aG9kID8gcnVsZS5tZXRob2QudG9VcHBlckNhc2UoKSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgbWV0aG9kT2sgPSAhcnVsZU1ldGhvZCB8fCBydWxlTWV0aG9kID09PSB1cHBlclxuICAgICAgcmV0dXJuIG1ldGhvZE9rICYmIHJ1bGUudXJsID09PSB1cmxcbiAgICB9KVxuICB9XG5cbiAgOyhzZWxmIGFzIGFueSkuZmV0Y2ggPSBhc3luYyAoaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBVUkwgPyBTdHJpbmcoaW5wdXQpIDogaW5wdXQudXJsXG4gICAgICBjb25zdCBtZXRob2QgPSAoaW5pdD8ubWV0aG9kIHx8IChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QgPyBpbnB1dC5tZXRob2QgOiAnR0VUJykpLnRvVXBwZXJDYXNlKClcblxuICAgICAgY29uc3QgcnVsZSA9IGZpbmRSdWxlKHVybCwgbWV0aG9kKVxuICAgICAgaWYgKCFydWxlKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZ2xvYmFsRmV0Y2goaW5wdXQgYXMgYW55LCBpbml0IGFzIGFueSlcbiAgICAgICAgcmVjb3JkSHR0cFRyYWNlKHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIG1vZGU6ICdyZWFsJyxcbiAgICAgICAgICBzdGF0dXM6IHJlc3Auc3RhdHVzLFxuICAgICAgICAgIGR1cmF0aW9uOiBEYXRlLm5vdygpIC0gc3RhcnQsXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiByZXNwXG4gICAgICB9XG5cbiAgICAgIGlmIChydWxlLmRlbGF5TXMgJiYgcnVsZS5kZWxheU1zID4gMCkge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBydWxlLmRlbGF5TXMpKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBib2R5ID0gcnVsZS5qc29uID09PSB1bmRlZmluZWQgPyBudWxsIDogSlNPTi5zdHJpbmdpZnkocnVsZS5qc29uKVxuICAgICAgcmVjb3JkSHR0cFRyYWNlKHtcbiAgICAgICAgdXJsLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIG1vZGU6ICdtb2NrJyxcbiAgICAgICAgc3RhdHVzOiBydWxlLnN0YXR1cyA/PyAyMDAsXG4gICAgICAgIGRlbGF5TXM6IHJ1bGUuZGVsYXlNcyxcbiAgICAgIH0pXG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGJvZHksIHtcbiAgICAgICAgc3RhdHVzOiBydWxlLnN0YXR1cyA/PyAyMDAsXG4gICAgICAgIGhlYWRlcnM6IGJvZHkgPT09IG51bGwgPyB1bmRlZmluZWQgOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZ2xvYmFsRmV0Y2goaW5wdXQgYXMgYW55LCBpbml0IGFzIGFueSlcbiAgICB9XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvL1xuLy8gQ29tbWFuZCBoYW5kbGluZ1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvL1xuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVJbml0KHdhc21Vcmw/OiBzdHJpbmcsIGtlcm5lbFVybD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBzZXR1cENvbnNvbGVQcm94eSgpXG4gIHRyeSB7XG4gICAgYXdhaXQgaW5pdENvbXBpbGVyKHdhc21VcmwgPz8gREVGQVVMVF9XQVNNX1VSTClcbiAgICBjdXJyZW50S2VybmVsVXJsID0gdG9BYnNvbHV0ZVVybChrZXJuZWxVcmwgPz8gREVGQVVMVF9LRVJORUxfVVJMKVxuICAgIGN1cnJlbnRFZmZlY3RVcmwgPSB0b1NpYmxpbmdVcmwoY3VycmVudEtlcm5lbFVybCwgJ2VmZmVjdC5qcycpXG4gICAgc2V0S2VybmVsUGF0aChjdXJyZW50S2VybmVsVXJsKVxuICAgIGNvbnN0IG1hbmlmZXN0VXJsID0gdG9TaWJsaW5nVXJsKGN1cnJlbnRLZXJuZWxVcmwsICdsb2dpeC1jb3JlLm1hbmlmZXN0Lmpzb24nKVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKG1hbmlmZXN0VXJsKVxuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBcdTUyQTBcdThGN0QgQGxvZ2l4anMvY29yZSBcdTVCNTBcdThERUZcdTVGODRcdTZFMDVcdTUzNTVcdTU5MzFcdThEMjU6ICR7U3RyaW5nKHJlcy5zdGF0dXMpfSAke1N0cmluZyhyZXMuc3RhdHVzVGV4dCl9ICgke21hbmlmZXN0VXJsfSlgLFxuICAgICAgKVxuICAgIH1cbiAgICBjb25zdCBqc29uOiBhbnkgPSBhd2FpdCByZXMuanNvbigpXG4gICAgaWYgKCFqc29uIHx8ICFBcnJheS5pc0FycmF5KGpzb24uc3BlY2lmaWVycykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQGxvZ2l4anMvY29yZSBcdTVCNTBcdThERUZcdTVGODRcdTZFMDVcdTUzNTVcdTY4M0NcdTVGMEZcdTk3NUVcdTZDRDU6ICR7bWFuaWZlc3RVcmx9YClcbiAgICB9XG4gICAgc2V0TG9naXhDb3JlU3VicGF0aHMoanNvbi5zcGVjaWZpZXJzKVxuICAgIHBvc3RSZWFkeSh0cnVlKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHBvc3RFcnJvcignSU5JVF9GQUlMRUQnLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ29tcGlsZShjb2RlOiBzdHJpbmcsIGZpbGVuYW1lPzogc3RyaW5nLCBtb2NrTWFuaWZlc3Q/OiBNb2NrTWFuaWZlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc0luaXRpYWxpemVkKCkpIHtcbiAgICBwb3N0Q29tcGlsZVJlc3VsdChmYWxzZSwgdW5kZWZpbmVkLCBbJ1x1N0YxNlx1OEJEMVx1NTY2OFx1NjcyQVx1NTIxRFx1NTlDQlx1NTMxNiddKVxuICAgIHJldHVyblxuICB9XG4gIGN1cnJlbnRNb2NrTWFuaWZlc3QgPSBtb2NrTWFuaWZlc3RcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29tcGlsZShjb2RlLCBmaWxlbmFtZSlcbiAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgY29tcGlsZWRCdW5kbGUgPSByZXN1bHQuYnVuZGxlXG4gICAgcG9zdENvbXBpbGVSZXN1bHQodHJ1ZSwgcmVzdWx0LmJ1bmRsZSlcbiAgfSBlbHNlIHtcbiAgICBwb3N0Q29tcGlsZVJlc3VsdChmYWxzZSwgdW5kZWZpbmVkLCByZXN1bHQuZXJyb3JzKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVJ1bihydW5JZDogc3RyaW5nLCB1c2VDb21waWxlZENvZGU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGN1cnJlbnRSdW5JZCA9IHJ1bklkXG4gIHJ1blN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgY29uc3Qgcm9vdFNwYW5JZCA9IHN0YXJ0U3BhbihgcnVuOiR7cnVuSWR9YClcbiAgdWlJbnRlbnRzID0gW11cblxuICB0cnkge1xuICAgIGlmICghdXNlQ29tcGlsZWRDb2RlIHx8ICFjb21waWxlZEJ1bmRsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcdTY1RTBcdTUzRUZcdTc1MjhcdTc2ODRcdTdGMTZcdThCRDFcdTRFQTdcdTcyNjlcdUZGMENcdThCRjdcdTUxNDhcdTYyNjdcdTg4NEMgQ09NUElMRScpXG4gICAgfVxuXG4gICAgLy8gQ29uZmlndXJlIEhUVFAgbW9jayBiYXNlZCBvbiB0aGUgTW9ja01hbmlmZXN0IHByb3ZpZGVkIGJ5IHRoZSBtb3N0IHJlY2VudCBDT01QSUxFLlxuICAgIHNldHVwSHR0cFByb3h5KGN1cnJlbnRNb2NrTWFuaWZlc3QpXG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NvbXBpbGVkQnVuZGxlXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcgfSlcbiAgICBjb25zdCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IGltcG9ydCgvKiBAdml0ZS1pZ25vcmUgKi8gYmxvYlVybClcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVcmwpXG5cbiAgICBpZiAoIW1vZHVsZS5kZWZhdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1x1N0YxNlx1OEJEMVx1NEVBN1x1NzI2OVx1N0YzQVx1NUMxMSBkZWZhdWx0IFx1NUJGQ1x1NTFGQScpXG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3JhbSA9IG1vZHVsZS5kZWZhdWx0XG4gICAgY29uc3Qge1xuICAgICAgRWZmZWN0OiBFZmZlY3RSdW50aW1lLFxuICAgICAgTG9nZ2VyLFxuICAgICAgTG9nTGV2ZWwsXG4gICAgfSA9IChhd2FpdCBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIGN1cnJlbnRFZmZlY3RVcmwpKSBhcyB1bmtub3duIGFzIHR5cGVvZiBpbXBvcnQoJ2VmZmVjdCcpXG4gICAgY29uc3QgU2FuZGJveExvZ2dlciA9IExvZ2dlci5tYWtlPHVua25vd24sIHZvaWQ+KCh7IGxvZ0xldmVsLCBtZXNzYWdlIH06IGFueSkgPT4ge1xuICAgICAgY29uc3QgbGV2ZWwgPSBsb2dMZXZlbFRvU3RyaW5nKExvZ0xldmVsLCBsb2dMZXZlbClcbiAgICAgIHBvc3RMb2coeyBsZXZlbCwgYXJnczogW21lc3NhZ2VdLCB0aW1lc3RhbXA6IERhdGUubm93KCksIHNvdXJjZTogJ2VmZmVjdCcgfSlcbiAgICB9KVxuICAgIGNvbnN0IGRlYnVnSW50ZWdyYXRpb24gPSBhd2FpdCByZXNvbHZlTG9naXhEZWJ1Z1NpbmsoRWZmZWN0UnVudGltZSlcblxuICAgIGxldCBlZmZlY3RUb1J1biA9IEVmZmVjdFJ1bnRpbWUuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCByZXMgPSB5aWVsZCogcHJvZ3JhbVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH0pLnBpcGUoXG4gICAgICBFZmZlY3RSdW50aW1lLnByb3ZpZGUoTG9nZ2VyLnJlcGxhY2UoTG9nZ2VyLmRlZmF1bHRMb2dnZXIsIFNhbmRib3hMb2dnZXIpKSxcbiAgICAgIEVmZmVjdFJ1bnRpbWUud2l0aFNwYW4oYHNhbmRib3g6JHtydW5JZH1gKSxcbiAgICApXG5cbiAgICBpZiAoZGVidWdJbnRlZ3JhdGlvbikge1xuICAgICAgZWZmZWN0VG9SdW4gPSBkZWJ1Z0ludGVncmF0aW9uLmFwcGx5RGVidWcoZWZmZWN0VG9SdW4pXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRWZmZWN0UnVudGltZS5ydW5Qcm9taXNlKGVmZmVjdFRvUnVuIGFzIGFueSlcblxuICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHJ1blN0YXJ0VGltZVxuICAgIGVuZFNwYW4ocm9vdFNwYW5JZCwgJ3N1Y2Nlc3MnKVxuICAgIHBvc3RDb21wbGV0ZShydW5JZCwgZHVyYXRpb24sIHJlc3VsdClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBydW5TdGFydFRpbWVcbiAgICBlbmRTcGFuKHJvb3RTcGFuSWQsICdlcnJvcicpXG4gICAgcG9zdEVycm9yKFxuICAgICAgJ1JVTlRJTUVfRVJST1InLFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgIClcbiAgICBwb3N0Q29tcGxldGUocnVuSWQsIGR1cmF0aW9uKVxuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRlcm1pbmF0ZSgpOiB2b2lkIHtcbiAgaWYgKGN1cnJlbnRSdW5JZCkge1xuICAgIGN1cnJlbnRSdW5JZCA9IG51bGxcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVVaUNhbGxiYWNrKHBheWxvYWQ6IHtcbiAgcnVuSWQ6IHN0cmluZ1xuICBpbnRlbnRJZDogc3RyaW5nXG4gIGNhbGxiYWNrOiBzdHJpbmdcbiAgZGF0YT86IHVua25vd25cbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBGb3Igbm93IHdlIG9ubHkgcmVjb3JkIGNhbGxiYWNrcyBhcyBUUkFDRStMT0c7IGxhdGVyIHdlIGNhbiBzdGFuZGFyZGl6ZSBjYWxsYmFjayBuYW1lcyBhbmQgaW50ZWdyYXRlIHdpdGggdXNlciBjb2RlLlxuICAgIHBvc3RMb2coe1xuICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgIGFyZ3M6IFt7IHVpQ2FsbGJhY2s6IHBheWxvYWQgfV0sXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBzb3VyY2U6ICdsb2dpeCcsXG4gICAgfSlcbiAgICBwb3N0VHJhY2Uoe1xuICAgICAgc3BhbklkOiBnZW5lcmF0ZVNwYW5JZCgpLFxuICAgICAgbmFtZTogYHVpOmNhbGxiYWNrOiR7cGF5bG9hZC5jYWxsYmFja31gLFxuICAgICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgZW5kVGltZTogRGF0ZS5ub3coKSxcbiAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgaW50ZW50SWQ6IHBheWxvYWQuaW50ZW50SWQsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGtpbmQ6ICd1aS1jYWxsYmFjaycsXG4gICAgICAgIGNhbGxiYWNrOiBwYXlsb2FkLmNhbGxiYWNrLFxuICAgICAgICBkYXRhOiBwYXlsb2FkLmRhdGEsXG4gICAgICAgIHJ1bklkOiBwYXlsb2FkLnJ1bklkLFxuICAgICAgfSxcbiAgICB9KVxuICAgIHBvc3RFdmVudCh7XG4gICAgICB0eXBlOiAnVUlfQ0FMTEJBQ0tfQUNLJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgcnVuSWQ6IHBheWxvYWQucnVuSWQsXG4gICAgICAgIGludGVudElkOiBwYXlsb2FkLmludGVudElkLFxuICAgICAgICBjYWxsYmFjazogcGF5bG9hZC5jYWxsYmFjayxcbiAgICAgICAgYWNjZXB0ZWQ6IHRydWUsXG4gICAgICB9LFxuICAgIH0gYXMgYW55KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBwb3N0RXZlbnQoe1xuICAgICAgdHlwZTogJ1VJX0NBTExCQUNLX0FDSycsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIHJ1bklkOiBwYXlsb2FkLnJ1bklkLFxuICAgICAgICBpbnRlbnRJZDogcGF5bG9hZC5pbnRlbnRJZCxcbiAgICAgICAgY2FsbGJhY2s6IHBheWxvYWQuY2FsbGJhY2ssXG4gICAgICAgIGFjY2VwdGVkOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgfSxcbiAgICB9IGFzIGFueSlcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vXG4vLyBNZXNzYWdlIGxpc3RlbmVyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbnNlbGYub25tZXNzYWdlID0gYXN5bmMgKGU6IE1lc3NhZ2VFdmVudDxTYW5kYm94Q29tbWFuZD4pID0+IHtcbiAgY29uc3QgY29tbWFuZCA9IGUuZGF0YVxuICBzd2l0Y2ggKGNvbW1hbmQudHlwZSkge1xuICAgIGNhc2UgJ0lOSVQnOlxuICAgICAgYXdhaXQgaGFuZGxlSW5pdChjb21tYW5kLnBheWxvYWQ/Lndhc21VcmwsIGNvbW1hbmQucGF5bG9hZD8ua2VybmVsVXJsKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdDT01QSUxFJzpcbiAgICAgIGF3YWl0IGhhbmRsZUNvbXBpbGUoY29tbWFuZC5wYXlsb2FkLmNvZGUsIGNvbW1hbmQucGF5bG9hZC5maWxlbmFtZSwgY29tbWFuZC5wYXlsb2FkLm1vY2tNYW5pZmVzdClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnUlVOJzpcbiAgICAgIGF3YWl0IGhhbmRsZVJ1bihjb21tYW5kLnBheWxvYWQucnVuSWQsIGNvbW1hbmQucGF5bG9hZC51c2VDb21waWxlZENvZGUpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ1VJX0NBTExCQUNLJzpcbiAgICAgIGF3YWl0IGhhbmRsZVVpQ2FsbGJhY2soY29tbWFuZC5wYXlsb2FkKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdURVJNSU5BVEUnOlxuICAgICAgaGFuZGxlVGVybWluYXRlKClcbiAgICAgIGJyZWFrXG4gIH1cbn1cblxuY29uc29sZS5sb2coJ1tTYW5kYm94XSBXb3JrZXIgXHU4MTFBXHU2NzJDXHU1REYyXHU1MkEwXHU4RjdEJylcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBLEtBQUMsQ0FBQUEsWUFBUTtBQUNUO0FBQ0EsVUFBSUMsYUFBWSxPQUFPO0FBQ3ZCLFVBQUlDLG9CQUFtQixPQUFPO0FBQzlCLFVBQUlDLHFCQUFvQixPQUFPO0FBQy9CLFVBQUlDLGdCQUFlLE9BQU8sVUFBVTtBQUNwQyxVQUFJLFdBQVcsQ0FBQyxRQUFRLFFBQVE7QUFDOUIsaUJBQVMsUUFBUTtBQUNmLFVBQUFILFdBQVUsUUFBUSxNQUFNLEVBQUUsS0FBSyxJQUFJLElBQUksR0FBRyxZQUFZLEtBQUssQ0FBQztBQUFBLE1BQ2hFO0FBQ0EsVUFBSUksZUFBYyxDQUFDLElBQUksTUFBTSxRQUFRLFNBQVM7QUFDNUMsWUFBSSxRQUFRLE9BQU8sU0FBUyxZQUFZLE9BQU8sU0FBUyxZQUFZO0FBQ2xFLG1CQUFTLE9BQU9GLG1CQUFrQixJQUFJO0FBQ3BDLGdCQUFJLENBQUNDLGNBQWEsS0FBSyxJQUFJLEdBQUcsS0FBSyxRQUFRO0FBQ3pDLGNBQUFILFdBQVUs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O0FBQ0gsWUFBTSxjQUFjLFFBQVEsUUFBUSxNQUFNLFFBQVEsUUFBUSxVQUFVLFFBQVEsUUFBUSxZQUFZO0FBQ2hHO0FBQUEsSUFDRixLQUFLO0FBQ0gsWUFBTSxVQUFVLFFBQVEsUUFBUSxPQUFPLFFBQVEsUUFBUSxlQUFlO0FBQ3RFO0FBQUEsSUFDRixLQUFLO0FBQ0gsWUFBTSxpQkFBaUIsUUFBUSxPQUFPO0FBQ3RDO0FBQUEsSUFDRixLQUFLO0FBQ0gsc0JBQWdCO0FBQ2hCO0FBQUEsRUFDSjtBQUNGO0FBRUEsUUFBUSxJQUFJLGlEQUF3QjsiLAogICJuYW1lcyI6IFsibW9kdWxlIiwgIl9fZGVmUHJvcCIsICJfX2dldE93blByb3BEZXNjIiwgIl9fZ2V0T3duUHJvcE5hbWVzIiwgIl9faGFzT3duUHJvcCIsICJfX2NvcHlQcm9wcyIsICJidWlsZCIsICJpbml0aWFsaXplIiwgIl9fYXN5bmMiLCAib25tZXNzYWdlIiwgImdsb2JhbFRoaXMiLCAiZ28iLCAiYnVpbGQiLCAidG9BYnNvbHV0ZVVybCJdCn0K
3316
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2VzYnVpbGQtd2FzbUAwLjI3LjEvbm9kZV9tb2R1bGVzL2VzYnVpbGQtd2FzbS9saWIvYnJvd3Nlci5qcyIsICIuLi8uLi9zcmMvaW50ZXJuYWwvY29tcGlsZXIvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2ludGVybmFsL3dvcmtlci9zYW5kYm94Lndvcmtlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiKG1vZHVsZT0+e1xuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIF9fZ2V0T3duUHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbCkgPT4ge1xuICBmb3IgKHZhciBuYW1lIGluIGFsbClcbiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xufTtcbnZhciBfX2NvcHlQcm9wcyA9ICh0bywgZnJvbSwgZXhjZXB0LCBkZXNjKSA9PiB7XG4gIGlmIChmcm9tICYmIHR5cGVvZiBmcm9tID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBmcm9tID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBmb3IgKGxldCBrZXkgb2YgX19nZXRPd25Qcm9wTmFtZXMoZnJvbSkpXG4gICAgICBpZiAoIV9faGFzT3duUHJvcC5jYWxsKHRvLCBrZXkpICYmIGtleSAhPT0gZXhjZXB0KVxuICAgICAgICBfX2RlZlByb3AodG8sIGtleSwgeyBnZXQ6ICgpID0+IGZyb21ba2V5XSwgZW51bWVyYWJsZTogIShkZXNjID0gX19nZXRPd25Qcm9wRGVzYyhmcm9tLCBrZXkpKSB8fCBkZXNjLmVudW1lcmFibGUgfSk7XG4gIH1cbiAgcmV0dXJuIHRvO1xufTtcbnZhciBfX3RvQ29tbW9uSlMgPSAobW9kKSA9PiBfX2NvcHlQcm9wcyhfX2RlZlByb3Aoe30sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pLCBtb2QpO1xudmFyIF9fYXN5bmMgPSAoX190aGlzLCBfX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdmFyIGZ1bGZpbGxlZCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgcmVqZWN0ZWQgPSAodmFsdWUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yLnRocm93KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBzdGVwID0gKHgpID0+IHguZG9uZSA/IHJlc29sdmUoeC52YWx1ZSkgOiBQcm9taXNlLnJlc29sdmUoeC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkoX190aGlzLCBfX2FyZ3VtZW50cykpLm5leHQoKSk7XG4gIH0pO1xufTtcblxuLy8gbGliL25wbS9icm93c2VyLnRzXG52YXIgYnJvd3Nlcl9leHBvcnRzID0ge307XG5fX2V4cG9ydChicm93c2VyX2V4cG9ydHMsIHtcbiAgYW5hbHl6ZU1ldGFmaWxlOiAoKSA9PiBhbmFseXplTWV0YWZpbGUsXG4gIGFuYWx5emVNZXRhZmlsZVN5bmM6ICgpID0+IGFuYWx5emVNZXRhZmlsZVN5bmMsXG4gIGJ1aWxkOiAoKSA9PiBidWlsZCxcbiAgYnVpbGRTeW5jOiAoKSA9PiBidWlsZFN5bmMsXG4gIGNvbnRleHQ6ICgpID0+IGNvbnRleHQsXG4gIGRlZmF1bHQ6ICgpID0+IGJyb3dzZXJfZGVmYXVsdCxcbiAgZm9ybWF0TWVzc2FnZXM6ICgpID0+IGZvcm1hdE1lc3NhZ2VzLFxuICBmb3JtYXRNZXNzYWdlc1N5bmM6ICgpID0+IGZvcm1hdE1lc3NhZ2VzU3luYyxcbiAgaW5pdGlhbGl6ZTogKCkgPT4gaW5pdGlhbGl6ZSxcbiAgc3RvcDogKCkgPT4gc3RvcCxcbiAgdHJhbnNmb3JtOiAoKSA9PiB0cmFuc2Zvcm0sXG4gIHRyYW5zZm9ybVN5bmM6ICgpID0+IHRyYW5zZm9ybVN5bmMsXG4gIHZlcnNpb246ICgpID0+IHZlcnNpb25cbn0pO1xubW9kdWxlLmV4cG9ydHMgPSBfX3RvQ29tbW9uSlMoYnJvd3Nlcl9leHBvcnRzKTtcblxuLy8gbGliL3NoYXJlZC9zdGRpb19wcm90b2NvbC50c1xuZnVuY3Rpb24gZW5jb2RlUGFja2V0KHBhY2tldCkge1xuICBsZXQgdmlzaXQgPSAodmFsdWUpID0+IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGJiLndyaXRlOCgwKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGJiLndyaXRlOCgxKTtcbiAgICAgIGJiLndyaXRlOCgrdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBiYi53cml0ZTgoMik7XG4gICAgICBiYi53cml0ZTMyKHZhbHVlIHwgMCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGJiLndyaXRlOCgzKTtcbiAgICAgIGJiLndyaXRlKGVuY29kZVVURjgodmFsdWUpKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgYmIud3JpdGU4KDQpO1xuICAgICAgYmIud3JpdGUodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgYmIud3JpdGU4KDUpO1xuICAgICAgYmIud3JpdGUzMih2YWx1ZS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICB2aXNpdChpdGVtKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gICAgICBiYi53cml0ZTgoNik7XG4gICAgICBiYi53cml0ZTMyKGtleXMubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGJiLndyaXRlKGVuY29kZVVURjgoa2V5KSk7XG4gICAgICAgIHZpc2l0KHZhbHVlW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgbGV0IGJiID0gbmV3IEJ5dGVCdWZmZXIoKTtcbiAgYmIud3JpdGUzMigwKTtcbiAgYmIud3JpdGUzMihwYWNrZXQuaWQgPDwgMSB8ICshcGFja2V0LmlzUmVxdWVzdCk7XG4gIHZpc2l0KHBhY2tldC52YWx1ZSk7XG4gIHdyaXRlVUludDMyTEUoYmIuYnVmLCBiYi5sZW4gLSA0LCAwKTtcbiAgcmV0dXJuIGJiLmJ1Zi5zdWJhcnJheSgwLCBiYi5sZW4pO1xufVxuZnVuY3Rpb24gZGVjb2RlUGFja2V0KGJ5dGVzKSB7XG4gIGxldCB2aXNpdCA9ICgpID0+IHtcbiAgICBzd2l0Y2ggKGJiLnJlYWQ4KCkpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiAhIWJiLnJlYWQ4KCk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBiYi5yZWFkMzIoKTtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIGRlY29kZVVURjgoYmIucmVhZCgpKTtcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcmV0dXJuIGJiLnJlYWQoKTtcbiAgICAgIGNhc2UgNToge1xuICAgICAgICBsZXQgY291bnQgPSBiYi5yZWFkMzIoKTtcbiAgICAgICAgbGV0IHZhbHVlMiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICB2YWx1ZTIucHVzaCh2aXNpdCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUyO1xuICAgICAgfVxuICAgICAgY2FzZSA2OiB7XG4gICAgICAgIGxldCBjb3VudCA9IGJiLnJlYWQzMigpO1xuICAgICAgICBsZXQgdmFsdWUyID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgIHZhbHVlMltkZWNvZGVVVEY4KGJiLnJlYWQoKSldID0gdmlzaXQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUyO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWNrZXRcIik7XG4gICAgfVxuICB9O1xuICBsZXQgYmIgPSBuZXcgQnl0ZUJ1ZmZlcihieXRlcyk7XG4gIGxldCBpZCA9IGJiLnJlYWQzMigpO1xuICBsZXQgaXNSZXF1ZXN0ID0gKGlkICYgMSkgPT09IDA7XG4gIGlkID4+Pj0gMTtcbiAgbGV0IHZhbHVlID0gdmlzaXQoKTtcbiAgaWYgKGJiLnB0ciAhPT0gYnl0ZXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWNrZXRcIik7XG4gIH1cbiAgcmV0dXJuIHsgaWQsIGlzUmVxdWVzdCwgdmFsdWUgfTtcbn1cbnZhciBCeXRlQnVmZmVyID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihidWYgPSBuZXcgVWludDhBcnJheSgxMDI0KSkge1xuICAgIHRoaXMuYnVmID0gYnVmO1xuICAgIHRoaXMubGVuID0gMDtcbiAgICB0aGlzLnB0ciA9IDA7XG4gIH1cbiAgX3dyaXRlKGRlbHRhKSB7XG4gICAgaWYgKHRoaXMubGVuICsgZGVsdGEgPiB0aGlzLmJ1Zi5sZW5ndGgpIHtcbiAgICAgIGxldCBjbG9uZSA9IG5ldyBVaW50OEFycmF5KCh0aGlzLmxlbiArIGRlbHRhKSAqIDIpO1xuICAgICAgY2xvbmUuc2V0KHRoaXMuYnVmKTtcbiAgICAgIHRoaXMuYnVmID0gY2xvbmU7XG4gICAgfVxuICAgIHRoaXMubGVuICs9IGRlbHRhO1xuICAgIHJldHVybiB0aGlzLmxlbiAtIGRlbHRhO1xuICB9XG4gIHdyaXRlOCh2YWx1ZSkge1xuICAgIGxldCBvZmZzZXQgPSB0aGlzLl93cml0ZSgxKTtcbiAgICB0aGlzLmJ1ZltvZmZzZXRdID0gdmFsdWU7XG4gIH1cbiAgd3JpdGUzMih2YWx1ZSkge1xuICAgIGxldCBvZmZzZXQgPSB0aGlzLl93cml0ZSg0KTtcbiAgICB3cml0ZVVJbnQzMkxFKHRoaXMuYnVmLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgfVxuICB3cml0ZShieXRlcykge1xuICAgIGxldCBvZmZzZXQgPSB0aGlzLl93cml0ZSg0ICsgYnl0ZXMubGVuZ3RoKTtcbiAgICB3cml0ZVVJbnQzMkxFKHRoaXMuYnVmLCBieXRlcy5sZW5ndGgsIG9mZnNldCk7XG4gICAgdGhpcy5idWYuc2V0KGJ5dGVzLCBvZmZzZXQgKyA0KTtcbiAgfVxuICBfcmVhZChkZWx0YSkge1xuICAgIGlmICh0aGlzLnB0ciArIGRlbHRhID4gdGhpcy5idWYubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhY2tldFwiKTtcbiAgICB9XG4gICAgdGhpcy5wdHIgKz0gZGVsdGE7XG4gICAgcmV0dXJuIHRoaXMucHRyIC0gZGVsdGE7XG4gIH1cbiAgcmVhZDgoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmW3RoaXMuX3JlYWQoMSldO1xuICB9XG4gIHJlYWQzMigpIHtcbiAgICByZXR1cm4gcmVhZFVJbnQzMkxFKHRoaXMuYnVmLCB0aGlzLl9yZWFkKDQpKTtcbiAgfVxuICByZWFkKCkge1xuICAgIGxldCBsZW5ndGggPSB0aGlzLnJlYWQzMigpO1xuICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgbGV0IHB0ciA9IHRoaXMuX3JlYWQoYnl0ZXMubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQodGhpcy5idWYuc3ViYXJyYXkocHRyLCBwdHIgKyBsZW5ndGgpKTtcbiAgICByZXR1cm4gYnl0ZXM7XG4gIH1cbn07XG52YXIgZW5jb2RlVVRGODtcbnZhciBkZWNvZGVVVEY4O1xudmFyIGVuY29kZUludmFyaWFudDtcbmlmICh0eXBlb2YgVGV4dEVuY29kZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIFRleHREZWNvZGVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIGxldCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGxldCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGVuY29kZVVURjggPSAodGV4dCkgPT4gZW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gIGRlY29kZVVURjggPSAoYnl0ZXMpID0+IGRlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgZW5jb2RlSW52YXJpYW50ID0gJ25ldyBUZXh0RW5jb2RlcigpLmVuY29kZShcIlwiKSc7XG59IGVsc2UgaWYgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgZW5jb2RlVVRGOCA9ICh0ZXh0KSA9PiBCdWZmZXIuZnJvbSh0ZXh0KTtcbiAgZGVjb2RlVVRGOCA9IChieXRlcykgPT4ge1xuICAgIGxldCB7IGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCB9ID0gYnl0ZXM7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCkudG9TdHJpbmcoKTtcbiAgfTtcbiAgZW5jb2RlSW52YXJpYW50ID0gJ0J1ZmZlci5mcm9tKFwiXCIpJztcbn0gZWxzZSB7XG4gIHRocm93IG5ldyBFcnJvcihcIk5vIFVURi04IGNvZGVjIGZvdW5kXCIpO1xufVxuaWYgKCEoZW5jb2RlVVRGOChcIlwiKSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKVxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFyaWFudCB2aW9sYXRpb246IFwiJHtlbmNvZGVJbnZhcmlhbnR9IGluc3RhbmNlb2YgVWludDhBcnJheVwiIGlzIGluY29ycmVjdGx5IGZhbHNlXG5cblRoaXMgaW5kaWNhdGVzIHRoYXQgeW91ciBKYXZhU2NyaXB0IGVudmlyb25tZW50IGlzIGJyb2tlbi4gWW91IGNhbm5vdCB1c2VcbmVzYnVpbGQgaW4gdGhpcyBlbnZpcm9ubWVudCBiZWNhdXNlIGVzYnVpbGQgcmVsaWVzIG9uIHRoaXMgaW52YXJpYW50LiBUaGlzXG5pcyBub3QgYSBwcm9ibGVtIHdpdGggZXNidWlsZC4gWW91IG5lZWQgdG8gZml4IHlvdXIgZW52aXJvbm1lbnQgaW5zdGVhZC5cbmApO1xuZnVuY3Rpb24gcmVhZFVJbnQzMkxFKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiBidWZmZXJbb2Zmc2V0KytdIHwgYnVmZmVyW29mZnNldCsrXSA8PCA4IHwgYnVmZmVyW29mZnNldCsrXSA8PCAxNiB8IGJ1ZmZlcltvZmZzZXQrK10gPDwgMjQ7XG59XG5mdW5jdGlvbiB3cml0ZVVJbnQzMkxFKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICBidWZmZXJbb2Zmc2V0KytdID0gdmFsdWU7XG4gIGJ1ZmZlcltvZmZzZXQrK10gPSB2YWx1ZSA+PiA4O1xuICBidWZmZXJbb2Zmc2V0KytdID0gdmFsdWUgPj4gMTY7XG4gIGJ1ZmZlcltvZmZzZXQrK10gPSB2YWx1ZSA+PiAyNDtcbn1cblxuLy8gbGliL3NoYXJlZC9jb21tb24udHNcbnZhciBxdW90ZSA9IEpTT04uc3RyaW5naWZ5O1xudmFyIGJ1aWxkTG9nTGV2ZWxEZWZhdWx0ID0gXCJ3YXJuaW5nXCI7XG52YXIgdHJhbnNmb3JtTG9nTGV2ZWxEZWZhdWx0ID0gXCJzaWxlbnRcIjtcbmZ1bmN0aW9uIHZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KHZhbHVlcywgd2hhdCkge1xuICBjb25zdCB0b0pvaW4gPSBbXTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICB2YWxpZGF0ZVN0cmluZ1ZhbHVlKHZhbHVlLCB3aGF0KTtcbiAgICBpZiAodmFsdWUuaW5kZXhPZihcIixcIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7d2hhdH06ICR7dmFsdWV9YCk7XG4gICAgdG9Kb2luLnB1c2godmFsdWUpO1xuICB9XG4gIHJldHVybiB0b0pvaW4uam9pbihcIixcIik7XG59XG52YXIgY2FuQmVBbnl0aGluZyA9ICgpID0+IG51bGw7XG52YXIgbXVzdEJlQm9vbGVhbiA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiA/IG51bGwgOiBcImEgYm9vbGVhblwiO1xudmFyIG11c3RCZVN0cmluZyA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gbnVsbCA6IFwiYSBzdHJpbmdcIjtcbnZhciBtdXN0QmVSZWdFeHAgPSAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwID8gbnVsbCA6IFwiYSBSZWdFeHAgb2JqZWN0XCI7XG52YXIgbXVzdEJlSW50ZWdlciA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIHZhbHVlID09PSAodmFsdWUgfCAwKSA/IG51bGwgOiBcImFuIGludGVnZXJcIjtcbnZhciBtdXN0QmVWYWxpZFBvcnROdW1iZXIgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiB2YWx1ZSA9PT0gKHZhbHVlIHwgMCkgJiYgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSA2NTUzNSA/IG51bGwgOiBcImEgdmFsaWQgcG9ydCBudW1iZXJcIjtcbnZhciBtdXN0QmVGdW5jdGlvbiA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBudWxsIDogXCJhIGZ1bmN0aW9uXCI7XG52YXIgbXVzdEJlQXJyYXkgPSAodmFsdWUpID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gbnVsbCA6IFwiYW4gYXJyYXlcIjtcbnZhciBtdXN0QmVBcnJheU9mU3RyaW5ncyA9ICh2YWx1ZSkgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKHgpID0+IHR5cGVvZiB4ID09PSBcInN0cmluZ1wiKSA/IG51bGwgOiBcImFuIGFycmF5IG9mIHN0cmluZ3NcIjtcbnZhciBtdXN0QmVPYmplY3QgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBudWxsIDogXCJhbiBvYmplY3RcIjtcbnZhciBtdXN0QmVFbnRyeVBvaW50cyA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsID8gbnVsbCA6IFwiYW4gYXJyYXkgb3IgYW4gb2JqZWN0XCI7XG52YXIgbXVzdEJlV2ViQXNzZW1ibHlNb2R1bGUgPSAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlID8gbnVsbCA6IFwiYSBXZWJBc3NlbWJseS5Nb2R1bGVcIjtcbnZhciBtdXN0QmVPYmplY3RPck51bGwgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBudWxsIDogXCJhbiBvYmplY3Qgb3IgbnVsbFwiO1xudmFyIG11c3RCZVN0cmluZ09yQm9vbGVhbiA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgPyBudWxsIDogXCJhIHN0cmluZyBvciBhIGJvb2xlYW5cIjtcbnZhciBtdXN0QmVTdHJpbmdPck9iamVjdCA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBudWxsIDogXCJhIHN0cmluZyBvciBhbiBvYmplY3RcIjtcbnZhciBtdXN0QmVTdHJpbmdPckFycmF5T2ZTdHJpbmdzID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKHgpID0+IHR5cGVvZiB4ID09PSBcInN0cmluZ1wiKSA/IG51bGwgOiBcImEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3NcIjtcbnZhciBtdXN0QmVTdHJpbmdPclVpbnQ4QXJyYXkgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBudWxsIDogXCJhIHN0cmluZyBvciBhIFVpbnQ4QXJyYXlcIjtcbnZhciBtdXN0QmVTdHJpbmdPclVSTCA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlIGluc3RhbmNlb2YgVVJMID8gbnVsbCA6IFwiYSBzdHJpbmcgb3IgYSBVUkxcIjtcbmZ1bmN0aW9uIGdldEZsYWcob2JqZWN0LCBrZXlzLCBrZXksIG11c3RCZUZuKSB7XG4gIGxldCB2YWx1ZSA9IG9iamVjdFtrZXldO1xuICBrZXlzW2tleSArIFwiXCJdID0gdHJ1ZTtcbiAgaWYgKHZhbHVlID09PSB2b2lkIDApIHJldHVybiB2b2lkIDA7XG4gIGxldCBtdXN0QmUgPSBtdXN0QmVGbih2YWx1ZSk7XG4gIGlmIChtdXN0QmUgIT09IG51bGwpIHRocm93IG5ldyBFcnJvcihgJHtxdW90ZShrZXkpfSBtdXN0IGJlICR7bXVzdEJlfWApO1xuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBjaGVja0ZvckludmFsaWRGbGFncyhvYmplY3QsIGtleXMsIHdoZXJlKSB7XG4gIGZvciAobGV0IGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgaW4ga2V5cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcHRpb24gJHt3aGVyZX06ICR7cXVvdGUoa2V5KX1gKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlSW5pdGlhbGl6ZU9wdGlvbnMob3B0aW9ucykge1xuICBsZXQga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgd2FzbVVSTCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ3YXNtVVJMXCIsIG11c3RCZVN0cmluZ09yVVJMKTtcbiAgbGV0IHdhc21Nb2R1bGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwid2FzbU1vZHVsZVwiLCBtdXN0QmVXZWJBc3NlbWJseU1vZHVsZSk7XG4gIGxldCB3b3JrZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwid29ya2VyXCIsIG11c3RCZUJvb2xlYW4pO1xuICBjaGVja0ZvckludmFsaWRGbGFncyhvcHRpb25zLCBrZXlzLCBcImluIGluaXRpYWxpemUoKSBjYWxsXCIpO1xuICByZXR1cm4ge1xuICAgIHdhc21VUkwsXG4gICAgd2FzbU1vZHVsZSxcbiAgICB3b3JrZXJcbiAgfTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlTWFuZ2xlQ2FjaGUobWFuZ2xlQ2FjaGUpIHtcbiAgbGV0IHZhbGlkYXRlZDtcbiAgaWYgKG1hbmdsZUNhY2hlICE9PSB2b2lkIDApIHtcbiAgICB2YWxpZGF0ZWQgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBrZXkgaW4gbWFuZ2xlQ2FjaGUpIHtcbiAgICAgIGxldCB2YWx1ZSA9IG1hbmdsZUNhY2hlW2tleV07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICB2YWxpZGF0ZWRba2V5XSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke3F1b3RlKGtleSl9IGluIG1hbmdsZSBjYWNoZSB0byBtYXAgdG8gZWl0aGVyIGEgc3RyaW5nIG9yIGZhbHNlYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWxpZGF0ZWQ7XG59XG5mdW5jdGlvbiBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMsIGlzVFRZLCBsb2dMZXZlbERlZmF1bHQpIHtcbiAgbGV0IGNvbG9yID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImNvbG9yXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbG9nTGV2ZWwgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibG9nTGV2ZWxcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGxvZ0xpbWl0ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvZ0xpbWl0XCIsIG11c3RCZUludGVnZXIpO1xuICBpZiAoY29sb3IgIT09IHZvaWQgMCkgZmxhZ3MucHVzaChgLS1jb2xvcj0ke2NvbG9yfWApO1xuICBlbHNlIGlmIChpc1RUWSkgZmxhZ3MucHVzaChgLS1jb2xvcj10cnVlYCk7XG4gIGZsYWdzLnB1c2goYC0tbG9nLWxldmVsPSR7bG9nTGV2ZWwgfHwgbG9nTGV2ZWxEZWZhdWx0fWApO1xuICBmbGFncy5wdXNoKGAtLWxvZy1saW1pdD0ke2xvZ0xpbWl0IHx8IDB9YCk7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZ1ZhbHVlKHZhbHVlLCB3aGF0LCBrZXkpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdmFsdWUgZm9yICR7d2hhdH0ke2tleSAhPT0gdm9pZCAwID8gXCIgXCIgKyBxdW90ZShrZXkpIDogXCJcIn0gdG8gYmUgYSBzdHJpbmcsIGdvdCAke3R5cGVvZiB2YWx1ZX0gaW5zdGVhZGApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHB1c2hDb21tb25GbGFncyhmbGFncywgb3B0aW9ucywga2V5cykge1xuICBsZXQgbGVnYWxDb21tZW50cyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJsZWdhbENvbW1lbnRzXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBzb3VyY2VSb290ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInNvdXJjZVJvb3RcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IHNvdXJjZXNDb250ZW50ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInNvdXJjZXNDb250ZW50XCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgdGFyZ2V0ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInRhcmdldFwiLCBtdXN0QmVTdHJpbmdPckFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IGZvcm1hdCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJmb3JtYXRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGdsb2JhbE5hbWUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZ2xvYmFsTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgbWFuZ2xlUHJvcHMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlUHJvcHNcIiwgbXVzdEJlUmVnRXhwKTtcbiAgbGV0IHJlc2VydmVQcm9wcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJyZXNlcnZlUHJvcHNcIiwgbXVzdEJlUmVnRXhwKTtcbiAgbGV0IG1hbmdsZVF1b3RlZCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJtYW5nbGVRdW90ZWRcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBtaW5pZnkgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWluaWZ5XCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWluaWZ5U3ludGF4ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1pbmlmeVN5bnRheFwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IG1pbmlmeVdoaXRlc3BhY2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWluaWZ5V2hpdGVzcGFjZVwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IG1pbmlmeUlkZW50aWZpZXJzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1pbmlmeUlkZW50aWZpZXJzXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbGluZUxpbWl0ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxpbmVMaW1pdFwiLCBtdXN0QmVJbnRlZ2VyKTtcbiAgbGV0IGRyb3AgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZHJvcFwiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gIGxldCBkcm9wTGFiZWxzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImRyb3BMYWJlbHNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgY2hhcnNldCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJjaGFyc2V0XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCB0cmVlU2hha2luZyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ0cmVlU2hha2luZ1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGlnbm9yZUFubm90YXRpb25zID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImlnbm9yZUFubm90YXRpb25zXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQganN4ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImpzeFwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQganN4RmFjdG9yeSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hGYWN0b3J5XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBqc3hGcmFnbWVudCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hGcmFnbWVudFwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQganN4SW1wb3J0U291cmNlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImpzeEltcG9ydFNvdXJjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQganN4RGV2ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImpzeERldlwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGpzeFNpZGVFZmZlY3RzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImpzeFNpZGVFZmZlY3RzXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgZGVmaW5lID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImRlZmluZVwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgbG9nT3ZlcnJpZGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibG9nT3ZlcnJpZGVcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IHN1cHBvcnRlZCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzdXBwb3J0ZWRcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IHB1cmUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwicHVyZVwiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gIGxldCBrZWVwTmFtZXMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwia2VlcE5hbWVzXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgcGxhdGZvcm0gPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwicGxhdGZvcm1cIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IHRzY29uZmlnUmF3ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInRzY29uZmlnUmF3XCIsIG11c3RCZVN0cmluZ09yT2JqZWN0KTtcbiAgbGV0IGFic1BhdGhzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImFic1BhdGhzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgaWYgKGxlZ2FsQ29tbWVudHMpIGZsYWdzLnB1c2goYC0tbGVnYWwtY29tbWVudHM9JHtsZWdhbENvbW1lbnRzfWApO1xuICBpZiAoc291cmNlUm9vdCAhPT0gdm9pZCAwKSBmbGFncy5wdXNoKGAtLXNvdXJjZS1yb290PSR7c291cmNlUm9vdH1gKTtcbiAgaWYgKHNvdXJjZXNDb250ZW50ICE9PSB2b2lkIDApIGZsYWdzLnB1c2goYC0tc291cmNlcy1jb250ZW50PSR7c291cmNlc0NvbnRlbnR9YCk7XG4gIGlmICh0YXJnZXQpIGZsYWdzLnB1c2goYC0tdGFyZ2V0PSR7dmFsaWRhdGVBbmRKb2luU3RyaW5nQXJyYXkoQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0IDogW3RhcmdldF0sIFwidGFyZ2V0XCIpfWApO1xuICBpZiAoZm9ybWF0KSBmbGFncy5wdXNoKGAtLWZvcm1hdD0ke2Zvcm1hdH1gKTtcbiAgaWYgKGdsb2JhbE5hbWUpIGZsYWdzLnB1c2goYC0tZ2xvYmFsLW5hbWU9JHtnbG9iYWxOYW1lfWApO1xuICBpZiAocGxhdGZvcm0pIGZsYWdzLnB1c2goYC0tcGxhdGZvcm09JHtwbGF0Zm9ybX1gKTtcbiAgaWYgKHRzY29uZmlnUmF3KSBmbGFncy5wdXNoKGAtLXRzY29uZmlnLXJhdz0ke3R5cGVvZiB0c2NvbmZpZ1JhdyA9PT0gXCJzdHJpbmdcIiA/IHRzY29uZmlnUmF3IDogSlNPTi5zdHJpbmdpZnkodHNjb25maWdSYXcpfWApO1xuICBpZiAobWluaWZ5KSBmbGFncy5wdXNoKFwiLS1taW5pZnlcIik7XG4gIGlmIChtaW5pZnlTeW50YXgpIGZsYWdzLnB1c2goXCItLW1pbmlmeS1zeW50YXhcIik7XG4gIGlmIChtaW5pZnlXaGl0ZXNwYWNlKSBmbGFncy5wdXNoKFwiLS1taW5pZnktd2hpdGVzcGFjZVwiKTtcbiAgaWYgKG1pbmlmeUlkZW50aWZpZXJzKSBmbGFncy5wdXNoKFwiLS1taW5pZnktaWRlbnRpZmllcnNcIik7XG4gIGlmIChsaW5lTGltaXQpIGZsYWdzLnB1c2goYC0tbGluZS1saW1pdD0ke2xpbmVMaW1pdH1gKTtcbiAgaWYgKGNoYXJzZXQpIGZsYWdzLnB1c2goYC0tY2hhcnNldD0ke2NoYXJzZXR9YCk7XG4gIGlmICh0cmVlU2hha2luZyAhPT0gdm9pZCAwKSBmbGFncy5wdXNoKGAtLXRyZWUtc2hha2luZz0ke3RyZWVTaGFraW5nfWApO1xuICBpZiAoaWdub3JlQW5ub3RhdGlvbnMpIGZsYWdzLnB1c2goYC0taWdub3JlLWFubm90YXRpb25zYCk7XG4gIGlmIChkcm9wKSBmb3IgKGxldCB3aGF0IG9mIGRyb3ApIGZsYWdzLnB1c2goYC0tZHJvcDoke3ZhbGlkYXRlU3RyaW5nVmFsdWUod2hhdCwgXCJkcm9wXCIpfWApO1xuICBpZiAoZHJvcExhYmVscykgZmxhZ3MucHVzaChgLS1kcm9wLWxhYmVscz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KGRyb3BMYWJlbHMsIFwiZHJvcCBsYWJlbFwiKX1gKTtcbiAgaWYgKGFic1BhdGhzKSBmbGFncy5wdXNoKGAtLWFicy1wYXRocz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KGFic1BhdGhzLCBcImFicyBwYXRoc1wiKX1gKTtcbiAgaWYgKG1hbmdsZVByb3BzKSBmbGFncy5wdXNoKGAtLW1hbmdsZS1wcm9wcz0ke2pzUmVnRXhwVG9Hb1JlZ0V4cChtYW5nbGVQcm9wcyl9YCk7XG4gIGlmIChyZXNlcnZlUHJvcHMpIGZsYWdzLnB1c2goYC0tcmVzZXJ2ZS1wcm9wcz0ke2pzUmVnRXhwVG9Hb1JlZ0V4cChyZXNlcnZlUHJvcHMpfWApO1xuICBpZiAobWFuZ2xlUXVvdGVkICE9PSB2b2lkIDApIGZsYWdzLnB1c2goYC0tbWFuZ2xlLXF1b3RlZD0ke21hbmdsZVF1b3RlZH1gKTtcbiAgaWYgKGpzeCkgZmxhZ3MucHVzaChgLS1qc3g9JHtqc3h9YCk7XG4gIGlmIChqc3hGYWN0b3J5KSBmbGFncy5wdXNoKGAtLWpzeC1mYWN0b3J5PSR7anN4RmFjdG9yeX1gKTtcbiAgaWYgKGpzeEZyYWdtZW50KSBmbGFncy5wdXNoKGAtLWpzeC1mcmFnbWVudD0ke2pzeEZyYWdtZW50fWApO1xuICBpZiAoanN4SW1wb3J0U291cmNlKSBmbGFncy5wdXNoKGAtLWpzeC1pbXBvcnQtc291cmNlPSR7anN4SW1wb3J0U291cmNlfWApO1xuICBpZiAoanN4RGV2KSBmbGFncy5wdXNoKGAtLWpzeC1kZXZgKTtcbiAgaWYgKGpzeFNpZGVFZmZlY3RzKSBmbGFncy5wdXNoKGAtLWpzeC1zaWRlLWVmZmVjdHNgKTtcbiAgaWYgKGRlZmluZSkge1xuICAgIGZvciAobGV0IGtleSBpbiBkZWZpbmUpIHtcbiAgICAgIGlmIChrZXkuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlZmluZTogJHtrZXl9YCk7XG4gICAgICBmbGFncy5wdXNoKGAtLWRlZmluZToke2tleX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGRlZmluZVtrZXldLCBcImRlZmluZVwiLCBrZXkpfWApO1xuICAgIH1cbiAgfVxuICBpZiAobG9nT3ZlcnJpZGUpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gbG9nT3ZlcnJpZGUpIHtcbiAgICAgIGlmIChrZXkuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGxvZyBvdmVycmlkZTogJHtrZXl9YCk7XG4gICAgICBmbGFncy5wdXNoKGAtLWxvZy1vdmVycmlkZToke2tleX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGxvZ092ZXJyaWRlW2tleV0sIFwibG9nIG92ZXJyaWRlXCIsIGtleSl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChzdXBwb3J0ZWQpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gc3VwcG9ydGVkKSB7XG4gICAgICBpZiAoa2V5LmluZGV4T2YoXCI9XCIpID49IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzdXBwb3J0ZWQ6ICR7a2V5fWApO1xuICAgICAgY29uc3QgdmFsdWUgPSBzdXBwb3J0ZWRba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiYm9vbGVhblwiKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHZhbHVlIGZvciBzdXBwb3J0ZWQgJHtxdW90ZShrZXkpfSB0byBiZSBhIGJvb2xlYW4sIGdvdCAke3R5cGVvZiB2YWx1ZX0gaW5zdGVhZGApO1xuICAgICAgZmxhZ3MucHVzaChgLS1zdXBwb3J0ZWQ6JHtrZXl9PSR7dmFsdWV9YCk7XG4gICAgfVxuICB9XG4gIGlmIChwdXJlKSBmb3IgKGxldCBmbiBvZiBwdXJlKSBmbGFncy5wdXNoKGAtLXB1cmU6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGZuLCBcInB1cmVcIil9YCk7XG4gIGlmIChrZWVwTmFtZXMpIGZsYWdzLnB1c2goYC0ta2VlcC1uYW1lc2ApO1xufVxuZnVuY3Rpb24gZmxhZ3NGb3JCdWlsZE9wdGlvbnMoY2FsbE5hbWUsIG9wdGlvbnMsIGlzVFRZLCBsb2dMZXZlbERlZmF1bHQsIHdyaXRlRGVmYXVsdCkge1xuICB2YXIgX2E7XG4gIGxldCBmbGFncyA9IFtdO1xuICBsZXQgZW50cmllcyA9IFtdO1xuICBsZXQga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgc3RkaW5Db250ZW50cyA9IG51bGw7XG4gIGxldCBzdGRpblJlc29sdmVEaXIgPSBudWxsO1xuICBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMsIGlzVFRZLCBsb2dMZXZlbERlZmF1bHQpO1xuICBwdXNoQ29tbW9uRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMpO1xuICBsZXQgc291cmNlbWFwID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInNvdXJjZW1hcFwiLCBtdXN0QmVTdHJpbmdPckJvb2xlYW4pO1xuICBsZXQgYnVuZGxlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImJ1bmRsZVwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IHNwbGl0dGluZyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzcGxpdHRpbmdcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBwcmVzZXJ2ZVN5bWxpbmtzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInByZXNlcnZlU3ltbGlua3NcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBtZXRhZmlsZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJtZXRhZmlsZVwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IG91dGZpbGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwib3V0ZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgb3V0ZGlyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm91dGRpclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgb3V0YmFzZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJvdXRiYXNlXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCB0c2NvbmZpZyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ0c2NvbmZpZ1wiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgcmVzb2x2ZUV4dGVuc2lvbnMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwicmVzb2x2ZUV4dGVuc2lvbnNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgbm9kZVBhdGhzSW5wdXQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibm9kZVBhdGhzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IG1haW5GaWVsZHMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFpbkZpZWxkc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gIGxldCBjb25kaXRpb25zID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImNvbmRpdGlvbnNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgZXh0ZXJuYWwgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZXh0ZXJuYWxcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgcGFja2FnZXMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwicGFja2FnZXNcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGFsaWFzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImFsaWFzXCIsIG11c3RCZU9iamVjdCk7XG4gIGxldCBsb2FkZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibG9hZGVyXCIsIG11c3RCZU9iamVjdCk7XG4gIGxldCBvdXRFeHRlbnNpb24gPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwib3V0RXh0ZW5zaW9uXCIsIG11c3RCZU9iamVjdCk7XG4gIGxldCBwdWJsaWNQYXRoID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInB1YmxpY1BhdGhcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGVudHJ5TmFtZXMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZW50cnlOYW1lc1wiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgY2h1bmtOYW1lcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJjaHVua05hbWVzXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBhc3NldE5hbWVzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImFzc2V0TmFtZXNcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGluamVjdCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJpbmplY3RcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgYmFubmVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImJhbm5lclwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgZm9vdGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImZvb3RlclwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgZW50cnlQb2ludHMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZW50cnlQb2ludHNcIiwgbXVzdEJlRW50cnlQb2ludHMpO1xuICBsZXQgYWJzV29ya2luZ0RpciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJhYnNXb3JraW5nRGlyXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBzdGRpbiA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzdGRpblwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgd3JpdGUgPSAoX2EgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwid3JpdGVcIiwgbXVzdEJlQm9vbGVhbikpICE9IG51bGwgPyBfYSA6IHdyaXRlRGVmYXVsdDtcbiAgbGV0IGFsbG93T3ZlcndyaXRlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImFsbG93T3ZlcndyaXRlXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWFuZ2xlQ2FjaGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlQ2FjaGVcIiwgbXVzdEJlT2JqZWN0KTtcbiAga2V5cy5wbHVnaW5zID0gdHJ1ZTtcbiAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5cywgYGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICBpZiAoc291cmNlbWFwKSBmbGFncy5wdXNoKGAtLXNvdXJjZW1hcCR7c291cmNlbWFwID09PSB0cnVlID8gXCJcIiA6IGA9JHtzb3VyY2VtYXB9YH1gKTtcbiAgaWYgKGJ1bmRsZSkgZmxhZ3MucHVzaChcIi0tYnVuZGxlXCIpO1xuICBpZiAoYWxsb3dPdmVyd3JpdGUpIGZsYWdzLnB1c2goXCItLWFsbG93LW92ZXJ3cml0ZVwiKTtcbiAgaWYgKHNwbGl0dGluZykgZmxhZ3MucHVzaChcIi0tc3BsaXR0aW5nXCIpO1xuICBpZiAocHJlc2VydmVTeW1saW5rcykgZmxhZ3MucHVzaChcIi0tcHJlc2VydmUtc3ltbGlua3NcIik7XG4gIGlmIChtZXRhZmlsZSkgZmxhZ3MucHVzaChgLS1tZXRhZmlsZWApO1xuICBpZiAob3V0ZmlsZSkgZmxhZ3MucHVzaChgLS1vdXRmaWxlPSR7b3V0ZmlsZX1gKTtcbiAgaWYgKG91dGRpcikgZmxhZ3MucHVzaChgLS1vdXRkaXI9JHtvdXRkaXJ9YCk7XG4gIGlmIChvdXRiYXNlKSBmbGFncy5wdXNoKGAtLW91dGJhc2U9JHtvdXRiYXNlfWApO1xuICBpZiAodHNjb25maWcpIGZsYWdzLnB1c2goYC0tdHNjb25maWc9JHt0c2NvbmZpZ31gKTtcbiAgaWYgKHBhY2thZ2VzKSBmbGFncy5wdXNoKGAtLXBhY2thZ2VzPSR7cGFja2FnZXN9YCk7XG4gIGlmIChyZXNvbHZlRXh0ZW5zaW9ucykgZmxhZ3MucHVzaChgLS1yZXNvbHZlLWV4dGVuc2lvbnM9JHt2YWxpZGF0ZUFuZEpvaW5TdHJpbmdBcnJheShyZXNvbHZlRXh0ZW5zaW9ucywgXCJyZXNvbHZlIGV4dGVuc2lvblwiKX1gKTtcbiAgaWYgKHB1YmxpY1BhdGgpIGZsYWdzLnB1c2goYC0tcHVibGljLXBhdGg9JHtwdWJsaWNQYXRofWApO1xuICBpZiAoZW50cnlOYW1lcykgZmxhZ3MucHVzaChgLS1lbnRyeS1uYW1lcz0ke2VudHJ5TmFtZXN9YCk7XG4gIGlmIChjaHVua05hbWVzKSBmbGFncy5wdXNoKGAtLWNodW5rLW5hbWVzPSR7Y2h1bmtOYW1lc31gKTtcbiAgaWYgKGFzc2V0TmFtZXMpIGZsYWdzLnB1c2goYC0tYXNzZXQtbmFtZXM9JHthc3NldE5hbWVzfWApO1xuICBpZiAobWFpbkZpZWxkcykgZmxhZ3MucHVzaChgLS1tYWluLWZpZWxkcz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KG1haW5GaWVsZHMsIFwibWFpbiBmaWVsZFwiKX1gKTtcbiAgaWYgKGNvbmRpdGlvbnMpIGZsYWdzLnB1c2goYC0tY29uZGl0aW9ucz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KGNvbmRpdGlvbnMsIFwiY29uZGl0aW9uXCIpfWApO1xuICBpZiAoZXh0ZXJuYWwpIGZvciAobGV0IG5hbWUgb2YgZXh0ZXJuYWwpIGZsYWdzLnB1c2goYC0tZXh0ZXJuYWw6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKG5hbWUsIFwiZXh0ZXJuYWxcIil9YCk7XG4gIGlmIChhbGlhcykge1xuICAgIGZvciAobGV0IG9sZCBpbiBhbGlhcykge1xuICAgICAgaWYgKG9sZC5pbmRleE9mKFwiPVwiKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFja2FnZSBuYW1lIGluIGFsaWFzOiAke29sZH1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tYWxpYXM6JHtvbGR9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShhbGlhc1tvbGRdLCBcImFsaWFzXCIsIG9sZCl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChiYW5uZXIpIHtcbiAgICBmb3IgKGxldCB0eXBlIGluIGJhbm5lcikge1xuICAgICAgaWYgKHR5cGUuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGJhbm5lciBmaWxlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tYmFubmVyOiR7dHlwZX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGJhbm5lclt0eXBlXSwgXCJiYW5uZXJcIiwgdHlwZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChmb290ZXIpIHtcbiAgICBmb3IgKGxldCB0eXBlIGluIGZvb3Rlcikge1xuICAgICAgaWYgKHR5cGUuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvb3RlciBmaWxlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tZm9vdGVyOiR7dHlwZX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGZvb3Rlclt0eXBlXSwgXCJmb290ZXJcIiwgdHlwZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChpbmplY3QpIGZvciAobGV0IHBhdGggb2YgaW5qZWN0KSBmbGFncy5wdXNoKGAtLWluamVjdDoke3ZhbGlkYXRlU3RyaW5nVmFsdWUocGF0aCwgXCJpbmplY3RcIil9YCk7XG4gIGlmIChsb2FkZXIpIHtcbiAgICBmb3IgKGxldCBleHQgaW4gbG9hZGVyKSB7XG4gICAgICBpZiAoZXh0LmluZGV4T2YoXCI9XCIpID49IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb2FkZXIgZXh0ZW5zaW9uOiAke2V4dH1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tbG9hZGVyOiR7ZXh0fT0ke3ZhbGlkYXRlU3RyaW5nVmFsdWUobG9hZGVyW2V4dF0sIFwibG9hZGVyXCIsIGV4dCl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChvdXRFeHRlbnNpb24pIHtcbiAgICBmb3IgKGxldCBleHQgaW4gb3V0RXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZXh0LmluZGV4T2YoXCI9XCIpID49IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvdXQgZXh0ZW5zaW9uOiAke2V4dH1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tb3V0LWV4dGVuc2lvbjoke2V4dH09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKG91dEV4dGVuc2lvbltleHRdLCBcIm91dCBleHRlbnNpb25cIiwgZXh0KX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKGVudHJ5UG9pbnRzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZW50cnlQb2ludHMpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbiA9IGVudHJ5UG9pbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICBsZXQgZW50cnlQb2ludCA9IGVudHJ5UG9pbnRzW2ldO1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5UG9pbnQgPT09IFwib2JqZWN0XCIgJiYgZW50cnlQb2ludCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxldCBlbnRyeVBvaW50S2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGxldCBpbnB1dCA9IGdldEZsYWcoZW50cnlQb2ludCwgZW50cnlQb2ludEtleXMsIFwiaW5cIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgb3V0cHV0ID0gZ2V0RmxhZyhlbnRyeVBvaW50LCBlbnRyeVBvaW50S2V5cywgXCJvdXRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhlbnRyeVBvaW50LCBlbnRyeVBvaW50S2V5cywgXCJpbiBlbnRyeSBwb2ludCBhdCBpbmRleCBcIiArIGkpO1xuICAgICAgICAgIGlmIChpbnB1dCA9PT0gdm9pZCAwKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJvcGVydHkgXCJpblwiIGZvciBlbnRyeSBwb2ludCBhdCBpbmRleCAnICsgaSk7XG4gICAgICAgICAgaWYgKG91dHB1dCA9PT0gdm9pZCAwKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJvcGVydHkgXCJvdXRcIiBmb3IgZW50cnkgcG9pbnQgYXQgaW5kZXggJyArIGkpO1xuICAgICAgICAgIGVudHJpZXMucHVzaChbb3V0cHV0LCBpbnB1dF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudHJpZXMucHVzaChbXCJcIiwgdmFsaWRhdGVTdHJpbmdWYWx1ZShlbnRyeVBvaW50LCBcImVudHJ5IHBvaW50IGF0IGluZGV4IFwiICsgaSldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZW50cnlQb2ludHMpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKFtrZXksIHZhbGlkYXRlU3RyaW5nVmFsdWUoZW50cnlQb2ludHNba2V5XSwgXCJlbnRyeSBwb2ludFwiLCBrZXkpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChzdGRpbikge1xuICAgIGxldCBzdGRpbktleXMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgY29udGVudHMgPSBnZXRGbGFnKHN0ZGluLCBzdGRpbktleXMsIFwiY29udGVudHNcIiwgbXVzdEJlU3RyaW5nT3JVaW50OEFycmF5KTtcbiAgICBsZXQgcmVzb2x2ZURpciA9IGdldEZsYWcoc3RkaW4sIHN0ZGluS2V5cywgXCJyZXNvbHZlRGlyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IHNvdXJjZWZpbGUgPSBnZXRGbGFnKHN0ZGluLCBzdGRpbktleXMsIFwic291cmNlZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGxldCBsb2FkZXIyID0gZ2V0RmxhZyhzdGRpbiwgc3RkaW5LZXlzLCBcImxvYWRlclwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKHN0ZGluLCBzdGRpbktleXMsICdpbiBcInN0ZGluXCIgb2JqZWN0Jyk7XG4gICAgaWYgKHNvdXJjZWZpbGUpIGZsYWdzLnB1c2goYC0tc291cmNlZmlsZT0ke3NvdXJjZWZpbGV9YCk7XG4gICAgaWYgKGxvYWRlcjIpIGZsYWdzLnB1c2goYC0tbG9hZGVyPSR7bG9hZGVyMn1gKTtcbiAgICBpZiAocmVzb2x2ZURpcikgc3RkaW5SZXNvbHZlRGlyID0gcmVzb2x2ZURpcjtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnRzID09PSBcInN0cmluZ1wiKSBzdGRpbkNvbnRlbnRzID0gZW5jb2RlVVRGOChjb250ZW50cyk7XG4gICAgZWxzZSBpZiAoY29udGVudHMgaW5zdGFuY2VvZiBVaW50OEFycmF5KSBzdGRpbkNvbnRlbnRzID0gY29udGVudHM7XG4gIH1cbiAgbGV0IG5vZGVQYXRocyA9IFtdO1xuICBpZiAobm9kZVBhdGhzSW5wdXQpIHtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiBub2RlUGF0aHNJbnB1dCkge1xuICAgICAgdmFsdWUgKz0gXCJcIjtcbiAgICAgIG5vZGVQYXRocy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBlbnRyaWVzLFxuICAgIGZsYWdzLFxuICAgIHdyaXRlLFxuICAgIHN0ZGluQ29udGVudHMsXG4gICAgc3RkaW5SZXNvbHZlRGlyLFxuICAgIGFic1dvcmtpbmdEaXIsXG4gICAgbm9kZVBhdGhzLFxuICAgIG1hbmdsZUNhY2hlOiB2YWxpZGF0ZU1hbmdsZUNhY2hlKG1hbmdsZUNhY2hlKVxuICB9O1xufVxuZnVuY3Rpb24gZmxhZ3NGb3JUcmFuc2Zvcm1PcHRpb25zKGNhbGxOYW1lLCBvcHRpb25zLCBpc1RUWSwgbG9nTGV2ZWxEZWZhdWx0KSB7XG4gIGxldCBmbGFncyA9IFtdO1xuICBsZXQga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMsIGlzVFRZLCBsb2dMZXZlbERlZmF1bHQpO1xuICBwdXNoQ29tbW9uRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMpO1xuICBsZXQgc291cmNlbWFwID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInNvdXJjZW1hcFwiLCBtdXN0QmVTdHJpbmdPckJvb2xlYW4pO1xuICBsZXQgc291cmNlZmlsZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VmaWxlXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBsb2FkZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibG9hZGVyXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBiYW5uZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiYmFubmVyXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBmb290ZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZm9vdGVyXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBtYW5nbGVDYWNoZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJtYW5nbGVDYWNoZVwiLCBtdXN0QmVPYmplY3QpO1xuICBjaGVja0ZvckludmFsaWRGbGFncyhvcHRpb25zLCBrZXlzLCBgaW4gJHtjYWxsTmFtZX0oKSBjYWxsYCk7XG4gIGlmIChzb3VyY2VtYXApIGZsYWdzLnB1c2goYC0tc291cmNlbWFwPSR7c291cmNlbWFwID09PSB0cnVlID8gXCJleHRlcm5hbFwiIDogc291cmNlbWFwfWApO1xuICBpZiAoc291cmNlZmlsZSkgZmxhZ3MucHVzaChgLS1zb3VyY2VmaWxlPSR7c291cmNlZmlsZX1gKTtcbiAgaWYgKGxvYWRlcikgZmxhZ3MucHVzaChgLS1sb2FkZXI9JHtsb2FkZXJ9YCk7XG4gIGlmIChiYW5uZXIpIGZsYWdzLnB1c2goYC0tYmFubmVyPSR7YmFubmVyfWApO1xuICBpZiAoZm9vdGVyKSBmbGFncy5wdXNoKGAtLWZvb3Rlcj0ke2Zvb3Rlcn1gKTtcbiAgcmV0dXJuIHtcbiAgICBmbGFncyxcbiAgICBtYW5nbGVDYWNoZTogdmFsaWRhdGVNYW5nbGVDYWNoZShtYW5nbGVDYWNoZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNoYW5uZWwoc3RyZWFtSW4pIHtcbiAgY29uc3QgcmVxdWVzdENhbGxiYWNrc0J5S2V5ID0ge307XG4gIGNvbnN0IGNsb3NlRGF0YSA9IHsgZGlkQ2xvc2U6IGZhbHNlLCByZWFzb246IFwiXCIgfTtcbiAgbGV0IHJlc3BvbnNlQ2FsbGJhY2tzID0ge307XG4gIGxldCBuZXh0UmVxdWVzdElEID0gMDtcbiAgbGV0IG5leHRCdWlsZEtleSA9IDA7XG4gIGxldCBzdGRvdXQgPSBuZXcgVWludDhBcnJheSgxNiAqIDEwMjQpO1xuICBsZXQgc3Rkb3V0VXNlZCA9IDA7XG4gIGxldCByZWFkRnJvbVN0ZG91dCA9IChjaHVuaykgPT4ge1xuICAgIGxldCBsaW1pdCA9IHN0ZG91dFVzZWQgKyBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGxpbWl0ID4gc3Rkb3V0Lmxlbmd0aCkge1xuICAgICAgbGV0IHN3YXAgPSBuZXcgVWludDhBcnJheShsaW1pdCAqIDIpO1xuICAgICAgc3dhcC5zZXQoc3Rkb3V0KTtcbiAgICAgIHN0ZG91dCA9IHN3YXA7XG4gICAgfVxuICAgIHN0ZG91dC5zZXQoY2h1bmssIHN0ZG91dFVzZWQpO1xuICAgIHN0ZG91dFVzZWQgKz0gY2h1bmsubGVuZ3RoO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHdoaWxlIChvZmZzZXQgKyA0IDw9IHN0ZG91dFVzZWQpIHtcbiAgICAgIGxldCBsZW5ndGggPSByZWFkVUludDMyTEUoc3Rkb3V0LCBvZmZzZXQpO1xuICAgICAgaWYgKG9mZnNldCArIDQgKyBsZW5ndGggPiBzdGRvdXRVc2VkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICBoYW5kbGVJbmNvbWluZ1BhY2tldChzdGRvdXQuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKTtcbiAgICAgIG9mZnNldCArPSBsZW5ndGg7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPiAwKSB7XG4gICAgICBzdGRvdXQuY29weVdpdGhpbigwLCBvZmZzZXQsIHN0ZG91dFVzZWQpO1xuICAgICAgc3Rkb3V0VXNlZCAtPSBvZmZzZXQ7XG4gICAgfVxuICB9O1xuICBsZXQgYWZ0ZXJDbG9zZSA9IChlcnJvcikgPT4ge1xuICAgIGNsb3NlRGF0YS5kaWRDbG9zZSA9IHRydWU7XG4gICAgaWYgKGVycm9yKSBjbG9zZURhdGEucmVhc29uID0gXCI6IFwiICsgKGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xuICAgIGNvbnN0IHRleHQgPSBcIlRoZSBzZXJ2aWNlIHdhcyBzdG9wcGVkXCIgKyBjbG9zZURhdGEucmVhc29uO1xuICAgIGZvciAobGV0IGlkIGluIHJlc3BvbnNlQ2FsbGJhY2tzKSB7XG4gICAgICByZXNwb25zZUNhbGxiYWNrc1tpZF0odGV4dCwgbnVsbCk7XG4gICAgfVxuICAgIHJlc3BvbnNlQ2FsbGJhY2tzID0ge307XG4gIH07XG4gIGxldCBzZW5kUmVxdWVzdCA9IChyZWZzLCB2YWx1ZSwgY2FsbGJhY2spID0+IHtcbiAgICBpZiAoY2xvc2VEYXRhLmRpZENsb3NlKSByZXR1cm4gY2FsbGJhY2soXCJUaGUgc2VydmljZSBpcyBubyBsb25nZXIgcnVubmluZ1wiICsgY2xvc2VEYXRhLnJlYXNvbiwgbnVsbCk7XG4gICAgbGV0IGlkID0gbmV4dFJlcXVlc3RJRCsrO1xuICAgIHJlc3BvbnNlQ2FsbGJhY2tzW2lkXSA9IChlcnJvciwgcmVzcG9uc2UpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNhbGxiYWNrKGVycm9yLCByZXNwb25zZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocmVmcykgcmVmcy51bnJlZigpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHJlZnMpIHJlZnMucmVmKCk7XG4gICAgc3RyZWFtSW4ud3JpdGVUb1N0ZGluKGVuY29kZVBhY2tldCh7IGlkLCBpc1JlcXVlc3Q6IHRydWUsIHZhbHVlIH0pKTtcbiAgfTtcbiAgbGV0IHNlbmRSZXNwb25zZSA9IChpZCwgdmFsdWUpID0+IHtcbiAgICBpZiAoY2xvc2VEYXRhLmRpZENsb3NlKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc2VydmljZSBpcyBubyBsb25nZXIgcnVubmluZ1wiICsgY2xvc2VEYXRhLnJlYXNvbik7XG4gICAgc3RyZWFtSW4ud3JpdGVUb1N0ZGluKGVuY29kZVBhY2tldCh7IGlkLCBpc1JlcXVlc3Q6IGZhbHNlLCB2YWx1ZSB9KSk7XG4gIH07XG4gIGxldCBoYW5kbGVSZXF1ZXN0ID0gKGlkLCByZXF1ZXN0KSA9PiBfX2FzeW5jKG51bGwsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyZXF1ZXN0LmNvbW1hbmQgPT09IFwicGluZ1wiKSB7XG4gICAgICAgIHNlbmRSZXNwb25zZShpZCwge30pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlcXVlc3Qua2V5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RDYWxsYmFja3MgPSByZXF1ZXN0Q2FsbGJhY2tzQnlLZXlbcmVxdWVzdC5rZXldO1xuICAgICAgICBpZiAoIXJlcXVlc3RDYWxsYmFja3MpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSByZXF1ZXN0Q2FsbGJhY2tzW3JlcXVlc3QuY29tbWFuZF07XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIHlpZWxkIGNhbGxiYWNrKGlkLCByZXF1ZXN0KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb21tYW5kOiBgICsgcmVxdWVzdC5jb21tYW5kKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBbZXh0cmFjdEVycm9yTWVzc2FnZVY4KGUsIHN0cmVhbUluLCBudWxsLCB2b2lkIDAsIFwiXCIpXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlbmRSZXNwb25zZShpZCwgeyBlcnJvcnMgfSk7XG4gICAgICB9IGNhdGNoIChlMikge1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGxldCBpc0ZpcnN0UGFja2V0ID0gdHJ1ZTtcbiAgbGV0IGhhbmRsZUluY29taW5nUGFja2V0ID0gKGJ5dGVzKSA9PiB7XG4gICAgaWYgKGlzRmlyc3RQYWNrZXQpIHtcbiAgICAgIGlzRmlyc3RQYWNrZXQgPSBmYWxzZTtcbiAgICAgIGxldCBiaW5hcnlWZXJzaW9uID0gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcyk7XG4gICAgICBpZiAoYmluYXJ5VmVyc2lvbiAhPT0gXCIwLjI3LjFcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzdGFydCBzZXJ2aWNlOiBIb3N0IHZlcnNpb24gXCIke1wiMC4yNy4xXCJ9XCIgZG9lcyBub3QgbWF0Y2ggYmluYXJ5IHZlcnNpb24gJHtxdW90ZShiaW5hcnlWZXJzaW9uKX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHBhY2tldCA9IGRlY29kZVBhY2tldChieXRlcyk7XG4gICAgaWYgKHBhY2tldC5pc1JlcXVlc3QpIHtcbiAgICAgIGhhbmRsZVJlcXVlc3QocGFja2V0LmlkLCBwYWNrZXQudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2FsbGJhY2sgPSByZXNwb25zZUNhbGxiYWNrc1twYWNrZXQuaWRdO1xuICAgICAgZGVsZXRlIHJlc3BvbnNlQ2FsbGJhY2tzW3BhY2tldC5pZF07XG4gICAgICBpZiAocGFja2V0LnZhbHVlLmVycm9yKSBjYWxsYmFjayhwYWNrZXQudmFsdWUuZXJyb3IsIHt9KTtcbiAgICAgIGVsc2UgY2FsbGJhY2sobnVsbCwgcGFja2V0LnZhbHVlKTtcbiAgICB9XG4gIH07XG4gIGxldCBidWlsZE9yQ29udGV4dCA9ICh7IGNhbGxOYW1lLCByZWZzLCBvcHRpb25zLCBpc1RUWSwgZGVmYXVsdFdELCBjYWxsYmFjayB9KSA9PiB7XG4gICAgbGV0IHJlZkNvdW50ID0gMDtcbiAgICBjb25zdCBidWlsZEtleSA9IG5leHRCdWlsZEtleSsrO1xuICAgIGNvbnN0IHJlcXVlc3RDYWxsYmFja3MgPSB7fTtcbiAgICBjb25zdCBidWlsZFJlZnMgPSB7XG4gICAgICByZWYoKSB7XG4gICAgICAgIGlmICgrK3JlZkNvdW50ID09PSAxKSB7XG4gICAgICAgICAgaWYgKHJlZnMpIHJlZnMucmVmKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1bnJlZigpIHtcbiAgICAgICAgaWYgKC0tcmVmQ291bnQgPT09IDApIHtcbiAgICAgICAgICBkZWxldGUgcmVxdWVzdENhbGxiYWNrc0J5S2V5W2J1aWxkS2V5XTtcbiAgICAgICAgICBpZiAocmVmcykgcmVmcy51bnJlZigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXF1ZXN0Q2FsbGJhY2tzQnlLZXlbYnVpbGRLZXldID0gcmVxdWVzdENhbGxiYWNrcztcbiAgICBidWlsZFJlZnMucmVmKCk7XG4gICAgYnVpbGRPckNvbnRleHRJbXBsKFxuICAgICAgY2FsbE5hbWUsXG4gICAgICBidWlsZEtleSxcbiAgICAgIHNlbmRSZXF1ZXN0LFxuICAgICAgc2VuZFJlc3BvbnNlLFxuICAgICAgYnVpbGRSZWZzLFxuICAgICAgc3RyZWFtSW4sXG4gICAgICByZXF1ZXN0Q2FsbGJhY2tzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGlzVFRZLFxuICAgICAgZGVmYXVsdFdELFxuICAgICAgKGVyciwgcmVzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2FsbGJhY2soZXJyLCByZXMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGJ1aWxkUmVmcy51bnJlZigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfTtcbiAgbGV0IHRyYW5zZm9ybTIgPSAoeyBjYWxsTmFtZSwgcmVmcywgaW5wdXQsIG9wdGlvbnMsIGlzVFRZLCBmcywgY2FsbGJhY2sgfSkgPT4ge1xuICAgIGNvbnN0IGRldGFpbHMgPSBjcmVhdGVPYmplY3RTdGFzaCgpO1xuICAgIGxldCBzdGFydCA9IChpbnB1dFBhdGgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIgJiYgIShpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGlucHV0IHRvIFwidHJhbnNmb3JtXCIgbXVzdCBiZSBhIHN0cmluZyBvciBhIFVpbnQ4QXJyYXknKTtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBmbGFncyxcbiAgICAgICAgICBtYW5nbGVDYWNoZVxuICAgICAgICB9ID0gZmxhZ3NGb3JUcmFuc2Zvcm1PcHRpb25zKGNhbGxOYW1lLCBvcHRpb25zLCBpc1RUWSwgdHJhbnNmb3JtTG9nTGV2ZWxEZWZhdWx0KTtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgY29tbWFuZDogXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgICBmbGFncyxcbiAgICAgICAgICBpbnB1dEZTOiBpbnB1dFBhdGggIT09IG51bGwsXG4gICAgICAgICAgaW5wdXQ6IGlucHV0UGF0aCAhPT0gbnVsbCA/IGVuY29kZVVURjgoaW5wdXRQYXRoKSA6IHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiA/IGVuY29kZVVURjgoaW5wdXQpIDogaW5wdXRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG1hbmdsZUNhY2hlKSByZXF1ZXN0Lm1hbmdsZUNhY2hlID0gbWFuZ2xlQ2FjaGU7XG4gICAgICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QsIChlcnJvciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoZXJyb3IpLCBudWxsKTtcbiAgICAgICAgICBsZXQgZXJyb3JzID0gcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLmVycm9ycywgZGV0YWlscyk7XG4gICAgICAgICAgbGV0IHdhcm5pbmdzID0gcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLndhcm5pbmdzLCBkZXRhaWxzKTtcbiAgICAgICAgICBsZXQgb3V0c3RhbmRpbmcgPSAxO1xuICAgICAgICAgIGxldCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKC0tb3V0c3RhbmRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICB3YXJuaW5ncyxcbiAgICAgICAgICAgICAgICBjb2RlOiByZXNwb25zZS5jb2RlLFxuICAgICAgICAgICAgICAgIG1hcDogcmVzcG9uc2UubWFwLFxuICAgICAgICAgICAgICAgIG1hbmdsZUNhY2hlOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgbGVnYWxDb21tZW50czogdm9pZCAwXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGlmIChcImxlZ2FsQ29tbWVudHNcIiBpbiByZXNwb25zZSkgcmVzdWx0LmxlZ2FsQ29tbWVudHMgPSByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UubGVnYWxDb21tZW50cztcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm1hbmdsZUNhY2hlKSByZXN1bHQubWFuZ2xlQ2FjaGUgPSByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UubWFuZ2xlQ2FjaGU7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHJldHVybiBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKFwiVHJhbnNmb3JtIGZhaWxlZFwiLCBlcnJvcnMsIHdhcm5pbmdzKSwgbnVsbCk7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmNvZGVGUykge1xuICAgICAgICAgICAgb3V0c3RhbmRpbmcrKztcbiAgICAgICAgICAgIGZzLnJlYWRGaWxlKHJlc3BvbnNlLmNvZGUsIChlcnIsIGNvbnRlbnRzKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlcnIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIG51bGwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNvZGUgPSBjb250ZW50cztcbiAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzcG9uc2UubWFwRlMpIHtcbiAgICAgICAgICAgIG91dHN0YW5kaW5nKys7XG4gICAgICAgICAgICBmcy5yZWFkRmlsZShyZXNwb25zZS5tYXAsIChlcnIsIGNvbnRlbnRzKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlcnIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIG51bGwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1hcCA9IGNvbnRlbnRzO1xuICAgICAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxldCBmbGFncyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHB1c2hMb2dGbGFncyhmbGFncywgb3B0aW9ucywge30sIGlzVFRZLCB0cmFuc2Zvcm1Mb2dMZXZlbERlZmF1bHQpO1xuICAgICAgICB9IGNhdGNoIChlMikge1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVycm9yID0gZXh0cmFjdEVycm9yTWVzc2FnZVY4KGUsIHN0cmVhbUluLCBkZXRhaWxzLCB2b2lkIDAsIFwiXCIpO1xuICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCB7IGNvbW1hbmQ6IFwiZXJyb3JcIiwgZmxhZ3MsIGVycm9yIH0sICgpID0+IHtcbiAgICAgICAgICBlcnJvci5kZXRhaWwgPSBkZXRhaWxzLmxvYWQoZXJyb3IuZGV0YWlsKTtcbiAgICAgICAgICBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKFwiVHJhbnNmb3JtIGZhaWxlZFwiLCBbZXJyb3JdLCBbXSksIG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICgodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiIHx8IGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkgJiYgaW5wdXQubGVuZ3RoID4gMTAyNCAqIDEwMjQpIHtcbiAgICAgIGxldCBuZXh0ID0gc3RhcnQ7XG4gICAgICBzdGFydCA9ICgpID0+IGZzLndyaXRlRmlsZShpbnB1dCwgbmV4dCk7XG4gICAgfVxuICAgIHN0YXJ0KG51bGwpO1xuICB9O1xuICBsZXQgZm9ybWF0TWVzc2FnZXMyID0gKHsgY2FsbE5hbWUsIHJlZnMsIG1lc3NhZ2VzLCBvcHRpb25zLCBjYWxsYmFjayB9KSA9PiB7XG4gICAgaWYgKCFvcHRpb25zKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgc2Vjb25kIGFyZ3VtZW50IGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICAgIGxldCBrZXlzID0ge307XG4gICAgbGV0IGtpbmQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwia2luZFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGxldCBjb2xvciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJjb2xvclwiLCBtdXN0QmVCb29sZWFuKTtcbiAgICBsZXQgdGVybWluYWxXaWR0aCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ0ZXJtaW5hbFdpZHRoXCIsIG11c3RCZUludGVnZXIpO1xuICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMsIGBpbiAke2NhbGxOYW1lfSgpIGNhbGxgKTtcbiAgICBpZiAoa2luZCA9PT0gdm9pZCAwKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgXCJraW5kXCIgaW4gJHtjYWxsTmFtZX0oKSBjYWxsYCk7XG4gICAgaWYgKGtpbmQgIT09IFwiZXJyb3JcIiAmJiBraW5kICE9PSBcIndhcm5pbmdcIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBcImtpbmRcIiB0byBiZSBcImVycm9yXCIgb3IgXCJ3YXJuaW5nXCIgaW4gJHtjYWxsTmFtZX0oKSBjYWxsYCk7XG4gICAgbGV0IHJlcXVlc3QgPSB7XG4gICAgICBjb21tYW5kOiBcImZvcm1hdC1tc2dzXCIsXG4gICAgICBtZXNzYWdlczogc2FuaXRpemVNZXNzYWdlcyhtZXNzYWdlcywgXCJtZXNzYWdlc1wiLCBudWxsLCBcIlwiLCB0ZXJtaW5hbFdpZHRoKSxcbiAgICAgIGlzV2FybmluZzoga2luZCA9PT0gXCJ3YXJuaW5nXCJcbiAgICB9O1xuICAgIGlmIChjb2xvciAhPT0gdm9pZCAwKSByZXF1ZXN0LmNvbG9yID0gY29sb3I7XG4gICAgaWYgKHRlcm1pbmFsV2lkdGggIT09IHZvaWQgMCkgcmVxdWVzdC50ZXJtaW5hbFdpZHRoID0gdGVybWluYWxXaWR0aDtcbiAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0LCAoZXJyb3IsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoZXJyb3IpLCBudWxsKTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLm1lc3NhZ2VzKTtcbiAgICB9KTtcbiAgfTtcbiAgbGV0IGFuYWx5emVNZXRhZmlsZTIgPSAoeyBjYWxsTmFtZSwgcmVmcywgbWV0YWZpbGUsIG9wdGlvbnMsIGNhbGxiYWNrIH0pID0+IHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSBvcHRpb25zID0ge307XG4gICAgbGV0IGtleXMgPSB7fTtcbiAgICBsZXQgY29sb3IgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiY29sb3JcIiwgbXVzdEJlQm9vbGVhbik7XG4gICAgbGV0IHZlcmJvc2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwidmVyYm9zZVwiLCBtdXN0QmVCb29sZWFuKTtcbiAgICBjaGVja0ZvckludmFsaWRGbGFncyhvcHRpb25zLCBrZXlzLCBgaW4gJHtjYWxsTmFtZX0oKSBjYWxsYCk7XG4gICAgbGV0IHJlcXVlc3QgPSB7XG4gICAgICBjb21tYW5kOiBcImFuYWx5emUtbWV0YWZpbGVcIixcbiAgICAgIG1ldGFmaWxlXG4gICAgfTtcbiAgICBpZiAoY29sb3IgIT09IHZvaWQgMCkgcmVxdWVzdC5jb2xvciA9IGNvbG9yO1xuICAgIGlmICh2ZXJib3NlICE9PSB2b2lkIDApIHJlcXVlc3QudmVyYm9zZSA9IHZlcmJvc2U7XG4gICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdCwgKGVycm9yLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGVycm9yKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGVycm9yKSwgbnVsbCk7XG4gICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5yZXN1bHQpO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIHJlYWRGcm9tU3Rkb3V0LFxuICAgIGFmdGVyQ2xvc2UsXG4gICAgc2VydmljZToge1xuICAgICAgYnVpbGRPckNvbnRleHQsXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybTIsXG4gICAgICBmb3JtYXRNZXNzYWdlczogZm9ybWF0TWVzc2FnZXMyLFxuICAgICAgYW5hbHl6ZU1ldGFmaWxlOiBhbmFseXplTWV0YWZpbGUyXG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gYnVpbGRPckNvbnRleHRJbXBsKGNhbGxOYW1lLCBidWlsZEtleSwgc2VuZFJlcXVlc3QsIHNlbmRSZXNwb25zZSwgcmVmcywgc3RyZWFtSW4sIHJlcXVlc3RDYWxsYmFja3MsIG9wdGlvbnMsIGlzVFRZLCBkZWZhdWx0V0QsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGRldGFpbHMgPSBjcmVhdGVPYmplY3RTdGFzaCgpO1xuICBjb25zdCBpc0NvbnRleHQgPSBjYWxsTmFtZSA9PT0gXCJjb250ZXh0XCI7XG4gIGNvbnN0IGhhbmRsZUVycm9yID0gKGUsIHBsdWdpbk5hbWUpID0+IHtcbiAgICBjb25zdCBmbGFncyA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIHt9LCBpc1RUWSwgYnVpbGRMb2dMZXZlbERlZmF1bHQpO1xuICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBleHRyYWN0RXJyb3JNZXNzYWdlVjgoZSwgc3RyZWFtSW4sIGRldGFpbHMsIHZvaWQgMCwgcGx1Z2luTmFtZSk7XG4gICAgc2VuZFJlcXVlc3QocmVmcywgeyBjb21tYW5kOiBcImVycm9yXCIsIGZsYWdzLCBlcnJvcjogbWVzc2FnZSB9LCAoKSA9PiB7XG4gICAgICBtZXNzYWdlLmRldGFpbCA9IGRldGFpbHMubG9hZChtZXNzYWdlLmRldGFpbCk7XG4gICAgICBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKGlzQ29udGV4dCA/IFwiQ29udGV4dCBmYWlsZWRcIiA6IFwiQnVpbGQgZmFpbGVkXCIsIFttZXNzYWdlXSwgW10pLCBudWxsKTtcbiAgICB9KTtcbiAgfTtcbiAgbGV0IHBsdWdpbnM7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy5wbHVnaW5zO1xuICAgIGlmICh2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gaGFuZGxlRXJyb3IobmV3IEVycm9yKGBcInBsdWdpbnNcIiBtdXN0IGJlIGFuIGFycmF5YCksIFwiXCIpO1xuICAgICAgcGx1Z2lucyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBpZiAocGx1Z2lucyAmJiBwbHVnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc3RyZWFtSW4uaXNTeW5jKSByZXR1cm4gaGFuZGxlRXJyb3IobmV3IEVycm9yKFwiQ2Fubm90IHVzZSBwbHVnaW5zIGluIHN5bmNocm9ub3VzIEFQSSBjYWxsc1wiKSwgXCJcIik7XG4gICAgaGFuZGxlUGx1Z2lucyhcbiAgICAgIGJ1aWxkS2V5LFxuICAgICAgc2VuZFJlcXVlc3QsXG4gICAgICBzZW5kUmVzcG9uc2UsXG4gICAgICByZWZzLFxuICAgICAgc3RyZWFtSW4sXG4gICAgICByZXF1ZXN0Q2FsbGJhY2tzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHBsdWdpbnMsXG4gICAgICBkZXRhaWxzXG4gICAgKS50aGVuKFxuICAgICAgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykgcmV0dXJuIGhhbmRsZUVycm9yKHJlc3VsdC5lcnJvciwgcmVzdWx0LnBsdWdpbk5hbWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJ1aWxkT3JDb250ZXh0Q29udGludWUocmVzdWx0LnJlcXVlc3RQbHVnaW5zLCByZXN1bHQucnVuT25FbmRDYWxsYmFja3MsIHJlc3VsdC5zY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIChlKSA9PiBoYW5kbGVFcnJvcihlLCBcIlwiKVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgYnVpbGRPckNvbnRleHRDb250aW51ZShudWxsLCAocmVzdWx0LCBkb25lKSA9PiBkb25lKFtdLCBbXSksICgpID0+IHtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhhbmRsZUVycm9yKGUsIFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkT3JDb250ZXh0Q29udGludWUocmVxdWVzdFBsdWdpbnMsIHJ1bk9uRW5kQ2FsbGJhY2tzLCBzY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcykge1xuICAgIGNvbnN0IHdyaXRlRGVmYXVsdCA9IHN0cmVhbUluLmhhc0ZTO1xuICAgIGNvbnN0IHtcbiAgICAgIGVudHJpZXMsXG4gICAgICBmbGFncyxcbiAgICAgIHdyaXRlLFxuICAgICAgc3RkaW5Db250ZW50cyxcbiAgICAgIHN0ZGluUmVzb2x2ZURpcixcbiAgICAgIGFic1dvcmtpbmdEaXIsXG4gICAgICBub2RlUGF0aHMsXG4gICAgICBtYW5nbGVDYWNoZVxuICAgIH0gPSBmbGFnc0ZvckJ1aWxkT3B0aW9ucyhjYWxsTmFtZSwgb3B0aW9ucywgaXNUVFksIGJ1aWxkTG9nTGV2ZWxEZWZhdWx0LCB3cml0ZURlZmF1bHQpO1xuICAgIGlmICh3cml0ZSAmJiAhc3RyZWFtSW4uaGFzRlMpIHRocm93IG5ldyBFcnJvcihgVGhlIFwid3JpdGVcIiBvcHRpb24gaXMgdW5hdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudGApO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBjb21tYW5kOiBcImJ1aWxkXCIsXG4gICAgICBrZXk6IGJ1aWxkS2V5LFxuICAgICAgZW50cmllcyxcbiAgICAgIGZsYWdzLFxuICAgICAgd3JpdGUsXG4gICAgICBzdGRpbkNvbnRlbnRzLFxuICAgICAgc3RkaW5SZXNvbHZlRGlyLFxuICAgICAgYWJzV29ya2luZ0RpcjogYWJzV29ya2luZ0RpciB8fCBkZWZhdWx0V0QsXG4gICAgICBub2RlUGF0aHMsXG4gICAgICBjb250ZXh0OiBpc0NvbnRleHRcbiAgICB9O1xuICAgIGlmIChyZXF1ZXN0UGx1Z2lucykgcmVxdWVzdC5wbHVnaW5zID0gcmVxdWVzdFBsdWdpbnM7XG4gICAgaWYgKG1hbmdsZUNhY2hlKSByZXF1ZXN0Lm1hbmdsZUNhY2hlID0gbWFuZ2xlQ2FjaGU7XG4gICAgY29uc3QgYnVpbGRSZXNwb25zZVRvUmVzdWx0ID0gKHJlc3BvbnNlLCBjYWxsYmFjazIpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgZXJyb3JzOiByZXBsYWNlRGV0YWlsc0luTWVzc2FnZXMocmVzcG9uc2UuZXJyb3JzLCBkZXRhaWxzKSxcbiAgICAgICAgd2FybmluZ3M6IHJlcGxhY2VEZXRhaWxzSW5NZXNzYWdlcyhyZXNwb25zZS53YXJuaW5ncywgZGV0YWlscyksXG4gICAgICAgIG91dHB1dEZpbGVzOiB2b2lkIDAsXG4gICAgICAgIG1ldGFmaWxlOiB2b2lkIDAsXG4gICAgICAgIG1hbmdsZUNhY2hlOiB2b2lkIDBcbiAgICAgIH07XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9ycyA9IHJlc3VsdC5lcnJvcnMuc2xpY2UoKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsV2FybmluZ3MgPSByZXN1bHQud2FybmluZ3Muc2xpY2UoKTtcbiAgICAgIGlmIChyZXNwb25zZS5vdXRwdXRGaWxlcykgcmVzdWx0Lm91dHB1dEZpbGVzID0gcmVzcG9uc2Uub3V0cHV0RmlsZXMubWFwKGNvbnZlcnRPdXRwdXRGaWxlcyk7XG4gICAgICBpZiAocmVzcG9uc2UubWV0YWZpbGUpIHJlc3VsdC5tZXRhZmlsZSA9IEpTT04ucGFyc2UocmVzcG9uc2UubWV0YWZpbGUpO1xuICAgICAgaWYgKHJlc3BvbnNlLm1hbmdsZUNhY2hlKSByZXN1bHQubWFuZ2xlQ2FjaGUgPSByZXNwb25zZS5tYW5nbGVDYWNoZTtcbiAgICAgIGlmIChyZXNwb25zZS53cml0ZVRvU3Rkb3V0ICE9PSB2b2lkIDApIGNvbnNvbGUubG9nKGRlY29kZVVURjgocmVzcG9uc2Uud3JpdGVUb1N0ZG91dCkucmVwbGFjZSgvXFxuJC8sIFwiXCIpKTtcbiAgICAgIHJ1bk9uRW5kQ2FsbGJhY2tzKHJlc3VsdCwgKG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKSA9PiB7XG4gICAgICAgIGlmIChvcmlnaW5hbEVycm9ycy5sZW5ndGggPiAwIHx8IG9uRW5kRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IGZhaWx1cmVFcnJvcldpdGhMb2coXCJCdWlsZCBmYWlsZWRcIiwgb3JpZ2luYWxFcnJvcnMuY29uY2F0KG9uRW5kRXJyb3JzKSwgb3JpZ2luYWxXYXJuaW5ncy5jb25jYXQob25FbmRXYXJuaW5ncykpO1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjazIoZXJyb3IsIG51bGwsIG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjazIobnVsbCwgcmVzdWx0LCBvbkVuZEVycm9ycywgb25FbmRXYXJuaW5ncyk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGxldCBsYXRlc3RSZXN1bHRQcm9taXNlO1xuICAgIGxldCBwcm92aWRlTGF0ZXN0UmVzdWx0O1xuICAgIGlmIChpc0NvbnRleHQpXG4gICAgICByZXF1ZXN0Q2FsbGJhY2tzW1wib24tZW5kXCJdID0gKGlkLCByZXF1ZXN0MikgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgYnVpbGRSZXNwb25zZVRvUmVzdWx0KHJlcXVlc3QyLCAoZXJyLCByZXN1bHQsIG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgICBlcnJvcnM6IG9uRW5kRXJyb3JzLFxuICAgICAgICAgICAgd2FybmluZ3M6IG9uRW5kV2FybmluZ3NcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChwcm92aWRlTGF0ZXN0UmVzdWx0KSBwcm92aWRlTGF0ZXN0UmVzdWx0KGVyciwgcmVzdWx0KTtcbiAgICAgICAgICBsYXRlc3RSZXN1bHRQcm9taXNlID0gdm9pZCAwO1xuICAgICAgICAgIHByb3ZpZGVMYXRlc3RSZXN1bHQgPSB2b2lkIDA7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKGlkLCByZXNwb25zZSk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QsIChlcnJvciwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihlcnJvciksIG51bGwpO1xuICAgICAgaWYgKCFpc0NvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkUmVzcG9uc2VUb1Jlc3VsdChyZXNwb25zZSwgKGVyciwgcmVzKSA9PiB7XG4gICAgICAgICAgc2NoZWR1bGVPbkRpc3Bvc2VDYWxsYmFja3MoKTtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyLCByZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwb25zZS5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZmFpbHVyZUVycm9yV2l0aExvZyhcIkNvbnRleHQgZmFpbGVkXCIsIHJlc3BvbnNlLmVycm9ycywgcmVzcG9uc2Uud2FybmluZ3MpLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGxldCBkaWREaXNwb3NlID0gZmFsc2U7XG4gICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIHJlYnVpbGQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAoIWxhdGVzdFJlc3VsdFByb21pc2UpIGxhdGVzdFJlc3VsdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgc2V0dGxlUHJvbWlzZTtcbiAgICAgICAgICAgIHByb3ZpZGVMYXRlc3RSZXN1bHQgPSAoZXJyLCByZXN1bHQyKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghc2V0dGxlUHJvbWlzZSkgc2V0dGxlUHJvbWlzZSA9ICgpID0+IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShyZXN1bHQyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyQW5vdGhlckJ1aWxkID0gKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0MiA9IHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiBcInJlYnVpbGRcIixcbiAgICAgICAgICAgICAgICBrZXk6IGJ1aWxkS2V5XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QyLCAoZXJyb3IyLCByZXNwb25zZTIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IyKSB7XG4gICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGVycm9yMikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGxlUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgc2V0dGxlUHJvbWlzZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0cmlnZ2VyQW5vdGhlckJ1aWxkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0cmlnZ2VyQW5vdGhlckJ1aWxkKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGxhdGVzdFJlc3VsdFByb21pc2U7XG4gICAgICAgIH0sXG4gICAgICAgIHdhdGNoOiAob3B0aW9uczIgPSB7fSkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGlmICghc3RyZWFtSW4uaGFzRlMpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVzZSB0aGUgXCJ3YXRjaFwiIEFQSSBpbiB0aGlzIGVudmlyb25tZW50YCk7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IHt9O1xuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJkZWxheVwiLCBtdXN0QmVJbnRlZ2VyKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhvcHRpb25zMiwga2V5cywgYGluIHdhdGNoKCkgY2FsbGApO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QyID0ge1xuICAgICAgICAgICAgY29tbWFuZDogXCJ3YXRjaFwiLFxuICAgICAgICAgICAga2V5OiBidWlsZEtleVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGRlbGF5KSByZXF1ZXN0Mi5kZWxheSA9IGRlbGF5O1xuICAgICAgICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QyLCAoZXJyb3IyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IyKSByZWplY3QobmV3IEVycm9yKGVycm9yMikpO1xuICAgICAgICAgICAgZWxzZSByZXNvbHZlKHZvaWQgMCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBzZXJ2ZTogKG9wdGlvbnMyID0ge30pID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBpZiAoIXN0cmVhbUluLmhhc0ZTKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB1c2UgdGhlIFwic2VydmVcIiBBUEkgaW4gdGhpcyBlbnZpcm9ubWVudGApO1xuICAgICAgICAgIGNvbnN0IGtleXMgPSB7fTtcbiAgICAgICAgICBjb25zdCBwb3J0ID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJwb3J0XCIsIG11c3RCZVZhbGlkUG9ydE51bWJlcik7XG4gICAgICAgICAgY29uc3QgaG9zdCA9IGdldEZsYWcob3B0aW9uczIsIGtleXMsIFwiaG9zdFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IHNlcnZlZGlyID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJzZXJ2ZWRpclwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGtleWZpbGUgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcImtleWZpbGVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBjb25zdCBjZXJ0ZmlsZSA9IGdldEZsYWcob3B0aW9uczIsIGtleXMsIFwiY2VydGZpbGVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBjb25zdCBmYWxsYmFjayA9IGdldEZsYWcob3B0aW9uczIsIGtleXMsIFwiZmFsbGJhY2tcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBjb25zdCBjb3JzID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJjb3JzXCIsIG11c3RCZU9iamVjdCk7XG4gICAgICAgICAgY29uc3Qgb25SZXF1ZXN0ID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJvblJlcXVlc3RcIiwgbXVzdEJlRnVuY3Rpb24pO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMyLCBrZXlzLCBgaW4gc2VydmUoKSBjYWxsYCk7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdDIgPSB7XG4gICAgICAgICAgICBjb21tYW5kOiBcInNlcnZlXCIsXG4gICAgICAgICAgICBrZXk6IGJ1aWxkS2V5LFxuICAgICAgICAgICAgb25SZXF1ZXN0OiAhIW9uUmVxdWVzdFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHBvcnQgIT09IHZvaWQgMCkgcmVxdWVzdDIucG9ydCA9IHBvcnQ7XG4gICAgICAgICAgaWYgKGhvc3QgIT09IHZvaWQgMCkgcmVxdWVzdDIuaG9zdCA9IGhvc3Q7XG4gICAgICAgICAgaWYgKHNlcnZlZGlyICE9PSB2b2lkIDApIHJlcXVlc3QyLnNlcnZlZGlyID0gc2VydmVkaXI7XG4gICAgICAgICAgaWYgKGtleWZpbGUgIT09IHZvaWQgMCkgcmVxdWVzdDIua2V5ZmlsZSA9IGtleWZpbGU7XG4gICAgICAgICAgaWYgKGNlcnRmaWxlICE9PSB2b2lkIDApIHJlcXVlc3QyLmNlcnRmaWxlID0gY2VydGZpbGU7XG4gICAgICAgICAgaWYgKGZhbGxiYWNrICE9PSB2b2lkIDApIHJlcXVlc3QyLmZhbGxiYWNrID0gZmFsbGJhY2s7XG4gICAgICAgICAgaWYgKGNvcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvcnNLZXlzID0ge307XG4gICAgICAgICAgICBjb25zdCBvcmlnaW4gPSBnZXRGbGFnKGNvcnMsIGNvcnNLZXlzLCBcIm9yaWdpblwiLCBtdXN0QmVTdHJpbmdPckFycmF5T2ZTdHJpbmdzKTtcbiAgICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKGNvcnMsIGNvcnNLZXlzLCBgb24gXCJjb3JzXCIgb2JqZWN0YCk7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcmlnaW4pKSByZXF1ZXN0Mi5jb3JzT3JpZ2luID0gb3JpZ2luO1xuICAgICAgICAgICAgZWxzZSBpZiAob3JpZ2luICE9PSB2b2lkIDApIHJlcXVlc3QyLmNvcnNPcmlnaW4gPSBbb3JpZ2luXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdDIsIChlcnJvcjIsIHJlc3BvbnNlMikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yMikgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoZXJyb3IyKSk7XG4gICAgICAgICAgICBpZiAob25SZXF1ZXN0KSB7XG4gICAgICAgICAgICAgIHJlcXVlc3RDYWxsYmFja3NbXCJzZXJ2ZS1yZXF1ZXN0XCJdID0gKGlkLCByZXF1ZXN0MykgPT4ge1xuICAgICAgICAgICAgICAgIG9uUmVxdWVzdChyZXF1ZXN0My5hcmdzKTtcbiAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UoaWQsIHt9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhbmNlbDogKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBpZiAoZGlkRGlzcG9zZSkgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0MiA9IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiY2FuY2VsXCIsXG4gICAgICAgICAgICBrZXk6IGJ1aWxkS2V5XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0MiwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBpZiAoZGlkRGlzcG9zZSkgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICBkaWREaXNwb3NlID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0MiA9IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiZGlzcG9zZVwiLFxuICAgICAgICAgICAga2V5OiBidWlsZEtleVxuICAgICAgICAgIH07XG4gICAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdDIsICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIHNjaGVkdWxlT25EaXNwb3NlQ2FsbGJhY2tzKCk7XG4gICAgICAgICAgICByZWZzLnVucmVmKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgICAgcmVmcy5yZWYoKTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgfSk7XG4gIH1cbn1cbnZhciBoYW5kbGVQbHVnaW5zID0gKGJ1aWxkS2V5LCBzZW5kUmVxdWVzdCwgc2VuZFJlc3BvbnNlLCByZWZzLCBzdHJlYW1JbiwgcmVxdWVzdENhbGxiYWNrcywgaW5pdGlhbE9wdGlvbnMsIHBsdWdpbnMsIGRldGFpbHMpID0+IF9fYXN5bmMobnVsbCwgbnVsbCwgZnVuY3Rpb24qICgpIHtcbiAgbGV0IG9uU3RhcnRDYWxsYmFja3MgPSBbXTtcbiAgbGV0IG9uRW5kQ2FsbGJhY2tzID0gW107XG4gIGxldCBvblJlc29sdmVDYWxsYmFja3MgPSB7fTtcbiAgbGV0IG9uTG9hZENhbGxiYWNrcyA9IHt9O1xuICBsZXQgb25EaXNwb3NlQ2FsbGJhY2tzID0gW107XG4gIGxldCBuZXh0Q2FsbGJhY2tJRCA9IDA7XG4gIGxldCBpID0gMDtcbiAgbGV0IHJlcXVlc3RQbHVnaW5zID0gW107XG4gIGxldCBpc1NldHVwRG9uZSA9IGZhbHNlO1xuICBwbHVnaW5zID0gWy4uLnBsdWdpbnNdO1xuICBmb3IgKGxldCBpdGVtIG9mIHBsdWdpbnMpIHtcbiAgICBsZXQga2V5cyA9IHt9O1xuICAgIGlmICh0eXBlb2YgaXRlbSAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gYXQgaW5kZXggJHtpfSBtdXN0IGJlIGFuIG9iamVjdGApO1xuICAgIGNvbnN0IG5hbWUgPSBnZXRGbGFnKGl0ZW0sIGtleXMsIFwibmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lID09PSBcIlwiKSB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBhdCBpbmRleCAke2l9IGlzIG1pc3NpbmcgYSBuYW1lYCk7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzZXR1cCA9IGdldEZsYWcoaXRlbSwga2V5cywgXCJzZXR1cFwiLCBtdXN0QmVGdW5jdGlvbik7XG4gICAgICBpZiAodHlwZW9mIHNldHVwICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIGlzIG1pc3NpbmcgYSBzZXR1cCBmdW5jdGlvbmApO1xuICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MoaXRlbSwga2V5cywgYG9uIHBsdWdpbiAke3F1b3RlKG5hbWUpfWApO1xuICAgICAgbGV0IHBsdWdpbiA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb25TdGFydDogZmFsc2UsXG4gICAgICAgIG9uRW5kOiBmYWxzZSxcbiAgICAgICAgb25SZXNvbHZlOiBbXSxcbiAgICAgICAgb25Mb2FkOiBbXVxuICAgICAgfTtcbiAgICAgIGkrKztcbiAgICAgIGxldCByZXNvbHZlID0gKHBhdGgsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBpZiAoIWlzU2V0dXBEb25lKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIFwicmVzb2x2ZVwiIGJlZm9yZSBwbHVnaW4gc2V0dXAgaGFzIGNvbXBsZXRlZCcpO1xuICAgICAgICBpZiAodHlwZW9mIHBhdGggIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihgVGhlIHBhdGggdG8gcmVzb2x2ZSBtdXN0IGJlIGEgc3RyaW5nYCk7XG4gICAgICAgIGxldCBrZXlzMiA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgcGx1Z2luTmFtZSA9IGdldEZsYWcob3B0aW9ucywga2V5czIsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQgaW1wb3J0ZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcImltcG9ydGVyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgIGxldCBuYW1lc3BhY2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcIm5hbWVzcGFjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQgcmVzb2x2ZURpciA9IGdldEZsYWcob3B0aW9ucywga2V5czIsIFwicmVzb2x2ZURpclwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQga2luZCA9IGdldEZsYWcob3B0aW9ucywga2V5czIsIFwia2luZFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQgcGx1Z2luRGF0YSA9IGdldEZsYWcob3B0aW9ucywga2V5czIsIFwicGx1Z2luRGF0YVwiLCBjYW5CZUFueXRoaW5nKTtcbiAgICAgICAgbGV0IGltcG9ydEF0dHJpYnV0ZXMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcIndpdGhcIiwgbXVzdEJlT2JqZWN0KTtcbiAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5czIsIFwiaW4gcmVzb2x2ZSgpIGNhbGxcIik7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgICBjb21tYW5kOiBcInJlc29sdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBrZXk6IGJ1aWxkS2V5LFxuICAgICAgICAgICAgcGx1Z2luTmFtZTogbmFtZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHBsdWdpbk5hbWUgIT0gbnVsbCkgcmVxdWVzdC5wbHVnaW5OYW1lID0gcGx1Z2luTmFtZTtcbiAgICAgICAgICBpZiAoaW1wb3J0ZXIgIT0gbnVsbCkgcmVxdWVzdC5pbXBvcnRlciA9IGltcG9ydGVyO1xuICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgcmVxdWVzdC5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgaWYgKHJlc29sdmVEaXIgIT0gbnVsbCkgcmVxdWVzdC5yZXNvbHZlRGlyID0gcmVzb2x2ZURpcjtcbiAgICAgICAgICBpZiAoa2luZCAhPSBudWxsKSByZXF1ZXN0LmtpbmQgPSBraW5kO1xuICAgICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKGBNdXN0IHNwZWNpZnkgXCJraW5kXCIgd2hlbiBjYWxsaW5nIFwicmVzb2x2ZVwiYCk7XG4gICAgICAgICAgaWYgKHBsdWdpbkRhdGEgIT0gbnVsbCkgcmVxdWVzdC5wbHVnaW5EYXRhID0gZGV0YWlscy5zdG9yZShwbHVnaW5EYXRhKTtcbiAgICAgICAgICBpZiAoaW1wb3J0QXR0cmlidXRlcyAhPSBudWxsKSByZXF1ZXN0LndpdGggPSBzYW5pdGl6ZVN0cmluZ01hcChpbXBvcnRBdHRyaWJ1dGVzLCBcIndpdGhcIik7XG4gICAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdCwgKGVycm9yLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgICAgICAgICBlbHNlIHJlc29sdmUyKHtcbiAgICAgICAgICAgICAgZXJyb3JzOiByZXBsYWNlRGV0YWlsc0luTWVzc2FnZXMocmVzcG9uc2UuZXJyb3JzLCBkZXRhaWxzKSxcbiAgICAgICAgICAgICAgd2FybmluZ3M6IHJlcGxhY2VEZXRhaWxzSW5NZXNzYWdlcyhyZXNwb25zZS53YXJuaW5ncywgZGV0YWlscyksXG4gICAgICAgICAgICAgIHBhdGg6IHJlc3BvbnNlLnBhdGgsXG4gICAgICAgICAgICAgIGV4dGVybmFsOiByZXNwb25zZS5leHRlcm5hbCxcbiAgICAgICAgICAgICAgc2lkZUVmZmVjdHM6IHJlc3BvbnNlLnNpZGVFZmZlY3RzLFxuICAgICAgICAgICAgICBuYW1lc3BhY2U6IHJlc3BvbnNlLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgc3VmZml4OiByZXNwb25zZS5zdWZmaXgsXG4gICAgICAgICAgICAgIHBsdWdpbkRhdGE6IGRldGFpbHMubG9hZChyZXNwb25zZS5wbHVnaW5EYXRhKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGxldCBwcm9taXNlID0gc2V0dXAoe1xuICAgICAgICBpbml0aWFsT3B0aW9ucyxcbiAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgb25TdGFydChjYWxsYmFjaykge1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkVGV4dCA9IGBUaGlzIGVycm9yIGNhbWUgZnJvbSB0aGUgXCJvblN0YXJ0XCIgY2FsbGJhY2sgcmVnaXN0ZXJlZCBoZXJlOmA7XG4gICAgICAgICAgbGV0IHJlZ2lzdGVyZWROb3RlID0gZXh0cmFjdENhbGxlclY4KG5ldyBFcnJvcihyZWdpc3RlcmVkVGV4dCksIHN0cmVhbUluLCBcIm9uU3RhcnRcIik7XG4gICAgICAgICAgb25TdGFydENhbGxiYWNrcy5wdXNoKHsgbmFtZSwgY2FsbGJhY2ssIG5vdGU6IHJlZ2lzdGVyZWROb3RlIH0pO1xuICAgICAgICAgIHBsdWdpbi5vblN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FbmQoY2FsbGJhY2spIHtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZFRleHQgPSBgVGhpcyBlcnJvciBjYW1lIGZyb20gdGhlIFwib25FbmRcIiBjYWxsYmFjayByZWdpc3RlcmVkIGhlcmU6YDtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZE5vdGUgPSBleHRyYWN0Q2FsbGVyVjgobmV3IEVycm9yKHJlZ2lzdGVyZWRUZXh0KSwgc3RyZWFtSW4sIFwib25FbmRcIik7XG4gICAgICAgICAgb25FbmRDYWxsYmFja3MucHVzaCh7IG5hbWUsIGNhbGxiYWNrLCBub3RlOiByZWdpc3RlcmVkTm90ZSB9KTtcbiAgICAgICAgICBwbHVnaW4ub25FbmQgPSB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvblJlc29sdmUob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZFRleHQgPSBgVGhpcyBlcnJvciBjYW1lIGZyb20gdGhlIFwib25SZXNvbHZlXCIgY2FsbGJhY2sgcmVnaXN0ZXJlZCBoZXJlOmA7XG4gICAgICAgICAgbGV0IHJlZ2lzdGVyZWROb3RlID0gZXh0cmFjdENhbGxlclY4KG5ldyBFcnJvcihyZWdpc3RlcmVkVGV4dCksIHN0cmVhbUluLCBcIm9uUmVzb2x2ZVwiKTtcbiAgICAgICAgICBsZXQga2V5czIgPSB7fTtcbiAgICAgICAgICBsZXQgZmlsdGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJmaWx0ZXJcIiwgbXVzdEJlUmVnRXhwKTtcbiAgICAgICAgICBsZXQgbmFtZXNwYWNlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhvcHRpb25zLCBrZXlzMiwgYGluIG9uUmVzb2x2ZSgpIGNhbGwgZm9yIHBsdWdpbiAke3F1b3RlKG5hbWUpfWApO1xuICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGBvblJlc29sdmUoKSBjYWxsIGlzIG1pc3NpbmcgYSBmaWx0ZXJgKTtcbiAgICAgICAgICBsZXQgaWQgPSBuZXh0Q2FsbGJhY2tJRCsrO1xuICAgICAgICAgIG9uUmVzb2x2ZUNhbGxiYWNrc1tpZF0gPSB7IG5hbWUsIGNhbGxiYWNrLCBub3RlOiByZWdpc3RlcmVkTm90ZSB9O1xuICAgICAgICAgIHBsdWdpbi5vblJlc29sdmUucHVzaCh7IGlkLCBmaWx0ZXI6IGpzUmVnRXhwVG9Hb1JlZ0V4cChmaWx0ZXIpLCBuYW1lc3BhY2U6IG5hbWVzcGFjZSB8fCBcIlwiIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvbkxvYWQob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZFRleHQgPSBgVGhpcyBlcnJvciBjYW1lIGZyb20gdGhlIFwib25Mb2FkXCIgY2FsbGJhY2sgcmVnaXN0ZXJlZCBoZXJlOmA7XG4gICAgICAgICAgbGV0IHJlZ2lzdGVyZWROb3RlID0gZXh0cmFjdENhbGxlclY4KG5ldyBFcnJvcihyZWdpc3RlcmVkVGV4dCksIHN0cmVhbUluLCBcIm9uTG9hZFwiKTtcbiAgICAgICAgICBsZXQga2V5czIgPSB7fTtcbiAgICAgICAgICBsZXQgZmlsdGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJmaWx0ZXJcIiwgbXVzdEJlUmVnRXhwKTtcbiAgICAgICAgICBsZXQgbmFtZXNwYWNlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhvcHRpb25zLCBrZXlzMiwgYGluIG9uTG9hZCgpIGNhbGwgZm9yIHBsdWdpbiAke3F1b3RlKG5hbWUpfWApO1xuICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGBvbkxvYWQoKSBjYWxsIGlzIG1pc3NpbmcgYSBmaWx0ZXJgKTtcbiAgICAgICAgICBsZXQgaWQgPSBuZXh0Q2FsbGJhY2tJRCsrO1xuICAgICAgICAgIG9uTG9hZENhbGxiYWNrc1tpZF0gPSB7IG5hbWUsIGNhbGxiYWNrLCBub3RlOiByZWdpc3RlcmVkTm90ZSB9O1xuICAgICAgICAgIHBsdWdpbi5vbkxvYWQucHVzaCh7IGlkLCBmaWx0ZXI6IGpzUmVnRXhwVG9Hb1JlZ0V4cChmaWx0ZXIpLCBuYW1lc3BhY2U6IG5hbWVzcGFjZSB8fCBcIlwiIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvbkRpc3Bvc2UoY2FsbGJhY2spIHtcbiAgICAgICAgICBvbkRpc3Bvc2VDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGVzYnVpbGQ6IHN0cmVhbUluLmVzYnVpbGRcbiAgICAgIH0pO1xuICAgICAgaWYgKHByb21pc2UpIHlpZWxkIHByb21pc2U7XG4gICAgICByZXF1ZXN0UGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogZSwgcGx1Z2luTmFtZTogbmFtZSB9O1xuICAgIH1cbiAgfVxuICByZXF1ZXN0Q2FsbGJhY2tzW1wib24tc3RhcnRcIl0gPSAoaWQsIHJlcXVlc3QpID0+IF9fYXN5bmMobnVsbCwgbnVsbCwgZnVuY3Rpb24qICgpIHtcbiAgICBkZXRhaWxzLmNsZWFyKCk7XG4gICAgbGV0IHJlc3BvbnNlID0geyBlcnJvcnM6IFtdLCB3YXJuaW5nczogW10gfTtcbiAgICB5aWVsZCBQcm9taXNlLmFsbChvblN0YXJ0Q2FsbGJhY2tzLm1hcCgoXzApID0+IF9fYXN5bmMobnVsbCwgW18wXSwgZnVuY3Rpb24qICh7IG5hbWUsIGNhbGxiYWNrLCBub3RlIH0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB5aWVsZCBjYWxsYmFjaygpO1xuICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvblN0YXJ0KCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9IHRvIHJldHVybiBhbiBvYmplY3RgKTtcbiAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgIGxldCBlcnJvcnMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJlcnJvcnNcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgIGxldCB3YXJuaW5ncyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIndhcm5pbmdzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhyZXN1bHQsIGtleXMsIGBmcm9tIG9uU3RhcnQoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX1gKTtcbiAgICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpIHJlc3BvbnNlLmVycm9ycy5wdXNoKC4uLnNhbml0aXplTWVzc2FnZXMoZXJyb3JzLCBcImVycm9yc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApKTtcbiAgICAgICAgICBpZiAod2FybmluZ3MgIT0gbnVsbCkgcmVzcG9uc2Uud2FybmluZ3MucHVzaCguLi5zYW5pdGl6ZU1lc3NhZ2VzKHdhcm5pbmdzLCBcIndhcm5pbmdzXCIsIGRldGFpbHMsIG5hbWUsIHZvaWQgMCkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlc3BvbnNlLmVycm9ycy5wdXNoKGV4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgbm90ZSAmJiBub3RlKCksIG5hbWUpKTtcbiAgICAgIH1cbiAgICB9KSkpO1xuICAgIHNlbmRSZXNwb25zZShpZCwgcmVzcG9uc2UpO1xuICB9KTtcbiAgcmVxdWVzdENhbGxiYWNrc1tcIm9uLXJlc29sdmVcIl0gPSAoaWQsIHJlcXVlc3QpID0+IF9fYXN5bmMobnVsbCwgbnVsbCwgZnVuY3Rpb24qICgpIHtcbiAgICBsZXQgcmVzcG9uc2UgPSB7fSwgbmFtZSA9IFwiXCIsIGNhbGxiYWNrLCBub3RlO1xuICAgIGZvciAobGV0IGlkMiBvZiByZXF1ZXN0Lmlkcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHsgbmFtZSwgY2FsbGJhY2ssIG5vdGUgfSA9IG9uUmVzb2x2ZUNhbGxiYWNrc1tpZDJdKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIGNhbGxiYWNrKHtcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnBhdGgsXG4gICAgICAgICAgaW1wb3J0ZXI6IHJlcXVlc3QuaW1wb3J0ZXIsXG4gICAgICAgICAgbmFtZXNwYWNlOiByZXF1ZXN0Lm5hbWVzcGFjZSxcbiAgICAgICAgICByZXNvbHZlRGlyOiByZXF1ZXN0LnJlc29sdmVEaXIsXG4gICAgICAgICAga2luZDogcmVxdWVzdC5raW5kLFxuICAgICAgICAgIHBsdWdpbkRhdGE6IGRldGFpbHMubG9hZChyZXF1ZXN0LnBsdWdpbkRhdGEpLFxuICAgICAgICAgIHdpdGg6IHJlcXVlc3Qud2l0aFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb25SZXNvbHZlKCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9IHRvIHJldHVybiBhbiBvYmplY3RgKTtcbiAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgIGxldCBwbHVnaW5OYW1lID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBwYXRoID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwicGF0aFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBuYW1lc3BhY2UgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgc3VmZml4ID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwic3VmZml4XCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgbGV0IGV4dGVybmFsID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwiZXh0ZXJuYWxcIiwgbXVzdEJlQm9vbGVhbik7XG4gICAgICAgICAgbGV0IHNpZGVFZmZlY3RzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwic2lkZUVmZmVjdHNcIiwgbXVzdEJlQm9vbGVhbik7XG4gICAgICAgICAgbGV0IHBsdWdpbkRhdGEgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJwbHVnaW5EYXRhXCIsIGNhbkJlQW55dGhpbmcpO1xuICAgICAgICAgIGxldCBlcnJvcnMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJlcnJvcnNcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgIGxldCB3YXJuaW5ncyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIndhcm5pbmdzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICBsZXQgd2F0Y2hGaWxlcyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIndhdGNoRmlsZXNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICAgICAgICAgIGxldCB3YXRjaERpcnMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJ3YXRjaERpcnNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKHJlc3VsdCwga2V5cywgYGZyb20gb25SZXNvbHZlKCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICAgICAgcmVzcG9uc2UuaWQgPSBpZDI7XG4gICAgICAgICAgaWYgKHBsdWdpbk5hbWUgIT0gbnVsbCkgcmVzcG9uc2UucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWU7XG4gICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgcmVzcG9uc2UucGF0aCA9IHBhdGg7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKSByZXNwb25zZS5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgICAgICAgaWYgKHN1ZmZpeCAhPSBudWxsKSByZXNwb25zZS5zdWZmaXggPSBzdWZmaXg7XG4gICAgICAgICAgaWYgKGV4dGVybmFsICE9IG51bGwpIHJlc3BvbnNlLmV4dGVybmFsID0gZXh0ZXJuYWw7XG4gICAgICAgICAgaWYgKHNpZGVFZmZlY3RzICE9IG51bGwpIHJlc3BvbnNlLnNpZGVFZmZlY3RzID0gc2lkZUVmZmVjdHM7XG4gICAgICAgICAgaWYgKHBsdWdpbkRhdGEgIT0gbnVsbCkgcmVzcG9uc2UucGx1Z2luRGF0YSA9IGRldGFpbHMuc3RvcmUocGx1Z2luRGF0YSk7XG4gICAgICAgICAgaWYgKGVycm9ycyAhPSBudWxsKSByZXNwb25zZS5lcnJvcnMgPSBzYW5pdGl6ZU1lc3NhZ2VzKGVycm9ycywgXCJlcnJvcnNcIiwgZGV0YWlscywgbmFtZSwgdm9pZCAwKTtcbiAgICAgICAgICBpZiAod2FybmluZ3MgIT0gbnVsbCkgcmVzcG9uc2Uud2FybmluZ3MgPSBzYW5pdGl6ZU1lc3NhZ2VzKHdhcm5pbmdzLCBcIndhcm5pbmdzXCIsIGRldGFpbHMsIG5hbWUsIHZvaWQgMCk7XG4gICAgICAgICAgaWYgKHdhdGNoRmlsZXMgIT0gbnVsbCkgcmVzcG9uc2Uud2F0Y2hGaWxlcyA9IHNhbml0aXplU3RyaW5nQXJyYXkod2F0Y2hGaWxlcywgXCJ3YXRjaEZpbGVzXCIpO1xuICAgICAgICAgIGlmICh3YXRjaERpcnMgIT0gbnVsbCkgcmVzcG9uc2Uud2F0Y2hEaXJzID0gc2FuaXRpemVTdHJpbmdBcnJheSh3YXRjaERpcnMsIFwid2F0Y2hEaXJzXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlc3BvbnNlID0geyBpZDogaWQyLCBlcnJvcnM6IFtleHRyYWN0RXJyb3JNZXNzYWdlVjgoZSwgc3RyZWFtSW4sIGRldGFpbHMsIG5vdGUgJiYgbm90ZSgpLCBuYW1lKV0gfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHNlbmRSZXNwb25zZShpZCwgcmVzcG9uc2UpO1xuICB9KTtcbiAgcmVxdWVzdENhbGxiYWNrc1tcIm9uLWxvYWRcIl0gPSAoaWQsIHJlcXVlc3QpID0+IF9fYXN5bmMobnVsbCwgbnVsbCwgZnVuY3Rpb24qICgpIHtcbiAgICBsZXQgcmVzcG9uc2UgPSB7fSwgbmFtZSA9IFwiXCIsIGNhbGxiYWNrLCBub3RlO1xuICAgIGZvciAobGV0IGlkMiBvZiByZXF1ZXN0Lmlkcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHsgbmFtZSwgY2FsbGJhY2ssIG5vdGUgfSA9IG9uTG9hZENhbGxiYWNrc1tpZDJdKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIGNhbGxiYWNrKHtcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnBhdGgsXG4gICAgICAgICAgbmFtZXNwYWNlOiByZXF1ZXN0Lm5hbWVzcGFjZSxcbiAgICAgICAgICBzdWZmaXg6IHJlcXVlc3Quc3VmZml4LFxuICAgICAgICAgIHBsdWdpbkRhdGE6IGRldGFpbHMubG9hZChyZXF1ZXN0LnBsdWdpbkRhdGEpLFxuICAgICAgICAgIHdpdGg6IHJlcXVlc3Qud2l0aFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb25Mb2FkKCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9IHRvIHJldHVybiBhbiBvYmplY3RgKTtcbiAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgIGxldCBwbHVnaW5OYW1lID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBjb250ZW50cyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcImNvbnRlbnRzXCIsIG11c3RCZVN0cmluZ09yVWludDhBcnJheSk7XG4gICAgICAgICAgbGV0IHJlc29sdmVEaXIgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJyZXNvbHZlRGlyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgbGV0IHBsdWdpbkRhdGEgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJwbHVnaW5EYXRhXCIsIGNhbkJlQW55dGhpbmcpO1xuICAgICAgICAgIGxldCBsb2FkZXIgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJsb2FkZXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgZXJyb3JzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwiZXJyb3JzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICBsZXQgd2FybmluZ3MgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJ3YXJuaW5nc1wiLCBtdXN0QmVBcnJheSk7XG4gICAgICAgICAgbGV0IHdhdGNoRmlsZXMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJ3YXRjaEZpbGVzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgICAgICAgICBsZXQgd2F0Y2hEaXJzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwid2F0Y2hEaXJzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhyZXN1bHQsIGtleXMsIGBmcm9tIG9uTG9hZCgpIGNhbGxiYWNrIGluIHBsdWdpbiAke3F1b3RlKG5hbWUpfWApO1xuICAgICAgICAgIHJlc3BvbnNlLmlkID0gaWQyO1xuICAgICAgICAgIGlmIChwbHVnaW5OYW1lICE9IG51bGwpIHJlc3BvbnNlLnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lO1xuICAgICAgICAgIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJlc3BvbnNlLmNvbnRlbnRzID0gY29udGVudHM7XG4gICAgICAgICAgZWxzZSBpZiAoY29udGVudHMgIT0gbnVsbCkgcmVzcG9uc2UuY29udGVudHMgPSBlbmNvZGVVVEY4KGNvbnRlbnRzKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZURpciAhPSBudWxsKSByZXNwb25zZS5yZXNvbHZlRGlyID0gcmVzb2x2ZURpcjtcbiAgICAgICAgICBpZiAocGx1Z2luRGF0YSAhPSBudWxsKSByZXNwb25zZS5wbHVnaW5EYXRhID0gZGV0YWlscy5zdG9yZShwbHVnaW5EYXRhKTtcbiAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHJlc3BvbnNlLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpIHJlc3BvbnNlLmVycm9ycyA9IHNhbml0aXplTWVzc2FnZXMoZXJyb3JzLCBcImVycm9yc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApO1xuICAgICAgICAgIGlmICh3YXJuaW5ncyAhPSBudWxsKSByZXNwb25zZS53YXJuaW5ncyA9IHNhbml0aXplTWVzc2FnZXMod2FybmluZ3MsIFwid2FybmluZ3NcIiwgZGV0YWlscywgbmFtZSwgdm9pZCAwKTtcbiAgICAgICAgICBpZiAod2F0Y2hGaWxlcyAhPSBudWxsKSByZXNwb25zZS53YXRjaEZpbGVzID0gc2FuaXRpemVTdHJpbmdBcnJheSh3YXRjaEZpbGVzLCBcIndhdGNoRmlsZXNcIik7XG4gICAgICAgICAgaWYgKHdhdGNoRGlycyAhPSBudWxsKSByZXNwb25zZS53YXRjaERpcnMgPSBzYW5pdGl6ZVN0cmluZ0FycmF5KHdhdGNoRGlycywgXCJ3YXRjaERpcnNcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB7IGlkOiBpZDIsIGVycm9yczogW2V4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgbm90ZSAmJiBub3RlKCksIG5hbWUpXSB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgc2VuZFJlc3BvbnNlKGlkLCByZXNwb25zZSk7XG4gIH0pO1xuICBsZXQgcnVuT25FbmRDYWxsYmFja3MgPSAocmVzdWx0LCBkb25lKSA9PiBkb25lKFtdLCBbXSk7XG4gIGlmIChvbkVuZENhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgcnVuT25FbmRDYWxsYmFja3MgPSAocmVzdWx0LCBkb25lKSA9PiB7XG4gICAgICAoKCkgPT4gX19hc3luYyhudWxsLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBvbkVuZEVycm9ycyA9IFtdO1xuICAgICAgICBjb25zdCBvbkVuZFdhcm5pbmdzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgeyBuYW1lLCBjYWxsYmFjaywgbm90ZSB9IG9mIG9uRW5kQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgbGV0IG5ld0Vycm9ycztcbiAgICAgICAgICBsZXQgbmV3V2FybmluZ3M7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0geWllbGQgY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb25FbmQoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX0gdG8gcmV0dXJuIGFuIG9iamVjdGApO1xuICAgICAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgICAgICBsZXQgZXJyb3JzID0gZ2V0RmxhZyh2YWx1ZSwga2V5cywgXCJlcnJvcnNcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgICAgICBsZXQgd2FybmluZ3MgPSBnZXRGbGFnKHZhbHVlLCBrZXlzLCBcIndhcm5pbmdzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3ModmFsdWUsIGtleXMsIGBmcm9tIG9uRW5kKCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICAgICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkgbmV3RXJyb3JzID0gc2FuaXRpemVNZXNzYWdlcyhlcnJvcnMsIFwiZXJyb3JzXCIsIGRldGFpbHMsIG5hbWUsIHZvaWQgMCk7XG4gICAgICAgICAgICAgIGlmICh3YXJuaW5ncyAhPSBudWxsKSBuZXdXYXJuaW5ncyA9IHNhbml0aXplTWVzc2FnZXMod2FybmluZ3MsIFwid2FybmluZ3NcIiwgZGV0YWlscywgbmFtZSwgdm9pZCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBuZXdFcnJvcnMgPSBbZXh0cmFjdEVycm9yTWVzc2FnZVY4KGUsIHN0cmVhbUluLCBkZXRhaWxzLCBub3RlICYmIG5vdGUoKSwgbmFtZSldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmV3RXJyb3JzKSB7XG4gICAgICAgICAgICBvbkVuZEVycm9ycy5wdXNoKC4uLm5ld0Vycm9ycyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2goLi4ubmV3RXJyb3JzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5ld1dhcm5pbmdzKSB7XG4gICAgICAgICAgICBvbkVuZFdhcm5pbmdzLnB1c2goLi4ubmV3V2FybmluZ3MpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmVzdWx0Lndhcm5pbmdzLnB1c2goLi4ubmV3V2FybmluZ3MpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkb25lKG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKTtcbiAgICAgIH0pKSgpO1xuICAgIH07XG4gIH1cbiAgbGV0IHNjaGVkdWxlT25EaXNwb3NlQ2FsbGJhY2tzID0gKCkgPT4ge1xuICAgIGZvciAoY29uc3QgY2Igb2Ygb25EaXNwb3NlQ2FsbGJhY2tzKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGNiKCksIDApO1xuICAgIH1cbiAgfTtcbiAgaXNTZXR1cERvbmUgPSB0cnVlO1xuICByZXR1cm4ge1xuICAgIG9rOiB0cnVlLFxuICAgIHJlcXVlc3RQbHVnaW5zLFxuICAgIHJ1bk9uRW5kQ2FsbGJhY2tzLFxuICAgIHNjaGVkdWxlT25EaXNwb3NlQ2FsbGJhY2tzXG4gIH07XG59KTtcbmZ1bmN0aW9uIGNyZWF0ZU9iamVjdFN0YXNoKCkge1xuICBjb25zdCBtYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgbmV4dElEID0gMDtcbiAgcmV0dXJuIHtcbiAgICBjbGVhcigpIHtcbiAgICAgIG1hcC5jbGVhcigpO1xuICAgIH0sXG4gICAgbG9hZChpZCkge1xuICAgICAgcmV0dXJuIG1hcC5nZXQoaWQpO1xuICAgIH0sXG4gICAgc3RvcmUodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSByZXR1cm4gLTE7XG4gICAgICBjb25zdCBpZCA9IG5leHRJRCsrO1xuICAgICAgbWFwLnNldChpZCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RDYWxsZXJWOChlLCBzdHJlYW1JbiwgaWRlbnQpIHtcbiAgbGV0IG5vdGU7XG4gIGxldCB0cmllZCA9IGZhbHNlO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmICh0cmllZCkgcmV0dXJuIG5vdGU7XG4gICAgdHJpZWQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBsZXQgbGluZXMgPSAoZS5zdGFjayArIFwiXCIpLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgbGluZXMuc3BsaWNlKDEsIDEpO1xuICAgICAgbGV0IGxvY2F0aW9uMiA9IHBhcnNlU3RhY2tMaW5lc1Y4KHN0cmVhbUluLCBsaW5lcywgaWRlbnQpO1xuICAgICAgaWYgKGxvY2F0aW9uMikge1xuICAgICAgICBub3RlID0geyB0ZXh0OiBlLm1lc3NhZ2UsIGxvY2F0aW9uOiBsb2NhdGlvbjIgfTtcbiAgICAgICAgcmV0dXJuIG5vdGU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTIpIHtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBleHRyYWN0RXJyb3JNZXNzYWdlVjgoZSwgc3RyZWFtSW4sIHN0YXNoLCBub3RlLCBwbHVnaW5OYW1lKSB7XG4gIGxldCB0ZXh0ID0gXCJJbnRlcm5hbCBlcnJvclwiO1xuICBsZXQgbG9jYXRpb24yID0gbnVsbDtcbiAgdHJ5IHtcbiAgICB0ZXh0ID0gKGUgJiYgZS5tZXNzYWdlIHx8IGUpICsgXCJcIjtcbiAgfSBjYXRjaCAoZTIpIHtcbiAgfVxuICB0cnkge1xuICAgIGxvY2F0aW9uMiA9IHBhcnNlU3RhY2tMaW5lc1Y4KHN0cmVhbUluLCAoZS5zdGFjayArIFwiXCIpLnNwbGl0KFwiXFxuXCIpLCBcIlwiKTtcbiAgfSBjYXRjaCAoZTIpIHtcbiAgfVxuICByZXR1cm4geyBpZDogXCJcIiwgcGx1Z2luTmFtZSwgdGV4dCwgbG9jYXRpb246IGxvY2F0aW9uMiwgbm90ZXM6IG5vdGUgPyBbbm90ZV0gOiBbXSwgZGV0YWlsOiBzdGFzaCA/IHN0YXNoLnN0b3JlKGUpIDogLTEgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlU3RhY2tMaW5lc1Y4KHN0cmVhbUluLCBsaW5lcywgaWRlbnQpIHtcbiAgbGV0IGF0ID0gXCIgICAgYXQgXCI7XG4gIGlmIChzdHJlYW1Jbi5yZWFkRmlsZVN5bmMgJiYgIWxpbmVzWzBdLnN0YXJ0c1dpdGgoYXQpICYmIGxpbmVzWzFdLnN0YXJ0c1dpdGgoYXQpKSB7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKGF0KSkgY29udGludWU7XG4gICAgICBsaW5lID0gbGluZS5zbGljZShhdC5sZW5ndGgpO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gL14oPzpuZXcgfGFzeW5jICk/XFxTKyBcXCgoLiopXFwpJC8uZXhlYyhsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgbGluZSA9IG1hdGNoWzFdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoID0gL15ldmFsIGF0IFxcUysgXFwoKC4qKVxcKSg/OiwgXFxTKzpcXGQrOlxcZCspPyQvLmV4ZWMobGluZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGxpbmUgPSBtYXRjaFsxXTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBtYXRjaCA9IC9eKFxcUyspOihcXGQrKTooXFxkKykkLy5leGVjKGxpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsZXQgY29udGVudHM7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnRlbnRzID0gc3RyZWFtSW4ucmVhZEZpbGVTeW5jKG1hdGNoWzFdLCBcInV0ZjhcIik7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBsaW5lVGV4dCA9IGNvbnRlbnRzLnNwbGl0KC9cXHJcXG58XFxyfFxcbnxcXHUyMDI4fFxcdTIwMjkvKVsrbWF0Y2hbMl0gLSAxXSB8fCBcIlwiO1xuICAgICAgICAgIGxldCBjb2x1bW4gPSArbWF0Y2hbM10gLSAxO1xuICAgICAgICAgIGxldCBsZW5ndGggPSBsaW5lVGV4dC5zbGljZShjb2x1bW4sIGNvbHVtbiArIGlkZW50Lmxlbmd0aCkgPT09IGlkZW50ID8gaWRlbnQubGVuZ3RoIDogMDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICBuYW1lc3BhY2U6IFwiZmlsZVwiLFxuICAgICAgICAgICAgbGluZTogK21hdGNoWzJdLFxuICAgICAgICAgICAgY29sdW1uOiBlbmNvZGVVVEY4KGxpbmVUZXh0LnNsaWNlKDAsIGNvbHVtbikpLmxlbmd0aCxcbiAgICAgICAgICAgIGxlbmd0aDogZW5jb2RlVVRGOChsaW5lVGV4dC5zbGljZShjb2x1bW4sIGNvbHVtbiArIGxlbmd0aCkpLmxlbmd0aCxcbiAgICAgICAgICAgIGxpbmVUZXh0OiBsaW5lVGV4dCArIFwiXFxuXCIgKyBsaW5lcy5zbGljZSgxKS5qb2luKFwiXFxuXCIpLFxuICAgICAgICAgICAgc3VnZ2VzdGlvbjogXCJcIlxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZmFpbHVyZUVycm9yV2l0aExvZyh0ZXh0LCBlcnJvcnMsIHdhcm5pbmdzKSB7XG4gIGxldCBsaW1pdCA9IDU7XG4gIHRleHQgKz0gZXJyb3JzLmxlbmd0aCA8IDEgPyBcIlwiIDogYCB3aXRoICR7ZXJyb3JzLmxlbmd0aH0gZXJyb3Ike2Vycm9ycy5sZW5ndGggPCAyID8gXCJcIiA6IFwic1wifTpgICsgZXJyb3JzLnNsaWNlKDAsIGxpbWl0ICsgMSkubWFwKChlLCBpKSA9PiB7XG4gICAgaWYgKGkgPT09IGxpbWl0KSByZXR1cm4gXCJcXG4uLi5cIjtcbiAgICBpZiAoIWUubG9jYXRpb24pIHJldHVybiBgXG5lcnJvcjogJHtlLnRleHR9YDtcbiAgICBsZXQgeyBmaWxlLCBsaW5lLCBjb2x1bW4gfSA9IGUubG9jYXRpb247XG4gICAgbGV0IHBsdWdpblRleHQgPSBlLnBsdWdpbk5hbWUgPyBgW3BsdWdpbjogJHtlLnBsdWdpbk5hbWV9XSBgIDogXCJcIjtcbiAgICByZXR1cm4gYFxuJHtmaWxlfToke2xpbmV9OiR7Y29sdW1ufTogRVJST1I6ICR7cGx1Z2luVGV4dH0ke2UudGV4dH1gO1xuICB9KS5qb2luKFwiXCIpO1xuICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IodGV4dCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIFtbXCJlcnJvcnNcIiwgZXJyb3JzXSwgW1wid2FybmluZ3NcIiwgd2FybmluZ3NdXSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwga2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiAoKSA9PiB2YWx1ZSxcbiAgICAgIHNldDogKHZhbHVlMikgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCBrZXksIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogdmFsdWUyXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VEZXRhaWxzSW5NZXNzYWdlcyhtZXNzYWdlcywgc3Rhc2gpIHtcbiAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XG4gICAgbWVzc2FnZS5kZXRhaWwgPSBzdGFzaC5sb2FkKG1lc3NhZ2UuZGV0YWlsKTtcbiAgfVxuICByZXR1cm4gbWVzc2FnZXM7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZUxvY2F0aW9uKGxvY2F0aW9uMiwgd2hlcmUsIHRlcm1pbmFsV2lkdGgpIHtcbiAgaWYgKGxvY2F0aW9uMiA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgbGV0IGtleXMgPSB7fTtcbiAgbGV0IGZpbGUgPSBnZXRGbGFnKGxvY2F0aW9uMiwga2V5cywgXCJmaWxlXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBuYW1lc3BhY2UgPSBnZXRGbGFnKGxvY2F0aW9uMiwga2V5cywgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGxpbmUgPSBnZXRGbGFnKGxvY2F0aW9uMiwga2V5cywgXCJsaW5lXCIsIG11c3RCZUludGVnZXIpO1xuICBsZXQgY29sdW1uID0gZ2V0RmxhZyhsb2NhdGlvbjIsIGtleXMsIFwiY29sdW1uXCIsIG11c3RCZUludGVnZXIpO1xuICBsZXQgbGVuZ3RoID0gZ2V0RmxhZyhsb2NhdGlvbjIsIGtleXMsIFwibGVuZ3RoXCIsIG11c3RCZUludGVnZXIpO1xuICBsZXQgbGluZVRleHQgPSBnZXRGbGFnKGxvY2F0aW9uMiwga2V5cywgXCJsaW5lVGV4dFwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgc3VnZ2VzdGlvbiA9IGdldEZsYWcobG9jYXRpb24yLCBrZXlzLCBcInN1Z2dlc3Rpb25cIiwgbXVzdEJlU3RyaW5nKTtcbiAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MobG9jYXRpb24yLCBrZXlzLCB3aGVyZSk7XG4gIGlmIChsaW5lVGV4dCkge1xuICAgIGNvbnN0IHJlbGV2YW50QVNDSUkgPSBsaW5lVGV4dC5zbGljZShcbiAgICAgIDAsXG4gICAgICAoY29sdW1uICYmIGNvbHVtbiA+IDAgPyBjb2x1bW4gOiAwKSArIChsZW5ndGggJiYgbGVuZ3RoID4gMCA/IGxlbmd0aCA6IDApICsgKHRlcm1pbmFsV2lkdGggJiYgdGVybWluYWxXaWR0aCA+IDAgPyB0ZXJtaW5hbFdpZHRoIDogODApXG4gICAgKTtcbiAgICBpZiAoIS9bXFx4N0YtXFx1RkZGRl0vLnRlc3QocmVsZXZhbnRBU0NJSSkgJiYgIS9cXG4vLnRlc3QobGluZVRleHQpKSB7XG4gICAgICBsaW5lVGV4dCA9IHJlbGV2YW50QVNDSUk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZmlsZTogZmlsZSB8fCBcIlwiLFxuICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlIHx8IFwiXCIsXG4gICAgbGluZTogbGluZSB8fCAwLFxuICAgIGNvbHVtbjogY29sdW1uIHx8IDAsXG4gICAgbGVuZ3RoOiBsZW5ndGggfHwgMCxcbiAgICBsaW5lVGV4dDogbGluZVRleHQgfHwgXCJcIixcbiAgICBzdWdnZXN0aW9uOiBzdWdnZXN0aW9uIHx8IFwiXCJcbiAgfTtcbn1cbmZ1bmN0aW9uIHNhbml0aXplTWVzc2FnZXMobWVzc2FnZXMsIHByb3BlcnR5LCBzdGFzaCwgZmFsbGJhY2tQbHVnaW5OYW1lLCB0ZXJtaW5hbFdpZHRoKSB7XG4gIGxldCBtZXNzYWdlc0Nsb25lID0gW107XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgIGxldCBrZXlzID0ge307XG4gICAgbGV0IGlkID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcImlkXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IHBsdWdpbk5hbWUgPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGxldCB0ZXh0ID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcInRleHRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICBsZXQgbG9jYXRpb24yID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcImxvY2F0aW9uXCIsIG11c3RCZU9iamVjdE9yTnVsbCk7XG4gICAgbGV0IG5vdGVzID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcIm5vdGVzXCIsIG11c3RCZUFycmF5KTtcbiAgICBsZXQgZGV0YWlsID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcImRldGFpbFwiLCBjYW5CZUFueXRoaW5nKTtcbiAgICBsZXQgd2hlcmUgPSBgaW4gZWxlbWVudCAke2luZGV4fSBvZiBcIiR7cHJvcGVydHl9XCJgO1xuICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG1lc3NhZ2UsIGtleXMsIHdoZXJlKTtcbiAgICBsZXQgbm90ZXNDbG9uZSA9IFtdO1xuICAgIGlmIChub3Rlcykge1xuICAgICAgZm9yIChjb25zdCBub3RlIG9mIG5vdGVzKSB7XG4gICAgICAgIGxldCBub3RlS2V5cyA9IHt9O1xuICAgICAgICBsZXQgbm90ZVRleHQgPSBnZXRGbGFnKG5vdGUsIG5vdGVLZXlzLCBcInRleHRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IG5vdGVMb2NhdGlvbiA9IGdldEZsYWcobm90ZSwgbm90ZUtleXMsIFwibG9jYXRpb25cIiwgbXVzdEJlT2JqZWN0T3JOdWxsKTtcbiAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mobm90ZSwgbm90ZUtleXMsIHdoZXJlKTtcbiAgICAgICAgbm90ZXNDbG9uZS5wdXNoKHtcbiAgICAgICAgICB0ZXh0OiBub3RlVGV4dCB8fCBcIlwiLFxuICAgICAgICAgIGxvY2F0aW9uOiBzYW5pdGl6ZUxvY2F0aW9uKG5vdGVMb2NhdGlvbiwgd2hlcmUsIHRlcm1pbmFsV2lkdGgpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBtZXNzYWdlc0Nsb25lLnB1c2goe1xuICAgICAgaWQ6IGlkIHx8IFwiXCIsXG4gICAgICBwbHVnaW5OYW1lOiBwbHVnaW5OYW1lIHx8IGZhbGxiYWNrUGx1Z2luTmFtZSxcbiAgICAgIHRleHQ6IHRleHQgfHwgXCJcIixcbiAgICAgIGxvY2F0aW9uOiBzYW5pdGl6ZUxvY2F0aW9uKGxvY2F0aW9uMiwgd2hlcmUsIHRlcm1pbmFsV2lkdGgpLFxuICAgICAgbm90ZXM6IG5vdGVzQ2xvbmUsXG4gICAgICBkZXRhaWw6IHN0YXNoID8gc3Rhc2guc3RvcmUoZGV0YWlsKSA6IC0xXG4gICAgfSk7XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gbWVzc2FnZXNDbG9uZTtcbn1cbmZ1bmN0aW9uIHNhbml0aXplU3RyaW5nQXJyYXkodmFsdWVzLCBwcm9wZXJ0eSkge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoYCR7cXVvdGUocHJvcGVydHkpfSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3NgKTtcbiAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNhbml0aXplU3RyaW5nTWFwKG1hcCwgcHJvcGVydHkpIHtcbiAgY29uc3QgcmVzdWx0ID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgIGNvbnN0IHZhbHVlID0gbWFwW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKGBrZXkgJHtxdW90ZShrZXkpfSBpbiBvYmplY3QgJHtxdW90ZShwcm9wZXJ0eSl9IG11c3QgYmUgYSBzdHJpbmdgKTtcbiAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjb252ZXJ0T3V0cHV0RmlsZXMoeyBwYXRoLCBjb250ZW50cywgaGFzaCB9KSB7XG4gIGxldCB0ZXh0ID0gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBwYXRoLFxuICAgIGNvbnRlbnRzLFxuICAgIGhhc2gsXG4gICAgZ2V0IHRleHQoKSB7XG4gICAgICBjb25zdCBiaW5hcnkgPSB0aGlzLmNvbnRlbnRzO1xuICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgYmluYXJ5ICE9PSBjb250ZW50cykge1xuICAgICAgICBjb250ZW50cyA9IGJpbmFyeTtcbiAgICAgICAgdGV4dCA9IGRlY29kZVVURjgoYmluYXJ5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGpzUmVnRXhwVG9Hb1JlZ0V4cChyZWdleHApIHtcbiAgbGV0IHJlc3VsdCA9IHJlZ2V4cC5zb3VyY2U7XG4gIGlmIChyZWdleHAuZmxhZ3MpIHJlc3VsdCA9IGAoPyR7cmVnZXhwLmZsYWdzfSkke3Jlc3VsdH1gO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBsaWIvbnBtL2Jyb3dzZXIudHNcbnZhciB2ZXJzaW9uID0gXCIwLjI3LjFcIjtcbnZhciBidWlsZCA9IChvcHRpb25zKSA9PiBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCkuYnVpbGQob3B0aW9ucyk7XG52YXIgY29udGV4dCA9IChvcHRpb25zKSA9PiBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCkuY29udGV4dChvcHRpb25zKTtcbnZhciB0cmFuc2Zvcm0gPSAoaW5wdXQsIG9wdGlvbnMpID0+IGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcoKS50cmFuc2Zvcm0oaW5wdXQsIG9wdGlvbnMpO1xudmFyIGZvcm1hdE1lc3NhZ2VzID0gKG1lc3NhZ2VzLCBvcHRpb25zKSA9PiBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCkuZm9ybWF0TWVzc2FnZXMobWVzc2FnZXMsIG9wdGlvbnMpO1xudmFyIGFuYWx5emVNZXRhZmlsZSA9IChtZXRhZmlsZSwgb3B0aW9ucykgPT4gZW5zdXJlU2VydmljZUlzUnVubmluZygpLmFuYWx5emVNZXRhZmlsZShtZXRhZmlsZSwgb3B0aW9ucyk7XG52YXIgYnVpbGRTeW5jID0gKCkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcImJ1aWxkU3luY1wiIEFQSSBvbmx5IHdvcmtzIGluIG5vZGVgKTtcbn07XG52YXIgdHJhbnNmb3JtU3luYyA9ICgpID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKGBUaGUgXCJ0cmFuc2Zvcm1TeW5jXCIgQVBJIG9ubHkgd29ya3MgaW4gbm9kZWApO1xufTtcbnZhciBmb3JtYXRNZXNzYWdlc1N5bmMgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihgVGhlIFwiZm9ybWF0TWVzc2FnZXNTeW5jXCIgQVBJIG9ubHkgd29ya3MgaW4gbm9kZWApO1xufTtcbnZhciBhbmFseXplTWV0YWZpbGVTeW5jID0gKCkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcImFuYWx5emVNZXRhZmlsZVN5bmNcIiBBUEkgb25seSB3b3JrcyBpbiBub2RlYCk7XG59O1xudmFyIHN0b3AgPSAoKSA9PiB7XG4gIGlmIChzdG9wU2VydmljZSkgc3RvcFNlcnZpY2UoKTtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcbnZhciBpbml0aWFsaXplUHJvbWlzZTtcbnZhciBzdG9wU2VydmljZTtcbnZhciBsb25nTGl2ZWRTZXJ2aWNlO1xudmFyIGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcgPSAoKSA9PiB7XG4gIGlmIChsb25nTGl2ZWRTZXJ2aWNlKSByZXR1cm4gbG9uZ0xpdmVkU2VydmljZTtcbiAgaWYgKGluaXRpYWxpemVQcm9taXNlKSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gXCJpbml0aWFsaXplXCIgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcycpO1xuICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIGNhbGwgXCJpbml0aWFsaXplXCIgYmVmb3JlIGNhbGxpbmcgdGhpcycpO1xufTtcbnZhciBpbml0aWFsaXplID0gKG9wdGlvbnMpID0+IHtcbiAgb3B0aW9ucyA9IHZhbGlkYXRlSW5pdGlhbGl6ZU9wdGlvbnMob3B0aW9ucyB8fCB7fSk7XG4gIGxldCB3YXNtVVJMID0gb3B0aW9ucy53YXNtVVJMO1xuICBsZXQgd2FzbU1vZHVsZSA9IG9wdGlvbnMud2FzbU1vZHVsZTtcbiAgbGV0IHVzZVdvcmtlciA9IG9wdGlvbnMud29ya2VyICE9PSBmYWxzZTtcbiAgaWYgKCF3YXNtVVJMICYmICF3YXNtTW9kdWxlKSB0aHJvdyBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBlaXRoZXIgdGhlIFwid2FzbVVSTFwiIG9wdGlvbiBvciB0aGUgXCJ3YXNtTW9kdWxlXCIgb3B0aW9uJyk7XG4gIGlmIChpbml0aWFsaXplUHJvbWlzZSkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBcImluaXRpYWxpemVcIiBtb3JlIHRoYW4gb25jZScpO1xuICBpbml0aWFsaXplUHJvbWlzZSA9IHN0YXJ0UnVubmluZ1NlcnZpY2Uod2FzbVVSTCB8fCBcIlwiLCB3YXNtTW9kdWxlLCB1c2VXb3JrZXIpO1xuICBpbml0aWFsaXplUHJvbWlzZS5jYXRjaCgoKSA9PiB7XG4gICAgaW5pdGlhbGl6ZVByb21pc2UgPSB2b2lkIDA7XG4gIH0pO1xuICByZXR1cm4gaW5pdGlhbGl6ZVByb21pc2U7XG59O1xudmFyIHN0YXJ0UnVubmluZ1NlcnZpY2UgPSAod2FzbVVSTCwgd2FzbU1vZHVsZSwgdXNlV29ya2VyKSA9PiBfX2FzeW5jKG51bGwsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XG4gIGxldCB3b3JrZXI7XG4gIGxldCByZWplY3RBbGxXaXRoO1xuICBjb25zdCByZWplY3RBbGxQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHJlamVjdEFsbFdpdGggPSByZXNvbHZlKTtcbiAgaWYgKHVzZVdvcmtlcikge1xuICAgIGxldCBibG9iID0gbmV3IEJsb2IoW2Bvbm1lc3NhZ2U9JHsnKChwb3N0TWVzc2FnZSkgPT4ge1xcbiAgICAgIC8vIENvcHlyaWdodCAyMDE4IFRoZSBHbyBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxcbiAgICAgIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlXFxuICAgICAgLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxcbiAgICAgIHZhciBfX2FzeW5jID0gKF9fdGhpcywgX19hcmd1bWVudHMsIGdlbmVyYXRvcikgPT4ge1xcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcXG4gICAgICAgICAgdmFyIGZ1bGZpbGxlZCA9ICh2YWx1ZSkgPT4ge1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgcmVqZWN0KGUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfTtcXG4gICAgICAgICAgdmFyIHJlamVjdGVkID0gKHZhbHVlKSA9PiB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLnRocm93KHZhbHVlKSk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgcmVqZWN0KGUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfTtcXG4gICAgICAgICAgdmFyIHN0ZXAgPSAoeCkgPT4geC5kb25lID8gcmVzb2x2ZSh4LnZhbHVlKSA6IFByb21pc2UucmVzb2x2ZSh4LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xcbiAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkoX190aGlzLCBfX2FyZ3VtZW50cykpLm5leHQoKSk7XFxuICAgICAgICB9KTtcXG4gICAgICB9O1xcbiAgICAgIGxldCBvbm1lc3NhZ2U7XFxuICAgICAgbGV0IGdsb2JhbFRoaXMgPSB7fTtcXG4gICAgICBmb3IgKGxldCBvID0gc2VsZjsgbzsgbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKSlcXG4gICAgICAgIGZvciAobGV0IGsgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykpXFxuICAgICAgICAgIGlmICghKGsgaW4gZ2xvYmFsVGhpcykpXFxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIGssIHsgZ2V0OiAoKSA9PiBzZWxmW2tdIH0pO1xcbiAgICAgIFwidXNlIHN0cmljdFwiO1xcbiAgICAgICgoKSA9PiB7XFxuICAgICAgICBjb25zdCBlbm9zeXMgPSAoKSA9PiB7XFxuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcXG4gICAgICAgICAgZXJyLmNvZGUgPSBcIkVOT1NZU1wiO1xcbiAgICAgICAgICByZXR1cm4gZXJyO1xcbiAgICAgICAgfTtcXG4gICAgICAgIGlmICghZ2xvYmFsVGhpcy5mcykge1xcbiAgICAgICAgICBsZXQgb3V0cHV0QnVmID0gXCJcIjtcXG4gICAgICAgICAgZ2xvYmFsVGhpcy5mcyA9IHtcXG4gICAgICAgICAgICBjb25zdGFudHM6IHsgT19XUk9OTFk6IC0xLCBPX1JEV1I6IC0xLCBPX0NSRUFUOiAtMSwgT19UUlVOQzogLTEsIE9fQVBQRU5EOiAtMSwgT19FWENMOiAtMSwgT19ESVJFQ1RPUlk6IC0xIH0sXFxuICAgICAgICAgICAgLy8gdW51c2VkXFxuICAgICAgICAgICAgd3JpdGVTeW5jKGZkLCBidWYpIHtcXG4gICAgICAgICAgICAgIG91dHB1dEJ1ZiArPSBkZWNvZGVyLmRlY29kZShidWYpO1xcbiAgICAgICAgICAgICAgY29uc3QgbmwgPSBvdXRwdXRCdWYubGFzdEluZGV4T2YoXCJcXFxcblwiKTtcXG4gICAgICAgICAgICAgIGlmIChubCAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvdXRwdXRCdWYuc3Vic3RyaW5nKDAsIG5sKSk7XFxuICAgICAgICAgICAgICAgIG91dHB1dEJ1ZiA9IG91dHB1dEJ1Zi5zdWJzdHJpbmcobmwgKyAxKTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIHJldHVybiBidWYubGVuZ3RoO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgd3JpdGUoZmQsIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPT0gMCB8fCBsZW5ndGggIT09IGJ1Zi5sZW5ndGggfHwgcG9zaXRpb24gIT09IG51bGwpIHtcXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy53cml0ZVN5bmMoZmQsIGJ1Zik7XFxuICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBuKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGNobW9kKHBhdGgsIG1vZGUsIGNhbGxiYWNrKSB7XFxuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBjaG93bihwYXRoLCB1aWQsIGdpZCwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGNsb3NlKGZkLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZmNobW9kKGZkLCBtb2RlLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZmNob3duKGZkLCB1aWQsIGdpZCwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGZzdGF0KGZkLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZnN5bmMoZmQsIGNhbGxiYWNrKSB7XFxuICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGZ0cnVuY2F0ZShmZCwgbGVuZ3RoLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgbGNob3duKHBhdGgsIHVpZCwgZ2lkLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgbGluayhwYXRoLCBsaW5rLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgbHN0YXQocGF0aCwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIG1rZGlyKHBhdGgsIHBlcm0sIGNhbGxiYWNrKSB7XFxuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBvcGVuKHBhdGgsIGZsYWdzLCBtb2RlLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XFxuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICByZWFkZGlyKHBhdGgsIGNhbGxiYWNrKSB7XFxuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICByZWFkbGluayhwYXRoLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcmVuYW1lKGZyb20sIHRvLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcm1kaXIocGF0aCwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHN0YXQocGF0aCwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHN5bWxpbmsocGF0aCwgbGluaywgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHRydW5jYXRlKHBhdGgsIGxlbmd0aCwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHVubGluayhwYXRoLCBjYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgdXRpbWVzKHBhdGgsIGF0aW1lLCBtdGltZSwgY2FsbGJhY2spIHtcXG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH07XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIWdsb2JhbFRoaXMucHJvY2Vzcykge1xcbiAgICAgICAgICBnbG9iYWxUaGlzLnByb2Nlc3MgPSB7XFxuICAgICAgICAgICAgZ2V0dWlkKCkge1xcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZ2V0Z2lkKCkge1xcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZ2V0ZXVpZCgpIHtcXG4gICAgICAgICAgICAgIHJldHVybiAtMTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGdldGVnaWQoKSB7XFxuICAgICAgICAgICAgICByZXR1cm4gLTE7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBnZXRncm91cHMoKSB7XFxuICAgICAgICAgICAgICB0aHJvdyBlbm9zeXMoKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpZDogLTEsXFxuICAgICAgICAgICAgcHBpZDogLTEsXFxuICAgICAgICAgICAgdW1hc2soKSB7XFxuICAgICAgICAgICAgICB0aHJvdyBlbm9zeXMoKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGN3ZCgpIHtcXG4gICAgICAgICAgICAgIHRocm93IGVub3N5cygpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgY2hkaXIoKSB7XFxuICAgICAgICAgICAgICB0aHJvdyBlbm9zeXMoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH07XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIWdsb2JhbFRoaXMucGF0aCkge1xcbiAgICAgICAgICBnbG9iYWxUaGlzLnBhdGggPSB7XFxuICAgICAgICAgICAgcmVzb2x2ZSguLi5wYXRoU2VnbWVudHMpIHtcXG4gICAgICAgICAgICAgIHJldHVybiBwYXRoU2VnbWVudHMuam9pbihcIi9cIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9O1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCFnbG9iYWxUaGlzLmNyeXB0bykge1xcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnbG9iYWxUaGlzLmNyeXB0byBpcyBub3QgYXZhaWxhYmxlLCBwb2x5ZmlsbCByZXF1aXJlZCAoY3J5cHRvLmdldFJhbmRvbVZhbHVlcyBvbmx5KVwiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZSkge1xcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnbG9iYWxUaGlzLnBlcmZvcm1hbmNlIGlzIG5vdCBhdmFpbGFibGUsIHBvbHlmaWxsIHJlcXVpcmVkIChwZXJmb3JtYW5jZS5ub3cgb25seSlcIik7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIWdsb2JhbFRoaXMuVGV4dEVuY29kZXIpIHtcXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2xvYmFsVGhpcy5UZXh0RW5jb2RlciBpcyBub3QgYXZhaWxhYmxlLCBwb2x5ZmlsbCByZXF1aXJlZFwiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghZ2xvYmFsVGhpcy5UZXh0RGVjb2Rlcikge1xcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnbG9iYWxUaGlzLlRleHREZWNvZGVyIGlzIG5vdCBhdmFpbGFibGUsIHBvbHlmaWxsIHJlcXVpcmVkXCIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcihcInV0Zi04XCIpO1xcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO1xcbiAgICAgICAgZ2xvYmFsVGhpcy5HbyA9IGNsYXNzIHtcXG4gICAgICAgICAgY29uc3RydWN0b3IoKSB7XFxuICAgICAgICAgICAgdGhpcy5hcmd2ID0gW1wianNcIl07XFxuICAgICAgICAgICAgdGhpcy5lbnYgPSB7fTtcXG4gICAgICAgICAgICB0aGlzLmV4aXQgPSAoY29kZSkgPT4ge1xcbiAgICAgICAgICAgICAgaWYgKGNvZGUgIT09IDApIHtcXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiZXhpdCBjb2RlOlwiLCBjb2RlKTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIHRoaXMuX2V4aXRQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcXG4gICAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVFeGl0UHJvbWlzZSA9IHJlc29sdmU7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0V2ZW50ID0gbnVsbDtcXG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZWRUaW1lb3V0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XFxuICAgICAgICAgICAgdGhpcy5fbmV4dENhbGxiYWNrVGltZW91dElEID0gMTtcXG4gICAgICAgICAgICBjb25zdCBzZXRJbnQ2NCA9IChhZGRyLCB2KSA9PiB7XFxuICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50MzIoYWRkciArIDAsIHYsIHRydWUpO1xcbiAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDMyKGFkZHIgKyA0LCBNYXRoLmZsb29yKHYgLyA0Mjk0OTY3Mjk2KSwgdHJ1ZSk7XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBjb25zdCBzZXRJbnQzMiA9IChhZGRyLCB2KSA9PiB7XFxuICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50MzIoYWRkciArIDAsIHYsIHRydWUpO1xcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgY29uc3QgZ2V0SW50NjQgPSAoYWRkcikgPT4ge1xcbiAgICAgICAgICAgICAgY29uc3QgbG93ID0gdGhpcy5tZW0uZ2V0VWludDMyKGFkZHIgKyAwLCB0cnVlKTtcXG4gICAgICAgICAgICAgIGNvbnN0IGhpZ2ggPSB0aGlzLm1lbS5nZXRJbnQzMihhZGRyICsgNCwgdHJ1ZSk7XFxuICAgICAgICAgICAgICByZXR1cm4gbG93ICsgaGlnaCAqIDQyOTQ5NjcyOTY7XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBjb25zdCBsb2FkVmFsdWUgPSAoYWRkcikgPT4ge1xcbiAgICAgICAgICAgICAgY29uc3QgZiA9IHRoaXMubWVtLmdldEZsb2F0NjQoYWRkciwgdHJ1ZSk7XFxuICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgaWYgKCFpc05hTihmKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZjtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5tZW0uZ2V0VWludDMyKGFkZHIsIHRydWUpO1xcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc1tpZF07XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBjb25zdCBzdG9yZVZhbHVlID0gKGFkZHIsIHYpID0+IHtcXG4gICAgICAgICAgICAgIGNvbnN0IG5hbkhlYWQgPSAyMTQ2OTU5MzYwO1xcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiICYmIHYgIT09IDApIHtcXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHYpKSB7XFxuICAgICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDMyKGFkZHIgKyA0LCBuYW5IZWFkLCB0cnVlKTtcXG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50MzIoYWRkciwgMCwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldEZsb2F0NjQoYWRkciwgdiwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIGlmICh2ID09PSB2b2lkIDApIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0RmxvYXQ2NChhZGRyLCAwLCB0cnVlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgbGV0IGlkID0gdGhpcy5faWRzLmdldCh2KTtcXG4gICAgICAgICAgICAgIGlmIChpZCA9PT0gdm9pZCAwKSB7XFxuICAgICAgICAgICAgICAgIGlkID0gdGhpcy5faWRQb29sLnBvcCgpO1xcbiAgICAgICAgICAgICAgICBpZiAoaWQgPT09IHZvaWQgMCkge1xcbiAgICAgICAgICAgICAgICAgIGlkID0gdGhpcy5fdmFsdWVzLmxlbmd0aDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaWRdID0gdjtcXG4gICAgICAgICAgICAgICAgdGhpcy5fZ29SZWZDb3VudHNbaWRdID0gMDtcXG4gICAgICAgICAgICAgICAgdGhpcy5faWRzLnNldCh2LCBpZCk7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICB0aGlzLl9nb1JlZkNvdW50c1tpZF0rKztcXG4gICAgICAgICAgICAgIGxldCB0eXBlRmxhZyA9IDA7XFxuICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2KSB7XFxuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcXG4gICAgICAgICAgICAgICAgICBpZiAodiAhPT0gbnVsbCkge1xcbiAgICAgICAgICAgICAgICAgICAgdHlwZUZsYWcgPSAxO1xcbiAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxcbiAgICAgICAgICAgICAgICAgIHR5cGVGbGFnID0gMjtcXG4gICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxcbiAgICAgICAgICAgICAgICAgIHR5cGVGbGFnID0gMztcXG4gICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XFxuICAgICAgICAgICAgICAgICAgdHlwZUZsYWcgPSA0O1xcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDMyKGFkZHIgKyA0LCBuYW5IZWFkIHwgdHlwZUZsYWcsIHRydWUpO1xcbiAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDMyKGFkZHIsIGlkLCB0cnVlKTtcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIGNvbnN0IGxvYWRTbGljZSA9IChhZGRyKSA9PiB7XFxuICAgICAgICAgICAgICBjb25zdCBhcnJheSA9IGdldEludDY0KGFkZHIgKyAwKTtcXG4gICAgICAgICAgICAgIGNvbnN0IGxlbiA9IGdldEludDY0KGFkZHIgKyA4KTtcXG4gICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLl9pbnN0LmV4cG9ydHMubWVtLmJ1ZmZlciwgYXJyYXksIGxlbik7XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBjb25zdCBsb2FkU2xpY2VPZlZhbHVlcyA9IChhZGRyKSA9PiB7XFxuICAgICAgICAgICAgICBjb25zdCBhcnJheSA9IGdldEludDY0KGFkZHIgKyAwKTtcXG4gICAgICAgICAgICAgIGNvbnN0IGxlbiA9IGdldEludDY0KGFkZHIgKyA4KTtcXG4gICAgICAgICAgICAgIGNvbnN0IGEgPSBuZXcgQXJyYXkobGVuKTtcXG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgYVtpXSA9IGxvYWRWYWx1ZShhcnJheSArIGkgKiA4KTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIHJldHVybiBhO1xcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgY29uc3QgbG9hZFN0cmluZyA9IChhZGRyKSA9PiB7XFxuICAgICAgICAgICAgICBjb25zdCBzYWRkciA9IGdldEludDY0KGFkZHIgKyAwKTtcXG4gICAgICAgICAgICAgIGNvbnN0IGxlbiA9IGdldEludDY0KGFkZHIgKyA4KTtcXG4gICAgICAgICAgICAgIHJldHVybiBkZWNvZGVyLmRlY29kZShuZXcgRGF0YVZpZXcodGhpcy5faW5zdC5leHBvcnRzLm1lbS5idWZmZXIsIHNhZGRyLCBsZW4pKTtcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIGNvbnN0IHRlc3RDYWxsRXhwb3J0ID0gKGEsIGIpID0+IHtcXG4gICAgICAgICAgICAgIHRoaXMuX2luc3QuZXhwb3J0cy50ZXN0RXhwb3J0MCgpO1xcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc3QuZXhwb3J0cy50ZXN0RXhwb3J0KGEsIGIpO1xcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgY29uc3QgdGltZU9yaWdpbiA9IERhdGUubm93KCkgLSBwZXJmb3JtYW5jZS5ub3coKTtcXG4gICAgICAgICAgICB0aGlzLmltcG9ydE9iamVjdCA9IHtcXG4gICAgICAgICAgICAgIF9nb3Rlc3Q6IHtcXG4gICAgICAgICAgICAgICAgYWRkOiAoYSwgYikgPT4gYSArIGIsXFxuICAgICAgICAgICAgICAgIGNhbGxFeHBvcnQ6IHRlc3RDYWxsRXhwb3J0XFxuICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgZ29qczoge1xcbiAgICAgICAgICAgICAgICAvLyBHb1xcJ3MgU1AgZG9lcyBub3QgY2hhbmdlIGFzIGxvbmcgYXMgbm8gR28gY29kZSBpcyBydW5uaW5nLiBTb21lIG9wZXJhdGlvbnMgKGUuZy4gY2FsbHMsIGdldHRlcnMgYW5kIHNldHRlcnMpXFxuICAgICAgICAgICAgICAgIC8vIG1heSBzeW5jaHJvbm91c2x5IHRyaWdnZXIgYSBHbyBldmVudCBoYW5kbGVyLiBUaGlzIG1ha2VzIEdvIGNvZGUgZ2V0IGV4ZWN1dGVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIGltcG9ydGVkXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uLiBBIGdvcm91dGluZSBjYW4gc3dpdGNoIHRvIGEgbmV3IHN0YWNrIGlmIHRoZSBjdXJyZW50IHN0YWNrIGlzIHRvbyBzbWFsbCAoc2VlIG1vcmVzdGFjayBmdW5jdGlvbikuXFxuICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hhbmdlcyB0aGUgU1AsIHRodXMgd2UgaGF2ZSB0byB1cGRhdGUgdGhlIFNQIHVzZWQgYnkgdGhlIGltcG9ydGVkIGZ1bmN0aW9uLlxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHdhc21FeGl0KGNvZGUgaW50MzIpXFxuICAgICAgICAgICAgICAgIFwicnVudGltZS53YXNtRXhpdFwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHRoaXMubWVtLmdldEludDMyKHNwICsgOCwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgdGhpcy5leGl0ZWQgPSB0cnVlO1xcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9pbnN0O1xcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl92YWx1ZXM7XFxuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2dvUmVmQ291bnRzO1xcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9pZHM7XFxuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2lkUG9vbDtcXG4gICAgICAgICAgICAgICAgICB0aGlzLmV4aXQoY29kZSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgd2FzbVdyaXRlKGZkIHVpbnRwdHIsIHAgdW5zYWZlLlBvaW50ZXIsIG4gaW50MzIpXFxuICAgICAgICAgICAgICAgIFwicnVudGltZS53YXNtV3JpdGVcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZkID0gZ2V0SW50NjQoc3AgKyA4KTtcXG4gICAgICAgICAgICAgICAgICBjb25zdCBwID0gZ2V0SW50NjQoc3AgKyAxNik7XFxuICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMubWVtLmdldEludDMyKHNwICsgMjQsIHRydWUpO1xcbiAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMuZnMud3JpdGVTeW5jKGZkLCBuZXcgVWludDhBcnJheSh0aGlzLl9pbnN0LmV4cG9ydHMubWVtLmJ1ZmZlciwgcCwgbikpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHJlc2V0TWVtb3J5RGF0YVZpZXcoKVxcbiAgICAgICAgICAgICAgICBcInJ1bnRpbWUucmVzZXRNZW1vcnlEYXRhVmlld1wiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgdGhpcy5tZW0gPSBuZXcgRGF0YVZpZXcodGhpcy5faW5zdC5leHBvcnRzLm1lbS5idWZmZXIpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIG5hbm90aW1lMSgpIGludDY0XFxuICAgICAgICAgICAgICAgIFwicnVudGltZS5uYW5vdGltZTFcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIHNldEludDY0KHNwICsgOCwgKHRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSkgKiAxZTYpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHdhbGx0aW1lKCkgKHNlYyBpbnQ2NCwgbnNlYyBpbnQzMilcXG4gICAgICAgICAgICAgICAgXCJydW50aW1lLndhbGx0aW1lXCI6IChzcCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcXG4gICAgICAgICAgICAgICAgICBjb25zdCBtc2VjID0gKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XFxuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyA4LCBtc2VjIC8gMWUzKTtcXG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRJbnQzMihzcCArIDE2LCBtc2VjICUgMWUzICogMWU2LCB0cnVlKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgLy8gZnVuYyBzY2hlZHVsZVRpbWVvdXRFdmVudChkZWxheSBpbnQ2NCkgaW50MzJcXG4gICAgICAgICAgICAgICAgXCJydW50aW1lLnNjaGVkdWxlVGltZW91dEV2ZW50XCI6IChzcCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcXG4gICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuX25leHRDYWxsYmFja1RpbWVvdXRJRDtcXG4gICAgICAgICAgICAgICAgICB0aGlzLl9uZXh0Q2FsbGJhY2tUaW1lb3V0SUQrKztcXG4gICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZWRUaW1lb3V0cy5zZXQoaWQsIHNldFRpbWVvdXQoXFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc3VtZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5fc2NoZWR1bGVkVGltZW91dHMuaGFzKGlkKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcInNjaGVkdWxlVGltZW91dEV2ZW50OiBtaXNzZWQgdGltZW91dCBldmVudFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXN1bWUoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIGdldEludDY0KHNwICsgOClcXG4gICAgICAgICAgICAgICAgICApKTtcXG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRJbnQzMihzcCArIDE2LCBpZCwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgY2xlYXJUaW1lb3V0RXZlbnQoaWQgaW50MzIpXFxuICAgICAgICAgICAgICAgIFwicnVudGltZS5jbGVhclRpbWVvdXRFdmVudFwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLm1lbS5nZXRJbnQzMihzcCArIDgsIHRydWUpO1xcbiAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zY2hlZHVsZWRUaW1lb3V0cy5nZXQoaWQpKTtcXG4gICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZWRUaW1lb3V0cy5kZWxldGUoaWQpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIGdldFJhbmRvbURhdGEociBbXWJ5dGUpXFxuICAgICAgICAgICAgICAgIFwicnVudGltZS5nZXRSYW5kb21EYXRhXCI6IChzcCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcXG4gICAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGxvYWRTbGljZShzcCArIDgpKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgLy8gZnVuYyBmaW5hbGl6ZVJlZih2IHJlZilcXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLmZpbmFsaXplUmVmXCI6IChzcCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcXG4gICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMubWVtLmdldFVpbnQzMihzcCArIDgsIHRydWUpO1xcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2dvUmVmQ291bnRzW2lkXS0tO1xcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9nb1JlZkNvdW50c1tpZF0gPT09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLl92YWx1ZXNbaWRdO1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2lkXSA9IG51bGw7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pZHMuZGVsZXRlKHYpO1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faWRQb29sLnB1c2goaWQpO1xcbiAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgLy8gZnVuYyBzdHJpbmdWYWwodmFsdWUgc3RyaW5nKSByZWZcXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnN0cmluZ1ZhbFwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDI0LCBsb2FkU3RyaW5nKHNwICsgOCkpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHZhbHVlR2V0KHYgcmVmLCBwIHN0cmluZykgcmVmXFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUdldFwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQobG9hZFZhbHVlKHNwICsgOCksIGxvYWRTdHJpbmcoc3AgKyAxNikpO1xcbiAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XFxuICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDMyLCByZXN1bHQpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHZhbHVlU2V0KHYgcmVmLCBwIHN0cmluZywgeCByZWYpXFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZVNldFwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgUmVmbGVjdC5zZXQobG9hZFZhbHVlKHNwICsgOCksIGxvYWRTdHJpbmcoc3AgKyAxNiksIGxvYWRWYWx1ZShzcCArIDMyKSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVEZWxldGUodiByZWYsIHAgc3RyaW5nKVxcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMudmFsdWVEZWxldGVcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkobG9hZFZhbHVlKHNwICsgOCksIGxvYWRTdHJpbmcoc3AgKyAxNikpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHZhbHVlSW5kZXgodiByZWYsIGkgaW50KSByZWZcXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlSW5kZXhcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyAyNCwgUmVmbGVjdC5nZXQobG9hZFZhbHVlKHNwICsgOCksIGdldEludDY0KHNwICsgMTYpKSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIHZhbHVlU2V0SW5kZXgodiByZWYsIGkgaW50LCB4IHJlZilcXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlU2V0SW5kZXhcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIFJlZmxlY3Quc2V0KGxvYWRWYWx1ZShzcCArIDgpLCBnZXRJbnQ2NChzcCArIDE2KSwgbG9hZFZhbHVlKHNwICsgMjQpKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB2YWx1ZUNhbGwodiByZWYsIG0gc3RyaW5nLCBhcmdzIFtdcmVmKSAocmVmLCBib29sKVxcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMudmFsdWVDYWxsXCI6IChzcCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcXG4gICAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IGxvYWRWYWx1ZShzcCArIDgpO1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IFJlZmxlY3QuZ2V0KHYsIGxvYWRTdHJpbmcoc3AgKyAxNikpO1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IGxvYWRTbGljZU9mVmFsdWVzKHNwICsgMzIpO1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5hcHBseShtLCB2LCBhcmdzKTtcXG4gICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XFxuICAgICAgICAgICAgICAgICAgICBzdG9yZVZhbHVlKHNwICsgNTYsIHJlc3VsdCk7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDY0LCAxKTtcXG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XFxuICAgICAgICAgICAgICAgICAgICBzdG9yZVZhbHVlKHNwICsgNTYsIGVycik7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDY0LCAwKTtcXG4gICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVJbnZva2UodiByZWYsIGFyZ3MgW11yZWYpIChyZWYsIGJvb2wpXFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUludm9rZVwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBsb2FkVmFsdWUoc3AgKyA4KTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBsb2FkU2xpY2VPZlZhbHVlcyhzcCArIDE2KTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkodiwgdm9pZCAwLCBhcmdzKTtcXG4gICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XFxuICAgICAgICAgICAgICAgICAgICBzdG9yZVZhbHVlKHNwICsgNDAsIHJlc3VsdCk7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAxKTtcXG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XFxuICAgICAgICAgICAgICAgICAgICBzdG9yZVZhbHVlKHNwICsgNDAsIGVycik7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAwKTtcXG4gICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVOZXcodiByZWYsIGFyZ3MgW11yZWYpIChyZWYsIGJvb2wpXFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZU5ld1wiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBsb2FkVmFsdWUoc3AgKyA4KTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBsb2FkU2xpY2VPZlZhbHVlcyhzcCArIDE2KTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KHYsIGFyZ3MpO1xcbiAgICAgICAgICAgICAgICAgICAgc3AgPSB0aGlzLl9pbnN0LmV4cG9ydHMuZ2V0c3AoKSA+Pj4gMDtcXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyA0MCwgcmVzdWx0KTtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQ4KHNwICsgNDgsIDEpO1xcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xcbiAgICAgICAgICAgICAgICAgICAgc3AgPSB0aGlzLl9pbnN0LmV4cG9ydHMuZ2V0c3AoKSA+Pj4gMDtcXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyA0MCwgZXJyKTtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQ4KHNwICsgNDgsIDApO1xcbiAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB2YWx1ZUxlbmd0aCh2IHJlZikgaW50XFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUxlbmd0aFwiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyAxNiwgcGFyc2VJbnQobG9hZFZhbHVlKHNwICsgOCkubGVuZ3RoKSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIHZhbHVlUHJlcGFyZVN0cmluZyh2IHJlZikgKHJlZiwgaW50KVxcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMudmFsdWVQcmVwYXJlU3RyaW5nXCI6IChzcCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcXG4gICAgICAgICAgICAgICAgICBjb25zdCBzdHIgPSBlbmNvZGVyLmVuY29kZShTdHJpbmcobG9hZFZhbHVlKHNwICsgOCkpKTtcXG4gICAgICAgICAgICAgICAgICBzdG9yZVZhbHVlKHNwICsgMTYsIHN0cik7XFxuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyAyNCwgc3RyLmxlbmd0aCk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIHZhbHVlTG9hZFN0cmluZyh2IHJlZiwgYiBbXWJ5dGUpXFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUxvYWRTdHJpbmdcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGxvYWRWYWx1ZShzcCArIDgpO1xcbiAgICAgICAgICAgICAgICAgIGxvYWRTbGljZShzcCArIDE2KS5zZXQoc3RyKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB2YWx1ZUluc3RhbmNlT2YodiByZWYsIHQgcmVmKSBib29sXFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUluc3RhbmNlT2ZcIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQ4KHNwICsgMjQsIGxvYWRWYWx1ZShzcCArIDgpIGluc3RhbmNlb2YgbG9hZFZhbHVlKHNwICsgMTYpID8gMSA6IDApO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIGNvcHlCeXRlc1RvR28oZHN0IFtdYnl0ZSwgc3JjIHJlZikgKGludCwgYm9vbClcXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLmNvcHlCeXRlc1RvR29cIjogKHNwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRzdCA9IGxvYWRTbGljZShzcCArIDgpO1xcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNyYyA9IGxvYWRWYWx1ZShzcCArIDMyKTtcXG4gICAgICAgICAgICAgICAgICBpZiAoIShzcmMgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IHNyYyBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDgoc3AgKyA0OCwgMCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHRvQ29weSA9IHNyYy5zdWJhcnJheSgwLCBkc3QubGVuZ3RoKTtcXG4gICAgICAgICAgICAgICAgICBkc3Quc2V0KHRvQ29weSk7XFxuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyA0MCwgdG9Db3B5Lmxlbmd0aCk7XFxuICAgICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDgoc3AgKyA0OCwgMSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgY29weUJ5dGVzVG9KUyhkc3QgcmVmLCBzcmMgW11ieXRlKSAoaW50LCBib29sKVxcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMuY29weUJ5dGVzVG9KU1wiOiAoc3ApID0+IHtcXG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XFxuICAgICAgICAgICAgICAgICAgY29uc3QgZHN0ID0gbG9hZFZhbHVlKHNwICsgOCk7XFxuICAgICAgICAgICAgICAgICAgY29uc3Qgc3JjID0gbG9hZFNsaWNlKHNwICsgMTYpO1xcbiAgICAgICAgICAgICAgICAgIGlmICghKGRzdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgZHN0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAwKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgY29uc3QgdG9Db3B5ID0gc3JjLnN1YmFycmF5KDAsIGRzdC5sZW5ndGgpO1xcbiAgICAgICAgICAgICAgICAgIGRzdC5zZXQodG9Db3B5KTtcXG4gICAgICAgICAgICAgICAgICBzZXRJbnQ2NChzcCArIDQwLCB0b0NvcHkubGVuZ3RoKTtcXG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAxKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgXCJkZWJ1Z1wiOiAodmFsdWUpID0+IHtcXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHJ1bihpbnN0YW5jZSkge1xcbiAgICAgICAgICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XFxuICAgICAgICAgICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lkluc3RhbmNlKSkge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHby5ydW46IFdlYkFzc2VtYmx5Lkluc3RhbmNlIGV4cGVjdGVkXCIpO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgdGhpcy5faW5zdCA9IGluc3RhbmNlO1xcbiAgICAgICAgICAgICAgdGhpcy5tZW0gPSBuZXcgRGF0YVZpZXcodGhpcy5faW5zdC5leHBvcnRzLm1lbS5idWZmZXIpO1xcbiAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW1xcbiAgICAgICAgICAgICAgICAvLyBKUyB2YWx1ZXMgdGhhdCBHbyBjdXJyZW50bHkgaGFzIHJlZmVyZW5jZXMgdG8sIGluZGV4ZWQgYnkgcmVmZXJlbmNlIGlkXFxuICAgICAgICAgICAgICAgIE5hTixcXG4gICAgICAgICAgICAgICAgMCxcXG4gICAgICAgICAgICAgICAgbnVsbCxcXG4gICAgICAgICAgICAgICAgdHJ1ZSxcXG4gICAgICAgICAgICAgICAgZmFsc2UsXFxuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXFxuICAgICAgICAgICAgICAgIHRoaXNcXG4gICAgICAgICAgICAgIF07XFxuICAgICAgICAgICAgICB0aGlzLl9nb1JlZkNvdW50cyA9IG5ldyBBcnJheSh0aGlzLl92YWx1ZXMubGVuZ3RoKS5maWxsKEluZmluaXR5KTtcXG4gICAgICAgICAgICAgIHRoaXMuX2lkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKFtcXG4gICAgICAgICAgICAgICAgLy8gbWFwcGluZyBmcm9tIEpTIHZhbHVlcyB0byByZWZlcmVuY2UgaWRzXFxuICAgICAgICAgICAgICAgIFswLCAxXSxcXG4gICAgICAgICAgICAgICAgW251bGwsIDJdLFxcbiAgICAgICAgICAgICAgICBbdHJ1ZSwgM10sXFxuICAgICAgICAgICAgICAgIFtmYWxzZSwgNF0sXFxuICAgICAgICAgICAgICAgIFtnbG9iYWxUaGlzLCA1XSxcXG4gICAgICAgICAgICAgICAgW3RoaXMsIDZdXFxuICAgICAgICAgICAgICBdKTtcXG4gICAgICAgICAgICAgIHRoaXMuX2lkUG9vbCA9IFtdO1xcbiAgICAgICAgICAgICAgdGhpcy5leGl0ZWQgPSBmYWxzZTtcXG4gICAgICAgICAgICAgIGxldCBvZmZzZXQgPSA0MDk2O1xcbiAgICAgICAgICAgICAgY29uc3Qgc3RyUHRyID0gKHN0cikgPT4ge1xcbiAgICAgICAgICAgICAgICBjb25zdCBwdHIgPSBvZmZzZXQ7XFxuICAgICAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoc3RyICsgXCJcXFxcMFwiKTtcXG4gICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5tZW0uYnVmZmVyLCBvZmZzZXQsIGJ5dGVzLmxlbmd0aCkuc2V0KGJ5dGVzKTtcXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzLmxlbmd0aDtcXG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCAlIDggIT09IDApIHtcXG4gICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gOCAtIG9mZnNldCAlIDg7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHB0cjtcXG4gICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICBjb25zdCBhcmdjID0gdGhpcy5hcmd2Lmxlbmd0aDtcXG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3ZQdHJzID0gW107XFxuICAgICAgICAgICAgICB0aGlzLmFyZ3YuZm9yRWFjaCgoYXJnKSA9PiB7XFxuICAgICAgICAgICAgICAgIGFyZ3ZQdHJzLnB1c2goc3RyUHRyKGFyZykpO1xcbiAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICBhcmd2UHRycy5wdXNoKDApO1xcbiAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZW52KS5zb3J0KCk7XFxuICAgICAgICAgICAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICBhcmd2UHRycy5wdXNoKHN0clB0cihgJHtrZXl9PSR7dGhpcy5lbnZba2V5XX1gKSk7XFxuICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgIGFyZ3ZQdHJzLnB1c2goMCk7XFxuICAgICAgICAgICAgICBjb25zdCBhcmd2ID0gb2Zmc2V0O1xcbiAgICAgICAgICAgICAgYXJndlB0cnMuZm9yRWFjaCgocHRyKSA9PiB7XFxuICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQzMihvZmZzZXQsIHB0ciwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQzMihvZmZzZXQgKyA0LCAwLCB0cnVlKTtcXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDg7XFxuICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgIGNvbnN0IHdhc21NaW5EYXRhQWRkciA9IDQwOTYgKyA4MTkyO1xcbiAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSB3YXNtTWluRGF0YUFkZHIpIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidG90YWwgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGV4Y2VlZHMgbGltaXRcIik7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICB0aGlzLl9pbnN0LmV4cG9ydHMucnVuKGFyZ2MsIGFyZ3YpO1xcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZXhpdGVkKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVFeGl0UHJvbWlzZSgpO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgeWllbGQgdGhpcy5fZXhpdFByb21pc2U7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgX3Jlc3VtZSgpIHtcXG4gICAgICAgICAgICBpZiAodGhpcy5leGl0ZWQpIHtcXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdvIHByb2dyYW0gaGFzIGFscmVhZHkgZXhpdGVkXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLl9pbnN0LmV4cG9ydHMucmVzdW1lKCk7XFxuICAgICAgICAgICAgaWYgKHRoaXMuZXhpdGVkKSB7XFxuICAgICAgICAgICAgICB0aGlzLl9yZXNvbHZlRXhpdFByb21pc2UoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgX21ha2VGdW5jV3JhcHBlcihpZCkge1xcbiAgICAgICAgICAgIGNvbnN0IGdvID0gdGhpcztcXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IHsgaWQsIHRoaXM6IHRoaXMsIGFyZ3M6IGFyZ3VtZW50cyB9O1xcbiAgICAgICAgICAgICAgZ28uX3BlbmRpbmdFdmVudCA9IGV2ZW50O1xcbiAgICAgICAgICAgICAgZ28uX3Jlc3VtZSgpO1xcbiAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LnJlc3VsdDtcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICB9XFxuICAgICAgICB9O1xcbiAgICAgIH0pKCk7XFxuICAgICAgb25tZXNzYWdlID0gKHsgZGF0YTogd2FzbSB9KSA9PiB7XFxuICAgICAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xcbiAgICAgICAgbGV0IGZzID0gZ2xvYmFsVGhpcy5mcztcXG4gICAgICAgIGxldCBzdGRlcnIgPSBcIlwiO1xcbiAgICAgICAgZnMud3JpdGVTeW5jID0gKGZkLCBidWZmZXIpID0+IHtcXG4gICAgICAgICAgaWYgKGZkID09PSAxKSB7XFxuICAgICAgICAgICAgcG9zdE1lc3NhZ2UoYnVmZmVyKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChmZCA9PT0gMikge1xcbiAgICAgICAgICAgIHN0ZGVyciArPSBkZWNvZGVyLmRlY29kZShidWZmZXIpO1xcbiAgICAgICAgICAgIGxldCBwYXJ0cyA9IHN0ZGVyci5zcGxpdChcIlxcXFxuXCIpO1xcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSBjb25zb2xlLmxvZyhwYXJ0cy5zbGljZSgwLCAtMSkuam9pbihcIlxcXFxuXCIpKTtcXG4gICAgICAgICAgICBzdGRlcnIgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgd3JpdGVcIik7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcmV0dXJuIGJ1ZmZlci5sZW5ndGg7XFxuICAgICAgICB9O1xcbiAgICAgICAgbGV0IHN0ZGluID0gW107XFxuICAgICAgICBsZXQgcmVzdW1lU3RkaW47XFxuICAgICAgICBsZXQgc3RkaW5Qb3MgPSAwO1xcbiAgICAgICAgb25tZXNzYWdlID0gKHsgZGF0YSB9KSA9PiB7XFxuICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICBzdGRpbi5wdXNoKGRhdGEpO1xcbiAgICAgICAgICAgIGlmIChyZXN1bWVTdGRpbikgcmVzdW1lU3RkaW4oKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICByZXR1cm4gZ287XFxuICAgICAgICB9O1xcbiAgICAgICAgZnMucmVhZCA9IChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSA9PiB7XFxuICAgICAgICAgIGlmIChmZCAhPT0gMCB8fCBvZmZzZXQgIT09IDAgfHwgbGVuZ3RoICE9PSBidWZmZXIubGVuZ3RoIHx8IHBvc2l0aW9uICE9PSBudWxsKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHJlYWRcIik7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKHN0ZGluLmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgICAgIHJlc3VtZVN0ZGluID0gKCkgPT4gZnMucmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKTtcXG4gICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgbGV0IGZpcnN0ID0gc3RkaW5bMF07XFxuICAgICAgICAgIGxldCBjb3VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxlbmd0aCwgZmlyc3QubGVuZ3RoIC0gc3RkaW5Qb3MpKTtcXG4gICAgICAgICAgYnVmZmVyLnNldChmaXJzdC5zdWJhcnJheShzdGRpblBvcywgc3RkaW5Qb3MgKyBjb3VudCksIG9mZnNldCk7XFxuICAgICAgICAgIHN0ZGluUG9zICs9IGNvdW50O1xcbiAgICAgICAgICBpZiAoc3RkaW5Qb3MgPT09IGZpcnN0Lmxlbmd0aCkge1xcbiAgICAgICAgICAgIHN0ZGluLnNoaWZ0KCk7XFxuICAgICAgICAgICAgc3RkaW5Qb3MgPSAwO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGNvdW50KTtcXG4gICAgICAgIH07XFxuICAgICAgICBsZXQgZ28gPSBuZXcgZ2xvYmFsVGhpcy5HbygpO1xcbiAgICAgICAgZ28uYXJndiA9IFtcIlwiLCBgLS1zZXJ2aWNlPSR7XCIwLjI3LjFcIn1gXTtcXG4gICAgICAgIHRyeVRvSW5zdGFudGlhdGVNb2R1bGUod2FzbSwgZ28pLnRoZW4oXFxuICAgICAgICAgIChpbnN0YW5jZSkgPT4ge1xcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKG51bGwpO1xcbiAgICAgICAgICAgIGdvLnJ1bihpbnN0YW5jZSk7XFxuICAgICAgICAgIH0sXFxuICAgICAgICAgIChlcnJvcikgPT4ge1xcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKGVycm9yKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgKTtcXG4gICAgICAgIHJldHVybiBnbztcXG4gICAgICB9O1xcbiAgICAgIGZ1bmN0aW9uIHRyeVRvSW5zdGFudGlhdGVNb2R1bGUod2FzbSwgZ28pIHtcXG4gICAgICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XFxuICAgICAgICAgIGlmICh3YXNtIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc20sIGdvLmltcG9ydE9iamVjdCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgY29uc3QgcmVzID0geWllbGQgZmV0Y2god2FzbSk7XFxuICAgICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkb3dubG9hZCAke0pTT04uc3RyaW5naWZ5KHdhc20pfWApO1xcbiAgICAgICAgICBpZiAoXCJpbnN0YW50aWF0ZVN0cmVhbWluZ1wiIGluIFdlYkFzc2VtYmx5ICYmIC9eYXBwbGljYXRpb25cXFxcL3dhc20oJHw7KS9pLnRlc3QocmVzLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpIHx8IFwiXCIpKSB7XFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0MiA9IHlpZWxkIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlcywgZ28uaW1wb3J0T2JqZWN0KTtcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Mi5pbnN0YW5jZTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBjb25zdCBieXRlcyA9IHlpZWxkIHJlcy5hcnJheUJ1ZmZlcigpO1xcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShieXRlcywgZ28uaW1wb3J0T2JqZWN0KTtcXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnN0YW5jZTtcXG4gICAgICAgIH0pO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gKG0pID0+IG9ubWVzc2FnZShtKTtcXG4gICAgfSknfShwb3N0TWVzc2FnZSlgXSwgeyB0eXBlOiBcInRleHQvamF2YXNjcmlwdFwiIH0pO1xuICAgIHdvcmtlciA9IG5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IG9ubWVzc2FnZSA9ICgocG9zdE1lc3NhZ2UpID0+IHtcbiAgICAgIC8vIENvcHlyaWdodCAyMDE4IFRoZSBHbyBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICAgICAgLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGVcbiAgICAgIC8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAgICAgIHZhciBfX2FzeW5jID0gKF9fdGhpcywgX19hcmd1bWVudHMsIGdlbmVyYXRvcikgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHZhciBmdWxmaWxsZWQgPSAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgdmFyIHJlamVjdGVkID0gKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdGVwKGdlbmVyYXRvci50aHJvdyh2YWx1ZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgc3RlcCA9ICh4KSA9PiB4LmRvbmUgPyByZXNvbHZlKHgudmFsdWUpIDogUHJvbWlzZS5yZXNvbHZlKHgudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KF9fdGhpcywgX19hcmd1bWVudHMpKS5uZXh0KCkpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBsZXQgb25tZXNzYWdlO1xuICAgICAgbGV0IGdsb2JhbFRoaXMgPSB7fTtcbiAgICAgIGZvciAobGV0IG8gPSBzZWxmOyBvOyBvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pKVxuICAgICAgICBmb3IgKGxldCBrIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pKVxuICAgICAgICAgIGlmICghKGsgaW4gZ2xvYmFsVGhpcykpXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywgaywgeyBnZXQ6ICgpID0+IHNlbGZba10gfSk7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcbiAgICAgICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVub3N5cyA9ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgICAgZXJyLmNvZGUgPSBcIkVOT1NZU1wiO1xuICAgICAgICAgIHJldHVybiBlcnI7XG4gICAgICAgIH07XG4gICAgICAgIGlmICghZ2xvYmFsVGhpcy5mcykge1xuICAgICAgICAgIGxldCBvdXRwdXRCdWYgPSBcIlwiO1xuICAgICAgICAgIGdsb2JhbFRoaXMuZnMgPSB7XG4gICAgICAgICAgICBjb25zdGFudHM6IHsgT19XUk9OTFk6IC0xLCBPX1JEV1I6IC0xLCBPX0NSRUFUOiAtMSwgT19UUlVOQzogLTEsIE9fQVBQRU5EOiAtMSwgT19FWENMOiAtMSwgT19ESVJFQ1RPUlk6IC0xIH0sXG4gICAgICAgICAgICAvLyB1bnVzZWRcbiAgICAgICAgICAgIHdyaXRlU3luYyhmZCwgYnVmKSB7XG4gICAgICAgICAgICAgIG91dHB1dEJ1ZiArPSBkZWNvZGVyLmRlY29kZShidWYpO1xuICAgICAgICAgICAgICBjb25zdCBubCA9IG91dHB1dEJ1Zi5sYXN0SW5kZXhPZihcIlxcblwiKTtcbiAgICAgICAgICAgICAgaWYgKG5sICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cob3V0cHV0QnVmLnN1YnN0cmluZygwLCBubCkpO1xuICAgICAgICAgICAgICAgIG91dHB1dEJ1ZiA9IG91dHB1dEJ1Zi5zdWJzdHJpbmcobmwgKyAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYnVmLmxlbmd0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3cml0ZShmZCwgYnVmLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGlmIChvZmZzZXQgIT09IDAgfHwgbGVuZ3RoICE9PSBidWYubGVuZ3RoIHx8IHBvc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy53cml0ZVN5bmMoZmQsIGJ1Zik7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIG4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNobW9kKHBhdGgsIG1vZGUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaG93bihwYXRoLCB1aWQsIGdpZCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsb3NlKGZkLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmNobW9kKGZkLCBtb2RlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmNob3duKGZkLCB1aWQsIGdpZCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZzdGF0KGZkLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnN5bmMoZmQsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ0cnVuY2F0ZShmZCwgbGVuZ3RoLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGNob3duKHBhdGgsIHVpZCwgZ2lkLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGluayhwYXRoLCBsaW5rLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbHN0YXQocGF0aCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1rZGlyKHBhdGgsIHBlcm0sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcGVuKHBhdGgsIGZsYWdzLCBtb2RlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkZGlyKHBhdGgsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVub3N5cygpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkbGluayhwYXRoLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVuYW1lKGZyb20sIHRvLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm1kaXIocGF0aCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXQocGF0aCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN5bWxpbmsocGF0aCwgbGluaywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydW5jYXRlKHBhdGgsIGxlbmd0aCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVubGluayhwYXRoLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlbm9zeXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXRpbWVzKHBhdGgsIGF0aW1lLCBtdGltZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZW5vc3lzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFnbG9iYWxUaGlzLnByb2Nlc3MpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLnByb2Nlc3MgPSB7XG4gICAgICAgICAgICBnZXR1aWQoKSB7XG4gICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRnaWQoKSB7XG4gICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRldWlkKCkge1xuICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0ZWdpZCgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldGdyb3VwcygpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZW5vc3lzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGlkOiAtMSxcbiAgICAgICAgICAgIHBwaWQ6IC0xLFxuICAgICAgICAgICAgdW1hc2soKSB7XG4gICAgICAgICAgICAgIHRocm93IGVub3N5cygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN3ZCgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZW5vc3lzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hkaXIoKSB7XG4gICAgICAgICAgICAgIHRocm93IGVub3N5cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFnbG9iYWxUaGlzLnBhdGgpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLnBhdGggPSB7XG4gICAgICAgICAgICByZXNvbHZlKC4uLnBhdGhTZWdtZW50cykge1xuICAgICAgICAgICAgICByZXR1cm4gcGF0aFNlZ21lbnRzLmpvaW4oXCIvXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFnbG9iYWxUaGlzLmNyeXB0bykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdsb2JhbFRoaXMuY3J5cHRvIGlzIG5vdCBhdmFpbGFibGUsIHBvbHlmaWxsIHJlcXVpcmVkIChjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzIG9ubHkpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdsb2JhbFRoaXMucGVyZm9ybWFuY2UgaXMgbm90IGF2YWlsYWJsZSwgcG9seWZpbGwgcmVxdWlyZWQgKHBlcmZvcm1hbmNlLm5vdyBvbmx5KVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWdsb2JhbFRoaXMuVGV4dEVuY29kZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnbG9iYWxUaGlzLlRleHRFbmNvZGVyIGlzIG5vdCBhdmFpbGFibGUsIHBvbHlmaWxsIHJlcXVpcmVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZ2xvYmFsVGhpcy5UZXh0RGVjb2Rlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdsb2JhbFRoaXMuVGV4dERlY29kZXIgaXMgbm90IGF2YWlsYWJsZSwgcG9seWZpbGwgcmVxdWlyZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcihcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7XG4gICAgICAgIGdsb2JhbFRoaXMuR28gPSBjbGFzcyB7XG4gICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICB0aGlzLmFyZ3YgPSBbXCJqc1wiXTtcbiAgICAgICAgICAgIHRoaXMuZW52ID0ge307XG4gICAgICAgICAgICB0aGlzLmV4aXQgPSAoY29kZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcImV4aXQgY29kZTpcIiwgY29kZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9leGl0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVFeGl0UHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZWRUaW1lb3V0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICAgICAgICB0aGlzLl9uZXh0Q2FsbGJhY2tUaW1lb3V0SUQgPSAxO1xuICAgICAgICAgICAgY29uc3Qgc2V0SW50NjQgPSAoYWRkciwgdikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50MzIoYWRkciArIDAsIHYsIHRydWUpO1xuICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50MzIoYWRkciArIDQsIE1hdGguZmxvb3IodiAvIDQyOTQ5NjcyOTYpLCB0cnVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzZXRJbnQzMiA9IChhZGRyLCB2KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQzMihhZGRyICsgMCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZ2V0SW50NjQgPSAoYWRkcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBsb3cgPSB0aGlzLm1lbS5nZXRVaW50MzIoYWRkciArIDAsIHRydWUpO1xuICAgICAgICAgICAgICBjb25zdCBoaWdoID0gdGhpcy5tZW0uZ2V0SW50MzIoYWRkciArIDQsIHRydWUpO1xuICAgICAgICAgICAgICByZXR1cm4gbG93ICsgaGlnaCAqIDQyOTQ5NjcyOTY7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgbG9hZFZhbHVlID0gKGFkZHIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZiA9IHRoaXMubWVtLmdldEZsb2F0NjQoYWRkciwgdHJ1ZSk7XG4gICAgICAgICAgICAgIGlmIChmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWlzTmFOKGYpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLm1lbS5nZXRVaW50MzIoYWRkciwgdHJ1ZSk7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNbaWRdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlVmFsdWUgPSAoYWRkciwgdikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBuYW5IZWFkID0gMjE0Njk1OTM2MDtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiICYmIHYgIT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4odikpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQzMihhZGRyICsgNCwgbmFuSGVhZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50MzIoYWRkciwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldEZsb2F0NjQoYWRkciwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh2ID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRGbG9hdDY0KGFkZHIsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsZXQgaWQgPSB0aGlzLl9pZHMuZ2V0KHYpO1xuICAgICAgICAgICAgICBpZiAoaWQgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIGlkID0gdGhpcy5faWRQb29sLnBvcCgpO1xuICAgICAgICAgICAgICAgIGlmIChpZCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgICBpZCA9IHRoaXMuX3ZhbHVlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpZF0gPSB2O1xuICAgICAgICAgICAgICAgIHRoaXMuX2dvUmVmQ291bnRzW2lkXSA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5faWRzLnNldCh2LCBpZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fZ29SZWZDb3VudHNbaWRdKys7XG4gICAgICAgICAgICAgIGxldCB0eXBlRmxhZyA9IDA7XG4gICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHYpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICAgICAgICBpZiAodiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlRmxhZyA9IDE7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICB0eXBlRmxhZyA9IDI7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgICAgICAgICB0eXBlRmxhZyA9IDM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgIHR5cGVGbGFnID0gNDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQzMihhZGRyICsgNCwgbmFuSGVhZCB8IHR5cGVGbGFnLCB0cnVlKTtcbiAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDMyKGFkZHIsIGlkLCB0cnVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBsb2FkU2xpY2UgPSAoYWRkcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBhcnJheSA9IGdldEludDY0KGFkZHIgKyAwKTtcbiAgICAgICAgICAgICAgY29uc3QgbGVuID0gZ2V0SW50NjQoYWRkciArIDgpO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5faW5zdC5leHBvcnRzLm1lbS5idWZmZXIsIGFycmF5LCBsZW4pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRTbGljZU9mVmFsdWVzID0gKGFkZHIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgYXJyYXkgPSBnZXRJbnQ2NChhZGRyICsgMCk7XG4gICAgICAgICAgICAgIGNvbnN0IGxlbiA9IGdldEludDY0KGFkZHIgKyA4KTtcbiAgICAgICAgICAgICAgY29uc3QgYSA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGxvYWRWYWx1ZShhcnJheSArIGkgKiA4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBsb2FkU3RyaW5nID0gKGFkZHIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc2FkZHIgPSBnZXRJbnQ2NChhZGRyICsgMCk7XG4gICAgICAgICAgICAgIGNvbnN0IGxlbiA9IGdldEludDY0KGFkZHIgKyA4KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZXIuZGVjb2RlKG5ldyBEYXRhVmlldyh0aGlzLl9pbnN0LmV4cG9ydHMubWVtLmJ1ZmZlciwgc2FkZHIsIGxlbikpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RDYWxsRXhwb3J0ID0gKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5faW5zdC5leHBvcnRzLnRlc3RFeHBvcnQwKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnN0LmV4cG9ydHMudGVzdEV4cG9ydChhLCBiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB0aW1lT3JpZ2luID0gRGF0ZS5ub3coKSAtIHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgdGhpcy5pbXBvcnRPYmplY3QgPSB7XG4gICAgICAgICAgICAgIF9nb3Rlc3Q6IHtcbiAgICAgICAgICAgICAgICBhZGQ6IChhLCBiKSA9PiBhICsgYixcbiAgICAgICAgICAgICAgICBjYWxsRXhwb3J0OiB0ZXN0Q2FsbEV4cG9ydFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBnb2pzOiB7XG4gICAgICAgICAgICAgICAgLy8gR28ncyBTUCBkb2VzIG5vdCBjaGFuZ2UgYXMgbG9uZyBhcyBubyBHbyBjb2RlIGlzIHJ1bm5pbmcuIFNvbWUgb3BlcmF0aW9ucyAoZS5nLiBjYWxscywgZ2V0dGVycyBhbmQgc2V0dGVycylcbiAgICAgICAgICAgICAgICAvLyBtYXkgc3luY2hyb25vdXNseSB0cmlnZ2VyIGEgR28gZXZlbnQgaGFuZGxlci4gVGhpcyBtYWtlcyBHbyBjb2RlIGdldCBleGVjdXRlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBpbXBvcnRlZFxuICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uLiBBIGdvcm91dGluZSBjYW4gc3dpdGNoIHRvIGEgbmV3IHN0YWNrIGlmIHRoZSBjdXJyZW50IHN0YWNrIGlzIHRvbyBzbWFsbCAoc2VlIG1vcmVzdGFjayBmdW5jdGlvbikuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBjaGFuZ2VzIHRoZSBTUCwgdGh1cyB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgU1AgdXNlZCBieSB0aGUgaW1wb3J0ZWQgZnVuY3Rpb24uXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB3YXNtRXhpdChjb2RlIGludDMyKVxuICAgICAgICAgICAgICAgIFwicnVudGltZS53YXNtRXhpdFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLm1lbS5nZXRJbnQzMihzcCArIDgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5leGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2luc3Q7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2dvUmVmQ291bnRzO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2lkcztcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9pZFBvb2w7XG4gICAgICAgICAgICAgICAgICB0aGlzLmV4aXQoY29kZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHdhc21Xcml0ZShmZCB1aW50cHRyLCBwIHVuc2FmZS5Qb2ludGVyLCBuIGludDMyKVxuICAgICAgICAgICAgICAgIFwicnVudGltZS53YXNtV3JpdGVcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmZCA9IGdldEludDY0KHNwICsgOCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwID0gZ2V0SW50NjQoc3AgKyAxNik7XG4gICAgICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy5tZW0uZ2V0SW50MzIoc3AgKyAyNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLmZzLndyaXRlU3luYyhmZCwgbmV3IFVpbnQ4QXJyYXkodGhpcy5faW5zdC5leHBvcnRzLm1lbS5idWZmZXIsIHAsIG4pKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgcmVzZXRNZW1vcnlEYXRhVmlldygpXG4gICAgICAgICAgICAgICAgXCJydW50aW1lLnJlc2V0TWVtb3J5RGF0YVZpZXdcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbSA9IG5ldyBEYXRhVmlldyh0aGlzLl9pbnN0LmV4cG9ydHMubWVtLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIG5hbm90aW1lMSgpIGludDY0XG4gICAgICAgICAgICAgICAgXCJydW50aW1lLm5hbm90aW1lMVwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIHNldEludDY0KHNwICsgOCwgKHRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSkgKiAxZTYpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB3YWxsdGltZSgpIChzZWMgaW50NjQsIG5zZWMgaW50MzIpXG4gICAgICAgICAgICAgICAgXCJydW50aW1lLndhbGx0aW1lXCI6IChzcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbXNlYyA9ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyA4LCBtc2VjIC8gMWUzKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldEludDMyKHNwICsgMTYsIG1zZWMgJSAxZTMgKiAxZTYsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gZnVuYyBzY2hlZHVsZVRpbWVvdXRFdmVudChkZWxheSBpbnQ2NCkgaW50MzJcbiAgICAgICAgICAgICAgICBcInJ1bnRpbWUuc2NoZWR1bGVUaW1lb3V0RXZlbnRcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuX25leHRDYWxsYmFja1RpbWVvdXRJRDtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX25leHRDYWxsYmFja1RpbWVvdXRJRCsrO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVkVGltZW91dHMuc2V0KGlkLCBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX3NjaGVkdWxlZFRpbWVvdXRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcInNjaGVkdWxlVGltZW91dEV2ZW50OiBtaXNzZWQgdGltZW91dCBldmVudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0SW50NjQoc3AgKyA4KVxuICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRJbnQzMihzcCArIDE2LCBpZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIGNsZWFyVGltZW91dEV2ZW50KGlkIGludDMyKVxuICAgICAgICAgICAgICAgIFwicnVudGltZS5jbGVhclRpbWVvdXRFdmVudFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5tZW0uZ2V0SW50MzIoc3AgKyA4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zY2hlZHVsZWRUaW1lb3V0cy5nZXQoaWQpKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlZFRpbWVvdXRzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIGdldFJhbmRvbURhdGEociBbXWJ5dGUpXG4gICAgICAgICAgICAgICAgXCJydW50aW1lLmdldFJhbmRvbURhdGFcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGxvYWRTbGljZShzcCArIDgpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgZmluYWxpemVSZWYodiByZWYpXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLmZpbmFsaXplUmVmXCI6IChzcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLm1lbS5nZXRVaW50MzIoc3AgKyA4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2dvUmVmQ291bnRzW2lkXS0tO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2dvUmVmQ291bnRzW2lkXSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy5fdmFsdWVzW2lkXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2lkXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lkcy5kZWxldGUodik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lkUG9vbC5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgc3RyaW5nVmFsKHZhbHVlIHN0cmluZykgcmVmXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnN0cmluZ1ZhbFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyAyNCwgbG9hZFN0cmluZyhzcCArIDgpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVHZXQodiByZWYsIHAgc3RyaW5nKSByZWZcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMudmFsdWVHZXRcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldChsb2FkVmFsdWUoc3AgKyA4KSwgbG9hZFN0cmluZyhzcCArIDE2KSk7XG4gICAgICAgICAgICAgICAgICBzcCA9IHRoaXMuX2luc3QuZXhwb3J0cy5nZXRzcCgpID4+PiAwO1xuICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDMyLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB2YWx1ZVNldCh2IHJlZiwgcCBzdHJpbmcsIHggcmVmKVxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZVNldFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIFJlZmxlY3Quc2V0KGxvYWRWYWx1ZShzcCArIDgpLCBsb2FkU3RyaW5nKHNwICsgMTYpLCBsb2FkVmFsdWUoc3AgKyAzMikpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB2YWx1ZURlbGV0ZSh2IHJlZiwgcCBzdHJpbmcpXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlRGVsZXRlXCI6IChzcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xuICAgICAgICAgICAgICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShsb2FkVmFsdWUoc3AgKyA4KSwgbG9hZFN0cmluZyhzcCArIDE2KSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHZhbHVlSW5kZXgodiByZWYsIGkgaW50KSByZWZcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMudmFsdWVJbmRleFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyAyNCwgUmVmbGVjdC5nZXQobG9hZFZhbHVlKHNwICsgOCksIGdldEludDY0KHNwICsgMTYpKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZVNldEluZGV4KHYgcmVmLCBpIGludCwgeCByZWYpXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlU2V0SW5kZXhcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICBSZWZsZWN0LnNldChsb2FkVmFsdWUoc3AgKyA4KSwgZ2V0SW50NjQoc3AgKyAxNiksIGxvYWRWYWx1ZShzcCArIDI0KSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmdW5jIHZhbHVlQ2FsbCh2IHJlZiwgbSBzdHJpbmcsIGFyZ3MgW11yZWYpIChyZWYsIGJvb2wpXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlQ2FsbFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBsb2FkVmFsdWUoc3AgKyA4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IFJlZmxlY3QuZ2V0KHYsIGxvYWRTdHJpbmcoc3AgKyAxNikpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gbG9hZFNsaWNlT2ZWYWx1ZXMoc3AgKyAzMik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkobSwgdiwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyA1NiwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDgoc3AgKyA2NCwgMSk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3AgPSB0aGlzLl9pbnN0LmV4cG9ydHMuZ2V0c3AoKSA+Pj4gMDtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDU2LCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDY0LCAwKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVJbnZva2UodiByZWYsIGFyZ3MgW11yZWYpIChyZWYsIGJvb2wpXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlSW52b2tlXCI6IChzcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IGxvYWRWYWx1ZShzcCArIDgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gbG9hZFNsaWNlT2ZWYWx1ZXMoc3AgKyAxNik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkodiwgdm9pZCAwLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgc3AgPSB0aGlzLl9pbnN0LmV4cG9ydHMuZ2V0c3AoKSA+Pj4gMDtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDQwLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAxKTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBzcCA9IHRoaXMuX2luc3QuZXhwb3J0cy5nZXRzcCgpID4+PiAwO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZVZhbHVlKHNwICsgNDAsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQ4KHNwICsgNDgsIDApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gZnVuYyB2YWx1ZU5ldyh2IHJlZiwgYXJncyBbXXJlZikgKHJlZiwgYm9vbClcbiAgICAgICAgICAgICAgICBcInN5c2NhbGwvanMudmFsdWVOZXdcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gbG9hZFZhbHVlKHNwICsgOCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBsb2FkU2xpY2VPZlZhbHVlcyhzcCArIDE2KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QodiwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5faW5zdC5leHBvcnRzLmdldHNwKCkgPj4+IDA7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVmFsdWUoc3AgKyA0MCwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDgoc3AgKyA0OCwgMSk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3AgPSB0aGlzLl9pbnN0LmV4cG9ydHMuZ2V0c3AoKSA+Pj4gMDtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDQwLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAwKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVMZW5ndGgodiByZWYpIGludFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUxlbmd0aFwiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIHNldEludDY0KHNwICsgMTYsIHBhcnNlSW50KGxvYWRWYWx1ZShzcCArIDgpLmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gdmFsdWVQcmVwYXJlU3RyaW5nKHYgcmVmKSAocmVmLCBpbnQpXG4gICAgICAgICAgICAgICAgXCJzeXNjYWxsL2pzLnZhbHVlUHJlcGFyZVN0cmluZ1wiOiAoc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwID4+Pj0gMDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGVuY29kZXIuZW5jb2RlKFN0cmluZyhsb2FkVmFsdWUoc3AgKyA4KSkpO1xuICAgICAgICAgICAgICAgICAgc3RvcmVWYWx1ZShzcCArIDE2LCBzdHIpO1xuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyAyNCwgc3RyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZUxvYWRTdHJpbmcodiByZWYsIGIgW11ieXRlKVxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUxvYWRTdHJpbmdcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzdHIgPSBsb2FkVmFsdWUoc3AgKyA4KTtcbiAgICAgICAgICAgICAgICAgIGxvYWRTbGljZShzcCArIDE2KS5zZXQoc3RyKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgdmFsdWVJbnN0YW5jZU9mKHYgcmVmLCB0IHJlZikgYm9vbFxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy52YWx1ZUluc3RhbmNlT2ZcIjogKHNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDI0LCBsb2FkVmFsdWUoc3AgKyA4KSBpbnN0YW5jZW9mIGxvYWRWYWx1ZShzcCArIDE2KSA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgY29weUJ5dGVzVG9Hbyhkc3QgW11ieXRlLCBzcmMgcmVmKSAoaW50LCBib29sKVxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy5jb3B5Qnl0ZXNUb0dvXCI6IChzcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZHN0ID0gbG9hZFNsaWNlKHNwICsgOCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzcmMgPSBsb2FkVmFsdWUoc3AgKyAzMik7XG4gICAgICAgICAgICAgICAgICBpZiAoIShzcmMgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IHNyYyBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29uc3QgdG9Db3B5ID0gc3JjLnN1YmFycmF5KDAsIGRzdC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgZHN0LnNldCh0b0NvcHkpO1xuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyA0MCwgdG9Db3B5Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAxKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGZ1bmMgY29weUJ5dGVzVG9KUyhkc3QgcmVmLCBzcmMgW11ieXRlKSAoaW50LCBib29sKVxuICAgICAgICAgICAgICAgIFwic3lzY2FsbC9qcy5jb3B5Qnl0ZXNUb0pTXCI6IChzcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc3AgPj4+PSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZHN0ID0gbG9hZFZhbHVlKHNwICsgOCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzcmMgPSBsb2FkU2xpY2Uoc3AgKyAxNik7XG4gICAgICAgICAgICAgICAgICBpZiAoIShkc3QgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IGRzdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29uc3QgdG9Db3B5ID0gc3JjLnN1YmFycmF5KDAsIGRzdC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgZHN0LnNldCh0b0NvcHkpO1xuICAgICAgICAgICAgICAgICAgc2V0SW50NjQoc3AgKyA0MCwgdG9Db3B5Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lbS5zZXRVaW50OChzcCArIDQ4LCAxKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGVidWdcIjogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBydW4oaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuSW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR28ucnVuOiBXZWJBc3NlbWJseS5JbnN0YW5jZSBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9pbnN0ID0gaW5zdGFuY2U7XG4gICAgICAgICAgICAgIHRoaXMubWVtID0gbmV3IERhdGFWaWV3KHRoaXMuX2luc3QuZXhwb3J0cy5tZW0uYnVmZmVyKTtcbiAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW1xuICAgICAgICAgICAgICAgIC8vIEpTIHZhbHVlcyB0aGF0IEdvIGN1cnJlbnRseSBoYXMgcmVmZXJlbmNlcyB0bywgaW5kZXhlZCBieSByZWZlcmVuY2UgaWRcbiAgICAgICAgICAgICAgICBOYU4sXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICB0aGlzXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgIHRoaXMuX2dvUmVmQ291bnRzID0gbmV3IEFycmF5KHRoaXMuX3ZhbHVlcy5sZW5ndGgpLmZpbGwoSW5maW5pdHkpO1xuICAgICAgICAgICAgICB0aGlzLl9pZHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcChbXG4gICAgICAgICAgICAgICAgLy8gbWFwcGluZyBmcm9tIEpTIHZhbHVlcyB0byByZWZlcmVuY2UgaWRzXG4gICAgICAgICAgICAgICAgWzAsIDFdLFxuICAgICAgICAgICAgICAgIFtudWxsLCAyXSxcbiAgICAgICAgICAgICAgICBbdHJ1ZSwgM10sXG4gICAgICAgICAgICAgICAgW2ZhbHNlLCA0XSxcbiAgICAgICAgICAgICAgICBbZ2xvYmFsVGhpcywgNV0sXG4gICAgICAgICAgICAgICAgW3RoaXMsIDZdXG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICB0aGlzLl9pZFBvb2wgPSBbXTtcbiAgICAgICAgICAgICAgdGhpcy5leGl0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IDQwOTY7XG4gICAgICAgICAgICAgIGNvbnN0IHN0clB0ciA9IChzdHIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwdHIgPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBlbmNvZGVyLmVuY29kZShzdHIgKyBcIlxcMFwiKTtcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSh0aGlzLm1lbS5idWZmZXIsIG9mZnNldCwgYnl0ZXMubGVuZ3RoKS5zZXQoYnl0ZXMpO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBieXRlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCAlIDggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgIG9mZnNldCArPSA4IC0gb2Zmc2V0ICUgODtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHB0cjtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgY29uc3QgYXJnYyA9IHRoaXMuYXJndi5sZW5ndGg7XG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3ZQdHJzID0gW107XG4gICAgICAgICAgICAgIHRoaXMuYXJndi5mb3JFYWNoKChhcmcpID0+IHtcbiAgICAgICAgICAgICAgICBhcmd2UHRycy5wdXNoKHN0clB0cihhcmcpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGFyZ3ZQdHJzLnB1c2goMCk7XG4gICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmVudikuc29ydCgpO1xuICAgICAgICAgICAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGFyZ3ZQdHJzLnB1c2goc3RyUHRyKGAke2tleX09JHt0aGlzLmVudltrZXldfWApKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGFyZ3ZQdHJzLnB1c2goMCk7XG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3YgPSBvZmZzZXQ7XG4gICAgICAgICAgICAgIGFyZ3ZQdHJzLmZvckVhY2goKHB0cikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVtLnNldFVpbnQzMihvZmZzZXQsIHB0ciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZW0uc2V0VWludDMyKG9mZnNldCArIDQsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSA4O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3Qgd2FzbU1pbkRhdGFBZGRyID0gNDA5NiArIDgxOTI7XG4gICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gd2FzbU1pbkRhdGFBZGRyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidG90YWwgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGV4Y2VlZHMgbGltaXRcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5faW5zdC5leHBvcnRzLnJ1bihhcmdjLCBhcmd2KTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZXhpdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZUV4aXRQcm9taXNlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgeWllbGQgdGhpcy5fZXhpdFByb21pc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX3Jlc3VtZSgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXRlZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHbyBwcm9ncmFtIGhhcyBhbHJlYWR5IGV4aXRlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2luc3QuZXhwb3J0cy5yZXN1bWUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXRlZCkge1xuICAgICAgICAgICAgICB0aGlzLl9yZXNvbHZlRXhpdFByb21pc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgX21ha2VGdW5jV3JhcHBlcihpZCkge1xuICAgICAgICAgICAgY29uc3QgZ28gPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IHsgaWQsIHRoaXM6IHRoaXMsIGFyZ3M6IGFyZ3VtZW50cyB9O1xuICAgICAgICAgICAgICBnby5fcGVuZGluZ0V2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICAgIGdvLl9yZXN1bWUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LnJlc3VsdDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSkoKTtcbiAgICAgIG9ubWVzc2FnZSA9ICh7IGRhdGE6IHdhc20gfSkgPT4ge1xuICAgICAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICAgICAgICBsZXQgZnMgPSBnbG9iYWxUaGlzLmZzO1xuICAgICAgICBsZXQgc3RkZXJyID0gXCJcIjtcbiAgICAgICAgZnMud3JpdGVTeW5jID0gKGZkLCBidWZmZXIpID0+IHtcbiAgICAgICAgICBpZiAoZmQgPT09IDEpIHtcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKGJ1ZmZlcik7XG4gICAgICAgICAgfSBlbHNlIGlmIChmZCA9PT0gMikge1xuICAgICAgICAgICAgc3RkZXJyICs9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlcik7XG4gICAgICAgICAgICBsZXQgcGFydHMgPSBzdGRlcnIuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkgY29uc29sZS5sb2cocGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oXCJcXG5cIikpO1xuICAgICAgICAgICAgc3RkZXJyID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCB3cml0ZVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBzdGRpbiA9IFtdO1xuICAgICAgICBsZXQgcmVzdW1lU3RkaW47XG4gICAgICAgIGxldCBzdGRpblBvcyA9IDA7XG4gICAgICAgIG9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN0ZGluLnB1c2goZGF0YSk7XG4gICAgICAgICAgICBpZiAocmVzdW1lU3RkaW4pIHJlc3VtZVN0ZGluKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBnbztcbiAgICAgICAgfTtcbiAgICAgICAgZnMucmVhZCA9IChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgaWYgKGZkICE9PSAwIHx8IG9mZnNldCAhPT0gMCB8fCBsZW5ndGggIT09IGJ1ZmZlci5sZW5ndGggfHwgcG9zaXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCByZWFkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RkaW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bWVTdGRpbiA9ICgpID0+IGZzLnJlYWQoZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjayk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBmaXJzdCA9IHN0ZGluWzBdO1xuICAgICAgICAgIGxldCBjb3VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxlbmd0aCwgZmlyc3QubGVuZ3RoIC0gc3RkaW5Qb3MpKTtcbiAgICAgICAgICBidWZmZXIuc2V0KGZpcnN0LnN1YmFycmF5KHN0ZGluUG9zLCBzdGRpblBvcyArIGNvdW50KSwgb2Zmc2V0KTtcbiAgICAgICAgICBzdGRpblBvcyArPSBjb3VudDtcbiAgICAgICAgICBpZiAoc3RkaW5Qb3MgPT09IGZpcnN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgc3RkaW4uc2hpZnQoKTtcbiAgICAgICAgICAgIHN0ZGluUG9zID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgY291bnQpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgZ28gPSBuZXcgZ2xvYmFsVGhpcy5HbygpO1xuICAgICAgICBnby5hcmd2ID0gW1wiXCIsIGAtLXNlcnZpY2U9JHtcIjAuMjcuMVwifWBdO1xuICAgICAgICB0cnlUb0luc3RhbnRpYXRlTW9kdWxlKHdhc20sIGdvKS50aGVuKFxuICAgICAgICAgIChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgcG9zdE1lc3NhZ2UobnVsbCk7XG4gICAgICAgICAgICBnby5ydW4oaW5zdGFuY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBwb3N0TWVzc2FnZShlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZ287XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gdHJ5VG9JbnN0YW50aWF0ZU1vZHVsZSh3YXNtLCBnbykge1xuICAgICAgICByZXR1cm4gX19hc3luYyh0aGlzLCBudWxsLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgIGlmICh3YXNtIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUod2FzbSwgZ28uaW1wb3J0T2JqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzID0geWllbGQgZmV0Y2god2FzbSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRvd25sb2FkICR7SlNPTi5zdHJpbmdpZnkod2FzbSl9YCk7XG4gICAgICAgICAgaWYgKFwiaW5zdGFudGlhdGVTdHJlYW1pbmdcIiBpbiBXZWJBc3NlbWJseSAmJiAvXmFwcGxpY2F0aW9uXFwvd2FzbSgkfDspL2kudGVzdChyZXMuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIikgfHwgXCJcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDIgPSB5aWVsZCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXMsIGdvLmltcG9ydE9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Mi5pbnN0YW5jZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYnl0ZXMgPSB5aWVsZCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShieXRlcywgZ28uaW1wb3J0T2JqZWN0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0Lmluc3RhbmNlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobSkgPT4gb25tZXNzYWdlKG0pO1xuICAgIH0pKChkYXRhKSA9PiB3b3JrZXIub25tZXNzYWdlKHsgZGF0YSB9KSk7XG4gICAgbGV0IGdvO1xuICAgIHdvcmtlciA9IHtcbiAgICAgIG9ubWVzc2FnZTogbnVsbCxcbiAgICAgIHBvc3RNZXNzYWdlOiAoZGF0YSkgPT4gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZ28gPSBvbm1lc3NhZ2UoeyBkYXRhIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdEFsbFdpdGgoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgaWYgKGdvKVxuICAgICAgICAgIGZvciAobGV0IHRpbWVvdXQgb2YgZ28uX3NjaGVkdWxlZFRpbWVvdXRzLnZhbHVlcygpKVxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgbGV0IGZpcnN0TWVzc2FnZVJlc29sdmU7XG4gIGxldCBmaXJzdE1lc3NhZ2VSZWplY3Q7XG4gIGNvbnN0IGZpcnN0TWVzc2FnZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZmlyc3RNZXNzYWdlUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgZmlyc3RNZXNzYWdlUmVqZWN0ID0gcmVqZWN0O1xuICB9KTtcbiAgd29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGE6IGVycm9yIH0pID0+IHtcbiAgICB3b3JrZXIub25tZXNzYWdlID0gKHsgZGF0YSB9KSA9PiByZWFkRnJvbVN0ZG91dChkYXRhKTtcbiAgICBpZiAoZXJyb3IpIGZpcnN0TWVzc2FnZVJlamVjdChlcnJvcik7XG4gICAgZWxzZSBmaXJzdE1lc3NhZ2VSZXNvbHZlKCk7XG4gIH07XG4gIHdvcmtlci5wb3N0TWVzc2FnZSh3YXNtTW9kdWxlIHx8IG5ldyBVUkwod2FzbVVSTCwgbG9jYXRpb24uaHJlZikudG9TdHJpbmcoKSk7XG4gIGxldCB7IHJlYWRGcm9tU3Rkb3V0LCBzZXJ2aWNlIH0gPSBjcmVhdGVDaGFubmVsKHtcbiAgICB3cml0ZVRvU3RkaW4oYnl0ZXMpIHtcbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShieXRlcyk7XG4gICAgfSxcbiAgICBpc1N5bmM6IGZhbHNlLFxuICAgIGhhc0ZTOiBmYWxzZSxcbiAgICBlc2J1aWxkOiBicm93c2VyX2V4cG9ydHNcbiAgfSk7XG4gIHlpZWxkIGZpcnN0TWVzc2FnZVByb21pc2U7XG4gIHN0b3BTZXJ2aWNlID0gKCkgPT4ge1xuICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICBpbml0aWFsaXplUHJvbWlzZSA9IHZvaWQgMDtcbiAgICBzdG9wU2VydmljZSA9IHZvaWQgMDtcbiAgICBsb25nTGl2ZWRTZXJ2aWNlID0gdm9pZCAwO1xuICB9O1xuICBsb25nTGl2ZWRTZXJ2aWNlID0ge1xuICAgIGJ1aWxkOiAob3B0aW9ucykgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVqZWN0QWxsUHJvbWlzZS50aGVuKHJlamVjdCk7XG4gICAgICBzZXJ2aWNlLmJ1aWxkT3JDb250ZXh0KHtcbiAgICAgICAgY2FsbE5hbWU6IFwiYnVpbGRcIixcbiAgICAgICAgcmVmczogbnVsbCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgaXNUVFk6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0V0Q6IFwiL1wiLFxuICAgICAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUocmVzKVxuICAgICAgfSk7XG4gICAgfSksXG4gICAgY29udGV4dDogKG9wdGlvbnMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlamVjdEFsbFByb21pc2UudGhlbihyZWplY3QpO1xuICAgICAgc2VydmljZS5idWlsZE9yQ29udGV4dCh7XG4gICAgICAgIGNhbGxOYW1lOiBcImNvbnRleHRcIixcbiAgICAgICAgcmVmczogbnVsbCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgaXNUVFk6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0V0Q6IFwiL1wiLFxuICAgICAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUocmVzKVxuICAgICAgfSk7XG4gICAgfSksXG4gICAgdHJhbnNmb3JtOiAoaW5wdXQsIG9wdGlvbnMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlamVjdEFsbFByb21pc2UudGhlbihyZWplY3QpO1xuICAgICAgc2VydmljZS50cmFuc2Zvcm0oe1xuICAgICAgICBjYWxsTmFtZTogXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgcmVmczogbnVsbCxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMgfHwge30sXG4gICAgICAgIGlzVFRZOiBmYWxzZSxcbiAgICAgICAgZnM6IHtcbiAgICAgICAgICByZWFkRmlsZShfLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKFwiSW50ZXJuYWwgZXJyb3JcIiksIG51bGwpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgd3JpdGVGaWxlKF8sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGxiYWNrOiAoZXJyLCByZXMpID0+IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShyZXMpXG4gICAgICB9KTtcbiAgICB9KSxcbiAgICBmb3JtYXRNZXNzYWdlczogKG1lc3NhZ2VzLCBvcHRpb25zKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZWplY3RBbGxQcm9taXNlLnRoZW4ocmVqZWN0KTtcbiAgICAgIHNlcnZpY2UuZm9ybWF0TWVzc2FnZXMoe1xuICAgICAgICBjYWxsTmFtZTogXCJmb3JtYXRNZXNzYWdlc1wiLFxuICAgICAgICByZWZzOiBudWxsLFxuICAgICAgICBtZXNzYWdlcyxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgY2FsbGJhY2s6IChlcnIsIHJlcykgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlcylcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIGFuYWx5emVNZXRhZmlsZTogKG1ldGFmaWxlLCBvcHRpb25zKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZWplY3RBbGxQcm9taXNlLnRoZW4ocmVqZWN0KTtcbiAgICAgIHNlcnZpY2UuYW5hbHl6ZU1ldGFmaWxlKHtcbiAgICAgICAgY2FsbE5hbWU6IFwiYW5hbHl6ZU1ldGFmaWxlXCIsXG4gICAgICAgIHJlZnM6IG51bGwsXG4gICAgICAgIG1ldGFmaWxlOiB0eXBlb2YgbWV0YWZpbGUgPT09IFwic3RyaW5nXCIgPyBtZXRhZmlsZSA6IEpTT04uc3RyaW5naWZ5KG1ldGFmaWxlKSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgY2FsbGJhY2s6IChlcnIsIHJlcykgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlcylcbiAgICAgIH0pO1xuICAgIH0pXG4gIH07XG59KTtcbnZhciBicm93c2VyX2RlZmF1bHQgPSBicm93c2VyX2V4cG9ydHM7XG59KSh0eXBlb2YgbW9kdWxlPT09XCJvYmplY3RcIj9tb2R1bGU6e3NldCBleHBvcnRzKHgpeyh0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0aGlzKS5lc2J1aWxkPXh9fSk7XG4iLCAiaW1wb3J0ICogYXMgZXNidWlsZCBmcm9tICdlc2J1aWxkLXdhc20nXG5cbmxldCBpbml0aWFsaXplZCA9IGZhbHNlXG5sZXQga2VybmVsUGF0aCA9ICcvc2FuZGJveC9sb2dpeC1jb3JlLmpzJ1xubGV0IGVmZmVjdFJvb3RQYXRoID0gJy9zYW5kYm94L2VmZmVjdC5qcydcblxuY29uc3QgRVNNX1NIX09SSUdJTiA9ICdodHRwczovL2VzbS5zaCdcbmNvbnN0IEVGRkVDVF9TQ09QRV9WRVJTSU9OID0gJzAuOTQuMCdcbmNvbnN0IExPQ0FMX0FUX0VGRkVDVF9QQUNLQUdFUyA9IG5ldyBTZXQ8c3RyaW5nPihbJ3BsYXRmb3JtJ10pXG5cbmNvbnN0IHJlbW90ZU1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuXG5jb25zdCBzaW1wbGlmeU1vZHVsZUtleSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHZhbHVlLnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCAnJykudG9Mb3dlckNhc2UoKVxuXG5sZXQgbG9naXhDb3JlU3VicGF0aFNldDogU2V0PHN0cmluZz4gfCBudWxsID0gbnVsbFxubGV0IGxvZ2l4Q29yZVN1YnBhdGhLZXlUb0Nhbm9uaWNhbDogTWFwPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPSBudWxsXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2dpeENvcmVTdWJwYXRocyhzcGVjaWZpZXJzOiBSZWFkb25seUFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgbG9naXhDb3JlU3VicGF0aFNldCA9IG5ldyBTZXQoc3BlY2lmaWVycylcbiAgbG9naXhDb3JlU3VicGF0aEtleVRvQ2Fub25pY2FsID0gbmV3IE1hcCgpXG4gIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIHNwZWNpZmllcnMpIHtcbiAgICBsb2dpeENvcmVTdWJwYXRoS2V5VG9DYW5vbmljYWwuc2V0KHNpbXBsaWZ5TW9kdWxlS2V5KHNwZWNpZmllciksIHNwZWNpZmllcilcbiAgfVxufVxuXG5jb25zdCBmZXRjaFJlbW90ZU1vZHVsZSA9IGFzeW5jICh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IGNhY2hlZCA9IHJlbW90ZU1vZHVsZUNhY2hlLmdldCh1cmwpXG4gIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjYWNoZWRcbiAgfVxuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpXG4gIGlmICghcmVzLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbc2FuZGJveC5jb21waWxlcl0gZmV0Y2ggZmFpbGVkOiAke1N0cmluZyhyZXMuc3RhdHVzKX0gJHtTdHJpbmcocmVzLnN0YXR1c1RleHQpfSAoJHt1cmx9KWApXG4gIH1cbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KClcbiAgcmVtb3RlTW9kdWxlQ2FjaGUuc2V0KHVybCwgdGV4dClcbiAgcmV0dXJuIHRleHRcbn1cblxuY29uc3QgdG9BYnNvbHV0ZVVybCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh2YWx1ZSkudG9TdHJpbmcoKVxuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBiYXNlID0gKGdsb2JhbFRoaXMgYXMgYW55KS5sb2NhdGlvbj8uaHJlZlxuICAgIGlmICh0eXBlb2YgYmFzZSA9PT0gJ3N0cmluZycgJiYgYmFzZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBiYXNlVXJsID0gbmV3IFVSTChiYXNlKVxuICAgICAgY29uc3Qgb3JpZ2luID0gYmFzZVVybC5vcmlnaW4gIT09ICdudWxsJyA/IGJhc2VVcmwub3JpZ2luIDogdW5kZWZpbmVkXG4gICAgICBpZiAob3JpZ2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgVVJMKHZhbHVlLCBvcmlnaW4pLnRvU3RyaW5nKClcbiAgICAgIH1cbiAgICAgIGlmIChiYXNlVXJsLnByb3RvY29sID09PSAnaHR0cDonIHx8IGJhc2VVcmwucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICAgIHJldHVybiBuZXcgVVJMKHZhbHVlLCBiYXNlVXJsLmhyZWYpLnRvU3RyaW5nKClcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGx0aHJvdWdoXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuY29uc3QgdG9TaWJsaW5nUGF0aCA9IChiYXNlUGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICBpZiAoYmFzZVBhdGguc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGJhc2VQYXRoLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHJldHVybiBuZXcgVVJMKGAuLyR7ZmlsZU5hbWV9YCwgYmFzZVBhdGgpLnRvU3RyaW5nKClcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGx0aHJvdWdoXG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gYmFzZVBhdGguc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdXG4gIGNvbnN0IGxhc3RTbGFzaCA9IHRyaW1tZWQubGFzdEluZGV4T2YoJy8nKVxuICBpZiAobGFzdFNsYXNoID49IDApIHtcbiAgICByZXR1cm4gYCR7dHJpbW1lZC5zbGljZSgwLCBsYXN0U2xhc2gpfS8ke2ZpbGVOYW1lfWBcbiAgfVxuICByZXR1cm4gYC8ke2ZpbGVOYW1lfWBcbn1cblxuY29uc3QgcGluRWZmZWN0U2NvcGUgPSAoc3BlY2lmaWVyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXNwZWNpZmllci5zdGFydHNXaXRoKCdAZWZmZWN0LycpKSB7XG4gICAgcmV0dXJuIHNwZWNpZmllclxuICB9XG5cbiAgLy8gRXhhbXBsZXM6XG4gIC8vIC0gQGVmZmVjdC9wbGF0Zm9ybSAgICAgICAgICAtPiBAZWZmZWN0L3BsYXRmb3JtQDAuOTQuMFxuICAvLyAtIEBlZmZlY3QvcGxhdGZvcm0vUGF0aCAgICAgLT4gQGVmZmVjdC9wbGF0Zm9ybUAwLjk0LjAvUGF0aFxuICAvLyAtIEBlZmZlY3QvcGxhdGZvcm1AMC45NC4wICAgLT4gKGtlZXApXG4gIGNvbnN0IG1hdGNoID0gc3BlY2lmaWVyLm1hdGNoKC9eQGVmZmVjdFxcLyhbXkAvXSspKEBbXi9dKyk/KFxcLy4qKT8kLylcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBzcGVjaWZpZXJcbiAgfVxuICBjb25zdCBuYW1lID0gbWF0Y2hbMV1cbiAgY29uc3QgdmVyc2lvblBhcnQgPSBtYXRjaFsyXVxuICBjb25zdCByZXN0ID0gbWF0Y2hbM10gPz8gJydcbiAgaWYgKHZlcnNpb25QYXJ0KSB7XG4gICAgcmV0dXJuIHNwZWNpZmllclxuICB9XG4gIHJldHVybiBgQGVmZmVjdC8ke25hbWV9QCR7RUZGRUNUX1NDT1BFX1ZFUlNJT059JHtyZXN0fWBcbn1cblxuY29uc3QgdHJ5UGFyc2VFc21FZmZlY3RTdWJwYXRoID0gKHVybDogVVJMKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGlmICh1cmwub3JpZ2luICE9PSBFU01fU0hfT1JJR0lOKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gdXJsLnBhdGhuYW1lLm1hdGNoKC9eXFwvKD86dlxcZCtcXC8pP2VmZmVjdEBbXi9dKyg/OlxcLyguKikpPyQvKVxuICBjb25zdCByZXN0ID0gbWF0Y2g/LlsxXVxuICAvLyByb290OiAvZWZmZWN0QHggb3IgL2VmZmVjdEBeeFxuICBpZiAoIXJlc3QpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIC9lZmZlY3RAeC9lczIwMjIvQ29udGV4dC5tanMgLT4gQ29udGV4dFxuICBjb25zdCBlc01vZHVsZU1hdGNoID0gcmVzdC5tYXRjaCgvXmVzXFxkK1xcLyhbXi9dKylcXC5tanMkLylcbiAgaWYgKGVzTW9kdWxlTWF0Y2g/LlsxXSkge1xuICAgIHJldHVybiBlc01vZHVsZU1hdGNoWzFdXG4gIH1cblxuICAvLyAvZWZmZWN0QHgvQ29udGV4dCAtPiBDb250ZXh0XG4gIGlmICghcmVzdC5pbmNsdWRlcygnLycpKSB7XG4gICAgcmV0dXJuIHJlc3RcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IHRyeVBhcnNlRXNtQXRFZmZlY3RTdWJwYXRoID0gKHVybDogVVJMKTogeyBwa2c6IHN0cmluZzsgc3VicGF0aDogc3RyaW5nIH0gfCBudWxsID0+IHtcbiAgaWYgKHVybC5vcmlnaW4gIT09IEVTTV9TSF9PUklHSU4pIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gRXhhbXBsZXM6XG4gIC8vIC0gL0BlZmZlY3QvcGxhdGZvcm1AMC45NC4wICAgICAgICAgICAgICAgLT4geyBwa2c6IFwicGxhdGZvcm1cIiwgc3VicGF0aDogXCJcIiB9XG4gIC8vIC0gL0BlZmZlY3QvcGxhdGZvcm1AMC45NC4wL1BhdGggICAgICAgICAgLT4geyBwa2c6IFwicGxhdGZvcm1cIiwgc3VicGF0aDogXCJQYXRoXCIgfVxuICAvLyAtIC9AZWZmZWN0L3BsYXRmb3JtQDAuOTQuMC9lczIwMjIvUGF0aC5tanMgLT4geyBwa2c6IFwicGxhdGZvcm1cIiwgc3VicGF0aDogXCJQYXRoXCIgfVxuICBjb25zdCBtYXRjaCA9IHVybC5wYXRobmFtZS5tYXRjaCgvXlxcLyg/OnZcXGQrXFwvKT9AZWZmZWN0XFwvKFteQC9dKylAW14vXSsoPzpcXC8oLiopKT8kLylcbiAgY29uc3QgcGtnID0gbWF0Y2g/LlsxXVxuICBjb25zdCByZXN0ID0gbWF0Y2g/LlsyXVxuICBpZiAoIXBrZykge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgaWYgKCFyZXN0KSB7XG4gICAgcmV0dXJuIHsgcGtnLCBzdWJwYXRoOiAnJyB9XG4gIH1cblxuICBjb25zdCBlc01vZHVsZU1hdGNoID0gcmVzdC5tYXRjaCgvXmVzXFxkK1xcLyhbXi9dKylcXC5tanMkLylcbiAgaWYgKGVzTW9kdWxlTWF0Y2g/LlsxXSkge1xuICAgIHJldHVybiB7IHBrZywgc3VicGF0aDogZXNNb2R1bGVNYXRjaFsxXSB9XG4gIH1cblxuICBpZiAoIXJlc3QuaW5jbHVkZXMoJy8nKSkge1xuICAgIHJldHVybiB7IHBrZywgc3VicGF0aDogcmVzdC5yZXBsYWNlKC9cXC5tanMkLywgJycpIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IHRvRWZmZWN0UGF0aCA9IChzdWJwYXRoOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nID0+IHtcbiAgaWYgKCFzdWJwYXRoKSB7XG4gICAgcmV0dXJuIGVmZmVjdFJvb3RQYXRoXG4gIH1cbiAgcmV0dXJuIHRvU2libGluZ1BhdGgoa2VybmVsUGF0aCwgYGVmZmVjdC8ke3N1YnBhdGh9LmpzYClcbn1cblxuY29uc3QgdG9BdEVmZmVjdFBhdGggPSAocGtnOiBzdHJpbmcsIHN1YnBhdGg6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXN1YnBhdGgpIHtcbiAgICByZXR1cm4gdG9TaWJsaW5nUGF0aChrZXJuZWxQYXRoLCBgQGVmZmVjdC8ke3BrZ30uanNgKVxuICB9XG4gIHJldHVybiB0b1NpYmxpbmdQYXRoKGtlcm5lbFBhdGgsIGBAZWZmZWN0LyR7cGtnfS8ke3N1YnBhdGh9LmpzYClcbn1cblxudHlwZSBMb2dpeENvcmVTdWJwYXRoSW5mbyA9IHtcbiAgcmVhZG9ubHkgbm9ybWFsaXplZDogc3RyaW5nXG59XG5cbmNvbnN0IG5vcm1hbGl6ZUxvZ2l4Q29yZVN1YnBhdGggPSAoc3VicGF0aDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgbGV0IG91dCA9IHN1YnBhdGguc3BsaXQoJz8nKVswXT8uc3BsaXQoJyMnKVswXSA/PyBzdWJwYXRoXG4gIG91dCA9IG91dC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICBpZiAob3V0LmVuZHNXaXRoKCcuanMnKSkge1xuICAgIG91dCA9IG91dC5zbGljZSgwLCAtJy5qcycubGVuZ3RoKVxuICB9XG4gIGlmIChvdXQuZW5kc1dpdGgoJy9pbmRleCcpKSB7XG4gICAgb3V0ID0gb3V0LnNsaWNlKDAsIC0nL2luZGV4Jy5sZW5ndGgpXG4gIH1cbiAgY29uc3Qgc2VnbWVudHMgPSBvdXQuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgcmV0dXJuIHNlZ21lbnRzLmpvaW4oJy8nKVxufVxuXG5jb25zdCBnZXRMb2dpeENvcmVTdWJwYXRoSW5mbyA9IChyYXc6IHN0cmluZyk6IExvZ2l4Q29yZVN1YnBhdGhJbmZvID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUxvZ2l4Q29yZVN1YnBhdGgocmF3KVxuICByZXR1cm4ge1xuICAgIG5vcm1hbGl6ZWQsXG4gIH1cbn1cblxuY29uc3QgcmVtb3RlQnVuZGxlUGx1Z2luOiBlc2J1aWxkLlBsdWdpbiA9IHtcbiAgbmFtZTogJ3JlbW90ZS1idW5kbGUnLFxuICBzZXR1cChidWlsZCkge1xuICAgIGJ1aWxkLm9uUmVzb2x2ZSh7IGZpbHRlcjogL15lZmZlY3QoJHxcXC8pLyB9LCAoYXJncykgPT4ge1xuICAgICAgaWYgKGFyZ3MucGF0aCA9PT0gJ2VmZmVjdCcpIHtcbiAgICAgICAgcmV0dXJuIHsgcGF0aDogZWZmZWN0Um9vdFBhdGgsIGV4dGVybmFsOiB0cnVlIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHN1YnBhdGggPSBhcmdzLnBhdGguc2xpY2UoJ2VmZmVjdC8nLmxlbmd0aClcbiAgICAgIHJldHVybiB7IHBhdGg6IHRvRWZmZWN0UGF0aChzdWJwYXRoKSwgZXh0ZXJuYWw6IHRydWUgfVxuICAgIH0pXG5cbiAgICAvLyBQcmVmZXIgbWFwcGluZyBAZWZmZWN0L3BsYXRmb3JtIChyb290ICsgc3VicGF0aHMpIHRvIHNhbmRib3ggYnVpbHQtaW4gYXJ0aWZhY3RzIHRvIGF2b2lkIGZhbGxpbmcgYmFjayB0byBlc20uc2guXG4gICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvXkBlZmZlY3RcXC9bXi9dKyg/OkBbXi9dKyk/JC8gfSwgKGFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoID0gYXJncy5wYXRoLm1hdGNoKC9eQGVmZmVjdFxcLyhbXkAvXSspKD86QFteL10rKT8kLylcbiAgICAgIGNvbnN0IHBrZyA9IG1hdGNoPy5bMV1cbiAgICAgIGlmICghcGtnIHx8ICFMT0NBTF9BVF9FRkZFQ1RfUEFDS0FHRVMuaGFzKHBrZykpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHBhdGg6IHRvQXRFZmZlY3RQYXRoKHBrZywgbnVsbCksIGV4dGVybmFsOiB0cnVlIH1cbiAgICB9KVxuXG4gICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvXkBlZmZlY3RcXC9bXi9dKyg/OkBbXi9dKyk/XFwvLyB9LCAoYXJncykgPT4ge1xuICAgICAgY29uc3QgbWF0Y2ggPSBhcmdzLnBhdGgubWF0Y2goL15AZWZmZWN0XFwvKFteQC9dKykoPzpAW14vXSspP1xcLyguKykkLylcbiAgICAgIGNvbnN0IHBrZyA9IG1hdGNoPy5bMV1cbiAgICAgIGNvbnN0IHN1YnBhdGggPSBtYXRjaD8uWzJdID8/IG51bGxcbiAgICAgIGlmICghcGtnIHx8ICFMT0NBTF9BVF9FRkZFQ1RfUEFDS0FHRVMuaGFzKHBrZykpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHBhdGg6IHRvQXRFZmZlY3RQYXRoKHBrZywgc3VicGF0aCksIGV4dGVybmFsOiB0cnVlIH1cbiAgICB9KVxuXG4gICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvXkBsb2dpeGpzXFwvY29yZSQvIH0sICgpID0+ICh7XG4gICAgICBwYXRoOiBrZXJuZWxQYXRoLFxuICAgICAgZXh0ZXJuYWw6IHRydWUsXG4gICAgfSkpXG5cbiAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IC9eQGxvZ2l4anNcXC9jb3JlXFwvLyB9LCAoYXJncykgPT4ge1xuICAgICAgY29uc3QgcmF3U3VicGF0aCA9IGFyZ3MucGF0aC5zbGljZSgnQGxvZ2l4anMvY29yZS8nLmxlbmd0aClcbiAgICAgIGNvbnN0IGluZm8gPSBnZXRMb2dpeENvcmVTdWJwYXRoSW5mbyhyYXdTdWJwYXRoKVxuICAgICAgaWYgKCFpbmZvLm5vcm1hbGl6ZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHRleHQ6IGBcdTk3NUVcdTZDRDVcdTc2ODQgQGxvZ2l4anMvY29yZSBcdTVCNTBcdThERUZcdTVGODRcdUZGMUEke2FyZ3MucGF0aH1gIH1dLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0U2VnbWVudCA9IGluZm8ubm9ybWFsaXplZC5zcGxpdCgnLycsIDEpWzBdIVxuICAgICAgaWYgKGZpcnN0U2VnbWVudC50b0xvd2VyQ2FzZSgpID09PSAnaW50ZXJuYWwnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRleHQ6IGBcdTc5ODFcdTZCNjJcdTU3MjggU2FuZGJveCBcdTRFMkQgaW1wb3J0IFwiQGxvZ2l4anMvY29yZS9pbnRlcm5hbC8qXCJcdUZGMUEke2FyZ3MucGF0aH1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmZvLm5vcm1hbGl6ZWQuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0ZXh0OiBgXHU3OTgxXHU2QjYyXHU1NzI4IFNhbmRib3ggXHU0RTJEXHU0RjdGXHU3NTI4IFwiLlwiIFx1NUY2Mlx1NUYwRlx1NzY4NCBAbG9naXhqcy9jb3JlIFx1NUI1MFx1OERFRlx1NUY4NFx1RkYxQSR7YXJncy5wYXRofVx1RkYxQlx1OEJGN1x1NEY3Rlx1NzUyOCBcIi9cIiBcdTUyMDZcdTk2OTRcdUZGMDhcdTRGOEJcdTU5ODIgXCJAbG9naXhqcy9jb3JlLyR7aW5mby5ub3JtYWxpemVkLnJlcGxhY2VBbGwoJy4nLCAnLycpfVwiXHVGRjA5YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWxvZ2l4Q29yZVN1YnBhdGhTZXQgfHwgIWxvZ2l4Q29yZVN1YnBhdGhLZXlUb0Nhbm9uaWNhbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0ZXh0OiBgU2FuZGJveCBcdTUxODVcdTdGNkUgQGxvZ2l4anMvY29yZSBcdTVCNTBcdThERUZcdTVGODRcdTZFMDVcdTUzNTVcdTY3MkFcdTUyMURcdTU5Q0JcdTUzMTZcdUZGMENcdTY1RTBcdTZDRDVcdTg5RTNcdTY3OTBcdUZGMUEke2FyZ3MucGF0aH1cdUZGMUJcdThCRjdcdTc4NkVcdTRGREQgL3NhbmRib3gvbG9naXgtY29yZS5tYW5pZmVzdC5qc29uIFx1NTNFRlx1OEJCRlx1OTVFRWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFsb2dpeENvcmVTdWJwYXRoU2V0LmhhcyhpbmZvLm5vcm1hbGl6ZWQpKSB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb24gPSBsb2dpeENvcmVTdWJwYXRoS2V5VG9DYW5vbmljYWwuZ2V0KHNpbXBsaWZ5TW9kdWxlS2V5KGluZm8ubm9ybWFsaXplZCkpXG4gICAgICAgIGlmIChzdWdnZXN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dDogYFx1Nzk4MVx1NkI2Mlx1NTcyOCBTYW5kYm94IFx1NEUyRFx1NEY3Rlx1NzUyOFx1OTc1RVx1ODlDNFx1ODMwMyBAbG9naXhqcy9jb3JlIFx1NUI1MFx1OERFRlx1NUY4NFx1RkYxQSR7YXJncy5wYXRofVx1RkYxQlx1OEJGN1x1NjUzOVx1NEUzQSBcIkBsb2dpeGpzL2NvcmUvJHtzdWdnZXN0aW9ufVwiYCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRleHQ6IGBcdTY3MkFcdTc3RTVcdTc2ODQgQGxvZ2l4anMvY29yZSBcdTVCNTBcdThERUZcdTVGODRcdUZGMUEke2FyZ3MucGF0aH1cdUZGMUJcdThCRjdcdTY1MzlcdTc1MjhcdTY4MzlcdTVCRkNcdTUxNjVcdUZGMDhcdTRGOEJcdTU5ODIgXCJpbXBvcnQgKiBhcyBMb2dpeCBmcm9tIFxcXFxcIkBsb2dpeGpzL2NvcmVcXFxcXCJcIlx1RkYwOVx1NjIxNlx1NjhDMFx1NjdFNSBrZXJuZWwgXHU2NjJGXHU1NDI2XHU1REYyXHU1MzA1XHU1NDJCXHU4QkU1XHU1QjUwXHU2QTIxXHU1NzU3YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjYW5vbmljYWxGaWxlID0gaW5mby5ub3JtYWxpemVkLnJlcGxhY2VBbGwoJy8nLCAnLicpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiB0b1NpYmxpbmdQYXRoKGtlcm5lbFBhdGgsIGBsb2dpeC1jb3JlLyR7Y2Fub25pY2FsRmlsZX0uanNgKSxcbiAgICAgICAgZXh0ZXJuYWw6IHRydWUsXG4gICAgICB9XG4gICAgfSlcblxuICAgIGJ1aWxkLm9uUmVzb2x2ZSh7IGZpbHRlcjogL15odHRwcz86XFwvXFwvLyB9LCAoYXJncykgPT4ge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChhcmdzLnBhdGgpXG4gICAgICBjb25zdCBlZmZlY3RTdWJwYXRoID0gdHJ5UGFyc2VFc21FZmZlY3RTdWJwYXRoKHVybClcbiAgICAgIGlmIChlZmZlY3RTdWJwYXRoICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7IHBhdGg6IHRvRWZmZWN0UGF0aChlZmZlY3RTdWJwYXRoKSwgZXh0ZXJuYWw6IHRydWUgfVxuICAgICAgfVxuICAgICAgY29uc3QgYXRFZmZlY3QgPSB0cnlQYXJzZUVzbUF0RWZmZWN0U3VicGF0aCh1cmwpXG4gICAgICBpZiAoYXRFZmZlY3QgIT09IG51bGwgJiYgTE9DQUxfQVRfRUZGRUNUX1BBQ0tBR0VTLmhhcyhhdEVmZmVjdC5wa2cpKSB7XG4gICAgICAgIHJldHVybiB7IHBhdGg6IHRvQXRFZmZlY3RQYXRoKGF0RWZmZWN0LnBrZywgYXRFZmZlY3Quc3VicGF0aCksIGV4dGVybmFsOiB0cnVlIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHBhdGg6IHVybC50b1N0cmluZygpLCBuYW1lc3BhY2U6ICdyZW1vdGUtdXJsJyB9XG4gICAgfSlcblxuICAgIGJ1aWxkLm9uUmVzb2x2ZSh7IGZpbHRlcjogL15cXC8vIH0sIChhcmdzKSA9PiB7XG4gICAgICBjb25zdCBiYXNlID1cbiAgICAgICAgYXJncy5pbXBvcnRlci5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgYXJncy5pbXBvcnRlci5zdGFydHNXaXRoKCdodHRwczovLycpXG4gICAgICAgICAgPyBhcmdzLmltcG9ydGVyXG4gICAgICAgICAgOiBgJHtFU01fU0hfT1JJR0lOfS9gXG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGFyZ3MucGF0aCwgYmFzZSlcbiAgICAgIGNvbnN0IGVmZmVjdFN1YnBhdGggPSB0cnlQYXJzZUVzbUVmZmVjdFN1YnBhdGgodXJsKVxuICAgICAgaWYgKGVmZmVjdFN1YnBhdGggIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgcGF0aDogdG9FZmZlY3RQYXRoKGVmZmVjdFN1YnBhdGgpLCBleHRlcm5hbDogdHJ1ZSB9XG4gICAgICB9XG4gICAgICBjb25zdCBhdEVmZmVjdCA9IHRyeVBhcnNlRXNtQXRFZmZlY3RTdWJwYXRoKHVybClcbiAgICAgIGlmIChhdEVmZmVjdCAhPT0gbnVsbCAmJiBMT0NBTF9BVF9FRkZFQ1RfUEFDS0FHRVMuaGFzKGF0RWZmZWN0LnBrZykpIHtcbiAgICAgICAgcmV0dXJuIHsgcGF0aDogdG9BdEVmZmVjdFBhdGgoYXRFZmZlY3QucGtnLCBhdEVmZmVjdC5zdWJwYXRoKSwgZXh0ZXJuYWw6IHRydWUgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgcGF0aDogdXJsLnRvU3RyaW5nKCksIG5hbWVzcGFjZTogJ3JlbW90ZS11cmwnIH1cbiAgICB9KVxuXG4gICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvXlxcLlxcLj9cXC8vIH0sIChhcmdzKSA9PiB7XG4gICAgICBpZiAoIShhcmdzLmltcG9ydGVyLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCBhcmdzLmltcG9ydGVyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGFyZ3MucGF0aCwgYXJncy5pbXBvcnRlcilcbiAgICAgIGNvbnN0IGVmZmVjdFN1YnBhdGggPSB0cnlQYXJzZUVzbUVmZmVjdFN1YnBhdGgodXJsKVxuICAgICAgaWYgKGVmZmVjdFN1YnBhdGggIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgcGF0aDogdG9FZmZlY3RQYXRoKGVmZmVjdFN1YnBhdGgpLCBleHRlcm5hbDogdHJ1ZSB9XG4gICAgICB9XG4gICAgICBjb25zdCBhdEVmZmVjdCA9IHRyeVBhcnNlRXNtQXRFZmZlY3RTdWJwYXRoKHVybClcbiAgICAgIGlmIChhdEVmZmVjdCAhPT0gbnVsbCAmJiBMT0NBTF9BVF9FRkZFQ1RfUEFDS0FHRVMuaGFzKGF0RWZmZWN0LnBrZykpIHtcbiAgICAgICAgcmV0dXJuIHsgcGF0aDogdG9BdEVmZmVjdFBhdGgoYXRFZmZlY3QucGtnLCBhdEVmZmVjdC5zdWJwYXRoKSwgZXh0ZXJuYWw6IHRydWUgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgcGF0aDogdXJsLnRvU3RyaW5nKCksIG5hbWVzcGFjZTogJ3JlbW90ZS11cmwnIH1cbiAgICB9KVxuXG4gICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvXlteLi9dLyB9LCAoYXJncykgPT4ge1xuICAgICAgaWYgKGFyZ3MucGF0aC5zdGFydHNXaXRoKCdlZmZlY3QnKSB8fCBhcmdzLnBhdGguc3RhcnRzV2l0aCgnQGxvZ2l4anMvY29yZScpKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBjb25zdCBzcGVjaWZpZXIgPSBwaW5FZmZlY3RTY29wZShhcmdzLnBhdGgpXG4gICAgICByZXR1cm4geyBwYXRoOiBuZXcgVVJMKHNwZWNpZmllciwgYCR7RVNNX1NIX09SSUdJTn0vYCkudG9TdHJpbmcoKSwgbmFtZXNwYWNlOiAncmVtb3RlLXVybCcgfVxuICAgIH0pXG5cbiAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IC8uKi8sIG5hbWVzcGFjZTogJ3JlbW90ZS11cmwnIH0sIGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICBjb25zdCBjb250ZW50cyA9IGF3YWl0IGZldGNoUmVtb3RlTW9kdWxlKGFyZ3MucGF0aClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnRzLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9XG4gICAgfSlcbiAgfSxcbn1cblxuZXhwb3J0IHR5cGUgQ29tcGlsZVJlc3VsdCA9IHsgc3VjY2VzczogdHJ1ZTsgYnVuZGxlOiBzdHJpbmcgfSB8IHsgc3VjY2VzczogZmFsc2U7IGVycm9yczogc3RyaW5nW10gfVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdENvbXBpbGVyKHdhc21Vcmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoaW5pdGlhbGl6ZWQpIHJldHVyblxuICBhd2FpdCBlc2J1aWxkLmluaXRpYWxpemUoe1xuICAgIHdhc21VUkw6IHdhc21VcmwsXG4gICAgd29ya2VyOiBmYWxzZSxcbiAgfSlcbiAgaW5pdGlhbGl6ZWQgPSB0cnVlXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21waWxlKGNvZGU6IHN0cmluZywgZmlsZW5hbWUgPSAnaW5wdXQudHN4Jyk6IFByb21pc2U8Q29tcGlsZVJlc3VsdD4ge1xuICBpZiAoIWluaXRpYWxpemVkKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yczogWydcdTdGMTZcdThCRDFcdTU2NjhcdTY3MkFcdTUyMURcdTU5Q0JcdTUzMTZcdUZGMENcdThCRjdcdTUxNDhcdThDMDNcdTc1MjggaW5pdENvbXBpbGVyKCknXSB9XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGNvZGUsXG4gICAgICAgIGxvYWRlcjogJ3RzeCcsXG4gICAgICAgIHJlc29sdmVEaXI6ICcvJyxcbiAgICAgICAgc291cmNlZmlsZTogZmlsZW5hbWUsXG4gICAgICB9LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtyZW1vdGVCdW5kbGVQbHVnaW5dLFxuICAgICAgdGFyZ2V0OiAnZXMyMDIwJyxcbiAgICAgIG1pbmlmeTogZmFsc2UsXG4gICAgICBzb3VyY2VtYXA6ICdpbmxpbmUnLFxuICAgIH0pXG5cbiAgICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3JzOiByZXN1bHQuZXJyb3JzLm1hcCgoZSkgPT4gZS50ZXh0KSB9XG4gICAgfVxuXG4gICAgY29uc3QgYnVuZGxlID0gcmVzdWx0Lm91dHB1dEZpbGVzPy5bMF0/LnRleHQgPz8gJydcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBidW5kbGUgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcnM6IFtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcildIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbml0aWFsaXplZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGluaXRpYWxpemVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRLZXJuZWxQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBub3JtYWxpemVkID0gdG9BYnNvbHV0ZVVybChwYXRoKVxuICBrZXJuZWxQYXRoID0gbm9ybWFsaXplZFxuICBlZmZlY3RSb290UGF0aCA9IHRvU2libGluZ1BhdGgobm9ybWFsaXplZCwgJ2VmZmVjdC5qcycpXG59XG4iLCAiLyoqXG4gKiBTYW5kYm94IFdvcmtlciBlbnRyeSAoaW50ZXJuYWwgdXNlKS5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBSZWNlaXZlcyBIb3N0IGNvbW1hbmRzIChJTklUL0NPTVBJTEUvUlVOL1RFUk1JTkFURSlcbiAqIC0gSW5pdGlhbGl6ZXMgZXNidWlsZC13YXNtIGFuZCByZXdyaXRlcyBkZXBlbmRlbmNpZXMgYmFzZWQgb24ga2VybmVsVXJsXG4gKiAtIENvbXBpbGVzIHVzZXIgY29kZSAob3B0aW9uYWwpXG4gKiAtIFJ1bnMgdGhlIGNvbXBpbGVkIGJ1bmRsZSBhbmQgY29sbGVjdHMgTE9HL1RSQUNFL0VSUk9SL0NPTVBMRVRFIGV2ZW50c1xuICovXG5cbmltcG9ydCB7IGNvbXBpbGUsIGluaXRDb21waWxlciwgaXNJbml0aWFsaXplZCwgc2V0S2VybmVsUGF0aCwgc2V0TG9naXhDb3JlU3VicGF0aHMgfSBmcm9tICcuLi9jb21waWxlci9pbmRleC5qcydcbmltcG9ydCB0eXBlIHtcbiAgU2FuZGJveENvbW1hbmQsXG4gIFNhbmRib3hFdmVudCxcbiAgTG9nRXZlbnQsXG4gIFRyYWNlRXZlbnQsXG4gIENvbXBsZXRlRXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIFJlYWR5RXZlbnQsXG4gIENvbXBpbGVSZXN1bHRFdmVudCxcbn0gZnJvbSAnLi4vLi4vUHJvdG9jb2wuanMnXG5pbXBvcnQgdHlwZSB7IExvZ0VudHJ5LCBUcmFjZVNwYW4sIE1vY2tNYW5pZmVzdCwgSHR0cE1vY2tSdWxlLCBVaUludGVudFBhY2tldCB9IGZyb20gJy4uLy4uL1R5cGVzLmpzJ1xuXG5jb25zdCBWRVJTSU9OID0gJzAuMi4wJ1xuY29uc3QgREVGQVVMVF9XQVNNX1VSTCA9ICcvZXNidWlsZC53YXNtJ1xuY29uc3QgREVGQVVMVF9LRVJORUxfVVJMID0gJy9zYW5kYm94L2xvZ2l4LWNvcmUuanMnXG5jb25zdCBERUZBVUxUX0VGRkVDVF9VUkwgPSAnL3NhbmRib3gvZWZmZWN0LmpzJ1xuXG5sZXQgY29tcGlsZWRCdW5kbGU6IHN0cmluZyB8IG51bGwgPSBudWxsXG5sZXQgY3VycmVudFJ1bklkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxubGV0IHJ1blN0YXJ0VGltZSA9IDBcbmxldCBjdXJyZW50TW9ja01hbmlmZXN0OiBNb2NrTWFuaWZlc3QgfCB1bmRlZmluZWRcbmxldCB1aUludGVudHM6IEFycmF5PFVpSW50ZW50UGFja2V0PiA9IFtdXG5sZXQgY3VycmVudEtlcm5lbFVybCA9IERFRkFVTFRfS0VSTkVMX1VSTFxubGV0IGN1cnJlbnRFZmZlY3RVcmwgPSBERUZBVUxUX0VGRkVDVF9VUkxcblxuY29uc3QgdG9BYnNvbHV0ZVVybCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh2YWx1ZSkudG9TdHJpbmcoKVxuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gICAgY29uc3QgYmFzZUhyZWYgPSBzZWxmLmxvY2F0aW9uPy5ocmVmXG4gICAgaWYgKHR5cGVvZiBiYXNlSHJlZiA9PT0gJ3N0cmluZycgJiYgYmFzZUhyZWYubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYmFzZSA9IG5ldyBVUkwoYmFzZUhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBiYXNlLm9yaWdpbiAhPT0gJ251bGwnID8gYmFzZS5vcmlnaW4gOiB1bmRlZmluZWRcbiAgICAgIGlmIChvcmlnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVUkwodmFsdWUsIG9yaWdpbikudG9TdHJpbmcoKVxuICAgICAgfVxuICAgICAgaWYgKGJhc2UucHJvdG9jb2wgPT09ICdodHRwOicgfHwgYmFzZS5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVUkwodmFsdWUsIGJhc2UuaHJlZikudG9TdHJpbmcoKVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbHRocm91Z2hcbiAgfVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG5jb25zdCB0b1NpYmxpbmdVcmwgPSAoYmFzZVVybDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYWJzb2x1dGVCYXNlVXJsID0gdG9BYnNvbHV0ZVVybChiYXNlVXJsKVxuICB0cnkge1xuICAgIGlmIChhYnNvbHV0ZUJhc2VVcmwuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGFic29sdXRlQmFzZVVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICByZXR1cm4gbmV3IFVSTChgLi8ke2ZpbGVOYW1lfWAsIGFic29sdXRlQmFzZVVybCkudG9TdHJpbmcoKVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbHRocm91Z2hcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWQgPSBhYnNvbHV0ZUJhc2VVcmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdXG4gIGNvbnN0IGxhc3RTbGFzaCA9IHRyaW1tZWQubGFzdEluZGV4T2YoJy8nKVxuICBpZiAobGFzdFNsYXNoID49IDApIHtcbiAgICByZXR1cm4gYCR7dHJpbW1lZC5zbGljZSgwLCBsYXN0U2xhc2gpfS8ke2ZpbGVOYW1lfWBcbiAgfVxuICByZXR1cm4gYC8ke2ZpbGVOYW1lfWBcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvL1xuLy8gRXZlbnQgcmVwb3J0aW5nXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vXG5cbmNvbnN0IHBvc3RFdmVudCA9IChldmVudDogU2FuZGJveEV2ZW50KTogdm9pZCA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgc2VsZi5wb3N0TWVzc2FnZShldmVudClcbn1cblxuY29uc3QgcG9zdFJlYWR5ID0gKGNvbXBpbGVyUmVhZHk6IGJvb2xlYW4pOiB2b2lkID0+XG4gIHBvc3RFdmVudCh7XG4gICAgdHlwZTogJ1JFQURZJyxcbiAgICBwYXlsb2FkOiB7IHZlcnNpb246IFZFUlNJT04sIGNvbXBpbGVyUmVhZHkgfSxcbiAgfSBzYXRpc2ZpZXMgUmVhZHlFdmVudClcblxuY29uc3QgcG9zdENvbXBpbGVSZXN1bHQgPSAoc3VjY2VzczogYm9vbGVhbiwgYnVuZGxlPzogc3RyaW5nLCBlcnJvcnM/OiBzdHJpbmdbXSk6IHZvaWQgPT5cbiAgcG9zdEV2ZW50KHtcbiAgICB0eXBlOiAnQ09NUElMRV9SRVNVTFQnLFxuICAgIHBheWxvYWQ6IHsgc3VjY2VzcywgYnVuZGxlLCBlcnJvcnMgfSxcbiAgfSBzYXRpc2ZpZXMgQ29tcGlsZVJlc3VsdEV2ZW50KVxuXG5jb25zdCBwb3N0TG9nID0gKGVudHJ5OiBMb2dFbnRyeSk6IHZvaWQgPT5cbiAgcG9zdEV2ZW50KHtcbiAgICB0eXBlOiAnTE9HJyxcbiAgICBwYXlsb2FkOiBlbnRyeSxcbiAgfSBzYXRpc2ZpZXMgTG9nRXZlbnQpXG5cbmNvbnN0IHBvc3RUcmFjZSA9IChzcGFuOiBUcmFjZVNwYW4pOiB2b2lkID0+XG4gIHBvc3RFdmVudCh7XG4gICAgdHlwZTogJ1RSQUNFJyxcbiAgICBwYXlsb2FkOiBzcGFuLFxuICB9IHNhdGlzZmllcyBUcmFjZUV2ZW50KVxuXG5jb25zdCBwb3N0VWlJbnRlbnQgPSAocGFja2V0OiBVaUludGVudFBhY2tldCk6IHZvaWQgPT4ge1xuICB1aUludGVudHMucHVzaChwYWNrZXQpXG4gIHBvc3RFdmVudCh7XG4gICAgdHlwZTogJ1VJX0lOVEVOVCcsXG4gICAgcGF5bG9hZDogcGFja2V0LFxuICB9KVxufVxuXG5jb25zdCBwb3N0RXJyb3IgPSAoXG4gIGNvZGU6ICdJTklUX0ZBSUxFRCcgfCAnUlVOVElNRV9FUlJPUicgfCAnVElNRU9VVCcgfCAnV09SS0VSX1RFUk1JTkFURUQnLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIHN0YWNrPzogc3RyaW5nLFxuKTogdm9pZCA9PlxuICBwb3N0RXZlbnQoe1xuICAgIHR5cGU6ICdFUlJPUicsXG4gICAgcGF5bG9hZDogeyBjb2RlLCBtZXNzYWdlLCBzdGFjayB9LFxuICB9IHNhdGlzZmllcyBFcnJvckV2ZW50KVxuXG5jb25zdCBwb3N0Q29tcGxldGUgPSAocnVuSWQ6IHN0cmluZywgZHVyYXRpb246IG51bWJlciwgc3RhdGVTbmFwc2hvdD86IHVua25vd24pOiB2b2lkID0+XG4gIHBvc3RFdmVudCh7XG4gICAgdHlwZTogJ0NPTVBMRVRFJyxcbiAgICBwYXlsb2FkOiB7IHJ1bklkLCBkdXJhdGlvbiwgc3RhdGVTbmFwc2hvdCB9LFxuICB9IHNhdGlzZmllcyBDb21wbGV0ZUV2ZW50KVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vXG4vLyBDb25zb2xlIFByb3h5XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vXG5cbmNvbnN0IG9yaWdpbmFsQ29uc29sZSA9IHtcbiAgbG9nOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLFxuICBpbmZvOiBjb25zb2xlLmluZm8uYmluZChjb25zb2xlKSxcbiAgd2FybjogY29uc29sZS53YXJuLmJpbmQoY29uc29sZSksXG4gIGVycm9yOiBjb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSksXG4gIGRlYnVnOiBjb25zb2xlLmRlYnVnLmJpbmQoY29uc29sZSksXG59XG5cbmNvbnN0IHNlcmlhbGl6ZUFyZyA9IChhcmc6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgaWYgKGFyZyA9PT0gbnVsbCB8fCBhcmcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGFyZ1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gYXJnXG4gIGlmIChhcmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7IF9fdHlwZTogJ0Vycm9yJywgbmFtZTogYXJnLm5hbWUsIG1lc3NhZ2U6IGFyZy5tZXNzYWdlLCBzdGFjazogYXJnLnN0YWNrIH1cbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFyZykpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBTdHJpbmcoYXJnKVxuICB9XG59XG5cbmNvbnN0IHNldHVwQ29uc29sZVByb3h5ID0gKCk6IHZvaWQgPT4ge1xuICBjb25zdCBjcmVhdGVQcm94eSA9XG4gICAgKGxldmVsOiBMb2dFbnRyeVsnbGV2ZWwnXSkgPT5cbiAgICAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICBvcmlnaW5hbENvbnNvbGVbbGV2ZWxdKC4uLmFyZ3MpXG4gICAgICBwb3N0TG9nKHtcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIGFyZ3M6IGFyZ3MubWFwKHNlcmlhbGl6ZUFyZyksXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgc291cmNlOiAnY29uc29sZScsXG4gICAgICB9KVxuICAgIH1cblxuICBjb25zb2xlLmxvZyA9IGNyZWF0ZVByb3h5KCdpbmZvJylcbiAgY29uc29sZS5pbmZvID0gY3JlYXRlUHJveHkoJ2luZm8nKVxuICBjb25zb2xlLndhcm4gPSBjcmVhdGVQcm94eSgnd2FybicpXG4gIGNvbnNvbGUuZXJyb3IgPSBjcmVhdGVQcm94eSgnZXJyb3InKVxuICBjb25zb2xlLmRlYnVnID0gY3JlYXRlUHJveHkoJ2RlYnVnJylcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvL1xuLy8gRWZmZWN0IExvZ2dlciAtPiBMT0cgZXZlbnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy9cblxuY29uc3QgbG9nTGV2ZWxUb1N0cmluZyA9IChMb2dMZXZlbDogYW55LCBsZXZlbDogYW55KTogTG9nRW50cnlbJ2xldmVsJ10gPT4ge1xuICBpZiAoTG9nTGV2ZWwuZ3JlYXRlclRoYW5FcXVhbChsZXZlbCwgTG9nTGV2ZWwuRXJyb3IpKSByZXR1cm4gJ2Vycm9yJ1xuICBpZiAoTG9nTGV2ZWwuZ3JlYXRlclRoYW5FcXVhbChsZXZlbCwgTG9nTGV2ZWwuV2FybmluZykpIHJldHVybiAnd2FybidcbiAgaWYgKExvZ0xldmVsLmdyZWF0ZXJUaGFuRXF1YWwobGV2ZWwsIExvZ0xldmVsLkluZm8pKSByZXR1cm4gJ2luZm8nXG4gIHJldHVybiAnZGVidWcnXG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy9cbi8vIFRyYWNlIGNvbGxlY3Rpb24gKHNpbXBsaWZpZWQpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vXG5cbmxldCB0cmFjZUlkQ291bnRlciA9IDBcbmNvbnN0IGdlbmVyYXRlU3BhbklkID0gKCk6IHN0cmluZyA9PiBgc3Bhbi0keysrdHJhY2VJZENvdW50ZXJ9LSR7RGF0ZS5ub3coKX1gXG5cbmNvbnN0IHN0YXJ0U3BhbiA9IChuYW1lOiBzdHJpbmcsIHBhcmVudFNwYW5JZD86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHNwYW5JZCA9IGdlbmVyYXRlU3BhbklkKClcbiAgcG9zdFRyYWNlKHtcbiAgICBzcGFuSWQsXG4gICAgcGFyZW50U3BhbklkLFxuICAgIG5hbWUsXG4gICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxuICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICB9KVxuICByZXR1cm4gc3BhbklkXG59XG5cbmNvbnN0IGVuZFNwYW4gPSAoc3BhbklkOiBzdHJpbmcsIHN0YXR1czogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyB8ICdjYW5jZWxsZWQnID0gJ3N1Y2Nlc3MnKTogdm9pZCA9PiB7XG4gIHBvc3RUcmFjZSh7XG4gICAgc3BhbklkLFxuICAgIG5hbWU6ICcnLFxuICAgIHN0YXJ0VGltZTogMCxcbiAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgIHN0YXR1cyxcbiAgfSlcbn1cblxuY29uc3QgcmVjb3JkSHR0cFRyYWNlID0gKGF0dHJzOiB7XG4gIHVybDogc3RyaW5nXG4gIG1ldGhvZDogc3RyaW5nXG4gIG1vZGU6ICdtb2NrJyB8ICdyZWFsJ1xuICBzdGF0dXM/OiBudW1iZXJcbiAgZGVsYXlNcz86IG51bWJlclxuICBkdXJhdGlvbj86IG51bWJlclxufSk6IHZvaWQgPT4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gIHBvc3RUcmFjZSh7XG4gICAgc3BhbklkOiBnZW5lcmF0ZVNwYW5JZCgpLFxuICAgIG5hbWU6IGBodHRwICR7YXR0cnMubWV0aG9kfWAsXG4gICAgc3RhcnRUaW1lOiBub3cgLSAoYXR0cnMuZHVyYXRpb24gPz8gMCksXG4gICAgZW5kVGltZTogbm93LFxuICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIGtpbmQ6ICdodHRwJyxcbiAgICAgIHVybDogYXR0cnMudXJsLFxuICAgICAgbWV0aG9kOiBhdHRycy5tZXRob2QsXG4gICAgICBtb2RlOiBhdHRycy5tb2RlLFxuICAgICAgc3RhdHVzOiBhdHRycy5zdGF0dXMsXG4gICAgICBkZWxheU1zOiBhdHRycy5kZWxheU1zLFxuICAgIH0sXG4gIH0pXG59XG5cbmNvbnN0IHJlY29yZERlYnVnVHJhY2UgPSAoZXZlbnQ6IHVua25vd24pOiB2b2lkID0+IHtcbiAgcG9zdExvZyh7IGxldmVsOiAnZGVidWcnLCBzb3VyY2U6ICdsb2dpeCcsIGFyZ3M6IFtldmVudF0sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9KVxuICBjb25zdCBldmVudFR5cGUgPSAoZXZlbnQgYXMgYW55KT8udHlwZVxuICBpZiAodHlwZW9mIGV2ZW50VHlwZSA9PT0gJ3N0cmluZycgJiYgZXZlbnRUeXBlLnN0YXJ0c1dpdGgoJ3RyYWNlOicpKSB7XG4gICAgcG9zdFRyYWNlKHtcbiAgICAgIHNwYW5JZDogZ2VuZXJhdGVTcGFuSWQoKSxcbiAgICAgIG5hbWU6IGV2ZW50VHlwZSxcbiAgICAgIHN0YXJ0VGltZTogRGF0ZS5ub3coKSxcbiAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgYXR0cmlidXRlczogeyAuLi4odHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyAmJiBldmVudCA/IGV2ZW50IDoge30pLCBraW5kOiAnbG9naXgtZGVidWcnIH0sXG4gICAgfSlcbiAgfVxufVxuXG5jb25zdCByZWNvcmRTcHlUcmFjZSA9IChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQgPT4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gIHBvc3RUcmFjZSh7XG4gICAgc3BhbklkOiBnZW5lcmF0ZVNwYW5JZCgpLFxuICAgIG5hbWU6IHR5cGVvZiBwYXlsb2FkPy5uYW1lID09PSAnc3RyaW5nJyA/IHBheWxvYWQubmFtZSA6ICdzcHknLFxuICAgIHN0YXJ0VGltZTogbm93LFxuICAgIGVuZFRpbWU6IG5vdyxcbiAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICBhdHRyaWJ1dGVzOiB7IGtpbmQ6ICdzcHknLCAuLi5wYXlsb2FkIH0sXG4gIH0pXG59XG5cbmNvbnN0IHJlY29yZFVpSW50ZW50VHJhY2UgPSAocGFja2V0OiBVaUludGVudFBhY2tldCk6IHZvaWQgPT4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gIHBvc3RUcmFjZSh7XG4gICAgc3BhbklkOiBnZW5lcmF0ZVNwYW5JZCgpLFxuICAgIG5hbWU6IGB1aToke3BhY2tldC5jb21wb25lbnR9OiR7cGFja2V0LmludGVudH1gLFxuICAgIHN0YXJ0VGltZTogbm93LFxuICAgIGVuZFRpbWU6IG5vdyxcbiAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICBpbnRlbnRJZDogcGFja2V0LmlkLFxuICAgIHN0ZXBJZDogcGFja2V0Lm1ldGE/LnN0ZXBJZCxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBraW5kOiAndWktaW50ZW50JyxcbiAgICAgIGlkOiBwYWNrZXQuaWQsXG4gICAgICBjb21wb25lbnQ6IHBhY2tldC5jb21wb25lbnQsXG4gICAgICBpbnRlbnQ6IHBhY2tldC5pbnRlbnQsXG4gICAgICBzdG9yeUlkOiBwYWNrZXQubWV0YT8uc3RvcnlJZCxcbiAgICAgIGxhYmVsOiBwYWNrZXQubWV0YT8ubGFiZWwsXG4gICAgICBzZXZlcml0eTogcGFja2V0Lm1ldGE/LnNldmVyaXR5LFxuICAgICAgdGFnczogcGFja2V0Lm1ldGE/LnRhZ3MsXG4gICAgfSxcbiAgfSlcbn1cblxubGV0IGxvZ2l4RGVidWdTaW5rSW5zdGFsbGVkID0gZmFsc2VcbmxldCBsb2dpeERlYnVnU2luazogeyByZWFkb25seSByZWNvcmQ6IChldmVudDogdW5rbm93bikgPT4gYW55IH0gfCB1bmRlZmluZWRcblxuY29uc3QgcmVzb2x2ZUxvZ2l4RGVidWdTaW5rID0gYXN5bmMgKFxuICBFZmZlY3RSdW50aW1lOiAodHlwZW9mIGltcG9ydCgnZWZmZWN0JykpWydFZmZlY3QnXSxcbik6IFByb21pc2U8eyBhcHBseURlYnVnOiA8QSwgRSwgUj4oZWZmZWN0OiBhbnkpID0+IGFueSB9IHwgbnVsbD4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGxvZ2l4ID0gYXdhaXQgaW1wb3J0KC8qIEB2aXRlLWlnbm9yZSAqLyBjdXJyZW50S2VybmVsVXJsKVxuICAgIGlmICghbG9naXg/LkRlYnVnPy5pbnRlcm5hbD8uY3VycmVudERlYnVnU2lua3MpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gTk9URTogTG9naXggUnVudGltZSBpbnNpZGUgU2FuZGJveCBtYXkgY3JlYXRlIGEgbmV3IHJvb3QgZmliZXIgdmlhIEVmZmVjdC5ydW5Qcm9taXNlO1xuICAgIC8vIEZpYmVyUmVmLmxvY2FsbHkgZG9lcyBub3QgYWZmZWN0IHRob3NlIGZpYmVycywgc28gd2UgbmVlZCB0byBwYXRjaCBGaWJlclJlZi5pbml0aWFsIGhlcmUuXG4gICAgaWYgKCFsb2dpeERlYnVnU2luaykge1xuICAgICAgbG9naXhEZWJ1Z1NpbmsgPSB7XG4gICAgICAgIHJlY29yZDogKGV2ZW50OiB1bmtub3duKSA9PiBFZmZlY3RSdW50aW1lLnN5bmMoKCkgPT4gcmVjb3JkRGVidWdUcmFjZShldmVudCkpLFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghbG9naXhEZWJ1Z1NpbmtJbnN0YWxsZWQpIHtcbiAgICAgIGNvbnN0IHNpbmtzUmVmID0gbG9naXguRGVidWcuaW50ZXJuYWwuY3VycmVudERlYnVnU2lua3MgYXMgYW55XG4gICAgICBjb25zdCBpbml0aWFsU2lua3M6IHVua25vd24gPSBzaW5rc1JlZi5pbml0aWFsXG4gICAgICBjb25zdCBiYXNlID0gQXJyYXkuaXNBcnJheShpbml0aWFsU2lua3MpID8gKGluaXRpYWxTaW5rcyBhcyBSZWFkb25seUFycmF5PHVua25vd24+KSA6IFtdXG4gICAgICBpZiAoIWJhc2UuaW5jbHVkZXMobG9naXhEZWJ1Z1NpbmspKSB7XG4gICAgICAgIHNpbmtzUmVmLmluaXRpYWwgPSBbLi4uYmFzZSwgbG9naXhEZWJ1Z1NpbmtdXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzUmVmID0gbG9naXguRGVidWcuaW50ZXJuYWwuY3VycmVudERpYWdub3N0aWNzTGV2ZWwgYXMgYW55XG4gICAgICBpZiAoZGlhZ25vc3RpY3NSZWYuaW5pdGlhbCA9PT0gJ29mZicpIHtcbiAgICAgICAgZGlhZ25vc3RpY3NSZWYuaW5pdGlhbCA9ICdsaWdodCdcbiAgICAgIH1cblxuICAgICAgbG9naXhEZWJ1Z1NpbmtJbnN0YWxsZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcGx5RGVidWc6IDxBLCBFLCBSPihlZmZlY3Q6IGFueSkgPT4gZWZmZWN0LFxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG50eXBlIExvZ2l4U2FuZGJveEJyaWRnZSA9IHtcbiAgcmVhZG9ubHkgZW1pdFVpSW50ZW50OiAocGFja2V0OiBVaUludGVudFBhY2tldCkgPT4gdm9pZFxuICByZWFkb25seSBlbWl0U3B5OiAocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWRcbn1cblxuY29uc3QgTE9HSVhfU0FOREJPWF9CUklER0UgPSBTeW1ib2wuZm9yKCdAbG9naXhqcy9zYW5kYm94L2JyaWRnZScpXG5cbmNvbnN0IGRlZmluZUhpZGRlbiA9ICh0YXJnZXQ6IG9iamVjdCwga2V5OiBQcm9wZXJ0eUtleSwgdmFsdWU6IHVua25vd24pOiB2b2lkID0+IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgdmFsdWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgfSlcbn1cblxuLy8gU2FuZGJveCBXb3JrZXIgQnJpZGdlIChhIGZ1dHVyZSBiaWRpcmVjdGlvbmFsIHByb3RvY29sIGVudHJ5KTpcbi8vIC0gV29ya2VyIGV4cG9zZXMgYSBzdGFibGUgZ2xvYmFsIGJyaWRnZSBvYmplY3QgZm9yIHVzZXIgY29kZSAvIFNlbWFudGljIFVJIE1vY2sgLyBVbml2ZXJzYWwgU3B5LlxuLy8gLSBBdm9pZCBgX18qYCBtYWdpYyBmaWVsZHMgdG8gcHJldmVudCBjb25mdXNpb24gd2l0aCB0aGUgaW50ZXJuYWwgY29udHJhY3Qgc3lzdGVtIGZyb20gMDIwLlxuLy8gLSBFbnRyeSBwb2ludHM6XG4vLyAgIC0gYGdsb2JhbFRoaXMubG9naXhTYW5kYm94QnJpZGdlLmVtaXRVaUludGVudChwYWNrZXQpYFxuLy8gICAtIGBnbG9iYWxUaGlzLmxvZ2l4U2FuZGJveEJyaWRnZS5lbWl0U3B5KHBheWxvYWQpYFxuY29uc3QgaW5zdGFsbFNhbmRib3hCcmlkZ2UgPSAoKTogdm9pZCA9PiB7XG4gIGNvbnN0IGJyaWRnZTogTG9naXhTYW5kYm94QnJpZGdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgZW1pdFVpSW50ZW50OiAocGFja2V0OiBVaUludGVudFBhY2tldCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcG9zdFVpSW50ZW50KHBhY2tldClcbiAgICAgICAgcmVjb3JkVWlJbnRlbnRUcmFjZShwYWNrZXQpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaWdub3JlIG1hbGZvcm1lZCBwYWNrZXRzXG4gICAgICB9XG4gICAgfSxcbiAgICBlbWl0U3B5OiAocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlY29yZFNweVRyYWNlKHBheWxvYWQgPz8ge30pXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaWdub3JlIG1hbGZvcm1lZCBwYWNrZXRzXG4gICAgICB9XG4gICAgfSxcbiAgfSlcblxuICBkZWZpbmVIaWRkZW4oZ2xvYmFsVGhpcyBhcyBhbnksIExPR0lYX1NBTkRCT1hfQlJJREdFLCBicmlkZ2UpXG4gIGRlZmluZUhpZGRlbihnbG9iYWxUaGlzIGFzIGFueSwgJ2xvZ2l4U2FuZGJveEJyaWRnZScsIGJyaWRnZSlcbn1cblxuaW5zdGFsbFNhbmRib3hCcmlkZ2UoKVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vXG4vLyBIVFRQIE1vY2sgKG1pbmltYWwpOiBpbnRlcmNlcHQgZmV0Y2ggYmFzZWQgb24gTW9ja01hbmlmZXN0Lmh0dHBcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy9cblxuY29uc3Qgc2V0dXBIdHRwUHJveHkgPSAobWFuaWZlc3Q/OiBNb2NrTWFuaWZlc3QpOiB2b2lkID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICBjb25zdCBnbG9iYWxGZXRjaDogdHlwZW9mIGZldGNoIHwgdW5kZWZpbmVkID0gKHNlbGYgYXMgYW55KS5mZXRjaFxuICBpZiAoIWdsb2JhbEZldGNoKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBydWxlcyA9IG1hbmlmZXN0Py5odHRwXG4gIGlmICghcnVsZXMgfHwgcnVsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgOyhzZWxmIGFzIGFueSkuZmV0Y2ggPSBnbG9iYWxGZXRjaFxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgZmluZFJ1bGUgPSAodXJsOiBzdHJpbmcsIG1ldGhvZDogc3RyaW5nKTogSHR0cE1vY2tSdWxlIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCB1cHBlciA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gICAgcmV0dXJuIHJ1bGVzLmZpbmQoKHJ1bGUpID0+IHtcbiAgICAgIGNvbnN0IHJ1bGVNZXRob2QgPSBydWxlLm1ldGhvZCA/IHJ1bGUubWV0aG9kLnRvVXBwZXJDYXNlKCkgOiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IG1ldGhvZE9rID0gIXJ1bGVNZXRob2QgfHwgcnVsZU1ldGhvZCA9PT0gdXBwZXJcbiAgICAgIHJldHVybiBtZXRob2RPayAmJiBydWxlLnVybCA9PT0gdXJsXG4gICAgfSlcbiAgfVxuXG4gIDsoc2VsZiBhcyBhbnkpLmZldGNoID0gYXN5bmMgKGlucHV0OiBSZXF1ZXN0SW5mbyB8IFVSTCwgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8IGlucHV0IGluc3RhbmNlb2YgVVJMID8gU3RyaW5nKGlucHV0KSA6IGlucHV0LnVybFxuICAgICAgY29uc3QgbWV0aG9kID0gKGluaXQ/Lm1ldGhvZCB8fCAoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0ID8gaW5wdXQubWV0aG9kIDogJ0dFVCcpKS50b1VwcGVyQ2FzZSgpXG5cbiAgICAgIGNvbnN0IHJ1bGUgPSBmaW5kUnVsZSh1cmwsIG1ldGhvZClcbiAgICAgIGlmICghcnVsZSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGdsb2JhbEZldGNoKGlucHV0IGFzIGFueSwgaW5pdCBhcyBhbnkpXG4gICAgICAgIHJlY29yZEh0dHBUcmFjZSh7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBtb2RlOiAncmVhbCcsXG4gICAgICAgICAgc3RhdHVzOiByZXNwLnN0YXR1cyxcbiAgICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0LFxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gcmVzcFxuICAgICAgfVxuXG4gICAgICBpZiAocnVsZS5kZWxheU1zICYmIHJ1bGUuZGVsYXlNcyA+IDApIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgcnVsZS5kZWxheU1zKSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgYm9keSA9IHJ1bGUuanNvbiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IEpTT04uc3RyaW5naWZ5KHJ1bGUuanNvbilcbiAgICAgIHJlY29yZEh0dHBUcmFjZSh7XG4gICAgICAgIHVybCxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBtb2RlOiAnbW9jaycsXG4gICAgICAgIHN0YXR1czogcnVsZS5zdGF0dXMgPz8gMjAwLFxuICAgICAgICBkZWxheU1zOiBydWxlLmRlbGF5TXMsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShib2R5LCB7XG4gICAgICAgIHN0YXR1czogcnVsZS5zdGF0dXMgPz8gMjAwLFxuICAgICAgICBoZWFkZXJzOiBib2R5ID09PSBudWxsID8gdW5kZWZpbmVkIDogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICB9KVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGdsb2JhbEZldGNoKGlucHV0IGFzIGFueSwgaW5pdCBhcyBhbnkpXG4gICAgfVxuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy9cbi8vIENvbW1hbmQgaGFuZGxpbmdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy9cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlSW5pdCh3YXNtVXJsPzogc3RyaW5nLCBrZXJuZWxVcmw/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgc2V0dXBDb25zb2xlUHJveHkoKVxuICB0cnkge1xuICAgIGF3YWl0IGluaXRDb21waWxlcih3YXNtVXJsID8/IERFRkFVTFRfV0FTTV9VUkwpXG4gICAgY3VycmVudEtlcm5lbFVybCA9IHRvQWJzb2x1dGVVcmwoa2VybmVsVXJsID8/IERFRkFVTFRfS0VSTkVMX1VSTClcbiAgICBjdXJyZW50RWZmZWN0VXJsID0gdG9TaWJsaW5nVXJsKGN1cnJlbnRLZXJuZWxVcmwsICdlZmZlY3QuanMnKVxuICAgIHNldEtlcm5lbFBhdGgoY3VycmVudEtlcm5lbFVybClcbiAgICBjb25zdCBtYW5pZmVzdFVybCA9IHRvU2libGluZ1VybChjdXJyZW50S2VybmVsVXJsLCAnbG9naXgtY29yZS5tYW5pZmVzdC5qc29uJylcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChtYW5pZmVzdFVybClcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgXHU1MkEwXHU4RjdEIEBsb2dpeGpzL2NvcmUgXHU1QjUwXHU4REVGXHU1Rjg0XHU2RTA1XHU1MzU1XHU1OTMxXHU4RDI1OiAke1N0cmluZyhyZXMuc3RhdHVzKX0gJHtTdHJpbmcocmVzLnN0YXR1c1RleHQpfSAoJHttYW5pZmVzdFVybH0pYCxcbiAgICAgIClcbiAgICB9XG4gICAgY29uc3QganNvbjogYW55ID0gYXdhaXQgcmVzLmpzb24oKVxuICAgIGlmICghanNvbiB8fCAhQXJyYXkuaXNBcnJheShqc29uLnNwZWNpZmllcnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEBsb2dpeGpzL2NvcmUgXHU1QjUwXHU4REVGXHU1Rjg0XHU2RTA1XHU1MzU1XHU2ODNDXHU1RjBGXHU5NzVFXHU2Q0Q1OiAke21hbmlmZXN0VXJsfWApXG4gICAgfVxuICAgIHNldExvZ2l4Q29yZVN1YnBhdGhzKGpzb24uc3BlY2lmaWVycylcbiAgICBwb3N0UmVhZHkodHJ1ZSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwb3N0RXJyb3IoJ0lOSVRfRkFJTEVEJywgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNvbXBpbGUoY29kZTogc3RyaW5nLCBmaWxlbmFtZT86IHN0cmluZywgbW9ja01hbmlmZXN0PzogTW9ja01hbmlmZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNJbml0aWFsaXplZCgpKSB7XG4gICAgcG9zdENvbXBpbGVSZXN1bHQoZmFsc2UsIHVuZGVmaW5lZCwgWydcdTdGMTZcdThCRDFcdTU2NjhcdTY3MkFcdTUyMURcdTU5Q0JcdTUzMTYnXSlcbiAgICByZXR1cm5cbiAgfVxuICBjdXJyZW50TW9ja01hbmlmZXN0ID0gbW9ja01hbmlmZXN0XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbXBpbGUoY29kZSwgZmlsZW5hbWUpXG4gIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgIGNvbXBpbGVkQnVuZGxlID0gcmVzdWx0LmJ1bmRsZVxuICAgIHBvc3RDb21waWxlUmVzdWx0KHRydWUsIHJlc3VsdC5idW5kbGUpXG4gIH0gZWxzZSB7XG4gICAgcG9zdENvbXBpbGVSZXN1bHQoZmFsc2UsIHVuZGVmaW5lZCwgcmVzdWx0LmVycm9ycylcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVSdW4ocnVuSWQ6IHN0cmluZywgdXNlQ29tcGlsZWRDb2RlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjdXJyZW50UnVuSWQgPSBydW5JZFxuICBydW5TdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gIGNvbnN0IHJvb3RTcGFuSWQgPSBzdGFydFNwYW4oYHJ1bjoke3J1bklkfWApXG4gIHVpSW50ZW50cyA9IFtdXG5cbiAgdHJ5IHtcbiAgICBpZiAoIXVzZUNvbXBpbGVkQ29kZSB8fCAhY29tcGlsZWRCdW5kbGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXHU2NUUwXHU1M0VGXHU3NTI4XHU3Njg0XHU3RjE2XHU4QkQxXHU0RUE3XHU3MjY5XHVGRjBDXHU4QkY3XHU1MTQ4XHU2MjY3XHU4ODRDIENPTVBJTEUnKVxuICAgIH1cblxuICAgIC8vIENvbmZpZ3VyZSBIVFRQIG1vY2sgYmFzZWQgb24gdGhlIE1vY2tNYW5pZmVzdCBwcm92aWRlZCBieSB0aGUgbW9zdCByZWNlbnQgQ09NUElMRS5cbiAgICBzZXR1cEh0dHBQcm94eShjdXJyZW50TW9ja01hbmlmZXN0KVxuXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb21waWxlZEJ1bmRsZV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pXG4gICAgY29uc3QgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIGJsb2JVcmwpXG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChibG9iVXJsKVxuXG4gICAgaWYgKCFtb2R1bGUuZGVmYXVsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcdTdGMTZcdThCRDFcdTRFQTdcdTcyNjlcdTdGM0FcdTVDMTEgZGVmYXVsdCBcdTVCRkNcdTUxRkEnKVxuICAgIH1cblxuICAgIGNvbnN0IHByb2dyYW0gPSBtb2R1bGUuZGVmYXVsdFxuICAgIGNvbnN0IHtcbiAgICAgIEVmZmVjdDogRWZmZWN0UnVudGltZSxcbiAgICAgIExvZ2dlcixcbiAgICAgIExvZ0xldmVsLFxuICAgIH0gPSAoYXdhaXQgaW1wb3J0KC8qIEB2aXRlLWlnbm9yZSAqLyBjdXJyZW50RWZmZWN0VXJsKSkgYXMgdW5rbm93biBhcyB0eXBlb2YgaW1wb3J0KCdlZmZlY3QnKVxuICAgIGNvbnN0IFNhbmRib3hMb2dnZXIgPSBMb2dnZXIubWFrZTx1bmtub3duLCB2b2lkPigoeyBsb2dMZXZlbCwgbWVzc2FnZSB9OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGxldmVsID0gbG9nTGV2ZWxUb1N0cmluZyhMb2dMZXZlbCwgbG9nTGV2ZWwpXG4gICAgICBwb3N0TG9nKHsgbGV2ZWwsIGFyZ3M6IFttZXNzYWdlXSwgdGltZXN0YW1wOiBEYXRlLm5vdygpLCBzb3VyY2U6ICdlZmZlY3QnIH0pXG4gICAgfSlcbiAgICBjb25zdCBkZWJ1Z0ludGVncmF0aW9uID0gYXdhaXQgcmVzb2x2ZUxvZ2l4RGVidWdTaW5rKEVmZmVjdFJ1bnRpbWUpXG5cbiAgICBsZXQgZWZmZWN0VG9SdW4gPSBFZmZlY3RSdW50aW1lLmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgcmVzID0geWllbGQqIHByb2dyYW1cbiAgICAgIHJldHVybiByZXNcbiAgICB9KS5waXBlKFxuICAgICAgRWZmZWN0UnVudGltZS5wcm92aWRlKExvZ2dlci5yZXBsYWNlKExvZ2dlci5kZWZhdWx0TG9nZ2VyLCBTYW5kYm94TG9nZ2VyKSksXG4gICAgICBFZmZlY3RSdW50aW1lLndpdGhTcGFuKGBzYW5kYm94OiR7cnVuSWR9YCksXG4gICAgKVxuXG4gICAgaWYgKGRlYnVnSW50ZWdyYXRpb24pIHtcbiAgICAgIGVmZmVjdFRvUnVuID0gZGVidWdJbnRlZ3JhdGlvbi5hcHBseURlYnVnKGVmZmVjdFRvUnVuKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEVmZmVjdFJ1bnRpbWUucnVuUHJvbWlzZShlZmZlY3RUb1J1biBhcyBhbnkpXG5cbiAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBydW5TdGFydFRpbWVcbiAgICBlbmRTcGFuKHJvb3RTcGFuSWQsICdzdWNjZXNzJylcbiAgICBwb3N0Q29tcGxldGUocnVuSWQsIGR1cmF0aW9uLCByZXN1bHQpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gcnVuU3RhcnRUaW1lXG4gICAgZW5kU3Bhbihyb290U3BhbklkLCAnZXJyb3InKVxuICAgIHBvc3RFcnJvcihcbiAgICAgICdSVU5USU1FX0VSUk9SJyxcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICApXG4gICAgcG9zdENvbXBsZXRlKHJ1bklkLCBkdXJhdGlvbilcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUZXJtaW5hdGUoKTogdm9pZCB7XG4gIGlmIChjdXJyZW50UnVuSWQpIHtcbiAgICBjdXJyZW50UnVuSWQgPSBudWxsXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlVWlDYWxsYmFjayhwYXlsb2FkOiB7XG4gIHJ1bklkOiBzdHJpbmdcbiAgaW50ZW50SWQ6IHN0cmluZ1xuICBjYWxsYmFjazogc3RyaW5nXG4gIGRhdGE/OiB1bmtub3duXG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gRm9yIG5vdyB3ZSBvbmx5IHJlY29yZCBjYWxsYmFja3MgYXMgVFJBQ0UrTE9HOyBsYXRlciB3ZSBjYW4gc3RhbmRhcmRpemUgY2FsbGJhY2sgbmFtZXMgYW5kIGludGVncmF0ZSB3aXRoIHVzZXIgY29kZS5cbiAgICBwb3N0TG9nKHtcbiAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICBhcmdzOiBbeyB1aUNhbGxiYWNrOiBwYXlsb2FkIH1dLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgc291cmNlOiAnbG9naXgnLFxuICAgIH0pXG4gICAgcG9zdFRyYWNlKHtcbiAgICAgIHNwYW5JZDogZ2VuZXJhdGVTcGFuSWQoKSxcbiAgICAgIG5hbWU6IGB1aTpjYWxsYmFjazoke3BheWxvYWQuY2FsbGJhY2t9YCxcbiAgICAgIHN0YXJ0VGltZTogRGF0ZS5ub3coKSxcbiAgICAgIGVuZFRpbWU6IERhdGUubm93KCksXG4gICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgIGludGVudElkOiBwYXlsb2FkLmludGVudElkLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBraW5kOiAndWktY2FsbGJhY2snLFxuICAgICAgICBjYWxsYmFjazogcGF5bG9hZC5jYWxsYmFjayxcbiAgICAgICAgZGF0YTogcGF5bG9hZC5kYXRhLFxuICAgICAgICBydW5JZDogcGF5bG9hZC5ydW5JZCxcbiAgICAgIH0sXG4gICAgfSlcbiAgICBwb3N0RXZlbnQoe1xuICAgICAgdHlwZTogJ1VJX0NBTExCQUNLX0FDSycsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIHJ1bklkOiBwYXlsb2FkLnJ1bklkLFxuICAgICAgICBpbnRlbnRJZDogcGF5bG9hZC5pbnRlbnRJZCxcbiAgICAgICAgY2FsbGJhY2s6IHBheWxvYWQuY2FsbGJhY2ssXG4gICAgICAgIGFjY2VwdGVkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9IGFzIGFueSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcG9zdEV2ZW50KHtcbiAgICAgIHR5cGU6ICdVSV9DQUxMQkFDS19BQ0snLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBydW5JZDogcGF5bG9hZC5ydW5JZCxcbiAgICAgICAgaW50ZW50SWQ6IHBheWxvYWQuaW50ZW50SWQsXG4gICAgICAgIGNhbGxiYWNrOiBwYXlsb2FkLmNhbGxiYWNrLFxuICAgICAgICBhY2NlcHRlZDogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIH0sXG4gICAgfSBhcyBhbnkpXG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvL1xuLy8gTWVzc2FnZSBsaXN0ZW5lclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG5zZWxmLm9ubWVzc2FnZSA9IGFzeW5jIChlOiBNZXNzYWdlRXZlbnQ8U2FuZGJveENvbW1hbmQ+KSA9PiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBlLmRhdGFcbiAgc3dpdGNoIChjb21tYW5kLnR5cGUpIHtcbiAgICBjYXNlICdJTklUJzpcbiAgICAgIGF3YWl0IGhhbmRsZUluaXQoY29tbWFuZC5wYXlsb2FkPy53YXNtVXJsLCBjb21tYW5kLnBheWxvYWQ/Lmtlcm5lbFVybClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnQ09NUElMRSc6XG4gICAgICBhd2FpdCBoYW5kbGVDb21waWxlKGNvbW1hbmQucGF5bG9hZC5jb2RlLCBjb21tYW5kLnBheWxvYWQuZmlsZW5hbWUsIGNvbW1hbmQucGF5bG9hZC5tb2NrTWFuaWZlc3QpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ1JVTic6XG4gICAgICBhd2FpdCBoYW5kbGVSdW4oY29tbWFuZC5wYXlsb2FkLnJ1bklkLCBjb21tYW5kLnBheWxvYWQudXNlQ29tcGlsZWRDb2RlKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdVSV9DQUxMQkFDSyc6XG4gICAgICBhd2FpdCBoYW5kbGVVaUNhbGxiYWNrKGNvbW1hbmQucGF5bG9hZClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnVEVSTUlOQVRFJzpcbiAgICAgIGhhbmRsZVRlcm1pbmF0ZSgpXG4gICAgICBicmVha1xuICB9XG59XG5cbmNvbnNvbGUubG9nKCdbU2FuZGJveF0gV29ya2VyIFx1ODExQVx1NjcyQ1x1NURGMlx1NTJBMFx1OEY3RCcpXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQSxLQUFDLENBQUFBLFlBQVE7QUFDVDtBQUNBLFVBQUlDLGFBQVksT0FBTztBQUN2QixVQUFJQyxvQkFBbUIsT0FBTztBQUM5QixVQUFJQyxxQkFBb0IsT0FBTztBQUMvQixVQUFJQyxnQkFBZSxPQUFPLFVBQVU7QUFDcEMsVUFBSSxXQUFXLENBQUMsUUFBUSxRQUFRO0FBQzlCLGlCQUFTLFFBQVE7QUFDZixVQUFBSCxXQUFVLFFBQVEsTUFBTSxFQUFFLEtBQUssSUFBSSxJQUFJLEdBQUcsWUFBWSxLQUFLLENBQUM7QUFBQSxNQUNoRTtBQUNBLFVBQUlJLGVBQWMsQ0FBQyxJQUFJLE1BQU0sUUFBUSxTQUFTO0FBQzVDLFlBQUksUUFBUSxPQUFPLFNBQVMsWUFBWSxPQUFPLFNBQVMsWUFBWTtBQUNsRSxtQkFBUyxPQUFPRixtQkFBa0IsSUFBSTtBQUNwQyxnQkFBSSxDQUFDQyxjQUFhLEtBQUssSUFBSSxHQUFHLEtBQUssUUFBUTtBQUN6QyxjQUFBSCxX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S0FBSztBQUNILFlBQU0sY0FBYyxRQUFRLFFBQVEsTUFBTSxRQUFRLFFBQVEsVUFBVSxRQUFRLFFBQVEsWUFBWTtBQUNoRztBQUFBLElBQ0YsS0FBSztBQUNILFlBQU0sVUFBVSxRQUFRLFFBQVEsT0FBTyxRQUFRLFFBQVEsZUFBZTtBQUN0RTtBQUFBLElBQ0YsS0FBSztBQUNILFlBQU0saUJBQWlCLFFBQVEsT0FBTztBQUN0QztBQUFBLElBQ0YsS0FBSztBQUNILHNCQUFnQjtBQUNoQjtBQUFBLEVBQ0o7QUFDRjtBQUVBLFFBQVEsSUFBSSxpREFBd0I7IiwKICAibmFtZXMiOiBbIm1vZHVsZSIsICJfX2RlZlByb3AiLCAiX19nZXRPd25Qcm9wRGVzYyIsICJfX2dldE93blByb3BOYW1lcyIsICJfX2hhc093blByb3AiLCAiX19jb3B5UHJvcHMiLCAiYnVpbGQiLCAiaW5pdGlhbGl6ZSIsICJfX2FzeW5jIiwgIm9ubWVzc2FnZSIsICJnbG9iYWxUaGlzIiwgImdvIiwgImJ1aWxkIiwgInRvQWJzb2x1dGVVcmwiXQp9Cg==