openship 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +26 -1
  2. package/dist/bare-FSUAM5V5.js +23 -0
  3. package/dist/{bowser-O3AEA6AN.js → bowser-HNOTPGJO.js} +2 -2
  4. package/dist/{chunk-5MZ624VX.js → chunk-2GWYYHOR.js} +1 -1
  5. package/dist/chunk-3FYIXVX5.js +8051 -0
  6. package/dist/{chunk-ILFETZOM.js → chunk-3LDWWY7U.js} +21 -1
  7. package/dist/{chunk-W73X43R7.js → chunk-3NQQXMDR.js} +3 -3
  8. package/dist/{chunk-OWED2GRM.js → chunk-42WQABXM.js} +2 -2
  9. package/dist/{chunk-TYVME3XD.js → chunk-6FH4AXVY.js} +20 -3
  10. package/dist/{chunk-ZCOQJCZO.js → chunk-6ODUBKUB.js} +3 -3
  11. package/dist/{chunk-DYPH4HCI.js → chunk-AO252K7Z.js} +1 -1
  12. package/dist/{chunk-K2RPVGPN.js → chunk-B3CE2OMR.js} +14 -12
  13. package/dist/{chunk-IXCHURVK.js → chunk-DOD2BXHQ.js} +4 -4
  14. package/dist/{chunk-VWPEKOH6.js → chunk-DRK3MEDS.js} +3 -3
  15. package/dist/{chunk-V7BZMGOT.js → chunk-EMXI4UCU.js} +5 -5
  16. package/dist/{chunk-NNPEG6HM.js → chunk-EP2TNALB.js} +2 -2
  17. package/dist/{chunk-NXFIRK2Z.js → chunk-GUQ3QCJ7.js} +573 -459
  18. package/dist/chunk-I3DPMTSF.js +29 -0
  19. package/dist/{chunk-KZOBYJUW.js → chunk-IW2UKBVF.js} +3 -3
  20. package/dist/{chunk-YWMODKWL.js → chunk-IXM5245F.js} +165 -13
  21. package/dist/{chunk-KNTJ7PSF.js → chunk-JIMUYEKN.js} +4 -4
  22. package/dist/chunk-OGY63DGD.js +705 -0
  23. package/dist/{chunk-O6ZZF52V.js → chunk-ONKEYSMY.js} +2 -2
  24. package/dist/{chunk-UMQP7SYT.js → chunk-OTLSJYAC.js} +1316 -53
  25. package/dist/{chunk-EI575GHN.js → chunk-PDW4L3NV.js} +3 -3
  26. package/dist/{chunk-JLKKYUZA.js → chunk-PSZSKEPA.js} +7 -7
  27. package/dist/{chunk-KI2EY3WB.js → chunk-PXKCZB2I.js} +1 -1
  28. package/dist/{chunk-RB35YN3J.js → chunk-QEH4QUBX.js} +391 -63
  29. package/dist/{chunk-6APIPIJY.js → chunk-QWHBRY2K.js} +5 -5
  30. package/dist/{chunk-6B5YCFFV.js → chunk-RVER2EOO.js} +5 -5
  31. package/dist/{chunk-Q2CIRAOK.js → chunk-RXQBD4ZY.js} +1 -1
  32. package/dist/{chunk-6LKHXB6T.js → chunk-TWJCLD4W.js} +48 -13
  33. package/dist/{chunk-I6PSTQIR.js → chunk-VDDMADOF.js} +3 -3
  34. package/dist/{chunk-BS2AXYZX.js → chunk-VE2YOK4I.js} +626 -214
  35. package/dist/{chunk-6PIYRG5I.js → chunk-VZ2ZHPS2.js} +52 -42
  36. package/dist/{chunk-AVIB7CT7.js → chunk-WNWQBB7F.js} +2 -2
  37. package/dist/{chunk-FRNAR33O.js → chunk-XZYFZ6A5.js} +3 -3
  38. package/dist/{chunk-RPHRPFEH.js → chunk-ZCFVHA25.js} +1 -1
  39. package/dist/{chunk-FPRHYBY2.js → chunk-ZFJXPCQP.js} +1 -1
  40. package/dist/{chunk-JYGD5WSN.js → chunk-ZWLDLTJP.js} +1 -1
  41. package/dist/cloud-E5M6VMCG.js +31 -0
  42. package/dist/{cloud-7QYOGF7F.js → cloud-KRTZ2IL5.js} +3 -3
  43. package/dist/{detect-BAJMY6KM.js → detect-ALF4GXRX.js} +7 -8
  44. package/dist/{dist-IQJ6H6UZ.js → dist-BM6NPWIH.js} +3 -3
  45. package/dist/{dist-es-X3B5QYKB.js → dist-es-2YRDXMUU.js} +6 -6
  46. package/dist/{dist-es-OSNJBLXB.js → dist-es-CCVZEFRZ.js} +5 -5
  47. package/dist/{dist-es-VNKHQVIB.js → dist-es-IOH6G4GM.js} +4 -4
  48. package/dist/{dist-es-RYHIPOTN.js → dist-es-JGBPABJI.js} +14 -14
  49. package/dist/{dist-es-JSTDUS7Q.js → dist-es-KWSMDPIP.js} +6 -6
  50. package/dist/{dist-es-5DY7K32L.js → dist-es-UYDDOVZ3.js} +6 -6
  51. package/dist/{dist-es-WV4AMOII.js → dist-es-XUOR4NQN.js} +8 -8
  52. package/dist/docker-QECQJ5P4.js +32 -0
  53. package/dist/docker-edge-executor-62N64MGS.js +17 -0
  54. package/dist/edge-import-CQWHN2Q3.js +48 -0
  55. package/dist/ensure-container-edge-MJVXJQG5.js +32 -0
  56. package/dist/{event-streams-EHRAKL75.js → event-streams-TR4GAC53.js} +4 -4
  57. package/dist/{executor-LOYMPU67.js → executor-JELARVKC.js} +8 -8
  58. package/dist/index.js +1170 -459
  59. package/dist/{loadSso-46FQRIZS.js → loadSso-UGF4JMRK.js} +10 -10
  60. package/dist/{local-executor-V7U5VOZW.js → local-executor-WOFZD72X.js} +4 -4
  61. package/dist/nginx-AXGNWRKZ.js +31 -0
  62. package/dist/node-entry.js +4 -0
  63. package/dist/{noop-FMMFG2EZ.js → noop-NJ72F46T.js} +3 -3
  64. package/dist/openresty-lua-IE4P5YQX.js +81 -0
  65. package/dist/server/index.js +23172 -7994
  66. package/dist/server/lua/geo_country.lua +31 -6
  67. package/dist/server/lua/maxminddb.lua +403 -0
  68. package/dist/server/lua/mgmt_api.lua +431 -68
  69. package/dist/server/lua/pipe_log.lua +10 -4
  70. package/dist/server/lua/site_logger.lua +220 -12
  71. package/dist/server/migrations/0082_edge_target_verification.sql +39 -0
  72. package/dist/server/migrations/0083_service_incident.sql +84 -0
  73. package/dist/server/migrations/0084_analytics_daily_rollup.sql +72 -0
  74. package/dist/server/migrations/0085_resource_usage.sql +68 -0
  75. package/dist/server/migrations/0086_remote_infra_updates.sql +41 -0
  76. package/dist/server/migrations/0087_server_container_version_columns.sql +17 -0
  77. package/dist/server/migrations/0088_audit_source_and_settings.sql +27 -0
  78. package/dist/server/migrations/0089_auto_scan_infra.sql +7 -0
  79. package/dist/server/migrations/0090_project_collect_paths.sql +18 -0
  80. package/dist/server/migrations/0091_project_server_id.sql +26 -0
  81. package/dist/server/migrations/0092_project_internal_alias.sql +13 -0
  82. package/dist/server/migrations/0093_service_incident_org_index.sql +13 -0
  83. package/dist/server/migrations/0094_backup_restore_meta.sql +15 -0
  84. package/dist/server/migrations/0095_backup_restore_cancel.sql +19 -0
  85. package/dist/server/migrations/0096_backup_policy_retention_defaults.sql +20 -0
  86. package/dist/server/migrations/0097_update_status_upstream_only.sql +35 -0
  87. package/dist/server/migrations/meta/_journal.json +112 -0
  88. package/dist/setup-FA4PW4NU.js +21 -0
  89. package/dist/{signin-ITOPKKUB.js → signin-3M3UPB6K.js} +10 -10
  90. package/dist/{sso-oidc-NON2PD7Y.js → sso-oidc-3VDIYOEJ.js} +10 -10
  91. package/dist/{sts-HHFFSAY2.js → sts-B3WIYLXR.js} +9 -9
  92. package/package.json +6 -3
  93. package/dist/bare-VRGE5MXH.js +0 -23
  94. package/dist/chunk-CUJXGK7R.js +0 -3167
  95. package/dist/chunk-EAAGSQXN.js +0 -377
  96. package/dist/cloud-3M2WZ624.js +0 -30
  97. package/dist/docker-2NGBRJFJ.js +0 -18
  98. package/dist/docker-edge-executor-5I4M5QT7.js +0 -13
  99. package/dist/edge-import-RIWNEIXQ.js +0 -47
  100. package/dist/ensure-container-edge-3NSYKHRX.js +0 -31
  101. package/dist/nginx-QE4DOM5J.js +0 -24
  102. package/dist/openresty-lua-BTAKECCF.js +0 -42
  103. package/dist/setup-KELALK7H.js +0 -20
