@famir/database 0.0.2 → 0.0.3

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 (233) hide show
  1. package/README.md +1 -2
  2. package/dist/database.error.js +1 -1
  3. package/dist/database.error.js.map +1 -1
  4. package/dist/database.functions.d.ts +16 -16
  5. package/dist/database.functions.js +8 -8
  6. package/dist/database.functions.js.map +1 -1
  7. package/dist/database.js.map +1 -1
  8. package/dist/database.keys.d.ts +1 -0
  9. package/dist/database.keys.js +3 -0
  10. package/dist/database.keys.js.map +1 -1
  11. package/dist/database.schemas.js +2 -2
  12. package/dist/database.schemas.js.map +1 -1
  13. package/dist/index.d.ts +1 -2
  14. package/dist/index.js +1 -2
  15. package/dist/index.js.map +1 -1
  16. package/dist/modules/base/index.js.map +1 -0
  17. package/dist/{repositories → modules}/base/redis-base.repository.d.ts +5 -3
  18. package/dist/{repositories → modules}/base/redis-base.repository.js +22 -18
  19. package/dist/modules/base/redis-base.repository.js.map +1 -0
  20. package/dist/{repositories → modules}/campaign/campaign.d.ts +2 -7
  21. package/dist/{repositories → modules}/campaign/campaign.functions.d.ts +4 -13
  22. package/dist/{repositories → modules}/campaign/campaign.functions.js +15 -28
  23. package/dist/modules/campaign/campaign.functions.js.map +1 -0
  24. package/dist/modules/campaign/campaign.js.map +1 -0
  25. package/dist/{models/campaign/campaign.d.ts → modules/campaign/campaign.models.d.ts} +3 -2
  26. package/dist/{models/campaign/campaign.js → modules/campaign/campaign.models.js} +6 -4
  27. package/dist/modules/campaign/campaign.models.js.map +1 -0
  28. package/dist/{repositories → modules}/campaign/campaign.schemas.d.ts +2 -2
  29. package/dist/{repositories → modules}/campaign/campaign.schemas.js +50 -43
  30. package/dist/modules/campaign/campaign.schemas.js.map +1 -0
  31. package/dist/{repositories → modules}/campaign/index.d.ts +1 -0
  32. package/dist/{repositories → modules}/campaign/index.js +1 -0
  33. package/dist/modules/campaign/index.js.map +1 -0
  34. package/dist/{repositories → modules}/campaign/redis-campaign.repository.d.ts +5 -6
  35. package/dist/{repositories → modules}/campaign/redis-campaign.repository.js +8 -25
  36. package/dist/modules/campaign/redis-campaign.repository.js.map +1 -0
  37. package/dist/modules/index.js.map +1 -0
  38. package/dist/{repositories → modules}/lure/index.d.ts +1 -0
  39. package/dist/{repositories → modules}/lure/index.js +1 -0
  40. package/dist/modules/lure/index.js.map +1 -0
  41. package/dist/{repositories → modules}/lure/lure.d.ts +1 -1
  42. package/dist/{repositories → modules}/lure/lure.functions.js +10 -10
  43. package/dist/modules/lure/lure.functions.js.map +1 -0
  44. package/dist/modules/lure/lure.js.map +1 -0
  45. package/dist/{models/lure/lure.js → modules/lure/lure.models.js} +1 -1
  46. package/dist/modules/lure/lure.models.js.map +1 -0
  47. package/dist/{repositories → modules}/lure/lure.schemas.js +14 -14
  48. package/dist/modules/lure/lure.schemas.js.map +1 -0
  49. package/dist/{repositories → modules}/lure/redis-lure.repository.d.ts +3 -3
  50. package/dist/{repositories → modules}/lure/redis-lure.repository.js +4 -4
  51. package/dist/modules/lure/redis-lure.repository.js.map +1 -0
  52. package/dist/{repositories → modules}/message/index.d.ts +1 -0
  53. package/dist/{repositories → modules}/message/index.js +1 -0
  54. package/dist/modules/message/index.js.map +1 -0
  55. package/dist/{repositories → modules}/message/message.d.ts +3 -3
  56. package/dist/{repositories → modules}/message/message.functions.d.ts +2 -2
  57. package/dist/{repositories → modules}/message/message.functions.js +8 -8
  58. package/dist/modules/message/message.functions.js.map +1 -0
  59. package/dist/modules/message/message.js.map +1 -0
  60. package/dist/{models/message/message.d.ts → modules/message/message.models.d.ts} +4 -4
  61. package/dist/{models/message/message.js → modules/message/message.models.js} +6 -6
  62. package/dist/modules/message/message.models.js.map +1 -0
  63. package/dist/{repositories → modules}/message/message.schemas.js +45 -45
  64. package/dist/modules/message/message.schemas.js.map +1 -0
  65. package/dist/{repositories → modules}/message/redis-message.repository.d.ts +6 -5
  66. package/dist/{repositories → modules}/message/redis-message.repository.js +8 -8
  67. package/dist/modules/message/redis-message.repository.js.map +1 -0
  68. package/dist/{repositories → modules}/proxy/index.d.ts +1 -0
  69. package/dist/{repositories → modules}/proxy/index.js +1 -0
  70. package/dist/modules/proxy/index.js.map +1 -0
  71. package/dist/{repositories → modules}/proxy/proxy.d.ts +1 -1
  72. package/dist/{repositories → modules}/proxy/proxy.functions.js +9 -9
  73. package/dist/modules/proxy/proxy.functions.js.map +1 -0
  74. package/dist/modules/proxy/proxy.js.map +1 -0
  75. package/dist/{models/proxy/proxy.js → modules/proxy/proxy.models.js} +1 -1
  76. package/dist/modules/proxy/proxy.models.js.map +1 -0
  77. package/dist/{repositories → modules}/proxy/proxy.schemas.js +12 -12
  78. package/dist/modules/proxy/proxy.schemas.js.map +1 -0
  79. package/dist/{repositories → modules}/proxy/redis-proxy.repository.d.ts +3 -3
  80. package/dist/{repositories → modules}/proxy/redis-proxy.repository.js +4 -4
  81. package/dist/modules/proxy/redis-proxy.repository.js.map +1 -0
  82. package/dist/{repositories → modules}/redirector/index.d.ts +1 -0
  83. package/dist/{repositories → modules}/redirector/index.js +1 -0
  84. package/dist/modules/redirector/index.js.map +1 -0
  85. package/dist/{repositories → modules}/redirector/redirector.d.ts +3 -1
  86. package/dist/{repositories → modules}/redirector/redirector.functions.d.ts +13 -2
  87. package/dist/{repositories → modules}/redirector/redirector.functions.js +37 -11
  88. package/dist/modules/redirector/redirector.functions.js.map +1 -0
  89. package/dist/modules/redirector/redirector.js.map +1 -0
  90. package/dist/{models/redirector/redirector.d.ts → modules/redirector/redirector.models.d.ts} +5 -1
  91. package/dist/{models/redirector/redirector.js → modules/redirector/redirector.models.js} +10 -2
  92. package/dist/modules/redirector/redirector.models.js.map +1 -0
  93. package/dist/modules/redirector/redirector.schemas.d.ts +7 -0
  94. package/dist/modules/redirector/redirector.schemas.js +73 -0
  95. package/dist/modules/redirector/redirector.schemas.js.map +1 -0
  96. package/dist/{repositories → modules}/redirector/redis-redirector.repository.d.ts +5 -3
  97. package/dist/{repositories → modules}/redirector/redis-redirector.repository.js +25 -5
  98. package/dist/modules/redirector/redis-redirector.repository.js.map +1 -0
  99. package/dist/{repositories → modules}/session/index.d.ts +1 -0
  100. package/dist/{repositories → modules}/session/index.js +1 -0
  101. package/dist/modules/session/index.js.map +1 -0
  102. package/dist/{repositories → modules}/session/redis-session.repository.d.ts +3 -3
  103. package/dist/{repositories → modules}/session/redis-session.repository.js +7 -7
  104. package/dist/modules/session/redis-session.repository.js.map +1 -0
  105. package/dist/{repositories → modules}/session/session.d.ts +1 -1
  106. package/dist/{repositories → modules}/session/session.functions.js +6 -6
  107. package/dist/modules/session/session.functions.js.map +1 -0
  108. package/dist/modules/session/session.js.map +1 -0
  109. package/dist/{models/session/session.d.ts → modules/session/session.models.d.ts} +6 -0
  110. package/dist/{models/session/session.js → modules/session/session.models.js} +1 -1
  111. package/dist/modules/session/session.models.js.map +1 -0
  112. package/dist/modules/session/session.schemas.d.ts +4 -0
  113. package/dist/modules/session/session.schemas.js +59 -0
  114. package/dist/modules/session/session.schemas.js.map +1 -0
  115. package/dist/{repositories → modules}/target/index.d.ts +1 -0
  116. package/dist/{repositories → modules}/target/index.js +1 -0
  117. package/dist/modules/target/index.js.map +1 -0
  118. package/dist/{repositories → modules}/target/redis-target.repository.d.ts +3 -3
  119. package/dist/{repositories → modules}/target/redis-target.repository.js +8 -8
  120. package/dist/modules/target/redis-target.repository.js.map +1 -0
  121. package/dist/{repositories → modules}/target/target.d.ts +1 -1
  122. package/dist/{repositories → modules}/target/target.functions.d.ts +2 -2
  123. package/dist/{repositories → modules}/target/target.functions.js +17 -18
  124. package/dist/modules/target/target.functions.js.map +1 -0
  125. package/dist/modules/target/target.js.map +1 -0
  126. package/dist/{models/target/target.d.ts → modules/target/target.models.d.ts} +3 -3
  127. package/dist/{models/target/target.js → modules/target/target.models.js} +8 -8
  128. package/dist/modules/target/target.models.js.map +1 -0
  129. package/dist/{repositories → modules}/target/target.schemas.d.ts +1 -1
  130. package/dist/{repositories → modules}/target/target.schemas.js +61 -68
  131. package/dist/modules/target/target.schemas.js.map +1 -0
  132. package/dist/redis-database-connector.d.ts +1 -0
  133. package/dist/redis-database-connector.js +6 -4
  134. package/dist/redis-database-connector.js.map +1 -1
  135. package/dist/redis-database-manager.d.ts +4 -3
  136. package/dist/redis-database-manager.js +9 -7
  137. package/dist/redis-database-manager.js.map +1 -1
  138. package/dist/redis-functions.d.ts +1 -1
  139. package/dist/redis-functions.js +30 -1455
  140. package/dist/redis-functions.js.map +1 -1
  141. package/package.json +17 -13
  142. package/dist/models/campaign/campaign.js.map +0 -1
  143. package/dist/models/campaign/index.d.ts +0 -1
  144. package/dist/models/campaign/index.js +0 -2
  145. package/dist/models/campaign/index.js.map +0 -1
  146. package/dist/models/index.js.map +0 -1
  147. package/dist/models/lure/index.d.ts +0 -1
  148. package/dist/models/lure/index.js +0 -2
  149. package/dist/models/lure/index.js.map +0 -1
  150. package/dist/models/lure/lure.js.map +0 -1
  151. package/dist/models/message/index.d.ts +0 -1
  152. package/dist/models/message/index.js +0 -2
  153. package/dist/models/message/index.js.map +0 -1
  154. package/dist/models/message/message.js.map +0 -1
  155. package/dist/models/proxy/index.d.ts +0 -1
  156. package/dist/models/proxy/index.js +0 -2
  157. package/dist/models/proxy/index.js.map +0 -1
  158. package/dist/models/proxy/proxy.js.map +0 -1
  159. package/dist/models/redirector/index.d.ts +0 -1
  160. package/dist/models/redirector/index.js +0 -2
  161. package/dist/models/redirector/index.js.map +0 -1
  162. package/dist/models/redirector/redirector.js.map +0 -1
  163. package/dist/models/session/index.d.ts +0 -1
  164. package/dist/models/session/index.js +0 -2
  165. package/dist/models/session/index.js.map +0 -1
  166. package/dist/models/session/session.js.map +0 -1
  167. package/dist/models/target/index.d.ts +0 -1
  168. package/dist/models/target/index.js +0 -2
  169. package/dist/models/target/index.js.map +0 -1
  170. package/dist/models/target/target.js.map +0 -1
  171. package/dist/repositories/base/index.js.map +0 -1
  172. package/dist/repositories/base/redis-base.repository.js.map +0 -1
  173. package/dist/repositories/campaign/campaign.functions.js.map +0 -1
  174. package/dist/repositories/campaign/campaign.js.map +0 -1
  175. package/dist/repositories/campaign/campaign.schemas.js.map +0 -1
  176. package/dist/repositories/campaign/index.js.map +0 -1
  177. package/dist/repositories/campaign/redis-campaign.repository.js.map +0 -1
  178. package/dist/repositories/index.d.ts +0 -8
  179. package/dist/repositories/index.js +0 -9
  180. package/dist/repositories/index.js.map +0 -1
  181. package/dist/repositories/lure/index.js.map +0 -1
  182. package/dist/repositories/lure/lure.functions.js.map +0 -1
  183. package/dist/repositories/lure/lure.js.map +0 -1
  184. package/dist/repositories/lure/lure.schemas.js.map +0 -1
  185. package/dist/repositories/lure/redis-lure.repository.js.map +0 -1
  186. package/dist/repositories/message/index.js.map +0 -1
  187. package/dist/repositories/message/message.functions.js.map +0 -1
  188. package/dist/repositories/message/message.js.map +0 -1
  189. package/dist/repositories/message/message.schemas.js.map +0 -1
  190. package/dist/repositories/message/redis-message.repository.js.map +0 -1
  191. package/dist/repositories/proxy/index.js.map +0 -1
  192. package/dist/repositories/proxy/proxy.functions.js.map +0 -1
  193. package/dist/repositories/proxy/proxy.js.map +0 -1
  194. package/dist/repositories/proxy/proxy.schemas.js.map +0 -1
  195. package/dist/repositories/proxy/redis-proxy.repository.js.map +0 -1
  196. package/dist/repositories/redirector/index.js.map +0 -1
  197. package/dist/repositories/redirector/redirector.functions.js.map +0 -1
  198. package/dist/repositories/redirector/redirector.js.map +0 -1
  199. package/dist/repositories/redirector/redirector.schemas.d.ts +0 -3
  200. package/dist/repositories/redirector/redirector.schemas.js +0 -51
  201. package/dist/repositories/redirector/redirector.schemas.js.map +0 -1
  202. package/dist/repositories/redirector/redis-redirector.repository.js.map +0 -1
  203. package/dist/repositories/session/index.js.map +0 -1
  204. package/dist/repositories/session/redis-session.repository.js.map +0 -1
  205. package/dist/repositories/session/session.functions.js.map +0 -1
  206. package/dist/repositories/session/session.js.map +0 -1
  207. package/dist/repositories/session/session.schemas.d.ts +0 -2
  208. package/dist/repositories/session/session.schemas.js +0 -44
  209. package/dist/repositories/session/session.schemas.js.map +0 -1
  210. package/dist/repositories/target/index.js.map +0 -1
  211. package/dist/repositories/target/redis-target.repository.js.map +0 -1
  212. package/dist/repositories/target/target.functions.js.map +0 -1
  213. package/dist/repositories/target/target.js.map +0 -1
  214. package/dist/repositories/target/target.schemas.js.map +0 -1
  215. package/dist/{repositories → modules}/base/index.d.ts +0 -0
  216. package/dist/{repositories → modules}/base/index.js +0 -0
  217. package/dist/{repositories → modules}/campaign/campaign.js +0 -0
  218. package/dist/{models → modules}/index.d.ts +0 -0
  219. package/dist/{models → modules}/index.js +0 -0
  220. package/dist/{repositories → modules}/lure/lure.functions.d.ts +0 -0
  221. package/dist/{repositories → modules}/lure/lure.js +0 -0
  222. package/dist/{models/lure/lure.d.ts → modules/lure/lure.models.d.ts} +0 -0
  223. package/dist/{repositories → modules}/lure/lure.schemas.d.ts +1 -1
  224. package/dist/{repositories → modules}/message/message.js +0 -0
  225. package/dist/{repositories → modules}/message/message.schemas.d.ts +0 -0
  226. package/dist/{repositories → modules}/proxy/proxy.functions.d.ts +0 -0
  227. package/dist/{repositories → modules}/proxy/proxy.js +0 -0
  228. package/dist/{models/proxy/proxy.d.ts → modules/proxy/proxy.models.d.ts} +0 -0
  229. package/dist/{repositories → modules}/proxy/proxy.schemas.d.ts +1 -1
  230. /package/dist/{repositories → modules}/redirector/redirector.js +0 -0
  231. /package/dist/{repositories → modules}/session/session.functions.d.ts +0 -0
  232. /package/dist/{repositories → modules}/session/session.js +0 -0
  233. /package/dist/{repositories → modules}/target/target.js +0 -0
