openship 0.3.0 → 0.4.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 (82) hide show
  1. package/README.md +104 -61
  2. package/dist/bare-ITM45QBX.js +18 -0
  3. package/dist/bowser-MFQA6OS4.js +2821 -0
  4. package/dist/chunk-3U4SPZD5.js +241 -0
  5. package/dist/chunk-46YJFP4S.js +1771 -0
  6. package/dist/chunk-4CQWT2WL.js +116 -0
  7. package/dist/chunk-4FABQGQP.js +23 -0
  8. package/dist/chunk-4LEL3H2Z.js +84 -0
  9. package/dist/chunk-4MG3BVHE.js +326 -0
  10. package/dist/chunk-4VNS5WPM.js +42 -0
  11. package/dist/chunk-5N7VUGL6.js +2094 -0
  12. package/dist/chunk-5ZCKQ2MI.js +1360 -0
  13. package/dist/chunk-6ERIMTBC.js +1412 -0
  14. package/dist/chunk-7UOB5GGQ.js +132 -0
  15. package/dist/chunk-BUBSSKO6.js +1384 -0
  16. package/dist/chunk-E6W2JMMU.js +341 -0
  17. package/dist/chunk-E77LJWJK.js +1535 -0
  18. package/dist/chunk-F4DFVG6Q.js +573 -0
  19. package/dist/chunk-HFYDYK4D.js +1092 -0
  20. package/dist/chunk-JR2OCMJA.js +46 -0
  21. package/dist/chunk-JUJBBF5U.js +746 -0
  22. package/dist/chunk-JZLNHGLW.js +19145 -0
  23. package/dist/chunk-KD7VO4LG.js +2617 -0
  24. package/dist/chunk-LBFH7THC.js +435 -0
  25. package/dist/chunk-NB2VEIWG.js +129 -0
  26. package/dist/chunk-OJE6YWPQ.js +2866 -0
  27. package/dist/chunk-QKFRZNKN.js +4941 -0
  28. package/dist/chunk-RBZPFTHV.js +13354 -0
  29. package/dist/chunk-S6DSRLNE.js +121 -0
  30. package/dist/chunk-TEYJYSMT.js +409 -0
  31. package/dist/chunk-U2DPZSXA.js +112 -0
  32. package/dist/chunk-WJPCBU7Z.js +3147 -0
  33. package/dist/chunk-XIFRMKYT.js +13 -0
  34. package/dist/chunk-XVSAUO2I.js +7946 -0
  35. package/dist/chunk-Y37KHU7L.js +31 -0
  36. package/dist/chunk-YL67EWYZ.js +416 -0
  37. package/dist/chunk-ZKJOFWBJ.js +1879 -0
  38. package/dist/cloud-JMPHO3CW.js +7 -0
  39. package/dist/cloud-W5G6YXAY.js +24 -0
  40. package/dist/dist-L3MPOWCA.js +65 -0
  41. package/dist/dist-es-4C322O5D.js +22 -0
  42. package/dist/dist-es-GTAMF674.js +87 -0
  43. package/dist/dist-es-KE56MWYO.js +169 -0
  44. package/dist/dist-es-NRZIQY5B.js +484 -0
  45. package/dist/dist-es-WZCR7DHQ.js +317 -0
  46. package/dist/dist-es-XQCOTGC7.js +376 -0
  47. package/dist/dist-es-ZW3HFQUM.js +69 -0
  48. package/dist/docker-3FVJMFC3.js +12 -0
  49. package/dist/docker-edge-executor-ZIWAZWPL.js +9 -0
  50. package/dist/edge-import-53M5DGWZ.js +39 -0
  51. package/dist/event-streams-7LGDL56D.js +42 -0
  52. package/dist/executor-J7BHW5HF.js +26 -0
  53. package/dist/index.js +2450 -3484
  54. package/dist/loadSso-N273C5I7.js +577 -0
  55. package/dist/nginx-YZWKYKQU.js +16 -0
  56. package/dist/noop-RRNCIUI5.js +7 -0
  57. package/dist/openresty-lua-HAO4EUDY.js +32 -0
  58. package/dist/server/index.js +230533 -217891
  59. package/dist/server/migrations/0057_complete_prism.sql +18 -0
  60. package/dist/server/migrations/0058_add_server_is_local.sql +1 -0
  61. package/dist/server/migrations/0059_legal_fixer.sql +18 -0
  62. package/dist/server/migrations/0060_add_route_strategy_host_port.sql +3 -0
  63. package/dist/server/migrations/0061_notification_default_multi_kind.sql +3 -0
  64. package/dist/server/migrations/0062_add_incoming_webhook.sql +21 -0
  65. package/dist/server/migrations/0063_add_migration_logs.sql +1 -0
  66. package/dist/server/migrations/0064_add_migration_partial.sql +2 -0
  67. package/dist/server/migrations/0065_custom_app_template.sql +14 -0
  68. package/dist/server/migrations/0066_ensure_migration_partial_columns.sql +2 -0
  69. package/dist/server/migrations/0067_webhook_delivery.sql +28 -0
  70. package/dist/server/migrations/0068_add_migration_target_volumes.sql +1 -0
  71. package/dist/server/migrations/0069_add_project_composite_routes.sql +1 -0
  72. package/dist/server/migrations/0070_forward_git_to_server.sql +1 -0
  73. package/dist/server/migrations/meta/0057_snapshot.json +9326 -0
  74. package/dist/server/migrations/meta/0058_snapshot.json +9333 -0
  75. package/dist/server/migrations/meta/0059_snapshot.json +9495 -0
  76. package/dist/server/migrations/meta/0060_snapshot.json +9515 -0
  77. package/dist/server/migrations/meta/_journal.json +99 -1
  78. package/dist/setup-5X3WEEHA.js +14 -0
  79. package/dist/signin-DR462ERO.js +663 -0
  80. package/dist/sso-oidc-VBZLJUK5.js +830 -0
  81. package/dist/sts-EJLZ4Z77.js +1422 -0
  82. package/package.json +6 -2