@@ -1,377 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- safeErrorMessage
7
- } from "./chunk-UMQP7SYT.js";
8
-
9
- // ../../packages/adapters/src/infra/openresty-lua.ts
10
- import { createHash } from "crypto";
11
- import { existsSync, readFileSync } from "fs";
12
- import { dirname, join } from "path";
13
- import { fileURLToPath } from "url";
14
-
15
- // ../../packages/adapters/src/infra/lua-embedded.ts
16
- var EMBEDDED_LUA = {
17
- "geo_country.lua": "LS0gZ2VvX2NvdW50cnkubHVhCi0tIE1heE1pbmQgR2VvTGl0ZTItQ291bnRyeSBsb29rdXAgd2l0aCBwZXItd29ya2VyIExSVSBjYWNoZS4KLS0KLS0gREIgYW5kIGNhY2hlIGFyZSBwZXItd29ya2VyIG9ubHk6IG9uZSBsb2FkIHBlciB3b3JrZXIsIHNoYXJlZCBieSBhbGwKLS0gcmVxdWVzdHMuIE5vIHJlbG9hZCBwZXIgc3RyZWFtIG9yIHBlciByZXF1ZXN0LgotLQotLSBEZXBlbmRlbmNpZXMgKGluc3RhbGxlZCBieSBkZXBsb3lMdWFTY3JpcHRzKToKLS0gICBvcG06IGFuamlhMDUzMi9sdWEtcmVzdHktbWF4bWluZGRiCi0tICAgYXB0OiBsaWJtYXhtaW5kZGIwIGxpYm1heG1pbmRkYi1kZXYgIChDIGxpYnJhcnkgZm9yIEZGSSkKLS0gICBEYXRhYmFzZTogL3Vzci9zaGFyZS9HZW9JUC9HZW9MaXRlMi1Db3VudHJ5Lm1tZGIKLS0KLS0gRmFsbHMgYmFjayBncmFjZWZ1bGx5IC0gaWYgdGhlIGxpYnJhcnkgb3IgZGF0YWJhc2UgaXMgbWlzc2luZywKLS0gZ2V0X2NvdW50cnlfY29kZSgpIHJldHVybnMgbmlsLiAgQm90aCBzaXRlX2xvZ2dlci5sdWEgYW5kIHBpcGVfbG9nLmx1YQotLSB3cmFwIHRoaXMgbW9kdWxlIGluIHBjYWxsKHJlcXVpcmUsIC4uLikgc28gYSBtaXNzaW5nIERCIG5ldmVyIGNyYXNoZXMKLS0gdGhlIHJlcXVlc3QgcGlwZWxpbmUuCgpsb2NhbCBfTSA9IHt9Cgpsb2NhbCBEQl9QQVRIID0gIi91c3Ivc2hhcmUvR2VvSVAvR2VvTGl0ZTItQ291bnRyeS5tbWRiIgoKbG9jYWwgbW1kYl9vaywgbWF4bWluZCA9IHBjYWxsKHJlcXVpcmUsICJyZXN0eS5tYXhtaW5kZGIiKQpsb2NhbCBscnVjYWNoZV9vaywgbHJ1Y2FjaGUgPSBwY2FsbChyZXF1aXJlLCAicmVzdHkubHJ1Y2FjaGUiKQoKbG9jYWwgY2FjaGUgICAgICAgICAgICAtLSBvbmUgTFJVIHBlciB3b3JrZXIKbG9jYWwgZ2VvX2luaXR0ZWQgPSBmYWxzZSAgLS0gREIgb3BlbmVkIG9uY2UgcGVyIHdvcmtlciBvbiBmaXJzdCBsb29rdXAKCi0tIEluaXQgTWF4TWluZCBvbmNlIHBlciB3b3JrZXI7IHN1YnNlcXVlbnQgbG9va3VwcyAoYW55IHN0cmVhbSkgcmV1c2UuCmxvY2FsIGZ1bmN0aW9uIGVuc3VyZV9nZW9faW5pdCgpCiAgICBpZiBnZW9faW5pdHRlZCB0aGVuCiAgICAgICAgcmV0dXJuIHRydWUKICAgIGVuZAogICAgaWYgbm90IG1tZGJfb2sgb3Igbm90IG1heG1pbmQgdGhlbgogICAgICAgIHJldHVybiBmYWxzZQogICAgZW5kCiAgICBsb2NhbCBvaywgZXJyID0gbWF4bWluZC5pbml0KERCX1BBVEgpCiAgICBpZiBub3Qgb2sgdGhlbgogICAgICAgIG5neC5sb2cobmd4LldBUk4sCiAgICAgICAgICAgICJbZ2VvX2NvdW50cnldIEdlb0xpdGUyIGRhdGFiYXNlIG5vdCBmb3VuZCBhdCAiIC4uIERCX1BBVEggLi4KICAgICAgICAgICAgIiAtIGdlbyBsb29rdXBzIGRpc2FibGVkOiAiIC4uIChlcnIgb3IgInVua25vd24iKSkKICAgICAgICByZXR1cm4gZmFsc2UKICAgIGVuZAogICAgZ2VvX2luaXR0ZWQgPSB0cnVlCiAgICBuZ3gubG9nKG5neC5JTkZPLCAiW2dlb19jb3VudHJ5XSBHZW9MaXRlMi1Db3VudHJ5IGxvYWRlZCBmcm9tICIgLi4gREJfUEFUSCkKICAgIHJldHVybiB0cnVlCmVuZAoKLS0gQ3JlYXRlIExSVSBjYWNoZSBvbmNlIHBlciB3b3JrZXIgKG1heCA1MDAwMCBJUHMpLgpsb2NhbCBmdW5jdGlvbiBnZXRfY2FjaGUoKQogICAgaWYgY2FjaGUgdGhlbgogICAgICAgIHJldHVybiBjYWNoZQogICAgZW5kCiAgICBpZiBub3QgbHJ1Y2FjaGVfb2sgb3Igbm90IGxydWNhY2hlIHRoZW4KICAgICAgICByZXR1cm4gbmlsCiAgICBlbmQKICAgIGxvY2FsIGMsIGVyciA9IGxydWNhY2hlLm5ldyg1MDAwMCkKICAgIGlmIG5vdCBjIHRoZW4KICAgICAgICByZXR1cm4gbmlsCiAgICBlbmQKICAgIGNhY2hlID0gYwogICAgcmV0dXJuIGNhY2hlCmVuZAoKLS0tIEdldCBjb3VudHJ5IElTTyBjb2RlIGZvciBJUC4gVXNlcyBpbi1tZW1vcnkgTFJVIGNhY2hlIHRoZW4gTWF4TWluZCBEQi4KLS0gQHBhcmFtIGlwIHN0cmluZyAoZS5nLiAiOC44LjguOCIpCi0tIEByZXR1cm4gc3RyaW5nfG5pbCBjb3VudHJ5IGNvZGUgKGUuZy4gIlVTIikgb3IgbmlsCmZ1bmN0aW9uIF9NLmdldF9jb3VudHJ5X2NvZGUoaXApCiAgICBpZiBub3QgaXAgb3IgaXAgPT0gIiIgdGhlbgogICAgICAgIHJldHVybiBuaWwKICAgIGVuZAoKICAgIGxvY2FsIGMgPSBnZXRfY2FjaGUoKQogICAgaWYgYyB0aGVuCiAgICAgICAgbG9jYWwgY2FjaGVkID0gYzpnZXQoaXApCiAgICAgICAgaWYgY2FjaGVkIH49IG5pbCB0aGVuCiAgICAgICAgICAgIC0tIGZhbHNlIG1lYW5zICJsb29rZWQgdXAsIG5vIHJlc3VsdCIgLSBhdm9pZHMgcmVwZWF0ZWQgREIgbWlzc2VzCiAgICAgICAgICAgIHJldHVybiAoY2FjaGVkID09IGZhbHNlKSBhbmQgbmlsIG9yIGNhY2hlZAogICAgICAgIGVuZAogICAgZW5kCgogICAgaWYgbm90IGVuc3VyZV9nZW9faW5pdCgpIHRoZW4KICAgICAgICBpZiBjIHRoZW4gYzpzZXQoaXAsIGZhbHNlKSBlbmQKICAgICAgICByZXR1cm4gbmlsCiAgICBlbmQKCiAgICBsb2NhbCBvaywgcmVzLCBlcnIgPSBwY2FsbChtYXhtaW5kLmxvb2t1cCwgaXApCiAgICBsb2NhbCBjb2RlID0gbmlsCiAgICBpZiBvayBhbmQgcmVzIGFuZCByZXMuY291bnRyeSBhbmQgcmVzLmNvdW50cnkuaXNvX2NvZGUgdGhlbgogICAgICAgIGNvZGUgPSByZXMuY291bnRyeS5pc29fY29kZQogICAgZW5kCgogICAgaWYgYyB0aGVuCiAgICAgICAgYzpzZXQoaXAsIGNvZGUgb3IgZmFsc2UpCiAgICBlbmQKICAgIHJldHVybiBjb2RlCmVuZAoKZnVuY3Rpb24gX00uZW5zdXJlX2dlb19pbml0KCkKICAgIHJldHVybiBlbnN1cmVfZ2VvX2luaXQoKQplbmQKCnJldHVybiBfTQo=",
18
- "mgmt_api.lua": "LS0gbWdtdF9hcGkubHVhCi0tIFJFU1QgYW5hbHl0aWNzIGVuZHBvaW50cyBiYWNrZWQgYnkgbmd4LnNoYXJlZC5kaWN0LgotLSBJbnRlcm5hbCBtYW5hZ2VtZW50IHBvcnQgb25seSAoMTI3LjAuMC4xOjkxNDUpLgoKbG9jYWwgY2pzb24gPSByZXF1aXJlICJjanNvbi5zYWZlIgoKbG9jYWwgYW5hbHl0aWNzICAgID0gbmd4LnNoYXJlZC5hbmFseXRpY3MKbG9jYWwgcmVxdWVzdF9kYXRhID0gbmd4LnNoYXJlZC5yZXF1ZXN0X2RhdGEKbG9jYWwgdXJpICAgICAgICAgID0gbmd4LnZhci51cmkKCmxvY2FsIGZ1bmN0aW9uIGpzb24oZGF0YSwgY29kZSkKICAgIG5neC5zdGF0dXMgPSBjb2RlIG9yIDIwMAogICAgbmd4LmhlYWRlclsiQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24vanNvbiIKICAgIG5neC5zYXkoY2pzb24uZW5jb2RlKGRhdGEpKQogICAgcmV0dXJuIG5neC5leGl0KG5neC5zdGF0dXMpCmVuZAoKbG9jYWwgZnVuY3Rpb24gYmFkKG1zZykKICAgIHJldHVybiBqc29uKHsgZXJyb3IgPSBtc2cgfSwgNDAwKQplbmQKCi0tIOKUgOKUgCBHRVQgL2hlYWx0aCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmlmIHVyaSA9PSAiL2hlYWx0aCIgdGhlbgogICAgbmd4LnNheSgib2siKQogICAgcmV0dXJuIG5neC5leGl0KDIwMCkKZW5kCgotLSDilIDilIAgL3J1bGVzIC0gcGVyLXJvdXRlIHJ1bGVzIGNhY2hlICh3cml0dGVuIGJ5IHRoZSBBUEksIHJlYWQgYnkgcnVsZXNfZ3VhcmQpIOKUgOKUgAotLSBQT1NUIC9ydWxlcyAgYm9keTogeyAiaG9zdCI6ICIuLi4iLCAicnVsZXMiOiBbIHsgInBhdGhQcmVmaXgiOiAiLyIsICJzcGVjIjogey4uLn0gfSBdIH0KLS0gICDihpIgcmVwbGFjZXMgdGhlIHJ1bGVzZXQgZm9yIHRoYXQgaG9zdCBpbiB0aGUgYHJ1bGVzYCBzaGFyZWQgZGljdCAocmVsb2FkLWZyZWUpLgotLSAgIEFuIGVtcHR5L2Fic2VudCBgcnVsZXNgIGFycmF5IGNsZWFycyB0aGUgaG9zdC4KLS0gR0VUICAvcnVsZXM/aG9zdD0uLi4gICDihpIgdGhlIHN0b3JlZCBydWxlc2V0IChkZWJ1ZykuCi0tIERFTEVURSAvcnVsZXM/aG9zdD0uLi4g4oaSIGNsZWFyIHRoZSBob3N0J3MgcnVsZXNldC4KLS0gSGFuZGxlZCBCRUZPUkUgdGhlIGFuYWx5dGljcyBndWFyZDogcnVsZXMgdXNlIHRoZWlyIG93biBkaWN0LgppZiB1cmkgPT0gIi9ydWxlcyIgdGhlbgogICAgbG9jYWwgcnVsZXMgPSBuZ3guc2hhcmVkLnJ1bGVzCiAgICBpZiBub3QgcnVsZXMgdGhlbiByZXR1cm4ganNvbih7IGVycm9yID0gInJ1bGVzIGRpY3QgdW5hdmFpbGFibGUiIH0sIDUwMykgZW5kCiAgICBsb2NhbCBtZXRob2QgPSBuZ3gucmVxLmdldF9tZXRob2QoKQoKICAgIGlmIG1ldGhvZCA9PSAiR0VUIiB0aGVuCiAgICAgICAgbG9jYWwgaG9zdCA9IG5neC52YXIuYXJnX2hvc3QKICAgICAgICBpZiBub3QgaG9zdCBvciBob3N0ID09ICIiIHRoZW4gcmV0dXJuIGJhZCgibWlzc2luZyA/aG9zdD0iKSBlbmQKICAgICAgICBob3N0ID0gaG9zdDpsb3dlcigpCiAgICAgICAgbG9jYWwgcmF3ID0gcnVsZXM6Z2V0KGhvc3QpCiAgICAgICAgcmV0dXJuIGpzb24oeyBob3N0ID0gaG9zdCwgcnVsZXMgPSByYXcgYW5kIGNqc29uLmRlY29kZShyYXcpIG9yIHt9IH0pCiAgICBlbmQKCiAgICBpZiBtZXRob2QgPT0gIkRFTEVURSIgdGhlbgogICAgICAgIGxvY2FsIGhvc3QgPSBuZ3gudmFyLmFyZ19ob3N0CiAgICAgICAgaWYgbm90IGhvc3Qgb3IgaG9zdCA9PSAiIiB0aGVuIHJldHVybiBiYWQoIm1pc3NpbmcgP2hvc3Q9IikgZW5kCiAgICAgICAgcnVsZXM6ZGVsZXRlKGhvc3Q6bG93ZXIoKSkKICAgICAgICByZXR1cm4ganNvbih7IG9rID0gdHJ1ZSB9KQogICAgZW5kCgogICAgaWYgbWV0aG9kID09ICJQT1NUIiB0aGVuCiAgICAgICAgbmd4LnJlcS5yZWFkX2JvZHkoKQogICAgICAgIGxvY2FsIGJvZHkgPSBuZ3gucmVxLmdldF9ib2R5X2RhdGEoKQogICAgICAgIGlmIG5vdCBib2R5IHRoZW4gcmV0dXJuIGJhZCgiZW1wdHkgYm9keSIpIGVuZAogICAgICAgIGxvY2FsIHBheWxvYWQgPSBjanNvbi5kZWNvZGUoYm9keSkKICAgICAgICBpZiB0eXBlKHBheWxvYWQpIH49ICJ0YWJsZSIgb3Igbm90IHBheWxvYWQuaG9zdCB0aGVuCiAgICAgICAgICAgIHJldHVybiBiYWQoImV4cGVjdGVkIHsgaG9zdCwgcnVsZXM6IFsuLi5dIH0iKQogICAgICAgIGVuZAogICAgICAgIGxvY2FsIGhvc3QgPSB0b3N0cmluZyhwYXlsb2FkLmhvc3QpOmxvd2VyKCkKICAgICAgICBsb2NhbCBsaXN0ID0gcGF5bG9hZC5ydWxlcwogICAgICAgIGlmIHR5cGUobGlzdCkgfj0gInRhYmxlIiBvciAjbGlzdCA9PSAwIHRoZW4KICAgICAgICAgICAgcnVsZXM6ZGVsZXRlKGhvc3QpICAgICAgICAgICAgICAgICAtLSBlbXB0eSBzZXQgPSBjbGVhciB0aGUgaG9zdAogICAgICAgICAgICByZXR1cm4ganNvbih7IG9rID0gdHJ1ZSwgaG9zdCA9IGhvc3QsIGNvdW50ID0gMCB9KQogICAgICAgIGVuZAogICAgICAgIGxvY2FsIG9rLCBlcnIgPSBydWxlczpzZXQoaG9zdCwgY2pzb24uZW5jb2RlKGxpc3QpKQogICAgICAgIGlmIG5vdCBvayB0aGVuIHJldHVybiBqc29uKHsgZXJyb3IgPSAic2V0IGZhaWxlZDogIiAuLiAoZXJyIG9yICI/IikgfSwgNTAwKSBlbmQKICAgICAgICByZXR1cm4ganNvbih7IG9rID0gdHJ1ZSwgaG9zdCA9IGhvc3QsIGNvdW50ID0gI2xpc3QgfSkKICAgIGVuZAoKICAgIHJldHVybiBqc29uKHsgZXJyb3IgPSAibWV0aG9kIG5vdCBhbGxvd2VkIiB9LCA0MDUpCmVuZAoKaWYgbm90IGFuYWx5dGljcyB0aGVuCiAgICByZXR1cm4ganNvbih7IGVycm9yID0gImFuYWx5dGljcyBkaWN0IHVuYXZhaWxhYmxlIiB9LCA1MDMpCmVuZAoKLS0g4pSA4pSAIEdFVCAvYW5hbHl0aWNzIC0gbWludXRlLWJ1Y2tldCB0aW1lIHNlcmllcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLS0gP2RvbWFpbj1leGFtcGxlLmNvbSZmcm9tPUVQT0NIX01JTiZ0bz1FUE9DSF9NSU4KCmlmIHVyaSA9PSAiL2FuYWx5dGljcyIgdGhlbgogICAgbG9jYWwgZG9tYWluID0gbmd4LnZhci5hcmdfZG9tYWluCiAgICBpZiBub3QgZG9tYWluIG9yIGRvbWFpbiA9PSAiIiB0aGVuIHJldHVybiBiYWQoIm1pc3NpbmcgP2RvbWFpbj0iKSBlbmQKICAgIGRvbWFpbiA9IGRvbWFpbjpsb3dlcigpCgogICAgbG9jYWwgZnJvbV9tID0gdG9udW1iZXIobmd4LnZhci5hcmdfZnJvbSkKICAgIGxvY2FsIHRvX20gICA9IHRvbnVtYmVyKG5neC52YXIuYXJnX3RvKQogICAgaWYgbm90IGZyb21fbSBvciBub3QgdG9fbSB0aGVuCiAgICAgICAgcmV0dXJuIGJhZCgibWlzc2luZyA/ZnJvbT0gYW5kID90bz0gKGVwb2NoIG1pbnV0ZXMpIikKICAgIGVuZAogICAgLS0gQ2FwIGF0IDI0aAogICAgaWYgdG9fbSAtIGZyb21fbSA+IDE0NDAgdGhlbiB0b19tID0gZnJvbV9tICsgMTQ0MCBlbmQKCiAgICBsb2NhbCBidWNrZXRzID0ge30KICAgIGZvciBtID0gZnJvbV9tLCB0b19tIGRvCiAgICAgICAgbG9jYWwgcCA9ICJzOiIgLi4gZG9tYWluIC4uICI6IiAuLiBtCiAgICAgICAgbG9jYWwgciA9IGFuYWx5dGljczpnZXQocCAuLiAiOnIiKQogICAgICAgIGlmIHIgdGhlbgogICAgICAgICAgICAtLSBSZXNwb25zZSB0aW1lIHN0b3JlZCBhcyBtaWNyb3NlY29uZHMsIGNvbnZlcnQgdG8gc2Vjb25kcyAoZmxvYXQpCiAgICAgICAgICAgIGxvY2FsIHJ0X3VzID0gYW5hbHl0aWNzOmdldChwIC4uICI6dCIpIG9yIDAKICAgICAgICAgICAgbG9jYWwgYnVja2V0ID0gewogICAgICAgICAgICAgICAgbWludXRlICAgICAgICAgICA9IG0sCiAgICAgICAgICAgICAgICByZXF1ZXN0cyAgICAgICAgID0gciwKICAgICAgICAgICAgICAgIHVuaXF1ZV9yZXF1ZXN0cyAgPSBhbmFseXRpY3M6Z2V0KHAgLi4gIjp1Iikgb3IgMCwKICAgICAgICAgICAgICAgIGJhbmR3aWR0aF9pbiAgICAgPSBhbmFseXRpY3M6Z2V0KHAgLi4gIjppIikgb3IgMCwKICAgICAgICAgICAgICAgIGJhbmR3aWR0aF9vdXQgICAgPSBhbmFseXRpY3M6Z2V0KHAgLi4gIjpvIikgb3IgMCwKICAgICAgICAgICAgICAgIHJlc3BvbnNlX3RpbWUgICAgPSBydF91cyAvIDEwMDAwMDAsCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC0tIENvbGxlY3QgcGVyLW1pbnV0ZSBjb3VudHJ5IGRhdGEgaWYgcHJlc2VudAogICAgICAgICAgICBsb2NhbCBjcGZ4ID0gImM6IiAuLiBkb21haW4gLi4gIjoiIC4uIG0gLi4gIjoiCiAgICAgICAgICAgIGxvY2FsIGFsbF9rZXlzID0gYW5hbHl0aWNzOmdldF9rZXlzKDEwMDAwKQogICAgICAgICAgICBsb2NhbCBjb3VudHJpZXMgPSB7fQogICAgICAgICAgICBsb2NhbCBoYXNfY291bnRyaWVzID0gZmFsc2UKICAgICAgICAgICAgZm9yIF8sIGsgaW4gaXBhaXJzKGFsbF9rZXlzKSBkbwogICAgICAgICAgICAgICAgaWYgazpzdWIoMSwgI2NwZngpID09IGNwZnggdGhlbgogICAgICAgICAgICAgICAgICAgIGNvdW50cmllc1trOnN1YigjY3BmeCArIDEpXSA9IGFuYWx5dGljczpnZXQoaykgb3IgMAogICAgICAgICAgICAgICAgICAgIGhhc19jb3VudHJpZXMgPSB0cnVlCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGlmIGhhc19jb3VudHJpZXMgdGhlbgogICAgICAgICAgICAgICAgYnVja2V0LmNvdW50cmllcyA9IGNvdW50cmllcwogICAgICAgICAgICBlbmQKCiAgICAgICAgICAgIGJ1Y2tldHNbI2J1Y2tldHMgKyAxXSA9IGJ1Y2tldAogICAgICAgIGVuZAogICAgZW5kCgogICAgcmV0dXJuIGpzb24oeyBkb21haW4gPSBkb21haW4sIGJ1Y2tldHMgPSBidWNrZXRzIH0pCmVuZAoKLS0g4pSA4pSAIFBPU1QgL2FuYWx5dGljcy9mbHVzaCAtIHJlYWQgKyBkZWxldGUgbWludXRlIGJ1Y2tldHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tIFNhbWUgYXMgR0VUIC9hbmFseXRpY3MgYnV0IGRlbGV0ZXMgdGhlIHJldHVybmVkIGJ1Y2tldHMgZnJvbSBzaGFyZWQgbWVtb3J5LgotLSBVc2VkIGJ5IHRoZSBzY3JhcGVyIHRvIGF0b21pY2FsbHkgbW92ZSBkYXRhIGZyb20gT3BlblJlc3R5IOKGkiBEQi4KLS0gP2RvbWFpbj1leGFtcGxlLmNvbSZmcm9tPUVQT0NIX01JTiZ0bz1FUE9DSF9NSU4KCmlmIHVyaSA9PSAiL2FuYWx5dGljcy9mbHVzaCIgYW5kIG5neC5yZXEuZ2V0X21ldGhvZCgpID09ICJQT1NUIiB0aGVuCiAgICBsb2NhbCBkb21haW4gPSBuZ3gudmFyLmFyZ19kb21haW4KICAgIGlmIG5vdCBkb21haW4gb3IgZG9tYWluID09ICIiIHRoZW4gcmV0dXJuIGJhZCgibWlzc2luZyA/ZG9tYWluPSIpIGVuZAogICAgZG9tYWluID0gZG9tYWluOmxvd2VyKCkKCiAgICBsb2NhbCBmcm9tX20gPSB0b251bWJlcihuZ3gudmFyLmFyZ19mcm9tKQogICAgbG9jYWwgdG9fbSAgID0gdG9udW1iZXIobmd4LnZhci5hcmdfdG8pCiAgICBpZiBub3QgZnJvbV9tIG9yIG5vdCB0b19tIHRoZW4KICAgICAgICByZXR1cm4gYmFkKCJtaXNzaW5nID9mcm9tPSBhbmQgP3RvPSAoZXBvY2ggbWludXRlcykiKQogICAgZW5kCiAgICBpZiB0b19tIC0gZnJvbV9tID4gMTQ0MCB0aGVuIHRvX20gPSBmcm9tX20gKyAxNDQwIGVuZAoKICAgIGxvY2FsIGJ1Y2tldHMgPSB7fQogICAgbG9jYWwgZmx1c2hlZCA9IDAKICAgIGZvciBtID0gZnJvbV9tLCB0b19tIGRvCiAgICAgICAgbG9jYWwgcCA9ICJzOiIgLi4gZG9tYWluIC4uICI6IiAuLiBtCiAgICAgICAgbG9jYWwgciA9IGFuYWx5dGljczpnZXQocCAuLiAiOnIiKQogICAgICAgIGlmIHIgdGhlbgogICAgICAgICAgICBsb2NhbCBydF91cyA9IGFuYWx5dGljczpnZXQocCAuLiAiOnQiKSBvciAwCiAgICAgICAgICAgIGxvY2FsIGJ1Y2tldCA9IHsKICAgICAgICAgICAgICAgIG1pbnV0ZSAgICAgICAgICAgPSBtLAogICAgICAgICAgICAgICAgcmVxdWVzdHMgICAgICAgICA9IHIsCiAgICAgICAgICAgICAgICB1bmlxdWVfcmVxdWVzdHMgID0gYW5hbHl0aWNzOmdldChwIC4uICI6dSIpIG9yIDAsCiAgICAgICAgICAgICAgICBiYW5kd2lkdGhfaW4gICAgID0gYW5hbHl0aWNzOmdldChwIC4uICI6aSIpIG9yIDAsCiAgICAgICAgICAgICAgICBiYW5kd2lkdGhfb3V0ICAgID0gYW5hbHl0aWNzOmdldChwIC4uICI6byIpIG9yIDAsCiAgICAgICAgICAgICAgICByZXNwb25zZV90aW1lICAgID0gcnRfdXMgLyAxMDAwMDAwLAogICAgICAgICAgICB9CgogICAgICAgICAgICAtLSBDb2xsZWN0IHBlci1taW51dGUgY291bnRyeSBkYXRhCiAgICAgICAgICAgIGxvY2FsIGNwZnggPSAiYzoiIC4uIGRvbWFpbiAuLiAiOiIgLi4gbSAuLiAiOiIKICAgICAgICAgICAgbG9jYWwgYWxsX2tleXMgPSBhbmFseXRpY3M6Z2V0X2tleXMoMTAwMDApCiAgICAgICAgICAgIGxvY2FsIGNvdW50cmllcyA9IHt9CiAgICAgICAgICAgIGxvY2FsIGhhc19jb3VudHJpZXMgPSBmYWxzZQogICAgICAgICAgICBmb3IgXywgayBpbiBpcGFpcnMoYWxsX2tleXMpIGRvCiAgICAgICAgICAgICAgICBpZiBrOnN1YigxLCAjY3BmeCkgPT0gY3BmeCB0aGVuCiAgICAgICAgICAgICAgICAgICAgY291bnRyaWVzW2s6c3ViKCNjcGZ4ICsgMSldID0gYW5hbHl0aWNzOmdldChrKSBvciAwCiAgICAgICAgICAgICAgICAgICAgYW5hbHl0aWNzOmRlbGV0ZShrKQogICAgICAgICAgICAgICAgICAgIGhhc19jb3VudHJpZXMgPSB0cnVlCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGlmIGhhc19jb3VudHJpZXMgdGhlbiBidWNrZXQuY291bnRyaWVzID0gY291bnRyaWVzIGVuZAoKICAgICAgICAgICAgYnVja2V0c1sjYnVja2V0cyArIDFdID0gYnVja2V0CgogICAgICAgICAgICAtLSBEZWxldGUgdGhlIG1pbnV0ZS1idWNrZXQgY291bnRlciBrZXlzCiAgICAgICAgICAgIGFuYWx5dGljczpkZWxldGUocCAuLiAiOnIiKQogICAgICAgICAgICBhbmFseXRpY3M6ZGVsZXRlKHAgLi4gIjppIikKICAgICAgICAgICAgYW5hbHl0aWNzOmRlbGV0ZShwIC4uICI6byIpCiAgICAgICAgICAgIGFuYWx5dGljczpkZWxldGUocCAuLiAiOnQiKQogICAgICAgICAgICBhbmFseXRpY3M6ZGVsZXRlKHAgLi4gIjp1IikKICAgICAgICAgICAgZmx1c2hlZCA9IGZsdXNoZWQgKyAxCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICByZXR1cm4ganNvbih7IGRvbWFpbiA9IGRvbWFpbiwgYnVja2V0cyA9IGJ1Y2tldHMsIGZsdXNoZWQgPSBmbHVzaGVkIH0pCmVuZAoKLS0g4pSA4pSAIEdFVCAvYW5hbHl0aWNzL3RvdGFscyAtIGxpZmV0aW1lIGNvdW50ZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAotLSA/ZG9tYWluPWV4YW1wbGUuY29tICAgICAg4oaSIHNpbmdsZSBkb21haW4KLS0gKG5vIGRvbWFpbikgICAgICAgICAgICAgIOKGkiBhbGwga25vd24gZG9tYWlucwoKaWYgdXJpID09ICIvYW5hbHl0aWNzL3RvdGFscyIgdGhlbgogICAgbG9jYWwgZG9tYWluID0gbmd4LnZhci5hcmdfZG9tYWluCgogICAgaWYgbm90IGRvbWFpbiBvciBkb21haW4gPT0gIiIgdGhlbgogICAgICAgIGxvY2FsIGtleXMgPSBhbmFseXRpY3M6Z2V0X2tleXMoMTAwMDApCiAgICAgICAgbG9jYWwgZG9tYWlucyA9IHt9CiAgICAgICAgZm9yIF8sIGsgaW4gaXBhaXJzKGtleXMpIGRvCiAgICAgICAgICAgIGxvY2FsIGQgPSBrOm1hdGNoKCJeZDooLispJCIpCiAgICAgICAgICAgIGlmIGQgdGhlbgogICAgICAgICAgICAgICAgZG9tYWluc1sjZG9tYWlucyArIDFdID0gewogICAgICAgICAgICAgICAgICAgIGRvbWFpbiAgICAgICAgPSBkLAogICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzICAgICAgPSBhbmFseXRpY3M6Z2V0KCJ0OiIgLi4gZCAuLiAiOnIiKSBvciAwLAogICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aF9pbiAgPSBhbmFseXRpY3M6Z2V0KCJ0OiIgLi4gZCAuLiAiOmkiKSBvciAwLAogICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aF9vdXQgPSBhbmFseXRpY3M6Z2V0KCJ0OiIgLi4gZCAuLiAiOm8iKSBvciAwLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgICAgICByZXR1cm4ganNvbih7IGRvbWFpbnMgPSBkb21haW5zIH0pCiAgICBlbmQKCiAgICBkb21haW4gPSBkb21haW46bG93ZXIoKQogICAgcmV0dXJuIGpzb24oewogICAgICAgIGRvbWFpbiAgICAgICAgPSBkb21haW4sCiAgICAgICAgcmVxdWVzdHMgICAgICA9IGFuYWx5dGljczpnZXQoInQ6IiAuLiBkb21haW4gLi4gIjpyIikgb3IgMCwKICAgICAgICBiYW5kd2lkdGhfaW4gID0gYW5hbHl0aWNzOmdldCgidDoiIC4uIGRvbWFpbiAuLiAiOmkiKSBvciAwLAogICAgICAgIGJhbmR3aWR0aF9vdXQgPSBhbmFseXRpY3M6Z2V0KCJ0OiIgLi4gZG9tYWluIC4uICI6byIpIG9yIDAsCiAgICB9KQplbmQKCi0tIOKUgOKUgCBHRVQgL2FuYWx5dGljcy9nZW8gLSBjb3VudHJ5IGJyZWFrZG93biBmb3IgYSBkYXkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tID9kb21haW49ZXhhbXBsZS5jb20mZGF5PVlZWVlNTURECgppZiB1cmkgPT0gIi9hbmFseXRpY3MvZ2VvIiB0aGVuCiAgICBsb2NhbCBkb21haW4gPSBuZ3gudmFyLmFyZ19kb21haW4KICAgIGlmIG5vdCBkb21haW4gb3IgZG9tYWluID09ICIiIHRoZW4gcmV0dXJuIGJhZCgibWlzc2luZyA/ZG9tYWluPSIpIGVuZAogICAgZG9tYWluID0gZG9tYWluOmxvd2VyKCkKCiAgICBsb2NhbCBkYXkgPSBuZ3gudmFyLmFyZ19kYXkKICAgIGlmIG5vdCBkYXkgb3IgI2RheSB+PSA4IHRoZW4KICAgICAgICBkYXkgPSBvcy5kYXRlKCIhJVklbSVkIikKICAgIGVuZAoKICAgIGxvY2FsIHByZWZpeCA9ICJnOiIgLi4gZG9tYWluIC4uICI6IiAuLiBkYXkgLi4gIjoiCiAgICBsb2NhbCBrZXlzID0gYW5hbHl0aWNzOmdldF9rZXlzKDEwMDAwKQogICAgbG9jYWwgY291bnRyaWVzID0ge30KICAgIGZvciBfLCBrIGluIGlwYWlycyhrZXlzKSBkbwogICAgICAgIGlmIGs6c3ViKDEsICNwcmVmaXgpID09IHByZWZpeCB0aGVuCiAgICAgICAgICAgIGNvdW50cmllc1trOnN1YigjcHJlZml4ICsgMSldID0gYW5hbHl0aWNzOmdldChrKSBvciAwCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICByZXR1cm4ganNvbih7IGRvbWFpbiA9IGRvbWFpbiwgZGF5ID0gZGF5LCBjb3VudHJpZXMgPSBjb3VudHJpZXMgfSkKZW5kCgotLSDilIDilIAgR0VUIC9sb2dzL3JlY2VudCAtIHJhdyByZXF1ZXN0IHJpbmcgYnVmZmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAotLSA/ZG9tYWluPWV4YW1wbGUuY29tJmxpbWl0PTUwCgppZiB1cmkgPT0gIi9sb2dzL3JlY2VudCIgdGhlbgogICAgaWYgbm90IHJlcXVlc3RfZGF0YSB0aGVuCiAgICAgICAgcmV0dXJuIGpzb24oeyBlcnJvciA9ICJyZXF1ZXN0X2RhdGEgZGljdCB1bmF2YWlsYWJsZSIgfSwgNTAzKQogICAgZW5kCgogICAgbG9jYWwgZG9tYWluID0gbmd4LnZhci5hcmdfZG9tYWluCiAgICBpZiBub3QgZG9tYWluIG9yIGRvbWFpbiA9PSAiIiB0aGVuIHJldHVybiBiYWQoIm1pc3NpbmcgP2RvbWFpbj0iKSBlbmQKICAgIGRvbWFpbiA9IGRvbWFpbjpsb3dlcigpCgogICAgbG9jYWwgbGltaXQgPSBtYXRoLm1pbih0b251bWJlcihuZ3gudmFyLmFyZ19saW1pdCkgb3IgNTAsIDEwMDApCiAgICBsb2NhbCBzZXEgICA9IHJlcXVlc3RfZGF0YTpnZXQoInJsb2c6IiAuLiBkb21haW4gLi4gIjpzZXEiKSBvciAwCiAgICBsb2NhbCBvdXQgICA9IHt9CgogICAgZm9yIGkgPSAwLCBsaW1pdCAtIDEgZG8KICAgICAgICBsb2NhbCBzbG90ID0gKHNlcSAtIGkpICUgMTAwMAogICAgICAgIGlmIHNsb3QgPCAwIHRoZW4gc2xvdCA9IHNsb3QgKyAxMDAwIGVuZAogICAgICAgIGxvY2FsIHJhdyA9IHJlcXVlc3RfZGF0YTpnZXQoInJsb2c6IiAuLiBkb21haW4gLi4gIjoiIC4uIHNsb3QpCiAgICAgICAgaWYgcmF3IHRoZW4gb3V0WyNvdXQgKyAxXSA9IHJhdyBlbmQKICAgIGVuZAoKICAgIC0tIFJldHVybiBwcmUtZW5jb2RlZCBKU09OIGVudHJpZXMgYXMgYSBKU09OIGFycmF5CiAgICBuZ3guaGVhZGVyWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIgogICAgbmd4LnByaW50KCJbIikKICAgIGZvciBpZHgsIGVudHJ5IGluIGlwYWlycyhvdXQpIGRvCiAgICAgICAgaWYgaWR4ID4gMSB0aGVuIG5neC5wcmludCgiLCIpIGVuZAogICAgICAgIG5neC5wcmludChlbnRyeSkKICAgIGVuZAogICAgbmd4LnNheSgiXSIpCiAgICByZXR1cm4gbmd4LmV4aXQoMjAwKQplbmQKCi0tIOKUgOKUgCA0MDQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACnJldHVybiBqc29uKHsgZXJyb3IgPSAibm90IGZvdW5kIiB9LCA0MDQpCg==",
19
- "pipe_log.lua": "LS0gcGlwZV9sb2cubHVhCi0tIFB1c2ggcmVxdWVzdCBsb2cgaW50byBzaGFyZWQgZGljdCBxdWV1ZSBsb2dfcGlwZTpxOntob3N0fSBmb3IgL3N0cmVhbSBTU0UuCi0tIFBheWxvYWQgc2hhcGUgbWF0Y2hlcyByZXF1ZXN0TG9nZ2VyLmpzIChpZCwgaXAsIGNvdW50cnkgd2hlbiBrbm93biwKLS0gdGltZXN0YW1wLCBkYXRlLCB1cmksIG1ldGhvZCwgc3RhdHVzLCB1c2VyQWdlbnQsIHJlcXVlc3RTaXplLCByZXNwb25zZVNpemUsCi0tIHJlc3BvbnNlVGltZSkuCi0tCi0tIENhbGxlZCB2aWEgbmd4LnRpbWVyLmF0IGZyb20gc2l0ZV9sb2dnZXIgKHByZW1hdHVyZSBpcyBmaXJzdCBhcmcpLgoKbG9jYWwgY2pzb24gPSByZXF1aXJlICJjanNvbi5zYWZlIgoKbG9jYWwgU1VCX1BSRUZJWCAgID0gImxvZ19waXBlOnN1YjoiCmxvY2FsIFFVRVVFX1BSRUZJWCA9ICJsb2dfcGlwZTpxOiIKbG9jYWwgUVVFVUVfTUFYX0xFTiA9IDIwMDAKCi0tIFNBRkUgTE9BRDogR2VvSVAgKHBlci13b3JrZXIsIGNhY2hlZCBieSByZXF1aXJlKQpsb2NhbCBnZW9fb2ssIGdlbyA9IHBjYWxsKHJlcXVpcmUsICJvcGVuc2hpcC5nZW9fY291bnRyeSIpCmlmIG5vdCBnZW9fb2sgdGhlbiBnZW8gPSBuaWwgZW5kCgotLSBSZXVzZWQgcGF5bG9hZCB0YWJsZSBwZXIgd29ya2VyIChjbGVhcmVkIGFmdGVyIGVuY29kZSB0byBhdm9pZCBHQyBwcmVzc3VyZSkKbG9jYWwgcGF5bG9hZCA9IHt9Cgpsb2NhbCBmdW5jdGlvbiBwaXBlX3JlcXVlc3RfbG9nKHByZW1hdHVyZSwgaG9zdCwgaXAsIHRzLCB1YSwgdXJpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV9sZW4sIGJ5dGVzLCBydCwgbWV0aG9kLCBzdGF0dXMpCiAgICBpZiBwcmVtYXR1cmUgdGhlbiByZXR1cm4gZW5kCgogICAgbG9jYWwgc2ggPSBuZ3guc2hhcmVkLnJlcXVlc3RfZGF0YQogICAgaWYgbm90IHNoIHRoZW4gcmV0dXJuIGVuZAoKICAgIC0tIERvdWJsZS1jaGVjayBzdWJzY3JpYmVyIGlzIHN0aWxsIGFjdGl2ZSAoZ3VhcmQgYWdhaW5zdCByYWNlKQogICAgaWYgbm90IHNoOmdldChTVUJfUFJFRklYIC4uIGhvc3QpIHRoZW4gcmV0dXJuIGVuZAoKICAgIHBjYWxsKGZ1bmN0aW9uKCkKICAgICAgICBsb2NhbCBjb3VudHJ5ID0gbmlsCiAgICAgICAgaWYgZ2VvIGFuZCBnZW8uZ2V0X2NvdW50cnlfY29kZSB0aGVuCiAgICAgICAgICAgIGNvdW50cnkgPSBnZW8uZ2V0X2NvdW50cnlfY29kZShpcCkKICAgICAgICBlbmQKCiAgICAgICAgcGF5bG9hZC5pZCAgICAgICAgICAgPSBzdHJpbmcuZm9ybWF0KCIlLjNmLSVkIiwgdHMsIG1hdGgucmFuZG9tKDEwMDAwLCA5OTk5OSkpCiAgICAgICAgcGF5bG9hZC5ob3N0ICAgICAgICAgPSBob3N0CiAgICAgICAgcGF5bG9hZC5pcCAgICAgICAgICAgPSBpcAogICAgICAgIGlmIGNvdW50cnkgYW5kIHR5cGUoY291bnRyeSkgPT0gInN0cmluZyIgYW5kIGNvdW50cnkgfj0gIiIgdGhlbgogICAgICAgICAgICBwYXlsb2FkLmNvdW50cnkgPSBjb3VudHJ5CiAgICAgICAgZW5kCiAgICAgICAgcGF5bG9hZC50aW1lc3RhbXAgICAgPSB0cwogICAgICAgIHBheWxvYWQuZGF0ZSAgICAgICAgID0gb3MuZGF0ZSgiISVZLSVtLSVkICVIOiVNOiVTIiwgdHMpCiAgICAgICAgcGF5bG9hZC51cmkgICAgICAgICAgPSB1cmkKICAgICAgICBwYXlsb2FkLm1ldGhvZCAgICAgICA9IG1ldGhvZCBvciAiR0VUIgogICAgICAgIHBheWxvYWQuc3RhdHVzICAgICAgID0gdG9udW1iZXIoc3RhdHVzKSBvciAwCiAgICAgICAgcGF5bG9hZC51c2VyQWdlbnQgICAgPSB1YSBvciAiIgogICAgICAgIHBheWxvYWQucmVxdWVzdFNpemUgID0gdG9udW1iZXIocmVxX2xlbikgb3IgMAogICAgICAgIHBheWxvYWQucmVzcG9uc2VTaXplID0gdG9udW1iZXIoYnl0ZXMpIG9yIDAKICAgICAgICBwYXlsb2FkLnJlc3BvbnNlVGltZSA9IHRvbnVtYmVyKHJ0KSBvciAwCgogICAgICAgIGxvY2FsIGJvZHkgPSBjanNvbi5lbmNvZGUocGF5bG9hZCkKCiAgICAgICAgLS0gQ2xlYXIgcGF5bG9hZCB0YWJsZSBmb3IgbmV4dCByZXVzZQogICAgICAgIGZvciBrIGluIHBhaXJzKHBheWxvYWQpIGRvIHBheWxvYWRba10gPSBuaWwgZW5kCgogICAgICAgIGlmIG5vdCBib2R5IHRoZW4gcmV0dXJuIGVuZAoKICAgICAgICBsb2NhbCBxa2V5ID0gUVVFVUVfUFJFRklYIC4uIGhvc3QKICAgICAgICBzaDpscHVzaChxa2V5LCBib2R5KQogICAgICAgIGlmIHNoOmxsZW4ocWtleSkgPiBRVUVVRV9NQVhfTEVOIHRoZW4KICAgICAgICAgICAgc2g6cnBvcChxa2V5KQogICAgICAgIGVuZAogICAgZW5kKQplbmQKCnJldHVybiB7CiAgICBwaXBlX3JlcXVlc3RfbG9nID0gcGlwZV9yZXF1ZXN0X2xvZywKfQo=",
20
- "pipe_stream.lua": "LS0gcGlwZV9zdHJlYW0ubHVhCi0tIGNvbnRlbnRfYnlfbHVhOiBTU0UgZW5kcG9pbnQgZm9yIHJlYWwtdGltZSByZXF1ZXN0IGxvZyBzdHJlYW1pbmcuCi0tIEdFVCAvbG9ncy9zdHJlYW0/ZG9tYWluPWV4YW1wbGUuY29tCi0tIEludGVybmFsIG9ubHkgLSAxMjcuMC4wLjE6OTE0NQoKbG9jYWwgc2ggPSBuZ3guc2hhcmVkLnJlcXVlc3RfZGF0YQppZiBub3Qgc2ggdGhlbgogICAgbmd4LnN0YXR1cyA9IDUwMwogICAgbmd4LnNheSgic2hhcmVkIGRpY3QgdW5hdmFpbGFibGUiKQogICAgcmV0dXJuIG5neC5leGl0KDUwMykKZW5kCgpsb2NhbCBkb21haW4gPSBuZ3gudmFyLmFyZ19kb21haW4KaWYgbm90IGRvbWFpbiBvciBkb21haW4gPT0gIiIgdGhlbgogICAgbmd4LnN0YXR1cyA9IDQwMAogICAgbmd4LnNheSgibWlzc2luZyA/ZG9tYWluPSBwYXJhbWV0ZXIiKQogICAgcmV0dXJuIG5neC5leGl0KDQwMCkKZW5kCgpkb21haW4gPSBkb21haW46bG93ZXIoKQppZiBkb21haW46c3ViKDEsIDQpID09ICJ3d3cuIiB0aGVuIGRvbWFpbiA9IGRvbWFpbjpzdWIoNSkgZW5kCgpsb2NhbCBTVUJfS0VZICAgPSAibG9nX3BpcGU6c3ViOiIgLi4gZG9tYWluCmxvY2FsIFFVRVVFX0tFWSA9ICJsb2dfcGlwZTpxOiIgICAuLiBkb21haW4KCi0tIENsZWFyIHN0YWxlIHF1ZXVlIGVudHJpZXMsIG1hcmsgc3Vic2NyaWJlciBhY3RpdmUKc2g6ZGVsZXRlKFFVRVVFX0tFWSkKc2g6c2V0KFNVQl9LRVksIHRydWUsIDMwKQoKbmd4LmhlYWRlclsiQ29udGVudC1UeXBlIl0gICAgICA9ICJ0ZXh0L2V2ZW50LXN0cmVhbSIKbmd4LmhlYWRlclsiQ2FjaGUtQ29udHJvbCJdICAgICA9ICJuby1jYWNoZSwgbm8tc3RvcmUiCm5neC5oZWFkZXJbIkNvbm5lY3Rpb24iXSAgICAgICAgPSAia2VlcC1hbGl2ZSIKbmd4LmhlYWRlclsiWC1BY2NlbC1CdWZmZXJpbmciXSA9ICJubyIKCi0tIFNlbmQgaW5pdGlhbCBTU0UgY29tbWVudCBzbyB0aGUgZmlyc3QgZmx1c2ggaGFzIGRhdGEuCi0tIFdpdGhvdXQgdGhpcywgbmd4LmZsdXNoIG9uIGFuIGVtcHR5IGJ1ZmZlciBzZW5kcyBjaHVua2VkLUVPRiAoMFxyXG5cclxuKQotLSBhbmQgdGVybWluYXRlcyB0aGUgcmVzcG9uc2UgaW1tZWRpYXRlbHkuCm5neC5wcmludCgiOiBjb25uZWN0ZWRcblxuIikKaWYgbm90IG5neC5mbHVzaCh0cnVlKSB0aGVuCiAgICBzaDpkZWxldGUoU1VCX0tFWSkKICAgIHJldHVybgplbmQKCmxvY2FsIHN0YXJ0ZWQgID0gbmd4Lm5vdygpCmxvY2FsIGxhc3RfaGIgID0gc3RhcnRlZApsb2NhbCBsYXN0X3JlZiA9IHN0YXJ0ZWQKCndoaWxlIHRydWUgZG8KICAgIC0tIE1heCAxIGhvdXIgcGVyIGNvbm5lY3Rpb24KICAgIGlmIG5neC5ub3coKSAtIHN0YXJ0ZWQgPiAzNjAwIHRoZW4KICAgICAgICBzaDpkZWxldGUoU1VCX0tFWSkKICAgICAgICByZXR1cm4KICAgIGVuZAoKICAgIC0tIERyYWluIHVwIHRvIDEwMCBxdWV1ZWQgZW50cmllcyBwZXIgY3ljbGUKICAgIGxvY2FsIHNlbnQgPSAwCiAgICB3aGlsZSBzZW50IDwgMTAwIGRvCiAgICAgICAgbG9jYWwgZW50cnkgPSBzaDpycG9wKFFVRVVFX0tFWSkKICAgICAgICBpZiBub3QgZW50cnkgdGhlbiBicmVhayBlbmQKICAgICAgICBuZ3gucHJpbnQoImV2ZW50OiByZXF1ZXN0XG5kYXRhOiAiLCBlbnRyeSwgIlxuXG4iKQogICAgICAgIHNlbnQgPSBzZW50ICsgMQogICAgZW5kCgogICAgaWYgc2VudCA+IDAgdGhlbgogICAgICAgIGlmIG5vdCBuZ3guZmx1c2godHJ1ZSkgdGhlbgogICAgICAgICAgICBzaDpkZWxldGUoU1VCX0tFWSkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICBsb2NhbCBub3cgPSBuZ3gubm93KCkKCiAgICAtLSBIZWFydGJlYXQgZXZlcnkgMTVzCiAgICBpZiBub3cgLSBsYXN0X2hiID4gMTUgdGhlbgogICAgICAgIG5neC5wcmludCgiOiBwaW5nXG5cbiIpCiAgICAgICAgaWYgbm90IG5neC5mbHVzaCh0cnVlKSB0aGVuCiAgICAgICAgICAgIHNoOmRlbGV0ZShTVUJfS0VZKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBlbmQKICAgICAgICBsYXN0X2hiID0gbm93CiAgICBlbmQKCiAgICAtLSBSZWZyZXNoIHN1YnNjcmliZXIgVFRMIGV2ZXJ5IDEwcwogICAgaWYgbm93IC0gbGFzdF9yZWYgPiAxMCB0aGVuCiAgICAgICAgc2g6c2V0KFNVQl9LRVksIHRydWUsIDMwKQogICAgICAgIGxhc3RfcmVmID0gbm93CiAgICBlbmQKCiAgICBuZ3guc2xlZXAoMC4wNSkKZW5kCg==",
21
- "rules_guard.lua": "LS0gcnVsZXNfZ3VhcmQubHVhCi0tIGFjY2Vzc19ieV9sdWEgZHJpdmVyOiBlbmZvcmNlIHBlci1yb3V0ZSBydWxlcyAobWV0aG9kIMK3IElQL0NJRFIgYWxsb3ctZGVueSDCtwotLSBjb3VudHJ5IGFsbG93L2JhbiDCtyBiYWQgdXNlci1hZ2VudCDCtyBob3RsaW5rIMK3IHJhdGUtbGltaXQpIGZvciB0aGUgcmVxdWVzdCdzCi0tIGhvc3QuIFJ1bGVzIGFyZSBwdXNoZWQgcmVsb2FkLWZyZWUgYnkgbWdtdF9hcGkgYFBPU1QgL3J1bGVzYDsgdGhlIERCCi0tIGByb3V0ZV9ydWxlYCB0YWJsZSBpcyB0aGUgc291cmNlIG9mIHRydXRoLiBBbGwgcGFyc2luZy9jb21waWxpbmcvbWF0Y2hpbmcKLS0gbGl2ZXMgaW4gb3BlbnNoaXAucnVsZXNfbGliIChsb2FkZWQgT05DRSBwZXIgd29ya2VyKSDigJQgdGhpcyBmaWxlIGlzIHJlLXJ1bgotLSBldmVyeSByZXF1ZXN0IHNvIGl0IHN0YXlzIG1pbmltYWwuIFNlZSBydWxlc19saWIubHVhIGZvciB0aGUgY29tcGlsZWQgc2hhcGUuCi0tCi0tIEVuZm9yY2VtZW50IHVzZXMgdGhlIGNvbm5lY3RpbmcgcGVlciAobmd4LnZhci5yZW1vdGVfYWRkcik7IGZyb250IGEgcmVhbF9pcAotLSBjb25maWcgaWYgYmVoaW5kIGEgdHJ1c3RlZCBwcm94eS4gTm8gdXNlci1zdXBwbGllZCB2YWx1ZSBpcyBldmVyIHVzZWQgYXMgYQotLSBMdWEgcGF0dGVybiBvciB3cml0dGVuIGludG8gYSByZXNwb25zZSBoZWFkZXIuCgpsb2NhbCBydWxlcyA9IG5neC5zaGFyZWQucnVsZXMKaWYgbm90IHJ1bGVzIHRoZW4gcmV0dXJuIGVuZAoKLS0gUmF0ZS1saW1pdCBjb3VudGVycyBsaXZlIGluIHRoZWlyIE9XTiBkaWN0IHNvIGEgaGlnaC1jYXJkaW5hbGl0eSBmbG9vZCAoYSBuZXcKLS0gcmw6IGtleSBwZXIgc291cmNlIElQIHBlciBzZWNvbmQpIGNhbid0IExSVS1ldmljdCB0aGUgcnVsZXNldHMgYW5kIHNpbGVudGx5Ci0tIGRpc2FibGUgZW5mb3JjZW1lbnQuIEZhbGwgYmFjayB0byBgcnVsZXNgIG9uIGEgYm94IHdob3NlIGNvbmZpZyBwcmVkYXRlcyB0aGUKLS0gc2VwYXJhdGUgZGljdCAoc3RpbGwgd29ya3MsIGp1c3Qgc2hhcmVzIHRoZSB6b25lIHVudGlsIHRoZSBuZXh0IHJlbG9hZCkuCmxvY2FsIGNvdW50ZXJzID0gbmd4LnNoYXJlZC5ybF9jb3VudGVycyBvciBydWxlcwoKbG9jYWwgaG9zdCA9IG5neC52YXIuaG9zdAppZiBub3QgaG9zdCB0aGVuIHJldHVybiBlbmQKCmxvY2FsIHJhdyA9IHJ1bGVzOmdldChob3N0KQppZiBub3QgcmF3IHRoZW4gcmV0dXJuIGVuZCAgICAgICAgICAtLSBmYXN0IHBhdGg6IG5vdGhpbmcgY29uZmlndXJlZCBmb3IgdGhpcyBob3N0Cgpsb2NhbCBsaWIgPSByZXF1aXJlICJvcGVuc2hpcC5ydWxlc19saWIiCmxvY2FsIGVudHJpZXMgPSBsaWIuZ2V0KGhvc3QsIHJhdykKbG9jYWwgbiA9ICNlbnRyaWVzCmlmIG4gPT0gMCB0aGVuIHJldHVybiBlbmQKCi0tIOKUgOKUgCBMb25nZXN0IG1hdGNoaW5nIHBhdGhQcmVmaXggd2lucyDilIDilIAKbG9jYWwgdXJpID0gbmd4LnZhci51cmkgb3IgIi8iCmxvY2FsIGNob3NlbiwgY2hvc2VuX2xlbiA9IG5pbCwgLTEKZm9yIGkgPSAxLCBuIGRvCiAgICBsb2NhbCBlID0gZW50cmllc1tpXQogICAgbG9jYWwgcCA9IGUucGF0aFByZWZpeAogICAgaWYgcCA9PSBuaWwgb3IgcCA9PSAiIiBvciBwID09ICIvIiB0aGVuCiAgICAgICAgaWYgY2hvc2VuX2xlbiA8IDAgdGhlbiBjaG9zZW4sIGNob3Nlbl9sZW4gPSBlLCAwIGVuZAogICAgZWxzZWlmIHVyaSA9PSBwIG9yIHN0cmluZy5zdWIodXJpLCAxLCAjcCkgPT0gcCB0aGVuCiAgICAgICAgaWYgI3AgPiBjaG9zZW5fbGVuIHRoZW4gY2hvc2VuLCBjaG9zZW5fbGVuID0gZSwgI3AgZW5kCiAgICBlbmQKZW5kCmlmIG5vdCBjaG9zZW4gdGhlbiByZXR1cm4gZW5kCgpsb2NhbCBzcGVjID0gY2hvc2VuLnNwZWMKbG9jYWwgZGVueV9zdGF0dXMgPSBzcGVjLmJsb2NrU3RhdHVzIG9yIDQwMwoKbG9jYWwgaXBzID0gbmd4LnZhci5yZW1vdGVfYWRkciBvciAiMC4wLjAuMCIKbG9jYWwgaXBpID0gbGliLmlwdjRfdG9faW50KGlwcykKCi0tIENvdW50cnkgcmVzb2x2ZWQgYXQgbW9zdCBvbmNlIHBlciByZXF1ZXN0IChvbmx5IHdoZW4gYSBjb3VudHJ5IHJ1bGUgZXhpc3RzKS4KbG9jYWwgY291bnRyeV9jYWNoZQpsb2NhbCBmdW5jdGlvbiBjb3VudHJ5X29mKCkKICAgIGlmIGNvdW50cnlfY2FjaGUgPT0gbmlsIHRoZW4KICAgICAgICBsb2NhbCBvaywgZ2VvID0gcGNhbGwocmVxdWlyZSwgIm9wZW5zaGlwLmdlb19jb3VudHJ5IikKICAgICAgICBjb3VudHJ5X2NhY2hlID0gKG9rIGFuZCBnZW8gYW5kIGdlby5nZXRfY291bnRyeV9jb2RlKGlwcykpIG9yIGZhbHNlCiAgICBlbmQKICAgIHJldHVybiBjb3VudHJ5X2NhY2hlIG9yIG5pbAplbmQKCi0tIOKUgOKUgCAxLiBBY2Nlc3M6IG1ldGhvZCBhbGxvdy1saXN0LCBJUCBhbGxvdy9kZW55LCBjb3VudHJ5IGFsbG93LWxpc3Qg4pSA4pSACmxvY2FsIGFjY2VzcyA9IHNwZWMuYWNjZXNzCmlmIGFjY2VzcyB0aGVuCiAgICBpZiBhY2Nlc3MubWV0aG9kcyBhbmQgbm90IGFjY2Vzcy5tZXRob2RzW25neC5yZXEuZ2V0X21ldGhvZCgpXSB0aGVuCiAgICAgICAgcmV0dXJuIG5neC5leGl0KGRlbnlfc3RhdHVzKQogICAgZW5kCiAgICBpZiBsaWIubWF0Y2hfY29tcGlsZWQoYWNjZXNzLmRlbnksIGlwaSwgaXBzKSB0aGVuIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykgZW5kCiAgICBpZiBhY2Nlc3MuYWxsb3cgYW5kIG5vdCBsaWIubWF0Y2hfY29tcGlsZWQoYWNjZXNzLmFsbG93LCBpcGksIGlwcykgdGhlbgogICAgICAgIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykKICAgIGVuZAogICAgLS0gQWxsb3ctbGlzdDogYW4gdW5yZXNvbHZlZCBjb3VudHJ5IGlzIG5vdCBvbiB0aGUgbGlzdCDihpIgYmxvY2tlZCAoZGVmYXVsdC1kZW55KS4KICAgIGlmIGFjY2Vzcy5hbGxvd0NvdW50cmllcyBhbmQgbm90IGFjY2Vzcy5hbGxvd0NvdW50cmllc1tjb3VudHJ5X29mKCkgb3IgIiJdIHRoZW4KICAgICAgICByZXR1cm4gbmd4LmV4aXQoZGVueV9zdGF0dXMpCiAgICBlbmQKZW5kCgotLSDilIDilIAgMi4gQmFuOiBJUC9DSURSLCBjb3VudHJ5LCB1c2VyLWFnZW50IOKUgOKUgApsb2NhbCBiYW4gPSBzcGVjLmJhbgppZiBiYW4gdGhlbgogICAgaWYgbGliLm1hdGNoX2NvbXBpbGVkKGJhbi5pcHMsIGlwaSwgaXBzKSBvciBsaWIubWF0Y2hfY29tcGlsZWQoYmFuLmNpZHJzLCBpcGksIGlwcykgdGhlbgogICAgICAgIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykKICAgIGVuZAogICAgaWYgYmFuLmNvdW50cmllcyB0aGVuCiAgICAgICAgbG9jYWwgY2MgPSBjb3VudHJ5X29mKCkKICAgICAgICAtLSBGYWlsIENMT1NFRCAobWF0Y2hlcyB0aGUgYWxsb3ctbGlzdCBhYm92ZSk6IGlmIGdlbyBpcyB1bmF2YWlsYWJsZSB3ZQogICAgICAgIC0tIGNhbm5vdCBwcm92ZSB0aGUgY2xpZW50IGlzIE5PVCBmcm9tIGEgYmFubmVkIGNvdW50cnksIHNvIGJsb2NrIHJhdGhlcgogICAgICAgIC0tIHRoYW4gc2lsZW50bHkgbGV0dGluZyBiYW5uZWQgdHJhZmZpYyB0aHJvdWdoLiBBIGJsb2NrZWQgaG9zdCBpcyBhIGxvdWQKICAgICAgICAtLSBzaWduYWwgdG8gZml4IGdlbzsgZmFpbC1vcGVuIHdvdWxkIGJlIGEgc2lsZW50IHNlY3VyaXR5IGhvbGUuCiAgICAgICAgaWYgbm90IGNjIHRoZW4KICAgICAgICAgICAgbmd4LmxvZyhuZ3guV0FSTiwgInJ1bGVzX2d1YXJkOiBjb3VudHJ5IGJhbiBhY3RpdmUgYnV0IGdlbyB1bmF2YWlsYWJsZSDigJQgYmxvY2tpbmcgKGZhaWwtY2xvc2VkKSIpCiAgICAgICAgICAgIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykKICAgICAgICBlbmQKICAgICAgICBpZiBiYW4uY291bnRyaWVzW2NjXSB0aGVuIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykgZW5kCiAgICBlbmQKICAgIGlmIGJhbi5lbXB0eVVBIG9yIGJhbi51YXMgdGhlbgogICAgICAgIGxvY2FsIHVhID0gbmd4LnZhci5odHRwX3VzZXJfYWdlbnQKICAgICAgICBpZiBiYW4uZW1wdHlVQSBhbmQgKHVhID09IG5pbCBvciB1YSA9PSAiIikgdGhlbiByZXR1cm4gbmd4LmV4aXQoZGVueV9zdGF0dXMpIGVuZAogICAgICAgIGlmIGJhbi51YXMgYW5kIHVhIGFuZCB1YSB+PSAiIiB0aGVuCiAgICAgICAgICAgIGxvY2FsIHVhbCA9IHN0cmluZy5sb3dlcih1YSkKICAgICAgICAgICAgZm9yIGkgPSAxLCAjYmFuLnVhcyBkbwogICAgICAgICAgICAgICAgaWYgc3RyaW5nLmZpbmQodWFsLCBiYW4udWFzW2ldLCAxLCB0cnVlKSB0aGVuIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykgZW5kCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgZW5kCmVuZAoKLS0g4pSA4pSAIDMuIEhvdGxpbms6IG9ubHkgbGlzdGVkIHJlZmVyZXIgaG9zdHMgKGVtcHR5IHJlZmVyZXIgcGVyIGFsbG93RW1wdHkpIOKUgOKUgApsb2NhbCBob3QgPSBzcGVjLmhvdGxpbmsKaWYgaG90IHRoZW4KICAgIGxvY2FsIHJlZiA9IG5neC52YXIuaHR0cF9yZWZlcmVyCiAgICBpZiByZWYgPT0gbmlsIG9yIHJlZiA9PSAiIiB0aGVuCiAgICAgICAgaWYgbm90IGhvdC5hbGxvd0VtcHR5IHRoZW4gcmV0dXJuIG5neC5leGl0KGRlbnlfc3RhdHVzKSBlbmQKICAgIGVsc2UKICAgICAgICBsb2NhbCByaG9zdCA9IHN0cmluZy5tYXRjaChyZWYsICJeJXcrOi8vKFteL10rKSIpICAgICAgICAgIC0tIGF1dGhvcml0eQogICAgICAgIGlmIHJob3N0IHRoZW4gcmhvc3QgPSBzdHJpbmcubG93ZXIoc3RyaW5nLm1hdGNoKHJob3N0LCAiXihbXjpdKykiKSBvciByaG9zdCkgZW5kIC0tIHN0cmlwIDpwb3J0CiAgICAgICAgaWYgbm90IChyaG9zdCBhbmQgaG90LnJlZmVyZXJzW3Job3N0XSkgdGhlbiByZXR1cm4gbmd4LmV4aXQoZGVueV9zdGF0dXMpIGVuZAogICAgZW5kCmVuZAoKLS0g4pSA4pSAIDQuIFJhdGUgbGltaXQg4oCUIGZpeGVkIDFzIHdpbmRvdyBwZXIgKGhvc3QsIHBhdGgsIGlwKSDilIDilIAKbG9jYWwgcmwgPSBzcGVjLnJsCmlmIHJsIHRoZW4KICAgIGxvY2FsIGtleSA9ICJybDoiIC4uIGhvc3QgLi4gIjoiIC4uIChjaG9zZW4ucGF0aFByZWZpeCBvciAiLyIpIC4uICI6IiAuLiBpcHMKICAgICAgICAuLiAiOiIgLi4gbWF0aC5mbG9vcihuZ3gubm93KCkpCiAgICBsb2NhbCBjID0gY291bnRlcnM6aW5jcihrZXksIDEsIDAsIDIpICAtLSBpbml0IDAsIDJzIFRUTCDihpIgc2VsZi1leHBpcmluZyBidWNrZXRzCiAgICBpZiBjIGFuZCBjID4gcmwubGltaXQgdGhlbgogICAgICAgIG5neC5oZWFkZXJbIlJldHJ5LUFmdGVyIl0gPSAiMSIKICAgICAgICByZXR1cm4gbmd4LmV4aXQocmwuc3RhdHVzKQogICAgZW5kCmVuZAo=",
22
- "rules_lib.lua": "LS0gcnVsZXNfbGliLmx1YQotLSBQZXItd29ya2VyIGhlbHBlcnMgKyBwYXJzZWQtcnVsZSBjYWNoZSBmb3IgcnVsZXNfZ3VhcmQubHVhIChhY2Nlc3MgcGhhc2UpLgotLSBMb2FkZWQgT05DRSBwZXIgd29ya2VyIHZpYSByZXF1aXJlKCJvcGVuc2hpcC5ydWxlc19saWIiKS4gVGhlIGFjY2VzcyBmaWxlIGlzCi0tIHJlLWV4ZWN1dGVkIG9uIGV2ZXJ5IHJlcXVlc3QsIHNvIGFsbCBwYXJzaW5nL2NvbXBpbGluZy9tYXRjaGluZyBsaXZlcyBoZXJlIHRvCi0tIGF2b2lkIHJlLWNyZWF0aW5nIGNsb3N1cmVzIGFuZCByZS1kZWNvZGluZyBKU09OIG9uIHRoZSBob3QgcGF0aC4KLS0KLS0gU2hhcmVkLWRpY3QgdmFsdWUgYHJ1bGVzW2hvc3RdYCA9IEpTT04gYXJyYXkgb2YgeyBwYXRoUHJlZml4LCBzcGVjIH0gd2hlcmUKLS0gc3BlYyBtYXRjaGVzIEByZXBvL2NvcmUgUm91dGVSdWxlU3BlYy4gcGFyc2UoKSBkZWNvZGVzICsgcHJlY29tcGlsZXMgQ0lEUnMgdG8KLS0gaW50ZWdlcnMsIGxvd2VyY2FzZXMgVUEvcmVmZXJlciBuZWVkbGVzLCBhbmQgYnVpbGRzIE8oMSkgc2V0cyBmb3IKLS0gY291bnRyaWVzL21ldGhvZHMgT05DRTsgdGhlIGNvbXBpbGVkIHJlc3VsdCBpcyBMUlUtY2FjaGVkIHBlciBob3N0IGFuZCByZXVzZWQKLS0gdW50aWwgdGhlIHJhdyBzdHJpbmcgY2hhbmdlcyAocnVsZSBlZGl0cyBhcmUgcmFyZSwgcmVxdWVzdHMgYXJlIGhvdCkuCi0tCi0tIFNFQ1VSSVRZOiBub3RoaW5nIGhlcmUgdHVybnMgYSBydWxlIHZhbHVlIGludG8gTHVhIGNvZGUgb3IgYSBMdWEgcGF0dGVybi4KLS0gU3RyaW5ncyBhcmUgY29tcGFyZWQgd2l0aCBgPT1gL3NldC1sb29rdXBzOyB1c2VyLWFnZW50IG1hdGNoaW5nIGlzCi0tIHN0cmluZy5maW5kKGhheSwgbmVlZGxlLCAxLCB0cnVlKSDigJQgUExBSU4sIG5ldmVyIGEgcmVnZXguCgpsb2NhbCBjanNvbiA9IHJlcXVpcmUgImNqc29uLnNhZmUiCmxvY2FsIGxydWNhY2hlID0gcmVxdWlyZSAicmVzdHkubHJ1Y2FjaGUiCgpsb2NhbCBNID0ge30KCmxvY2FsIGNhY2hlID0gbHJ1Y2FjaGUubmV3KDEwMjQpIC0tIGNvbXBpbGVkIHJ1bGVzLCBwZXIgd29ya2VyLCB+MTAyNCBob3N0cwoKLS0g4pSA4pSAIElQdjQgaGVscGVycyDilIDilIAKbG9jYWwgZnVuY3Rpb24gaXB2NF90b19pbnQocykKICAgIGxvY2FsIGEsIGIsIGMsIGQgPSBzdHJpbmcubWF0Y2gocywgIl4oJWQrKSUuKCVkKyklLiglZCspJS4oJWQrKSQiKQogICAgaWYgbm90IGEgdGhlbiByZXR1cm4gbmlsIGVuZAogICAgYSwgYiwgYywgZCA9IHRvbnVtYmVyKGEpLCB0b251bWJlcihiKSwgdG9udW1iZXIoYyksIHRvbnVtYmVyKGQpCiAgICBpZiBhID4gMjU1IG9yIGIgPiAyNTUgb3IgYyA+IDI1NSBvciBkID4gMjU1IHRoZW4gcmV0dXJuIG5pbCBlbmQKICAgIHJldHVybiBhICogMTY3NzcyMTYgKyBiICogNjU1MzYgKyBjICogMjU2ICsgZAplbmQKTS5pcHY0X3RvX2ludCA9IGlwdjRfdG9faW50CgotLSBQcmVjb21waWxlIGEgQ0lEUiAvIGJhcmUtSVAgc3RyaW5nIGludG8gYSBjaGVhcCBtYXRjaCBkZXNjcmlwdG9yLgpsb2NhbCBmdW5jdGlvbiBjb21waWxlX2NpZHIocykKICAgIGxvY2FsIGJhc2UsIGJpdHMgPSBzdHJpbmcubWF0Y2gocywgIl4oW14vXSspLyglZCspJCIpCiAgICBpZiBiYXNlIHRoZW4KICAgICAgICBiaXRzID0gdG9udW1iZXIoYml0cykKICAgICAgICBsb2NhbCBiYXNlaSA9IGlwdjRfdG9faW50KGJhc2UpCiAgICAgICAgaWYgbm90IGJhc2VpIG9yIGJpdHMgPCAwIG9yIGJpdHMgPiAzMiB0aGVuIHJldHVybiB7IGV4YWN0ID0gcyB9IGVuZAogICAgICAgIGlmIGJpdHMgPT0gMCB0aGVuIHJldHVybiB7IGFsbCA9IHRydWUgfSBlbmQKICAgICAgICBsb2NhbCBkaXYgPSAyIF4gKDMyIC0gYml0cykgLS0gY29tcGFyZSB0aGUgdG9wIGBiaXRzYCBiaXRzCiAgICAgICAgcmV0dXJuIHsgbmV0ID0gbWF0aC5mbG9vcihiYXNlaSAvIGRpdiksIGRpdiA9IGRpdiB9CiAgICBlbmQKICAgIGxvY2FsIGkgPSBpcHY0X3RvX2ludChzKQogICAgaWYgaSB0aGVuIHJldHVybiB7IGlwID0gaSB9IGVuZAogICAgcmV0dXJuIHsgZXhhY3QgPSBzIH0gLS0gSVB2NiAvIHVucGFyc2VhYmxlIOKGkiBsaXRlcmFsIHN0cmluZyBjb21wYXJlCmVuZAoKbG9jYWwgZnVuY3Rpb24gY29tcGlsZV9saXN0KGxpc3QpCiAgICBpZiB0eXBlKGxpc3QpIH49ICJ0YWJsZSIgdGhlbiByZXR1cm4gbmlsIGVuZAogICAgbG9jYWwgb3V0LCBuID0ge30sIDAKICAgIGZvciBfLCBzIGluIGlwYWlycyhsaXN0KSBkbwogICAgICAgIGlmIHR5cGUocykgPT0gInN0cmluZyIgYW5kIHMgfj0gIiIgdGhlbgogICAgICAgICAgICBuID0gbiArIDEKICAgICAgICAgICAgb3V0W25dID0gY29tcGlsZV9jaWRyKHMpCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBuID4gMCBhbmQgb3V0IG9yIG5pbAplbmQKCi0tIE1hdGNoIGEgY2xpZW50IChpbnQgZm9ybSBgaXBpYCwgbWF5IGJlIG5pbCBmb3Igbm9uLUlQdjQ7IHJhdyBgaXBzYCkgYWdhaW5zdCBhCi0tIGNvbXBpbGVkIENJRFIvSVAgbGlzdC4KbG9jYWwgZnVuY3Rpb24gbWF0Y2hfY29tcGlsZWQoY29tcGlsZWQsIGlwaSwgaXBzKQogICAgaWYgbm90IGNvbXBpbGVkIHRoZW4gcmV0dXJuIGZhbHNlIGVuZAogICAgZm9yIGkgPSAxLCAjY29tcGlsZWQgZG8KICAgICAgICBsb2NhbCBjID0gY29tcGlsZWRbaV0KICAgICAgICBpZiBjLmFsbCB0aGVuCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgZWxzZWlmIGMuaXAgdGhlbgogICAgICAgICAgICBpZiBpcGkgYW5kIGlwaSA9PSBjLmlwIHRoZW4gcmV0dXJuIHRydWUgZW5kCiAgICAgICAgZWxzZWlmIGMubmV0IHRoZW4KICAgICAgICAgICAgaWYgaXBpIGFuZCBtYXRoLmZsb29yKGlwaSAvIGMuZGl2KSA9PSBjLm5ldCB0aGVuIHJldHVybiB0cnVlIGVuZAogICAgICAgIGVsc2VpZiBjLmV4YWN0ID09IGlwcyB0aGVuCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBmYWxzZQplbmQKTS5tYXRjaF9jb21waWxlZCA9IG1hdGNoX2NvbXBpbGVkCgpsb2NhbCBmdW5jdGlvbiBsb3dlcl9saXN0KGxpc3QpCiAgICBpZiB0eXBlKGxpc3QpIH49ICJ0YWJsZSIgdGhlbiByZXR1cm4gbmlsIGVuZAogICAgbG9jYWwgb3V0LCBuID0ge30sIDAKICAgIGZvciBfLCBzIGluIGlwYWlycyhsaXN0KSBkbwogICAgICAgIGlmIHR5cGUocykgPT0gInN0cmluZyIgYW5kIHMgfj0gIiIgdGhlbgogICAgICAgICAgICBuID0gbiArIDEKICAgICAgICAgICAgb3V0W25dID0gc3RyaW5nLmxvd2VyKHMpCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBuID4gMCBhbmQgb3V0IG9yIG5pbAplbmQKCi0tIEJ1aWxkIGFuIE8oMSkgbG9va3VwIHNldCBmcm9tIGEgc3RyaW5nIGxpc3QgKG9wdGlvbmFsbHkgbG93ZXJjYXNlZCkuCmxvY2FsIGZ1bmN0aW9uIHRvX3NldChsaXN0LCBsb3dlcikKICAgIGlmIHR5cGUobGlzdCkgfj0gInRhYmxlIiB0aGVuIHJldHVybiBuaWwgZW5kCiAgICBsb2NhbCBzZXQsIGFueSA9IHt9LCBmYWxzZQogICAgZm9yIF8sIHMgaW4gaXBhaXJzKGxpc3QpIGRvCiAgICAgICAgaWYgdHlwZShzKSA9PSAic3RyaW5nIiBhbmQgcyB+PSAiIiB0aGVuCiAgICAgICAgICAgIHNldFtsb3dlciBhbmQgc3RyaW5nLmxvd2VyKHMpIG9yIHNdID0gdHJ1ZQogICAgICAgICAgICBhbnkgPSB0cnVlCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBhbnkgYW5kIHNldCBvciBuaWwKZW5kCgotLSBDb21waWxlIG9uZSBSb3V0ZVJ1bGVTcGVjIGludG8gYSBmYXN0LW1hdGNoIHNoYXBlLgpsb2NhbCBmdW5jdGlvbiBjb21waWxlX3NwZWMoc3BlYykKICAgIGlmIHR5cGUoc3BlYykgfj0gInRhYmxlIiB0aGVuIHJldHVybiB7IGJsb2NrU3RhdHVzID0gNDAzIH0gZW5kCiAgICBsb2NhbCBvdXQgPSB7fQoKICAgIGxvY2FsIHJsID0gc3BlYy5yYXRlTGltaXQKICAgIGxvY2FsIHJwcyA9IHJsIGFuZCB0b251bWJlcihybC5ycHMpCiAgICBpZiBycHMgYW5kIHJwcyA+IDAgdGhlbgogICAgICAgIG91dC5ybCA9IHsKICAgICAgICAgICAgbGltaXQgPSBtYXRoLmZsb29yKHJwcykgKyBtYXRoLmZsb29yKHRvbnVtYmVyKHJsLmJ1cnN0KSBvciAwKSwKICAgICAgICAgICAgc3RhdHVzID0gdG9udW1iZXIocmwuc3RhdHVzKSBvciA0MjksCiAgICAgICAgfQogICAgZW5kCgogICAgbG9jYWwgYmFuID0gc3BlYy5iYW4KICAgIGlmIHR5cGUoYmFuKSA9PSAidGFibGUiIHRoZW4KICAgICAgICBvdXQuYmFuID0gewogICAgICAgICAgICBpcHMgPSBjb21waWxlX2xpc3QoYmFuLmlwcyksCiAgICAgICAgICAgIGNpZHJzID0gY29tcGlsZV9saXN0KGJhbi5jaWRycyksCiAgICAgICAgICAgIGNvdW50cmllcyA9IHRvX3NldChiYW4uY291bnRyaWVzKSwKICAgICAgICAgICAgdWFzID0gbG93ZXJfbGlzdChiYW4udXNlckFnZW50cyksCiAgICAgICAgICAgIGVtcHR5VUEgPSBiYW4uZW1wdHlVc2VyQWdlbnQgPT0gdHJ1ZSwKICAgICAgICB9CiAgICBlbmQKCiAgICBsb2NhbCBhY2MgPSBzcGVjLmFjY2VzcwogICAgaWYgdHlwZShhY2MpID09ICJ0YWJsZSIgdGhlbgogICAgICAgIG91dC5hY2Nlc3MgPSB7CiAgICAgICAgICAgIGFsbG93ID0gY29tcGlsZV9saXN0KGFjYy5hbGxvd0NpZHJzKSwKICAgICAgICAgICAgZGVueSA9IGNvbXBpbGVfbGlzdChhY2MuZGVueUNpZHJzKSwKICAgICAgICAgICAgYWxsb3dDb3VudHJpZXMgPSB0b19zZXQoYWNjLmFsbG93Q291bnRyaWVzKSwKICAgICAgICAgICAgbWV0aG9kcyA9IHRvX3NldChhY2MubWV0aG9kcyksCiAgICAgICAgfQogICAgZW5kCgogICAgbG9jYWwgaG90ID0gc3BlYy5ob3RsaW5rCiAgICBpZiB0eXBlKGhvdCkgPT0gInRhYmxlIiB0aGVuCiAgICAgICAgbG9jYWwgcmVmcyA9IHRvX3NldChob3QuYWxsb3dSZWZlcmVycywgdHJ1ZSkKICAgICAgICBpZiByZWZzIHRoZW4KICAgICAgICAgICAgb3V0LmhvdGxpbmsgPSB7IHJlZmVyZXJzID0gcmVmcywgYWxsb3dFbXB0eSA9IGhvdC5hbGxvd0VtcHR5IH49IGZhbHNlIH0KICAgICAgICBlbmQKICAgIGVuZAoKICAgIG91dC5ibG9ja1N0YXR1cyA9ICh0eXBlKHNwZWMuYmxvY2spID09ICJ0YWJsZSIgYW5kIHRvbnVtYmVyKHNwZWMuYmxvY2suc3RhdHVzKSkgb3IgNDAzCiAgICByZXR1cm4gb3V0CmVuZAoKbG9jYWwgZnVuY3Rpb24gcGFyc2UocmF3KQogICAgbG9jYWwgZW50cmllcyA9IGNqc29uLmRlY29kZShyYXcpCiAgICBpZiB0eXBlKGVudHJpZXMpIH49ICJ0YWJsZSIgdGhlbiByZXR1cm4ge30gZW5kCiAgICBsb2NhbCBvdXQsIG4gPSB7fSwgMAogICAgZm9yIF8sIGUgaW4gaXBhaXJzKGVudHJpZXMpIGRvCiAgICAgICAgaWYgdHlwZShlKSA9PSAidGFibGUiIHRoZW4KICAgICAgICAgICAgbiA9IG4gKyAxCiAgICAgICAgICAgIG91dFtuXSA9IHsgcGF0aFByZWZpeCA9IGUucGF0aFByZWZpeCwgc3BlYyA9IGNvbXBpbGVfc3BlYyhlLnNwZWMpIH0KICAgICAgICBlbmQKICAgIGVuZAogICAgcmV0dXJuIG91dAplbmQKCi0tIExSVS1jYWNoZWQgcGFyc2U6IHJldXNlIHRoZSBjb21waWxlZCBmb3JtIHVudGlsIHRoZSByYXcgZGljdCBzdHJpbmcgY2hhbmdlcy4KZnVuY3Rpb24gTS5nZXQoaG9zdCwgcmF3KQogICAgbG9jYWwgaGl0ID0gY2FjaGU6Z2V0KGhvc3QpCiAgICBpZiBoaXQgYW5kIGhpdC5yYXcgPT0gcmF3IHRoZW4gcmV0dXJuIGhpdC5wYXJzZWQgZW5kCiAgICBsb2NhbCBwYXJzZWQgPSBwYXJzZShyYXcpCiAgICBjYWNoZTpzZXQoaG9zdCwgeyByYXcgPSByYXcsIHBhcnNlZCA9IHBhcnNlZCB9KQogICAgcmV0dXJuIHBhcnNlZAplbmQKCnJldHVybiBNCg==",
23
- "site_logger.lua": "LS0gc2l0ZV9sb2dnZXIubHVhCi0tIE9wZW5SZXN0eSBsb2dfYnlfbHVhIC0gcnVucyBBRlRFUiB0aGUgcmVzcG9uc2UgaXMgc2VudC4KLS0gUHVyZSBzaGFyZWQtZGljdCBhbmFseXRpY3MuICBObyBSZWRpcywgbm8gdGltZXJzIGZvciBjb3VudGVycywgbm8gYmF0Y2hpbmcuCi0tIEV2ZXJ5IGluY3IoKSBpcyBhdG9taWMgYWNyb3NzIHdvcmtlcnMuCi0tCi0tIFNoYXJlZCBkaWN0IGtleSBzY2hlbWEgKGFuYWx5dGljcyB6b25lKToKLS0gICBzOntkb21haW59OntlcG9jaF9taW59OnIgICAgICAgIHJlcXVlc3QgY291bnQgICAgICAgICAgICAgICAoVFRMIDI0aCkKLS0gICBzOntkb21haW59OntlcG9jaF9taW59OmkgICAgICAgIGJhbmR3aWR0aCBpbiAgYnl0ZXMgICAgICAgICAoVFRMIDI0aCkKLS0gICBzOntkb21haW59OntlcG9jaF9taW59Om8gICAgICAgIGJhbmR3aWR0aCBvdXQgYnl0ZXMgICAgICAgICAoVFRMIDI0aCkKLS0gICBzOntkb21haW59OntlcG9jaF9taW59OnQgICAgICAgIHJlc3BvbnNlIHRpbWUgc3VtIChzZWNvbmRzKSAoVFRMIDI0aCkKLS0gICBzOntkb21haW59OntlcG9jaF9taW59OnUgICAgICAgIHVuaXF1ZSAobm9uLXN0YXRpYykgcmVxcyAgICAoVFRMIDI0aCkKLS0gICBnOntkb21haW59OntZWVlZTU1ERH06e0NDfSAgICAgIGNvdW50cnkgaGl0IGNvdW50ICAgICAgICAgICAoVFRMIDQ4aCkKLS0gICBjOntkb21haW59OntlcG9jaF9taW59OntDQ30gICAgIGNvdW50cnkgcGVyIG1pbnV0ZSAgICAgICAgICAoVFRMIDI0aCkKLS0gICB0Ontkb21haW59OnIgLyA6aSAvIDpvICAgICAgICAgIGxpZmV0aW1lIHRvdGFscyAgICAgICAgICAgICAobm8gVFRMKQotLSAgIGQ6e2RvbWFpbn0gICAgICAgICAgICAgICAgICAgICAgZG9tYWluIGluZGV4IG1hcmtlciAgICAgICAgIChubyBUVEwpCi0tCi0tIFNoYXJlZCBkaWN0IGtleSBzY2hlbWEgKHJlcXVlc3RfZGF0YSB6b25lKToKLS0gICBybG9nOntkb21haW59OnNlcSAgICAgICAgICAgICAgIG1vbm90b25pYyB3cml0ZSBwb2ludGVyCi0tICAgcmxvZzp7ZG9tYWlufTp7c2xvdH0gICAgICAgICAgICBKU09OIGVudHJ5IChyaW5nIGJ1ZikgICAgICAgKFRUTCAxaCkKLS0gICBsb2dfcGlwZTpzdWI6e2RvbWFpbn0gICAgICAgICAgIGxpdmUgc3Vic2NyaWJlciBmbGFnICAgICAgICAoVFRMIDMwcykKLS0gICBsb2dfcGlwZTpxOntkb21haW59ICAgICAgICAgICAgIGxpdmUgbG9nIHF1ZXVlIGVudHJpZXMKCmxvY2FsIGNqc29uID0gcmVxdWlyZSAiY2pzb24uc2FmZSIKCi0tIFNBRkUgTE9BRDogR2VvSVAgTW9kdWxlIChwZXItd29ya2VyLCBjYWNoZWQgYnkgcmVxdWlyZSkKbG9jYWwgZ2VvX29rLCBnZW8gPSBwY2FsbChyZXF1aXJlLCAib3BlbnNoaXAuZ2VvX2NvdW50cnkiKQppZiBub3QgZ2VvX29rIHRoZW4KICAgIGdlbyA9IG5pbAogICAgbmd4LmxvZyhuZ3guV0FSTiwgIltzaXRlX2xvZ2dlcl0gZ2VvX2NvdW50cnkgbW9kdWxlIG5vdCBhdmFpbGFibGUuIEdlb0lQIGRpc2FibGVkLiIpCmVuZAoKLS0gU0FGRSBMT0FEOiBQaXBlIG1vZHVsZSAocGVyLXdvcmtlciwgY2FjaGVkIGJ5IHJlcXVpcmUpCmxvY2FsIHBpcGVfb2ssIHBpcGVfbG9nID0gcGNhbGwocmVxdWlyZSwgIm9wZW5zaGlwLnBpcGVfbG9nIikKaWYgbm90IHBpcGVfb2sgdGhlbiBwaXBlX2xvZyA9IG5pbCBlbmQKCmxvY2FsIGFuYWx5dGljcyAgICA9IG5neC5zaGFyZWQuYW5hbHl0aWNzCmxvY2FsIHJlcXVlc3RfZGF0YSA9IG5neC5zaGFyZWQucmVxdWVzdF9kYXRhCmlmIG5vdCBhbmFseXRpY3Mgb3Igbm90IHJlcXVlc3RfZGF0YSB0aGVuIHJldHVybiBlbmQKCi0tIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKbG9jYWwgZnVuY3Rpb24gbm9ybWFsaXplKGhvc3QpCiAgICBpZiBub3QgaG9zdCB0aGVuIHJldHVybiBuaWwgZW5kCiAgICBsb2NhbCBoID0gaG9zdDpsb3dlcigpCiAgICBpZiBoOnN1YigxLCA0KSA9PSAid3d3LiIgdGhlbiBoID0gaDpzdWIoNSkgZW5kCiAgICByZXR1cm4gaAplbmQKCmxvY2FsIF9kYXkgPSB7IHN0ciA9ICIiLCB0cyA9IDAgfQpsb2NhbCBmdW5jdGlvbiB0b2RheSgpCiAgICBsb2NhbCBub3cgPSBuZ3gubm93KCkKICAgIGlmIG5vdyAtIF9kYXkudHMgPiA2MCB0aGVuCiAgICAgICAgX2RheS5zdHIgPSBvcy5kYXRlKCIhJVklbSVkIiwgbm93KQogICAgICAgIF9kYXkudHMgPSBub3cKICAgIGVuZAogICAgcmV0dXJuIF9kYXkuc3RyCmVuZAoKLS0gRmFzdCBjaGVjayBpZiBVUkkgaXMgYSBzdGF0aWMgYXNzZXQgKGZvciB1bmlxdWVfcmVxdWVzdHMgY291bnRlcikKbG9jYWwgZnVuY3Rpb24gaXNfc3RhdGljX2Fzc2V0KHUpCiAgICBsb2NhbCBsb3dlciA9IHU6bG93ZXIoKQoKICAgIC0tIFN0YXRpYyBmaWxlIGV4dGVuc2lvbnMKICAgIGlmIGxvd2VyOm1hdGNoKCIlLmpzJCIpIG9yIGxvd2VyOm1hdGNoKCIlLmNzcyQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUuanBnJCIpIG9yIGxvd2VyOm1hdGNoKCIlLmpwZWckIikgb3IKICAgICAgIGxvd2VyOm1hdGNoKCIlLnBuZyQiKSBvciBsb3dlcjptYXRjaCgiJS5naWYkIikgb3IKICAgICAgIGxvd2VyOm1hdGNoKCIlLnN2ZyQiKSBvciBsb3dlcjptYXRjaCgiJS53ZWJwJCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS5pY28kIikgb3IgbG93ZXI6bWF0Y2goIiUuYm1wJCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS53b2ZmMj8kIikgb3IgbG93ZXI6bWF0Y2goIiUudHRmJCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS5lb3QkIikgb3IgbG93ZXI6bWF0Y2goIiUub3RmJCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS5tcDQkIikgb3IgbG93ZXI6bWF0Y2goIiUud2VibSQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUubXAzJCIpIG9yIGxvd2VyOm1hdGNoKCIlLndhdiQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUucGRmJCIpIG9yIGxvd2VyOm1hdGNoKCIlLnppcCQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUudGFyJCIpIG9yIGxvd2VyOm1hdGNoKCIlLmd6JCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS54bWwkIikgb3IgbG93ZXI6bWF0Y2goIiUuanNvbiQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUudHh0JCIpIG9yIGxvd2VyOm1hdGNoKCIlLm1hcCQiKSB0aGVuCiAgICAgICAgcmV0dXJuIHRydWUKICAgIGVuZAoKICAgIC0tIENvbW1vbiBzdGF0aWMgcGF0aHMKICAgIGlmIGxvd2VyOm1hdGNoKCJeL19uZXh0L3N0YXRpYy8iKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIl4vc3RhdGljLyIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiXi9hc3NldHMvIikgb3IKICAgICAgIGxvd2VyOm1hdGNoKCJeL3B1YmxpYy8iKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIi9mYXZpY29uJS5pY28iKSB0aGVuCiAgICAgICAgcmV0dXJuIHRydWUKICAgIGVuZAoKICAgIHJldHVybiBmYWxzZQplbmQKCmxvY2FsIFJJTkcgICA9IDEwMDAKbG9jYWwgRDI0SCAgID0gODY0MDAKbG9jYWwgRDQ4SCAgID0gMTcyODAwCmxvY2FsIEQxSCAgICA9IDM2MDAKCi0tIOKUgOKUgCBDYXB0dXJlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKbG9jYWwgaG9zdCA9IG5vcm1hbGl6ZShuZ3gudmFyLmhvc3QpCmlmIG5vdCBob3N0IHRoZW4gcmV0dXJuIGVuZAoKbG9jYWwgaXAgICAgICA9IG5neC52YXIucmVtb3RlX2FkZHIgICAgb3IgIjAuMC4wLjAiCmxvY2FsIHRzICAgICAgPSBuZ3gubm93KCkKbG9jYWwgdWEgICAgICA9IG5neC52YXIuaHR0cF91c2VyX2FnZW50IG9yICIiCmxvY2FsIHVyaSAgICAgPSBuZ3gudmFyLnJlcXVlc3RfdXJpICAgIG9yICIvIgpsb2NhbCByZXFfbGVuID0gdG9udW1iZXIobmd4LnZhci5yZXF1ZXN0X2xlbmd0aCkgb3IgMApsb2NhbCBieXRlcyAgID0gdG9udW1iZXIobmd4LnZhci5ieXRlc19zZW50KSAgICAgb3IgMApsb2NhbCBydCAgICAgID0gdG9udW1iZXIobmd4LnZhci5yZXF1ZXN0X3RpbWUpICAgb3IgMCAgLS0gc2Vjb25kcyAoZmxvYXQpCmxvY2FsIG1ldGhvZCAgPSBuZ3gudmFyLnJlcXVlc3RfbWV0aG9kIG9yICJHRVQiCmxvY2FsIHN0YXR1cyAgPSBuZ3gudmFyLnN0YXR1cyAgICAgICAgIG9yICIwIgoKLS0g4pSA4pSAIDEuIE1pbnV0ZS1idWNrZXQgY291bnRlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpsb2NhbCBtaW51dGUgPSBtYXRoLmZsb29yKHRzIC8gNjApCmxvY2FsIHAgPSAiczoiIC4uIGhvc3QgLi4gIjoiIC4uIG1pbnV0ZQoKYW5hbHl0aWNzOmluY3IocCAuLiAiOnIiLCAxLCAgICAgIDAsIEQyNEgpCmFuYWx5dGljczppbmNyKHAgLi4gIjppIiwgcmVxX2xlbiwgMCwgRDI0SCkKYW5hbHl0aWNzOmluY3IocCAuLiAiOm8iLCBieXRlcywgICAwLCBEMjRIKQoKLS0gUmVzcG9uc2UgdGltZSBhcyBmbG9hdCBzZWNvbmRzIChtYXRjaGVzIG9yaWdpbmFsIHByZWNpc2lvbikKaWYgcnQgPiAwIHRoZW4KICAgIC0tIHNhZmVfYWRkIGluaXRpYWxpemVzLCBpbmNyIGFkZHMgLSBlbXVsYXRlIEhJTkNSQllGTE9BVCB3aXRoIGludGVnZXIgbWljcm9zCiAgICBsb2NhbCBydF91cyA9IG1hdGguZmxvb3IocnQgKiAxMDAwMDAwKQogICAgYW5hbHl0aWNzOmluY3IocCAuLiAiOnQiLCBydF91cywgMCwgRDI0SCkKZW5kCgotLSBVbmlxdWUgKG5vbi1zdGF0aWMpIHJlcXVlc3QgY291bnRlcgppZiBub3QgaXNfc3RhdGljX2Fzc2V0KHVyaSkgdGhlbgogICAgYW5hbHl0aWNzOmluY3IocCAuLiAiOnUiLCAxLCAwLCBEMjRIKQplbmQKCi0tIOKUgOKUgCAyLiBMaWZldGltZSB0b3RhbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgphbmFseXRpY3M6aW5jcigidDoiIC4uIGhvc3QgLi4gIjpyIiwgMSwgICAgICAgMCkKYW5hbHl0aWNzOmluY3IoInQ6IiAuLiBob3N0IC4uICI6aSIsIHJlcV9sZW4sIDApCmFuYWx5dGljczppbmNyKCJ0OiIgLi4gaG9zdCAuLiAiOm8iLCBieXRlcywgICAwKQoKLS0gRG9tYWluIGluZGV4IChzZXQgb25jZSwgaWdub3JlIHN1YnNlcXVlbnQgImV4aXN0cyIgZXJyb3JzKQphbmFseXRpY3M6c2FmZV9hZGQoImQ6IiAuLiBob3N0LCAxKQoKLS0g4pSA4pSAIDMuIEdlb0lQIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKaWYgZ2VvIHRoZW4KICAgIGxvY2FsIGNjID0gZ2VvLmdldF9jb3VudHJ5X2NvZGUoaXApCiAgICBpZiBjYyBhbmQgY2Mgfj0gIiIgdGhlbgogICAgICAgIC0tIERhaWx5IGdlbyAoZm9yIC9hbmFseXRpY3MvZ2VvIGVuZHBvaW50KQogICAgICAgIGFuYWx5dGljczppbmNyKCJnOiIgLi4gaG9zdCAuLiAiOiIgLi4gdG9kYXkoKSAuLiAiOiIgLi4gY2MsIDEsIDAsIEQ0OEgpCiAgICAgICAgLS0gUGVyLW1pbnV0ZSBnZW8gKGZvciB0aW1lLXNlcmllcyBjb3VudHJ5IGJyZWFrZG93bikKICAgICAgICBhbmFseXRpY3M6aW5jcigiYzoiIC4uIGhvc3QgLi4gIjoiIC4uIG1pbnV0ZSAuLiAiOiIgLi4gY2MsIDEsIDAsIEQyNEgpCiAgICBlbmQKZW5kCgotLSDilIDilIAgNC4gUmF3IHJlcXVlc3QgcmluZyBidWZmZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpwY2FsbChmdW5jdGlvbigpCiAgICBsb2NhbCBva19qLCBqID0gcGNhbGwoY2pzb24uZW5jb2RlLCB7CiAgICAgICAgaXAgICAgID0gaXAsCiAgICAgICAgdHMgICAgID0gdHMsCiAgICAgICAgbWV0aG9kID0gbWV0aG9kLAogICAgICAgIHN0YXR1cyA9IHN0YXR1cywKICAgICAgICB1cmkgICAgPSB1cmksCiAgICAgICAgdWEgICAgID0gdWEsCiAgICAgICAgYndfaW4gID0gcmVxX2xlbiwKICAgICAgICBid19vdXQgPSBieXRlcywKICAgICAgICBydCAgICAgPSBydCwKICAgIH0pCiAgICBpZiBva19qIGFuZCBqIHRoZW4KICAgICAgICBsb2NhbCBzZXEgID0gcmVxdWVzdF9kYXRhOmluY3IoInJsb2c6IiAuLiBob3N0IC4uICI6c2VxIiwgMSwgMCkKICAgICAgICBsb2NhbCBzbG90ID0gc2VxICUgUklORwogICAgICAgIHJlcXVlc3RfZGF0YTpzZXQoInJsb2c6IiAuLiBob3N0IC4uICI6IiAuLiBzbG90LCBqLCBEMUgpCiAgICBlbmQKZW5kKQoKLS0g4pSA4pSAIDUuIExpdmUtbG9nIHBpcGUgKG9ubHkgd2hlbiBhIHN1YnNjcmliZXIgaXMgd2F0Y2hpbmcpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAotLSBGaXJlIHZpYSB0aW1lciB0byBhdm9pZCBibG9ja2luZyB0aGUgbG9nIHBoYXNlCgppZiBwaXBlX2xvZyBhbmQgcGlwZV9sb2cucGlwZV9yZXF1ZXN0X2xvZwogICBhbmQgcmVxdWVzdF9kYXRhOmdldCgibG9nX3BpcGU6c3ViOiIgLi4gaG9zdCkgdGhlbgogICAgbmd4LnRpbWVyLmF0KDAsIHBpcGVfbG9nLnBpcGVfcmVxdWVzdF9sb2csCiAgICAgICAgICAgICAgICAgaG9zdCwgaXAsIHRzLCB1YSwgdXJpLCByZXFfbGVuLCBieXRlcywgcnQsIG1ldGhvZCwgc3RhdHVzKQplbmQK",
24
- "webhook_handler.lua": "LS0gd2ViaG9va19oYW5kbGVyLmx1YQotLSBIYW5kbGVzIGluY29taW5nIHdlYmhvb2sgZXZlbnRzIGZvcndhcmRlZCBmcm9tIHRoZSBTYWFTIGVkZ2UuCi0tIEludGVybmFsIG1hbmFnZW1lbnQgcG9ydCBvbmx5ICgxMjcuMC4wLjE6OTE0NSkuCi0tCi0tIFJvdXRlczoKLS0gICBQT1NUIC9faG9va3MvcHVzaCAgICAgICAgICAtIHJlY2VpdmUgYSBmb3J3YXJkZWQgR2l0SHViIHB1c2ggZXZlbnQKLS0gICBHRVQgIC9faG9va3MvcGVuZGluZyAgICAgICAtIGZldGNoIHN0b3JlZCBldmVudHMgKGZvciBsb2NhbCBhcHAgcG9sbGluZykKLS0gICBQT1NUIC9faG9va3MvYWNrICAgICAgICAgICAtIGFja25vd2xlZGdlIGNvbnN1bWVkIGV2ZW50cwotLQotLSBCZWhhdmlvciBvbiBQT1NUIC9faG9va3MvcHVzaDoKLS0gICAxLiBUcnkgdG8gcHJveHkgdG8gYSBsb2NhbCBPcGVuc2hpcCBBUEkgKGNvbmZpZ3VyYWJsZSB2aWEgWC1PcGVuc2hpcC1VcmwgaGVhZGVyKQotLSAgIDIuIElmIE9wZW5zaGlwIGlzIG5vdCByZWFjaGFibGUsIHN0b3JlIHRoZSBldmVudCBpbiBzaGFyZWQgZGljdCBmb3IgbGF0ZXIgcG9sbGluZwoKbG9jYWwgY2pzb24gPSByZXF1aXJlICJjanNvbi5zYWZlIgoKbG9jYWwgd2ViaG9va19ldmVudHMgPSBuZ3guc2hhcmVkLndlYmhvb2tfZXZlbnRzCmxvY2FsIHVyaSAgICAgICAgICAgID0gbmd4LnZhci51cmkKbG9jYWwgbWV0aG9kICAgICAgICAgPSBuZ3gucmVxLmdldF9tZXRob2QoKQoKbG9jYWwgZnVuY3Rpb24ganNvbl9yZXNwb25zZShkYXRhLCBjb2RlKQogICAgbmd4LnN0YXR1cyA9IGNvZGUgb3IgMjAwCiAgICBuZ3guaGVhZGVyWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIgogICAgbmd4LnNheShjanNvbi5lbmNvZGUoZGF0YSkpCiAgICByZXR1cm4gbmd4LmV4aXQobmd4LnN0YXR1cykKZW5kCgotLSDilIDilIAgUE9TVCAvX2hvb2tzL3B1c2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tIFJlY2VpdmVzIGZvcndhcmRlZCB3ZWJob29rIHBheWxvYWQgZnJvbSBTYWFTLgotLSBIZWFkZXJzOgotLSAgIFgtT3BlbnNoaXAtVXJsOiBodHRwOi8vMTI3LjAuMC4xOjM0NTYgKGlmIE9wZW5zaGlwIHJ1bnMgb24gdGhpcyBzZXJ2ZXIpCi0tICAgWC1Ib29rLUlkOiB0aGUgc3Vic2NyaXB0aW9uIGhvb2tJZCAoZm9yIGNvcnJlbGF0aW9uKQoKaWYgdXJpID09ICIvX2hvb2tzL3B1c2giIGFuZCBtZXRob2QgPT0gIlBPU1QiIHRoZW4KICAgIG5neC5yZXEucmVhZF9ib2R5KCkKICAgIGxvY2FsIGJvZHkgPSBuZ3gucmVxLmdldF9ib2R5X2RhdGEoKQogICAgaWYgbm90IGJvZHkgdGhlbgogICAgICAgIHJldHVybiBqc29uX3Jlc3BvbnNlKHsgZXJyb3IgPSAiZW1wdHkgYm9keSIgfSwgNDAwKQogICAgZW5kCgogICAgbG9jYWwgb3BlbnNoaXBfdXJsID0gbmd4LnJlcS5nZXRfaGVhZGVycygpWyJ4LW9wZW5zaGlwLXVybCJdCgogICAgLS0gSWYgT3BlbnNoaXAgcnVucyBvbiB0aGlzIHNlcnZlciwgcHJveHkgZGlyZWN0bHkKICAgIGlmIG9wZW5zaGlwX3VybCBhbmQgb3BlbnNoaXBfdXJsIH49ICIiIHRoZW4KICAgICAgICBsb2NhbCBodHRwID0gcmVxdWlyZSAicmVzdHkuaHR0cCIKICAgICAgICBsb2NhbCBodHRwYyA9IGh0dHAubmV3KCkKICAgICAgICBodHRwYzpzZXRfdGltZW91dCg1MDAwKQoKICAgICAgICBsb2NhbCB0YXJnZXQgPSBvcGVuc2hpcF91cmwgLi4gIi9hcGkvd2ViaG9va3MvcHVzaCIKICAgICAgICBsb2NhbCByZXMsIGVyciA9IGh0dHBjOnJlcXVlc3RfdXJpKHRhcmdldCwgewogICAgICAgICAgICBtZXRob2QgID0gIlBPU1QiLAogICAgICAgICAgICBib2R5ICAgID0gYm9keSwKICAgICAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgICAgIFsiQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgICAgICAgICBbIlgtSG9vay1JZCJdICAgID0gbmd4LnJlcS5nZXRfaGVhZGVycygpWyJ4LWhvb2staWQiXSBvciAiIiwKICAgICAgICAgICAgfSwKICAgICAgICB9KQoKICAgICAgICBpZiByZXMgYW5kIHJlcy5zdGF0dXMgPCA1MDAgdGhlbgogICAgICAgICAgICAtLSBPcGVuc2hpcCBoYW5kbGVkIGl0ICgyeHggb3IgNHh4KQogICAgICAgICAgICByZXR1cm4ganNvbl9yZXNwb25zZSh7IG9rID0gdHJ1ZSwgcHJveGllZCA9IHRydWUsIHN0YXR1cyA9IHJlcy5zdGF0dXMgfSkKICAgICAgICBlbmQKCiAgICAgICAgLS0gT3BlbnNoaXAgdW5yZWFjaGFibGUgb3IgZXJyb3JlZCAtIGZhbGwgdGhyb3VnaCB0byBzdG9yZQogICAgZW5kCgogICAgLS0gU3RvcmUgZm9yIGxhdGVyIHBvbGxpbmcgYnkgbG9jYWwvZGVza3RvcCBhcHAKICAgIGxvY2FsIGV2ZW50X2lkID0gbmd4Lm5vdygpIC4uICI6IiAuLiBtYXRoLnJhbmRvbSgxMDAwMDAsIDk5OTk5OSkKICAgIGxvY2FsIGV2ZW50ID0gY2pzb24uZW5jb2RlKHsKICAgICAgICBpZCAgICAgICA9IGV2ZW50X2lkLAogICAgICAgIGhvb2tfaWQgID0gbmd4LnJlcS5nZXRfaGVhZGVycygpWyJ4LWhvb2staWQiXSBvciAiIiwKICAgICAgICBwYXlsb2FkICA9IGJvZHksCiAgICAgICAgcmVjZWl2ZWQgPSBuZ3gubm93KCksCiAgICB9KQoKICAgIC0tIFVzZSBhIHNsb3QtYmFzZWQgcmluZyBidWZmZXIgKG1heCAyMDAgZXZlbnRzKQogICAgbG9jYWwgbWF4X2V2ZW50cyA9IDIwMAogICAgbG9jYWwgaWR4ID0gd2ViaG9va19ldmVudHM6aW5jcigiX2lkeCIsIDEsIDApIG9yIDAKICAgIGxvY2FsIHNsb3QgPSAoaWR4ICUgbWF4X2V2ZW50cykKICAgIHdlYmhvb2tfZXZlbnRzOnNldCgiZXZ0OiIgLi4gc2xvdCwgZXZlbnQsIDM2MDApIC0tIDFoIFRUTAogICAgd2ViaG9va19ldmVudHM6c2V0KCJfY291bnQiLCBtYXRoLm1pbihpZHgsIG1heF9ldmVudHMpKQoKICAgIHJldHVybiBqc29uX3Jlc3BvbnNlKHsgb2sgPSB0cnVlLCBzdG9yZWQgPSB0cnVlLCBldmVudF9pZCA9IGV2ZW50X2lkIH0pCmVuZAoKLS0g4pSA4pSAIEdFVCAvX2hvb2tzL3BlbmRpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tIFJldHVybnMgc3RvcmVkIHdlYmhvb2sgZXZlbnRzIGZvciBsb2NhbCBhcHAgdG8gY29uc3VtZS4KCmlmIHVyaSA9PSAiL19ob29rcy9wZW5kaW5nIiBhbmQgbWV0aG9kID09ICJHRVQiIHRoZW4KICAgIGlmIG5vdCB3ZWJob29rX2V2ZW50cyB0aGVuCiAgICAgICAgcmV0dXJuIGpzb25fcmVzcG9uc2UoeyBldmVudHMgPSB7fSB9KQogICAgZW5kCgogICAgbG9jYWwgY291bnQgPSB3ZWJob29rX2V2ZW50czpnZXQoIl9jb3VudCIpIG9yIDAKICAgIGxvY2FsIGlkeCAgID0gd2ViaG9va19ldmVudHM6Z2V0KCJfaWR4Iikgb3IgMAogICAgbG9jYWwgZXZlbnRzID0ge30KCiAgICAtLSBSZWFkIGFsbCBzdG9yZWQgZXZlbnRzIChuZXdlc3QgZmlyc3QpCiAgICBsb2NhbCBtYXhfZXZlbnRzID0gMjAwCiAgICBsb2NhbCBzdGFydCA9IG1hdGgubWF4KDAsIGlkeCAtIGNvdW50KQogICAgZm9yIGkgPSBzdGFydCwgaWR4IC0gMSBkbwogICAgICAgIGxvY2FsIHNsb3QgPSBpICUgbWF4X2V2ZW50cwogICAgICAgIGxvY2FsIHJhdyA9IHdlYmhvb2tfZXZlbnRzOmdldCgiZXZ0OiIgLi4gc2xvdCkKICAgICAgICBpZiByYXcgdGhlbgogICAgICAgICAgICBsb2NhbCBwYXJzZWQgPSBjanNvbi5kZWNvZGUocmF3KQogICAgICAgICAgICBpZiBwYXJzZWQgdGhlbgogICAgICAgICAgICAgICAgZXZlbnRzWyNldmVudHMgKyAxXSA9IHBhcnNlZAogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgIGVuZAoKICAgIHJldHVybiBqc29uX3Jlc3BvbnNlKHsgZXZlbnRzID0gZXZlbnRzIH0pCmVuZAoKLS0g4pSA4pSAIFBPU1QgL19ob29rcy9hY2sg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tIEFja25vd2xlZGdlIGV2ZW50cyBoYXZlIGJlZW4gY29uc3VtZWQgLSBjbGVhcnMgdGhlIHN0b3JlLgoKaWYgdXJpID09ICIvX2hvb2tzL2FjayIgYW5kIG1ldGhvZCA9PSAiUE9TVCIgdGhlbgogICAgaWYgd2ViaG9va19ldmVudHMgdGhlbgogICAgICAgIHdlYmhvb2tfZXZlbnRzOmZsdXNoX2FsbCgpCiAgICAgICAgd2ViaG9va19ldmVudHM6Zmx1c2hfZXhwaXJlZCgpCiAgICBlbmQKICAgIHJldHVybiBqc29uX3Jlc3BvbnNlKHsgb2sgPSB0cnVlIH0pCmVuZAoKLS0g4pSA4pSAIEZhbGxiYWNrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApyZXR1cm4ganNvbl9yZXNwb25zZSh7IGVycm9yID0gIm5vdCBmb3VuZCIgfSwgNDA0KQo="
25
- };
26
-
27
- // ../../packages/adapters/src/infra/openresty-lua.ts
28
- var OPENRESTY_LUA_DIR = "/usr/local/openresty/site/lualib/openship";
29
- var LUA_LOGGER_PATH = `${OPENRESTY_LUA_DIR}/site_logger.lua`;
30
- var RULES_GUARD_PATH = `${OPENRESTY_LUA_DIR}/rules_guard.lua`;
31
- var OPENRESTY_MGMT_PORT = 9145;
32
- var OPENRESTY_DEFAULT_PATHS = {
33
- bin: "/usr/local/openresty/bin/openresty",
34
- confPath: "/usr/local/openresty/nginx/conf/nginx.conf",
35
- confDir: "/usr/local/openresty/nginx/conf",
36
- sitesDir: "/usr/local/openresty/nginx/conf/sites-enabled",
37
- pidPath: "/usr/local/openresty/nginx/logs/nginx.pid"
38
- };
39
- var EDGE_HOST_STATE_DIR = "/var/lib/openship/edge";
40
- var EDGE_CONTAINER_MOUNTS = [
41
- { host: `${EDGE_HOST_STATE_DIR}/sites-enabled`, container: OPENRESTY_DEFAULT_PATHS.sitesDir },
42
- { host: "/etc/letsencrypt", container: "/etc/letsencrypt" },
43
- { host: `${EDGE_HOST_STATE_DIR}/acme`, container: "/var/www/acme" },
44
- { host: "/opt/openship/static", container: "/opt/openship/static" }
45
- ];
46
- var EDGE_HOST_PATHS = {
47
- bin: OPENRESTY_DEFAULT_PATHS.bin,
48
- confPath: OPENRESTY_DEFAULT_PATHS.confPath,
49
- confDir: OPENRESTY_DEFAULT_PATHS.confDir,
50
- sitesDir: `${EDGE_HOST_STATE_DIR}/sites-enabled`,
51
- pidPath: OPENRESTY_DEFAULT_PATHS.pidPath
52
- };
53
- var KNOWN_CONF_PATHS = [
54
- "/usr/local/openresty/nginx/conf/nginx.conf",
55
- "/etc/openresty/nginx.conf",
56
- "/etc/nginx/nginx.conf"
57
- ];
58
- async function detectOpenRestyPaths(executor) {
59
- const raw = await executor.exec("openresty -V 2>&1 || true");
60
- const parseFlag = (flag) => {
61
- const m = raw.match(new RegExp(`--${flag}=([^\\s]+)`));
62
- return m ? m[1] : null;
63
- };
64
- const bin = parseFlag("sbin-path") ?? OPENRESTY_DEFAULT_PATHS.bin;
65
- let confPath = parseFlag("conf-path") ?? OPENRESTY_DEFAULT_PATHS.confPath;
66
- const pidPath = parseFlag("pid-path") ?? OPENRESTY_DEFAULT_PATHS.pidPath;
67
- if (!await executor.exists(confPath)) {
68
- let found = false;
69
- for (const candidate of KNOWN_CONF_PATHS) {
70
- if (candidate !== confPath && await executor.exists(candidate)) {
71
- confPath = candidate;
72
- found = true;
73
- break;
74
- }
75
- }
76
- if (!found) {
77
- }
78
- }
79
- const confDir = confPath.replace(/\/[^/]+$/, "");
80
- return {
81
- bin,
82
- confPath,
83
- confDir,
84
- sitesDir: `${confDir}/sites-enabled`,
85
- pidPath
86
- };
87
- }
88
- function buildReloadCommand(paths, opts = {}) {
89
- if (opts.containerEdge) {
90
- return `${paths.bin} -t 2>&1 || exit 1
91
- ${paths.bin} -s reload 2>&1 || exit 1`;
92
- }
93
- return `${paths.bin} -t 2>&1 || exit 1
94
-
95
- reload_err=$(${paths.bin} -s reload 2>&1) && exit 0
96
-
97
- if [ "$(cat /proc/1/comm 2>/dev/null)" = "openresty" ] || [ "$(cat /proc/1/comm 2>/dev/null)" = "nginx" ]; then
98
- echo "openresty reload failed and openresty is PID 1 (containerized edge) \u2014 not killing it; the container supervisor owns restarts." >&2
99
- echo "$reload_err" >&2
100
- exit 1
101
- fi
102
-
103
- if [ -f ${paths.pidPath} ] && kill -0 "$(cat ${paths.pidPath} 2>/dev/null)" 2>/dev/null; then
104
- echo "openresty (pid $(cat ${paths.pidPath})) is running but refused -s reload" >&2
105
- exit 1
106
- fi
107
-
108
- rm -f ${paths.pidPath}
109
- ${paths.bin}`;
110
- }
111
- async function ensureOpenRestyConfig(executor, paths) {
112
- await executor.mkdir(paths.sitesDir);
113
- await executor.mkdir("/var/www/acme");
114
- const pidDir = paths.pidPath.replace(/\/[^/]+$/, "");
115
- await executor.mkdir(pidDir);
116
- await executor.writeFile(`${paths.sitesDir}/_management.conf`, MANAGEMENT_BLOCK);
117
- await executor.writeFile(`${paths.sitesDir}/_default.conf`, DEFAULT_BLOCK);
118
- if (!await executor.exists(paths.confPath)) {
119
- await executor.mkdir(paths.confDir);
120
- await executor.writeFile(
121
- paths.confPath,
122
- MINIMAL_NGINX_CONF(paths.confDir, paths.sitesDir)
123
- );
124
- return;
125
- }
126
- const hasCorrectInclude = await executor.exec(`grep -qF 'include ${paths.sitesDir}/' ${paths.confPath}`).then(() => true).catch(() => false);
127
- if (!hasCorrectInclude) {
128
- const hasWrongInclude = await executor.exec(`grep -q 'include.*sites-enabled' ${paths.confPath}`).then(() => true).catch(() => false);
129
- if (hasWrongInclude) {
130
- await executor.exec(
131
- `sed -i 's|include.*/sites-enabled/\\*\\.conf;|include ${paths.sitesDir}/*.conf;|' ${paths.confPath}`
132
- );
133
- } else {
134
- await executor.exec(
135
- `sed -i '/http *{/a \\ include ${paths.sitesDir}/*.conf;' ${paths.confPath}`
136
- );
137
- }
138
- }
139
- }
140
- function MINIMAL_NGINX_CONF(confDir, sitesDir) {
141
- return `# Auto-generated by Openship - safe to extend
142
- worker_processes auto;
143
- events {
144
- worker_connections 1024;
145
- }
146
- http {
147
- include ${confDir}/mime.types;
148
- default_type application/octet-stream;
149
- sendfile on;
150
- keepalive_timeout 65;
151
- # See apps/edge/nginx.conf: the 64-byte default fails \`nginx -t\` outright
152
- # ("could not build server_names_hash") for any server_name past ~63 chars,
153
- # which refuses the reload and wedges every route on the box, not just the
154
- # long one. Keep this in step with the containerized edge's value.
155
- server_names_hash_bucket_size 128;
156
- include ${sitesDir}/*.conf;
157
- }
158
- `;
159
- }
160
- var GEOIP_DIR = "/usr/share/GeoIP";
161
- var GEOIP_DB_PATH = `${GEOIP_DIR}/GeoLite2-Country.mmdb`;
162
- var GEOIP_DB_URL = "https://github.com/P3TERX/GeoLite.mmdb/releases/latest/download/GeoLite2-Country.mmdb";
163
- var LUA_SRC_DIR = process.env.OPENSHIP_LUA_DIR?.trim() || join(dirname(fileURLToPath(import.meta.url)), "lua");
164
- var VHOST_REFERENCED_LUA = ["rules_guard.lua", "rules_lib.lua", "site_logger.lua"];
165
- function luaSourceAvailable() {
166
- return VHOST_REFERENCED_LUA.every(
167
- (f) => EMBEDDED_LUA[f] !== void 0 || existsSync(join(LUA_SRC_DIR, f))
168
- );
169
- }
170
- function readLua(filename) {
171
- const onDisk = join(LUA_SRC_DIR, filename);
172
- if (existsSync(onDisk)) return readFileSync(onDisk, "utf-8");
173
- const embedded = EMBEDDED_LUA[filename];
174
- if (embedded !== void 0) return Buffer.from(embedded, "base64").toString("utf-8");
175
- throw new Error(
176
- `Lua script "${filename}" not found on disk (${LUA_SRC_DIR}) or in EMBEDDED_LUA \u2014 add it to packages/adapters/src/infra/lua/ and run \`bun run embed:lua\`.`
177
- );
178
- }
179
- var MANAGEMENT_BLOCK = `# Openship internal management - analytics & live-log streaming
180
- # Auto-generated - do not edit manually
181
- server {
182
- listen 127.0.0.1:${OPENRESTY_MGMT_PORT};
183
-
184
- # Long-running Lua content handlers need generous timeouts
185
- send_timeout 3600s;
186
- keepalive_timeout 3600s;
187
- lua_check_client_abort on;
188
-
189
- # SSE live-log stream (long-lived connection)
190
- location = /logs/stream {
191
- content_by_lua_file ${OPENRESTY_LUA_DIR}/pipe_stream.lua;
192
- }
193
-
194
- # REST analytics + health (short-lived)
195
- location / {
196
- content_by_lua_file ${OPENRESTY_LUA_DIR}/mgmt_api.lua;
197
- }
198
- }
199
- `;
200
- var ACME_HTTP01_PORT = 49180;
201
- var ACME_CHALLENGE_LOCATION = ` location /.well-known/acme-challenge/ {
202
- proxy_pass http://127.0.0.1:${ACME_HTTP01_PORT};
203
- proxy_set_header Host $host;
204
- }`;
205
- var DEFAULT_BLOCK = `# Openship default catch-all - prevents the stock OpenResty welcome page AND
206
- # stops an unmatched Host/SNI from being served the first real vhost by default.
207
- # Auto-generated - do not edit manually
208
- server {
209
- listen 80 default_server;
210
- server_name _;
211
-
212
- ${ACME_CHALLENGE_LOCATION}
213
-
214
- location / {
215
- return 404;
216
- }
217
- }
218
-
219
- # HTTPS catch-all. WITHOUT a 443 default_server, nginx serves the first-loaded
220
- # 443 vhost to any request whose SNI matches no server_name - so a domain we do
221
- # NOT route (removed / never-added / just pointed at this IP) silently gets some
222
- # other app's cert + backend. That is cross-serving, a security hole. Owning the
223
- # 443 default and rejecting unknown SNI closes it: an unrouted host gets a TLS
224
- # handshake failure, never a fallthrough. ssl_reject_handshake (OpenResty/nginx
225
- # >= 1.19.4; our installer pulls the newest LTS) needs no certificate.
226
- server {
227
- listen 443 ssl default_server;
228
- ssl_reject_handshake on;
229
- }
230
- `;
231
- var LUA_SCRIPTS = [
232
- "site_logger.lua",
233
- "pipe_log.lua",
234
- "pipe_stream.lua",
235
- "mgmt_api.lua",
236
- "geo_country.lua",
237
- "rules_lib.lua",
238
- "rules_guard.lua"
239
- ];
240
- var LUA_VERSION_MARKER = `${OPENRESTY_LUA_DIR}/.openship-lua-version`;
241
- function luaBundleHash() {
242
- const h = createHash("sha256");
243
- for (const name of LUA_SCRIPTS) {
244
- h.update(name);
245
- h.update("\0");
246
- h.update(readLua(name));
247
- h.update("\0");
248
- }
249
- return h.digest("hex");
250
- }
251
- async function ensureLuaScripts(executor, paths) {
252
- try {
253
- if (!luaSourceAvailable()) {
254
- console.error(
255
- "[openresty] Lua unavailable in this build (not on disk or embedded) \u2014 edge rules/logging disabled. Run `bun run embed:lua` in packages/adapters."
256
- );
257
- return { repaired: [], available: false };
258
- }
259
- const expected = luaBundleHash();
260
- await executor.mkdir(OPENRESTY_LUA_DIR);
261
- const listing = await executor.exec(`ls -1 '${OPENRESTY_LUA_DIR}' 2>/dev/null || true`).catch(() => "");
262
- const present = new Set(listing.split("\n").map((s) => s.trim()).filter(Boolean));
263
- const missing = LUA_SCRIPTS.filter((name) => !present.has(name));
264
- const onBoxVersion = (await executor.readFile(LUA_VERSION_MARKER).catch(() => "")).trim();
265
- if (missing.length === 0 && onBoxVersion === expected) {
266
- return { repaired: [], available: true };
267
- }
268
- for (const name of LUA_SCRIPTS) {
269
- await executor.writeFile(`${OPENRESTY_LUA_DIR}/${name}`, readLua(name));
270
- }
271
- await executor.writeFile(LUA_VERSION_MARKER, expected);
272
- const reason = missing.length ? `missing: ${missing.join(", ")}` : "version changed";
273
- console.warn(`[openresty] (re)installed Lua (${reason}) \u2014 reloading edge.`);
274
- await executor.exec(buildReloadCommand(paths)).catch((err) => {
275
- console.error(`[openresty] reload after Lua (re)install failed: ${safeErrorMessage(err)}`);
276
- });
277
- return { repaired: missing.length ? missing : [...LUA_SCRIPTS], available: true };
278
- } catch (err) {
279
- console.error(`[openresty] ensureLuaScripts failed (deploy continues): ${safeErrorMessage(err)}`);
280
- return { repaired: [], available: false };
281
- }
282
- }
283
- async function installGeoDeps(executor) {
284
- try {
285
- const hasPkg = async (cmd) => {
286
- try {
287
- await executor.exec(`command -v ${cmd}`);
288
- return true;
289
- } catch {
290
- return false;
291
- }
292
- };
293
- if (await hasPkg("apt-get")) {
294
- await executor.exec(
295
- "apt-get update -qq && apt-get install -y -qq libmaxminddb0 libmaxminddb-dev"
296
- );
297
- } else if (await hasPkg("dnf")) {
298
- await executor.exec("dnf install -y libmaxminddb libmaxminddb-devel");
299
- } else if (await hasPkg("yum")) {
300
- await executor.exec("yum install -y libmaxminddb libmaxminddb-devel");
301
- }
302
- } catch {
303
- }
304
- try {
305
- await executor.exec(
306
- "opm get anjia0532/lua-resty-maxminddb"
307
- );
308
- } catch {
309
- try {
310
- await executor.exec(
311
- "/usr/local/openresty/bin/opm get anjia0532/lua-resty-maxminddb"
312
- );
313
- } catch {
314
- }
315
- }
316
- try {
317
- const exists = await executor.exists(GEOIP_DB_PATH);
318
- if (!exists) {
319
- await executor.mkdir(GEOIP_DIR);
320
- await executor.exec(
321
- `curl -fsSL -o ${GEOIP_DB_PATH} "${GEOIP_DB_URL}"`
322
- );
323
- }
324
- } catch {
325
- }
326
- }
327
- async function deployLuaScripts(executor, paths) {
328
- await installGeoDeps(executor);
329
- if (!luaSourceAvailable()) {
330
- throw new Error(
331
- `OpenResty Lua is unavailable in this build \u2014 not on disk (LUA_SRC_DIR=${LUA_SRC_DIR}) and not in EMBEDDED_LUA. The edge scripts (rules_guard.lua/site_logger.lua) can't be installed. Run \`bun run embed:lua\` in packages/adapters to regenerate lua-embedded.ts.`
332
- );
333
- }
334
- await executor.mkdir(OPENRESTY_LUA_DIR);
335
- for (const name of LUA_SCRIPTS) {
336
- await executor.writeFile(
337
- `${OPENRESTY_LUA_DIR}/${name}`,
338
- readLua(name)
339
- );
340
- }
341
- await ensureOpenRestyConfig(executor, paths);
342
- await executor.exec(
343
- `grep -q 'lua_shared_dict analytics ' ${paths.confPath} || sed -i '/http *{/a \\ lua_shared_dict analytics 256m;' ${paths.confPath}`
344
- );
345
- await executor.exec(
346
- `grep -q 'lua_shared_dict request_data ' ${paths.confPath} || sed -i '/http *{/a \\ lua_shared_dict request_data 128m;' ${paths.confPath}`
347
- );
348
- await executor.exec(
349
- `grep -q 'lua_shared_dict rules ' ${paths.confPath} || sed -i '/http *{/a \\ lua_shared_dict rules 32m;' ${paths.confPath}`
350
- );
351
- await executor.exec(
352
- `grep -q 'lua_shared_dict rl_counters ' ${paths.confPath} || sed -i '/http *{/a \\ lua_shared_dict rl_counters 16m;' ${paths.confPath}`
353
- );
354
- await executor.exec(
355
- `grep -q 'lua_package_path' ${paths.confPath} || sed -i '/http *{/a \\ lua_package_path "/usr/local/openresty/site/lualib/?.lua;;";' ${paths.confPath}`
356
- );
357
- await executor.exec(buildReloadCommand(paths));
358
- }
359
-
360
- export {
361
- OPENRESTY_LUA_DIR,
362
- LUA_LOGGER_PATH,
363
- RULES_GUARD_PATH,
364
- OPENRESTY_MGMT_PORT,
365
- OPENRESTY_DEFAULT_PATHS,
366
- EDGE_HOST_STATE_DIR,
367
- EDGE_CONTAINER_MOUNTS,
368
- EDGE_HOST_PATHS,
369
- detectOpenRestyPaths,
370
- buildReloadCommand,
371
- ensureOpenRestyConfig,
372
- luaSourceAvailable,
373
- ACME_HTTP01_PORT,
374
- ACME_CHALLENGE_LOCATION,
375
- ensureLuaScripts,
376
- deployLuaScripts
377
- };
@@ -1,30 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- CloudRuntime,
7
- PAGE_CONTAINER_PREFIX,
8
- provisionCloudWorkspace
9
- } from "./chunk-JLKKYUZA.js";
10
- import "./chunk-NXFIRK2Z.js";
11
- import "./chunk-V7BZMGOT.js";
12
- import "./chunk-KNTJ7PSF.js";
13
- import "./chunk-KZOBYJUW.js";
14
- import "./chunk-I6PSTQIR.js";
15
- import "./chunk-K2RPVGPN.js";
16
- import "./chunk-ZCOQJCZO.js";
17
- import "./chunk-RPHRPFEH.js";
18
- import "./chunk-TYVME3XD.js";
19
- import "./chunk-RB35YN3J.js";
20
- import "./chunk-FPRHYBY2.js";
21
- import "./chunk-6PIYRG5I.js";
22
- import "./chunk-ILFETZOM.js";
23
- import "./chunk-EAAGSQXN.js";
24
- import "./chunk-UMQP7SYT.js";
25
- import "./chunk-KI2EY3WB.js";
26
- export {
27
- CloudRuntime,
28
- PAGE_CONTAINER_PREFIX,
29
- provisionCloudWorkspace
30
- };
@@ -1,18 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- DockerRuntime,
7
- ownsBuiltImage
8
- } from "./chunk-CUJXGK7R.js";
9
- import "./chunk-V7BZMGOT.js";
10
- import "./chunk-I6PSTQIR.js";
11
- import "./chunk-ZCOQJCZO.js";
12
- import "./chunk-RPHRPFEH.js";
13
- import "./chunk-UMQP7SYT.js";
14
- import "./chunk-KI2EY3WB.js";
15
- export {
16
- DockerRuntime,
17
- ownsBuiltImage
18
- };
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- DockerEdgeExecutor
7
- } from "./chunk-6LKHXB6T.js";
8
- import "./chunk-TYVME3XD.js";
9
- import "./chunk-FPRHYBY2.js";
10
- import "./chunk-KI2EY3WB.js";
11
- export {
12
- DockerEdgeExecutor
13
- };
@@ -1,47 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- importMigratedSites,
7
- waitForApiHealth,
8
- waitForEdgeRunning
9
- } from "./chunk-BS2AXYZX.js";
10
- import "./chunk-FRNAR33O.js";
11
- import "./chunk-EI575GHN.js";
12
- import "./chunk-6APIPIJY.js";
13
- import "./chunk-IXCHURVK.js";
14
- import "./chunk-OWED2GRM.js";
15
- import "./chunk-VWPEKOH6.js";
16
- import "./chunk-W73X43R7.js";
17
- import "./chunk-6LKHXB6T.js";
18
- import "./chunk-JLKKYUZA.js";
19
- import "./chunk-AVIB7CT7.js";
20
- import "./chunk-5MZ624VX.js";
21
- import "./chunk-Q2CIRAOK.js";
22
- import "./chunk-NNPEG6HM.js";
23
- import "./chunk-NXFIRK2Z.js";
24
- import "./chunk-O6ZZF52V.js";
25
- import "./chunk-JYGD5WSN.js";
26
- import "./chunk-CUJXGK7R.js";
27
- import "./chunk-V7BZMGOT.js";
28
- import "./chunk-YWMODKWL.js";
29
- import "./chunk-KNTJ7PSF.js";
30
- import "./chunk-KZOBYJUW.js";
31
- import "./chunk-I6PSTQIR.js";
32
- import "./chunk-K2RPVGPN.js";
33
- import "./chunk-ZCOQJCZO.js";
34
- import "./chunk-RPHRPFEH.js";
35
- import "./chunk-TYVME3XD.js";
36
- import "./chunk-RB35YN3J.js";
37
- import "./chunk-FPRHYBY2.js";
38
- import "./chunk-6PIYRG5I.js";
39
- import "./chunk-ILFETZOM.js";
40
- import "./chunk-EAAGSQXN.js";
41
- import "./chunk-UMQP7SYT.js";
42
- import "./chunk-KI2EY3WB.js";
43
- export {
44
- importMigratedSites,
45
- waitForApiHealth,
46
- waitForEdgeRunning
47
- };
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- buildEdgeRunCommand,
7
- containerEdgeProvider,
8
- dockerAvailable,
9
- ensureContainerEdge,
10
- localContainerEdgeProvider,
11
- resolveEdgeImage,
12
- setDefaultEdgeImage
13
- } from "./chunk-NXFIRK2Z.js";
14
- import "./chunk-KZOBYJUW.js";
15
- import "./chunk-RPHRPFEH.js";
16
- import "./chunk-RB35YN3J.js";
17
- import "./chunk-FPRHYBY2.js";
18
- import "./chunk-6PIYRG5I.js";
19
- import "./chunk-ILFETZOM.js";
20
- import "./chunk-EAAGSQXN.js";
21
- import "./chunk-UMQP7SYT.js";
22
- import "./chunk-KI2EY3WB.js";
23
- export {
24
- buildEdgeRunCommand,
25
- containerEdgeProvider,
26
- dockerAvailable,
27
- ensureContainerEdge,
28
- localContainerEdgeProvider,
29
- resolveEdgeImage,
30
- setDefaultEdgeImage
31
- };
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- MANAGED_STATIC_BASE,
7
- NginxProvider,
8
- renderGeoEntries,
9
- renderProxyOptions,
10
- summarizeCertbotFailure
11
- } from "./chunk-RB35YN3J.js";
12
- import "./chunk-FPRHYBY2.js";
13
- import "./chunk-6PIYRG5I.js";
14
- import "./chunk-ILFETZOM.js";
15
- import "./chunk-EAAGSQXN.js";
16
- import "./chunk-UMQP7SYT.js";
17
- import "./chunk-KI2EY3WB.js";
18
- export {
19
- MANAGED_STATIC_BASE,
20
- NginxProvider,
21
- renderGeoEntries,
22
- renderProxyOptions,
23
- summarizeCertbotFailure
24
- };