@@ -1,1456 +1,31 @@
1
- const REDIS_FUNCTIONS = [
2
- '1-campaign.lua',
3
- `IyFsdWEgbmFtZT1jYW1wYWlnbgoKLS1bWwogIENyZWF0ZSBjYW1wYWlnbgotLV1dCmxvY2FsIGZ1
4
- bmN0aW9uIGNyZWF0ZV9jYW1wYWlnbihrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDQgb3IgI2Fy
5
- Z3Mgfj0gMTAgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgZnVu
6
- Y3Rpb24gdXNlJykKICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25fa2V5ID0ga2V5c1sxXQogIGxvY2Fs
7
- IGNhbXBhaWduX21pcnJvcl9kb21haW5zX2tleSA9IGtleXNbMl0KICBsb2NhbCBjYW1wYWlnbl9z
8
- ZXNzaW9uX2Nvb2tpZV9uYW1lc19rZXkgPSBrZXlzWzNdCiAgbG9jYWwgY2FtcGFpZ25faW5kZXhf
9
- a2V5ID0ga2V5c1s0XQoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9rZXkpIH49
10
- IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnQ09ORkxJQ1QgQ2FtcGFpZ24g
11
- YWxscmVhZHkgZXhpc3RzJykKICBlbmQKCiAgbG9jYWwgbW9kZWwgPSB7CiAgICBjYW1wYWlnbl9p
12
- ZCA9IGFyZ3NbMV0sCiAgICBtaXJyb3JfZG9tYWluID0gYXJnc1syXSwKICAgIGRlc2NyaXB0aW9u
13
- ID0gYXJnc1szXSwKICAgIGNyeXB0X3NlY3JldCA9IGFyZ3NbNF0sCiAgICBsYW5kaW5nX3VwZ3Jh
14
- ZGVfcGF0aCA9IGFyZ3NbNV0sCiAgICBzZXNzaW9uX2Nvb2tpZV9uYW1lID0gYXJnc1s2XSwKICAg
15
- IHNlc3Npb25fZXhwaXJlID0gdG9udW1iZXIoYXJnc1s3XSksCiAgICBuZXdfc2Vzc2lvbl9leHBp
16
- cmUgPSB0b251bWJlcihhcmdzWzhdKSwKICAgIG1lc3NhZ2VfZXhwaXJlID0gdG9udW1iZXIoYXJn
17
- c1s5XSksCiAgICBzZXNzaW9uX2NvdW50ID0gMCwKICAgIG1lc3NhZ2VfY291bnQgPSAwLAogICAg
18
- Y3JlYXRlZF9hdCA9IHRvbnVtYmVyKGFyZ3NbMTBdKSwKICB9CgogIGZvciBmaWVsZCwgdmFsdWUg
19
- aW4gcGFpcnMobW9kZWwpIGRvCiAgICBpZiBub3QgdmFsdWUgdGhlbgogICAgICByZXR1cm4gcmVk
20
- aXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBtb2RlbC4nIC4uIGZpZWxkKQogICAgZW5kCgogICAg
21
- aWYKICAgICAgKAogICAgICAgIGZpZWxkID09ICdjYW1wYWlnbl9pZCcKICAgICAgICBvciBmaWVs
22
- ZCA9PSAnbWlycm9yX2RvbWFpbicKICAgICAgICBvciBmaWVsZCA9PSAnY3J5cHRfc2VjcmV0Jwog
23
- ICAgICAgIG9yIGZpZWxkID09ICdsYW5kaW5nX3VwZ3JhZGVfcGF0aCcKICAgICAgICBvciBmaWVs
24
- ZCA9PSAnc2Vzc2lvbl9jb29raWVfbmFtZScKICAgICAgKSBhbmQgdmFsdWUgPT0gJycKICAgIHRo
25
- ZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgbW9kZWwuJyAuLiBm
26
- aWVsZCkKICAgIGVuZAoKICAgIGlmCiAgICAgIChmaWVsZCA9PSAnc2Vzc2lvbl9leHBpcmUnIG9y
27
- IGZpZWxkID09ICduZXdfc2Vzc2lvbl9leHBpcmUnIG9yIGZpZWxkID09ICdtZXNzYWdlX2V4cGly
28
- ZScpCiAgICAgIGFuZCB2YWx1ZSA8PSAwCiAgICB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJv
29
- cl9yZXBseSgnRVJSIFdyb25nIG1vZGVsLicgLi4gZmllbGQpCiAgICBlbmQKICBlbmQKCiAgaWYg
30
- cmVkaXMuY2FsbCgnU0lTTUVNQkVSJywgY2FtcGFpZ25fbWlycm9yX2RvbWFpbnNfa2V5LCBtb2Rl
31
- bC5taXJyb3JfZG9tYWluKSB+PSAwIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHko
32
- J0NPTkZMSUNUIENhbXBhaWduIG1pcnJvcl9kb21haW4gYWxscmVhZHkgdGFrZW4nKQogIGVuZAoK
33
- ICBpZiByZWRpcy5jYWxsKCdTSVNNRU1CRVInLCBjYW1wYWlnbl9zZXNzaW9uX2Nvb2tpZV9uYW1l
34
- c19rZXksIG1vZGVsLnNlc3Npb25fY29va2llX25hbWUpIH49IDAgdGhlbgogICAgcmV0dXJuIHJl
35
- ZGlzLnN0YXR1c19yZXBseSgnQ09ORkxJQ1QgQ2FtcGFpZ24gc2Vzc2lvbl9jb29raWVfbmFtZSBh
36
- bGxyZWFkeSB0YWtlbicpCiAgZW5kCgogIC0tIFBvaW50IG9mIG5vIHJldHVybgoKICBsb2NhbCBz
37
- dG9yZSA9IHt9CgogIGZvciBmaWVsZCwgdmFsdWUgaW4gcGFpcnMobW9kZWwpIGRvCiAgICB0YWJs
38
- ZS5pbnNlcnQoc3RvcmUsIGZpZWxkKQogICAgdGFibGUuaW5zZXJ0KHN0b3JlLCB2YWx1ZSkKICBl
39
- bmQKCiAgcmVkaXMuY2FsbCgnSFNFVCcsIGNhbXBhaWduX2tleSwgdW5wYWNrKHN0b3JlKSkKCiAg
40
- cmVkaXMuY2FsbCgnU0FERCcsIGNhbXBhaWduX21pcnJvcl9kb21haW5zX2tleSwgbW9kZWwubWly
41
- cm9yX2RvbWFpbikKCiAgcmVkaXMuY2FsbCgnU0FERCcsIGNhbXBhaWduX3Nlc3Npb25fY29va2ll
42
- X25hbWVzX2tleSwgbW9kZWwuc2Vzc2lvbl9jb29raWVfbmFtZSkKCiAgcmVkaXMuY2FsbCgnWkFE
43
- RCcsIGNhbXBhaWduX2luZGV4X2tleSwgbW9kZWwuY3JlYXRlZF9hdCwgbW9kZWwuY2FtcGFpZ25f
44
- aWQpCgogIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ09LIENhbXBhaWduIGNyZWF0ZWQnKQpl
45
- bmQKCnJlZGlzLnJlZ2lzdGVyX2Z1bmN0aW9uKHsKICBmdW5jdGlvbl9uYW1lID0gJ2NyZWF0ZV9j
46
- YW1wYWlnbicsCiAgY2FsbGJhY2sgPSBjcmVhdGVfY2FtcGFpZ24sCiAgZGVzY3JpcHRpb24gPSAn
47
- Q3JlYXRlIGNhbXBhaWduJywKfSkKCi0tW1sKICBSZWFkIGNhbXBhaWduCi0tXV0KbG9jYWwgZnVu
48
- Y3Rpb24gcmVhZF9jYW1wYWlnbihrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDIgb3IgI2FyZ3Mg
49
- fj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlv
50
- biB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgY2Ft
51
- cGFpZ25fbG9ja19rZXkgPSBrZXlzWzJdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBh
52
- aWduX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gbmlsCiAgZW5kCgogIC0tIHN0eWx1YTogaWdu
53
- b3JlCiAgbG9jYWwgdmFsdWVzID0gcmVkaXMuY2FsbCgKICAgICdITUdFVCcsIGNhbXBhaWduX2tl
54
- eSwKICAgICdjYW1wYWlnbl9pZCcsCiAgICAnbWlycm9yX2RvbWFpbicsCiAgICAnc2Vzc2lvbl9j
55
- b3VudCcsCiAgICAnbWVzc2FnZV9jb3VudCcsCiAgICAnY3JlYXRlZF9hdCcKICApCgogIGlmICN2
56
- YWx1ZXMgfj0gNSB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBNYWxmb3Jt
57
- IHZhbHVlcycpCiAgZW5kCgogIGxvY2FsIG1vZGVsID0gewogICAgY2FtcGFpZ25faWQgPSB2YWx1
58
- ZXNbMV0sCiAgICBtaXJyb3JfZG9tYWluID0gdmFsdWVzWzJdLAogICAgaXNfbG9ja2VkID0gcmVk
59
- aXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25fbG9ja19rZXkpLAogICAgc2Vzc2lvbl9jb3VudCA9
60
- IHRvbnVtYmVyKHZhbHVlc1szXSksCiAgICBtZXNzYWdlX2NvdW50ID0gdG9udW1iZXIodmFsdWVz
61
- WzRdKSwKICAgIGNyZWF0ZWRfYXQgPSB0b251bWJlcih2YWx1ZXNbNV0pLAogIH0KCiAgZm9yIGZp
62
- ZWxkLCB2YWx1ZSBpbiBwYWlycyhtb2RlbCkgZG8KICAgIGlmIG5vdCB2YWx1ZSB0aGVuCiAgICAg
63
- IHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIE1hbGZvcm0gbW9kZWwuJyAuLiBmaWVsZCkK
64
- ICAgIGVuZAogIGVuZAoKICByZXR1cm4geyBtYXAgPSBtb2RlbCB9CmVuZAoKcmVkaXMucmVnaXN0
65
- ZXJfZnVuY3Rpb24oewogIGZ1bmN0aW9uX25hbWUgPSAncmVhZF9jYW1wYWlnbicsCiAgY2FsbGJh
66
- Y2sgPSByZWFkX2NhbXBhaWduLAogIGZsYWdzID0geyAnbm8td3JpdGVzJyB9LAogIGRlc2NyaXB0
67
- aW9uID0gJ1JlYWQgY2FtcGFpZ24nLAp9KQoKLS1bWwogIFJlYWQgZnVsbCBjYW1wYWlnbgotLV1d
68
- CmxvY2FsIGZ1bmN0aW9uIHJlYWRfZnVsbF9jYW1wYWlnbihrZXlzLCBhcmdzKQogIGlmICNrZXlz
69
- IH49IDYgb3IgI2FyZ3Mgfj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VS
70
- UiBXcm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlz
71
- WzFdCiAgbG9jYWwgY2FtcGFpZ25fbG9ja19rZXkgPSBrZXlzWzJdCiAgbG9jYWwgcHJveHlfaW5k
72
- ZXhfa2V5ID0ga2V5c1szXQogIGxvY2FsIHRhcmdldF9pbmRleF9rZXkgPSBrZXlzWzRdCiAgbG9j
73
- YWwgcmVkaXJlY3Rvcl9pbmRleF9rZXkgPSBrZXlzWzVdCiAgbG9jYWwgbHVyZV9pbmRleF9rZXkg
74
- PSBrZXlzWzZdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWduX2tleSkgfj0gMSB0
75
- aGVuCiAgICByZXR1cm4gbmlsCiAgZW5kCgogIC0tIHN0eWx1YTogaWdub3JlCiAgbG9jYWwgdmFs
76
- dWVzID0gcmVkaXMuY2FsbCgKICAgICdITUdFVCcsIGNhbXBhaWduX2tleSwKICAgICdjYW1wYWln
77
- bl9pZCcsCiAgICAnbWlycm9yX2RvbWFpbicsCiAgICAnZGVzY3JpcHRpb24nLAogICAgJ2NyeXB0
78
- X3NlY3JldCcsCiAgICAnbGFuZGluZ191cGdyYWRlX3BhdGgnLAogICAgJ3Nlc3Npb25fY29va2ll
79
- X25hbWUnLAogICAgJ3Nlc3Npb25fZXhwaXJlJywKICAgICduZXdfc2Vzc2lvbl9leHBpcmUnLAog
80
- ICAgJ21lc3NhZ2VfZXhwaXJlJywKICAgICdzZXNzaW9uX2NvdW50JywKICAgICdtZXNzYWdlX2Nv
81
- dW50JywKICAgICdjcmVhdGVkX2F0JwogICkKCiAgaWYgI3ZhbHVlcyB+PSAxMiB0aGVuCiAgICBy
82
- ZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBNYWxmb3JtIHZhbHVlcycpCiAgZW5kCgogIGxv
83
- Y2FsIG1vZGVsID0gewogICAgY2FtcGFpZ25faWQgPSB2YWx1ZXNbMV0sCiAgICBtaXJyb3JfZG9t
84
- YWluID0gdmFsdWVzWzJdLAogICAgZGVzY3JpcHRpb24gPSB2YWx1ZXNbM10sCiAgICBjcnlwdF9z
85
- ZWNyZXQgPSB2YWx1ZXNbNF0sCiAgICBsYW5kaW5nX3VwZ3JhZGVfcGF0aCA9IHZhbHVlc1s1XSwK
86
- ICAgIHNlc3Npb25fY29va2llX25hbWUgPSB2YWx1ZXNbNl0sCiAgICBzZXNzaW9uX2V4cGlyZSA9
87
- IHRvbnVtYmVyKHZhbHVlc1s3XSksCiAgICBuZXdfc2Vzc2lvbl9leHBpcmUgPSB0b251bWJlcih2
88
- YWx1ZXNbOF0pLAogICAgbWVzc2FnZV9leHBpcmUgPSB0b251bWJlcih2YWx1ZXNbOV0pLAogICAg
89
- aXNfbG9ja2VkID0gcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25fbG9ja19rZXkpLAogICAg
90
- cHJveHlfY291bnQgPSByZWRpcy5jYWxsKCdaQ0FSRCcsIHByb3h5X2luZGV4X2tleSksCiAgICB0
91
- YXJnZXRfY291bnQgPSByZWRpcy5jYWxsKCdaQ0FSRCcsIHRhcmdldF9pbmRleF9rZXkpLAogICAg
92
- cmVkaXJlY3Rvcl9jb3VudCA9IHJlZGlzLmNhbGwoJ1pDQVJEJywgcmVkaXJlY3Rvcl9pbmRleF9r
93
- ZXkpLAogICAgbHVyZV9jb3VudCA9IHJlZGlzLmNhbGwoJ1pDQVJEJywgbHVyZV9pbmRleF9rZXkp
94
- LAogICAgc2Vzc2lvbl9jb3VudCA9IHRvbnVtYmVyKHZhbHVlc1sxMF0pLAogICAgbWVzc2FnZV9j
95
- b3VudCA9IHRvbnVtYmVyKHZhbHVlc1sxMV0pLAogICAgY3JlYXRlZF9hdCA9IHRvbnVtYmVyKHZh
96
- bHVlc1sxMl0pLAogIH0KCiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyhtb2RlbCkgZG8KICAg
97
- IGlmIG5vdCB2YWx1ZSB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIE1h
98
- bGZvcm0gbW9kZWwuJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICByZXR1cm4geyBtYXAgPSBt
99
- b2RlbCB9CmVuZAoKcmVkaXMucmVnaXN0ZXJfZnVuY3Rpb24oewogIGZ1bmN0aW9uX25hbWUgPSAn
100
- cmVhZF9mdWxsX2NhbXBhaWduJywKICBjYWxsYmFjayA9IHJlYWRfZnVsbF9jYW1wYWlnbiwKICBm
101
- bGFncyA9IHsgJ25vLXdyaXRlcycgfSwKICBkZXNjcmlwdGlvbiA9ICdSZWFkIGZ1bGwgY2FtcGFp
102
- Z24nLAp9KQoKLS1bWwogIFJlYWQgY2FtcGFpZ24gbWlycm9yIGRvbWFpbnMKLS1dXQpsb2NhbCBm
103
- dW5jdGlvbiByZWFkX2NhbXBhaWduX21pcnJvcl9kb21haW5zKGtleXMsIGFyZ3MpCiAgaWYgI2tl
104
- eXMgfj0gMSBvciAjYXJncyB+PSAwIHRoZW4KICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgn
105
- RVJSIFdyb25nIGZ1bmN0aW9uIHVzZScpCiAgZW5kCgogIGxvY2FsIGNhbXBhaWduX21pcnJvcl9k
106
- b21haW5zX2tleSA9IGtleXNbMV0KCiAgcmV0dXJuIHJlZGlzLmNhbGwoJ1NNRU1CRVJTJywgY2Ft
107
- cGFpZ25fbWlycm9yX2RvbWFpbnNfa2V5KQplbmQKCnJlZGlzLnJlZ2lzdGVyX2Z1bmN0aW9uKHsK
108
- ICBmdW5jdGlvbl9uYW1lID0gJ3JlYWRfY2FtcGFpZ25fbWlycm9yX2RvbWFpbnMnLAogIGNhbGxi
109
- YWNrID0gcmVhZF9jYW1wYWlnbl9taXJyb3JfZG9tYWlucywKICBmbGFncyA9IHsgJ25vLXdyaXRl
110
- cycgfSwKICBkZXNjcmlwdGlvbiA9ICdSZWFkIGNhbXBhaWduIG1pcnJvciBkb21haW5zJywKfSkK
111
- Ci0tW1sKICBSZWFkIGNhbXBhaWduIHNlc3Npb24gY29va2llIG5hbWVzCi0tXV0KbG9jYWwgZnVu
112
- Y3Rpb24gcmVhZF9jYW1wYWlnbl9zZXNzaW9uX2Nvb2tpZV9uYW1lcyhrZXlzLCBhcmdzKQogIGlm
113
- ICNrZXlzIH49IDEgb3IgI2FyZ3Mgfj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVw
114
- bHkoJ0VSUiBXcm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9zZXNz
115
- aW9uX2Nvb2tpZV9uYW1lc19rZXkgPSBrZXlzWzFdCgogIHJldHVybiByZWRpcy5jYWxsKCdTTUVN
116
- QkVSUycsIGNhbXBhaWduX3Nlc3Npb25fY29va2llX25hbWVzX2tleSkKZW5kCgpyZWRpcy5yZWdp
117
- c3Rlcl9mdW5jdGlvbih7CiAgZnVuY3Rpb25fbmFtZSA9ICdyZWFkX2NhbXBhaWduX3Nlc3Npb25f
118
- Y29va2llX25hbWVzJywKICBjYWxsYmFjayA9IHJlYWRfY2FtcGFpZ25fc2Vzc2lvbl9jb29raWVf
119
- bmFtZXMsCiAgZmxhZ3MgPSB7ICduby13cml0ZXMnIH0sCiAgZGVzY3JpcHRpb24gPSAnUmVhZCBj
120
- YW1wYWlnbiBzZXNzaW9uIGNvb2tpZSBuYW1lcycsCn0pCgotLVtbCiAgUmVhZCBjYW1wYWlnbiBp
121
- bmRleAotLV1dCmxvY2FsIGZ1bmN0aW9uIHJlYWRfY2FtcGFpZ25faW5kZXgoa2V5cywgYXJncykK
122
- ICBpZiAja2V5cyB+PSAxIG9yICNhcmdzIH49IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9y
123
- X3JlcGx5KCdFUlIgV3JvbmcgZnVuY3Rpb24gdXNlJykKICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25f
124
- aW5kZXhfa2V5ID0ga2V5c1sxXQoKICByZXR1cm4gcmVkaXMuY2FsbCgnWlJBTkdFJywgY2FtcGFp
125
- Z25faW5kZXhfa2V5LCAwLCAtMSkKZW5kCgpyZWRpcy5yZWdpc3Rlcl9mdW5jdGlvbih7CiAgZnVu
126
- Y3Rpb25fbmFtZSA9ICdyZWFkX2NhbXBhaWduX2luZGV4JywKICBjYWxsYmFjayA9IHJlYWRfY2Ft
127
- cGFpZ25faW5kZXgsCiAgZmxhZ3MgPSB7ICduby13cml0ZXMnIH0sCiAgZGVzY3JpcHRpb24gPSAn
128
- UmVhZCBjYW1wYWlnbiBpbmRleCcsCn0pCgotLVtbCiAgTG9jayBjYW1wYWlnbgotLV1dCmxvY2Fs
129
- IGZ1bmN0aW9uIGxvY2tfY2FtcGFpZ24oa2V5cywgYXJncykKICBpZiAja2V5cyB+PSAyIG9yICNh
130
- cmdzIH49IDIgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgZnVu
131
- Y3Rpb24gdXNlJykKICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25fa2V5ID0ga2V5c1sxXQogIGxvY2Fs
132
- IGNhbXBhaWduX2xvY2tfa2V5ID0ga2V5c1syXQoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBj
133
- YW1wYWlnbl9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9U
134
- X0ZPVU5EIENhbXBhaWduIG5vdCBleGlzdHMnKQogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElT
135
- VFMnLCBjYW1wYWlnbl9sb2NrX2tleSkgfj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVz
136
- X3JlcGx5KCdGT1JCSURERU4gQ2FtcGFpZ24gYWxscmVhZHkgbG9ja2VkJykKICBlbmQKCiAgbG9j
137
- YWwgc3Rhc2ggPSB7CiAgICBsb2NrX3NlY3JldCA9IGFyZ3NbMV0sCiAgICBsb2NrX3RpbWVvdXQg
138
- PSB0b251bWJlcihhcmdzWzJdKSwKICB9CgogIGZvciBmaWVsZCwgdmFsdWUgaW4gcGFpcnMoc3Rh
139
- c2gpIGRvCiAgICBpZiBub3QgdmFsdWUgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVw
140
- bHkoJ0VSUiBXcm9uZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCgogICAgaWYgZmllbGQgPT0g
141
- J2xvY2tfc2VjcmV0JyBhbmQgdmFsdWUgPT0gJycgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJy
142
- b3JfcmVwbHkoJ0VSUiBXcm9uZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCgogICAgaWYgZmll
143
- bGQgPT0gJ2xvY2tfdGltZW91dCcgYW5kIHZhbHVlIDw9IDAgdGhlbgogICAgICByZXR1cm4gcmVk
144
- aXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCiAgZW5k
145
- CgogIC0tIFBvaW50IG9mIG5vIHJldHVybgoKICByZWRpcy5jYWxsKCdTRVQnLCBjYW1wYWlnbl9s
146
- b2NrX2tleSwgc3Rhc2gubG9ja19zZWNyZXQsICdQWCcsIHN0YXNoLmxvY2tfdGltZW91dCkKCiAg
147
- cmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnT0sgQ2FtcGFpZ24gbG9ja2VkJykKZW5kCgpyZWRp
148
- cy5yZWdpc3Rlcl9mdW5jdGlvbih7CiAgZnVuY3Rpb25fbmFtZSA9ICdsb2NrX2NhbXBhaWduJywK
149
- ICBjYWxsYmFjayA9IGxvY2tfY2FtcGFpZ24sCiAgZGVzY3JpcHRpb24gPSAnTG9jayBjYW1wYWln
150
- bicsCn0pCgotLVtbCiAgVW5sb2NrIGNhbXBhaWduCi0tXV0KbG9jYWwgZnVuY3Rpb24gdW5sb2Nr
151
- X2NhbXBhaWduKGtleXMsIGFyZ3MpCiAgaWYgI2tleXMgfj0gMiBvciAjYXJncyB+PSAxIHRoZW4K
152
- ICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIGZ1bmN0aW9uIHVzZScpCiAg
153
- ZW5kCgogIGxvY2FsIGNhbXBhaWduX2tleSA9IGtleXNbMV0KICBsb2NhbCBjYW1wYWlnbl9sb2Nr
154
- X2tleSA9IGtleXNbMl0KCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25fa2V5KSB+
155
- PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ05PVF9GT1VORCBDYW1wYWln
156
- biBub3QgZXhpc3RzJykKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25f
157
- bG9ja19rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnT0sgQ2Ft
158
- cGFpZ24gbm90IGxvY2tlZCcpCiAgZW5kCgogIGxvY2FsIHN0YXNoID0gewogICAgbG9ja19zZWNy
159
- ZXQgPSBhcmdzWzFdLAogICAgb3JpZ19sb2NrX3NlY3JldCA9IHJlZGlzLmNhbGwoJ0dFVCcsIGNh
160
- bXBhaWduX2xvY2tfa2V5KSwKICB9CgogIGZvciBmaWVsZCwgdmFsdWUgaW4gcGFpcnMoc3Rhc2gp
161
- IGRvCiAgICBpZiBub3QgdmFsdWUgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHko
162
- J0VSUiBXcm9uZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCgogICAgaWYgKGZpZWxkID09ICds
163
- b2NrX3NlY3JldCcgb3IgZmllbGQgPT0gJ29yaWdfbG9ja19zZWNyZXQnKSBhbmQgdmFsdWUgPT0g
164
- JycgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBzdGFzaC4n
165
- IC4uIGZpZWxkKQogICAgZW5kCiAgZW5kCgogIGlmIHN0YXNoLm9yaWdfbG9ja19zZWNyZXQgfj0g
166
- c3Rhc2gubG9ja19zZWNyZXQgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnRk9S
167
- QklEREVOIENhbXBhaWduIGxvY2tfc2VjcmV0IG5vdCBtYXRjaCcpCiAgZW5kCgogIC0tIFBvaW50
168
- IG9mIG5vIHJldHVybgoKICByZWRpcy5jYWxsKCdERUwnLCBjYW1wYWlnbl9sb2NrX2tleSkKCiAg
169
- cmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnT0sgQ2FtcGFpZ24gdW5sb2NrZWQnKQplbmQKCnJl
170
- ZGlzLnJlZ2lzdGVyX2Z1bmN0aW9uKHsKICBmdW5jdGlvbl9uYW1lID0gJ3VubG9ja19jYW1wYWln
171
- bicsCiAgY2FsbGJhY2sgPSB1bmxvY2tfY2FtcGFpZ24sCiAgZGVzY3JpcHRpb24gPSAnVW5sb2Nr
172
- IGNhbXBhaWduJywKfSkKCi0tW1sKICBVcGRhdGUgY2FtcGFpZ24KLS1dXQpsb2NhbCBmdW5jdGlv
173
- biB1cGRhdGVfY2FtcGFpZ24oa2V5cywgYXJncykKICBpZiAja2V5cyB+PSAyIG9yICNhcmdzIDwg
174
- MSB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlvbiB1
175
- c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgY2FtcGFp
176
- Z25fbG9ja19rZXkgPSBrZXlzWzJdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWdu
177
- X2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQg
178
- Q2FtcGFpZ24gbm90IGV4aXN0cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNh
179
- bXBhaWduX2xvY2tfa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHko
180
- J0ZPUkJJRERFTiBDYW1wYWlnbiBub3QgbG9ja2VkJykKICBlbmQKCiAgbG9jYWwgc3Rhc2ggPSB7
181
- CiAgICBsb2NrX3NlY3JldCA9IHRhYmxlLnJlbW92ZShhcmdzKSwKICAgIG9yaWdfbG9ja19zZWNy
182
- ZXQgPSByZWRpcy5jYWxsKCdHRVQnLCBjYW1wYWlnbl9sb2NrX2tleSksCiAgfQoKICBmb3IgZmll
183
- bGQsIHZhbHVlIGluIHBhaXJzKHN0YXNoKSBkbwogICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAg
184
- cmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAg
185
- IGVuZAoKICAgIGlmIChmaWVsZCA9PSAnbG9ja19zZWNyZXQnIG9yIGZpZWxkID09ICdvcmlnX2xv
186
- Y2tfc2VjcmV0JykgYW5kIHZhbHVlID09ICcnIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9y
187
- X3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICBpZiAj
188
- YXJncyAlIDIgfj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBPZGQg
189
- bnVtYmVyIG9mIGFyZ3MnKQogIGVuZAoKICBsb2NhbCBtb2RlbCA9IHt9CgogIGZvciBpID0gMSwg
190
- I2FyZ3MsIDIgZG8KICAgIGxvY2FsIGZpZWxkLCB2YWx1ZSA9IGFyZ3NbaV0sIGFyZ3NbaSArIDFd
191
- CgogICAgaWYgbW9kZWxbZmllbGRdIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5
192
- KCdFUlIgRHVwbGljYXRlIG1vZGVsLicgLi4gZmllbGQpCiAgICBlbmQKCiAgICBpZiBmaWVsZCA9
193
- PSAnZGVzY3JpcHRpb24nIHRoZW4KICAgICAgbW9kZWwuZGVzY3JpcHRpb24gPSB2YWx1ZQogICAg
194
- ZWxzZWlmIGZpZWxkID09ICdzZXNzaW9uX2V4cGlyZScgdGhlbgogICAgICBtb2RlbC5zZXNzaW9u
195
- X2V4cGlyZSA9IHRvbnVtYmVyKHZhbHVlKQogICAgZWxzZWlmIGZpZWxkID09ICduZXdfc2Vzc2lv
196
- bl9leHBpcmUnIHRoZW4KICAgICAgbW9kZWwubmV3X3Nlc3Npb25fZXhwaXJlID0gdG9udW1iZXIo
197
- dmFsdWUpCiAgICBlbHNlaWYgZmllbGQgPT0gJ21lc3NhZ2VfZXhwaXJlJyB0aGVuCiAgICAgIG1v
198
- ZGVsLm1lc3NhZ2VfZXhwaXJlID0gdG9udW1iZXIodmFsdWUpCiAgICBlbHNlCiAgICAgIHJldHVy
199
- biByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFVua25vd24gbW9kZWwuJyAuLiBmaWVsZCkKICAgIGVu
200
- ZAogIGVuZAoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKG1vZGVsKSBkbwogICAgaWYgbm90
201
- IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgbW9k
202
- ZWwuJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICBpZiBuZXh0KG1vZGVsKSA9PSBuaWwgdGhl
203
- bgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnT0sgTm90aGluZyB0byB1cGRhdGUnKQog
204
- IGVuZAoKICBpZiBzdGFzaC5vcmlnX2xvY2tfc2VjcmV0IH49IHN0YXNoLmxvY2tfc2VjcmV0IHRo
205
- ZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ0ZPUkJJRERFTiBDYW1wYWlnbiBsb2Nr
206
- X3NlY3JldCBub3QgbWF0Y2gnKQogIGVuZAoKICAtLSBQb2ludCBvZiBubyByZXR1cm4KCiAgbG9j
207
- YWwgc3RvcmUgPSB7fQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKG1vZGVsKSBkbwogICAg
208
- dGFibGUuaW5zZXJ0KHN0b3JlLCBmaWVsZCkKICAgIHRhYmxlLmluc2VydChzdG9yZSwgdmFsdWUp
209
- CiAgZW5kCgogIHJlZGlzLmNhbGwoJ0hTRVQnLCBjYW1wYWlnbl9rZXksIHVucGFjayhzdG9yZSkp
210
- CgogIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ09LIENhbXBhaWduIHVwZGF0ZWQnKQplbmQK
211
- CnJlZGlzLnJlZ2lzdGVyX2Z1bmN0aW9uKHsKICBmdW5jdGlvbl9uYW1lID0gJ3VwZGF0ZV9jYW1w
212
- YWlnbicsCiAgY2FsbGJhY2sgPSB1cGRhdGVfY2FtcGFpZ24sCiAgZGVzY3JpcHRpb24gPSAnVXBk
213
- YXRlIGNhbXBhaWduJywKfSkKCi0tW1sKICBEZWxldGUgY2FtcGFpZ24KLS1dXQpsb2NhbCBmdW5j
214
- dGlvbiBkZWxldGVfY2FtcGFpZ24oa2V5cywgYXJncykKICBpZiAja2V5cyB+PSA5IG9yICNhcmdz
215
- IH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgZnVuY3Rp
216
- b24gdXNlJykKICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25fa2V5ID0ga2V5c1sxXQogIGxvY2FsIGNh
217
- bXBhaWduX2xvY2tfa2V5ID0ga2V5c1syXQogIGxvY2FsIGNhbXBhaWduX21pcnJvcl9kb21haW5z
218
- X2tleSA9IGtleXNbM10KICBsb2NhbCBjYW1wYWlnbl9zZXNzaW9uX2Nvb2tpZV9uYW1lc19rZXkg
219
- PSBrZXlzWzRdCiAgbG9jYWwgY2FtcGFpZ25faW5kZXhfa2V5ID0ga2V5c1s1XQogIGxvY2FsIHBy
220
- b3h5X2luZGV4X2tleSA9IGtleXNbNl0KICBsb2NhbCB0YXJnZXRfaW5kZXhfa2V5ID0ga2V5c1s3
221
- XQogIGxvY2FsIHJlZGlyZWN0b3JfaW5kZXhfa2V5ID0ga2V5c1s4XQogIGxvY2FsIGx1cmVfaW5k
222
- ZXhfa2V5ID0ga2V5c1s5XQoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9rZXkp
223
- IH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIENhbXBh
224
- aWduIG5vdCBleGlzdHMnKQogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWln
225
- bl9sb2NrX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JC
226
- SURERU4gQ2FtcGFpZ24gbm90IGxvY2tlZCcpCiAgZW5kCgogIGxvY2FsIHN0YXNoID0gewogICAg
227
- bG9ja19zZWNyZXQgPSBhcmdzWzFdLAogICAgb3JpZ19sb2NrX3NlY3JldCA9IHJlZGlzLmNhbGwo
228
- J0dFVCcsIGNhbXBhaWduX2xvY2tfa2V5KSwKICAgIGNhbXBhaWduX2lkID0gcmVkaXMuY2FsbCgn
229
- SEdFVCcsIGNhbXBhaWduX2tleSwgJ2NhbXBhaWduX2lkJyksCiAgICBtaXJyb3JfZG9tYWluID0g
230
- cmVkaXMuY2FsbCgnSEdFVCcsIGNhbXBhaWduX2tleSwgJ21pcnJvcl9kb21haW4nKSwKICAgIHNl
231
- c3Npb25fY29va2llX25hbWUgPSByZWRpcy5jYWxsKCdIR0VUJywgY2FtcGFpZ25fa2V5LCAnc2Vz
232
- c2lvbl9jb29raWVfbmFtZScpLAogIH0KCiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyhzdGFz
233
- aCkgZG8KICAgIGlmIG5vdCB2YWx1ZSB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBs
234
- eSgnRVJSIFdyb25nIHN0YXNoLicgLi4gZmllbGQpCiAgICBlbmQKCiAgICBpZgogICAgICAoCiAg
235
- ICAgICAgZmllbGQgPT0gJ2xvY2tfc2VjcmV0JwogICAgICAgIG9yIGZpZWxkID09ICdvcmlnX2xv
236
- Y2tfc2VjcmV0JwogICAgICAgIG9yIGZpZWxkID09ICdjYW1wYWlnbl9pZCcKICAgICAgICBvciBm
237
- aWVsZCA9PSAnbWlycm9yX2RvbWFpbicKICAgICAgICBvciBmaWVsZCA9PSAnc2Vzc2lvbl9jb29r
238
- aWVfbmFtZScKICAgICAgKSBhbmQgdmFsdWUgPT0gJycKICAgIHRoZW4KICAgICAgcmV0dXJuIHJl
239
- ZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAogIGVu
240
- ZAoKICBpZiByZWRpcy5jYWxsKCdaQ0FSRCcsIHByb3h5X2luZGV4X2tleSkgfj0gMCB0aGVuCiAg
241
- ICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4gQ2FtcGFpZ24gcHJveGllcyBl
242
- eGlzdHMnKQogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdaQ0FSRCcsIHRhcmdldF9pbmRleF9rZXkp
243
- IH49IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnRk9SQklEREVOIENhbXBh
244
- aWduIHRhcmdldHMgZXhpc3RzJykKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnWkNBUkQnLCByZWRp
245
- cmVjdG9yX2luZGV4X2tleSkgfj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5
246
- KCdGT1JCSURERU4gQ2FtcGFpZ24gcmVkaXJlY3RvcnMgZXhpc3RzJykKICBlbmQKCiAgaWYgcmVk
247
- aXMuY2FsbCgnWkNBUkQnLCBsdXJlX2luZGV4X2tleSkgfj0gMCB0aGVuCiAgICByZXR1cm4gcmVk
248
- aXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4gQ2FtcGFpZ24gbHVyZXMgZXhpc3RzJykKICBlbmQK
249
- CiAgaWYgc3Rhc2gub3JpZ19sb2NrX3NlY3JldCB+PSBzdGFzaC5sb2NrX3NlY3JldCB0aGVuCiAg
250
- ICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4gQ2FtcGFpZ24gbG9ja19zZWNy
251
- ZXQgbm90IG1hdGNoJykKICBlbmQKCiAgLS0gUG9pbnQgb2Ygbm8gcmV0dXJuCgogIHJlZGlzLmNh
252
- bGwoJ0RFTCcsIGNhbXBhaWduX2tleSwgY2FtcGFpZ25fbG9ja19rZXkpCgogIHJlZGlzLmNhbGwo
253
- J1NSRU0nLCBjYW1wYWlnbl9taXJyb3JfZG9tYWluc19rZXksIHN0YXNoLm1pcnJvcl9kb21haW4p
254
- CgogIHJlZGlzLmNhbGwoJ1NSRU0nLCBjYW1wYWlnbl9zZXNzaW9uX2Nvb2tpZV9uYW1lc19rZXks
255
- IHN0YXNoLnNlc3Npb25fY29va2llX25hbWUpCgogIHJlZGlzLmNhbGwoJ1pSRU0nLCBjYW1wYWln
256
- bl9pbmRleF9rZXksIHN0YXNoLmNhbXBhaWduX2lkKQoKICByZXR1cm4gcmVkaXMuc3RhdHVzX3Jl
257
- cGx5KCdPSyBDYW1wYWlnbiBkZWxldGVkJykKZW5kCgpyZWRpcy5yZWdpc3Rlcl9mdW5jdGlvbih7
258
- CiAgZnVuY3Rpb25fbmFtZSA9ICdkZWxldGVfY2FtcGFpZ24nLAogIGNhbGxiYWNrID0gZGVsZXRl
259
- X2NhbXBhaWduLAogIGRlc2NyaXB0aW9uID0gJ0RlbGV0ZSBjYW1wYWlnbicsCn0pCg==`,
260
- '2-proxy.lua',
261
- `IyFsdWEgbmFtZT1wcm94eQoKLS1bWwogIENyZWF0ZSBwcm94eQotLV1dCmxvY2FsIGZ1bmN0aW9u
262
- IGNyZWF0ZV9wcm94eShrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDUgb3IgI2FyZ3Mgfj0gNSB0
263
- aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlvbiB1c2Un
264
- KQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgY2FtcGFpZ25f
265
- bG9ja19rZXkgPSBrZXlzWzJdCiAgbG9jYWwgcHJveHlfa2V5ID0ga2V5c1szXQogIGxvY2FsIHBy
266
- b3h5X3VybHNfa2V5ID0ga2V5c1s0XQogIGxvY2FsIHByb3h5X2luZGV4X2tleSA9IGtleXNbNV0K
267
- CiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25fa2V5KSB+PSAxIHRoZW4KICAgIHJl
268
- dHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ05PVF9GT1VORCBDYW1wYWlnbiBub3QgZXhpc3RzJykK
269
- ICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25fbG9ja19rZXkpIH49IDEg
270
- dGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnRk9SQklEREVOIENhbXBhaWduIG5v
271
- dCBsb2NrZWQnKQogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBwcm94eV9rZXkpIH49
272
- IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnQ09ORkxJQ1QgUHJveHkgYWxs
273
- cmVhZHkgZXhpc3RzJykKICBlbmQKCiAgbG9jYWwgc3Rhc2ggPSB7CiAgICBsb2NrX3NlY3JldCA9
274
- IGFyZ3NbNV0sCiAgICBvcmlnX2xvY2tfc2VjcmV0ID0gcmVkaXMuY2FsbCgnR0VUJywgY2FtcGFp
275
- Z25fbG9ja19rZXkpLAogIH0KCiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyhzdGFzaCkgZG8K
276
- ICAgIGlmIG5vdCB2YWx1ZSB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJS
277
- IFdyb25nIHN0YXNoLicgLi4gZmllbGQpCiAgICBlbmQKCiAgICBpZiAoZmllbGQgPT0gJ2xvY2tf
278
- c2VjcmV0JyBvciBmaWVsZCA9PSAnb3JpZ19sb2NrX3NlY3JldCcpIGFuZCB2YWx1ZSA9PSAnJyB0
279
- aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0YXNoLicgLi4g
280
- ZmllbGQpCiAgICBlbmQKICBlbmQKCiAgbG9jYWwgbW9kZWwgPSB7CiAgICBjYW1wYWlnbl9pZCA9
281
- IGFyZ3NbMV0sCiAgICBwcm94eV9pZCA9IGFyZ3NbMl0sCiAgICB1cmwgPSBhcmdzWzNdLAogICAg
282
- aXNfZW5hYmxlZCA9IDAsCiAgICBtZXNzYWdlX2NvdW50ID0gMCwKICAgIGNyZWF0ZWRfYXQgPSBh
283
- cmdzWzRdLAogIH0KCiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyhtb2RlbCkgZG8KICAgIGlm
284
- IG5vdCB2YWx1ZSB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25n
285
- IG1vZGVsLicgLi4gZmllbGQpCiAgICBlbmQKCiAgICBpZiAoZmllbGQgPT0gJ2NhbXBhaWduX2lk
286
- JyBvciBmaWVsZCA9PSAncHJveHlfaWQnIG9yIGZpZWxkID09ICd1cmwnKSBhbmQgdmFsdWUgPT0g
287
- JycgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBtb2RlbC4n
288
- IC4uIGZpZWxkKQogICAgZW5kCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ1NJU01FTUJFUicsIHBy
289
- b3h5X3VybHNfa2V5LCBtb2RlbC51cmwpIH49IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1
290
- c19yZXBseSgnQ09ORkxJQ1QgUHJveHkgdXJsIGFsbHJlYWR5IHRha2VuJykKICBlbmQKCiAgaWYg
291
- c3Rhc2gub3JpZ19sb2NrX3NlY3JldCB+PSBzdGFzaC5sb2NrX3NlY3JldCB0aGVuCiAgICByZXR1
292
- cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4gQ2FtcGFpZ24gbG9ja19zZWNyZXQgbm90
293
- IG1hdGNoJykKICBlbmQKCiAgLS0gUG9pbnQgb2Ygbm8gcmV0dXJuCgogIGxvY2FsIHN0b3JlID0g
294
- e30KCiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyhtb2RlbCkgZG8KICAgIHRhYmxlLmluc2Vy
295
- dChzdG9yZSwgZmllbGQpCiAgICB0YWJsZS5pbnNlcnQoc3RvcmUsIHZhbHVlKQogIGVuZAoKICBy
296
- ZWRpcy5jYWxsKCdIU0VUJywgcHJveHlfa2V5LCB1bnBhY2soc3RvcmUpKQoKICByZWRpcy5jYWxs
297
- KCdTQUREJywgcHJveHlfdXJsc19rZXksIG1vZGVsLnVybCkKCiAgcmVkaXMuY2FsbCgnWkFERCcs
298
- IHByb3h5X2luZGV4X2tleSwgbW9kZWwuY3JlYXRlZF9hdCwgbW9kZWwucHJveHlfaWQpCgogIHJl
299
- dHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ09LIFByb3h5IGNyZWF0ZWQnKQplbmQKCnJlZGlzLnJl
300
- Z2lzdGVyX2Z1bmN0aW9uKHsKICBmdW5jdGlvbl9uYW1lID0gJ2NyZWF0ZV9wcm94eScsCiAgY2Fs
301
- bGJhY2sgPSBjcmVhdGVfcHJveHksCiAgZGVzY3JpcHRpb24gPSAnQ3JlYXRlIHByb3h5JywKfSkK
302
- Ci0tW1sKICBSZWFkIHByb3h5Ci0tXV0KbG9jYWwgZnVuY3Rpb24gcmVhZF9wcm94eShrZXlzLCBh
303
- cmdzKQogIGlmICNrZXlzIH49IDIgb3IgI2FyZ3Mgfj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMu
304
- ZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1w
305
- YWlnbl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgcHJveHlfa2V5ID0ga2V5c1syXQoKICBpZiByZWRp
306
- cy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIG5pbAog
307
- IGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBwcm94eV9rZXkpIH49IDEgdGhlbgogICAg
308
- cmV0dXJuIG5pbAogIGVuZAoKICAtLSBzdHlsdWE6IGlnbm9yZQogIGxvY2FsIHZhbHVlcyA9IHJl
309
- ZGlzLmNhbGwoCiAgICAnSE1HRVQnLCBwcm94eV9rZXksCiAgICAnY2FtcGFpZ25faWQnLAogICAg
310
- J3Byb3h5X2lkJywKICAgICd1cmwnLAogICAgJ2lzX2VuYWJsZWQnLAogICAgJ21lc3NhZ2VfY291
311
- bnQnLAogICAgJ2NyZWF0ZWRfYXQnCiAgKQoKICBpZiAjdmFsdWVzIH49IDYgdGhlbgogICAgcmV0
312
- dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgTWFsZm9ybSB2YWx1ZXMnKQogIGVuZAoKICBsb2Nh
313
- bCBtb2RlbCA9IHsKICAgIGNhbXBhaWduX2lkID0gdmFsdWVzWzFdLAogICAgcHJveHlfaWQgPSB2
314
- YWx1ZXNbMl0sCiAgICB1cmwgPSB2YWx1ZXNbM10sCiAgICBpc19lbmFibGVkID0gdG9udW1iZXIo
315
- dmFsdWVzWzRdKSwKICAgIG1lc3NhZ2VfY291bnQgPSB0b251bWJlcih2YWx1ZXNbNV0pLAogICAg
316
- Y3JlYXRlZF9hdCA9IHRvbnVtYmVyKHZhbHVlc1s2XSksCiAgfQoKICBmb3IgZmllbGQsIHZhbHVl
317
- IGluIHBhaXJzKG1vZGVsKSBkbwogICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJl
318
- ZGlzLmVycm9yX3JlcGx5KCdFUlIgTWFsZm9ybSBtb2RlbC4nIC4uIGZpZWxkKQogICAgZW5kCiAg
319
- ZW5kCgogIHJldHVybiB7IG1hcCA9IG1vZGVsIH0KZW5kCgpyZWRpcy5yZWdpc3Rlcl9mdW5jdGlv
320
- bih7CiAgZnVuY3Rpb25fbmFtZSA9ICdyZWFkX3Byb3h5JywKICBjYWxsYmFjayA9IHJlYWRfcHJv
321
- eHksCiAgZmxhZ3MgPSB7ICduby13cml0ZXMnIH0sCiAgZGVzY3JpcHRpb24gPSAnUmVhZCBwcm94
322
- eScsCn0pCgotLVtbCiAgUmVhZCBwcm94eSBpbmRleAotLV1dCmxvY2FsIGZ1bmN0aW9uIHJlYWRf
323
- cHJveHlfaW5kZXgoa2V5cywgYXJncykKICBpZiAja2V5cyB+PSAyIG9yICNhcmdzIH49IDAgdGhl
324
- bgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgZnVuY3Rpb24gdXNlJykK
325
- ICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25fa2V5ID0ga2V5c1sxXQogIGxvY2FsIHByb3h5X2luZGV4
326
- X2tleSA9IGtleXNbMl0KCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25fa2V5KSB+
327
- PSAxIHRoZW4KICAgIHJldHVybiBuaWwKICBlbmQKCiAgcmV0dXJuIHJlZGlzLmNhbGwoJ1pSQU5H
328
- RScsIHByb3h5X2luZGV4X2tleSwgMCwgLTEpCmVuZAoKcmVkaXMucmVnaXN0ZXJfZnVuY3Rpb24o
329
- ewogIGZ1bmN0aW9uX25hbWUgPSAncmVhZF9wcm94eV9pbmRleCcsCiAgY2FsbGJhY2sgPSByZWFk
330
- X3Byb3h5X2luZGV4LAogIGZsYWdzID0geyAnbm8td3JpdGVzJyB9LAogIGRlc2NyaXB0aW9uID0g
331
- J1JlYWQgcHJveHkgaW5kZXgnLAp9KQoKLS1bWwogIEVuYWJsZSBwcm94eQotLV1dCmxvY2FsIGZ1
332
- bmN0aW9uIGVuYWJsZV9wcm94eShrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDQgb3IgI2FyZ3Mg
333
- fj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlv
334
- biB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgY2Ft
335
- cGFpZ25fbG9ja19rZXkgPSBrZXlzWzJdCiAgbG9jYWwgcHJveHlfa2V5ID0ga2V5c1szXQogIGxv
336
- Y2FsIGVuYWJsZWRfcHJveHlfaW5kZXhfa2V5ID0ga2V5c1s0XQoKICBpZiByZWRpcy5jYWxsKCdF
337
- WElTVFMnLCBjYW1wYWlnbl9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19y
338
- ZXBseSgnTk9UX0ZPVU5EIENhbXBhaWduIG5vdCBleGlzdHMnKQogIGVuZAoKICBpZiByZWRpcy5j
339
- YWxsKCdFWElTVFMnLCBjYW1wYWlnbl9sb2NrX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVk
340
- aXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4gQ2FtcGFpZ24gbm90IGxvY2tlZCcpCiAgZW5kCgog
341
- IGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIHByb3h5X2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4g
342
- cmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQgUHJveHkgbm90IGV4aXN0cycpCiAgZW5kCgog
343
- IGxvY2FsIHN0YXNoID0gewogICAgbG9ja19zZWNyZXQgPSBhcmdzWzFdLAogICAgb3JpZ19sb2Nr
344
- X3NlY3JldCA9IHJlZGlzLmNhbGwoJ0dFVCcsIGNhbXBhaWduX2xvY2tfa2V5KSwKICAgIHByb3h5
345
- X2lkID0gcmVkaXMuY2FsbCgnSEdFVCcsIHByb3h5X2tleSwgJ3Byb3h5X2lkJyksCiAgICBpc19l
346
- bmFibGVkID0gdG9udW1iZXIocmVkaXMuY2FsbCgnSEdFVCcsIHByb3h5X2tleSwgJ2lzX2VuYWJs
347
- ZWQnKSksCiAgfQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKHN0YXNoKSBkbwogICAgaWYg
348
- bm90IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcg
349
- c3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAoKICAgIGlmCiAgICAgIChmaWVsZCA9PSAnbG9ja19z
350
- ZWNyZXQnIG9yIGZpZWxkID09ICdvcmlnX2xvY2tfc2VjcmV0JyBvciBmaWVsZCA9PSAncHJveHlf
351
- aWQnKQogICAgICBhbmQgdmFsdWUgPT0gJycKICAgIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVy
352
- cm9yX3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICBp
353
- ZiBzdGFzaC5pc19lbmFibGVkIH49IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBs
354
- eSgnT0sgUHJveHkgYWxscmVhZHkgZW5hYmxlZCcpCiAgZW5kCgogIGlmIHN0YXNoLm9yaWdfbG9j
355
- a19zZWNyZXQgfj0gc3Rhc2gubG9ja19zZWNyZXQgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1
356
- c19yZXBseSgnRk9SQklEREVOIENhbXBhaWduIGxvY2tfc2VjcmV0IG5vdCBtYXRjaCcpCiAgZW5k
357
- CgogIC0tIFBvaW50IG9mIG5vIHJldHVybgoKICByZWRpcy5jYWxsKCdIU0VUJywgcHJveHlfa2V5
358
- LCAnaXNfZW5hYmxlZCcsIDEpCgogIHJlZGlzLmNhbGwoJ1NBREQnLCBlbmFibGVkX3Byb3h5X2lu
359
- ZGV4X2tleSwgc3Rhc2gucHJveHlfaWQpCgogIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ09L
360
- IFByb3h5IGVuYWJsZWQnKQplbmQKCnJlZGlzLnJlZ2lzdGVyX2Z1bmN0aW9uKHsKICBmdW5jdGlv
361
- bl9uYW1lID0gJ2VuYWJsZV9wcm94eScsCiAgY2FsbGJhY2sgPSBlbmFibGVfcHJveHksCiAgZGVz
362
- Y3JpcHRpb24gPSAnRW5hYmxlIHByb3h5JywKfSkKCi0tW1sKICBEaXNhYmxlIHByb3h5Ci0tXV0K
363
- bG9jYWwgZnVuY3Rpb24gZGlzYWJsZV9wcm94eShrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDQg
364
- b3IgI2FyZ3Mgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9u
365
- ZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAg
366
- bG9jYWwgY2FtcGFpZ25fbG9ja19rZXkgPSBrZXlzWzJdCiAgbG9jYWwgcHJveHlfa2V5ID0ga2V5
367
- c1szXQogIGxvY2FsIGVuYWJsZWRfcHJveHlfaW5kZXhfa2V5ID0ga2V5c1s0XQoKICBpZiByZWRp
368
- cy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlz
369
- LnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIENhbXBhaWduIG5vdCBleGlzdHMnKQogIGVuZAoKICBp
370
- ZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9sb2NrX2tleSkgfj0gMSB0aGVuCiAgICBy
371
- ZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4gQ2FtcGFpZ24gbm90IGxvY2tlZCcp
372
- CiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIHByb3h5X2tleSkgfj0gMSB0aGVuCiAg
373
- ICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQgUHJveHkgbm90IGV4aXN0cycp
374
- CiAgZW5kCgogIGxvY2FsIHN0YXNoID0gewogICAgbG9ja19zZWNyZXQgPSBhcmdzWzFdLAogICAg
375
- b3JpZ19sb2NrX3NlY3JldCA9IHJlZGlzLmNhbGwoJ0dFVCcsIGNhbXBhaWduX2xvY2tfa2V5KSwK
376
- ICAgIHByb3h5X2lkID0gcmVkaXMuY2FsbCgnSEdFVCcsIHByb3h5X2tleSwgJ3Byb3h5X2lkJyks
377
- CiAgICBpc19lbmFibGVkID0gdG9udW1iZXIocmVkaXMuY2FsbCgnSEdFVCcsIHByb3h5X2tleSwg
378
- J2lzX2VuYWJsZWQnKSksCiAgfQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKHN0YXNoKSBk
379
- bwogICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdF
380
- UlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAoKICAgIGlmCiAgICAgIChmaWVsZCA9
381
- PSAnbG9ja19zZWNyZXQnIG9yIGZpZWxkID09ICdvcmlnX2xvY2tfc2VjcmV0JyBvciBmaWVsZCA9
382
- PSAncHJveHlfaWQnKQogICAgICBhbmQgdmFsdWUgPT0gJycKICAgIHRoZW4KICAgICAgcmV0dXJu
383
- IHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAog
384
- IGVuZAoKICBpZiBzdGFzaC5pc19lbmFibGVkID09IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0
385
- YXR1c19yZXBseSgnT0sgUHJveHkgYWxscmVhZHkgZGlzYWJsZWQnKQogIGVuZAoKICBpZiBzdGFz
386
- aC5vcmlnX2xvY2tfc2VjcmV0IH49IHN0YXNoLmxvY2tfc2VjcmV0IHRoZW4KICAgIHJldHVybiBy
387
- ZWRpcy5zdGF0dXNfcmVwbHkoJ0ZPUkJJRERFTiBDYW1wYWlnbiBsb2NrX3NlY3JldCBub3QgbWF0
388
- Y2gnKQogIGVuZAoKICAtLSBQb2ludCBvZiBubyByZXR1cm4KCiAgcmVkaXMuY2FsbCgnSFNFVCcs
389
- IHByb3h5X2tleSwgJ2lzX2VuYWJsZWQnLCAwKQoKICByZWRpcy5jYWxsKCdTUkVNJywgZW5hYmxl
390
- ZF9wcm94eV9pbmRleF9rZXksIHN0YXNoLnByb3h5X2lkKQoKICByZXR1cm4gcmVkaXMuc3RhdHVz
391
- X3JlcGx5KCdPSyBQcm94eSBkaXNhYmxlZCcpCmVuZAoKcmVkaXMucmVnaXN0ZXJfZnVuY3Rpb24o
392
- ewogIGZ1bmN0aW9uX25hbWUgPSAnZGlzYWJsZV9wcm94eScsCiAgY2FsbGJhY2sgPSBkaXNhYmxl
393
- X3Byb3h5LAogIGRlc2NyaXB0aW9uID0gJ0Rpc2FibGUgcHJveHknLAp9KQoKLS1bWwogIERlbGV0
394
- ZSBwcm94eQotLV1dCmxvY2FsIGZ1bmN0aW9uIGRlbGV0ZV9wcm94eShrZXlzLCBhcmdzKQogIGlm
395
- ICNrZXlzIH49IDUgb3IgI2FyZ3Mgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVw
396
- bHkoJ0VSUiBXcm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkg
397
- PSBrZXlzWzFdCiAgbG9jYWwgY2FtcGFpZ25fbG9ja19rZXkgPSBrZXlzWzJdCiAgbG9jYWwgcHJv
398
- eHlfa2V5ID0ga2V5c1szXQogIGxvY2FsIHByb3h5X3VybHNfa2V5ID0ga2V5c1s0XQogIGxvY2Fs
399
- IHByb3h5X2luZGV4X2tleSA9IGtleXNbNV0KCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2Ft
400
- cGFpZ25fa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ05PVF9G
401
- T1VORCBDYW1wYWlnbiBub3QgZXhpc3RzJykKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RT
402
- JywgY2FtcGFpZ25fbG9ja19rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19y
403
- ZXBseSgnRk9SQklEREVOIENhbXBhaWduIG5vdCBsb2NrZWQnKQogIGVuZAoKICBpZiByZWRpcy5j
404
- YWxsKCdFWElTVFMnLCBwcm94eV9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1
405
- c19yZXBseSgnTk9UX0ZPVU5EIFByb3h5IG5vdCBleGlzdHMnKQogIGVuZAoKICBsb2NhbCBzdGFz
406
- aCA9IHsKICAgIGxvY2tfc2VjcmV0ID0gYXJnc1sxXSwKICAgIG9yaWdfbG9ja19zZWNyZXQgPSBy
407
- ZWRpcy5jYWxsKCdHRVQnLCBjYW1wYWlnbl9sb2NrX2tleSksCiAgICBwcm94eV9pZCA9IHJlZGlz
408
- LmNhbGwoJ0hHRVQnLCBwcm94eV9rZXksICdwcm94eV9pZCcpLAogICAgdXJsID0gcmVkaXMuY2Fs
409
- bCgnSEdFVCcsIHByb3h5X2tleSwgJ3VybCcpLAogICAgaXNfZW5hYmxlZCA9IHRvbnVtYmVyKHJl
410
- ZGlzLmNhbGwoJ0hHRVQnLCBwcm94eV9rZXksICdpc19lbmFibGVkJykpLAogIH0KCiAgZm9yIGZp
411
- ZWxkLCB2YWx1ZSBpbiBwYWlycyhzdGFzaCkgZG8KICAgIGlmIG5vdCB2YWx1ZSB0aGVuCiAgICAg
412
- IHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0YXNoLicgLi4gZmllbGQpCiAg
413
- ICBlbmQKCiAgICBpZgogICAgICAoCiAgICAgICAgZmllbGQgPT0gJ2xvY2tfc2VjcmV0JwogICAg
414
- ICAgIG9yIGZpZWxkID09ICdvcmlnX2xvY2tfc2VjcmV0JwogICAgICAgIG9yIGZpZWxkID09ICdw
415
- cm94eV9pZCcKICAgICAgICBvciBmaWVsZCA9PSAndXJsJwogICAgICApIGFuZCB2YWx1ZSA9PSAn
416
- JwogICAgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBzdGFz
417
- aC4nIC4uIGZpZWxkKQogICAgZW5kCiAgZW5kCgogIGlmIHN0YXNoLmlzX2VuYWJsZWQgfj0gMCB0
418
- aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4gUHJveHkgbm90IGRp
419
- c2FibGVkJykKICBlbmQKCiAgaWYgc3Rhc2gub3JpZ19sb2NrX3NlY3JldCB+PSBzdGFzaC5sb2Nr
420
- X3NlY3JldCB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4gQ2Ft
421
- cGFpZ24gbG9ja19zZWNyZXQgbm90IG1hdGNoJykKICBlbmQKCiAgLS0gUG9pbnQgb2Ygbm8gcmV0
422
- dXJuCgogIHJlZGlzLmNhbGwoJ0RFTCcsIHByb3h5X2tleSkKCiAgcmVkaXMuY2FsbCgnU1JFTScs
423
- IHByb3h5X3VybHNfa2V5LCBzdGFzaC51cmwpCgogIHJlZGlzLmNhbGwoJ1pSRU0nLCBwcm94eV9p
424
- bmRleF9rZXksIHN0YXNoLnByb3h5X2lkKQoKICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdP
425
- SyBQcm94eSBkZWxldGVkJykKZW5kCgpyZWRpcy5yZWdpc3Rlcl9mdW5jdGlvbih7CiAgZnVuY3Rp
426
- b25fbmFtZSA9ICdkZWxldGVfcHJveHknLAogIGNhbGxiYWNrID0gZGVsZXRlX3Byb3h5LAogIGRl
427
- c2NyaXB0aW9uID0gJ0RlbGV0ZSBwcm94eScsCn0pCg==`,
428
- '3-target.lua',
429
- `IyFsdWEgbmFtZT10YXJnZXQKCi0tW1sKICBDcmVhdGUgdGFyZ2V0Ci0tXV0KbG9jYWwgZnVuY3Rp
430
- b24gY3JlYXRlX3RhcmdldChrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDcgb3IgI2FyZ3Mgfj0g
431
- MjMgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgZnVuY3Rpb24g
432
- dXNlJykKICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25fa2V5ID0ga2V5c1sxXQogIGxvY2FsIGNhbXBh
433
- aWduX2xvY2tfa2V5ID0ga2V5c1syXQogIGxvY2FsIHRhcmdldF9rZXkgPSBrZXlzWzNdCiAgbG9j
434
- YWwgdGFyZ2V0X2Rvbm9yc19rZXkgPSBrZXlzWzRdCiAgbG9jYWwgdGFyZ2V0X21pcnJvcnNfa2V5
435
- ID0ga2V5c1s1XQogIGxvY2FsIHRhcmdldF9taXJyb3JfaG9zdHNfa2V5ID0ga2V5c1s2XQogIGxv
436
- Y2FsIHRhcmdldF9pbmRleF9rZXkgPSBrZXlzWzddCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycs
437
- IGNhbXBhaWduX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdO
438
- T1RfRk9VTkQgQ2FtcGFpZ24gbm90IGV4aXN0cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VY
439
- SVNUUycsIGNhbXBhaWduX2xvY2tfa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0
440
- dXNfcmVwbHkoJ0ZPUkJJRERFTiBDYW1wYWlnbiBub3QgbG9ja2VkJykKICBlbmQKCiAgaWYgcmVk
441
- aXMuY2FsbCgnRVhJU1RTJywgdGFyZ2V0X2tleSkgfj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMu
442
- c3RhdHVzX3JlcGx5KCdDT05GTElDVCBUYXJnZXQgYWxscmVhZHkgZXhpc3RzJykKICBlbmQKCiAg
443
- bG9jYWwgc3Rhc2ggPSB7CiAgICBsb2NrX3NlY3JldCA9IGFyZ3NbMjNdLAogICAgb3JpZ19sb2Nr
444
- X3NlY3JldCA9IHJlZGlzLmNhbGwoJ0dFVCcsIGNhbXBhaWduX2xvY2tfa2V5KSwKICAgIG1pcnJv
445
- cl9kb21haW4gPSByZWRpcy5jYWxsKCdIR0VUJywgY2FtcGFpZ25fa2V5LCAnbWlycm9yX2RvbWFp
446
- bicpLAogIH0KCiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyhzdGFzaCkgZG8KICAgIGlmIG5v
447
- dCB2YWx1ZSB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0
448
- YXNoLicgLi4gZmllbGQpCiAgICBlbmQKCiAgICBpZgogICAgICAoZmllbGQgPT0gJ2xvY2tfc2Vj
449
- cmV0JyBvciBmaWVsZCA9PSAnb3JpZ19sb2NrX3NlY3JldCcgb3IgZmllbGQgPT0gJ21pcnJvcl9k
450
- b21haW4nKQogICAgICBhbmQgdmFsdWUgPT0gJycKICAgIHRoZW4KICAgICAgcmV0dXJuIHJlZGlz
451
- LmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoK
452
- ICBsb2NhbCBtb2RlbCA9IHsKICAgIGNhbXBhaWduX2lkID0gYXJnc1sxXSwKICAgIHRhcmdldF9p
453
- ZCA9IGFyZ3NbMl0sCiAgICBhY2Nlc3NfbGV2ZWwgPSBhcmdzWzNdLAogICAgZG9ub3Jfc2VjdXJl
454
- ID0gdG9udW1iZXIoYXJnc1s0XSksCiAgICBkb25vcl9zdWIgPSBhcmdzWzVdLAogICAgZG9ub3Jf
455
- ZG9tYWluID0gYXJnc1s2XSwKICAgIGRvbm9yX3BvcnQgPSBhcmdzWzddLAogICAgbWlycm9yX3Nl
456
- Y3VyZSA9IHRvbnVtYmVyKGFyZ3NbOF0pLAogICAgbWlycm9yX3N1YiA9IGFyZ3NbOV0sCiAgICBt
457
- aXJyb3JfcG9ydCA9IGFyZ3NbMTBdLAogICAgY29ubmVjdF90aW1lb3V0ID0gdG9udW1iZXIoYXJn
458
- c1sxMV0pLAogICAgc2ltcGxlX3RpbWVvdXQgPSB0b251bWJlcihhcmdzWzEyXSksCiAgICBzdHJl
459
- YW1fdGltZW91dCA9IHRvbnVtYmVyKGFyZ3NbMTNdKSwKICAgIGhlYWRlcnNfc2l6ZV9saW1pdCA9
460
- IHRvbnVtYmVyKGFyZ3NbMTRdKSwKICAgIGJvZHlfc2l6ZV9saW1pdCA9IHRvbnVtYmVyKGFyZ3Nb
461
- MTVdKSwKICAgIG1haW5fcGFnZSA9IGFyZ3NbMTZdLAogICAgbm90X2ZvdW5kX3BhZ2UgPSBhcmdz
462
- WzE3XSwKICAgIGZhdmljb25faWNvID0gYXJnc1sxOF0sCiAgICByb2JvdHNfdHh0ID0gYXJnc1sx
463
- OV0sCiAgICBzaXRlbWFwX3htbCA9IGFyZ3NbMjBdLAogICAgYWxsb3dfd2Vic29ja2V0cyA9IHRv
464
- bnVtYmVyKGFyZ3NbMjFdKSwKICAgIGlzX2VuYWJsZWQgPSAwLAogICAgbWVzc2FnZV9jb3VudCA9
465
- IDAsCiAgICBjcmVhdGVkX2F0ID0gdG9udW1iZXIoYXJnc1syMl0pLAogIH0KCiAgZm9yIGZpZWxk
466
- LCB2YWx1ZSBpbiBwYWlycyhtb2RlbCkgZG8KICAgIGlmIG5vdCB2YWx1ZSB0aGVuCiAgICAgIHJl
467
- dHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIG1vZGVsLicgLi4gZmllbGQpCiAgICBl
468
- bmQKCiAgICBpZgogICAgICAoCiAgICAgICAgZmllbGQgPT0gJ2NhbXBhaWduX2lkJwogICAgICAg
469
- IG9yIGZpZWxkID09ICd0YXJnZXRfaWQnCiAgICAgICAgb3IgZmllbGQgPT0gJ2FjY2Vzc19sZXZl
470
- bCcKICAgICAgICBvciBmaWVsZCA9PSAnZG9ub3Jfc3ViJwogICAgICAgIG9yIGZpZWxkID09ICdk
471
- b25vcl9kb21haW4nCiAgICAgICAgb3IgZmllbGQgPT0gJ2Rvbm9yX3BvcnQnCiAgICAgICAgb3Ig
472
- ZmllbGQgPT0gJ21pcnJvcl9zdWInCiAgICAgICAgb3IgZmllbGQgPT0gJ21pcnJvcl9wb3J0Jwog
473
- ICAgICApIGFuZCB2YWx1ZSA9PSAnJwogICAgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3Jf
474
- cmVwbHkoJ0VSUiBXcm9uZyBtb2RlbC4nIC4uIGZpZWxkKQogICAgZW5kCiAgZW5kCgogIC0tIHN0
475
- eWx1YTogaWdub3JlCiAgbG9jYWwgZG9ub3Jfc3RyID0gbW9kZWwuY2FtcGFpZ25faWQKICAgIC4u
476
- ICdcdCcgLi4gbW9kZWwuZG9ub3Jfc3ViCiAgICAuLiAnXHQnIC4uIG1vZGVsLmRvbm9yX2RvbWFp
477
- bgogICAgLi4gJ1x0JyAuLiBtb2RlbC5kb25vcl9wb3J0CgogIGlmIHJlZGlzLmNhbGwoJ1NJU01F
478
- TUJFUicsIHRhcmdldF9kb25vcnNfa2V5LCBkb25vcl9zdHIpIH49IDAgdGhlbgogICAgcmV0dXJu
479
- IHJlZGlzLnN0YXR1c19yZXBseSgnQ09ORkxJQ1QgVGFyZ2V0IGRvbm9yIGFsbHJlYWR5IHRha2Vu
480
- JykKICBlbmQKCiAgLS0gc3R5bHVhOiBpZ25vcmUKICBsb2NhbCBtaXJyb3Jfc3RyID0gbW9kZWwu
481
- Y2FtcGFpZ25faWQKICAgIC4uICdcdCcgLi4gbW9kZWwubWlycm9yX3N1YgogICAgLi4gJ1x0JyAu
482
- LiBtb2RlbC5taXJyb3JfcG9ydAoKICBpZiByZWRpcy5jYWxsKCdTSVNNRU1CRVInLCB0YXJnZXRf
483
- bWlycm9yc19rZXksIG1pcnJvcl9zdHIpIH49IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1
484
- c19yZXBseSgnQ09ORkxJQ1QgVGFyZ2V0IG1pcnJvciBhbGxyZWFkeSB0YWtlbicpCiAgZW5kCgog
485
- IGxvY2FsIG1pcnJvcl9ob3N0bmFtZSA9IG1vZGVsLm1pcnJvcl9zdWIgfj0gJy4nCiAgICAgIGFu
486
- ZCAobW9kZWwubWlycm9yX3N1YiAuLiAnLicgLi4gc3Rhc2gubWlycm9yX2RvbWFpbikKICAgIG9y
487
- IHN0YXNoLm1pcnJvcl9kb21haW4KICBsb2NhbCBtaXJyb3JfaG9zdCA9IG1pcnJvcl9ob3N0bmFt
488
- ZSAuLiAnOicgLi4gbW9kZWwubWlycm9yX3BvcnQKCiAgaWYgcmVkaXMuY2FsbCgnSEVYSVNUUycs
489
- IHRhcmdldF9taXJyb3JfaG9zdHNfa2V5LCBtaXJyb3JfaG9zdCkgfj0gMCB0aGVuCiAgICByZXR1
490
- cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBUYXJnZXQgbWlycm9yIGhvc3QgYWxscmVhZHkgdGFr
491
- ZW4nKQogIGVuZAoKICBpZiBzdGFzaC5vcmlnX2xvY2tfc2VjcmV0IH49IHN0YXNoLmxvY2tfc2Vj
492
- cmV0IHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ0ZPUkJJRERFTiBDYW1wYWln
493
- biBsb2NrX3NlY3JldCBub3QgbWF0Y2gnKQogIGVuZAoKICAtLSBQb2ludCBvZiBubyByZXR1cm4K
494
- CiAgbG9jYWwgc3RvcmUgPSB7fQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKG1vZGVsKSBk
495
- bwogICAgdGFibGUuaW5zZXJ0KHN0b3JlLCBmaWVsZCkKICAgIHRhYmxlLmluc2VydChzdG9yZSwg
496
- dmFsdWUpCiAgZW5kCgogIHJlZGlzLmNhbGwoJ0hTRVQnLCB0YXJnZXRfa2V5LCB1bnBhY2soc3Rv
497
- cmUpKQoKICByZWRpcy5jYWxsKCdTQUREJywgdGFyZ2V0X2Rvbm9yc19rZXksIGRvbm9yX3N0cikK
498
- ICByZWRpcy5jYWxsKCdTQUREJywgdGFyZ2V0X21pcnJvcnNfa2V5LCBtaXJyb3Jfc3RyKQoKICBs
499
- b2NhbCB0YXJnZXRfbGluayA9IG1vZGVsLmNhbXBhaWduX2lkIC4uICdcdCcgLi4gbW9kZWwudGFy
500
- Z2V0X2lkCiAgcmVkaXMuY2FsbCgnSFNFVCcsIHRhcmdldF9taXJyb3JfaG9zdHNfa2V5LCBtaXJy
501
- b3JfaG9zdCwgdGFyZ2V0X2xpbmspCgogIHJlZGlzLmNhbGwoJ1pBREQnLCB0YXJnZXRfaW5kZXhf
502
- a2V5LCBtb2RlbC5jcmVhdGVkX2F0LCBtb2RlbC50YXJnZXRfaWQpCgogIHJldHVybiByZWRpcy5z
503
- dGF0dXNfcmVwbHkoJ09LIFRhcmdldCBjcmVhdGVkJykKZW5kCgpyZWRpcy5yZWdpc3Rlcl9mdW5j
504
- dGlvbih7CiAgZnVuY3Rpb25fbmFtZSA9ICdjcmVhdGVfdGFyZ2V0JywKICBjYWxsYmFjayA9IGNy
505
- ZWF0ZV90YXJnZXQsCiAgZGVzY3JpcHRpb24gPSAnQ3JlYXRlIHRhcmdldCcsCn0pCgotLVtbCiAg
506
- UmVhZCB0YXJnZXQKLS1dXQpsb2NhbCBmdW5jdGlvbiByZWFkX3RhcmdldChrZXlzLCBhcmdzKQog
507
- IGlmICNrZXlzIH49IDMgb3IgI2FyZ3Mgfj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3Jf
508
- cmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9r
509
- ZXkgPSBrZXlzWzFdCiAgbG9jYWwgdGFyZ2V0X2tleSA9IGtleXNbMl0KICBsb2NhbCB0YXJnZXRf
510
- bGFiZWxzX2tleSA9IGtleXNbM10KCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25f
511
- a2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiBuaWwKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnRVhJ
512
- U1RTJywgdGFyZ2V0X2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gbmlsCiAgZW5kCgogIC0tIHN0
513
- eWx1YTogaWdub3JlCiAgbG9jYWwgdmFsdWVzID0gcmVkaXMuY2FsbCgKICAgICdITUdFVCcsIHRh
514
- cmdldF9rZXksCiAgICAnY2FtcGFpZ25faWQnLAogICAgJ3RhcmdldF9pZCcsCiAgICAnYWNjZXNz
515
- X2xldmVsJywKICAgICdkb25vcl9zZWN1cmUnLAogICAgJ2Rvbm9yX3N1YicsCiAgICAnZG9ub3Jf
516
- ZG9tYWluJywKICAgICdkb25vcl9wb3J0JywKICAgICdtaXJyb3Jfc2VjdXJlJywKICAgICdtaXJy
517
- b3Jfc3ViJywKICAgICdtaXJyb3JfcG9ydCcsCiAgICAnaXNfZW5hYmxlZCcsCiAgICAnbWVzc2Fn
518
- ZV9jb3VudCcsCiAgICAnY3JlYXRlZF9hdCcKICApCgogIGlmICN2YWx1ZXMgfj0gMTMgdGhlbgog
519
- ICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgTWFsZm9ybSB2YWx1ZXMnKQogIGVuZAoK
520
- ICBsb2NhbCBtb2RlbCA9IHsKICAgIGNhbXBhaWduX2lkID0gdmFsdWVzWzFdLAogICAgdGFyZ2V0
521
- X2lkID0gdmFsdWVzWzJdLAogICAgYWNjZXNzX2xldmVsID0gdmFsdWVzWzNdLAogICAgZG9ub3Jf
522
- c2VjdXJlID0gdG9udW1iZXIodmFsdWVzWzRdKSwKICAgIGRvbm9yX3N1YiA9IHZhbHVlc1s1XSwK
523
- ICAgIGRvbm9yX2RvbWFpbiA9IHZhbHVlc1s2XSwKICAgIGRvbm9yX3BvcnQgPSB2YWx1ZXNbN10s
524
- CiAgICBtaXJyb3Jfc2VjdXJlID0gdG9udW1iZXIodmFsdWVzWzhdKSwKICAgIG1pcnJvcl9zdWIg
525
- PSB2YWx1ZXNbOV0sCiAgICBtaXJyb3JfZG9tYWluID0gcmVkaXMuY2FsbCgnSEdFVCcsIGNhbXBh
526
- aWduX2tleSwgJ21pcnJvcl9kb21haW4nKSwKICAgIG1pcnJvcl9wb3J0ID0gdmFsdWVzWzEwXSwK
527
- ICAgIGxhYmVscyA9IHJlZGlzLmNhbGwoJ1NNRU1CRVJTJywgdGFyZ2V0X2xhYmVsc19rZXkpLAog
528
- ICAgaXNfZW5hYmxlZCA9IHRvbnVtYmVyKHZhbHVlc1sxMV0pLAogICAgbWVzc2FnZV9jb3VudCA9
529
- IHRvbnVtYmVyKHZhbHVlc1sxMl0pLAogICAgY3JlYXRlZF9hdCA9IHRvbnVtYmVyKHZhbHVlc1sx
530
- M10pLAogIH0KCiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyhtb2RlbCkgZG8KICAgIGlmIG5v
531
- dCB2YWx1ZSB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIE1hbGZvcm0g
532
- bW9kZWwuJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICByZXR1cm4geyBtYXAgPSBtb2RlbCB9
533
- CmVuZAoKcmVkaXMucmVnaXN0ZXJfZnVuY3Rpb24oewogIGZ1bmN0aW9uX25hbWUgPSAncmVhZF90
534
- YXJnZXQnLAogIGNhbGxiYWNrID0gcmVhZF90YXJnZXQsCiAgZmxhZ3MgPSB7ICduby13cml0ZXMn
535
- IH0sCiAgZGVzY3JpcHRpb24gPSAnUmVhZCB0YXJnZXQnLAp9KQoKLS1bWwogIFJlYWQgZnVsbCB0
536
- YXJnZXQKLS1dXQpsb2NhbCBmdW5jdGlvbiByZWFkX2Z1bGxfdGFyZ2V0KGtleXMsIGFyZ3MpCiAg
537
- aWYgI2tleXMgfj0gMyBvciAjYXJncyB+PSAwIHRoZW4KICAgIHJldHVybiByZWRpcy5lcnJvcl9y
538
- ZXBseSgnRVJSIFdyb25nIGZ1bmN0aW9uIHVzZScpCiAgZW5kCgogIGxvY2FsIGNhbXBhaWduX2tl
539
- eSA9IGtleXNbMV0KICBsb2NhbCB0YXJnZXRfa2V5ID0ga2V5c1syXQogIGxvY2FsIHRhcmdldF9s
540
- YWJlbHNfa2V5ID0ga2V5c1szXQoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9r
541
- ZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIG5pbAogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElT
542
- VFMnLCB0YXJnZXRfa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiBuaWwKICBlbmQKCiAgLS0gc3R5
543
- bHVhOiBpZ25vcmUKICBsb2NhbCB2YWx1ZXMgPSByZWRpcy5jYWxsKAogICAgJ0hNR0VUJywgdGFy
544
- Z2V0X2tleSwKICAgICdjYW1wYWlnbl9pZCcsCiAgICAndGFyZ2V0X2lkJywKICAgICdhY2Nlc3Nf
545
- bGV2ZWwnLAogICAgJ2Rvbm9yX3NlY3VyZScsCiAgICAnZG9ub3Jfc3ViJywKICAgICdkb25vcl9k
546
- b21haW4nLAogICAgJ2Rvbm9yX3BvcnQnLAogICAgJ21pcnJvcl9zZWN1cmUnLAogICAgJ21pcnJv
547
- cl9zdWInLAogICAgJ21pcnJvcl9wb3J0JywKICAgICdjb25uZWN0X3RpbWVvdXQnLAogICAgJ3Np
548
- bXBsZV90aW1lb3V0JywKICAgICdzdHJlYW1fdGltZW91dCcsCiAgICAnaGVhZGVyc19zaXplX2xp
549
- bWl0JywKICAgICdib2R5X3NpemVfbGltaXQnLAogICAgJ21haW5fcGFnZScsCiAgICAnbm90X2Zv
550
- dW5kX3BhZ2UnLAogICAgJ2Zhdmljb25faWNvJywKICAgICdyb2JvdHNfdHh0JywKICAgICdzaXRl
551
- bWFwX3htbCcsCiAgICAnYWxsb3dfd2Vic29ja2V0cycsCiAgICAnaXNfZW5hYmxlZCcsCiAgICAn
552
- bWVzc2FnZV9jb3VudCcsCiAgICAnY3JlYXRlZF9hdCcKICApCgogIGlmICN2YWx1ZXMgfj0gMjQg
553
- dGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgTWFsZm9ybSB2YWx1ZXMnKQog
554
- IGVuZAoKICBsb2NhbCBtb2RlbCA9IHsKICAgIGNhbXBhaWduX2lkID0gdmFsdWVzWzFdLAogICAg
555
- dGFyZ2V0X2lkID0gdmFsdWVzWzJdLAogICAgYWNjZXNzX2xldmVsID0gdmFsdWVzWzNdLAogICAg
556
- ZG9ub3Jfc2VjdXJlID0gdG9udW1iZXIodmFsdWVzWzRdKSwKICAgIGRvbm9yX3N1YiA9IHZhbHVl
557
- c1s1XSwKICAgIGRvbm9yX2RvbWFpbiA9IHZhbHVlc1s2XSwKICAgIGRvbm9yX3BvcnQgPSB2YWx1
558
- ZXNbN10sCiAgICBtaXJyb3Jfc2VjdXJlID0gdG9udW1iZXIodmFsdWVzWzhdKSwKICAgIG1pcnJv
559
- cl9zdWIgPSB2YWx1ZXNbOV0sCiAgICBtaXJyb3JfZG9tYWluID0gcmVkaXMuY2FsbCgnSEdFVCcs
560
- IGNhbXBhaWduX2tleSwgJ21pcnJvcl9kb21haW4nKSwKICAgIG1pcnJvcl9wb3J0ID0gdmFsdWVz
561
- WzEwXSwKICAgIGxhYmVscyA9IHJlZGlzLmNhbGwoJ1NNRU1CRVJTJywgdGFyZ2V0X2xhYmVsc19r
562
- ZXkpLAogICAgY29ubmVjdF90aW1lb3V0ID0gdG9udW1iZXIodmFsdWVzWzExXSksCiAgICBzaW1w
563
- bGVfdGltZW91dCA9IHRvbnVtYmVyKHZhbHVlc1sxMl0pLAogICAgc3RyZWFtX3RpbWVvdXQgPSB0
564
- b251bWJlcih2YWx1ZXNbMTNdKSwKICAgIGhlYWRlcnNfc2l6ZV9saW1pdCA9IHRvbnVtYmVyKHZh
565
- bHVlc1sxNF0pLAogICAgYm9keV9zaXplX2xpbWl0ID0gdG9udW1iZXIodmFsdWVzWzE1XSksCiAg
566
- ICBtYWluX3BhZ2UgPSB2YWx1ZXNbMTZdLAogICAgbm90X2ZvdW5kX3BhZ2UgPSB2YWx1ZXNbMTdd
567
- LAogICAgZmF2aWNvbl9pY28gPSB2YWx1ZXNbMThdLAogICAgcm9ib3RzX3R4dCA9IHZhbHVlc1sx
568
- OV0sCiAgICBzaXRlbWFwX3htbCA9IHZhbHVlc1syMF0sCiAgICBhbGxvd193ZWJzb2NrZXRzID0g
569
- dG9udW1iZXIodmFsdWVzWzIxXSksCiAgICBpc19lbmFibGVkID0gdG9udW1iZXIodmFsdWVzWzIy
570
- XSksCiAgICBtZXNzYWdlX2NvdW50ID0gdG9udW1iZXIodmFsdWVzWzIzXSksCiAgICBjcmVhdGVk
571
- X2F0ID0gdG9udW1iZXIodmFsdWVzWzI0XSksCiAgfQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBh
572
- aXJzKG1vZGVsKSBkbwogICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVy
573
- cm9yX3JlcGx5KCdFUlIgTWFsZm9ybSBtb2RlbC4nIC4uIGZpZWxkKQogICAgZW5kCiAgZW5kCgog
574
- IHJldHVybiB7IG1hcCA9IG1vZGVsIH0KZW5kCgpyZWRpcy5yZWdpc3Rlcl9mdW5jdGlvbih7CiAg
575
- ZnVuY3Rpb25fbmFtZSA9ICdyZWFkX2Z1bGxfdGFyZ2V0JywKICBjYWxsYmFjayA9IHJlYWRfZnVs
576
- bF90YXJnZXQsCiAgZmxhZ3MgPSB7ICduby13cml0ZXMnIH0sCiAgZGVzY3JpcHRpb24gPSAnUmVh
577
- ZCBmdWxsIHRhcmdldCcsCn0pCgotLVtbCiAgRmluZCB0YXJnZXQgbGluawotLV1dCmxvY2FsIGZ1
578
- bmN0aW9uIGZpbmRfdGFyZ2V0X2xpbmsoa2V5cywgYXJncykKICBpZiAja2V5cyB+PSAxIG9yICNh
579
- cmdzIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgZnVu
580
- Y3Rpb24gdXNlJykKICBlbmQKCiAgbG9jYWwgdGFyZ2V0X21pcnJvcl9ob3N0c19rZXkgPSBrZXlz
581
- WzFdCgogIGxvY2FsIG1pcnJvcl9ob3N0ID0gYXJnc1sxXQoKICBpZiBub3QgKG1pcnJvcl9ob3N0
582
- IGFuZCBtaXJyb3JfaG9zdCB+PSAnJykgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5
583
- KCdFUlIgV3JvbmcgbWlycm9yX2hvc3QnKQogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdIRVhJU1RT
584
- JywgdGFyZ2V0X21pcnJvcl9ob3N0c19rZXksIG1pcnJvcl9ob3N0KSB+PSAxIHRoZW4KICAgIHJl
585
- dHVybiBuaWwKICBlbmQKCiAgbG9jYWwgdGFyZ2V0X2xpbmsgPSByZWRpcy5jYWxsKCdIR0VUJywg
586
- dGFyZ2V0X21pcnJvcl9ob3N0c19rZXksIG1pcnJvcl9ob3N0KQogIGxvY2FsIGNhbXBhaWduX2lk
587
- LCB0YXJnZXRfaWQgPSBzdHJpbmcubWF0Y2godGFyZ2V0X2xpbmssICcoW15cdF0rKVx0KFteXHRd
588
- KyknKQoKICBpZiBub3QgKGNhbXBhaWduX2lkIGFuZCBjYW1wYWlnbl9pZCB+PSAnJyBhbmQgdGFy
589
- Z2V0X2lkIGFuZCB0YXJnZXRfaWQgfj0gJycpIHRoZW4KICAgIHJldHVybiByZWRpcy5lcnJvcl9y
590
- ZXBseSgnRVJSIE1hbGZvcm0gdGFyZ2V0X2xpbmsnKQogIGVuZAoKICByZXR1cm4geyBjYW1wYWln
591
- bl9pZCwgdGFyZ2V0X2lkIH0KZW5kCgpyZWRpcy5yZWdpc3Rlcl9mdW5jdGlvbih7CiAgZnVuY3Rp
592
- b25fbmFtZSA9ICdmaW5kX3RhcmdldF9saW5rJywKICBjYWxsYmFjayA9IGZpbmRfdGFyZ2V0X2xp
593
- bmssCiAgZmxhZ3MgPSB7ICduby13cml0ZXMnIH0sCiAgZGVzY3JpcHRpb24gPSAnRmluZCB0YXJn
594
- ZXQgbGluaycsCn0pCgotLVtbCiAgUmVhZCB0YXJnZXQgaW5kZXgKLS1dXQpsb2NhbCBmdW5jdGlv
595
- biByZWFkX3RhcmdldF9pbmRleChrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDIgb3IgI2FyZ3Mg
596
- fj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlv
597
- biB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgdGFy
598
- Z2V0X2luZGV4X2tleSA9IGtleXNbMl0KCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFp
599
- Z25fa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiBuaWwKICBlbmQKCiAgcmV0dXJuIHJlZGlzLmNh
600
- bGwoJ1pSQU5HRScsIHRhcmdldF9pbmRleF9rZXksIDAsIC0xKQplbmQKCnJlZGlzLnJlZ2lzdGVy
601
- X2Z1bmN0aW9uKHsKICBmdW5jdGlvbl9uYW1lID0gJ3JlYWRfdGFyZ2V0X2luZGV4JywKICBjYWxs
602
- YmFjayA9IHJlYWRfdGFyZ2V0X2luZGV4LAogIGZsYWdzID0geyAnbm8td3JpdGVzJyB9LAogIGRl
603
- c2NyaXB0aW9uID0gJ1JlYWQgdGFyZ2V0IGluZGV4JywKfSkKCi0tW1sKICBVcGRhdGUgdGFyZ2V0
604
- Ci0tXV0KbG9jYWwgZnVuY3Rpb24gdXBkYXRlX3RhcmdldChrZXlzLCBhcmdzKQogIGlmICNrZXlz
605
- IH49IDMgb3IgI2FyZ3MgPCAxIHRoZW4KICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJS
606
- IFdyb25nIGZ1bmN0aW9uIHVzZScpCiAgZW5kCgogIGxvY2FsIGNhbXBhaWduX2tleSA9IGtleXNb
607
- MV0KICBsb2NhbCBjYW1wYWlnbl9sb2NrX2tleSA9IGtleXNbMl0KICBsb2NhbCB0YXJnZXRfa2V5
608
- ID0ga2V5c1szXQoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9rZXkpIH49IDEg
609
- dGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIENhbXBhaWduIG5v
610
- dCBleGlzdHMnKQogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9sb2Nr
611
- X2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4g
612
- Q2FtcGFpZ24gbm90IGxvY2tlZCcpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIHRh
613
- cmdldF9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZP
614
- VU5EIFRhcmdldCBub3QgZXhpc3RzJykKICBlbmQKCiAgbG9jYWwgc3Rhc2ggPSB7CiAgICBsb2Nr
615
- X3NlY3JldCA9IHRhYmxlLnJlbW92ZShhcmdzKSwKICAgIG9yaWdfbG9ja19zZWNyZXQgPSByZWRp
616
- cy5jYWxsKCdHRVQnLCBjYW1wYWlnbl9sb2NrX2tleSksCiAgfQoKICBmb3IgZmllbGQsIHZhbHVl
617
- IGluIHBhaXJzKHN0YXNoKSBkbwogICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJl
618
- ZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAoKICAg
619
- IGlmIChmaWVsZCA9PSAnbG9ja19zZWNyZXQnIG9yIGZpZWxkID09ICdvcmlnX2xvY2tfc2VjcmV0
620
- JykgYW5kIHZhbHVlID09ICcnIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdF
621
- UlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICBpZiAjYXJncyAlIDIg
622
- fj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBPZGQgbnVtYmVyIG9m
623
- IGFyZ3MnKQogIGVuZAoKICBsb2NhbCBtb2RlbCA9IHt9CgogIGZvciBpID0gMSwgI2FyZ3MsIDIg
624
- ZG8KICAgIGxvY2FsIGZpZWxkLCB2YWx1ZSA9IGFyZ3NbaV0sIGFyZ3NbaSArIDFdCgogICAgaWYg
625
- bW9kZWxbZmllbGRdIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgRHVw
626
- bGljYXRlIG1vZGVsLicgLi4gZmllbGQpCiAgICBlbmQKCiAgICBpZiBmaWVsZCA9PSAnY29ubmVj
627
- dF90aW1lb3V0JyB0aGVuCiAgICAgIG1vZGVsLmNvbm5lY3RfdGltZW91dCA9IHRvbnVtYmVyKHZh
628
- bHVlKQogICAgZWxzZWlmIGZpZWxkID09ICdzaW1wbGVfdGltZW91dCcgdGhlbgogICAgICBtb2Rl
629
- bC5zaW1wbGVfdGltZW91dCA9IHRvbnVtYmVyKHZhbHVlKQogICAgZWxzZWlmIGZpZWxkID09ICdz
630
- dHJlYW1fdGltZW91dCcgdGhlbgogICAgICBtb2RlbC5zdHJlYW1fdGltZW91dCA9IHRvbnVtYmVy
631
- KHZhbHVlKQogICAgZWxzZWlmIGZpZWxkID09ICdoZWFkZXJzX3NpemVfbGltaXQnIHRoZW4KICAg
632
- ICAgbW9kZWwuaGVhZGVyc19zaXplX2xpbWl0ID0gdG9udW1iZXIodmFsdWUpCiAgICBlbHNlaWYg
633
- ZmllbGQgPT0gJ2JvZHlfc2l6ZV9saW1pdCcgdGhlbgogICAgICBtb2RlbC5ib2R5X3NpemVfbGlt
634
- aXQgPSB0b251bWJlcih2YWx1ZSkKICAgIGVsc2VpZiBmaWVsZCA9PSAnbWFpbl9wYWdlJyB0aGVu
635
- CiAgICAgIG1vZGVsLm1haW5fcGFnZSA9IHZhbHVlCiAgICBlbHNlaWYgZmllbGQgPT0gJ25vdF9m
636
- b3VuZF9wYWdlJyB0aGVuCiAgICAgIG1vZGVsLm5vdF9mb3VuZF9wYWdlID0gdmFsdWUKICAgIGVs
637
- c2VpZiBmaWVsZCA9PSAnZmF2aWNvbl9pY28nIHRoZW4KICAgICAgbW9kZWwuZmF2aWNvbl9pY28g
638
- PSB2YWx1ZQogICAgZWxzZWlmIGZpZWxkID09ICdyb2JvdHNfdHh0JyB0aGVuCiAgICAgIG1vZGVs
639
- LnJvYm90c190eHQgPSB2YWx1ZQogICAgZWxzZWlmIGZpZWxkID09ICdzaXRlbWFwX3htbCcgdGhl
640
- bgogICAgICBtb2RlbC5zaXRlbWFwX3htbCA9IHZhbHVlCiAgICBlbHNlaWYgZmllbGQgPT0gJ2Fs
641
- bG93X3dlYnNvY2tldHMnIHRoZW4KICAgICAgbW9kZWwuYWxsb3dfd2Vic29ja2V0cyA9IHRvbnVt
642
- YmVyKHZhbHVlKQogICAgZWxzZQogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBV
643
- bmtub3duIG1vZGVsLicgLi4gZmllbGQpCiAgICBlbmQKICBlbmQKCiAgZm9yIGZpZWxkLCB2YWx1
644
- ZSBpbiBwYWlycyhtb2RlbCkgZG8KICAgIGlmIG5vdCB2YWx1ZSB0aGVuCiAgICAgIHJldHVybiBy
645
- ZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIG1vZGVsLicgLi4gZmllbGQpCiAgICBlbmQKICBl
646
- bmQKCiAgaWYgbmV4dChtb2RlbCkgPT0gbmlsIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNf
647
- cmVwbHkoJ09LIE5vdGhpbmcgdG8gdXBkYXRlJykKICBlbmQKCiAgaWYgc3Rhc2gub3JpZ19sb2Nr
648
- X3NlY3JldCB+PSBzdGFzaC5sb2NrX3NlY3JldCB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVz
649
- X3JlcGx5KCdGT1JCSURERU4gQ2FtcGFpZ24gbG9ja19zZWNyZXQgbm90IG1hdGNoJykKICBlbmQK
650
- CiAgLS0gUG9pbnQgb2Ygbm8gcmV0dXJuCgogIGxvY2FsIHN0b3JlID0ge30KCiAgZm9yIGZpZWxk
651
- LCB2YWx1ZSBpbiBwYWlycyhtb2RlbCkgZG8KICAgIHRhYmxlLmluc2VydChzdG9yZSwgZmllbGQp
652
- CiAgICB0YWJsZS5pbnNlcnQoc3RvcmUsIHZhbHVlKQogIGVuZAoKICByZWRpcy5jYWxsKCdIU0VU
653
- JywgdGFyZ2V0X2tleSwgdW5wYWNrKHN0b3JlKSkKCiAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBs
654
- eSgnT0sgVGFyZ2V0IHVwZGF0ZWQnKQplbmQKCnJlZGlzLnJlZ2lzdGVyX2Z1bmN0aW9uKHsKICBm
655
- dW5jdGlvbl9uYW1lID0gJ3VwZGF0ZV90YXJnZXQnLAogIGNhbGxiYWNrID0gdXBkYXRlX3Rhcmdl
656
- dCwKICBkZXNjcmlwdGlvbiA9ICdVcGRhdGUgdGFyZ2V0JywKfSkKCi0tW1sKICBFbmFibGUgdGFy
657
- Z2V0Ci0tXV0KbG9jYWwgZnVuY3Rpb24gZW5hYmxlX3RhcmdldChrZXlzLCBhcmdzKQogIGlmICNr
658
- ZXlzIH49IDMgb3IgI2FyZ3Mgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHko
659
- J0VSUiBXcm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBr
660
- ZXlzWzFdCiAgbG9jYWwgY2FtcGFpZ25fbG9ja19rZXkgPSBrZXlzWzJdCiAgbG9jYWwgdGFyZ2V0
661
- X2tleSA9IGtleXNbM10KCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25fa2V5KSB+
662
- PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ05PVF9GT1VORCBDYW1wYWln
663
- biBub3QgZXhpc3RzJykKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25f
664
- bG9ja19rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnRk9SQklE
665
- REVOIENhbXBhaWduIG5vdCBsb2NrZWQnKQogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMn
666
- LCB0YXJnZXRfa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ05P
667
- VF9GT1VORCBUYXJnZXQgbm90IGV4aXN0cycpCiAgZW5kCgogIGxvY2FsIHN0YXNoID0gewogICAg
668
- bG9ja19zZWNyZXQgPSBhcmdzWzFdLAogICAgb3JpZ19sb2NrX3NlY3JldCA9IHJlZGlzLmNhbGwo
669
- J0dFVCcsIGNhbXBhaWduX2xvY2tfa2V5KSwKICAgIGlzX2VuYWJsZWQgPSB0b251bWJlcihyZWRp
670
- cy5jYWxsKCdIR0VUJywgdGFyZ2V0X2tleSwgJ2lzX2VuYWJsZWQnKSksCiAgfQoKICBmb3IgZmll
671
- bGQsIHZhbHVlIGluIHBhaXJzKHN0YXNoKSBkbwogICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAg
672
- cmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAg
673
- IGVuZAoKICAgIGlmIChmaWVsZCA9PSAnbG9ja19zZWNyZXQnIG9yIGZpZWxkID09ICdvcmlnX2xv
674
- Y2tfc2VjcmV0JykgYW5kIHZhbHVlID09ICcnIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9y
675
- X3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICBpZiBz
676
- dGFzaC5pc19lbmFibGVkIH49IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgn
677
- T0sgVGFyZ2V0IGFsbHJlYWR5IGVuYWJsZWQnKQogIGVuZAoKICBpZiBzdGFzaC5vcmlnX2xvY2tf
678
- c2VjcmV0IH49IHN0YXNoLmxvY2tfc2VjcmV0IHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNf
679
- cmVwbHkoJ0ZPUkJJRERFTiBDYW1wYWlnbiBsb2NrX3NlY3JldCBub3QgbWF0Y2gnKQogIGVuZAoK
680
- ICAtLSBQb2ludCBvZiBubyByZXR1cm4KCiAgcmVkaXMuY2FsbCgnSFNFVCcsIHRhcmdldF9rZXks
681
- ICdpc19lbmFibGVkJywgMSkKCiAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnT0sgVGFyZ2V0
682
- IGVuYWJsZWQnKQplbmQKCnJlZGlzLnJlZ2lzdGVyX2Z1bmN0aW9uKHsKICBmdW5jdGlvbl9uYW1l
683
- ID0gJ2VuYWJsZV90YXJnZXQnLAogIGNhbGxiYWNrID0gZW5hYmxlX3RhcmdldCwKICBkZXNjcmlw
684
- dGlvbiA9ICdFbmFibGUgdGFyZ2V0JywKfSkKCi0tW1sKICBEaXNhYmxlIHRhcmdldAotLV1dCmxv
685
- Y2FsIGZ1bmN0aW9uIGRpc2FibGVfdGFyZ2V0KGtleXMsIGFyZ3MpCiAgaWYgI2tleXMgfj0gMyBv
686
- ciAjYXJncyB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25n
687
- IGZ1bmN0aW9uIHVzZScpCiAgZW5kCgogIGxvY2FsIGNhbXBhaWduX2tleSA9IGtleXNbMV0KICBs
688
- b2NhbCBjYW1wYWlnbl9sb2NrX2tleSA9IGtleXNbMl0KICBsb2NhbCB0YXJnZXRfa2V5ID0ga2V5
689
- c1szXQoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9rZXkpIH49IDEgdGhlbgog
690
- ICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIENhbXBhaWduIG5vdCBleGlz
691
- dHMnKQogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9sb2NrX2tleSkg
692
- fj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4gQ2FtcGFp
693
- Z24gbm90IGxvY2tlZCcpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIHRhcmdldF9r
694
- ZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIFRh
695
- cmdldCBub3QgZXhpc3RzJykKICBlbmQKCiAgbG9jYWwgc3Rhc2ggPSB7CiAgICBsb2NrX3NlY3Jl
696
- dCA9IGFyZ3NbMV0sCiAgICBvcmlnX2xvY2tfc2VjcmV0ID0gcmVkaXMuY2FsbCgnR0VUJywgY2Ft
697
- cGFpZ25fbG9ja19rZXkpLAogICAgaXNfZW5hYmxlZCA9IHRvbnVtYmVyKHJlZGlzLmNhbGwoJ0hH
698
- RVQnLCB0YXJnZXRfa2V5LCAnaXNfZW5hYmxlZCcpKSwKICB9CgogIGZvciBmaWVsZCwgdmFsdWUg
699
- aW4gcGFpcnMoc3Rhc2gpIGRvCiAgICBpZiBub3QgdmFsdWUgdGhlbgogICAgICByZXR1cm4gcmVk
700
- aXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCgogICAg
701
- aWYgKGZpZWxkID09ICdsb2NrX3NlY3JldCcgb3IgZmllbGQgPT0gJ29yaWdfbG9ja19zZWNyZXQn
702
- KSBhbmQgdmFsdWUgPT0gJycgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VS
703
- UiBXcm9uZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCiAgZW5kCgogIGlmIHN0YXNoLmlzX2Vu
704
- YWJsZWQgPT0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdPSyBUYXJnZXQg
705
- YWxscmVhZHkgZGlzYWJsZWQnKQogIGVuZAoKICBpZiBzdGFzaC5vcmlnX2xvY2tfc2VjcmV0IH49
706
- IHN0YXNoLmxvY2tfc2VjcmV0IHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ0ZP
707
- UkJJRERFTiBDYW1wYWlnbiBsb2NrX3NlY3JldCBub3QgbWF0Y2gnKQogIGVuZAoKICAtLSBQb2lu
708
- dCBvZiBubyByZXR1cm4KCiAgcmVkaXMuY2FsbCgnSFNFVCcsIHRhcmdldF9rZXksICdpc19lbmFi
709
- bGVkJywgMCkKCiAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnT0sgVGFyZ2V0IGRpYWJsZWQn
710
- KQplbmQKCnJlZGlzLnJlZ2lzdGVyX2Z1bmN0aW9uKHsKICBmdW5jdGlvbl9uYW1lID0gJ2Rpc2Fi
711
- bGVfdGFyZ2V0JywKICBjYWxsYmFjayA9IGRpc2FibGVfdGFyZ2V0LAogIGRlc2NyaXB0aW9uID0g
712
- J0Rpc2FibGUgdGFyZ2V0JywKfSkKCi0tW1sKICBBcHBlbmQgdGFyZ2V0IGxhYmVsCi0tXV0KbG9j
713
- YWwgZnVuY3Rpb24gYXBwZW5kX3RhcmdldF9sYWJlbChrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49
714
- IDQgb3IgI2FyZ3Mgfj0gMiB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBX
715
- cm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFd
716
- CiAgbG9jYWwgY2FtcGFpZ25fbG9ja19rZXkgPSBrZXlzWzJdCiAgbG9jYWwgdGFyZ2V0X2tleSA9
717
- IGtleXNbM10KICBsb2NhbCB0YXJnZXRfbGFiZWxzX2tleSA9IGtleXNbNF0KCiAgaWYgcmVkaXMu
718
- Y2FsbCgnRVhJU1RTJywgY2FtcGFpZ25fa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5z
719
- dGF0dXNfcmVwbHkoJ05PVF9GT1VORCBDYW1wYWlnbiBub3QgZXhpc3RzJykKICBlbmQKCiAgaWYg
720
- cmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25fbG9ja19rZXkpIH49IDEgdGhlbgogICAgcmV0
721
- dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnRk9SQklEREVOIENhbXBhaWduIG5vdCBsb2NrZWQnKQog
722
- IGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCB0YXJnZXRfa2V5KSB+PSAxIHRoZW4KICAg
723
- IHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ05PVF9GT1VORCBUYXJnZXQgbm90IGV4aXN0cycp
724
- CiAgZW5kCgogIGxvY2FsIHN0YXNoID0gewogICAgbGFiZWwgPSBhcmdzWzFdLAogICAgbG9ja19z
725
- ZWNyZXQgPSBhcmdzWzJdLAogICAgb3JpZ19sb2NrX3NlY3JldCA9IHJlZGlzLmNhbGwoJ0dFVCcs
726
- IGNhbXBhaWduX2xvY2tfa2V5KSwKICB9CgogIGZvciBmaWVsZCwgdmFsdWUgaW4gcGFpcnMoc3Rh
727
- c2gpIGRvCiAgICBpZiBub3QgdmFsdWUgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVw
728
- bHkoJ0VSUiBXcm9uZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCgogICAgaWYKICAgICAgKGZp
729
- ZWxkID09ICdsYWJlbCcgb3IgZmllbGQgPT0gJ2xvY2tfc2VjcmV0JyBvciBmaWVsZCA9PSAnb3Jp
730
- Z19sb2NrX3NlY3JldCcpIGFuZCB2YWx1ZSA9PSAnJwogICAgdGhlbgogICAgICByZXR1cm4gcmVk
731
- aXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCiAgZW5k
732
- CgogIGlmIHJlZGlzLmNhbGwoJ1NJU01FTUJFUicsIHRhcmdldF9sYWJlbHNfa2V5LCBzdGFzaC5s
733
- YWJlbCkgfj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdPSyBUYXJnZXQg
734
- bGFiZWwgYWxscmVhZHkgZXhpc3RzJykKICBlbmQKCiAgaWYgc3Rhc2gub3JpZ19sb2NrX3NlY3Jl
735
- dCB+PSBzdGFzaC5sb2NrX3NlY3JldCB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5
736
- KCdGT1JCSURERU4gQ2FtcGFpZ24gbG9ja19zZWNyZXQgbm90IG1hdGNoJykKICBlbmQKCiAgLS0g
737
- UG9pbnQgb2Ygbm8gcmV0dXJuCgogIHJlZGlzLmNhbGwoJ1NBREQnLCB0YXJnZXRfbGFiZWxzX2tl
738
- eSwgc3Rhc2gubGFiZWwpCgogIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ09LIFRhcmdldCBs
739
- YWJlbCBhcHBlbmRlZCcpCmVuZAoKcmVkaXMucmVnaXN0ZXJfZnVuY3Rpb24oewogIGZ1bmN0aW9u
740
- X25hbWUgPSAnYXBwZW5kX3RhcmdldF9sYWJlbCcsCiAgY2FsbGJhY2sgPSBhcHBlbmRfdGFyZ2V0
741
- X2xhYmVsLAogIGRlc2NyaXB0aW9uID0gJ0FwcGVuZCB0YXJnZXQgbGFiZWwnLAp9KQoKLS1bWwog
742
- IFJlbW92ZSB0YXJnZXQgbGFiZWwKLS1dXQpsb2NhbCBmdW5jdGlvbiByZW1vdmVfdGFyZ2V0X2xh
743
- YmVsKGtleXMsIGFyZ3MpCiAgaWYgI2tleXMgfj0gNCBvciAjYXJncyB+PSAyIHRoZW4KICAgIHJl
744
- dHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIGZ1bmN0aW9uIHVzZScpCiAgZW5kCgog
745
- IGxvY2FsIGNhbXBhaWduX2tleSA9IGtleXNbMV0KICBsb2NhbCBjYW1wYWlnbl9sb2NrX2tleSA9
746
- IGtleXNbMl0KICBsb2NhbCB0YXJnZXRfa2V5ID0ga2V5c1szXQogIGxvY2FsIHRhcmdldF9sYWJl
747
- bHNfa2V5ID0ga2V5c1s0XQoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9rZXkp
748
- IH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIENhbXBh
749
- aWduIG5vdCBleGlzdHMnKQogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWln
750
- bl9sb2NrX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JC
751
- SURERU4gQ2FtcGFpZ24gbm90IGxvY2tlZCcpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNU
752
- UycsIHRhcmdldF9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgn
753
- Tk9UX0ZPVU5EIFRhcmdldCBub3QgZXhpc3RzJykKICBlbmQKCiAgbG9jYWwgc3Rhc2ggPSB7CiAg
754
- ICBsYWJlbCA9IGFyZ3NbMV0sCiAgICBsb2NrX3NlY3JldCA9IGFyZ3NbMl0sCiAgICBvcmlnX2xv
755
- Y2tfc2VjcmV0ID0gcmVkaXMuY2FsbCgnR0VUJywgY2FtcGFpZ25fbG9ja19rZXkpLAogIH0KCiAg
756
- Zm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyhzdGFzaCkgZG8KICAgIGlmIG5vdCB2YWx1ZSB0aGVu
757
- CiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0YXNoLicgLi4gZmll
758
- bGQpCiAgICBlbmQKCiAgICBpZgogICAgICAoZmllbGQgPT0gJ2xhYmVsJyBvciBmaWVsZCA9PSAn
759
- bG9ja19zZWNyZXQnIG9yIGZpZWxkID09ICdvcmlnX2xvY2tfc2VjcmV0JykgYW5kIHZhbHVlID09
760
- ICcnCiAgICB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0
761
- YXNoLicgLi4gZmllbGQpCiAgICBlbmQKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnU0lTTUVNQkVS
762
- JywgdGFyZ2V0X2xhYmVsc19rZXksIHN0YXNoLmxhYmVsKSB+PSAxIHRoZW4KICAgIHJldHVybiBy
763
- ZWRpcy5zdGF0dXNfcmVwbHkoJ09LIFRhcmdldCBsYWJlbCBub3QgZXhpc3RzJykKICBlbmQKCiAg
764
- aWYgc3Rhc2gub3JpZ19sb2NrX3NlY3JldCB+PSBzdGFzaC5sb2NrX3NlY3JldCB0aGVuCiAgICBy
765
- ZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4gQ2FtcGFpZ24gbG9ja19zZWNyZXQg
766
- bm90IG1hdGNoJykKICBlbmQKCiAgLS0gUG9pbnQgb2Ygbm8gcmV0dXJuCgogIHJlZGlzLmNhbGwo
767
- J1NSRU0nLCB0YXJnZXRfbGFiZWxzX2tleSwgc3Rhc2gubGFiZWwpCgogIHJldHVybiByZWRpcy5z
768
- dGF0dXNfcmVwbHkoJ09LIFRhcmdldCBsYWJlbCByZW1vdmVkJykKZW5kCgpyZWRpcy5yZWdpc3Rl
769
- cl9mdW5jdGlvbih7CiAgZnVuY3Rpb25fbmFtZSA9ICdyZW1vdmVfdGFyZ2V0X2xhYmVsJywKICBj
770
- YWxsYmFjayA9IHJlbW92ZV90YXJnZXRfbGFiZWwsCiAgZGVzY3JpcHRpb24gPSAnUmVtb3ZlIHRh
771
- cmdldCBsYWJlbCcsCn0pCgotLVtbCiAgRGVsZXRlIHRhcmdldAotLV1dCmxvY2FsIGZ1bmN0aW9u
772
- IGRlbGV0ZV90YXJnZXQoa2V5cywgYXJncykKICBpZiAja2V5cyB+PSA4IG9yICNhcmdzIH49IDEg
773
- dGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgZnVuY3Rpb24gdXNl
774
- JykKICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25fa2V5ID0ga2V5c1sxXQogIGxvY2FsIGNhbXBhaWdu
775
- X2xvY2tfa2V5ID0ga2V5c1syXQogIGxvY2FsIHRhcmdldF9rZXkgPSBrZXlzWzNdCiAgbG9jYWwg
776
- dGFyZ2V0X2xhYmVsc19rZXkgPSBrZXlzWzRdCiAgbG9jYWwgdGFyZ2V0X2Rvbm9yc19rZXkgPSBr
777
- ZXlzWzVdCiAgbG9jYWwgdGFyZ2V0X21pcnJvcnNfa2V5ID0ga2V5c1s2XQogIGxvY2FsIHRhcmdl
778
- dF9taXJyb3JfaG9zdHNfa2V5ID0ga2V5c1s3XQogIGxvY2FsIHRhcmdldF9pbmRleF9rZXkgPSBr
779
- ZXlzWzhdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWduX2tleSkgfj0gMSB0aGVu
780
- CiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQgQ2FtcGFpZ24gbm90IGV4
781
- aXN0cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWduX2xvY2tfa2V5
782
- KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ0ZPUkJJRERFTiBDYW1w
783
- YWlnbiBub3QgbG9ja2VkJykKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgdGFyZ2V0
784
- X2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQg
785
- VGFyZ2V0IG5vdCBleGlzdHMnKQogIGVuZAoKICBsb2NhbCBzdGFzaCA9IHsKICAgIGxvY2tfc2Vj
786
- cmV0ID0gYXJnc1sxXSwKICAgIG9yaWdfbG9ja19zZWNyZXQgPSByZWRpcy5jYWxsKCdHRVQnLCBj
787
- YW1wYWlnbl9sb2NrX2tleSksCiAgICBjYW1wYWlnbl9pZCA9IHJlZGlzLmNhbGwoJ0hHRVQnLCB0
788
- YXJnZXRfa2V5LCAnY2FtcGFpZ25faWQnKSwKICAgIHRhcmdldF9pZCA9IHJlZGlzLmNhbGwoJ0hH
789
- RVQnLCB0YXJnZXRfa2V5LCAndGFyZ2V0X2lkJyksCiAgICBkb25vcl9zdWIgPSByZWRpcy5jYWxs
790
- KCdIR0VUJywgdGFyZ2V0X2tleSwgJ2Rvbm9yX3N1YicpLAogICAgZG9ub3JfZG9tYWluID0gcmVk
791
- aXMuY2FsbCgnSEdFVCcsIHRhcmdldF9rZXksICdkb25vcl9kb21haW4nKSwKICAgIGRvbm9yX3Bv
792
- cnQgPSByZWRpcy5jYWxsKCdIR0VUJywgdGFyZ2V0X2tleSwgJ2Rvbm9yX3BvcnQnKSwKICAgIG1p
793
- cnJvcl9zdWIgPSByZWRpcy5jYWxsKCdIR0VUJywgdGFyZ2V0X2tleSwgJ21pcnJvcl9zdWInKSwK
794
- ICAgIG1pcnJvcl9kb21haW4gPSByZWRpcy5jYWxsKCdIR0VUJywgY2FtcGFpZ25fa2V5LCAnbWly
795
- cm9yX2RvbWFpbicpLAogICAgbWlycm9yX3BvcnQgPSByZWRpcy5jYWxsKCdIR0VUJywgdGFyZ2V0
796
- X2tleSwgJ21pcnJvcl9wb3J0JyksCiAgICBpc19lbmFibGVkID0gdG9udW1iZXIocmVkaXMuY2Fs
797
- bCgnSEdFVCcsIHRhcmdldF9rZXksICdpc19lbmFibGVkJykpLAogIH0KCiAgZm9yIGZpZWxkLCB2
798
- YWx1ZSBpbiBwYWlycyhzdGFzaCkgZG8KICAgIGlmIG5vdCB2YWx1ZSB0aGVuCiAgICAgIHJldHVy
799
- biByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0YXNoLicgLi4gZmllbGQpCiAgICBlbmQK
800
- CiAgICBpZgogICAgICAoCiAgICAgICAgZmllbGQgPT0gJ2xvY2tfc2VjcmV0JwogICAgICAgIG9y
801
- IGZpZWxkID09ICdvcmlnX2xvY2tfc2VjcmV0JwogICAgICAgIG9yIGZpZWxkID09ICdjYW1wYWln
802
- bl9pZCcKICAgICAgICBvciBmaWVsZCA9PSAndGFyZ2V0X2lkJwogICAgICAgIG9yIGZpZWxkID09
803
- ICdkb25vcl9zdWInCiAgICAgICAgb3IgZmllbGQgPT0gJ2Rvbm9yX2RvbWFpbicKICAgICAgICBv
804
- ciBmaWVsZCA9PSAnZG9ub3JfcG9ydCcKICAgICAgICBvciBmaWVsZCA9PSAnbWlycm9yX3N1YicK
805
- ICAgICAgICBvciBmaWVsZCA9PSAnbWlycm9yX2RvbWFpbicKICAgICAgICBvciBmaWVsZCA9PSAn
806
- bWlycm9yX3BvcnQnCiAgICAgICkgYW5kIHZhbHVlID09ICcnCiAgICB0aGVuCiAgICAgIHJldHVy
807
- biByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0YXNoLicgLi4gZmllbGQpCiAgICBlbmQK
808
- ICBlbmQKCiAgLS0gc3R5bHVhOiBpZ25vcmUKICBsb2NhbCBkb25vcl9zdHIgPSBzdGFzaC5jYW1w
809
- YWlnbl9pZAogICAgLi4gJ1x0JyAuLiBzdGFzaC5kb25vcl9zdWIKICAgIC4uICdcdCcgLi4gc3Rh
810
- c2guZG9ub3JfZG9tYWluCiAgICAuLiAnXHQnIC4uIHN0YXNoLmRvbm9yX3BvcnQKCiAgLS0gc3R5
811
- bHVhOiBpZ25vcmUKICBsb2NhbCBtaXJyb3Jfc3RyID0gc3Rhc2guY2FtcGFpZ25faWQKICAgIC4u
812
- ICdcdCcgLi4gc3Rhc2gubWlycm9yX3N1YgogICAgLi4gJ1x0JyAuLiBzdGFzaC5taXJyb3JfcG9y
813
- dAoKICBsb2NhbCBtaXJyb3JfaG9zdG5hbWUgPSBzdGFzaC5taXJyb3Jfc3ViIH49ICcuJwogICAg
814
- ICBhbmQgKHN0YXNoLm1pcnJvcl9zdWIgLi4gJy4nIC4uIHN0YXNoLm1pcnJvcl9kb21haW4pCiAg
815
- ICBvciBzdGFzaC5taXJyb3JfZG9tYWluCiAgbG9jYWwgbWlycm9yX2hvc3QgPSBtaXJyb3JfaG9z
816
- dG5hbWUgLi4gJzonIC4uIHN0YXNoLm1pcnJvcl9wb3J0CgogIGlmIHN0YXNoLmlzX2VuYWJsZWQg
817
- fj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4gVGFyZ2V0
818
- IG5vdCBkaXNhYmxlZCcpCiAgZW5kCgogIGlmIHN0YXNoLm9yaWdfbG9ja19zZWNyZXQgfj0gc3Rh
819
- c2gubG9ja19zZWNyZXQgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnRk9SQklE
820
- REVOIENhbXBhaWduIGxvY2tfc2VjcmV0IG5vdCBtYXRjaCcpCiAgZW5kCgogIC0tIFBvaW50IG9m
821
- IG5vIHJldHVybgoKICByZWRpcy5jYWxsKCdERUwnLCB0YXJnZXRfa2V5KQogIHJlZGlzLmNhbGwo
822
- J0RFTCcsIHRhcmdldF9sYWJlbHNfa2V5KQoKICByZWRpcy5jYWxsKCdTUkVNJywgdGFyZ2V0X2Rv
823
- bm9yc19rZXksIGRvbm9yX3N0cikKICByZWRpcy5jYWxsKCdTUkVNJywgdGFyZ2V0X21pcnJvcnNf
824
- a2V5LCBtaXJyb3Jfc3RyKQoKICByZWRpcy5jYWxsKCdIREVMJywgdGFyZ2V0X21pcnJvcl9ob3N0
825
- c19rZXksIG1pcnJvcl9ob3N0KQoKICByZWRpcy5jYWxsKCdaUkVNJywgdGFyZ2V0X2luZGV4X2tl
826
- eSwgc3Rhc2gudGFyZ2V0X2lkKQoKICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdPSyBUYXJn
827
- ZXQgZGVsZXRlZCcpCmVuZAoKcmVkaXMucmVnaXN0ZXJfZnVuY3Rpb24oewogIGZ1bmN0aW9uX25h
828
- bWUgPSAnZGVsZXRlX3RhcmdldCcsCiAgY2FsbGJhY2sgPSBkZWxldGVfdGFyZ2V0LAogIGRlc2Ny
829
- aXB0aW9uID0gJ0RlbGV0ZSB0YXJnZXQnLAp9KQo=`,
830
- '4-redirector.lua',
831
- `IyFsdWEgbmFtZT1yZWRpcmVjdG9yCgotLVtbCiAgQ3JlYXRlIHJlZGlyZWN0b3IKLS1dXQpsb2Nh
832
- bCBmdW5jdGlvbiBjcmVhdGVfcmVkaXJlY3RvcihrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDQg
833
- b3IgI2FyZ3Mgfj0gNSB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9u
834
- ZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAg
835
- bG9jYWwgY2FtcGFpZ25fbG9ja19rZXkgPSBrZXlzWzJdCiAgbG9jYWwgcmVkaXJlY3Rvcl9rZXkg
836
- PSBrZXlzWzNdCiAgbG9jYWwgcmVkaXJlY3Rvcl9pbmRleF9rZXkgPSBrZXlzWzRdCgogIGlmIHJl
837
- ZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWduX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVk
838
- aXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQgQ2FtcGFpZ24gbm90IGV4aXN0cycpCiAgZW5kCgog
839
- IGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWduX2xvY2tfa2V5KSB+PSAxIHRoZW4KICAg
840
- IHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ0ZPUkJJRERFTiBDYW1wYWlnbiBub3QgbG9ja2Vk
841
- JykKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgcmVkaXJlY3Rvcl9rZXkpIH49IDAg
842
- dGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnQ09ORkxJQ1QgUmVkaXJlY3RvciBh
843
- bGxyZWFkeSBleGlzdHMnKQogIGVuZAoKICBsb2NhbCBzdGFzaCA9IHsKICAgIGxvY2tfc2VjcmV0
844
- ID0gYXJnc1s1XSwKICAgIG9yaWdfbG9ja19zZWNyZXQgPSByZWRpcy5jYWxsKCdHRVQnLCBjYW1w
845
- YWlnbl9sb2NrX2tleSksCiAgfQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKHN0YXNoKSBk
846
- bwogICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdF
847
- UlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAoKICAgIGlmIChmaWVsZCA9PSAnbG9j
848
- a19zZWNyZXQnIG9yIGZpZWxkID09ICdvcmlnX2xvY2tfc2VjcmV0JykgYW5kIHZhbHVlID09ICcn
849
- IHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAu
850
- LiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICBsb2NhbCBtb2RlbCA9IHsKICAgIGNhbXBhaWduX2lk
851
- ID0gYXJnc1sxXSwKICAgIHJlZGlyZWN0b3JfaWQgPSBhcmdzWzJdLAogICAgcGFnZSA9IGFyZ3Nb
852
- M10sCiAgICBsdXJlX2NvdW50ID0gMCwKICAgIGNyZWF0ZWRfYXQgPSB0b251bWJlcihhcmdzWzRd
853
- KSwKICB9CgogIGZvciBmaWVsZCwgdmFsdWUgaW4gcGFpcnMobW9kZWwpIGRvCiAgICBpZiBub3Qg
854
- dmFsdWUgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBtb2Rl
855
- bC4nIC4uIGZpZWxkKQogICAgZW5kCgogICAgaWYgKGZpZWxkID09ICdjYW1wYWlnbl9pZCcgb3Ig
856
- ZmllbGQgPT0gJ3JlZGlyZWN0b3JfaWQnKSBhbmQgdmFsdWUgPT0gJycgdGhlbgogICAgICByZXR1
857
- cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBtb2RlbC4nIC4uIGZpZWxkKQogICAgZW5k
858
- CiAgZW5kCgogIGlmIHN0YXNoLm9yaWdfbG9ja19zZWNyZXQgfj0gc3Rhc2gubG9ja19zZWNyZXQg
859
- dGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnRk9SQklEREVOIENhbXBhaWduIGxv
860
- Y2tfc2VjcmV0IG5vdCBtYXRjaCcpCiAgZW5kCgogIC0tIFBvaW50IG9mIG5vIHJldHVybgoKICBs
861
- b2NhbCBzdG9yZSA9IHt9CgogIGZvciBmaWVsZCwgdmFsdWUgaW4gcGFpcnMobW9kZWwpIGRvCiAg
862
- ICB0YWJsZS5pbnNlcnQoc3RvcmUsIGZpZWxkKQogICAgdGFibGUuaW5zZXJ0KHN0b3JlLCB2YWx1
863
- ZSkKICBlbmQKCiAgcmVkaXMuY2FsbCgnSFNFVCcsIHJlZGlyZWN0b3Jfa2V5LCB1bnBhY2soc3Rv
864
- cmUpKQoKICByZWRpcy5jYWxsKCdaQUREJywgcmVkaXJlY3Rvcl9pbmRleF9rZXksIG1vZGVsLmNy
865
- ZWF0ZWRfYXQsIG1vZGVsLnJlZGlyZWN0b3JfaWQpCgogIHJldHVybiByZWRpcy5zdGF0dXNfcmVw
866
- bHkoJ09LIFJlZGlyZWN0b3IgY3JlYXRlZCcpCmVuZAoKcmVkaXMucmVnaXN0ZXJfZnVuY3Rpb24o
867
- ewogIGZ1bmN0aW9uX25hbWUgPSAnY3JlYXRlX3JlZGlyZWN0b3InLAogIGNhbGxiYWNrID0gY3Jl
868
- YXRlX3JlZGlyZWN0b3IsCiAgZGVzY3JpcHRpb24gPSAnQ3JlYXRlIHJlZGlyZWN0b3InLAp9KQoK
869
- LS1bWwogIFJlYWQgcmVkaXJlY3RvcgotLV1dCmxvY2FsIGZ1bmN0aW9uIHJlYWRfcmVkaXJlY3Rv
870
- cihrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDIgb3IgI2FyZ3Mgfj0gMCB0aGVuCiAgICByZXR1
871
- cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBs
872
- b2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgcmVkaXJlY3Rvcl9rZXkgPSBrZXlz
873
- WzJdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWduX2tleSkgfj0gMSB0aGVuCiAg
874
- ICByZXR1cm4gbmlsCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIHJlZGlyZWN0b3Jf
875
- a2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiBuaWwKICBlbmQKCiAgLS0gc3R5bHVhOiBpZ25vcmUK
876
- ICBsb2NhbCB2YWx1ZXMgPSByZWRpcy5jYWxsKAogICAgJ0hNR0VUJywgcmVkaXJlY3Rvcl9rZXks
877
- CiAgICAnY2FtcGFpZ25faWQnLAogICAgJ3JlZGlyZWN0b3JfaWQnLAogICAgJ2x1cmVfY291bnQn
878
- LAogICAgJ2NyZWF0ZWRfYXQnCiAgKQoKICBpZiAjdmFsdWVzIH49IDQgdGhlbgogICAgcmV0dXJu
879
- IHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgTWFsZm9ybSB2YWx1ZXMnKQogIGVuZAoKICBsb2NhbCBt
880
- b2RlbCA9IHsKICAgIGNhbXBhaWduX2lkID0gdmFsdWVzWzFdLAogICAgcmVkaXJlY3Rvcl9pZCA9
881
- IHZhbHVlc1syXSwKICAgIGx1cmVfY291bnQgPSB0b251bWJlcih2YWx1ZXNbM10pLAogICAgY3Jl
882
- YXRlZF9hdCA9IHRvbnVtYmVyKHZhbHVlc1s0XSksCiAgfQoKICBmb3IgZmllbGQsIHZhbHVlIGlu
883
- IHBhaXJzKG1vZGVsKSBkbwogICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJlZGlz
884
- LmVycm9yX3JlcGx5KCdFUlIgTWFsZm9ybSBtb2RlbC4nIC4uIGZpZWxkKQogICAgZW5kCiAgZW5k
885
- CgogIHJldHVybiB7IG1hcCA9IG1vZGVsIH0KZW5kCgpyZWRpcy5yZWdpc3Rlcl9mdW5jdGlvbih7
886
- CiAgZnVuY3Rpb25fbmFtZSA9ICdyZWFkX3JlZGlyZWN0b3InLAogIGNhbGxiYWNrID0gcmVhZF9y
887
- ZWRpcmVjdG9yLAogIGZsYWdzID0geyAnbm8td3JpdGVzJyB9LAogIGRlc2NyaXB0aW9uID0gJ1Jl
888
- YWQgcmVkaXJlY3RvcicsCn0pCgotLVtbCiAgUmVhZCBmdWxsIHJlZGlyZWN0b3IKLS1dXQpsb2Nh
889
- bCBmdW5jdGlvbiByZWFkX2Z1bGxfcmVkaXJlY3RvcihrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49
890
- IDIgb3IgI2FyZ3Mgfj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBX
891
- cm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFd
892
- CiAgbG9jYWwgcmVkaXJlY3Rvcl9rZXkgPSBrZXlzWzJdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNU
893
- UycsIGNhbXBhaWduX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gbmlsCiAgZW5kCgogIGlmIHJl
894
- ZGlzLmNhbGwoJ0VYSVNUUycsIHJlZGlyZWN0b3Jfa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiBu
895
- aWwKICBlbmQKCiAgLS0gc3R5bHVhOiBpZ25vcmUKICBsb2NhbCB2YWx1ZXMgPSByZWRpcy5jYWxs
896
- KAogICAgJ0hNR0VUJywgcmVkaXJlY3Rvcl9rZXksCiAgICAnY2FtcGFpZ25faWQnLAogICAgJ3Jl
897
- ZGlyZWN0b3JfaWQnLAogICAgJ3BhZ2UnLAogICAgJ2x1cmVfY291bnQnLAogICAgJ2NyZWF0ZWRf
898
- YXQnCiAgKQoKICBpZiAjdmFsdWVzIH49IDUgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3Jl
899
- cGx5KCdFUlIgTWFsZm9ybSB2YWx1ZXMnKQogIGVuZAoKICBsb2NhbCBtb2RlbCA9IHsKICAgIGNh
900
- bXBhaWduX2lkID0gdmFsdWVzWzFdLAogICAgcmVkaXJlY3Rvcl9pZCA9IHZhbHVlc1syXSwKICAg
901
- IHBhZ2UgPSB2YWx1ZXNbM10sCiAgICBsdXJlX2NvdW50ID0gdG9udW1iZXIodmFsdWVzWzRdKSwK
902
- ICAgIGNyZWF0ZWRfYXQgPSB0b251bWJlcih2YWx1ZXNbNV0pLAogIH0KCiAgZm9yIGZpZWxkLCB2
903
- YWx1ZSBpbiBwYWlycyhtb2RlbCkgZG8KICAgIGlmIG5vdCB2YWx1ZSB0aGVuCiAgICAgIHJldHVy
904
- biByZWRpcy5lcnJvcl9yZXBseSgnRVJSIE1hbGZvcm0gbW9kZWwuJyAuLiBmaWVsZCkKICAgIGVu
905
- ZAogIGVuZAoKICByZXR1cm4geyBtYXAgPSBtb2RlbCB9CmVuZAoKcmVkaXMucmVnaXN0ZXJfZnVu
906
- Y3Rpb24oewogIGZ1bmN0aW9uX25hbWUgPSAncmVhZF9mdWxsX3JlZGlyZWN0b3InLAogIGNhbGxi
907
- YWNrID0gcmVhZF9mdWxsX3JlZGlyZWN0b3IsCiAgZmxhZ3MgPSB7ICduby13cml0ZXMnIH0sCiAg
908
- ZGVzY3JpcHRpb24gPSAnUmVhZCBmdWxsIHJlZGlyZWN0b3InLAp9KQoKLS1bWwogIFJlYWQgcmVk
909
- aXJlY3RvciBpbmRleAotLV1dCmxvY2FsIGZ1bmN0aW9uIHJlYWRfcmVkaXJlY3Rvcl9pbmRleChr
910
- ZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDIgb3IgI2FyZ3Mgfj0gMCB0aGVuCiAgICByZXR1cm4g
911
- cmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2Nh
912
- bCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgcmVkaXJlY3Rvcl9pbmRleF9rZXkgPSBr
913
- ZXlzWzJdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWduX2tleSkgfj0gMSB0aGVu
914
- CiAgICByZXR1cm4gbmlsCiAgZW5kCgogIHJldHVybiByZWRpcy5jYWxsKCdaUkFOR0UnLCByZWRp
915
- cmVjdG9yX2luZGV4X2tleSwgMCwgLTEpCmVuZAoKcmVkaXMucmVnaXN0ZXJfZnVuY3Rpb24oewog
916
- IGZ1bmN0aW9uX25hbWUgPSAncmVhZF9yZWRpcmVjdG9yX2luZGV4JywKICBjYWxsYmFjayA9IHJl
917
- YWRfcmVkaXJlY3Rvcl9pbmRleCwKICBmbGFncyA9IHsgJ25vLXdyaXRlcycgfSwKICBkZXNjcmlw
918
- dGlvbiA9ICdSZWFkIHJlZGlyZWN0b3IgaW5kZXgnLAp9KQoKLS1bWwogIFVwZGF0ZSByZWRpcmVj
919
- dG9yCi0tXV0KbG9jYWwgZnVuY3Rpb24gdXBkYXRlX3JlZGlyZWN0b3Ioa2V5cywgYXJncykKICBp
920
- ZiAja2V5cyB+PSAzIG9yICNhcmdzIDwgMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVw
921
- bHkoJ0VSUiBXcm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkg
922
- PSBrZXlzWzFdCiAgbG9jYWwgY2FtcGFpZ25fbG9ja19rZXkgPSBrZXlzWzJdCiAgbG9jYWwgcmVk
923
- aXJlY3Rvcl9rZXkgPSBrZXlzWzNdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWdu
924
- X2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQg
925
- Q2FtcGFpZ24gbm90IGV4aXN0cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNh
926
- bXBhaWduX2xvY2tfa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHko
927
- J0ZPUkJJRERFTiBDYW1wYWlnbiBub3QgbG9ja2VkJykKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgn
928
- RVhJU1RTJywgcmVkaXJlY3Rvcl9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1
929
- c19yZXBseSgnTk9UX0ZPVU5EIFJlZGlyZWN0b3Igbm90IGV4aXN0cycpCiAgZW5kCgogIGxvY2Fs
930
- IHN0YXNoID0gewogICAgbG9ja19zZWNyZXQgPSB0YWJsZS5yZW1vdmUoYXJncyksCiAgICBvcmln
931
- X2xvY2tfc2VjcmV0ID0gcmVkaXMuY2FsbCgnR0VUJywgY2FtcGFpZ25fbG9ja19rZXkpLAogIH0K
932
- CiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyhzdGFzaCkgZG8KICAgIGlmIG5vdCB2YWx1ZSB0
933
- aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0YXNoLicgLi4g
934
- ZmllbGQpCiAgICBlbmQKCiAgICBpZiAoZmllbGQgPT0gJ2xvY2tfc2VjcmV0JyBvciBmaWVsZCA9
935
- PSAnb3JpZ19sb2NrX3NlY3JldCcpIGFuZCB2YWx1ZSA9PSAnJyB0aGVuCiAgICAgIHJldHVybiBy
936
- ZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0YXNoLicgLi4gZmllbGQpCiAgICBlbmQKICBl
937
- bmQKCiAgaWYgI2FyZ3MgJSAyIH49IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5
938
- KCdFUlIgT2RkIG51bWJlciBvZiBhcmdzJykKICBlbmQKCiAgbG9jYWwgbW9kZWwgPSB7fQoKICBm
939
- b3IgaSA9IDEsICNhcmdzLCAyIGRvCiAgICBsb2NhbCBmaWVsZCwgdmFsdWUgPSBhcmdzW2ldLCBh
940
- cmdzW2kgKyAxXQoKICAgIGlmIG1vZGVsW2ZpZWxkXSB0aGVuCiAgICAgIHJldHVybiByZWRpcy5l
941
- cnJvcl9yZXBseSgnRVJSIER1cGxpY2F0ZSBtb2RlbC4nIC4uIGZpZWxkKQogICAgZW5kCgogICAg
942
- aWYgZmllbGQgPT0gJ3BhZ2UnIHRoZW4KICAgICAgbW9kZWwucGFnZSA9IHZhbHVlCiAgICBlbHNl
943
- CiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFVua25vd24gbW9kZWwuJyAuLiBm
944
- aWVsZCkKICAgIGVuZAogIGVuZAoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKG1vZGVsKSBk
945
- bwogICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdF
946
- UlIgV3JvbmcgbW9kZWwuJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICBpZiBuZXh0KG1vZGVs
947
- KSA9PSBuaWwgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnT0sgTm90aGluZyB0
948
- byB1cGRhdGUnKQogIGVuZAoKICBpZiBzdGFzaC5vcmlnX2xvY2tfc2VjcmV0IH49IHN0YXNoLmxv
949
- Y2tfc2VjcmV0IHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ0ZPUkJJRERFTiBD
950
- YW1wYWlnbiBsb2NrX3NlY3JldCBub3QgbWF0Y2gnKQogIGVuZAoKICAtLSBQb2ludCBvZiBubyBy
951
- ZXR1cm4KCiAgbG9jYWwgc3RvcmUgPSB7fQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKG1v
952
- ZGVsKSBkbwogICAgdGFibGUuaW5zZXJ0KHN0b3JlLCBmaWVsZCkKICAgIHRhYmxlLmluc2VydChz
953
- dG9yZSwgdmFsdWUpCiAgZW5kCgogIHJlZGlzLmNhbGwoJ0hTRVQnLCByZWRpcmVjdG9yX2tleSwg
954
- dW5wYWNrKHN0b3JlKSkKCiAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnT0sgUmVkaXJlY3Rv
955
- ciB1cGRhdGVkJykKZW5kCgpyZWRpcy5yZWdpc3Rlcl9mdW5jdGlvbih7CiAgZnVuY3Rpb25fbmFt
956
- ZSA9ICd1cGRhdGVfcmVkaXJlY3RvcicsCiAgY2FsbGJhY2sgPSB1cGRhdGVfcmVkaXJlY3RvciwK
957
- ICBkZXNjcmlwdGlvbiA9ICdVcGRhdGUgcmVkaXJlY3RvcicsCn0pCgotLVtbCiAgRGVsZXRlIHJl
958
- ZGlyZWN0b3IKLS1dXQpsb2NhbCBmdW5jdGlvbiBkZWxldGVfcmVkaXJlY3RvcihrZXlzLCBhcmdz
959
- KQogIGlmICNrZXlzIH49IDQgb3IgI2FyZ3Mgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJy
960
- b3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWln
961
- bl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgY2FtcGFpZ25fbG9ja19rZXkgPSBrZXlzWzJdCiAgbG9j
962
- YWwgcmVkaXJlY3Rvcl9rZXkgPSBrZXlzWzNdCiAgbG9jYWwgcmVkaXJlY3Rvcl9pbmRleF9rZXkg
963
- PSBrZXlzWzRdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWduX2tleSkgfj0gMSB0
964
- aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQgY2FtcGFpZ24gbm90
965
- IGV4aXN0cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWduX2xvY2tf
966
- a2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ0ZPUkJJRERFTiBD
967
- YW1wYWlnbiBub3QgbG9ja2VkJykKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgcmVk
968
- aXJlY3Rvcl9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9U
969
- X0ZPVU5EIHJlZGlyZWN0b3Igbm90IGV4aXN0cycpCiAgZW5kCgogIGxvY2FsIHN0YXNoID0gewog
970
- ICAgbG9ja19zZWNyZXQgPSBhcmdzWzFdLAogICAgb3JpZ19sb2NrX3NlY3JldCA9IHJlZGlzLmNh
971
- bGwoJ0dFVCcsIGNhbXBhaWduX2xvY2tfa2V5KSwKICAgIHJlZGlyZWN0b3JfaWQgPSByZWRpcy5j
972
- YWxsKCdIR0VUJywgcmVkaXJlY3Rvcl9rZXksICdyZWRpcmVjdG9yX2lkJyksCiAgICBsdXJlX2Nv
973
- dW50ID0gdG9udW1iZXIocmVkaXMuY2FsbCgnSEdFVCcsIHJlZGlyZWN0b3Jfa2V5LCAnbHVyZV9j
974
- b3VudCcpKSwKICB9CgogIGZvciBmaWVsZCwgdmFsdWUgaW4gcGFpcnMoc3Rhc2gpIGRvCiAgICBp
975
- ZiBub3QgdmFsdWUgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9u
976
- ZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCgogICAgaWYKICAgICAgKGZpZWxkID09ICdsb2Nr
977
- X3NlY3JldCcgb3IgZmllbGQgPT0gJ29yaWdfbG9ja19zZWNyZXQnIG9yIGZpZWxkID09ICdyZWRp
978
- cmVjdG9yX2lkJykKICAgICAgYW5kIHZhbHVlID09ICcnCiAgICB0aGVuCiAgICAgIHJldHVybiBy
979
- ZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0YXNoLicgLi4gZmllbGQpCiAgICBlbmQKCiAg
980
- ICBpZiBmaWVsZCA9PSAnbHVyZV9jb3VudCcgYW5kIHZhbHVlIDwgMCB0aGVuCiAgICAgIHJldHVy
981
- biByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0YXNoLicgLi4gZmllbGQpCiAgICBlbmQK
982
- ICBlbmQKCiAgaWYgc3Rhc2gubHVyZV9jb3VudCA+IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0
983
- YXR1c19yZXBseSgnRk9SQklEREVOIEx1cmVzIGV4aXN0cycpCiAgZW5kCgogIGlmIHN0YXNoLm9y
984
- aWdfbG9ja19zZWNyZXQgfj0gc3Rhc2gubG9ja19zZWNyZXQgdGhlbgogICAgcmV0dXJuIHJlZGlz
985
- LnN0YXR1c19yZXBseSgnRk9SQklEREVOIENhbXBhaWduIGxvY2tfc2VjcmV0IG5vdCBtYXRjaCcp
986
- CiAgZW5kCgogIC0tIFBvaW50IG9mIG5vIHJldHVybgoKICByZWRpcy5jYWxsKCdERUwnLCByZWRp
987
- cmVjdG9yX2tleSkKCiAgcmVkaXMuY2FsbCgnWlJFTScsIHJlZGlyZWN0b3JfaW5kZXhfa2V5LCBz
988
- dGFzaC5yZWRpcmVjdG9yX2lkKQoKICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdPSyBSZWRp
989
- cmVjdG9yIGRlbGV0ZWQnKQplbmQKCnJlZGlzLnJlZ2lzdGVyX2Z1bmN0aW9uKHsKICBmdW5jdGlv
990
- bl9uYW1lID0gJ2RlbGV0ZV9yZWRpcmVjdG9yJywKICBjYWxsYmFjayA9IGRlbGV0ZV9yZWRpcmVj
991
- dG9yLAogIGRlc2NyaXB0aW9uID0gJ0RlbGV0ZSB0YXJnZXQnLAp9KQo=`,
992
- '5-lure.lua',
993
- `IyFsdWEgbmFtZT1sdXJlCgotLVtbCiAgQ3JlYXRlIGx1cmUKLS1dXQpsb2NhbCBmdW5jdGlvbiBj
994
- cmVhdGVfbHVyZShrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDYgb3IgI2FyZ3Mgfj0gNiB0aGVu
995
- CiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlvbiB1c2UnKQog
996
- IGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgY2FtcGFpZ25fbG9j
997
- a19rZXkgPSBrZXlzWzJdCiAgbG9jYWwgbHVyZV9rZXkgPSBrZXlzWzNdCiAgbG9jYWwgbHVyZV9w
998
- YXRoc19rZXkgPSBrZXlzWzRdCiAgbG9jYWwgbHVyZV9pbmRleF9rZXkgPSBrZXlzWzVdCiAgbG9j
999
- YWwgcmVkaXJlY3Rvcl9rZXkgPSBrZXlzWzZdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNh
1000
- bXBhaWduX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1Rf
1001
- Rk9VTkQgQ2FtcGFpZ24gbm90IGV4aXN0cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNU
1002
- UycsIGNhbXBhaWduX2xvY2tfa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNf
1003
- cmVwbHkoJ0ZPUkJJRERFTiBDYW1wYWlnbiBub3QgbG9ja2VkJykKICBlbmQKCiAgaWYgcmVkaXMu
1004
- Y2FsbCgnRVhJU1RTJywgbHVyZV9rZXkpIH49IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1
1005
- c19yZXBseSgnQ09ORkxJQ1QgTHVyZSBhbGxyZWFkeSBleGlzdHMnKQogIGVuZAoKICBpZiByZWRp
1006
- cy5jYWxsKCdFWElTVFMnLCByZWRpcmVjdG9yX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVk
1007
- aXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQgUmVkaXJlY3RvciBub3QgZm91bmQnKQogIGVuZAoK
1008
- ICBsb2NhbCBzdGFzaCA9IHsKICAgIGxvY2tfc2VjcmV0ID0gYXJnc1s2XSwKICAgIG9yaWdfbG9j
1009
- a19zZWNyZXQgPSByZWRpcy5jYWxsKCdHRVQnLCBjYW1wYWlnbl9sb2NrX2tleSksCiAgfQoKICBm
1010
- b3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKHN0YXNoKSBkbwogICAgaWYgbm90IHZhbHVlIHRoZW4K
1011
- ICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVs
1012
- ZCkKICAgIGVuZAoKICAgIGlmIChmaWVsZCA9PSAnbG9ja19zZWNyZXQnIG9yIGZpZWxkID09ICdv
1013
- cmlnX2xvY2tfc2VjcmV0JykgYW5kIHZhbHVlID09ICcnIHRoZW4KICAgICAgcmV0dXJuIHJlZGlz
1014
- LmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoK
1015
- ICBsb2NhbCBtb2RlbCA9IHsKICAgIGNhbXBhaWduX2lkID0gYXJnc1sxXSwKICAgIGx1cmVfaWQg
1016
- PSBhcmdzWzJdLAogICAgcGF0aCA9IGFyZ3NbM10sCiAgICByZWRpcmVjdG9yX2lkID0gYXJnc1s0
1017
- XSwKICAgIGlzX2VuYWJsZWQgPSAwLAogICAgc2Vzc2lvbl9jb3VudCA9IDAsCiAgICBjcmVhdGVk
1018
- X2F0ID0gdG9udW1iZXIoYXJnc1s1XSksCiAgfQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJz
1019
- KG1vZGVsKSBkbwogICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9y
1020
- X3JlcGx5KCdFUlIgV3JvbmcgbW9kZWwuJyAuLiBmaWVsZCkKICAgIGVuZAoKICAgIGlmCiAgICAg
1021
- IChmaWVsZCA9PSAnY2FtcGFpZ25faWQnIG9yIGZpZWxkID09ICdsdXJlX2lkJyBvciBmaWVsZCA9
1022
- PSAncGF0aCcgb3IgZmllbGQgPT0gJ3JlZGlyZWN0b3JfaWQnKQogICAgICBhbmQgdmFsdWUgPT0g
1023
- JycKICAgIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgbW9k
1024
- ZWwuJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICBpZiBzdGFzaC5vcmlnX2xvY2tfc2VjcmV0
1025
- IH49IHN0YXNoLmxvY2tfc2VjcmV0IHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHko
1026
- J0ZPUkJJRERFTiBDYW1wYWlnbiBsb2NrX3NlY3JldCBub3QgbWF0Y2gnKQogIGVuZAoKICAtLSBQ
1027
- b2ludCBvZiBubyByZXR1cm4KCiAgbG9jYWwgc3RvcmUgPSB7fQoKICBmb3IgZmllbGQsIHZhbHVl
1028
- IGluIHBhaXJzKG1vZGVsKSBkbwogICAgdGFibGUuaW5zZXJ0KHN0b3JlLCBmaWVsZCkKICAgIHRh
1029
- YmxlLmluc2VydChzdG9yZSwgdmFsdWUpCiAgZW5kCgogIHJlZGlzLmNhbGwoJ0hTRVQnLCBsdXJl
1030
- X2tleSwgdW5wYWNrKHN0b3JlKSkKCiAgcmVkaXMuY2FsbCgnSFNFVCcsIGx1cmVfcGF0aHNfa2V5
1031
- LCBtb2RlbC5wYXRoLCBtb2RlbC5sdXJlX2lkKQoKICByZWRpcy5jYWxsKCdaQUREJywgbHVyZV9p
1032
- bmRleF9rZXksIG1vZGVsLmNyZWF0ZWRfYXQsIG1vZGVsLmx1cmVfaWQpCgogIHJlZGlzLmNhbGwo
1033
- J0hJTkNSQlknLCByZWRpcmVjdG9yX2tleSwgJ2x1cmVfY291bnQnLCAxKQoKICByZXR1cm4gcmVk
1034
- aXMuc3RhdHVzX3JlcGx5KCdPSyBMdXJlIGNyZWF0ZWQnKQplbmQKCnJlZGlzLnJlZ2lzdGVyX2Z1
1035
- bmN0aW9uKHsKICBmdW5jdGlvbl9uYW1lID0gJ2NyZWF0ZV9sdXJlJywKICBjYWxsYmFjayA9IGNy
1036
- ZWF0ZV9sdXJlLAogIGRlc2NyaXB0aW9uID0gJ0NyZWF0ZSBsdXJlJywKfSkKCi0tW1sKICBSZWFk
1037
- IGx1cmUKLS1dXQpsb2NhbCBmdW5jdGlvbiByZWFkX2x1cmUoa2V5cywgYXJncykKICBpZiAja2V5
1038
- cyB+PSAyIG9yICNhcmdzIH49IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdF
1039
- UlIgV3JvbmcgZnVuY3Rpb24gdXNlJykKICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25fa2V5ID0ga2V5
1040
- c1sxXQogIGxvY2FsIGx1cmVfa2V5ID0ga2V5c1syXQoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMn
1041
- LCBjYW1wYWlnbl9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIG5pbAogIGVuZAoKICBpZiByZWRp
1042
- cy5jYWxsKCdFWElTVFMnLCBsdXJlX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gbmlsCiAgZW5k
1043
- CgogIC0tIHN0eWx1YTogaWdub3JlCiAgbG9jYWwgdmFsdWVzID0gIHJlZGlzLmNhbGwoCiAgICAn
1044
- SE1HRVQnLCBsdXJlX2tleSwKICAgICdjYW1wYWlnbl9pZCcsCiAgICAnbHVyZV9pZCcsCiAgICAn
1045
- cGF0aCcsCiAgICAncmVkaXJlY3Rvcl9pZCcsCiAgICAnaXNfZW5hYmxlZCcsCiAgICAnc2Vzc2lv
1046
- bl9jb3VudCcsCiAgICAnY3JlYXRlZF9hdCcKICApCgogIGlmICN2YWx1ZXMgfj0gNyB0aGVuCiAg
1047
- ICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBNYWxmb3JtIHZhbHVlcycpCiAgZW5kCgog
1048
- IGxvY2FsIG1vZGVsID0gewogICAgY2FtcGFpZ25faWQgPSB2YWx1ZXNbMV0sCiAgICBsdXJlX2lk
1049
- ID0gdmFsdWVzWzJdLAogICAgcGF0aCA9IHZhbHVlc1szXSwKICAgIHJlZGlyZWN0b3JfaWQgPSB2
1050
- YWx1ZXNbNF0sCiAgICBpc19lbmFibGVkID0gdG9udW1iZXIodmFsdWVzWzVdKSwKICAgIHNlc3Np
1051
- b25fY291bnQgPSB0b251bWJlcih2YWx1ZXNbNl0pLAogICAgY3JlYXRlZF9hdCA9IHRvbnVtYmVy
1052
- KHZhbHVlc1s3XSksCiAgfQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKG1vZGVsKSBkbwog
1053
- ICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIg
1054
- TWFsZm9ybSBtb2RlbC4nIC4uIGZpZWxkKQogICAgZW5kCiAgZW5kCgogIHJldHVybiB7IG1hcCA9
1055
- IG1vZGVsIH0KZW5kCgpyZWRpcy5yZWdpc3Rlcl9mdW5jdGlvbih7CiAgZnVuY3Rpb25fbmFtZSA9
1056
- ICdyZWFkX2x1cmUnLAogIGNhbGxiYWNrID0gcmVhZF9sdXJlLAogIGZsYWdzID0geyAnbm8td3Jp
1057
- dGVzJyB9LAogIGRlc2NyaXB0aW9uID0gJ1JlYWQgbHVyZScsCn0pCgotLVtbCiAgRmluZCBsdXJl
1058
- IGlkCi0tXV0KbG9jYWwgZnVuY3Rpb24gZmluZF9sdXJlX2lkKGtleXMsIGFyZ3MpCiAgaWYgI2tl
1059
- eXMgfj0gMiBvciAjYXJncyB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgn
1060
- RVJSIFdyb25nIGZ1bmN0aW9uIHVzZScpCiAgZW5kCgogIGxvY2FsIGNhbXBhaWduX2tleSA9IGtl
1061
- eXNbMV0KICBsb2NhbCBsdXJlX3BhdGhzX2tleSA9IGtleXNbMl0KCiAgaWYgcmVkaXMuY2FsbCgn
1062
- RVhJU1RTJywgY2FtcGFpZ25fa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiBuaWwKICBlbmQKCiAg
1063
- bG9jYWwgcGF0aCA9IGFyZ3NbMV0KCiAgaWYgbm90IChwYXRoIGFuZCBwYXRoIH49ICcnKSB0aGVu
1064
- CiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBwYXRoJykKICBlbmQKCiAg
1065
- aWYgcmVkaXMuY2FsbCgnSEVYSVNUUycsIGx1cmVfcGF0aHNfa2V5LCBwYXRoKSB+PSAxIHRoZW4K
1066
- ICAgIHJldHVybiBuaWwKICBlbmQKCiAgbG9jYWwgbHVyZV9pZCA9IHJlZGlzLmNhbGwoJ0hHRVQn
1067
- LCBsdXJlX3BhdGhzX2tleSwgcGF0aCkKCiAgaWYgbm90IChsdXJlX2lkIGFuZCBsdXJlX2lkIH49
1068
- ICcnKSB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBNYWxmb3JtIGx1cmVf
1069
- aWQnKQogIGVuZAoKICByZXR1cm4gbHVyZV9pZAplbmQKCnJlZGlzLnJlZ2lzdGVyX2Z1bmN0aW9u
1070
- KHsKICBmdW5jdGlvbl9uYW1lID0gJ2ZpbmRfbHVyZV9pZCcsCiAgY2FsbGJhY2sgPSBmaW5kX2x1
1071
- cmVfaWQsCiAgZmxhZ3MgPSB7ICduby13cml0ZXMnIH0sCiAgZGVzY3JpcHRpb24gPSAnRmluZCBs
1072
- dXJlIGlkJywKfSkKCi0tW1sKICBSZWFkIGx1cmUgaW5kZXgKLS1dXQpsb2NhbCBmdW5jdGlvbiBy
1073
- ZWFkX2x1cmVfaW5kZXgoa2V5cywgYXJncykKICBpZiAja2V5cyB+PSAyIG9yICNhcmdzIH49IDAg
1074
- dGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgZnVuY3Rpb24gdXNl
1075
- JykKICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25fa2V5ID0ga2V5c1sxXQogIGxvY2FsIGx1cmVfaW5k
1076
- ZXhfa2V5ID0ga2V5c1syXQoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9rZXkp
1077
- IH49IDEgdGhlbgogICAgcmV0dXJuIG5pbAogIGVuZAoKICByZXR1cm4gcmVkaXMuY2FsbCgnWlJB
1078
- TkdFJywgbHVyZV9pbmRleF9rZXksIDAsIC0xKQplbmQKCnJlZGlzLnJlZ2lzdGVyX2Z1bmN0aW9u
1079
- KHsKICBmdW5jdGlvbl9uYW1lID0gJ3JlYWRfbHVyZV9pbmRleCcsCiAgY2FsbGJhY2sgPSByZWFk
1080
- X2x1cmVfaW5kZXgsCiAgZmxhZ3MgPSB7ICduby13cml0ZXMnIH0sCiAgZGVzY3JpcHRpb24gPSAn
1081
- UmVhZCBsdXJlIGluZGV4JywKfSkKCi0tW1sKICBFbmFibGUgbHVyZQotLV1dCmxvY2FsIGZ1bmN0
1082
- aW9uIGVuYWJsZV9sdXJlKGtleXMsIGFyZ3MpCiAgaWYgI2tleXMgfj0gMyBvciAjYXJncyB+PSAx
1083
- IHRoZW4KICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIGZ1bmN0aW9uIHVz
1084
- ZScpCiAgZW5kCgogIGxvY2FsIGNhbXBhaWduX2tleSA9IGtleXNbMV0KICBsb2NhbCBjYW1wYWln
1085
- bl9sb2NrX2tleSA9IGtleXNbMl0KICBsb2NhbCBsdXJlX2tleSA9IGtleXNbM10KCiAgaWYgcmVk
1086
- aXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25fa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRp
1087
- cy5zdGF0dXNfcmVwbHkoJ05PVF9GT1VORCBDYW1wYWlnbiBub3QgZXhpc3RzJykKICBlbmQKCiAg
1088
- aWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25fbG9ja19rZXkpIH49IDEgdGhlbgogICAg
1089
- cmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnRk9SQklEREVOIENhbXBhaWduIG5vdCBsb2NrZWQn
1090
- KQogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBsdXJlX2tleSkgfj0gMSB0aGVuCiAg
1091
- ICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQgTHVyZSBub3QgZXhpc3RzJykK
1092
- ICBlbmQKCiAgbG9jYWwgc3Rhc2ggPSB7CiAgICBsb2NrX3NlY3JldCA9IGFyZ3NbMV0sCiAgICBv
1093
- cmlnX2xvY2tfc2VjcmV0ID0gcmVkaXMuY2FsbCgnR0VUJywgY2FtcGFpZ25fbG9ja19rZXkpLAog
1094
- ICAgaXNfZW5hYmxlZCA9IHRvbnVtYmVyKHJlZGlzLmNhbGwoJ0hHRVQnLCBsdXJlX2tleSwgJ2lz
1095
- X2VuYWJsZWQnKSksCiAgfQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKHN0YXNoKSBkbwog
1096
- ICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIg
1097
- V3Jvbmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAoKICAgIGlmIChmaWVsZCA9PSAnbG9ja19z
1098
- ZWNyZXQnIG9yIGZpZWxkID09ICdvcmlnX2xvY2tfc2VjcmV0JykgYW5kIHZhbHVlID09ICcnIHRo
1099
- ZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2guJyAuLiBm
1100
- aWVsZCkKICAgIGVuZAogIGVuZAoKICBpZiBzdGFzaC5pc19lbmFibGVkIH49IDAgdGhlbgogICAg
1101
- cmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnT0sgTHVyZSBhbGxyZWFkeSBlbmFibGVkJykKICBl
1102
- bmQKCiAgaWYgc3Rhc2gub3JpZ19sb2NrX3NlY3JldCB+PSBzdGFzaC5sb2NrX3NlY3JldCB0aGVu
1103
- CiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JCSURERU4gQ2FtcGFpZ24gbG9ja19z
1104
- ZWNyZXQgbm90IG1hdGNoJykKICBlbmQKCiAgLS0gUG9pbnQgb2Ygbm8gcmV0dXJuCgogIHJlZGlz
1105
- LmNhbGwoJ0hTRVQnLCBsdXJlX2tleSwgJ2lzX2VuYWJsZWQnLCAxKQoKICByZXR1cm4gcmVkaXMu
1106
- c3RhdHVzX3JlcGx5KCdPSyBMdXJlIGVuYWJsZWQnKQplbmQKCnJlZGlzLnJlZ2lzdGVyX2Z1bmN0
1107
- aW9uKHsKICBmdW5jdGlvbl9uYW1lID0gJ2VuYWJsZV9sdXJlJywKICBjYWxsYmFjayA9IGVuYWJs
1108
- ZV9sdXJlLAogIGRlc2NyaXB0aW9uID0gJ0VuYWJsZSBsdXJlJywKfSkKCi0tW1sKICBEaXNhYmxl
1109
- IGx1cmUKLS1dXQpsb2NhbCBmdW5jdGlvbiBkaXNhYmxlX2x1cmUoa2V5cywgYXJncykKICBpZiAj
1110
- a2V5cyB+PSAzIG9yICNhcmdzIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5
1111
- KCdFUlIgV3JvbmcgZnVuY3Rpb24gdXNlJykKICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25fa2V5ID0g
1112
- a2V5c1sxXQogIGxvY2FsIGNhbXBhaWduX2xvY2tfa2V5ID0ga2V5c1syXQogIGxvY2FsIGx1cmVf
1113
- a2V5ID0ga2V5c1szXQoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9rZXkpIH49
1114
- IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIENhbXBhaWdu
1115
- IG5vdCBleGlzdHMnKQogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9s
1116
- b2NrX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdGT1JCSURE
1117
- RU4gQ2FtcGFpZ24gbm90IGxvY2tlZCcpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycs
1118
- IGx1cmVfa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ05PVF9G
1119
- T1VORCBMdXJlIG5vdCBleGlzdHMnKQogIGVuZAoKICBsb2NhbCBzdGFzaCA9IHsKICAgIGxvY2tf
1120
- c2VjcmV0ID0gYXJnc1sxXSwKICAgIG9yaWdfbG9ja19zZWNyZXQgPSByZWRpcy5jYWxsKCdHRVQn
1121
- LCBjYW1wYWlnbl9sb2NrX2tleSksCiAgICBpc19lbmFibGVkID0gdG9udW1iZXIocmVkaXMuY2Fs
1122
- bCgnSEdFVCcsIGx1cmVfa2V5LCAnaXNfZW5hYmxlZCcpKSwKICB9CgogIGZvciBmaWVsZCwgdmFs
1123
- dWUgaW4gcGFpcnMoc3Rhc2gpIGRvCiAgICBpZiBub3QgdmFsdWUgdGhlbgogICAgICByZXR1cm4g
1124
- cmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCgog
1125
- ICAgaWYgKGZpZWxkID09ICdsb2NrX3NlY3JldCcgb3IgZmllbGQgPT0gJ29yaWdfbG9ja19zZWNy
1126
- ZXQnKSBhbmQgdmFsdWUgPT0gJycgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHko
1127
- J0VSUiBXcm9uZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCiAgZW5kCgogIGlmIHN0YXNoLmlz
1128
- X2VuYWJsZWQgPT0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdPSyBMdXJl
1129
- IGFsbHJlYWR5IGRpc2FibGVkJykKICBlbmQKCiAgaWYgc3Rhc2gub3JpZ19sb2NrX3NlY3JldCB+
1130
- PSBzdGFzaC5sb2NrX3NlY3JldCB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdG
1131
- T1JCSURERU4gQ2FtcGFpZ24gbG9ja19zZWNyZXQgbm90IG1hdGNoJykKICBlbmQKCiAgLS0gUG9p
1132
- bnQgb2Ygbm8gcmV0dXJuCgogIHJlZGlzLmNhbGwoJ0hTRVQnLCBsdXJlX2tleSwgJ2lzX2VuYWJs
1133
- ZWQnLCAwKQoKICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdPSyBMdXJlIGRpc2FibGVkJykK
1134
- ZW5kCgpyZWRpcy5yZWdpc3Rlcl9mdW5jdGlvbih7CiAgZnVuY3Rpb25fbmFtZSA9ICdkaXNhYmxl
1135
- X2x1cmUnLAogIGNhbGxiYWNrID0gZGlzYWJsZV9sdXJlLAogIGRlc2NyaXB0aW9uID0gJ0Rpc2Fi
1136
- bGUgbHVyZScsCn0pCgotLVtbCiAgRGVsZXRlIGx1cmUKLS1dXQpsb2NhbCBmdW5jdGlvbiBkZWxl
1137
- dGVfbHVyZShrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDYgb3IgI2FyZ3Mgfj0gMSB0aGVuCiAg
1138
- ICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlvbiB1c2UnKQogIGVu
1139
- ZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgY2FtcGFpZ25fbG9ja19r
1140
- ZXkgPSBrZXlzWzJdCiAgbG9jYWwgbHVyZV9rZXkgPSBrZXlzWzNdCiAgbG9jYWwgbHVyZV9wYXRo
1141
- c19rZXkgPSBrZXlzWzRdCiAgbG9jYWwgbHVyZV9pbmRleF9rZXkgPSBrZXlzWzVdCiAgbG9jYWwg
1142
- cmVkaXJlY3Rvcl9rZXkgPSBrZXlzWzZdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBh
1143
- aWduX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9V
1144
- TkQgQ2FtcGFpZ24gbm90IGV4aXN0cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycs
1145
- IGNhbXBhaWduX2xvY2tfa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVw
1146
- bHkoJ0ZPUkJJRERFTiBDYW1wYWlnbiBub3QgbG9ja2VkJykKICBlbmQKCiAgaWYgcmVkaXMuY2Fs
1147
- bCgnRVhJU1RTJywgbHVyZV9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19y
1148
- ZXBseSgnTk9UX0ZPVU5EIEx1cmUgbm90IGV4aXN0cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwo
1149
- J0VYSVNUUycsIHJlZGlyZWN0b3Jfa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0
1150
- dXNfcmVwbHkoJ05PVF9GT1VORCBSZWRpcmVjdG9yIG5vdCBleGlzdHMnKQogIGVuZAoKICBsb2Nh
1151
- bCBzdGFzaCA9IHsKICAgIGxvY2tfc2VjcmV0ID0gYXJnc1sxXSwKICAgIG9yaWdfbG9ja19zZWNy
1152
- ZXQgPSByZWRpcy5jYWxsKCdHRVQnLCBjYW1wYWlnbl9sb2NrX2tleSksCiAgICBsdXJlX2lkID0g
1153
- cmVkaXMuY2FsbCgnSEdFVCcsIGx1cmVfa2V5LCAnbHVyZV9pZCcpLAogICAgcGF0aCA9IHJlZGlz
1154
- LmNhbGwoJ0hHRVQnLCBsdXJlX2tleSwgJ3BhdGgnKSwKICAgIHJlZGlyZWN0b3JfaWQgPSByZWRp
1155
- cy5jYWxsKCdIR0VUJywgbHVyZV9rZXksICdyZWRpcmVjdG9yX2lkJyksCiAgICBvcmlnX3JlZGly
1156
- ZWN0b3JfaWQgPSByZWRpcy5jYWxsKCdIR0VUJywgcmVkaXJlY3Rvcl9rZXksICdyZWRpcmVjdG9y
1157
- X2lkJyksCiAgICBpc19lbmFibGVkID0gdG9udW1iZXIocmVkaXMuY2FsbCgnSEdFVCcsIGx1cmVf
1158
- a2V5LCAnaXNfZW5hYmxlZCcpKSwKICB9CgogIGZvciBmaWVsZCwgdmFsdWUgaW4gcGFpcnMoc3Rh
1159
- c2gpIGRvCiAgICBpZiBub3QgdmFsdWUgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVw
1160
- bHkoJ0VSUiBXcm9uZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCgogICAgaWYKICAgICAgKAog
1161
- ICAgICAgIGZpZWxkID09ICdsb2NrX3NlY3JldCcKICAgICAgICBvciBmaWVsZCA9PSAnb3JpZ19s
1162
- b2NrX3NlY3JldCcKICAgICAgICBvciBmaWVsZCA9PSAnbHVyZV9pZCcKICAgICAgICBvciBmaWVs
1163
- ZCA9PSAncGF0aCcKICAgICAgICBvciBmaWVsZCA9PSAncmVkaXJlY3Rvcl9pZCcKICAgICAgICBv
1164
- ciBmaWVsZCA9PSAnb3JpZ19yZWRpcmVjdG9yX2lkJwogICAgICApIGFuZCB2YWx1ZSA9PSAnJwog
1165
- ICAgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBzdGFzaC4n
1166
- IC4uIGZpZWxkKQogICAgZW5kCiAgZW5kCgogIGlmIHN0YXNoLm9yaWdfcmVkaXJlY3Rvcl9pZCB+
1167
- PSBzdGFzaC5yZWRpcmVjdG9yX2lkIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHko
1168
- J0ZPUkJJRERFTiBMdXJlIHJlZGlyZWN0b3Igbm90IG1hdGNoJykKICBlbmQKCiAgaWYgc3Rhc2gu
1169
- aXNfZW5hYmxlZCB+PSAwIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ0ZPUkJJ
1170
- RERFTiBMdXJlIG5vdCBkaXNhYmxlZCcpCiAgZW5kCgogIGlmIHN0YXNoLm9yaWdfbG9ja19zZWNy
1171
- ZXQgfj0gc3Rhc2gubG9ja19zZWNyZXQgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBs
1172
- eSgnRk9SQklEREVOIENhbXBhaWduIGxvY2tfc2VjcmV0IG5vdCBtYXRjaCcpCiAgZW5kCgogIC0t
1173
- IFBvaW50IG9mIG5vIHJldHVybgoKICByZWRpcy5jYWxsKCdERUwnLCBsdXJlX2tleSkKCiAgcmVk
1174
- aXMuY2FsbCgnSERFTCcsIGx1cmVfcGF0aHNfa2V5LCBzdGFzaC5wYXRoKQoKICByZWRpcy5jYWxs
1175
- KCdaUkVNJywgbHVyZV9pbmRleF9rZXksIHN0YXNoLmx1cmVfaWQpCgogIHJlZGlzLmNhbGwoJ0hJ
1176
- TkNSQlknLCByZWRpcmVjdG9yX2tleSwgJ2x1cmVfY291bnQnLCAtMSkKCiAgcmV0dXJuIHJlZGlz
1177
- LnN0YXR1c19yZXBseSgnT0sgTHVyZSBkZWxldGVkJykKZW5kCgpyZWRpcy5yZWdpc3Rlcl9mdW5j
1178
- dGlvbih7CiAgZnVuY3Rpb25fbmFtZSA9ICdkZWxldGVfbHVyZScsCiAgY2FsbGJhY2sgPSBkZWxl
1179
- dGVfbHVyZSwKICBkZXNjcmlwdGlvbiA9ICdEZWxldGUgbHVyZScsCn0pCg==`,
1180
- '6-session.lua',
1181
- `IyFsdWEgbmFtZT1zZXNzaW9uCgotLVtbCiAgQ3JlYXRlIHNlc3Npb24KLS1dXQpsb2NhbCBmdW5j
1182
- dGlvbiBjcmVhdGVfc2Vzc2lvbihrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDMgb3IgI2FyZ3Mg
1183
- fj0gNCB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlv
1184
- biB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgc2Vz
1185
- c2lvbl9rZXkgPSBrZXlzWzJdCiAgbG9jYWwgZW5hYmxlZF9wcm94eV9pbmRleF9rZXkgPSBrZXlz
1186
- WzNdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWduX2tleSkgfj0gMSB0aGVuCiAg
1187
- ICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQgQ2FtcGFpZ24gbm90IGV4aXN0
1188
- cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIHNlc3Npb25fa2V5KSB+PSAwIHRo
1189
- ZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ0NPTkZMSUNUIFNlc3Npb24gYWxscmVh
1190
- ZHkgZXhpc3RzJykKICBlbmQKCiAgbG9jYWwgc3Rhc2ggPSB7CiAgICBuZXdfc2Vzc2lvbl9leHBp
1191
- cmUgPSB0b251bWJlcihyZWRpcy5jYWxsKCdIR0VUJywgY2FtcGFpZ25fa2V5LCAnbmV3X3Nlc3Np
1192
- b25fZXhwaXJlJykpLAogIH0KCiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyhzdGFzaCkgZG8K
1193
- ICAgIGlmIG5vdCB2YWx1ZSB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJS
1194
- IFdyb25nIHN0YXNoLicgLi4gZmllbGQpCiAgICBlbmQKCiAgICBpZiBmaWVsZCA9PSAnbmV3X3Nl
1195
- c3Npb25fZXhwaXJlJyBhbmQgdmFsdWUgPD0gMCB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJv
1196
- cl9yZXBseSgnRVJSIFdyb25nIHN0YXNoLicgLi4gZmllbGQpCiAgICBlbmQKICBlbmQKCiAgaWYg
1197
- cmVkaXMuY2FsbCgnU0NBUkQnLCBlbmFibGVkX3Byb3h5X2luZGV4X2tleSkgPT0gMCB0aGVuCiAg
1198
- ICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQgTm8gZW5hYmxlZCBwcm94aWVz
1199
- IGZvdW5kJykKICBlbmQKCiAgbG9jYWwgbW9kZWwgPSB7CiAgICBjYW1wYWlnbl9pZCA9IGFyZ3Nb
1200
- MV0sCiAgICBzZXNzaW9uX2lkID0gYXJnc1syXSwKICAgIHByb3h5X2lkID0gcmVkaXMuY2FsbCgn
1201
- U1JBTkRNRU1CRVInLCBlbmFibGVkX3Byb3h5X2luZGV4X2tleSksCiAgICBzZWNyZXQgPSBhcmdz
1202
- WzNdLAogICAgaXNfdXBncmFkZWQgPSAwLAogICAgbWVzc2FnZV9jb3VudCA9IDAsCiAgICBjcmVh
1203
- dGVkX2F0ID0gdG9udW1iZXIoYXJnc1s0XSksCiAgICBhdXRob3JpemVkX2F0ID0gdG9udW1iZXIo
1204
- YXJnc1s0XSksCiAgfQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKG1vZGVsKSBkbwogICAg
1205
- aWYgbm90IHZhbHVlIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jv
1206
- bmcgbW9kZWwuJyAuLiBmaWVsZCkKICAgIGVuZAoKICAgIGlmCiAgICAgIChmaWVsZCA9PSAnY2Ft
1207
- cGFpZ25faWQnIG9yIGZpZWxkID09ICdzZXNzaW9uX2lkJyBvciBmaWVsZCA9PSAncHJveHlfaWQn
1208
- IG9yIGZpZWxkID09ICdzZWNyZXQnKQogICAgICBhbmQgdmFsdWUgPT0gJycKICAgIHRoZW4KICAg
1209
- ICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgbW9kZWwuJyAuLiBmaWVsZCkK
1210
- ICAgIGVuZAogIGVuZAoKICAtLSBQb2ludCBvZiBubyByZXR1cm4KCiAgbG9jYWwgc3RvcmUgPSB7
1211
- fQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKG1vZGVsKSBkbwogICAgdGFibGUuaW5zZXJ0
1212
- KHN0b3JlLCBmaWVsZCkKICAgIHRhYmxlLmluc2VydChzdG9yZSwgdmFsdWUpCiAgZW5kCgogIHJl
1213
- ZGlzLmNhbGwoJ0hTRVQnLCBzZXNzaW9uX2tleSwgdW5wYWNrKHN0b3JlKSkKCiAgcmVkaXMuY2Fs
1214
- bCgnSElOQ1JCWScsIGNhbXBhaWduX2tleSwgJ3Nlc3Npb25fY291bnQnLCAxKQoKICByZWRpcy5j
1215
- YWxsKCdQRVhQSVJFJywgc2Vzc2lvbl9rZXksIHN0YXNoLm5ld19zZXNzaW9uX2V4cGlyZSkKCiAg
1216
- cmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnT0sgU2Vzc2lvbiBjcmVhdGVkJykKZW5kCgpyZWRp
1217
- cy5yZWdpc3Rlcl9mdW5jdGlvbih7CiAgZnVuY3Rpb25fbmFtZSA9ICdjcmVhdGVfc2Vzc2lvbics
1218
- CiAgY2FsbGJhY2sgPSBjcmVhdGVfc2Vzc2lvbiwKICBkZXNjcmlwdGlvbiA9ICdDcmVhdGUgc2Vz
1219
- c2lvbicsCn0pCgotLVtbCiAgUmVhZCBzZXNzaW9uCi0tXV0KbG9jYWwgZnVuY3Rpb24gcmVhZF9z
1220
- ZXNzaW9uKGtleXMsIGFyZ3MpCiAgaWYgI2tleXMgfj0gMiBvciAjYXJncyB+PSAwIHRoZW4KICAg
1221
- IHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIGZ1bmN0aW9uIHVzZScpCiAgZW5k
1222
- CgogIGxvY2FsIGNhbXBhaWduX2tleSA9IGtleXNbMV0KICBsb2NhbCBzZXNzaW9uX2tleSA9IGtl
1223
- eXNbMl0KCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFpZ25fa2V5KSB+PSAxIHRoZW4K
1224
- ICAgIHJldHVybiBuaWwKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgc2Vzc2lvbl9r
1225
- ZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIG5pbAogIGVuZAoKICAtLSBzdHlsdWE6IGlnbm9yZQog
1226
- IGxvY2FsIHZhbHVlcyA9IHJlZGlzLmNhbGwoCiAgICAnSE1HRVQnLCBzZXNzaW9uX2tleSwKICAg
1227
- ICdjYW1wYWlnbl9pZCcsCiAgICAnc2Vzc2lvbl9pZCcsCiAgICAncHJveHlfaWQnLAogICAgJ3Nl
1228
- Y3JldCcsCiAgICAnaXNfdXBncmFkZWQnLAogICAgJ21lc3NhZ2VfY291bnQnLAogICAgJ2NyZWF0
1229
- ZWRfYXQnLAogICAgJ2F1dGhvcml6ZWRfYXQnCiAgKQoKICBpZiAjdmFsdWVzIH49IDggdGhlbgog
1230
- ICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgTWFsZm9ybSB2YWx1ZXMnKQogIGVuZAoK
1231
- ICBsb2NhbCBtb2RlbCA9IHsKICAgIGNhbXBhaWduX2lkID0gdmFsdWVzWzFdLAogICAgc2Vzc2lv
1232
- bl9pZCA9IHZhbHVlc1syXSwKICAgIHByb3h5X2lkID0gdmFsdWVzWzNdLAogICAgc2VjcmV0ID0g
1233
- dmFsdWVzWzRdLAogICAgaXNfdXBncmFkZWQgPSB0b251bWJlcih2YWx1ZXNbNV0pLAogICAgbWVz
1234
- c2FnZV9jb3VudCA9IHRvbnVtYmVyKHZhbHVlc1s2XSksCiAgICBjcmVhdGVkX2F0ID0gdG9udW1i
1235
- ZXIodmFsdWVzWzddKSwKICAgIGF1dGhvcml6ZWRfYXQgPSB0b251bWJlcih2YWx1ZXNbOF0pLAog
1236
- IH0KCiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyhtb2RlbCkgZG8KICAgIGlmIG5vdCB2YWx1
1237
- ZSB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIE1hbGZvcm0gbW9kZWwu
1238
- JyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICByZXR1cm4geyBtYXAgPSBtb2RlbCB9CmVuZAoK
1239
- cmVkaXMucmVnaXN0ZXJfZnVuY3Rpb24oewogIGZ1bmN0aW9uX25hbWUgPSAncmVhZF9zZXNzaW9u
1240
- JywKICBjYWxsYmFjayA9IHJlYWRfc2Vzc2lvbiwKICBmbGFncyA9IHsgJ25vLXdyaXRlcycgfSwK
1241
- ICBkZXNjcmlwdGlvbiA9ICdSZWFkIHNlc3Npb24nLAp9KQoKLS1bWwogIEF1dGggc2Vzc2lvbgot
1242
- LV1dCmxvY2FsIGZ1bmN0aW9uIGF1dGhfc2Vzc2lvbihrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49
1243
- IDMgb3IgI2FyZ3Mgfj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBX
1244
- cm9uZyBmdW5jdGlvbiB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFd
1245
- CiAgbG9jYWwgc2Vzc2lvbl9rZXkgPSBrZXlzWzJdCiAgbG9jYWwgZW5hYmxlZF9wcm94eV9pbmRl
1246
- eF9rZXkgPSBrZXlzWzNdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWduX2tleSkg
1247
- fj0gMSB0aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQgQ2FtcGFp
1248
- Z24gbm90IGV4aXN0cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIHNlc3Npb25f
1249
- a2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ0ZPUkJJRERFTiBT
1250
- ZXNzaW9uIG5vdCBleGlzdHMnKQogIGVuZAoKICBsb2NhbCBzdGFzaCA9IHsKICAgIGF1dGhvcml6
1251
- ZWRfYXQgPSB0b251bWJlcihhcmdzWzFdKSwKICAgIHByb3h5X2lkID0gcmVkaXMuY2FsbCgnSEdF
1252
- VCcsIHNlc3Npb25fa2V5LCAncHJveHlfaWQnKSwKICAgIHNlc3Npb25fZXhwaXJlID0gdG9udW1i
1253
- ZXIocmVkaXMuY2FsbCgnSEdFVCcsIGNhbXBhaWduX2tleSwgJ3Nlc3Npb25fZXhwaXJlJykpLAog
1254
- IH0KCiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyhzdGFzaCkgZG8KICAgIGlmIG5vdCB2YWx1
1255
- ZSB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0YXNoLicg
1256
- Li4gZmllbGQpCiAgICBlbmQKCiAgICBpZiBmaWVsZCA9PSAncHJveHlfaWQnIGFuZCB2YWx1ZSA9
1257
- PSAnJyB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIHN0YXNo
1258
- LicgLi4gZmllbGQpCiAgICBlbmQKCiAgICBpZiBmaWVsZCA9PSAnc2Vzc2lvbl9leHBpcmUnIGFu
1259
- ZCB2YWx1ZSA8PSAwIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jv
1260
- bmcgc3Rhc2guJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdTQ0FS
1261
- RCcsIGVuYWJsZWRfcHJveHlfaW5kZXhfa2V5KSA9PSAwIHRoZW4KICAgIHJldHVybiByZWRpcy5z
1262
- dGF0dXNfcmVwbHkoJ05PVF9GT1VORCBObyBlbmFibGVkIHByb3hpZXMgZm91bmQnKQogIGVuZAoK
1263
- ICAtLSBQb2ludCBvZiBubyByZXR1cm4KCiAgaWYgcmVkaXMuY2FsbCgnU0lTTUVNQkVSJywgZW5h
1264
- YmxlZF9wcm94eV9pbmRleF9rZXksIHN0YXNoLnByb3h5X2lkKSA9PSAwIHRoZW4KICAgIGxvY2Fs
1265
- IGVuYWJsZWRfcHJveHlfaWQgPSByZWRpcy5jYWxsKCdTUkFORE1FTUJFUicsIGVuYWJsZWRfcHJv
1266
- eHlfaW5kZXhfa2V5KQoKICAgIGlmIG5vdCBlbmFibGVkX3Byb3h5X2lkIG9yIGVuYWJsZWRfcHJv
1267
- eHlfaWQgPT0gJycgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9u
1268
- ZyBlbmFibGVkX3Byb3h5X2lkJykKICAgIGVuZAoKICAgIC0tIHN0eWx1YTogaWdub3JlCiAgICBy
1269
- ZWRpcy5jYWxsKAogICAgICAnSFNFVCcsIHNlc3Npb25fa2V5LAogICAgICAncHJveHlfaWQnLCBl
1270
- bmFibGVkX3Byb3h5X2lkLAogICAgICAnYXV0aG9yaXplZF9hdCcsIHN0YXNoLmF1dGhvcml6ZWRf
1271
- YXQKICAgICkKICBlbHNlCiAgICByZWRpcy5jYWxsKCdIU0VUJywgc2Vzc2lvbl9rZXksICdhdXRo
1272
- b3JpemVkX2F0Jywgc3Rhc2guYXV0aG9yaXplZF9hdCkKICBlbmQKCiAgcmVkaXMuY2FsbCgnUEVY
1273
- UElSRScsIHNlc3Npb25fa2V5LCBzdGFzaC5zZXNzaW9uX2V4cGlyZSkKCiAgcmV0dXJuIHJlZGlz
1274
- LnN0YXR1c19yZXBseSgnT0sgU2Vzc2lvbiBhdXRob3JpemVkJykKZW5kCgpyZWRpcy5yZWdpc3Rl
1275
- cl9mdW5jdGlvbih7CiAgZnVuY3Rpb25fbmFtZSA9ICdhdXRoX3Nlc3Npb24nLAogIGNhbGxiYWNr
1276
- ID0gYXV0aF9zZXNzaW9uLAogIGRlc2NyaXB0aW9uID0gJ0F1dGggc2Vzc2lvbicsCn0pCgotLVtb
1277
- CiAgVXBncmFkZSBzZXNzaW9uCi0tXV0KbG9jYWwgZnVuY3Rpb24gdXBncmFkZV9zZXNzaW9uKGtl
1278
- eXMsIGFyZ3MpCiAgaWYgI2tleXMgfj0gMyBvciAjYXJncyB+PSAxIHRoZW4KICAgIHJldHVybiBy
1279
- ZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdyb25nIGZ1bmN0aW9uIHVzZScpCiAgZW5kCgogIGxvY2Fs
1280
- IGNhbXBhaWduX2tleSA9IGtleXNbMV0KICBsb2NhbCBsdXJlX2tleSA9IGtleXNbMl0KICBsb2Nh
1281
- bCBzZXNzaW9uX2tleSA9IGtleXNbM10KCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgY2FtcGFp
1282
- Z25fa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ05PVF9GT1VO
1283
- RCBDYW1wYWlnbiBub3QgZXhpc3RzJykKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywg
1284
- bHVyZV9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZP
1285
- VU5EIEx1cmUgbm90IGV4aXN0cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIHNl
1286
- c3Npb25fa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ0ZPUkJJ
1287
- RERFTiBTZXNzaW9uIG5vdCBleGlzdHMnKQogIGVuZAoKICBsb2NhbCBzdGFzaCA9IHsKICAgIHNl
1288
- Y3JldCA9IGFyZ3NbMV0sCiAgICBvcmlnX3NlY3JldCA9IHJlZGlzLmNhbGwoJ0hHRVQnLCBzZXNz
1289
- aW9uX2tleSwgJ3NlY3JldCcpLAogICAgaXNfdXBncmFkZWQgPSB0b251bWJlcihyZWRpcy5jYWxs
1290
- KCdIR0VUJywgc2Vzc2lvbl9rZXksICdpc191cGdyYWRlZCcpKSwKICB9CgogIGZvciBmaWVsZCwg
1291
- dmFsdWUgaW4gcGFpcnMoc3Rhc2gpIGRvCiAgICBpZiBub3QgdmFsdWUgdGhlbgogICAgICByZXR1
1292
- cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5k
1293
- CgogICAgaWYgKGZpZWxkID09ICdzZWNyZXQnIG9yIGZpZWxkID09ICdvcmlnX3NlY3JldCcpIGFu
1294
- ZCB2YWx1ZSA9PSAnJyB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIFdy
1295
- b25nIHN0YXNoLicgLi4gZmllbGQpCiAgICBlbmQKICBlbmQKCiAgaWYgc3Rhc2gub3JpZ19zZWNy
1296
- ZXQgfj0gc3Rhc2guc2VjcmV0IHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ0ZP
1297
- UkJJRERFTiBTZXNzaW9uIHNlY3JldCBub3QgbWF0Y2gnKQogIGVuZAoKICBpZiBzdGFzaC5pc191
1298
- cGdyYWRlZCB+PSAwIHRoZW4KICAgIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ09LIFNlc3Np
1299
- b24gYWxscmVhZHkgdXBncmFkZWQnKQogIGVuZAoKICAtLSBQb2ludCBvZiBubyByZXR1cm4KCiAg
1300
- cmVkaXMuY2FsbCgnSFNFVCcsIHNlc3Npb25fa2V5LCAnaXNfdXBncmFkZWQnLCAxKQoKICByZWRp
1301
- cy5jYWxsKCdISU5DUkJZJywgbHVyZV9rZXksICdzZXNzaW9uX2NvdW50JywgMSkKCiAgcmV0dXJu
1302
- IHJlZGlzLnN0YXR1c19yZXBseSgnT0sgU2Vzc2lvbiB1cGdyYWRlZCcpCmVuZAoKcmVkaXMucmVn
1303
- aXN0ZXJfZnVuY3Rpb24oewogIGZ1bmN0aW9uX25hbWUgPSAndXBncmFkZV9zZXNzaW9uJywKICBj
1304
- YWxsYmFjayA9IHVwZ3JhZGVfc2Vzc2lvbiwKICBkZXNjcmlwdGlvbiA9ICdVcGdyYWRlIHNlc3Np
1305
- b24nLAp9KQo=`,
1306
- '7-message.lua',
1307
- `IyFsdWEgbmFtZT1tZXNzYWdlCgotLVtbCiAgQ3JlYXRlIG1lc3NhZ2UKLS1dXQpsb2NhbCBmdW5j
1308
- dGlvbiBjcmVhdGVfbWVzc2FnZShrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDUgb3IgI2FyZ3Mg
1309
- fj0gMjAgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgZnVuY3Rp
1310
- b24gdXNlJykKICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25fa2V5ID0ga2V5c1sxXQogIGxvY2FsIG1l
1311
- c3NhZ2Vfa2V5ID0ga2V5c1syXQogIGxvY2FsIHByb3h5X2tleSA9IGtleXNbM10KICBsb2NhbCB0
1312
- YXJnZXRfa2V5ID0ga2V5c1s0XQogIGxvY2FsIHNlc3Npb25fa2V5ID0ga2V5c1s1XQoKICBpZiBy
1313
- ZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9rZXkpIH49IDEgdGhlbgogICAgcmV0dXJuIHJl
1314
- ZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIENhbXBhaWduIG5vdCBleGlzdHMnKQogIGVuZAoK
1315
- ICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBtZXNzYWdlX2tleSkgfj0gMCB0aGVuCiAgICByZXR1
1316
- cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdDT05GTElDVCBNZXNzYWdlIGFsbHJlYWR5IGV4aXN0cycp
1317
- CiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIHByb3h5X2tleSkgfj0gMSB0aGVuCiAg
1318
- ICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQgUHJveHkgbm90IGV4aXN0cycp
1319
- CiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIHRhcmdldF9rZXkpIH49IDEgdGhlbgog
1320
- ICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIFRhcmdldCBub3QgZXhpc3Rz
1321
- JykKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgc2Vzc2lvbl9rZXkpIH49IDEgdGhl
1322
- bgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIFNlc3Npb24gbm90IGV4
1323
- aXN0cycpCiAgZW5kCgogIGxvY2FsIHN0YXNoID0gewogICAgbWVzc2FnZV9leHBpcmUgPSB0b251
1324
- bWJlcihyZWRpcy5jYWxsKCdIR0VUJywgY2FtcGFpZ25fa2V5LCAnbWVzc2FnZV9leHBpcmUnKSks
1325
- CiAgfQoKICBmb3IgZmllbGQsIHZhbHVlIGluIHBhaXJzKHN0YXNoKSBkbwogICAgaWYgbm90IHZh
1326
- bHVlIHRoZW4KICAgICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcgc3Rhc2gu
1327
- JyAuLiBmaWVsZCkKICAgIGVuZAoKICAgIGlmIGZpZWxkID09ICdtZXNzYWdlX2V4cGlyZScgYW5k
1328
- IHZhbHVlIDw9IDAgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9u
1329
- ZyBzdGFzaC4nIC4uIGZpZWxkKQogICAgZW5kCiAgZW5kCgogIGxvY2FsIG1vZGVsID0gewogICAg
1330
- Y2FtcGFpZ25faWQgPSBhcmdzWzFdLAogICAgbWVzc2FnZV9pZCA9IGFyZ3NbMl0sCiAgICBwcm94
1331
- eV9pZCA9IGFyZ3NbM10sCiAgICB0YXJnZXRfaWQgPSBhcmdzWzRdLAogICAgc2Vzc2lvbl9pZCA9
1332
- IGFyZ3NbNV0sCiAgICB0eXBlID0gYXJnc1s2XSwKICAgIG1ldGhvZCA9IGFyZ3NbN10sCiAgICB1
1333
- cmwgPSBhcmdzWzhdLAogICAgcmVxdWVzdF9oZWFkZXJzID0gYXJnc1s5XSwKICAgIHJlcXVlc3Rf
1334
- Ym9keSA9IGFyZ3NbMTBdLAogICAgc3RhdHVzID0gdG9udW1iZXIoYXJnc1sxMV0pLAogICAgcmVz
1335
- cG9uc2VfaGVhZGVycyA9IGFyZ3NbMTJdLAogICAgcmVzcG9uc2VfYm9keSA9IGFyZ3NbMTNdLAog
1336
- ICAgY29ubmVjdGlvbiA9IGFyZ3NbMTRdLAogICAgcGF5bG9hZCA9IGFyZ3NbMTVdLAogICAgZXJy
1337
- b3JzID0gYXJnc1sxNl0sCiAgICBwcm9jZXNzb3IgPSBhcmdzWzE3XSwKICAgIHN0YXJ0X3RpbWUg
1338
- PSB0b251bWJlcihhcmdzWzE4XSksCiAgICBmaW5pc2hfdGltZSA9IHRvbnVtYmVyKGFyZ3NbMTld
1339
- KSwKICAgIGNyZWF0ZWRfYXQgPSB0b251bWJlcihhcmdzWzIwXSksCiAgfQoKICBmb3IgZmllbGQs
1340
- IHZhbHVlIGluIHBhaXJzKG1vZGVsKSBkbwogICAgaWYgbm90IHZhbHVlIHRoZW4KICAgICAgcmV0
1341
- dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgbW9kZWwuJyAuLiBmaWVsZCkKICAgIGVu
1342
- ZAoKICAgIGlmCiAgICAgICgKICAgICAgICBmaWVsZCA9PSAnY2FtcGFpZ25faWQnCiAgICAgICAg
1343
- b3IgZmllbGQgPT0gJ21lc3NhZ2VfaWQnCiAgICAgICAgb3IgZmllbGQgPT0gJ3Byb3h5X2lkJwog
1344
- ICAgICAgIG9yIGZpZWxkID09ICd0YXJnZXRfaWQnCiAgICAgICAgb3IgZmllbGQgPT0gJ3Nlc3Np
1345
- b25faWQnCiAgICAgICAgb3IgZmllbGQgPT0gJ3R5cGUnCiAgICAgICAgb3IgZmllbGQgPT0gJ21l
1346
- dGhvZCcKICAgICAgICBvciBmaWVsZCA9PSAndXJsJwogICAgICApIGFuZCB2YWx1ZSA9PSAnJwog
1347
- ICAgdGhlbgogICAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBtb2RlbC4n
1348
- IC4uIGZpZWxkKQogICAgZW5kCiAgZW5kCgogIC0tIFBvaW50IG9mIG5vIHJldHVybgoKICBsb2Nh
1349
- bCBzdG9yZSA9IHt9CgogIGZvciBmaWVsZCwgdmFsdWUgaW4gcGFpcnMobW9kZWwpIGRvCiAgICB0
1350
- YWJsZS5pbnNlcnQoc3RvcmUsIGZpZWxkKQogICAgdGFibGUuaW5zZXJ0KHN0b3JlLCB2YWx1ZSkK
1351
- ICBlbmQKCiAgcmVkaXMuY2FsbCgnSFNFVCcsIG1lc3NhZ2Vfa2V5LCB1bnBhY2soc3RvcmUpKQoK
1352
- ICByZWRpcy5jYWxsKCdISU5DUkJZJywgY2FtcGFpZ25fa2V5LCAnbWVzc2FnZV9jb3VudCcsIDEp
1353
- CiAgcmVkaXMuY2FsbCgnSElOQ1JCWScsIHByb3h5X2tleSwgJ21lc3NhZ2VfY291bnQnLCAxKQog
1354
- IHJlZGlzLmNhbGwoJ0hJTkNSQlknLCB0YXJnZXRfa2V5LCAnbWVzc2FnZV9jb3VudCcsIDEpCiAg
1355
- cmVkaXMuY2FsbCgnSElOQ1JCWScsIHNlc3Npb25fa2V5LCAnbWVzc2FnZV9jb3VudCcsIDEpCgog
1356
- IHJlZGlzLmNhbGwoJ1BFWFBJUkUnLCBtZXNzYWdlX2tleSwgc3Rhc2gubWVzc2FnZV9leHBpcmUp
1357
- CgogIHJldHVybiByZWRpcy5zdGF0dXNfcmVwbHkoJ09LIE1lc3NhZ2UgY3JlYXRlZCcpCmVuZAoK
1358
- cmVkaXMucmVnaXN0ZXJfZnVuY3Rpb24oewogIGZ1bmN0aW9uX25hbWUgPSAnY3JlYXRlX21lc3Nh
1359
- Z2UnLAogIGNhbGxiYWNrID0gY3JlYXRlX21lc3NhZ2UsCiAgZGVzY3JpcHRpb24gPSAnQ3JlYXRl
1360
- IG1lc3NhZ2UnLAp9KQoKLS1bWwogIENyZWF0ZSBkdW1teSBtZXNzYWdlCi0tXV0KbG9jYWwgZnVu
1361
- Y3Rpb24gY3JlYXRlX2R1bW15X21lc3NhZ2Uoa2V5cywgYXJncykKICBpZiAja2V5cyB+PSA1IG9y
1362
- ICNhcmdzIH49IDAgdGhlbgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3Jvbmcg
1363
- ZnVuY3Rpb24gdXNlJykKICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25fa2V5ID0ga2V5c1sxXQogIGxv
1364
- Y2FsIG1lc3NhZ2Vfa2V5ID0ga2V5c1syXQogIGxvY2FsIHByb3h5X2tleSA9IGtleXNbM10KICBs
1365
- b2NhbCB0YXJnZXRfa2V5ID0ga2V5c1s0XQogIGxvY2FsIHNlc3Npb25fa2V5ID0ga2V5c1s1XQoK
1366
- ICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9rZXkpIH49IDEgdGhlbgogICAgcmV0
1367
- dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIENhbXBhaWduIG5vdCBleGlzdHMnKQog
1368
- IGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBtZXNzYWdlX2tleSkgfj0gMCB0aGVuCiAg
1369
- ICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdDT05GTElDVCBNZXNzYWdlIGFsbHJlYWR5IGV4
1370
- aXN0cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIHByb3h5X2tleSkgfj0gMSB0
1371
- aGVuCiAgICByZXR1cm4gcmVkaXMuc3RhdHVzX3JlcGx5KCdOT1RfRk9VTkQgUHJveHkgbm90IGV4
1372
- aXN0cycpCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIHRhcmdldF9rZXkpIH49IDEg
1373
- dGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIFRhcmdldCBub3Qg
1374
- ZXhpc3RzJykKICBlbmQKCiAgaWYgcmVkaXMuY2FsbCgnRVhJU1RTJywgc2Vzc2lvbl9rZXkpIH49
1375
- IDEgdGhlbgogICAgcmV0dXJuIHJlZGlzLnN0YXR1c19yZXBseSgnTk9UX0ZPVU5EIFNlc3Npb24g
1376
- bm90IGV4aXN0cycpCiAgZW5kCgogIC0tIFBvaW50IG9mIG5vIHJldHVybgoKICByZWRpcy5jYWxs
1377
- KCdISU5DUkJZJywgY2FtcGFpZ25fa2V5LCAnbWVzc2FnZV9jb3VudCcsIDEpCiAgcmVkaXMuY2Fs
1378
- bCgnSElOQ1JCWScsIHByb3h5X2tleSwgJ21lc3NhZ2VfY291bnQnLCAxKQogIHJlZGlzLmNhbGwo
1379
- J0hJTkNSQlknLCB0YXJnZXRfa2V5LCAnbWVzc2FnZV9jb3VudCcsIDEpCiAgcmVkaXMuY2FsbCgn
1380
- SElOQ1JCWScsIHNlc3Npb25fa2V5LCAnbWVzc2FnZV9jb3VudCcsIDEpCgogIHJldHVybiByZWRp
1381
- cy5zdGF0dXNfcmVwbHkoJ09LIER1bW15IG1lc3NhZ2UgY3JlYXRlZCcpCmVuZAoKcmVkaXMucmVn
1382
- aXN0ZXJfZnVuY3Rpb24oewogIGZ1bmN0aW9uX25hbWUgPSAnY3JlYXRlX2R1bW15X21lc3NhZ2Un
1383
- LAogIGNhbGxiYWNrID0gY3JlYXRlX2R1bW15X21lc3NhZ2UsCiAgZGVzY3JpcHRpb24gPSAnQ3Jl
1384
- YXRlIGR1bW15IG1lc3NhZ2UnLAp9KQoKLS1bWwogIFJlYWQgbWVzc2FnZQotLV1dCmxvY2FsIGZ1
1385
- bmN0aW9uIHJlYWRfbWVzc2FnZShrZXlzLCBhcmdzKQogIGlmICNrZXlzIH49IDIgb3IgI2FyZ3Mg
1386
- fj0gMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3JfcmVwbHkoJ0VSUiBXcm9uZyBmdW5jdGlv
1387
- biB1c2UnKQogIGVuZAoKICBsb2NhbCBjYW1wYWlnbl9rZXkgPSBrZXlzWzFdCiAgbG9jYWwgbWVz
1388
- c2FnZV9rZXkgPSBrZXlzWzJdCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNUUycsIGNhbXBhaWduX2tl
1389
- eSkgfj0gMSB0aGVuCiAgICByZXR1cm4gbmlsCiAgZW5kCgogIGlmIHJlZGlzLmNhbGwoJ0VYSVNU
1390
- UycsIG1lc3NhZ2Vfa2V5KSB+PSAxIHRoZW4KICAgIHJldHVybiBuaWwKICBlbmQKCiAgLS0gc3R5
1391
- bHVhOiBpZ25vcmUKICBsb2NhbCB2YWx1ZXMgPSByZWRpcy5jYWxsKAogICAgJ0hNR0VUJywgbWVz
1392
- c2FnZV9rZXksCiAgICAnY2FtcGFpZ25faWQnLAogICAgJ21lc3NhZ2VfaWQnLAogICAgJ3Byb3h5
1393
- X2lkJywKICAgICd0YXJnZXRfaWQnLAogICAgJ3Nlc3Npb25faWQnLAogICAgJ3R5cGUnLAogICAg
1394
- J21ldGhvZCcsCiAgICAndXJsJywKICAgICdzdGF0dXMnLAogICAgJ3Byb2Nlc3NvcicsCiAgICAn
1395
- c3RhcnRfdGltZScsCiAgICAnZmluaXNoX3RpbWUnLAogICAgJ2NyZWF0ZWRfYXQnCiAgKQoKICBp
1396
- ZiAjdmFsdWVzIH49IDEzIHRoZW4KICAgIHJldHVybiByZWRpcy5lcnJvcl9yZXBseSgnRVJSIE1h
1397
- bGZvcm0gdmFsdWVzJykKICBlbmQKCiAgbG9jYWwgbW9kZWwgPSB7CiAgICBjYW1wYWlnbl9pZCA9
1398
- IHZhbHVlc1sxXSwKICAgIG1lc3NhZ2VfaWQgPSB2YWx1ZXNbMl0sCiAgICBwcm94eV9pZCA9IHZh
1399
- bHVlc1szXSwKICAgIHRhcmdldF9pZCA9IHZhbHVlc1s0XSwKICAgIHNlc3Npb25faWQgPSB2YWx1
1400
- ZXNbNV0sCiAgICB0eXBlID0gdmFsdWVzWzZdLAogICAgbWV0aG9kID0gdmFsdWVzWzddLAogICAg
1401
- dXJsID0gdmFsdWVzWzhdLAogICAgc3RhdHVzID0gdG9udW1iZXIodmFsdWVzWzldKSwKICAgIHBy
1402
- b2Nlc3NvciA9IHZhbHVlc1sxMF0sCiAgICBzdGFydF90aW1lID0gdG9udW1iZXIodmFsdWVzWzEx
1403
- XSksCiAgICBmaW5pc2hfdGltZSA9IHRvbnVtYmVyKHZhbHVlc1sxMl0pLAogICAgY3JlYXRlZF9h
1404
- dCA9IHRvbnVtYmVyKHZhbHVlc1sxM10pLAogIH0KCiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWly
1405
- cyhtb2RlbCkgZG8KICAgIGlmIG5vdCB2YWx1ZSB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJv
1406
- cl9yZXBseSgnRVJSIE1hbGZvcm0gbW9kZWwuJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICBy
1407
- ZXR1cm4geyBtYXAgPSBtb2RlbCB9CmVuZAoKcmVkaXMucmVnaXN0ZXJfZnVuY3Rpb24oewogIGZ1
1408
- bmN0aW9uX25hbWUgPSAncmVhZF9tZXNzYWdlJywKICBjYWxsYmFjayA9IHJlYWRfbWVzc2FnZSwK
1409
- ICBmbGFncyA9IHsgJ25vLXdyaXRlcycgfSwKICBkZXNjcmlwdGlvbiA9ICdSZWFkIG1lc3NhZ2Un
1410
- LAp9KQoKLS1bWwogIFJlYWQgZnVsbCBtZXNzYWdlCi0tXV0KbG9jYWwgZnVuY3Rpb24gcmVhZF9m
1411
- dWxsX21lc3NhZ2Uoa2V5cywgYXJncykKICBpZiAja2V5cyB+PSAyIG9yICNhcmdzIH49IDAgdGhl
1412
- bgogICAgcmV0dXJuIHJlZGlzLmVycm9yX3JlcGx5KCdFUlIgV3JvbmcgZnVuY3Rpb24gdXNlJykK
1413
- ICBlbmQKCiAgbG9jYWwgY2FtcGFpZ25fa2V5ID0ga2V5c1sxXQogIGxvY2FsIG1lc3NhZ2Vfa2V5
1414
- ID0ga2V5c1syXQoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBjYW1wYWlnbl9rZXkpIH49IDEg
1415
- dGhlbgogICAgcmV0dXJuIG5pbAogIGVuZAoKICBpZiByZWRpcy5jYWxsKCdFWElTVFMnLCBtZXNz
1416
- YWdlX2tleSkgfj0gMSB0aGVuCiAgICByZXR1cm4gbmlsCiAgZW5kCgogIC0tIHN0eWx1YTogaWdu
1417
- b3JlCiAgbG9jYWwgdmFsdWVzID0gcmVkaXMuY2FsbCgKICAgICdITUdFVCcsIG1lc3NhZ2Vfa2V5
1418
- LAogICAgJ2NhbXBhaWduX2lkJywKICAgICdtZXNzYWdlX2lkJywKICAgICdwcm94eV9pZCcsCiAg
1419
- ICAndGFyZ2V0X2lkJywKICAgICdzZXNzaW9uX2lkJywKICAgICd0eXBlJywKICAgICdtZXRob2Qn
1420
- LAogICAgJ3VybCcsCiAgICAncmVxdWVzdF9oZWFkZXJzJywKICAgICdyZXF1ZXN0X2JvZHknLAog
1421
- ICAgJ3N0YXR1cycsCiAgICAncmVzcG9uc2VfaGVhZGVycycsCiAgICAncmVzcG9uc2VfYm9keScs
1422
- CiAgICAnY29ubmVjdGlvbicsCiAgICAncGF5bG9hZCcsCiAgICAnZXJyb3JzJywKICAgICdwcm9j
1423
- ZXNzb3InLAogICAgJ3N0YXJ0X3RpbWUnLAogICAgJ2ZpbmlzaF90aW1lJywKICAgICdjcmVhdGVk
1424
- X2F0JwogICkKCiAgaWYgI3ZhbHVlcyB+PSAyMCB0aGVuCiAgICByZXR1cm4gcmVkaXMuZXJyb3Jf
1425
- cmVwbHkoJ0VSUiBNYWxmb3JtIHZhbHVlcycpCiAgZW5kCgogIGxvY2FsIG1vZGVsID0gewogICAg
1426
- Y2FtcGFpZ25faWQgPSB2YWx1ZXNbMV0sCiAgICBtZXNzYWdlX2lkID0gdmFsdWVzWzJdLAogICAg
1427
- cHJveHlfaWQgPSB2YWx1ZXNbM10sCiAgICB0YXJnZXRfaWQgPSB2YWx1ZXNbNF0sCiAgICBzZXNz
1428
- aW9uX2lkID0gdmFsdWVzWzVdLAogICAgdHlwZSA9IHZhbHVlc1s2XSwKICAgIG1ldGhvZCA9IHZh
1429
- bHVlc1s3XSwKICAgIHVybCA9IHZhbHVlc1s4XSwKICAgIHJlcXVlc3RfaGVhZGVycyA9IHZhbHVl
1430
- c1s5XSwKICAgIHJlcXVlc3RfYm9keSA9IHZhbHVlc1sxMF0sCiAgICBzdGF0dXMgPSB0b251bWJl
1431
- cih2YWx1ZXNbMTFdKSwKICAgIHJlc3BvbnNlX2hlYWRlcnMgPSB2YWx1ZXNbMTJdLAogICAgcmVz
1432
- cG9uc2VfYm9keSA9IHZhbHVlc1sxM10sCiAgICBjb25uZWN0aW9uID0gdmFsdWVzWzE0XSwKICAg
1433
- IHBheWxvYWQgPSB2YWx1ZXNbMTVdLAogICAgZXJyb3JzID0gdmFsdWVzWzE2XSwKICAgIHByb2Nl
1434
- c3NvciA9IHZhbHVlc1sxN10sCiAgICBzdGFydF90aW1lID0gdG9udW1iZXIodmFsdWVzWzE4XSks
1435
- CiAgICBmaW5pc2hfdGltZSA9IHRvbnVtYmVyKHZhbHVlc1sxOV0pLAogICAgY3JlYXRlZF9hdCA9
1436
- IHRvbnVtYmVyKHZhbHVlc1syMF0pLAogIH0KCiAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBwYWlycyht
1437
- b2RlbCkgZG8KICAgIGlmIG5vdCB2YWx1ZSB0aGVuCiAgICAgIHJldHVybiByZWRpcy5lcnJvcl9y
1438
- ZXBseSgnRVJSIE1hbGZvcm0gbW9kZWwuJyAuLiBmaWVsZCkKICAgIGVuZAogIGVuZAoKICByZXR1
1439
- cm4geyBtYXAgPSBtb2RlbCB9CmVuZAoKcmVkaXMucmVnaXN0ZXJfZnVuY3Rpb24oewogIGZ1bmN0
1440
- aW9uX25hbWUgPSAncmVhZF9mdWxsX21lc3NhZ2UnLAogIGNhbGxiYWNrID0gcmVhZF9mdWxsX21l
1441
- c3NhZ2UsCiAgZmxhZ3MgPSB7ICduby13cml0ZXMnIH0sCiAgZGVzY3JpcHRpb24gPSAnUmVhZCBm
1442
- dWxsIG1lc3NhZ2UnLAp9KQo=`,
1443
- ];
1444
- export function makeRedisFunctions() {
1445
- const entries = [];
1446
- for (let idx = 0; idx < REDIS_FUNCTIONS.length; idx += 2) {
1447
- const name = REDIS_FUNCTIONS[idx];
1448
- const body = REDIS_FUNCTIONS[idx + 1];
1449
- if (name && body) {
1450
- const data = Buffer.from(body, 'base64').toString();
1451
- entries.push([name, data]);
1452
- }
1453
- }
1454
- return entries;
1455
- }
1
+ export const redisFunctions = new Map([
2
+ [
3
+ "1-campaign.lua",
4
+ "#!lua name=campaign\n\n--[[\n Create campaign\n--]]\nlocal function create_campaign(keys, args)\n if #keys ~= 4 or #args ~= 10 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_mirror_domains_key = keys[2]\n local campaign_session_cookie_names_key = keys[3]\n local campaign_index_key = keys[4]\n\n if redis.call('EXISTS', campaign_key) ~= 0 then\n return redis.status_reply('CONFLICT Campaign allready exists')\n end\n\n local model = {\n campaign_id = args[1],\n mirror_domain = args[2],\n description = args[3],\n crypt_secret = args[4],\n upgrade_session_path = args[5],\n session_cookie_name = args[6],\n session_expire = tonumber(args[7]),\n new_session_expire = tonumber(args[8]),\n message_expire = tonumber(args[9]),\n session_count = 0,\n message_count = 0,\n created_at = tonumber(args[10]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n\n if\n (\n k == 'campaign_id'\n or k == 'mirror_domain'\n or k == 'crypt_secret'\n or k == 'upgrade_session_path'\n or k == 'session_cookie_name'\n ) and v == ''\n then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n\n if (k == 'session_expire' or k == 'new_session_expire' or k == 'message_expire') and v <= 0 then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n end\n\n if redis.call('SISMEMBER', campaign_mirror_domains_key, model.mirror_domain) ~= 0 then\n return redis.status_reply('CONFLICT Campaign mirror_domain allready taken')\n end\n\n if redis.call('SISMEMBER', campaign_session_cookie_names_key, model.session_cookie_name) ~= 0 then\n return redis.status_reply('CONFLICT Campaign session_cookie_name allready taken')\n end\n\n -- Point of no return\n\n local store = {}\n\n for k, v in pairs(model) do\n table.insert(store, k)\n table.insert(store, v)\n end\n\n redis.call('HSET', campaign_key, unpack(store))\n\n redis.call('SADD', campaign_mirror_domains_key, model.mirror_domain)\n\n redis.call('SADD', campaign_session_cookie_names_key, model.session_cookie_name)\n\n redis.call('ZADD', campaign_index_key, model.created_at, model.campaign_id)\n\n return redis.status_reply('OK Campaign created')\nend\n\nredis.register_function({\n function_name = 'create_campaign',\n callback = create_campaign,\n description = 'Create campaign',\n})\n\n--[[\n Read campaign\n--]]\nlocal function read_campaign(keys, args)\n if #keys ~= 2 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n -- stylua: ignore\n local values = redis.call(\n 'HMGET', campaign_key,\n 'campaign_id',\n 'mirror_domain',\n 'session_count',\n 'message_count',\n 'created_at'\n )\n\n if #values ~= 5 then\n return redis.error_reply('ERR Malform values')\n end\n\n local model = {\n campaign_id = values[1],\n mirror_domain = values[2],\n is_locked = redis.call('EXISTS', campaign_lock_key),\n session_count = tonumber(values[3]),\n message_count = tonumber(values[4]),\n created_at = tonumber(values[5]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Malform model.' .. k)\n end\n end\n\n return { map = model }\nend\n\nredis.register_function({\n function_name = 'read_campaign',\n callback = read_campaign,\n flags = { 'no-writes' },\n description = 'Read campaign',\n})\n\n--[[\n Read full campaign\n--]]\nlocal function read_full_campaign(keys, args)\n if #keys ~= 7 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_session_cookie_names_key = keys[2]\n local campaign_lock_key = keys[3]\n local proxy_index_key = keys[4]\n local target_index_key = keys[5]\n local redirector_index_key = keys[6]\n local lure_index_key = keys[7]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n -- stylua: ignore\n local values = redis.call(\n 'HMGET', campaign_key,\n 'campaign_id',\n 'mirror_domain',\n 'description',\n 'crypt_secret',\n 'upgrade_session_path',\n 'session_cookie_name',\n 'session_expire',\n 'new_session_expire',\n 'message_expire',\n 'session_count',\n 'message_count',\n 'created_at'\n )\n\n if #values ~= 12 then\n return redis.error_reply('ERR Malform values')\n end\n\n local model = {\n campaign_id = values[1],\n mirror_domain = values[2],\n description = values[3],\n crypt_secret = values[4],\n upgrade_session_path = values[5],\n session_cookie_name = values[6],\n session_cookie_names = redis.call('SMEMBERS', campaign_session_cookie_names_key),\n session_expire = tonumber(values[7]),\n new_session_expire = tonumber(values[8]),\n message_expire = tonumber(values[9]),\n is_locked = redis.call('EXISTS', campaign_lock_key),\n proxy_count = redis.call('ZCARD', proxy_index_key),\n target_count = redis.call('ZCARD', target_index_key),\n redirector_count = redis.call('ZCARD', redirector_index_key),\n lure_count = redis.call('ZCARD', lure_index_key),\n session_count = tonumber(values[10]),\n message_count = tonumber(values[11]),\n created_at = tonumber(values[12]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Malform model.' .. k)\n end\n end\n\n return { map = model }\nend\n\nredis.register_function({\n function_name = 'read_full_campaign',\n callback = read_full_campaign,\n flags = { 'no-writes' },\n description = 'Read full campaign',\n})\n\n--[[\n Read campaign index\n--]]\nlocal function read_campaign_index(keys, args)\n if #keys ~= 1 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_index_key = keys[1]\n\n return redis.call('ZRANGE', campaign_index_key, 0, -1)\nend\n\nredis.register_function({\n function_name = 'read_campaign_index',\n callback = read_campaign_index,\n flags = { 'no-writes' },\n description = 'Read campaign index',\n})\n\n--[[\n Lock campaign\n--]]\nlocal function lock_campaign(keys, args)\n if #keys ~= 2 or #args ~= 2 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 0 then\n return redis.status_reply('FORBIDDEN Campaign allready locked')\n end\n\n local stash = {\n lock_secret = args[1],\n lock_timeout = tonumber(args[2]),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if k == 'lock_secret' and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if k == 'lock_timeout' and v <= 0 then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n -- Point of no return\n\n redis.call('SET', campaign_lock_key, stash.lock_secret, 'PX', stash.lock_timeout)\n\n return redis.status_reply('OK Campaign locked')\nend\n\nredis.register_function({\n function_name = 'lock_campaign',\n callback = lock_campaign,\n description = 'Lock campaign',\n})\n\n--[[\n Unlock campaign\n--]]\nlocal function unlock_campaign(keys, args)\n if #keys ~= 2 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('OK Campaign not locked')\n end\n\n local stash = {\n lock_secret = args[1],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('DEL', campaign_lock_key)\n\n return redis.status_reply('OK Campaign unlocked')\nend\n\nredis.register_function({\n function_name = 'unlock_campaign',\n callback = unlock_campaign,\n description = 'Unlock campaign',\n})\n\n--[[\n Update campaign\n--]]\nlocal function update_campaign(keys, args)\n if #keys ~= 2 or #args < 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n local stash = {\n lock_secret = table.remove(args),\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if #args % 2 ~= 0 then\n return redis.error_reply('ERR Odd number of args')\n end\n\n local model = {}\n\n for i = 1, #args, 2 do\n local k, v = args[i], args[i + 1]\n\n if model[k] then\n return redis.error_reply('ERR Duplicate model.' .. k)\n end\n\n if k == 'description' then\n model.description = v\n elseif k == 'session_expire' then\n model.session_expire = tonumber(v)\n elseif k == 'new_session_expire' then\n model.new_session_expire = tonumber(v)\n elseif k == 'message_expire' then\n model.message_expire = tonumber(v)\n else\n return redis.error_reply('ERR Unknown model.' .. k)\n end\n end\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n end\n\n if next(model) == nil then\n return redis.status_reply('OK Nothing to update')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n local store = {}\n\n for k, v in pairs(model) do\n table.insert(store, k)\n table.insert(store, v)\n end\n\n redis.call('HSET', campaign_key, unpack(store))\n\n return redis.status_reply('OK Campaign updated')\nend\n\nredis.register_function({\n function_name = 'update_campaign',\n callback = update_campaign,\n description = 'Update campaign',\n})\n\n--[[\n Delete campaign\n--]]\nlocal function delete_campaign(keys, args)\n if #keys ~= 9 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local campaign_mirror_domains_key = keys[3]\n local campaign_session_cookie_names_key = keys[4]\n local campaign_index_key = keys[5]\n local proxy_index_key = keys[6]\n local target_index_key = keys[7]\n local redirector_index_key = keys[8]\n local lure_index_key = keys[9]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n local stash = {\n lock_secret = args[1],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n campaign_id = redis.call('HGET', campaign_key, 'campaign_id'),\n mirror_domain = redis.call('HGET', campaign_key, 'mirror_domain'),\n session_cookie_name = redis.call('HGET', campaign_key, 'session_cookie_name'),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if\n (\n k == 'lock_secret'\n or k == 'orig_lock_secret'\n or k == 'campaign_id'\n or k == 'mirror_domain'\n or k == 'session_cookie_name'\n ) and v == ''\n then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if redis.call('ZCARD', proxy_index_key) ~= 0 then\n return redis.status_reply('FORBIDDEN Campaign proxies exists')\n end\n\n if redis.call('ZCARD', target_index_key) ~= 0 then\n return redis.status_reply('FORBIDDEN Campaign targets exists')\n end\n\n if redis.call('ZCARD', redirector_index_key) ~= 0 then\n return redis.status_reply('FORBIDDEN Campaign redirectors exists')\n end\n\n if redis.call('ZCARD', lure_index_key) ~= 0 then\n return redis.status_reply('FORBIDDEN Campaign lures exists')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('DEL', campaign_key, campaign_lock_key)\n\n redis.call('SREM', campaign_mirror_domains_key, stash.mirror_domain)\n\n redis.call('SREM', campaign_session_cookie_names_key, stash.session_cookie_name)\n\n redis.call('ZREM', campaign_index_key, stash.campaign_id)\n\n return redis.status_reply('OK Campaign deleted')\nend\n\nredis.register_function({\n function_name = 'delete_campaign',\n callback = delete_campaign,\n description = 'Delete campaign',\n})\n"
5
+ ],
6
+ [
7
+ "2-proxy.lua",
8
+ "#!lua name=proxy\n\n--[[\n Create proxy\n--]]\nlocal function create_proxy(keys, args)\n if #keys ~= 5 or #args ~= 5 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local proxy_key = keys[3]\n local proxy_urls_key = keys[4]\n local proxy_index_key = keys[5]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', proxy_key) ~= 0 then\n return redis.status_reply('CONFLICT Proxy allready exists')\n end\n\n local stash = {\n lock_secret = args[5],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n local model = {\n campaign_id = args[1],\n proxy_id = args[2],\n url = args[3],\n is_enabled = 0,\n message_count = 0,\n created_at = args[4],\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n\n if (k == 'campaign_id' or k == 'proxy_id' or k == 'url') and v == '' then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n end\n\n if redis.call('SISMEMBER', proxy_urls_key, model.url) ~= 0 then\n return redis.status_reply('CONFLICT Proxy url allready taken')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n local store = {}\n\n for k, v in pairs(model) do\n table.insert(store, k)\n table.insert(store, v)\n end\n\n redis.call('HSET', proxy_key, unpack(store))\n\n redis.call('SADD', proxy_urls_key, model.url)\n\n redis.call('ZADD', proxy_index_key, model.created_at, model.proxy_id)\n\n return redis.status_reply('OK Proxy created')\nend\n\nredis.register_function({\n function_name = 'create_proxy',\n callback = create_proxy,\n description = 'Create proxy',\n})\n\n--[[\n Read proxy\n--]]\nlocal function read_proxy(keys, args)\n if #keys ~= 2 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local proxy_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n if redis.call('EXISTS', proxy_key) ~= 1 then\n return nil\n end\n\n -- stylua: ignore\n local values = redis.call(\n 'HMGET', proxy_key,\n 'campaign_id',\n 'proxy_id',\n 'url',\n 'is_enabled',\n 'message_count',\n 'created_at'\n )\n\n if #values ~= 6 then\n return redis.error_reply('ERR Malform values')\n end\n\n local model = {\n campaign_id = values[1],\n proxy_id = values[2],\n url = values[3],\n is_enabled = tonumber(values[4]),\n message_count = tonumber(values[5]),\n created_at = tonumber(values[6]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Malform model.' .. k)\n end\n end\n\n return { map = model }\nend\n\nredis.register_function({\n function_name = 'read_proxy',\n callback = read_proxy,\n flags = { 'no-writes' },\n description = 'Read proxy',\n})\n\n--[[\n Read proxy index\n--]]\nlocal function read_proxy_index(keys, args)\n if #keys ~= 2 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local proxy_index_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n return redis.call('ZRANGE', proxy_index_key, 0, -1)\nend\n\nredis.register_function({\n function_name = 'read_proxy_index',\n callback = read_proxy_index,\n flags = { 'no-writes' },\n description = 'Read proxy index',\n})\n\n--[[\n Enable proxy\n--]]\nlocal function enable_proxy(keys, args)\n if #keys ~= 4 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local proxy_key = keys[3]\n local enabled_proxy_index_key = keys[4]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', proxy_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Proxy not exists')\n end\n\n local stash = {\n lock_secret = args[1],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n proxy_id = redis.call('HGET', proxy_key, 'proxy_id'),\n is_enabled = tonumber(redis.call('HGET', proxy_key, 'is_enabled')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret' or k == 'proxy_id') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if stash.is_enabled ~= 0 then\n return redis.status_reply('OK Proxy allready enabled')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('HSET', proxy_key, 'is_enabled', 1)\n\n redis.call('SADD', enabled_proxy_index_key, stash.proxy_id)\n\n return redis.status_reply('OK Proxy enabled')\nend\n\nredis.register_function({\n function_name = 'enable_proxy',\n callback = enable_proxy,\n description = 'Enable proxy',\n})\n\n--[[\n Disable proxy\n--]]\nlocal function disable_proxy(keys, args)\n if #keys ~= 4 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local proxy_key = keys[3]\n local enabled_proxy_index_key = keys[4]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', proxy_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Proxy not exists')\n end\n\n local stash = {\n lock_secret = args[1],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n proxy_id = redis.call('HGET', proxy_key, 'proxy_id'),\n is_enabled = tonumber(redis.call('HGET', proxy_key, 'is_enabled')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret' or k == 'proxy_id') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if stash.is_enabled == 0 then\n return redis.status_reply('OK Proxy allready disabled')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('HSET', proxy_key, 'is_enabled', 0)\n\n redis.call('SREM', enabled_proxy_index_key, stash.proxy_id)\n\n return redis.status_reply('OK Proxy disabled')\nend\n\nredis.register_function({\n function_name = 'disable_proxy',\n callback = disable_proxy,\n description = 'Disable proxy',\n})\n\n--[[\n Delete proxy\n--]]\nlocal function delete_proxy(keys, args)\n if #keys ~= 5 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local proxy_key = keys[3]\n local proxy_urls_key = keys[4]\n local proxy_index_key = keys[5]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', proxy_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Proxy not exists')\n end\n\n local stash = {\n lock_secret = args[1],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n proxy_id = redis.call('HGET', proxy_key, 'proxy_id'),\n url = redis.call('HGET', proxy_key, 'url'),\n is_enabled = tonumber(redis.call('HGET', proxy_key, 'is_enabled')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if\n (k == 'lock_secret' or k == 'orig_lock_secret' or k == 'proxy_id' or k == 'url') and v == ''\n then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if stash.is_enabled ~= 0 then\n return redis.status_reply('FORBIDDEN Proxy not disabled')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('DEL', proxy_key)\n\n redis.call('SREM', proxy_urls_key, stash.url)\n\n redis.call('ZREM', proxy_index_key, stash.proxy_id)\n\n return redis.status_reply('OK Proxy deleted')\nend\n\nredis.register_function({\n function_name = 'delete_proxy',\n callback = delete_proxy,\n description = 'Delete proxy',\n})\n"
9
+ ],
10
+ [
11
+ "3-target.lua",
12
+ "#!lua name=target\n\n--[[\n Create target\n--]]\nlocal function create_target(keys, args)\n if #keys ~= 7 or #args ~= 23 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local target_key = keys[3]\n local target_donors_key = keys[4]\n local target_mirrors_key = keys[5]\n local target_mirror_hosts_key = keys[6]\n local target_index_key = keys[7]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', target_key) ~= 0 then\n return redis.status_reply('CONFLICT Target allready exists')\n end\n\n local stash = {\n lock_secret = args[23],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n mirror_domain = redis.call('HGET', campaign_key, 'mirror_domain'),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret' or k == 'mirror_domain') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n local model = {\n campaign_id = args[1],\n target_id = args[2],\n access_level = args[3],\n donor_secure = tonumber(args[4]),\n donor_sub = args[5],\n donor_domain = args[6],\n donor_port = args[7],\n mirror_secure = tonumber(args[8]),\n mirror_sub = args[9],\n mirror_port = args[10],\n connect_timeout = tonumber(args[11]),\n simple_timeout = tonumber(args[12]),\n stream_timeout = tonumber(args[13]),\n headers_size_limit = tonumber(args[14]),\n body_size_limit = tonumber(args[15]),\n main_page = args[16],\n not_found_page = args[17],\n favicon_ico = args[18],\n robots_txt = args[19],\n sitemap_xml = args[20],\n allow_websockets = tonumber(args[21]),\n is_enabled = 0,\n message_count = 0,\n created_at = tonumber(args[22]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n\n if\n (\n k == 'campaign_id'\n or k == 'target_id'\n or k == 'access_level'\n or k == 'donor_sub'\n or k == 'donor_domain'\n or k == 'donor_port'\n or k == 'mirror_sub'\n or k == 'mirror_port'\n ) and v == ''\n then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n end\n\n -- stylua: ignore\n local donor_str = model.campaign_id\n .. '\\t' .. model.donor_sub\n .. '\\t' .. model.donor_domain\n .. '\\t' .. model.donor_port\n\n if redis.call('SISMEMBER', target_donors_key, donor_str) ~= 0 then\n return redis.status_reply('CONFLICT Target donor allready taken')\n end\n\n -- stylua: ignore\n local mirror_str = model.campaign_id\n .. '\\t' .. model.mirror_sub\n .. '\\t' .. model.mirror_port\n\n if redis.call('SISMEMBER', target_mirrors_key, mirror_str) ~= 0 then\n return redis.status_reply('CONFLICT Target mirror allready taken')\n end\n\n local mirror_hostname = model.mirror_sub ~= '.'\n and (model.mirror_sub .. '.' .. stash.mirror_domain)\n or stash.mirror_domain\n local mirror_host = mirror_hostname .. ':' .. model.mirror_port\n\n if redis.call('HEXISTS', target_mirror_hosts_key, mirror_host) ~= 0 then\n return redis.error_reply('ERR Target mirror host allready taken')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n local store = {}\n\n for k, v in pairs(model) do\n table.insert(store, k)\n table.insert(store, v)\n end\n\n redis.call('HSET', target_key, unpack(store))\n\n redis.call('SADD', target_donors_key, donor_str)\n redis.call('SADD', target_mirrors_key, mirror_str)\n\n local target_link = model.campaign_id .. '\\t' .. model.target_id\n redis.call('HSET', target_mirror_hosts_key, mirror_host, target_link)\n\n redis.call('ZADD', target_index_key, model.created_at, model.target_id)\n\n return redis.status_reply('OK Target created')\nend\n\nredis.register_function({\n function_name = 'create_target',\n callback = create_target,\n description = 'Create target',\n})\n\n--[[\n Read target\n--]]\nlocal function read_target(keys, args)\n if #keys ~= 2 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local target_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n if redis.call('EXISTS', target_key) ~= 1 then\n return nil\n end\n\n -- stylua: ignore\n local values = redis.call(\n 'HMGET', target_key,\n 'campaign_id',\n 'target_id',\n 'access_level',\n 'donor_secure',\n 'donor_sub',\n 'donor_domain',\n 'donor_port',\n 'mirror_secure',\n 'mirror_sub',\n 'mirror_port',\n 'is_enabled',\n 'message_count',\n 'created_at'\n )\n\n if #values ~= 13 then\n return redis.error_reply('ERR Malform values')\n end\n\n local model = {\n campaign_id = values[1],\n target_id = values[2],\n access_level = values[3],\n donor_secure = tonumber(values[4]),\n donor_sub = values[5],\n donor_domain = values[6],\n donor_port = values[7],\n mirror_secure = tonumber(values[8]),\n mirror_sub = values[9],\n mirror_domain = redis.call('HGET', campaign_key, 'mirror_domain'),\n mirror_port = values[10],\n is_enabled = tonumber(values[11]),\n message_count = tonumber(values[12]),\n created_at = tonumber(values[13]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Malform model.' .. k)\n end\n end\n\n return { map = model }\nend\n\nredis.register_function({\n function_name = 'read_target',\n callback = read_target,\n flags = { 'no-writes' },\n description = 'Read target',\n})\n\n--[[\n Read full target\n--]]\nlocal function read_full_target(keys, args)\n if #keys ~= 3 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local target_key = keys[2]\n local target_labels_key = keys[3]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n if redis.call('EXISTS', target_key) ~= 1 then\n return nil\n end\n\n -- stylua: ignore\n local values = redis.call(\n 'HMGET', target_key,\n 'campaign_id',\n 'target_id',\n 'access_level',\n 'donor_secure',\n 'donor_sub',\n 'donor_domain',\n 'donor_port',\n 'mirror_secure',\n 'mirror_sub',\n 'mirror_port',\n 'connect_timeout',\n 'simple_timeout',\n 'stream_timeout',\n 'headers_size_limit',\n 'body_size_limit',\n 'main_page',\n 'not_found_page',\n 'favicon_ico',\n 'robots_txt',\n 'sitemap_xml',\n 'allow_websockets',\n 'is_enabled',\n 'message_count',\n 'created_at'\n )\n\n if #values ~= 24 then\n return redis.error_reply('ERR Malform values')\n end\n\n local model = {\n campaign_id = values[1],\n target_id = values[2],\n access_level = values[3],\n donor_secure = tonumber(values[4]),\n donor_sub = values[5],\n donor_domain = values[6],\n donor_port = values[7],\n mirror_secure = tonumber(values[8]),\n mirror_sub = values[9],\n mirror_domain = redis.call('HGET', campaign_key, 'mirror_domain'),\n mirror_port = values[10],\n labels = redis.call('SMEMBERS', target_labels_key),\n connect_timeout = tonumber(values[11]),\n simple_timeout = tonumber(values[12]),\n stream_timeout = tonumber(values[13]),\n headers_size_limit = tonumber(values[14]),\n body_size_limit = tonumber(values[15]),\n main_page = values[16],\n not_found_page = values[17],\n favicon_ico = values[18],\n robots_txt = values[19],\n sitemap_xml = values[20],\n allow_websockets = tonumber(values[21]),\n is_enabled = tonumber(values[22]),\n message_count = tonumber(values[23]),\n created_at = tonumber(values[24]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Malform model.' .. k)\n end\n end\n\n return { map = model }\nend\n\nredis.register_function({\n function_name = 'read_full_target',\n callback = read_full_target,\n flags = { 'no-writes' },\n description = 'Read full target',\n})\n\n--[[\n Find target link\n--]]\nlocal function find_target_link(keys, args)\n if #keys ~= 1 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local target_mirror_hosts_key = keys[1]\n\n local mirror_host = args[1]\n\n if not (mirror_host and mirror_host ~= '') then\n return redis.error_reply('ERR Wrong mirror_host')\n end\n\n if redis.call('HEXISTS', target_mirror_hosts_key, mirror_host) ~= 1 then\n return nil\n end\n\n local target_link = redis.call('HGET', target_mirror_hosts_key, mirror_host)\n local campaign_id, target_id = string.match(target_link, '([^\\t]+)\\t([^\\t]+)')\n\n if not (campaign_id and campaign_id ~= '' and target_id and target_id ~= '') then\n return redis.error_reply('ERR Malform target_link')\n end\n\n return { campaign_id, target_id }\nend\n\nredis.register_function({\n function_name = 'find_target_link',\n callback = find_target_link,\n flags = { 'no-writes' },\n description = 'Find target link',\n})\n\n--[[\n Read target index\n--]]\nlocal function read_target_index(keys, args)\n if #keys ~= 2 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local target_index_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n return redis.call('ZRANGE', target_index_key, 0, -1)\nend\n\nredis.register_function({\n function_name = 'read_target_index',\n callback = read_target_index,\n flags = { 'no-writes' },\n description = 'Read target index',\n})\n\n--[[\n Update target\n--]]\nlocal function update_target(keys, args)\n if #keys ~= 3 or #args < 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local target_key = keys[3]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', target_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Target not exists')\n end\n\n local stash = {\n lock_secret = table.remove(args),\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if #args % 2 ~= 0 then\n return redis.error_reply('ERR Odd number of args')\n end\n\n local model = {}\n\n for i = 1, #args, 2 do\n local k, v = args[i], args[i + 1]\n\n if model[k] then\n return redis.error_reply('ERR Duplicate model.' .. k)\n end\n\n if k == 'connect_timeout' then\n model.connect_timeout = tonumber(v)\n elseif k == 'simple_timeout' then\n model.simple_timeout = tonumber(v)\n elseif k == 'stream_timeout' then\n model.stream_timeout = tonumber(v)\n elseif k == 'headers_size_limit' then\n model.headers_size_limit = tonumber(v)\n elseif k == 'body_size_limit' then\n model.body_size_limit = tonumber(v)\n elseif k == 'main_page' then\n model.main_page = v\n elseif k == 'not_found_page' then\n model.not_found_page = v\n elseif k == 'favicon_ico' then\n model.favicon_ico = v\n elseif k == 'robots_txt' then\n model.robots_txt = v\n elseif k == 'sitemap_xml' then\n model.sitemap_xml = v\n elseif k == 'allow_websockets' then\n model.allow_websockets = tonumber(v)\n else\n return redis.error_reply('ERR Unknown model.' .. k)\n end\n end\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n end\n\n if next(model) == nil then\n return redis.status_reply('OK Nothing to update')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n local store = {}\n\n for k, v in pairs(model) do\n table.insert(store, k)\n table.insert(store, v)\n end\n\n redis.call('HSET', target_key, unpack(store))\n\n return redis.status_reply('OK Target updated')\nend\n\nredis.register_function({\n function_name = 'update_target',\n callback = update_target,\n description = 'Update target',\n})\n\n--[[\n Enable target\n--]]\nlocal function enable_target(keys, args)\n if #keys ~= 3 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local target_key = keys[3]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', target_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Target not exists')\n end\n\n local stash = {\n lock_secret = args[1],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n is_enabled = tonumber(redis.call('HGET', target_key, 'is_enabled')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if stash.is_enabled ~= 0 then\n return redis.status_reply('OK Target allready enabled')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('HSET', target_key, 'is_enabled', 1)\n\n return redis.status_reply('OK Target enabled')\nend\n\nredis.register_function({\n function_name = 'enable_target',\n callback = enable_target,\n description = 'Enable target',\n})\n\n--[[\n Disable target\n--]]\nlocal function disable_target(keys, args)\n if #keys ~= 3 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local target_key = keys[3]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', target_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Target not exists')\n end\n\n local stash = {\n lock_secret = args[1],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n is_enabled = tonumber(redis.call('HGET', target_key, 'is_enabled')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if stash.is_enabled == 0 then\n return redis.status_reply('OK Target allready disabled')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('HSET', target_key, 'is_enabled', 0)\n\n return redis.status_reply('OK Target diabled')\nend\n\nredis.register_function({\n function_name = 'disable_target',\n callback = disable_target,\n description = 'Disable target',\n})\n\n--[[\n Append target label\n--]]\nlocal function append_target_label(keys, args)\n if #keys ~= 4 or #args ~= 2 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local target_key = keys[3]\n local target_labels_key = keys[4]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', target_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Target not exists')\n end\n\n local stash = {\n label = args[1],\n lock_secret = args[2],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'label' or k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if redis.call('SISMEMBER', target_labels_key, stash.label) ~= 0 then\n return redis.status_reply('OK Target label allready exists')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('SADD', target_labels_key, stash.label)\n\n return redis.status_reply('OK Target label appended')\nend\n\nredis.register_function({\n function_name = 'append_target_label',\n callback = append_target_label,\n description = 'Append target label',\n})\n\n--[[\n Remove target label\n--]]\nlocal function remove_target_label(keys, args)\n if #keys ~= 4 or #args ~= 2 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local target_key = keys[3]\n local target_labels_key = keys[4]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', target_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Target not exists')\n end\n\n local stash = {\n label = args[1],\n lock_secret = args[2],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'label' or k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if redis.call('SISMEMBER', target_labels_key, stash.label) ~= 1 then\n return redis.status_reply('OK Target label not exists')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('SREM', target_labels_key, stash.label)\n\n return redis.status_reply('OK Target label removed')\nend\n\nredis.register_function({\n function_name = 'remove_target_label',\n callback = remove_target_label,\n description = 'Remove target label',\n})\n\n--[[\n Delete target\n--]]\nlocal function delete_target(keys, args)\n if #keys ~= 8 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local target_key = keys[3]\n local target_labels_key = keys[4]\n local target_donors_key = keys[5]\n local target_mirrors_key = keys[6]\n local target_mirror_hosts_key = keys[7]\n local target_index_key = keys[8]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', target_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Target not exists')\n end\n\n local stash = {\n lock_secret = args[1],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n campaign_id = redis.call('HGET', target_key, 'campaign_id'),\n target_id = redis.call('HGET', target_key, 'target_id'),\n donor_sub = redis.call('HGET', target_key, 'donor_sub'),\n donor_domain = redis.call('HGET', target_key, 'donor_domain'),\n donor_port = redis.call('HGET', target_key, 'donor_port'),\n mirror_sub = redis.call('HGET', target_key, 'mirror_sub'),\n mirror_domain = redis.call('HGET', campaign_key, 'mirror_domain'),\n mirror_port = redis.call('HGET', target_key, 'mirror_port'),\n is_enabled = tonumber(redis.call('HGET', target_key, 'is_enabled')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if\n (\n k == 'lock_secret'\n or k == 'orig_lock_secret'\n or k == 'campaign_id'\n or k == 'target_id'\n or k == 'donor_sub'\n or k == 'donor_domain'\n or k == 'donor_port'\n or k == 'mirror_sub'\n or k == 'mirror_domain'\n or k == 'mirror_port'\n ) and v == ''\n then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n -- stylua: ignore\n local donor_str = stash.campaign_id\n .. '\\t' .. stash.donor_sub\n .. '\\t' .. stash.donor_domain\n .. '\\t' .. stash.donor_port\n\n -- stylua: ignore\n local mirror_str = stash.campaign_id\n .. '\\t' .. stash.mirror_sub\n .. '\\t' .. stash.mirror_port\n\n local mirror_hostname = stash.mirror_sub ~= '.'\n and (stash.mirror_sub .. '.' .. stash.mirror_domain)\n or stash.mirror_domain\n local mirror_host = mirror_hostname .. ':' .. stash.mirror_port\n\n if stash.is_enabled ~= 0 then\n return redis.status_reply('FORBIDDEN Target not disabled')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('DEL', target_key)\n redis.call('DEL', target_labels_key)\n\n redis.call('SREM', target_donors_key, donor_str)\n redis.call('SREM', target_mirrors_key, mirror_str)\n\n redis.call('HDEL', target_mirror_hosts_key, mirror_host)\n\n redis.call('ZREM', target_index_key, stash.target_id)\n\n return redis.status_reply('OK Target deleted')\nend\n\nredis.register_function({\n function_name = 'delete_target',\n callback = delete_target,\n description = 'Delete target',\n})\n"
13
+ ],
14
+ [
15
+ "4-redirector.lua",
16
+ "#!lua name=redirector\n\n--[[\n Create redirector\n--]]\nlocal function create_redirector(keys, args)\n if #keys ~= 4 or #args ~= 5 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local redirector_key = keys[3]\n local redirector_index_key = keys[4]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', redirector_key) ~= 0 then\n return redis.status_reply('CONFLICT Redirector allready exists')\n end\n\n local stash = {\n lock_secret = args[5],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n local model = {\n campaign_id = args[1],\n redirector_id = args[2],\n page = args[3],\n lure_count = 0,\n created_at = tonumber(args[4]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n\n if (k == 'campaign_id' or k == 'redirector_id') and v == '' then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n local store = {}\n\n for k, v in pairs(model) do\n table.insert(store, k)\n table.insert(store, v)\n end\n\n redis.call('HSET', redirector_key, unpack(store))\n\n redis.call('ZADD', redirector_index_key, model.created_at, model.redirector_id)\n\n return redis.status_reply('OK Redirector created')\nend\n\nredis.register_function({\n function_name = 'create_redirector',\n callback = create_redirector,\n description = 'Create redirector',\n})\n\n--[[\n Read redirector\n--]]\nlocal function read_redirector(keys, args)\n if #keys ~= 2 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local redirector_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n if redis.call('EXISTS', redirector_key) ~= 1 then\n return nil\n end\n\n -- stylua: ignore\n local values = redis.call(\n 'HMGET', redirector_key,\n 'campaign_id',\n 'redirector_id',\n 'lure_count',\n 'created_at'\n )\n\n if #values ~= 4 then\n return redis.error_reply('ERR Malform values')\n end\n\n local model = {\n campaign_id = values[1],\n redirector_id = values[2],\n lure_count = tonumber(values[3]),\n created_at = tonumber(values[4]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Malform model.' .. k)\n end\n end\n\n return { map = model }\nend\n\nredis.register_function({\n function_name = 'read_redirector',\n callback = read_redirector,\n flags = { 'no-writes' },\n description = 'Read redirector',\n})\n\n--[[\n Read full redirector\n--]]\nlocal function read_full_redirector(keys, args)\n if #keys ~= 3 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local redirector_key = keys[2]\n local redirector_fields_key = keys[3]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n if redis.call('EXISTS', redirector_key) ~= 1 then\n return nil\n end\n\n -- stylua: ignore\n local values = redis.call(\n 'HMGET', redirector_key,\n 'campaign_id',\n 'redirector_id',\n 'page',\n 'lure_count',\n 'created_at'\n )\n\n if #values ~= 5 then\n return redis.error_reply('ERR Malform values')\n end\n\n local model = {\n campaign_id = values[1],\n redirector_id = values[2],\n page = values[3],\n fields = redis.call('SMEMBERS', redirector_fields_key),\n lure_count = tonumber(values[4]),\n created_at = tonumber(values[5]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Malform model.' .. k)\n end\n end\n\n return { map = model }\nend\n\nredis.register_function({\n function_name = 'read_full_redirector',\n callback = read_full_redirector,\n flags = { 'no-writes' },\n description = 'Read full redirector',\n})\n\n--[[\n Read redirector index\n--]]\nlocal function read_redirector_index(keys, args)\n if #keys ~= 2 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local redirector_index_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n return redis.call('ZRANGE', redirector_index_key, 0, -1)\nend\n\nredis.register_function({\n function_name = 'read_redirector_index',\n callback = read_redirector_index,\n flags = { 'no-writes' },\n description = 'Read redirector index',\n})\n\n--[[\n Update redirector\n--]]\nlocal function update_redirector(keys, args)\n if #keys ~= 3 or #args < 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local redirector_key = keys[3]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', redirector_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Redirector not exists')\n end\n\n local stash = {\n lock_secret = table.remove(args),\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if #args % 2 ~= 0 then\n return redis.error_reply('ERR Odd number of args')\n end\n\n local model = {}\n\n for i = 1, #args, 2 do\n local k, v = args[i], args[i + 1]\n\n if model[k] then\n return redis.error_reply('ERR Duplicate model.' .. k)\n end\n\n if k == 'page' then\n model.page = v\n else\n return redis.error_reply('ERR Unknown model.' .. k)\n end\n end\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n end\n\n if next(model) == nil then\n return redis.status_reply('OK Nothing to update')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n local store = {}\n\n for k, v in pairs(model) do\n table.insert(store, k)\n table.insert(store, v)\n end\n\n redis.call('HSET', redirector_key, unpack(store))\n\n return redis.status_reply('OK Redirector updated')\nend\n\nredis.register_function({\n function_name = 'update_redirector',\n callback = update_redirector,\n description = 'Update redirector',\n})\n\n--[[\n Append redirector field\n--]]\nlocal function append_redirector_field(keys, args)\n if #keys ~= 4 or #args ~= 2 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local redirector_key = keys[3]\n local redirector_fields_key = keys[4]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', redirector_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Redirector not exists')\n end\n\n local stash = {\n field = args[1],\n lock_secret = args[2],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'field' or k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if redis.call('SISMEMBER', redirector_fields_key, stash.field) ~= 0 then\n return redis.status_reply('OK Redirector field allready exists')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('SADD', redirector_fields_key, stash.field)\n\n return redis.status_reply('OK Redirector field appended')\nend\n\nredis.register_function({\n function_name = 'append_redirector_field',\n callback = append_redirector_field,\n description = 'Append redirector field',\n})\n\n--[[\n Remove redirector field\n--]]\nlocal function remove_redirector_field(keys, args)\n if #keys ~= 4 or #args ~= 2 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local redirector_key = keys[3]\n local redirector_fields_key = keys[4]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', redirector_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Redirector not exists')\n end\n\n local stash = {\n field = args[1],\n lock_secret = args[2],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'field' or k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if redis.call('SISMEMBER', redirector_fields_key, stash.field) ~= 1 then\n return redis.status_reply('OK Redirector field not exists')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('SREM', redirector_fields_key, stash.field)\n\n return redis.status_reply('OK Redirector field removed')\nend\n\nredis.register_function({\n function_name = 'remove_redirector_field',\n callback = remove_redirector_field,\n description = 'Remove redirector field',\n})\n\n--[[\n Delete redirector\n--]]\nlocal function delete_redirector(keys, args)\n if #keys ~= 5 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local redirector_key = keys[3]\n local redirector_fields_key = keys[4]\n local redirector_index_key = keys[5]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', redirector_key) ~= 1 then\n return redis.status_reply('NOT_FOUND redirector not exists')\n end\n\n local stash = {\n lock_secret = args[1],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n redirector_id = redis.call('HGET', redirector_key, 'redirector_id'),\n lure_count = tonumber(redis.call('HGET', redirector_key, 'lure_count')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret' or k == 'redirector_id') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if k == 'lure_count' and v < 0 then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if stash.lure_count > 0 then\n return redis.status_reply('FORBIDDEN Lures exists')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('DEL', redirector_key)\n redis.call('DEL', redirector_fields_key)\n\n redis.call('ZREM', redirector_index_key, stash.redirector_id)\n\n return redis.status_reply('OK Redirector deleted')\nend\n\nredis.register_function({\n function_name = 'delete_redirector',\n callback = delete_redirector,\n description = 'Delete redirector',\n})\n"
17
+ ],
18
+ [
19
+ "5-lure.lua",
20
+ "#!lua name=lure\n\n--[[\n Create lure\n--]]\nlocal function create_lure(keys, args)\n if #keys ~= 6 or #args ~= 6 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local lure_key = keys[3]\n local lure_paths_key = keys[4]\n local lure_index_key = keys[5]\n local redirector_key = keys[6]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', lure_key) ~= 0 then\n return redis.status_reply('CONFLICT Lure allready exists')\n end\n\n if redis.call('EXISTS', redirector_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Redirector not found')\n end\n\n local stash = {\n lock_secret = args[6],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n local model = {\n campaign_id = args[1],\n lure_id = args[2],\n path = args[3],\n redirector_id = args[4],\n is_enabled = 0,\n session_count = 0,\n created_at = tonumber(args[5]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n\n if\n (k == 'campaign_id' or k == 'lure_id' or k == 'path' or k == 'redirector_id')\n and v == ''\n then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n local store = {}\n\n for k, v in pairs(model) do\n table.insert(store, k)\n table.insert(store, v)\n end\n\n redis.call('HSET', lure_key, unpack(store))\n\n redis.call('HSET', lure_paths_key, model.path, model.lure_id)\n\n redis.call('ZADD', lure_index_key, model.created_at, model.lure_id)\n\n redis.call('HINCRBY', redirector_key, 'lure_count', 1)\n\n return redis.status_reply('OK Lure created')\nend\n\nredis.register_function({\n function_name = 'create_lure',\n callback = create_lure,\n description = 'Create lure',\n})\n\n--[[\n Read lure\n--]]\nlocal function read_lure(keys, args)\n if #keys ~= 2 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local lure_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n if redis.call('EXISTS', lure_key) ~= 1 then\n return nil\n end\n\n -- stylua: ignore\n local values = redis.call(\n 'HMGET', lure_key,\n 'campaign_id',\n 'lure_id',\n 'path',\n 'redirector_id',\n 'is_enabled',\n 'session_count',\n 'created_at'\n )\n\n if #values ~= 7 then\n return redis.error_reply('ERR Malform values')\n end\n\n local model = {\n campaign_id = values[1],\n lure_id = values[2],\n path = values[3],\n redirector_id = values[4],\n is_enabled = tonumber(values[5]),\n session_count = tonumber(values[6]),\n created_at = tonumber(values[7]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Malform model.' .. k)\n end\n end\n\n return { map = model }\nend\n\nredis.register_function({\n function_name = 'read_lure',\n callback = read_lure,\n flags = { 'no-writes' },\n description = 'Read lure',\n})\n\n--[[\n Find lure id\n--]]\nlocal function find_lure_id(keys, args)\n if #keys ~= 2 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local lure_paths_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n local path = args[1]\n\n if not (path and path ~= '') then\n return redis.error_reply('ERR Wrong path')\n end\n\n if redis.call('HEXISTS', lure_paths_key, path) ~= 1 then\n return nil\n end\n\n local lure_id = redis.call('HGET', lure_paths_key, path)\n\n if not (lure_id and lure_id ~= '') then\n return redis.error_reply('ERR Malform lure_id')\n end\n\n return lure_id\nend\n\nredis.register_function({\n function_name = 'find_lure_id',\n callback = find_lure_id,\n flags = { 'no-writes' },\n description = 'Find lure id',\n})\n\n--[[\n Read lure index\n--]]\nlocal function read_lure_index(keys, args)\n if #keys ~= 2 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local lure_index_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n return redis.call('ZRANGE', lure_index_key, 0, -1)\nend\n\nredis.register_function({\n function_name = 'read_lure_index',\n callback = read_lure_index,\n flags = { 'no-writes' },\n description = 'Read lure index',\n})\n\n--[[\n Enable lure\n--]]\nlocal function enable_lure(keys, args)\n if #keys ~= 3 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local lure_key = keys[3]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', lure_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Lure not exists')\n end\n\n local stash = {\n lock_secret = args[1],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n is_enabled = tonumber(redis.call('HGET', lure_key, 'is_enabled')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if stash.is_enabled ~= 0 then\n return redis.status_reply('OK Lure allready enabled')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('HSET', lure_key, 'is_enabled', 1)\n\n return redis.status_reply('OK Lure enabled')\nend\n\nredis.register_function({\n function_name = 'enable_lure',\n callback = enable_lure,\n description = 'Enable lure',\n})\n\n--[[\n Disable lure\n--]]\nlocal function disable_lure(keys, args)\n if #keys ~= 3 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local lure_key = keys[3]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', lure_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Lure not exists')\n end\n\n local stash = {\n lock_secret = args[1],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n is_enabled = tonumber(redis.call('HGET', lure_key, 'is_enabled')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'lock_secret' or k == 'orig_lock_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if stash.is_enabled == 0 then\n return redis.status_reply('OK Lure allready disabled')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('HSET', lure_key, 'is_enabled', 0)\n\n return redis.status_reply('OK Lure disabled')\nend\n\nredis.register_function({\n function_name = 'disable_lure',\n callback = disable_lure,\n description = 'Disable lure',\n})\n\n--[[\n Delete lure\n--]]\nlocal function delete_lure(keys, args)\n if #keys ~= 6 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local campaign_lock_key = keys[2]\n local lure_key = keys[3]\n local lure_paths_key = keys[4]\n local lure_index_key = keys[5]\n local redirector_key = keys[6]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', campaign_lock_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Campaign not locked')\n end\n\n if redis.call('EXISTS', lure_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Lure not exists')\n end\n\n if redis.call('EXISTS', redirector_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Redirector not exists')\n end\n\n local stash = {\n lock_secret = args[1],\n orig_lock_secret = redis.call('GET', campaign_lock_key),\n lure_id = redis.call('HGET', lure_key, 'lure_id'),\n path = redis.call('HGET', lure_key, 'path'),\n redirector_id = redis.call('HGET', lure_key, 'redirector_id'),\n orig_redirector_id = redis.call('HGET', redirector_key, 'redirector_id'),\n is_enabled = tonumber(redis.call('HGET', lure_key, 'is_enabled')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if\n (\n k == 'lock_secret'\n or k == 'orig_lock_secret'\n or k == 'lure_id'\n or k == 'path'\n or k == 'redirector_id'\n or k == 'orig_redirector_id'\n ) and v == ''\n then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if stash.orig_redirector_id ~= stash.redirector_id then\n return redis.status_reply('FORBIDDEN Lure redirector not match')\n end\n\n if stash.is_enabled ~= 0 then\n return redis.status_reply('FORBIDDEN Lure not disabled')\n end\n\n if stash.orig_lock_secret ~= stash.lock_secret then\n return redis.status_reply('FORBIDDEN Campaign lock_secret not match')\n end\n\n -- Point of no return\n\n redis.call('DEL', lure_key)\n\n redis.call('HDEL', lure_paths_key, stash.path)\n\n redis.call('ZREM', lure_index_key, stash.lure_id)\n\n redis.call('HINCRBY', redirector_key, 'lure_count', -1)\n\n return redis.status_reply('OK Lure deleted')\nend\n\nredis.register_function({\n function_name = 'delete_lure',\n callback = delete_lure,\n description = 'Delete lure',\n})\n"
21
+ ],
22
+ [
23
+ "6-session.lua",
24
+ "#!lua name=session\n\n--[[\n Create session\n--]]\nlocal function create_session(keys, args)\n if #keys ~= 3 or #args ~= 4 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local session_key = keys[2]\n local enabled_proxy_index_key = keys[3]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', session_key) ~= 0 then\n return redis.status_reply('CONFLICT Session allready exists')\n end\n\n local stash = {\n new_session_expire = tonumber(redis.call('HGET', campaign_key, 'new_session_expire')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if k == 'new_session_expire' and v <= 0 then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if redis.call('SCARD', enabled_proxy_index_key) == 0 then\n return redis.status_reply('NOT_FOUND No enabled proxies found')\n end\n\n local model = {\n campaign_id = args[1],\n session_id = args[2],\n proxy_id = redis.call('SRANDMEMBER', enabled_proxy_index_key),\n secret = args[3],\n is_upgraded = 0,\n message_count = 0,\n created_at = tonumber(args[4]),\n authorized_at = tonumber(args[4]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n\n if\n (k == 'campaign_id' or k == 'session_id' or k == 'proxy_id' or k == 'secret')\n and v == ''\n then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n end\n\n -- Point of no return\n\n local store = {}\n\n for k, v in pairs(model) do\n table.insert(store, k)\n table.insert(store, v)\n end\n\n redis.call('HSET', session_key, unpack(store))\n\n redis.call('HINCRBY', campaign_key, 'session_count', 1)\n\n redis.call('PEXPIRE', session_key, stash.new_session_expire)\n\n return redis.status_reply('OK Session created')\nend\n\nredis.register_function({\n function_name = 'create_session',\n callback = create_session,\n description = 'Create session',\n})\n\n--[[\n Read session\n--]]\nlocal function read_session(keys, args)\n if #keys ~= 2 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local session_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n if redis.call('EXISTS', session_key) ~= 1 then\n return nil\n end\n\n -- stylua: ignore\n local values = redis.call(\n 'HMGET', session_key,\n 'campaign_id',\n 'session_id',\n 'proxy_id',\n 'secret',\n 'is_upgraded',\n 'message_count',\n 'created_at',\n 'authorized_at'\n )\n\n if #values ~= 8 then\n return redis.error_reply('ERR Malform values')\n end\n\n local model = {\n campaign_id = values[1],\n session_id = values[2],\n proxy_id = values[3],\n secret = values[4],\n is_upgraded = tonumber(values[5]),\n message_count = tonumber(values[6]),\n created_at = tonumber(values[7]),\n authorized_at = tonumber(values[8]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Malform model.' .. k)\n end\n end\n\n return { map = model }\nend\n\nredis.register_function({\n function_name = 'read_session',\n callback = read_session,\n flags = { 'no-writes' },\n description = 'Read session',\n})\n\n--[[\n Auth session\n--]]\nlocal function auth_session(keys, args)\n if #keys ~= 3 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local session_key = keys[2]\n local enabled_proxy_index_key = keys[3]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', session_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Session not exists')\n end\n\n local stash = {\n authorized_at = tonumber(args[1]),\n proxy_id = redis.call('HGET', session_key, 'proxy_id'),\n session_expire = tonumber(redis.call('HGET', campaign_key, 'session_expire')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if k == 'proxy_id' and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if k == 'session_expire' and v <= 0 then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if redis.call('SCARD', enabled_proxy_index_key) == 0 then\n return redis.status_reply('NOT_FOUND No enabled proxies found')\n end\n\n -- Point of no return\n\n if redis.call('SISMEMBER', enabled_proxy_index_key, stash.proxy_id) == 0 then\n local enabled_proxy_id = redis.call('SRANDMEMBER', enabled_proxy_index_key)\n\n if not enabled_proxy_id or enabled_proxy_id == '' then\n return redis.error_reply('ERR Wrong enabled_proxy_id')\n end\n\n -- stylua: ignore\n redis.call(\n 'HSET', session_key,\n 'proxy_id', enabled_proxy_id,\n 'authorized_at', stash.authorized_at\n )\n else\n redis.call('HSET', session_key, 'authorized_at', stash.authorized_at)\n end\n\n redis.call('PEXPIRE', session_key, stash.session_expire)\n\n return redis.status_reply('OK Session authorized')\nend\n\nredis.register_function({\n function_name = 'auth_session',\n callback = auth_session,\n description = 'Auth session',\n})\n\n--[[\n Upgrade session\n--]]\nlocal function upgrade_session(keys, args)\n if #keys ~= 3 or #args ~= 1 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local lure_key = keys[2]\n local session_key = keys[3]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', lure_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Lure not exists')\n end\n\n if redis.call('EXISTS', session_key) ~= 1 then\n return redis.status_reply('FORBIDDEN Session not exists')\n end\n\n local stash = {\n secret = args[1],\n orig_secret = redis.call('HGET', session_key, 'secret'),\n is_upgraded = tonumber(redis.call('HGET', session_key, 'is_upgraded')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if (k == 'secret' or k == 'orig_secret') and v == '' then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n if stash.orig_secret ~= stash.secret then\n return redis.status_reply('FORBIDDEN Session secret not match')\n end\n\n if stash.is_upgraded ~= 0 then\n return redis.status_reply('OK Session allready upgraded')\n end\n\n -- Point of no return\n\n redis.call('HSET', session_key, 'is_upgraded', 1)\n\n redis.call('HINCRBY', lure_key, 'session_count', 1)\n\n return redis.status_reply('OK Session upgraded')\nend\n\nredis.register_function({\n function_name = 'upgrade_session',\n callback = upgrade_session,\n description = 'Upgrade session',\n})\n"
25
+ ],
26
+ [
27
+ "7-message.lua",
28
+ "#!lua name=message\n\n--[[\n Create message\n--]]\nlocal function create_message(keys, args)\n if #keys ~= 5 or #args ~= 20 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local message_key = keys[2]\n local proxy_key = keys[3]\n local target_key = keys[4]\n local session_key = keys[5]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', message_key) ~= 0 then\n return redis.status_reply('CONFLICT Message allready exists')\n end\n\n if redis.call('EXISTS', proxy_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Proxy not exists')\n end\n\n if redis.call('EXISTS', target_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Target not exists')\n end\n\n if redis.call('EXISTS', session_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Session not exists')\n end\n\n local stash = {\n message_expire = tonumber(redis.call('HGET', campaign_key, 'message_expire')),\n }\n\n for k, v in pairs(stash) do\n if not v then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n\n if k == 'message_expire' and v <= 0 then\n return redis.error_reply('ERR Wrong stash.' .. k)\n end\n end\n\n local model = {\n campaign_id = args[1],\n message_id = args[2],\n proxy_id = args[3],\n target_id = args[4],\n session_id = args[5],\n type = args[6],\n method = args[7],\n url = args[8],\n request_headers = args[9],\n request_body = args[10],\n status = tonumber(args[11]),\n response_headers = args[12],\n response_body = args[13],\n connection = args[14],\n payload = args[15],\n errors = args[16],\n analyze = args[17],\n start_time = tonumber(args[18]),\n finish_time = tonumber(args[19]),\n created_at = tonumber(args[20]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n\n if\n (\n k == 'campaign_id'\n or k == 'message_id'\n or k == 'proxy_id'\n or k == 'target_id'\n or k == 'session_id'\n or k == 'type'\n or k == 'method'\n or k == 'url'\n ) and v == ''\n then\n return redis.error_reply('ERR Wrong model.' .. k)\n end\n end\n\n -- Point of no return\n\n local store = {}\n\n for k, v in pairs(model) do\n table.insert(store, k)\n table.insert(store, v)\n end\n\n redis.call('HSET', message_key, unpack(store))\n\n redis.call('HINCRBY', campaign_key, 'message_count', 1)\n redis.call('HINCRBY', proxy_key, 'message_count', 1)\n redis.call('HINCRBY', target_key, 'message_count', 1)\n redis.call('HINCRBY', session_key, 'message_count', 1)\n\n redis.call('PEXPIRE', message_key, stash.message_expire)\n\n return redis.status_reply('OK Message created')\nend\n\nredis.register_function({\n function_name = 'create_message',\n callback = create_message,\n description = 'Create message',\n})\n\n--[[\n Create dummy message\n--]]\nlocal function create_dummy_message(keys, args)\n if #keys ~= 5 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local message_key = keys[2]\n local proxy_key = keys[3]\n local target_key = keys[4]\n local session_key = keys[5]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Campaign not exists')\n end\n\n if redis.call('EXISTS', message_key) ~= 0 then\n return redis.status_reply('CONFLICT Message allready exists')\n end\n\n if redis.call('EXISTS', proxy_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Proxy not exists')\n end\n\n if redis.call('EXISTS', target_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Target not exists')\n end\n\n if redis.call('EXISTS', session_key) ~= 1 then\n return redis.status_reply('NOT_FOUND Session not exists')\n end\n\n -- Point of no return\n\n redis.call('HINCRBY', campaign_key, 'message_count', 1)\n redis.call('HINCRBY', proxy_key, 'message_count', 1)\n redis.call('HINCRBY', target_key, 'message_count', 1)\n redis.call('HINCRBY', session_key, 'message_count', 1)\n\n return redis.status_reply('OK Dummy message created')\nend\n\nredis.register_function({\n function_name = 'create_dummy_message',\n callback = create_dummy_message,\n description = 'Create dummy message',\n})\n\n--[[\n Read message\n--]]\nlocal function read_message(keys, args)\n if #keys ~= 2 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local message_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n if redis.call('EXISTS', message_key) ~= 1 then\n return nil\n end\n\n -- stylua: ignore\n local values = redis.call(\n 'HMGET', message_key,\n 'campaign_id',\n 'message_id',\n 'proxy_id',\n 'target_id',\n 'session_id',\n 'type',\n 'method',\n 'url',\n 'status',\n 'analyze',\n 'start_time',\n 'finish_time',\n 'created_at'\n )\n\n if #values ~= 13 then\n return redis.error_reply('ERR Malform values')\n end\n\n local model = {\n campaign_id = values[1],\n message_id = values[2],\n proxy_id = values[3],\n target_id = values[4],\n session_id = values[5],\n type = values[6],\n method = values[7],\n url = values[8],\n status = tonumber(values[9]),\n analyze = values[10],\n start_time = tonumber(values[11]),\n finish_time = tonumber(values[12]),\n created_at = tonumber(values[13]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Malform model.' .. k)\n end\n end\n\n return { map = model }\nend\n\nredis.register_function({\n function_name = 'read_message',\n callback = read_message,\n flags = { 'no-writes' },\n description = 'Read message',\n})\n\n--[[\n Read full message\n--]]\nlocal function read_full_message(keys, args)\n if #keys ~= 2 or #args ~= 0 then\n return redis.error_reply('ERR Wrong function use')\n end\n\n local campaign_key = keys[1]\n local message_key = keys[2]\n\n if redis.call('EXISTS', campaign_key) ~= 1 then\n return nil\n end\n\n if redis.call('EXISTS', message_key) ~= 1 then\n return nil\n end\n\n -- stylua: ignore\n local values = redis.call(\n 'HMGET', message_key,\n 'campaign_id',\n 'message_id',\n 'proxy_id',\n 'target_id',\n 'session_id',\n 'type',\n 'method',\n 'url',\n 'request_headers',\n 'request_body',\n 'status',\n 'response_headers',\n 'response_body',\n 'connection',\n 'payload',\n 'errors',\n 'analyze',\n 'start_time',\n 'finish_time',\n 'created_at'\n )\n\n if #values ~= 20 then\n return redis.error_reply('ERR Malform values')\n end\n\n local model = {\n campaign_id = values[1],\n message_id = values[2],\n proxy_id = values[3],\n target_id = values[4],\n session_id = values[5],\n type = values[6],\n method = values[7],\n url = values[8],\n request_headers = values[9],\n request_body = values[10],\n status = tonumber(values[11]),\n response_headers = values[12],\n response_body = values[13],\n connection = values[14],\n payload = values[15],\n errors = values[16],\n analyze = values[17],\n start_time = tonumber(values[18]),\n finish_time = tonumber(values[19]),\n created_at = tonumber(values[20]),\n }\n\n for k, v in pairs(model) do\n if not v then\n return redis.error_reply('ERR Malform model.' .. k)\n end\n end\n\n return { map = model }\nend\n\nredis.register_function({\n function_name = 'read_full_message',\n callback = read_full_message,\n flags = { 'no-writes' },\n description = 'Read full message',\n})\n"
29
+ ]
30
+ ]);
1456
31
  //# sourceMappingURL=redis-functions.js.map