@@ -0,0 +1,341 @@
1
+ import {
2
+ safeErrorMessage
3
+ } from "./chunk-JZLNHGLW.js";
4
+
5
+ // ../../packages/adapters/src/infra/openresty-lua.ts
6
+ import { createHash } from "crypto";
7
+ import { existsSync, readFileSync } from "fs";
8
+ import { dirname, join } from "path";
9
+ import { fileURLToPath } from "url";
10
+
11
+ // ../../packages/adapters/src/infra/lua-embedded.ts
12
+ var EMBEDDED_LUA = {
13
+ "geo_country.lua": "LS0gZ2VvX2NvdW50cnkubHVhCi0tIE1heE1pbmQgR2VvTGl0ZTItQ291bnRyeSBsb29rdXAgd2l0aCBwZXItd29ya2VyIExSVSBjYWNoZS4KLS0KLS0gREIgYW5kIGNhY2hlIGFyZSBwZXItd29ya2VyIG9ubHk6IG9uZSBsb2FkIHBlciB3b3JrZXIsIHNoYXJlZCBieSBhbGwKLS0gcmVxdWVzdHMuIE5vIHJlbG9hZCBwZXIgc3RyZWFtIG9yIHBlciByZXF1ZXN0LgotLQotLSBEZXBlbmRlbmNpZXMgKGluc3RhbGxlZCBieSBkZXBsb3lMdWFTY3JpcHRzKToKLS0gICBvcG06IGFuamlhMDUzMi9sdWEtcmVzdHktbWF4bWluZGRiCi0tICAgYXB0OiBsaWJtYXhtaW5kZGIwIGxpYm1heG1pbmRkYi1kZXYgIChDIGxpYnJhcnkgZm9yIEZGSSkKLS0gICBEYXRhYmFzZTogL3Vzci9zaGFyZS9HZW9JUC9HZW9MaXRlMi1Db3VudHJ5Lm1tZGIKLS0KLS0gRmFsbHMgYmFjayBncmFjZWZ1bGx5IC0gaWYgdGhlIGxpYnJhcnkgb3IgZGF0YWJhc2UgaXMgbWlzc2luZywKLS0gZ2V0X2NvdW50cnlfY29kZSgpIHJldHVybnMgbmlsLiAgQm90aCBzaXRlX2xvZ2dlci5sdWEgYW5kIHBpcGVfbG9nLmx1YQotLSB3cmFwIHRoaXMgbW9kdWxlIGluIHBjYWxsKHJlcXVpcmUsIC4uLikgc28gYSBtaXNzaW5nIERCIG5ldmVyIGNyYXNoZXMKLS0gdGhlIHJlcXVlc3QgcGlwZWxpbmUuCgpsb2NhbCBfTSA9IHt9Cgpsb2NhbCBEQl9QQVRIID0gIi91c3Ivc2hhcmUvR2VvSVAvR2VvTGl0ZTItQ291bnRyeS5tbWRiIgoKbG9jYWwgbW1kYl9vaywgbWF4bWluZCA9IHBjYWxsKHJlcXVpcmUsICJyZXN0eS5tYXhtaW5kZGIiKQpsb2NhbCBscnVjYWNoZV9vaywgbHJ1Y2FjaGUgPSBwY2FsbChyZXF1aXJlLCAicmVzdHkubHJ1Y2FjaGUiKQoKbG9jYWwgY2FjaGUgICAgICAgICAgICAtLSBvbmUgTFJVIHBlciB3b3JrZXIKbG9jYWwgZ2VvX2luaXR0ZWQgPSBmYWxzZSAgLS0gREIgb3BlbmVkIG9uY2UgcGVyIHdvcmtlciBvbiBmaXJzdCBsb29rdXAKCi0tIEluaXQgTWF4TWluZCBvbmNlIHBlciB3b3JrZXI7IHN1YnNlcXVlbnQgbG9va3VwcyAoYW55IHN0cmVhbSkgcmV1c2UuCmxvY2FsIGZ1bmN0aW9uIGVuc3VyZV9nZW9faW5pdCgpCiAgICBpZiBnZW9faW5pdHRlZCB0aGVuCiAgICAgICAgcmV0dXJuIHRydWUKICAgIGVuZAogICAgaWYgbm90IG1tZGJfb2sgb3Igbm90IG1heG1pbmQgdGhlbgogICAgICAgIHJldHVybiBmYWxzZQogICAgZW5kCiAgICBsb2NhbCBvaywgZXJyID0gbWF4bWluZC5pbml0KERCX1BBVEgpCiAgICBpZiBub3Qgb2sgdGhlbgogICAgICAgIG5neC5sb2cobmd4LldBUk4sCiAgICAgICAgICAgICJbZ2VvX2NvdW50cnldIEdlb0xpdGUyIGRhdGFiYXNlIG5vdCBmb3VuZCBhdCAiIC4uIERCX1BBVEggLi4KICAgICAgICAgICAgIiAtIGdlbyBsb29rdXBzIGRpc2FibGVkOiAiIC4uIChlcnIgb3IgInVua25vd24iKSkKICAgICAgICByZXR1cm4gZmFsc2UKICAgIGVuZAogICAgZ2VvX2luaXR0ZWQgPSB0cnVlCiAgICBuZ3gubG9nKG5neC5JTkZPLCAiW2dlb19jb3VudHJ5XSBHZW9MaXRlMi1Db3VudHJ5IGxvYWRlZCBmcm9tICIgLi4gREJfUEFUSCkKICAgIHJldHVybiB0cnVlCmVuZAoKLS0gQ3JlYXRlIExSVSBjYWNoZSBvbmNlIHBlciB3b3JrZXIgKG1heCA1MDAwMCBJUHMpLgpsb2NhbCBmdW5jdGlvbiBnZXRfY2FjaGUoKQogICAgaWYgY2FjaGUgdGhlbgogICAgICAgIHJldHVybiBjYWNoZQogICAgZW5kCiAgICBpZiBub3QgbHJ1Y2FjaGVfb2sgb3Igbm90IGxydWNhY2hlIHRoZW4KICAgICAgICByZXR1cm4gbmlsCiAgICBlbmQKICAgIGxvY2FsIGMsIGVyciA9IGxydWNhY2hlLm5ldyg1MDAwMCkKICAgIGlmIG5vdCBjIHRoZW4KICAgICAgICByZXR1cm4gbmlsCiAgICBlbmQKICAgIGNhY2hlID0gYwogICAgcmV0dXJuIGNhY2hlCmVuZAoKLS0tIEdldCBjb3VudHJ5IElTTyBjb2RlIGZvciBJUC4gVXNlcyBpbi1tZW1vcnkgTFJVIGNhY2hlIHRoZW4gTWF4TWluZCBEQi4KLS0gQHBhcmFtIGlwIHN0cmluZyAoZS5nLiAiOC44LjguOCIpCi0tIEByZXR1cm4gc3RyaW5nfG5pbCBjb3VudHJ5IGNvZGUgKGUuZy4gIlVTIikgb3IgbmlsCmZ1bmN0aW9uIF9NLmdldF9jb3VudHJ5X2NvZGUoaXApCiAgICBpZiBub3QgaXAgb3IgaXAgPT0gIiIgdGhlbgogICAgICAgIHJldHVybiBuaWwKICAgIGVuZAoKICAgIGxvY2FsIGMgPSBnZXRfY2FjaGUoKQogICAgaWYgYyB0aGVuCiAgICAgICAgbG9jYWwgY2FjaGVkID0gYzpnZXQoaXApCiAgICAgICAgaWYgY2FjaGVkIH49IG5pbCB0aGVuCiAgICAgICAgICAgIC0tIGZhbHNlIG1lYW5zICJsb29rZWQgdXAsIG5vIHJlc3VsdCIgLSBhdm9pZHMgcmVwZWF0ZWQgREIgbWlzc2VzCiAgICAgICAgICAgIHJldHVybiAoY2FjaGVkID09IGZhbHNlKSBhbmQgbmlsIG9yIGNhY2hlZAogICAgICAgIGVuZAogICAgZW5kCgogICAgaWYgbm90IGVuc3VyZV9nZW9faW5pdCgpIHRoZW4KICAgICAgICBpZiBjIHRoZW4gYzpzZXQoaXAsIGZhbHNlKSBlbmQKICAgICAgICByZXR1cm4gbmlsCiAgICBlbmQKCiAgICBsb2NhbCBvaywgcmVzLCBlcnIgPSBwY2FsbChtYXhtaW5kLmxvb2t1cCwgaXApCiAgICBsb2NhbCBjb2RlID0gbmlsCiAgICBpZiBvayBhbmQgcmVzIGFuZCByZXMuY291bnRyeSBhbmQgcmVzLmNvdW50cnkuaXNvX2NvZGUgdGhlbgogICAgICAgIGNvZGUgPSByZXMuY291bnRyeS5pc29fY29kZQogICAgZW5kCgogICAgaWYgYyB0aGVuCiAgICAgICAgYzpzZXQoaXAsIGNvZGUgb3IgZmFsc2UpCiAgICBlbmQKICAgIHJldHVybiBjb2RlCmVuZAoKZnVuY3Rpb24gX00uZW5zdXJlX2dlb19pbml0KCkKICAgIHJldHVybiBlbnN1cmVfZ2VvX2luaXQoKQplbmQKCnJldHVybiBfTQo=",
14
+ "mgmt_api.lua": "LS0gbWdtdF9hcGkubHVhCi0tIFJFU1QgYW5hbHl0aWNzIGVuZHBvaW50cyBiYWNrZWQgYnkgbmd4LnNoYXJlZC5kaWN0LgotLSBJbnRlcm5hbCBtYW5hZ2VtZW50IHBvcnQgb25seSAoMTI3LjAuMC4xOjkxNDUpLgoKbG9jYWwgY2pzb24gPSByZXF1aXJlICJjanNvbi5zYWZlIgoKbG9jYWwgYW5hbHl0aWNzICAgID0gbmd4LnNoYXJlZC5hbmFseXRpY3MKbG9jYWwgcmVxdWVzdF9kYXRhID0gbmd4LnNoYXJlZC5yZXF1ZXN0X2RhdGEKbG9jYWwgdXJpICAgICAgICAgID0gbmd4LnZhci51cmkKCmxvY2FsIGZ1bmN0aW9uIGpzb24oZGF0YSwgY29kZSkKICAgIG5neC5zdGF0dXMgPSBjb2RlIG9yIDIwMAogICAgbmd4LmhlYWRlclsiQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24vanNvbiIKICAgIG5neC5zYXkoY2pzb24uZW5jb2RlKGRhdGEpKQogICAgcmV0dXJuIG5neC5leGl0KG5neC5zdGF0dXMpCmVuZAoKbG9jYWwgZnVuY3Rpb24gYmFkKG1zZykKICAgIHJldHVybiBqc29uKHsgZXJyb3IgPSBtc2cgfSwgNDAwKQplbmQKCi0tIOKUgOKUgCBHRVQgL2hlYWx0aCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmlmIHVyaSA9PSAiL2hlYWx0aCIgdGhlbgogICAgbmd4LnNheSgib2siKQogICAgcmV0dXJuIG5neC5leGl0KDIwMCkKZW5kCgotLSDilIDilIAgL3J1bGVzIC0gcGVyLXJvdXRlIHJ1bGVzIGNhY2hlICh3cml0dGVuIGJ5IHRoZSBBUEksIHJlYWQgYnkgcnVsZXNfZ3VhcmQpIOKUgOKUgAotLSBQT1NUIC9ydWxlcyAgYm9keTogeyAiaG9zdCI6ICIuLi4iLCAicnVsZXMiOiBbIHsgInBhdGhQcmVmaXgiOiAiLyIsICJzcGVjIjogey4uLn0gfSBdIH0KLS0gICDihpIgcmVwbGFjZXMgdGhlIHJ1bGVzZXQgZm9yIHRoYXQgaG9zdCBpbiB0aGUgYHJ1bGVzYCBzaGFyZWQgZGljdCAocmVsb2FkLWZyZWUpLgotLSAgIEFuIGVtcHR5L2Fic2VudCBgcnVsZXNgIGFycmF5IGNsZWFycyB0aGUgaG9zdC4KLS0gR0VUICAvcnVsZXM/aG9zdD0uLi4gICDihpIgdGhlIHN0b3JlZCBydWxlc2V0IChkZWJ1ZykuCi0tIERFTEVURSAvcnVsZXM/aG9zdD0uLi4g4oaSIGNsZWFyIHRoZSBob3N0J3MgcnVsZXNldC4KLS0gSGFuZGxlZCBCRUZPUkUgdGhlIGFuYWx5dGljcyBndWFyZDogcnVsZXMgdXNlIHRoZWlyIG93biBkaWN0LgppZiB1cmkgPT0gIi9ydWxlcyIgdGhlbgogICAgbG9jYWwgcnVsZXMgPSBuZ3guc2hhcmVkLnJ1bGVzCiAgICBpZiBub3QgcnVsZXMgdGhlbiByZXR1cm4ganNvbih7IGVycm9yID0gInJ1bGVzIGRpY3QgdW5hdmFpbGFibGUiIH0sIDUwMykgZW5kCiAgICBsb2NhbCBtZXRob2QgPSBuZ3gucmVxLmdldF9tZXRob2QoKQoKICAgIGlmIG1ldGhvZCA9PSAiR0VUIiB0aGVuCiAgICAgICAgbG9jYWwgaG9zdCA9IG5neC52YXIuYXJnX2hvc3QKICAgICAgICBpZiBub3QgaG9zdCBvciBob3N0ID09ICIiIHRoZW4gcmV0dXJuIGJhZCgibWlzc2luZyA/aG9zdD0iKSBlbmQKICAgICAgICBob3N0ID0gaG9zdDpsb3dlcigpCiAgICAgICAgbG9jYWwgcmF3ID0gcnVsZXM6Z2V0KGhvc3QpCiAgICAgICAgcmV0dXJuIGpzb24oeyBob3N0ID0gaG9zdCwgcnVsZXMgPSByYXcgYW5kIGNqc29uLmRlY29kZShyYXcpIG9yIHt9IH0pCiAgICBlbmQKCiAgICBpZiBtZXRob2QgPT0gIkRFTEVURSIgdGhlbgogICAgICAgIGxvY2FsIGhvc3QgPSBuZ3gudmFyLmFyZ19ob3N0CiAgICAgICAgaWYgbm90IGhvc3Qgb3IgaG9zdCA9PSAiIiB0aGVuIHJldHVybiBiYWQoIm1pc3NpbmcgP2hvc3Q9IikgZW5kCiAgICAgICAgcnVsZXM6ZGVsZXRlKGhvc3Q6bG93ZXIoKSkKICAgICAgICByZXR1cm4ganNvbih7IG9rID0gdHJ1ZSB9KQogICAgZW5kCgogICAgaWYgbWV0aG9kID09ICJQT1NUIiB0aGVuCiAgICAgICAgbmd4LnJlcS5yZWFkX2JvZHkoKQogICAgICAgIGxvY2FsIGJvZHkgPSBuZ3gucmVxLmdldF9ib2R5X2RhdGEoKQogICAgICAgIGlmIG5vdCBib2R5IHRoZW4gcmV0dXJuIGJhZCgiZW1wdHkgYm9keSIpIGVuZAogICAgICAgIGxvY2FsIHBheWxvYWQgPSBjanNvbi5kZWNvZGUoYm9keSkKICAgICAgICBpZiB0eXBlKHBheWxvYWQpIH49ICJ0YWJsZSIgb3Igbm90IHBheWxvYWQuaG9zdCB0aGVuCiAgICAgICAgICAgIHJldHVybiBiYWQoImV4cGVjdGVkIHsgaG9zdCwgcnVsZXM6IFsuLi5dIH0iKQogICAgICAgIGVuZAogICAgICAgIGxvY2FsIGhvc3QgPSB0b3N0cmluZyhwYXlsb2FkLmhvc3QpOmxvd2VyKCkKICAgICAgICBsb2NhbCBsaXN0ID0gcGF5bG9hZC5ydWxlcwogICAgICAgIGlmIHR5cGUobGlzdCkgfj0gInRhYmxlIiBvciAjbGlzdCA9PSAwIHRoZW4KICAgICAgICAgICAgcnVsZXM6ZGVsZXRlKGhvc3QpICAgICAgICAgICAgICAgICAtLSBlbXB0eSBzZXQgPSBjbGVhciB0aGUgaG9zdAogICAgICAgICAgICByZXR1cm4ganNvbih7IG9rID0gdHJ1ZSwgaG9zdCA9IGhvc3QsIGNvdW50ID0gMCB9KQogICAgICAgIGVuZAogICAgICAgIGxvY2FsIG9rLCBlcnIgPSBydWxlczpzZXQoaG9zdCwgY2pzb24uZW5jb2RlKGxpc3QpKQogICAgICAgIGlmIG5vdCBvayB0aGVuIHJldHVybiBqc29uKHsgZXJyb3IgPSAic2V0IGZhaWxlZDogIiAuLiAoZXJyIG9yICI/IikgfSwgNTAwKSBlbmQKICAgICAgICByZXR1cm4ganNvbih7IG9rID0gdHJ1ZSwgaG9zdCA9IGhvc3QsIGNvdW50ID0gI2xpc3QgfSkKICAgIGVuZAoKICAgIHJldHVybiBqc29uKHsgZXJyb3IgPSAibWV0aG9kIG5vdCBhbGxvd2VkIiB9LCA0MDUpCmVuZAoKaWYgbm90IGFuYWx5dGljcyB0aGVuCiAgICByZXR1cm4ganNvbih7IGVycm9yID0gImFuYWx5dGljcyBkaWN0IHVuYXZhaWxhYmxlIiB9LCA1MDMpCmVuZAoKLS0g4pSA4pSAIEdFVCAvYW5hbHl0aWNzIC0gbWludXRlLWJ1Y2tldCB0aW1lIHNlcmllcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLS0gP2RvbWFpbj1leGFtcGxlLmNvbSZmcm9tPUVQT0NIX01JTiZ0bz1FUE9DSF9NSU4KCmlmIHVyaSA9PSAiL2FuYWx5dGljcyIgdGhlbgogICAgbG9jYWwgZG9tYWluID0gbmd4LnZhci5hcmdfZG9tYWluCiAgICBpZiBub3QgZG9tYWluIG9yIGRvbWFpbiA9PSAiIiB0aGVuIHJldHVybiBiYWQoIm1pc3NpbmcgP2RvbWFpbj0iKSBlbmQKICAgIGRvbWFpbiA9IGRvbWFpbjpsb3dlcigpCgogICAgbG9jYWwgZnJvbV9tID0gdG9udW1iZXIobmd4LnZhci5hcmdfZnJvbSkKICAgIGxvY2FsIHRvX20gICA9IHRvbnVtYmVyKG5neC52YXIuYXJnX3RvKQogICAgaWYgbm90IGZyb21fbSBvciBub3QgdG9fbSB0aGVuCiAgICAgICAgcmV0dXJuIGJhZCgibWlzc2luZyA/ZnJvbT0gYW5kID90bz0gKGVwb2NoIG1pbnV0ZXMpIikKICAgIGVuZAogICAgLS0gQ2FwIGF0IDI0aAogICAgaWYgdG9fbSAtIGZyb21fbSA+IDE0NDAgdGhlbiB0b19tID0gZnJvbV9tICsgMTQ0MCBlbmQKCiAgICBsb2NhbCBidWNrZXRzID0ge30KICAgIGZvciBtID0gZnJvbV9tLCB0b19tIGRvCiAgICAgICAgbG9jYWwgcCA9ICJzOiIgLi4gZG9tYWluIC4uICI6IiAuLiBtCiAgICAgICAgbG9jYWwgciA9IGFuYWx5dGljczpnZXQocCAuLiAiOnIiKQogICAgICAgIGlmIHIgdGhlbgogICAgICAgICAgICAtLSBSZXNwb25zZSB0aW1lIHN0b3JlZCBhcyBtaWNyb3NlY29uZHMsIGNvbnZlcnQgdG8gc2Vjb25kcyAoZmxvYXQpCiAgICAgICAgICAgIGxvY2FsIHJ0X3VzID0gYW5hbHl0aWNzOmdldChwIC4uICI6dCIpIG9yIDAKICAgICAgICAgICAgbG9jYWwgYnVja2V0ID0gewogICAgICAgICAgICAgICAgbWludXRlICAgICAgICAgICA9IG0sCiAgICAgICAgICAgICAgICByZXF1ZXN0cyAgICAgICAgID0gciwKICAgICAgICAgICAgICAgIHVuaXF1ZV9yZXF1ZXN0cyAgPSBhbmFseXRpY3M6Z2V0KHAgLi4gIjp1Iikgb3IgMCwKICAgICAgICAgICAgICAgIGJhbmR3aWR0aF9pbiAgICAgPSBhbmFseXRpY3M6Z2V0KHAgLi4gIjppIikgb3IgMCwKICAgICAgICAgICAgICAgIGJhbmR3aWR0aF9vdXQgICAgPSBhbmFseXRpY3M6Z2V0KHAgLi4gIjpvIikgb3IgMCwKICAgICAgICAgICAgICAgIHJlc3BvbnNlX3RpbWUgICAgPSBydF91cyAvIDEwMDAwMDAsCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC0tIENvbGxlY3QgcGVyLW1pbnV0ZSBjb3VudHJ5IGRhdGEgaWYgcHJlc2VudAogICAgICAgICAgICBsb2NhbCBjcGZ4ID0gImM6IiAuLiBkb21haW4gLi4gIjoiIC4uIG0gLi4gIjoiCiAgICAgICAgICAgIGxvY2FsIGFsbF9rZXlzID0gYW5hbHl0aWNzOmdldF9rZXlzKDEwMDAwKQogICAgICAgICAgICBsb2NhbCBjb3VudHJpZXMgPSB7fQogICAgICAgICAgICBsb2NhbCBoYXNfY291bnRyaWVzID0gZmFsc2UKICAgICAgICAgICAgZm9yIF8sIGsgaW4gaXBhaXJzKGFsbF9rZXlzKSBkbwogICAgICAgICAgICAgICAgaWYgazpzdWIoMSwgI2NwZngpID09IGNwZnggdGhlbgogICAgICAgICAgICAgICAgICAgIGNvdW50cmllc1trOnN1YigjY3BmeCArIDEpXSA9IGFuYWx5dGljczpnZXQoaykgb3IgMAogICAgICAgICAgICAgICAgICAgIGhhc19jb3VudHJpZXMgPSB0cnVlCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGlmIGhhc19jb3VudHJpZXMgdGhlbgogICAgICAgICAgICAgICAgYnVja2V0LmNvdW50cmllcyA9IGNvdW50cmllcwogICAgICAgICAgICBlbmQKCiAgICAgICAgICAgIGJ1Y2tldHNbI2J1Y2tldHMgKyAxXSA9IGJ1Y2tldAogICAgICAgIGVuZAogICAgZW5kCgogICAgcmV0dXJuIGpzb24oeyBkb21haW4gPSBkb21haW4sIGJ1Y2tldHMgPSBidWNrZXRzIH0pCmVuZAoKLS0g4pSA4pSAIFBPU1QgL2FuYWx5dGljcy9mbHVzaCAtIHJlYWQgKyBkZWxldGUgbWludXRlIGJ1Y2tldHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tIFNhbWUgYXMgR0VUIC9hbmFseXRpY3MgYnV0IGRlbGV0ZXMgdGhlIHJldHVybmVkIGJ1Y2tldHMgZnJvbSBzaGFyZWQgbWVtb3J5LgotLSBVc2VkIGJ5IHRoZSBzY3JhcGVyIHRvIGF0b21pY2FsbHkgbW92ZSBkYXRhIGZyb20gT3BlblJlc3R5IOKGkiBEQi4KLS0gP2RvbWFpbj1leGFtcGxlLmNvbSZmcm9tPUVQT0NIX01JTiZ0bz1FUE9DSF9NSU4KCmlmIHVyaSA9PSAiL2FuYWx5dGljcy9mbHVzaCIgYW5kIG5neC5yZXEuZ2V0X21ldGhvZCgpID09ICJQT1NUIiB0aGVuCiAgICBsb2NhbCBkb21haW4gPSBuZ3gudmFyLmFyZ19kb21haW4KICAgIGlmIG5vdCBkb21haW4gb3IgZG9tYWluID09ICIiIHRoZW4gcmV0dXJuIGJhZCgibWlzc2luZyA/ZG9tYWluPSIpIGVuZAogICAgZG9tYWluID0gZG9tYWluOmxvd2VyKCkKCiAgICBsb2NhbCBmcm9tX20gPSB0b251bWJlcihuZ3gudmFyLmFyZ19mcm9tKQogICAgbG9jYWwgdG9fbSAgID0gdG9udW1iZXIobmd4LnZhci5hcmdfdG8pCiAgICBpZiBub3QgZnJvbV9tIG9yIG5vdCB0b19tIHRoZW4KICAgICAgICByZXR1cm4gYmFkKCJtaXNzaW5nID9mcm9tPSBhbmQgP3RvPSAoZXBvY2ggbWludXRlcykiKQogICAgZW5kCiAgICBpZiB0b19tIC0gZnJvbV9tID4gMTQ0MCB0aGVuIHRvX20gPSBmcm9tX20gKyAxNDQwIGVuZAoKICAgIGxvY2FsIGJ1Y2tldHMgPSB7fQogICAgbG9jYWwgZmx1c2hlZCA9IDAKICAgIGZvciBtID0gZnJvbV9tLCB0b19tIGRvCiAgICAgICAgbG9jYWwgcCA9ICJzOiIgLi4gZG9tYWluIC4uICI6IiAuLiBtCiAgICAgICAgbG9jYWwgciA9IGFuYWx5dGljczpnZXQocCAuLiAiOnIiKQogICAgICAgIGlmIHIgdGhlbgogICAgICAgICAgICBsb2NhbCBydF91cyA9IGFuYWx5dGljczpnZXQocCAuLiAiOnQiKSBvciAwCiAgICAgICAgICAgIGxvY2FsIGJ1Y2tldCA9IHsKICAgICAgICAgICAgICAgIG1pbnV0ZSAgICAgICAgICAgPSBtLAogICAgICAgICAgICAgICAgcmVxdWVzdHMgICAgICAgICA9IHIsCiAgICAgICAgICAgICAgICB1bmlxdWVfcmVxdWVzdHMgID0gYW5hbHl0aWNzOmdldChwIC4uICI6dSIpIG9yIDAsCiAgICAgICAgICAgICAgICBiYW5kd2lkdGhfaW4gICAgID0gYW5hbHl0aWNzOmdldChwIC4uICI6aSIpIG9yIDAsCiAgICAgICAgICAgICAgICBiYW5kd2lkdGhfb3V0ICAgID0gYW5hbHl0aWNzOmdldChwIC4uICI6byIpIG9yIDAsCiAgICAgICAgICAgICAgICByZXNwb25zZV90aW1lICAgID0gcnRfdXMgLyAxMDAwMDAwLAogICAgICAgICAgICB9CgogICAgICAgICAgICAtLSBDb2xsZWN0IHBlci1taW51dGUgY291bnRyeSBkYXRhCiAgICAgICAgICAgIGxvY2FsIGNwZnggPSAiYzoiIC4uIGRvbWFpbiAuLiAiOiIgLi4gbSAuLiAiOiIKICAgICAgICAgICAgbG9jYWwgYWxsX2tleXMgPSBhbmFseXRpY3M6Z2V0X2tleXMoMTAwMDApCiAgICAgICAgICAgIGxvY2FsIGNvdW50cmllcyA9IHt9CiAgICAgICAgICAgIGxvY2FsIGhhc19jb3VudHJpZXMgPSBmYWxzZQogICAgICAgICAgICBmb3IgXywgayBpbiBpcGFpcnMoYWxsX2tleXMpIGRvCiAgICAgICAgICAgICAgICBpZiBrOnN1YigxLCAjY3BmeCkgPT0gY3BmeCB0aGVuCiAgICAgICAgICAgICAgICAgICAgY291bnRyaWVzW2s6c3ViKCNjcGZ4ICsgMSldID0gYW5hbHl0aWNzOmdldChrKSBvciAwCiAgICAgICAgICAgICAgICAgICAgYW5hbHl0aWNzOmRlbGV0ZShrKQogICAgICAgICAgICAgICAgICAgIGhhc19jb3VudHJpZXMgPSB0cnVlCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGlmIGhhc19jb3VudHJpZXMgdGhlbiBidWNrZXQuY291bnRyaWVzID0gY291bnRyaWVzIGVuZAoKICAgICAgICAgICAgYnVja2V0c1sjYnVja2V0cyArIDFdID0gYnVja2V0CgogICAgICAgICAgICAtLSBEZWxldGUgdGhlIG1pbnV0ZS1idWNrZXQgY291bnRlciBrZXlzCiAgICAgICAgICAgIGFuYWx5dGljczpkZWxldGUocCAuLiAiOnIiKQogICAgICAgICAgICBhbmFseXRpY3M6ZGVsZXRlKHAgLi4gIjppIikKICAgICAgICAgICAgYW5hbHl0aWNzOmRlbGV0ZShwIC4uICI6byIpCiAgICAgICAgICAgIGFuYWx5dGljczpkZWxldGUocCAuLiAiOnQiKQogICAgICAgICAgICBhbmFseXRpY3M6ZGVsZXRlKHAgLi4gIjp1IikKICAgICAgICAgICAgZmx1c2hlZCA9IGZsdXNoZWQgKyAxCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICByZXR1cm4ganNvbih7IGRvbWFpbiA9IGRvbWFpbiwgYnVja2V0cyA9IGJ1Y2tldHMsIGZsdXNoZWQgPSBmbHVzaGVkIH0pCmVuZAoKLS0g4pSA4pSAIEdFVCAvYW5hbHl0aWNzL3RvdGFscyAtIGxpZmV0aW1lIGNvdW50ZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAotLSA/ZG9tYWluPWV4YW1wbGUuY29tICAgICAg4oaSIHNpbmdsZSBkb21haW4KLS0gKG5vIGRvbWFpbikgICAgICAgICAgICAgIOKGkiBhbGwga25vd24gZG9tYWlucwoKaWYgdXJpID09ICIvYW5hbHl0aWNzL3RvdGFscyIgdGhlbgogICAgbG9jYWwgZG9tYWluID0gbmd4LnZhci5hcmdfZG9tYWluCgogICAgaWYgbm90IGRvbWFpbiBvciBkb21haW4gPT0gIiIgdGhlbgogICAgICAgIGxvY2FsIGtleXMgPSBhbmFseXRpY3M6Z2V0X2tleXMoMTAwMDApCiAgICAgICAgbG9jYWwgZG9tYWlucyA9IHt9CiAgICAgICAgZm9yIF8sIGsgaW4gaXBhaXJzKGtleXMpIGRvCiAgICAgICAgICAgIGxvY2FsIGQgPSBrOm1hdGNoKCJeZDooLispJCIpCiAgICAgICAgICAgIGlmIGQgdGhlbgogICAgICAgICAgICAgICAgZG9tYWluc1sjZG9tYWlucyArIDFdID0gewogICAgICAgICAgICAgICAgICAgIGRvbWFpbiAgICAgICAgPSBkLAogICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzICAgICAgPSBhbmFseXRpY3M6Z2V0KCJ0OiIgLi4gZCAuLiAiOnIiKSBvciAwLAogICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aF9pbiAgPSBhbmFseXRpY3M6Z2V0KCJ0OiIgLi4gZCAuLiAiOmkiKSBvciAwLAogICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aF9vdXQgPSBhbmFseXRpY3M6Z2V0KCJ0OiIgLi4gZCAuLiAiOm8iKSBvciAwLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgICAgICByZXR1cm4ganNvbih7IGRvbWFpbnMgPSBkb21haW5zIH0pCiAgICBlbmQKCiAgICBkb21haW4gPSBkb21haW46bG93ZXIoKQogICAgcmV0dXJuIGpzb24oewogICAgICAgIGRvbWFpbiAgICAgICAgPSBkb21haW4sCiAgICAgICAgcmVxdWVzdHMgICAgICA9IGFuYWx5dGljczpnZXQoInQ6IiAuLiBkb21haW4gLi4gIjpyIikgb3IgMCwKICAgICAgICBiYW5kd2lkdGhfaW4gID0gYW5hbHl0aWNzOmdldCgidDoiIC4uIGRvbWFpbiAuLiAiOmkiKSBvciAwLAogICAgICAgIGJhbmR3aWR0aF9vdXQgPSBhbmFseXRpY3M6Z2V0KCJ0OiIgLi4gZG9tYWluIC4uICI6byIpIG9yIDAsCiAgICB9KQplbmQKCi0tIOKUgOKUgCBHRVQgL2FuYWx5dGljcy9nZW8gLSBjb3VudHJ5IGJyZWFrZG93biBmb3IgYSBkYXkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tID9kb21haW49ZXhhbXBsZS5jb20mZGF5PVlZWVlNTURECgppZiB1cmkgPT0gIi9hbmFseXRpY3MvZ2VvIiB0aGVuCiAgICBsb2NhbCBkb21haW4gPSBuZ3gudmFyLmFyZ19kb21haW4KICAgIGlmIG5vdCBkb21haW4gb3IgZG9tYWluID09ICIiIHRoZW4gcmV0dXJuIGJhZCgibWlzc2luZyA/ZG9tYWluPSIpIGVuZAogICAgZG9tYWluID0gZG9tYWluOmxvd2VyKCkKCiAgICBsb2NhbCBkYXkgPSBuZ3gudmFyLmFyZ19kYXkKICAgIGlmIG5vdCBkYXkgb3IgI2RheSB+PSA4IHRoZW4KICAgICAgICBkYXkgPSBvcy5kYXRlKCIhJVklbSVkIikKICAgIGVuZAoKICAgIGxvY2FsIHByZWZpeCA9ICJnOiIgLi4gZG9tYWluIC4uICI6IiAuLiBkYXkgLi4gIjoiCiAgICBsb2NhbCBrZXlzID0gYW5hbHl0aWNzOmdldF9rZXlzKDEwMDAwKQogICAgbG9jYWwgY291bnRyaWVzID0ge30KICAgIGZvciBfLCBrIGluIGlwYWlycyhrZXlzKSBkbwogICAgICAgIGlmIGs6c3ViKDEsICNwcmVmaXgpID09IHByZWZpeCB0aGVuCiAgICAgICAgICAgIGNvdW50cmllc1trOnN1YigjcHJlZml4ICsgMSldID0gYW5hbHl0aWNzOmdldChrKSBvciAwCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICByZXR1cm4ganNvbih7IGRvbWFpbiA9IGRvbWFpbiwgZGF5ID0gZGF5LCBjb3VudHJpZXMgPSBjb3VudHJpZXMgfSkKZW5kCgotLSDilIDilIAgR0VUIC9sb2dzL3JlY2VudCAtIHJhdyByZXF1ZXN0IHJpbmcgYnVmZmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAotLSA/ZG9tYWluPWV4YW1wbGUuY29tJmxpbWl0PTUwCgppZiB1cmkgPT0gIi9sb2dzL3JlY2VudCIgdGhlbgogICAgaWYgbm90IHJlcXVlc3RfZGF0YSB0aGVuCiAgICAgICAgcmV0dXJuIGpzb24oeyBlcnJvciA9ICJyZXF1ZXN0X2RhdGEgZGljdCB1bmF2YWlsYWJsZSIgfSwgNTAzKQogICAgZW5kCgogICAgbG9jYWwgZG9tYWluID0gbmd4LnZhci5hcmdfZG9tYWluCiAgICBpZiBub3QgZG9tYWluIG9yIGRvbWFpbiA9PSAiIiB0aGVuIHJldHVybiBiYWQoIm1pc3NpbmcgP2RvbWFpbj0iKSBlbmQKICAgIGRvbWFpbiA9IGRvbWFpbjpsb3dlcigpCgogICAgbG9jYWwgbGltaXQgPSBtYXRoLm1pbih0b251bWJlcihuZ3gudmFyLmFyZ19saW1pdCkgb3IgNTAsIDEwMDApCiAgICBsb2NhbCBzZXEgICA9IHJlcXVlc3RfZGF0YTpnZXQoInJsb2c6IiAuLiBkb21haW4gLi4gIjpzZXEiKSBvciAwCiAgICBsb2NhbCBvdXQgICA9IHt9CgogICAgZm9yIGkgPSAwLCBsaW1pdCAtIDEgZG8KICAgICAgICBsb2NhbCBzbG90ID0gKHNlcSAtIGkpICUgMTAwMAogICAgICAgIGlmIHNsb3QgPCAwIHRoZW4gc2xvdCA9IHNsb3QgKyAxMDAwIGVuZAogICAgICAgIGxvY2FsIHJhdyA9IHJlcXVlc3RfZGF0YTpnZXQoInJsb2c6IiAuLiBkb21haW4gLi4gIjoiIC4uIHNsb3QpCiAgICAgICAgaWYgcmF3IHRoZW4gb3V0WyNvdXQgKyAxXSA9IHJhdyBlbmQKICAgIGVuZAoKICAgIC0tIFJldHVybiBwcmUtZW5jb2RlZCBKU09OIGVudHJpZXMgYXMgYSBKU09OIGFycmF5CiAgICBuZ3guaGVhZGVyWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIgogICAgbmd4LnByaW50KCJbIikKICAgIGZvciBpZHgsIGVudHJ5IGluIGlwYWlycyhvdXQpIGRvCiAgICAgICAgaWYgaWR4ID4gMSB0aGVuIG5neC5wcmludCgiLCIpIGVuZAogICAgICAgIG5neC5wcmludChlbnRyeSkKICAgIGVuZAogICAgbmd4LnNheSgiXSIpCiAgICByZXR1cm4gbmd4LmV4aXQoMjAwKQplbmQKCi0tIOKUgOKUgCA0MDQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACnJldHVybiBqc29uKHsgZXJyb3IgPSAibm90IGZvdW5kIiB9LCA0MDQpCg==",
15
+ "pipe_log.lua": "LS0gcGlwZV9sb2cubHVhCi0tIFB1c2ggcmVxdWVzdCBsb2cgaW50byBzaGFyZWQgZGljdCBxdWV1ZSBsb2dfcGlwZTpxOntob3N0fSBmb3IgL3N0cmVhbSBTU0UuCi0tIFBheWxvYWQgc2hhcGUgbWF0Y2hlcyByZXF1ZXN0TG9nZ2VyLmpzIChpZCwgaXAsIGNvdW50cnkgd2hlbiBrbm93biwKLS0gdGltZXN0YW1wLCBkYXRlLCB1cmksIG1ldGhvZCwgc3RhdHVzLCB1c2VyQWdlbnQsIHJlcXVlc3RTaXplLCByZXNwb25zZVNpemUsCi0tIHJlc3BvbnNlVGltZSkuCi0tCi0tIENhbGxlZCB2aWEgbmd4LnRpbWVyLmF0IGZyb20gc2l0ZV9sb2dnZXIgKHByZW1hdHVyZSBpcyBmaXJzdCBhcmcpLgoKbG9jYWwgY2pzb24gPSByZXF1aXJlICJjanNvbi5zYWZlIgoKbG9jYWwgU1VCX1BSRUZJWCAgID0gImxvZ19waXBlOnN1YjoiCmxvY2FsIFFVRVVFX1BSRUZJWCA9ICJsb2dfcGlwZTpxOiIKbG9jYWwgUVVFVUVfTUFYX0xFTiA9IDIwMDAKCi0tIFNBRkUgTE9BRDogR2VvSVAgKHBlci13b3JrZXIsIGNhY2hlZCBieSByZXF1aXJlKQpsb2NhbCBnZW9fb2ssIGdlbyA9IHBjYWxsKHJlcXVpcmUsICJvcGVuc2hpcC5nZW9fY291bnRyeSIpCmlmIG5vdCBnZW9fb2sgdGhlbiBnZW8gPSBuaWwgZW5kCgotLSBSZXVzZWQgcGF5bG9hZCB0YWJsZSBwZXIgd29ya2VyIChjbGVhcmVkIGFmdGVyIGVuY29kZSB0byBhdm9pZCBHQyBwcmVzc3VyZSkKbG9jYWwgcGF5bG9hZCA9IHt9Cgpsb2NhbCBmdW5jdGlvbiBwaXBlX3JlcXVlc3RfbG9nKHByZW1hdHVyZSwgaG9zdCwgaXAsIHRzLCB1YSwgdXJpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV9sZW4sIGJ5dGVzLCBydCwgbWV0aG9kLCBzdGF0dXMpCiAgICBpZiBwcmVtYXR1cmUgdGhlbiByZXR1cm4gZW5kCgogICAgbG9jYWwgc2ggPSBuZ3guc2hhcmVkLnJlcXVlc3RfZGF0YQogICAgaWYgbm90IHNoIHRoZW4gcmV0dXJuIGVuZAoKICAgIC0tIERvdWJsZS1jaGVjayBzdWJzY3JpYmVyIGlzIHN0aWxsIGFjdGl2ZSAoZ3VhcmQgYWdhaW5zdCByYWNlKQogICAgaWYgbm90IHNoOmdldChTVUJfUFJFRklYIC4uIGhvc3QpIHRoZW4gcmV0dXJuIGVuZAoKICAgIHBjYWxsKGZ1bmN0aW9uKCkKICAgICAgICBsb2NhbCBjb3VudHJ5ID0gbmlsCiAgICAgICAgaWYgZ2VvIGFuZCBnZW8uZ2V0X2NvdW50cnlfY29kZSB0aGVuCiAgICAgICAgICAgIGNvdW50cnkgPSBnZW8uZ2V0X2NvdW50cnlfY29kZShpcCkKICAgICAgICBlbmQKCiAgICAgICAgcGF5bG9hZC5pZCAgICAgICAgICAgPSBzdHJpbmcuZm9ybWF0KCIlLjNmLSVkIiwgdHMsIG1hdGgucmFuZG9tKDEwMDAwLCA5OTk5OSkpCiAgICAgICAgcGF5bG9hZC5ob3N0ICAgICAgICAgPSBob3N0CiAgICAgICAgcGF5bG9hZC5pcCAgICAgICAgICAgPSBpcAogICAgICAgIGlmIGNvdW50cnkgYW5kIHR5cGUoY291bnRyeSkgPT0gInN0cmluZyIgYW5kIGNvdW50cnkgfj0gIiIgdGhlbgogICAgICAgICAgICBwYXlsb2FkLmNvdW50cnkgPSBjb3VudHJ5CiAgICAgICAgZW5kCiAgICAgICAgcGF5bG9hZC50aW1lc3RhbXAgICAgPSB0cwogICAgICAgIHBheWxvYWQuZGF0ZSAgICAgICAgID0gb3MuZGF0ZSgiISVZLSVtLSVkICVIOiVNOiVTIiwgdHMpCiAgICAgICAgcGF5bG9hZC51cmkgICAgICAgICAgPSB1cmkKICAgICAgICBwYXlsb2FkLm1ldGhvZCAgICAgICA9IG1ldGhvZCBvciAiR0VUIgogICAgICAgIHBheWxvYWQuc3RhdHVzICAgICAgID0gdG9udW1iZXIoc3RhdHVzKSBvciAwCiAgICAgICAgcGF5bG9hZC51c2VyQWdlbnQgICAgPSB1YSBvciAiIgogICAgICAgIHBheWxvYWQucmVxdWVzdFNpemUgID0gdG9udW1iZXIocmVxX2xlbikgb3IgMAogICAgICAgIHBheWxvYWQucmVzcG9uc2VTaXplID0gdG9udW1iZXIoYnl0ZXMpIG9yIDAKICAgICAgICBwYXlsb2FkLnJlc3BvbnNlVGltZSA9IHRvbnVtYmVyKHJ0KSBvciAwCgogICAgICAgIGxvY2FsIGJvZHkgPSBjanNvbi5lbmNvZGUocGF5bG9hZCkKCiAgICAgICAgLS0gQ2xlYXIgcGF5bG9hZCB0YWJsZSBmb3IgbmV4dCByZXVzZQogICAgICAgIGZvciBrIGluIHBhaXJzKHBheWxvYWQpIGRvIHBheWxvYWRba10gPSBuaWwgZW5kCgogICAgICAgIGlmIG5vdCBib2R5IHRoZW4gcmV0dXJuIGVuZAoKICAgICAgICBsb2NhbCBxa2V5ID0gUVVFVUVfUFJFRklYIC4uIGhvc3QKICAgICAgICBzaDpscHVzaChxa2V5LCBib2R5KQogICAgICAgIGlmIHNoOmxsZW4ocWtleSkgPiBRVUVVRV9NQVhfTEVOIHRoZW4KICAgICAgICAgICAgc2g6cnBvcChxa2V5KQogICAgICAgIGVuZAogICAgZW5kKQplbmQKCnJldHVybiB7CiAgICBwaXBlX3JlcXVlc3RfbG9nID0gcGlwZV9yZXF1ZXN0X2xvZywKfQo=",
16
+ "pipe_stream.lua": "LS0gcGlwZV9zdHJlYW0ubHVhCi0tIGNvbnRlbnRfYnlfbHVhOiBTU0UgZW5kcG9pbnQgZm9yIHJlYWwtdGltZSByZXF1ZXN0IGxvZyBzdHJlYW1pbmcuCi0tIEdFVCAvbG9ncy9zdHJlYW0/ZG9tYWluPWV4YW1wbGUuY29tCi0tIEludGVybmFsIG9ubHkgLSAxMjcuMC4wLjE6OTE0NQoKbG9jYWwgc2ggPSBuZ3guc2hhcmVkLnJlcXVlc3RfZGF0YQppZiBub3Qgc2ggdGhlbgogICAgbmd4LnN0YXR1cyA9IDUwMwogICAgbmd4LnNheSgic2hhcmVkIGRpY3QgdW5hdmFpbGFibGUiKQogICAgcmV0dXJuIG5neC5leGl0KDUwMykKZW5kCgpsb2NhbCBkb21haW4gPSBuZ3gudmFyLmFyZ19kb21haW4KaWYgbm90IGRvbWFpbiBvciBkb21haW4gPT0gIiIgdGhlbgogICAgbmd4LnN0YXR1cyA9IDQwMAogICAgbmd4LnNheSgibWlzc2luZyA/ZG9tYWluPSBwYXJhbWV0ZXIiKQogICAgcmV0dXJuIG5neC5leGl0KDQwMCkKZW5kCgpkb21haW4gPSBkb21haW46bG93ZXIoKQppZiBkb21haW46c3ViKDEsIDQpID09ICJ3d3cuIiB0aGVuIGRvbWFpbiA9IGRvbWFpbjpzdWIoNSkgZW5kCgpsb2NhbCBTVUJfS0VZICAgPSAibG9nX3BpcGU6c3ViOiIgLi4gZG9tYWluCmxvY2FsIFFVRVVFX0tFWSA9ICJsb2dfcGlwZTpxOiIgICAuLiBkb21haW4KCi0tIENsZWFyIHN0YWxlIHF1ZXVlIGVudHJpZXMsIG1hcmsgc3Vic2NyaWJlciBhY3RpdmUKc2g6ZGVsZXRlKFFVRVVFX0tFWSkKc2g6c2V0KFNVQl9LRVksIHRydWUsIDMwKQoKbmd4LmhlYWRlclsiQ29udGVudC1UeXBlIl0gICAgICA9ICJ0ZXh0L2V2ZW50LXN0cmVhbSIKbmd4LmhlYWRlclsiQ2FjaGUtQ29udHJvbCJdICAgICA9ICJuby1jYWNoZSwgbm8tc3RvcmUiCm5neC5oZWFkZXJbIkNvbm5lY3Rpb24iXSAgICAgICAgPSAia2VlcC1hbGl2ZSIKbmd4LmhlYWRlclsiWC1BY2NlbC1CdWZmZXJpbmciXSA9ICJubyIKCi0tIFNlbmQgaW5pdGlhbCBTU0UgY29tbWVudCBzbyB0aGUgZmlyc3QgZmx1c2ggaGFzIGRhdGEuCi0tIFdpdGhvdXQgdGhpcywgbmd4LmZsdXNoIG9uIGFuIGVtcHR5IGJ1ZmZlciBzZW5kcyBjaHVua2VkLUVPRiAoMFxyXG5cclxuKQotLSBhbmQgdGVybWluYXRlcyB0aGUgcmVzcG9uc2UgaW1tZWRpYXRlbHkuCm5neC5wcmludCgiOiBjb25uZWN0ZWRcblxuIikKaWYgbm90IG5neC5mbHVzaCh0cnVlKSB0aGVuCiAgICBzaDpkZWxldGUoU1VCX0tFWSkKICAgIHJldHVybgplbmQKCmxvY2FsIHN0YXJ0ZWQgID0gbmd4Lm5vdygpCmxvY2FsIGxhc3RfaGIgID0gc3RhcnRlZApsb2NhbCBsYXN0X3JlZiA9IHN0YXJ0ZWQKCndoaWxlIHRydWUgZG8KICAgIC0tIE1heCAxIGhvdXIgcGVyIGNvbm5lY3Rpb24KICAgIGlmIG5neC5ub3coKSAtIHN0YXJ0ZWQgPiAzNjAwIHRoZW4KICAgICAgICBzaDpkZWxldGUoU1VCX0tFWSkKICAgICAgICByZXR1cm4KICAgIGVuZAoKICAgIC0tIERyYWluIHVwIHRvIDEwMCBxdWV1ZWQgZW50cmllcyBwZXIgY3ljbGUKICAgIGxvY2FsIHNlbnQgPSAwCiAgICB3aGlsZSBzZW50IDwgMTAwIGRvCiAgICAgICAgbG9jYWwgZW50cnkgPSBzaDpycG9wKFFVRVVFX0tFWSkKICAgICAgICBpZiBub3QgZW50cnkgdGhlbiBicmVhayBlbmQKICAgICAgICBuZ3gucHJpbnQoImV2ZW50OiByZXF1ZXN0XG5kYXRhOiAiLCBlbnRyeSwgIlxuXG4iKQogICAgICAgIHNlbnQgPSBzZW50ICsgMQogICAgZW5kCgogICAgaWYgc2VudCA+IDAgdGhlbgogICAgICAgIGlmIG5vdCBuZ3guZmx1c2godHJ1ZSkgdGhlbgogICAgICAgICAgICBzaDpkZWxldGUoU1VCX0tFWSkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICBsb2NhbCBub3cgPSBuZ3gubm93KCkKCiAgICAtLSBIZWFydGJlYXQgZXZlcnkgMTVzCiAgICBpZiBub3cgLSBsYXN0X2hiID4gMTUgdGhlbgogICAgICAgIG5neC5wcmludCgiOiBwaW5nXG5cbiIpCiAgICAgICAgaWYgbm90IG5neC5mbHVzaCh0cnVlKSB0aGVuCiAgICAgICAgICAgIHNoOmRlbGV0ZShTVUJfS0VZKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBlbmQKICAgICAgICBsYXN0X2hiID0gbm93CiAgICBlbmQKCiAgICAtLSBSZWZyZXNoIHN1YnNjcmliZXIgVFRMIGV2ZXJ5IDEwcwogICAgaWYgbm93IC0gbGFzdF9yZWYgPiAxMCB0aGVuCiAgICAgICAgc2g6c2V0KFNVQl9LRVksIHRydWUsIDMwKQogICAgICAgIGxhc3RfcmVmID0gbm93CiAgICBlbmQKCiAgICBuZ3guc2xlZXAoMC4wNSkKZW5kCg==",
17
+ "rules_guard.lua": "LS0gcnVsZXNfZ3VhcmQubHVhCi0tIGFjY2Vzc19ieV9sdWEgZHJpdmVyOiBlbmZvcmNlIHBlci1yb3V0ZSBydWxlcyAobWV0aG9kIMK3IElQL0NJRFIgYWxsb3ctZGVueSDCtwotLSBjb3VudHJ5IGFsbG93L2JhbiDCtyBiYWQgdXNlci1hZ2VudCDCtyBob3RsaW5rIMK3IHJhdGUtbGltaXQpIGZvciB0aGUgcmVxdWVzdCdzCi0tIGhvc3QuIFJ1bGVzIGFyZSBwdXNoZWQgcmVsb2FkLWZyZWUgYnkgbWdtdF9hcGkgYFBPU1QgL3J1bGVzYDsgdGhlIERCCi0tIGByb3V0ZV9ydWxlYCB0YWJsZSBpcyB0aGUgc291cmNlIG9mIHRydXRoLiBBbGwgcGFyc2luZy9jb21waWxpbmcvbWF0Y2hpbmcKLS0gbGl2ZXMgaW4gb3BlbnNoaXAucnVsZXNfbGliIChsb2FkZWQgT05DRSBwZXIgd29ya2VyKSDigJQgdGhpcyBmaWxlIGlzIHJlLXJ1bgotLSBldmVyeSByZXF1ZXN0IHNvIGl0IHN0YXlzIG1pbmltYWwuIFNlZSBydWxlc19saWIubHVhIGZvciB0aGUgY29tcGlsZWQgc2hhcGUuCi0tCi0tIEVuZm9yY2VtZW50IHVzZXMgdGhlIGNvbm5lY3RpbmcgcGVlciAobmd4LnZhci5yZW1vdGVfYWRkcik7IGZyb250IGEgcmVhbF9pcAotLSBjb25maWcgaWYgYmVoaW5kIGEgdHJ1c3RlZCBwcm94eS4gTm8gdXNlci1zdXBwbGllZCB2YWx1ZSBpcyBldmVyIHVzZWQgYXMgYQotLSBMdWEgcGF0dGVybiBvciB3cml0dGVuIGludG8gYSByZXNwb25zZSBoZWFkZXIuCgpsb2NhbCBydWxlcyA9IG5neC5zaGFyZWQucnVsZXMKaWYgbm90IHJ1bGVzIHRoZW4gcmV0dXJuIGVuZAoKLS0gUmF0ZS1saW1pdCBjb3VudGVycyBsaXZlIGluIHRoZWlyIE9XTiBkaWN0IHNvIGEgaGlnaC1jYXJkaW5hbGl0eSBmbG9vZCAoYSBuZXcKLS0gcmw6IGtleSBwZXIgc291cmNlIElQIHBlciBzZWNvbmQpIGNhbid0IExSVS1ldmljdCB0aGUgcnVsZXNldHMgYW5kIHNpbGVudGx5Ci0tIGRpc2FibGUgZW5mb3JjZW1lbnQuIEZhbGwgYmFjayB0byBgcnVsZXNgIG9uIGEgYm94IHdob3NlIGNvbmZpZyBwcmVkYXRlcyB0aGUKLS0gc2VwYXJhdGUgZGljdCAoc3RpbGwgd29ya3MsIGp1c3Qgc2hhcmVzIHRoZSB6b25lIHVudGlsIHRoZSBuZXh0IHJlbG9hZCkuCmxvY2FsIGNvdW50ZXJzID0gbmd4LnNoYXJlZC5ybF9jb3VudGVycyBvciBydWxlcwoKbG9jYWwgaG9zdCA9IG5neC52YXIuaG9zdAppZiBub3QgaG9zdCB0aGVuIHJldHVybiBlbmQKCmxvY2FsIHJhdyA9IHJ1bGVzOmdldChob3N0KQppZiBub3QgcmF3IHRoZW4gcmV0dXJuIGVuZCAgICAgICAgICAtLSBmYXN0IHBhdGg6IG5vdGhpbmcgY29uZmlndXJlZCBmb3IgdGhpcyBob3N0Cgpsb2NhbCBsaWIgPSByZXF1aXJlICJvcGVuc2hpcC5ydWxlc19saWIiCmxvY2FsIGVudHJpZXMgPSBsaWIuZ2V0KGhvc3QsIHJhdykKbG9jYWwgbiA9ICNlbnRyaWVzCmlmIG4gPT0gMCB0aGVuIHJldHVybiBlbmQKCi0tIOKUgOKUgCBMb25nZXN0IG1hdGNoaW5nIHBhdGhQcmVmaXggd2lucyDilIDilIAKbG9jYWwgdXJpID0gbmd4LnZhci51cmkgb3IgIi8iCmxvY2FsIGNob3NlbiwgY2hvc2VuX2xlbiA9IG5pbCwgLTEKZm9yIGkgPSAxLCBuIGRvCiAgICBsb2NhbCBlID0gZW50cmllc1tpXQogICAgbG9jYWwgcCA9IGUucGF0aFByZWZpeAogICAgaWYgcCA9PSBuaWwgb3IgcCA9PSAiIiBvciBwID09ICIvIiB0aGVuCiAgICAgICAgaWYgY2hvc2VuX2xlbiA8IDAgdGhlbiBjaG9zZW4sIGNob3Nlbl9sZW4gPSBlLCAwIGVuZAogICAgZWxzZWlmIHVyaSA9PSBwIG9yIHN0cmluZy5zdWIodXJpLCAxLCAjcCkgPT0gcCB0aGVuCiAgICAgICAgaWYgI3AgPiBjaG9zZW5fbGVuIHRoZW4gY2hvc2VuLCBjaG9zZW5fbGVuID0gZSwgI3AgZW5kCiAgICBlbmQKZW5kCmlmIG5vdCBjaG9zZW4gdGhlbiByZXR1cm4gZW5kCgpsb2NhbCBzcGVjID0gY2hvc2VuLnNwZWMKbG9jYWwgZGVueV9zdGF0dXMgPSBzcGVjLmJsb2NrU3RhdHVzIG9yIDQwMwoKbG9jYWwgaXBzID0gbmd4LnZhci5yZW1vdGVfYWRkciBvciAiMC4wLjAuMCIKbG9jYWwgaXBpID0gbGliLmlwdjRfdG9faW50KGlwcykKCi0tIENvdW50cnkgcmVzb2x2ZWQgYXQgbW9zdCBvbmNlIHBlciByZXF1ZXN0IChvbmx5IHdoZW4gYSBjb3VudHJ5IHJ1bGUgZXhpc3RzKS4KbG9jYWwgY291bnRyeV9jYWNoZQpsb2NhbCBmdW5jdGlvbiBjb3VudHJ5X29mKCkKICAgIGlmIGNvdW50cnlfY2FjaGUgPT0gbmlsIHRoZW4KICAgICAgICBsb2NhbCBvaywgZ2VvID0gcGNhbGwocmVxdWlyZSwgIm9wZW5zaGlwLmdlb19jb3VudHJ5IikKICAgICAgICBjb3VudHJ5X2NhY2hlID0gKG9rIGFuZCBnZW8gYW5kIGdlby5nZXRfY291bnRyeV9jb2RlKGlwcykpIG9yIGZhbHNlCiAgICBlbmQKICAgIHJldHVybiBjb3VudHJ5X2NhY2hlIG9yIG5pbAplbmQKCi0tIOKUgOKUgCAxLiBBY2Nlc3M6IG1ldGhvZCBhbGxvdy1saXN0LCBJUCBhbGxvdy9kZW55LCBjb3VudHJ5IGFsbG93LWxpc3Qg4pSA4pSACmxvY2FsIGFjY2VzcyA9IHNwZWMuYWNjZXNzCmlmIGFjY2VzcyB0aGVuCiAgICBpZiBhY2Nlc3MubWV0aG9kcyBhbmQgbm90IGFjY2Vzcy5tZXRob2RzW25neC5yZXEuZ2V0X21ldGhvZCgpXSB0aGVuCiAgICAgICAgcmV0dXJuIG5neC5leGl0KGRlbnlfc3RhdHVzKQogICAgZW5kCiAgICBpZiBsaWIubWF0Y2hfY29tcGlsZWQoYWNjZXNzLmRlbnksIGlwaSwgaXBzKSB0aGVuIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykgZW5kCiAgICBpZiBhY2Nlc3MuYWxsb3cgYW5kIG5vdCBsaWIubWF0Y2hfY29tcGlsZWQoYWNjZXNzLmFsbG93LCBpcGksIGlwcykgdGhlbgogICAgICAgIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykKICAgIGVuZAogICAgLS0gQWxsb3ctbGlzdDogYW4gdW5yZXNvbHZlZCBjb3VudHJ5IGlzIG5vdCBvbiB0aGUgbGlzdCDihpIgYmxvY2tlZCAoZGVmYXVsdC1kZW55KS4KICAgIGlmIGFjY2Vzcy5hbGxvd0NvdW50cmllcyBhbmQgbm90IGFjY2Vzcy5hbGxvd0NvdW50cmllc1tjb3VudHJ5X29mKCkgb3IgIiJdIHRoZW4KICAgICAgICByZXR1cm4gbmd4LmV4aXQoZGVueV9zdGF0dXMpCiAgICBlbmQKZW5kCgotLSDilIDilIAgMi4gQmFuOiBJUC9DSURSLCBjb3VudHJ5LCB1c2VyLWFnZW50IOKUgOKUgApsb2NhbCBiYW4gPSBzcGVjLmJhbgppZiBiYW4gdGhlbgogICAgaWYgbGliLm1hdGNoX2NvbXBpbGVkKGJhbi5pcHMsIGlwaSwgaXBzKSBvciBsaWIubWF0Y2hfY29tcGlsZWQoYmFuLmNpZHJzLCBpcGksIGlwcykgdGhlbgogICAgICAgIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykKICAgIGVuZAogICAgaWYgYmFuLmNvdW50cmllcyB0aGVuCiAgICAgICAgbG9jYWwgY2MgPSBjb3VudHJ5X29mKCkKICAgICAgICAtLSBGYWlsIENMT1NFRCAobWF0Y2hlcyB0aGUgYWxsb3ctbGlzdCBhYm92ZSk6IGlmIGdlbyBpcyB1bmF2YWlsYWJsZSB3ZQogICAgICAgIC0tIGNhbm5vdCBwcm92ZSB0aGUgY2xpZW50IGlzIE5PVCBmcm9tIGEgYmFubmVkIGNvdW50cnksIHNvIGJsb2NrIHJhdGhlcgogICAgICAgIC0tIHRoYW4gc2lsZW50bHkgbGV0dGluZyBiYW5uZWQgdHJhZmZpYyB0aHJvdWdoLiBBIGJsb2NrZWQgaG9zdCBpcyBhIGxvdWQKICAgICAgICAtLSBzaWduYWwgdG8gZml4IGdlbzsgZmFpbC1vcGVuIHdvdWxkIGJlIGEgc2lsZW50IHNlY3VyaXR5IGhvbGUuCiAgICAgICAgaWYgbm90IGNjIHRoZW4KICAgICAgICAgICAgbmd4LmxvZyhuZ3guV0FSTiwgInJ1bGVzX2d1YXJkOiBjb3VudHJ5IGJhbiBhY3RpdmUgYnV0IGdlbyB1bmF2YWlsYWJsZSDigJQgYmxvY2tpbmcgKGZhaWwtY2xvc2VkKSIpCiAgICAgICAgICAgIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykKICAgICAgICBlbmQKICAgICAgICBpZiBiYW4uY291bnRyaWVzW2NjXSB0aGVuIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykgZW5kCiAgICBlbmQKICAgIGlmIGJhbi5lbXB0eVVBIG9yIGJhbi51YXMgdGhlbgogICAgICAgIGxvY2FsIHVhID0gbmd4LnZhci5odHRwX3VzZXJfYWdlbnQKICAgICAgICBpZiBiYW4uZW1wdHlVQSBhbmQgKHVhID09IG5pbCBvciB1YSA9PSAiIikgdGhlbiByZXR1cm4gbmd4LmV4aXQoZGVueV9zdGF0dXMpIGVuZAogICAgICAgIGlmIGJhbi51YXMgYW5kIHVhIGFuZCB1YSB+PSAiIiB0aGVuCiAgICAgICAgICAgIGxvY2FsIHVhbCA9IHN0cmluZy5sb3dlcih1YSkKICAgICAgICAgICAgZm9yIGkgPSAxLCAjYmFuLnVhcyBkbwogICAgICAgICAgICAgICAgaWYgc3RyaW5nLmZpbmQodWFsLCBiYW4udWFzW2ldLCAxLCB0cnVlKSB0aGVuIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykgZW5kCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgZW5kCmVuZAoKLS0g4pSA4pSAIDMuIEhvdGxpbms6IG9ubHkgbGlzdGVkIHJlZmVyZXIgaG9zdHMgKGVtcHR5IHJlZmVyZXIgcGVyIGFsbG93RW1wdHkpIOKUgOKUgApsb2NhbCBob3QgPSBzcGVjLmhvdGxpbmsKaWYgaG90IHRoZW4KICAgIGxvY2FsIHJlZiA9IG5neC52YXIuaHR0cF9yZWZlcmVyCiAgICBpZiByZWYgPT0gbmlsIG9yIHJlZiA9PSAiIiB0aGVuCiAgICAgICAgaWYgbm90IGhvdC5hbGxvd0VtcHR5IHRoZW4gcmV0dXJuIG5neC5leGl0KGRlbnlfc3RhdHVzKSBlbmQKICAgIGVsc2UKICAgICAgICBsb2NhbCByaG9zdCA9IHN0cmluZy5tYXRjaChyZWYsICJeJXcrOi8vKFteL10rKSIpICAgICAgICAgIC0tIGF1dGhvcml0eQogICAgICAgIGlmIHJob3N0IHRoZW4gcmhvc3QgPSBzdHJpbmcubG93ZXIoc3RyaW5nLm1hdGNoKHJob3N0LCAiXihbXjpdKykiKSBvciByaG9zdCkgZW5kIC0tIHN0cmlwIDpwb3J0CiAgICAgICAgaWYgbm90IChyaG9zdCBhbmQgaG90LnJlZmVyZXJzW3Job3N0XSkgdGhlbiByZXR1cm4gbmd4LmV4aXQoZGVueV9zdGF0dXMpIGVuZAogICAgZW5kCmVuZAoKLS0g4pSA4pSAIDQuIFJhdGUgbGltaXQg4oCUIGZpeGVkIDFzIHdpbmRvdyBwZXIgKGhvc3QsIHBhdGgsIGlwKSDilIDilIAKbG9jYWwgcmwgPSBzcGVjLnJsCmlmIHJsIHRoZW4KICAgIGxvY2FsIGtleSA9ICJybDoiIC4uIGhvc3QgLi4gIjoiIC4uIChjaG9zZW4ucGF0aFByZWZpeCBvciAiLyIpIC4uICI6IiAuLiBpcHMKICAgICAgICAuLiAiOiIgLi4gbWF0aC5mbG9vcihuZ3gubm93KCkpCiAgICBsb2NhbCBjID0gY291bnRlcnM6aW5jcihrZXksIDEsIDAsIDIpICAtLSBpbml0IDAsIDJzIFRUTCDihpIgc2VsZi1leHBpcmluZyBidWNrZXRzCiAgICBpZiBjIGFuZCBjID4gcmwubGltaXQgdGhlbgogICAgICAgIG5neC5oZWFkZXJbIlJldHJ5LUFmdGVyIl0gPSAiMSIKICAgICAgICByZXR1cm4gbmd4LmV4aXQocmwuc3RhdHVzKQogICAgZW5kCmVuZAo=",
18
+ "rules_lib.lua": "LS0gcnVsZXNfbGliLmx1YQotLSBQZXItd29ya2VyIGhlbHBlcnMgKyBwYXJzZWQtcnVsZSBjYWNoZSBmb3IgcnVsZXNfZ3VhcmQubHVhIChhY2Nlc3MgcGhhc2UpLgotLSBMb2FkZWQgT05DRSBwZXIgd29ya2VyIHZpYSByZXF1aXJlKCJvcGVuc2hpcC5ydWxlc19saWIiKS4gVGhlIGFjY2VzcyBmaWxlIGlzCi0tIHJlLWV4ZWN1dGVkIG9uIGV2ZXJ5IHJlcXVlc3QsIHNvIGFsbCBwYXJzaW5nL2NvbXBpbGluZy9tYXRjaGluZyBsaXZlcyBoZXJlIHRvCi0tIGF2b2lkIHJlLWNyZWF0aW5nIGNsb3N1cmVzIGFuZCByZS1kZWNvZGluZyBKU09OIG9uIHRoZSBob3QgcGF0aC4KLS0KLS0gU2hhcmVkLWRpY3QgdmFsdWUgYHJ1bGVzW2hvc3RdYCA9IEpTT04gYXJyYXkgb2YgeyBwYXRoUHJlZml4LCBzcGVjIH0gd2hlcmUKLS0gc3BlYyBtYXRjaGVzIEByZXBvL2NvcmUgUm91dGVSdWxlU3BlYy4gcGFyc2UoKSBkZWNvZGVzICsgcHJlY29tcGlsZXMgQ0lEUnMgdG8KLS0gaW50ZWdlcnMsIGxvd2VyY2FzZXMgVUEvcmVmZXJlciBuZWVkbGVzLCBhbmQgYnVpbGRzIE8oMSkgc2V0cyBmb3IKLS0gY291bnRyaWVzL21ldGhvZHMgT05DRTsgdGhlIGNvbXBpbGVkIHJlc3VsdCBpcyBMUlUtY2FjaGVkIHBlciBob3N0IGFuZCByZXVzZWQKLS0gdW50aWwgdGhlIHJhdyBzdHJpbmcgY2hhbmdlcyAocnVsZSBlZGl0cyBhcmUgcmFyZSwgcmVxdWVzdHMgYXJlIGhvdCkuCi0tCi0tIFNFQ1VSSVRZOiBub3RoaW5nIGhlcmUgdHVybnMgYSBydWxlIHZhbHVlIGludG8gTHVhIGNvZGUgb3IgYSBMdWEgcGF0dGVybi4KLS0gU3RyaW5ncyBhcmUgY29tcGFyZWQgd2l0aCBgPT1gL3NldC1sb29rdXBzOyB1c2VyLWFnZW50IG1hdGNoaW5nIGlzCi0tIHN0cmluZy5maW5kKGhheSwgbmVlZGxlLCAxLCB0cnVlKSDigJQgUExBSU4sIG5ldmVyIGEgcmVnZXguCgpsb2NhbCBjanNvbiA9IHJlcXVpcmUgImNqc29uLnNhZmUiCmxvY2FsIGxydWNhY2hlID0gcmVxdWlyZSAicmVzdHkubHJ1Y2FjaGUiCgpsb2NhbCBNID0ge30KCmxvY2FsIGNhY2hlID0gbHJ1Y2FjaGUubmV3KDEwMjQpIC0tIGNvbXBpbGVkIHJ1bGVzLCBwZXIgd29ya2VyLCB+MTAyNCBob3N0cwoKLS0g4pSA4pSAIElQdjQgaGVscGVycyDilIDilIAKbG9jYWwgZnVuY3Rpb24gaXB2NF90b19pbnQocykKICAgIGxvY2FsIGEsIGIsIGMsIGQgPSBzdHJpbmcubWF0Y2gocywgIl4oJWQrKSUuKCVkKyklLiglZCspJS4oJWQrKSQiKQogICAgaWYgbm90IGEgdGhlbiByZXR1cm4gbmlsIGVuZAogICAgYSwgYiwgYywgZCA9IHRvbnVtYmVyKGEpLCB0b251bWJlcihiKSwgdG9udW1iZXIoYyksIHRvbnVtYmVyKGQpCiAgICBpZiBhID4gMjU1IG9yIGIgPiAyNTUgb3IgYyA+IDI1NSBvciBkID4gMjU1IHRoZW4gcmV0dXJuIG5pbCBlbmQKICAgIHJldHVybiBhICogMTY3NzcyMTYgKyBiICogNjU1MzYgKyBjICogMjU2ICsgZAplbmQKTS5pcHY0X3RvX2ludCA9IGlwdjRfdG9faW50CgotLSBQcmVjb21waWxlIGEgQ0lEUiAvIGJhcmUtSVAgc3RyaW5nIGludG8gYSBjaGVhcCBtYXRjaCBkZXNjcmlwdG9yLgpsb2NhbCBmdW5jdGlvbiBjb21waWxlX2NpZHIocykKICAgIGxvY2FsIGJhc2UsIGJpdHMgPSBzdHJpbmcubWF0Y2gocywgIl4oW14vXSspLyglZCspJCIpCiAgICBpZiBiYXNlIHRoZW4KICAgICAgICBiaXRzID0gdG9udW1iZXIoYml0cykKICAgICAgICBsb2NhbCBiYXNlaSA9IGlwdjRfdG9faW50KGJhc2UpCiAgICAgICAgaWYgbm90IGJhc2VpIG9yIGJpdHMgPCAwIG9yIGJpdHMgPiAzMiB0aGVuIHJldHVybiB7IGV4YWN0ID0gcyB9IGVuZAogICAgICAgIGlmIGJpdHMgPT0gMCB0aGVuIHJldHVybiB7IGFsbCA9IHRydWUgfSBlbmQKICAgICAgICBsb2NhbCBkaXYgPSAyIF4gKDMyIC0gYml0cykgLS0gY29tcGFyZSB0aGUgdG9wIGBiaXRzYCBiaXRzCiAgICAgICAgcmV0dXJuIHsgbmV0ID0gbWF0aC5mbG9vcihiYXNlaSAvIGRpdiksIGRpdiA9IGRpdiB9CiAgICBlbmQKICAgIGxvY2FsIGkgPSBpcHY0X3RvX2ludChzKQogICAgaWYgaSB0aGVuIHJldHVybiB7IGlwID0gaSB9IGVuZAogICAgcmV0dXJuIHsgZXhhY3QgPSBzIH0gLS0gSVB2NiAvIHVucGFyc2VhYmxlIOKGkiBsaXRlcmFsIHN0cmluZyBjb21wYXJlCmVuZAoKbG9jYWwgZnVuY3Rpb24gY29tcGlsZV9saXN0KGxpc3QpCiAgICBpZiB0eXBlKGxpc3QpIH49ICJ0YWJsZSIgdGhlbiByZXR1cm4gbmlsIGVuZAogICAgbG9jYWwgb3V0LCBuID0ge30sIDAKICAgIGZvciBfLCBzIGluIGlwYWlycyhsaXN0KSBkbwogICAgICAgIGlmIHR5cGUocykgPT0gInN0cmluZyIgYW5kIHMgfj0gIiIgdGhlbgogICAgICAgICAgICBuID0gbiArIDEKICAgICAgICAgICAgb3V0W25dID0gY29tcGlsZV9jaWRyKHMpCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBuID4gMCBhbmQgb3V0IG9yIG5pbAplbmQKCi0tIE1hdGNoIGEgY2xpZW50IChpbnQgZm9ybSBgaXBpYCwgbWF5IGJlIG5pbCBmb3Igbm9uLUlQdjQ7IHJhdyBgaXBzYCkgYWdhaW5zdCBhCi0tIGNvbXBpbGVkIENJRFIvSVAgbGlzdC4KbG9jYWwgZnVuY3Rpb24gbWF0Y2hfY29tcGlsZWQoY29tcGlsZWQsIGlwaSwgaXBzKQogICAgaWYgbm90IGNvbXBpbGVkIHRoZW4gcmV0dXJuIGZhbHNlIGVuZAogICAgZm9yIGkgPSAxLCAjY29tcGlsZWQgZG8KICAgICAgICBsb2NhbCBjID0gY29tcGlsZWRbaV0KICAgICAgICBpZiBjLmFsbCB0aGVuCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgZWxzZWlmIGMuaXAgdGhlbgogICAgICAgICAgICBpZiBpcGkgYW5kIGlwaSA9PSBjLmlwIHRoZW4gcmV0dXJuIHRydWUgZW5kCiAgICAgICAgZWxzZWlmIGMubmV0IHRoZW4KICAgICAgICAgICAgaWYgaXBpIGFuZCBtYXRoLmZsb29yKGlwaSAvIGMuZGl2KSA9PSBjLm5ldCB0aGVuIHJldHVybiB0cnVlIGVuZAogICAgICAgIGVsc2VpZiBjLmV4YWN0ID09IGlwcyB0aGVuCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBmYWxzZQplbmQKTS5tYXRjaF9jb21waWxlZCA9IG1hdGNoX2NvbXBpbGVkCgpsb2NhbCBmdW5jdGlvbiBsb3dlcl9saXN0KGxpc3QpCiAgICBpZiB0eXBlKGxpc3QpIH49ICJ0YWJsZSIgdGhlbiByZXR1cm4gbmlsIGVuZAogICAgbG9jYWwgb3V0LCBuID0ge30sIDAKICAgIGZvciBfLCBzIGluIGlwYWlycyhsaXN0KSBkbwogICAgICAgIGlmIHR5cGUocykgPT0gInN0cmluZyIgYW5kIHMgfj0gIiIgdGhlbgogICAgICAgICAgICBuID0gbiArIDEKICAgICAgICAgICAgb3V0W25dID0gc3RyaW5nLmxvd2VyKHMpCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBuID4gMCBhbmQgb3V0IG9yIG5pbAplbmQKCi0tIEJ1aWxkIGFuIE8oMSkgbG9va3VwIHNldCBmcm9tIGEgc3RyaW5nIGxpc3QgKG9wdGlvbmFsbHkgbG93ZXJjYXNlZCkuCmxvY2FsIGZ1bmN0aW9uIHRvX3NldChsaXN0LCBsb3dlcikKICAgIGlmIHR5cGUobGlzdCkgfj0gInRhYmxlIiB0aGVuIHJldHVybiBuaWwgZW5kCiAgICBsb2NhbCBzZXQsIGFueSA9IHt9LCBmYWxzZQogICAgZm9yIF8sIHMgaW4gaXBhaXJzKGxpc3QpIGRvCiAgICAgICAgaWYgdHlwZShzKSA9PSAic3RyaW5nIiBhbmQgcyB+PSAiIiB0aGVuCiAgICAgICAgICAgIHNldFtsb3dlciBhbmQgc3RyaW5nLmxvd2VyKHMpIG9yIHNdID0gdHJ1ZQogICAgICAgICAgICBhbnkgPSB0cnVlCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBhbnkgYW5kIHNldCBvciBuaWwKZW5kCgotLSBDb21waWxlIG9uZSBSb3V0ZVJ1bGVTcGVjIGludG8gYSBmYXN0LW1hdGNoIHNoYXBlLgpsb2NhbCBmdW5jdGlvbiBjb21waWxlX3NwZWMoc3BlYykKICAgIGlmIHR5cGUoc3BlYykgfj0gInRhYmxlIiB0aGVuIHJldHVybiB7IGJsb2NrU3RhdHVzID0gNDAzIH0gZW5kCiAgICBsb2NhbCBvdXQgPSB7fQoKICAgIGxvY2FsIHJsID0gc3BlYy5yYXRlTGltaXQKICAgIGxvY2FsIHJwcyA9IHJsIGFuZCB0b251bWJlcihybC5ycHMpCiAgICBpZiBycHMgYW5kIHJwcyA+IDAgdGhlbgogICAgICAgIG91dC5ybCA9IHsKICAgICAgICAgICAgbGltaXQgPSBtYXRoLmZsb29yKHJwcykgKyBtYXRoLmZsb29yKHRvbnVtYmVyKHJsLmJ1cnN0KSBvciAwKSwKICAgICAgICAgICAgc3RhdHVzID0gdG9udW1iZXIocmwuc3RhdHVzKSBvciA0MjksCiAgICAgICAgfQogICAgZW5kCgogICAgbG9jYWwgYmFuID0gc3BlYy5iYW4KICAgIGlmIHR5cGUoYmFuKSA9PSAidGFibGUiIHRoZW4KICAgICAgICBvdXQuYmFuID0gewogICAgICAgICAgICBpcHMgPSBjb21waWxlX2xpc3QoYmFuLmlwcyksCiAgICAgICAgICAgIGNpZHJzID0gY29tcGlsZV9saXN0KGJhbi5jaWRycyksCiAgICAgICAgICAgIGNvdW50cmllcyA9IHRvX3NldChiYW4uY291bnRyaWVzKSwKICAgICAgICAgICAgdWFzID0gbG93ZXJfbGlzdChiYW4udXNlckFnZW50cyksCiAgICAgICAgICAgIGVtcHR5VUEgPSBiYW4uZW1wdHlVc2VyQWdlbnQgPT0gdHJ1ZSwKICAgICAgICB9CiAgICBlbmQKCiAgICBsb2NhbCBhY2MgPSBzcGVjLmFjY2VzcwogICAgaWYgdHlwZShhY2MpID09ICJ0YWJsZSIgdGhlbgogICAgICAgIG91dC5hY2Nlc3MgPSB7CiAgICAgICAgICAgIGFsbG93ID0gY29tcGlsZV9saXN0KGFjYy5hbGxvd0NpZHJzKSwKICAgICAgICAgICAgZGVueSA9IGNvbXBpbGVfbGlzdChhY2MuZGVueUNpZHJzKSwKICAgICAgICAgICAgYWxsb3dDb3VudHJpZXMgPSB0b19zZXQoYWNjLmFsbG93Q291bnRyaWVzKSwKICAgICAgICAgICAgbWV0aG9kcyA9IHRvX3NldChhY2MubWV0aG9kcyksCiAgICAgICAgfQogICAgZW5kCgogICAgbG9jYWwgaG90ID0gc3BlYy5ob3RsaW5rCiAgICBpZiB0eXBlKGhvdCkgPT0gInRhYmxlIiB0aGVuCiAgICAgICAgbG9jYWwgcmVmcyA9IHRvX3NldChob3QuYWxsb3dSZWZlcmVycywgdHJ1ZSkKICAgICAgICBpZiByZWZzIHRoZW4KICAgICAgICAgICAgb3V0LmhvdGxpbmsgPSB7IHJlZmVyZXJzID0gcmVmcywgYWxsb3dFbXB0eSA9IGhvdC5hbGxvd0VtcHR5IH49IGZhbHNlIH0KICAgICAgICBlbmQKICAgIGVuZAoKICAgIG91dC5ibG9ja1N0YXR1cyA9ICh0eXBlKHNwZWMuYmxvY2spID09ICJ0YWJsZSIgYW5kIHRvbnVtYmVyKHNwZWMuYmxvY2suc3RhdHVzKSkgb3IgNDAzCiAgICByZXR1cm4gb3V0CmVuZAoKbG9jYWwgZnVuY3Rpb24gcGFyc2UocmF3KQogICAgbG9jYWwgZW50cmllcyA9IGNqc29uLmRlY29kZShyYXcpCiAgICBpZiB0eXBlKGVudHJpZXMpIH49ICJ0YWJsZSIgdGhlbiByZXR1cm4ge30gZW5kCiAgICBsb2NhbCBvdXQsIG4gPSB7fSwgMAogICAgZm9yIF8sIGUgaW4gaXBhaXJzKGVudHJpZXMpIGRvCiAgICAgICAgaWYgdHlwZShlKSA9PSAidGFibGUiIHRoZW4KICAgICAgICAgICAgbiA9IG4gKyAxCiAgICAgICAgICAgIG91dFtuXSA9IHsgcGF0aFByZWZpeCA9IGUucGF0aFByZWZpeCwgc3BlYyA9IGNvbXBpbGVfc3BlYyhlLnNwZWMpIH0KICAgICAgICBlbmQKICAgIGVuZAogICAgcmV0dXJuIG91dAplbmQKCi0tIExSVS1jYWNoZWQgcGFyc2U6IHJldXNlIHRoZSBjb21waWxlZCBmb3JtIHVudGlsIHRoZSByYXcgZGljdCBzdHJpbmcgY2hhbmdlcy4KZnVuY3Rpb24gTS5nZXQoaG9zdCwgcmF3KQogICAgbG9jYWwgaGl0ID0gY2FjaGU6Z2V0KGhvc3QpCiAgICBpZiBoaXQgYW5kIGhpdC5yYXcgPT0gcmF3IHRoZW4gcmV0dXJuIGhpdC5wYXJzZWQgZW5kCiAgICBsb2NhbCBwYXJzZWQgPSBwYXJzZShyYXcpCiAgICBjYWNoZTpzZXQoaG9zdCwgeyByYXcgPSByYXcsIHBhcnNlZCA9IHBhcnNlZCB9KQogICAgcmV0dXJuIHBhcnNlZAplbmQKCnJldHVybiBNCg==",
19
+ "site_logger.lua": "LS0gc2l0ZV9sb2dnZXIubHVhCi0tIE9wZW5SZXN0eSBsb2dfYnlfbHVhIC0gcnVucyBBRlRFUiB0aGUgcmVzcG9uc2UgaXMgc2VudC4KLS0gUHVyZSBzaGFyZWQtZGljdCBhbmFseXRpY3MuICBObyBSZWRpcywgbm8gdGltZXJzIGZvciBjb3VudGVycywgbm8gYmF0Y2hpbmcuCi0tIEV2ZXJ5IGluY3IoKSBpcyBhdG9taWMgYWNyb3NzIHdvcmtlcnMuCi0tCi0tIFNoYXJlZCBkaWN0IGtleSBzY2hlbWEgKGFuYWx5dGljcyB6b25lKToKLS0gICBzOntkb21haW59OntlcG9jaF9taW59OnIgICAgICAgIHJlcXVlc3QgY291bnQgICAgICAgICAgICAgICAoVFRMIDI0aCkKLS0gICBzOntkb21haW59OntlcG9jaF9taW59OmkgICAgICAgIGJhbmR3aWR0aCBpbiAgYnl0ZXMgICAgICAgICAoVFRMIDI0aCkKLS0gICBzOntkb21haW59OntlcG9jaF9taW59Om8gICAgICAgIGJhbmR3aWR0aCBvdXQgYnl0ZXMgICAgICAgICAoVFRMIDI0aCkKLS0gICBzOntkb21haW59OntlcG9jaF9taW59OnQgICAgICAgIHJlc3BvbnNlIHRpbWUgc3VtIChzZWNvbmRzKSAoVFRMIDI0aCkKLS0gICBzOntkb21haW59OntlcG9jaF9taW59OnUgICAgICAgIHVuaXF1ZSAobm9uLXN0YXRpYykgcmVxcyAgICAoVFRMIDI0aCkKLS0gICBnOntkb21haW59OntZWVlZTU1ERH06e0NDfSAgICAgIGNvdW50cnkgaGl0IGNvdW50ICAgICAgICAgICAoVFRMIDQ4aCkKLS0gICBjOntkb21haW59OntlcG9jaF9taW59OntDQ30gICAgIGNvdW50cnkgcGVyIG1pbnV0ZSAgICAgICAgICAoVFRMIDI0aCkKLS0gICB0Ontkb21haW59OnIgLyA6aSAvIDpvICAgICAgICAgIGxpZmV0aW1lIHRvdGFscyAgICAgICAgICAgICAobm8gVFRMKQotLSAgIGQ6e2RvbWFpbn0gICAgICAgICAgICAgICAgICAgICAgZG9tYWluIGluZGV4IG1hcmtlciAgICAgICAgIChubyBUVEwpCi0tCi0tIFNoYXJlZCBkaWN0IGtleSBzY2hlbWEgKHJlcXVlc3RfZGF0YSB6b25lKToKLS0gICBybG9nOntkb21haW59OnNlcSAgICAgICAgICAgICAgIG1vbm90b25pYyB3cml0ZSBwb2ludGVyCi0tICAgcmxvZzp7ZG9tYWlufTp7c2xvdH0gICAgICAgICAgICBKU09OIGVudHJ5IChyaW5nIGJ1ZikgICAgICAgKFRUTCAxaCkKLS0gICBsb2dfcGlwZTpzdWI6e2RvbWFpbn0gICAgICAgICAgIGxpdmUgc3Vic2NyaWJlciBmbGFnICAgICAgICAoVFRMIDMwcykKLS0gICBsb2dfcGlwZTpxOntkb21haW59ICAgICAgICAgICAgIGxpdmUgbG9nIHF1ZXVlIGVudHJpZXMKCmxvY2FsIGNqc29uID0gcmVxdWlyZSAiY2pzb24uc2FmZSIKCi0tIFNBRkUgTE9BRDogR2VvSVAgTW9kdWxlIChwZXItd29ya2VyLCBjYWNoZWQgYnkgcmVxdWlyZSkKbG9jYWwgZ2VvX29rLCBnZW8gPSBwY2FsbChyZXF1aXJlLCAib3BlbnNoaXAuZ2VvX2NvdW50cnkiKQppZiBub3QgZ2VvX29rIHRoZW4KICAgIGdlbyA9IG5pbAogICAgbmd4LmxvZyhuZ3guV0FSTiwgIltzaXRlX2xvZ2dlcl0gZ2VvX2NvdW50cnkgbW9kdWxlIG5vdCBhdmFpbGFibGUuIEdlb0lQIGRpc2FibGVkLiIpCmVuZAoKLS0gU0FGRSBMT0FEOiBQaXBlIG1vZHVsZSAocGVyLXdvcmtlciwgY2FjaGVkIGJ5IHJlcXVpcmUpCmxvY2FsIHBpcGVfb2ssIHBpcGVfbG9nID0gcGNhbGwocmVxdWlyZSwgIm9wZW5zaGlwLnBpcGVfbG9nIikKaWYgbm90IHBpcGVfb2sgdGhlbiBwaXBlX2xvZyA9IG5pbCBlbmQKCmxvY2FsIGFuYWx5dGljcyAgICA9IG5neC5zaGFyZWQuYW5hbHl0aWNzCmxvY2FsIHJlcXVlc3RfZGF0YSA9IG5neC5zaGFyZWQucmVxdWVzdF9kYXRhCmlmIG5vdCBhbmFseXRpY3Mgb3Igbm90IHJlcXVlc3RfZGF0YSB0aGVuIHJldHVybiBlbmQKCi0tIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKbG9jYWwgZnVuY3Rpb24gbm9ybWFsaXplKGhvc3QpCiAgICBpZiBub3QgaG9zdCB0aGVuIHJldHVybiBuaWwgZW5kCiAgICBsb2NhbCBoID0gaG9zdDpsb3dlcigpCiAgICBpZiBoOnN1YigxLCA0KSA9PSAid3d3LiIgdGhlbiBoID0gaDpzdWIoNSkgZW5kCiAgICByZXR1cm4gaAplbmQKCmxvY2FsIF9kYXkgPSB7IHN0ciA9ICIiLCB0cyA9IDAgfQpsb2NhbCBmdW5jdGlvbiB0b2RheSgpCiAgICBsb2NhbCBub3cgPSBuZ3gubm93KCkKICAgIGlmIG5vdyAtIF9kYXkudHMgPiA2MCB0aGVuCiAgICAgICAgX2RheS5zdHIgPSBvcy5kYXRlKCIhJVklbSVkIiwgbm93KQogICAgICAgIF9kYXkudHMgPSBub3cKICAgIGVuZAogICAgcmV0dXJuIF9kYXkuc3RyCmVuZAoKLS0gRmFzdCBjaGVjayBpZiBVUkkgaXMgYSBzdGF0aWMgYXNzZXQgKGZvciB1bmlxdWVfcmVxdWVzdHMgY291bnRlcikKbG9jYWwgZnVuY3Rpb24gaXNfc3RhdGljX2Fzc2V0KHUpCiAgICBsb2NhbCBsb3dlciA9IHU6bG93ZXIoKQoKICAgIC0tIFN0YXRpYyBmaWxlIGV4dGVuc2lvbnMKICAgIGlmIGxvd2VyOm1hdGNoKCIlLmpzJCIpIG9yIGxvd2VyOm1hdGNoKCIlLmNzcyQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUuanBnJCIpIG9yIGxvd2VyOm1hdGNoKCIlLmpwZWckIikgb3IKICAgICAgIGxvd2VyOm1hdGNoKCIlLnBuZyQiKSBvciBsb3dlcjptYXRjaCgiJS5naWYkIikgb3IKICAgICAgIGxvd2VyOm1hdGNoKCIlLnN2ZyQiKSBvciBsb3dlcjptYXRjaCgiJS53ZWJwJCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS5pY28kIikgb3IgbG93ZXI6bWF0Y2goIiUuYm1wJCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS53b2ZmMj8kIikgb3IgbG93ZXI6bWF0Y2goIiUudHRmJCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS5lb3QkIikgb3IgbG93ZXI6bWF0Y2goIiUub3RmJCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS5tcDQkIikgb3IgbG93ZXI6bWF0Y2goIiUud2VibSQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUubXAzJCIpIG9yIGxvd2VyOm1hdGNoKCIlLndhdiQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUucGRmJCIpIG9yIGxvd2VyOm1hdGNoKCIlLnppcCQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUudGFyJCIpIG9yIGxvd2VyOm1hdGNoKCIlLmd6JCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS54bWwkIikgb3IgbG93ZXI6bWF0Y2goIiUuanNvbiQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUudHh0JCIpIG9yIGxvd2VyOm1hdGNoKCIlLm1hcCQiKSB0aGVuCiAgICAgICAgcmV0dXJuIHRydWUKICAgIGVuZAoKICAgIC0tIENvbW1vbiBzdGF0aWMgcGF0aHMKICAgIGlmIGxvd2VyOm1hdGNoKCJeL19uZXh0L3N0YXRpYy8iKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIl4vc3RhdGljLyIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiXi9hc3NldHMvIikgb3IKICAgICAgIGxvd2VyOm1hdGNoKCJeL3B1YmxpYy8iKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIi9mYXZpY29uJS5pY28iKSB0aGVuCiAgICAgICAgcmV0dXJuIHRydWUKICAgIGVuZAoKICAgIHJldHVybiBmYWxzZQplbmQKCmxvY2FsIFJJTkcgICA9IDEwMDAKbG9jYWwgRDI0SCAgID0gODY0MDAKbG9jYWwgRDQ4SCAgID0gMTcyODAwCmxvY2FsIEQxSCAgICA9IDM2MDAKCi0tIOKUgOKUgCBDYXB0dXJlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKbG9jYWwgaG9zdCA9IG5vcm1hbGl6ZShuZ3gudmFyLmhvc3QpCmlmIG5vdCBob3N0IHRoZW4gcmV0dXJuIGVuZAoKbG9jYWwgaXAgICAgICA9IG5neC52YXIucmVtb3RlX2FkZHIgICAgb3IgIjAuMC4wLjAiCmxvY2FsIHRzICAgICAgPSBuZ3gubm93KCkKbG9jYWwgdWEgICAgICA9IG5neC52YXIuaHR0cF91c2VyX2FnZW50IG9yICIiCmxvY2FsIHVyaSAgICAgPSBuZ3gudmFyLnJlcXVlc3RfdXJpICAgIG9yICIvIgpsb2NhbCByZXFfbGVuID0gdG9udW1iZXIobmd4LnZhci5yZXF1ZXN0X2xlbmd0aCkgb3IgMApsb2NhbCBieXRlcyAgID0gdG9udW1iZXIobmd4LnZhci5ieXRlc19zZW50KSAgICAgb3IgMApsb2NhbCBydCAgICAgID0gdG9udW1iZXIobmd4LnZhci5yZXF1ZXN0X3RpbWUpICAgb3IgMCAgLS0gc2Vjb25kcyAoZmxvYXQpCmxvY2FsIG1ldGhvZCAgPSBuZ3gudmFyLnJlcXVlc3RfbWV0aG9kIG9yICJHRVQiCmxvY2FsIHN0YXR1cyAgPSBuZ3gudmFyLnN0YXR1cyAgICAgICAgIG9yICIwIgoKLS0g4pSA4pSAIDEuIE1pbnV0ZS1idWNrZXQgY291bnRlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpsb2NhbCBtaW51dGUgPSBtYXRoLmZsb29yKHRzIC8gNjApCmxvY2FsIHAgPSAiczoiIC4uIGhvc3QgLi4gIjoiIC4uIG1pbnV0ZQoKYW5hbHl0aWNzOmluY3IocCAuLiAiOnIiLCAxLCAgICAgIDAsIEQyNEgpCmFuYWx5dGljczppbmNyKHAgLi4gIjppIiwgcmVxX2xlbiwgMCwgRDI0SCkKYW5hbHl0aWNzOmluY3IocCAuLiAiOm8iLCBieXRlcywgICAwLCBEMjRIKQoKLS0gUmVzcG9uc2UgdGltZSBhcyBmbG9hdCBzZWNvbmRzIChtYXRjaGVzIG9yaWdpbmFsIHByZWNpc2lvbikKaWYgcnQgPiAwIHRoZW4KICAgIC0tIHNhZmVfYWRkIGluaXRpYWxpemVzLCBpbmNyIGFkZHMgLSBlbXVsYXRlIEhJTkNSQllGTE9BVCB3aXRoIGludGVnZXIgbWljcm9zCiAgICBsb2NhbCBydF91cyA9IG1hdGguZmxvb3IocnQgKiAxMDAwMDAwKQogICAgYW5hbHl0aWNzOmluY3IocCAuLiAiOnQiLCBydF91cywgMCwgRDI0SCkKZW5kCgotLSBVbmlxdWUgKG5vbi1zdGF0aWMpIHJlcXVlc3QgY291bnRlcgppZiBub3QgaXNfc3RhdGljX2Fzc2V0KHVyaSkgdGhlbgogICAgYW5hbHl0aWNzOmluY3IocCAuLiAiOnUiLCAxLCAwLCBEMjRIKQplbmQKCi0tIOKUgOKUgCAyLiBMaWZldGltZSB0b3RhbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgphbmFseXRpY3M6aW5jcigidDoiIC4uIGhvc3QgLi4gIjpyIiwgMSwgICAgICAgMCkKYW5hbHl0aWNzOmluY3IoInQ6IiAuLiBob3N0IC4uICI6aSIsIHJlcV9sZW4sIDApCmFuYWx5dGljczppbmNyKCJ0OiIgLi4gaG9zdCAuLiAiOm8iLCBieXRlcywgICAwKQoKLS0gRG9tYWluIGluZGV4IChzZXQgb25jZSwgaWdub3JlIHN1YnNlcXVlbnQgImV4aXN0cyIgZXJyb3JzKQphbmFseXRpY3M6c2FmZV9hZGQoImQ6IiAuLiBob3N0LCAxKQoKLS0g4pSA4pSAIDMuIEdlb0lQIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKaWYgZ2VvIHRoZW4KICAgIGxvY2FsIGNjID0gZ2VvLmdldF9jb3VudHJ5X2NvZGUoaXApCiAgICBpZiBjYyBhbmQgY2Mgfj0gIiIgdGhlbgogICAgICAgIC0tIERhaWx5IGdlbyAoZm9yIC9hbmFseXRpY3MvZ2VvIGVuZHBvaW50KQogICAgICAgIGFuYWx5dGljczppbmNyKCJnOiIgLi4gaG9zdCAuLiAiOiIgLi4gdG9kYXkoKSAuLiAiOiIgLi4gY2MsIDEsIDAsIEQ0OEgpCiAgICAgICAgLS0gUGVyLW1pbnV0ZSBnZW8gKGZvciB0aW1lLXNlcmllcyBjb3VudHJ5IGJyZWFrZG93bikKICAgICAgICBhbmFseXRpY3M6aW5jcigiYzoiIC4uIGhvc3QgLi4gIjoiIC4uIG1pbnV0ZSAuLiAiOiIgLi4gY2MsIDEsIDAsIEQyNEgpCiAgICBlbmQKZW5kCgotLSDilIDilIAgNC4gUmF3IHJlcXVlc3QgcmluZyBidWZmZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpwY2FsbChmdW5jdGlvbigpCiAgICBsb2NhbCBva19qLCBqID0gcGNhbGwoY2pzb24uZW5jb2RlLCB7CiAgICAgICAgaXAgICAgID0gaXAsCiAgICAgICAgdHMgICAgID0gdHMsCiAgICAgICAgbWV0aG9kID0gbWV0aG9kLAogICAgICAgIHN0YXR1cyA9IHN0YXR1cywKICAgICAgICB1cmkgICAgPSB1cmksCiAgICAgICAgdWEgICAgID0gdWEsCiAgICAgICAgYndfaW4gID0gcmVxX2xlbiwKICAgICAgICBid19vdXQgPSBieXRlcywKICAgICAgICBydCAgICAgPSBydCwKICAgIH0pCiAgICBpZiBva19qIGFuZCBqIHRoZW4KICAgICAgICBsb2NhbCBzZXEgID0gcmVxdWVzdF9kYXRhOmluY3IoInJsb2c6IiAuLiBob3N0IC4uICI6c2VxIiwgMSwgMCkKICAgICAgICBsb2NhbCBzbG90ID0gc2VxICUgUklORwogICAgICAgIHJlcXVlc3RfZGF0YTpzZXQoInJsb2c6IiAuLiBob3N0IC4uICI6IiAuLiBzbG90LCBqLCBEMUgpCiAgICBlbmQKZW5kKQoKLS0g4pSA4pSAIDUuIExpdmUtbG9nIHBpcGUgKG9ubHkgd2hlbiBhIHN1YnNjcmliZXIgaXMgd2F0Y2hpbmcpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAotLSBGaXJlIHZpYSB0aW1lciB0byBhdm9pZCBibG9ja2luZyB0aGUgbG9nIHBoYXNlCgppZiBwaXBlX2xvZyBhbmQgcGlwZV9sb2cucGlwZV9yZXF1ZXN0X2xvZwogICBhbmQgcmVxdWVzdF9kYXRhOmdldCgibG9nX3BpcGU6c3ViOiIgLi4gaG9zdCkgdGhlbgogICAgbmd4LnRpbWVyLmF0KDAsIHBpcGVfbG9nLnBpcGVfcmVxdWVzdF9sb2csCiAgICAgICAgICAgICAgICAgaG9zdCwgaXAsIHRzLCB1YSwgdXJpLCByZXFfbGVuLCBieXRlcywgcnQsIG1ldGhvZCwgc3RhdHVzKQplbmQK",
20
+ "webhook_handler.lua": "LS0gd2ViaG9va19oYW5kbGVyLmx1YQotLSBIYW5kbGVzIGluY29taW5nIHdlYmhvb2sgZXZlbnRzIGZvcndhcmRlZCBmcm9tIHRoZSBTYWFTIGVkZ2UuCi0tIEludGVybmFsIG1hbmFnZW1lbnQgcG9ydCBvbmx5ICgxMjcuMC4wLjE6OTE0NSkuCi0tCi0tIFJvdXRlczoKLS0gICBQT1NUIC9faG9va3MvcHVzaCAgICAgICAgICAtIHJlY2VpdmUgYSBmb3J3YXJkZWQgR2l0SHViIHB1c2ggZXZlbnQKLS0gICBHRVQgIC9faG9va3MvcGVuZGluZyAgICAgICAtIGZldGNoIHN0b3JlZCBldmVudHMgKGZvciBsb2NhbCBhcHAgcG9sbGluZykKLS0gICBQT1NUIC9faG9va3MvYWNrICAgICAgICAgICAtIGFja25vd2xlZGdlIGNvbnN1bWVkIGV2ZW50cwotLQotLSBCZWhhdmlvciBvbiBQT1NUIC9faG9va3MvcHVzaDoKLS0gICAxLiBUcnkgdG8gcHJveHkgdG8gYSBsb2NhbCBPcGVuc2hpcCBBUEkgKGNvbmZpZ3VyYWJsZSB2aWEgWC1PcGVuc2hpcC1VcmwgaGVhZGVyKQotLSAgIDIuIElmIE9wZW5zaGlwIGlzIG5vdCByZWFjaGFibGUsIHN0b3JlIHRoZSBldmVudCBpbiBzaGFyZWQgZGljdCBmb3IgbGF0ZXIgcG9sbGluZwoKbG9jYWwgY2pzb24gPSByZXF1aXJlICJjanNvbi5zYWZlIgoKbG9jYWwgd2ViaG9va19ldmVudHMgPSBuZ3guc2hhcmVkLndlYmhvb2tfZXZlbnRzCmxvY2FsIHVyaSAgICAgICAgICAgID0gbmd4LnZhci51cmkKbG9jYWwgbWV0aG9kICAgICAgICAgPSBuZ3gucmVxLmdldF9tZXRob2QoKQoKbG9jYWwgZnVuY3Rpb24ganNvbl9yZXNwb25zZShkYXRhLCBjb2RlKQogICAgbmd4LnN0YXR1cyA9IGNvZGUgb3IgMjAwCiAgICBuZ3guaGVhZGVyWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIgogICAgbmd4LnNheShjanNvbi5lbmNvZGUoZGF0YSkpCiAgICByZXR1cm4gbmd4LmV4aXQobmd4LnN0YXR1cykKZW5kCgotLSDilIDilIAgUE9TVCAvX2hvb2tzL3B1c2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tIFJlY2VpdmVzIGZvcndhcmRlZCB3ZWJob29rIHBheWxvYWQgZnJvbSBTYWFTLgotLSBIZWFkZXJzOgotLSAgIFgtT3BlbnNoaXAtVXJsOiBodHRwOi8vMTI3LjAuMC4xOjM0NTYgKGlmIE9wZW5zaGlwIHJ1bnMgb24gdGhpcyBzZXJ2ZXIpCi0tICAgWC1Ib29rLUlkOiB0aGUgc3Vic2NyaXB0aW9uIGhvb2tJZCAoZm9yIGNvcnJlbGF0aW9uKQoKaWYgdXJpID09ICIvX2hvb2tzL3B1c2giIGFuZCBtZXRob2QgPT0gIlBPU1QiIHRoZW4KICAgIG5neC5yZXEucmVhZF9ib2R5KCkKICAgIGxvY2FsIGJvZHkgPSBuZ3gucmVxLmdldF9ib2R5X2RhdGEoKQogICAgaWYgbm90IGJvZHkgdGhlbgogICAgICAgIHJldHVybiBqc29uX3Jlc3BvbnNlKHsgZXJyb3IgPSAiZW1wdHkgYm9keSIgfSwgNDAwKQogICAgZW5kCgogICAgbG9jYWwgb3BlbnNoaXBfdXJsID0gbmd4LnJlcS5nZXRfaGVhZGVycygpWyJ4LW9wZW5zaGlwLXVybCJdCgogICAgLS0gSWYgT3BlbnNoaXAgcnVucyBvbiB0aGlzIHNlcnZlciwgcHJveHkgZGlyZWN0bHkKICAgIGlmIG9wZW5zaGlwX3VybCBhbmQgb3BlbnNoaXBfdXJsIH49ICIiIHRoZW4KICAgICAgICBsb2NhbCBodHRwID0gcmVxdWlyZSAicmVzdHkuaHR0cCIKICAgICAgICBsb2NhbCBodHRwYyA9IGh0dHAubmV3KCkKICAgICAgICBodHRwYzpzZXRfdGltZW91dCg1MDAwKQoKICAgICAgICBsb2NhbCB0YXJnZXQgPSBvcGVuc2hpcF91cmwgLi4gIi9hcGkvd2ViaG9va3MvcHVzaCIKICAgICAgICBsb2NhbCByZXMsIGVyciA9IGh0dHBjOnJlcXVlc3RfdXJpKHRhcmdldCwgewogICAgICAgICAgICBtZXRob2QgID0gIlBPU1QiLAogICAgICAgICAgICBib2R5ICAgID0gYm9keSwKICAgICAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgICAgIFsiQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgICAgICAgICBbIlgtSG9vay1JZCJdICAgID0gbmd4LnJlcS5nZXRfaGVhZGVycygpWyJ4LWhvb2staWQiXSBvciAiIiwKICAgICAgICAgICAgfSwKICAgICAgICB9KQoKICAgICAgICBpZiByZXMgYW5kIHJlcy5zdGF0dXMgPCA1MDAgdGhlbgogICAgICAgICAgICAtLSBPcGVuc2hpcCBoYW5kbGVkIGl0ICgyeHggb3IgNHh4KQogICAgICAgICAgICByZXR1cm4ganNvbl9yZXNwb25zZSh7IG9rID0gdHJ1ZSwgcHJveGllZCA9IHRydWUsIHN0YXR1cyA9IHJlcy5zdGF0dXMgfSkKICAgICAgICBlbmQKCiAgICAgICAgLS0gT3BlbnNoaXAgdW5yZWFjaGFibGUgb3IgZXJyb3JlZCAtIGZhbGwgdGhyb3VnaCB0byBzdG9yZQogICAgZW5kCgogICAgLS0gU3RvcmUgZm9yIGxhdGVyIHBvbGxpbmcgYnkgbG9jYWwvZGVza3RvcCBhcHAKICAgIGxvY2FsIGV2ZW50X2lkID0gbmd4Lm5vdygpIC4uICI6IiAuLiBtYXRoLnJhbmRvbSgxMDAwMDAsIDk5OTk5OSkKICAgIGxvY2FsIGV2ZW50ID0gY2pzb24uZW5jb2RlKHsKICAgICAgICBpZCAgICAgICA9IGV2ZW50X2lkLAogICAgICAgIGhvb2tfaWQgID0gbmd4LnJlcS5nZXRfaGVhZGVycygpWyJ4LWhvb2staWQiXSBvciAiIiwKICAgICAgICBwYXlsb2FkICA9IGJvZHksCiAgICAgICAgcmVjZWl2ZWQgPSBuZ3gubm93KCksCiAgICB9KQoKICAgIC0tIFVzZSBhIHNsb3QtYmFzZWQgcmluZyBidWZmZXIgKG1heCAyMDAgZXZlbnRzKQogICAgbG9jYWwgbWF4X2V2ZW50cyA9IDIwMAogICAgbG9jYWwgaWR4ID0gd2ViaG9va19ldmVudHM6aW5jcigiX2lkeCIsIDEsIDApIG9yIDAKICAgIGxvY2FsIHNsb3QgPSAoaWR4ICUgbWF4X2V2ZW50cykKICAgIHdlYmhvb2tfZXZlbnRzOnNldCgiZXZ0OiIgLi4gc2xvdCwgZXZlbnQsIDM2MDApIC0tIDFoIFRUTAogICAgd2ViaG9va19ldmVudHM6c2V0KCJfY291bnQiLCBtYXRoLm1pbihpZHgsIG1heF9ldmVudHMpKQoKICAgIHJldHVybiBqc29uX3Jlc3BvbnNlKHsgb2sgPSB0cnVlLCBzdG9yZWQgPSB0cnVlLCBldmVudF9pZCA9IGV2ZW50X2lkIH0pCmVuZAoKLS0g4pSA4pSAIEdFVCAvX2hvb2tzL3BlbmRpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tIFJldHVybnMgc3RvcmVkIHdlYmhvb2sgZXZlbnRzIGZvciBsb2NhbCBhcHAgdG8gY29uc3VtZS4KCmlmIHVyaSA9PSAiL19ob29rcy9wZW5kaW5nIiBhbmQgbWV0aG9kID09ICJHRVQiIHRoZW4KICAgIGlmIG5vdCB3ZWJob29rX2V2ZW50cyB0aGVuCiAgICAgICAgcmV0dXJuIGpzb25fcmVzcG9uc2UoeyBldmVudHMgPSB7fSB9KQogICAgZW5kCgogICAgbG9jYWwgY291bnQgPSB3ZWJob29rX2V2ZW50czpnZXQoIl9jb3VudCIpIG9yIDAKICAgIGxvY2FsIGlkeCAgID0gd2ViaG9va19ldmVudHM6Z2V0KCJfaWR4Iikgb3IgMAogICAgbG9jYWwgZXZlbnRzID0ge30KCiAgICAtLSBSZWFkIGFsbCBzdG9yZWQgZXZlbnRzIChuZXdlc3QgZmlyc3QpCiAgICBsb2NhbCBtYXhfZXZlbnRzID0gMjAwCiAgICBsb2NhbCBzdGFydCA9IG1hdGgubWF4KDAsIGlkeCAtIGNvdW50KQogICAgZm9yIGkgPSBzdGFydCwgaWR4IC0gMSBkbwogICAgICAgIGxvY2FsIHNsb3QgPSBpICUgbWF4X2V2ZW50cwogICAgICAgIGxvY2FsIHJhdyA9IHdlYmhvb2tfZXZlbnRzOmdldCgiZXZ0OiIgLi4gc2xvdCkKICAgICAgICBpZiByYXcgdGhlbgogICAgICAgICAgICBsb2NhbCBwYXJzZWQgPSBjanNvbi5kZWNvZGUocmF3KQogICAgICAgICAgICBpZiBwYXJzZWQgdGhlbgogICAgICAgICAgICAgICAgZXZlbnRzWyNldmVudHMgKyAxXSA9IHBhcnNlZAogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgIGVuZAoKICAgIHJldHVybiBqc29uX3Jlc3BvbnNlKHsgZXZlbnRzID0gZXZlbnRzIH0pCmVuZAoKLS0g4pSA4pSAIFBPU1QgL19ob29rcy9hY2sg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tIEFja25vd2xlZGdlIGV2ZW50cyBoYXZlIGJlZW4gY29uc3VtZWQgLSBjbGVhcnMgdGhlIHN0b3JlLgoKaWYgdXJpID09ICIvX2hvb2tzL2FjayIgYW5kIG1ldGhvZCA9PSAiUE9TVCIgdGhlbgogICAgaWYgd2ViaG9va19ldmVudHMgdGhlbgogICAgICAgIHdlYmhvb2tfZXZlbnRzOmZsdXNoX2FsbCgpCiAgICAgICAgd2ViaG9va19ldmVudHM6Zmx1c2hfZXhwaXJlZCgpCiAgICBlbmQKICAgIHJldHVybiBqc29uX3Jlc3BvbnNlKHsgb2sgPSB0cnVlIH0pCmVuZAoKLS0g4pSA4pSAIEZhbGxiYWNrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApyZXR1cm4ganNvbl9yZXNwb25zZSh7IGVycm9yID0gIm5vdCBmb3VuZCIgfSwgNDA0KQo="
21
+ };
22
+
23
+ // ../../packages/adapters/src/infra/openresty-lua.ts
24
+ var OPENRESTY_LUA_DIR = "/usr/local/openresty/site/lualib/openship";
25
+ var LUA_LOGGER_PATH = `${OPENRESTY_LUA_DIR}/site_logger.lua`;
26
+ var RULES_GUARD_PATH = `${OPENRESTY_LUA_DIR}/rules_guard.lua`;
27
+ var OPENRESTY_MGMT_PORT = 9145;
28
+ var OPENRESTY_DEFAULT_PATHS = {
29
+ bin: "/usr/local/openresty/bin/openresty",
30
+ confPath: "/usr/local/openresty/nginx/conf/nginx.conf",
31
+ confDir: "/usr/local/openresty/nginx/conf",
32
+ sitesDir: "/usr/local/openresty/nginx/conf/sites-enabled",
33
+ pidPath: "/usr/local/openresty/nginx/logs/nginx.pid"
34
+ };
35
+ var KNOWN_CONF_PATHS = [
36
+ "/usr/local/openresty/nginx/conf/nginx.conf",
37
+ "/etc/openresty/nginx.conf",
38
+ "/etc/nginx/nginx.conf"
39
+ ];
40
+ async function detectOpenRestyPaths(executor) {
41
+ const raw = await executor.exec("openresty -V 2>&1 || true");
42
+ const parseFlag = (flag) => {
43
+ const m = raw.match(new RegExp(`--${flag}=([^\\s]+)`));
44
+ return m ? m[1] : null;
45
+ };
46
+ const bin = parseFlag("sbin-path") ?? OPENRESTY_DEFAULT_PATHS.bin;
47
+ let confPath = parseFlag("conf-path") ?? OPENRESTY_DEFAULT_PATHS.confPath;
48
+ const pidPath = parseFlag("pid-path") ?? OPENRESTY_DEFAULT_PATHS.pidPath;
49
+ if (!await executor.exists(confPath)) {
50
+ let found = false;
51
+ for (const candidate of KNOWN_CONF_PATHS) {
52
+ if (candidate !== confPath && await executor.exists(candidate)) {
53
+ confPath = candidate;
54
+ found = true;
55
+ break;
56
+ }
57
+ }
58
+ if (!found) {
59
+ }
60
+ }
61
+ const confDir = confPath.replace(/\/[^/]+$/, "");
62
+ return {
63
+ bin,
64
+ confPath,
65
+ confDir,
66
+ sitesDir: `${confDir}/sites-enabled`,
67
+ pidPath
68
+ };
69
+ }
70
+ function buildReloadCommand(paths) {
71
+ return `${paths.bin} -t 2>&1 || exit 1
72
+
73
+ if ${paths.bin} -s reload 2>/dev/null; then
74
+ exit 0
75
+ fi
76
+
77
+ pkill -f '[o]penresty' >/dev/null 2>&1 || true
78
+ pkill -f '[n]ginx' >/dev/null 2>&1 || true
79
+ sleep 1
80
+ rm -f ${paths.pidPath}
81
+ ${paths.bin}`;
82
+ }
83
+ async function ensureOpenRestyConfig(executor, paths) {
84
+ await executor.mkdir(paths.sitesDir);
85
+ await executor.mkdir("/var/www/acme");
86
+ const pidDir = paths.pidPath.replace(/\/[^/]+$/, "");
87
+ await executor.mkdir(pidDir);
88
+ await executor.writeFile(`${paths.sitesDir}/_management.conf`, MANAGEMENT_BLOCK);
89
+ await executor.writeFile(`${paths.sitesDir}/_default.conf`, DEFAULT_BLOCK);
90
+ if (!await executor.exists(paths.confPath)) {
91
+ await executor.mkdir(paths.confDir);
92
+ await executor.writeFile(
93
+ paths.confPath,
94
+ MINIMAL_NGINX_CONF(paths.confDir, paths.sitesDir)
95
+ );
96
+ return;
97
+ }
98
+ const hasCorrectInclude = await executor.exec(`grep -qF 'include ${paths.sitesDir}/' ${paths.confPath}`).then(() => true).catch(() => false);
99
+ if (!hasCorrectInclude) {
100
+ const hasWrongInclude = await executor.exec(`grep -q 'include.*sites-enabled' ${paths.confPath}`).then(() => true).catch(() => false);
101
+ if (hasWrongInclude) {
102
+ await executor.exec(
103
+ `sed -i 's|include.*/sites-enabled/\\*\\.conf;|include ${paths.sitesDir}/*.conf;|' ${paths.confPath}`
104
+ );
105
+ } else {
106
+ await executor.exec(
107
+ `sed -i '/http *{/a \\ include ${paths.sitesDir}/*.conf;' ${paths.confPath}`
108
+ );
109
+ }
110
+ }
111
+ }
112
+ function MINIMAL_NGINX_CONF(confDir, sitesDir) {
113
+ return `# Auto-generated by Openship - safe to extend
114
+ worker_processes auto;
115
+ events {
116
+ worker_connections 1024;
117
+ }
118
+ http {
119
+ include ${confDir}/mime.types;
120
+ default_type application/octet-stream;
121
+ sendfile on;
122
+ keepalive_timeout 65;
123
+ include ${sitesDir}/*.conf;
124
+ }
125
+ `;
126
+ }
127
+ var GEOIP_DIR = "/usr/share/GeoIP";
128
+ var GEOIP_DB_PATH = `${GEOIP_DIR}/GeoLite2-Country.mmdb`;
129
+ var GEOIP_DB_URL = "https://github.com/P3TERX/GeoLite.mmdb/releases/download/2026.04.07/GeoLite2-Country.mmdb";
130
+ var LUA_SRC_DIR = process.env.OPENSHIP_LUA_DIR?.trim() || join(dirname(fileURLToPath(import.meta.url)), "lua");
131
+ var VHOST_REFERENCED_LUA = ["rules_guard.lua", "rules_lib.lua", "site_logger.lua"];
132
+ function luaSourceAvailable() {
133
+ return VHOST_REFERENCED_LUA.every(
134
+ (f) => EMBEDDED_LUA[f] !== void 0 || existsSync(join(LUA_SRC_DIR, f))
135
+ );
136
+ }
137
+ function readLua(filename) {
138
+ const onDisk = join(LUA_SRC_DIR, filename);
139
+ if (existsSync(onDisk)) return readFileSync(onDisk, "utf-8");
140
+ const embedded = EMBEDDED_LUA[filename];
141
+ if (embedded !== void 0) return Buffer.from(embedded, "base64").toString("utf-8");
142
+ throw new Error(
143
+ `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\`.`
144
+ );
145
+ }
146
+ var MANAGEMENT_BLOCK = `# Openship internal management - analytics & live-log streaming
147
+ # Auto-generated - do not edit manually
148
+ server {
149
+ listen 127.0.0.1:${OPENRESTY_MGMT_PORT};
150
+
151
+ # Long-running Lua content handlers need generous timeouts
152
+ send_timeout 3600s;
153
+ keepalive_timeout 3600s;
154
+ lua_check_client_abort on;
155
+
156
+ # SSE live-log stream (long-lived connection)
157
+ location = /logs/stream {
158
+ content_by_lua_file ${OPENRESTY_LUA_DIR}/pipe_stream.lua;
159
+ }
160
+
161
+ # REST analytics + health (short-lived)
162
+ location / {
163
+ content_by_lua_file ${OPENRESTY_LUA_DIR}/mgmt_api.lua;
164
+ }
165
+ }
166
+ `;
167
+ var ACME_HTTP01_PORT = 49180;
168
+ var ACME_CHALLENGE_LOCATION = ` location /.well-known/acme-challenge/ {
169
+ proxy_pass http://127.0.0.1:${ACME_HTTP01_PORT};
170
+ proxy_set_header Host $host;
171
+ }`;
172
+ var DEFAULT_BLOCK = `# Openship default catch-all - prevents the stock OpenResty welcome page AND
173
+ # stops an unmatched Host/SNI from being served the first real vhost by default.
174
+ # Auto-generated - do not edit manually
175
+ server {
176
+ listen 80 default_server;
177
+ server_name _;
178
+
179
+ ${ACME_CHALLENGE_LOCATION}
180
+
181
+ location / {
182
+ return 404;
183
+ }
184
+ }
185
+
186
+ # HTTPS catch-all. WITHOUT a 443 default_server, nginx serves the first-loaded
187
+ # 443 vhost to any request whose SNI matches no server_name - so a domain we do
188
+ # NOT route (removed / never-added / just pointed at this IP) silently gets some
189
+ # other app's cert + backend. That is cross-serving, a security hole. Owning the
190
+ # 443 default and rejecting unknown SNI closes it: an unrouted host gets a TLS
191
+ # handshake failure, never a fallthrough. ssl_reject_handshake (OpenResty/nginx
192
+ # >= 1.19.4; our installer pulls the newest LTS) needs no certificate.
193
+ server {
194
+ listen 443 ssl default_server;
195
+ ssl_reject_handshake on;
196
+ }
197
+ `;
198
+ var LUA_SCRIPTS = [
199
+ "site_logger.lua",
200
+ "pipe_log.lua",
201
+ "pipe_stream.lua",
202
+ "mgmt_api.lua",
203
+ "geo_country.lua",
204
+ "rules_lib.lua",
205
+ "rules_guard.lua"
206
+ ];
207
+ var LUA_VERSION_MARKER = `${OPENRESTY_LUA_DIR}/.openship-lua-version`;
208
+ function luaBundleHash() {
209
+ const h = createHash("sha256");
210
+ for (const name of LUA_SCRIPTS) {
211
+ h.update(name);
212
+ h.update("\0");
213
+ h.update(readLua(name));
214
+ h.update("\0");
215
+ }
216
+ return h.digest("hex");
217
+ }
218
+ async function ensureLuaScripts(executor, paths) {
219
+ try {
220
+ if (!luaSourceAvailable()) {
221
+ console.error(
222
+ "[openresty] Lua unavailable in this build (not on disk or embedded) \u2014 edge rules/logging disabled. Run `bun run embed:lua` in packages/adapters."
223
+ );
224
+ return { repaired: [], available: false };
225
+ }
226
+ const expected = luaBundleHash();
227
+ await executor.mkdir(OPENRESTY_LUA_DIR);
228
+ const listing = await executor.exec(`ls -1 '${OPENRESTY_LUA_DIR}' 2>/dev/null || true`).catch(() => "");
229
+ const present = new Set(listing.split("\n").map((s) => s.trim()).filter(Boolean));
230
+ const missing = LUA_SCRIPTS.filter((name) => !present.has(name));
231
+ const onBoxVersion = (await executor.readFile(LUA_VERSION_MARKER).catch(() => "")).trim();
232
+ if (missing.length === 0 && onBoxVersion === expected) {
233
+ return { repaired: [], available: true };
234
+ }
235
+ for (const name of LUA_SCRIPTS) {
236
+ await executor.writeFile(`${OPENRESTY_LUA_DIR}/${name}`, readLua(name));
237
+ }
238
+ await executor.writeFile(LUA_VERSION_MARKER, expected);
239
+ const reason = missing.length ? `missing: ${missing.join(", ")}` : "version changed";
240
+ console.warn(`[openresty] (re)installed Lua (${reason}) \u2014 reloading edge.`);
241
+ await executor.exec(buildReloadCommand(paths)).catch((err) => {
242
+ console.error(`[openresty] reload after Lua (re)install failed: ${safeErrorMessage(err)}`);
243
+ });
244
+ return { repaired: missing.length ? missing : [...LUA_SCRIPTS], available: true };
245
+ } catch (err) {
246
+ console.error(`[openresty] ensureLuaScripts failed (deploy continues): ${safeErrorMessage(err)}`);
247
+ return { repaired: [], available: false };
248
+ }
249
+ }
250
+ async function installGeoDeps(executor) {
251
+ try {
252
+ const hasPkg = async (cmd) => {
253
+ try {
254
+ await executor.exec(`command -v ${cmd}`);
255
+ return true;
256
+ } catch {
257
+ return false;
258
+ }
259
+ };
260
+ if (await hasPkg("apt-get")) {
261
+ await executor.exec(
262
+ "apt-get update -qq && apt-get install -y -qq libmaxminddb0 libmaxminddb-dev"
263
+ );
264
+ } else if (await hasPkg("dnf")) {
265
+ await executor.exec("dnf install -y libmaxminddb libmaxminddb-devel");
266
+ } else if (await hasPkg("yum")) {
267
+ await executor.exec("yum install -y libmaxminddb libmaxminddb-devel");
268
+ }
269
+ } catch {
270
+ }
271
+ try {
272
+ await executor.exec(
273
+ "opm get anjia0532/lua-resty-maxminddb"
274
+ );
275
+ } catch {
276
+ try {
277
+ await executor.exec(
278
+ "/usr/local/openresty/bin/opm get anjia0532/lua-resty-maxminddb"
279
+ );
280
+ } catch {
281
+ }
282
+ }
283
+ try {
284
+ const exists = await executor.exists(GEOIP_DB_PATH);
285
+ if (!exists) {
286
+ await executor.mkdir(GEOIP_DIR);
287
+ await executor.exec(
288
+ `curl -fsSL -o ${GEOIP_DB_PATH} "${GEOIP_DB_URL}"`
289
+ );
290
+ }
291
+ } catch {
292
+ }
293
+ }
294
+ async function deployLuaScripts(executor, paths) {
295
+ await installGeoDeps(executor);
296
+ if (!luaSourceAvailable()) {
297
+ throw new Error(
298
+ `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.`
299
+ );
300
+ }
301
+ await executor.mkdir(OPENRESTY_LUA_DIR);
302
+ for (const name of LUA_SCRIPTS) {
303
+ await executor.writeFile(
304
+ `${OPENRESTY_LUA_DIR}/${name}`,
305
+ readLua(name)
306
+ );
307
+ }
308
+ await ensureOpenRestyConfig(executor, paths);
309
+ await executor.exec(
310
+ `grep -q 'lua_shared_dict analytics ' ${paths.confPath} || sed -i '/http *{/a \\ lua_shared_dict analytics 256m;' ${paths.confPath}`
311
+ );
312
+ await executor.exec(
313
+ `grep -q 'lua_shared_dict request_data ' ${paths.confPath} || sed -i '/http *{/a \\ lua_shared_dict request_data 128m;' ${paths.confPath}`
314
+ );
315
+ await executor.exec(
316
+ `grep -q 'lua_shared_dict rules ' ${paths.confPath} || sed -i '/http *{/a \\ lua_shared_dict rules 32m;' ${paths.confPath}`
317
+ );
318
+ await executor.exec(
319
+ `grep -q 'lua_shared_dict rl_counters ' ${paths.confPath} || sed -i '/http *{/a \\ lua_shared_dict rl_counters 16m;' ${paths.confPath}`
320
+ );
321
+ await executor.exec(
322
+ `grep -q 'lua_package_path' ${paths.confPath} || sed -i '/http *{/a \\ lua_package_path "/usr/local/openresty/site/lualib/?.lua;;";' ${paths.confPath}`
323
+ );
324
+ await executor.exec(buildReloadCommand(paths));
325
+ }
326
+
327
+ export {
328
+ OPENRESTY_LUA_DIR,
329
+ LUA_LOGGER_PATH,
330
+ RULES_GUARD_PATH,
331
+ OPENRESTY_MGMT_PORT,
332
+ OPENRESTY_DEFAULT_PATHS,
333
+ detectOpenRestyPaths,
334
+ buildReloadCommand,
335
+ ensureOpenRestyConfig,
336
+ luaSourceAvailable,
337
+ ACME_HTTP01_PORT,
338
+ ACME_CHALLENGE_LOCATION,
339
+ ensureLuaScripts,
340
+ deployLuaScripts
341
+ };