diff --git a/Gopkg.lock b/Gopkg.lock index 76d79d685358..7eed7a09826c 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,12 +2,12 @@ [[projects]] - digest = "1:ead04f9ace16628ccce53dc72f3db7de655d79dcc775286526b71941cc6f0470" + digest = "1:cb193a00b8b032b70a5bad3b57da90867fcfea7e3d23581e71dda50fca9cecd5" name = "cloud.google.com/go" packages = ["compute/metadata"] pruneopts = "" - revision = "ceeb313ad77b789a7fa5287b36a1d127b69b7093" - version = "v0.44.3" + revision = "e5804108aed715c49f731aab1a847f063fb23681" + version = "v0.50.0" [[projects]] digest = "1:1121bef61763f5752cb80633eedcb9a8476a14952b3d1096741512a4635c5df4" @@ -55,6 +55,25 @@ pruneopts = "" revision = "de5bf2ad457846296e2031421a34e2568e304e35" +[[projects]] + branch = "master" + digest = "1:a7f619ffc7b99687f9444bd0a07509fec8ae708a7175d234878129896c0918a8" + name = "github.com/alecthomas/template" + packages = [ + ".", + "parse", + ] + pruneopts = "" + revision = "fb15b899a75114aa79cc930e33c46b577cc664b1" + +[[projects]] + branch = "master" + digest = "1:9d943843b71c5d44f184893fcdbe419bf639fee8647ceeca4c7d4fd95923721c" + name = "github.com/alecthomas/units" + packages = ["."] + pruneopts = "" + revision = "f65c72e2690dc4b403c8bd637baf4611cd4c069b" + [[projects]] branch = "master" digest = "1:91c041d6454dbb9cfa1b3e024da74f93ef8de6c7e7ab822ef75ff961419e7490" @@ -78,7 +97,7 @@ revision = "2dd1f3f6b4deca27909682ef521086e5c721f522" [[projects]] - digest = "1:d54d0284d0851e6f9df56504d20dca52635a13787efadeaef281a3b6fe8b9b08" + digest = "1:7980af5e19c3739b07cc411ca5d59cb5851a359f6a070348aa23be387e3b8e7e" name = "github.com/aws/aws-sdk-go" packages = [ "aws", @@ -115,8 +134,8 @@ "service/sts/stsiface", ] pruneopts = "" - revision = "d57c8d96f72d9475194ccf18d2ba70ac294b0cb3" - version = "v1.23.13" + revision = "a1e6946e8014a793d989e64ef5566315010ce898" + version = "v1.27.0" [[projects]] digest = "1:ac2a05be7167c495fe8aaf8aaf62ecf81e78d2180ecb04e16778dc6c185c96a5" @@ -189,15 +208,15 @@ version = "v1.0.0" [[projects]] - digest = "1:7bb8712cb8f2c0b6a2aa63df15e861931c17cf7abb5caef59744278be2a122df" + digest = "1:03a98f5067540d81c4a163b21279c4ce5f158b78e9409921110635d2d7cb603d" name = "github.com/emicklei/go-restful" packages = [ ".", "log", ] pruneopts = "" - revision = "6ac3b8eb89d325e5c750d77f344a6870464d03c3" - version = "v2.9.6" + revision = "99f05a26a0a1c71e664ebe6a76d29b2c80333056" + version = "v2.11.1" [[projects]] digest = "1:f21c1a68814ffc02db479adbd973c710e0ece6150ddc0726655c0a2048299152" @@ -215,12 +234,12 @@ version = "v1.12.0" [[projects]] - digest = "1:46ddeb9dd35d875ac7568c4dc1fc96ce424e034bdbb984239d8ffc151398ec01" + digest = "1:cdcdaf690213dd7daa324a427928c6e7b062085c5fd6d4272db8fb0afba8dac3" name = "github.com/evanphx/json-patch" packages = ["."] pruneopts = "" - revision = "026c730a0dcc5d11f93f1cf1cc65b01247ea7b6f" - version = "v4.5.0" + revision = "bf22ed9311622d93e213ba31e4ae7a5771e5d379" + version = "v4.6.0" [[projects]] digest = "1:b13707423743d41665fd23f0c36b2f37bb49c30e94adb813319c44188a51ba22" @@ -231,36 +250,36 @@ version = "v1.0.0" [[projects]] - digest = "1:21911d0d3cecc86a42fd1920583c34a33b91035d77d4929772938961d7814ffc" + digest = "1:47688961daa2895c860642608d671822b7b53fed1e3e3e2d46506f01dcddaae3" name = "github.com/go-openapi/jsonpointer" packages = ["."] pruneopts = "" - revision = "a105a905c5e6ad147f08504784917f3e178e0ba5" - version = "v0.19.2" + revision = "ed123515f087412cd7ef02e49b0b0a5e6a79a360" + version = "v0.19.3" [[projects]] - digest = "1:6ec9ec804d37dfca7ce0e488844fb069cfe4e3eb60793d163279083b8ec61a8d" + digest = "1:69c513ad15614075cbb474bc636fbb901aa3e9273a6da3d583df76fa62ec83d3" name = "github.com/go-openapi/jsonreference" packages = ["."] pruneopts = "" - revision = "2903bfd4bfbaf188694f1edf731f2725a8fa344f" - version = "v0.19.2" + revision = "82f31475a8f7a12bc26962f6e26ceade8ea6f66a" + version = "v0.19.3" [[projects]] - digest = "1:0bf906c8db0e821fa588499950b59d349e4edccad44383c806319035b8bd5f89" + digest = "1:e06e05a14a9ef6d2efe6f558daa3015780dd298a794c73593be48bda250dc703" name = "github.com/go-openapi/spec" packages = ["."] pruneopts = "" - revision = "bdfd7e07daecc404d77868a88b2364d0aed0ee5a" - version = "v0.19.2" + revision = "772572fd19ebcc983369e53bfaed4bde2077fe0c" + version = "v0.19.5" [[projects]] - digest = "1:fb1a3f651afb10230982d116bef8cb05dff148c5d3243c8ed79ef78d51f1ebe7" + digest = "1:0491ae08e62617f50df181a7be17e57d091212df8aa1656b672698c36222cade" name = "github.com/go-openapi/swag" packages = ["."] pruneopts = "" - revision = "c3d0f7896d589f3babb99eea24bbc7de98108e72" - version = "v0.19.5" + revision = "8a84ec635f1b280a7062edeab609f0667a053248" + version = "v0.19.6" [[projects]] digest = "1:e692d16fdfbddb94e9e4886aaf6c08bdbae5cb4ac80651445de9181b371c6e46" @@ -271,26 +290,24 @@ version = "v1.4.1" [[projects]] - digest = "1:8a7fe65e9ac2612c4df602cc9f014a92406776d993ff0f28335e5a8831d87c53" + digest = "1:d69d2ba23955582a64e367ff2b0808cdbd048458c178cea48f11ab8c40bd7aea" name = "github.com/gogo/protobuf" packages = [ "proto", "sortkeys", ] pruneopts = "" - revision = "0ca988a254f991240804bf9821f3450d87ccbb1b" - version = "v1.3.0" + revision = "5628607bb4c51c3157aacc3a50f0ab707582b805" + version = "v1.3.1" [[projects]] digest = "1:b852d2b62be24e445fcdbad9ce3015b44c207815d631230dfce3f14e7803f5bf" name = "github.com/golang/protobuf" packages = [ + "descriptor", "jsonpb", "proto", "protoc-gen-go/descriptor", - "protoc-gen-go/generator", - "protoc-gen-go/generator/internal/remap", - "protoc-gen-go/plugin", "ptypes", "ptypes/any", "ptypes/duration", @@ -345,7 +362,7 @@ version = "v1.4.1" [[projects]] - digest = "1:0ebfd2f00a84ee4fb31913b49011b7fa2fb6b12040991d8b948db821a15f7f77" + digest = "1:a82fe90cbcaf5dfc8267a0b49e0ab0a67c636532c83b21326f5000817ef20d5b" name = "github.com/grpc-ecosystem/grpc-gateway" packages = [ "internal", @@ -353,8 +370,8 @@ "utilities", ] pruneopts = "" - revision = "471f45a5a99a578de7a8638dc7ed29e245bde097" - version = "v1.11.1" + revision = "f7120437bb4f6c71f7f5076ad65a45310de2c009" + version = "v1.12.1" [[projects]] digest = "1:0038a7f43b51c8b2a8cd03b5372e73f8eadfe156484c2ae8185ae836f8ebc2cd" @@ -376,12 +393,12 @@ version = "v0.5.3" [[projects]] - digest = "1:31bfd110d31505e9ffbc9478e31773bf05bf02adcaeb9b139af42684f9294c13" + digest = "1:6906c992632a66c125bd44e68a7abc354d9eda683e451b5c2d9b1614d15d4f18" name = "github.com/imdario/mergo" packages = ["."] pruneopts = "" - revision = "7c29201646fa3de8506f701213473dd407f19646" - version = "v0.3.7" + revision = "1afb36080aec31e0d1528973ebe6721b191b0369" + version = "v0.3.8" [[projects]] digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" @@ -418,12 +435,12 @@ revision = "c2b33e84" [[projects]] - digest = "1:e716a02584d94519e2ccf7ac461c4028da736d41a58c1ed95e641c1603bdb056" + digest = "1:fb8bce9822eac1e2aeee6c2621cf25c6dec8f8f5f50a09a4a894d7932bfb2106" name = "github.com/json-iterator/go" packages = ["."] pruneopts = "" - revision = "27518f6661eba504be5a7a9a9f6d9460d892ade3" - version = "v1.1.7" + revision = "acfec88f7a0d5140ace3dcdbee10184e3684a9e1" + version = "v1.1.9" [[projects]] digest = "1:91317956b340c9e61a4287fd94c870bfad3f1922280c3e0a65db91c29017e8de" @@ -442,7 +459,7 @@ version = "v1.0.2" [[projects]] - digest = "1:f4216047c24ab66fb757045febd7dac4edc6f4ad9f6c0063d0755d654d04f25e" + digest = "1:b424ab60bdff8b8899fa0b27c9b35083f2607fbbaa7b6430617c53ca4501d286" name = "github.com/lib/pq" packages = [ ".", @@ -450,12 +467,11 @@ "scram", ] pruneopts = "" - revision = "3427c32cb71afc948325f299f040e53c1dd78979" - version = "v1.2.0" + revision = "99274577be97ac9b1d95a2d61d566dc9b7cc6a54" + version = "v1.3.0" [[projects]] - branch = "master" - digest = "1:101e8200d89dcff2cec2522e427298045bea6d81ef71f8fe10810faeae741efc" + digest = "1:263db331ad7732d9d1e45003031dd3d6295c0c4be232f99596dde34fa51e3df9" name = "github.com/mailru/easyjson" packages = [ "buffer", @@ -463,7 +479,8 @@ "jwriter", ] pruneopts = "" - revision = "b2ccc519800e761ac8000b95e5d57c80a897ff9e" + revision = "1b2b06f5f209fea48ff5922d8bfb2b9ed5d8f00b" + version = "v0.7.0" [[projects]] digest = "1:63722a4b1e1717be7b98fc686e0b30d5e7f734b9e93d7dee86293b6deab7ea28" @@ -548,27 +565,28 @@ version = "v0.8.0" [[projects]] - branch = "master" - digest = "1:0a565f69553dd41b3de790fde3532e9237142f2637899e20cd3e7396f0c4f2f7" + digest = "1:ff7a5f44653e65cf1a0577bbe3f2cdaf514930348f6df581bbd687bbe35ead5b" name = "github.com/prometheus/client_model" packages = ["go"] pruneopts = "" - revision = "14fe0d1b01d4d5fc031dd4bec1823bd3ebbe8016" + revision = "d1d2010b5beead3fa1c5f271a5cf626e40b3ad6e" + version = "v0.1.0" [[projects]] - digest = "1:0f2cee44695a3208fe5d6926076641499c72304e6f015348c9ab2df90a202cdf" + digest = "1:8904acfa3ef080005c1fc0670ed0471739d1e211be5638cfa6af536b701942ae" name = "github.com/prometheus/common" packages = [ "expfmt", "internal/bitbucket.org/ww/goautoneg", + "log", "model", ] pruneopts = "" - revision = "31bed53e4047fd6c510e43a941f90cb31be0972a" - version = "v0.6.0" + revision = "287d3e634a1e550c9e463dd7e5a75a422c614505" + version = "v0.7.0" [[projects]] - digest = "1:e010d89927008cac947ad9650f643a1b2b668dde47adfe56664da8694c1541d1" + digest = "1:4c64aa254bc24990bc0216de9dd955ff83f061e9baac7ed2ffc293442ab7514a" name = "github.com/prometheus/procfs" packages = [ ".", @@ -576,16 +594,24 @@ "internal/util", ] pruneopts = "" - revision = "00ec24a6a2d86e7074629c8384715dbb05adccd8" - version = "v0.0.4" + revision = "6d489fc7f1d9cd890a250f3ea3431b1744b9623f" + version = "v0.0.8" + +[[projects]] + digest = "1:6bb048133650d1fb7fbff9fb3c35bd5c7e8653fc95c3bae6df94cd17d1580278" + name = "github.com/robfig/cron" + packages = ["."] + pruneopts = "" + revision = "45fbe1491cdd47d74d1bf1396286d67faee8b8b5" + version = "v3.0.0" [[projects]] - digest = "1:3962f553b77bf6c03fc07cd687a22dd3b00fe11aa14d31194f5505f5bb65cdc8" + digest = "1:f6f53c0657325168d1ee4b3b2cc87ec071c1c6edcef45f14d44be43d299a326a" name = "github.com/sergi/go-diff" packages = ["diffmatchpatch"] pruneopts = "" - revision = "1744e2970ca51c86172c8190fadad617561ed6e7" - version = "v1.0.0" + revision = "58c5cb1602ee9676b5d3590d782bedde80706fcc" + version = "v1.1.0" [[projects]] digest = "1:1a405cddcf3368445051fb70ab465ae99da56ad7be8d8ca7fc52159d1c2d873c" @@ -603,12 +629,12 @@ revision = "fe5e611709b0c57fa4a89136deaa8e1d4004d053" [[projects]] - digest = "1:cbaf13cdbfef0e4734ed8a7504f57fe893d471d62a35b982bf6fb3f036449a66" + digest = "1:688428eeb1ca80d92599eb3254bdf91b51d7e232fead3a73844c1f201a281e51" name = "github.com/spf13/pflag" packages = ["."] pruneopts = "" - revision = "298182f68c66c05229eb03ac171abe6e309ee79a" - version = "v1.0.3" + revision = "2e9d26c8c37aae03e3f9d4e90b7116f5accb7cab" + version = "v1.0.5" [[projects]] digest = "1:740b31391e4c3e4d2b5a20e1cbf2c2f7765275ead23945acc7669c36c0b8095a" @@ -645,12 +671,12 @@ version = "v1.4.0" [[projects]] - digest = "1:30e9a79822702670b96d3461aca7da11b8cc6e7954eb4e859e886559ed4802a4" + digest = "1:35b2645944efbeaa5b1fd221f064f791326c28ea8e3644526af4301ebf8fd62a" name = "github.com/tidwall/gjson" packages = ["."] pruneopts = "" - revision = "c5e72cdf74dff23857243dd662c465b810891c21" - version = "v1.3.2" + revision = "5c2e4b382486589dad7478130a364ee2fa6a068b" + version = "v1.3.5" [[projects]] digest = "1:72511ec1089fee111c995492d1d390a38ac7ab888aabdb1188985f2a1719c599" @@ -677,12 +703,12 @@ version = "v1.0.0" [[projects]] - digest = "1:1ad3ae8a5edf223abb8435e16ccc0696ce886c6f889e100809122e931e7423b2" + digest = "1:c8b536f08002f0916e288eb66b7d961e3a854542f50532255a7c737edd22987a" name = "github.com/valyala/fasttemplate" packages = ["."] pruneopts = "" - revision = "8b5e4e491ab636663841c42ea3c5a9adebabaf36" - version = "v1.0.1" + revision = "8fcc7a99b5795b7c3e95172237cf93282fc339a9" + version = "v1.1.0" [[projects]] digest = "1:172f94a6b3644a8f9e6b5e5b7fc9fe1e42d424f52a0300b2e7ab1e57db73f85d" @@ -719,16 +745,16 @@ [[projects]] branch = "master" - digest = "1:a530f8e0c0ee8a3b440f9f0b0e9f4e5d5e47cfe3a581086ce32cd8ba114ddf4f" + digest = "1:623570fddb99ef064b125c7bf3161f14aba21fdb787896b6c5070d34187c86f8" name = "golang.org/x/crypto" packages = [ "argon2", "blake2b", "cast5", + "chacha20", "curve25519", "ed25519", "ed25519/internal/edwards25519", - "internal/chacha20", "internal/subtle", "md4", "openpgp", @@ -745,11 +771,11 @@ "ssh/terminal", ] pruneopts = "" - revision = "9756ffdc24725223350eb3266ffb92590d28f278" + revision = "53104e6ec876ad4e22ad27cce588b01392043c1b" [[projects]] branch = "master" - digest = "1:87c06c289123bf8be0a776c57ca40ce075f6c598a905ff2ff8ba40fba0d5d17c" + digest = "1:cab37ea831bb9be343b41a7673e64b6bb8399bc0f051180c04ce561573ed2c89" name = "golang.org/x/net" packages = [ "context", @@ -765,11 +791,11 @@ "trace", ] pruneopts = "" - revision = "ba9fcec4b297b415637633c5a6e8fa592e4a16c3" + revision = "c0dbc17a35534bf2e581d7a942408dc936316da4" [[projects]] branch = "master" - digest = "1:01bdbbc604dcd5afb6f66a717f69ad45e9643c72d5bc11678d44ffa5c50f9e42" + digest = "1:44d75e002fa89506cca17f921eb07aee69526d7519bb7f1f2b0e017380c5e011" name = "golang.org/x/oauth2" packages = [ ".", @@ -779,27 +805,29 @@ "jwt", ] pruneopts = "" - revision = "0f29369cfe4552d0e4bcddc57cc75f4d7e672a33" + revision = "858c2ad4c8b6c5d10852cb89079f6ca1c7309787" [[projects]] branch = "master" - digest = "1:9f6efefb4e401a4f699a295d14518871368eb89403f2dd23ec11dfcd2c0836ba" + digest = "1:375358ce220ecbf8c3d441a48746790e906ccf6bcc1f0364158fcbd9819aad92" name = "golang.org/x/sync" packages = ["semaphore"] pruneopts = "" - revision = "112230192c580c3556b8cee6403af37a4fc5f28c" + revision = "cd5d95a43a6e21273425c7ae415d3df9ea832eeb" [[projects]] branch = "master" - digest = "1:6f4b8b866cdf9713562e973536662b9ad2e81e498211a92edc42780a53083a84" + digest = "1:8c945c7d15d859d00371d42149761229fcc8dcd839ff2b998defba22fc9f7d24" name = "golang.org/x/sys" packages = [ "cpu", "unix", "windows", + "windows/registry", + "windows/svc/eventlog", ] pruneopts = "" - revision = "9109b7679e13aa34a54834cfb4949cac4b96e576" + revision = "a1369afcdac740082c63165b07ec83b531884be2" [[projects]] digest = "1:740b51a55815493a8d0f2b1e0d0ae48fe48953bf7eaf3fcc4198823bf67768c0" @@ -829,23 +857,18 @@ [[projects]] branch = "master" - digest = "1:9522af4be529c108010f95b05f1022cb872f2b9ff8b101080f554245673466e1" + digest = "1:c43c206d0f8927031df6fc877cf58502af5ff875b76b4ceb6b617b676f7731f7" name = "golang.org/x/time" packages = ["rate"] pruneopts = "" - revision = "9d24e82272b4f38b78bc8cff74fa936d31ccd8ef" + revision = "555d28b269f0569763d25dbe1a237ae74c6bcc82" [[projects]] branch = "master" - digest = "1:1b4fd41c8f091a7e3520464fd38c9b5c477556b4fb75de1a016b55be74e7d572" + digest = "1:514d460e8cbd1fc7705ca70542907bd34355b4385796ddc299c77cb46bba277e" name = "golang.org/x/tools" packages = [ "go/ast/astutil", - "go/gcexportdata", - "go/internal/gcimporter", - "go/internal/packagesdriver", - "go/packages", - "go/types/typeutil", "imports", "internal/fastwalk", "internal/gopathwalk", @@ -854,26 +877,26 @@ "internal/semver", ] pruneopts = "" - revision = "be0da057c5e3c2df569a2c25cd280149b7d7e7d0" + revision = "6de373a2766cf6891613ba19eb8bb06227ba7273" [[projects]] - digest = "1:bae851a20eb57221f90022471327e79a72e1167398946835032f160ca311e73f" + digest = "1:81bac4ebb9ca8fa7d937fbfbb8ba856bf78b0ed2eba943f2defe9cf8df36df6e" name = "gonum.org/v1/gonum" packages = ["graph"] pruneopts = "" - revision = "b72f7aa23a47a7d95df7d3d5248af26c33327925" - version = "v0.6.0" + revision = "402b1e2868774b0eee0ec7c85bb9a7b36cf650ae" + version = "v0.6.2" [[projects]] - digest = "1:ea4822af073aae8c1f0868534aa49e2e97c1cd4fcad76f0ef91427ce26428923" + digest = "1:1e9e6f4d4ca4c890f3de6dbaf071a9a428991c571fbaeae210981729cd19cd1a" name = "google.golang.org/api" packages = ["support/bundler"] pruneopts = "" - revision = "feb0267beb8644f5088a03be4d5ec3f8c7020152" - version = "v0.9.0" + revision = "aa5d4e47691e7ae1aebb5221ff8e4beea23fad72" + version = "v0.15.0" [[projects]] - digest = "1:0568e577f790e9bd0420521cff50580f9b38165a38f217ce68f55c4bbaa97066" + digest = "1:c4404231035fad619a12f82ae3f0f8f9edc1cc7f34e7edad7a28ccac5336cc96" name = "google.golang.org/appengine" packages = [ ".", @@ -889,12 +912,12 @@ "urlfetch", ] pruneopts = "" - revision = "5f2a59506353b8d5ba8cbbcd9f3c1f41f1eaf079" - version = "v1.6.2" + revision = "971852bfffca25b069c31162ae8f247a3dba083b" + version = "v1.6.5" [[projects]] branch = "master" - digest = "1:e1505a39ad844b6a89856ffb97363cc47cbee0c511c1423d2d9c673cc4a215a0" + digest = "1:ba64d3acd79ad4dee34b76de29a73959114a204f1f35791807171a152d41aa38" name = "google.golang.org/genproto" packages = [ "googleapis/api/httpbody", @@ -902,13 +925,15 @@ "protobuf/field_mask", ] pruneopts = "" - revision = "24fa4b261c55da65468f2abfdae2b024eef27dfb" + revision = "f3c370f40bfba3cb25c5c2f823a1a8031b5ad724" [[projects]] - digest = "1:e8a4007e58ea9431f6460d1bc5c7f9dd29fdc0211ab780b6ad3d0581478f2076" + digest = "1:7af390490e636a6adc9c76b37a3c823195fbf375a02c4d9506b4dd49d5d2409a" name = "google.golang.org/grpc" packages = [ ".", + "attributes", + "backoff", "balancer", "balancer/base", "balancer/roundrobin", @@ -924,10 +949,13 @@ "internal/backoff", "internal/balancerload", "internal/binarylog", + "internal/buffer", "internal/channelz", "internal/envconfig", "internal/grpcrand", "internal/grpcsync", + "internal/resolver/dns", + "internal/resolver/passthrough", "internal/syscall", "internal/transport", "keepalive", @@ -935,16 +963,22 @@ "naming", "peer", "resolver", - "resolver/dns", - "resolver/passthrough", "serviceconfig", "stats", "status", "tap", ] pruneopts = "" - revision = "6eaf6f47437a6b4e2153a190160ef39a92c7eceb" - version = "v1.23.0" + revision = "f5b0812e6fe574d90da76b205e9eb51f6ddb1919" + version = "v1.26.0" + +[[projects]] + digest = "1:15d017551627c8bb091bde628215b2861bed128855343fdd570c62d08871f6e1" + name = "gopkg.in/alecthomas/kingpin.v2" + packages = ["."] + pruneopts = "" + revision = "947dcec5ba9c011838740e680966fd7087a71d0d" + version = "v2.2.6" [[projects]] digest = "1:75fb3fcfc73a8c723efde7777b40e8e8ff9babf30d8c56160d01beffea8a95a6" @@ -955,12 +989,12 @@ version = "v0.9.1" [[projects]] - digest = "1:c3f4f5bc77b998746a8061a52a2b8fb172c1744801165227692d702483995d58" + digest = "1:d68a26e5d4ba1d9213041aad76d2d6b6d68dba853ceb585235311bd86748e473" name = "gopkg.in/ini.v1" packages = ["."] pruneopts = "" - revision = "d4cae42d398bc0095297fc3315669590d29166ea" - version = "v1.46.0" + revision = "94291fffe2b14f4632ec0e67c1bfecfc1287a168" + version = "v1.51.1" [[projects]] digest = "1:4777ba481cc12866b89aafb0a67529e7ac48b9aea06a25f3737b2cf5a3ffda12" @@ -1099,16 +1133,16 @@ version = "v0.1.2" [[projects]] - digest = "1:cedccf16b71e86db87a24f8d4c70b0a855872eb967cb906a66b95de56aefbd0d" + digest = "1:5a53f6ef09fb1ac261a97f8a72e8837ff53cbaa969022a6679da210e4cbe9b0f" name = "gopkg.in/yaml.v2" packages = ["."] pruneopts = "" - revision = "51d6538a90f86fe93ac480b35f37b2be17fef232" - version = "v2.2.2" + revision = "1f64d6156d11335c3f22d9330b0ad14fc1e789ce" + version = "v2.2.7" [[projects]] branch = "release-1.16" - digest = "1:5e5cfbab57ea5444c1eb295a39fdc403f097f5ace592c829db7b3e0e3ea66903" + digest = "1:0a71df52208a159555360dcb8a95cfb73a0f6447679e563f57faf8f720e2c458" name = "k8s.io/api" packages = [ "admissionregistration/v1beta1", @@ -1149,11 +1183,11 @@ "storage/v1beta1", ] pruneopts = "" - revision = "195af9ec35214c6d98662c5791364285bf2e2cf2" + revision = "17cfeff5d095b34109abafab4985d9e3dfee89cd" [[projects]] branch = "release-1.16" - digest = "1:36db89a45a8cb3d565f7ebfd67dafd42c9c0bbb80d6bbd4991629b39b02a4c64" + digest = "1:90b240ed8a300c221a74b1f37c9d4ab95a7be7b6265ef32df38052f3a943f90c" name = "k8s.io/apimachinery" packages = [ "pkg/api/errors", @@ -1204,11 +1238,11 @@ "third_party/forked/golang/reflect", ] pruneopts = "" - revision = "72ed19daf4bb788ae595ae4103c404cb0fa09c84" + revision = "f69eda767ee8601f65e8966e702f25a344dd2698" [[projects]] branch = "release-12.0" - digest = "1:7ee113eb8b6b464c3fc143c29468a7dd6929305c962c6e7e6aef7f2c1d244c4c" + digest = "1:cbab5d15c0cef66f4893d0f814f9f36acbc81dc2f6c5a01108cce3ede6cd2c9d" name = "k8s.io/client-go" packages = [ "discovery", @@ -1326,11 +1360,11 @@ "util/workqueue", ] pruneopts = "" - revision = "5f2132fc4383659da452dba21a1c6c9890b0e062" + revision = "73fd2ddc918095ed6a4da2073b2f79e7721cf44b" [[projects]] branch = "release-1.16" - digest = "1:254da4cb69b3776686b730a206e081e6f8898bb64760619d1895c25c407e718f" + digest = "1:94e198d2d7e7483789dbf28da6063d9c09891553ef983a3bb9c9e48b875c8e3b" name = "k8s.io/code-generator" packages = [ "cmd/client-gen", @@ -1353,11 +1387,11 @@ "pkg/util", ] pruneopts = "" - revision = "8e001e5d18949be7e823ccb9cfe9b60026e7bda0" + revision = "f86ae06843c69c152fba512e9c2f547e3b7df88c" [[projects]] branch = "master" - digest = "1:f007c3788c6e24308be8893b12397b20cbbeb9b81a451de4af495a051b5cd554" + digest = "1:c75b39778d0f13a692738ff3029c0a211f8be840bbdfb912dc47544d45c188ac" name = "k8s.io/gengo" packages = [ "args", @@ -1369,30 +1403,30 @@ "types", ] pruneopts = "" - revision = "a874a240740c2ae854082ec73d46c5efcedd2149" + revision = "e74f70b9b27e1167f8aba52265fe03a6805efdcd" [[projects]] - digest = "1:3063061b6514ad2666c4fa292451685884cacf77c803e1b10b4a4fa23f7787fb" + digest = "1:7ce71844fcaaabcbe09a392902edb5790ddca3a7070ae8d20830dc6dbe2751af" name = "k8s.io/klog" packages = ["."] pruneopts = "" - revision = "3ca30a56d8a775276f9cdae009ba326fdc05af7f" - version = "v0.4.0" + revision = "2ca9ad30301bf30a8a6e0fa2110db6b8df699a91" + version = "v1.0.0" [[projects]] branch = "master" - digest = "1:3176cac3365c8442ab92d465e69e05071b0dbc0d715e66b76059b04611811dff" + digest = "1:16a343bd9d820ae320de4d1eaa8acc7a214aac4b38fb21d03255d3a457d861df" name = "k8s.io/kube-openapi" packages = [ "pkg/common", "pkg/util/proto", ] pruneopts = "" - revision = "5e22f3d471e6f24ca20becfdffdc6206c7cecac8" + revision = "30be4d16710ac61bce31eb28a01054596fe6a9f1" [[projects]] branch = "master" - digest = "1:0289bf94fc829627697d5634d1846ed0a61d11d20fcf719d94335f9d54eeb050" + digest = "1:7b3e186eef10afc7c1f868fea5bd20575e4960e3113af467275f750b628bc64e" name = "k8s.io/utils" packages = [ "buffer", @@ -1401,7 +1435,7 @@ "trace", ] pruneopts = "" - revision = "3a4a5477acf81b48e20870a3b9dc743f63c66730" + revision = "f07c713de88362aef7545072487d6118bd4a3d4a" [[projects]] digest = "1:321081b4a44256715f2b68411d8eda9a17f17ebfe6f0cc61d2cc52d11c08acfa" @@ -1459,6 +1493,8 @@ "github.com/pkg/errors", "github.com/prometheus/client_golang/prometheus", "github.com/prometheus/client_golang/prometheus/promhttp", + "github.com/prometheus/common/log", + "github.com/robfig/cron", "github.com/sirupsen/logrus", "github.com/spf13/cobra", "github.com/stretchr/testify/assert", diff --git a/Makefile b/Makefile index a99dc6530a46..19acbeca5347 100644 --- a/Makefile +++ b/Makefile @@ -139,7 +139,7 @@ endif .PHONY: test test: - go test -covermode=count -coverprofile=coverage.out ./... + go test -covermode=count -coverprofile=coverage.out `go list ./... | grep -v 'test/e2e'` .PHONY: cover cover: @@ -195,7 +195,7 @@ logs-e2e: .PHONY: test-e2e test-e2e: - go test -v -count 1 -p 1 ./test/e2e + go test -timeout 20m -v -count 1 -p 1 ./test/e2e/... .PHONY: clean clean: diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 50c5701fbd79..fa6d95cb91aa 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -215,6 +215,115 @@ } } }, + "io.argoproj.workflow.v1alpha1.CronWorkflow": { + "description": "CronWorkflow is the definition of a scheduled workflow resource", + "type": "object", + "required": [ + "spec", + "status" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.CronWorkflowSpec" + }, + "status": { + "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.CronWorkflowStatus" + } + } + }, + "io.argoproj.workflow.v1alpha1.CronWorkflowList": { + "description": "CronWorkflowList is list of CronWorkflow resources", + "type": "object", + "required": [ + "metadata", + "items" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.CronWorkflow" + } + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + } + }, + "io.argoproj.workflow.v1alpha1.CronWorkflowSpec": { + "type": "object", + "required": [ + "schedule" + ], + "properties": { + "concurrencyPolicy": { + "description": "ConcurrencyPolicy is the K8s-style concurrency policy that will be used", + "type": "string" + }, + "failedJobsHistoryLimit": { + "description": "FailedJobsHistoryLimit is the number of successful jobs to be kept at a time", + "type": "integer", + "format": "int32" + }, + "schedule": { + "description": "Schedule is a schedule to run the Workflow in Cron format", + "type": "string" + }, + "startingDeadlineSeconds": { + "description": "StartingDeadlineSeconds is the K8s-style deadline that will limit the time a CronWorkflow will be run after its original scheduled time if it is missed.", + "type": "integer", + "format": "int64" + }, + "successfulJobsHistoryLimit": { + "description": "SuccessfulJobsHistoryLimit is the number of successful jobs to be kept at a time", + "type": "integer", + "format": "int32" + }, + "suspend": { + "description": "Suspend is a flag that will stop new CronWorkflows from running if set to true", + "type": "boolean" + }, + "workflowSpec": { + "description": "WorkflowSpec is the spec of the workflow to be run", + "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.WorkflowSpec" + } + } + }, + "io.argoproj.workflow.v1alpha1.CronWorkflowStatus": { + "type": "object", + "properties": { + "active": { + "description": "Active is a list of active workflows stemming from this CronWorkflow", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference" + } + }, + "lastScheduledTime": { + "description": "LastScheduleTime is the last time the CronWorkflow was scheduled", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + } + } + }, "io.argoproj.workflow.v1alpha1.DAGTask": { "description": "DAGTask represents a node in the graph during DAG execution", "type": "object", diff --git a/cmd/argo/commands/cron/common.go b/cmd/argo/commands/cron/common.go new file mode 100644 index 000000000000..943baaa6d8fe --- /dev/null +++ b/cmd/argo/commands/cron/common.go @@ -0,0 +1,77 @@ +package cron + +import ( + wfv1 "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" + "github.com/argoproj/argo/workflow/templateresolution" + "log" + + "github.com/argoproj/argo/pkg/client/clientset/versioned" + "github.com/argoproj/argo/pkg/client/clientset/versioned/typed/workflow/v1alpha1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" +) + +// Global variables +var ( + restConfig *rest.Config + clientConfig clientcmd.ClientConfig + clientset *kubernetes.Clientset + wfClientset *versioned.Clientset + cronWfClient v1alpha1.CronWorkflowInterface + wftmplClient v1alpha1.WorkflowTemplateInterface + namespace string +) + +func initKubeClient() *kubernetes.Clientset { + if clientset != nil { + return clientset + } + var err error + restConfig, err = clientConfig.ClientConfig() + if err != nil { + log.Fatal(err) + } + + // create the clientset + clientset, err = kubernetes.NewForConfig(restConfig) + if err != nil { + log.Fatal(err) + } + return clientset +} + +// InitCronWorkflowClient creates a new client for the Kubernetes WorkflowTemplate CRD. +func InitCronWorkflowClient(ns ...string) v1alpha1.CronWorkflowInterface { + if cronWfClient != nil { + return cronWfClient + } + initKubeClient() + var err error + if len(ns) > 0 { + namespace = ns[0] + } else { + namespace, _, err = clientConfig.Namespace() + if err != nil { + log.Fatal(err) + } + } + wfClientset = versioned.NewForConfigOrDie(restConfig) + cronWfClient = wfClientset.ArgoprojV1alpha1().CronWorkflows(namespace) + wftmplClient = wfClientset.ArgoprojV1alpha1().WorkflowTemplates(namespace) + return cronWfClient +} + +// LazyWorkflowTemplateGetter is a wrapper of v1alpha1.WorkflowTemplateInterface which +// supports lazy initialization. +type LazyWorkflowTemplateGetter struct{} + +// Get initializes it just before it's actually used and returns a retrieved workflow template. +func (c LazyWorkflowTemplateGetter) Get(name string) (*wfv1.WorkflowTemplate, error) { + if wftmplClient == nil { + _ = InitCronWorkflowClient() + } + return templateresolution.WrapWorkflowTemplateInterface(wftmplClient).Get(name) +} + +var _ templateresolution.WorkflowTemplateNamespacedGetter = &LazyWorkflowTemplateGetter{} diff --git a/cmd/argo/commands/cron/create.go b/cmd/argo/commands/cron/create.go new file mode 100644 index 000000000000..f6d8afa54cab --- /dev/null +++ b/cmd/argo/commands/cron/create.go @@ -0,0 +1,97 @@ +package cron + +import ( + "github.com/argoproj/argo/workflow/templateresolution" + "log" + "os" + + "github.com/argoproj/pkg/json" + "github.com/spf13/cobra" + + wfv1 "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" + "github.com/argoproj/argo/workflow/common" + "github.com/argoproj/argo/workflow/util" + "github.com/argoproj/argo/workflow/validate" +) + +type cliCreateOpts struct { + output string // --output + strict bool // --strict +} + +func NewCreateCommand() *cobra.Command { + var ( + cliCreateOpts cliCreateOpts + ) + var command = &cobra.Command{ + Use: "create FILE1 FILE2...", + Short: "create a cron workflow", + Run: func(cmd *cobra.Command, args []string) { + if len(args) == 0 { + cmd.HelpFunc()(cmd, args) + os.Exit(1) + } + + CreateCronWorkflows(args, &cliCreateOpts) + }, + } + command.Flags().StringVarP(&cliCreateOpts.output, "output", "o", "", "Output format. One of: name|json|yaml|wide") + command.Flags().BoolVar(&cliCreateOpts.strict, "strict", true, "perform strict workflow validation") + return command +} + +func CreateCronWorkflows(filePaths []string, cliOpts *cliCreateOpts) { + defaultCronWfClient := InitCronWorkflowClient() + + fileContents, err := util.ReadManifest(filePaths...) + if err != nil { + log.Fatal(err) + } + + var cronWorkflows []wfv1.CronWorkflow + for _, body := range fileContents { + cronWfs := unmarshalCronWorkflows(body, cliOpts.strict) + cronWorkflows = append(cronWorkflows, cronWfs...) + } + + if len(cronWorkflows) == 0 { + log.Println("No CronWorkflows found in given files") + os.Exit(1) + } + + for _, cronWf := range cronWorkflows { + wftmplGetter := templateresolution.WrapWorkflowTemplateInterface(wftmplClient) + err := validate.ValidateCronWorkflow(wftmplGetter, &cronWf) + if err != nil { + log.Fatalf("Failed to validate cron workflow: %v", err) + } + cronWfClient := defaultCronWfClient + if cronWf.Namespace != "" { + cronWfClient = InitCronWorkflowClient(cronWf.Namespace) + } + created, err := cronWfClient.Create(&cronWf) + if err != nil { + log.Fatalf("Failed to create workflow template: %v", err) + } + printCronWorkflowTemplate(created, cliOpts.output) + } +} + +// unmarshalCronWorkflows unmarshals the input bytes as either json or yaml +func unmarshalCronWorkflows(wfBytes []byte, strict bool) []wfv1.CronWorkflow { + var cronWf wfv1.CronWorkflow + var jsonOpts []json.JSONOpt + if strict { + jsonOpts = append(jsonOpts, json.DisallowUnknownFields) + } + err := json.Unmarshal(wfBytes, &cronWf, jsonOpts...) + if err == nil { + return []wfv1.CronWorkflow{cronWf} + } + yamlWfs, err := common.SplitCronWorkflowYAMLFile(wfBytes, strict) + if err == nil { + return yamlWfs + } + log.Fatalf("Failed to parse workflow template: %v", err) + return nil +} diff --git a/cmd/argo/commands/cron/delete.go b/cmd/argo/commands/cron/delete.go new file mode 100644 index 000000000000..f122293a99a2 --- /dev/null +++ b/cmd/argo/commands/cron/delete.go @@ -0,0 +1,59 @@ +package cron + +import ( + "fmt" + "log" + "os" + + "github.com/spf13/cobra" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/argoproj/argo/pkg/client/clientset/versioned/typed/workflow/v1alpha1" +) + +// NewDeleteCommand returns a new instance of an `argo delete` command +func NewDeleteCommand() *cobra.Command { + var ( + all bool + ) + + var command = &cobra.Command{ + Use: "delete CRON_WORKFLOW", + Short: "delete a cron workflow", + Run: func(cmd *cobra.Command, args []string) { + cronWfClient := InitCronWorkflowClient() + if all { + deleteCronWorkflows(cronWfClient, metav1.ListOptions{}) + } else { + if len(args) == 0 { + cmd.HelpFunc()(cmd, args) + os.Exit(1) + } + for _, wftmplName := range args { + deleCronWorkflow(cronWfClient, wftmplName) + } + } + }, + } + + command.Flags().BoolVar(&all, "all", false, "Delete all workflow templates") + return command +} + +func deleCronWorkflow(cronWfClient v1alpha1.CronWorkflowInterface, cronWf string) { + err := cronWfClient.Delete(cronWf, &metav1.DeleteOptions{}) + if err != nil { + log.Fatal(err) + } + fmt.Printf("CronWorkflow '%s' deleted\n", cronWf) +} + +func deleteCronWorkflows(cronWfClient v1alpha1.CronWorkflowInterface, options metav1.ListOptions) { + cronWfList, err := cronWfClient.List(options) + if err != nil { + log.Fatal(err) + } + for _, cronWf := range cronWfList.Items { + deleCronWorkflow(cronWfClient, cronWf.ObjectMeta.Name) + } +} diff --git a/cmd/argo/commands/cron/get.go b/cmd/argo/commands/cron/get.go new file mode 100644 index 000000000000..c489315a80c9 --- /dev/null +++ b/cmd/argo/commands/cron/get.go @@ -0,0 +1,85 @@ +package cron + +import ( + "encoding/json" + "fmt" + "log" + "os" + "strings" + + wfv1 "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" + "github.com/argoproj/pkg/humanize" + "github.com/spf13/cobra" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/yaml" +) + +func NewGetCommand() *cobra.Command { + var ( + output string + ) + + var command = &cobra.Command{ + Use: "get CRON_WORKFLOW", + Short: "display details about a cron workflow", + Run: func(cmd *cobra.Command, args []string) { + if len(args) == 0 { + cmd.HelpFunc()(cmd, args) + os.Exit(1) + } + cronWfClient := InitCronWorkflowClient() + for _, arg := range args { + wftmpl, err := cronWfClient.Get(arg, metav1.GetOptions{}) + if err != nil { + log.Fatal(err) + } + printCronWorkflow(wftmpl, output) + } + }, + } + + command.Flags().StringVarP(&output, "output", "o", "", "Output format. One of: json|yaml|wide") + return command +} + +func printCronWorkflow(wf *wfv1.CronWorkflow, outFmt string) { + switch outFmt { + case "name": + fmt.Println(wf.ObjectMeta.Name) + case "json": + outBytes, _ := json.MarshalIndent(wf, "", " ") + fmt.Println(string(outBytes)) + case "yaml": + outBytes, _ := yaml.Marshal(wf) + fmt.Print(string(outBytes)) + case "wide", "": + printCronWorkflowTemplate(wf, outFmt) + default: + log.Fatalf("Unknown output format: %s", outFmt) + } +} + +func printCronWorkflowTemplate(wf *wfv1.CronWorkflow, outFmt string) { + const fmtStr = "%-30s %v\n" + fmt.Printf(fmtStr, "Name:", wf.ObjectMeta.Name) + fmt.Printf(fmtStr, "Namespace:", wf.ObjectMeta.Namespace) + fmt.Printf(fmtStr, "Created:", humanize.Timestamp(wf.ObjectMeta.CreationTimestamp.Time)) + fmt.Printf(fmtStr, "Schedule:", wf.Spec.Schedule) + fmt.Printf(fmtStr, "Suspended:", wf.Spec.Suspend) + if wf.Spec.StartingDeadlineSeconds != nil { + fmt.Printf(fmtStr, "StartingDeadlineSeconds:", *wf.Spec.StartingDeadlineSeconds) + } + if wf.Spec.ConcurrencyPolicy != "" { + fmt.Printf(fmtStr, "ConcurrencyPolicy:", wf.Spec.ConcurrencyPolicy) + } + if wf.Status.LastScheduledTime != nil { + fmt.Printf(fmtStr, "LastScheduledTime:", humanize.Timestamp(wf.Status.LastScheduledTime.Time)) + } + if len(wf.Status.Active) > 0 { + var activeWfNames []string + for _, activeWf := range wf.Status.Active { + activeWfNames = append(activeWfNames, activeWf.Name) + } + fmt.Printf(fmtStr, "Active Workflows:", strings.Join(activeWfNames, ", ")) + } +} diff --git a/cmd/argo/commands/cron/lint.go b/cmd/argo/commands/cron/lint.go new file mode 100644 index 000000000000..c68a79192f4e --- /dev/null +++ b/cmd/argo/commands/cron/lint.go @@ -0,0 +1,65 @@ +package cron + +import ( + "fmt" + "os" + + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + + cmdutil "github.com/argoproj/argo/util/cmd" + "github.com/argoproj/argo/workflow/validate" +) + +func NewLintCommand() *cobra.Command { + var ( + strict bool + ) + var command = &cobra.Command{ + Use: "lint (DIRECTORY | FILE1 FILE2 FILE3...)", + Short: "validate a file or directory of cron workflow manifests", + Run: func(cmd *cobra.Command, args []string) { + if len(args) == 0 { + cmd.HelpFunc()(cmd, args) + os.Exit(1) + } + + namespace, _, err := clientConfig.Namespace() + if err != nil { + log.Fatal(err) + } + + wftmplGetter := &LazyWorkflowTemplateGetter{} + validateDir := cmdutil.MustIsDir(args[0]) + if validateDir { + if len(args) > 1 { + fmt.Printf("Validation of a single directory supported") + os.Exit(1) + } + fmt.Printf("Verifying all cron workflow manifests in directory: %s\n", args[0]) + err = validate.LintCronWorkflowDir(wftmplGetter, namespace, args[0], strict) + } else { + yamlFiles := make([]string, 0) + for _, filePath := range args { + if cmdutil.MustIsDir(filePath) { + fmt.Printf("Validate against a list of files or a single directory, not both") + os.Exit(1) + } + yamlFiles = append(yamlFiles, filePath) + } + for _, yamlFile := range yamlFiles { + err = validate.LintCronWorkflowFile(wftmplGetter, namespace, yamlFile, strict) + if err != nil { + break + } + } + } + if err != nil { + log.Fatal(err) + } + fmt.Printf("CronWorkflow manifests validated\n") + }, + } + command.Flags().BoolVar(&strict, "strict", true, "perform strict workflow validation") + return command +} diff --git a/cmd/argo/commands/cron/list.go b/cmd/argo/commands/cron/list.go new file mode 100644 index 000000000000..63d55bfe5b0a --- /dev/null +++ b/cmd/argo/commands/cron/list.go @@ -0,0 +1,85 @@ +package cron + +import ( + "fmt" + "github.com/argoproj/pkg/humanize" + "log" + "os" + "text/tabwriter" + "time" + + "github.com/spf13/cobra" + apiv1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + + wfv1 "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" + "github.com/argoproj/argo/pkg/client/clientset/versioned/typed/workflow/v1alpha1" +) + +type listFlags struct { + allNamespaces bool // --all-namespaces + output string // --output +} + +func NewListCommand() *cobra.Command { + var ( + listArgs listFlags + ) + var command = &cobra.Command{ + Use: "list", + Short: "list cron workflows", + Run: func(cmd *cobra.Command, args []string) { + var cronWfClient v1alpha1.CronWorkflowInterface + if listArgs.allNamespaces { + cronWfClient = InitCronWorkflowClient(apiv1.NamespaceAll) + } else { + cronWfClient = InitCronWorkflowClient() + } + listOpts := metav1.ListOptions{} + labelSelector := labels.NewSelector() + listOpts.LabelSelector = labelSelector.String() + cronWfList, err := cronWfClient.List(listOpts) + if err != nil { + log.Fatal(err) + } + + switch listArgs.output { + case "", "wide": + printTable(cronWfList.Items, &listArgs) + case "name": + for _, cronWf := range cronWfList.Items { + fmt.Println(cronWf.ObjectMeta.Name) + } + default: + log.Fatalf("Unknown output mode: %s", listArgs.output) + } + }, + } + command.Flags().BoolVar(&listArgs.allNamespaces, "all-namespaces", false, "Show workflows from all namespaces") + command.Flags().StringVarP(&listArgs.output, "output", "o", "", "Output format. One of: wide|name") + return command +} + +func printTable(wfList []wfv1.CronWorkflow, listArgs *listFlags) { + w := tabwriter.NewWriter(os.Stdout, 0, 0, 3, ' ', 0) + if listArgs.allNamespaces { + fmt.Fprint(w, "NAMESPACE\t") + } + fmt.Fprint(w, "NAME\tAGE\tLAST RUN\tSCHEDULE\tSUSPENDED") + fmt.Fprint(w, "\n") + for _, wf := range wfList { + if listArgs.allNamespaces { + fmt.Fprintf(w, "%s\t", wf.ObjectMeta.Namespace) + } + var cleanLastScheduledTime string + if wf.Status.LastScheduledTime != nil { + cleanLastScheduledTime = humanize.RelativeDurationShort(wf.Status.LastScheduledTime.Time, time.Now()) + } else { + cleanLastScheduledTime = "N/A" + } + fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%t", wf.ObjectMeta.Name, humanize.RelativeDurationShort(wf.ObjectMeta.CreationTimestamp.Time, time.Now()), cleanLastScheduledTime, wf.Spec.Schedule, wf.Spec.Suspend) + fmt.Fprintf(w, "\n") + } + _ = w.Flush() +} diff --git a/cmd/argo/commands/cron/root.go b/cmd/argo/commands/cron/root.go new file mode 100644 index 000000000000..219d957dfdaa --- /dev/null +++ b/cmd/argo/commands/cron/root.go @@ -0,0 +1,38 @@ +package cron + +import ( + "os" + + "github.com/spf13/cobra" + "k8s.io/client-go/tools/clientcmd" +) + +func NewCronWorkflowCommand() *cobra.Command { + var command = &cobra.Command{ + Use: "cron", + Short: "manage cron workflows", + Run: func(cmd *cobra.Command, args []string) { + cmd.HelpFunc()(cmd, args) + }, + } + + command.AddCommand(NewGetCommand()) + command.AddCommand(NewListCommand()) + command.AddCommand(NewCreateCommand()) + command.AddCommand(NewDeleteCommand()) + command.AddCommand(NewLintCommand()) + + addKubectlFlagsToCmd(command) + return command +} + +func addKubectlFlagsToCmd(cmd *cobra.Command) { + // The "usual" clientcmd/kubectl flags + loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() + loadingRules.DefaultClientConfig = &clientcmd.DefaultClientConfig + overrides := clientcmd.ConfigOverrides{} + kflags := clientcmd.RecommendedConfigOverrideFlags("") + cmd.PersistentFlags().StringVar(&loadingRules.ExplicitPath, "kubeconfig", "", "Path to a kube config. Only required if out-of-cluster") + clientcmd.BindOverrideFlags(&overrides, cmd.PersistentFlags(), kflags) + clientConfig = clientcmd.NewInteractiveDeferredLoadingClientConfig(loadingRules, &overrides, os.Stdin) +} diff --git a/cmd/argo/commands/lint.go b/cmd/argo/commands/lint.go index 6c35bfeb71df..321c0265864b 100644 --- a/cmd/argo/commands/lint.go +++ b/cmd/argo/commands/lint.go @@ -56,6 +56,6 @@ func NewLintCommand() *cobra.Command { fmt.Printf("Workflow manifests validated\n") }, } - command.Flags().BoolVar(&strict, "strict", true, "perform strict workflow validatation") + command.Flags().BoolVar(&strict, "strict", true, "perform strict workflow validation") return command } diff --git a/cmd/argo/commands/root.go b/cmd/argo/commands/root.go index a7cb6bc2d57b..911078e9f125 100644 --- a/cmd/argo/commands/root.go +++ b/cmd/argo/commands/root.go @@ -1,6 +1,7 @@ package commands import ( + "github.com/argoproj/argo/cmd/argo/commands/cron" "os" "github.com/argoproj/argo/cmd/argo/commands/template" @@ -40,6 +41,7 @@ func NewCommand() *cobra.Command { command.AddCommand(NewTerminateCommand()) command.AddCommand(cmd.NewVersionCmd(CLIName)) command.AddCommand(template.NewTemplateCommand()) + command.AddCommand(cron.NewCronWorkflowCommand()) addKubectlFlagsToCmd(command) return command diff --git a/cmd/argo/commands/template/lint.go b/cmd/argo/commands/template/lint.go index 2e90f3cdc6f8..826c64797956 100644 --- a/cmd/argo/commands/template/lint.go +++ b/cmd/argo/commands/template/lint.go @@ -60,6 +60,6 @@ func NewLintCommand() *cobra.Command { fmt.Printf("Workflow manifests validated\n") }, } - command.Flags().BoolVar(&strict, "strict", true, "perform strict workflow validatation") + command.Flags().BoolVar(&strict, "strict", true, "perform strict workflow validation") return command } diff --git a/cmd/workflow-controller/main.go b/cmd/workflow-controller/main.go index 141615c9fcd5..03e863fa5b7a 100644 --- a/cmd/workflow-controller/main.go +++ b/cmd/workflow-controller/main.go @@ -3,6 +3,7 @@ package main import ( "context" "fmt" + "github.com/argoproj/argo/workflow/cron" "os" "time" @@ -61,21 +62,24 @@ func NewRootCommand() *cobra.Command { } kubeclientset := kubernetes.NewForConfigOrDie(config) - wflientset := wfclientset.NewForConfigOrDie(config) + wfclientset := wfclientset.NewForConfigOrDie(config) // start a controller on instances of our custom resource - wfController := controller.NewWorkflowController(config, kubeclientset, wflientset, namespace, executorImage, executorImagePullPolicy, configMap) + wfController := controller.NewWorkflowController(config, kubeclientset, wfclientset, namespace, executorImage, executorImagePullPolicy, configMap) err = wfController.ResyncConfig() if err != nil { return err } + cronController := cron.NewCronController(wfclientset, config, namespace) + ctx, cancel := context.WithCancel(context.Background()) defer cancel() go wfController.Run(ctx, workflowWorkers, podWorkers) go wfController.MetricsServer(ctx) go wfController.TelemetryServer(ctx) go wfController.RunTTLController(ctx) + go cronController.Run(ctx) // Wait forever select {} diff --git a/manifests/base/crds/workflow-crd.yaml b/manifests/base/crds/workflow-crd.yaml index 3c873080efa3..f38016e8ac4c 100644 --- a/manifests/base/crds/workflow-crd.yaml +++ b/manifests/base/crds/workflow-crd.yaml @@ -35,3 +35,18 @@ spec: plural: workflowtemplates shortNames: - wftmpl +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: cronworkflows.argoproj.io +spec: + group: argoproj.io + version: v1alpha1 + scope: Namespaced + names: + kind: CronWorkflow + plural: cronworkflows + shortNames: + - cronwf + - cwf \ No newline at end of file diff --git a/manifests/cluster-install/argo-ui-rbac/argo-ui-clusterrole.yaml b/manifests/cluster-install/argo-ui-rbac/argo-ui-clusterrole.yaml index 4ea2ccb4b46d..6a29b0188afc 100644 --- a/manifests/cluster-install/argo-ui-rbac/argo-ui-clusterrole.yaml +++ b/manifests/cluster-install/argo-ui-rbac/argo-ui-clusterrole.yaml @@ -24,6 +24,7 @@ rules: resources: - workflows - workflowtemplates + - cronworkflows verbs: - get - list diff --git a/manifests/cluster-install/workflow-controller-rbac/workflow-aggregate-roles.yaml b/manifests/cluster-install/workflow-controller-rbac/workflow-aggregate-roles.yaml index 397311a21dfa..c3d25cbed3f1 100644 --- a/manifests/cluster-install/workflow-controller-rbac/workflow-aggregate-roles.yaml +++ b/manifests/cluster-install/workflow-controller-rbac/workflow-aggregate-roles.yaml @@ -12,6 +12,8 @@ rules: - workflows/finalizers - workflowtemplates - workflowtemplates/finalizers + - cronworkflows + - cronworkflows/finalizers verbs: - get - list @@ -32,6 +34,8 @@ rules: - workflows/finalizers - workflowtemplates - workflowtemplates/finalizers + - cronworkflows + - cronworkflows/finalizers verbs: - create - delete @@ -57,6 +61,8 @@ rules: - workflows/finalizers - workflowtemplates - workflowtemplates/finalizers + - cronworkflows + - cronworkflows/finalizers verbs: - create - delete diff --git a/manifests/cluster-install/workflow-controller-rbac/workflow-controller-clusterrole.yaml b/manifests/cluster-install/workflow-controller-rbac/workflow-controller-clusterrole.yaml index f8d333b6fab9..2d97444c2245 100644 --- a/manifests/cluster-install/workflow-controller-rbac/workflow-controller-clusterrole.yaml +++ b/manifests/cluster-install/workflow-controller-rbac/workflow-controller-clusterrole.yaml @@ -43,6 +43,7 @@ rules: - update - patch - delete + - create - apiGroups: - argoproj.io resources: @@ -58,4 +59,16 @@ rules: - serviceaccounts verbs: - get - - list \ No newline at end of file + - list +- apiGroups: + - argoproj.io + resources: + - cronworkflows + - cronworkflows/finalizers + verbs: + - get + - list + - watch + - update + - patch + - delete \ No newline at end of file diff --git a/manifests/install.yaml b/manifests/install.yaml index 589b8beb59d9..6f606a0d4685 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -1,9 +1,34 @@ # This is an auto-generated file. DO NOT EDIT apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition +metadata: + name: cronworkflows.argoproj.io +spec: + group: argoproj.io + names: + kind: CronWorkflow + plural: cronworkflows + shortNames: + - cronwf + - cwf + scope: Namespaced + version: v1alpha1 +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition metadata: name: workflows.argoproj.io spec: + additionalPrinterColumns: + - JSONPath: .status.phase + description: Status of the workflow + name: Status + type: string + - JSONPath: .status.startedAt + description: When the workflow was started + format: date-time + name: Age + type: date group: argoproj.io names: kind: Workflow @@ -63,6 +88,8 @@ rules: - workflows/finalizers - workflowtemplates - workflowtemplates/finalizers + - cronworkflows + - cronworkflows/finalizers verbs: - create - delete @@ -87,6 +114,8 @@ rules: - workflows/finalizers - workflowtemplates - workflowtemplates/finalizers + - cronworkflows + - cronworkflows/finalizers verbs: - create - delete @@ -111,6 +140,8 @@ rules: - workflows/finalizers - workflowtemplates - workflowtemplates/finalizers + - cronworkflows + - cronworkflows/finalizers verbs: - get - list @@ -161,6 +192,7 @@ rules: - update - patch - delete + - create - apiGroups: - argoproj.io resources: @@ -177,6 +209,18 @@ rules: verbs: - get - list +- apiGroups: + - argoproj.io + resources: + - cronworkflows + - cronworkflows/finalizers + verbs: + - get + - list + - watch + - update + - patch + - delete --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole @@ -204,6 +248,7 @@ rules: resources: - workflows - workflowtemplates + - cronworkflows verbs: - get - list diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index 277b9e22f826..88ae1bd625ae 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -1,9 +1,34 @@ # This is an auto-generated file. DO NOT EDIT apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition +metadata: + name: cronworkflows.argoproj.io +spec: + group: argoproj.io + names: + kind: CronWorkflow + plural: cronworkflows + shortNames: + - cronwf + - cwf + scope: Namespaced + version: v1alpha1 +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition metadata: name: workflows.argoproj.io spec: + additionalPrinterColumns: + - JSONPath: .status.phase + description: Status of the workflow + name: Status + type: string + - JSONPath: .status.startedAt + description: When the workflow was started + format: date-time + name: Age + type: date group: argoproj.io names: kind: Workflow @@ -104,6 +129,18 @@ rules: - secrets verbs: - get +- apiGroups: + - argoproj.io + resources: + - cronworkflows + - cronworkflows/finalizers + verbs: + - get + - list + - watch + - update + - patch + - delete --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role diff --git a/manifests/namespace-install/workflow-controller-rbac/workflow-controller-role.yaml b/manifests/namespace-install/workflow-controller-rbac/workflow-controller-role.yaml index 8687a6109309..c89ecbc6de30 100644 --- a/manifests/namespace-install/workflow-controller-rbac/workflow-controller-role.yaml +++ b/manifests/namespace-install/workflow-controller-rbac/workflow-controller-role.yaml @@ -65,3 +65,15 @@ rules: - secrets verbs: - get +- apiGroups: + - argoproj.io + resources: + - cronworkflows + - cronworkflows/finalizers + verbs: + - get + - list + - watch + - update + - patch + - delete \ No newline at end of file diff --git a/pkg/apis/api-rules/violation_exceptions.list b/pkg/apis/api-rules/violation_exceptions.list index 9e38e9306af6..f280a573c1c8 100644 --- a/pkg/apis/api-rules/violation_exceptions.list +++ b/pkg/apis/api-rules/violation_exceptions.list @@ -1,5 +1,7 @@ API rule violation: list_type_missing,github.com/argoproj/argo/pkg/apis/workflow/v1alpha1,Arguments,Artifacts API rule violation: list_type_missing,github.com/argoproj/argo/pkg/apis/workflow/v1alpha1,Arguments,Parameters +API rule violation: list_type_missing,github.com/argoproj/argo/pkg/apis/workflow/v1alpha1,CronWorkflowList,Items +API rule violation: list_type_missing,github.com/argoproj/argo/pkg/apis/workflow/v1alpha1,CronWorkflowStatus,Active API rule violation: list_type_missing,github.com/argoproj/argo/pkg/apis/workflow/v1alpha1,DAGTask,Dependencies API rule violation: list_type_missing,github.com/argoproj/argo/pkg/apis/workflow/v1alpha1,DAGTask,WithItems API rule violation: list_type_missing,github.com/argoproj/argo/pkg/apis/workflow/v1alpha1,DAGTemplate,Tasks diff --git a/pkg/apis/workflow/register.go b/pkg/apis/workflow/register.go index a595e15b148a..0aade43f5998 100644 --- a/pkg/apis/workflow/register.go +++ b/pkg/apis/workflow/register.go @@ -13,4 +13,9 @@ const ( WorkflowTemplatePlural string = "workflowtemplates" WorkflowTemplateShortName string = "wftmpl" WorkflowTemplateFullName string = WorkflowTemplatePlural + "." + Group + CronWorkflowKind string = "CronWorkflow" + CronWorkflowSingular string = "cronworkflow" + CronWorkflowPlural string = "cronworkflows" + CronWorkflowShortName string = "cronwf" + CronWorkflowFullName string = WorkflowTemplatePlural + "." + Group ) diff --git a/pkg/apis/workflow/v1alpha1/cron_workflow_types.go b/pkg/apis/workflow/v1alpha1/cron_workflow_types.go new file mode 100644 index 000000000000..21072ac6bd6a --- /dev/null +++ b/pkg/apis/workflow/v1alpha1/cron_workflow_types.go @@ -0,0 +1,58 @@ +package v1alpha1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// CronWorkflow is the definition of a scheduled workflow resource +// +genclient +// +genclient:noStatus +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type CronWorkflow struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + Spec CronWorkflowSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"` + Status CronWorkflowStatus `json:"status" protobuf:"bytes,3,opt,name=status"` +} + +// CronWorkflowList is list of CronWorkflow resources +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type CronWorkflowList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata" protobuf:"bytes,1,opt,name=metadata"` + Items []CronWorkflow `json:"items" protobuf:"bytes,2,rep,name=items"` +} + +type CronWorkflowSpec struct { + // WorkflowSpec is the spec of the workflow to be run + WorkflowSpec WorkflowSpec `json:"workflowSpec,omitempty" protobuf:"bytes,1,opt,name=workflowSpec,casttype=WorkflowSpec"` + // Schedule is a schedule to run the Workflow in Cron format + Schedule string `json:"schedule" protobuf:"bytes,2,opt,name=schedule"` + // ConcurrencyPolicy is the K8s-style concurrency policy that will be used + ConcurrencyPolicy ConcurrencyPolicy `json:"concurrencyPolicy,omitempty" protobuf:"bytes,3,opt,name=concurrencyPolicy,casttype=ConcurrencyPolicy"` + // Suspend is a flag that will stop new CronWorkflows from running if set to true + Suspend bool `json:"suspend,omitempty" protobuf:"varint,4,opt,name=suspend"` + // StartingDeadlineSeconds is the K8s-style deadline that will limit the time a CronWorkflow will be run after its + // original scheduled time if it is missed. + StartingDeadlineSeconds *int64 `json:"startingDeadlineSeconds,omitempty" protobuf:"varint,5,opt,name=startingDeadlineSeconds"` + // SuccessfulJobsHistoryLimit is the number of successful jobs to be kept at a time + SuccessfulJobsHistoryLimit *int32 `json:"successfulJobsHistoryLimit,omitempty" protobuf:"varint,6,opt,name=successfulJobsHistoryLimit"` + // FailedJobsHistoryLimit is the number of successful jobs to be kept at a time + FailedJobsHistoryLimit *int32 `json:"failedJobsHistoryLimit,omitempty" protobuf:"varint,7,opt,name=failedJobsHistoryLimit"` +} + +type CronWorkflowStatus struct { + // Active is a list of active workflows stemming from this CronWorkflow + Active []v1.ObjectReference `json:"active,omitempty" protobuf:"bytes,1,rep,name=active"` + // LastScheduleTime is the last time the CronWorkflow was scheduled + LastScheduledTime *metav1.Time `json:"lastScheduledTime,omitempty" protobuf:"bytes,2,opt,name=lastScheduledTime"` +} + +type ConcurrencyPolicy string + +const ( + AllowConcurrent ConcurrencyPolicy = "Allow" + ForbidConcurrent ConcurrencyPolicy = "Forbid" + ReplaceConcurrent ConcurrencyPolicy = "Replace" +) diff --git a/pkg/apis/workflow/v1alpha1/generated.pb.go b/pkg/apis/workflow/v1alpha1/generated.pb.go index 150c40023c95..4ecc60801b93 100644 --- a/pkg/apis/workflow/v1alpha1/generated.pb.go +++ b/pkg/apis/workflow/v1alpha1/generated.pb.go @@ -13,6 +13,7 @@ import ( github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" k8s_io_api_core_v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1" + v11 "k8s.io/apimachinery/pkg/apis/meta/v1" math "math" math_bits "math/bits" @@ -283,10 +284,122 @@ func (m *ContinueOn) XXX_DiscardUnknown() { var xxx_messageInfo_ContinueOn proto.InternalMessageInfo +func (m *CronWorkflow) Reset() { *m = CronWorkflow{} } +func (*CronWorkflow) ProtoMessage() {} +func (*CronWorkflow) Descriptor() ([]byte, []int) { + return fileDescriptor_c23edafa7e7ea072, []int{9} +} +func (m *CronWorkflow) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CronWorkflow) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CronWorkflow) XXX_Merge(src proto.Message) { + xxx_messageInfo_CronWorkflow.Merge(m, src) +} +func (m *CronWorkflow) XXX_Size() int { + return m.Size() +} +func (m *CronWorkflow) XXX_DiscardUnknown() { + xxx_messageInfo_CronWorkflow.DiscardUnknown(m) +} + +var xxx_messageInfo_CronWorkflow proto.InternalMessageInfo + +func (m *CronWorkflowList) Reset() { *m = CronWorkflowList{} } +func (*CronWorkflowList) ProtoMessage() {} +func (*CronWorkflowList) Descriptor() ([]byte, []int) { + return fileDescriptor_c23edafa7e7ea072, []int{10} +} +func (m *CronWorkflowList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CronWorkflowList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CronWorkflowList) XXX_Merge(src proto.Message) { + xxx_messageInfo_CronWorkflowList.Merge(m, src) +} +func (m *CronWorkflowList) XXX_Size() int { + return m.Size() +} +func (m *CronWorkflowList) XXX_DiscardUnknown() { + xxx_messageInfo_CronWorkflowList.DiscardUnknown(m) +} + +var xxx_messageInfo_CronWorkflowList proto.InternalMessageInfo + +func (m *CronWorkflowSpec) Reset() { *m = CronWorkflowSpec{} } +func (*CronWorkflowSpec) ProtoMessage() {} +func (*CronWorkflowSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_c23edafa7e7ea072, []int{11} +} +func (m *CronWorkflowSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CronWorkflowSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CronWorkflowSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_CronWorkflowSpec.Merge(m, src) +} +func (m *CronWorkflowSpec) XXX_Size() int { + return m.Size() +} +func (m *CronWorkflowSpec) XXX_DiscardUnknown() { + xxx_messageInfo_CronWorkflowSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_CronWorkflowSpec proto.InternalMessageInfo + +func (m *CronWorkflowStatus) Reset() { *m = CronWorkflowStatus{} } +func (*CronWorkflowStatus) ProtoMessage() {} +func (*CronWorkflowStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_c23edafa7e7ea072, []int{12} +} +func (m *CronWorkflowStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CronWorkflowStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CronWorkflowStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_CronWorkflowStatus.Merge(m, src) +} +func (m *CronWorkflowStatus) XXX_Size() int { + return m.Size() +} +func (m *CronWorkflowStatus) XXX_DiscardUnknown() { + xxx_messageInfo_CronWorkflowStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_CronWorkflowStatus proto.InternalMessageInfo + func (m *DAGTask) Reset() { *m = DAGTask{} } func (*DAGTask) ProtoMessage() {} func (*DAGTask) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{9} + return fileDescriptor_c23edafa7e7ea072, []int{13} } func (m *DAGTask) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -314,7 +427,7 @@ var xxx_messageInfo_DAGTask proto.InternalMessageInfo func (m *DAGTemplate) Reset() { *m = DAGTemplate{} } func (*DAGTemplate) ProtoMessage() {} func (*DAGTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{10} + return fileDescriptor_c23edafa7e7ea072, []int{14} } func (m *DAGTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -342,7 +455,7 @@ var xxx_messageInfo_DAGTemplate proto.InternalMessageInfo func (m *ExecutorConfig) Reset() { *m = ExecutorConfig{} } func (*ExecutorConfig) ProtoMessage() {} func (*ExecutorConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{11} + return fileDescriptor_c23edafa7e7ea072, []int{15} } func (m *ExecutorConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -370,7 +483,7 @@ var xxx_messageInfo_ExecutorConfig proto.InternalMessageInfo func (m *GitArtifact) Reset() { *m = GitArtifact{} } func (*GitArtifact) ProtoMessage() {} func (*GitArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{12} + return fileDescriptor_c23edafa7e7ea072, []int{16} } func (m *GitArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -398,7 +511,7 @@ var xxx_messageInfo_GitArtifact proto.InternalMessageInfo func (m *HDFSArtifact) Reset() { *m = HDFSArtifact{} } func (*HDFSArtifact) ProtoMessage() {} func (*HDFSArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{13} + return fileDescriptor_c23edafa7e7ea072, []int{17} } func (m *HDFSArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -426,7 +539,7 @@ var xxx_messageInfo_HDFSArtifact proto.InternalMessageInfo func (m *HDFSConfig) Reset() { *m = HDFSConfig{} } func (*HDFSConfig) ProtoMessage() {} func (*HDFSConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{14} + return fileDescriptor_c23edafa7e7ea072, []int{18} } func (m *HDFSConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -454,7 +567,7 @@ var xxx_messageInfo_HDFSConfig proto.InternalMessageInfo func (m *HDFSKrbConfig) Reset() { *m = HDFSKrbConfig{} } func (*HDFSKrbConfig) ProtoMessage() {} func (*HDFSKrbConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{15} + return fileDescriptor_c23edafa7e7ea072, []int{19} } func (m *HDFSKrbConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -482,7 +595,7 @@ var xxx_messageInfo_HDFSKrbConfig proto.InternalMessageInfo func (m *HTTPArtifact) Reset() { *m = HTTPArtifact{} } func (*HTTPArtifact) ProtoMessage() {} func (*HTTPArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{16} + return fileDescriptor_c23edafa7e7ea072, []int{20} } func (m *HTTPArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -510,7 +623,7 @@ var xxx_messageInfo_HTTPArtifact proto.InternalMessageInfo func (m *Inputs) Reset() { *m = Inputs{} } func (*Inputs) ProtoMessage() {} func (*Inputs) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{17} + return fileDescriptor_c23edafa7e7ea072, []int{21} } func (m *Inputs) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -538,7 +651,7 @@ var xxx_messageInfo_Inputs proto.InternalMessageInfo func (m *Item) Reset() { *m = Item{} } func (*Item) ProtoMessage() {} func (*Item) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{18} + return fileDescriptor_c23edafa7e7ea072, []int{22} } func (m *Item) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -566,7 +679,7 @@ var xxx_messageInfo_Item proto.InternalMessageInfo func (m *ItemValue) Reset() { *m = ItemValue{} } func (*ItemValue) ProtoMessage() {} func (*ItemValue) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{19} + return fileDescriptor_c23edafa7e7ea072, []int{23} } func (m *ItemValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -594,7 +707,7 @@ var xxx_messageInfo_ItemValue proto.InternalMessageInfo func (m *Metadata) Reset() { *m = Metadata{} } func (*Metadata) ProtoMessage() {} func (*Metadata) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{20} + return fileDescriptor_c23edafa7e7ea072, []int{24} } func (m *Metadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -622,7 +735,7 @@ var xxx_messageInfo_Metadata proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{21} + return fileDescriptor_c23edafa7e7ea072, []int{25} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -650,7 +763,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *NoneStrategy) Reset() { *m = NoneStrategy{} } func (*NoneStrategy) ProtoMessage() {} func (*NoneStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{22} + return fileDescriptor_c23edafa7e7ea072, []int{26} } func (m *NoneStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -678,7 +791,7 @@ var xxx_messageInfo_NoneStrategy proto.InternalMessageInfo func (m *Outputs) Reset() { *m = Outputs{} } func (*Outputs) ProtoMessage() {} func (*Outputs) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{23} + return fileDescriptor_c23edafa7e7ea072, []int{27} } func (m *Outputs) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -706,7 +819,7 @@ var xxx_messageInfo_Outputs proto.InternalMessageInfo func (m *ParallelSteps) Reset() { *m = ParallelSteps{} } func (*ParallelSteps) ProtoMessage() {} func (*ParallelSteps) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{24} + return fileDescriptor_c23edafa7e7ea072, []int{28} } func (m *ParallelSteps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -734,7 +847,7 @@ var xxx_messageInfo_ParallelSteps proto.InternalMessageInfo func (m *Parameter) Reset() { *m = Parameter{} } func (*Parameter) ProtoMessage() {} func (*Parameter) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{25} + return fileDescriptor_c23edafa7e7ea072, []int{29} } func (m *Parameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -762,7 +875,7 @@ var xxx_messageInfo_Parameter proto.InternalMessageInfo func (m *PodGC) Reset() { *m = PodGC{} } func (*PodGC) ProtoMessage() {} func (*PodGC) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{26} + return fileDescriptor_c23edafa7e7ea072, []int{30} } func (m *PodGC) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -790,7 +903,7 @@ var xxx_messageInfo_PodGC proto.InternalMessageInfo func (m *RawArtifact) Reset() { *m = RawArtifact{} } func (*RawArtifact) ProtoMessage() {} func (*RawArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{27} + return fileDescriptor_c23edafa7e7ea072, []int{31} } func (m *RawArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -818,7 +931,7 @@ var xxx_messageInfo_RawArtifact proto.InternalMessageInfo func (m *ResourceTemplate) Reset() { *m = ResourceTemplate{} } func (*ResourceTemplate) ProtoMessage() {} func (*ResourceTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{28} + return fileDescriptor_c23edafa7e7ea072, []int{32} } func (m *ResourceTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -846,7 +959,7 @@ var xxx_messageInfo_ResourceTemplate proto.InternalMessageInfo func (m *RetryStrategy) Reset() { *m = RetryStrategy{} } func (*RetryStrategy) ProtoMessage() {} func (*RetryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{29} + return fileDescriptor_c23edafa7e7ea072, []int{33} } func (m *RetryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -874,7 +987,7 @@ var xxx_messageInfo_RetryStrategy proto.InternalMessageInfo func (m *S3Artifact) Reset() { *m = S3Artifact{} } func (*S3Artifact) ProtoMessage() {} func (*S3Artifact) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{30} + return fileDescriptor_c23edafa7e7ea072, []int{34} } func (m *S3Artifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -902,7 +1015,7 @@ var xxx_messageInfo_S3Artifact proto.InternalMessageInfo func (m *S3Bucket) Reset() { *m = S3Bucket{} } func (*S3Bucket) ProtoMessage() {} func (*S3Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{31} + return fileDescriptor_c23edafa7e7ea072, []int{35} } func (m *S3Bucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -930,7 +1043,7 @@ var xxx_messageInfo_S3Bucket proto.InternalMessageInfo func (m *ScriptTemplate) Reset() { *m = ScriptTemplate{} } func (*ScriptTemplate) ProtoMessage() {} func (*ScriptTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{32} + return fileDescriptor_c23edafa7e7ea072, []int{36} } func (m *ScriptTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -958,7 +1071,7 @@ var xxx_messageInfo_ScriptTemplate proto.InternalMessageInfo func (m *Sequence) Reset() { *m = Sequence{} } func (*Sequence) ProtoMessage() {} func (*Sequence) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{33} + return fileDescriptor_c23edafa7e7ea072, []int{37} } func (m *Sequence) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -986,7 +1099,7 @@ var xxx_messageInfo_Sequence proto.InternalMessageInfo func (m *SuspendTemplate) Reset() { *m = SuspendTemplate{} } func (*SuspendTemplate) ProtoMessage() {} func (*SuspendTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{34} + return fileDescriptor_c23edafa7e7ea072, []int{38} } func (m *SuspendTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1014,7 +1127,7 @@ var xxx_messageInfo_SuspendTemplate proto.InternalMessageInfo func (m *TTLStrategy) Reset() { *m = TTLStrategy{} } func (*TTLStrategy) ProtoMessage() {} func (*TTLStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{35} + return fileDescriptor_c23edafa7e7ea072, []int{39} } func (m *TTLStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1042,7 +1155,7 @@ var xxx_messageInfo_TTLStrategy proto.InternalMessageInfo func (m *TarStrategy) Reset() { *m = TarStrategy{} } func (*TarStrategy) ProtoMessage() {} func (*TarStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{36} + return fileDescriptor_c23edafa7e7ea072, []int{40} } func (m *TarStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1070,7 +1183,7 @@ var xxx_messageInfo_TarStrategy proto.InternalMessageInfo func (m *Template) Reset() { *m = Template{} } func (*Template) ProtoMessage() {} func (*Template) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{37} + return fileDescriptor_c23edafa7e7ea072, []int{41} } func (m *Template) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1098,7 +1211,7 @@ var xxx_messageInfo_Template proto.InternalMessageInfo func (m *TemplateRef) Reset() { *m = TemplateRef{} } func (*TemplateRef) ProtoMessage() {} func (*TemplateRef) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{38} + return fileDescriptor_c23edafa7e7ea072, []int{42} } func (m *TemplateRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1126,7 +1239,7 @@ var xxx_messageInfo_TemplateRef proto.InternalMessageInfo func (m *UserContainer) Reset() { *m = UserContainer{} } func (*UserContainer) ProtoMessage() {} func (*UserContainer) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{39} + return fileDescriptor_c23edafa7e7ea072, []int{43} } func (m *UserContainer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1154,7 +1267,7 @@ var xxx_messageInfo_UserContainer proto.InternalMessageInfo func (m *ValueFrom) Reset() { *m = ValueFrom{} } func (*ValueFrom) ProtoMessage() {} func (*ValueFrom) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{40} + return fileDescriptor_c23edafa7e7ea072, []int{44} } func (m *ValueFrom) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1182,7 +1295,7 @@ var xxx_messageInfo_ValueFrom proto.InternalMessageInfo func (m *Workflow) Reset() { *m = Workflow{} } func (*Workflow) ProtoMessage() {} func (*Workflow) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{41} + return fileDescriptor_c23edafa7e7ea072, []int{45} } func (m *Workflow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1210,7 +1323,7 @@ var xxx_messageInfo_Workflow proto.InternalMessageInfo func (m *WorkflowList) Reset() { *m = WorkflowList{} } func (*WorkflowList) ProtoMessage() {} func (*WorkflowList) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{42} + return fileDescriptor_c23edafa7e7ea072, []int{46} } func (m *WorkflowList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1238,7 +1351,7 @@ var xxx_messageInfo_WorkflowList proto.InternalMessageInfo func (m *WorkflowSpec) Reset() { *m = WorkflowSpec{} } func (*WorkflowSpec) ProtoMessage() {} func (*WorkflowSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{43} + return fileDescriptor_c23edafa7e7ea072, []int{47} } func (m *WorkflowSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1266,7 +1379,7 @@ var xxx_messageInfo_WorkflowSpec proto.InternalMessageInfo func (m *WorkflowStatus) Reset() { *m = WorkflowStatus{} } func (*WorkflowStatus) ProtoMessage() {} func (*WorkflowStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{44} + return fileDescriptor_c23edafa7e7ea072, []int{48} } func (m *WorkflowStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1294,7 +1407,7 @@ var xxx_messageInfo_WorkflowStatus proto.InternalMessageInfo func (m *WorkflowStep) Reset() { *m = WorkflowStep{} } func (*WorkflowStep) ProtoMessage() {} func (*WorkflowStep) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{45} + return fileDescriptor_c23edafa7e7ea072, []int{49} } func (m *WorkflowStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1322,7 +1435,7 @@ var xxx_messageInfo_WorkflowStep proto.InternalMessageInfo func (m *WorkflowTemplate) Reset() { *m = WorkflowTemplate{} } func (*WorkflowTemplate) ProtoMessage() {} func (*WorkflowTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{46} + return fileDescriptor_c23edafa7e7ea072, []int{50} } func (m *WorkflowTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1350,7 +1463,7 @@ var xxx_messageInfo_WorkflowTemplate proto.InternalMessageInfo func (m *WorkflowTemplateList) Reset() { *m = WorkflowTemplateList{} } func (*WorkflowTemplateList) ProtoMessage() {} func (*WorkflowTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{47} + return fileDescriptor_c23edafa7e7ea072, []int{51} } func (m *WorkflowTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1378,7 +1491,7 @@ var xxx_messageInfo_WorkflowTemplateList proto.InternalMessageInfo func (m *WorkflowTemplateSpec) Reset() { *m = WorkflowTemplateSpec{} } func (*WorkflowTemplateSpec) ProtoMessage() {} func (*WorkflowTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_c23edafa7e7ea072, []int{48} + return fileDescriptor_c23edafa7e7ea072, []int{52} } func (m *WorkflowTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1413,6 +1526,10 @@ func init() { proto.RegisterType((*ArtifactoryAuth)(nil), "github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.ArtifactoryAuth") proto.RegisterType((*Backoff)(nil), "github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Backoff") proto.RegisterType((*ContinueOn)(nil), "github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.ContinueOn") + proto.RegisterType((*CronWorkflow)(nil), "github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.CronWorkflow") + proto.RegisterType((*CronWorkflowList)(nil), "github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.CronWorkflowList") + proto.RegisterType((*CronWorkflowSpec)(nil), "github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.CronWorkflowSpec") + proto.RegisterType((*CronWorkflowStatus)(nil), "github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.CronWorkflowStatus") proto.RegisterType((*DAGTask)(nil), "github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.DAGTask") proto.RegisterType((*DAGTemplate)(nil), "github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.DAGTemplate") proto.RegisterType((*ExecutorConfig)(nil), "github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.ExecutorConfig") @@ -1468,312 +1585,329 @@ func init() { } var fileDescriptor_c23edafa7e7ea072 = []byte{ - // 4879 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7c, 0x4d, 0x6c, 0x1c, 0x57, - 0x72, 0xbf, 0x86, 0xe4, 0x0c, 0x67, 0x6a, 0x48, 0x91, 0x7a, 0xa2, 0xa4, 0x36, 0x2d, 0x73, 0xb4, - 0x6d, 0xd8, 0x7f, 0xed, 0x3f, 0x36, 0xb9, 0x96, 0x76, 0x13, 0xaf, 0x37, 0xb6, 0x97, 0xc3, 0x0f, - 0x89, 0x92, 0x48, 0x31, 0x35, 0x94, 0x9c, 0x8d, 0x17, 0xd9, 0x34, 0xbb, 0x1f, 0x67, 0x5a, 0x9c, - 0xe9, 0x6e, 0xf7, 0xeb, 0x11, 0x4d, 0x38, 0x40, 0x9c, 0x20, 0x41, 0x12, 0x04, 0x0b, 0x24, 0x97, - 0xcd, 0x22, 0x7b, 0x09, 0x72, 0x48, 0x2e, 0xb9, 0x04, 0xc8, 0x29, 0x87, 0x3d, 0x04, 0x39, 0x18, - 0xb9, 0xc4, 0xb7, 0xec, 0x21, 0x20, 0xd6, 0x0c, 0x10, 0x24, 0x48, 0x80, 0x20, 0xb9, 0x04, 0xd1, - 0x29, 0x78, 0x1f, 0xfd, 0xfa, 0x63, 0x9a, 0x36, 0x35, 0x43, 0x29, 0x08, 0x76, 0x4f, 0x62, 0x57, - 0xd5, 0xfb, 0xd5, 0xeb, 0xd7, 0xf5, 0xea, 0x55, 0xd5, 0xab, 0x11, 0xac, 0xb4, 0xdd, 0xa8, 0xd3, - 0xdf, 0x5d, 0xb4, 0xfd, 0xde, 0x92, 0x15, 0xb6, 0xfd, 0x20, 0xf4, 0x1f, 0x89, 0x3f, 0x96, 0x82, - 0xfd, 0xf6, 0x92, 0x15, 0xb8, 0x6c, 0xe9, 0xc0, 0x0f, 0xf7, 0xf7, 0xba, 0xfe, 0xc1, 0xd2, 0xe3, - 0x37, 0xac, 0x6e, 0xd0, 0xb1, 0xde, 0x58, 0x6a, 0x53, 0x8f, 0x86, 0x56, 0x44, 0x9d, 0xc5, 0x20, - 0xf4, 0x23, 0x9f, 0xdc, 0x4c, 0x40, 0x16, 0x63, 0x10, 0xf1, 0xc7, 0x62, 0xb0, 0xdf, 0x5e, 0xe4, - 0x20, 0x8b, 0x31, 0xc8, 0x62, 0x0c, 0x32, 0xff, 0x7a, 0x4a, 0x73, 0xdb, 0xe7, 0x0a, 0x39, 0xd6, - 0x6e, 0x7f, 0x4f, 0x3c, 0x89, 0x07, 0xf1, 0x97, 0xd4, 0x31, 0x6f, 0xee, 0xbf, 0xc9, 0x16, 0x5d, - 0x9f, 0x4f, 0x69, 0xc9, 0xf6, 0x43, 0xba, 0xf4, 0x78, 0x60, 0x1e, 0xf3, 0x5f, 0x4d, 0x64, 0x7a, - 0x96, 0xdd, 0x71, 0x3d, 0x1a, 0x1e, 0x26, 0xef, 0xd1, 0xa3, 0x91, 0x55, 0x34, 0x6a, 0xe9, 0xa4, - 0x51, 0x61, 0xdf, 0x8b, 0xdc, 0x1e, 0x1d, 0x18, 0xf0, 0xb3, 0x5f, 0x34, 0x80, 0xd9, 0x1d, 0xda, - 0xb3, 0xf2, 0xe3, 0xcc, 0xbf, 0x2b, 0xc1, 0xcc, 0x72, 0x68, 0x77, 0xdc, 0xc7, 0xb4, 0x15, 0x71, - 0x46, 0xfb, 0x90, 0xbc, 0x0f, 0xe3, 0x91, 0x15, 0x1a, 0xa5, 0x6b, 0xa5, 0xeb, 0xf5, 0x1b, 0xdf, - 0x5c, 0x1c, 0x62, 0x21, 0x17, 0x77, 0xac, 0x30, 0x86, 0x6b, 0x4e, 0x1e, 0x1f, 0x35, 0xc6, 0x77, - 0xac, 0x10, 0x39, 0x2a, 0xf9, 0x0e, 0x4c, 0x78, 0xbe, 0x47, 0x8d, 0x31, 0x81, 0xbe, 0x3c, 0x14, - 0xfa, 0x96, 0xef, 0xe9, 0xd9, 0x36, 0xab, 0xc7, 0x47, 0x8d, 0x09, 0x4e, 0x41, 0x01, 0x6c, 0xfe, - 0x7b, 0x09, 0x6a, 0xcb, 0x61, 0xbb, 0xdf, 0xa3, 0x5e, 0xc4, 0x48, 0x08, 0x10, 0x58, 0xa1, 0xd5, - 0xa3, 0x11, 0x0d, 0x99, 0x51, 0xba, 0x36, 0x7e, 0xbd, 0x7e, 0xe3, 0x9d, 0xa1, 0x94, 0x6e, 0xc7, - 0x30, 0x4d, 0xf2, 0xc9, 0x51, 0xe3, 0xdc, 0xf1, 0x51, 0x03, 0x34, 0x89, 0x61, 0x4a, 0x0b, 0xf1, - 0xa0, 0x66, 0x85, 0x91, 0xbb, 0x67, 0xd9, 0x11, 0x33, 0xc6, 0x84, 0xca, 0xb7, 0x87, 0x52, 0xb9, - 0xac, 0x50, 0x9a, 0x17, 0x94, 0xc6, 0x5a, 0x4c, 0x61, 0x98, 0xa8, 0x30, 0xff, 0x75, 0x1c, 0xaa, - 0x31, 0x83, 0x5c, 0x83, 0x09, 0xcf, 0xea, 0x51, 0xf1, 0xf5, 0x6a, 0xcd, 0x29, 0x35, 0x70, 0x62, - 0xcb, 0xea, 0xf1, 0x05, 0xb2, 0x7a, 0x94, 0x4b, 0x04, 0x56, 0xd4, 0x11, 0x5f, 0x20, 0x25, 0xb1, - 0x6d, 0x45, 0x1d, 0x14, 0x1c, 0x72, 0x15, 0x26, 0x7a, 0xbe, 0x43, 0x8d, 0xf1, 0x6b, 0xa5, 0xeb, - 0x65, 0xb9, 0xc0, 0x9b, 0xbe, 0x43, 0x51, 0x50, 0xf9, 0xf8, 0xbd, 0xd0, 0xef, 0x19, 0x13, 0xd9, - 0xf1, 0xeb, 0xa1, 0xdf, 0x43, 0xc1, 0x21, 0xbf, 0x57, 0x82, 0xd9, 0x78, 0x7a, 0xf7, 0x7c, 0xdb, - 0x8a, 0x5c, 0xdf, 0x33, 0xca, 0xe2, 0x83, 0xaf, 0x8d, 0xb4, 0x10, 0x31, 0x58, 0xd3, 0x50, 0x5a, - 0x67, 0xf3, 0x1c, 0x1c, 0x50, 0x4c, 0x6e, 0x00, 0xb4, 0xbb, 0xfe, 0xae, 0xd5, 0xe5, 0x6b, 0x60, - 0x54, 0xc4, 0xac, 0xf5, 0x27, 0xbc, 0xa5, 0x39, 0x98, 0x92, 0x22, 0xfb, 0x30, 0x69, 0xc9, 0x5d, - 0x61, 0x4c, 0x8a, 0x79, 0xaf, 0x0e, 0x39, 0xef, 0xcc, 0xce, 0x6a, 0xd6, 0x8f, 0x8f, 0x1a, 0x93, - 0x8a, 0x88, 0xb1, 0x06, 0xf2, 0x1a, 0x54, 0xfd, 0x80, 0x4f, 0xd5, 0xea, 0x1a, 0xd5, 0x6b, 0xa5, - 0xeb, 0xd5, 0xe6, 0xac, 0x9a, 0x5e, 0xf5, 0xbe, 0xa2, 0xa3, 0x96, 0x30, 0xff, 0xb0, 0x0c, 0x03, - 0x6f, 0x4d, 0xde, 0x80, 0xba, 0x42, 0xbb, 0xe7, 0xb7, 0x99, 0xf8, 0xf8, 0xd5, 0xe6, 0xcc, 0xf1, - 0x51, 0xa3, 0xbe, 0x9c, 0x90, 0x31, 0x2d, 0x43, 0xde, 0x83, 0x31, 0x76, 0x53, 0x6d, 0xc3, 0x77, - 0x87, 0x7a, 0xbb, 0xd6, 0x4d, 0x6d, 0xa0, 0x95, 0xe3, 0xa3, 0xc6, 0x58, 0xeb, 0x26, 0x8e, 0xb1, - 0x9b, 0xdc, 0x7d, 0xb4, 0xdd, 0x48, 0x18, 0xcf, 0xb0, 0xee, 0xe3, 0x96, 0x1b, 0x69, 0x68, 0xe1, - 0x3e, 0x6e, 0xb9, 0x11, 0x72, 0x54, 0xee, 0x3e, 0x3a, 0x51, 0x14, 0x08, 0xe3, 0x1b, 0xd6, 0x7d, - 0xdc, 0xde, 0xd9, 0xd9, 0xd6, 0xf0, 0xc2, 0xba, 0x39, 0x05, 0x05, 0x30, 0xf9, 0x88, 0xaf, 0xa4, - 0xe4, 0xf9, 0xe1, 0xa1, 0xb2, 0xda, 0xdb, 0x23, 0x59, 0xad, 0x1f, 0x1e, 0x6a, 0x75, 0xea, 0x9b, - 0x68, 0x06, 0xa6, 0xb5, 0x89, 0xb7, 0x73, 0xf6, 0x98, 0x30, 0xd2, 0xa1, 0xdf, 0x6e, 0x75, 0xbd, - 0x95, 0x7b, 0xbb, 0xd5, 0xf5, 0x16, 0x0a, 0x60, 0xfe, 0x6d, 0x42, 0xeb, 0x40, 0xd9, 0xf4, 0x70, - 0xdf, 0x06, 0xad, 0x83, 0xec, 0xb7, 0x41, 0xeb, 0x00, 0x39, 0xaa, 0xd9, 0x86, 0x4b, 0x31, 0x07, - 0x69, 0xe0, 0x33, 0x57, 0xbc, 0x20, 0xdd, 0x23, 0x4b, 0x50, 0xb3, 0x7d, 0x6f, 0xcf, 0x6d, 0x6f, - 0x5a, 0x81, 0x72, 0x4c, 0xda, 0xa3, 0xad, 0xc4, 0x0c, 0x4c, 0x64, 0xc8, 0x4b, 0x30, 0xbe, 0x4f, - 0x0f, 0x95, 0x87, 0xaa, 0x2b, 0xd1, 0xf1, 0xbb, 0xf4, 0x10, 0x39, 0xdd, 0xfc, 0x61, 0x09, 0x2e, - 0x16, 0x2c, 0x2e, 0x1f, 0xd6, 0x0f, 0xbb, 0x4a, 0x83, 0x1e, 0xf6, 0x00, 0xef, 0x21, 0xa7, 0x93, - 0xdf, 0x2e, 0xc1, 0x4c, 0x6a, 0xb5, 0x97, 0xfb, 0xca, 0x09, 0x0e, 0xbf, 0xbb, 0x33, 0x58, 0xcd, - 0x2b, 0x4a, 0xe3, 0x4c, 0x8e, 0x81, 0x79, 0xad, 0xe6, 0xdf, 0x8b, 0x53, 0x37, 0x43, 0x23, 0x16, - 0x9c, 0xef, 0x33, 0x1a, 0x72, 0x17, 0xdd, 0xa2, 0x76, 0x48, 0x23, 0x75, 0x00, 0xbf, 0xb2, 0x28, - 0x8f, 0x76, 0x3e, 0x8b, 0x45, 0x1e, 0x65, 0x2c, 0x3e, 0x7e, 0x63, 0x51, 0x4a, 0xdc, 0xa5, 0x87, - 0x2d, 0xda, 0xa5, 0x1c, 0xa3, 0x49, 0x8e, 0x8f, 0x1a, 0xe7, 0x1f, 0x64, 0x00, 0x30, 0x07, 0xc8, - 0x55, 0x04, 0x16, 0x63, 0x07, 0x7e, 0xe8, 0x28, 0x15, 0x63, 0x4f, 0xad, 0x62, 0x3b, 0x03, 0x80, - 0x39, 0x40, 0xf3, 0x7b, 0x25, 0x98, 0x6c, 0x5a, 0xf6, 0xbe, 0xbf, 0xb7, 0xc7, 0xfd, 0x9a, 0xd3, - 0x0f, 0xa5, 0xf7, 0x97, 0xdf, 0x44, 0xfb, 0xb5, 0x55, 0x45, 0x47, 0x2d, 0x41, 0x5e, 0x85, 0x8a, - 0x5c, 0x0e, 0x31, 0xa9, 0x72, 0xf3, 0xbc, 0x92, 0xad, 0xac, 0x0b, 0x2a, 0x2a, 0x2e, 0xf9, 0x1a, - 0xd4, 0x7b, 0xd6, 0x87, 0x31, 0x80, 0x70, 0x33, 0xb5, 0xe6, 0x45, 0x25, 0x5c, 0xdf, 0x4c, 0x58, - 0x98, 0x96, 0x33, 0xbf, 0x05, 0xb0, 0xe2, 0x7b, 0x91, 0xeb, 0xf5, 0xe9, 0x7d, 0x8f, 0xbc, 0x0c, - 0x65, 0x1a, 0x86, 0x7e, 0xa8, 0x3c, 0xe5, 0xb4, 0x1a, 0x5e, 0x5e, 0xe3, 0x44, 0x94, 0x3c, 0x39, - 0x23, 0xb7, 0x4b, 0x1d, 0x31, 0xa3, 0x6a, 0x7a, 0x46, 0x9c, 0x8a, 0x8a, 0x6b, 0xfe, 0x51, 0x05, - 0x26, 0x57, 0x97, 0x6f, 0xed, 0x58, 0x6c, 0xff, 0x14, 0xc7, 0xef, 0x6b, 0x50, 0x8d, 0x68, 0x2f, - 0xe8, 0x5a, 0x11, 0x55, 0x06, 0xae, 0x57, 0x65, 0x47, 0xd1, 0x51, 0x4b, 0x10, 0x9f, 0xc7, 0x12, - 0x2a, 0x98, 0x51, 0x2e, 0xf5, 0x9d, 0x21, 0x8d, 0x55, 0xa1, 0xa4, 0x83, 0x09, 0x45, 0xc2, 0x44, - 0x07, 0x61, 0x50, 0x8f, 0x95, 0x23, 0xdd, 0x53, 0x7e, 0x76, 0xc8, 0x20, 0x30, 0xc1, 0x91, 0x7e, - 0x2f, 0x45, 0xc0, 0xb4, 0x16, 0xf2, 0x55, 0x98, 0x72, 0x68, 0x40, 0x3d, 0x87, 0x7a, 0xb6, 0x4b, - 0x99, 0x51, 0xbe, 0x36, 0xce, 0xd7, 0xe5, 0xf8, 0xa8, 0x31, 0xb5, 0x9a, 0xa2, 0x63, 0x46, 0x8a, - 0x3c, 0x82, 0xda, 0x81, 0x1b, 0x75, 0x36, 0x22, 0xda, 0xe3, 0x2e, 0x93, 0xc7, 0x59, 0x5f, 0x1f, - 0x6a, 0xa2, 0x1c, 0x21, 0x59, 0x96, 0xf7, 0x62, 0x4c, 0x4c, 0xe0, 0xb9, 0x0b, 0xe3, 0x0f, 0x22, - 0xe2, 0x13, 0xee, 0xb3, 0x96, 0x1d, 0x20, 0x18, 0x98, 0xc8, 0x10, 0x06, 0x53, 0xfc, 0xa1, 0x45, - 0x3f, 0xe8, 0x53, 0xcf, 0xa6, 0xe2, 0x60, 0x1f, 0x36, 0x0e, 0x8c, 0x41, 0xe4, 0x8a, 0xbc, 0x97, - 0x82, 0xc5, 0x8c, 0x12, 0x6e, 0x7d, 0x07, 0x1d, 0xea, 0x19, 0xb5, 0xac, 0xf5, 0xbd, 0xd7, 0xa1, - 0x1e, 0x0a, 0x0e, 0xf1, 0x01, 0x6c, 0xbd, 0x0d, 0x0c, 0x18, 0xe1, 0xf4, 0x4f, 0x76, 0x53, 0xf3, - 0x3c, 0x8f, 0xa4, 0x92, 0x67, 0x4c, 0xa9, 0x30, 0xff, 0xba, 0x04, 0x75, 0xbe, 0x39, 0x62, 0x83, - 0x7e, 0x15, 0x2a, 0x91, 0x15, 0xb6, 0x95, 0x7b, 0xab, 0x25, 0x9b, 0x6a, 0x47, 0x50, 0x51, 0x71, - 0x89, 0x05, 0xe5, 0xc8, 0x62, 0xfb, 0x71, 0x00, 0xfd, 0xf3, 0x43, 0xcd, 0x51, 0xed, 0xca, 0x64, - 0x7f, 0xf3, 0x27, 0x86, 0x12, 0x99, 0x5c, 0x87, 0x2a, 0xdf, 0xc1, 0xeb, 0x16, 0x93, 0xd1, 0x4a, - 0xb5, 0x39, 0xc5, 0x77, 0xe1, 0xba, 0xa2, 0xa1, 0xe6, 0x9a, 0xdf, 0x86, 0xf3, 0x6b, 0x1f, 0x52, - 0xbb, 0x1f, 0xf9, 0xa1, 0x3c, 0xaf, 0xc8, 0x1d, 0x20, 0x8c, 0x86, 0x8f, 0x5d, 0x9b, 0x2e, 0xdb, - 0xb6, 0xdf, 0xf7, 0xa2, 0xad, 0x64, 0xd7, 0xcf, 0x2b, 0x6d, 0xa4, 0x35, 0x20, 0x81, 0x05, 0xa3, - 0xcc, 0x3f, 0x9f, 0x80, 0x7a, 0x2a, 0xe2, 0xe1, 0x5f, 0x31, 0xa4, 0x81, 0x9f, 0xf7, 0x21, 0xfc, - 0x4c, 0x45, 0xc1, 0xe1, 0x3e, 0x24, 0xa4, 0x8f, 0x5d, 0xc6, 0x1d, 0x60, 0xce, 0x87, 0xa0, 0xa2, - 0xa3, 0x96, 0x20, 0x0d, 0x28, 0x3b, 0x34, 0x88, 0x3a, 0xe2, 0x25, 0x27, 0x9a, 0x35, 0xbe, 0x10, - 0xab, 0x9c, 0x80, 0x92, 0xce, 0x05, 0xf6, 0x68, 0x64, 0x77, 0x8c, 0x09, 0xb1, 0xef, 0x84, 0xc0, - 0x3a, 0x27, 0xa0, 0xa4, 0x17, 0x9c, 0x4d, 0xe5, 0x67, 0x7f, 0x36, 0x55, 0xce, 0xf8, 0x6c, 0x22, - 0x01, 0x5c, 0x64, 0xac, 0xb3, 0x1d, 0xba, 0x8f, 0xad, 0x88, 0x8a, 0xc1, 0x42, 0xcf, 0xe4, 0xd3, - 0xe8, 0xb9, 0x72, 0x7c, 0xd4, 0xb8, 0xd8, 0x6a, 0xdd, 0xce, 0xa3, 0x60, 0x11, 0x34, 0x69, 0xc1, - 0x25, 0xd7, 0x63, 0xd4, 0xee, 0x87, 0x74, 0xa3, 0xed, 0xf9, 0x21, 0xbd, 0xed, 0x33, 0x0e, 0xa7, - 0xc2, 0xfc, 0x97, 0xd4, 0x47, 0xbb, 0xb4, 0x51, 0x24, 0x84, 0xc5, 0x63, 0xcd, 0xbf, 0x2d, 0xc1, - 0x54, 0x3a, 0xc8, 0x23, 0x0c, 0xa0, 0xb3, 0xba, 0xde, 0x92, 0x96, 0xa9, 0xa2, 0x86, 0x77, 0x87, - 0x8e, 0x1d, 0x25, 0x4c, 0x92, 0x21, 0x25, 0x34, 0x4c, 0xa9, 0x39, 0x45, 0x16, 0xf9, 0x32, 0x94, - 0xf7, 0xfc, 0xd0, 0xa6, 0x6a, 0x6f, 0xe9, 0x3d, 0xb8, 0xce, 0x89, 0x28, 0x79, 0xe6, 0x3f, 0x97, - 0x20, 0xa5, 0x81, 0xfc, 0x1a, 0x4c, 0x73, 0x1d, 0x77, 0xc3, 0xdd, 0xcc, 0xdb, 0x34, 0x87, 0x7e, - 0x1b, 0x8d, 0xd4, 0xbc, 0xa4, 0xf4, 0x4f, 0x67, 0xc8, 0x98, 0xd5, 0x47, 0x7e, 0x06, 0x6a, 0x96, - 0xe3, 0x84, 0x94, 0x31, 0x2a, 0x5d, 0x4f, 0xad, 0x39, 0x2d, 0xce, 0xca, 0x98, 0x88, 0x09, 0x9f, - 0x6f, 0x43, 0x1e, 0x55, 0x73, 0xcb, 0x56, 0x71, 0x88, 0xde, 0x86, 0x5c, 0x09, 0xa7, 0xa3, 0x96, - 0x30, 0xbf, 0x3b, 0x01, 0x59, 0xdd, 0xc4, 0x81, 0x99, 0xfd, 0x70, 0x77, 0x65, 0xc5, 0xb2, 0x3b, - 0x43, 0xc5, 0x7c, 0x17, 0x79, 0xb0, 0x79, 0x37, 0x8b, 0x80, 0x79, 0x48, 0xa5, 0xe5, 0x2e, 0x3d, - 0x8c, 0xac, 0xdd, 0x61, 0xc2, 0xbe, 0x58, 0x4b, 0x1a, 0x01, 0xf3, 0x90, 0x3c, 0x2c, 0xdb, 0x0f, - 0x77, 0xe3, 0x4d, 0x9e, 0x0f, 0xcb, 0xee, 0x26, 0x2c, 0x4c, 0xcb, 0xf1, 0x25, 0xdc, 0x0f, 0x77, - 0x91, 0x5a, 0xdd, 0xb8, 0xa0, 0xa0, 0x97, 0xf0, 0xae, 0xa2, 0xa3, 0x96, 0x20, 0x01, 0x90, 0xfd, - 0x78, 0xf5, 0x74, 0xe2, 0xa0, 0x7c, 0xd1, 0xf5, 0xa2, 0xb7, 0xd1, 0x42, 0xe9, 0x17, 0xba, 0xcc, - 0x7d, 0xf3, 0xdd, 0x01, 0x1c, 0x2c, 0xc0, 0x26, 0xdf, 0x82, 0x2b, 0xfb, 0xe1, 0xae, 0x72, 0xe4, - 0xdb, 0xa1, 0xeb, 0xd9, 0x6e, 0x90, 0xa9, 0x24, 0x34, 0xd4, 0x74, 0xaf, 0xdc, 0x2d, 0x16, 0xc3, - 0x93, 0xc6, 0x9b, 0xaf, 0xc3, 0x54, 0x3a, 0x13, 0xfd, 0x82, 0xec, 0xc5, 0xfc, 0xb7, 0x12, 0x54, - 0x36, 0xbc, 0xa0, 0xff, 0x13, 0x52, 0xd4, 0xfa, 0x93, 0x09, 0x98, 0xe0, 0xa1, 0x17, 0xb9, 0x0e, - 0x13, 0xd1, 0x61, 0x20, 0xcf, 0xd6, 0xf1, 0xe6, 0x5c, 0xec, 0x68, 0x76, 0x0e, 0x03, 0xfa, 0x44, - 0xfd, 0x8b, 0x42, 0x82, 0xbc, 0x03, 0x15, 0xaf, 0xdf, 0x7b, 0x68, 0x75, 0x95, 0x53, 0x7a, 0x35, - 0x0e, 0x2d, 0xb6, 0x04, 0xf5, 0xc9, 0x51, 0x63, 0x8e, 0x7a, 0xb6, 0xef, 0xb8, 0x5e, 0x7b, 0xe9, - 0x11, 0xf3, 0xbd, 0xc5, 0xad, 0x7e, 0x6f, 0x97, 0x86, 0xa8, 0x46, 0x91, 0x2f, 0xc3, 0xe4, 0xae, - 0xef, 0x77, 0x39, 0x80, 0x74, 0x59, 0x33, 0x0a, 0x60, 0xb2, 0x29, 0xc9, 0x18, 0xf3, 0x79, 0x14, - 0xc3, 0xa2, 0x90, 0x4b, 0x4e, 0x64, 0xa3, 0x98, 0x96, 0xa0, 0xa2, 0xe2, 0x92, 0x1e, 0x54, 0x7a, - 0x56, 0xc0, 0xe5, 0xca, 0x62, 0xc9, 0xd6, 0x86, 0x8e, 0x4f, 0x17, 0x37, 0x05, 0xce, 0x9a, 0x17, - 0x85, 0x87, 0x89, 0x3a, 0x49, 0x44, 0xa5, 0x84, 0xb8, 0x30, 0xd9, 0x75, 0x59, 0xc4, 0xf5, 0x55, - 0x46, 0xb0, 0x0a, 0xae, 0xef, 0xa1, 0xd5, 0xed, 0xd3, 0x64, 0x05, 0xee, 0x49, 0x58, 0x8c, 0xf1, - 0xe7, 0x0f, 0xa1, 0x9e, 0x9a, 0x11, 0x99, 0x95, 0x19, 0xbb, 0x30, 0x5e, 0x91, 0xa4, 0x93, 0x1d, - 0x28, 0x3f, 0xe6, 0x18, 0xca, 0xd9, 0x8c, 0x38, 0x13, 0x94, 0x60, 0x6f, 0x8d, 0xbd, 0x59, 0x7a, - 0xab, 0xfa, 0xfd, 0x3f, 0x6e, 0x9c, 0xfb, 0xf8, 0x1f, 0xae, 0x9d, 0x33, 0xff, 0x66, 0x1c, 0x6a, - 0x5a, 0xe4, 0xff, 0xb6, 0xa5, 0x84, 0x39, 0x4b, 0xb9, 0x33, 0xda, 0x7a, 0x9d, 0xca, 0x5c, 0x96, - 0xb3, 0xe6, 0x32, 0xd5, 0xfc, 0x7f, 0xa9, 0x4f, 0xfd, 0xe4, 0xa8, 0x61, 0x64, 0x17, 0x01, 0xad, - 0x83, 0x4d, 0xca, 0x98, 0xd5, 0xa6, 0x89, 0x19, 0x7c, 0xfd, 0x8b, 0xcc, 0x60, 0x2e, 0x6d, 0x06, - 0xb5, 0xe2, 0xcf, 0xf8, 0xf1, 0x38, 0x54, 0x37, 0x69, 0x64, 0x39, 0x56, 0x64, 0x91, 0xdf, 0x2a, - 0x41, 0xdd, 0xf2, 0x3c, 0x3f, 0x12, 0x79, 0x7b, 0xec, 0xde, 0xb6, 0x86, 0x5a, 0x8e, 0x18, 0x74, - 0x71, 0x39, 0x01, 0x94, 0x4b, 0xa2, 0x4f, 0xa6, 0x14, 0x07, 0xd3, 0x7a, 0xc9, 0x07, 0x50, 0xe9, - 0x5a, 0xbb, 0xb4, 0x1b, 0x7b, 0xbb, 0x8d, 0xd1, 0x66, 0x70, 0x4f, 0x60, 0xe5, 0xbe, 0x87, 0x24, - 0xa2, 0x52, 0x34, 0xff, 0x0e, 0xcc, 0xe6, 0x27, 0xfa, 0x34, 0x2b, 0xca, 0x3f, 0x46, 0x4a, 0xcd, - 0xd3, 0x0c, 0x35, 0xff, 0xbb, 0x06, 0xb0, 0xe5, 0x3b, 0xb4, 0x15, 0x59, 0x51, 0x9f, 0x91, 0x79, - 0x18, 0x73, 0x1d, 0x75, 0x14, 0x81, 0x9a, 0xed, 0xd8, 0xc6, 0x2a, 0x8e, 0xb9, 0x8e, 0x2e, 0x71, - 0x8c, 0x9d, 0x58, 0xe2, 0xf8, 0x1a, 0xd4, 0x1d, 0x97, 0x05, 0x5d, 0xeb, 0x70, 0xab, 0x20, 0x16, - 0x58, 0x4d, 0x58, 0x98, 0x96, 0x23, 0xaf, 0xa9, 0xfd, 0x2b, 0x37, 0x8a, 0x91, 0xdb, 0xbf, 0x55, - 0x3e, 0xbd, 0xd4, 0x1e, 0x7e, 0x13, 0xa6, 0xe2, 0x12, 0x82, 0xd0, 0x52, 0x16, 0xa3, 0xe2, 0x5d, - 0x3f, 0xb5, 0x93, 0xe2, 0x61, 0x46, 0x32, 0x5f, 0xe2, 0xa8, 0x3c, 0x97, 0x12, 0xc7, 0x2a, 0xcc, - 0xb2, 0xc8, 0x0f, 0xa9, 0x13, 0x4b, 0x6c, 0xac, 0x1a, 0x24, 0xf3, 0xa2, 0xb3, 0xad, 0x1c, 0x1f, - 0x07, 0x46, 0x90, 0x6d, 0x98, 0x8b, 0x27, 0x91, 0x7e, 0x41, 0xe3, 0xa2, 0x40, 0xba, 0xaa, 0x90, - 0xe6, 0xde, 0x2b, 0x90, 0xc1, 0xc2, 0x91, 0xe4, 0x1b, 0x30, 0x1d, 0x4f, 0xb3, 0x65, 0xfb, 0x01, - 0x35, 0xe6, 0x04, 0x94, 0x8e, 0x96, 0x77, 0xd2, 0x4c, 0xcc, 0xca, 0x92, 0xaf, 0x40, 0x39, 0xe8, - 0x58, 0x8c, 0xaa, 0x8a, 0x48, 0x9c, 0xf8, 0x96, 0xb7, 0x39, 0xf1, 0xc9, 0x51, 0xa3, 0xc6, 0xbf, - 0x99, 0x78, 0x40, 0x29, 0x48, 0x6e, 0x00, 0xec, 0xfa, 0x7d, 0xcf, 0xb1, 0xc2, 0xc3, 0x8d, 0x55, - 0x91, 0x06, 0xa5, 0x2e, 0x63, 0x9a, 0x9a, 0x83, 0x29, 0x29, 0xee, 0x6d, 0x7b, 0xd2, 0xef, 0xa8, - 0xc2, 0x86, 0xf6, 0xb6, 0xda, 0x1d, 0x29, 0x3e, 0x79, 0x1f, 0x6a, 0x2c, 0xb2, 0xc2, 0x88, 0x3a, - 0xcb, 0x91, 0xaa, 0x6e, 0xfc, 0xff, 0x54, 0x5c, 0xa8, 0xaf, 0x46, 0x93, 0x6f, 0xda, 0xa3, 0x91, - 0xc5, 0x23, 0xc5, 0x1d, 0xb7, 0x47, 0x93, 0x90, 0xa4, 0x15, 0x83, 0x60, 0x82, 0x47, 0x7e, 0x19, - 0x60, 0xcf, 0xf5, 0x5c, 0xd6, 0x11, 0xe8, 0xf5, 0xa7, 0x46, 0xd7, 0xef, 0xb9, 0xae, 0x51, 0x30, - 0x85, 0xc8, 0x13, 0xa6, 0xc0, 0x77, 0x36, 0xb6, 0x8d, 0x29, 0xf1, 0x96, 0x3a, 0x61, 0xda, 0xe6, - 0x44, 0x94, 0x3c, 0x72, 0x1d, 0xaa, 0x8e, 0x45, 0x7b, 0xbe, 0x47, 0x1d, 0x63, 0x3a, 0x29, 0x5a, - 0xac, 0x2a, 0x1a, 0x6a, 0x2e, 0xf9, 0x0e, 0x54, 0x5c, 0x11, 0x2f, 0x1a, 0xe7, 0xc5, 0x54, 0xbf, - 0x31, 0xdc, 0x89, 0x22, 0x20, 0x9a, 0xc0, 0xdd, 0x95, 0xfc, 0x1b, 0x15, 0x2c, 0xb1, 0x61, 0xd2, - 0xef, 0x47, 0x42, 0xc3, 0x8c, 0xd0, 0x30, 0x5c, 0x91, 0xe6, 0xbe, 0xc4, 0x90, 0x97, 0x63, 0xea, - 0x01, 0x63, 0x64, 0xfe, 0xbe, 0x76, 0xc7, 0xed, 0x3a, 0x21, 0xf5, 0x8c, 0x59, 0x91, 0x8f, 0x89, - 0xf7, 0x5d, 0x51, 0x34, 0xd4, 0x5c, 0xf2, 0x73, 0x30, 0xed, 0xf7, 0x23, 0x61, 0x37, 0xdc, 0xec, - 0x98, 0x71, 0x41, 0x88, 0x5f, 0xe0, 0x56, 0x7c, 0x3f, 0xcd, 0xc0, 0xac, 0x9c, 0x79, 0x1e, 0xa6, - 0xd2, 0x37, 0xca, 0xe6, 0x1f, 0x8c, 0x41, 0x3c, 0x8f, 0x9f, 0x84, 0x50, 0x9b, 0x98, 0x50, 0x09, - 0x29, 0xeb, 0x77, 0x23, 0xe5, 0xa9, 0xc5, 0xb7, 0x46, 0x41, 0x41, 0xc5, 0x31, 0x0f, 0x60, 0x9a, - 0xcf, 0xb6, 0xdb, 0xa5, 0xdd, 0x56, 0x44, 0x03, 0x46, 0xf6, 0xa0, 0xcc, 0xf8, 0x1f, 0x6a, 0x4d, - 0x86, 0xbb, 0xab, 0x8a, 0xfd, 0x14, 0x87, 0x4c, 0xec, 0x5d, 0x28, 0x40, 0x09, 0x6f, 0x7e, 0x6f, - 0x0c, 0x6a, 0x7a, 0x9d, 0x4e, 0x51, 0x5e, 0x7f, 0x05, 0x26, 0x1d, 0xba, 0x67, 0xf1, 0xb7, 0x51, - 0xd7, 0x47, 0xdc, 0xac, 0x56, 0x25, 0x09, 0x63, 0x1e, 0x69, 0xc4, 0x27, 0xa1, 0x7c, 0x65, 0x51, - 0xf2, 0x4a, 0x07, 0x9a, 0x64, 0x1f, 0x6a, 0xe2, 0x8f, 0xf5, 0xf8, 0xaa, 0x7b, 0xd8, 0xef, 0xfe, - 0x30, 0x46, 0x91, 0x85, 0x04, 0xfd, 0x88, 0x09, 0x7e, 0xee, 0x8a, 0xba, 0x7c, 0x9a, 0x2b, 0x6a, - 0x73, 0x1d, 0xb8, 0x63, 0xb8, 0xb5, 0x42, 0xde, 0x86, 0x2a, 0x53, 0xa6, 0xab, 0xd6, 0xe5, 0x4b, - 0x71, 0x0a, 0x1d, 0x9b, 0xf4, 0x93, 0xa3, 0xc6, 0xb4, 0x10, 0x8e, 0x09, 0xa8, 0x87, 0x98, 0x4b, - 0x50, 0x4f, 0x5d, 0xe9, 0xf1, 0x15, 0xe6, 0xf1, 0x4a, 0x7e, 0x85, 0x57, 0xad, 0xc8, 0x42, 0xc1, - 0x31, 0x9f, 0x8c, 0xc1, 0x2c, 0x52, 0xe6, 0xf7, 0x43, 0x9b, 0xa6, 0xcb, 0xba, 0x96, 0x9d, 0xba, - 0xe9, 0xd1, 0x21, 0xce, 0xb2, 0xa0, 0xa2, 0xe2, 0xf2, 0xe3, 0xa6, 0x47, 0xc3, 0xb6, 0xde, 0x6c, - 0xea, 0x23, 0xe9, 0xe3, 0x66, 0x33, 0xcd, 0xc4, 0xac, 0x2c, 0x79, 0x0d, 0xaa, 0x3d, 0xcb, 0x73, - 0xf7, 0x28, 0x8b, 0xf2, 0xf5, 0x96, 0x4d, 0x45, 0x47, 0x2d, 0x41, 0x6e, 0xc1, 0x05, 0x46, 0xa3, - 0xfb, 0x07, 0x1e, 0x0d, 0x91, 0xee, 0xd1, 0x50, 0x94, 0xe1, 0x27, 0x84, 0xcb, 0x7c, 0x41, 0x0d, - 0xbb, 0xd0, 0xca, 0x0b, 0xe0, 0xe0, 0x18, 0x71, 0x74, 0xf7, 0x6d, 0x9b, 0x32, 0xb6, 0xe2, 0x7b, - 0x8e, 0xab, 0xbb, 0x19, 0xd2, 0x47, 0x77, 0x8e, 0x8f, 0x03, 0x23, 0x38, 0xca, 0x9e, 0xe5, 0x76, - 0xfb, 0x21, 0x4d, 0x50, 0x2a, 0x59, 0x94, 0xf5, 0x1c, 0x1f, 0x07, 0x46, 0x98, 0xff, 0x54, 0x82, - 0x69, 0xa4, 0x51, 0x78, 0xa8, 0x17, 0xa5, 0x01, 0xe5, 0xae, 0xdb, 0x73, 0x65, 0xe9, 0xa8, 0x2c, - 0x2d, 0xf9, 0x1e, 0x27, 0xa0, 0xa4, 0x93, 0x55, 0xa8, 0x87, 0x7c, 0xc4, 0xb6, 0xdf, 0x75, 0xed, - 0x78, 0xc1, 0xcd, 0x38, 0x1a, 0xc3, 0x84, 0xf5, 0x24, 0xfb, 0x88, 0xe9, 0x61, 0xc4, 0x83, 0xc9, - 0x5d, 0x79, 0xaf, 0xa7, 0xae, 0xa1, 0x86, 0x73, 0xf6, 0xea, 0x6e, 0x50, 0xd4, 0x60, 0xe2, 0x8b, - 0xc2, 0x27, 0xc9, 0x9f, 0x18, 0x2b, 0x31, 0xbf, 0x5f, 0x02, 0x48, 0x1a, 0x0c, 0xc8, 0x3e, 0x54, - 0xd9, 0xcd, 0x66, 0xdf, 0xde, 0xd7, 0x35, 0xb2, 0x21, 0xaf, 0x52, 0x14, 0x48, 0x62, 0x39, 0x31, - 0x05, 0xb5, 0x82, 0x2f, 0xba, 0x7e, 0xfe, 0x8b, 0x71, 0xd0, 0xa3, 0xb8, 0x4d, 0x52, 0xcf, 0x09, - 0x7c, 0xd7, 0x8b, 0xf2, 0x97, 0x9c, 0x6b, 0x8a, 0x8e, 0x5a, 0x82, 0x6f, 0x93, 0x5d, 0xf9, 0x12, - 0x63, 0xd9, 0x6d, 0xa2, 0xe6, 0xa0, 0xb8, 0x5c, 0x2e, 0xa4, 0xed, 0xe4, 0x7e, 0x53, 0xcb, 0xa1, - 0xa0, 0xa2, 0xe2, 0xf2, 0xd3, 0x31, 0x2e, 0x12, 0x2b, 0xd3, 0x16, 0xa7, 0x63, 0x5c, 0x4f, 0x46, - 0xcd, 0x25, 0x1d, 0x98, 0xb1, 0x84, 0x45, 0x26, 0x85, 0xef, 0xa7, 0xaa, 0xe1, 0x27, 0x97, 0xdb, - 0x59, 0x14, 0xcc, 0xc3, 0x72, 0x4d, 0x2c, 0x19, 0xfe, 0xf4, 0xa5, 0x7c, 0xad, 0xa9, 0x95, 0x45, - 0xc1, 0x3c, 0x2c, 0x0f, 0x0c, 0x43, 0xbf, 0x4b, 0x97, 0x71, 0x4b, 0x05, 0xa0, 0x3a, 0x30, 0x44, - 0x49, 0xc6, 0x98, 0x6f, 0xfe, 0x4e, 0x09, 0xce, 0xb7, 0xec, 0xd0, 0x0d, 0x22, 0xed, 0xb2, 0xb6, - 0x44, 0x57, 0x42, 0x64, 0xf1, 0x90, 0x4d, 0xd9, 0xd4, 0x4b, 0x27, 0xd4, 0x10, 0xa5, 0x50, 0xa6, - 0x69, 0x41, 0x92, 0x30, 0x81, 0x10, 0x99, 0xbe, 0x70, 0x8a, 0xf9, 0x6f, 0xdb, 0x12, 0x54, 0x54, - 0x5c, 0xf3, 0x07, 0x25, 0xa8, 0xea, 0x1b, 0xbb, 0x97, 0xa1, 0x2c, 0x2e, 0x82, 0x94, 0xed, 0xe8, - 0x33, 0x70, 0x85, 0x13, 0x51, 0xf2, 0xb8, 0x90, 0x88, 0x42, 0x15, 0x70, 0xea, 0xa0, 0xb4, 0xc2, - 0x08, 0x25, 0x8f, 0x1b, 0x2d, 0xf5, 0x1c, 0x65, 0x2f, 0xda, 0x68, 0xd7, 0x3c, 0x07, 0x39, 0x5d, - 0x5c, 0x66, 0xfb, 0x61, 0xcf, 0x8a, 0xf2, 0x75, 0x88, 0x75, 0x41, 0x45, 0xc5, 0x35, 0xdf, 0x85, - 0x99, 0x56, 0x9f, 0x05, 0xd4, 0xd3, 0x69, 0xc7, 0xd3, 0xdd, 0xe3, 0x9b, 0xff, 0x51, 0x82, 0xfa, - 0xce, 0xce, 0x3d, 0xed, 0x9f, 0xee, 0xc3, 0x25, 0x46, 0x6d, 0xdf, 0x73, 0xd8, 0xf2, 0x5e, 0x44, - 0xc3, 0x15, 0xbf, 0x17, 0x74, 0x69, 0x44, 0x1d, 0xe5, 0xaf, 0x5e, 0x38, 0x3e, 0x6a, 0x5c, 0x6a, - 0x15, 0x09, 0x60, 0xf1, 0x38, 0xb2, 0x01, 0x17, 0xd3, 0x0c, 0xe5, 0x7a, 0x55, 0xd7, 0x80, 0xbc, - 0x9f, 0x19, 0x64, 0x63, 0xd1, 0x18, 0xb2, 0x0e, 0x24, 0x4d, 0x96, 0xf7, 0xfa, 0xaa, 0xed, 0xed, - 0xb2, 0xbc, 0xc1, 0xcb, 0x73, 0xb1, 0x60, 0x84, 0x39, 0x0d, 0xf5, 0x54, 0xc7, 0xa3, 0xf9, 0x9f, - 0x57, 0x40, 0xdf, 0xe5, 0xff, 0xb4, 0x23, 0x60, 0xa8, 0x74, 0xd9, 0xd6, 0xc9, 0x4b, 0x79, 0xf4, - 0xe4, 0x45, 0xdb, 0x7a, 0x2e, 0x81, 0x69, 0x27, 0x09, 0x4c, 0xe5, 0x0c, 0x12, 0x18, 0xed, 0x7d, - 0x06, 0x92, 0x98, 0xdf, 0x2d, 0xc1, 0x94, 0xe7, 0x3b, 0x34, 0xf6, 0x71, 0xc6, 0xa4, 0x08, 0x9a, - 0xef, 0x8f, 0xb4, 0x88, 0x8b, 0x5b, 0x29, 0x44, 0x59, 0x58, 0xd2, 0xd5, 0x8f, 0x34, 0x0b, 0x33, - 0xaa, 0xc9, 0x3a, 0x54, 0xad, 0x3d, 0x9e, 0x75, 0x46, 0x87, 0xaa, 0x29, 0xe1, 0x6a, 0x91, 0xd7, - 0x5b, 0x56, 0x32, 0xf2, 0x40, 0x89, 0x9f, 0x50, 0x8f, 0xe5, 0x27, 0x72, 0x4f, 0x15, 0xb7, 0x44, - 0x5a, 0x3e, 0xec, 0x89, 0x1c, 0x57, 0xc8, 0x52, 0xb1, 0x9c, 0xa2, 0xa0, 0x56, 0xc0, 0x53, 0x14, - 0x99, 0xd7, 0x8a, 0xa4, 0xbe, 0x2a, 0x53, 0x14, 0x99, 0xf3, 0xa2, 0xe2, 0x90, 0x76, 0x9c, 0x91, - 0xd4, 0xc5, 0xe2, 0x36, 0x87, 0xce, 0xd2, 0x74, 0x92, 0x53, 0x9c, 0x92, 0x90, 0x3b, 0xe9, 0x83, - 0x63, 0xea, 0x34, 0x07, 0xc7, 0xf4, 0x89, 0x87, 0x46, 0x1b, 0x2a, 0x4c, 0x1c, 0x4b, 0x22, 0x99, - 0xaf, 0xdf, 0x58, 0x19, 0x2e, 0xaa, 0xc9, 0x9c, 0x6c, 0x72, 0x75, 0x24, 0x0d, 0x15, 0x3c, 0xf1, - 0xa1, 0x1a, 0xaa, 0xa0, 0x5d, 0xd5, 0x03, 0x86, 0xbb, 0x8b, 0xc8, 0x47, 0xfe, 0xd2, 0x3e, 0x62, - 0x2a, 0x6a, 0x25, 0xe4, 0x7d, 0x18, 0x77, 0xac, 0xb6, 0xaa, 0x0c, 0x7c, 0x73, 0xe8, 0xf6, 0x8d, - 0x58, 0x8d, 0x68, 0x35, 0x5c, 0x5d, 0xbe, 0x85, 0x1c, 0x95, 0xec, 0xc3, 0x24, 0x93, 0xa7, 0x94, - 0x31, 0x3b, 0x42, 0x07, 0x5f, 0xee, 0xa4, 0x93, 0xb9, 0xa2, 0x22, 0x62, 0xac, 0x81, 0xac, 0xc1, - 0xe4, 0x63, 0xbf, 0xdb, 0xef, 0xa9, 0x92, 0x42, 0xfd, 0xc6, 0x7c, 0xd1, 0xd7, 0x7e, 0x28, 0x44, - 0x12, 0x27, 0x20, 0x9f, 0x19, 0xc6, 0x63, 0xc9, 0x6f, 0x94, 0xe0, 0x3c, 0xdf, 0x3a, 0xda, 0x0e, - 0x98, 0x41, 0x46, 0xb0, 0xd4, 0x07, 0x8c, 0x1f, 0x8a, 0xb1, 0x85, 0x5d, 0x56, 0x6a, 0xcf, 0x6f, - 0x64, 0x34, 0x60, 0x4e, 0x23, 0x09, 0xa0, 0xca, 0x5c, 0x87, 0xda, 0x56, 0xc8, 0x8c, 0x8b, 0x67, - 0xa6, 0x3d, 0x09, 0xa6, 0x15, 0x36, 0x6a, 0x2d, 0xe4, 0x37, 0x45, 0xd7, 0xa5, 0xea, 0x3b, 0x56, - 0xbd, 0xe0, 0x73, 0x67, 0xd9, 0x0b, 0x7e, 0x51, 0xb6, 0x5c, 0x66, 0x34, 0x60, 0x5e, 0x25, 0x0f, - 0x43, 0x78, 0x0a, 0xfa, 0x98, 0xae, 0x52, 0xcb, 0xe9, 0xba, 0x1e, 0x55, 0x47, 0xbb, 0x71, 0x49, - 0xdc, 0x16, 0x89, 0x30, 0x64, 0xb9, 0x48, 0x00, 0x8b, 0xc7, 0x91, 0x8f, 0x60, 0x3a, 0x4c, 0x27, - 0x62, 0xc6, 0xe5, 0x11, 0x5a, 0x15, 0x32, 0x29, 0x9d, 0x2c, 0x59, 0x65, 0x48, 0x98, 0xd5, 0x45, - 0xde, 0x80, 0x7a, 0xa0, 0x3c, 0x95, 0xcb, 0x7a, 0xc6, 0x15, 0xf1, 0x0e, 0xe2, 0x44, 0xdd, 0x4e, - 0xc8, 0x98, 0x96, 0x21, 0x0f, 0xa0, 0x1e, 0xf9, 0x5d, 0x1a, 0xaa, 0x6b, 0x15, 0x43, 0x7c, 0xfc, - 0x85, 0x22, 0x4b, 0xde, 0xd1, 0x62, 0x49, 0xd1, 0x3e, 0xa1, 0x31, 0x4c, 0xe3, 0xf0, 0x84, 0x9e, - 0xd9, 0x1d, 0xea, 0xf4, 0xbb, 0x34, 0x14, 0xd5, 0x8b, 0x17, 0xb2, 0x09, 0x7d, 0x2b, 0xcd, 0xc4, - 0xac, 0x2c, 0x4f, 0xd1, 0x83, 0xd0, 0xf5, 0x43, 0x37, 0x3a, 0x5c, 0xe9, 0x5a, 0x8c, 0x09, 0x80, - 0x79, 0x01, 0xa0, 0x53, 0xf4, 0xed, 0xbc, 0x00, 0x0e, 0x8e, 0xe1, 0x79, 0x50, 0x4c, 0x34, 0x5e, - 0x14, 0xe1, 0x9b, 0x70, 0x4b, 0xf1, 0x58, 0xd4, 0xdc, 0x13, 0x1a, 0xb7, 0xae, 0x0e, 0xd3, 0xb8, - 0x45, 0x1c, 0xb8, 0x6a, 0xf5, 0x23, 0xbf, 0xc7, 0x09, 0xd9, 0x21, 0x3b, 0xfe, 0x3e, 0xf5, 0x8c, - 0x6b, 0xe2, 0xac, 0xba, 0x76, 0x7c, 0xd4, 0xb8, 0xba, 0xfc, 0x39, 0x72, 0xf8, 0xb9, 0x28, 0xa4, - 0x07, 0x55, 0xaa, 0x9a, 0xcf, 0x8c, 0x2f, 0x8d, 0x70, 0x48, 0x64, 0x3b, 0xd8, 0xe4, 0x02, 0xc5, - 0x34, 0xd4, 0x2a, 0xc8, 0x0e, 0xd4, 0x3b, 0x3e, 0x8b, 0x96, 0xbb, 0xae, 0xc5, 0x28, 0x33, 0x5e, - 0x12, 0x76, 0x52, 0x78, 0xbe, 0xdd, 0x8e, 0xc5, 0x12, 0x33, 0xb9, 0x9d, 0x8c, 0xc4, 0x34, 0x0c, - 0xa1, 0x22, 0x29, 0xec, 0x8b, 0xaf, 0xe6, 0x7b, 0x11, 0xfd, 0x30, 0x32, 0x16, 0xc4, 0xbb, 0xbc, - 0x5a, 0x84, 0xbc, 0xed, 0x3b, 0xad, 0xac, 0xb4, 0xdc, 0xe5, 0x39, 0x22, 0xe6, 0x31, 0xc9, 0x9b, - 0x30, 0x15, 0xf8, 0x4e, 0x2b, 0xa0, 0xf6, 0xb6, 0x15, 0xd9, 0x1d, 0xa3, 0x91, 0xbd, 0x14, 0xda, - 0x4e, 0xf1, 0x30, 0x23, 0x39, 0xff, 0x2e, 0x5c, 0x18, 0x88, 0xa7, 0x9e, 0xea, 0x06, 0xed, 0x4f, - 0x79, 0xde, 0x93, 0x8a, 0x60, 0xcf, 0x3a, 0xee, 0xbf, 0x05, 0x17, 0xd4, 0x6f, 0xb9, 0xf8, 0x61, - 0xdb, 0xed, 0xeb, 0xee, 0xe7, 0x54, 0x39, 0x0b, 0xf3, 0x02, 0x38, 0x38, 0xc6, 0xfc, 0xb3, 0x12, - 0x4c, 0x67, 0xdc, 0xf7, 0x99, 0x67, 0xc2, 0xeb, 0x40, 0x7a, 0x6e, 0x18, 0xfa, 0xa1, 0x3c, 0x03, - 0x37, 0xb9, 0x2d, 0x33, 0xd5, 0x44, 0x2d, 0xd2, 0xaa, 0xcd, 0x01, 0x2e, 0x16, 0x8c, 0x30, 0xff, - 0xaa, 0x04, 0x49, 0xbd, 0x54, 0x77, 0x9c, 0x95, 0x4e, 0xec, 0x38, 0x7b, 0x0d, 0xaa, 0x8f, 0x98, - 0xef, 0x6d, 0x27, 0x7d, 0x69, 0x7a, 0x41, 0xef, 0xb4, 0xee, 0x6f, 0x09, 0x49, 0x2d, 0x21, 0xa4, - 0x3f, 0x58, 0x77, 0xbb, 0xd1, 0x60, 0xf7, 0xd6, 0x9d, 0x5f, 0x90, 0x74, 0xd4, 0x12, 0x64, 0x09, - 0x6a, 0xba, 0x44, 0xaf, 0x52, 0x68, 0xbd, 0x08, 0xba, 0x3e, 0x8d, 0x89, 0x8c, 0xf9, 0xc3, 0x31, - 0xa8, 0xc6, 0xf5, 0x6d, 0xf2, 0x2b, 0xa9, 0x60, 0x59, 0x2e, 0xf0, 0x57, 0x4e, 0x77, 0x71, 0x74, - 0x7f, 0xf7, 0x11, 0xb5, 0x23, 0x1e, 0x11, 0x27, 0x05, 0xe1, 0x84, 0x96, 0x8a, 0x90, 0x6d, 0x98, - 0x60, 0x01, 0xb5, 0x47, 0xfa, 0x5d, 0x9d, 0x2e, 0xc7, 0x07, 0xd4, 0x4e, 0x16, 0x98, 0x3f, 0xa1, - 0x00, 0x27, 0xfb, 0x50, 0x61, 0xe2, 0x82, 0x58, 0x25, 0x9e, 0x2b, 0x23, 0x56, 0xfd, 0x39, 0x54, - 0xba, 0x23, 0x82, 0x3f, 0xa3, 0x52, 0x61, 0x7e, 0x5a, 0x82, 0xa9, 0x58, 0xf4, 0x9e, 0xcb, 0x22, - 0xf2, 0xed, 0x81, 0x45, 0x5c, 0x3c, 0xdd, 0x22, 0xf2, 0xd1, 0x62, 0x09, 0xf5, 0x07, 0x8e, 0x29, - 0xa9, 0x05, 0xdc, 0x85, 0xb2, 0x2b, 0x3a, 0xc9, 0x47, 0xb9, 0x71, 0x89, 0xe7, 0x9b, 0x64, 0x0e, - 0xb2, 0x93, 0x5c, 0x42, 0x9b, 0x7f, 0x39, 0x97, 0xbc, 0x12, 0x5f, 0x56, 0xe2, 0x41, 0x2d, 0xde, - 0xe0, 0xf1, 0x4d, 0xca, 0xdb, 0x23, 0x25, 0x85, 0x89, 0x51, 0xc6, 0x14, 0x86, 0x89, 0x0a, 0x72, - 0x03, 0x80, 0x72, 0xcf, 0x26, 0xeb, 0x95, 0x63, 0xd9, 0x8b, 0x86, 0x35, 0xcd, 0xc1, 0x94, 0xd4, - 0xf3, 0x2f, 0x38, 0x14, 0x1f, 0xd1, 0x13, 0xcf, 0xe4, 0x88, 0xbe, 0x7a, 0xe6, 0x47, 0xf4, 0x4b, - 0xcf, 0xfe, 0x88, 0x4e, 0x25, 0x24, 0xe5, 0x11, 0x12, 0x92, 0x8f, 0x60, 0x4e, 0xfe, 0xb9, 0xd2, - 0xb5, 0xdc, 0x9e, 0xb6, 0x17, 0xd5, 0x3a, 0xf6, 0xe5, 0xc2, 0x83, 0x99, 0x86, 0xcc, 0x65, 0x11, - 0xf5, 0xa2, 0x87, 0xc9, 0xc8, 0xa4, 0xef, 0xe0, 0x61, 0x01, 0x1c, 0x16, 0x2a, 0xc9, 0x47, 0xb0, - 0x93, 0xa7, 0x88, 0x60, 0x7f, 0x50, 0x82, 0x4b, 0x56, 0xd1, 0x0f, 0xcc, 0x54, 0x1d, 0xe3, 0xce, - 0x48, 0xf9, 0x44, 0x06, 0x51, 0xe5, 0x03, 0x45, 0x2c, 0x2c, 0x9e, 0x03, 0x79, 0x25, 0x49, 0x49, - 0x6b, 0xc2, 0xa8, 0x8a, 0x93, 0xc9, 0xef, 0xe6, 0x4b, 0x41, 0x20, 0x56, 0xbb, 0x35, 0xb2, 0xc3, - 0x3e, 0x83, 0x72, 0x50, 0x7d, 0x84, 0x72, 0x50, 0x2e, 0xbd, 0x98, 0x3a, 0xa3, 0xf4, 0xc2, 0x83, - 0x59, 0xb7, 0x67, 0xb5, 0xe9, 0x76, 0xbf, 0xdb, 0x95, 0x55, 0x7f, 0x66, 0x4c, 0x0b, 0xec, 0xc2, - 0x7e, 0x5f, 0x9e, 0xee, 0x75, 0xe5, 0xf9, 0xa8, 0xef, 0xef, 0x92, 0xfb, 0xb5, 0x8d, 0x1c, 0x12, - 0x0e, 0x60, 0x73, 0xb3, 0xe4, 0x61, 0xeb, 0x16, 0x8d, 0xf8, 0x6a, 0x8b, 0x4a, 0x89, 0xfa, 0x21, - 0xed, 0xed, 0x84, 0x8c, 0x69, 0x19, 0x72, 0x17, 0x6a, 0x8e, 0xc7, 0xd4, 0xed, 0xda, 0x8c, 0xf0, - 0x52, 0xaf, 0x73, 0xdf, 0xb6, 0xba, 0xd5, 0xd2, 0xf7, 0x6a, 0x57, 0x07, 0xff, 0xa7, 0x80, 0x45, - 0xcd, 0xc7, 0x64, 0x3c, 0xd9, 0x14, 0x60, 0xaa, 0xf9, 0x5d, 0x96, 0x36, 0xae, 0x9d, 0x10, 0x21, - 0xaf, 0x6e, 0xc5, 0xbd, 0xfa, 0xd3, 0x4a, 0x9d, 0x6a, 0x69, 0x4f, 0x10, 0xc8, 0xab, 0x50, 0xf1, - 0xbd, 0xb5, 0x0f, 0xdd, 0xc8, 0xb8, 0x90, 0xad, 0xfa, 0xdf, 0x17, 0x54, 0x54, 0x5c, 0xf2, 0x00, - 0xae, 0x44, 0x51, 0x37, 0x53, 0xed, 0x56, 0x7d, 0x29, 0xa2, 0x49, 0xa9, 0xdc, 0x7c, 0xf1, 0xf8, - 0xa8, 0x71, 0x65, 0x67, 0xe7, 0x5e, 0x91, 0x08, 0x9e, 0x34, 0x56, 0x94, 0x8e, 0xa3, 0xae, 0xce, - 0x90, 0x17, 0x46, 0x29, 0x1d, 0x27, 0x57, 0x0a, 0xaa, 0x74, 0x9c, 0x10, 0x30, 0xad, 0xe5, 0xe4, - 0x4c, 0xff, 0xe2, 0x90, 0x99, 0x7e, 0x3a, 0xb9, 0x9c, 0xfb, 0xdc, 0xe4, 0x72, 0x20, 0x19, 0xbe, - 0xf4, 0x14, 0xc9, 0xf0, 0xfb, 0xa2, 0xfd, 0xe7, 0xd6, 0x8a, 0x2a, 0x24, 0xbc, 0x35, 0x5c, 0xfd, - 0x92, 0x23, 0xc8, 0x4b, 0x60, 0xf1, 0x27, 0x4a, 0x4c, 0xb2, 0x0d, 0x73, 0x81, 0xef, 0x0c, 0xe4, - 0xd2, 0xa2, 0x72, 0x90, 0x6a, 0x1c, 0xdb, 0x2e, 0x90, 0xc1, 0xc2, 0x91, 0xc2, 0x81, 0x27, 0x74, - 0xc3, 0x10, 0x0b, 0x23, 0x1d, 0x78, 0x42, 0xc6, 0xb4, 0x4c, 0x3e, 0xb5, 0x7c, 0xe1, 0x99, 0xa5, - 0x96, 0xf3, 0xcf, 0x21, 0xb5, 0x7c, 0xf1, 0xf9, 0xa5, 0x96, 0x9f, 0x55, 0xe1, 0x7c, 0x36, 0x68, - 0x4e, 0x3a, 0xef, 0x4a, 0xa7, 0xed, 0xbc, 0xcb, 0xb4, 0xc6, 0x8d, 0x3d, 0xd3, 0xd6, 0xb8, 0xf1, - 0x33, 0x6f, 0x8d, 0x4b, 0xb5, 0x00, 0x4e, 0x7c, 0x41, 0x0b, 0xe0, 0x32, 0xcc, 0xd8, 0x7e, 0x2f, - 0x10, 0x3f, 0xd1, 0x51, 0x8d, 0x60, 0xb2, 0x59, 0x43, 0xdf, 0x2b, 0xaf, 0x64, 0xd9, 0x98, 0x97, - 0x27, 0xbf, 0x0a, 0x65, 0x4f, 0x0c, 0xac, 0x8c, 0xd0, 0x7b, 0x9c, 0xfd, 0x60, 0xe2, 0x74, 0x56, - 0xed, 0xbf, 0x71, 0xad, 0xb6, 0x2c, 0x68, 0x4f, 0xe2, 0x3f, 0x50, 0x2a, 0xe5, 0x61, 0xce, 0x4c, - 0xb6, 0xf1, 0x93, 0x19, 0x35, 0x31, 0x91, 0x5f, 0x3c, 0x8b, 0x89, 0x64, 0xbb, 0x4c, 0xd5, 0x94, - 0x92, 0x3b, 0xf7, 0x2c, 0x17, 0xf3, 0x33, 0x21, 0x21, 0x5c, 0x0e, 0x8a, 0x82, 0x40, 0xa6, 0xee, - 0xb4, 0x3e, 0x2f, 0x14, 0x5d, 0x50, 0x5a, 0x2e, 0x17, 0x86, 0x91, 0x0c, 0x4f, 0x40, 0x4e, 0x37, - 0x1a, 0x56, 0x9f, 0x55, 0xa3, 0xe1, 0xfc, 0xa1, 0x6c, 0x80, 0x3e, 0xb1, 0x77, 0xfa, 0x41, 0xf6, - 0xf7, 0x0c, 0xef, 0x0e, 0xf9, 0x3f, 0xd7, 0xc4, 0x2d, 0xd6, 0xe9, 0xbe, 0xed, 0x5f, 0x2f, 0xc1, - 0x5c, 0xd1, 0x67, 0x29, 0x98, 0x45, 0x2b, 0x3b, 0x8b, 0xd1, 0x92, 0xc5, 0xb4, 0x8f, 0xf9, 0x97, - 0x72, 0x2a, 0x35, 0x8d, 0x68, 0xf0, 0xd3, 0x7b, 0xeb, 0xa1, 0xee, 0xad, 0x33, 0xbf, 0x49, 0x2f, - 0x3f, 0xc7, 0xdf, 0xa4, 0x57, 0x86, 0xf8, 0x4d, 0xfa, 0xe4, 0xf3, 0xfc, 0x4d, 0x7a, 0xf5, 0x94, - 0xbf, 0x49, 0xaf, 0x3d, 0xfb, 0xdf, 0xa4, 0x7f, 0x56, 0x82, 0xd9, 0x7c, 0x8b, 0xfc, 0x73, 0x28, - 0xd1, 0xed, 0x67, 0x4a, 0x74, 0x1b, 0x23, 0x39, 0x73, 0xdd, 0x96, 0x7f, 0x42, 0xa9, 0xce, 0xfc, - 0x71, 0x09, 0x06, 0x7e, 0x06, 0xf0, 0x1c, 0xaa, 0x68, 0x8f, 0xb2, 0x55, 0xb4, 0xb5, 0x33, 0x79, - 0xc9, 0x13, 0xaa, 0x69, 0xff, 0x55, 0xf0, 0x8a, 0xff, 0x2b, 0x55, 0xb5, 0x8c, 0x6b, 0x1b, 0x7b, - 0xf6, 0xae, 0xad, 0xb9, 0xf8, 0xc9, 0x67, 0x0b, 0xe7, 0x3e, 0xfd, 0x6c, 0xe1, 0xdc, 0x8f, 0x3e, - 0x5b, 0x38, 0xf7, 0xf1, 0xf1, 0x42, 0xe9, 0x93, 0xe3, 0x85, 0xd2, 0xa7, 0xc7, 0x0b, 0xa5, 0x1f, - 0x1d, 0x2f, 0x94, 0x7e, 0x7c, 0xbc, 0x50, 0xfa, 0xfd, 0x7f, 0x5c, 0x38, 0xf7, 0x4b, 0xd5, 0x18, - 0xf7, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x11, 0x7e, 0xec, 0x1c, 0x52, 0x4f, 0x00, 0x00, + // 5146 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7c, 0x4d, 0x6c, 0x1c, 0x47, + 0x76, 0xbf, 0x86, 0xe4, 0x0c, 0x67, 0xde, 0x90, 0x22, 0x55, 0xa2, 0xa4, 0x31, 0x2d, 0x73, 0xb4, + 0xed, 0xbf, 0xfd, 0xd7, 0x26, 0xf6, 0x70, 0x2d, 0xed, 0x26, 0x5e, 0x6f, 0x6c, 0x2f, 0x87, 0x14, + 0x25, 0x4a, 0x22, 0xc5, 0xbc, 0xa1, 0xa4, 0x6c, 0x6c, 0xec, 0xa6, 0xd9, 0x5d, 0x33, 0xd3, 0xe2, + 0x4c, 0x77, 0xbb, 0xab, 0x47, 0x34, 0xe1, 0x00, 0x71, 0x82, 0x04, 0x49, 0x10, 0x2c, 0x90, 0x5c, + 0x36, 0x8b, 0xec, 0x25, 0xc8, 0x21, 0xb9, 0xe4, 0x12, 0x20, 0xa7, 0x1c, 0xf6, 0x10, 0xe4, 0x60, + 0xec, 0x25, 0x46, 0x2e, 0xf1, 0x21, 0x20, 0xd6, 0x0c, 0x10, 0x24, 0x48, 0x80, 0x20, 0xb9, 0x04, + 0xd1, 0x29, 0xa8, 0x8f, 0xae, 0xfe, 0x98, 0xa6, 0x2c, 0xcd, 0x50, 0x0a, 0x82, 0xdd, 0x93, 0x38, + 0xef, 0xbd, 0xfa, 0xbd, 0xea, 0xaa, 0x57, 0xaf, 0xea, 0xbd, 0x7a, 0x25, 0x58, 0xed, 0x38, 0x61, + 0x77, 0xb0, 0xdb, 0xb0, 0xbc, 0xfe, 0xb2, 0x19, 0x74, 0x3c, 0x3f, 0xf0, 0x1e, 0x88, 0x3f, 0x96, + 0xfd, 0xbd, 0xce, 0xb2, 0xe9, 0x3b, 0x6c, 0x79, 0xdf, 0x0b, 0xf6, 0xda, 0x3d, 0x6f, 0x7f, 0xf9, + 0xe1, 0x1b, 0x66, 0xcf, 0xef, 0x9a, 0x6f, 0x2c, 0x77, 0xa8, 0x4b, 0x03, 0x33, 0xa4, 0x76, 0xc3, + 0x0f, 0xbc, 0xd0, 0x23, 0x57, 0x63, 0x90, 0x46, 0x04, 0x22, 0xfe, 0x68, 0xf8, 0x7b, 0x9d, 0x06, + 0x07, 0x69, 0x44, 0x20, 0x8d, 0x08, 0x64, 0xf1, 0xf5, 0x84, 0xe6, 0x8e, 0xc7, 0x15, 0x72, 0xac, + 0xdd, 0x41, 0x5b, 0xfc, 0x12, 0x3f, 0xc4, 0x5f, 0x52, 0xc7, 0xa2, 0xb1, 0xf7, 0x26, 0x6b, 0x38, + 0x1e, 0xef, 0xd2, 0xb2, 0xe5, 0x05, 0x74, 0xf9, 0xe1, 0x50, 0x3f, 0x16, 0xbf, 0x1a, 0xcb, 0xf4, + 0x4d, 0xab, 0xeb, 0xb8, 0x34, 0x38, 0x88, 0xbf, 0xa3, 0x4f, 0x43, 0x33, 0xaf, 0xd5, 0xf2, 0x71, + 0xad, 0x82, 0x81, 0x1b, 0x3a, 0x7d, 0x3a, 0xd4, 0xe0, 0xe7, 0xbe, 0xa8, 0x01, 0xb3, 0xba, 0xb4, + 0x6f, 0x66, 0xdb, 0x19, 0x7f, 0x5b, 0x80, 0xb9, 0x95, 0xc0, 0xea, 0x3a, 0x0f, 0x69, 0x2b, 0xe4, + 0x8c, 0xce, 0x01, 0x79, 0x0f, 0x26, 0x43, 0x33, 0xa8, 0x15, 0x2e, 0x15, 0x2e, 0x57, 0xaf, 0x7c, + 0xb3, 0x31, 0xc2, 0x40, 0x36, 0x76, 0xcc, 0x20, 0x82, 0x6b, 0x4e, 0x1f, 0x1d, 0xd6, 0x27, 0x77, + 0xcc, 0x00, 0x39, 0x2a, 0xf9, 0x0e, 0x4c, 0xb9, 0x9e, 0x4b, 0x6b, 0x13, 0x02, 0x7d, 0x65, 0x24, + 0xf4, 0x2d, 0xcf, 0xd5, 0xbd, 0x6d, 0x96, 0x8f, 0x0e, 0xeb, 0x53, 0x9c, 0x82, 0x02, 0xd8, 0xf8, + 0xf7, 0x02, 0x54, 0x56, 0x82, 0xce, 0xa0, 0x4f, 0xdd, 0x90, 0x91, 0x00, 0xc0, 0x37, 0x03, 0xb3, + 0x4f, 0x43, 0x1a, 0xb0, 0x5a, 0xe1, 0xd2, 0xe4, 0xe5, 0xea, 0x95, 0x77, 0x46, 0x52, 0xba, 0x1d, + 0xc1, 0x34, 0xc9, 0x27, 0x87, 0xf5, 0x53, 0x47, 0x87, 0x75, 0xd0, 0x24, 0x86, 0x09, 0x2d, 0xc4, + 0x85, 0x8a, 0x19, 0x84, 0x4e, 0xdb, 0xb4, 0x42, 0x56, 0x9b, 0x10, 0x2a, 0xdf, 0x1e, 0x49, 0xe5, + 0x8a, 0x42, 0x69, 0x9e, 0x51, 0x1a, 0x2b, 0x11, 0x85, 0x61, 0xac, 0xc2, 0xf8, 0xd7, 0x49, 0x28, + 0x47, 0x0c, 0x72, 0x09, 0xa6, 0x5c, 0xb3, 0x4f, 0xc5, 0xec, 0x55, 0x9a, 0x33, 0xaa, 0xe1, 0xd4, + 0x96, 0xd9, 0xe7, 0x03, 0x64, 0xf6, 0x29, 0x97, 0xf0, 0xcd, 0xb0, 0x2b, 0x66, 0x20, 0x21, 0xb1, + 0x6d, 0x86, 0x5d, 0x14, 0x1c, 0x72, 0x11, 0xa6, 0xfa, 0x9e, 0x4d, 0x6b, 0x93, 0x97, 0x0a, 0x97, + 0x8b, 0x72, 0x80, 0x37, 0x3d, 0x9b, 0xa2, 0xa0, 0xf2, 0xf6, 0xed, 0xc0, 0xeb, 0xd7, 0xa6, 0xd2, + 0xed, 0xd7, 0x03, 0xaf, 0x8f, 0x82, 0x43, 0x7e, 0xaf, 0x00, 0xf3, 0x51, 0xf7, 0x6e, 0x7b, 0x96, + 0x19, 0x3a, 0x9e, 0x5b, 0x2b, 0x8a, 0x09, 0xbf, 0x36, 0xd6, 0x40, 0x44, 0x60, 0xcd, 0x9a, 0xd2, + 0x3a, 0x9f, 0xe5, 0xe0, 0x90, 0x62, 0x72, 0x05, 0xa0, 0xd3, 0xf3, 0x76, 0xcd, 0x1e, 0x1f, 0x83, + 0x5a, 0x49, 0xf4, 0x5a, 0x4f, 0xe1, 0x75, 0xcd, 0xc1, 0x84, 0x14, 0xd9, 0x83, 0x69, 0x53, 0xae, + 0x8a, 0xda, 0xb4, 0xe8, 0xf7, 0xda, 0x88, 0xfd, 0x4e, 0xad, 0xac, 0x66, 0xf5, 0xe8, 0xb0, 0x3e, + 0xad, 0x88, 0x18, 0x69, 0x20, 0xaf, 0x41, 0xd9, 0xf3, 0x79, 0x57, 0xcd, 0x5e, 0xad, 0x7c, 0xa9, + 0x70, 0xb9, 0xdc, 0x9c, 0x57, 0xdd, 0x2b, 0xdf, 0x51, 0x74, 0xd4, 0x12, 0xc6, 0x1f, 0x16, 0x61, + 0xe8, 0xab, 0xc9, 0x1b, 0x50, 0x55, 0x68, 0xb7, 0xbd, 0x0e, 0x13, 0x93, 0x5f, 0x6e, 0xce, 0x1d, + 0x1d, 0xd6, 0xab, 0x2b, 0x31, 0x19, 0x93, 0x32, 0xe4, 0x3e, 0x4c, 0xb0, 0xab, 0x6a, 0x19, 0xbe, + 0x3b, 0xd2, 0xd7, 0xb5, 0xae, 0x6a, 0x03, 0x2d, 0x1d, 0x1d, 0xd6, 0x27, 0x5a, 0x57, 0x71, 0x82, + 0x5d, 0xe5, 0xee, 0xa3, 0xe3, 0x84, 0xc2, 0x78, 0x46, 0x75, 0x1f, 0xd7, 0x9d, 0x50, 0x43, 0x0b, + 0xf7, 0x71, 0xdd, 0x09, 0x91, 0xa3, 0x72, 0xf7, 0xd1, 0x0d, 0x43, 0x5f, 0x18, 0xdf, 0xa8, 0xee, + 0xe3, 0xc6, 0xce, 0xce, 0xb6, 0x86, 0x17, 0xd6, 0xcd, 0x29, 0x28, 0x80, 0xc9, 0x47, 0x7c, 0x24, + 0x25, 0xcf, 0x0b, 0x0e, 0x94, 0xd5, 0xde, 0x18, 0xcb, 0x6a, 0xbd, 0xe0, 0x40, 0xab, 0x53, 0x73, + 0xa2, 0x19, 0x98, 0xd4, 0x26, 0xbe, 0xce, 0x6e, 0x33, 0x61, 0xa4, 0x23, 0x7f, 0xdd, 0xda, 0x7a, + 0x2b, 0xf3, 0x75, 0x6b, 0xeb, 0x2d, 0x14, 0xc0, 0x7c, 0x6e, 0x02, 0x73, 0x5f, 0xd9, 0xf4, 0x68, + 0x73, 0x83, 0xe6, 0x7e, 0x7a, 0x6e, 0xd0, 0xdc, 0x47, 0x8e, 0x6a, 0x74, 0xe0, 0x5c, 0xc4, 0x41, + 0xea, 0x7b, 0xcc, 0x11, 0x1f, 0x48, 0xdb, 0x64, 0x19, 0x2a, 0x96, 0xe7, 0xb6, 0x9d, 0xce, 0xa6, + 0xe9, 0x2b, 0xc7, 0xa4, 0x3d, 0xda, 0x6a, 0xc4, 0xc0, 0x58, 0x86, 0xbc, 0x04, 0x93, 0x7b, 0xf4, + 0x40, 0x79, 0xa8, 0xaa, 0x12, 0x9d, 0xbc, 0x45, 0x0f, 0x90, 0xd3, 0x8d, 0x1f, 0x16, 0xe0, 0x6c, + 0xce, 0xe0, 0xf2, 0x66, 0x83, 0xa0, 0xa7, 0x34, 0xe8, 0x66, 0x77, 0xf1, 0x36, 0x72, 0x3a, 0xf9, + 0xed, 0x02, 0xcc, 0x25, 0x46, 0x7b, 0x65, 0xa0, 0x9c, 0xe0, 0xe8, 0xab, 0x3b, 0x85, 0xd5, 0xbc, + 0xa0, 0x34, 0xce, 0x65, 0x18, 0x98, 0xd5, 0x6a, 0xfc, 0xbd, 0xd8, 0x75, 0x53, 0x34, 0x62, 0xc2, + 0xe9, 0x01, 0xa3, 0x01, 0x77, 0xd1, 0x2d, 0x6a, 0x05, 0x34, 0x54, 0x1b, 0xf0, 0x2b, 0x0d, 0xb9, + 0xb5, 0xf3, 0x5e, 0x34, 0xf8, 0x29, 0xa3, 0xf1, 0xf0, 0x8d, 0x86, 0x94, 0xb8, 0x45, 0x0f, 0x5a, + 0xb4, 0x47, 0x39, 0x46, 0x93, 0x1c, 0x1d, 0xd6, 0x4f, 0xdf, 0x4d, 0x01, 0x60, 0x06, 0x90, 0xab, + 0xf0, 0x4d, 0xc6, 0xf6, 0xbd, 0xc0, 0x56, 0x2a, 0x26, 0x9e, 0x5a, 0xc5, 0x76, 0x0a, 0x00, 0x33, + 0x80, 0xc6, 0xf7, 0x0a, 0x30, 0xdd, 0x34, 0xad, 0x3d, 0xaf, 0xdd, 0xe6, 0x7e, 0xcd, 0x1e, 0x04, + 0xd2, 0xfb, 0xcb, 0x39, 0xd1, 0x7e, 0x6d, 0x4d, 0xd1, 0x51, 0x4b, 0x90, 0x57, 0xa1, 0x24, 0x87, + 0x43, 0x74, 0xaa, 0xd8, 0x3c, 0xad, 0x64, 0x4b, 0xeb, 0x82, 0x8a, 0x8a, 0x4b, 0xbe, 0x06, 0xd5, + 0xbe, 0xf9, 0x61, 0x04, 0x20, 0xdc, 0x4c, 0xa5, 0x79, 0x56, 0x09, 0x57, 0x37, 0x63, 0x16, 0x26, + 0xe5, 0x8c, 0x6f, 0x01, 0xac, 0x7a, 0x6e, 0xe8, 0xb8, 0x03, 0x7a, 0xc7, 0x25, 0x2f, 0x43, 0x91, + 0x06, 0x81, 0x17, 0x28, 0x4f, 0x39, 0xab, 0x9a, 0x17, 0xaf, 0x71, 0x22, 0x4a, 0x9e, 0xec, 0x91, + 0xd3, 0xa3, 0xb6, 0xe8, 0x51, 0x39, 0xd9, 0x23, 0x4e, 0x45, 0xc5, 0x35, 0x7e, 0x34, 0x01, 0x33, + 0xab, 0x81, 0xe7, 0xde, 0x57, 0x16, 0x42, 0x7e, 0x05, 0xca, 0xfc, 0x60, 0x67, 0x9b, 0xa1, 0xa9, + 0x26, 0xf1, 0x2b, 0x89, 0x11, 0xd6, 0xe7, 0xb3, 0xd8, 0xb6, 0xb8, 0x34, 0x1f, 0xf3, 0x3b, 0xbb, + 0x0f, 0xa8, 0x15, 0x6e, 0xd2, 0xd0, 0x8c, 0x77, 0xa8, 0x98, 0x86, 0x1a, 0x95, 0x74, 0x60, 0x8a, + 0xf9, 0xd4, 0x52, 0xf3, 0x37, 0xda, 0xa6, 0x9a, 0xec, 0x72, 0xcb, 0xa7, 0x56, 0xbc, 0x95, 0xf3, + 0x5f, 0x28, 0x14, 0x10, 0x0f, 0x4a, 0x2c, 0x34, 0xc3, 0x01, 0x53, 0xfe, 0xfc, 0xfa, 0xf8, 0xaa, + 0x04, 0x5c, 0x3c, 0x98, 0xf2, 0x37, 0x2a, 0x35, 0xc6, 0x67, 0x05, 0x98, 0x4f, 0x8a, 0xdf, 0x76, + 0x58, 0x48, 0xde, 0x1f, 0x1a, 0xd0, 0xc6, 0x93, 0x0d, 0x28, 0x6f, 0x2d, 0x86, 0x53, 0x5b, 0x5e, + 0x44, 0x49, 0x0c, 0x66, 0x1b, 0x8a, 0x4e, 0x48, 0xfb, 0xd1, 0x59, 0x6d, 0x65, 0xec, 0x4f, 0x8c, + 0xed, 0x69, 0x83, 0xe3, 0xa2, 0x84, 0x37, 0x8e, 0xa6, 0xd2, 0x9f, 0xc6, 0x87, 0x99, 0x9f, 0x95, + 0x66, 0xf6, 0x13, 0x04, 0xf5, 0x7d, 0xa3, 0x75, 0x22, 0x35, 0x9d, 0xff, 0x4f, 0x75, 0x62, 0x26, + 0x49, 0x7d, 0x94, 0xf9, 0x8d, 0x29, 0xe5, 0x7c, 0xc9, 0xf2, 0x40, 0xc1, 0x1e, 0xf4, 0xa8, 0xf2, + 0xbe, 0x7a, 0xe0, 0x5a, 0x8a, 0x8e, 0x5a, 0x82, 0xbc, 0x0f, 0x67, 0x2c, 0xcf, 0xb5, 0x06, 0x41, + 0x40, 0x5d, 0xeb, 0x60, 0xdb, 0xeb, 0x39, 0xd6, 0x81, 0x5a, 0x90, 0x0d, 0xd5, 0xec, 0xcc, 0x6a, + 0x56, 0xe0, 0x51, 0x1e, 0x11, 0x87, 0x81, 0xc8, 0x97, 0x61, 0x9a, 0x0d, 0x98, 0x4f, 0x5d, 0x5b, + 0xec, 0xf6, 0xe5, 0xe6, 0x9c, 0xc2, 0x9c, 0x6e, 0x49, 0x32, 0x46, 0x7c, 0x72, 0x17, 0x2e, 0xb0, + 0x90, 0x3b, 0x59, 0xb7, 0xb3, 0x46, 0x4d, 0xbb, 0xe7, 0xb8, 0xdc, 0xe5, 0x79, 0xae, 0xcd, 0xc4, + 0x06, 0x3e, 0xd9, 0x7c, 0xf1, 0xe8, 0xb0, 0x7e, 0xa1, 0x95, 0x2f, 0x82, 0xc7, 0xb5, 0x25, 0xdf, + 0x86, 0x45, 0x36, 0xb0, 0x2c, 0xca, 0x58, 0x7b, 0xd0, 0xbb, 0xe9, 0xed, 0xb2, 0x1b, 0x0e, 0xe3, + 0xfe, 0xfa, 0xb6, 0xd3, 0x77, 0x42, 0xb1, 0x49, 0x17, 0x9b, 0x4b, 0x47, 0x87, 0xf5, 0xc5, 0xd6, + 0xb1, 0x52, 0xf8, 0x18, 0x04, 0x82, 0x70, 0x5e, 0xba, 0x90, 0x21, 0xec, 0x69, 0x81, 0xbd, 0x78, + 0x74, 0x58, 0x3f, 0xbf, 0x9e, 0x2b, 0x81, 0xc7, 0xb4, 0x34, 0xfe, 0xae, 0x00, 0x64, 0x78, 0xb9, + 0x91, 0x5b, 0x50, 0x32, 0xad, 0x90, 0x9f, 0x67, 0x65, 0x0c, 0xf4, 0x72, 0x9e, 0xcb, 0x97, 0xae, + 0x06, 0x69, 0x9b, 0xf2, 0x79, 0xa0, 0xf1, 0x1a, 0x5d, 0x11, 0x4d, 0x51, 0x41, 0x10, 0x0f, 0xce, + 0xf4, 0x4c, 0x16, 0x46, 0x16, 0x61, 0xef, 0x38, 0xfd, 0x28, 0xa0, 0xfb, 0x99, 0x27, 0x5b, 0x97, + 0xbc, 0x45, 0xf3, 0x1c, 0xb7, 0x8f, 0xdb, 0x59, 0x20, 0x1c, 0xc6, 0x36, 0xfe, 0xa8, 0x04, 0xd3, + 0x6b, 0x2b, 0xd7, 0x77, 0x4c, 0xb6, 0xf7, 0x04, 0x01, 0xce, 0x6b, 0x50, 0x0e, 0x69, 0xdf, 0xef, + 0x99, 0xe1, 0x90, 0x11, 0xef, 0x28, 0x3a, 0x6a, 0x09, 0xe2, 0xf1, 0x68, 0x4d, 0x85, 0x8b, 0xca, + 0xc9, 0xbd, 0x33, 0xe2, 0x71, 0x40, 0xa1, 0x24, 0xc3, 0x35, 0x45, 0xc2, 0x58, 0x07, 0x61, 0x50, + 0x8d, 0x94, 0x23, 0x6d, 0xab, 0x93, 0xec, 0x88, 0x61, 0x76, 0x8c, 0x23, 0x4f, 0x96, 0x09, 0x02, + 0x26, 0xb5, 0x90, 0xaf, 0xc2, 0x8c, 0x4d, 0xf9, 0x5a, 0xa1, 0xae, 0xe5, 0x50, 0xbe, 0x2c, 0x26, + 0xf9, 0xb8, 0x70, 0xf7, 0xb0, 0x96, 0xa0, 0x63, 0x4a, 0x8a, 0x3c, 0x80, 0xca, 0xbe, 0x13, 0x76, + 0x85, 0x17, 0xab, 0x95, 0x84, 0xe1, 0x7c, 0x7d, 0xa4, 0x8e, 0x72, 0x84, 0x78, 0x58, 0xee, 0x47, + 0x98, 0x18, 0xc3, 0xf3, 0x43, 0x22, 0xff, 0x21, 0x62, 0x6a, 0x61, 0xff, 0x95, 0x74, 0x03, 0xc1, + 0xc0, 0x58, 0x86, 0x30, 0x98, 0xe1, 0x3f, 0x5a, 0xf4, 0x83, 0x01, 0xb7, 0x56, 0x11, 0x3a, 0x8d, + 0x1a, 0x69, 0x47, 0x20, 0x72, 0x44, 0xee, 0x27, 0x60, 0x31, 0xa5, 0x84, 0x5b, 0xdf, 0x7e, 0x97, + 0xba, 0xb5, 0x4a, 0xda, 0xfa, 0xee, 0x77, 0xa9, 0x8b, 0x82, 0x43, 0x3c, 0x00, 0x4b, 0x1f, 0x34, + 0x6a, 0x30, 0x46, 0x7c, 0x15, 0x9f, 0x57, 0x9a, 0xa7, 0xf9, 0x49, 0x20, 0xfe, 0x8d, 0x09, 0x15, + 0xc6, 0x5f, 0x17, 0xa0, 0xca, 0x17, 0x47, 0x64, 0xd0, 0xaf, 0x42, 0x29, 0x34, 0x83, 0x8e, 0x3a, + 0x40, 0x56, 0xe2, 0x55, 0xbc, 0x23, 0xa8, 0xa8, 0xb8, 0xc4, 0x84, 0x62, 0x68, 0xb2, 0xbd, 0x68, + 0xdb, 0xfb, 0x85, 0x91, 0xfa, 0xa8, 0x56, 0x65, 0xbc, 0xe3, 0xf1, 0x5f, 0x0c, 0x25, 0x32, 0xb9, + 0x0c, 0x65, 0xee, 0xa6, 0xd6, 0x4d, 0x26, 0xe3, 0xc1, 0x72, 0x73, 0x86, 0xaf, 0xc2, 0x75, 0x45, + 0x43, 0xcd, 0x35, 0xde, 0x87, 0xd3, 0xd7, 0x3e, 0xa4, 0xd6, 0x20, 0xf4, 0x02, 0x19, 0x11, 0x90, + 0x9b, 0x40, 0x18, 0x0d, 0x1e, 0x3a, 0x16, 0x5d, 0xb1, 0x2c, 0x6f, 0xe0, 0x86, 0x5b, 0xf1, 0xaa, + 0x5f, 0x54, 0xda, 0x48, 0x6b, 0x48, 0x02, 0x73, 0x5a, 0x19, 0x7f, 0x3e, 0x05, 0xd5, 0x44, 0x4c, + 0xc9, 0x67, 0x31, 0xa0, 0xbe, 0x97, 0xf5, 0x21, 0x3c, 0x6a, 0x41, 0xc1, 0xe1, 0x3e, 0x24, 0xa0, + 0x0f, 0x1d, 0xc6, 0x8f, 0x98, 0x19, 0x1f, 0x82, 0x8a, 0x8e, 0x5a, 0x82, 0xd4, 0xa1, 0x68, 0x53, + 0x3f, 0xec, 0x8a, 0x8f, 0x9c, 0x6a, 0x56, 0xf8, 0x40, 0xac, 0x71, 0x02, 0x4a, 0x3a, 0x17, 0x68, + 0xd3, 0xd0, 0xea, 0xd6, 0xa6, 0xc4, 0xba, 0x13, 0x02, 0xeb, 0x9c, 0x80, 0x92, 0x9e, 0x73, 0xfa, + 0x2f, 0x3e, 0xfb, 0xd3, 0x7f, 0xe9, 0x84, 0x4f, 0xff, 0xc4, 0x87, 0xb3, 0x8c, 0x75, 0xb7, 0x03, + 0xe7, 0xa1, 0x19, 0x52, 0xd1, 0x58, 0xe8, 0x99, 0x7e, 0x1a, 0x3d, 0x17, 0x8e, 0x0e, 0xeb, 0x67, + 0x5b, 0xad, 0x1b, 0x59, 0x14, 0xcc, 0x83, 0x26, 0x2d, 0x38, 0xe7, 0xb8, 0x8c, 0x5a, 0x83, 0x80, + 0x6e, 0x74, 0x5c, 0x2f, 0xa0, 0x37, 0x3c, 0xc6, 0xe1, 0x54, 0x22, 0xe5, 0x25, 0x35, 0x69, 0xe7, + 0x36, 0xf2, 0x84, 0x30, 0xbf, 0xad, 0xf1, 0xa3, 0x02, 0xcc, 0x24, 0xc3, 0x68, 0xc2, 0x00, 0xba, + 0x6b, 0xeb, 0x2d, 0x69, 0x99, 0xea, 0x84, 0xf6, 0xee, 0xc8, 0xd1, 0xb9, 0x84, 0x89, 0x4f, 0xf8, + 0x31, 0x0d, 0x13, 0x6a, 0x9e, 0x20, 0x4f, 0xf7, 0x32, 0x14, 0xdb, 0x5e, 0x60, 0x51, 0xb5, 0xb6, + 0xf4, 0x1a, 0x5c, 0xe7, 0x44, 0x94, 0x3c, 0xe3, 0x9f, 0x0b, 0x90, 0xd0, 0x40, 0x7e, 0x0d, 0x66, + 0xb9, 0x8e, 0x5b, 0xc1, 0x6e, 0xea, 0x6b, 0x9a, 0x23, 0x7f, 0x8d, 0x46, 0x6a, 0x9e, 0x53, 0xfa, + 0x67, 0x53, 0x64, 0x4c, 0xeb, 0x23, 0x3f, 0x0b, 0x15, 0xd3, 0xb6, 0x03, 0xca, 0x18, 0x95, 0xae, + 0xa7, 0xd2, 0x9c, 0x15, 0x7b, 0x65, 0x44, 0xc4, 0x98, 0xcf, 0x97, 0x61, 0xd7, 0x6e, 0x33, 0x6e, + 0xd9, 0xea, 0x60, 0xa9, 0x97, 0x21, 0x57, 0xc2, 0xe9, 0xa8, 0x25, 0x8c, 0xef, 0x4e, 0x41, 0x5a, + 0x37, 0xb1, 0x61, 0x6e, 0x2f, 0xd8, 0x5d, 0x5d, 0x35, 0xad, 0xee, 0x48, 0x51, 0xf5, 0x59, 0x1e, + 0xce, 0xdf, 0x4a, 0x23, 0x60, 0x16, 0x52, 0x69, 0xb9, 0x45, 0x0f, 0x42, 0x73, 0x77, 0x94, 0xc0, + 0x3a, 0xd2, 0x92, 0x44, 0xc0, 0x2c, 0x24, 0x0f, 0x7c, 0xf7, 0x82, 0xdd, 0x68, 0x91, 0x67, 0x03, + 0xdf, 0x5b, 0x31, 0x0b, 0x93, 0x72, 0x7c, 0x08, 0xf7, 0x82, 0x5d, 0xa4, 0x66, 0x2f, 0x4a, 0xd9, + 0xea, 0x21, 0xbc, 0xa5, 0xe8, 0xa8, 0x25, 0x88, 0x0f, 0x64, 0x2f, 0x1a, 0x3d, 0x9d, 0x9a, 0x51, + 0xbe, 0xe8, 0x72, 0xde, 0xd7, 0x68, 0xa1, 0xe4, 0x07, 0x9d, 0xe7, 0xbe, 0xf9, 0xd6, 0x10, 0x0e, + 0xe6, 0x60, 0x93, 0x6f, 0xc1, 0x85, 0xbd, 0x60, 0x57, 0x39, 0xf2, 0xed, 0xc0, 0x71, 0x2d, 0xc7, + 0x4f, 0xe5, 0x6a, 0xeb, 0xaa, 0xbb, 0x17, 0x6e, 0xe5, 0x8b, 0xe1, 0x71, 0xed, 0x8d, 0xd7, 0x61, + 0x26, 0x99, 0xeb, 0xfb, 0x82, 0xfc, 0x90, 0xf1, 0x6f, 0x05, 0x28, 0x6d, 0xb8, 0xfe, 0xe0, 0x27, + 0xe4, 0xda, 0xe0, 0x4f, 0xa6, 0x60, 0x8a, 0x1f, 0xbd, 0xc8, 0x65, 0x98, 0x0a, 0x0f, 0x7c, 0xb9, + 0xb7, 0x4e, 0x36, 0x17, 0x22, 0x47, 0xb3, 0x73, 0xe0, 0xd3, 0x47, 0xea, 0x5f, 0x14, 0x12, 0xe4, + 0x1d, 0x28, 0xb9, 0x83, 0xfe, 0x3d, 0xb3, 0xa7, 0x9c, 0xd2, 0xab, 0xd1, 0xd1, 0x62, 0x4b, 0x50, + 0x1f, 0x1d, 0xd6, 0x17, 0xa8, 0x6b, 0x79, 0xb6, 0xe3, 0x76, 0x96, 0x1f, 0x30, 0xcf, 0x6d, 0x6c, + 0x0d, 0xfa, 0xbb, 0x34, 0x40, 0xd5, 0x8a, 0x87, 0x74, 0xbb, 0x9e, 0xd7, 0xe3, 0x00, 0x93, 0xe9, + 0x90, 0xae, 0x29, 0xc9, 0x18, 0xf1, 0xf9, 0x29, 0x86, 0x85, 0x01, 0x97, 0x9c, 0x4a, 0x9f, 0x62, + 0x5a, 0x82, 0x8a, 0x8a, 0x4b, 0xfa, 0x50, 0xea, 0x9b, 0x3e, 0x97, 0x2b, 0x8a, 0x21, 0xbb, 0x36, + 0xf2, 0xf9, 0xb4, 0xb1, 0x29, 0x70, 0xae, 0xb9, 0x61, 0x70, 0x10, 0xab, 0x93, 0x44, 0x54, 0x4a, + 0x88, 0x03, 0xd3, 0x3d, 0x87, 0x85, 0x5c, 0x5f, 0x69, 0x0c, 0xab, 0xe0, 0xfa, 0xee, 0x99, 0xbd, + 0x01, 0x8d, 0x47, 0xe0, 0xb6, 0x84, 0xc5, 0x08, 0x7f, 0xf1, 0x00, 0xaa, 0x89, 0x1e, 0x91, 0x79, + 0x99, 0x13, 0x15, 0xc6, 0x2b, 0xd2, 0xa0, 0x64, 0x07, 0x8a, 0x0f, 0x39, 0x86, 0x72, 0x36, 0x63, + 0xf6, 0x04, 0x25, 0xd8, 0x5b, 0x13, 0x6f, 0x16, 0xde, 0x2a, 0x7f, 0xff, 0x8f, 0xeb, 0xa7, 0x3e, + 0xfe, 0x87, 0x4b, 0xa7, 0x8c, 0xbf, 0x99, 0x84, 0x8a, 0x16, 0xf9, 0xbf, 0x6d, 0x29, 0x41, 0xc6, + 0x52, 0x6e, 0x8e, 0x37, 0x5e, 0x4f, 0x64, 0x2e, 0x2b, 0x69, 0x73, 0x99, 0x69, 0xfe, 0xff, 0xc4, + 0x54, 0x3f, 0x3a, 0xac, 0xd7, 0xd2, 0x83, 0x80, 0xe6, 0xfe, 0x26, 0x65, 0xcc, 0xec, 0xd0, 0xd8, + 0x0c, 0xbe, 0xfe, 0x45, 0x66, 0xb0, 0x90, 0x34, 0x83, 0x4a, 0xfe, 0x34, 0x7e, 0x3c, 0x09, 0xe5, + 0xcd, 0x28, 0xdf, 0xf5, 0x5b, 0x05, 0xa8, 0x9a, 0xae, 0xeb, 0x85, 0x22, 0x33, 0x1a, 0xb9, 0xb7, + 0xad, 0x91, 0x86, 0x23, 0x02, 0x6d, 0xac, 0xc4, 0x80, 0x72, 0x48, 0xf4, 0xce, 0x94, 0xe0, 0x60, + 0x52, 0x2f, 0xf9, 0x00, 0x4a, 0x3d, 0x73, 0x97, 0xf6, 0x22, 0x6f, 0xb7, 0x31, 0x5e, 0x0f, 0x6e, + 0x0b, 0xac, 0xcc, 0x7c, 0x48, 0x22, 0x2a, 0x45, 0x8b, 0xef, 0xc0, 0x7c, 0xb6, 0xa3, 0x4f, 0x33, + 0xa2, 0x7c, 0x32, 0x12, 0x6a, 0x9e, 0xa6, 0xa9, 0xf1, 0xdf, 0x15, 0x80, 0x2d, 0xcf, 0xa6, 0x2a, + 0x21, 0xb3, 0x08, 0x13, 0x8e, 0xad, 0xb6, 0x22, 0x50, 0xbd, 0x9d, 0xd8, 0x58, 0xc3, 0x09, 0xc7, + 0xd6, 0x29, 0x8e, 0x89, 0x63, 0x53, 0x1c, 0x5f, 0x83, 0xaa, 0xed, 0x30, 0xbf, 0x67, 0x1e, 0x6c, + 0xe5, 0x9c, 0x05, 0xd6, 0x62, 0x16, 0x26, 0xe5, 0xc8, 0x6b, 0x6a, 0xfd, 0xca, 0x85, 0x52, 0xcb, + 0xac, 0xdf, 0x32, 0xef, 0x5e, 0x62, 0x0d, 0xbf, 0x09, 0x33, 0x51, 0x0a, 0x41, 0x68, 0x29, 0x8a, + 0x56, 0xd1, 0xaa, 0x9f, 0xd9, 0x49, 0xf0, 0x30, 0x25, 0x99, 0x4d, 0x71, 0x94, 0x9e, 0x4b, 0x8a, + 0x63, 0x0d, 0xe6, 0x59, 0xe8, 0x05, 0xd4, 0x8e, 0x24, 0x36, 0xd6, 0x6a, 0x24, 0xf5, 0xa1, 0xf3, + 0xad, 0x0c, 0x1f, 0x87, 0x5a, 0x90, 0x6d, 0x58, 0x88, 0x3a, 0x91, 0xfc, 0xc0, 0xda, 0x59, 0x81, + 0x74, 0x51, 0x21, 0x2d, 0xdc, 0xcf, 0x91, 0xc1, 0xdc, 0x96, 0xe4, 0x1b, 0x30, 0x1b, 0x75, 0xb3, + 0x65, 0x79, 0x3e, 0xad, 0x2d, 0x08, 0x28, 0x7d, 0x5a, 0xde, 0x49, 0x32, 0x31, 0x2d, 0x4b, 0xbe, + 0x02, 0x45, 0xbf, 0x6b, 0x32, 0xaa, 0x32, 0x22, 0x51, 0xe0, 0x5b, 0xdc, 0xe6, 0xc4, 0x47, 0x87, + 0xf5, 0x0a, 0x9f, 0x33, 0xf1, 0x03, 0xa5, 0x20, 0xb9, 0x02, 0xb0, 0xeb, 0x0d, 0x5c, 0xdb, 0x0c, + 0x0e, 0x36, 0xd6, 0x44, 0x18, 0x94, 0xb8, 0xee, 0x6e, 0x6a, 0x0e, 0x26, 0xa4, 0xb8, 0xb7, 0xed, + 0x4b, 0xbf, 0xa3, 0x12, 0x1b, 0xda, 0xdb, 0x6a, 0x77, 0xa4, 0xf8, 0xe4, 0x3d, 0xa8, 0x88, 0x74, + 0x29, 0xb5, 0x57, 0x42, 0x95, 0xdd, 0x78, 0x9a, 0x9c, 0x9f, 0x3e, 0x92, 0xb4, 0x22, 0x10, 0x8c, + 0xf1, 0xc8, 0xb7, 0x01, 0xda, 0x8e, 0xeb, 0xb0, 0xae, 0x40, 0xaf, 0x3e, 0x35, 0xba, 0xfe, 0xce, + 0x75, 0x8d, 0x82, 0x09, 0x44, 0x1e, 0x30, 0xf9, 0x9e, 0xbd, 0xb1, 0x5d, 0x9b, 0x11, 0x5f, 0xa9, + 0x03, 0xa6, 0x6d, 0x4e, 0x44, 0xc9, 0x23, 0x97, 0xa1, 0x6c, 0x9b, 0xb4, 0xef, 0xb9, 0xd4, 0xae, + 0xcd, 0xc6, 0x49, 0x8b, 0x35, 0x45, 0x43, 0xcd, 0x25, 0xdf, 0x81, 0x92, 0x23, 0xce, 0x8b, 0xb5, + 0xd3, 0xa2, 0xab, 0xdf, 0x18, 0x6d, 0x47, 0x11, 0x10, 0x4d, 0xe0, 0xee, 0x4a, 0xfe, 0x8d, 0x0a, + 0x96, 0x58, 0x30, 0xed, 0x0d, 0x42, 0xa1, 0x61, 0x4e, 0x68, 0x18, 0x2d, 0x49, 0x73, 0x47, 0x62, + 0xc8, 0xf2, 0x03, 0xf5, 0x03, 0x23, 0x64, 0xfe, 0xbd, 0x56, 0xd7, 0xe9, 0xd9, 0x01, 0x75, 0x6b, + 0xf3, 0x22, 0x1e, 0x13, 0xdf, 0xbb, 0xaa, 0x68, 0xa8, 0xb9, 0xe4, 0xe7, 0x61, 0xd6, 0x1b, 0x84, + 0xc2, 0x6e, 0xb8, 0xd9, 0xb1, 0xda, 0x19, 0x21, 0x7e, 0x86, 0x5b, 0xf1, 0x9d, 0x24, 0x03, 0xd3, + 0x72, 0xc6, 0x69, 0x98, 0x49, 0xd6, 0xec, 0x18, 0x7f, 0x30, 0x01, 0x51, 0x3f, 0x7e, 0x12, 0x8e, + 0xda, 0xc4, 0x80, 0x52, 0x40, 0xd9, 0xa0, 0x17, 0x2a, 0x4f, 0x2d, 0xe6, 0x1a, 0x05, 0x05, 0x15, + 0xc7, 0xd8, 0x87, 0x59, 0xde, 0xdb, 0x5e, 0x8f, 0xf6, 0x5a, 0x21, 0xf5, 0x19, 0x69, 0x43, 0x91, + 0xf1, 0x3f, 0xd4, 0x98, 0x8c, 0x79, 0x23, 0x14, 0x52, 0x3f, 0xb6, 0x77, 0xa1, 0x00, 0x25, 0xbc, + 0xf1, 0xbd, 0x09, 0xa8, 0xe8, 0x71, 0x7a, 0x82, 0xf4, 0xfa, 0x2b, 0x30, 0x6d, 0xd3, 0xb6, 0xc9, + 0xbf, 0x46, 0x5d, 0xd0, 0x73, 0xb3, 0x5a, 0x93, 0x24, 0x8c, 0x78, 0xa4, 0x1e, 0xed, 0x84, 0xf2, + 0x93, 0x45, 0xca, 0x2b, 0x79, 0xd0, 0x24, 0x7b, 0x50, 0x11, 0x7f, 0xac, 0x47, 0xc5, 0x44, 0xa3, + 0xce, 0xfb, 0xbd, 0x08, 0x45, 0x26, 0x12, 0xf4, 0x4f, 0x8c, 0xf1, 0x33, 0x45, 0x40, 0xc5, 0x27, + 0x29, 0x02, 0x32, 0xd6, 0x81, 0x3b, 0x86, 0xeb, 0xab, 0xe4, 0x6d, 0x28, 0x33, 0x65, 0xba, 0x6a, + 0x5c, 0xbe, 0xa4, 0x6f, 0xc5, 0x14, 0xfd, 0xd1, 0x61, 0x7d, 0x56, 0x08, 0x47, 0x04, 0xd4, 0x4d, + 0x8c, 0x65, 0xa8, 0x26, 0x8a, 0x26, 0xf8, 0x08, 0xeb, 0x8b, 0xcc, 0xc4, 0x08, 0xaf, 0x99, 0xa1, + 0x89, 0x82, 0x63, 0x3c, 0x9a, 0x80, 0x79, 0xa4, 0xcc, 0x1b, 0x04, 0x16, 0x4d, 0xa6, 0x75, 0x4d, + 0x2b, 0x71, 0x97, 0x9e, 0xba, 0x9c, 0xf1, 0x5c, 0x54, 0x5c, 0xbe, 0xdd, 0xf4, 0x69, 0xd0, 0xd1, + 0x8b, 0x4d, 0x4d, 0x92, 0xde, 0x6e, 0x36, 0x93, 0x4c, 0x4c, 0xcb, 0x92, 0xd7, 0xa0, 0xdc, 0x37, + 0x5d, 0xa7, 0x4d, 0x59, 0x98, 0xcd, 0xb7, 0x6c, 0x2a, 0x3a, 0x6a, 0x09, 0x72, 0x1d, 0xce, 0x30, + 0x1a, 0xde, 0xd9, 0x77, 0x69, 0xa0, 0x2f, 0x8d, 0xd4, 0x5d, 0xdd, 0x0b, 0xd1, 0xfd, 0x5f, 0x2b, + 0x2b, 0x80, 0xc3, 0x6d, 0xc4, 0xd6, 0x2d, 0xaf, 0xc9, 0x56, 0x3d, 0xd7, 0x76, 0x74, 0xbd, 0x58, + 0x72, 0xeb, 0xce, 0xf0, 0x71, 0xa8, 0x05, 0x47, 0x69, 0x9b, 0x4e, 0x6f, 0x10, 0xd0, 0x18, 0xa5, + 0x94, 0x46, 0x59, 0xcf, 0xf0, 0x71, 0xa8, 0x85, 0xf1, 0x4f, 0x05, 0x98, 0x45, 0x1a, 0x06, 0x07, + 0x7a, 0x50, 0xea, 0x50, 0xec, 0x89, 0x5b, 0xb9, 0x82, 0xb8, 0x95, 0x13, 0x96, 0x2c, 0x2f, 0xe1, + 0x24, 0x9d, 0xac, 0x41, 0x35, 0xe0, 0x2d, 0xd4, 0x0d, 0xa8, 0x1c, 0x70, 0x23, 0x3a, 0x8d, 0x61, + 0xcc, 0x7a, 0x94, 0xfe, 0x89, 0xc9, 0x66, 0xc4, 0x85, 0xe9, 0x5d, 0x59, 0x39, 0xa1, 0xae, 0xa1, + 0x46, 0x73, 0xf6, 0xaa, 0xfa, 0x42, 0xe4, 0x60, 0xa2, 0x52, 0x8c, 0x47, 0xf1, 0x9f, 0x18, 0x29, + 0x31, 0xbe, 0x5f, 0x00, 0x88, 0x4b, 0xb8, 0xc8, 0x1e, 0x94, 0xd9, 0xd5, 0xe6, 0xc0, 0xda, 0xd3, + 0x39, 0xb2, 0x11, 0xaf, 0x52, 0x14, 0x48, 0xe2, 0xe6, 0x58, 0x51, 0x50, 0x2b, 0xf8, 0xa2, 0x02, + 0x9f, 0xbf, 0x98, 0x04, 0xdd, 0x8a, 0xdb, 0x24, 0x75, 0x6d, 0xdf, 0x73, 0xdc, 0x30, 0x5b, 0x46, + 0x72, 0x4d, 0xd1, 0x51, 0x4b, 0xf0, 0x65, 0xb2, 0x2b, 0x3f, 0x62, 0x22, 0xbd, 0x4c, 0x54, 0x1f, + 0x14, 0x97, 0xcb, 0x05, 0xb4, 0x13, 0x57, 0x90, 0x68, 0x39, 0x14, 0x54, 0x54, 0x5c, 0xbe, 0x3b, + 0x46, 0x49, 0x62, 0x65, 0xda, 0x62, 0x77, 0x8c, 0xf2, 0xc9, 0xa8, 0xb9, 0xa4, 0x0b, 0x73, 0xa6, + 0xb0, 0xc8, 0x38, 0xf1, 0xfd, 0x54, 0x39, 0xfc, 0xb8, 0x7c, 0x28, 0x8d, 0x82, 0x59, 0x58, 0xae, + 0x89, 0xc5, 0xcd, 0x9f, 0x3e, 0x95, 0xaf, 0x35, 0xb5, 0xd2, 0x28, 0x98, 0x85, 0xe5, 0x07, 0xc3, + 0xc0, 0xeb, 0xd1, 0x15, 0xdc, 0x52, 0x07, 0x50, 0x7d, 0x30, 0x44, 0x49, 0xc6, 0x88, 0x6f, 0xfc, + 0x4e, 0x01, 0x4e, 0xb7, 0xac, 0xc0, 0xf1, 0x43, 0xed, 0xb2, 0xb6, 0x44, 0xdd, 0x57, 0x68, 0xf2, + 0x23, 0x9b, 0xb2, 0xa9, 0x97, 0x8e, 0xc9, 0x21, 0x4a, 0xa1, 0x54, 0x59, 0x98, 0x24, 0x61, 0x0c, + 0x21, 0x22, 0x7d, 0xe1, 0x14, 0xb3, 0x73, 0xdb, 0x12, 0x54, 0x54, 0x5c, 0xe3, 0x07, 0x05, 0x28, + 0xeb, 0x1b, 0xbb, 0x97, 0xa1, 0x28, 0x2e, 0x82, 0x94, 0xed, 0xe8, 0x3d, 0x70, 0x95, 0x13, 0x51, + 0xf2, 0xb8, 0x90, 0x38, 0x85, 0x2a, 0xe0, 0xc4, 0x46, 0x69, 0x06, 0x21, 0x4a, 0x1e, 0x37, 0x5a, + 0xea, 0xda, 0xca, 0x5e, 0xb4, 0xd1, 0x5e, 0x73, 0x6d, 0xe4, 0x74, 0x51, 0x2e, 0xe4, 0x05, 0x7d, + 0x33, 0xcc, 0xe6, 0x21, 0xd6, 0x05, 0x15, 0x15, 0xd7, 0x78, 0x17, 0xe6, 0x54, 0x01, 0x83, 0x1e, + 0xa8, 0xa7, 0xaa, 0x94, 0x32, 0xfe, 0xa3, 0x00, 0xd5, 0x9d, 0x9d, 0xdb, 0xda, 0x3f, 0xdd, 0x81, + 0x73, 0x4c, 0x56, 0x2c, 0xac, 0xb4, 0x43, 0x1a, 0xac, 0x7a, 0x7d, 0xbf, 0x47, 0x43, 0x6a, 0x2b, + 0x7f, 0xf5, 0xc2, 0xd1, 0x61, 0xfd, 0x5c, 0x2b, 0x4f, 0x00, 0xf3, 0xdb, 0x91, 0x0d, 0x38, 0x9b, + 0x64, 0x28, 0xd7, 0xab, 0xea, 0xb2, 0xe4, 0xfd, 0xcc, 0x30, 0x1b, 0xf3, 0xda, 0x90, 0x75, 0x20, + 0x49, 0xb2, 0x2c, 0x66, 0x50, 0x85, 0xc5, 0xe7, 0xe5, 0x0d, 0x5e, 0x96, 0x8b, 0x39, 0x2d, 0x8c, + 0x59, 0xa8, 0x26, 0x6a, 0xca, 0x8d, 0xff, 0xbc, 0x00, 0xfa, 0x2e, 0xff, 0xa7, 0x15, 0x01, 0x23, + 0x85, 0xcb, 0x96, 0x0e, 0x5e, 0x8a, 0xe3, 0x07, 0x2f, 0xda, 0xd6, 0x33, 0x01, 0x4c, 0x27, 0x0e, + 0x60, 0x4a, 0x27, 0x10, 0xc0, 0x68, 0xef, 0x33, 0x14, 0xc4, 0xfc, 0x6e, 0x01, 0x66, 0x5c, 0xcf, + 0xa6, 0x91, 0x8f, 0xab, 0x4d, 0x8b, 0x43, 0xf3, 0x9d, 0xb1, 0x06, 0xb1, 0xb1, 0x95, 0x40, 0x94, + 0x89, 0x25, 0x9d, 0xfd, 0x48, 0xb2, 0x30, 0xa5, 0x9a, 0xac, 0x43, 0xd9, 0x6c, 0xf3, 0xa8, 0x33, + 0x3c, 0x50, 0x45, 0x09, 0x17, 0xf3, 0xbc, 0xde, 0x8a, 0x92, 0x91, 0x1b, 0x4a, 0xf4, 0x0b, 0x75, + 0x5b, 0xbe, 0x23, 0xeb, 0xaa, 0xb7, 0xca, 0x18, 0x3b, 0x72, 0x94, 0x21, 0x4b, 0x9c, 0xe5, 0x14, + 0x25, 0x51, 0x04, 0x67, 0x40, 0x49, 0xc6, 0xb5, 0x22, 0xa8, 0x2f, 0xcb, 0x10, 0x45, 0xc6, 0xbc, + 0xa8, 0x38, 0xa4, 0x13, 0x45, 0x24, 0x55, 0x31, 0xb8, 0xcd, 0x91, 0xa3, 0x34, 0x1d, 0xe4, 0xe4, + 0x87, 0x24, 0xe4, 0x66, 0x72, 0xe3, 0x98, 0x79, 0x92, 0x8d, 0x63, 0xf6, 0xd8, 0x4d, 0xa3, 0x03, + 0x25, 0x26, 0xb6, 0x25, 0x11, 0xcc, 0x57, 0xaf, 0xac, 0x8e, 0x76, 0xaa, 0x49, 0xed, 0x6c, 0x72, + 0x74, 0x24, 0x0d, 0x15, 0x3c, 0xf1, 0xa0, 0x1c, 0xa8, 0x43, 0xbb, 0xca, 0x07, 0x8c, 0x76, 0x17, + 0x91, 0x3d, 0xf9, 0x4b, 0xfb, 0x88, 0xa8, 0xa8, 0x95, 0x90, 0xf7, 0x60, 0xd2, 0x36, 0x3b, 0x2a, + 0x33, 0xf0, 0xcd, 0x91, 0xcb, 0x37, 0x22, 0x35, 0xa2, 0x98, 0x7b, 0x6d, 0xe5, 0x3a, 0x72, 0x54, + 0xb2, 0x17, 0x57, 0xdf, 0xcd, 0x8f, 0x51, 0x23, 0x9d, 0xd9, 0xe9, 0x64, 0xac, 0x38, 0x54, 0xbf, + 0x77, 0x0d, 0xa6, 0x1f, 0x7a, 0xbd, 0x41, 0x5f, 0xa5, 0x14, 0xaa, 0x57, 0x16, 0xf3, 0x66, 0xfb, + 0x9e, 0x10, 0x89, 0x9d, 0x80, 0xfc, 0xcd, 0x30, 0x6a, 0x4b, 0x7e, 0xa3, 0x00, 0xa7, 0xf9, 0xd2, + 0xd1, 0x76, 0xc0, 0x6a, 0x64, 0x0c, 0x4b, 0xbd, 0xcb, 0xf8, 0xa6, 0x18, 0x59, 0xd8, 0x79, 0xa5, + 0xf6, 0xf4, 0x46, 0x4a, 0x03, 0x66, 0x34, 0x12, 0x1f, 0xca, 0xcc, 0xb1, 0xa9, 0x65, 0x06, 0xac, + 0x76, 0xf6, 0xc4, 0xb4, 0xc7, 0x87, 0x69, 0x85, 0x8d, 0x5a, 0x0b, 0xf9, 0x4d, 0x51, 0xd7, 0xae, + 0x5e, 0x76, 0xa8, 0xd7, 0x36, 0x0b, 0x27, 0xf9, 0xda, 0xe6, 0xac, 0x2c, 0x6a, 0x4f, 0x69, 0xc0, + 0xac, 0x4a, 0x7e, 0x0c, 0x91, 0xf5, 0x81, 0xd9, 0x12, 0xcc, 0x73, 0xe2, 0xb6, 0x48, 0x1c, 0x43, + 0x56, 0xf2, 0x04, 0x30, 0xbf, 0x1d, 0xf9, 0x08, 0x66, 0x83, 0x64, 0x20, 0x56, 0x3b, 0x3f, 0x46, + 0xa9, 0x42, 0x2a, 0xa4, 0x93, 0x29, 0xab, 0x14, 0x09, 0xd3, 0xba, 0xc8, 0x1b, 0x50, 0xf5, 0x95, + 0xa7, 0x72, 0x58, 0xbf, 0x76, 0x41, 0x7c, 0x83, 0xd8, 0x51, 0xb7, 0x63, 0x32, 0x26, 0x65, 0xc8, + 0x5d, 0xa8, 0x86, 0x5e, 0x8f, 0x06, 0xea, 0x5a, 0xa5, 0x26, 0x26, 0x7f, 0x29, 0xcf, 0x92, 0x77, + 0xb4, 0x58, 0x9c, 0xb4, 0x8f, 0x69, 0x0c, 0x93, 0x38, 0x3c, 0xa0, 0x8f, 0x2a, 0x6e, 0x03, 0x91, + 0xbd, 0x78, 0x21, 0x1d, 0xd0, 0xb7, 0x92, 0x4c, 0x4c, 0xcb, 0xf2, 0x10, 0xdd, 0x0f, 0x1c, 0x2f, + 0x70, 0xc2, 0x83, 0xd5, 0x9e, 0xc9, 0x98, 0x00, 0x58, 0x14, 0x00, 0x3a, 0x44, 0xdf, 0xce, 0x0a, + 0xe0, 0x70, 0x1b, 0x1e, 0x07, 0x45, 0xc4, 0xda, 0x8b, 0xe2, 0xf8, 0x26, 0xdc, 0x52, 0xd4, 0x16, + 0x35, 0xf7, 0x98, 0xc2, 0xad, 0x8b, 0xa3, 0x14, 0x6e, 0x11, 0x1b, 0x2e, 0x9a, 0x83, 0xd0, 0xeb, + 0x73, 0x42, 0xba, 0xc9, 0x8e, 0xb7, 0x47, 0xdd, 0xda, 0x25, 0xb1, 0x57, 0x5d, 0x3a, 0x3a, 0xac, + 0x5f, 0x5c, 0x79, 0x8c, 0x1c, 0x3e, 0x16, 0x85, 0xf4, 0xa1, 0x4c, 0x55, 0xf1, 0x59, 0xed, 0x4b, + 0x63, 0x6c, 0x12, 0xe9, 0x0a, 0x36, 0x39, 0x40, 0x11, 0x0d, 0xb5, 0x0a, 0xb2, 0x03, 0xd5, 0xae, + 0xc7, 0xc2, 0x95, 0x9e, 0x63, 0x32, 0xca, 0x6a, 0x2f, 0x09, 0x3b, 0xc9, 0xdd, 0xdf, 0x6e, 0x44, + 0x62, 0xb1, 0x99, 0xdc, 0x88, 0x5b, 0x62, 0x12, 0x86, 0x50, 0x11, 0x14, 0x0e, 0xc4, 0xac, 0x79, + 0x6e, 0x48, 0x3f, 0x0c, 0x6b, 0x4b, 0xe2, 0x5b, 0x5e, 0xcd, 0x43, 0xde, 0xf6, 0xec, 0x56, 0x5a, + 0x5a, 0xae, 0xf2, 0x0c, 0x11, 0xb3, 0x98, 0xe4, 0x4d, 0x98, 0xf1, 0x3d, 0xbb, 0xe5, 0x53, 0x6b, + 0xdb, 0x0c, 0xad, 0x6e, 0xad, 0x9e, 0xbe, 0x14, 0xda, 0x4e, 0xf0, 0x30, 0x25, 0xb9, 0xf8, 0x2e, + 0x9c, 0x19, 0x3a, 0x4f, 0x3d, 0xd5, 0x0d, 0xda, 0x9f, 0xf2, 0xb8, 0x27, 0x71, 0x82, 0x3d, 0xe9, + 0x73, 0xff, 0x75, 0x38, 0xa3, 0x5e, 0xcb, 0xf2, 0xcd, 0xb6, 0x37, 0xd0, 0xef, 0x4b, 0x12, 0xe9, + 0x2c, 0xcc, 0x0a, 0xe0, 0x70, 0x1b, 0xe3, 0xcf, 0x0a, 0x30, 0x9b, 0x72, 0xdf, 0x27, 0x1e, 0x09, + 0xaf, 0x03, 0xe9, 0x3b, 0x41, 0xe0, 0x05, 0x72, 0x0f, 0xdc, 0xe4, 0xb6, 0xcc, 0xd4, 0x33, 0x15, + 0x11, 0x56, 0x6d, 0x0e, 0x71, 0x31, 0xa7, 0x85, 0xf1, 0x57, 0x05, 0x88, 0xf3, 0xa5, 0xba, 0xe2, + 0xac, 0x70, 0x6c, 0xc5, 0xd9, 0x6b, 0x50, 0x7e, 0xc0, 0x3c, 0x77, 0x3b, 0xae, 0x4b, 0xd3, 0x03, + 0x7a, 0xb3, 0x75, 0x67, 0x4b, 0x48, 0x6a, 0x09, 0x21, 0xfd, 0xc1, 0xba, 0xd3, 0x0b, 0x87, 0xab, + 0xb7, 0x6e, 0xfe, 0xa2, 0xa4, 0xa3, 0x96, 0x20, 0xcb, 0x50, 0xd1, 0x29, 0x7a, 0x15, 0x42, 0xeb, + 0x41, 0xd0, 0xf9, 0x69, 0x8c, 0x65, 0x8c, 0x1f, 0x4e, 0x40, 0xf9, 0x39, 0xbe, 0xb9, 0xb1, 0x52, + 0x6f, 0x6e, 0x4e, 0xe0, 0x81, 0x46, 0xde, 0x7b, 0x9b, 0xbd, 0xcc, 0x7b, 0x9b, 0xd5, 0x31, 0xb3, + 0xfe, 0x8f, 0x7d, 0x6b, 0xf3, 0x69, 0x01, 0x66, 0x9e, 0xe3, 0x3b, 0x9b, 0xdd, 0xf4, 0x3b, 0x9b, + 0xb7, 0xc7, 0xfa, 0xb4, 0x63, 0xde, 0xd8, 0xfc, 0xe5, 0x02, 0xa4, 0xde, 0xb7, 0x10, 0x17, 0x2a, + 0xd1, 0x02, 0x8f, 0x6e, 0x52, 0xde, 0x1e, 0x2b, 0x28, 0x8c, 0x8d, 0x32, 0xa2, 0x30, 0x8c, 0x55, + 0x90, 0x2b, 0x00, 0x94, 0x7b, 0x36, 0x99, 0xaf, 0x9c, 0x48, 0x5f, 0x34, 0x5c, 0xd3, 0x1c, 0x4c, + 0x48, 0x3d, 0xff, 0x84, 0x43, 0xfe, 0x16, 0x3d, 0xf5, 0x4c, 0xb6, 0xe8, 0x8b, 0x27, 0xbe, 0x45, + 0xbf, 0xf4, 0xec, 0xb7, 0xe8, 0x44, 0x40, 0x52, 0x1c, 0x23, 0x20, 0xf9, 0x08, 0x16, 0xe4, 0x9f, + 0xab, 0x3d, 0xd3, 0xe9, 0x6b, 0x7b, 0x51, 0xa5, 0x63, 0x5f, 0xce, 0xdd, 0x98, 0x69, 0xc0, 0x1c, + 0x16, 0x52, 0x37, 0xbc, 0x17, 0xb7, 0x8c, 0xeb, 0x0e, 0xee, 0xe5, 0xc0, 0x61, 0xae, 0x92, 0xec, + 0x09, 0x76, 0xfa, 0x09, 0x4e, 0xb0, 0x3f, 0x28, 0xc0, 0x39, 0x33, 0xef, 0x09, 0xaf, 0xca, 0x63, + 0xdc, 0x1c, 0x2b, 0x9e, 0x48, 0x21, 0xaa, 0x78, 0x20, 0x8f, 0x85, 0xf9, 0x7d, 0x20, 0xaf, 0xc4, + 0x21, 0x69, 0x45, 0x18, 0x55, 0x7e, 0x30, 0xf9, 0xdd, 0x6c, 0x2a, 0x08, 0xc4, 0x68, 0xb7, 0xc6, + 0x76, 0xd8, 0x27, 0x90, 0x0e, 0xaa, 0x8e, 0x91, 0x0e, 0xca, 0x84, 0x17, 0x33, 0x27, 0x14, 0x5e, + 0xb8, 0x30, 0xef, 0xf4, 0xcd, 0x0e, 0xdd, 0x1e, 0xf4, 0x7a, 0x32, 0xeb, 0xcf, 0x6a, 0xb3, 0x02, + 0x3b, 0xb7, 0xde, 0x97, 0x87, 0x7b, 0xbd, 0xec, 0x43, 0x31, 0x7d, 0xbf, 0xb6, 0x91, 0x41, 0xc2, + 0x21, 0x6c, 0x6e, 0x96, 0xfc, 0xd8, 0xba, 0x45, 0x43, 0x3e, 0xda, 0x22, 0x53, 0xa2, 0xfe, 0xab, + 0x82, 0x1b, 0x31, 0x19, 0x93, 0x32, 0xe4, 0x16, 0x54, 0x6c, 0x97, 0xa9, 0xdb, 0xb5, 0x39, 0xe1, + 0xa5, 0x5e, 0xe7, 0xbe, 0x6d, 0x6d, 0xab, 0xa5, 0xef, 0xd5, 0x2e, 0x0e, 0xff, 0x5f, 0x2c, 0x0d, + 0xcd, 0xc7, 0xb8, 0x3d, 0xd9, 0x14, 0x60, 0xaa, 0xf8, 0x5d, 0xa6, 0x36, 0x2e, 0x1d, 0x73, 0x42, + 0x5e, 0xdb, 0x8a, 0x6a, 0xf5, 0x67, 0x95, 0x3a, 0x55, 0xd2, 0x1e, 0x23, 0x90, 0x57, 0xa1, 0xe4, + 0xb9, 0xd7, 0x3e, 0x74, 0xc2, 0xda, 0x99, 0x74, 0xd6, 0xff, 0x8e, 0xa0, 0xa2, 0xe2, 0x92, 0xbb, + 0x70, 0x21, 0x0c, 0x7b, 0xa9, 0x6c, 0xb7, 0xaa, 0x4b, 0x11, 0x45, 0x4a, 0x45, 0xf9, 0x44, 0x71, + 0x67, 0xe7, 0x76, 0x9e, 0x08, 0x1e, 0xd7, 0x56, 0xa4, 0x8e, 0xc3, 0x9e, 0x8e, 0x90, 0x97, 0xc6, + 0x49, 0x1d, 0xc7, 0x57, 0x0a, 0x2a, 0x75, 0x1c, 0x13, 0x30, 0xa9, 0xe5, 0xf8, 0x48, 0xff, 0xec, + 0x88, 0x91, 0x7e, 0x32, 0xb8, 0x5c, 0x78, 0x6c, 0x70, 0x39, 0x14, 0x0c, 0x9f, 0x7b, 0x8a, 0x60, + 0xf8, 0x3d, 0x51, 0xfe, 0x73, 0x7d, 0x55, 0x25, 0x12, 0xde, 0x1a, 0x2d, 0x7f, 0xc9, 0x11, 0xe4, + 0x25, 0xb0, 0xf8, 0x13, 0x25, 0x26, 0xd9, 0x86, 0x05, 0xdf, 0xb3, 0x87, 0x62, 0x69, 0x91, 0x39, + 0x48, 0x14, 0x8e, 0x6d, 0xe7, 0xc8, 0x60, 0x6e, 0x4b, 0xe1, 0xc0, 0x63, 0x7a, 0xad, 0x26, 0x06, + 0x46, 0x3a, 0xf0, 0x98, 0x8c, 0x49, 0x99, 0x6c, 0x68, 0xf9, 0xc2, 0x33, 0x0b, 0x2d, 0x17, 0x9f, + 0x43, 0x68, 0xf9, 0xe2, 0xf3, 0x0b, 0x2d, 0x3f, 0x2f, 0xc3, 0xe9, 0xcc, 0x8b, 0x59, 0x5d, 0x79, + 0x57, 0x78, 0xd2, 0xca, 0xbb, 0x54, 0x69, 0xdc, 0xc4, 0x33, 0x2d, 0x8d, 0x9b, 0x3c, 0xf1, 0xd2, + 0xb8, 0x44, 0x09, 0xe0, 0xd4, 0x17, 0x94, 0x00, 0xae, 0xc0, 0x9c, 0xe5, 0xf5, 0x7d, 0xf1, 0x44, + 0x47, 0x15, 0x82, 0xc9, 0x62, 0x0d, 0x7d, 0xaf, 0xbc, 0x9a, 0x66, 0x63, 0x56, 0x9e, 0xfc, 0x2a, + 0x14, 0x5d, 0xd1, 0xb0, 0x34, 0x46, 0xed, 0x71, 0x7a, 0xc2, 0xc4, 0xee, 0xac, 0xca, 0x7f, 0xa3, + 0x5c, 0x6d, 0x51, 0xd0, 0x1e, 0x45, 0x7f, 0xa0, 0x54, 0xca, 0x8f, 0x39, 0x73, 0xe9, 0xc2, 0x4f, + 0x56, 0xab, 0x88, 0x8e, 0xfc, 0xd2, 0x49, 0x74, 0x24, 0x5d, 0x65, 0xaa, 0xba, 0x14, 0xdf, 0xb9, + 0xa7, 0xb9, 0x98, 0xed, 0x09, 0x09, 0xe0, 0xbc, 0x9f, 0x77, 0x08, 0x64, 0xea, 0x4e, 0xeb, 0x71, + 0x47, 0xd1, 0x25, 0xa5, 0xe5, 0x7c, 0xee, 0x31, 0x92, 0xe1, 0x31, 0xc8, 0xc9, 0x42, 0xc3, 0xf2, + 0xb3, 0x2a, 0x34, 0x5c, 0x3c, 0x90, 0x05, 0xd0, 0xc7, 0xd6, 0x4e, 0xdf, 0x4d, 0xbf, 0x67, 0x78, + 0x77, 0xc4, 0xff, 0x1b, 0x2c, 0x2a, 0xb1, 0x4e, 0xd6, 0x6d, 0xff, 0x7a, 0x01, 0x16, 0xf2, 0xa6, + 0x25, 0xa7, 0x17, 0xad, 0x74, 0x2f, 0xc6, 0x0b, 0x16, 0x93, 0x3e, 0xe6, 0x5f, 0x8a, 0x89, 0xd0, + 0x34, 0xa4, 0xfe, 0x4f, 0xef, 0xad, 0x47, 0xba, 0xb7, 0x4e, 0xbd, 0x49, 0x2f, 0x3e, 0xc7, 0x37, + 0xe9, 0xa5, 0x11, 0xde, 0xa4, 0x4f, 0x3f, 0xcf, 0x37, 0xe9, 0xe5, 0x27, 0x7c, 0x93, 0x5e, 0x79, + 0xf6, 0x6f, 0xd2, 0x3f, 0x2f, 0xc0, 0x7c, 0xb6, 0x44, 0xfe, 0x39, 0xa4, 0xe8, 0xf6, 0x52, 0x29, + 0xba, 0x8d, 0xb1, 0x9c, 0xb9, 0x2e, 0xcb, 0x3f, 0x26, 0x55, 0x67, 0xfc, 0xb8, 0x00, 0x43, 0xcf, + 0x00, 0x9e, 0x43, 0x16, 0xed, 0x41, 0x3a, 0x8b, 0x76, 0xed, 0x44, 0x3e, 0xf2, 0x98, 0x6c, 0xda, + 0x7f, 0xe5, 0x7c, 0xe2, 0xff, 0x4a, 0x56, 0x2d, 0xe5, 0xda, 0x26, 0x9e, 0xbd, 0x6b, 0x6b, 0x36, + 0x3e, 0xf9, 0x7c, 0xe9, 0xd4, 0xa7, 0x9f, 0x2f, 0x9d, 0xfa, 0xec, 0xf3, 0xa5, 0x53, 0x1f, 0x1f, + 0x2d, 0x15, 0x3e, 0x39, 0x5a, 0x2a, 0x7c, 0x7a, 0xb4, 0x54, 0xf8, 0xec, 0x68, 0xa9, 0xf0, 0xe3, + 0xa3, 0xa5, 0xc2, 0xef, 0xff, 0xe3, 0xd2, 0xa9, 0x5f, 0x2e, 0x47, 0xb8, 0xff, 0x13, 0x00, 0x00, + 0xff, 0xff, 0x5a, 0x4a, 0xab, 0x8f, 0xb4, 0x54, 0x00, 0x00, } func (m *ArchiveStrategy) Marshal() (dAtA []byte, err error) { @@ -2250,7 +2384,7 @@ func (m *ContinueOn) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *DAGTask) Marshal() (dAtA []byte, err error) { +func (m *CronWorkflow) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2260,87 +2394,38 @@ func (m *DAGTask) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DAGTask) MarshalTo(dAtA []byte) (int, error) { +func (m *CronWorkflow) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DAGTask) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *CronWorkflow) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.ContinueOn != nil { - { - size, err := m.ContinueOn.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x52 + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i -= len(m.When) - copy(dAtA[i:], m.When) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.When))) i-- - dAtA[i] = 0x4a - if m.WithSequence != nil { - { - size, err := m.WithSequence.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + dAtA[i] = 0x1a + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x42 + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i -= len(m.WithParam) - copy(dAtA[i:], m.WithParam) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.WithParam))) i-- - dAtA[i] = 0x3a - if len(m.WithItems) > 0 { - for iNdEx := len(m.WithItems) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.WithItems[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if len(m.Dependencies) > 0 { - for iNdEx := len(m.Dependencies) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Dependencies[iNdEx]) - copy(dAtA[i:], m.Dependencies[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Dependencies[iNdEx]))) - i-- - dAtA[i] = 0x2a - } - } - if m.TemplateRef != nil { - { - size, err := m.TemplateRef.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } + dAtA[i] = 0x12 { - size, err := m.Arguments.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -2348,21 +2433,11 @@ func (m *DAGTask) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a - i -= len(m.Template) - copy(dAtA[i:], m.Template) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Template))) - i-- - dAtA[i] = 0x12 - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *DAGTemplate) Marshal() (dAtA []byte, err error) { +func (m *CronWorkflowList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2372,30 +2447,20 @@ func (m *DAGTemplate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DAGTemplate) MarshalTo(dAtA []byte) (int, error) { +func (m *CronWorkflowList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DAGTemplate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *CronWorkflowList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.FailFast != nil { - i-- - if *m.FailFast { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -2406,15 +2471,20 @@ func (m *DAGTemplate) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x12 } } - i -= len(m.Target) - copy(dAtA[i:], m.Target) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Target))) + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ExecutorConfig) Marshal() (dAtA []byte, err error) { +func (m *CronWorkflowSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2424,25 +2494,63 @@ func (m *ExecutorConfig) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ExecutorConfig) MarshalTo(dAtA []byte) (int, error) { +func (m *CronWorkflowSpec) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ExecutorConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *CronWorkflowSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - i -= len(m.ServiceAccountName) - copy(dAtA[i:], m.ServiceAccountName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ServiceAccountName))) + if m.FailedJobsHistoryLimit != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.FailedJobsHistoryLimit)) + i-- + dAtA[i] = 0x38 + } + if m.SuccessfulJobsHistoryLimit != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.SuccessfulJobsHistoryLimit)) + i-- + dAtA[i] = 0x30 + } + if m.StartingDeadlineSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.StartingDeadlineSeconds)) + i-- + dAtA[i] = 0x28 + } + i-- + if m.Suspend { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + i -= len(m.ConcurrencyPolicy) + copy(dAtA[i:], m.ConcurrencyPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ConcurrencyPolicy))) + i-- + dAtA[i] = 0x1a + i -= len(m.Schedule) + copy(dAtA[i:], m.Schedule) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Schedule))) + i-- + dAtA[i] = 0x12 + { + size, err := m.WorkflowSpec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *GitArtifact) Marshal() (dAtA []byte, err error) { +func (m *CronWorkflowStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2452,27 +2560,19 @@ func (m *GitArtifact) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GitArtifact) MarshalTo(dAtA []byte) (int, error) { +func (m *CronWorkflowStatus) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GitArtifact) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *CronWorkflowStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - i-- - if m.InsecureIgnoreHostKey { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x40 - if m.SSHPrivateKeySecret != nil { + if m.LastScheduledTime != nil { { - size, err := m.SSHPrivateKeySecret.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.LastScheduledTime.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -2480,11 +2580,48 @@ func (m *GitArtifact) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x3a + dAtA[i] = 0x12 } - if m.PasswordSecret != nil { + if len(m.Active) > 0 { + for iNdEx := len(m.Active) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Active[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DAGTask) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DAGTask) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DAGTask) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ContinueOn != nil { { - size, err := m.PasswordSecret.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ContinueOn.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -2492,11 +2629,16 @@ func (m *GitArtifact) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x32 + dAtA[i] = 0x52 } - if m.UsernameSecret != nil { + i -= len(m.When) + copy(dAtA[i:], m.When) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.When))) + i-- + dAtA[i] = 0x4a + if m.WithSequence != nil { { - size, err := m.UsernameSecret.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.WithSequence.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -2504,36 +2646,72 @@ func (m *GitArtifact) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x2a + dAtA[i] = 0x42 } - if len(m.Fetch) > 0 { - for iNdEx := len(m.Fetch) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Fetch[iNdEx]) - copy(dAtA[i:], m.Fetch[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Fetch[iNdEx]))) + i -= len(m.WithParam) + copy(dAtA[i:], m.WithParam) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.WithParam))) + i-- + dAtA[i] = 0x3a + if len(m.WithItems) > 0 { + for iNdEx := len(m.WithItems) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.WithItems[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x32 } } - if m.Depth != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.Depth)) + if len(m.Dependencies) > 0 { + for iNdEx := len(m.Dependencies) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Dependencies[iNdEx]) + copy(dAtA[i:], m.Dependencies[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Dependencies[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } + if m.TemplateRef != nil { + { + size, err := m.TemplateRef.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0x18 + dAtA[i] = 0x22 } - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Revision))) + { + size, err := m.Arguments.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + i -= len(m.Template) + copy(dAtA[i:], m.Template) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Template))) i-- dAtA[i] = 0x12 - i -= len(m.Repo) - copy(dAtA[i:], m.Repo) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Repo))) + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *HDFSArtifact) Marshal() (dAtA []byte, err error) { +func (m *DAGTemplate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2543,43 +2721,49 @@ func (m *HDFSArtifact) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *HDFSArtifact) MarshalTo(dAtA []byte) (int, error) { +func (m *DAGTemplate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *HDFSArtifact) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DAGTemplate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - i-- - if m.Force { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.FailFast != nil { + i-- + if *m.FailFast { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 } - i-- - dAtA[i] = 0x18 - i -= len(m.Path) - copy(dAtA[i:], m.Path) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Path))) - i-- - dAtA[i] = 0x12 - { - size, err := m.HDFSConfig.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.Tasks) > 0 { + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i -= len(m.Target) + copy(dAtA[i:], m.Target) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Target))) i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *HDFSConfig) Marshal() (dAtA []byte, err error) { +func (m *ExecutorConfig) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2589,44 +2773,25 @@ func (m *HDFSConfig) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *HDFSConfig) MarshalTo(dAtA []byte) (int, error) { +func (m *ExecutorConfig) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *HDFSConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ExecutorConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - i -= len(m.HDFSUser) - copy(dAtA[i:], m.HDFSUser) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.HDFSUser))) - i-- - dAtA[i] = 0x1a - if len(m.Addresses) > 0 { - for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Addresses[iNdEx]) - copy(dAtA[i:], m.Addresses[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Addresses[iNdEx]))) - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.HDFSKrbConfig.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } + i -= len(m.ServiceAccountName) + copy(dAtA[i:], m.ServiceAccountName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ServiceAccountName))) i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *HDFSKrbConfig) Marshal() (dAtA []byte, err error) { +func (m *GitArtifact) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2636,7 +2801,191 @@ func (m *HDFSKrbConfig) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *HDFSKrbConfig) MarshalTo(dAtA []byte) (int, error) { +func (m *GitArtifact) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GitArtifact) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i-- + if m.InsecureIgnoreHostKey { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + if m.SSHPrivateKeySecret != nil { + { + size, err := m.SSHPrivateKeySecret.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if m.PasswordSecret != nil { + { + size, err := m.PasswordSecret.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if m.UsernameSecret != nil { + { + size, err := m.UsernameSecret.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.Fetch) > 0 { + for iNdEx := len(m.Fetch) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Fetch[iNdEx]) + copy(dAtA[i:], m.Fetch[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Fetch[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if m.Depth != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.Depth)) + i-- + dAtA[i] = 0x18 + } + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Revision))) + i-- + dAtA[i] = 0x12 + i -= len(m.Repo) + copy(dAtA[i:], m.Repo) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Repo))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *HDFSArtifact) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HDFSArtifact) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *HDFSArtifact) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i-- + if m.Force { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + i -= len(m.Path) + copy(dAtA[i:], m.Path) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Path))) + i-- + dAtA[i] = 0x12 + { + size, err := m.HDFSConfig.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *HDFSConfig) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HDFSConfig) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *HDFSConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.HDFSUser) + copy(dAtA[i:], m.HDFSUser) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.HDFSUser))) + i-- + dAtA[i] = 0x1a + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.HDFSKrbConfig.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *HDFSKrbConfig) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HDFSKrbConfig) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } @@ -5346,6 +5695,82 @@ func (m *ContinueOn) Size() (n int) { return n } +func (m *CronWorkflow) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *CronWorkflowList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *CronWorkflowSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.WorkflowSpec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Schedule) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ConcurrencyPolicy) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 + if m.StartingDeadlineSeconds != nil { + n += 1 + sovGenerated(uint64(*m.StartingDeadlineSeconds)) + } + if m.SuccessfulJobsHistoryLimit != nil { + n += 1 + sovGenerated(uint64(*m.SuccessfulJobsHistoryLimit)) + } + if m.FailedJobsHistoryLimit != nil { + n += 1 + sovGenerated(uint64(*m.FailedJobsHistoryLimit)) + } + return n +} + +func (m *CronWorkflowStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Active) > 0 { + for _, e := range m.Active { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.LastScheduledTime != nil { + l = m.LastScheduledTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *DAGTask) Size() (n int) { if m == nil { return 0 @@ -6524,16 +6949,76 @@ func (this *ContinueOn) String() string { }, "") return s } -func (this *DAGTask) String() string { +func (this *CronWorkflow) String() string { if this == nil { return "nil" } - repeatedStringForWithItems := "[]Item{" - for _, f := range this.WithItems { - repeatedStringForWithItems += fmt.Sprintf("%v", f) + "," + s := strings.Join([]string{`&CronWorkflow{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "CronWorkflowSpec", "CronWorkflowSpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "CronWorkflowStatus", "CronWorkflowStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *CronWorkflowList) String() string { + if this == nil { + return "nil" } - repeatedStringForWithItems += "}" - s := strings.Join([]string{`&DAGTask{`, + repeatedStringForItems := "[]CronWorkflow{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "CronWorkflow", "CronWorkflow", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&CronWorkflowList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *CronWorkflowSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CronWorkflowSpec{`, + `WorkflowSpec:` + strings.Replace(strings.Replace(this.WorkflowSpec.String(), "WorkflowSpec", "WorkflowSpec", 1), `&`, ``, 1) + `,`, + `Schedule:` + fmt.Sprintf("%v", this.Schedule) + `,`, + `ConcurrencyPolicy:` + fmt.Sprintf("%v", this.ConcurrencyPolicy) + `,`, + `Suspend:` + fmt.Sprintf("%v", this.Suspend) + `,`, + `StartingDeadlineSeconds:` + valueToStringGenerated(this.StartingDeadlineSeconds) + `,`, + `SuccessfulJobsHistoryLimit:` + valueToStringGenerated(this.SuccessfulJobsHistoryLimit) + `,`, + `FailedJobsHistoryLimit:` + valueToStringGenerated(this.FailedJobsHistoryLimit) + `,`, + `}`, + }, "") + return s +} +func (this *CronWorkflowStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForActive := "[]ObjectReference{" + for _, f := range this.Active { + repeatedStringForActive += fmt.Sprintf("%v", f) + "," + } + repeatedStringForActive += "}" + s := strings.Join([]string{`&CronWorkflowStatus{`, + `Active:` + repeatedStringForActive + `,`, + `LastScheduledTime:` + strings.Replace(fmt.Sprintf("%v", this.LastScheduledTime), "Time", "v11.Time", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DAGTask) String() string { + if this == nil { + return "nil" + } + repeatedStringForWithItems := "[]Item{" + for _, f := range this.WithItems { + repeatedStringForWithItems += fmt.Sprintf("%v", f) + "," + } + repeatedStringForWithItems += "}" + s := strings.Join([]string{`&DAGTask{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, `Template:` + fmt.Sprintf("%v", this.Template) + `,`, `Arguments:` + strings.Replace(strings.Replace(this.Arguments.String(), "Arguments", "Arguments", 1), `&`, ``, 1) + `,`, @@ -7263,28 +7748,621 @@ func (m *ArchiveStrategy) Unmarshal(dAtA []byte) error { if shift >= 64 { return ErrIntOverflowGenerated } - if iNdEx >= l { + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ArchiveStrategy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ArchiveStrategy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tar", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Tar == nil { + m.Tar = &TarStrategy{} + } + if err := m.Tar.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field None", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.None == nil { + m.None = &NoneStrategy{} + } + if err := m.None.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Arguments) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Arguments: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Arguments: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Parameters = append(m.Parameters, Parameter{}) + if err := m.Parameters[len(m.Parameters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Artifacts", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Artifacts = append(m.Artifacts, Artifact{}) + if err := m.Artifacts[len(m.Artifacts)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Artifact) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Artifact: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Artifact: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Mode = &v + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field From", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.From = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ArtifactLocation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ArtifactLocation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GlobalName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GlobalName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Archive", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Archive == nil { + m.Archive = &ArchiveStrategy{} + } + if err := m.Archive.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Optional", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Optional = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ArtifactLocation) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ArtifactLocation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ArtifactLocation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ArchiveLogs", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.ArchiveLogs = &b + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field S3", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + if m.S3 == nil { + m.S3 = &S3Artifact{} } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ArchiveStrategy: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ArchiveStrategy: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + if err := m.S3.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tar", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Git", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -7311,16 +8389,16 @@ func (m *ArchiveStrategy) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Tar == nil { - m.Tar = &TarStrategy{} + if m.Git == nil { + m.Git = &GitArtifact{} } - if err := m.Tar.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Git.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field None", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field HTTP", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -7347,69 +8425,52 @@ func (m *ArchiveStrategy) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.None == nil { - m.None = &NoneStrategy{} + if m.HTTP == nil { + m.HTTP = &HTTPArtifact{} } - if err := m.None.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.HTTP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Artifactory", wireType) } - if skippy < 0 { + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { return ErrInvalidLengthGenerated } - if (iNdEx + skippy) < 0 { + postIndex := iNdEx + msglen + if postIndex < 0 { return ErrInvalidLengthGenerated } - if (iNdEx + skippy) > l { + if postIndex > l { return io.ErrUnexpectedEOF } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Arguments) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF + if m.Artifactory == nil { + m.Artifactory = &ArtifactoryArtifact{} } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + if err := m.Artifactory.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Arguments: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Arguments: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + iNdEx = postIndex + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field HDFS", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -7436,14 +8497,16 @@ func (m *Arguments) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Parameters = append(m.Parameters, Parameter{}) - if err := m.Parameters[len(m.Parameters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.HDFS == nil { + m.HDFS = &HDFSArtifact{} + } + if err := m.HDFS.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Artifacts", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Raw", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -7470,8 +8533,10 @@ func (m *Arguments) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Artifacts = append(m.Artifacts, Artifact{}) - if err := m.Artifacts[len(m.Artifacts)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Raw == nil { + m.Raw = &RawArtifact{} + } + if err := m.Raw.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -7499,7 +8564,7 @@ func (m *Arguments) Unmarshal(dAtA []byte) error { } return nil } -func (m *Artifact) Unmarshal(dAtA []byte) error { +func (m *ArtifactRepositoryRef) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7522,15 +8587,15 @@ func (m *Artifact) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Artifact: wiretype end group for non-group") + return fmt.Errorf("proto: ArtifactRepositoryRef: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Artifact: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ArtifactRepositoryRef: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConfigMap", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -7558,11 +8623,11 @@ func (m *Artifact) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.ConfigMap = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -7590,96 +8655,64 @@ func (m *Artifact) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Path = string(dAtA[iNdEx:postIndex]) + m.Key = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) - } - var v int32 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Mode = &v - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field From", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err } - intStringLen := int(stringLen) - if intStringLen < 0 { + if skippy < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen - if postIndex < 0 { + if (iNdEx + skippy) < 0 { return ErrInvalidLengthGenerated } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - m.From = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ArtifactLocation", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ArtifactoryArtifact) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated } - if postIndex > l { + if iNdEx >= l { return io.ErrUnexpectedEOF } - if err := m.ArtifactLocation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ArtifactoryArtifact: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ArtifactoryArtifact: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GlobalName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field URL", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -7707,11 +8740,11 @@ func (m *Artifact) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.GlobalName = string(dAtA[iNdEx:postIndex]) + m.URL = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 7: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Archive", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ArtifactoryAuth", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -7738,33 +8771,10 @@ func (m *Artifact) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Archive == nil { - m.Archive = &ArchiveStrategy{} - } - if err := m.Archive.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ArtifactoryAuth.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Optional", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Optional = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -7789,7 +8799,7 @@ func (m *Artifact) Unmarshal(dAtA []byte) error { } return nil } -func (m *ArtifactLocation) Unmarshal(dAtA []byte) error { +func (m *ArtifactoryAuth) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7812,36 +8822,15 @@ func (m *ArtifactLocation) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ArtifactLocation: wiretype end group for non-group") + return fmt.Errorf("proto: ArtifactoryAuth: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ArtifactLocation: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ArtifactoryAuth: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ArchiveLogs", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.ArchiveLogs = &b - case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field S3", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UsernameSecret", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -7868,16 +8857,16 @@ func (m *ArtifactLocation) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.S3 == nil { - m.S3 = &S3Artifact{} + if m.UsernameSecret == nil { + m.UsernameSecret = &v1.SecretKeySelector{} } - if err := m.S3.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UsernameSecret.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Git", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PasswordSecret", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -7904,54 +8893,71 @@ func (m *ArtifactLocation) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Git == nil { - m.Git = &GitArtifact{} + if m.PasswordSecret == nil { + m.PasswordSecret = &v1.SecretKeySelector{} } - if err := m.Git.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.PasswordSecret.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field HTTP", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err } - if msglen < 0 { + if skippy < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen - if postIndex < 0 { + if (iNdEx + skippy) < 0 { return ErrInvalidLengthGenerated } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - if m.HTTP == nil { - m.HTTP = &HTTPArtifact{} + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Backoff) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated } - if err := m.HTTP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + if iNdEx >= l { + return io.ErrUnexpectedEOF } - iNdEx = postIndex - case 5: + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Backoff: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Backoff: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Artifactory", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -7961,33 +8967,29 @@ func (m *ArtifactLocation) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Artifactory == nil { - m.Artifactory = &ArtifactoryArtifact{} - } - if err := m.Artifactory.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Duration = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field HDFS", wireType) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Factor", wireType) } - var msglen int + m.Factor = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -7997,33 +8999,16 @@ func (m *ArtifactLocation) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Factor |= int32(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.HDFS == nil { - m.HDFS = &HDFSArtifact{} - } - if err := m.HDFS.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Raw", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MaxDuration", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -8033,27 +9018,23 @@ func (m *ArtifactLocation) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Raw == nil { - m.Raw = &RawArtifact{} - } - if err := m.Raw.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.MaxDuration = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -8079,7 +9060,7 @@ func (m *ArtifactLocation) Unmarshal(dAtA []byte) error { } return nil } -func (m *ArtifactRepositoryRef) Unmarshal(dAtA []byte) error { +func (m *ContinueOn) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8102,17 +9083,17 @@ func (m *ArtifactRepositoryRef) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ArtifactRepositoryRef: wiretype end group for non-group") + return fmt.Errorf("proto: ContinueOn: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ArtifactRepositoryRef: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ContinueOn: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConfigMap", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } - var stringLen uint64 + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -8122,29 +9103,17 @@ func (m *ArtifactRepositoryRef) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - m.ConfigMap = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex + m.Error = bool(v != 0) case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Failed", wireType) } - var stringLen uint64 + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -8154,24 +9123,12 @@ func (m *ArtifactRepositoryRef) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex + m.Failed = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -8196,7 +9153,7 @@ func (m *ArtifactRepositoryRef) Unmarshal(dAtA []byte) error { } return nil } -func (m *ArtifactoryArtifact) Unmarshal(dAtA []byte) error { +func (m *CronWorkflow) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8219,17 +9176,17 @@ func (m *ArtifactoryArtifact) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ArtifactoryArtifact: wiretype end group for non-group") + return fmt.Errorf("proto: CronWorkflow: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ArtifactoryArtifact: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CronWorkflow: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field URL", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -8239,27 +9196,28 @@ func (m *ArtifactoryArtifact) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.URL = string(dAtA[iNdEx:postIndex]) + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ArtifactoryAuth", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8286,7 +9244,40 @@ func (m *ArtifactoryArtifact) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ArtifactoryAuth.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -8314,7 +9305,7 @@ func (m *ArtifactoryArtifact) Unmarshal(dAtA []byte) error { } return nil } -func (m *ArtifactoryAuth) Unmarshal(dAtA []byte) error { +func (m *CronWorkflowList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8337,15 +9328,15 @@ func (m *ArtifactoryAuth) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ArtifactoryAuth: wiretype end group for non-group") + return fmt.Errorf("proto: CronWorkflowList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ArtifactoryAuth: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CronWorkflowList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UsernameSecret", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8372,16 +9363,13 @@ func (m *ArtifactoryAuth) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.UsernameSecret == nil { - m.UsernameSecret = &v1.SecretKeySelector{} - } - if err := m.UsernameSecret.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PasswordSecret", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8408,10 +9396,8 @@ func (m *ArtifactoryAuth) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.PasswordSecret == nil { - m.PasswordSecret = &v1.SecretKeySelector{} - } - if err := m.PasswordSecret.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Items = append(m.Items, CronWorkflow{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -8439,7 +9425,7 @@ func (m *ArtifactoryAuth) Unmarshal(dAtA []byte) error { } return nil } -func (m *Backoff) Unmarshal(dAtA []byte) error { +func (m *CronWorkflowSpec) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8462,17 +9448,17 @@ func (m *Backoff) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Backoff: wiretype end group for non-group") + return fmt.Errorf("proto: CronWorkflowSpec: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Backoff: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CronWorkflowSpec: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkflowSpec", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -8482,29 +9468,30 @@ func (m *Backoff) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Duration = string(dAtA[iNdEx:postIndex]) + if err := m.WorkflowSpec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Factor", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Schedule", wireType) } - m.Factor = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -8514,14 +9501,27 @@ func (m *Backoff) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Factor |= int32(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Schedule = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxDuration", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConcurrencyPolicy", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -8549,8 +9549,88 @@ func (m *Backoff) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.MaxDuration = string(dAtA[iNdEx:postIndex]) + m.ConcurrencyPolicy = ConcurrencyPolicy(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Suspend", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Suspend = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StartingDeadlineSeconds", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.StartingDeadlineSeconds = &v + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SuccessfulJobsHistoryLimit", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SuccessfulJobsHistoryLimit = &v + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FailedJobsHistoryLimit", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.FailedJobsHistoryLimit = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -8575,7 +9655,7 @@ func (m *Backoff) Unmarshal(dAtA []byte) error { } return nil } -func (m *ContinueOn) Unmarshal(dAtA []byte) error { +func (m *CronWorkflowStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8598,17 +9678,17 @@ func (m *ContinueOn) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ContinueOn: wiretype end group for non-group") + return fmt.Errorf("proto: CronWorkflowStatus: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ContinueOn: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CronWorkflowStatus: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Active", wireType) } - var v int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -8618,17 +9698,31 @@ func (m *ContinueOn) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - m.Error = bool(v != 0) + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Active = append(m.Active, v1.ObjectReference{}) + if err := m.Active[len(m.Active)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Failed", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastScheduledTime", wireType) } - var v int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -8638,12 +9732,28 @@ func (m *ContinueOn) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - m.Failed = bool(v != 0) + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LastScheduledTime == nil { + m.LastScheduledTime = &v11.Time{} + } + if err := m.LastScheduledTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/workflow/v1alpha1/generated.proto b/pkg/apis/workflow/v1alpha1/generated.proto index df4bbac6e69c..8a145fe22bef 100644 --- a/pkg/apis/workflow/v1alpha1/generated.proto +++ b/pkg/apis/workflow/v1alpha1/generated.proto @@ -130,6 +130,58 @@ message ContinueOn { optional bool failed = 2; } +// CronWorkflow is the definition of a scheduled workflow resource +// +genclient +// +genclient:noStatus +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +message CronWorkflow { + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + optional CronWorkflowSpec spec = 2; + + optional CronWorkflowStatus status = 3; +} + +// CronWorkflowList is list of CronWorkflow resources +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +message CronWorkflowList { + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + repeated CronWorkflow items = 2; +} + +message CronWorkflowSpec { + // WorkflowSpec is the spec of the workflow to be run + optional WorkflowSpec workflowSpec = 1; + + // Schedule is a schedule to run the Workflow in Cron format + optional string schedule = 2; + + // ConcurrencyPolicy is the K8s-style concurrency policy that will be used + optional string concurrencyPolicy = 3; + + // Suspend is a flag that will stop new CronWorkflows from running if set to true + optional bool suspend = 4; + + // StartingDeadlineSeconds is the K8s-style deadline that will limit the time a CronWorkflow will be run after its + // original scheduled time if it is missed. + optional int64 startingDeadlineSeconds = 5; + + // SuccessfulJobsHistoryLimit is the number of successful jobs to be kept at a time + optional int32 successfulJobsHistoryLimit = 6; + + // FailedJobsHistoryLimit is the number of successful jobs to be kept at a time + optional int32 failedJobsHistoryLimit = 7; +} + +message CronWorkflowStatus { + // Active is a list of active workflows stemming from this CronWorkflow + repeated k8s.io.api.core.v1.ObjectReference active = 1; + + // LastScheduleTime is the last time the CronWorkflow was scheduled + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastScheduledTime = 2; +} + // DAGTask represents a node in the graph during DAG execution message DAGTask { // Name is the name of the target diff --git a/pkg/apis/workflow/v1alpha1/openapi_generated.go b/pkg/apis/workflow/v1alpha1/openapi_generated.go index eae346c45d96..63adf97a1d96 100644 --- a/pkg/apis/workflow/v1alpha1/openapi_generated.go +++ b/pkg/apis/workflow/v1alpha1/openapi_generated.go @@ -22,6 +22,10 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.ArtifactoryAuth": schema_pkg_apis_workflow_v1alpha1_ArtifactoryAuth(ref), "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.Backoff": schema_pkg_apis_workflow_v1alpha1_Backoff(ref), "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.ContinueOn": schema_pkg_apis_workflow_v1alpha1_ContinueOn(ref), + "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.CronWorkflow": schema_pkg_apis_workflow_v1alpha1_CronWorkflow(ref), + "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.CronWorkflowList": schema_pkg_apis_workflow_v1alpha1_CronWorkflowList(ref), + "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.CronWorkflowSpec": schema_pkg_apis_workflow_v1alpha1_CronWorkflowSpec(ref), + "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.CronWorkflowStatus": schema_pkg_apis_workflow_v1alpha1_CronWorkflowStatus(ref), "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.DAGTask": schema_pkg_apis_workflow_v1alpha1_DAGTask(ref), "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.DAGTemplate": schema_pkg_apis_workflow_v1alpha1_DAGTemplate(ref), "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.ExecutorConfig": schema_pkg_apis_workflow_v1alpha1_ExecutorConfig(ref), @@ -449,6 +453,194 @@ func schema_pkg_apis_workflow_v1alpha1_ContinueOn(ref common.ReferenceCallback) } } +func schema_pkg_apis_workflow_v1alpha1_CronWorkflow(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "CronWorkflow is the definition of a scheduled workflow resource", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.CronWorkflowSpec"), + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.CronWorkflowStatus"), + }, + }, + }, + Required: []string{"spec", "status"}, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.CronWorkflowSpec", "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.CronWorkflowStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_pkg_apis_workflow_v1alpha1_CronWorkflowList(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "CronWorkflowList is list of CronWorkflow resources", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.CronWorkflow"), + }, + }, + }, + }, + }, + }, + Required: []string{"metadata", "items"}, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.CronWorkflow", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + +func schema_pkg_apis_workflow_v1alpha1_CronWorkflowSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "workflowSpec": { + SchemaProps: spec.SchemaProps{ + Description: "WorkflowSpec is the spec of the workflow to be run", + Ref: ref("github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.WorkflowSpec"), + }, + }, + "schedule": { + SchemaProps: spec.SchemaProps{ + Description: "Schedule is a schedule to run the Workflow in Cron format", + Type: []string{"string"}, + Format: "", + }, + }, + "concurrencyPolicy": { + SchemaProps: spec.SchemaProps{ + Description: "ConcurrencyPolicy is the K8s-style concurrency policy that will be used", + Type: []string{"string"}, + Format: "", + }, + }, + "suspend": { + SchemaProps: spec.SchemaProps{ + Description: "Suspend is a flag that will stop new CronWorkflows from running if set to true", + Type: []string{"boolean"}, + Format: "", + }, + }, + "startingDeadlineSeconds": { + SchemaProps: spec.SchemaProps{ + Description: "StartingDeadlineSeconds is the K8s-style deadline that will limit the time a CronWorkflow will be run after its original scheduled time if it is missed.", + Type: []string{"integer"}, + Format: "int64", + }, + }, + "successfulJobsHistoryLimit": { + SchemaProps: spec.SchemaProps{ + Description: "SuccessfulJobsHistoryLimit is the number of successful jobs to be kept at a time", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "failedJobsHistoryLimit": { + SchemaProps: spec.SchemaProps{ + Description: "FailedJobsHistoryLimit is the number of successful jobs to be kept at a time", + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + Required: []string{"schedule"}, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1.WorkflowSpec"}, + } +} + +func schema_pkg_apis_workflow_v1alpha1_CronWorkflowStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "active": { + SchemaProps: spec.SchemaProps{ + Description: "Active is a list of active workflows stemming from this CronWorkflow", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/api/core/v1.ObjectReference"), + }, + }, + }, + }, + }, + "lastScheduledTime": { + SchemaProps: spec.SchemaProps{ + Description: "LastScheduleTime is the last time the CronWorkflow was scheduled", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.ObjectReference", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + } +} + func schema_pkg_apis_workflow_v1alpha1_DAGTask(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/apis/workflow/v1alpha1/register.go b/pkg/apis/workflow/v1alpha1/register.go index 9a62469fa783..06e5f8d6a807 100644 --- a/pkg/apis/workflow/v1alpha1/register.go +++ b/pkg/apis/workflow/v1alpha1/register.go @@ -35,6 +35,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { &WorkflowList{}, &WorkflowTemplate{}, &WorkflowTemplateList{}, + &CronWorkflow{}, + &CronWorkflowList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil diff --git a/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go index b0d68a9204f2..4e8a2e8f79e6 100644 --- a/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go @@ -236,6 +236,124 @@ func (in *ContinueOn) DeepCopy() *ContinueOn { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CronWorkflow) DeepCopyInto(out *CronWorkflow) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CronWorkflow. +func (in *CronWorkflow) DeepCopy() *CronWorkflow { + if in == nil { + return nil + } + out := new(CronWorkflow) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *CronWorkflow) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CronWorkflowList) DeepCopyInto(out *CronWorkflowList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]CronWorkflow, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CronWorkflowList. +func (in *CronWorkflowList) DeepCopy() *CronWorkflowList { + if in == nil { + return nil + } + out := new(CronWorkflowList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *CronWorkflowList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CronWorkflowSpec) DeepCopyInto(out *CronWorkflowSpec) { + *out = *in + in.WorkflowSpec.DeepCopyInto(&out.WorkflowSpec) + if in.StartingDeadlineSeconds != nil { + in, out := &in.StartingDeadlineSeconds, &out.StartingDeadlineSeconds + *out = new(int64) + **out = **in + } + if in.SuccessfulJobsHistoryLimit != nil { + in, out := &in.SuccessfulJobsHistoryLimit, &out.SuccessfulJobsHistoryLimit + *out = new(int32) + **out = **in + } + if in.FailedJobsHistoryLimit != nil { + in, out := &in.FailedJobsHistoryLimit, &out.FailedJobsHistoryLimit + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CronWorkflowSpec. +func (in *CronWorkflowSpec) DeepCopy() *CronWorkflowSpec { + if in == nil { + return nil + } + out := new(CronWorkflowSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CronWorkflowStatus) DeepCopyInto(out *CronWorkflowStatus) { + *out = *in + if in.Active != nil { + in, out := &in.Active, &out.Active + *out = make([]v1.ObjectReference, len(*in)) + copy(*out, *in) + } + if in.LastScheduledTime != nil { + in, out := &in.LastScheduledTime, &out.LastScheduledTime + *out = (*in).DeepCopy() + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CronWorkflowStatus. +func (in *CronWorkflowStatus) DeepCopy() *CronWorkflowStatus { + if in == nil { + return nil + } + out := new(CronWorkflowStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DAGTask) DeepCopyInto(out *DAGTask) { *out = *in diff --git a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/cronworkflow.go b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/cronworkflow.go new file mode 100644 index 000000000000..2220092617b7 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/cronworkflow.go @@ -0,0 +1,158 @@ +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "time" + + v1alpha1 "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" + scheme "github.com/argoproj/argo/pkg/client/clientset/versioned/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// CronWorkflowsGetter has a method to return a CronWorkflowInterface. +// A group's client should implement this interface. +type CronWorkflowsGetter interface { + CronWorkflows(namespace string) CronWorkflowInterface +} + +// CronWorkflowInterface has methods to work with CronWorkflow resources. +type CronWorkflowInterface interface { + Create(*v1alpha1.CronWorkflow) (*v1alpha1.CronWorkflow, error) + Update(*v1alpha1.CronWorkflow) (*v1alpha1.CronWorkflow, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v1alpha1.CronWorkflow, error) + List(opts v1.ListOptions) (*v1alpha1.CronWorkflowList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.CronWorkflow, err error) + CronWorkflowExpansion +} + +// cronWorkflows implements CronWorkflowInterface +type cronWorkflows struct { + client rest.Interface + ns string +} + +// newCronWorkflows returns a CronWorkflows +func newCronWorkflows(c *ArgoprojV1alpha1Client, namespace string) *cronWorkflows { + return &cronWorkflows{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the cronWorkflow, and returns the corresponding cronWorkflow object, and an error if there is any. +func (c *cronWorkflows) Get(name string, options v1.GetOptions) (result *v1alpha1.CronWorkflow, err error) { + result = &v1alpha1.CronWorkflow{} + err = c.client.Get(). + Namespace(c.ns). + Resource("cronworkflows"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of CronWorkflows that match those selectors. +func (c *cronWorkflows) List(opts v1.ListOptions) (result *v1alpha1.CronWorkflowList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1alpha1.CronWorkflowList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("cronworkflows"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested cronWorkflows. +func (c *cronWorkflows) Watch(opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("cronworkflows"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch() +} + +// Create takes the representation of a cronWorkflow and creates it. Returns the server's representation of the cronWorkflow, and an error, if there is any. +func (c *cronWorkflows) Create(cronWorkflow *v1alpha1.CronWorkflow) (result *v1alpha1.CronWorkflow, err error) { + result = &v1alpha1.CronWorkflow{} + err = c.client.Post(). + Namespace(c.ns). + Resource("cronworkflows"). + Body(cronWorkflow). + Do(). + Into(result) + return +} + +// Update takes the representation of a cronWorkflow and updates it. Returns the server's representation of the cronWorkflow, and an error, if there is any. +func (c *cronWorkflows) Update(cronWorkflow *v1alpha1.CronWorkflow) (result *v1alpha1.CronWorkflow, err error) { + result = &v1alpha1.CronWorkflow{} + err = c.client.Put(). + Namespace(c.ns). + Resource("cronworkflows"). + Name(cronWorkflow.Name). + Body(cronWorkflow). + Do(). + Into(result) + return +} + +// Delete takes name of the cronWorkflow and deletes it. Returns an error if one occurs. +func (c *cronWorkflows) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("cronworkflows"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *cronWorkflows) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + var timeout time.Duration + if listOptions.TimeoutSeconds != nil { + timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("cronworkflows"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Timeout(timeout). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched cronWorkflow. +func (c *cronWorkflows) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.CronWorkflow, err error) { + result = &v1alpha1.CronWorkflow{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("cronworkflows"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_cronworkflow.go b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_cronworkflow.go new file mode 100644 index 000000000000..fddf378d3bd0 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_cronworkflow.go @@ -0,0 +1,112 @@ +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v1alpha1 "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeCronWorkflows implements CronWorkflowInterface +type FakeCronWorkflows struct { + Fake *FakeArgoprojV1alpha1 + ns string +} + +var cronworkflowsResource = schema.GroupVersionResource{Group: "argoproj.io", Version: "v1alpha1", Resource: "cronworkflows"} + +var cronworkflowsKind = schema.GroupVersionKind{Group: "argoproj.io", Version: "v1alpha1", Kind: "CronWorkflow"} + +// Get takes name of the cronWorkflow, and returns the corresponding cronWorkflow object, and an error if there is any. +func (c *FakeCronWorkflows) Get(name string, options v1.GetOptions) (result *v1alpha1.CronWorkflow, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(cronworkflowsResource, c.ns, name), &v1alpha1.CronWorkflow{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.CronWorkflow), err +} + +// List takes label and field selectors, and returns the list of CronWorkflows that match those selectors. +func (c *FakeCronWorkflows) List(opts v1.ListOptions) (result *v1alpha1.CronWorkflowList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(cronworkflowsResource, cronworkflowsKind, c.ns, opts), &v1alpha1.CronWorkflowList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1alpha1.CronWorkflowList{ListMeta: obj.(*v1alpha1.CronWorkflowList).ListMeta} + for _, item := range obj.(*v1alpha1.CronWorkflowList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested cronWorkflows. +func (c *FakeCronWorkflows) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(cronworkflowsResource, c.ns, opts)) + +} + +// Create takes the representation of a cronWorkflow and creates it. Returns the server's representation of the cronWorkflow, and an error, if there is any. +func (c *FakeCronWorkflows) Create(cronWorkflow *v1alpha1.CronWorkflow) (result *v1alpha1.CronWorkflow, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(cronworkflowsResource, c.ns, cronWorkflow), &v1alpha1.CronWorkflow{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.CronWorkflow), err +} + +// Update takes the representation of a cronWorkflow and updates it. Returns the server's representation of the cronWorkflow, and an error, if there is any. +func (c *FakeCronWorkflows) Update(cronWorkflow *v1alpha1.CronWorkflow) (result *v1alpha1.CronWorkflow, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(cronworkflowsResource, c.ns, cronWorkflow), &v1alpha1.CronWorkflow{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.CronWorkflow), err +} + +// Delete takes name of the cronWorkflow and deletes it. Returns an error if one occurs. +func (c *FakeCronWorkflows) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(cronworkflowsResource, c.ns, name), &v1alpha1.CronWorkflow{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeCronWorkflows) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(cronworkflowsResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &v1alpha1.CronWorkflowList{}) + return err +} + +// Patch applies the patch and returns the patched cronWorkflow. +func (c *FakeCronWorkflows) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.CronWorkflow, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(cronworkflowsResource, c.ns, name, pt, data, subresources...), &v1alpha1.CronWorkflow{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.CronWorkflow), err +} diff --git a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_workflow_client.go b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_workflow_client.go index 682651a5e10a..376ca146d2d1 100644 --- a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_workflow_client.go +++ b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_workflow_client.go @@ -12,6 +12,10 @@ type FakeArgoprojV1alpha1 struct { *testing.Fake } +func (c *FakeArgoprojV1alpha1) CronWorkflows(namespace string) v1alpha1.CronWorkflowInterface { + return &FakeCronWorkflows{c, namespace} +} + func (c *FakeArgoprojV1alpha1) Workflows(namespace string) v1alpha1.WorkflowInterface { return &FakeWorkflows{c, namespace} } diff --git a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/generated_expansion.go b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/generated_expansion.go index 96acabd7d755..a4837a52f2a3 100644 --- a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/generated_expansion.go +++ b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/generated_expansion.go @@ -2,6 +2,8 @@ package v1alpha1 +type CronWorkflowExpansion interface{} + type WorkflowExpansion interface{} type WorkflowTemplateExpansion interface{} diff --git a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/workflow_client.go b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/workflow_client.go index 7d8df785a06e..2a93aa9b0c4c 100644 --- a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/workflow_client.go +++ b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/workflow_client.go @@ -10,6 +10,7 @@ import ( type ArgoprojV1alpha1Interface interface { RESTClient() rest.Interface + CronWorkflowsGetter WorkflowsGetter WorkflowTemplatesGetter } @@ -19,6 +20,10 @@ type ArgoprojV1alpha1Client struct { restClient rest.Interface } +func (c *ArgoprojV1alpha1Client) CronWorkflows(namespace string) CronWorkflowInterface { + return newCronWorkflows(c, namespace) +} + func (c *ArgoprojV1alpha1Client) Workflows(namespace string) WorkflowInterface { return newWorkflows(c, namespace) } diff --git a/pkg/client/informers/externalversions/generic.go b/pkg/client/informers/externalversions/generic.go index 2a2188a7212e..c870b30bb283 100644 --- a/pkg/client/informers/externalversions/generic.go +++ b/pkg/client/informers/externalversions/generic.go @@ -37,6 +37,8 @@ func (f *genericInformer) Lister() cache.GenericLister { func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { switch resource { // Group=argoproj.io, Version=v1alpha1 + case v1alpha1.SchemeGroupVersion.WithResource("cronworkflows"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Argoproj().V1alpha1().CronWorkflows().Informer()}, nil case v1alpha1.SchemeGroupVersion.WithResource("workflows"): return &genericInformer{resource: resource.GroupResource(), informer: f.Argoproj().V1alpha1().Workflows().Informer()}, nil case v1alpha1.SchemeGroupVersion.WithResource("workflowtemplates"): diff --git a/pkg/client/informers/externalversions/workflow/v1alpha1/cronworkflow.go b/pkg/client/informers/externalversions/workflow/v1alpha1/cronworkflow.go new file mode 100644 index 000000000000..60a2ee4b1947 --- /dev/null +++ b/pkg/client/informers/externalversions/workflow/v1alpha1/cronworkflow.go @@ -0,0 +1,73 @@ +// Code generated by informer-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + time "time" + + workflowv1alpha1 "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" + versioned "github.com/argoproj/argo/pkg/client/clientset/versioned" + internalinterfaces "github.com/argoproj/argo/pkg/client/informers/externalversions/internalinterfaces" + v1alpha1 "github.com/argoproj/argo/pkg/client/listers/workflow/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" +) + +// CronWorkflowInformer provides access to a shared informer and lister for +// CronWorkflows. +type CronWorkflowInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1alpha1.CronWorkflowLister +} + +type cronWorkflowInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewCronWorkflowInformer constructs a new informer for CronWorkflow type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewCronWorkflowInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredCronWorkflowInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredCronWorkflowInformer constructs a new informer for CronWorkflow type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredCronWorkflowInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.ArgoprojV1alpha1().CronWorkflows(namespace).List(options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.ArgoprojV1alpha1().CronWorkflows(namespace).Watch(options) + }, + }, + &workflowv1alpha1.CronWorkflow{}, + resyncPeriod, + indexers, + ) +} + +func (f *cronWorkflowInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredCronWorkflowInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *cronWorkflowInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&workflowv1alpha1.CronWorkflow{}, f.defaultInformer) +} + +func (f *cronWorkflowInformer) Lister() v1alpha1.CronWorkflowLister { + return v1alpha1.NewCronWorkflowLister(f.Informer().GetIndexer()) +} diff --git a/pkg/client/informers/externalversions/workflow/v1alpha1/interface.go b/pkg/client/informers/externalversions/workflow/v1alpha1/interface.go index e4129951ddaa..db28d4b2b1f4 100644 --- a/pkg/client/informers/externalversions/workflow/v1alpha1/interface.go +++ b/pkg/client/informers/externalversions/workflow/v1alpha1/interface.go @@ -8,6 +8,8 @@ import ( // Interface provides access to all the informers in this group version. type Interface interface { + // CronWorkflows returns a CronWorkflowInformer. + CronWorkflows() CronWorkflowInformer // Workflows returns a WorkflowInformer. Workflows() WorkflowInformer // WorkflowTemplates returns a WorkflowTemplateInformer. @@ -25,6 +27,11 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } +// CronWorkflows returns a CronWorkflowInformer. +func (v *version) CronWorkflows() CronWorkflowInformer { + return &cronWorkflowInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} + // Workflows returns a WorkflowInformer. func (v *version) Workflows() WorkflowInformer { return &workflowInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} diff --git a/pkg/client/listers/workflow/v1alpha1/cronworkflow.go b/pkg/client/listers/workflow/v1alpha1/cronworkflow.go new file mode 100644 index 000000000000..90ece7944df3 --- /dev/null +++ b/pkg/client/listers/workflow/v1alpha1/cronworkflow.go @@ -0,0 +1,78 @@ +// Code generated by lister-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// CronWorkflowLister helps list CronWorkflows. +type CronWorkflowLister interface { + // List lists all CronWorkflows in the indexer. + List(selector labels.Selector) (ret []*v1alpha1.CronWorkflow, err error) + // CronWorkflows returns an object that can list and get CronWorkflows. + CronWorkflows(namespace string) CronWorkflowNamespaceLister + CronWorkflowListerExpansion +} + +// cronWorkflowLister implements the CronWorkflowLister interface. +type cronWorkflowLister struct { + indexer cache.Indexer +} + +// NewCronWorkflowLister returns a new CronWorkflowLister. +func NewCronWorkflowLister(indexer cache.Indexer) CronWorkflowLister { + return &cronWorkflowLister{indexer: indexer} +} + +// List lists all CronWorkflows in the indexer. +func (s *cronWorkflowLister) List(selector labels.Selector) (ret []*v1alpha1.CronWorkflow, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.CronWorkflow)) + }) + return ret, err +} + +// CronWorkflows returns an object that can list and get CronWorkflows. +func (s *cronWorkflowLister) CronWorkflows(namespace string) CronWorkflowNamespaceLister { + return cronWorkflowNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// CronWorkflowNamespaceLister helps list and get CronWorkflows. +type CronWorkflowNamespaceLister interface { + // List lists all CronWorkflows in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1alpha1.CronWorkflow, err error) + // Get retrieves the CronWorkflow from the indexer for a given namespace and name. + Get(name string) (*v1alpha1.CronWorkflow, error) + CronWorkflowNamespaceListerExpansion +} + +// cronWorkflowNamespaceLister implements the CronWorkflowNamespaceLister +// interface. +type cronWorkflowNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all CronWorkflows in the indexer for a given namespace. +func (s cronWorkflowNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.CronWorkflow, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.CronWorkflow)) + }) + return ret, err +} + +// Get retrieves the CronWorkflow from the indexer for a given namespace and name. +func (s cronWorkflowNamespaceLister) Get(name string) (*v1alpha1.CronWorkflow, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1alpha1.Resource("cronworkflow"), name) + } + return obj.(*v1alpha1.CronWorkflow), nil +} diff --git a/pkg/client/listers/workflow/v1alpha1/expansion_generated.go b/pkg/client/listers/workflow/v1alpha1/expansion_generated.go index fbb3c935cfe1..948b5db9290d 100644 --- a/pkg/client/listers/workflow/v1alpha1/expansion_generated.go +++ b/pkg/client/listers/workflow/v1alpha1/expansion_generated.go @@ -2,6 +2,14 @@ package v1alpha1 +// CronWorkflowListerExpansion allows custom methods to be added to +// CronWorkflowLister. +type CronWorkflowListerExpansion interface{} + +// CronWorkflowNamespaceListerExpansion allows custom methods to be added to +// CronWorkflowNamespaceLister. +type CronWorkflowNamespaceListerExpansion interface{} + // WorkflowListerExpansion allows custom methods to be added to // WorkflowLister. type WorkflowListerExpansion interface{} diff --git a/test/e2e/cron/cron_test.go b/test/e2e/cron/cron_test.go new file mode 100644 index 000000000000..5045748a8369 --- /dev/null +++ b/test/e2e/cron/cron_test.go @@ -0,0 +1,125 @@ +package cron + +import ( + wfv1 "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" + "github.com/argoproj/argo/test/e2e/fixtures" + "github.com/argoproj/argo/workflow/common" + "github.com/argoproj/pkg/humanize" + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/selection" + "testing" + "time" +) + +type CronSuite struct { + fixtures.E2ESuite +} + +func (s *CronSuite) TestBasic() { + s.Given(). + CronWorkflow("@testdata/basic.yaml"). + When(). + CreateCronWorkflow(). + Wait(1 * time.Minute). + Then(). + ExpectCron(func(t *testing.T, cronWf *wfv1.CronWorkflowStatus) { + assert.True(t, cronWf.LastScheduledTime.Time.After(time.Now().Add(-1*time.Minute))) + }) +} + +func (s *CronSuite) TestBasicForbid() { + s.Given(). + CronWorkflow("@testdata/basic-forbid.yaml"). + When(). + CreateCronWorkflow(). + Wait(2 * time.Minute). + Then(). + ExpectCron(func(t *testing.T, cronWf *wfv1.CronWorkflowStatus) { + assert.Equal(t, 1, len(cronWf.Active)) + assert.True(t, cronWf.LastScheduledTime.Time.Before(time.Now().Add(-1*time.Minute))) + }) +} + +func (s *CronSuite) TestBasicAllow() { + s.Given(). + CronWorkflow("@testdata/basic-allow.yaml"). + When(). + CreateCronWorkflow(). + Wait(2 * time.Minute). + Then(). + ExpectCron(func(t *testing.T, cronWf *wfv1.CronWorkflowStatus) { + assert.Equal(t, 2, len(cronWf.Active)) + }) +} + +func (s *CronSuite) TestBasicReplace() { + s.Given(). + CronWorkflow("@testdata/basic-replace.yaml"). + When(). + CreateCronWorkflow(). + Wait(2 * time.Minute). + Then(). + ExpectCron(func(t *testing.T, cronWf *wfv1.CronWorkflowStatus) { + assert.Equal(t, 1, len(cronWf.Active)) + assert.True(t, cronWf.LastScheduledTime.Time.After(time.Now().Add(-1*time.Minute))) + }) +} + +func (s *CronSuite) TestSuccessfulJobHistoryLimit() { + var listOptions v1.ListOptions + wfInformerListOptionsFunc(&listOptions, "test-cron-wf-succeed-1") + s.Given(). + CronWorkflow("@testdata/always-succeed-1.yaml"). + When(). + CreateCronWorkflow(). + Wait(2*time.Minute). + Then(). + ExpectWorkflowList(listOptions, func(t *testing.T, wfList *wfv1.WorkflowList) { + assert.Equal(t, 1, len(wfList.Items)) + assert.True(t, wfList.Items[0].Status.FinishedAt.Time.After(time.Now().Add(-1*time.Minute))) + }) +} + +func (s *CronSuite) TestFailedJobHistoryLimit() { + var listOptions v1.ListOptions + wfInformerListOptionsFunc(&listOptions, "test-cron-wf-fail-1") + s.Given(). + CronWorkflow("@testdata/always-fail-1.yaml"). + When(). + CreateCronWorkflow(). + Wait(2*time.Minute). + Then(). + ExpectWorkflowList(listOptions, func(t *testing.T, wfList *wfv1.WorkflowList) { + assert.Equal(t, 1, len(wfList.Items)) + assert.True(t, wfList.Items[0].Status.FinishedAt.Time.After(time.Now().Add(-1*time.Minute))) + }) +} + +func wfInformerListOptionsFunc(options *v1.ListOptions, cronWfName string) { + options.FieldSelector = fields.Everything().String() + isCronWorkflowChildReq, err := labels.NewRequirement(common.LabelCronWorkflow, selection.Equals, []string{cronWfName}) + if err != nil { + panic(err) + } + labelSelector := labels.NewSelector().Add(*isCronWorkflowChildReq) + options.LabelSelector = labelSelector.String() +} + +func TestCronSuite(t *testing.T) { + // To ensure consistency, always start at the next 30 second mark + _, _, sec := time.Now().Clock() + var toWait time.Duration + if sec <= 30 { + toWait = time.Duration(30-sec) * time.Second + } else { + toWait = time.Duration(90-sec) * time.Second + } + logrus.Infof("Waiting %s to start", humanize.Duration(toWait)) + time.Sleep(toWait) + suite.Run(t, new(CronSuite)) +} diff --git a/test/e2e/cron/testdata/always-fail-1.yaml b/test/e2e/cron/testdata/always-fail-1.yaml new file mode 100644 index 000000000000..1efdd913f3f4 --- /dev/null +++ b/test/e2e/cron/testdata/always-fail-1.yaml @@ -0,0 +1,18 @@ +apiVersion: argoproj.io/v1alpha1 +kind: CronWorkflow +metadata: + name: test-cron-wf-fail-1 +spec: + schedule: "* * * * *" + concurrencyPolicy: "Forbid" + startingDeadlineSeconds: 0 + successfulJobsHistoryLimit: 4 + failedJobsHistoryLimit: 1 + workflowSpec: + entrypoint: whalesay + templates: + - name: whalesay + container: + image: python:alpine3.6 + command: ["python", -c] + args: ["import random; import sys; exit_code = random.choice([1]); print('exiting with code {}'.format(exit_code)); sys.exit(exit_code)"] diff --git a/test/e2e/cron/testdata/always-fail-2.yaml b/test/e2e/cron/testdata/always-fail-2.yaml new file mode 100644 index 000000000000..8a9a150c6a9b --- /dev/null +++ b/test/e2e/cron/testdata/always-fail-2.yaml @@ -0,0 +1,18 @@ +apiVersion: argoproj.io/v1alpha1 +kind: CronWorkflow +metadata: + name: test-cron-wf-fail-2 +spec: + schedule: "* * * * *" + concurrencyPolicy: "Forbid" + startingDeadlineSeconds: 0 + successfulJobsHistoryLimit: 4 + failedJobsHistoryLimit: 1 + workflowSpec: + entrypoint: whalesay + templates: + - name: whalesay + container: + image: python:alpine3.6 + command: ["python", -c] + args: ["import random; import sys; exit_code = random.choice([1]); print('exiting with code {}'.format(exit_code)); sys.exit(exit_code)"] diff --git a/test/e2e/cron/testdata/always-succeed-1.yaml b/test/e2e/cron/testdata/always-succeed-1.yaml new file mode 100644 index 000000000000..b876efba16d6 --- /dev/null +++ b/test/e2e/cron/testdata/always-succeed-1.yaml @@ -0,0 +1,18 @@ +apiVersion: argoproj.io/v1alpha1 +kind: CronWorkflow +metadata: + name: test-cron-wf-succeed-1 +spec: + schedule: "* * * * *" + concurrencyPolicy: "Forbid" + startingDeadlineSeconds: 0 + successfulJobsHistoryLimit: 1 + failedJobsHistoryLimit: 1 + workflowSpec: + entrypoint: whalesay + templates: + - name: whalesay + container: + image: python:alpine3.6 + command: ["python", -c] + args: ["import random; import sys; exit_code = random.choice([0]); print('exiting with code {}'.format(exit_code)); sys.exit(exit_code)"] diff --git a/test/e2e/cron/testdata/basic-allow.yaml b/test/e2e/cron/testdata/basic-allow.yaml new file mode 100644 index 000000000000..26d5ef3042e3 --- /dev/null +++ b/test/e2e/cron/testdata/basic-allow.yaml @@ -0,0 +1,18 @@ +apiVersion: argoproj.io/v1alpha1 +kind: CronWorkflow +metadata: + name: test-cron-wf-basic-allow +spec: + schedule: "* * * * *" + concurrencyPolicy: "Allow" + startingDeadlineSeconds: 0 + successfulJobsHistoryLimit: 4 + failedJobsHistoryLimit: 2 + workflowSpec: + entrypoint: whalesay + templates: + - name: whalesay + container: + image: python:alpine3.6 + command: ["sh", -c] + args: ["sleep 300"] diff --git a/test/e2e/cron/testdata/basic-forbid.yaml b/test/e2e/cron/testdata/basic-forbid.yaml new file mode 100644 index 000000000000..dbe326d36836 --- /dev/null +++ b/test/e2e/cron/testdata/basic-forbid.yaml @@ -0,0 +1,18 @@ +apiVersion: argoproj.io/v1alpha1 +kind: CronWorkflow +metadata: + name: test-cron-wf-basic-forbid +spec: + schedule: "* * * * *" + concurrencyPolicy: "Forbid" + startingDeadlineSeconds: 0 + successfulJobsHistoryLimit: 4 + failedJobsHistoryLimit: 2 + workflowSpec: + entrypoint: whalesay + templates: + - name: whalesay + container: + image: python:alpine3.6 + command: ["sh", -c] + args: ["sleep 300"] diff --git a/test/e2e/cron/testdata/basic-replace.yaml b/test/e2e/cron/testdata/basic-replace.yaml new file mode 100644 index 000000000000..93c382ccd814 --- /dev/null +++ b/test/e2e/cron/testdata/basic-replace.yaml @@ -0,0 +1,18 @@ +apiVersion: argoproj.io/v1alpha1 +kind: CronWorkflow +metadata: + name: test-cron-wf-basic-replace +spec: + schedule: "* * * * *" + concurrencyPolicy: "Replace" + startingDeadlineSeconds: 0 + successfulJobsHistoryLimit: 4 + failedJobsHistoryLimit: 2 + workflowSpec: + entrypoint: whalesay + templates: + - name: whalesay + container: + image: python:alpine3.6 + command: ["sh", -c] + args: ["sleep 300"] diff --git a/test/e2e/cron/testdata/basic.yaml b/test/e2e/cron/testdata/basic.yaml new file mode 100644 index 000000000000..bfcfe349f2d9 --- /dev/null +++ b/test/e2e/cron/testdata/basic.yaml @@ -0,0 +1,18 @@ +apiVersion: argoproj.io/v1alpha1 +kind: CronWorkflow +metadata: + name: test-cron-wf-basic +spec: + schedule: "* * * * *" + concurrencyPolicy: "Allow" + startingDeadlineSeconds: 0 + successfulJobsHistoryLimit: 4 + failedJobsHistoryLimit: 2 + workflowSpec: + entrypoint: whalesay + templates: + - name: whalesay + container: + image: python:alpine3.6 + command: ["sh", -c] + args: ["echo hello"] diff --git a/test/e2e/fixtures/e2e_suite.go b/test/e2e/fixtures/e2e_suite.go index 1808e5478aa2..4300b75839b2 100644 --- a/test/e2e/fixtures/e2e_suite.go +++ b/test/e2e/fixtures/e2e_suite.go @@ -3,6 +3,7 @@ package fixtures import ( "bufio" "fmt" + "github.com/argoproj/argo/cmd/argo/commands/cron" alpha1 "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" "os" "path/filepath" @@ -35,6 +36,7 @@ func init() { type E2ESuite struct { suite.Suite client v1alpha1.WorkflowInterface + cronClient v1alpha1.CronWorkflowInterface kubeClient kubernetes.Interface } @@ -55,6 +57,7 @@ func (s *E2ESuite) BeforeTest(_, _ string) { panic(err) } s.client = commands.InitWorkflowClient() + s.cronClient = cron.InitCronWorkflowClient() // delete all workflows list, err := s.client.List(metav1.ListOptions{LabelSelector: label}) if err != nil { @@ -80,6 +83,19 @@ func (s *E2ESuite) BeforeTest(_, _ string) { time.Sleep(1 * time.Second) } } + // delete all cron workflows + cronList, err := s.cronClient.List(metav1.ListOptions{LabelSelector: label}) + if err != nil { + panic(err) + } + for _, cronWf := range cronList.Items { + logCtx := log.WithFields(log.Fields{"test": s.T().Name(), "cron workflow": cronWf.Name}) + logCtx.Infof("Deleting cron workflow") + err = s.cronClient.Delete(cronWf.Name, nil) + if err != nil { + panic(err) + } + } } func (s *E2ESuite) AfterTest(_, _ string) { @@ -162,7 +178,8 @@ func (s *E2ESuite) printPodLogs(logCtx *log.Entry, namespace, pod, container str func (s *E2ESuite) Given() *Given { return &Given{ - t: s.T(), - client: s.client, + t: s.T(), + client: s.client, + cronClient: s.cronClient, } } diff --git a/test/e2e/fixtures/given.go b/test/e2e/fixtures/given.go index be5f5fff24e5..cdd39ccaa304 100644 --- a/test/e2e/fixtures/given.go +++ b/test/e2e/fixtures/given.go @@ -12,9 +12,11 @@ import ( ) type Given struct { - t *testing.T - client v1alpha1.WorkflowInterface - wf *wfv1.Workflow + t *testing.T + client v1alpha1.WorkflowInterface + cronClient v1alpha1.CronWorkflowInterface + wf *wfv1.Workflow + cronWf *wfv1.CronWorkflow } // creates a workflow based on the parameter, this may be: @@ -58,10 +60,51 @@ func (g *Given) Workflow(text string) *Given { } return g } + +func (g *Given) CronWorkflow(text string) *Given { + var file string + if strings.HasPrefix(text, "@") { + file = strings.TrimPrefix(text, "@") + } else { + f, err := ioutil.TempFile("", "argo_e2e") + if err != nil { + g.t.Fatal(err) + } + _, err = f.Write([]byte(text)) + if err != nil { + g.t.Fatal(err) + } + err = f.Close() + if err != nil { + g.t.Fatal(err) + } + file = f.Name() + } + // read the file in + { + file, err := ioutil.ReadFile(file) + if err != nil { + g.t.Fatal(err) + } + g.cronWf = &wfv1.CronWorkflow{} + err = yaml.Unmarshal(file, g.cronWf) + if err != nil { + g.t.Fatal(err) + } + if g.cronWf.GetLabels() == nil { + g.cronWf.SetLabels(map[string]string{}) + } + g.cronWf.GetLabels()[label] = "true" + } + return g +} + func (g *Given) When() *When { return &When{ - t: g.t, - wf: g.wf, - client: g.client, + t: g.t, + wf: g.wf, + cronWf: g.cronWf, + client: g.client, + cronClient: g.cronClient, } } diff --git a/test/e2e/fixtures/then.go b/test/e2e/fixtures/then.go index 4915b2c864ca..512490dd1ab2 100644 --- a/test/e2e/fixtures/then.go +++ b/test/e2e/fixtures/then.go @@ -11,12 +11,17 @@ import ( ) type Then struct { - t *testing.T - workflowName string - client v1alpha1.WorkflowInterface + t *testing.T + workflowName string + cronWorkflowName string + client v1alpha1.WorkflowInterface + cronClient v1alpha1.CronWorkflowInterface } -func (t *Then) Expect(block func(t *testing.T, wf *wfv1.WorkflowStatus)) *Then { +func (t *Then) Expect(block func(*testing.T, *wfv1.WorkflowStatus)) *Then { + if t.workflowName == "" { + t.t.Fatal("No workflow to test") + } log.WithFields(log.Fields{"test": t.t.Name(), "workflow": t.workflowName}).Info("Checking expectation") wf, err := t.client.Get(t.workflowName, metav1.GetOptions{}) if err != nil { @@ -25,3 +30,28 @@ func (t *Then) Expect(block func(t *testing.T, wf *wfv1.WorkflowStatus)) *Then { block(t.t, &wf.Status) return t } + +func (t *Then) ExpectCron(block func(*testing.T, *wfv1.CronWorkflowStatus)) *Then { + if t.cronWorkflowName == "" { + t.t.Fatal("No cron workflow to test") + } + log.WithFields(log.Fields{"test": t.t.Name(), "cron workflow": t.cronWorkflowName}).Info("Checking expectation") + cronWf, err := t.cronClient.Get(t.cronWorkflowName, metav1.GetOptions{}) + if err != nil { + t.t.Fatal(err) + } + block(t.t, &cronWf.Status) + return t +} + +func (t *Then) ExpectWorkflowList(listOptions metav1.ListOptions, block func(*testing.T, *wfv1.WorkflowList)) *Then { + log.WithFields(log.Fields{"test": t.t.Name()}).Info("Getting relevant workflows") + wfList, err := t.client.List(listOptions) + if err != nil { + t.t.Fatal(err) + } + log.WithFields(log.Fields{"test": t.t.Name()}).Info("Got relevant workflows") + log.WithFields(log.Fields{"test": t.t.Name()}).Info("Checking expectation") + block(t.t, wfList) + return t +} diff --git a/test/e2e/fixtures/when.go b/test/e2e/fixtures/when.go index f50370777adc..3c91c508d1fe 100644 --- a/test/e2e/fixtures/when.go +++ b/test/e2e/fixtures/when.go @@ -2,6 +2,7 @@ package fixtures import ( "fmt" + "github.com/argoproj/pkg/humanize" "testing" "time" @@ -14,13 +15,19 @@ import ( ) type When struct { - t *testing.T - wf *wfv1.Workflow - client v1alpha1.WorkflowInterface - workflowName string + t *testing.T + wf *wfv1.Workflow + cronWf *wfv1.CronWorkflow + client v1alpha1.WorkflowInterface + cronClient v1alpha1.CronWorkflowInterface + workflowName string + cronWorkflowName string } func (w *When) SubmitWorkflow() *When { + if w.wf == nil { + w.t.Fatal("No workflow to submit") + } log.WithField("test", w.t.Name()).Info("Submitting workflow") wf, err := w.client.Create(w.wf) if err != nil { @@ -28,6 +35,22 @@ func (w *When) SubmitWorkflow() *When { } else { w.workflowName = wf.Name } + log.WithField("test", w.t.Name()).Info("Workflow submitted") + return w +} + +func (w *When) CreateCronWorkflow() *When { + if w.cronWf == nil { + w.t.Fatal("No cron workflow to create") + } + log.WithField("test", w.t.Name()).Info("Creating cron workflow") + cronWf, err := w.cronClient.Create(w.cronWf) + if err != nil { + w.t.Fatal(err) + } else { + w.cronWorkflowName = cronWf.Name + } + log.WithField("test", w.t.Name()).Info("Cron workflow created") return w } @@ -62,6 +85,14 @@ func (w *When) WaitForWorkflow(timeout time.Duration) *When { } } +func (w *When) Wait(timeout time.Duration) *When { + logCtx := log.WithFields(log.Fields{"test": w.t.Name(), "cron workflow": w.cronWorkflowName}) + logCtx.Infof("Waiting for %s", humanize.Duration(timeout)) + time.Sleep(timeout) + logCtx.Infof("Done waiting") + return w +} + func (w *When) DeleteWorkflow() *When { log.WithField("test", w.t.Name()).WithField("workflow", w.workflowName).Info("Deleting") err := w.client.Delete(w.workflowName, nil) @@ -73,8 +104,10 @@ func (w *When) DeleteWorkflow() *When { func (w *When) Then() *Then { return &Then{ - t: w.t, - workflowName: w.workflowName, - client: w.client, + t: w.t, + workflowName: w.workflowName, + cronWorkflowName: w.cronWorkflowName, + client: w.client, + cronClient: w.cronClient, } } diff --git a/workflow/common/common.go b/workflow/common/common.go index 2a9781a4df47..44af2c8944ae 100644 --- a/workflow/common/common.go +++ b/workflow/common/common.go @@ -57,6 +57,8 @@ const ( LabelKeyWorkflow = workflow.WorkflowFullName + "/workflow" // LabelKeyPhase is a label applied to workflows to indicate the current phase of the workflow (for filtering purposes) LabelKeyPhase = workflow.WorkflowFullName + "/phase" + // LabelCronWorkflow is a label applied to Workflows that are started by a CronWorkflow + LabelCronWorkflow = workflow.WorkflowFullName + "/cron-workflow" // ExecutorArtifactBaseDir is the base directory in the init container in which artifacts will be copied to. // Each artifact will be named according to its input name (e.g: /argo/inputs/artifacts/CODE) diff --git a/workflow/common/util.go b/workflow/common/util.go index e04cd35d2d70..cfa45b4f1321 100644 --- a/workflow/common/util.go +++ b/workflow/common/util.go @@ -531,6 +531,34 @@ func SplitWorkflowTemplateYAMLFile(body []byte, strict bool) ([]wfv1.WorkflowTem return manifests, nil } +// SplitCronWorkflowYAMLFile is a helper to split a body into multiple workflow template objects +func SplitCronWorkflowYAMLFile(body []byte, strict bool) ([]wfv1.CronWorkflow, error) { + manifestsStrings := yamlSeparator.Split(string(body), -1) + manifests := make([]wfv1.CronWorkflow, 0) + for _, manifestStr := range manifestsStrings { + if strings.TrimSpace(manifestStr) == "" { + continue + } + var cronWf wfv1.CronWorkflow + var opts []yaml.JSONOpt + if strict { + opts = append(opts, yaml.DisallowUnknownFields) // nolint + } + err := yaml.Unmarshal([]byte(manifestStr), &cronWf, opts...) + if cronWf.Kind != "" && cronWf.Kind != workflow.CronWorkflowKind { + log.Warnf("%s is not a cron workflow", cronWf.Kind) + // If we get here, it was a k8s manifest which was not of type 'CronWorkflow' + // We ignore these since we only care about CronWorkflow manifests. + continue + } + if err != nil { + return nil, errors.New(errors.CodeBadRequest, err.Error()) + } + manifests = append(manifests, cronWf) + } + return manifests, nil +} + // MergeReferredTemplate merges a referred template to the receiver template. func MergeReferredTemplate(tmpl *wfv1.Template, referred *wfv1.Template) (*wfv1.Template, error) { // Copy the referred template to deep copy template types. @@ -651,3 +679,24 @@ func GetTemplateHolderString(tmplHolder wfv1.TemplateHolder) string { return fmt.Sprintf("%T (%s)", tmplHolder, tmplName) } } + +func ConvertToWorkflow(cronWf *wfv1.CronWorkflow) (*wfv1.Workflow, error) { + newTypeMeta := metav1.TypeMeta{ + Kind: workflow.WorkflowKind, + APIVersion: cronWf.TypeMeta.APIVersion, + } + + newObjectMeta := metav1.ObjectMeta{} + newObjectMeta.GenerateName = cronWf.Name + "-" + + newObjectMeta.Labels = make(map[string]string) + newObjectMeta.Labels[LabelCronWorkflow] = cronWf.Name + + wf := &wfv1.Workflow{ + TypeMeta: newTypeMeta, + ObjectMeta: newObjectMeta, + Spec: cronWf.Spec.WorkflowSpec, + } + wf.SetOwnerReferences(append(wf.GetOwnerReferences(), *metav1.NewControllerRef(cronWf, wfv1.SchemeGroupVersion.WithKind(workflow.CronWorkflowKind)))) + return wf, nil +} diff --git a/workflow/cron/controller.go b/workflow/cron/controller.go new file mode 100644 index 000000000000..41b98ae421d9 --- /dev/null +++ b/workflow/cron/controller.go @@ -0,0 +1,274 @@ +package cron + +import ( + "context" + "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" + "github.com/argoproj/argo/pkg/client/clientset/versioned" + "github.com/argoproj/argo/pkg/client/informers/externalversions" + extv1alpha1 "github.com/argoproj/argo/pkg/client/informers/externalversions/workflow/v1alpha1" + "github.com/argoproj/argo/workflow/common" + "github.com/argoproj/argo/workflow/util" + "github.com/robfig/cron" + log "github.com/sirupsen/logrus" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/selection" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/cache" + "k8s.io/client-go/util/workqueue" + "time" +) + +// Controller is a controller for cron workflows +type Controller struct { + namespace string + cron *cron.Cron + nameEntryIDMap map[string]cron.EntryID + wfClientset versioned.Interface + wfInformer cache.SharedIndexInformer + wfQueue workqueue.RateLimitingInterface + cronWfInformer extv1alpha1.CronWorkflowInformer + cronWfQueue workqueue.RateLimitingInterface + restConfig *rest.Config +} + +const ( + cronWorkflowResyncPeriod = 20 * time.Minute + cronWorkflowWorkers = 2 + cronWorkflowWorkflowWorkers = 2 +) + +func NewCronController( + wfclientset versioned.Interface, + restConfig *rest.Config, + namespace string, +) *Controller { + return &Controller{ + wfClientset: wfclientset, + namespace: namespace, + cron: cron.New(), + restConfig: restConfig, + nameEntryIDMap: make(map[string]cron.EntryID), + wfQueue: workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()), + cronWfQueue: workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()), + } +} + +func (cc *Controller) Run(ctx context.Context) { + defer cc.cronWfQueue.ShutDown() + defer cc.wfQueue.ShutDown() + log.Infof("Starting CronWorkflow controller") + + cc.cronWfInformer = cc.newCronWorkflowInformer() + cc.addCronWorkflowInformerHandler() + + cc.wfInformer = util.NewWorkflowInformer(cc.restConfig, "", cronWorkflowResyncPeriod, wfInformerListOptionsFunc) + cc.addWorkflowInformerHandler() + + cc.cron.Start() + defer cc.cron.Stop() + + go cc.cronWfInformer.Informer().Run(ctx.Done()) + go cc.wfInformer.Run(ctx.Done()) + + for i := 0; i < cronWorkflowWorkers; i++ { + go wait.Until(cc.runCronWorker, time.Second, ctx.Done()) + } + + for i := 0; i < cronWorkflowWorkflowWorkers; i++ { + go wait.Until(cc.runWorkflowWorker, time.Second, ctx.Done()) + } + + <-ctx.Done() +} + +func (cc *Controller) runCronWorker() { + for cc.processNextCronItem() { + } +} + +func (cc *Controller) processNextCronItem() bool { + key, quit := cc.cronWfQueue.Get() + if quit { + return false + } + defer cc.cronWfQueue.Done(key) + log.Infof("Processing %s", key) + + obj, exists, err := cc.cronWfInformer.Informer().GetIndexer().GetByKey(key.(string)) + if err != nil { + log.Errorf("Failed to get CronWorkflow '%s' from informer index: %+v", key, err) + return true + } + if !exists { + if entryId, ok := cc.nameEntryIDMap[key.(string)]; ok { + log.Infof("Deleting '%s'", key) + cc.cron.Remove(entryId) + delete(cc.nameEntryIDMap, key.(string)) + } + return true + } + + cronWf, ok := obj.(*v1alpha1.CronWorkflow) + if !ok { + log.Warnf("Key '%s' in index is not a CronWorkflow", key) + return true + } + + cronWfIf := cc.wfClientset.ArgoprojV1alpha1().CronWorkflows(cronWf.Namespace) + cronWorkflowOperationCtx, err := newCronWfOperationCtx(cronWf, cc.wfClientset, cronWfIf) + if err != nil { + log.Error(err) + return true + } + + err = cronWorkflowOperationCtx.runOutstandingWorkflows() + if err != nil { + log.Errorf("could not run outstanding Workflow: %s", err) + return true + } + + // The job is currently scheduled, remove it and re add it. + if entryId, ok := cc.nameEntryIDMap[key.(string)]; ok { + cc.cron.Remove(entryId) + delete(cc.nameEntryIDMap, key.(string)) + } + + entryId, err := cc.cron.AddJob(cronWf.Spec.Schedule, cronWorkflowOperationCtx) + if err != nil { + log.Errorf("could not schedule CronWorkflow: %s", err) + return true + } + cc.nameEntryIDMap[key.(string)] = entryId + + log.Infof("CronWorkflow %s added", key.(string)) + + return true +} + +func (cc *Controller) runWorkflowWorker() { + for cc.processNextWorkflowItem() { + } +} + +func (cc *Controller) processNextWorkflowItem() bool { + key, quit := cc.wfQueue.Get() + if quit { + return false + } + defer cc.wfQueue.Done(key) + + obj, wfExists, err := cc.wfInformer.GetIndexer().GetByKey(key.(string)) + if err != nil { + log.Errorf("Failed to get Workflow '%s' from informer index: %+v", key, err) + return true + } + + // The workflow informer receives unstructured objects to deal with the possibility of invalid + // workflow manifests that are unable to unmarshal to workflow objects + un, ok := obj.(*unstructured.Unstructured) + if !ok { + log.Warnf("Key '%s' in index is not an unstructured", key) + return true + } + + wf, err := util.FromUnstructured(un) + if err != nil { + log.Warnf("Failed to unmarshal key '%s' to workflow object: %v", key, err) + return true + } + + if wf.OwnerReferences == nil || len(wf.OwnerReferences) != 1 { + log.Warnf("Workflow '%s' stemming from CronWorkflow is malformed", wf.Name) + return true + } + + // Workflows are run in the same namespace as CronWorkflow + nameEntryIdMapKey := wf.Namespace + "/" + wf.OwnerReferences[0].Name + var woc *cronWfOperationCtx + if entryId, ok := cc.nameEntryIDMap[nameEntryIdMapKey]; ok { + woc, ok = cc.cron.Entry(entryId).Job.(*cronWfOperationCtx) + if !ok { + log.Errorf("Parent CronWorkflow '%s' is malformed", nameEntryIdMapKey) + return true + } + } else { + log.Errorf("Parent CronWorkflow '%s' no longer exists", nameEntryIdMapKey) + return true + } + + // If the workflow is completed or was deleted, remove it from Active Workflows + if wf.Status.Completed() || !wfExists { + log.Warnf("Workflow '%s' from CronWorkflow '%s' completed", wf.Name, woc.cronWf.Name) + woc.removeActiveWf(wf) + } + + woc.enforceHistoryLimit() + return true +} + +func (cc *Controller) newCronWorkflowInformer() extv1alpha1.CronWorkflowInformer { + informerFactory := externalversions.NewSharedInformerFactory(cc.wfClientset, cronWorkflowResyncPeriod) + return informerFactory.Argoproj().V1alpha1().CronWorkflows() +} + +func (cc *Controller) addCronWorkflowInformerHandler() { + cc.cronWfInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + key, err := cache.MetaNamespaceKeyFunc(obj) + if err == nil { + cc.cronWfQueue.Add(key) + } + }, + UpdateFunc: func(old, new interface{}) { + key, err := cache.MetaNamespaceKeyFunc(new) + if err == nil { + cc.cronWfQueue.Add(key) + } + }, + DeleteFunc: func(obj interface{}) { + key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj) + if err == nil { + cc.cronWfQueue.Add(key) + } + }, + }) +} + +func (cc *Controller) addWorkflowInformerHandler() { + cc.wfInformer.AddEventHandler( + cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + key, err := cache.MetaNamespaceKeyFunc(obj) + if err == nil { + cc.wfQueue.Add(key) + } + }, + UpdateFunc: func(old, new interface{}) { + key, err := cache.MetaNamespaceKeyFunc(new) + if err == nil { + cc.wfQueue.Add(key) + } + }, + DeleteFunc: func(obj interface{}) { + key, err := cache.MetaNamespaceKeyFunc(obj) + if err == nil { + cc.wfQueue.Add(key) + } + }, + }, + ) +} + +func wfInformerListOptionsFunc(options *v1.ListOptions) { + options.FieldSelector = fields.Everything().String() + isCronWorkflowChildReq, err := labels.NewRequirement(common.LabelCronWorkflow, selection.Exists, []string{}) + if err != nil { + panic(err) + } + labelSelector := labels.NewSelector().Add(*isCronWorkflowChildReq) + options.LabelSelector = labelSelector.String() +} diff --git a/workflow/cron/operator.go b/workflow/cron/operator.go new file mode 100644 index 000000000000..dc078a157c26 --- /dev/null +++ b/workflow/cron/operator.go @@ -0,0 +1,240 @@ +package cron + +import ( + "fmt" + "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" + "github.com/argoproj/argo/pkg/client/clientset/versioned" + typed "github.com/argoproj/argo/pkg/client/clientset/versioned/typed/workflow/v1alpha1" + "github.com/argoproj/argo/workflow/common" + "github.com/argoproj/argo/workflow/util" + "github.com/prometheus/common/log" + "github.com/robfig/cron" + v12 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sort" + "time" +) + +type cronWfOperationCtx struct { + // CronWorkflow is the CronWorkflow to be run + name string + cronWf *v1alpha1.CronWorkflow + wfClientset versioned.Interface + wfClient typed.WorkflowInterface + cronWfIf typed.CronWorkflowInterface +} + +func newCronWfOperationCtx(cronWorkflow *v1alpha1.CronWorkflow, wfClientset versioned.Interface, cronWfIf typed.CronWorkflowInterface) (*cronWfOperationCtx, error) { + return &cronWfOperationCtx{ + name: cronWorkflow.ObjectMeta.Name, + cronWf: cronWorkflow, + wfClientset: wfClientset, + wfClient: wfClientset.ArgoprojV1alpha1().Workflows(cronWorkflow.Namespace), + cronWfIf: cronWfIf, + }, nil +} + +func (woc *cronWfOperationCtx) Run() { + log.Infof("Running %s", woc.name) + + proceed, err := woc.enforceRuntimePolicy() + if err != nil { + log.Errorf("Concurrency policy error: %s", err) + return + } else if !proceed { + return + } + + wf, err := common.ConvertToWorkflow(woc.cronWf) + if err != nil { + log.Errorf("Unable to create Workflow for CronWorkflow %s", woc.name) + return + } + + runWf, err := util.SubmitWorkflow(woc.wfClient, woc.wfClientset, woc.cronWf.Namespace, wf, &util.SubmitOpts{}) + if err != nil { + log.Errorf("Failed to run CronWorkflow: %v", err) + return + } + + woc.cronWf.Status.Active = append(woc.cronWf.Status.Active, getWorkflowObjectReference(wf, runWf)) + woc.cronWf.Status.LastScheduledTime = &v1.Time{Time: time.Now().UTC()} + err = woc.persistUpdate() + if err != nil { + log.Error(err) + } +} + +func getWorkflowObjectReference(wf *v1alpha1.Workflow, runWf *v1alpha1.Workflow) v12.ObjectReference { + // This is a bit of a hack. Ideally we'd use ref.GetReference, but for some reason the `runWf` object is coming back + // without `Kind` and `APIVersion` set (even though it it set on `wf`). To fix this, we hard code those values. + return v12.ObjectReference{ + Kind: wf.Kind, + APIVersion: wf.APIVersion, + Name: runWf.GetName(), + Namespace: runWf.GetNamespace(), + UID: runWf.GetUID(), + ResourceVersion: runWf.GetResourceVersion(), + } +} + +func (woc *cronWfOperationCtx) persistUpdate() error { + _, err := woc.cronWfIf.Update(woc.cronWf) + if err != nil { + return fmt.Errorf("failed to update CronWorkflow: %s", err) + } + return nil +} + +func (woc *cronWfOperationCtx) enforceRuntimePolicy() (bool, error) { + if woc.cronWf.Spec.Suspend { + log.Infof("%s is suspended, skipping execution", woc.name) + return false, nil + } + + if woc.cronWf.Spec.ConcurrencyPolicy != "" { + switch woc.cronWf.Spec.ConcurrencyPolicy { + case v1alpha1.AllowConcurrent, "": + // Do nothing + case v1alpha1.ForbidConcurrent: + if len(woc.cronWf.Status.Active) > 0 { + log.Infof("%s has 'ConcurrencyPolicy: Forbid' and has an active Workflow so it was not run", woc.name) + return false, nil + } + case v1alpha1.ReplaceConcurrent: + if len(woc.cronWf.Status.Active) > 0 { + log.Infof("%s has 'ConcurrencyPolicy: Replace' and has active Workflows", woc.name) + err := woc.terminateOutstandingWorkflows() + if err != nil { + return false, err + } + } + default: + return false, fmt.Errorf("invalid ConcurrencyPolicy: %s", woc.cronWf.Spec.ConcurrencyPolicy) + } + } + return true, nil +} + +func (woc *cronWfOperationCtx) terminateOutstandingWorkflows() error { + for _, wfObjectRef := range woc.cronWf.Status.Active { + log.Infof("stopping '%s'", wfObjectRef.Name) + err := util.TerminateWorkflow(woc.wfClient, wfObjectRef.Name) + if err != nil { + return fmt.Errorf("error stopping workflow %s: %e", wfObjectRef.Name, err) + } + } + return nil +} + +func (woc *cronWfOperationCtx) runOutstandingWorkflows() error { + + // If this CronWorkflow has been run before, check if we have missed any scheduled executions + if woc.cronWf.Status.LastScheduledTime != nil { + now := time.Now() + var missedExecutionTime time.Time + cronSchedule, err := cron.ParseStandard(woc.cronWf.Spec.Schedule) + if err != nil { + return err + } + + nextScheduledRunTime := cronSchedule.Next(woc.cronWf.Status.LastScheduledTime.Time) + // Workflow should have ran + for nextScheduledRunTime.Before(now) { + missedExecutionTime = nextScheduledRunTime + nextScheduledRunTime = cronSchedule.Next(missedExecutionTime) + } + + // We missed the latest execution time + if !missedExecutionTime.IsZero() { + // If StartingDeadlineSeconds is not set, or we are still within the deadline window, run the Workflow + if woc.cronWf.Spec.StartingDeadlineSeconds == nil || now.Before(missedExecutionTime.Add(time.Duration(*woc.cronWf.Spec.StartingDeadlineSeconds)*time.Second)) { + log.Infof("%s missed an execution at %s and is within StartingDeadline", woc.cronWf.Name, missedExecutionTime.Format("Mon Jan _2 15:04:05 2006")) + woc.Run() + } + } + } + return nil +} + +func (woc *cronWfOperationCtx) removeActiveWf(wf *v1alpha1.Workflow) { + if wf == nil || wf.ObjectMeta.UID == "" { + return + } + for i, objectRef := range woc.cronWf.Status.Active { + if objectRef.UID == wf.ObjectMeta.UID { + woc.cronWf.Status.Active = append(woc.cronWf.Status.Active[:i], woc.cronWf.Status.Active[i+1:]...) + err := woc.persistUpdate() + if err != nil { + log.Errorf("Unable to update CronWorkflow '%s': %s", woc.cronWf.Name, err) + } + } + } +} + +func (woc *cronWfOperationCtx) enforceHistoryLimit() { + log.Infof("Enforcing history limit for '%s'", woc.cronWf.Name) + + listOptions := &v1.ListOptions{} + wfInformerListOptionsFunc(listOptions) + wfList, err := woc.wfClient.List(*listOptions) + if err != nil { + log.Errorf("Unable to enforce history limit for CronWorkflow '%s': %s", woc.cronWf.Name, err) + return + } + + var successfulWorkflows []v1alpha1.Workflow + var failedWorkflows []v1alpha1.Workflow + for _, wf := range wfList.Items { + if wf.Labels[common.LabelCronWorkflow] != woc.cronWf.Name { + continue + } + if wf.Status.Completed() { + if wf.Status.Successful() { + successfulWorkflows = append(successfulWorkflows, wf) + } else { + failedWorkflows = append(failedWorkflows, wf) + } + } + } + + workflowsToKeep := int32(3) + if woc.cronWf.Spec.SuccessfulJobsHistoryLimit != nil && *woc.cronWf.Spec.SuccessfulJobsHistoryLimit >= 0 { + workflowsToKeep = *woc.cronWf.Spec.SuccessfulJobsHistoryLimit + } + err = woc.deleteOldestWorkflows(successfulWorkflows, int(workflowsToKeep)) + if err != nil { + log.Errorf("Unable to delete Successful Workflows of CronWorkflow '%s': %s", woc.cronWf.Name, err) + return + } + + workflowsToKeep = int32(1) + if woc.cronWf.Spec.FailedJobsHistoryLimit != nil && *woc.cronWf.Spec.FailedJobsHistoryLimit >= 0 { + workflowsToKeep = *woc.cronWf.Spec.FailedJobsHistoryLimit + } + err = woc.deleteOldestWorkflows(failedWorkflows, int(workflowsToKeep)) + if err != nil { + log.Errorf("Unable to delete Failed Workflows of CronWorkflow '%s': %s", woc.cronWf.Name, err) + return + } + +} + +func (woc *cronWfOperationCtx) deleteOldestWorkflows(jobList []v1alpha1.Workflow, workflowsToKeep int) error { + if workflowsToKeep >= len(jobList) { + return nil + } + + sort.SliceStable(jobList, func(i, j int) bool { + return jobList[i].Status.FinishedAt.Time.After(jobList[j].Status.FinishedAt.Time) + }) + + for _, wf := range jobList[workflowsToKeep:] { + err := woc.wfClient.Delete(wf.Name, &v1.DeleteOptions{}) + if err != nil { + return fmt.Errorf("error deleting workflow '%s': %e", wf.Name, err) + } + log.Infof("Deleted Workflow '%s' due to CronWorkflow '%s' history limit", wf.Name, woc.cronWf.Name) + } + return nil +} diff --git a/workflow/util/util.go b/workflow/util/util.go index e6bc78c0f385..134b6dfe99fc 100644 --- a/workflow/util/util.go +++ b/workflow/util/util.go @@ -57,10 +57,11 @@ func NewWorkflowInformer(cfg *rest.Config, ns string, resyncPeriod time.Duration if err != nil { panic(err) } + resource := schema.GroupVersionResource{ Group: workflow.Group, Version: "v1alpha1", - Resource: "workflows", + Resource: workflow.WorkflowPlural, } informer := unstructutil.NewFilteredUnstructuredInformer( resource, diff --git a/workflow/validate/lint.go b/workflow/validate/lint.go index ac34e7d16df7..7ad25b93be6b 100644 --- a/workflow/validate/lint.go +++ b/workflow/validate/lint.go @@ -125,3 +125,59 @@ func LintWorkflowTemplateFile(wftmplGetter templateresolution.WorkflowTemplateNa } return nil } + +// LintCronWorkflowDir validates all cron workflow manifests in a directory. Ignores non-workflow template manifests +func LintCronWorkflowDir(wftmplGetter templateresolution.WorkflowTemplateNamespacedGetter, namespace, dirPath string, strict bool) error { + walkFunc := func(path string, info os.FileInfo, err error) error { + if info == nil || info.IsDir() { + return nil + } + fileExt := filepath.Ext(info.Name()) + switch fileExt { + case ".yaml", ".yml", ".json": + default: + return nil + } + return LintCronWorkflowFile(wftmplGetter, namespace, path, strict) + } + return filepath.Walk(dirPath, walkFunc) +} + +// LintCronWorkflowFile lints a json file, or multiple cron workflow manifest in a single yaml file. Ignores +// non-cron workflow manifests +func LintCronWorkflowFile(wftmplGetter templateresolution.WorkflowTemplateNamespacedGetter, namespace, filePath string, strict bool) error { + body, err := ioutil.ReadFile(filePath) + if err != nil { + return errors.Errorf(errors.CodeBadRequest, "Can't read from file: %s, err: %v", filePath, err) + } + var cronWorkflows []wfv1.CronWorkflow + if json.IsJSON(body) { + var cronWf wfv1.CronWorkflow + if strict { + err = json.UnmarshalStrict(body, &cronWf) + } else { + err = json.Unmarshal(body, &cronWf) + } + if err == nil { + cronWorkflows = []wfv1.CronWorkflow{cronWf} + } else { + if cronWf.Kind != "" && cronWf.Kind != workflow.CronWorkflowKind { + // If we get here, it was a k8s manifest which was not of type 'Workflow' + // We ignore these since we only care about validating Workflow manifests. + return nil + } + } + } else { + cronWorkflows, err = common.SplitCronWorkflowYAMLFile(body, strict) + } + if err != nil { + return errors.Errorf(errors.CodeBadRequest, "%s failed to parse: %v", filePath, err) + } + for _, cronWf := range cronWorkflows { + err = ValidateCronWorkflow(wftmplGetter, &cronWf) + if err != nil { + return errors.Errorf(errors.CodeBadRequest, "%s: %s", filePath, err.Error()) + } + } + return nil +} diff --git a/workflow/validate/validate.go b/workflow/validate/validate.go index e2dbe437be6b..505171dc5184 100644 --- a/workflow/validate/validate.go +++ b/workflow/validate/validate.go @@ -3,6 +3,7 @@ package validate import ( "encoding/json" "fmt" + "github.com/robfig/cron" "io" "reflect" "regexp" @@ -173,6 +174,34 @@ func ValidateWorkflowTemplate(wftmplGetter templateresolution.WorkflowTemplateNa return nil } +// ValidateCronWorkflow validates a CronWorkflow +func ValidateCronWorkflow(wftmplGetter templateresolution.WorkflowTemplateNamespacedGetter, cronWf *wfv1.CronWorkflow) error { + if _, err := cron.ParseStandard(cronWf.Spec.Schedule); err != nil { + return errors.Errorf(errors.CodeBadRequest, "cron schedule is malformed: %s", err) + } + + switch cronWf.Spec.ConcurrencyPolicy { + case wfv1.AllowConcurrent, wfv1.ForbidConcurrent, wfv1.ReplaceConcurrent, "": + // Do nothing + default: + return errors.Errorf(errors.CodeBadRequest, "'%s' is not a valid concurrencyPolicy", cronWf.Spec.ConcurrencyPolicy) + } + + if cronWf.Spec.StartingDeadlineSeconds != nil && *cronWf.Spec.StartingDeadlineSeconds < 0 { + return errors.Errorf(errors.CodeBadRequest, "startingDeadlineSeconds must be positive") + } + + wf, err := common.ConvertToWorkflow(cronWf) + if err != nil { + return errors.Errorf(errors.CodeBadRequest, "cannot convert to Workflow: %s", err) + } + err = ValidateWorkflow(wftmplGetter, wf, ValidateOpts{}) + if err != nil { + return errors.Errorf(errors.CodeBadRequest, "cannot validate Workflow: %s", err) + } + return nil +} + func (ctx *templateValidationCtx) validateTemplate(tmpl *wfv1.Template, tmplCtx *templateresolution.Context, args wfv1.ArgumentsProvider, extraScope map[string]interface{}) error { tmplID := getTemplateID(tmpl) _, ok := ctx.results[tmplID]